修复订单显示bug
This commit is contained in:
541
api/delivery.uts
541
api/delivery.uts
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user