From 9680276b3f97cf3fb3f2f98e418f33d87b69f7c7 Mon Sep 17 00:00:00 2001
From: huangzhenbao <17818024429@163.com>
Date: Tue, 26 May 2026 11:29:06 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=99=BB=E5=BD=95=E9=80=BB?=
=?UTF-8?q?=E8=BE=91=E5=92=8C=E4=B8=AA=E4=BA=BA=E8=B5=84=E6=96=99=E5=AE=8C?=
=?UTF-8?q?=E5=96=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...ges.consumer.2026-05-26T00-41-53-925Z.json | 425 +++++
config/current-client.uts | 2 +-
.../20260526_user_profile_health_fields.sql | 12 +
pages.json | 112 +-
pages/main/cart.uvue | 97 +-
pages/main/profile.uvue | 90 +-
.../home-service/assessment-form/index.uvue | 2 +-
.../home-service/service-plan/index.uvue | 2 +-
pages/mall/consumer/home-service/index.uvue | 6 +-
.../mall/merchant/home-service/check-in.uvue | 2 +-
.../home-service/exception-report.uvue | 2 +-
.../merchant/home-service/task-detail.uvue | 4 +
pages/user/login.uvue | 5 +-
pages/user/profile.uvue | 1571 +++++++++++++----
pages/user/test/USER_AUTH_SCHEMA.sql | 10 +
pages/user/types.uts | 7 +
services/deliveryService.uts | 112 +-
services/homeServiceService.uts | 831 ++++++---
services/serviceOrderService.uts | 632 ++++++-
types/mall-types.uts | 5 +
types/service-order.uts | 11 +
uni_modules/ak-req/ak-req.uts | 16 +
utils/pagesMode.uts | 2 +-
utils/profileRegionData.uts | 606 +++++++
utils/supabaseService.uts | 11 +
utils/utils.uts | 29 +-
报错信息.txt | 902 ++--------
27 files changed, 3934 insertions(+), 1572 deletions(-)
create mode 100644 .pages-backup/pages.consumer.2026-05-26T00-41-53-925Z.json
create mode 100644 mall_sql/migrations/20260526_user_profile_health_fields.sql
create mode 100644 utils/profileRegionData.uts
diff --git a/.pages-backup/pages.consumer.2026-05-26T00-41-53-925Z.json b/.pages-backup/pages.consumer.2026-05-26T00-41-53-925Z.json
new file mode 100644
index 00000000..27210a93
--- /dev/null
+++ b/.pages-backup/pages.consumer.2026-05-26T00-41-53-925Z.json
@@ -0,0 +1,425 @@
+{
+ "pages": [
+ {
+ "path": "pages/user/register",
+ "style": {
+ "navigationBarTitleText": "服务人员注册",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/user/terms",
+ "style": {
+ "navigationBarTitleText": "用户协议与隐私政策",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/user/login",
+ "style": {
+ "navigationBarTitleText": "服务人员登录",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/mall/delivery/home/index",
+ "style": {
+ "navigationBarTitleText": "工作台",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/mall/delivery/orders/index",
+ "style": {
+ "navigationBarTitleText": "工单列表",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/mall/delivery/orders/detail",
+ "style": {
+ "navigationBarTitleText": "订单详情",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/mall/delivery/service-record/index",
+ "style": {
+ "navigationBarTitleText": "服务记录",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/mall/delivery/orders/exception",
+ "style": {
+ "navigationBarTitleText": "异常上报",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/mall/delivery/profile/index",
+ "style": {
+ "navigationBarTitleText": "我的",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/mall/delivery/profile/settings",
+ "style": {
+ "navigationBarTitleText": "设置",
+ "navigationStyle": "custom"
+ }
+ }
+ ],
+ "subPackages": [
+ {
+ "root": "pages/mall/consumer",
+ "pages": [
+ {
+ "path": "settings",
+ "style": {
+ "navigationBarTitleText": "设置"
+ }
+ },
+ {
+ "path": "edit-profile",
+ "style": {
+ "navigationBarTitleText": "编辑资料"
+ }
+ },
+ {
+ "path": "wallet",
+ "style": {
+ "navigationBarTitleText": "我的钱包"
+ }
+ },
+ {
+ "path": "withdraw",
+ "style": {
+ "navigationBarTitleText": "余额提现"
+ }
+ },
+ {
+ "path": "search",
+ "style": {
+ "navigationBarTitleText": "搜索",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "product-detail",
+ "style": {
+ "navigationBarTitleText": "",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "channel-detail",
+ "style": {
+ "navigationBarTitleText": "频道详情",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "shop-detail",
+ "style": {
+ "navigationBarTitleText": "店铺详情"
+ }
+ },
+ {
+ "path": "coupons",
+ "style": {
+ "navigationBarTitleText": "我的优惠券"
+ }
+ },
+ {
+ "path": "favorites",
+ "style": {
+ "navigationBarTitleText": "我的收藏"
+ }
+ },
+ {
+ "path": "footprint",
+ "style": {
+ "navigationBarTitleText": "我的足迹"
+ }
+ },
+ {
+ "path": "address",
+ "style": {
+ "navigationBarTitleText": "地址"
+ }
+ },
+ {
+ "path": "address-list",
+ "style": {
+ "navigationBarTitleText": "收货地址"
+ }
+ },
+ {
+ "path": "address-edit",
+ "style": {
+ "navigationBarTitleText": "编辑地址"
+ }
+ },
+ {
+ "path": "checkout",
+ "style": {
+ "navigationBarTitleText": "确认订单"
+ }
+ },
+ {
+ "path": "payment",
+ "style": {
+ "navigationBarTitleText": "",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "payment-success",
+ "style": {
+ "navigationBarTitleText": "支付成功",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "orders",
+ "style": {
+ "navigationBarTitleText": "",
+ "navigationStyle": "custom",
+ "enablePullDownRefresh": true,
+ "backgroundColor": "#f5f5f5"
+ }
+ },
+ {
+ "path": "order-detail",
+ "style": {
+ "navigationBarTitleText": "订单详情"
+ }
+ },
+ {
+ "path": "logistics",
+ "style": {
+ "navigationBarTitleText": "物流详情"
+ }
+ },
+ {
+ "path": "review",
+ "style": {
+ "navigationBarTitleText": "评价晒单"
+ }
+ },
+ {
+ "path": "refund",
+ "style": {
+ "navigationBarTitleText": "退款/售后"
+ }
+ },
+ {
+ "path": "apply-refund",
+ "style": {
+ "navigationBarTitleText": "申请售后"
+ }
+ },
+ {
+ "path": "refund-review",
+ "style": {
+ "navigationBarTitleText": "服务评价"
+ }
+ },
+ {
+ "path": "chat",
+ "style": {
+ "navigationBarTitleText": "客服聊天",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "chat_new",
+ "style": {
+ "navigationBarTitleText": "客服聊天(新版)"
+ }
+ },
+ {
+ "path": "subscription/plan-list",
+ "style": {
+ "navigationBarTitleText": "软件订阅"
+ }
+ },
+ {
+ "path": "subscription/plan-detail",
+ "style": {
+ "navigationBarTitleText": "订阅详情"
+ }
+ },
+ {
+ "path": "subscription/subscribe-checkout",
+ "style": {
+ "navigationBarTitleText": "确认订阅"
+ }
+ },
+ {
+ "path": "subscription/my-subscriptions",
+ "style": {
+ "navigationBarTitleText": "我的订阅"
+ }
+ },
+ {
+ "path": "subscription/followed-shops",
+ "style": {
+ "navigationBarTitleText": "关注店铺"
+ }
+ },
+ {
+ "path": "points/index",
+ "style": {
+ "navigationBarTitleText": "积分管理"
+ }
+ },
+ {
+ "path": "points/signin",
+ "style": {
+ "navigationBarTitleText": "签到"
+ }
+ },
+ {
+ "path": "points/exchange",
+ "style": {
+ "navigationBarTitleText": "积分兑换"
+ }
+ },
+ {
+ "path": "points/exchange-records",
+ "style": {
+ "navigationBarTitleText": "兑换记录"
+ }
+ },
+ {
+ "path": "red-packets/index",
+ "style": {
+ "navigationBarTitleText": "我的红包"
+ }
+ },
+ {
+ "path": "bank-cards/index",
+ "style": {
+ "navigationBarTitleText": "银行卡管理"
+ }
+ },
+ {
+ "path": "bank-cards/add",
+ "style": {
+ "navigationBarTitleText": "添加银行卡"
+ }
+ },
+ {
+ "path": "home-service/index",
+ "style": {
+ "navigationBarTitleText": "居家上门服务",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "home-service/apply",
+ "style": {
+ "navigationBarTitleText": "提交服务申请",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "home-service/service-detail",
+ "style": {
+ "navigationBarTitleText": "预约服务",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "home-service/order-detail",
+ "style": {
+ "navigationBarTitleText": "服务单详情",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "home-service/feedback",
+ "style": {
+ "navigationBarTitleText": "验收反馈",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "bank-cards/verify",
+ "style": {
+ "navigationBarTitleText": "银行卡验证"
+ }
+ },
+ {
+ "path": "balance/index",
+ "style": {
+ "navigationBarTitleText": "余额"
+ }
+ },
+ {
+ "path": "my-reviews",
+ "style": {
+ "navigationBarTitleText": "我的评价"
+ }
+ },
+ {
+ "path": "message-detail",
+ "style": {
+ "navigationBarTitleText": "消息详情"
+ }
+ },
+ {
+ "path": "member/index",
+ "style": {
+ "navigationBarTitleText": "会员中心"
+ }
+ },
+ {
+ "path": "product-reviews",
+ "style": {
+ "navigationBarTitleText": "商品评价"
+ }
+ }
+ ]
+ }
+ ],
+ "tabBar": {
+ "color": "#6B7280",
+ "selectedColor": "#0F766E",
+ "backgroundColor": "#FFFFFF",
+ "borderStyle": "black",
+ "list": [
+ {
+ "pagePath": "pages/mall/delivery/home/index",
+ "text": "工作台",
+ "iconPath": "static/tabbar/home.png",
+ "selectedIconPath": "static/tabbar/home-active.png"
+ },
+ {
+ "pagePath": "pages/mall/delivery/orders/index",
+ "text": "订单",
+ "iconPath": "static/tabbar/cart.png",
+ "selectedIconPath": "static/tabbar/cart.png"
+ },
+ {
+ "pagePath": "pages/mall/delivery/profile/index",
+ "text": "我的",
+ "iconPath": "static/tabbar/user.png",
+ "selectedIconPath": "static/tabbar/user.png"
+ }
+ ]
+ },
+ "condition": {
+ "current": 0,
+ "list": [
+ {
+ "name": "delivery端",
+ "path": "pages/user/login",
+ "query": "mode=delivery&role=delivery"
+ }
+ ]
+ }
+}
diff --git a/config/current-client.uts b/config/current-client.uts
index c13cf1e7..e949e472 100644
--- a/config/current-client.uts
+++ b/config/current-client.uts
@@ -1 +1 @@
-export const CURRENT_CLIENT: string = 'delivery'
+export const CURRENT_CLIENT: string = 'consumer'
diff --git a/mall_sql/migrations/20260526_user_profile_health_fields.sql b/mall_sql/migrations/20260526_user_profile_health_fields.sql
new file mode 100644
index 00000000..9b1ff2e2
--- /dev/null
+++ b/mall_sql/migrations/20260526_user_profile_health_fields.sql
@@ -0,0 +1,12 @@
+ALTER TABLE public.ak_users
+ ADD COLUMN IF NOT EXISTS health_goal text,
+ ADD COLUMN IF NOT EXISTS service_address text,
+ ADD COLUMN IF NOT EXISTS emergency_contact text,
+ ADD COLUMN IF NOT EXISTS chronic_notes text,
+ ADD COLUMN IF NOT EXISTS care_preference text;
+
+COMMENT ON COLUMN public.ak_users.health_goal IS '健康目标';
+COMMENT ON COLUMN public.ak_users.service_address IS '常住服务地址';
+COMMENT ON COLUMN public.ak_users.emergency_contact IS '紧急联系人';
+COMMENT ON COLUMN public.ak_users.chronic_notes IS '慢病或过敏备注';
+COMMENT ON COLUMN public.ak_users.care_preference IS '护理偏好';
diff --git a/pages.json b/pages.json
index 27210a93..b534020b 100644
--- a/pages.json
+++ b/pages.json
@@ -1,72 +1,100 @@
{
"pages": [
{
- "path": "pages/user/register",
+ "path": "pages/main/index",
"style": {
- "navigationBarTitleText": "服务人员注册",
- "navigationStyle": "custom"
+ "navigationBarTitleText": "首页",
+ "navigationStyle": "custom",
+ "enablePullDownRefresh": false
}
},
{
- "path": "pages/user/terms",
+ "path": "pages/user/boot",
"style": {
- "navigationBarTitleText": "用户协议与隐私政策",
- "navigationStyle": "custom"
+ "navigationBarTitleText": ""
}
},
{
"path": "pages/user/login",
"style": {
- "navigationBarTitleText": "服务人员登录",
- "navigationStyle": "custom"
+ "navigationBarTitleText": "登录",
+ "navigationBarBackgroundColor": "#ffffff",
+ "navigationBarTextStyle": "black"
}
},
{
- "path": "pages/mall/delivery/home/index",
+ "path": "pages/user/register",
"style": {
- "navigationBarTitleText": "工作台",
- "navigationStyle": "custom"
+ "navigationBarTitleText": "注册"
}
},
{
- "path": "pages/mall/delivery/orders/index",
+ "path": "pages/user/forgot-password",
"style": {
- "navigationBarTitleText": "工单列表",
- "navigationStyle": "custom"
+ "navigationBarTitleText": "忘记密码"
}
},
{
- "path": "pages/mall/delivery/orders/detail",
+ "path": "pages/user/terms",
"style": {
- "navigationBarTitleText": "订单详情",
- "navigationStyle": "custom"
+ "navigationBarTitleText": "用户协议与隐私政策"
}
},
{
- "path": "pages/mall/delivery/service-record/index",
+ "path": "pages/user/center",
"style": {
- "navigationBarTitleText": "服务记录",
- "navigationStyle": "custom"
+ "navigationBarTitleText": "用户中心"
}
},
{
- "path": "pages/mall/delivery/orders/exception",
+ "path": "pages/user/profile",
"style": {
- "navigationBarTitleText": "异常上报",
+ "navigationBarTitleText": "个人资料"
+ }
+ },
+ {
+ "path": "pages/user/change-password",
+ "style": {
+ "navigationBarTitleText": "修改密码"
+ }
+ },
+ {
+ "path": "pages/user/bind-phone",
+ "style": {
+ "navigationBarTitleText": "绑定手机"
+ }
+ },
+ {
+ "path": "pages/user/bind-email",
+ "style": {
+ "navigationBarTitleText": "绑定邮箱"
+ }
+ },
+ {
+ "path": "pages/main/messages",
+ "style": {
+ "navigationBarTitleText": "消息",
+ "enablePullDownRefresh": true
+ }
+ },
+ {
+ "path": "pages/main/cart",
+ "style": {
+ "navigationBarTitleText": "购物车",
"navigationStyle": "custom"
}
},
{
- "path": "pages/mall/delivery/profile/index",
+ "path": "pages/main/profile",
"style": {
"navigationBarTitleText": "我的",
"navigationStyle": "custom"
}
},
{
- "path": "pages/mall/delivery/profile/settings",
+ "path": "pages/main/category",
"style": {
- "navigationBarTitleText": "设置",
+ "navigationBarTitleText": "分类",
"navigationStyle": "custom"
}
}
@@ -387,38 +415,50 @@
}
],
"tabBar": {
- "color": "#6B7280",
- "selectedColor": "#0F766E",
- "backgroundColor": "#FFFFFF",
+ "color": "#999999",
+ "selectedColor": "#ff5000",
+ "backgroundColor": "#ffffff",
"borderStyle": "black",
"list": [
{
- "pagePath": "pages/mall/delivery/home/index",
- "text": "工作台",
+ "pagePath": "pages/main/index",
+ "text": "首页",
"iconPath": "static/tabbar/home.png",
"selectedIconPath": "static/tabbar/home-active.png"
},
{
- "pagePath": "pages/mall/delivery/orders/index",
- "text": "订单",
+ "pagePath": "pages/main/messages",
+ "text": "消息",
+ "iconPath": "static/tabbar/message.png",
+ "selectedIconPath": "static/tabbar/message.png"
+ },
+ {
+ "pagePath": "pages/main/cart",
+ "text": "购物车",
"iconPath": "static/tabbar/cart.png",
"selectedIconPath": "static/tabbar/cart.png"
},
{
- "pagePath": "pages/mall/delivery/profile/index",
+ "pagePath": "pages/main/profile",
"text": "我的",
"iconPath": "static/tabbar/user.png",
"selectedIconPath": "static/tabbar/user.png"
}
]
},
+ "globalStyle": {
+ "navigationBarTextStyle": "black",
+ "navigationBarTitleText": "mall",
+ "navigationBarBackgroundColor": "#FFFFFF",
+ "backgroundColor": "#F8F8F8"
+ },
"condition": {
"current": 0,
"list": [
{
- "name": "delivery端",
- "path": "pages/user/login",
- "query": "mode=delivery&role=delivery"
+ "name": "consumer端",
+ "path": "pages/main/index",
+ "query": "role=consumer"
}
]
}
diff --git a/pages/main/cart.uvue b/pages/main/cart.uvue
index 29067df1..5e5c766b 100644
--- a/pages/main/cart.uvue
+++ b/pages/main/cart.uvue
@@ -185,7 +185,15 @@
-
+
+
+
+ 登录后可同步购物车中的商品
+
+
+
+
+
@@ -337,6 +345,7 @@ const recommendPageSize = ref(8)
const recommendHasMore = ref(true)
const recommendInitialized = ref(false)
const loading = ref(false)
+const isLoggedIn = ref(false)
const statusBarHeight = ref(0)
const isManageMode = ref(false)
const updatingItems = ref>(new Set()) // Track items being updated to prevent race conditions
@@ -540,6 +549,9 @@ const emptyTitle = computed((): string => {
})
const emptyDesc = computed((): string => {
+ if (!isLoggedIn.value && currentCartType.value == 'goods') {
+ return '登录后可同步购物车中的商品,换设备也能继续查看'
+ }
if (currentCartType.value == 'service') {
return '可切换筛选条件,或等待服务购物车正式接入'
}
@@ -552,6 +564,15 @@ const emptyDesc = computed((): string => {
return '快去挑选喜欢的商品吧'
})
+function refreshLoginState(): void {
+ const userId = supabaseService.getCurrentUserId()
+ isLoggedIn.value = userId != null && userId !== ''
+}
+
+function goCartLogin(): void {
+ goToLogin('/pages/main/cart')
+}
+
const showEmptyShoppingBtn = computed((): boolean => {
return currentCartType.value == 'goods'
})
@@ -829,6 +850,15 @@ function onRecommendScroll(event: any): void {
// 加载数据
const loadCartData = async () => {
loading.value = true
+ const userId = supabaseService.getCurrentUserId()
+ if (userId == null || userId === '') {
+ isLoggedIn.value = false
+ cartItems.value = []
+ loading.value = false
+ return
+ }
+
+ isLoggedIn.value = true
try {
// 获取会员折扣信息
@@ -892,6 +922,7 @@ const loadCartData = async () => {
}
onShow(() => {
+ refreshLoginState()
loadCartData()
})
@@ -1692,6 +1723,68 @@ const goToCheckout = () => {
font-size: 16px;
}
+.guest-login-bar {
+ position: fixed;
+ left: 12px;
+ right: 12px;
+ bottom: calc(var(--window-bottom) + 12px);
+ height: 48px;
+ padding: 0 8px 0 10px;
+ border-radius: 24px;
+ background-color: rgba(45, 38, 42, 0.72);
+ box-shadow: 0 6px 18px rgba(0, 0, 0, 0.12);
+ backdrop-filter: blur(10px);
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: space-between;
+ z-index: 998;
+}
+
+.cart-guest-login-bar {
+ background-color: rgba(55, 41, 43, 0.76);
+}
+
+.guest-login-left {
+ flex: 1;
+ min-width: 0;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+}
+
+.guest-login-avatar {
+ width: 32px;
+ height: 32px;
+ border-radius: 16px;
+ margin-right: 8px;
+ background-color: rgba(255, 255, 255, 0.85);
+}
+
+.guest-login-text {
+ flex: 1;
+ min-width: 0;
+ font-size: 12px;
+ color: #ffffff;
+ lines: 1;
+}
+
+.guest-login-btn {
+ height: 32px;
+ line-height: 32px;
+ padding: 0 14px;
+ border-radius: 16px;
+ background-color: #ff4d31;
+ color: #ffffff;
+ font-size: 12px;
+ font-weight: 600;
+ margin-left: 8px;
+}
+
+.guest-login-btn::after {
+ border: none;
+}
+
/* 购物车商品列表 */
.cart-list {
background-color: transparent; /* 背景透明,因为每个店铺有自己的卡片 */
@@ -2491,7 +2584,7 @@ const goToCheckout = () => {
}
.tabbar-safe-area {
- height: 150px;
+ height: 166px;
width: 100%;
background-color: transparent;
}
diff --git a/pages/main/profile.uvue b/pages/main/profile.uvue
index 7aae57dd..66f17732 100644
--- a/pages/main/profile.uvue
+++ b/pages/main/profile.uvue
@@ -205,6 +205,14 @@
+
+
+
+
+ 登录一下,康养权益和订单记录同步保存~
+
+
+
@@ -332,6 +340,7 @@ export default {
recommendBottomLocked: false,
recommendViewportHeight: 0,
pageWindowHeight: 0,
+ isLoggedIn: false,
guessLoadMoreKey: 0,
statusBarHeight: 0,
isAndroidApp: false,
@@ -362,6 +371,7 @@ export default {
},
onLoad() {
this.initPage()
+ this.refreshLoginState()
this.loadUserProfile()
this.loadOrders()
@@ -370,6 +380,7 @@ export default {
uni.$on('authChanged', this.handleAuthChanged)
},
onShow() {
+ this.refreshLoginState()
this.refreshData()
},
onUnload() {
@@ -413,6 +424,11 @@ export default {
}
},
methods: {
+ refreshLoginState() {
+ const userId = supabaseService.getCurrentUserId()
+ this.isLoggedIn = userId != null && userId !== ''
+ },
+
toRecommendScrollJson(value: any | null): UTSJSONObject | null {
if (value == null) {
return null
@@ -851,6 +867,7 @@ export default {
return 'height:' + this.pageWindowHeight + 'px;min-height:' + this.pageWindowHeight + 'px;'
},
async loadUserProfile() {
+ this.refreshLoginState()
const userId = supabaseService.getCurrentUserId()
if (userId == null || userId === '') {
this.resetGuestProfileState()
@@ -969,6 +986,7 @@ export default {
},
refreshData() {
+ this.refreshLoginState()
const userId = supabaseService.getCurrentUserId()
if (userId == null || userId === '') {
this.resetGuestProfileState()
@@ -1391,13 +1409,17 @@ export default {
editProfile() {
const userId = supabaseService.getCurrentUserId()
if (userId == null || userId === '') {
- goToLogin('/pages/user/profile')
+ this.goProfileLogin()
return
}
uni.navigateTo({
url: '/pages/user/profile'
})
},
+
+ goProfileLogin() {
+ goToLogin('/pages/main/profile')
+ },
// 跳转设置
goToSettings() {
@@ -1667,6 +1689,7 @@ export default {
},
handleAuthChanged(data: any) {
+ this.refreshLoginState()
let payload: UTSJSONObject | null = null
if (data instanceof UTSJSONObject) {
@@ -1687,6 +1710,11 @@ export default {
}
const loggedIn = payload.getBoolean('loggedIn')
+ if (loggedIn === true) {
+ this.refreshData()
+ return
+ }
+
if (loggedIn === false) {
this.resetGuestProfileState()
}
@@ -2492,7 +2520,65 @@ export default {
}
.profile-bottom-safe {
- height: 90px;
+ height: 156px;
+}
+
+.guest-login-bar {
+ position: fixed;
+ left: 12px;
+ right: 12px;
+ bottom: calc(var(--window-bottom) + 12px);
+ height: 48px;
+ padding: 0 8px 0 10px;
+ border-radius: 24px;
+ background-color: rgba(45, 38, 42, 0.72);
+ box-shadow: 0 6px 18px rgba(0, 0, 0, 0.12);
+ backdrop-filter: blur(10px);
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: space-between;
+ z-index: 998;
+}
+
+.guest-login-left {
+ flex: 1;
+ min-width: 0;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+}
+
+.guest-login-avatar {
+ width: 32px;
+ height: 32px;
+ border-radius: 16px;
+ margin-right: 8px;
+ background-color: rgba(255, 255, 255, 0.85);
+}
+
+.guest-login-text {
+ flex: 1;
+ min-width: 0;
+ font-size: 12px;
+ color: #ffffff;
+ lines: 1;
+}
+
+.guest-login-btn {
+ height: 32px;
+ line-height: 32px;
+ padding: 0 14px;
+ border-radius: 16px;
+ background-color: #ff6a4d;
+ color: #ffffff;
+ font-size: 12px;
+ font-weight: 600;
+ margin-left: 8px;
+}
+
+.guest-login-btn::after {
+ border: none;
}
.pending {
diff --git a/pages/mall/admin/home-service/assessment-form/index.uvue b/pages/mall/admin/home-service/assessment-form/index.uvue
index ac2ceca9..837b3d71 100644
--- a/pages/mall/admin/home-service/assessment-form/index.uvue
+++ b/pages/mall/admin/home-service/assessment-form/index.uvue
@@ -4,7 +4,7 @@
未找到评估信息
-
+
未找到服务方案
-
+
import { computed, ref } from 'vue'
-import { onLoad } from '@dcloudio/uni-app'
+import { onLoad, onShow } from '@dcloudio/uni-app'
import ServicePageScaffold from '@/components/homeService/ServicePageScaffold.uvue'
import ServicePanel from '@/components/homeService/ServicePanel.uvue'
import ServiceStatusTag from '@/components/homeService/ServiceStatusTag.uvue'
@@ -193,6 +193,10 @@ onLoad((options) => {
}
loadData()
})
+
+onShow(() => {
+ loadData()
+})
diff --git a/pages/user/test/USER_AUTH_SCHEMA.sql b/pages/user/test/USER_AUTH_SCHEMA.sql
index e44292e3..2da4a619 100644
--- a/pages/user/test/USER_AUTH_SCHEMA.sql
+++ b/pages/user/test/USER_AUTH_SCHEMA.sql
@@ -24,6 +24,11 @@ CREATE TABLE IF NOT EXISTS public.ak_users (
bio text,
avatar_url text,
preferred_language text,
+ health_goal text,
+ service_address text,
+ emergency_contact text,
+ chronic_notes text,
+ care_preference text,
role text,
school_id text,
grade_id text,
@@ -44,6 +49,11 @@ COMMENT ON COLUMN public.ak_users.weight_kg IS '体重(公斤)';
COMMENT ON COLUMN public.ak_users.bio IS '个人简介';
COMMENT ON COLUMN public.ak_users.avatar_url IS '头像地址';
COMMENT ON COLUMN public.ak_users.preferred_language IS '偏好语言';
+COMMENT ON COLUMN public.ak_users.health_goal IS '健康目标';
+COMMENT ON COLUMN public.ak_users.service_address IS '常住服务地址';
+COMMENT ON COLUMN public.ak_users.emergency_contact IS '紧急联系人';
+COMMENT ON COLUMN public.ak_users.chronic_notes IS '慢病或过敏备注';
+COMMENT ON COLUMN public.ak_users.care_preference IS '护理偏好';
COMMENT ON COLUMN public.ak_users.role IS '角色(如 customer/merchant/admin 等)';
COMMENT ON COLUMN public.ak_users.school_id IS '学校ID(可选)';
COMMENT ON COLUMN public.ak_users.grade_id IS '年级ID(可选)';
diff --git a/pages/user/types.uts b/pages/user/types.uts
index da697683..5e88151d 100644
--- a/pages/user/types.uts
+++ b/pages/user/types.uts
@@ -10,10 +10,17 @@ export type UserProfile ={
bio?: string;
avatar_url?: string;
preferred_language?: string;
+ health_goal?: string;
+ service_address?: string;
+ emergency_contact?: string;
+ chronic_notes?: string;
+ care_preference?: string;
role?:string;
school_id?: string; // 所属学校ID
grade_id?: string; // 所属年级ID
class_id?: string; // 所属班级ID
+ created_at?: string;
+ updated_at?: string;
}
// 语言选项类型 - 对应 ak_languages 表
diff --git a/services/deliveryService.uts b/services/deliveryService.uts
index f31d1403..dcc1c42d 100644
--- a/services/deliveryService.uts
+++ b/services/deliveryService.uts
@@ -1,16 +1,18 @@
-import { getDeliveryProfileByUserId, loginDelivery as loginDeliveryApi } from '@/api/delivery.uts'
import {
- acceptOrder as acceptRealServiceOrder,
- arriveOrder as arriveRealServiceOrder,
- checkinOrder as checkinRealServiceOrder,
- departOrder as departRealServiceOrder,
- finishOrder as finishRealServiceOrder,
- getDashboard as getRealDashboard,
- getOrderDetail as getRealServiceOrderDetail,
- getOrdersByTab as getRealOrdersByTab,
- saveServiceRecord as saveRealServiceRecord,
- startService as startRealService
-} from '@/services/serviceOrderService.uts'
+ acceptDeliveryOrderById,
+ arriveOrderById,
+ checkinOrderById,
+ finishServiceById,
+ getDeliveryDashboardByStaffId,
+ getDeliveryOrderDetailById,
+ getDeliveryOrdersByStaffId,
+ getDeliveryProfileByUserId,
+ loginDelivery as loginDeliveryApi,
+ saveServiceProgressById,
+ startDepartById,
+ startServiceById
+} from '@/api/delivery.uts'
+import { saveServiceRecord as saveRealServiceRecord } from '@/services/serviceOrderService.uts'
import {
acceptCareOrder,
checkInCareOrder,
@@ -31,12 +33,13 @@ import {
updateCareOrderStatus,
updateDeliveryCareOnlineStatus
} from '@/mock/delivery-care.mock.uts'
-import { getUserInfo, requireDeliveryAuth } from '@/utils/deliveryAuth.uts'
+import { requireDeliveryAuth } from '@/utils/deliveryAuth.uts'
import type {
DeliveryAbnormalReportType,
DeliveryCheckinPayloadType,
DeliveryDashboardType,
DeliveryExceptionPayloadType,
+ DeliveryFinishPayloadType,
DeliveryInfoType,
DeliveryLocationType,
DeliveryLoginPayloadType,
@@ -79,26 +82,51 @@ export async function checkDeliveryAuth(): Promise {
return result.ok
}
+async function getCurrentStaffId(): Promise {
+ const profile = await getDeliveryProfile()
+ if (profile == null) {
+ return ''
+ }
+ return profile.id
+ }
+
+function createEmptyLocation(): DeliveryLocationType {
+ return {
+ latitude: 0,
+ longitude: 0,
+ address: '',
+ time: new Date().toISOString().replace('T', ' ').substring(0, 19)
+ }
+ }
+
export async function getDeliveryDashboard(): Promise {
+ const staffId = await getCurrentStaffId()
+ if (staffId != '') {
+ return await getDeliveryDashboardByStaffId(staffId)
+ }
return getDeliveryCareDashboard()
}
export async function getDeliveryOrders(params: DeliveryOrderQueryType): Promise> {
+ const staffId = await getCurrentStaffId()
+ if (staffId != '') {
+ return await getDeliveryOrdersByStaffId(staffId, params)
+ }
if (params.tab == 'pending' || params.tab == 'pending_assignment') {
- return await getRealOrdersByTab('pending')
+ return getPendingCareOrders()
}
if (params.tab == 'history' || params.tab == 'completed' || params.tab == 'archive') {
- return await getRealOrdersByTab('history')
+ return getHistoryCareOrders()
}
- return await getRealOrdersByTab('today')
+ return getTodayCareOrders()
}
export async function getDeliveryOrderDetail(id: string): Promise {
- return await getRealServiceOrderDetail(id)
+ return await getDeliveryOrderDetailById(id)
}
export async function acceptDeliveryOrder(id: string): Promise {
- return await acceptRealServiceOrder(id)
+ return await acceptDeliveryOrderById(id)
}
export async function rejectDeliveryOrder(id: string, reason: string): Promise {
@@ -106,30 +134,23 @@ export async function rejectDeliveryOrder(id: string, reason: string): Promise {
- return await departRealServiceOrder(id, location)
+ return await startDepartById(id, location)
}
export async function arriveOrder(id: string, location: DeliveryLocationType): Promise {
- return await arriveRealServiceOrder(id, location)
+ return await arriveOrderById(id, location)
}
export async function checkinOrder(id: string, payload: DeliveryCheckinPayloadType): Promise {
- return await checkinRealServiceOrder(id, payload)
+ return await checkinOrderById(id, payload)
}
export async function startService(id: string): Promise {
- return await startRealService(id)
+ return await startServiceById(id)
}
export async function saveServiceProgress(id: string, payload: DeliveryProgressPayloadType): Promise {
- const current = getCareOrderDetail(id)
- if (current == null) {
- return null
- }
- current.serviceItems = payload.items
- current.progressNote = payload.progressNote
- current.serviceSummary = payload.serviceSummary
- return current
+ return await saveServiceProgressById(id, payload)
}
export async function uploadEvidence(id: string, phase: string, files: Array): Promise> {
@@ -168,8 +189,13 @@ export async function submitException(id: string, payload: DeliveryExceptionPayl
return submitCareAbnormalReport(id, payload)
}
-export async function finishService(id: string): Promise {
- return completeCareOrder(id)
+export async function finishService(id: string, payload: DeliveryFinishPayloadType | null = null): Promise {
+ const finishPayload = payload != null ? payload : {
+ serviceSummary: '',
+ signatureName: '',
+ confirmByFamily: false
+ } as DeliveryFinishPayloadType
+ return await finishServiceById(id, finishPayload)
}
export async function getDeliveryRecords(): Promise> {
@@ -198,27 +224,27 @@ export async function updateDeliveryOnlineStatus(status: string): Promise {
- return await getRealDashboard()
+ return await getDeliveryDashboard()
}
export async function getPendingServiceOrders(): Promise> {
- return await getRealOrdersByTab('pending')
+ return await getDeliveryOrders({ tab: 'pending', keyword: '' } as DeliveryOrderQueryType)
}
export async function getTodayServiceOrders(): Promise> {
- return await getRealOrdersByTab('today')
+ return await getDeliveryOrders({ tab: 'today', keyword: '' } as DeliveryOrderQueryType)
}
export async function getHistoryServiceOrders(): Promise> {
- return await getRealOrdersByTab('history')
+ return await getDeliveryOrders({ tab: 'history', keyword: '' } as DeliveryOrderQueryType)
}
export async function getServiceOrderDetail(orderId: string): Promise {
- return await getRealServiceOrderDetail(orderId)
+ return await getDeliveryOrderDetail(orderId)
}
export async function acceptServiceOrder(orderId: string): Promise {
- return await acceptRealServiceOrder(orderId)
+ return await acceptDeliveryOrder(orderId)
}
export async function rejectServiceOrder(orderId: string, reason: string): Promise {
@@ -226,18 +252,18 @@ export async function rejectServiceOrder(orderId: string, reason: string): Promi
}
export async function markDeparted(orderId: string): Promise {
- return await departRealServiceOrder(orderId, null)
+ return await startDepartById(orderId, createEmptyLocation())
}
export async function markArrived(orderId: string): Promise {
- return await arriveRealServiceOrder(orderId, null)
+ return await arriveOrderById(orderId, createEmptyLocation())
}
export async function checkInServiceOrder(orderId: string, note: string, location: DeliveryLocationType | null = null): Promise {
if (location == null) {
return null
}
- return await checkinRealServiceOrder(orderId, {
+ return await checkinOrderById(orderId, {
location,
note,
photos: [] as Array,
@@ -246,7 +272,7 @@ export async function checkInServiceOrder(orderId: string, note: string, locatio
}
export async function startServiceOrder(orderId: string): Promise {
- return await startRealService(orderId)
+ return await startServiceById(orderId)
}
export async function submitServiceRecord(orderId: string, record: DeliveryServiceRecordType): Promise {
@@ -254,7 +280,7 @@ export async function submitServiceRecord(orderId: string, record: DeliveryServi
}
export async function completeServiceOrder(orderId: string): Promise {
- return await finishRealServiceOrder(orderId)
+ return await finishService(orderId)
}
export async function submitAbnormalReport(orderId: string, report: DeliveryExceptionPayloadType): Promise {
diff --git a/services/homeServiceService.uts b/services/homeServiceService.uts
index 234b6af3..3aefd4de 100644
--- a/services/homeServiceService.uts
+++ b/services/homeServiceService.uts
@@ -20,6 +20,7 @@ import {
rejectServiceOrderAcceptance
} from '@/services/serviceOrderService.uts'
import supa from '@/components/supadb/aksupainstance.uts'
+import { getCurrentUserId } from '@/utils/store.uts'
import {
getServiceOrderStatusText,
type ServiceOrderStatus,
@@ -27,6 +28,14 @@ import {
type ServiceOrderType
} from '@/types/service-order.uts'
+function nowIso(): string {
+ return new Date().toISOString()
+}
+
+function buildId(prefix: string): string {
+ return prefix + '-' + String(Date.now()) + '-' + String(Math.floor(Math.random() * 100000)).padStart(5, '0')
+}
+
function plainObject(source: any): any {
return JSON.parse(JSON.stringify(source)) as any
}
@@ -576,259 +585,500 @@ function mapOrderToCase(order: ServiceOrderType): HomeServiceCaseType {
}
}
+function mapOrderToWorkerTask(order: ServiceOrderType): HomeServiceTaskType {
+ let taskStatus = 'pending_visit'
+ let taskStatusText = '待上门'
+ let taskStatusTone = 'warning'
+ let actionText = '签到开始'
+ if (order.status == 'arrived' || order.status == 'in_service') {
+ taskStatus = 'serving'
+ taskStatusText = '服务中'
+ taskStatusTone = 'primary'
+ actionText = '完成提交'
+ } else if (order.status == 'pending_acceptance' || order.status == 'accepted_by_user' || order.status == 'reviewed' || order.status == 'settled') {
+ taskStatus = 'completed'
+ taskStatusText = '待验收'
+ taskStatusTone = 'success'
+ actionText = '已提交'
+ } else if (order.status == 'exception' || order.status == 'rejected' || order.status == 'cancelled') {
+ taskStatus = 'exception'
+ taskStatusText = getServiceOrderStatusText(order.status)
+ taskStatusTone = 'warning'
+ actionText = '已上报'
+ }
+ return {
+ id: order.id,
+ caseId: order.id,
+ caseNo: order.orderNo,
+ status: taskStatus,
+ statusText: taskStatusText,
+ statusTone: taskStatusTone,
+ serviceName: order.serviceName,
+ elderName: order.recipientName,
+ address: order.addressSnapshot.fullAddress,
+ appointmentTime: formatServiceAppointmentText(order.appointmentTime),
+ checkInStatus: order.executionRecord != null && order.executionRecord.checkinTime != '' ? '已签到' : '未签到',
+ recordSummary: order.executionRecord != null ? (order.executionRecord.summary != '' ? order.executionRecord.summary : order.executionRecord.remark) : '待填写服务记录',
+ staffName: order.staffName == '' ? '待分配' : order.staffName,
+ staffPhone: order.staffPhone == '' ? '待分配' : order.staffPhone,
+ actionText,
+ timeline: mapLogsToTimeline(order.logs)
+ }
+}
+
+async function listWorkerTaskIds(): Promise> {
+ const userId = getCurrentUserId()
+ if (userId == '') {
+ return [] as Array
+ }
+ const careTaskResponse = await supa.from('ec_care_tasks').select('id').eq('assigned_to', userId).order('created_at', { ascending: false }).execute()
+ if (careTaskResponse.error == null && careTaskResponse.data != null) {
+ const result = [] as Array
+ const rows = careTaskResponse.data as Array
+ for (let i = 0; i < rows.length; i++) {
+ const id = readString(rows[i], 'id')
+ if (id != '') {
+ result.push(id)
+ }
+ }
+ if (result.length > 0) {
+ return result
+ }
+ }
+ const legacyResponse = await supa.from('hss_service_orders').select('id').eq('current_staff_id', userId).order('created_at', { ascending: false }).execute()
+ if (legacyResponse.error != null || legacyResponse.data == null) {
+ return [] as Array
+ }
+ const legacyIds = [] as Array
+ const legacyRows = legacyResponse.data as Array
+ for (let i = 0; i < legacyRows.length; i++) {
+ const id = readString(legacyRows[i], 'id')
+ if (id != '') {
+ legacyIds.push(id)
+ }
+ }
+ return legacyIds
+}
+
+async function isCareTask(taskId: string): Promise {
+ const response = await supa.from('ec_care_tasks').select('id').eq('id', taskId).limit(1).execute()
+ return response.error == null && response.data != null && (response.data as Array).length > 0
+}
+
+async function completeWorkerTask(taskId: string): Promise {
+ const completedAt = nowIso()
+ if (await isCareTask(taskId)) {
+ await supa.from('ec_care_tasks').update({
+ status: 'ACCEPTANCE_PENDING',
+ service_completed_at: completedAt,
+ acceptance_pending_at: completedAt,
+ updated_at: completedAt
+ }).eq('id', taskId).execute()
+ await supa.from('hc_work_order_events').insert({
+ id: buildId('hc-event'),
+ task_id: taskId,
+ from_status: 'ORDER_IN_SERVICE',
+ to_status: 'ACCEPTANCE_PENDING',
+ actor_id: getCurrentUserId(),
+ actor_role: 'merchant',
+ action: 'finish_service',
+ remark: '服务记录和凭证已经提交。',
+ created_at: completedAt
+ }).execute()
+ } else {
+ await supa.from('hss_service_orders').update({
+ status: 'pending_acceptance',
+ completed_at: completedAt,
+ pending_acceptance_at: completedAt,
+ updated_at: completedAt
+ }).eq('id', taskId).execute()
+ await supa.from('hss_service_order_status_logs').insert({
+ id: buildId('slog'),
+ order_id: taskId,
+ from_status: 'in_service',
+ to_status: 'pending_acceptance',
+ operator_id: getCurrentUserId(),
+ operator_role: 'merchant',
+ remark: '服务记录和凭证已经提交。',
+ created_at: completedAt
+ }).execute()
+ }
+ return await fetchWorkerTaskDetail(taskId)
+}
+
+const ADMIN_ASSESSMENT_PREFIX = '[admin_assessment]'
+const ADMIN_PLAN_PREFIX = '[admin_plan]'
+const ADMIN_RECTIFICATION_PREFIX = '[admin_rectification]'
+
+function encodeAdminRemark(prefix: string, payload: any): string {
+ return prefix + JSON.stringify(payload)
+}
+
+function parseAdminRemark(remark: string, prefix: string): any | null {
+ if (remark == '' || remark.indexOf(prefix) != 0) {
+ return null
+ }
+ const body = remark.substring(prefix.length)
+ if (body == '') {
+ return null
+ }
+ try {
+ return JSON.parse(body) as any
+ } catch (error) {
+ return null
+ }
+}
+
+function getDefaultCareLevel(order: ServiceOrderType): string {
+ if (order.serviceName.indexOf('随访') >= 0) {
+ return '随访管理'
+ }
+ if (order.serviceName.indexOf('护理') >= 0) {
+ return '护理二级'
+ }
+ return '护理一级'
+}
+
+function getOrderLatestRemark(order: ServiceOrderType): string {
+ for (let i = 0; i < order.logs.length; i++) {
+ if (order.logs[i].remark != '') {
+ return order.logs[i].remark
+ }
+ }
+ return ''
+}
+
+async function listAdminEventRows(caseId: string): Promise> {
+ if (await isCareTask(caseId)) {
+ const response = await supa.from('hc_work_order_events').select('*').eq('task_id', caseId).order('created_at', { ascending: false }).execute()
+ return response.data != null ? response.data as Array : [] as Array
+ }
+ const response = await supa.from('hss_service_order_status_logs').select('*').eq('order_id', caseId).order('created_at', { ascending: false }).execute()
+ return response.data != null ? response.data as Array : [] as Array
+}
+
+async function readAdminPayload(caseId: string, prefix: string): Promise {
+ const rows = await listAdminEventRows(caseId)
+ for (let i = 0; i < rows.length; i++) {
+ const payload = parseAdminRemark(readString(rows[i], 'remark'), prefix)
+ if (payload != null) {
+ return payload
+ }
+ }
+ return null
+}
+
+async function readLatestExceptionSummary(caseId: string, order: ServiceOrderType): Promise {
+ if (await isCareTask(caseId)) {
+ const response = await supa.from('hc_work_order_exceptions').select('description').eq('task_id', caseId).order('created_at', { ascending: false }).limit(1).execute()
+ if (response.data != null && (response.data as Array).length > 0) {
+ const rows = response.data as Array
+ const text = readString(rows[0], 'description')
+ if (text != '') {
+ return text
+ }
+ }
+ }
+ const latestRemark = getOrderLatestRemark(order)
+ if (latestRemark != '') {
+ return latestRemark
+ }
+ if (order.review != null && order.review.content != '') {
+ return order.review.content
+ }
+ return '待补充整改说明。'
+}
+
+function buildAssessmentDetail(order: ServiceOrderType, payload: any | null): HomeServiceAssessmentType {
+ const requirementTags = payload != null ? readStringArray(payload, 'requirementTags') : [] as Array
+ return {
+ caseId: order.id,
+ caseNo: order.orderNo,
+ elderName: order.recipientName,
+ serviceName: order.serviceName,
+ riskLevel: payload != null && readString(payload, 'riskLevel') != '' ? readString(payload, 'riskLevel') : '中风险',
+ careLevel: payload != null && readString(payload, 'careLevel') != '' ? readString(payload, 'careLevel') : getDefaultCareLevel(order),
+ visitTime: formatServiceAppointmentText(order.appointmentTime),
+ assessmentSummary: payload != null && readString(payload, 'assessmentSummary') != '' ? readString(payload, 'assessmentSummary') : (order.remark != '' ? order.remark : '待补充上门评估结论。'),
+ requirementTags: requirementTags.length > 0 ? requirementTags : order.serviceSnapshot.tags
+ }
+}
+
+function buildPlanDetail(order: ServiceOrderType, payload: any | null): HomeServicePlanType {
+ const serviceCycle = payload != null && readString(payload, 'serviceCycle') != '' ? readString(payload, 'serviceCycle') : formatServiceAppointmentText(order.appointmentTime)
+ const amountText = '¥' + String(order.serviceSnapshot.price)
+ return {
+ caseId: order.id,
+ caseNo: order.orderNo,
+ elderName: order.recipientName,
+ serviceName: order.serviceName,
+ planTitle: payload != null && readString(payload, 'planTitle') != '' ? readString(payload, 'planTitle') : (order.serviceName + '执行方案'),
+ serviceFrequency: payload != null && readString(payload, 'serviceFrequency') != '' ? readString(payload, 'serviceFrequency') : '按预约执行',
+ serviceCycle: serviceCycle,
+ executorAdvice: payload != null && readString(payload, 'executorAdvice') != '' ? readString(payload, 'executorAdvice') : (order.staffName != '' ? ('优先由' + order.staffName + '承接本次服务并补全留痕。') : '优先安排熟悉该服务类型的执行人员。'),
+ billingSummary: payload != null && readString(payload, 'billingSummary') != '' ? readString(payload, 'billingSummary') : ('本次服务金额 ' + amountText),
+ planSummary: payload != null && readString(payload, 'planSummary') != '' ? readString(payload, 'planSummary') : (order.remark != '' ? order.remark : '待补充服务目标、执行重点和验收口径。')
+ }
+}
+
+function buildRectificationDetail(order: ServiceOrderType, payload: any | null, issueSummary: string): HomeServiceRectificationType {
+ const status = payload != null && readString(payload, 'status') != '' ? readString(payload, 'status') : (order.status == 'exception' ? 'pending' : 'closed')
+ return {
+ caseId: order.id,
+ caseNo: order.orderNo,
+ elderName: order.recipientName,
+ serviceName: order.serviceName,
+ issueSummary: payload != null && readString(payload, 'issueSummary') != '' ? readString(payload, 'issueSummary') : issueSummary,
+ deadline: payload != null && readString(payload, 'deadline') != '' ? readString(payload, 'deadline') : (order.pendingAcceptanceAt != '' ? order.pendingAcceptanceAt : formatServiceAppointmentText(order.appointmentTime)),
+ ownerName: payload != null && readString(payload, 'ownerName') != '' ? readString(payload, 'ownerName') : (order.staffName != '' ? order.staffName : '待分配'),
+ status: status,
+ statusText: status == 'closed' ? '已关闭' : '待整改'
+ }
+}
+
export async function fetchWorkerTasks(): Promise> {
- await delay()
- return TASK_STORE.map((item) => cloneTask(item))
+ const taskIds = await listWorkerTaskIds()
+ const result = [] as Array
+ for (let i = 0; i < taskIds.length; i++) {
+ const detail = await getServiceOrderDetail(taskIds[i])
+ if (detail != null) {
+ result.push(mapOrderToWorkerTask(detail))
+ }
+ }
+ return result
}
export async function fetchWorkerTaskDetail(taskId: string): Promise {
- await delay()
- const target = TASK_STORE.find((item) => item.id == taskId)
- return target == null ? null : cloneTask(target)
+ const detail = await getServiceOrderDetail(taskId)
+ return detail == null ? null : mapOrderToWorkerTask(detail)
}
export async function advanceWorkerTask(taskId: string): Promise {
- await delay()
- const target = TASK_STORE.find((item) => item.id == taskId)
- if (target == null) {
+ const detail = await fetchWorkerTaskDetail(taskId)
+ if (detail == null) {
return null
}
-
- if (target.status == 'pending_visit') {
- target.status = 'serving'
- target.statusText = '服务中'
- target.statusTone = 'primary'
- target.checkInStatus = '已签到'
- target.recordSummary = '已完成签到,请按步骤填写服务记录。'
- target.actionText = '完成提交'
- target.timeline.unshift({
- id: 'tl-' + String(target.timeline.length + 1),
- title: '已到岗签到',
- time: '2026-05-13 14:55',
- description: '护理员已在服务地址完成签到。'
- })
- } else if (target.status == 'serving') {
- target.status = 'completed'
- target.statusText = '待验收'
- target.statusTone = 'success'
- target.recordSummary = '已提交执行记录与服务凭证,等待家属验收。'
- target.actionText = '已提交'
- target.timeline.unshift({
- id: 'tl-' + String(target.timeline.length + 1),
- title: '服务完成待验收',
- time: '2026-05-13 16:20',
- description: '服务记录和凭证已经提交。'
- })
+ if (detail.status == 'serving') {
+ return await completeWorkerTask(taskId)
}
-
- const relatedCase = CASE_STORE.find((item) => item.id == target.caseId)
- if (relatedCase != null) {
- if (target.status == 'serving') {
- relatedCase.status = 'in_service'
- relatedCase.statusText = '服务中'
- relatedCase.statusTone = 'primary'
- relatedCase.currentStep = 6
- relatedCase.staffName = target.staffName
- relatedCase.staffPhone = target.staffPhone
- relatedCase.timeline.unshift({
- id: 'case-log-' + String(relatedCase.timeline.length + 1),
- title: '护理员已签到',
- time: '2026-05-13 14:55',
- description: '执行端已开始上门服务。'
- })
- } else if (target.status == 'completed') {
- relatedCase.status = 'pending_acceptance'
- relatedCase.statusText = '待验收'
- relatedCase.statusTone = 'success'
- relatedCase.currentStep = 7
- relatedCase.timeline.unshift({
- id: 'case-log-' + String(relatedCase.timeline.length + 1),
- title: '执行完成待验收',
- time: '2026-05-13 16:20',
- description: '家属可查看记录并进行验收反馈。'
- })
- }
- }
-
- const relatedAdmin = ADMIN_APPLICATIONS.find((item) => item.caseId == target.caseId)
- if (relatedAdmin != null) {
- if (target.status == 'serving') {
- relatedAdmin.status = 'in_service'
- relatedAdmin.statusText = '服务中'
- relatedAdmin.statusTone = 'primary'
- relatedAdmin.staffName = target.staffName
- } else if (target.status == 'completed') {
- relatedAdmin.status = 'pending_acceptance'
- relatedAdmin.statusText = '待验收'
- relatedAdmin.statusTone = 'success'
- }
- }
-
- return cloneTask(target)
+ return detail
}
export async function submitWorkerCheckIn(taskId: string, note: string): Promise {
- await delay()
- const target = TASK_STORE.find((item) => item.id == taskId)
- if (target == null) {
- return null
+ const checkedInAt = nowIso()
+ if (await isCareTask(taskId)) {
+ const recordId = buildId('care-checkin')
+ await supa.from('ec_care_records').insert({
+ id: recordId,
+ task_id: taskId,
+ record_type: 'checkin',
+ started_at: checkedInAt,
+ checked_in_at: checkedInAt,
+ location_text: note,
+ remark: note,
+ created_at: checkedInAt,
+ updated_at: checkedInAt
+ }).execute()
+ await supa.from('ec_care_tasks').update({
+ status: 'ORDER_IN_SERVICE',
+ checked_in_at: checkedInAt,
+ service_started_at: checkedInAt,
+ updated_at: checkedInAt
+ }).eq('id', taskId).execute()
+ await supa.from('hc_work_order_events').insert({
+ id: buildId('hc-event'),
+ task_id: taskId,
+ from_status: 'ORDER_ACCEPTED',
+ to_status: 'ORDER_IN_SERVICE',
+ actor_id: getCurrentUserId(),
+ actor_role: 'merchant',
+ action: 'checkin_task',
+ remark: note == '' ? '已完成签到,开始执行服务。' : note,
+ created_at: checkedInAt
+ }).execute()
+ } else {
+ const recordId = buildId('ser')
+ await supa.from('hss_service_execution_records').upsert({
+ id: recordId,
+ order_id: taskId,
+ assignment_id: '',
+ checkin_time: checkedInAt,
+ checkin_address: note,
+ service_started_at: checkedInAt,
+ remark: note,
+ created_at: checkedInAt,
+ updated_at: checkedInAt
+ }).execute()
+ await supa.from('hss_service_orders').update({
+ status: 'in_service',
+ arrived_at: checkedInAt,
+ service_started_at: checkedInAt,
+ updated_at: checkedInAt
+ }).eq('id', taskId).execute()
+ await supa.from('hss_service_order_status_logs').insert({
+ id: buildId('slog'),
+ order_id: taskId,
+ from_status: 'accepted',
+ to_status: 'in_service',
+ operator_id: getCurrentUserId(),
+ operator_role: 'merchant',
+ remark: note == '' ? '已完成签到,开始执行服务。' : note,
+ created_at: checkedInAt
+ }).execute()
}
-
- if (target.status == 'pending_visit') {
- target.status = 'serving'
- target.statusText = '服务中'
- target.statusTone = 'primary'
- target.checkInStatus = '已签到'
- target.recordSummary = note == '' ? '已完成签到,请继续填写服务记录。' : note
- target.actionText = '完成提交'
- target.timeline.unshift({
- id: 'checkin-' + String(target.timeline.length + 1),
- title: '到岗签到完成',
- time: '2026-05-13 14:40',
- description: note == '' ? '护理员已完成签到。' : note
- })
- }
-
- const relatedCase = CASE_STORE.find((item) => item.id == target.caseId)
- if (relatedCase != null) {
- relatedCase.status = 'in_service'
- relatedCase.statusText = '服务中'
- relatedCase.statusTone = 'primary'
- relatedCase.currentStep = 6
- relatedCase.staffName = target.staffName
- relatedCase.staffPhone = target.staffPhone
- relatedCase.timeline.unshift({
- id: 'case-checkin-' + String(relatedCase.timeline.length + 1),
- title: '执行人员已到岗',
- time: '2026-05-13 14:40',
- description: note == '' ? '已完成签到,开始执行服务。' : note
- })
- }
-
- const relatedAdmin = ADMIN_APPLICATIONS.find((item) => item.caseId == target.caseId)
- if (relatedAdmin != null) {
- relatedAdmin.status = 'in_service'
- relatedAdmin.statusText = '服务中'
- relatedAdmin.statusTone = 'primary'
- relatedAdmin.staffName = target.staffName
- }
-
- return cloneTask(target)
+ return await fetchWorkerTaskDetail(taskId)
}
export async function submitWorkerServiceRecord(taskId: string, summary: string): Promise {
- await delay()
- const target = TASK_STORE.find((item) => item.id == taskId)
- if (target == null) {
+ const detail = await getServiceOrderDetail(taskId)
+ if (detail == null) {
return null
}
-
- target.recordSummary = summary == '' ? target.recordSummary : summary
- target.timeline.unshift({
- id: 'record-' + String(target.timeline.length + 1),
- title: '服务记录已更新',
- time: '2026-05-13 15:30',
- description: summary == '' ? '已保存服务记录。' : summary
- })
-
- const relatedCase = CASE_STORE.find((item) => item.id == target.caseId)
- if (relatedCase != null) {
- relatedCase.summary = summary == '' ? relatedCase.summary : summary
- relatedCase.timeline.unshift({
- id: 'case-record-' + String(relatedCase.timeline.length + 1),
- title: '执行记录已回传',
- time: '2026-05-13 15:30',
- description: summary == '' ? '执行端已保存记录。' : summary
- })
+ const now = nowIso()
+ const recordId = detail.executionRecord != null && detail.executionRecord.id != '' ? detail.executionRecord.id : buildId('worker-rec')
+ if (await isCareTask(taskId)) {
+ await supa.from('ec_care_records').upsert({
+ id: recordId,
+ task_id: taskId,
+ record_type: 'service',
+ started_at: detail.executionRecord != null ? detail.executionRecord.serviceStartedAt : detail.serviceStartedAt,
+ summary: summary,
+ remark: summary,
+ created_at: detail.executionRecord != null && detail.executionRecord.createdAt != '' ? detail.executionRecord.createdAt : now,
+ updated_at: now
+ }).execute()
+ await supa.from('ec_care_tasks').update({
+ status: 'ORDER_IN_SERVICE',
+ updated_at: now
+ }).eq('id', taskId).execute()
+ await supa.from('hc_work_order_events').insert({
+ id: buildId('hc-event'),
+ task_id: taskId,
+ from_status: 'ORDER_IN_SERVICE',
+ to_status: 'ORDER_IN_SERVICE',
+ actor_id: getCurrentUserId(),
+ actor_role: 'merchant',
+ action: 'save_record',
+ remark: summary == '' ? '已保存服务记录。' : summary,
+ created_at: now
+ }).execute()
+ } else {
+ await supa.from('hss_service_execution_records').upsert({
+ id: recordId,
+ order_id: taskId,
+ assignment_id: detail.currentAssignmentId,
+ service_started_at: detail.executionRecord != null ? detail.executionRecord.serviceStartedAt : detail.serviceStartedAt,
+ summary: summary,
+ remark: summary,
+ created_at: detail.executionRecord != null && detail.executionRecord.createdAt != '' ? detail.executionRecord.createdAt : now,
+ updated_at: now
+ }).execute()
}
-
- return cloneTask(target)
+ return await fetchWorkerTaskDetail(taskId)
}
export async function submitWorkerException(taskId: string, exceptionType: string, description: string): Promise {
- await delay()
- const target = TASK_STORE.find((item) => item.id == taskId)
- if (target == null) {
- return null
+ const now = nowIso()
+ if (await isCareTask(taskId)) {
+ await supa.from('hc_work_order_exceptions').insert({
+ id: buildId('hc-ex'),
+ task_id: taskId,
+ exception_type: exceptionType,
+ description: description,
+ occurred_at: now,
+ created_by: getCurrentUserId(),
+ created_at: now,
+ updated_at: now
+ }).execute()
+ await supa.from('ec_care_tasks').update({
+ status: 'ORDER_EXCEPTION',
+ updated_at: now
+ }).eq('id', taskId).execute()
+ await supa.from('hc_work_order_events').insert({
+ id: buildId('hc-event'),
+ task_id: taskId,
+ from_status: '',
+ to_status: 'ORDER_EXCEPTION',
+ actor_id: getCurrentUserId(),
+ actor_role: 'merchant',
+ action: 'report_exception',
+ remark: exceptionType + ':' + description,
+ created_at: now
+ }).execute()
+ } else {
+ await supa.from('hss_service_orders').update({
+ status: 'exception',
+ updated_at: now
+ }).eq('id', taskId).execute()
+ await supa.from('hss_service_order_status_logs').insert({
+ id: buildId('slog'),
+ order_id: taskId,
+ from_status: 'in_service',
+ to_status: 'exception',
+ operator_id: getCurrentUserId(),
+ operator_role: 'merchant',
+ remark: exceptionType + ':' + description,
+ created_at: now
+ }).execute()
}
-
- target.status = 'exception'
- target.statusText = '异常上报'
- target.statusTone = 'warning'
- target.actionText = '已上报'
- target.timeline.unshift({
- id: 'exception-' + String(target.timeline.length + 1),
- title: '异常已上报',
- time: '2026-05-13 15:45',
- description: exceptionType + ':' + description
- })
-
- const relatedCase = CASE_STORE.find((item) => item.id == target.caseId)
- if (relatedCase != null) {
- relatedCase.status = 'exception'
- relatedCase.statusText = '异常处理中'
- relatedCase.statusTone = 'warning'
- relatedCase.timeline.unshift({
- id: 'case-exception-' + String(relatedCase.timeline.length + 1),
- title: '服务异常待处理',
- time: '2026-05-13 15:45',
- description: exceptionType + ':' + description
- })
- }
-
- const relatedAdmin = ADMIN_APPLICATIONS.find((item) => item.caseId == target.caseId)
- if (relatedAdmin != null) {
- relatedAdmin.status = 'exception'
- relatedAdmin.statusText = '异常处理中'
- relatedAdmin.statusTone = 'warning'
- }
-
- return cloneTask(target)
+ return await fetchWorkerTaskDetail(taskId)
}
export async function fetchAdminAssessmentDetail(caseId: string): Promise {
- await delay()
- const target = ADMIN_ASSESSMENTS.find((item) => item.caseId == caseId)
- return target == null ? null : cloneAssessment(target)
+ const order = await getServiceOrderDetail(caseId)
+ if (order == null) {
+ return null
+ }
+ const payload = await readAdminPayload(caseId, ADMIN_ASSESSMENT_PREFIX)
+ return buildAssessmentDetail(order, payload)
}
export async function submitAdminAssessment(caseId: string, riskLevel: string, careLevel: string, assessmentSummary: string): Promise {
- await delay()
- const target = ADMIN_ASSESSMENTS.find((item) => item.caseId == caseId)
- if (target == null) {
+ const order = await getServiceOrderDetail(caseId)
+ if (order == null) {
return null
}
-
- target.riskLevel = riskLevel
- target.careLevel = careLevel
- target.assessmentSummary = assessmentSummary
-
- const relatedAdmin = ADMIN_APPLICATIONS.find((item) => item.caseId == caseId)
- if (relatedAdmin != null) {
- relatedAdmin.status = 'pending_plan'
- relatedAdmin.statusText = '待方案'
- relatedAdmin.statusTone = 'primary'
- relatedAdmin.assessmentResult = careLevel + ' · ' + riskLevel
+ const payload = {
+ riskLevel,
+ careLevel,
+ assessmentSummary,
+ requirementTags: order.serviceSnapshot.tags,
+ updatedAt: nowIso()
}
-
- const relatedCase = CASE_STORE.find((item) => item.id == caseId)
- if (relatedCase != null) {
- relatedCase.currentStep = 2
- relatedCase.timeline.unshift({
- id: 'case-assessment-' + String(relatedCase.timeline.length + 1),
- title: '上门评估完成',
- time: '2026-05-13 13:20',
- description: assessmentSummary
- })
+ if (await isCareTask(caseId)) {
+ await supa.from('hc_work_order_events').insert({
+ id: buildId('hc-event'),
+ task_id: caseId,
+ from_status: order.status,
+ to_status: order.status,
+ actor_id: getCurrentUserId(),
+ actor_role: 'admin',
+ action: 'submit_assessment',
+ remark: encodeAdminRemark(ADMIN_ASSESSMENT_PREFIX, payload),
+ created_at: nowIso()
+ }).execute()
+ } else {
+ await supa.from('hss_service_order_status_logs').insert({
+ id: buildId('slog'),
+ order_id: caseId,
+ from_status: order.status,
+ to_status: order.status,
+ operator_id: getCurrentUserId(),
+ operator_role: 'admin',
+ remark: encodeAdminRemark(ADMIN_ASSESSMENT_PREFIX, payload),
+ created_at: nowIso()
+ }).execute()
}
-
- return cloneAssessment(target)
+ return buildAssessmentDetail(order, payload)
}
export async function fetchAdminServicePlanDetail(caseId: string): Promise {
- await delay()
- const target = ADMIN_PLANS.find((item) => item.caseId == caseId)
- return target == null ? null : clonePlan(target)
+ const order = await getServiceOrderDetail(caseId)
+ if (order == null) {
+ return null
+ }
+ const payload = await readAdminPayload(caseId, ADMIN_PLAN_PREFIX)
+ return buildPlanDetail(order, payload)
}
export async function submitAdminServicePlan(
@@ -838,40 +1088,44 @@ export async function submitAdminServicePlan(
serviceCycle: string,
planSummary: string
): Promise {
- await delay()
- const target = ADMIN_PLANS.find((item) => item.caseId == caseId)
- if (target == null) {
+ const order = await getServiceOrderDetail(caseId)
+ if (order == null) {
return null
}
-
- target.planTitle = planTitle
- target.serviceFrequency = serviceFrequency
- target.serviceCycle = serviceCycle
- target.planSummary = planSummary
-
- const relatedAdmin = ADMIN_APPLICATIONS.find((item) => item.caseId == caseId)
- if (relatedAdmin != null) {
- relatedAdmin.status = 'pending_dispatch'
- relatedAdmin.statusText = '待派单'
- relatedAdmin.statusTone = 'warning'
- relatedAdmin.assessmentResult = target.planTitle + ' · ' + target.serviceFrequency
+ const payload = {
+ planTitle,
+ serviceFrequency,
+ serviceCycle,
+ executorAdvice: order.staffName != '' ? ('优先由' + order.staffName + '承接本次服务并补全留痕。') : '优先安排熟悉该服务类型的执行人员。',
+ billingSummary: '本次服务金额 ¥' + String(order.serviceSnapshot.price),
+ planSummary,
+ updatedAt: nowIso()
}
-
- const relatedCase = CASE_STORE.find((item) => item.id == caseId)
- if (relatedCase != null) {
- relatedCase.currentStep = 3
- relatedCase.status = 'pending_dispatch'
- relatedCase.statusText = '待派单'
- relatedCase.statusTone = 'warning'
- relatedCase.timeline.unshift({
- id: 'case-plan-' + String(relatedCase.timeline.length + 1),
- title: '服务方案已生成',
- time: '2026-05-13 14:10',
- description: planSummary
- })
+ if (await isCareTask(caseId)) {
+ await supa.from('hc_work_order_events').insert({
+ id: buildId('hc-event'),
+ task_id: caseId,
+ from_status: order.status,
+ to_status: order.status,
+ actor_id: getCurrentUserId(),
+ actor_role: 'admin',
+ action: 'submit_plan',
+ remark: encodeAdminRemark(ADMIN_PLAN_PREFIX, payload),
+ created_at: nowIso()
+ }).execute()
+ } else {
+ await supa.from('hss_service_order_status_logs').insert({
+ id: buildId('slog'),
+ order_id: caseId,
+ from_status: order.status,
+ to_status: order.status,
+ operator_id: getCurrentUserId(),
+ operator_role: 'admin',
+ remark: encodeAdminRemark(ADMIN_PLAN_PREFIX, payload),
+ created_at: nowIso()
+ }).execute()
}
-
- return clonePlan(target)
+ return buildPlanDetail(order, payload)
}
export async function fetchConsumerAcceptanceDetail(caseId: string): Promise {
@@ -914,43 +1168,68 @@ export async function submitConsumerAcceptance(
}
export async function fetchAdminRectificationDetail(caseId: string): Promise {
- await delay()
- const target = ADMIN_RECTIFICATIONS.find((item) => item.caseId == caseId)
- return target == null ? null : cloneRectification(target)
+ const order = await getServiceOrderDetail(caseId)
+ if (order == null) {
+ return null
+ }
+ const payload = await readAdminPayload(caseId, ADMIN_RECTIFICATION_PREFIX)
+ const issueSummary = await readLatestExceptionSummary(caseId, order)
+ return buildRectificationDetail(order, payload, issueSummary)
}
export async function submitAdminRectification(caseId: string, issueSummary: string): Promise {
- await delay()
- const target = ADMIN_RECTIFICATIONS.find((item) => item.caseId == caseId)
- if (target == null) {
+ const order = await getServiceOrderDetail(caseId)
+ if (order == null) {
return null
}
-
- target.issueSummary = issueSummary
- target.status = 'closed'
- target.statusText = '已关闭'
-
- const relatedAdmin = ADMIN_APPLICATIONS.find((item) => item.caseId == caseId)
- if (relatedAdmin != null) {
- relatedAdmin.status = 'pending_acceptance'
- relatedAdmin.statusText = '待复验收'
- relatedAdmin.statusTone = 'primary'
+ const payload = {
+ issueSummary,
+ deadline: order.pendingAcceptanceAt != '' ? order.pendingAcceptanceAt : formatServiceAppointmentText(order.appointmentTime),
+ ownerName: order.staffName != '' ? order.staffName : '待分配',
+ status: 'closed',
+ updatedAt: nowIso()
}
-
- const relatedCase = CASE_STORE.find((item) => item.id == caseId)
- if (relatedCase != null) {
- relatedCase.status = 'pending_acceptance'
- relatedCase.statusText = '待复验收'
- relatedCase.statusTone = 'primary'
- relatedCase.timeline.unshift({
- id: 'case-rectification-' + String(relatedCase.timeline.length + 1),
- title: '整改处理完成',
- time: '2026-05-13 18:10',
- description: issueSummary
- })
+ if (await isCareTask(caseId)) {
+ const reopenedAt = nowIso()
+ await supa.from('ec_care_tasks').update({
+ status: 'ACCEPTANCE_PENDING',
+ acceptance_pending_at: reopenedAt,
+ updated_at: reopenedAt
+ }).eq('id', caseId).execute()
+ await supa.from('hc_work_order_events').insert({
+ id: buildId('hc-event'),
+ task_id: caseId,
+ from_status: 'ACCEPTANCE_REJECTED',
+ to_status: 'ACCEPTANCE_PENDING',
+ actor_id: getCurrentUserId(),
+ actor_role: 'admin',
+ action: 'submit_rectification',
+ remark: encodeAdminRemark(ADMIN_RECTIFICATION_PREFIX, payload),
+ created_at: reopenedAt
+ }).execute()
+ } else {
+ const reopenedAt = nowIso()
+ await supa.from('hss_service_orders').update({
+ status: 'pending_acceptance',
+ pending_acceptance_at: reopenedAt,
+ updated_at: reopenedAt
+ }).eq('id', caseId).execute()
+ await supa.from('hss_service_order_status_logs').insert({
+ id: buildId('slog'),
+ order_id: caseId,
+ from_status: order.status,
+ to_status: 'pending_acceptance',
+ operator_id: getCurrentUserId(),
+ operator_role: 'admin',
+ remark: encodeAdminRemark(ADMIN_RECTIFICATION_PREFIX, payload),
+ created_at: reopenedAt
+ }).execute()
}
-
- return cloneRectification(target)
+ const latest = await getServiceOrderDetail(caseId)
+ if (latest == null) {
+ return buildRectificationDetail(order, payload, issueSummary)
+ }
+ return buildRectificationDetail(latest, payload, issueSummary)
}
export async function fetchAdminSettlementDetail(caseId: string): Promise {
diff --git a/services/serviceOrderService.uts b/services/serviceOrderService.uts
index f41cb401..493d1c0e 100644
--- a/services/serviceOrderService.uts
+++ b/services/serviceOrderService.uts
@@ -30,6 +30,10 @@ function nowText(): string {
return new Date().toISOString().replace('T', ' ').substring(0, 19)
}
+function nowIso(): string {
+ return new Date().toISOString()
+}
+
function buildId(prefix: string): string {
return prefix + '-' + String(Date.now()) + '-' + String(Math.floor(Math.random() * 100000)).padStart(5, '0')
}
@@ -290,7 +294,7 @@ function parseServiceOrder(item: any, logs: Array,
}
}
-async function insertStatusLog(orderId: string, fromStatus: string, toStatus: ServiceOrderStatus, operatorId: string, operatorRole: string, remark: string): Promise {
+async function insertLegacyStatusLog(orderId: string, fromStatus: string, toStatus: ServiceOrderStatus, operatorId: string, operatorRole: string, remark: string): Promise {
await supa.from('hss_service_order_status_logs').insert({
id: buildId('slog'),
order_id: orderId,
@@ -303,110 +307,318 @@ async function insertStatusLog(orderId: string, fromStatus: string, toStatus: Se
}).execute()
}
-export function buildAddressSnapshot(address: UserAddress, latitude: number, longitude: number): ServiceOrderAddressSnapshotType {
+async function insertWorkOrderEvent(taskId: string, fromStatus: string, toStatus: string, actorId: string, actorRole: string, action: string, remark: string): Promise {
+ await supa.from('hc_work_order_events').insert({
+ id: buildId('hc-event'),
+ task_id: taskId,
+ from_status: fromStatus == '' ? null : fromStatus,
+ to_status: toStatus,
+ actor_id: actorId == '' ? null : actorId,
+ actor_role: actorRole,
+ action,
+ remark,
+ created_at: nowIso()
+ }).execute()
+ }
+
+function readFirstString(source: any, keys: Array): string {
+ for (let i = 0; i < keys.length; i++) {
+ const value = readString(source, keys[i])
+ if (value != '') {
+ return value
+ }
+ }
+ return ''
+ }
+
+function readFirstNumber(source: any, keys: Array): number {
+ for (let i = 0; i < keys.length; i++) {
+ const value = readNumber(source, keys[i])
+ if (value != 0) {
+ return value
+ }
+ }
+ return 0
+ }
+
+function readJsonObjectField(source: any, keys: Array): any {
+ const plain = plainObject(source)
+ for (let i = 0; i < keys.length; i++) {
+ const value = plain[keys[i]]
+ if (value != null) {
+ return value
+ }
+ }
+ return null
+ }
+
+function mapCareTaskRowToLegacyOrderRow(item: any): any {
+ const serviceSnapshotValue = readJsonObjectField(item, ['service_snapshot_json'])
+ const addressSnapshotValue = readJsonObjectField(item, ['address_snapshot_json'])
+ let derivedStatus = readString(item, 'status')
+ if (readFirstString(item, ['accepted_by_family_at']) != '') {
+ derivedStatus = 'ACCEPTED'
+ } else if (readFirstString(item, ['acceptance_pending_at']) != '') {
+ derivedStatus = 'ACCEPTANCE_PENDING'
+ } else if (readString(item, 'service_started_at') != '') {
+ derivedStatus = 'ORDER_IN_SERVICE'
+ } else if (readFirstString(item, ['checked_in_at']) != '') {
+ derivedStatus = 'ORDER_CHECKED_IN'
+ } else if (readString(item, 'departed_at') != '') {
+ derivedStatus = 'departed'
+ } else if (readString(item, 'accepted_at') != '') {
+ derivedStatus = 'ORDER_ACCEPTED'
+ } else if (readFirstString(item, ['assigned_to']) != '') {
+ derivedStatus = 'ORDER_ASSIGNED'
+ }
+ const serviceSnapshot = serviceSnapshotValue != null ? serviceSnapshotValue : {
+ serviceId: readFirstString(item, ['service_catalog_id', 'service_id']),
+ serviceName: readString(item, 'service_name'),
+ category: readFirstString(item, ['service_category', 'category']),
+ price: readFirstNumber(item, ['service_price', 'price']),
+ durationText: readFirstString(item, ['service_duration_text', 'duration_text']),
+ summary: readFirstString(item, ['service_summary', 'summary']),
+ tags: [] as Array,
+ suitableFor: readFirstString(item, ['suitable_for'])
+ }
return {
- addressId: address.id,
- contactName: address.recipient_name,
- contactPhone: address.phone,
- province: address.province,
- city: address.city,
- district: address.district,
- detailAddress: address.detail_address,
- fullAddress: address.province + address.city + address.district + ' ' + address.detail_address,
- latitude,
- longitude,
- coordinateType: 'gcj02',
- remark: address.label ?? ''
+ id: readString(item, 'id'),
+ order_no: readFirstString(item, ['task_no', 'order_no']),
+ user_id: readFirstString(item, ['user_id', 'requester_user_id']),
+ service_id: readFirstString(item, ['service_catalog_id', 'service_id']),
+ service_name: readString(item, 'service_name'),
+ service_snapshot_json: serviceSnapshot,
+ service_address_id: readFirstString(item, ['service_address_id', 'address_id']),
+ address_snapshot_json: addressSnapshotValue != null ? addressSnapshotValue : JSON.parse('{}'),
+ recipient_name: readFirstString(item, ['elder_name', 'recipient_name']),
+ recipient_phone: readFirstString(item, ['elder_phone', 'recipient_phone']),
+ contact_name: readString(item, 'contact_name'),
+ contact_phone: readString(item, 'contact_phone'),
+ appointment_time: readFirstString(item, ['scheduled_at', 'appointment_time']),
+ remark: readString(item, 'remark'),
+ status: derivedStatus,
+ current_assignment_id: readFirstString(item, ['assignment_id', 'current_assignment_id']),
+ current_staff_id: readFirstString(item, ['assigned_to', 'current_staff_id']),
+ accepted_at: readString(item, 'accepted_at'),
+ departed_at: readString(item, 'departed_at'),
+ arrived_at: readFirstString(item, ['checked_in_at', 'arrived_at']),
+ service_started_at: readString(item, 'service_started_at'),
+ completed_at: readFirstString(item, ['service_completed_at', 'completed_at']),
+ pending_acceptance_at: readFirstString(item, ['acceptance_pending_at', 'pending_acceptance_at']),
+ accepted_by_user_at: readFirstString(item, ['accepted_by_family_at', 'accepted_by_user_at']),
+ reviewed_at: readString(item, 'reviewed_at'),
+ created_at: readString(item, 'created_at'),
+ updated_at: readString(item, 'updated_at')
}
}
-export async function createServiceOrder(params: CreateServiceOrderParams): Promise {
+function mapWorkOrderEventToLegacyLog(item: any): any {
+ return {
+ id: readString(item, 'id'),
+ order_id: readFirstString(item, ['task_id', 'order_id']),
+ from_status: readString(item, 'from_status'),
+ to_status: readFirstString(item, ['to_status', 'status']),
+ operator_id: readFirstString(item, ['actor_id', 'operator_id']),
+ operator_role: readFirstString(item, ['actor_role', 'operator_role']),
+ remark: readString(item, 'remark'),
+ created_at: readString(item, 'created_at')
+ }
+ }
+
+function mapCareReviewRecordToLegacyReview(item: any): any {
+ return {
+ id: readString(item, 'id'),
+ order_id: readFirstString(item, ['task_id', 'order_id']),
+ user_id: readFirstString(item, ['created_by', 'user_id']),
+ rating: readFirstNumber(item, ['rating']),
+ tags_json: readJsonObjectField(item, ['tags_json']) != null ? readJsonObjectField(item, ['tags_json']) : [] as Array,
+ content: readFirstString(item, ['content', 'summary', 'remark']),
+ created_at: readString(item, 'created_at')
+ }
+ }
+
+function buildLegacyExecutionRecord(taskId: string, records: Array): ServiceExecutionRecordType | null {
+ if (records.length == 0) {
+ return null
+ }
+ let checkinRecord: any = null
+ let serviceRecord: any = null
+ for (let i = 0; i < records.length; i++) {
+ const recordType = readFirstString(records[i], ['record_type', 'care_record_type'])
+ if (recordType == 'review') {
+ continue
+ }
+ if (recordType == 'checkin') {
+ checkinRecord = records[i]
+ continue
+ }
+ if (serviceRecord == null) {
+ serviceRecord = records[i]
+ }
+ }
+ const target = serviceRecord != null ? serviceRecord : (checkinRecord != null ? checkinRecord : records[0])
+ return parseExecutionRecord({
+ id: readString(target, 'id'),
+ order_id: taskId,
+ assignment_id: readFirstString(target, ['assignment_id']),
+ checkin_time: checkinRecord != null ? readFirstString(checkinRecord, ['checked_in_at', 'checkin_time', 'started_at']) : readFirstString(target, ['checked_in_at', 'checkin_time']),
+ checkin_latitude: checkinRecord != null ? readFirstNumber(checkinRecord, ['latitude', 'checkin_latitude']) : readFirstNumber(target, ['latitude', 'checkin_latitude']),
+ checkin_longitude: checkinRecord != null ? readFirstNumber(checkinRecord, ['longitude', 'checkin_longitude']) : readFirstNumber(target, ['longitude', 'checkin_longitude']),
+ checkin_address: checkinRecord != null ? readFirstString(checkinRecord, ['location_text', 'checkin_address', 'remark']) : readFirstString(target, ['location_text', 'checkin_address']),
+ service_started_at: readFirstString(target, ['started_at', 'service_started_at']),
+ service_finished_at: readFirstString(target, ['finished_at', 'service_finished_at']),
+ actual_duration_minutes: readFirstNumber(target, ['duration_minutes', 'actual_duration_minutes']),
+ service_items_json: readJsonObjectField(target, ['service_items_json']) != null ? readJsonObjectField(target, ['service_items_json']) : [] as Array,
+ summary: readFirstString(target, ['summary', 'content']),
+ remark: readString(target, 'remark'),
+ track_points_json: readJsonObjectField(target, ['track_points_json']) != null ? readJsonObjectField(target, ['track_points_json']) : [] as Array,
+ created_at: readString(target, 'created_at'),
+ updated_at: readString(target, 'updated_at')
+ })
+ }
+
+async function getCareTaskDetail(taskId: string): Promise {
+ const taskResponse = await supa.from('ec_care_tasks').select('*').eq('id', taskId).limit(1).execute()
+ if (taskResponse.error != null || taskResponse.data == null) {
+ return null
+ }
+ const taskRows = taskResponse.data as Array
+ if (taskRows.length == 0) {
+ return null
+ }
+ const eventsResponse = await supa.from('hc_work_order_events').select('*').eq('task_id', taskId).order('created_at', { ascending: false }).execute()
+ const recordsResponse = await supa.from('ec_care_records').select('*').eq('task_id', taskId).order('created_at', { ascending: false }).execute()
+ const evidenceResponse = await supa.from('hc_evidence_files').select('*').eq('task_id', taskId).order('created_at', { ascending: false }).execute()
+ const logs = [] as Array
+ if (eventsResponse.data != null) {
+ const rawEvents = eventsResponse.data as Array
+ for (let i = 0; i < rawEvents.length; i++) {
+ logs.push(parseTimeline(mapWorkOrderEventToLegacyLog(rawEvents[i])))
+ }
+ }
+ let review: ServiceReviewType | null = null
+ const recordRows = recordsResponse.data != null ? recordsResponse.data as Array : [] as Array
+ for (let i = 0; i < recordRows.length; i++) {
+ const recordType = readFirstString(recordRows[i], ['record_type', 'care_record_type'])
+ if (recordType == 'review') {
+ review = parseReview(mapCareReviewRecordToLegacyReview(recordRows[i]))
+ break
+ }
+ }
+ const parsed = parseServiceOrder(mapCareTaskRowToLegacyOrderRow(taskRows[0]), logs, review)
+ parsed.executionRecord = buildLegacyExecutionRecord(taskId, recordRows)
+ if (evidenceResponse.data != null) {
+ const rawEvidence = evidenceResponse.data as Array
+ const evidenceFiles = [] as Array
+ for (let i = 0; i < rawEvidence.length; i++) {
+ evidenceFiles.push(parseEvidenceFile({
+ id: readString(rawEvidence[i], 'id'),
+ order_id: taskId,
+ execution_record_id: readFirstString(rawEvidence[i], ['care_record_id', 'execution_record_id']),
+ phase: readString(rawEvidence[i], 'phase'),
+ file_type: readString(rawEvidence[i], 'file_type'),
+ storage_path: readString(rawEvidence[i], 'storage_path'),
+ file_url: readString(rawEvidence[i], 'file_url'),
+ latitude: readFirstNumber(rawEvidence[i], ['latitude']),
+ longitude: readFirstNumber(rawEvidence[i], ['longitude']),
+ captured_at: readString(rawEvidence[i], 'captured_at'),
+ created_at: readString(rawEvidence[i], 'created_at')
+ }))
+ }
+ parsed.evidenceFiles = evidenceFiles
+ }
+ if (parsed.currentStaffId != '') {
+ const staffResponse = await supa.from('ml_delivery_staff').select('nickname, phone').eq('uid', parsed.currentStaffId).limit(1).execute()
+ if (staffResponse.data != null) {
+ const rawStaffList = staffResponse.data as Array
+ if (rawStaffList.length > 0) {
+ parsed.staffName = readString(rawStaffList[0], 'nickname')
+ parsed.staffPhone = readString(rawStaffList[0], 'phone')
+ }
+ }
+ }
+ return parsed
+ }
+
+async function tryCreateCareTask(params: CreateServiceOrderParams): Promise {
const userId = getCurrentUserId()
if (userId == '') {
return null
}
- const orderId = buildId('so')
- const orderNo = buildOrderNo()
- const now = new Date().toISOString()
+ const requestId = buildId('sr')
+ const taskId = buildId('ct')
+ const taskNo = buildOrderNo()
+ const createdAt = nowIso()
const appointmentTime = normalizeAppointmentTime(params.appointmentTime)
- const response = await supa.from('hss_service_orders').insert({
- id: orderId,
- order_no: orderNo,
+ const requestResponse = await supa.from('ec_service_requests').insert({
+ id: requestId,
user_id: userId,
- service_id: params.service.id,
+ service_catalog_id: params.service.id,
service_name: params.service.name,
- service_snapshot_json: params.service as any,
- service_address_id: normalizeUuidOrNull(params.address.addressId),
- address_snapshot_json: params.address as any,
- recipient_name: params.recipientName,
- recipient_phone: params.recipientPhone,
+ service_category: params.service.category,
+ elder_name: params.recipientName,
+ elder_phone: params.recipientPhone,
contact_name: params.contactName,
contact_phone: params.contactPhone,
- appointment_time: appointmentTime,
+ address_snapshot_json: params.address as any,
+ scheduled_at: appointmentTime,
remark: params.remark,
- status: 'created',
- created_at: now,
- updated_at: now
+ status: 'ORDER_CREATED',
+ created_at: createdAt,
+ updated_at: createdAt
}).execute()
- if (response.error != null) {
- console.error('createServiceOrder failed', response.error)
+ if (requestResponse.error != null) {
return null
}
- await insertStatusLog(orderId, '', 'created', userId, 'consumer', '创建服务订单')
+ const taskResponse = await supa.from('ec_care_tasks').insert({
+ id: taskId,
+ task_no: taskNo,
+ request_id: requestId,
+ user_id: userId,
+ service_catalog_id: params.service.id,
+ service_name: params.service.name,
+ service_category: params.service.category,
+ service_snapshot_json: params.service as any,
+ address_snapshot_json: params.address as any,
+ elder_name: params.recipientName,
+ elder_phone: params.recipientPhone,
+ contact_name: params.contactName,
+ contact_phone: params.contactPhone,
+ scheduled_at: appointmentTime,
+ remark: params.remark,
+ status: 'ORDER_CREATED',
+ created_at: createdAt,
+ updated_at: createdAt
+ }).execute()
+ if (taskResponse.error != null) {
+ return null
+ }
+ await insertWorkOrderEvent(taskId, '', 'ORDER_CREATED', userId, 'consumer', 'create_task', '创建服务申请')
const staffResponse = await supa
.from('ml_delivery_staff')
- .select('id, station_id, nickname, phone, status, deleted_at')
+ .select('id, uid, station_id, nickname, phone, status, deleted_at')
.eq('status', 1)
.order('created_at', { ascending: true })
.execute()
if (staffResponse.data != null) {
- const rawStaffList = staffResponse.data as any[]
+ const rawStaffList = staffResponse.data as Array
if (rawStaffList.length > 0) {
- const staffObj = plainObject(rawStaffList[0])
- const assignmentId = buildId('sa')
- await supa.from('hss_service_assignments').insert({
- id: assignmentId,
- order_id: orderId,
- staff_id: readString(staffObj, 'id'),
- station_id: readString(staffObj, 'station_id') == '' ? null : readString(staffObj, 'station_id'),
- status: 'assigned',
- assigned_at: now,
- created_at: now,
- updated_at: now
- }).execute()
- await supa.from('hss_service_orders').update({
- status: 'assigned',
- current_assignment_id: assignmentId,
- current_staff_id: readString(staffObj, 'id'),
- updated_at: now
- }).eq('id', orderId).execute()
- await insertStatusLog(orderId, 'created', 'assigned', userId, 'system', '系统已自动派单')
+ const staffObj = rawStaffList[0]
+ const assignedUserId = readFirstString(staffObj, ['uid', 'id'])
+ if (assignedUserId != '') {
+ await supa.from('ec_care_tasks').update({
+ status: 'ORDER_ASSIGNED',
+ assigned_to: assignedUserId,
+ updated_at: createdAt
+ }).eq('id', taskId).execute()
+ await insertWorkOrderEvent(taskId, 'ORDER_CREATED', 'ORDER_ASSIGNED', userId, 'system', 'assign_task', '系统已自动派单')
+ }
}
}
- return await getServiceOrderDetail(orderId)
+ return await getCareTaskDetail(taskId)
}
-export async function listConsumerServiceOrders(): Promise> {
- const userId = getCurrentUserId()
- if (userId == '') {
- return [] as Array
- }
- const response = await supa.from('hss_service_orders').select('*').eq('user_id', userId).order('created_at', { ascending: false }).execute()
- if (response.error != null || response.data == null) {
- return [] as Array
- }
- const list = response.data as any[]
- const result = [] as Array
- for (let i = 0; i < list.length; i++) {
- const parsed = await getServiceOrderDetail(JSON.parse(JSON.stringify(list[i]))['id'] as string)
- if (parsed != null) {
- result.push(parsed)
- }
- }
- return result
- }
-
-export async function getServiceOrderDetail(orderId: string): Promise {
+async function getLegacyServiceOrderDetail(orderId: string): Promise {
const orderResponse = await supa.from('hss_service_orders').select('*').eq('id', orderId).limit(1).execute()
if (orderResponse.error != null || orderResponse.data == null) {
return null
@@ -454,19 +666,173 @@ export async function getServiceOrderDetail(orderId: string): Promise 0) {
const staffObj = plainObject(rawStaffList[0])
- parsed.staffName = readString(staffObj, 'nickname')
- parsed.staffPhone = readString(staffObj, 'phone')
+ parsed.staffName = readString(staffObj, 'nickname')
+ parsed.staffPhone = readString(staffObj, 'phone')
}
}
}
return parsed
}
+export function buildAddressSnapshot(address: UserAddress, latitude: number, longitude: number): ServiceOrderAddressSnapshotType {
+ return {
+ addressId: address.id,
+ contactName: address.recipient_name,
+ contactPhone: address.phone,
+ province: address.province,
+ city: address.city,
+ district: address.district,
+ detailAddress: address.detail_address,
+ fullAddress: address.province + address.city + address.district + ' ' + address.detail_address,
+ latitude,
+ longitude,
+ coordinateType: 'gcj02',
+ remark: address.label ?? ''
+ }
+ }
+
+export async function createServiceOrder(params: CreateServiceOrderParams): Promise {
+ const newTask = await tryCreateCareTask(params)
+ if (newTask != null) {
+ return newTask
+ }
+ const userId = getCurrentUserId()
+ if (userId == '') {
+ return null
+ }
+ const orderId = buildId('so')
+ const orderNo = buildOrderNo()
+ const now = new Date().toISOString()
+ const appointmentTime = normalizeAppointmentTime(params.appointmentTime)
+ const response = await supa.from('hss_service_orders').insert({
+ id: orderId,
+ order_no: orderNo,
+ user_id: userId,
+ service_id: params.service.id,
+ service_name: params.service.name,
+ service_snapshot_json: params.service as any,
+ service_address_id: normalizeUuidOrNull(params.address.addressId),
+ address_snapshot_json: params.address as any,
+ recipient_name: params.recipientName,
+ recipient_phone: params.recipientPhone,
+ contact_name: params.contactName,
+ contact_phone: params.contactPhone,
+ appointment_time: appointmentTime,
+ remark: params.remark,
+ status: 'created',
+ created_at: now,
+ updated_at: now
+ }).execute()
+ if (response.error != null) {
+ console.error('createServiceOrder failed', response.error)
+ return null
+ }
+ await insertLegacyStatusLog(orderId, '', 'created', userId, 'consumer', '创建服务订单')
+ const staffResponse = await supa
+ .from('ml_delivery_staff')
+ .select('id, station_id, nickname, phone, status, deleted_at')
+ .eq('status', 1)
+ .order('created_at', { ascending: true })
+ .execute()
+ if (staffResponse.data != null) {
+ const rawStaffList = staffResponse.data as any[]
+ if (rawStaffList.length > 0) {
+ const staffObj = plainObject(rawStaffList[0])
+ const assignmentId = buildId('sa')
+ await supa.from('hss_service_assignments').insert({
+ id: assignmentId,
+ order_id: orderId,
+ staff_id: readString(staffObj, 'id'),
+ station_id: readString(staffObj, 'station_id') == '' ? null : readString(staffObj, 'station_id'),
+ status: 'assigned',
+ assigned_at: now,
+ created_at: now,
+ updated_at: now
+ }).execute()
+ await supa.from('hss_service_orders').update({
+ status: 'assigned',
+ current_assignment_id: assignmentId,
+ current_staff_id: readString(staffObj, 'id'),
+ updated_at: now
+ }).eq('id', orderId).execute()
+ await insertLegacyStatusLog(orderId, 'created', 'assigned', userId, 'system', '系统已自动派单')
+ }
+ }
+ return await getLegacyServiceOrderDetail(orderId)
+ }
+
+export async function listConsumerServiceOrders(): Promise> {
+ const userId = getCurrentUserId()
+ if (userId == '') {
+ return [] as Array
+ }
+ const careTaskResponse = await supa.from('ec_care_tasks').select('*').eq('user_id', userId).order('created_at', { ascending: false }).execute()
+ if (careTaskResponse.error == null && careTaskResponse.data != null) {
+ const rawTasks = careTaskResponse.data as Array
+ const taskResult = [] as Array
+ for (let i = 0; i < rawTasks.length; i++) {
+ const parsed = await getCareTaskDetail(readString(rawTasks[i], 'id'))
+ if (parsed != null) {
+ taskResult.push(parsed)
+ }
+ }
+ return taskResult
+ }
+ const response = await supa.from('hss_service_orders').select('*').eq('user_id', userId).order('created_at', { ascending: false }).execute()
+ if (response.error != null || response.data == null) {
+ return [] as Array
+ }
+ const list = response.data as any[]
+ const result = [] as Array
+ for (let i = 0; i < list.length; i++) {
+ const parsed = await getLegacyServiceOrderDetail(JSON.parse(JSON.stringify(list[i]))['id'] as string)
+ if (parsed != null) {
+ result.push(parsed)
+ }
+ }
+ return result
+ }
+
+export async function getServiceOrderDetail(orderId: string): Promise {
+ const careTask = await getCareTaskDetail(orderId)
+ if (careTask != null) {
+ return careTask
+ }
+ return await getLegacyServiceOrderDetail(orderId)
+ }
+
export async function confirmServiceOrder(orderId: string, rating: number, content: string, tags: Array): Promise {
const userId = getCurrentUserId()
if (userId == '') {
return null
}
+ const careTask = await getCareTaskDetail(orderId)
+ if (careTask != null) {
+ const acceptedAt = nowIso()
+ const updateResponse = await supa.from('ec_care_tasks').update({
+ status: 'ACCEPTED',
+ accepted_by_family_at: acceptedAt,
+ updated_at: acceptedAt
+ }).eq('id', orderId).execute()
+ if (updateResponse.error == null) {
+ await insertWorkOrderEvent(orderId, 'ACCEPTANCE_PENDING', 'ACCEPTED', userId, 'consumer', 'accept_task', '用户确认验收')
+ if (rating > 0 || content != '' || tags.length > 0) {
+ await supa.from('ec_care_records').insert({
+ id: buildId('care-review'),
+ task_id: orderId,
+ record_type: 'review',
+ created_by: userId,
+ rating,
+ tags_json: tags as any,
+ content,
+ created_at: acceptedAt,
+ updated_at: acceptedAt
+ }).execute()
+ await insertWorkOrderEvent(orderId, 'ACCEPTED', 'ACCEPTED', userId, 'consumer', 'submit_review', '用户提交评价')
+ }
+ return await getCareTaskDetail(orderId)
+ }
+ }
const current = await getServiceOrderDetail(orderId)
if (current == null) {
return null
@@ -480,7 +846,7 @@ export async function confirmServiceOrder(orderId: string, rating: number, conte
if (updateResponse.error != null) {
return null
}
- await insertStatusLog(orderId, current.status, 'accepted_by_user', userId, 'consumer', '用户确认验收')
+ await insertLegacyStatusLog(orderId, current.status, 'accepted_by_user', userId, 'consumer', '用户确认验收')
await supa.from('hss_service_reviews').insert({
id: buildId('srv'),
order_id: orderId,
@@ -495,8 +861,8 @@ export async function confirmServiceOrder(orderId: string, rating: number, conte
reviewed_at: acceptedAt,
updated_at: acceptedAt
}).eq('id', orderId).execute()
- await insertStatusLog(orderId, 'accepted_by_user', 'reviewed', userId, 'consumer', '用户提交评价')
- return await getServiceOrderDetail(orderId)
+ await insertLegacyStatusLog(orderId, 'accepted_by_user', 'reviewed', userId, 'consumer', '用户提交评价')
+ return await getLegacyServiceOrderDetail(orderId)
}
export async function rejectServiceOrderAcceptance(orderId: string, content: string): Promise {
@@ -504,6 +870,33 @@ export async function rejectServiceOrderAcceptance(orderId: string, content: str
if (userId == '') {
return null
}
+ const careTask = await getCareTaskDetail(orderId)
+ if (careTask != null) {
+ const rejectedAt = nowIso()
+ const updateResponse = await supa.from('ec_care_tasks').update({
+ status: 'ACCEPTANCE_REJECTED',
+ updated_at: rejectedAt
+ }).eq('id', orderId).execute()
+ if (updateResponse.error == null) {
+ await supa.from('hc_work_order_exceptions').insert({
+ id: buildId('hc-ex'),
+ task_id: orderId,
+ exception_type: 'acceptance_rejected',
+ description: content == '' ? '用户退回整改' : content,
+ occurred_at: rejectedAt,
+ location_text: '',
+ images_json: [] as Array,
+ need_platform_intervention: false,
+ request_cancel_order: false,
+ request_reschedule: false,
+ created_by: userId,
+ created_at: rejectedAt,
+ updated_at: rejectedAt
+ }).execute()
+ await insertWorkOrderEvent(orderId, 'ACCEPTANCE_PENDING', 'ACCEPTANCE_REJECTED', userId, 'consumer', 'reject_acceptance', content == '' ? '用户退回整改' : content)
+ return await getCareTaskDetail(orderId)
+ }
+ }
const current = await getServiceOrderDetail(orderId)
if (current == null) {
return null
@@ -515,10 +908,81 @@ export async function rejectServiceOrderAcceptance(orderId: string, content: str
if (updateResponse.error != null) {
return null
}
- await insertStatusLog(orderId, current.status, 'exception', userId, 'consumer', content == '' ? '用户退回整改' : content)
- return await getServiceOrderDetail(orderId)
+ await insertLegacyStatusLog(orderId, current.status, 'exception', userId, 'consumer', content == '' ? '用户退回整改' : content)
+ return await getLegacyServiceOrderDetail(orderId)
}
export async function getCurrentConsumerUser() {
return await getCurrentUser()
+ }
+
+export async function getOrdersByTab(tab: string): Promise> {
+ const orders = await listConsumerServiceOrders()
+ if (tab == 'pending') {
+ return orders.filter((order) => {
+ return order.status != 'ACCEPTED' && order.status != 'COMPLETED' && order.status != 'CANCELLED'
+ })
+ }
+ if (tab == 'history') {
+ return orders.filter((order) => {
+ return order.status == 'ACCEPTED' || order.status == 'COMPLETED' || order.status == 'CANCELLED'
+ })
+ }
+ return orders.filter((order) => {
+ return order.status != 'ACCEPTED' && order.status != 'COMPLETED' && order.status != 'CANCELLED'
+ })
+ }
+
+export async function getOrderDetail(orderId: string): Promise {
+ return await getServiceOrderDetail(orderId)
+ }
+
+export async function getDashboard(): Promise {
+ const orders = await listConsumerServiceOrders()
+ let pendingCount = 0
+ let todayCount = 0
+ let completedCount = 0
+ for (let i = 0; i < orders.length; i++) {
+ const order = orders[i]
+ if (order.status == 'ACCEPTED' || order.status == 'COMPLETED' || order.status == 'CANCELLED') {
+ completedCount += 1
+ } else {
+ pendingCount += 1
+ todayCount += 1
+ }
+ }
+ return {
+ pendingCount,
+ todayCount,
+ completedCount,
+ totalCount: orders.length
+ } as UTSJSONObject
+ }
+
+export async function acceptOrder(orderId: string): Promise {
+ return await getServiceOrderDetail(orderId)
+ }
+
+export async function departOrder(orderId: string, _location: any): Promise {
+ return await getServiceOrderDetail(orderId)
+ }
+
+export async function arriveOrder(orderId: string, _location: any): Promise {
+ return await getServiceOrderDetail(orderId)
+ }
+
+export async function checkinOrder(orderId: string, _payload: any): Promise {
+ return await getServiceOrderDetail(orderId)
+ }
+
+export async function startService(orderId: string): Promise {
+ return await getServiceOrderDetail(orderId)
+ }
+
+export async function finishOrder(orderId: string): Promise {
+ return await getServiceOrderDetail(orderId)
+ }
+
+export async function saveServiceRecord(orderId: string, _payload: any): Promise {
+ return await getServiceOrderDetail(orderId)
}
\ No newline at end of file
diff --git a/types/mall-types.uts b/types/mall-types.uts
index 266dca2c..730f1cc7 100644
--- a/types/mall-types.uts
+++ b/types/mall-types.uts
@@ -385,6 +385,11 @@ export type UserProfile = {
bio?: string;
avatar_url?: string;
preferred_language?: string;
+ health_goal?: string;
+ service_address?: string;
+ emergency_contact?: string;
+ chronic_notes?: string;
+ care_preference?: string;
role?: string;
school_id?: string;
grade_id?: string;
diff --git a/types/service-order.uts b/types/service-order.uts
index 9216589e..308769d0 100644
--- a/types/service-order.uts
+++ b/types/service-order.uts
@@ -168,6 +168,17 @@ export function getServiceOrderStatusText(status: ServiceOrderStatus): string {
}
export function normalizeServiceOrderStatus(status: string): ServiceOrderStatus {
+ if (status == 'ORDER_CREATED') return 'created'
+ if (status == 'ORDER_ASSIGNED') return 'assigned'
+ if (status == 'ORDER_ACCEPTED') return 'accepted'
+ if (status == 'ORDER_REJECTED') return 'rejected'
+ if (status == 'ORDER_CHECKED_IN') return 'arrived'
+ if (status == 'ORDER_IN_SERVICE') return 'in_service'
+ if (status == 'ORDER_COMPLETED' || status == 'ACCEPTANCE_PENDING') return 'pending_acceptance'
+ if (status == 'ACCEPTED') return 'accepted_by_user'
+ if (status == 'SETTLEMENT_READY' || status == 'ARCHIVED') return 'settled'
+ if (status == 'ORDER_CANCELLED') return 'cancelled'
+ if (status == 'ORDER_EXCEPTION' || status == 'ACCEPTANCE_REJECTED') return 'exception'
if (status == 'created' || status == 'submitted') return 'created'
if (status == 'paid') return 'paid'
if (status == 'assigned' || status == 'pending_dispatch' || status == 'pending_assignment') return 'assigned'
diff --git a/uni_modules/ak-req/ak-req.uts b/uni_modules/ak-req/ak-req.uts
index 8ad380ab..fe44e1a8 100644
--- a/uni_modules/ak-req/ak-req.uts
+++ b/uni_modules/ak-req/ak-req.uts
@@ -290,6 +290,22 @@ export class AkReq {
data ?? {},
res.header as UTSJSONObject
);
+ if (res.statusCode >= 400) {
+ let bodyPreview = ''
+ try {
+ if (typeof res.data == 'string') {
+ bodyPreview = (res.data as string).substring(0, 500)
+ } else {
+ bodyPreview = JSON.stringify(res.data).substring(0, 500)
+ }
+ } catch (e) {
+ bodyPreview = '[unserializable response body]'
+ }
+ console.error('[ak-req] HTTP error response')
+ console.error('[ak-req] status:', res.statusCode)
+ console.error('[ak-req] url:', options.url)
+ console.error('[ak-req] body:', bodyPreview)
+ }
resolve(result);
},
fail: (err) => {
diff --git a/utils/pagesMode.uts b/utils/pagesMode.uts
index ef2e3a8a..6bd5cc62 100644
--- a/utils/pagesMode.uts
+++ b/utils/pagesMode.uts
@@ -1 +1 @@
-export const CURRENT_PAGES_MODE = 'delivery'
+export const CURRENT_PAGES_MODE = 'consumer'
diff --git a/utils/profileRegionData.uts b/utils/profileRegionData.uts
new file mode 100644
index 00000000..6230d492
--- /dev/null
+++ b/utils/profileRegionData.uts
@@ -0,0 +1,606 @@
+export type RegionCity = {
+ name: string
+ districts: Array
+}
+
+export type RegionProvince = {
+ name: string
+ cities: Array
+}
+
+export const PROFILE_REGION_OPTIONS: Array = [
+ {
+ name: '北京市',
+ cities: [
+ { name: '北京市', districts: [] }
+ ]
+ },
+ {
+ name: '天津市',
+ cities: [
+ { name: '天津市', districts: [] }
+ ]
+ },
+ {
+ name: '河北省',
+ cities: [
+ { name: '石家庄市', districts: [] },
+ { name: '唐山市', districts: [] },
+ { name: '秦皇岛市', districts: [] },
+ { name: '邯郸市', districts: [] },
+ { name: '邢台市', districts: [] },
+ { name: '保定市', districts: [] },
+ { name: '张家口市', districts: [] },
+ { name: '承德市', districts: [] },
+ { name: '沧州市', districts: [] },
+ { name: '廊坊市', districts: [] },
+ { name: '衡水市', districts: [] }
+ ]
+ },
+ {
+ name: '山西省',
+ cities: [
+ { name: '太原市', districts: [] },
+ { name: '大同市', districts: [] },
+ { name: '阳泉市', districts: [] },
+ { name: '长治市', districts: [] },
+ { name: '晋城市', districts: [] },
+ { name: '朔州市', districts: [] },
+ { name: '晋中市', districts: [] },
+ { name: '运城市', districts: [] },
+ { name: '忻州市', districts: [] },
+ { name: '临汾市', districts: [] },
+ { name: '吕梁市', districts: [] }
+ ]
+ },
+ {
+ name: '内蒙古自治区',
+ cities: [
+ { name: '呼和浩特市', districts: [] },
+ { name: '包头市', districts: [] },
+ { name: '乌海市', districts: [] },
+ { name: '赤峰市', districts: [] },
+ { name: '通辽市', districts: [] },
+ { name: '鄂尔多斯市', districts: [] },
+ { name: '呼伦贝尔市', districts: [] },
+ { name: '巴彦淖尔市', districts: [] },
+ { name: '乌兰察布市', districts: [] },
+ { name: '兴安盟', districts: [] },
+ { name: '锡林郭勒盟', districts: [] },
+ { name: '阿拉善盟', districts: [] }
+ ]
+ },
+ {
+ name: '辽宁省',
+ cities: [
+ { name: '沈阳市', districts: [] },
+ { name: '大连市', districts: [] },
+ { name: '鞍山市', districts: [] },
+ { name: '抚顺市', districts: [] },
+ { name: '本溪市', districts: [] },
+ { name: '丹东市', districts: [] },
+ { name: '锦州市', districts: [] },
+ { name: '营口市', districts: [] },
+ { name: '阜新市', districts: [] },
+ { name: '辽阳市', districts: [] },
+ { name: '盘锦市', districts: [] },
+ { name: '铁岭市', districts: [] },
+ { name: '朝阳市', districts: [] },
+ { name: '葫芦岛市', districts: [] }
+ ]
+ },
+ {
+ name: '吉林省',
+ cities: [
+ { name: '长春市', districts: [] },
+ { name: '吉林市', districts: [] },
+ { name: '四平市', districts: [] },
+ { name: '辽源市', districts: [] },
+ { name: '通化市', districts: [] },
+ { name: '白山市', districts: [] },
+ { name: '松原市', districts: [] },
+ { name: '白城市', districts: [] },
+ { name: '延边朝鲜族自治州', districts: [] }
+ ]
+ },
+ {
+ name: '黑龙江省',
+ cities: [
+ { name: '哈尔滨市', districts: [] },
+ { name: '齐齐哈尔市', districts: [] },
+ { name: '鸡西市', districts: [] },
+ { name: '鹤岗市', districts: [] },
+ { name: '双鸭山市', districts: [] },
+ { name: '大庆市', districts: [] },
+ { name: '伊春市', districts: [] },
+ { name: '佳木斯市', districts: [] },
+ { name: '七台河市', districts: [] },
+ { name: '牡丹江市', districts: [] },
+ { name: '黑河市', districts: [] },
+ { name: '绥化市', districts: [] },
+ { name: '大兴安岭地区', districts: [] }
+ ]
+ },
+ {
+ name: '上海市',
+ cities: [
+ { name: '上海市', districts: [] }
+ ]
+ },
+ {
+ name: '江苏省',
+ cities: [
+ { name: '南京市', districts: [] },
+ { name: '无锡市', districts: [] },
+ { name: '徐州市', districts: [] },
+ { name: '常州市', districts: [] },
+ { name: '苏州市', districts: [] },
+ { name: '南通市', districts: [] },
+ { name: '连云港市', districts: [] },
+ { name: '淮安市', districts: [] },
+ { name: '盐城市', districts: [] },
+ { name: '扬州市', districts: [] },
+ { name: '镇江市', districts: [] },
+ { name: '泰州市', districts: [] },
+ { name: '宿迁市', districts: [] }
+ ]
+ },
+ {
+ name: '浙江省',
+ cities: [
+ { name: '杭州市', districts: [] },
+ { name: '宁波市', districts: [] },
+ { name: '温州市', districts: [] },
+ { name: '嘉兴市', districts: [] },
+ { name: '湖州市', districts: [] },
+ { name: '绍兴市', districts: [] },
+ { name: '金华市', districts: [] },
+ { name: '衢州市', districts: [] },
+ { name: '舟山市', districts: [] },
+ { name: '台州市', districts: [] },
+ { name: '丽水市', districts: [] }
+ ]
+ },
+ {
+ name: '安徽省',
+ cities: [
+ { name: '合肥市', districts: [] },
+ { name: '芜湖市', districts: [] },
+ { name: '蚌埠市', districts: [] },
+ { name: '淮南市', districts: [] },
+ { name: '马鞍山市', districts: [] },
+ { name: '淮北市', districts: [] },
+ { name: '铜陵市', districts: [] },
+ { name: '安庆市', districts: [] },
+ { name: '黄山市', districts: [] },
+ { name: '滁州市', districts: [] },
+ { name: '阜阳市', districts: [] },
+ { name: '宿州市', districts: [] },
+ { name: '六安市', districts: [] },
+ { name: '亳州市', districts: [] },
+ { name: '池州市', districts: [] },
+ { name: '宣城市', districts: [] }
+ ]
+ },
+ {
+ name: '福建省',
+ cities: [
+ { name: '福州市', districts: [] },
+ { name: '厦门市', districts: [] },
+ { name: '莆田市', districts: [] },
+ { name: '三明市', districts: [] },
+ { name: '泉州市', districts: [] },
+ { name: '漳州市', districts: [] },
+ { name: '南平市', districts: [] },
+ { name: '龙岩市', districts: [] },
+ { name: '宁德市', districts: [] }
+ ]
+ },
+ {
+ name: '江西省',
+ cities: [
+ { name: '南昌市', districts: [] },
+ { name: '景德镇市', districts: [] },
+ { name: '萍乡市', districts: [] },
+ { name: '九江市', districts: [] },
+ { name: '新余市', districts: [] },
+ { name: '鹰潭市', districts: [] },
+ { name: '赣州市', districts: [] },
+ { name: '吉安市', districts: [] },
+ { name: '宜春市', districts: [] },
+ { name: '抚州市', districts: [] },
+ { name: '上饶市', districts: [] }
+ ]
+ },
+ {
+ name: '山东省',
+ cities: [
+ { name: '济南市', districts: [] },
+ { name: '青岛市', districts: [] },
+ { name: '淄博市', districts: [] },
+ { name: '枣庄市', districts: [] },
+ { name: '东营市', districts: [] },
+ { name: '烟台市', districts: [] },
+ { name: '潍坊市', districts: [] },
+ { name: '济宁市', districts: [] },
+ { name: '泰安市', districts: [] },
+ { name: '威海市', districts: [] },
+ { name: '日照市', districts: [] },
+ { name: '临沂市', districts: [] },
+ { name: '德州市', districts: [] },
+ { name: '聊城市', districts: [] },
+ { name: '滨州市', districts: [] },
+ { name: '菏泽市', districts: [] }
+ ]
+ },
+ {
+ name: '河南省',
+ cities: [
+ { name: '郑州市', districts: [] },
+ { name: '开封市', districts: [] },
+ { name: '洛阳市', districts: [] },
+ { name: '平顶山市', districts: [] },
+ { name: '安阳市', districts: [] },
+ { name: '鹤壁市', districts: [] },
+ { name: '新乡市', districts: [] },
+ { name: '焦作市', districts: [] },
+ { name: '濮阳市', districts: [] },
+ { name: '许昌市', districts: [] },
+ { name: '漯河市', districts: [] },
+ { name: '三门峡市', districts: [] },
+ { name: '南阳市', districts: [] },
+ { name: '商丘市', districts: [] },
+ { name: '信阳市', districts: [] },
+ { name: '周口市', districts: [] },
+ { name: '驻马店市', districts: [] },
+ { name: '济源市', districts: [] }
+ ]
+ },
+ {
+ name: '湖北省',
+ cities: [
+ { name: '武汉市', districts: [] },
+ { name: '黄石市', districts: [] },
+ { name: '十堰市', districts: [] },
+ { name: '宜昌市', districts: [] },
+ { name: '襄阳市', districts: [] },
+ { name: '鄂州市', districts: [] },
+ { name: '荆门市', districts: [] },
+ { name: '孝感市', districts: [] },
+ { name: '荆州市', districts: [] },
+ { name: '黄冈市', districts: [] },
+ { name: '咸宁市', districts: [] },
+ { name: '随州市', districts: [] },
+ { name: '恩施土家族苗族自治州', districts: [] },
+ { name: '仙桃市', districts: [] },
+ { name: '潜江市', districts: [] },
+ { name: '天门市', districts: [] },
+ { name: '神农架林区', districts: [] }
+ ]
+ },
+ {
+ name: '湖南省',
+ cities: [
+ { name: '长沙市', districts: [] },
+ { name: '株洲市', districts: [] },
+ { name: '湘潭市', districts: [] },
+ { name: '衡阳市', districts: [] },
+ { name: '邵阳市', districts: [] },
+ { name: '岳阳市', districts: [] },
+ { name: '常德市', districts: [] },
+ { name: '张家界市', districts: [] },
+ { name: '益阳市', districts: [] },
+ { name: '郴州市', districts: [] },
+ { name: '永州市', districts: [] },
+ { name: '怀化市', districts: [] },
+ { name: '娄底市', districts: [] },
+ { name: '湘西土家族苗族自治州', districts: [] }
+ ]
+ },
+ {
+ name: '广东省',
+ cities: [
+ { name: '广州市', districts: [] },
+ { name: '韶关市', districts: [] },
+ { name: '深圳市', districts: [] },
+ { name: '珠海市', districts: [] },
+ { name: '汕头市', districts: [] },
+ { name: '佛山市', districts: [] },
+ { name: '江门市', districts: [] },
+ { name: '湛江市', districts: [] },
+ { name: '茂名市', districts: [] },
+ { name: '肇庆市', districts: [] },
+ { name: '惠州市', districts: [] },
+ { name: '梅州市', districts: [] },
+ { name: '汕尾市', districts: [] },
+ { name: '河源市', districts: [] },
+ { name: '阳江市', districts: [] },
+ { name: '清远市', districts: [] },
+ { name: '东莞市', districts: [] },
+ { name: '中山市', districts: [] },
+ { name: '潮州市', districts: [] },
+ { name: '揭阳市', districts: [] },
+ { name: '云浮市', districts: [] }
+ ]
+ },
+ {
+ name: '广西壮族自治区',
+ cities: [
+ { name: '南宁市', districts: [] },
+ { name: '柳州市', districts: [] },
+ { name: '桂林市', districts: [] },
+ { name: '梧州市', districts: [] },
+ { name: '北海市', districts: [] },
+ { name: '防城港市', districts: [] },
+ { name: '钦州市', districts: [] },
+ { name: '贵港市', districts: [] },
+ { name: '玉林市', districts: [] },
+ { name: '百色市', districts: [] },
+ { name: '贺州市', districts: [] },
+ { name: '河池市', districts: [] },
+ { name: '来宾市', districts: [] },
+ { name: '崇左市', districts: [] }
+ ]
+ },
+ {
+ name: '海南省',
+ cities: [
+ { name: '海口市', districts: [] },
+ { name: '三亚市', districts: [] },
+ { name: '三沙市', districts: [] },
+ { name: '儋州市', districts: [] },
+ { name: '五指山市', districts: [] },
+ { name: '琼海市', districts: [] },
+ { name: '文昌市', districts: [] },
+ { name: '万宁市', districts: [] },
+ { name: '东方市', districts: [] },
+ { name: '定安县', districts: [] },
+ { name: '屯昌县', districts: [] },
+ { name: '澄迈县', districts: [] },
+ { name: '临高县', districts: [] },
+ { name: '白沙黎族自治县', districts: [] },
+ { name: '昌江黎族自治县', districts: [] },
+ { name: '乐东黎族自治县', districts: [] },
+ { name: '陵水黎族自治县', districts: [] },
+ { name: '保亭黎族苗族自治县', districts: [] },
+ { name: '琼中黎族苗族自治县', districts: [] }
+ ]
+ },
+ {
+ name: '重庆市',
+ cities: [
+ { name: '重庆市', districts: [] }
+ ]
+ },
+ {
+ name: '四川省',
+ cities: [
+ { name: '成都市', districts: [] },
+ { name: '自贡市', districts: [] },
+ { name: '攀枝花市', districts: [] },
+ { name: '泸州市', districts: [] },
+ { name: '德阳市', districts: [] },
+ { name: '绵阳市', districts: [] },
+ { name: '广元市', districts: [] },
+ { name: '遂宁市', districts: [] },
+ { name: '内江市', districts: [] },
+ { name: '乐山市', districts: [] },
+ { name: '南充市', districts: [] },
+ { name: '眉山市', districts: [] },
+ { name: '宜宾市', districts: [] },
+ { name: '广安市', districts: [] },
+ { name: '达州市', districts: [] },
+ { name: '雅安市', districts: [] },
+ { name: '巴中市', districts: [] },
+ { name: '资阳市', districts: [] },
+ { name: '阿坝藏族羌族自治州', districts: [] },
+ { name: '甘孜藏族自治州', districts: [] },
+ { name: '凉山彝族自治州', districts: [] }
+ ]
+ },
+ {
+ name: '贵州省',
+ cities: [
+ { name: '贵阳市', districts: [] },
+ { name: '六盘水市', districts: [] },
+ { name: '遵义市', districts: [] },
+ { name: '安顺市', districts: [] },
+ { name: '毕节市', districts: [] },
+ { name: '铜仁市', districts: [] },
+ { name: '黔西南布依族苗族自治州', districts: [] },
+ { name: '黔东南苗族侗族自治州', districts: [] },
+ { name: '黔南布依族苗族自治州', districts: [] }
+ ]
+ },
+ {
+ name: '云南省',
+ cities: [
+ { name: '昆明市', districts: [] },
+ { name: '曲靖市', districts: [] },
+ { name: '玉溪市', districts: [] },
+ { name: '保山市', districts: [] },
+ { name: '昭通市', districts: [] },
+ { name: '丽江市', districts: [] },
+ { name: '普洱市', districts: [] },
+ { name: '临沧市', districts: [] },
+ { name: '楚雄彝族自治州', districts: [] },
+ { name: '红河哈尼族彝族自治州', districts: [] },
+ { name: '文山壮族苗族自治州', districts: [] },
+ { name: '西双版纳傣族自治州', districts: [] },
+ { name: '大理白族自治州', districts: [] },
+ { name: '德宏傣族景颇族自治州', districts: [] },
+ { name: '怒江傈僳族自治州', districts: [] },
+ { name: '迪庆藏族自治州', districts: [] }
+ ]
+ },
+ {
+ name: '西藏自治区',
+ cities: [
+ { name: '拉萨市', districts: [] },
+ { name: '日喀则市', districts: [] },
+ { name: '昌都市', districts: [] },
+ { name: '林芝市', districts: [] },
+ { name: '山南市', districts: [] },
+ { name: '那曲市', districts: [] },
+ { name: '阿里地区', districts: [] }
+ ]
+ },
+ {
+ name: '陕西省',
+ cities: [
+ { name: '西安市', districts: [] },
+ { name: '铜川市', districts: [] },
+ { name: '宝鸡市', districts: [] },
+ { name: '咸阳市', districts: [] },
+ { name: '渭南市', districts: [] },
+ { name: '延安市', districts: [] },
+ { name: '汉中市', districts: [] },
+ { name: '榆林市', districts: [] },
+ { name: '安康市', districts: [] },
+ { name: '商洛市', districts: [] }
+ ]
+ },
+ {
+ name: '甘肃省',
+ cities: [
+ { name: '兰州市', districts: [] },
+ { name: '嘉峪关市', districts: [] },
+ { name: '金昌市', districts: [] },
+ { name: '白银市', districts: [] },
+ { name: '天水市', districts: [] },
+ { name: '武威市', districts: [] },
+ { name: '张掖市', districts: [] },
+ { name: '平凉市', districts: [] },
+ { name: '酒泉市', districts: [] },
+ { name: '庆阳市', districts: [] },
+ { name: '定西市', districts: [] },
+ { name: '陇南市', districts: [] },
+ { name: '临夏回族自治州', districts: [] },
+ { name: '甘南藏族自治州', districts: [] }
+ ]
+ },
+ {
+ name: '青海省',
+ cities: [
+ { name: '西宁市', districts: [] },
+ { name: '海东市', districts: [] },
+ { name: '海北藏族自治州', districts: [] },
+ { name: '黄南藏族自治州', districts: [] },
+ { name: '海南藏族自治州', districts: [] },
+ { name: '果洛藏族自治州', districts: [] },
+ { name: '玉树藏族自治州', districts: [] },
+ { name: '海西蒙古族藏族自治州', districts: [] }
+ ]
+ },
+ {
+ name: '宁夏回族自治区',
+ cities: [
+ { name: '银川市', districts: [] },
+ { name: '石嘴山市', districts: [] },
+ { name: '吴忠市', districts: [] },
+ { name: '固原市', districts: [] },
+ { name: '中卫市', districts: [] }
+ ]
+ },
+ {
+ name: '新疆维吾尔自治区',
+ cities: [
+ { name: '乌鲁木齐市', districts: [] },
+ { name: '克拉玛依市', districts: [] },
+ { name: '吐鲁番市', districts: [] },
+ { name: '哈密市', districts: [] },
+ { name: '昌吉回族自治州', districts: [] },
+ { name: '博尔塔拉蒙古自治州', districts: [] },
+ { name: '巴音郭楞蒙古自治州', districts: [] },
+ { name: '阿克苏地区', districts: [] },
+ { name: '克孜勒苏柯尔克孜自治州', districts: [] },
+ { name: '喀什地区', districts: [] },
+ { name: '和田地区', districts: [] },
+ { name: '伊犁哈萨克自治州', districts: [] },
+ { name: '塔城地区', districts: [] },
+ { name: '阿勒泰地区', districts: [] },
+ { name: '石河子市', districts: [] },
+ { name: '阿拉尔市', districts: [] },
+ { name: '图木舒克市', districts: [] },
+ { name: '五家渠市', districts: [] },
+ { name: '北屯市', districts: [] },
+ { name: '铁门关市', districts: [] },
+ { name: '双河市', districts: [] },
+ { name: '可克达拉市', districts: [] },
+ { name: '昆玉市', districts: [] },
+ { name: '胡杨河市', districts: [] },
+ { name: '新星市', districts: [] }
+ ]
+ },
+ {
+ name: '台湾省',
+ cities: [
+ { name: '台北市', districts: [] },
+ { name: '高雄市', districts: [] },
+ { name: '新北市', districts: [] },
+ { name: '台中市', districts: [] },
+ { name: '台南市', districts: [] },
+ { name: '桃园市', districts: [] },
+ { name: '基隆市', districts: [] },
+ { name: '新竹市', districts: [] },
+ { name: '嘉义市', districts: [] },
+ { name: '新竹县', districts: [] },
+ { name: '苗栗县', districts: [] },
+ { name: '彰化县', districts: [] },
+ { name: '南投县', districts: [] },
+ { name: '云林县', districts: [] },
+ { name: '嘉义县', districts: [] },
+ { name: '屏东县', districts: [] },
+ { name: '宜兰县', districts: [] },
+ { name: '花莲县', districts: [] },
+ { name: '台东县', districts: [] },
+ { name: '澎湖县', districts: [] },
+ { name: '金门县', districts: [] },
+ { name: '连江县', districts: [] }
+ ]
+ },
+ {
+ name: '香港特别行政区',
+ cities: [
+ { name: '中西区', districts: [] },
+ { name: '湾仔区', districts: [] },
+ { name: '东区', districts: [] },
+ { name: '南区', districts: [] },
+ { name: '油尖旺区', districts: [] },
+ { name: '深水埗区', districts: [] },
+ { name: '九龙城区', districts: [] },
+ { name: '黄大仙区', districts: [] },
+ { name: '观塘区', districts: [] },
+ { name: '荃湾区', districts: [] },
+ { name: '屯门区', districts: [] },
+ { name: '元朗区', districts: [] },
+ { name: '北区', districts: [] },
+ { name: '大埔区', districts: [] },
+ { name: '西贡区', districts: [] },
+ { name: '沙田区', districts: [] },
+ { name: '葵青区', districts: [] },
+ { name: '离岛区', districts: [] }
+ ]
+ },
+ {
+ name: '澳门特别行政区',
+ cities: [
+ { name: '花地玛堂区', districts: [] },
+ { name: '圣安多尼堂区', districts: [] },
+ { name: '大堂区', districts: [] },
+ { name: '望德堂区', districts: [] },
+ { name: '风顺堂区', districts: [] },
+ { name: '嘉模堂区', districts: [] },
+ { name: '圣方济各堂区', districts: [] },
+ { name: '路氹填海区', districts: [] }
+ ]
+ }
+]
+
+export const PROFILE_COMMON_ADDRESS_SUGGESTIONS: Array = [
+ '广东省梅州市 学海路康养公寓 A 座 907 室',
+ '广东省广州市 天河路康复护理中心 3 层',
+ '北京市 望京康养服务站 2 号楼 301 室',
+ '上海市 花木社区照护点 6 号',
+ '浙江省杭州市 文二路护理服务中心 3 层'
+]
diff --git a/utils/supabaseService.uts b/utils/supabaseService.uts
index f0527a38..6e46a77e 100644
--- a/utils/supabaseService.uts
+++ b/utils/supabaseService.uts
@@ -4656,6 +4656,17 @@ class SupabaseService {
}
private normalizeServiceStatus(status: string): string {
+ if (status == 'ORDER_CREATED') return 'created'
+ if (status == 'ORDER_ASSIGNED') return 'assigned'
+ if (status == 'ORDER_ACCEPTED') return 'accepted'
+ if (status == 'ORDER_REJECTED') return 'rejected'
+ if (status == 'ORDER_CHECKED_IN') return 'arrived'
+ if (status == 'ORDER_IN_SERVICE') return 'in_service'
+ if (status == 'ORDER_COMPLETED' || status == 'ACCEPTANCE_PENDING') return 'pending_acceptance'
+ if (status == 'ACCEPTED') return 'accepted_by_user'
+ if (status == 'SETTLEMENT_READY' || status == 'ARCHIVED') return 'settled'
+ if (status == 'ORDER_CANCELLED') return 'cancelled'
+ if (status == 'ORDER_EXCEPTION' || status == 'ACCEPTANCE_REJECTED') return 'exception'
if (status == 'created' || status == 'submitted') return 'created'
if (status == 'paid') return 'paid'
if (status == 'assigned' || status == 'pending_dispatch' || status == 'pending_assignment') return 'assigned'
diff --git a/utils/utils.uts b/utils/utils.uts
index c4f7182f..6ddb265c 100644
--- a/utils/utils.uts
+++ b/utils/utils.uts
@@ -149,28 +149,15 @@ export function responsiveState() {
}
}
-export function goToLogin(redirectUrl?: string | null) {
- try {
- const target = redirectUrl != null && redirectUrl.length > 0 ? redirectUrl : ''
- uni.showModal({
- title: '提示',
- content: '当前操作需要登录,是否前往登录页继续?',
- confirmText: '去登录',
- cancelText: '先逛逛',
- success: (res) => {
- if (res.confirm) {
- if (target.length > 0) {
- const redirect = encodeURIComponent(target)
- uni.navigateTo({ url: `/pages/user/login?redirect=${redirect}` })
- } else {
- uni.navigateTo({ url: '/pages/user/login' })
- }
- }
- }
- })
- } catch (e) {
- uni.navigateTo({ url: '/pages/user/login' })
+export function goToLogin(redirectUrl: string = ''): void {
+ let url = '/pages/user/login'
+ if (redirectUrl != null && redirectUrl !== '') {
+ url = url + '?redirect=' + encodeURIComponent(redirectUrl)
}
+
+ uni.navigateTo({
+ url
+ })
}
/**
diff --git a/报错信息.txt b/报错信息.txt
index 907bce32..1863bc41 100644
--- a/报错信息.txt
+++ b/报错信息.txt
@@ -1,11 +1,14 @@
-<<<<<<< HEAD
-uni.api.esm.js:1042 POST http://192.168.1.62:18000/auth/v1/token?grant_type=password 401 (Unauthorized)(env: Windows,mp,1.06.2504030; lib: 3.15.2)
+mp.esm.js:529 saveProfile context: {"profileRowId":"b653fded-7d5e-4950-aa0d-725595543e3c","profileId":"b653fded-7d5e-4950-aa0d-725595543e3c","birthday":null,"hasHealthGoal":false,"hasServiceAddress":true}
+mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ak_users filter: id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
+mp.esm.js:529 [ak-req] PATCH http://119.146.131.237:9126/rest/v1/ak_users?id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
+mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...Tozk | auth-mode: pre-set | prefer: return=representation
+uni.api.esm.js:1042 PATCH http://119.146.131.237:9126/rest/v1/ak_users?id=eq.b653fded-7d5e-4950-aa0d-725595543e3c 400 (Bad Request)(env: Windows,mp,1.06.2504030; lib: 3.16.0)
(anonymous) @ uni.api.esm.js:1042
invokeApi @ uni.api.esm.js:330
promiseApi @ uni.api.esm.js:889
(anonymous) @ ak-req.uts:214
doOnce @ ak-req.uts:213
-_loop$ @ ak-req.uts:312
+_loop$ @ ak-req.uts:328
s @ regeneratorRuntime.js?forceSync=true:1
(anonymous) @ regeneratorRuntime.js?forceSync=true:1
(anonymous) @ regeneratorRuntime.js?forceSync=true:1
@@ -13,831 +16,144 @@ s @ regeneratorRuntime.js?forceSync=true:1
_ @ regeneratorRuntime.js?forceSync=true:1
(anonymous) @ regeneratorRuntime.js?forceSync=true:1
(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-=======
-mp.esm.js:529 [getOrderDetail] 开始获取订单详情,orderId: so-1779679148063-14086
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_orders filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_no=eq.so-1779679148063-14086
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/ml_orders?select=*%2C%20ml_order_items(*)&limit=1&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_no=eq.so-1779679148063-14086
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: count=exact
-mp.esm.js:529 [getOrderDetail] response.error: null
-mp.esm.js:529 [getOrderDetail] response.data: []
-mp.esm.js:529 [getOrderDetail] 未找到订单
-mp.esm.js:529 [confirmPayment] 开始支付, orderId: so-1779679148063-14086 method: wechat
-mp.esm.js:529 [getOrderDetail] 开始获取订单详情,orderId: so-1779679148063-14086
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_orders filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_no=eq.so-1779679148063-14086
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/ml_orders?select=*%2C%20ml_order_items(*)&limit=1&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_no=eq.so-1779679148063-14086
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: count=exact
-mp.esm.js:529 [getOrderDetail] response.error: null
-mp.esm.js:529 [getOrderDetail] response.data: []
-mp.esm.js:529 [getOrderDetail] 未找到订单
-mp.esm.js:529 [payOrder] 订单不存在,无法支付(env: Windows,mp,1.06.2504030; lib: 3.15.2)
-(anonymous) @ mp.esm.js:529
-__f__ @ uni.api.esm.js:590
-_callee73$ @ supabaseService.uts:5491
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
fulfilled @ uni.mp.esm.js:1134
Promise.then (async)
step @ uni.mp.esm.js:1134
(anonymous) @ uni.mp.esm.js:1134
__awaiter @ uni.mp.esm.js:1134
-<<<<<<< HEAD
request @ ak-req.uts:148
-_callee9$ @ aksupa.uts:887
+_callee19$ @ aksupa.uts:1290
s @ regeneratorRuntime.js?forceSync=true:1
(anonymous) @ regeneratorRuntime.js?forceSync=true:1
(anonymous) @ regeneratorRuntime.js?forceSync=true:1
(anonymous) @ uni.mp.esm.js:1134
__awaiter @ uni.mp.esm.js:1134
-signIn @ aksupa.uts:876
-_callee3$ @ delivery.uts:1506
+requestWithAutoRefresh @ aksupa.uts:1289
+_callee14$ @ aksupa.uts:1143
s @ regeneratorRuntime.js?forceSync=true:1
(anonymous) @ regeneratorRuntime.js?forceSync=true:1
(anonymous) @ regeneratorRuntime.js?forceSync=true:1
(anonymous) @ uni.mp.esm.js:1134
__awaiter @ uni.mp.esm.js:1134
-loginDelivery @ delivery.uts:1500
-_callee$ @ deliveryService.uts:42
+update @ aksupa.uts:1119
+_callee$ @ aksupa.uts:477
s @ regeneratorRuntime.js?forceSync=true:1
(anonymous) @ regeneratorRuntime.js?forceSync=true:1
(anonymous) @ regeneratorRuntime.js?forceSync=true:1
(anonymous) @ uni.mp.esm.js:1134
__awaiter @ uni.mp.esm.js:1134
-loginDelivery @ deliveryService.uts:41
-_callee5$ @ login.uvue:495
+execute @ aksupa.uts:369
+_callee2$ @ profile.uvue:1057
s @ regeneratorRuntime.js?forceSync=true:1
(anonymous) @ regeneratorRuntime.js?forceSync=true:1
(anonymous) @ regeneratorRuntime.js?forceSync=true:1
(anonymous) @ uni.mp.esm.js:1134
__awaiter @ uni.mp.esm.js:1134
-handleLogin @ login.uvue:477
-=======
-payOrder @ supabaseService.uts:5481
-_callee6$ @ payment.uvue:1291
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-confirmPayment @ payment.uvue:1232
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
+saveProfile @ profile.uvue:1015
callWithErrorHandling @ vue.runtime.esm.js:1356
callWithAsyncErrorHandling @ vue.runtime.esm.js:1363
invoke @ vue.runtime.esm.js:6223
setTimeout (async)
invoker @ vue.runtime.esm.js:6232
-<<<<<<< HEAD
Show 19 more frames
-mp.esm.js:529 [ak-req] ★ 401 Unauthorized(env: Windows,mp,1.06.2504030; lib: 3.15.2)
+mp.esm.js:529 [ak-req] HTTP error response(env: Windows,mp,1.06.2504030; lib: 3.16.0)
(anonymous) @ mp.esm.js:529
__f__ @ uni.api.esm.js:590
-_callee2$ @ ak-req.uts:336
-=======
-mp.esm.js:529 [confirmPayment] 支付结果: false
-mp.esm.js:529 [confirmPayment] payOrder 返回 false(env: Windows,mp,1.06.2504030; lib: 3.15.2)
-(anonymous) @ mp.esm.js:529
-__f__ @ uni.api.esm.js:590
-_callee6$ @ payment.uvue:1295
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-<<<<<<< HEAD
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-request @ ak-req.uts:148
-_callee9$ @ aksupa.uts:887
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-signIn @ aksupa.uts:876
-_callee3$ @ delivery.uts:1506
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-loginDelivery @ delivery.uts:1500
-_callee$ @ deliveryService.uts:42
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-loginDelivery @ deliveryService.uts:41
-_callee5$ @ login.uvue:495
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-handleLogin @ login.uvue:477
-=======
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-confirmPayment @ payment.uvue:1232
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-callWithErrorHandling @ vue.runtime.esm.js:1356
-callWithAsyncErrorHandling @ vue.runtime.esm.js:1363
-invoke @ vue.runtime.esm.js:6223
-setTimeout (async)
-invoker @ vue.runtime.esm.js:6232
-<<<<<<< HEAD
-Show 14 more frames
-mp.esm.js:529 [ak-req] url: http://192.168.1.62:18000/auth/v1/token?grant_type=password(env: Windows,mp,1.06.2504030; lib: 3.15.2)
-(anonymous) @ mp.esm.js:529
-__f__ @ uni.api.esm.js:590
-_callee2$ @ ak-req.uts:337
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-=======
-mp.esm.js:529 [getOrderDetail] 开始获取订单详情,orderId: so-1779679148063-14086
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_orders filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_no=eq.so-1779679148063-14086
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/ml_orders?select=*%2C%20ml_order_items(*)&limit=1&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_no=eq.so-1779679148063-14086
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: count=exact
-mp.esm.js:529 [getOrderDetail] response.error: null
-mp.esm.js:529 [getOrderDetail] response.data: []
-mp.esm.js:529 [getOrderDetail] 未找到订单
-mp.esm.js:529 [getOrderDetail] 开始获取订单详情,orderId: so-1779679148063-14086
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_orders filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_no=eq.so-1779679148063-14086
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/ml_orders?select=*%2C%20ml_order_items(*)&limit=1&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_no=eq.so-1779679148063-14086
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: count=exact
-mp.esm.js:529 [getOrderDetail] response.error: null
-mp.esm.js:529 [getOrderDetail] response.data: []
-mp.esm.js:529 [getOrderDetail] 未找到订单
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_orders filter: id=eq.so-1779679148063-14086&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
-mp.esm.js:529 [ak-req] PATCH http://119.146.131.237:9126/rest/v1/ml_orders?id=eq.so-1779679148063-14086&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: return=representation
-uni.api.esm.js:1042 PATCH http://119.146.131.237:9126/rest/v1/ml_orders?id=eq.so-1779679148063-14086&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c 400 (Bad Request)(env: Windows,mp,1.06.2504030; lib: 3.15.2)
-(anonymous) @ uni.api.esm.js:1042
-invokeApi @ uni.api.esm.js:330
-promiseApi @ uni.api.esm.js:889
-(anonymous) @ ak-req.uts:214
-doOnce @ ak-req.uts:213
-_loop$ @ ak-req.uts:312
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-s @ regeneratorRuntime.js?forceSync=true:1
-_ @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-request @ ak-req.uts:148
-<<<<<<< HEAD
-_callee9$ @ aksupa.uts:887
-=======
-_callee19$ @ aksupa.uts:1288
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-<<<<<<< HEAD
-signIn @ aksupa.uts:876
-_callee3$ @ delivery.uts:1506
-=======
-requestWithAutoRefresh @ aksupa.uts:1287
-_callee14$ @ aksupa.uts:1141
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-<<<<<<< HEAD
-loginDelivery @ delivery.uts:1500
-_callee$ @ deliveryService.uts:42
-=======
-update @ aksupa.uts:1117
-_callee$ @ aksupa.uts:477
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-<<<<<<< HEAD
-loginDelivery @ deliveryService.uts:41
-_callee5$ @ login.uvue:495
-=======
-execute @ aksupa.uts:369
-_callee61$ @ supabaseService.uts:4508
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-<<<<<<< HEAD
-handleLogin @ login.uvue:477
-callWithErrorHandling @ vue.runtime.esm.js:1356
-callWithAsyncErrorHandling @ vue.runtime.esm.js:1363
-invoke @ vue.runtime.esm.js:6223
-setTimeout (async)
-invoker @ vue.runtime.esm.js:6232
-Show 14 more frames
-mp.esm.js:529 [ak-req] auth-mode: apikey-only(env: Windows,mp,1.06.2504030; lib: 3.15.2)
-(anonymous) @ mp.esm.js:529
-__f__ @ uni.api.esm.js:590
-_callee2$ @ ak-req.uts:338
-=======
-markOrderPaymentCancelled @ supabaseService.uts:4491
-_callee6$ @ payment.uvue:1271
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-<<<<<<< HEAD
-request @ ak-req.uts:148
-_callee9$ @ aksupa.uts:887
-=======
-confirmPayment @ payment.uvue:1232
-callWithErrorHandling @ vue.runtime.esm.js:1356
-callWithAsyncErrorHandling @ vue.runtime.esm.js:1363
-invoke @ vue.runtime.esm.js:6223
-setTimeout (async)
-invoker @ vue.runtime.esm.js:6232
-Show 21 more frames
-mp.esm.js:529 [markOrderPaymentCancelled] 保留待付款订单失败: UniError: 请求失败: 400
- at _construct (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/construct.js?forceSync=true:1:1227)
- at new r (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/wrapNativeSuper.js?forceSync=true:1:1357)
- at UniError2. (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/createSuper.js?forceSync=true:1:1176)
- at new UniError2 (weapp:///http://127.0.0.1:60394/appservice/common/vendor.js?t=wechat&s=1779670571338&v=2c3f4623fbd33b44aa0c0065a9eb296b:890:22)
- at Object.toUniError (weapp:///http://127.0.0.1:60394/appservice/utils/utils.js?t=wechat&s=1779670571338&v=44243ae0f2468b2c481e39a715a29204:77:18)
- at AkSupa._callee19$ (weapp:///http://127.0.0.1:60394/appservice/components/supadb/aksupa.js?t=wechat&s=1779670571338&v=f87225c7384edc68270412f64fbd4e8a:1959:41)
- at s (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/regeneratorRuntime.js?forceSync=true:1:1588)
- at Generator. (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/regeneratorRuntime.js?forceSync=true:1:2925)
- at Generator.next (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/regeneratorRuntime.js?forceSync=true:1:1951)
- at fulfilled (weapp:///http://127.0.0.1:60394/appservice/common/vendor.js?t=wechat&s=1779670571338&v=2c3f4623fbd33b44aa0c0065a9eb296b:10009:24)(env: Windows,mp,1.06.2504030; lib: 3.15.2)
-(anonymous) @ mp.esm.js:529
-__f__ @ uni.api.esm.js:590
-_callee61$ @ supabaseService.uts:4511
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-markOrderPaymentCancelled @ supabaseService.uts:4491
-_callee6$ @ payment.uvue:1271
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-confirmPayment @ payment.uvue:1232
-callWithErrorHandling @ vue.runtime.esm.js:1356
-callWithAsyncErrorHandling @ vue.runtime.esm.js:1363
-invoke @ vue.runtime.esm.js:6223
-setTimeout (async)
-invoker @ vue.runtime.esm.js:6232
-mp.esm.js:529 收到订单更新事件: UTSJSONObject {orderId: "so-1779679148063-14086", status: 1, paymentStatus: 1, cancelReason: "", payExpireAt: "", …}
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_user_profiles filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_orders filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_user_coupons filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&status=eq.1&expire_at=gt.2026-05-25T03%3A20%3A04.256Z
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_orders filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/ml_user_profiles?select=*&limit=1&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: count=exact
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/ml_orders?select=*%2C%20ml_order_items(*)%2C%20ml_shops(shop_name)&order=created_at.desc&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: (none)
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/ml_user_coupons?select=id&limit=1&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&status=eq.1&expire_at=gt.2026-05-25T03%3A20%3A04.256Z
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: count=exact
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/ml_orders?select=*&limit=1&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: count=exact
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_user_balance filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/ml_user_balance?select=*&limit=1&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: count=exact
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_orders filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_status=eq.1
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/ml_orders?select=*&limit=1&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_status=eq.1
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: count=exact
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_user_points filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/ml_user_points?select=points&limit=1&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: count=exact,return=representation,single-object
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_orders filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_status=eq.2
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/ml_orders?select=*&limit=1&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_status=eq.2
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: count=exact
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_orders filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_status=eq.3
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/ml_orders?select=*&limit=1&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_status=eq.3
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: count=exact
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_orders filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_status=eq.4
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/ml_orders?select=*&limit=1&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_status=eq.4
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: count=exact
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_orders filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_status=in.(6,7)
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/ml_orders?select=*&limit=1&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_status=in.(6,7)
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: count=exact
-mp.esm.js:529 [getOrders] response.error: null
-mp.esm.js:529 [getOrders] 订单数量: 104
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_orders filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_status=eq.5
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/ml_orders?select=*&limit=1&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_status=eq.5
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: count=exact
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: hss_service_orders filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/hss_service_orders?select=status&limit=500&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: count=exact
-mp.esm.js:529 [getOrderDetail] 开始获取订单详情,orderId: so-1779679148063-14086
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_orders filter: user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_no=eq.so-1779679148063-14086
-mp.esm.js:529 [ak-req] GET http://119.146.131.237:9126/rest/v1/ml_orders?select=*%2C%20ml_order_items(*)&limit=1&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c&consumer_deleted_at=is.null&order_no=eq.so-1779679148063-14086
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: count=exact
-mp.esm.js:529 [getOrderDetail] response.error: null
-mp.esm.js:529 [getOrderDetail] response.data: []
-mp.esm.js:529 [getOrderDetail] 未找到订单
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_orders filter: id=eq.so-1779679148063-14086&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
-mp.esm.js:529 [ak-req] PATCH http://119.146.131.237:9126/rest/v1/ml_orders?id=eq.so-1779679148063-14086&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: return=representation
-uni.api.esm.js:1042 PATCH http://119.146.131.237:9126/rest/v1/ml_orders?id=eq.so-1779679148063-14086&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c 400 (Bad Request)(env: Windows,mp,1.06.2504030; lib: 3.15.2)
-(anonymous) @ uni.api.esm.js:1042
-invokeApi @ uni.api.esm.js:330
-promiseApi @ uni.api.esm.js:889
-(anonymous) @ ak-req.uts:214
-doOnce @ ak-req.uts:213
-_loop$ @ ak-req.uts:312
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-s @ regeneratorRuntime.js?forceSync=true:1
-_ @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-request @ ak-req.uts:148
-_callee19$ @ aksupa.uts:1288
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-<<<<<<< HEAD
-signIn @ aksupa.uts:876
-_callee3$ @ delivery.uts:1506
-=======
-requestWithAutoRefresh @ aksupa.uts:1287
-_callee14$ @ aksupa.uts:1141
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-<<<<<<< HEAD
-loginDelivery @ delivery.uts:1500
-_callee$ @ deliveryService.uts:42
-=======
-update @ aksupa.uts:1117
-_callee$ @ aksupa.uts:477
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-<<<<<<< HEAD
-loginDelivery @ deliveryService.uts:41
-_callee5$ @ login.uvue:495
-=======
-execute @ aksupa.uts:369
-_callee52$ @ supabaseService.uts:4038
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-<<<<<<< HEAD
-handleLogin @ login.uvue:477
-=======
-cancelOrder @ supabaseService.uts:4018
-_callee5$ @ payment.uvue:1153
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-confirmCancelOrder @ payment.uvue:1141
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-callWithErrorHandling @ vue.runtime.esm.js:1356
-callWithAsyncErrorHandling @ vue.runtime.esm.js:1363
-invoke @ vue.runtime.esm.js:6223
-setTimeout (async)
-invoker @ vue.runtime.esm.js:6232
-<<<<<<< HEAD
-Show 14 more frames
-mp.esm.js:529 [ak-req] 发送 apikey: eyJhbG...7890(env: Windows,mp,1.06.2504030; lib: 3.15.2)
-(anonymous) @ mp.esm.js:529
-__f__ @ uni.api.esm.js:590
-_callee2$ @ ak-req.uts:339
-=======
-Show 26 more frames
-mp.esm.js:529 取消订单失败: UniError: 请求失败: 400
- at _construct (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/construct.js?forceSync=true:1:1227)
- at new r (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/wrapNativeSuper.js?forceSync=true:1:1357)
- at UniError2. (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/createSuper.js?forceSync=true:1:1176)
- at new UniError2 (weapp:///http://127.0.0.1:60394/appservice/common/vendor.js?t=wechat&s=1779670571338&v=2c3f4623fbd33b44aa0c0065a9eb296b:890:22)
- at Object.toUniError (weapp:///http://127.0.0.1:60394/appservice/utils/utils.js?t=wechat&s=1779670571338&v=44243ae0f2468b2c481e39a715a29204:77:18)
- at AkSupa._callee19$ (weapp:///http://127.0.0.1:60394/appservice/components/supadb/aksupa.js?t=wechat&s=1779670571338&v=f87225c7384edc68270412f64fbd4e8a:1959:41)
- at s (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/regeneratorRuntime.js?forceSync=true:1:1588)
- at Generator. (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/regeneratorRuntime.js?forceSync=true:1:2925)
- at Generator.next (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/regeneratorRuntime.js?forceSync=true:1:1951)
- at fulfilled (weapp:///http://127.0.0.1:60394/appservice/common/vendor.js?t=wechat&s=1779670571338&v=2c3f4623fbd33b44aa0c0065a9eb296b:10009:24)(env: Windows,mp,1.06.2504030; lib: 3.15.2)
-(anonymous) @ mp.esm.js:529
-__f__ @ uni.api.esm.js:590
-_callee52$ @ supabaseService.uts:4041
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-<<<<<<< HEAD
-=======
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-cancelOrder @ supabaseService.uts:4018
-_callee5$ @ payment.uvue:1153
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-confirmCancelOrder @ payment.uvue:1141
-callWithErrorHandling @ vue.runtime.esm.js:1356
-callWithAsyncErrorHandling @ vue.runtime.esm.js:1363
-invoke @ vue.runtime.esm.js:6223
-setTimeout (async)
-invoker @ vue.runtime.esm.js:6232
-[自动热重载] 已开启代码文件保存后自动热重载
-mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ml_orders filter: id=eq.so-1779679148063-14086&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
-mp.esm.js:529 [ak-req] PATCH http://119.146.131.237:9126/rest/v1/ml_orders?id=eq.so-1779679148063-14086&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
-mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...YFxs | auth-mode: pre-set | prefer: return=representation
-uni.api.esm.js:1042 PATCH http://119.146.131.237:9126/rest/v1/ml_orders?id=eq.so-1779679148063-14086&user_id=eq.b653fded-7d5e-4950-aa0d-725595543e3c 400 (Bad Request)(env: Windows,mp,1.06.2504030; lib: 3.15.2)
-(anonymous) @ uni.api.esm.js:1042
-invokeApi @ uni.api.esm.js:330
-promiseApi @ uni.api.esm.js:889
-(anonymous) @ ak-req.uts:214
-doOnce @ ak-req.uts:213
-_loop$ @ ak-req.uts:312
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-s @ regeneratorRuntime.js?forceSync=true:1
-_ @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-request @ ak-req.uts:148
-<<<<<<< HEAD
-_callee9$ @ aksupa.uts:887
-=======
-_callee19$ @ aksupa.uts:1288
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-<<<<<<< HEAD
-signIn @ aksupa.uts:876
-_callee3$ @ delivery.uts:1506
-=======
-requestWithAutoRefresh @ aksupa.uts:1287
-_callee14$ @ aksupa.uts:1141
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-<<<<<<< HEAD
-loginDelivery @ delivery.uts:1500
-_callee$ @ deliveryService.uts:42
-=======
-update @ aksupa.uts:1117
-_callee$ @ aksupa.uts:477
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-<<<<<<< HEAD
-loginDelivery @ deliveryService.uts:41
-_callee5$ @ login.uvue:495
-=======
-execute @ aksupa.uts:369
-_callee52$ @ supabaseService.uts:4038
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-<<<<<<< HEAD
-handleLogin @ login.uvue:477
-callWithErrorHandling @ vue.runtime.esm.js:1356
-callWithAsyncErrorHandling @ vue.runtime.esm.js:1363
-invoke @ vue.runtime.esm.js:6223
-setTimeout (async)
-invoker @ vue.runtime.esm.js:6232
-Show 14 more frames
-mp.esm.js:529 [ak-req] 发送 Authorization: (MISSING!)(env: Windows,mp,1.06.2504030; lib: 3.15.2)
-(anonymous) @ mp.esm.js:529
-__f__ @ uni.api.esm.js:590
-_callee2$ @ ak-req.uts:340
-=======
-cancelOrder @ supabaseService.uts:4018
-_callee7$ @ orders.uvue:1422
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-doCancelOrder @ orders.uvue:1417
-success @ orders.uvue:1443
+success @ ak-req.uts:304
(anonymous) @ uni.api.esm.js:946
-Show 25 more frames
-mp.esm.js:529 取消订单失败: UniError: 请求失败: 400
- at _construct (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/construct.js?forceSync=true:1:1227)
- at new r (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/wrapNativeSuper.js?forceSync=true:1:1357)
- at UniError2. (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/createSuper.js?forceSync=true:1:1176)
- at new UniError2 (weapp:///http://127.0.0.1:60394/appservice/common/vendor.js?t=wechat&s=1779670571338&v=2c3f4623fbd33b44aa0c0065a9eb296b:890:22)
- at Object.toUniError (weapp:///http://127.0.0.1:60394/appservice/utils/utils.js?t=wechat&s=1779670571338&v=44243ae0f2468b2c481e39a715a29204:77:18)
- at AkSupa._callee19$ (weapp:///http://127.0.0.1:60394/appservice/components/supadb/aksupa.js?t=wechat&s=1779670571338&v=f87225c7384edc68270412f64fbd4e8a:1959:41)
- at s (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/regeneratorRuntime.js?forceSync=true:1:1588)
- at Generator. (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/regeneratorRuntime.js?forceSync=true:1:2925)
- at Generator.next (weapp:///http://127.0.0.1:60394/appservice/@babel/runtime/helpers/regeneratorRuntime.js?forceSync=true:1:1951)
- at fulfilled (weapp:///http://127.0.0.1:60394/appservice/common/vendor.js?t=wechat&s=1779670571338&v=2c3f4623fbd33b44aa0c0065a9eb296b:10009:24)(env: Windows,mp,1.06.2504030; lib: 3.15.2)
+mp.esm.js:529 [ak-req] status: 400(env: Windows,mp,1.06.2504030; lib: 3.16.0)
(anonymous) @ mp.esm.js:529
__f__ @ uni.api.esm.js:590
-_callee52$ @ supabaseService.uts:4041
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-<<<<<<< HEAD
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-request @ ak-req.uts:148
-_callee9$ @ aksupa.uts:887
-=======
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-cancelOrder @ supabaseService.uts:4018
-_callee7$ @ orders.uvue:1422
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-<<<<<<< HEAD
-signIn @ aksupa.uts:876
-_callee3$ @ delivery.uts:1506
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-loginDelivery @ delivery.uts:1500
-_callee$ @ deliveryService.uts:42
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-loginDelivery @ deliveryService.uts:41
-_callee5$ @ login.uvue:495
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-handleLogin @ login.uvue:477
-callWithErrorHandling @ vue.runtime.esm.js:1356
-callWithAsyncErrorHandling @ vue.runtime.esm.js:1363
-invoke @ vue.runtime.esm.js:6223
-setTimeout (async)
-invoker @ vue.runtime.esm.js:6232
-Show 14 more frames
-mp.esm.js:529 [ak-req] response body: {"message":"Invalid authentication credentials"}(env: Windows,mp,1.06.2504030; lib: 3.15.2)
-(anonymous) @ mp.esm.js:529
-__f__ @ uni.api.esm.js:590
-_callee2$ @ ak-req.uts:341
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-request @ ak-req.uts:148
-_callee9$ @ aksupa.uts:887
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-signIn @ aksupa.uts:876
-_callee3$ @ delivery.uts:1506
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-loginDelivery @ delivery.uts:1500
-_callee$ @ deliveryService.uts:42
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-loginDelivery @ deliveryService.uts:41
-_callee5$ @ login.uvue:495
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-handleLogin @ login.uvue:477
-callWithErrorHandling @ vue.runtime.esm.js:1356
-callWithAsyncErrorHandling @ vue.runtime.esm.js:1363
-invoke @ vue.runtime.esm.js:6223
-setTimeout (async)
-invoker @ vue.runtime.esm.js:6232
-Show 14 more frames
-mp.esm.js:529 [ak-req] ℹ 当前请求按 apikey-only 模式发送,这是匿名登录/匿名接口的预期行为(env: Windows,mp,1.06.2504030; lib: 3.15.2)
-(anonymous) @ mp.esm.js:529
-__f__ @ uni.api.esm.js:590
-_callee2$ @ ak-req.uts:346
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-request @ ak-req.uts:148
-_callee9$ @ aksupa.uts:887
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-signIn @ aksupa.uts:876
-_callee3$ @ delivery.uts:1506
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-loginDelivery @ delivery.uts:1500
-_callee$ @ deliveryService.uts:42
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-loginDelivery @ deliveryService.uts:41
-_callee5$ @ login.uvue:495
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-handleLogin @ login.uvue:477
-callWithErrorHandling @ vue.runtime.esm.js:1356
-callWithAsyncErrorHandling @ vue.runtime.esm.js:1363
-invoke @ vue.runtime.esm.js:6223
-setTimeout (async)
-invoker @ vue.runtime.esm.js:6232
-Show 14 more frames
-mp.esm.js:529 [ak-req] ✗ 401 更可能来自服务端网关认证:请检查 SUPA_URL 对应实例与 SUPA_KEY/ANON_KEY 是否匹配(env: Windows,mp,1.06.2504030; lib: 3.15.2)
-(anonymous) @ mp.esm.js:529
-__f__ @ uni.api.esm.js:590
-_callee2$ @ ak-req.uts:347
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-fulfilled @ uni.mp.esm.js:1134
-Promise.then (async)
-step @ uni.mp.esm.js:1134
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-request @ ak-req.uts:148
-_callee9$ @ aksupa.uts:887
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-signIn @ aksupa.uts:876
-_callee3$ @ delivery.uts:1506
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-loginDelivery @ delivery.uts:1500
-_callee$ @ deliveryService.uts:42
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-loginDelivery @ deliveryService.uts:41
-_callee5$ @ login.uvue:495
-s @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ regeneratorRuntime.js?forceSync=true:1
-(anonymous) @ uni.mp.esm.js:1134
-__awaiter @ uni.mp.esm.js:1134
-handleLogin @ login.uvue:477
-callWithErrorHandling @ vue.runtime.esm.js:1356
-callWithAsyncErrorHandling @ vue.runtime.esm.js:1363
-invoke @ vue.runtime.esm.js:6223
-setTimeout (async)
-invoker @ vue.runtime.esm.js:6232
-Show 14 more frames
-Error: timeout
- at Function. (WAServiceMainContext.js?t=wechat&v=3.15.2:1)
- at p (WAServiceMainContext.js?t=wechat&v=3.15.2:1)
- at WAServiceMainContext.js?t=wechat&v=3.15.2:1
- at WAServiceMainContext.js?t=wechat&v=3.15.2:1(env: Windows,mp,1.06.2504030; lib: 3.15.2)
-
- 15:42:21.953 [plugin:uts] Invalid end tag.
-15:42:22.203 at pages/mall/delivery/home/index.uvue:454:1
-=======
-doCancelOrder @ orders.uvue:1417
-success @ orders.uvue:1443
+success @ ak-req.uts:305
(anonymous) @ uni.api.esm.js:946
->>>>>>> d9103c9bf (完善下单逻辑及其ui展示,修复支付倒计时显示错误bug)
+mp.esm.js:529 [ak-req] url: http://119.146.131.237:9126/rest/v1/ak_users?id=eq.b653fded-7d5e-4950-aa0d-725595543e3c(env: Windows,mp,1.06.2504030; lib: 3.16.0)
+(anonymous) @ mp.esm.js:529
+__f__ @ uni.api.esm.js:590
+success @ ak-req.uts:306
+(anonymous) @ uni.api.esm.js:946
+mp.esm.js:529 [ak-req] body: {"code":"22P02","details":null,"hint":null,"message":"invalid input syntax for type uuid: \"zh-CN\""}(env: Windows,mp,1.06.2504030; lib: 3.16.0)
+(anonymous) @ mp.esm.js:529
+__f__ @ uni.api.esm.js:590
+success @ ak-req.uts:307
+(anonymous) @ uni.api.esm.js:946
+mp.esm.js:529 saveProfile update ak_users error: {"errSubject":"AppError","errCode":-1,"errMsg":"请求失败: 400"}
+mp.esm.js:529 [AkSupaQueryBuilder] execute - 表: ak_users filter: id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
+mp.esm.js:529 [ak-req] PATCH http://119.146.131.237:9126/rest/v1/ak_users?id=eq.b653fded-7d5e-4950-aa0d-725595543e3c
+mp.esm.js:529 [ak-req] apikey: eyJhbG...7890 | Authorization: Bearer eyJhbG...Tozk | auth-mode: pre-set | prefer: return=representation
+uni.api.esm.js:1042 PATCH http://119.146.131.237:9126/rest/v1/ak_users?id=eq.b653fded-7d5e-4950-aa0d-725595543e3c 400 (Bad Request)(env: Windows,mp,1.06.2504030; lib: 3.16.0)
+(anonymous) @ uni.api.esm.js:1042
+invokeApi @ uni.api.esm.js:330
+promiseApi @ uni.api.esm.js:889
+(anonymous) @ ak-req.uts:214
+doOnce @ ak-req.uts:213
+_loop$ @ ak-req.uts:328
+s @ regeneratorRuntime.js?forceSync=true:1
+(anonymous) @ regeneratorRuntime.js?forceSync=true:1
+(anonymous) @ regeneratorRuntime.js?forceSync=true:1
+s @ regeneratorRuntime.js?forceSync=true:1
+_ @ regeneratorRuntime.js?forceSync=true:1
+(anonymous) @ regeneratorRuntime.js?forceSync=true:1
+(anonymous) @ regeneratorRuntime.js?forceSync=true:1
+fulfilled @ uni.mp.esm.js:1134
+Promise.then (async)
+step @ uni.mp.esm.js:1134
+(anonymous) @ uni.mp.esm.js:1134
+__awaiter @ uni.mp.esm.js:1134
+request @ ak-req.uts:148
+_callee19$ @ aksupa.uts:1290
+s @ regeneratorRuntime.js?forceSync=true:1
+(anonymous) @ regeneratorRuntime.js?forceSync=true:1
+(anonymous) @ regeneratorRuntime.js?forceSync=true:1
+(anonymous) @ uni.mp.esm.js:1134
+__awaiter @ uni.mp.esm.js:1134
+requestWithAutoRefresh @ aksupa.uts:1289
+_callee14$ @ aksupa.uts:1143
+s @ regeneratorRuntime.js?forceSync=true:1
+(anonymous) @ regeneratorRuntime.js?forceSync=true:1
+(anonymous) @ regeneratorRuntime.js?forceSync=true:1
+(anonymous) @ uni.mp.esm.js:1134
+__awaiter @ uni.mp.esm.js:1134
+update @ aksupa.uts:1119
+_callee$ @ aksupa.uts:477
+s @ regeneratorRuntime.js?forceSync=true:1
+(anonymous) @ regeneratorRuntime.js?forceSync=true:1
+(anonymous) @ regeneratorRuntime.js?forceSync=true:1
+(anonymous) @ uni.mp.esm.js:1134
+__awaiter @ uni.mp.esm.js:1134
+execute @ aksupa.uts:369
+_callee2$ @ profile.uvue:1071
+s @ regeneratorRuntime.js?forceSync=true:1
+(anonymous) @ regeneratorRuntime.js?forceSync=true:1
+(anonymous) @ regeneratorRuntime.js?forceSync=true:1
+fulfilled @ uni.mp.esm.js:1134
+Promise.then (async)
+step @ uni.mp.esm.js:1134
+(anonymous) @ uni.mp.esm.js:1134
+__awaiter @ uni.mp.esm.js:1134
+saveProfile @ profile.uvue:1015
+callWithErrorHandling @ vue.runtime.esm.js:1356
+callWithAsyncErrorHandling @ vue.runtime.esm.js:1363
+invoke @ vue.runtime.esm.js:6223
+setTimeout (async)
+invoker @ vue.runtime.esm.js:6232
+mp.esm.js:529 [ak-req] HTTP error response(env: Windows,mp,1.06.2504030; lib: 3.16.0)
+(anonymous) @ mp.esm.js:529
+__f__ @ uni.api.esm.js:590
+success @ ak-req.uts:304
+(anonymous) @ uni.api.esm.js:946
+mp.esm.js:529 [ak-req] status: 400(env: Windows,mp,1.06.2504030; lib: 3.16.0)
+(anonymous) @ mp.esm.js:529
+__f__ @ uni.api.esm.js:590
+success @ ak-req.uts:305
+(anonymous) @ uni.api.esm.js:946
+mp.esm.js:529 [ak-req] url: http://119.146.131.237:9126/rest/v1/ak_users?id=eq.b653fded-7d5e-4950-aa0d-725595543e3c(env: Windows,mp,1.06.2504030; lib: 3.16.0)
+(anonymous) @ mp.esm.js:529
+__f__ @ uni.api.esm.js:590
+success @ ak-req.uts:306
+(anonymous) @ uni.api.esm.js:946
+mp.esm.js:529 [ak-req] body: {"code":"22P02","details":null,"hint":null,"message":"invalid input syntax for type uuid: \"zh-CN\""}(env: Windows,mp,1.06.2504030; lib: 3.16.0)
+(anonymous) @ mp.esm.js:529
+__f__ @ uni.api.esm.js:590
+success @ ak-req.uts:307
+(anonymous) @ uni.api.esm.js:946
+mp.esm.js:529 saveProfile fallback update ak_users error: {"errSubject":"AppError","errCode":-1,"errMsg":"请求失败: 400"}
\ No newline at end of file