Files
medical-mall/services/homeServiceService.uts
2026-05-14 15:28:09 +08:00

866 lines
26 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import {
HomeServiceAcceptanceType,
HomeServiceAdminApplicationType,
HomeServiceAssessmentType,
HomeServiceApplicationDraftType,
HomeServiceCatalogType,
HomeServiceCaseType,
HomeServiceOverviewCardType,
HomeServicePlanType,
HomeServiceRectificationType,
HomeServiceSettlementType,
HomeServiceTaskType,
HomeServiceTimelineItemType
} from '@/types/home-service.uts'
const SERVICE_CATALOG: Array<HomeServiceCatalogType> = [
{
id: 'svc-001',
name: '基础上门护理',
category: '日常照护',
price: 168,
durationText: '约 2 小时',
summary: '覆盖生命体征监测、基础照护、风险提醒。',
tags: ['适老化', '护理员上门', '支持家属陪同'],
suitableFor: '行动不便、术后恢复、慢病随访老人'
},
{
id: 'svc-002',
name: '康复训练指导',
category: '康复支持',
price: 260,
durationText: '约 3 小时',
summary: '提供肢体训练、步态练习和居家康复建议。',
tags: ['康复师', '步骤清晰', '可连续预约'],
suitableFor: '卒中恢复、术后康复、失能半失能老人'
},
{
id: 'svc-003',
name: '慢病健康随访',
category: '健康管理',
price: 128,
durationText: '约 90 分钟',
summary: '完成血压血糖监测、用药核对与健康宣教。',
tags: ['随访', '慢病', '可生成记录'],
suitableFor: '高血压、糖尿病等长期管理老人'
}
]
function createTimeline(title1: string, title2: string, title3: string): Array<HomeServiceTimelineItemType> {
return [
{
id: 'tl-1',
title: title1,
time: '2026-05-12 09:00',
description: '系统已建立服务申请档案。'
},
{
id: 'tl-2',
title: title2,
time: '2026-05-12 11:30',
description: '评估员已完成初步核对与上门安排。'
},
{
id: 'tl-3',
title: title3,
time: '2026-05-13 08:20',
description: '当前环节已进入待执行状态。'
}
]
}
const CASE_STORE: Array<HomeServiceCaseType> = [
{
id: 'case-001',
caseNo: 'HS202605130001',
status: 'pending_dispatch',
statusText: '待派单',
statusTone: 'warning',
serviceName: '基础上门护理',
serviceTime: '2026-05-14 09:00-11:00',
applicantName: '李晓兰',
elderName: '李奶奶',
age: 78,
phone: '13800138000',
address: '梅州市梅江区学海路 18 号 2 栋 602',
summary: '老人近期行动困难,需要基础照护与生命体征监测。',
currentStep: 3,
totalSteps: 8,
staffName: '待分配',
staffPhone: '待分配',
amount: 168,
timeline: createTimeline('已提交申请', '待上门评估', '待派单')
},
{
id: 'case-002',
caseNo: 'HS202605130002',
status: 'in_service',
statusText: '服务中',
statusTone: 'primary',
serviceName: '慢病健康随访',
serviceTime: '2026-05-13 15:00-16:30',
applicantName: '张春梅',
elderName: '张爷爷',
age: 82,
phone: '13900139000',
address: '梅州市梅县区华侨城康宁路 66 号',
summary: '随访血压血糖,核对用药并记录健康建议。',
currentStep: 6,
totalSteps: 8,
staffName: '陈护理',
staffPhone: '13688886666',
amount: 128,
timeline: createTimeline('已提交申请', '已生成服务方案', '服务执行中')
}
]
const TASK_STORE: Array<HomeServiceTaskType> = [
{
id: 'task-001',
caseId: 'case-001',
caseNo: 'HS202605130001',
status: 'pending_visit',
statusText: '待上门',
statusTone: 'warning',
serviceName: '基础上门护理',
elderName: '李奶奶',
address: '梅州市梅江区学海路 18 号 2 栋 602',
appointmentTime: '2026-05-14 09:00',
checkInStatus: '未签到',
recordSummary: '待填写服务记录',
staffName: '黄护理',
staffPhone: '13777770001',
actionText: '签到开始',
timeline: createTimeline('调度已派单', '护理员已接单', '等待上门签到')
},
{
id: 'task-002',
caseId: 'case-002',
caseNo: 'HS202605130002',
status: 'serving',
statusText: '服务中',
statusTone: 'primary',
serviceName: '慢病健康随访',
elderName: '张爷爷',
address: '梅州市梅县区华侨城康宁路 66 号',
appointmentTime: '2026-05-13 15:00',
checkInStatus: '已签到',
recordSummary: '已完成血压血糖记录,待补充宣教备注。',
staffName: '陈护理',
staffPhone: '13688886666',
actionText: '完成提交',
timeline: createTimeline('调度已派单', '已到岗签到', '服务执行中')
}
]
const ADMIN_APPLICATIONS: Array<HomeServiceAdminApplicationType> = [
{
id: 'admin-app-001',
caseId: 'case-001',
caseNo: 'HS202605130001',
status: 'pending_assessment',
statusText: '待评估',
statusTone: 'warning',
elderName: '李奶奶',
serviceName: '基础上门护理',
preferredTime: '2026-05-14 上午',
assessmentResult: '待评估员上门',
dispatcherName: '刘调度',
staffName: '待分配'
},
{
id: 'admin-app-002',
caseId: 'case-002',
caseNo: 'HS202605130002',
status: 'pending_acceptance',
statusText: '待验收',
statusTone: 'success',
elderName: '张爷爷',
serviceName: '慢病健康随访',
preferredTime: '2026-05-13 下午',
assessmentResult: '评估通过,按标准随访执行',
dispatcherName: '刘调度',
staffName: '陈护理'
}
]
const ADMIN_OVERVIEW: Array<HomeServiceOverviewCardType> = [
{ id: 'overview-1', label: '待评估申请', value: '06', tone: 'warning' },
{ id: 'overview-2', label: '待派单工单', value: '03', tone: 'primary' },
{ id: 'overview-3', label: '服务中任务', value: '08', tone: 'success' },
{ id: 'overview-4', label: '待验收任务', value: '04', tone: 'neutral' }
]
const ADMIN_ASSESSMENTS: Array<HomeServiceAssessmentType> = [
{
caseId: 'case-001',
caseNo: 'HS202605130001',
elderName: '李奶奶',
serviceName: '基础上门护理',
riskLevel: '中风险',
careLevel: '护理二级',
visitTime: '2026-05-14 09:00',
assessmentSummary: '行动缓慢,需重点关注跌倒风险和晨间血压波动。',
requirementTags: ['血压监测', '基础照护', '跌倒风险提醒']
},
{
caseId: 'case-002',
caseNo: 'HS202605130002',
elderName: '张爷爷',
serviceName: '慢病健康随访',
riskLevel: '低风险',
careLevel: '随访管理',
visitTime: '2026-05-13 15:00',
assessmentSummary: '生命体征稳定,重点跟踪慢病用药执行情况。',
requirementTags: ['血糖记录', '用药核对', '家属宣教']
}
]
const ADMIN_PLANS: Array<HomeServicePlanType> = [
{
caseId: 'case-001',
caseNo: 'HS202605130001',
elderName: '李奶奶',
serviceName: '基础上门护理',
planTitle: '基础护理 7 日方案',
serviceFrequency: '每周 3 次',
serviceCycle: '2026-05-14 至 2026-05-21',
executorAdvice: '优先安排熟悉慢病照护的护理员,首次上门同步评估跌倒风险。',
billingSummary: '基础护理 ¥168/次,计划总额 ¥504',
planSummary: '围绕晨间照护、生命体征监测和风险提醒开展服务。'
},
{
caseId: 'case-002',
caseNo: 'HS202605130002',
elderName: '张爷爷',
serviceName: '慢病健康随访',
planTitle: '慢病随访连续方案',
serviceFrequency: '每周 2 次',
serviceCycle: '2026-05-13 至 2026-05-27',
executorAdvice: '执行人员需同步上传血压血糖记录并完成家属宣教。',
billingSummary: '随访服务 ¥128/次,计划总额 ¥512',
planSummary: '持续随访血压血糖、用药和饮食管理情况。'
}
]
const CONSUMER_ACCEPTANCE: Array<HomeServiceAcceptanceType> = [
{
caseId: 'case-001',
caseNo: 'HS202605130001',
elderName: '李奶奶',
serviceName: '基础上门护理',
acceptanceStatus: 'waiting',
acceptanceStatusText: '待验收',
rating: 5,
feedback: '护理员按时到达,服务过程清晰,老人状态稳定。',
tags: ['准时上门', '沟通清楚', '动作规范']
},
{
caseId: 'case-002',
caseNo: 'HS202605130002',
elderName: '张爷爷',
serviceName: '慢病健康随访',
acceptanceStatus: 'waiting',
acceptanceStatusText: '待验收',
rating: 5,
feedback: '已查看记录,等待家属最终确认。',
tags: ['记录完整', '态度耐心']
}
]
const ADMIN_RECTIFICATIONS: Array<HomeServiceRectificationType> = [
{
caseId: 'case-001',
caseNo: 'HS202605130001',
elderName: '李奶奶',
serviceName: '基础上门护理',
issueSummary: '家属要求补充护理动作说明和现场照片留痕。',
deadline: '2026-05-14 18:00',
ownerName: '黄护理',
status: 'pending',
statusText: '待整改'
},
{
caseId: 'case-002',
caseNo: 'HS202605130002',
elderName: '张爷爷',
serviceName: '慢病健康随访',
issueSummary: '记录完整,无需整改。',
deadline: '2026-05-15 12:00',
ownerName: '陈护理',
status: 'closed',
statusText: '已关闭'
}
]
const ADMIN_SETTLEMENTS: Array<HomeServiceSettlementType> = [
{
caseId: 'case-001',
caseNo: 'HS202605130001',
elderName: '李奶奶',
serviceName: '基础上门护理',
billingPeriod: '2026-05-14 至 2026-05-21',
totalAmount: '¥504',
insuranceAmount: '¥300',
selfPayAmount: '¥204',
archiveStatus: 'pending',
archiveStatusText: '待归档'
},
{
caseId: 'case-002',
caseNo: 'HS202605130002',
elderName: '张爷爷',
serviceName: '慢病健康随访',
billingPeriod: '2026-05-13 至 2026-05-27',
totalAmount: '¥512',
insuranceAmount: '¥256',
selfPayAmount: '¥256',
archiveStatus: 'pending',
archiveStatusText: '待归档'
}
]
function delay(): Promise<boolean> {
return new Promise((resolve) => {
setTimeout(() => {
resolve(true)
}, 120)
})
}
function cloneCase(item: HomeServiceCaseType): HomeServiceCaseType {
return {
...item,
timeline: item.timeline.map((log) => ({ ...log }))
}
}
function cloneTask(item: HomeServiceTaskType): HomeServiceTaskType {
return {
...item,
timeline: item.timeline.map((log) => ({ ...log }))
}
}
function cloneAssessment(item: HomeServiceAssessmentType): HomeServiceAssessmentType {
return {
...item,
requirementTags: item.requirementTags.slice(0)
}
}
function clonePlan(item: HomeServicePlanType): HomeServicePlanType {
return {
...item
}
}
function cloneAcceptance(item: HomeServiceAcceptanceType): HomeServiceAcceptanceType {
return {
...item,
tags: item.tags.slice(0)
}
}
function cloneRectification(item: HomeServiceRectificationType): HomeServiceRectificationType {
return {
...item
}
}
function cloneSettlement(item: HomeServiceSettlementType): HomeServiceSettlementType {
return {
...item
}
}
export async function fetchHomeServiceCatalog(): Promise<Array<HomeServiceCatalogType>> {
await delay()
return SERVICE_CATALOG.map((item) => ({ ...item, tags: item.tags.slice(0) }))
}
export async function fetchConsumerHomeServiceCases(): Promise<Array<HomeServiceCaseType>> {
await delay()
return CASE_STORE.map((item) => cloneCase(item))
}
export async function fetchConsumerHomeServiceCaseDetail(caseId: string): Promise<HomeServiceCaseType | null> {
await delay()
const target = CASE_STORE.find((item) => item.id == caseId)
return target == null ? null : cloneCase(target)
}
export async function createHomeServiceApplication(draft: HomeServiceApplicationDraftType): Promise<HomeServiceCaseType> {
await delay()
const matchedService = SERVICE_CATALOG.find((item) => item.id == draft.serviceId)
const created: HomeServiceCaseType = {
id: 'case-' + String(CASE_STORE.length + 1).padStart(3, '0'),
caseNo: 'HS20260513' + String(CASE_STORE.length + 1).padStart(4, '0'),
status: 'submitted',
statusText: '已提交',
statusTone: 'primary',
serviceName: draft.serviceName,
serviceTime: draft.preferredTime,
applicantName: draft.applicantName,
elderName: draft.elderName,
age: draft.age,
phone: draft.phone,
address: draft.address,
summary: draft.demandSummary,
currentStep: 1,
totalSteps: 8,
staffName: '待分配',
staffPhone: '待分配',
amount: matchedService != null ? matchedService.price : 0,
timeline: [
{
id: 'new-1',
title: '已提交申请',
time: '2026-05-13 10:00',
description: '系统已接收申请,等待受理。'
}
]
}
CASE_STORE.unshift(created)
ADMIN_APPLICATIONS.unshift({
id: 'admin-app-' + String(ADMIN_APPLICATIONS.length + 1).padStart(3, '0'),
caseId: created.id,
caseNo: created.caseNo,
status: 'submitted',
statusText: '已提交',
statusTone: 'primary',
elderName: created.elderName,
serviceName: created.serviceName,
preferredTime: created.serviceTime,
assessmentResult: '待受理',
dispatcherName: '待分配',
staffName: '待分配'
})
return cloneCase(created)
}
export async function fetchWorkerTasks(): Promise<Array<HomeServiceTaskType>> {
await delay()
return TASK_STORE.map((item) => cloneTask(item))
}
export async function fetchWorkerTaskDetail(taskId: string): Promise<HomeServiceTaskType | null> {
await delay()
const target = TASK_STORE.find((item) => item.id == taskId)
return target == null ? null : cloneTask(target)
}
export async function advanceWorkerTask(taskId: string): Promise<HomeServiceTaskType | null> {
await delay()
const target = TASK_STORE.find((item) => item.id == taskId)
if (target == 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: '服务记录和凭证已经提交。'
})
}
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)
}
export async function submitWorkerCheckIn(taskId: string, note: string): Promise<HomeServiceTaskType | null> {
await delay()
const target = TASK_STORE.find((item) => item.id == taskId)
if (target == null) {
return null
}
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)
}
export async function submitWorkerServiceRecord(taskId: string, summary: string): Promise<HomeServiceTaskType | null> {
await delay()
const target = TASK_STORE.find((item) => item.id == taskId)
if (target == 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
})
}
return cloneTask(target)
}
export async function submitWorkerException(taskId: string, exceptionType: string, description: string): Promise<HomeServiceTaskType | null> {
await delay()
const target = TASK_STORE.find((item) => item.id == taskId)
if (target == null) {
return null
}
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)
}
export async function fetchAdminAssessmentDetail(caseId: string): Promise<HomeServiceAssessmentType | null> {
await delay()
const target = ADMIN_ASSESSMENTS.find((item) => item.caseId == caseId)
return target == null ? null : cloneAssessment(target)
}
export async function submitAdminAssessment(caseId: string, riskLevel: string, careLevel: string, assessmentSummary: string): Promise<HomeServiceAssessmentType | null> {
await delay()
const target = ADMIN_ASSESSMENTS.find((item) => item.caseId == caseId)
if (target == 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 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
})
}
return cloneAssessment(target)
}
export async function fetchAdminServicePlanDetail(caseId: string): Promise<HomeServicePlanType | null> {
await delay()
const target = ADMIN_PLANS.find((item) => item.caseId == caseId)
return target == null ? null : clonePlan(target)
}
export async function submitAdminServicePlan(
caseId: string,
planTitle: string,
serviceFrequency: string,
serviceCycle: string,
planSummary: string
): Promise<HomeServicePlanType | null> {
await delay()
const target = ADMIN_PLANS.find((item) => item.caseId == caseId)
if (target == 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 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
})
}
return clonePlan(target)
}
export async function fetchConsumerAcceptanceDetail(caseId: string): Promise<HomeServiceAcceptanceType | null> {
await delay()
const target = CONSUMER_ACCEPTANCE.find((item) => item.caseId == caseId)
return target == null ? null : cloneAcceptance(target)
}
export async function submitConsumerAcceptance(
caseId: string,
approved: boolean,
rating: number,
feedback: string,
tags: Array<string>
): Promise<HomeServiceAcceptanceType | null> {
await delay()
const target = CONSUMER_ACCEPTANCE.find((item) => item.caseId == caseId)
if (target == null) {
return null
}
target.acceptanceStatus = approved ? 'approved' : 'rejected'
target.acceptanceStatusText = approved ? '已验收' : '已退回'
target.rating = rating
target.feedback = feedback
target.tags = tags.slice(0)
const relatedCase = CASE_STORE.find((item) => item.id == caseId)
if (relatedCase != null) {
relatedCase.status = approved ? 'completed' : 'revision_required'
relatedCase.statusText = approved ? '已完成' : '待整改'
relatedCase.statusTone = approved ? 'success' : 'warning'
relatedCase.currentStep = approved ? 8 : 7
relatedCase.timeline.unshift({
id: 'case-accept-' + String(relatedCase.timeline.length + 1),
title: approved ? '家属已验收' : '家属退回整改',
time: '2026-05-13 17:10',
description: feedback
})
}
const relatedAdmin = ADMIN_APPLICATIONS.find((item) => item.caseId == caseId)
if (relatedAdmin != null) {
relatedAdmin.status = approved ? 'completed' : 'revision_required'
relatedAdmin.statusText = approved ? '已完成' : '待整改'
relatedAdmin.statusTone = approved ? 'success' : 'warning'
}
return cloneAcceptance(target)
}
export async function fetchAdminRectificationDetail(caseId: string): Promise<HomeServiceRectificationType | null> {
await delay()
const target = ADMIN_RECTIFICATIONS.find((item) => item.caseId == caseId)
return target == null ? null : cloneRectification(target)
}
export async function submitAdminRectification(caseId: string, issueSummary: string): Promise<HomeServiceRectificationType | null> {
await delay()
const target = ADMIN_RECTIFICATIONS.find((item) => item.caseId == caseId)
if (target == 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 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
})
}
return cloneRectification(target)
}
export async function fetchAdminSettlementDetail(caseId: string): Promise<HomeServiceSettlementType | null> {
await delay()
const target = ADMIN_SETTLEMENTS.find((item) => item.caseId == caseId)
return target == null ? null : cloneSettlement(target)
}
export async function submitAdminSettlementArchive(caseId: string): Promise<HomeServiceSettlementType | null> {
await delay()
const target = ADMIN_SETTLEMENTS.find((item) => item.caseId == caseId)
if (target == null) {
return null
}
target.archiveStatus = 'archived'
target.archiveStatusText = '已归档'
const relatedCase = CASE_STORE.find((item) => item.id == caseId)
if (relatedCase != null) {
relatedCase.timeline.unshift({
id: 'case-settlement-' + String(relatedCase.timeline.length + 1),
title: '结算归档完成',
time: '2026-05-13 18:30',
description: '结算单和执行材料已完成归档。'
})
}
return cloneSettlement(target)
}
export async function fetchAdminHomeServiceApplications(): Promise<Array<HomeServiceAdminApplicationType>> {
await delay()
return ADMIN_APPLICATIONS.map((item) => ({ ...item }))
}
export async function fetchAdminHomeServiceOverview(): Promise<Array<HomeServiceOverviewCardType>> {
await delay()
return ADMIN_OVERVIEW.map((item) => ({ ...item }))
}