修复订单显示bug

This commit is contained in:
2026-06-10 20:20:47 +08:00
parent de62513987
commit 9fbc6f8cd1
45 changed files with 7514 additions and 2025 deletions

View File

@@ -1,4 +1,5 @@
import type {
DeliveryAbnormalReportType,
DeliveryCertificateType,
DeliveryCheckinPayloadType,
DeliveryDashboardType,
@@ -11,10 +12,12 @@ import type {
DeliveryLoginResultType,
DeliveryMessageType,
DeliveryOrderQueryType,
DeliveryOrderStatus,
DeliveryOrderType,
DeliveryProgressPayloadType,
DeliveryRecordType,
DeliveryEvidenceRecordType,
DeliveryServiceRecordType,
DeliveryServiceItemType
} from '@/types/delivery.uts'
import supa, { ensureSupabaseReady } from '@/components/supadb/aksupainstance.uts'
@@ -235,6 +238,26 @@ function buildDeliveryInfoFromStaff(raw: any): DeliveryInfoType {
} as DeliveryInfoType
}
async function fetchCareRequestById(requestId: string): Promise<any | null> {
if (requestId == '') {
return null
}
try {
await ensureSupabaseReady()
const response = await supa.from('ec_service_requests').select('*').eq('id', requestId).limit(1).execute()
if (response.error != null || response.data == null) {
return null
}
const rows = response.data as Array<any>
if (rows.length > 0) {
return rows[0]
}
} catch (error) {
console.warn('[delivery api] 读取 ec_service_requests 失败:', requestId, error)
}
return null
}
async function fetchDeliveryProfileFromRemote(userId: string): Promise<DeliveryInfoType | null> {
if (userId == '') {
return null
@@ -271,17 +294,19 @@ function isDelivererRole(userInfo: UserProfile | null): boolean {
}
function shouldBypassDeliveryRpc(): boolean {
if (IS_TEST_MODE !== true) {
return false
}
const forceRemote = uni.getStorageSync(DELIVERY_FORCE_REMOTE_KEY)
if (forceRemote === true) {
return false
}
if (typeof forceRemote == 'string' && (forceRemote == 'true' || forceRemote == '1')) {
return false
}
return true
// FIX: 强制走真实 RPC不走 mock fallback
return false
// if (IS_TEST_MODE !== true) {
// return false
// }
// const forceRemote = uni.getStorageSync(DELIVERY_FORCE_REMOTE_KEY)
// if (forceRemote === true) {
// return false
// }
// if (typeof forceRemote == 'string' && (forceRemote == 'true' || forceRemote == '1')) {
// return false
// }
// return true
}
async function callDeliveryRpc(functionName: string, params: UTSJSONObject): Promise<any> {
@@ -293,6 +318,7 @@ async function callDeliveryRpc(functionName: string, params: UTSJSONObject): Pro
}
try {
await ensureSupabaseReady()
console.warn('[delivery api] RPC request:', functionName, JSON.stringify(params))
const res: any = await supa.rpc(functionName, params)
if (res?.status === 404) {
markMissingDeliveryRpc(functionName)
@@ -302,6 +328,7 @@ async function callDeliveryRpc(functionName: string, params: UTSJSONObject): Pro
if (res?.error != null) {
throw res.error
}
console.warn('[delivery api] RPC response:', functionName, JSON.stringify(res.data))
return res.data
} catch (error) {
console.warn('[delivery api] RPC 调用失败,回退 mock' + functionName, error)
@@ -309,11 +336,460 @@ async function callDeliveryRpc(functionName: string, params: UTSJSONObject): Pro
}
}
function rpcStr(item: any, key: string): string {
if (item == null) return ''
if (typeof item.getString === 'function') {
const v = item.getString(key)
return v != null ? v : ''
}
const v = item[key]
return v != null && v !== undefined ? String(v) : ''
}
function rpcNum(item: any, key: string): number {
if (item == null) return 0
if (typeof item.getNumber === 'function') {
const v = item.getNumber(key)
return v != null ? v : 0
}
const v = item[key]
if (typeof v === 'number') return v
const parsed = Number(v)
return isNaN(parsed) ? 0 : parsed
}
function rpcObj(item: any, key: string): any {
if (item == null) return null
if (typeof item.getJSONObj === 'function') {
const v = item.getJSONObj(key)
return v != null ? v : null
}
return item[key] ?? null
}
function mapRpcOrderItem(item: any): DeliveryOrderType {
const addressObj = rpcObj(item, 'address_snapshot_json') ?? {}
const serviceObj = rpcObj(item, 'service_snapshot_json') ?? {}
const order = {} as DeliveryOrderType
order.id = rpcStr(item, 'id')
order.orderNo = rpcStr(item, 'order_no')
order.serviceType = rpcStr(serviceObj, 'category') || '居家服务'
order.serviceName = rpcStr(item, 'service_name')
order.serviceCategory = rpcStr(serviceObj, 'category')
order.serviceItems = [] as Array<DeliveryServiceItemType>
order.elderId = ''
order.elderName = rpcStr(item, 'recipient_name')
order.elderNameMasked = order.elderName
order.elderGender = ''
order.elderAge = 0
order.elderPhone = rpcStr(item, 'recipient_phone')
order.elderPhoneMasked = order.elderPhone
order.fullElderName = order.elderName
order.fullPhone = order.elderPhone
order.contactRelation = '家属'
order.contactName = rpcStr(item, 'contact_name')
order.contactPhone = rpcStr(item, 'contact_phone')
order.addressSummary = rpcStr(addressObj, 'fullAddress') || rpcStr(addressObj, 'full_address')
order.address = order.addressSummary
order.addressDetail = rpcStr(addressObj, 'detailAddress') || rpcStr(addressObj, 'detail_address')
order.fullAddress = order.address + ' ' + order.addressDetail
order.latitude = rpcNum(addressObj, 'latitude')
order.longitude = rpcNum(addressObj, 'longitude')
order.appointmentTime = rpcStr(item, 'appointment_time')
order.appointmentStartTime = order.appointmentTime
order.appointmentEndTime = order.appointmentTime
order.duration = 90
order.estimatedDuration = 90
order.price = rpcNum(serviceObj, 'price')
order.staffIncome = order.price
order.distance = ''
order.actualStartTime = rpcStr(item, 'service_started_at')
order.actualEndTime = rpcStr(item, 'completed_at')
order.status = rpcStr(item, 'status') as DeliveryOrderStatus
order.statusText = ''
order.statusTone = ''
order.riskTags = [] as Array<string>
order.healthTags = [] as Array<string>
order.careLevel = ''
order.needFamilyPresent = false
order.needMaterials = false
order.remark = rpcStr(item, 'remark')
order.merchantId = ''
order.merchantName = ''
order.deliveryStaffId = rpcStr(item, 'current_staff_id')
order.deliveryStaffName = ''
order.acceptTime = rpcStr(item, 'accepted_at')
order.rejectTime = ''
order.departTime = rpcStr(item, 'departed_at')
order.arriveTime = rpcStr(item, 'arrived_at')
order.checkinTime = rpcStr(item, 'checked_in_at') || rpcStr(item, 'arrived_at')
order.startServiceTime = order.actualStartTime
order.finishTime = rpcStr(item, 'completed_at') || rpcStr(item, 'service_completed_at')
order.cancelReason = rpcStr(item, 'cancel_reason')
order.exceptionType = ''
order.exceptionDesc = ''
order.evidenceList = [] as Array<DeliveryEvidenceRecordType>
order.signatureUrl = ''
order.signatureName = ''
order.satisfactionStatus = '待评价'
order.settlementStatus = '待结算'
order.archiveStatus = '未归档'
order.createdAt = rpcStr(item, 'created_at')
order.updatedAt = rpcStr(item, 'updated_at')
order.notices = [] as Array<string>
order.timeline = [] as Array<DeliveryTimelineItemType>
order.statusLog = [] as Array<DeliveryStatusLogType>
order.serviceSummary = ''
order.progressNote = ''
order.distanceKm = ''
order.allowCheckinRadiusMeters = 100
order.lastLocation = null
order.trackPoints = [] as Array<DeliveryLocationType>
order.serviceRecord = null
order.abnormalReport = null
return order
}
function rpcBoolCompat(item: any, key: string): boolean {
if (item == null) return false
if (typeof item.getBoolean === 'function') {
const v = item.getBoolean(key)
return v != null ? v : false
}
return item[key] === true
}
function rpcArrayCompat(item: any, key: string): Array<any> {
if (item == null) return [] as Array<any>
const value = item[key]
if (Array.isArray(value)) {
return value
}
return [] as Array<any>
}
function rpcStrCompat(item: any, keys: Array<string>): string {
for (let i = 0; i < keys.length; i++) {
const value = rpcStr(item, keys[i])
if (value != '') {
return value
}
}
return ''
}
function rpcNumCompat(item: any, keys: Array<string>): number {
for (let i = 0; i < keys.length; i++) {
const value = rpcNum(item, keys[i])
if (value != 0) {
return value
}
}
return 0
}
function mapRpcTimelineCompat(list: Array<any>): Array<DeliveryTimelineItemType> {
const result = [] as Array<DeliveryTimelineItemType>
for (let i = 0; i < list.length; i++) {
const item = list[i]
result.push({
id: rpcStrCompat(item, ['id']),
title: rpcStrCompat(item, ['title']),
time: rpcStrCompat(item, ['time', 'createdAt', 'created_at']),
description: rpcStrCompat(item, ['description', 'remark'])
} as DeliveryTimelineItemType)
}
return result
}
function mapRpcOrderItemCompat(item: any): DeliveryOrderType {
const legacy = mapRpcOrderItem(item)
const addressObj = rpcObj(item, 'address_snapshot_json') ?? rpcObj(item, 'addressSnapshotJson') ?? {}
const serviceObj = rpcObj(item, 'service_snapshot_json') ?? rpcObj(item, 'serviceSnapshotJson') ?? {}
const order = legacy
const addressSummary = rpcStrCompat(item, ['addressSummary', 'address']) != '' ? rpcStrCompat(item, ['addressSummary', 'address']) : rpcStrCompat(addressObj, ['fullAddress', 'full_address', 'address', 'name'])
const addressDetail = rpcStrCompat(item, ['addressDetail']) != '' ? rpcStrCompat(item, ['addressDetail']) : rpcStrCompat(addressObj, ['detailAddress', 'detail_address'])
order.id = rpcStrCompat(item, ['id'])
order.orderNo = rpcStrCompat(item, ['orderNo', 'order_no', 'task_no'])
order.serviceType = rpcStrCompat(item, ['serviceType'])
if (order.serviceType == '') {
order.serviceType = rpcStrCompat(serviceObj, ['category'])
}
if (order.serviceType == '') {
order.serviceType = '居家服务'
}
order.serviceName = rpcStrCompat(item, ['serviceName', 'service_name'])
if (order.serviceName == '') {
order.serviceName = rpcStrCompat(serviceObj, ['name', 'serviceName'])
}
if (order.serviceName == '') {
order.serviceName = rpcStrCompat(item, ['serviceCategory']) != '' ? rpcStrCompat(item, ['serviceCategory']) : '居家服务订单'
}
order.serviceCategory = rpcStrCompat(item, ['serviceCategory'])
if (order.serviceCategory == '') {
order.serviceCategory = rpcStrCompat(serviceObj, ['category'])
}
order.serviceItems = rpcArrayCompat(item, 'serviceItems') as Array<DeliveryServiceItemType>
order.elderId = rpcStrCompat(item, ['elderId', 'elder_id', 'user_id'])
order.elderName = rpcStrCompat(item, ['elderName', 'recipient_name', 'elder_name'])
if (order.elderName == '') {
order.elderName = rpcStrCompat(item, ['contactName', 'contact_name']) != '' ? rpcStrCompat(item, ['contactName', 'contact_name']) : '服务对象待补充'
}
order.elderNameMasked = order.elderName
order.elderGender = rpcStrCompat(item, ['elderGender'])
order.elderAge = rpcNumCompat(item, ['elderAge'])
order.elderPhone = rpcStrCompat(item, ['elderPhone', 'recipient_phone', 'elder_phone'])
order.elderPhoneMasked = order.elderPhone
order.fullElderName = order.elderName
order.fullPhone = order.elderPhone
order.contactRelation = rpcStrCompat(item, ['contactRelation'])
if (order.contactRelation == '') {
order.contactRelation = '家属'
}
order.contactName = rpcStrCompat(item, ['contactName', 'contact_name'])
order.contactPhone = rpcStrCompat(item, ['contactPhone', 'contact_phone'])
order.addressSummary = addressSummary
order.address = rpcStrCompat(item, ['address']) != '' ? rpcStrCompat(item, ['address']) : addressSummary
if (order.address == '') {
order.address = rpcStrCompat(addressObj, ['fullAddress', 'full_address', 'address', 'name'])
}
if (order.address == '') {
order.address = '地址待补充'
}
order.addressDetail = addressDetail
order.fullAddress = rpcStrCompat(item, ['fullAddress'])
if (order.fullAddress == '') {
order.fullAddress = order.address
}
if (order.addressDetail != '' && order.fullAddress.indexOf(order.addressDetail) < 0) {
order.fullAddress = order.fullAddress + ' ' + order.addressDetail
}
order.latitude = rpcNumCompat(item, ['latitude'])
if (order.latitude == 0) {
order.latitude = rpcNumCompat(addressObj, ['latitude'])
}
order.longitude = rpcNumCompat(item, ['longitude'])
if (order.longitude == 0) {
order.longitude = rpcNumCompat(addressObj, ['longitude'])
}
order.appointmentTime = rpcStrCompat(item, ['appointmentTime', 'appointment_time', 'scheduled_at'])
if (order.appointmentTime == '') {
order.appointmentTime = rpcStrCompat(item, ['createdAt', 'created_at'])
}
if (order.appointmentTime == '') {
order.appointmentTime = '时间待补充'
}
order.appointmentStartTime = rpcStrCompat(item, ['appointmentStartTime'])
if (order.appointmentStartTime == '') {
order.appointmentStartTime = order.appointmentTime
}
order.appointmentEndTime = rpcStrCompat(item, ['appointmentEndTime'])
if (order.appointmentEndTime == '') {
order.appointmentEndTime = order.appointmentTime
}
order.duration = rpcNumCompat(item, ['duration', 'duration_minutes'])
if (order.duration == 0) {
order.duration = 90
}
order.estimatedDuration = rpcNumCompat(item, ['estimatedDuration', 'duration', 'duration_minutes'])
if (order.estimatedDuration == 0) {
order.estimatedDuration = order.duration
}
order.price = rpcNumCompat(item, ['price'])
if (order.price == 0) {
order.price = rpcNumCompat(serviceObj, ['price'])
}
order.staffIncome = rpcNumCompat(item, ['staffIncome'])
if (order.staffIncome == 0) {
order.staffIncome = rpcNumCompat(item, ['price'])
}
if (order.staffIncome == 0) {
order.staffIncome = rpcNumCompat(serviceObj, ['price'])
}
if (order.staffIncome == 0) {
order.staffIncome = 0
}
order.distance = rpcStrCompat(item, ['distance'])
order.actualStartTime = rpcStrCompat(item, ['actualStartTime', 'service_started_at'])
order.actualEndTime = rpcStrCompat(item, ['actualEndTime', 'completed_at', 'service_completed_at'])
order.status = rpcStrCompat(item, ['status']) as DeliveryOrderStatus
order.statusText = rpcStrCompat(item, ['statusText'])
order.statusTone = rpcStrCompat(item, ['statusTone'])
order.riskTags = rpcArrayCompat(item, 'riskTags') as Array<string>
order.healthTags = rpcArrayCompat(item, 'healthTags') as Array<string>
order.careLevel = rpcStrCompat(item, ['careLevel'])
order.needFamilyPresent = rpcBoolCompat(item, 'needFamilyPresent')
order.needMaterials = rpcBoolCompat(item, 'needMaterials')
order.remark = rpcStrCompat(item, ['remark'])
order.merchantId = rpcStrCompat(item, ['merchantId', 'merchant_id'])
order.merchantName = rpcStrCompat(item, ['merchantName', 'merchant_name'])
order.deliveryStaffId = rpcStrCompat(item, ['deliveryStaffId', 'current_staff_id', 'assigned_to'])
order.deliveryStaffName = rpcStrCompat(item, ['deliveryStaffName', 'delivery_staff_name'])
order.acceptTime = rpcStrCompat(item, ['acceptTime', 'accepted_at'])
order.departTime = rpcStrCompat(item, ['departTime', 'departed_at'])
order.arriveTime = rpcStrCompat(item, ['arriveTime', 'arrived_at'])
order.checkinTime = rpcStrCompat(item, ['checkinTime', 'checked_in_at', 'arrived_at'])
order.startServiceTime = rpcStrCompat(item, ['startServiceTime', 'service_started_at'])
order.finishTime = rpcStrCompat(item, ['finishTime', 'completed_at', 'service_completed_at'])
order.cancelReason = rpcStrCompat(item, ['cancelReason', 'cancel_reason'])
order.exceptionType = rpcStrCompat(item, ['exceptionType'])
order.exceptionDesc = rpcStrCompat(item, ['exceptionDesc'])
order.evidenceList = rpcArrayCompat(item, 'evidenceList') as Array<DeliveryEvidenceRecordType>
order.signatureUrl = rpcStrCompat(item, ['signatureUrl'])
order.signatureName = rpcStrCompat(item, ['signatureName'])
order.satisfactionStatus = rpcStrCompat(item, ['satisfactionStatus'])
order.settlementStatus = rpcStrCompat(item, ['settlementStatus'])
order.archiveStatus = rpcStrCompat(item, ['archiveStatus'])
order.createdAt = rpcStrCompat(item, ['createdAt', 'created_at'])
order.updatedAt = rpcStrCompat(item, ['updatedAt', 'updated_at'])
order.notices = rpcArrayCompat(item, 'notices') as Array<string>
order.timeline = mapRpcTimelineCompat(rpcArrayCompat(item, 'timeline'))
order.statusLog = rpcArrayCompat(item, 'statusLog') as Array<DeliveryStatusLogType>
order.serviceSummary = rpcStrCompat(item, ['serviceSummary'])
order.progressNote = rpcStrCompat(item, ['progressNote'])
order.distanceKm = rpcStrCompat(item, ['distanceKm'])
order.allowCheckinRadiusMeters = rpcNumCompat(item, ['allowCheckinRadiusMeters'])
if (order.allowCheckinRadiusMeters == 0) {
order.allowCheckinRadiusMeters = 100
}
order.lastLocation = rpcObj(item, 'lastLocation') as DeliveryLocationType | null
order.trackPoints = rpcArrayCompat(item, 'trackPoints') as Array<DeliveryLocationType>
order.serviceRecord = rpcObj(item, 'serviceRecord') as DeliveryServiceRecordType | null
order.abnormalReport = rpcObj(item, 'abnormalReport') as DeliveryAbnormalReportType | null
console.warn('[delivery api] mapped order:', JSON.stringify({
id: order.id,
orderNo: order.orderNo,
serviceName: order.serviceName,
elderName: order.elderName,
contactName: order.contactName,
address: order.address,
addressDetail: order.addressDetail,
appointmentTime: order.appointmentTime,
price: order.price,
staffIncome: order.staffIncome,
status: order.status,
statusText: order.statusText,
requestId: rpcStrCompat(item, ['request_id', 'requestId'])
}))
return order
}
function needsRequestFallback(order: DeliveryOrderType): boolean {
return order.serviceName == '' || order.elderName == '' || order.address == '' || order.contactName == ''
}
// 用于限制 "missing request_id" 日志输出的计数器
let _missingRequestIdLogCount = 0
function fillOrderFromRequestSnapshot(order: DeliveryOrderType, requestItem: any): DeliveryOrderType {
const addressObj = readObjectField(requestItem, 'address_snapshot_json') ?? readObjectField(requestItem, 'address_snapshot') ?? null
const addressFull = addressObj != null ? (readStringField(addressObj, 'fullAddress') != '' ? readStringField(addressObj, 'fullAddress') : readStringField(addressObj, 'full_address')) : ''
const addressDetail = addressObj != null ? (readStringField(addressObj, 'detailAddress') != '' ? readStringField(addressObj, 'detailAddress') : readStringField(addressObj, 'detail_address')) : ''
if (order.serviceName == '') {
order.serviceName = readStringField(requestItem, 'service_name')
}
if (order.serviceCategory == '') {
order.serviceCategory = readStringField(requestItem, 'service_category')
}
if (order.serviceType == '' || order.serviceType == '居家服务') {
const requestCategory = readStringField(requestItem, 'service_category')
if (requestCategory != '') {
order.serviceType = requestCategory
}
}
if (order.elderName == '') {
order.elderName = readStringField(requestItem, 'elder_name')
order.elderNameMasked = order.elderName
order.fullElderName = order.elderName
}
if (order.elderPhone == '') {
order.elderPhone = readStringField(requestItem, 'elder_phone')
order.elderPhoneMasked = order.elderPhone
order.fullPhone = order.elderPhone
}
if (order.contactName == '') {
order.contactName = readStringField(requestItem, 'contact_name')
}
if (order.contactPhone == '') {
order.contactPhone = readStringField(requestItem, 'contact_phone')
}
if (order.address == '') {
order.address = addressFull
order.addressSummary = addressFull
}
if (order.addressDetail == '') {
order.addressDetail = addressDetail
}
if (order.fullAddress == '' || order.fullAddress == order.address) {
order.fullAddress = order.address
if (order.addressDetail != '' && order.fullAddress.indexOf(order.addressDetail) < 0) {
order.fullAddress = order.fullAddress + ' ' + order.addressDetail
}
}
if (order.latitude == 0 && addressObj != null) {
const latitude = readNumberField(addressObj, 'latitude')
order.latitude = latitude != null ? latitude : 0
}
if (order.longitude == 0 && addressObj != null) {
const longitude = readNumberField(addressObj, 'longitude')
order.longitude = longitude != null ? longitude : 0
}
if (order.appointmentTime == '') {
order.appointmentTime = readStringField(requestItem, 'scheduled_at')
order.appointmentStartTime = order.appointmentTime
order.appointmentEndTime = order.appointmentTime
}
if (order.remark == '') {
order.remark = readStringField(requestItem, 'remark')
}
return order
}
async function enrichOrderWithRequestFallback(rawItem: any, order: DeliveryOrderType): Promise<DeliveryOrderType> {
if (!needsRequestFallback(order)) {
return order
}
const requestId = rpcStrCompat(rawItem, ['request_id', 'requestId'])
if (requestId == '') {
// 限制日志输出只输出前3个缺少 request_id 的订单
_missingRequestIdLogCount = _missingRequestIdLogCount + 1
if (_missingRequestIdLogCount <= 3) {
console.warn('[delivery api] request fallback skipped: missing request_id for order', order.id, '(count:', _missingRequestIdLogCount, ')')
}
return order
}
const requestItem = await fetchCareRequestById(requestId)
if (requestItem == null) {
console.warn('[delivery api] request fallback miss:', order.id, requestId)
return order
}
console.warn('[delivery api] order snapshot missing, fallback to ec_service_requests:', order.id, requestId)
const nextOrder = fillOrderFromRequestSnapshot(order, requestItem)
console.warn('[delivery api] request fallback merged:', JSON.stringify({
id: nextOrder.id,
requestId,
serviceName: nextOrder.serviceName,
elderName: nextOrder.elderName,
contactName: nextOrder.contactName,
address: nextOrder.address,
addressDetail: nextOrder.addressDetail,
appointmentTime: nextOrder.appointmentTime
}))
return nextOrder
}
function normalizeRpcOrderList(data: any): Array<DeliveryOrderType> | null {
if (!Array.isArray(data)) {
return null
}
return data as Array<DeliveryOrderType>
const result = [] as Array<DeliveryOrderType>
for (let i = 0; i < data.length; i++) {
result.push(mapRpcOrderItemCompat(data[i]))
}
return result
}
function normalizeRpcMessages(data: any): Array<DeliveryMessageType> | null {
@@ -341,7 +817,7 @@ function normalizeRpcOrder(data: any): DeliveryOrderType | null {
if (data == null) {
return null
}
return data as DeliveryOrderType
return mapRpcOrderItemCompat(data)
}
function normalizeRpcDashboard(data: any): DeliveryDashboardType | null {
@@ -537,6 +1013,8 @@ function buildMockOrders(profile: DeliveryInfoType): Array<DeliveryOrderType> {
serviceItems: buildMockServiceItems('mock-order-001', '基础上门护理'),
elderId: 'elder-001',
elderNameMasked: '李奶奶',
elderGender: '女',
elderAge: 78,
elderPhoneMasked: '138****1024',
fullElderName: '李秀珍',
fullPhone: '13800131024',
@@ -593,6 +1071,8 @@ function buildMockOrders(profile: DeliveryInfoType): Array<DeliveryOrderType> {
serviceItems: buildMockServiceItems('mock-order-002', '康复训练'),
elderId: 'elder-002',
elderNameMasked: '张爷爷',
elderGender: '男',
elderAge: 82,
elderPhoneMasked: '137****2233',
fullElderName: '张志坤',
fullPhone: '13700132233',
@@ -649,6 +1129,8 @@ function buildMockOrders(profile: DeliveryInfoType): Array<DeliveryOrderType> {
serviceItems: buildMockServiceItems('mock-order-003', '慢病随访'),
elderId: 'elder-003',
elderNameMasked: '黄阿姨',
elderGender: '女',
elderAge: 68,
elderPhoneMasked: '135****5566',
fullElderName: '黄玉英',
fullPhone: '13500135566',
@@ -738,6 +1220,8 @@ function buildMockOrders(profile: DeliveryInfoType): Array<DeliveryOrderType> {
] as Array<DeliveryServiceItemType>,
elderId: 'elder-004',
elderNameMasked: '陈伯伯',
elderGender: '男',
elderAge: 75,
elderPhoneMasked: '139****3301',
fullElderName: '陈国辉',
fullPhone: '13900133301',
@@ -812,6 +1296,8 @@ function buildMockOrders(profile: DeliveryInfoType): Array<DeliveryOrderType> {
serviceItems: buildMockServiceItems('mock-order-005', '异常处理'),
elderId: 'elder-005',
elderNameMasked: '王阿婆',
elderGender: '女',
elderAge: 80,
elderPhoneMasked: '134****7744',
fullElderName: '王月兰',
fullPhone: '13400137744',
@@ -892,6 +1378,8 @@ function buildMockOrders(profile: DeliveryInfoType): Array<DeliveryOrderType> {
] as Array<DeliveryServiceItemType>,
elderId: 'elder-006',
elderNameMasked: '刘叔叔',
elderGender: '男',
elderAge: 70,
elderPhoneMasked: '133****6655',
fullElderName: '刘建华',
fullPhone: '13300136655',
@@ -1524,19 +2012,27 @@ export async function loginDelivery(payload: DeliveryLoginPayloadType): Promise<
throw new Error('当前账号不是上门服务人员账号')
}
const deliveryInfo = await fetchDeliveryProfileFromRemote(profile.id)
let deliveryInfo = await fetchDeliveryProfileFromRemote(profile.id)
let usesMock = false
if (deliveryInfo == null) {
try {
await supa.signOut()
} catch (error) {}
throw new Error('当前账号未绑定服务人员档案')
if (IS_TEST_MODE) {
// 测试环境下无档案时自动回退 mock 档案,避免阻塞登录调试
deliveryInfo = ensureMockProfile(profile.id)
usesMock = true
console.log('[loginDelivery] 未找到远程服务人员档案,已回退 mock 档案userId:', profile.id)
} else {
try {
await supa.signOut()
} catch (error) {}
throw new Error('当前账号未绑定服务人员档案')
}
}
return {
token: result.access_token,
userInfo: profile,
deliveryInfo,
usesMock: false
usesMock
}
}
@@ -1567,6 +2063,9 @@ export async function getDeliveryOrdersByStaffId(staffId: string, query: Deliver
} as UTSJSONObject)
const orders = normalizeRpcOrderList(rpcData)
if (orders != null) {
for (let i = 0; i < orders.length; i++) {
orders[i] = await enrichOrderWithRequestFallback(rpcData[i], orders[i])
}
return orders
}
return await fallbackGetOrders(staffId, query)
@@ -1578,7 +2077,7 @@ export async function getDeliveryOrderDetailById(orderId: string): Promise<Deliv
} as UTSJSONObject)
const order = normalizeRpcOrder(rpcData)
if (order != null) {
return order
return await enrichOrderWithRequestFallback(rpcData, order)
}
return await fallbackGetOrderDetail(orderId)
}
@@ -1743,4 +2242,4 @@ export async function updateDeliveryOnlineStatusByStaffId(staffId: string, statu
return deliveryInfo
}
return await fallbackUpdateOnlineStatus(staffId, status)
}
}