补充数据库数据,修改分类栏内容
This commit is contained in:
681
mock/delivery-care.mock.uts
Normal file
681
mock/delivery-care.mock.uts
Normal file
@@ -0,0 +1,681 @@
|
||||
import type {
|
||||
DeliveryAbnormalReportType,
|
||||
DeliveryDashboardType,
|
||||
DeliveryExceptionPayloadType,
|
||||
DeliveryInfoType,
|
||||
DeliveryLocationType,
|
||||
DeliveryOnlineStatus,
|
||||
DeliveryOrderStatus,
|
||||
DeliveryOrderType,
|
||||
DeliveryRecordType,
|
||||
DeliveryServiceItemType,
|
||||
DeliveryServiceRecordType,
|
||||
DeliveryStatusLogType,
|
||||
DeliveryTimelineItemType
|
||||
} from '@/types/delivery.uts'
|
||||
|
||||
const PROFILE_KEY = 'delivery_care_profile'
|
||||
const ORDER_KEY = 'delivery_care_orders'
|
||||
|
||||
function nowText(): string {
|
||||
return new Date().toISOString().replace('T', ' ').substring(0, 19)
|
||||
}
|
||||
|
||||
function cloneProfile(profile: DeliveryInfoType): DeliveryInfoType {
|
||||
return JSON.parse(JSON.stringify(profile)) as DeliveryInfoType
|
||||
}
|
||||
|
||||
function cloneOrder(order: DeliveryOrderType): DeliveryOrderType {
|
||||
return JSON.parse(JSON.stringify(order)) as DeliveryOrderType
|
||||
}
|
||||
|
||||
function cloneOrders(orders: Array<DeliveryOrderType>): Array<DeliveryOrderType> {
|
||||
return JSON.parse(JSON.stringify(orders)) as Array<DeliveryOrderType>
|
||||
}
|
||||
|
||||
function createStatusText(status: DeliveryOrderStatus): string {
|
||||
if (status == 'pending_assignment' || status == 'pending_accept') return '待接单'
|
||||
if (status == 'accepted') return '已接单'
|
||||
if (status == 'waiting_departure') return '待出发'
|
||||
if (status == 'departed' || status == 'on_the_way') return '已出发'
|
||||
if (status == 'arrived') return '已到达'
|
||||
if (status == 'checked_in') return '已签到'
|
||||
if (status == 'in_service' || status == 'serving') return '服务中'
|
||||
if (status == 'pending_confirm' || status == 'pending_acceptance' || status == 'pending_submit') return '待确认'
|
||||
if (status == 'completed') return '已完成'
|
||||
if (status == 'rejected') return '已拒单'
|
||||
if (status == 'cancelled') return '已取消'
|
||||
if (status == 'abnormal' || status == 'exception_pending') return '异常上报'
|
||||
if (status == 'terminated') return '服务终止'
|
||||
return '已归档'
|
||||
}
|
||||
|
||||
function createStatusTone(status: DeliveryOrderStatus): string {
|
||||
if (status == 'pending_assignment' || status == 'pending_accept' || status == 'pending_confirm' || status == 'pending_acceptance' || status == 'pending_submit') return 'warning'
|
||||
if (status == 'completed') return 'success'
|
||||
if (status == 'rejected' || status == 'cancelled' || status == 'terminated') return 'neutral'
|
||||
if (status == 'abnormal' || status == 'exception_pending') return 'danger'
|
||||
return 'primary'
|
||||
}
|
||||
|
||||
function createStatusLog(orderId: string, fromStatus: DeliveryOrderStatus, toStatus: DeliveryOrderStatus, remark: string): DeliveryStatusLogType {
|
||||
return {
|
||||
id: orderId + '-log-' + nowText().replace(/[-: ]/g, ''),
|
||||
orderId,
|
||||
fromStatus,
|
||||
toStatus,
|
||||
operatorRole: 'service_staff',
|
||||
operatorId: 'mock-staff-001',
|
||||
remark,
|
||||
createdAt: nowText()
|
||||
} as DeliveryStatusLogType
|
||||
}
|
||||
|
||||
function createTimeline(title: string, description: string): DeliveryTimelineItemType {
|
||||
return {
|
||||
id: 'timeline-' + nowText().replace(/[-: ]/g, ''),
|
||||
title,
|
||||
time: nowText(),
|
||||
description
|
||||
} as DeliveryTimelineItemType
|
||||
}
|
||||
|
||||
function createServiceItems(orderId: string): Array<DeliveryServiceItemType> {
|
||||
return [
|
||||
{
|
||||
id: orderId + '-item-1',
|
||||
name: '生命体征监测',
|
||||
required: true,
|
||||
completed: false,
|
||||
incompleteReason: '',
|
||||
remark: '',
|
||||
updatedAt: ''
|
||||
} as DeliveryServiceItemType,
|
||||
{
|
||||
id: orderId + '-item-2',
|
||||
name: '基础照护服务',
|
||||
required: true,
|
||||
completed: false,
|
||||
incompleteReason: '',
|
||||
remark: '',
|
||||
updatedAt: ''
|
||||
} as DeliveryServiceItemType,
|
||||
{
|
||||
id: orderId + '-item-3',
|
||||
name: '家属沟通与宣教',
|
||||
required: false,
|
||||
completed: false,
|
||||
incompleteReason: '',
|
||||
remark: '',
|
||||
updatedAt: ''
|
||||
} as DeliveryServiceItemType
|
||||
]
|
||||
}
|
||||
|
||||
function createProfile(): DeliveryInfoType {
|
||||
return {
|
||||
id: 'mock-staff-001',
|
||||
userId: 'mock-delivery-user-001',
|
||||
staffNo: 'CARE-202605-001',
|
||||
name: '陈护理',
|
||||
phone: '13600001111',
|
||||
role: 'care_worker',
|
||||
status: 'active',
|
||||
organizationId: 'org-care-001',
|
||||
organizationName: '梅江区居家康护中心',
|
||||
certificates: [] as Array<any>,
|
||||
certificateStatus: 'valid',
|
||||
certificateExpireAt: '2027-12-31',
|
||||
onlineStatus: 'online',
|
||||
serviceArea: '梅江区 / 梅县区',
|
||||
skills: ['上门助浴', '康复陪护', '慢病随访', '居家照护'],
|
||||
avatarUrl: '',
|
||||
todayAccepted: 2,
|
||||
todayServing: 1,
|
||||
todayCompleted: 1,
|
||||
usesMock: true
|
||||
} as DeliveryInfoType
|
||||
}
|
||||
|
||||
function createOrder(
|
||||
orderId: string,
|
||||
serviceName: string,
|
||||
serviceType: string,
|
||||
status: DeliveryOrderStatus,
|
||||
appointmentTime: string,
|
||||
duration: number,
|
||||
price: number,
|
||||
staffIncome: number,
|
||||
elderName: string,
|
||||
elderGender: string,
|
||||
elderAge: number,
|
||||
elderPhone: string,
|
||||
contactName: string,
|
||||
contactPhone: string,
|
||||
contactRelation: string,
|
||||
address: string,
|
||||
addressDetail: string,
|
||||
distance: string,
|
||||
riskTags: Array<string>,
|
||||
healthTags: Array<string>,
|
||||
needFamilyPresent: boolean,
|
||||
needMaterials: boolean,
|
||||
remark: string
|
||||
): DeliveryOrderType {
|
||||
const statusText = createStatusText(status)
|
||||
const items = createServiceItems(orderId)
|
||||
return {
|
||||
id: orderId,
|
||||
orderNo: 'CARE-' + orderId.toUpperCase(),
|
||||
serviceType,
|
||||
serviceName,
|
||||
serviceCategory: serviceType,
|
||||
serviceItems: items,
|
||||
serviceContentOptions: ['基础护理', '生命体征监测', '安全巡视', '家属沟通'],
|
||||
elderId: 'elder-' + orderId,
|
||||
elderName,
|
||||
elderNameMasked: elderName.substring(0, 1) + '**',
|
||||
elderGender,
|
||||
elderAge,
|
||||
elderPhone,
|
||||
elderPhoneMasked: elderPhone.substring(0, 3) + '****' + elderPhone.substring(elderPhone.length - 4),
|
||||
fullElderName: elderName,
|
||||
fullPhone: elderPhone,
|
||||
contactName,
|
||||
contactPhone,
|
||||
contactRelation,
|
||||
addressSummary: address,
|
||||
address,
|
||||
addressDetail,
|
||||
fullAddress: address + ' ' + addressDetail,
|
||||
latitude: 24.2898,
|
||||
longitude: 116.1179,
|
||||
appointmentTime,
|
||||
appointmentStartTime: appointmentTime,
|
||||
appointmentEndTime: appointmentTime,
|
||||
duration,
|
||||
estimatedDuration: duration,
|
||||
price,
|
||||
staffIncome,
|
||||
distance,
|
||||
actualStartTime: '',
|
||||
actualEndTime: '',
|
||||
status,
|
||||
statusText,
|
||||
statusTone: createStatusTone(status),
|
||||
riskTags,
|
||||
healthTags,
|
||||
careLevel: '护理二级',
|
||||
needFamilyPresent,
|
||||
needMaterials,
|
||||
remark,
|
||||
merchantId: 'merchant-care-001',
|
||||
merchantName: '梅江区居家康护中心',
|
||||
deliveryStaffId: 'mock-staff-001',
|
||||
deliveryStaffName: '陈护理',
|
||||
acceptTime: '',
|
||||
rejectTime: '',
|
||||
departTime: '',
|
||||
arriveTime: '',
|
||||
checkinTime: '',
|
||||
startServiceTime: '',
|
||||
finishTime: '',
|
||||
cancelReason: '',
|
||||
exceptionType: '',
|
||||
exceptionDesc: '',
|
||||
evidenceList: [] as Array<any>,
|
||||
signatureUrl: '',
|
||||
signatureName: '',
|
||||
satisfactionStatus: '待确认',
|
||||
settlementStatus: '待结算',
|
||||
archiveStatus: '未归档',
|
||||
createdAt: nowText(),
|
||||
updatedAt: nowText(),
|
||||
notices: ['请提前 15 分钟电话联系', '如遇突发异常先上报再处置'],
|
||||
timeline: [createTimeline('订单已生成', '平台已生成上门服务订单')],
|
||||
statusLog: [createStatusLog(orderId, status, status, '初始化 mock 订单')],
|
||||
serviceSummary: '',
|
||||
progressNote: '',
|
||||
distanceKm: distance,
|
||||
allowCheckinRadiusMeters: 120,
|
||||
lastLocation: null,
|
||||
trackPoints: [] as Array<DeliveryLocationType>,
|
||||
serviceRecord: null,
|
||||
abnormalReport: null
|
||||
} as DeliveryOrderType
|
||||
}
|
||||
|
||||
function createDefaultOrders(): Array<DeliveryOrderType> {
|
||||
const orders = [
|
||||
createOrder('mock-care-001', '上门助浴', '生活照护', 'pending_assignment', '2026-05-20 09:00', 90, 199, 128, '李秀珍', '女', 79, '13800131024', '李晓兰', '13900139000', '女儿', '梅江区江南路 18 号', '2 栋 602 室', '2.4km', ['高龄', '行动不便'], ['高血压'], true, true, '请准备防滑垫和浴后保暖衣物'),
|
||||
createOrder('mock-care-002', '康复陪护', '康复护理', 'pending_assignment', '2026-05-20 10:30', 120, 260, 160, '张志坤', '男', 83, '13700132233', '张春梅', '13600136666', '女儿', '梅县区新城锦绣花园 5 栋', '1403 室', '5.8km', ['需家属在场'], ['术后恢复'], true, true, '需携带弹力带与康复手册'),
|
||||
createOrder('mock-care-003', '陪诊服务', '陪诊陪护', 'accepted', '2026-05-20 13:00', 180, 320, 220, '黄玉英', '女', 76, '13500135566', '黄晓娟', '13500130088', '女儿', '梅江区学海路康养公寓 A 座', '907 室', '1.1km', ['高龄'], ['糖尿病'], false, false, '就诊前需先核对病历资料'),
|
||||
createOrder('mock-care-004', '慢病随访', '健康管理', 'departed', '2026-05-20 14:30', 60, 168, 108, '陈国辉', '男', 81, '13900133301', '陈丽芳', '13800136660', '妻子', '梅县区扶老社区 11 栋', '203 室', '3.6km', ['行动不便'], ['高血压', '冠心病'], false, true, '重点测量血压并复核药盒'),
|
||||
createOrder('mock-care-005', '居家照护', '长期照护', 'in_service', '2026-05-20 15:00', 120, 288, 190, '王月兰', '女', 87, '13400137744', '王秀玲', '13600139922', '女儿', '梅江区东汇城旁康颐楼 3 单元', '1204 室', '4.2km', ['失能', '需家属在场'], ['血糖异常'], true, true, '服务中注意翻身护理与进食观察'),
|
||||
createOrder('mock-care-006', '上门护理', '护理服务', 'completed', '2026-05-19 16:00', 90, 230, 150, '刘建华', '男', 72, '13300136655', '刘敏', '13300998877', '儿子', '梅江区和顺苑 9 栋', '401 室', '6.0km', ['术后恢复'], ['低蛋白'], false, false, '完成换药与术后宣教')
|
||||
]
|
||||
orders[2].acceptTime = '2026-05-20 11:40:00'
|
||||
orders[2].timeline.unshift(createTimeline('已接单', '服务人员已确认接单'))
|
||||
orders[2].statusLog.unshift(createStatusLog(orders[2].id, 'pending_assignment', 'accepted', '手动接单'))
|
||||
orders[3].acceptTime = '2026-05-20 12:00:00'
|
||||
orders[3].departTime = '2026-05-20 13:58:00'
|
||||
orders[3].timeline.unshift(createTimeline('已出发', '服务人员已从机构出发'))
|
||||
orders[3].statusLog.unshift(createStatusLog(orders[3].id, 'accepted', 'departed', '已出发'))
|
||||
orders[4].acceptTime = '2026-05-20 13:00:00'
|
||||
orders[4].departTime = '2026-05-20 14:00:00'
|
||||
orders[4].arriveTime = '2026-05-20 14:40:00'
|
||||
orders[4].checkinTime = '2026-05-20 14:45:00'
|
||||
orders[4].startServiceTime = '2026-05-20 14:50:00'
|
||||
orders[4].actualStartTime = '2026-05-20 14:50:00'
|
||||
orders[4].serviceItems[0].completed = true
|
||||
orders[4].serviceItems[0].remark = '血压 132/82,心率 76 次/分'
|
||||
orders[4].serviceItems[0].updatedAt = '2026-05-20 15:10:00'
|
||||
orders[4].timeline.unshift(createTimeline('开始服务', '已进入服务执行阶段'))
|
||||
orders[4].statusLog.unshift(createStatusLog(orders[4].id, 'checked_in', 'in_service', '开始服务'))
|
||||
orders[5].acceptTime = '2026-05-19 14:30:00'
|
||||
orders[5].departTime = '2026-05-19 15:10:00'
|
||||
orders[5].arriveTime = '2026-05-19 15:48:00'
|
||||
orders[5].checkinTime = '2026-05-19 15:52:00'
|
||||
orders[5].startServiceTime = '2026-05-19 15:55:00'
|
||||
orders[5].finishTime = '2026-05-19 17:18:00'
|
||||
orders[5].actualStartTime = '2026-05-19 15:55:00'
|
||||
orders[5].actualEndTime = '2026-05-19 17:18:00'
|
||||
orders[5].serviceSummary = '已完成换药、伤口巡视和家属宣教。'
|
||||
orders[5].serviceRecord = {
|
||||
id: 'record-' + orders[5].id,
|
||||
orderId: orders[5].id,
|
||||
startTime: '2026-05-19 15:55:00',
|
||||
endTime: '2026-05-19 17:18:00',
|
||||
actualDurationMinutes: 83,
|
||||
serviceItems: orders[5].serviceItems,
|
||||
serviceContent: ['换药护理', '伤口观察', '家属宣教'],
|
||||
processNote: '服务过程平稳,老人配合良好。',
|
||||
elderStatus: '精神状态稳定,伤口恢复良好。',
|
||||
healthMetrics: {
|
||||
bloodPressure: '126/80',
|
||||
heartRate: '74',
|
||||
bloodSugar: '',
|
||||
bloodOxygen: '98'
|
||||
},
|
||||
materialsUsed: '无菌敷料 2 片,棉签 4 支',
|
||||
abnormalNote: '',
|
||||
photos: ['mock-photo-1'],
|
||||
staffRemark: '建议继续保持每日换药。',
|
||||
familyConfirmation: {
|
||||
method: 'sms_code',
|
||||
code: '652318',
|
||||
signatureName: '刘敏',
|
||||
signatureUrl: '',
|
||||
confirmedAt: '2026-05-19 17:20:00'
|
||||
},
|
||||
createdAt: '2026-05-19 17:18:00',
|
||||
updatedAt: '2026-05-19 17:18:00'
|
||||
} as DeliveryServiceRecordType
|
||||
return orders
|
||||
}
|
||||
|
||||
function readProfileStore(): DeliveryInfoType {
|
||||
const cached = uni.getStorageSync(PROFILE_KEY) as DeliveryInfoType | null
|
||||
if (cached != null && cached.id != null && cached.id != '') {
|
||||
return cloneProfile(cached)
|
||||
}
|
||||
const created = createProfile()
|
||||
uni.setStorageSync(PROFILE_KEY, cloneProfile(created))
|
||||
return created
|
||||
}
|
||||
|
||||
function writeProfileStore(profile: DeliveryInfoType): DeliveryInfoType {
|
||||
uni.setStorageSync(PROFILE_KEY, cloneProfile(profile))
|
||||
return profile
|
||||
}
|
||||
|
||||
function readOrderStore(): Array<DeliveryOrderType> {
|
||||
const cached = uni.getStorageSync(ORDER_KEY) as Array<DeliveryOrderType> | null
|
||||
if (cached != null && cached.length > 0) {
|
||||
return cloneOrders(cached)
|
||||
}
|
||||
const created = createDefaultOrders()
|
||||
uni.setStorageSync(ORDER_KEY, cloneOrders(created))
|
||||
return created
|
||||
}
|
||||
|
||||
function writeOrderStore(orders: Array<DeliveryOrderType>): Array<DeliveryOrderType> {
|
||||
uni.setStorageSync(ORDER_KEY, cloneOrders(orders))
|
||||
return orders
|
||||
}
|
||||
|
||||
function sortOrdersByAppointment(orders: Array<DeliveryOrderType>): Array<DeliveryOrderType> {
|
||||
return orders.sort((left, right) => left.appointmentTime.localeCompare(right.appointmentTime))
|
||||
}
|
||||
|
||||
function isPendingStatus(status: DeliveryOrderStatus): boolean {
|
||||
return status == 'pending_assignment' || status == 'pending_accept'
|
||||
}
|
||||
|
||||
function isHistoryStatus(status: DeliveryOrderStatus): boolean {
|
||||
return status == 'completed' || status == 'rejected' || status == 'cancelled' || status == 'abnormal' || status == 'terminated' || status == 'archived'
|
||||
}
|
||||
|
||||
function isTodayStatus(status: DeliveryOrderStatus): boolean {
|
||||
return !isPendingStatus(status) && !isHistoryStatus(status)
|
||||
}
|
||||
|
||||
function refreshOrderMeta(order: DeliveryOrderType): void {
|
||||
order.statusText = createStatusText(order.status)
|
||||
order.statusTone = createStatusTone(order.status)
|
||||
order.updatedAt = nowText()
|
||||
order.distanceKm = order.distance
|
||||
order.fullAddress = order.address + ' ' + order.addressDetail
|
||||
order.fullElderName = order.elderName
|
||||
order.fullPhone = order.elderPhone
|
||||
order.elderNameMasked = order.elderName.substring(0, 1) + '**'
|
||||
order.elderPhoneMasked = order.elderPhone.substring(0, 3) + '****' + order.elderPhone.substring(order.elderPhone.length - 4)
|
||||
order.timeline.unshift(createTimeline(order.statusText, '订单状态已更新为' + order.statusText))
|
||||
}
|
||||
|
||||
function findOrderIndex(orders: Array<DeliveryOrderType>, orderId: string): number {
|
||||
for (let i = 0; i < orders.length; i++) {
|
||||
if (orders[i].id == orderId) {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
export function getDeliveryCareProfile(): DeliveryInfoType {
|
||||
return readProfileStore()
|
||||
}
|
||||
|
||||
export function updateDeliveryCareOnlineStatus(status: DeliveryOnlineStatus): DeliveryInfoType {
|
||||
const profile = readProfileStore()
|
||||
profile.onlineStatus = status
|
||||
return cloneProfile(writeProfileStore(profile))
|
||||
}
|
||||
|
||||
export function getDeliveryCareDashboard(): DeliveryDashboardType {
|
||||
const profile = readProfileStore()
|
||||
const orders = sortOrdersByAppointment(readOrderStore())
|
||||
let pendingCount = 0
|
||||
let todayCount = 0
|
||||
let pendingDepartCount = 0
|
||||
let servingCount = 0
|
||||
let completedCount = 0
|
||||
let exceptionCount = 0
|
||||
let expectedIncome = 0
|
||||
let nextOrder: DeliveryOrderType | null = null
|
||||
const recentOrders: Array<DeliveryOrderType> = []
|
||||
for (let i = 0; i < orders.length; i++) {
|
||||
const item = orders[i]
|
||||
if (isPendingStatus(item.status)) {
|
||||
pendingCount += 1
|
||||
}
|
||||
if (isTodayStatus(item.status) || item.status == 'completed') {
|
||||
todayCount += 1
|
||||
}
|
||||
if (item.status == 'accepted' || item.status == 'waiting_departure') {
|
||||
pendingDepartCount += 1
|
||||
}
|
||||
if (item.status == 'in_service' || item.status == 'serving') {
|
||||
servingCount += 1
|
||||
}
|
||||
if (item.status == 'completed') {
|
||||
completedCount += 1
|
||||
}
|
||||
if (item.status == 'abnormal' || item.status == 'exception_pending') {
|
||||
exceptionCount += 1
|
||||
}
|
||||
if (!isHistoryStatus(item.status) && item.status != 'rejected' && item.status != 'cancelled') {
|
||||
expectedIncome += item.staffIncome
|
||||
}
|
||||
if (nextOrder == null && !isHistoryStatus(item.status)) {
|
||||
nextOrder = cloneOrder(item)
|
||||
}
|
||||
if (recentOrders.length < 4) {
|
||||
recentOrders.push(cloneOrder(item))
|
||||
}
|
||||
}
|
||||
profile.todayAccepted = pendingDepartCount
|
||||
profile.todayServing = servingCount
|
||||
profile.todayCompleted = completedCount
|
||||
writeProfileStore(profile)
|
||||
return {
|
||||
pendingAssignmentCount: pendingCount,
|
||||
pendingAcceptCount: pendingCount,
|
||||
todayOrderCount: todayCount,
|
||||
pendingDepartCount,
|
||||
servingCount,
|
||||
completedCount,
|
||||
exceptionCount,
|
||||
expectedIncome,
|
||||
onlineStatus: profile.onlineStatus,
|
||||
nextOrder,
|
||||
recentOrders
|
||||
} as DeliveryDashboardType
|
||||
}
|
||||
|
||||
export function getPendingCareOrders(): Array<DeliveryOrderType> {
|
||||
const orders = sortOrdersByAppointment(readOrderStore())
|
||||
const result: Array<DeliveryOrderType> = []
|
||||
for (let i = 0; i < orders.length; i++) {
|
||||
if (isPendingStatus(orders[i].status)) {
|
||||
result.push(cloneOrder(orders[i]))
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
export function getTodayCareOrders(): Array<DeliveryOrderType> {
|
||||
const orders = sortOrdersByAppointment(readOrderStore())
|
||||
const result: Array<DeliveryOrderType> = []
|
||||
for (let i = 0; i < orders.length; i++) {
|
||||
if (isTodayStatus(orders[i].status)) {
|
||||
result.push(cloneOrder(orders[i]))
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
export function getHistoryCareOrders(): Array<DeliveryOrderType> {
|
||||
const orders = sortOrdersByAppointment(readOrderStore())
|
||||
const result: Array<DeliveryOrderType> = []
|
||||
for (let i = 0; i < orders.length; i++) {
|
||||
if (isHistoryStatus(orders[i].status)) {
|
||||
result.push(cloneOrder(orders[i]))
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
export function getCareOrderDetail(orderId: string): DeliveryOrderType | null {
|
||||
const orders = readOrderStore()
|
||||
const index = findOrderIndex(orders, orderId)
|
||||
if (index < 0) {
|
||||
return null
|
||||
}
|
||||
return cloneOrder(orders[index])
|
||||
}
|
||||
|
||||
export function updateCareOrderStatus(orderId: string, nextStatus: DeliveryOrderStatus, remark: string): DeliveryOrderType | null {
|
||||
const orders = readOrderStore()
|
||||
const index = findOrderIndex(orders, orderId)
|
||||
if (index < 0) {
|
||||
return null
|
||||
}
|
||||
const target = orders[index]
|
||||
const fromStatus = target.status
|
||||
target.status = nextStatus
|
||||
if (nextStatus == 'accepted') {
|
||||
target.acceptTime = nowText()
|
||||
}
|
||||
if (nextStatus == 'rejected') {
|
||||
target.rejectTime = nowText()
|
||||
}
|
||||
if (nextStatus == 'departed') {
|
||||
target.departTime = nowText()
|
||||
}
|
||||
if (nextStatus == 'arrived') {
|
||||
target.arriveTime = nowText()
|
||||
}
|
||||
if (nextStatus == 'checked_in') {
|
||||
target.checkinTime = nowText()
|
||||
}
|
||||
if (nextStatus == 'in_service') {
|
||||
target.startServiceTime = nowText()
|
||||
target.actualStartTime = target.startServiceTime != null ? target.startServiceTime : nowText()
|
||||
}
|
||||
if (nextStatus == 'completed') {
|
||||
target.finishTime = nowText()
|
||||
target.actualEndTime = target.finishTime
|
||||
}
|
||||
target.statusLog.unshift(createStatusLog(orderId, fromStatus, nextStatus, remark))
|
||||
refreshOrderMeta(target)
|
||||
writeOrderStore(orders)
|
||||
return cloneOrder(target)
|
||||
}
|
||||
|
||||
export function acceptCareOrder(orderId: string): DeliveryOrderType | null {
|
||||
return updateCareOrderStatus(orderId, 'accepted', '接单成功')
|
||||
}
|
||||
|
||||
export function rejectCareOrder(orderId: string, reason: string): DeliveryOrderType | null {
|
||||
const order = updateCareOrderStatus(orderId, 'rejected', reason)
|
||||
if (order != null) {
|
||||
const orders = readOrderStore()
|
||||
const index = findOrderIndex(orders, orderId)
|
||||
if (index >= 0) {
|
||||
orders[index].cancelReason = reason
|
||||
writeOrderStore(orders)
|
||||
return cloneOrder(orders[index])
|
||||
}
|
||||
}
|
||||
return order
|
||||
}
|
||||
|
||||
export function markCareOrderDeparted(orderId: string): DeliveryOrderType | null {
|
||||
return updateCareOrderStatus(orderId, 'departed', '服务人员已出发')
|
||||
}
|
||||
|
||||
export function markCareOrderArrived(orderId: string): DeliveryOrderType | null {
|
||||
return updateCareOrderStatus(orderId, 'arrived', '服务人员已到达')
|
||||
}
|
||||
|
||||
export function checkInCareOrder(orderId: string, location: DeliveryLocationType | null, note: string): DeliveryOrderType | null {
|
||||
const order = updateCareOrderStatus(orderId, 'checked_in', note != '' ? note : '到达签到')
|
||||
if (order == null) {
|
||||
return null
|
||||
}
|
||||
const orders = readOrderStore()
|
||||
const index = findOrderIndex(orders, orderId)
|
||||
if (index >= 0) {
|
||||
orders[index].lastLocation = location
|
||||
writeOrderStore(orders)
|
||||
return cloneOrder(orders[index])
|
||||
}
|
||||
return order
|
||||
}
|
||||
|
||||
export function startCareService(orderId: string): DeliveryOrderType | null {
|
||||
return updateCareOrderStatus(orderId, 'in_service', '开始服务')
|
||||
}
|
||||
|
||||
export function submitCareServiceRecord(orderId: string, record: DeliveryServiceRecordType): DeliveryOrderType | null {
|
||||
const orders = readOrderStore()
|
||||
const index = findOrderIndex(orders, orderId)
|
||||
if (index < 0) {
|
||||
return null
|
||||
}
|
||||
orders[index].serviceRecord = cloneOrder({
|
||||
...orders[index],
|
||||
serviceRecord: record
|
||||
} as DeliveryOrderType).serviceRecord
|
||||
orders[index].serviceSummary = record.processNote
|
||||
orders[index].progressNote = record.staffRemark
|
||||
orders[index].serviceItems = record.serviceItems
|
||||
orders[index].status = 'pending_confirm'
|
||||
orders[index].statusLog.unshift(createStatusLog(orderId, 'in_service', 'pending_confirm', '已提交服务记录'))
|
||||
refreshOrderMeta(orders[index])
|
||||
writeOrderStore(orders)
|
||||
return cloneOrder(orders[index])
|
||||
}
|
||||
|
||||
export function completeCareOrder(orderId: string): DeliveryOrderType | null {
|
||||
const orders = readOrderStore()
|
||||
const index = findOrderIndex(orders, orderId)
|
||||
if (index < 0) {
|
||||
return null
|
||||
}
|
||||
if (orders[index].serviceRecord == null) {
|
||||
return null
|
||||
}
|
||||
orders[index].statusLog.unshift(createStatusLog(orderId, orders[index].status, 'completed', '完成服务'))
|
||||
orders[index].status = 'completed'
|
||||
orders[index].finishTime = nowText()
|
||||
orders[index].actualEndTime = orders[index].finishTime
|
||||
refreshOrderMeta(orders[index])
|
||||
writeOrderStore(orders)
|
||||
return cloneOrder(orders[index])
|
||||
}
|
||||
|
||||
export function submitCareAbnormalReport(orderId: string, payload: DeliveryExceptionPayloadType): DeliveryOrderType | null {
|
||||
const orders = readOrderStore()
|
||||
const index = findOrderIndex(orders, orderId)
|
||||
if (index < 0) {
|
||||
return null
|
||||
}
|
||||
orders[index].abnormalReport = {
|
||||
id: 'abnormal-' + orderId,
|
||||
orderId,
|
||||
type: payload.exceptionType,
|
||||
description: payload.description,
|
||||
occurredAt: payload.occurredAt != null ? payload.occurredAt : nowText(),
|
||||
locationText: payload.locationText != null ? payload.locationText : '当前位置 mock',
|
||||
images: payload.images,
|
||||
needPlatformIntervention: payload.needPlatformIntervention === true,
|
||||
requestCancelOrder: payload.requestCancelOrder === true,
|
||||
requestReschedule: payload.requestReschedule === true,
|
||||
createdAt: nowText()
|
||||
} as DeliveryAbnormalReportType
|
||||
orders[index].exceptionType = payload.exceptionType
|
||||
orders[index].exceptionDesc = payload.description
|
||||
orders[index].statusLog.unshift(createStatusLog(orderId, orders[index].status, 'abnormal', '提交异常上报'))
|
||||
orders[index].status = 'abnormal'
|
||||
refreshOrderMeta(orders[index])
|
||||
writeOrderStore(orders)
|
||||
return cloneOrder(orders[index])
|
||||
}
|
||||
|
||||
export function getCareRecords(): Array<DeliveryRecordType> {
|
||||
const orders = readOrderStore()
|
||||
const result: Array<DeliveryRecordType> = []
|
||||
for (let i = 0; i < orders.length; i++) {
|
||||
const item = orders[i]
|
||||
if (item.serviceRecord != null || item.status == 'completed') {
|
||||
result.push({
|
||||
id: 'record-list-' + item.id,
|
||||
orderId: item.id,
|
||||
orderNo: item.orderNo,
|
||||
serviceName: item.serviceName,
|
||||
elderName: item.elderName,
|
||||
elderNameMasked: item.elderNameMasked,
|
||||
status: item.status,
|
||||
statusText: item.statusText,
|
||||
appointmentStartTime: item.appointmentStartTime,
|
||||
appointmentTime: item.appointmentTime,
|
||||
actualStartTime: item.actualStartTime,
|
||||
actualEndTime: item.actualEndTime,
|
||||
staffIncome: item.staffIncome,
|
||||
settlementStatus: item.settlementStatus,
|
||||
acceptanceStatus: item.satisfactionStatus,
|
||||
exceptionDesc: item.exceptionDesc,
|
||||
ratingText: item.satisfactionStatus,
|
||||
hasServiceRecord: item.serviceRecord != null
|
||||
} as DeliveryRecordType)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
export function resetCareOrderStore(): void {
|
||||
uni.removeStorageSync(ORDER_KEY)
|
||||
uni.removeStorageSync(PROFILE_KEY)
|
||||
}
|
||||
Reference in New Issue
Block a user