From 1cdb5a3311f45606e30a25b2eb7b742ed57506a6 Mon Sep 17 00:00:00 2001 From: xiaoxiao Date: Fri, 18 Jul 2025 17:24:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=82=A3=E8=80=85=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/ets/constants/BasicConstant.ets | 8 + .../src/main/ets/utils/PatientsEntity.ets | 27 ++ .../src/main/ets/utils/TimestampUtil.ets | 10 +- .../main/ets/components/AddFollowPlanComp.ets | 247 +++++++++++++ .../ets/components/AddRecordIllnessComp.ets | 22 ++ .../ets/components/AddScheduleFollowComp.ets | 210 +++++++++++ .../main/ets/components/FollowDetailsComp.ets | 152 ++++++++ .../ets/components/FollowPlanListComp.ets | 312 +++++++++++++++++ .../ets/components/GroupManagementComp.ets | 2 +- .../ets/components/InputFollowContentComp.ets | 48 +++ .../ets/components/InspectionReportComp.ets | 148 ++++++++ .../components/PatientCommonSettingComp.ets | 325 ++++++++++++++++++ .../ets/components/PatientDetailsComp.ets | 32 +- .../ets/components/RecordTheIllnessComp.ets | 183 ++++++++++ .../base/media/follow_add_plan_back.png | Bin 0 -> 2461 bytes .../base/media/follow_add_plan_plan.png | Bin 0 -> 2294 bytes .../base/media/follow_add_plan_suifang.png | Bin 0 -> 2401 bytes .../base/media/follow_delete_plan.png | Bin 0 -> 2062 bytes .../base/media/follow_list_rowLine.png | Bin 0 -> 2146 bytes .../base/media/patients_no_selected.png | Bin 0 -> 2395 bytes .../resources/base/media/record_add_list.png | Bin 0 -> 1061 bytes .../base/media/record_list_default.png | Bin 0 -> 9395 bytes .../base/media/record_list_time_back.png | Bin 0 -> 4064 bytes .../base/media/record_list_time_dian.png | Bin 0 -> 2760 bytes .../main/ets/pages/MinePage/SettingPage.ets | 2 +- 25 files changed, 1721 insertions(+), 7 deletions(-) create mode 100644 features/patient/src/main/ets/components/AddFollowPlanComp.ets create mode 100644 features/patient/src/main/ets/components/AddRecordIllnessComp.ets create mode 100644 features/patient/src/main/ets/components/AddScheduleFollowComp.ets create mode 100644 features/patient/src/main/ets/components/FollowDetailsComp.ets create mode 100644 features/patient/src/main/ets/components/FollowPlanListComp.ets create mode 100644 features/patient/src/main/ets/components/InputFollowContentComp.ets create mode 100644 features/patient/src/main/ets/components/InspectionReportComp.ets create mode 100644 features/patient/src/main/ets/components/PatientCommonSettingComp.ets create mode 100644 features/patient/src/main/ets/components/RecordTheIllnessComp.ets create mode 100644 features/patient/src/main/resources/base/media/follow_add_plan_back.png create mode 100644 features/patient/src/main/resources/base/media/follow_add_plan_plan.png create mode 100644 features/patient/src/main/resources/base/media/follow_add_plan_suifang.png create mode 100644 features/patient/src/main/resources/base/media/follow_delete_plan.png create mode 100644 features/patient/src/main/resources/base/media/follow_list_rowLine.png create mode 100644 features/patient/src/main/resources/base/media/patients_no_selected.png create mode 100644 features/patient/src/main/resources/base/media/record_add_list.png create mode 100644 features/patient/src/main/resources/base/media/record_list_default.png create mode 100644 features/patient/src/main/resources/base/media/record_list_time_back.png create mode 100644 features/patient/src/main/resources/base/media/record_list_time_dian.png diff --git a/commons/basic/src/main/ets/constants/BasicConstant.ets b/commons/basic/src/main/ets/constants/BasicConstant.ets index e936073..b12abd8 100644 --- a/commons/basic/src/main/ets/constants/BasicConstant.ets +++ b/commons/basic/src/main/ets/constants/BasicConstant.ets @@ -40,6 +40,14 @@ export class BasicConstant { static readonly patientListNoInThisGroup = BasicConstant.urlExpertAPI+'patientListNoInThisGroup' static readonly patientCard = BasicConstant.urlExpertAPI+'patientCard' static readonly toAddNickname = BasicConstant.urlExpert+'toAddNickname' + static readonly cancelRes = BasicConstant.urlExpert+'cancelRes' + static readonly caseDetail = BasicConstant.urlExpert+'caseDetail' + static readonly getFollowUp = BasicConstant.urlExpert+'getFollowUp' + static readonly deleteFollowUp = BasicConstant.urlExpert+'deleteFollowUp' + static readonly addFollowUps = BasicConstant.urlExpert+'addFollowUps' + static readonly addFollowUp = BasicConstant.urlExpert+'addFollowUp' + static readonly followUpList = BasicConstant.urlExpert+'followUpList' + static readonly conditionRecordList = BasicConstant.urlExpert+'conditionRecordList' static readonly patientDetail = BasicConstant.urlExpert+'patientDetail' static readonly GroupList = BasicConstant.urlExpertApp+'GroupList' static readonly getStartpage=BasicConstant.urlExpertApp + "startpage"; diff --git a/commons/basic/src/main/ets/utils/PatientsEntity.ets b/commons/basic/src/main/ets/utils/PatientsEntity.ets index 17f5551..0328fef 100644 --- a/commons/basic/src/main/ets/utils/PatientsEntity.ets +++ b/commons/basic/src/main/ets/utils/PatientsEntity.ets @@ -737,6 +737,33 @@ export class PatientDatabaseManager { } } + // 在 PatientDatabaseManager 类内添加 + async updatePatientByData(patient: PatientData): Promise { + try { + if (!this.isDatabaseReady()) { + console.error('数据库未准备好,无法更新患者数据'); + return false; + } + // 构造 PatientEntity + const entity = new PatientEntity( + patient.uuid || '', + patient.nickname || '', + patient.mobile || '', + patient.realName || '', + patient.nation || '', + patient.sex || 0, + patient.type || 0, + patient.photo || '', + patient.expertUuid || '' // 注意:PatientData 里 expertUuid 字段必须有 + ); + await this.getPatientDao().updatePatient(entity); + return true; + } catch (error) { + console.error('updatePatientByData 更新患者信息失败:', error); + return false; + } + } + // 删除患者 async deletePatient(uuid: string): Promise { try { diff --git a/commons/basic/src/main/ets/utils/TimestampUtil.ets b/commons/basic/src/main/ets/utils/TimestampUtil.ets index 124e5b7..36365dd 100644 --- a/commons/basic/src/main/ets/utils/TimestampUtil.ets +++ b/commons/basic/src/main/ets/utils/TimestampUtil.ets @@ -1,9 +1,10 @@ import { systemDateTime } from '@kit.BasicServicesKit'; +import { isDate, isNumber, isString } from '@nimsdk/vendor'; export class TimestampUtil { - static format(timestamp: number | string, formatStr: string): string { - const date = new Date(timestamp); + static format(timestamp: number | string | Date, formatStr: string): string { + const date = isString(timestamp)||isNumber(timestamp)?new Date(timestamp):timestamp as Date; const padZero = (num: number, len: number = 2) => num.toString().padStart(len, '0'); const map: Record = { 'YYYY': date.getFullYear().toString(), @@ -47,4 +48,9 @@ export class TimestampUtil { return false; } } + + static getWeekday(date: Date): string { + const weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']; + return weekdays[date.getDay()]; + } } \ No newline at end of file diff --git a/features/patient/src/main/ets/components/AddFollowPlanComp.ets b/features/patient/src/main/ets/components/AddFollowPlanComp.ets new file mode 100644 index 0000000..ef80dcf --- /dev/null +++ b/features/patient/src/main/ets/components/AddFollowPlanComp.ets @@ -0,0 +1,247 @@ +import { HMPopInfo, HMRouter, HMRouterMgr } from "@hadss/hmrouter"; +import { + authStore, + BasicConstant, ChangeUtil, hdHttp, HdLoadingDialog, HdNav, + HdResponse, + logger, TimestampUtil } from "@itcast/basic"; +import { isDate } from "@nimsdk/vendor"; +import { promptAction } from "@kit.ArkUI"; +import { BusinessError } from "@kit.BasicServicesKit"; + +@HMRouter({ pageUrl:'AddFollowPlanComp' }) +@Component +export struct AddFollowPlanComp { + scroller:Scroller = new Scroller() + private params: ESObject = HMRouterMgr.getCurrentParam() + @State name:string = ChangeUtil.stringIsUndefinedAndNull(this.params.nickname)?String(this.params.realName):String(this.params.nickname) + @State followList:Array> = [{"content":"请于近日来院复诊、复查","time":"请选择时间","date":String(new Date)},{"content":"请于近日来院复诊、复查","time":"请选择时间","date":String(new Date)},{"content":"请于近日来院复诊、复查","time":"请选择时间","date":String(new Date)},{"content":"请于近日来院复诊、复查","time":"请选择时间","date":String(new Date)}] + @State isNotiMe:boolean = false + @State isNotiPa:boolean = false + + dialog: CustomDialogController = new CustomDialogController({ + builder: HdLoadingDialog({ message: '加载中...' }), + customStyle: true, + alignment: DialogAlignment.Center + }) + + submitFollowListAction() { + for (const item of this.followList) { + if (item.time == '请选择时间') { + promptAction.showToast({ message: '请选择时间', duration: 1000 }) + return + } + } + const noteStr = this.followList + .map(item => item.content) + .join('☆'); + const timeStr = this.followList + .map(item => item.date) + .join('☆'); + const entity = { + "expert_uuid": authStore.getUser().uuid, + "patient_uuid": this.params.patientUuid, + "datetime":timeStr, + "note":noteStr, + "type":"2", + "isremindme":this.isNotiMe?"1":"0", + "isremindpatient":this.isNotiPa?"1":"0" + } as Record + this.dialog.open() + hdHttp.post(BasicConstant.addFollowUps, entity).then(async (res: HdResponse) => { + this.dialog.close(); + logger.info('Response caseUuid'+res); + let json:Record | Array>> = JSON.parse(res+'') as Record | Array>>; + if(json.code == '1') { + HMRouterMgr.pop({param:{"isRefresh":"1"}}) + promptAction.showToast({ message:'添加随访计划成功', duration: 1000 }) + } else { + console.error('获取患者信息失败:'+json.message) + promptAction.showToast({ message: String(json.message), duration: 1000 }) + } + }).catch((err: BusinessError) => { + this.dialog.close(); + console.error(`Response fails: ${err}`); + }) + } + + build() { + Column() { + HdNav({title:'添加随访计划',isLeftAction:true,showRightIcon:false,showRightText:true,rightText:'提交',leftItemAction:()=>{ + HMRouterMgr.pop() + },rightItemAction:()=>{ + this.submitFollowListAction() + }}) + Scroll(this.scroller){ + Column() { + Row() { + Text('患者') + .fontSize(15) + .fontColor($r('app.color.main_color')) + .margin({ left: 10 }) + .layoutWeight(1) + Text(this.name) + .fontSize(15) + .margin({ right: 10 }) + } + .width('100%') + .height(40) + .margin({top:10}) + .backgroundColor(Color.White) + + Text('随访内容') + .height(40) + .width('100%') + .fontSize(15) + .fontColor($r('app.color.main_color')) + .padding({ left: 10 }) + .margin({top:10}) + .backgroundColor(Color.White) + + this.followListBuild() + this.selectedNotification() + } + } + .width('100%') + .scrollBar(BarState.Off) + .height('calc(100% - 120vp)') + .align(Alignment.TopStart) + .backgroundColor('#f4f4f4') + } + .width('100%') + } + + @Builder + followListBuild() { + List(){ + ListItemGroup({footer:this.followListFooterView()}){ + ForEach(this.followList,(item:Record,index:number)=>{ + ListItem(){ + Column() { + Row() { + Image($r('app.media.follow_delete_plan')) + .width(20) + .height(20) + .onClick(() => { + this.followList.splice(index, 1) + this.followList = [...this.followList] + }) + Text(String(item.content)) + .fontSize(14) + .fontColor('#666666') + .layoutWeight(1) + .onClick(()=>{ + HMRouterMgr.push({pageUrl:'InputFollowContentComp',param:{"content":item.content}},{ + onResult: (popInfo: HMPopInfo) => { + if (popInfo && popInfo.result && popInfo.result["content"] !== undefined) { + this.followList[index].content = popInfo.result["content"] + this.followList = [...this.followList] + } + } + }) + }) + Blank() + .width(1) + .backgroundColor('#f4f4f4') + Text(String(item.time)) + .fontSize(14) + .fontColor('#666666') + .onClick(()=>this.selectedData(index)) + } + Blank() + .width('100%') + .height(1) + .backgroundColor('#f4f4f4') + } + .padding({left:10,top:20,right:10,bottom:20}) + } + }) + } + } + .width('100%') + .margin({top:10}) + .backgroundColor(Color.White) + } + + @Builder + selectedNotification() { + Column(){ + Row(){ + Text('提醒我') + .fontSize(15) + .margin({left:10}) + .fontColor($r('app.color.main_color')) + .layoutWeight(1) + + Image(this.isNotiMe?$r('app.media.patiemts_list_selected'):$r('app.media.patients_no_selected')) + .width(20) + .height(20) + .margin({right:10}) + } + .height(50) + .width('100%') + .margin({bottom:1}) + .backgroundColor(Color.White) + .onClick(()=>{ + this.isNotiMe = !this.isNotiMe + }) + Row(){ + Text('提醒患者') + .fontSize(15) + .margin({left:10}) + .fontColor($r('app.color.main_color')) + .layoutWeight(1) + + Image(this.isNotiPa?$r('app.media.patiemts_list_selected'):$r('app.media.patients_no_selected')) + .width(20) + .height(20) + .margin({right:10}) + } + .height(50) + .width('100%') + .backgroundColor(Color.White) + .onClick(()=>{ + this.isNotiPa = !this.isNotiPa + }) + } + .width('100%') + .margin({top:10}) + } + + @Builder + followListFooterView() { + Row(){ + Text('+'+' 添加随访计划') + .fontSize(18) + .fontColor($r('app.color.main_color')) + } + .height(50) + .width('100%') + .padding({left:10}) + .onClick(()=>{ + const newItem: Record = { "content": "请于近日来院复诊、复查", "time": "请选择时间" ,"date":String(new Date) }; + this.followList.push(newItem); + }) + } + + selectedData(index:number){ + CalendarPickerDialog.show({ + selected: new Date(this.followList[index].date), + backgroundColor: Color.White, + backgroundBlurStyle: BlurStyle.NONE, + shadow: ShadowStyle.OUTER_FLOATING_SM, + onAccept: (value) => { + const today = new Date(); + today.setHours(0, 0, 0, 0); + const selected = new Date(value); + selected.setHours(0, 0, 0, 0); + if (selected < today) { + promptAction.showToast({ message: '只能选择今天及以后的日期', duration: 1500 }) + return + } + this.followList[index].time = TimestampUtil.format(value,'YYYY-MM-DD')+'('+TimestampUtil.getWeekday(value)+')' + this.followList[index].date = TimestampUtil.format(value,'YYYY-MM-DD') + this.followList = [...this.followList] + } + }); + } +} diff --git a/features/patient/src/main/ets/components/AddRecordIllnessComp.ets b/features/patient/src/main/ets/components/AddRecordIllnessComp.ets new file mode 100644 index 0000000..5b03043 --- /dev/null +++ b/features/patient/src/main/ets/components/AddRecordIllnessComp.ets @@ -0,0 +1,22 @@ +import { HMRouter } from "@hadss/hmrouter"; + +@HMRouter({pageUrl:'AddRecordIllnessComp'}) +@Component +export struct AddRecordIllnessComp { + @State message: string = 'Hello World'; + + build() { + Row() { + Column() { + Text(this.message) + .fontSize($r('app.float.page_text_font_size')) + .fontWeight(FontWeight.Bold) + .onClick(() => { + this.message = 'Welcome'; + }) + } + .width('100%') + } + .height('100%') + } +} diff --git a/features/patient/src/main/ets/components/AddScheduleFollowComp.ets b/features/patient/src/main/ets/components/AddScheduleFollowComp.ets new file mode 100644 index 0000000..0f7b15e --- /dev/null +++ b/features/patient/src/main/ets/components/AddScheduleFollowComp.ets @@ -0,0 +1,210 @@ +import { HMPopInfo, HMRouter, HMRouterMgr } from "@hadss/hmrouter"; +import { + authStore, + BasicConstant, ChangeUtil, hdHttp, HdLoadingDialog, HdNav, + HdResponse, + logger, TimestampUtil } from "@itcast/basic"; +import { promptAction } from "@kit.ArkUI"; +import { BusinessError } from "@kit.BasicServicesKit"; + +@HMRouter({ pageUrl:'AddScheduleFollowComp' }) +@Component +export struct AddScheduleFollowComp { + scroller:Scroller = new Scroller() + controller:TextAreaController = new TextAreaController() + private params: ESObject = HMRouterMgr.getCurrentParam() + @State name:string = ChangeUtil.stringIsUndefinedAndNull(this.params.nickname)?String(this.params.realName):String(this.params.nickname) + @State note:string = '请于近日来院复诊、复查' + @State date:string = '' + @State time:string = '请选择日期' + @State isNotiMe:boolean = false + @State isNotiPa:boolean = false + + dialog: CustomDialogController = new CustomDialogController({ + builder: HdLoadingDialog({ message: '加载中...' }), + customStyle: true, + alignment: DialogAlignment.Center + }) + + submitFollowListAction() { + if (this.time == '请选择日期') { + promptAction.showToast({ message:'请选择日期', duration: 1000 }) + return + } + if (this.note.length <= 0) { + promptAction.showToast({ message:'请编辑随访计划', duration: 1000 }) + return + } + const entity = { + "expert_uuid": authStore.getUser().uuid, + "patient_uuid": this.params.patientUuid, + "datetime":this.date, + "note":this.note, + "type":"1", + "isremindme":this.isNotiMe?"1":"0", + "isremindpatient":this.isNotiPa?"1":"0" + } as Record + this.dialog.open() + hdHttp.post(BasicConstant.addFollowUp, entity).then(async (res: HdResponse) => { + this.dialog.close(); + logger.info('Response caseUuid'+res); + let json:Record | Array>> = JSON.parse(res+'') as Record | Array>>; + if(json.code == '1') { + HMRouterMgr.pop({param:{"isRefresh":"1"}}) + promptAction.showToast({ message:'添加日程成功', duration: 1000 }) + } else { + console.error('获取患者信息失败:'+json.message) + promptAction.showToast({ message: String(json.message), duration: 1000 }) + } + }).catch((err: BusinessError) => { + this.dialog.close(); + console.error(`Response fails: ${err}`); + }) + } + + build() { + Column() { + HdNav({title:'添加日程',isLeftAction:true,showRightIcon:false,showRightText:true,rightText:'提交',leftItemAction:()=>{ + HMRouterMgr.pop() + },rightItemAction:()=>{ + this.submitFollowListAction() + }}) + Scroll(this.scroller){ + Column() { + Row() { + Text('患者') + .fontSize(15) + .fontColor($r('app.color.main_color')) + .margin({ left: 10 }) + .layoutWeight(1) + Text(this.name) + .fontSize(15) + .margin({ right: 10 }) + } + .width('100%') + .height(40) + .margin({top:10}) + .backgroundColor(Color.White) + + Row(){ + Text('日期') + .fontSize(15) + .fontColor($r('app.color.main_color')) + .margin({ left: 10 }) + .layoutWeight(1) + Text(this.time) + .fontSize(15) + .margin({ right: 10 }) + .onClick(()=>this.selectedData()) + } + .width('100%') + .height(40) + .margin({top:10}) + .backgroundColor(Color.White) + + Text('随访内容') + .height(40) + .width('100%') + .fontSize(15) + .fontColor($r('app.color.main_color')) + .padding({ left: 10 }) + .margin({top:10}) + .backgroundColor(Color.White) + + TextArea({ + placeholder:'在这里输入内容...(200字以内)', + controller:this.controller, + text:this.note + }) + .onChange((value: string) => { + this.note = value + }) + .placeholderFont({size:15}) + .placeholderColor('#999999') + .width('100%') + .padding({left:10,top:10,right:10,bottom:50}) + .fontSize(15) + .maxLength(200) + .backgroundColor(Color.White) + .border({ + radius: 0 + }) + + this.selectedNotification() + } + } + .width('100%') + .scrollBar(BarState.Off) + .height('calc(100% - 120vp)') + .align(Alignment.TopStart) + .backgroundColor('#f4f4f4') + } + .width('100%') + } + + @Builder + selectedNotification() { + Column(){ + Row(){ + Text('提醒我') + .fontSize(15) + .margin({left:10}) + .fontColor($r('app.color.main_color')) + .layoutWeight(1) + + Image(this.isNotiMe?$r('app.media.patiemts_list_selected'):$r('app.media.patients_no_selected')) + .width(20) + .height(20) + .margin({right:10}) + } + .height(50) + .width('100%') + .margin({bottom:1}) + .backgroundColor(Color.White) + .onClick(()=>{ + this.isNotiMe = !this.isNotiMe + }) + Row(){ + Text('提醒患者') + .fontSize(15) + .margin({left:10}) + .fontColor($r('app.color.main_color')) + .layoutWeight(1) + + Image(this.isNotiPa?$r('app.media.patiemts_list_selected'):$r('app.media.patients_no_selected')) + .width(20) + .height(20) + .margin({right:10}) + } + .height(50) + .width('100%') + .backgroundColor(Color.White) + .onClick(()=>{ + this.isNotiPa = !this.isNotiPa + }) + } + .width('100%') + .margin({top:10}) + } + + selectedData(){ + CalendarPickerDialog.show({ + selected: new Date(), + backgroundColor: Color.White, + backgroundBlurStyle: BlurStyle.NONE, + shadow: ShadowStyle.OUTER_FLOATING_SM, + onAccept: (value) => { + const today = new Date(); + today.setHours(0, 0, 0, 0); + const selected = new Date(value); + selected.setHours(0, 0, 0, 0); + if (selected < today) { + promptAction.showToast({ message: '只能选择今天及以后的日期', duration: 1500 }) + return + } + this.time = TimestampUtil.format(value,'YYYY-MM-DD')+'('+TimestampUtil.getWeekday(value)+')' + this.date = TimestampUtil.format(value,'YYYY-MM-DD') + } + }); + } +} diff --git a/features/patient/src/main/ets/components/FollowDetailsComp.ets b/features/patient/src/main/ets/components/FollowDetailsComp.ets new file mode 100644 index 0000000..468a96b --- /dev/null +++ b/features/patient/src/main/ets/components/FollowDetailsComp.ets @@ -0,0 +1,152 @@ +import { HMRouter, HMRouterMgr } from "@hadss/hmrouter" +import { BasicConstant, ChangeUtil, hdHttp, HdLoadingDialog, HdNav, HdResponse, logger } from "@itcast/basic" +import { promptAction } from "@kit.ArkUI" +import { BusinessError } from "@kit.BasicServicesKit" + +@HMRouter({ pageUrl:'FollowDetailsComp' }) +@Component +export struct FollowDetailsComp { + private params: ESObject = HMRouterMgr.getCurrentParam() + @State name:string = '' + @State time:string = '' + @State content:string = '' + + dialog: CustomDialogController = new CustomDialogController({ + builder: HdLoadingDialog({ message: '加载中...' }), + customStyle: true, + alignment: DialogAlignment.Center + }) + + aboutToAppear(): void { + this.getFollowDetailsAction() + } + + getFollowDetailsAction() { + this.dialog.open() + hdHttp.post(BasicConstant.getFollowUp, { + "uuid": this.params.uuid + } as Record).then(async (res: HdResponse) => { + this.dialog.close(); + logger.info('Response caseUuid'+res); + let json:Record | Array>> = JSON.parse(res+'') as Record | Array>>; + if(json.code == '1') { + this.name = ChangeUtil.stringIsUndefinedAndNull(this.params.nickname)?String(this.params.realName):String(this.params.nickname) + this.time = json.data["datetime"] as string + this.content = json.data["note"] as string + } else { + console.error('获取患者信息失败:'+json.message) + promptAction.showToast({ message: String(json.message), duration: 1000 }) + } + }).catch((err: BusinessError) => { + this.dialog.close(); + console.error(`Response fails: ${err}`); + }) + } + + delegateFollowList() { + this.dialog.open() + hdHttp.post(BasicConstant.deleteFollowUp, { + "uuid": this.params.uuid + } as Record).then(async (res: HdResponse) => { + this.dialog.close(); + logger.info('Response caseUuid'+res); + let json:Record | Array>> = JSON.parse(res+'') as Record | Array>>; + if(json.code == '1') { + HMRouterMgr.pop({param:{"isRefresh":"1"}}) + } else { + console.error('获取患者信息失败:'+json.message) + promptAction.showToast({ message: String(json.message), duration: 1000 }) + } + }).catch((err: BusinessError) => { + this.dialog.close(); + console.error(`Response fails: ${err}`); + }) + } + + build() { + Column() { + HdNav({title:'随访详情',isLeftAction:true,showRightIcon:false,leftItemAction:()=>{ + HMRouterMgr.pop() + }}) + Column(){ + Blank() + .width('100%') + .height(10) + .backgroundColor('#f4f4f4') + Row(){ + Text('患者') + .fontSize(15) + .fontColor($r('app.color.main_color')) + .margin({left:10}) + .layoutWeight(1) + Text(this.name) + .fontSize(15) + .margin({right:10}) + } + .width('100%') + .height(40) + .backgroundColor(Color.White) + Blank() + .width('100%') + .height(10) + .backgroundColor('#f4f4f4') + Column(){ + Row(){ + Text('日期') + .fontSize(15) + .fontColor($r('app.color.main_color')) + .margin({left:10}) + .layoutWeight(1) + Text(this.time) + .fontSize(15) + .margin({right:10}) + } + .width('100%') + .height(40) + .backgroundColor(Color.White) + Blank() + .width('100%') + .height(1) + .backgroundColor('#f4f4f4') + Text('随访内容') + .height(40) + .width('100%') + .fontSize(15) + .fontColor($r('app.color.main_color')) + .padding({left:10}) + .backgroundColor(Color.White) + Blank() + .width('100%') + .height(1) + .backgroundColor('#f4f4f4') + Text(this.content) + .width('100%') + .fontSize(15) + .padding({left:10,right:10,top:10}) + Blank() + .width('100%') + .height(10) + .backgroundColor('#f4f4f4') + .margin({top:30}) + } + .layoutWeight(1) + + Text('删除该条记录') + .textAlign(TextAlign.Center) + .fontSize(17) + .fontColor(Color.White) + .margin({left:20,right:20,bottom:80}) + .backgroundColor($r('app.color.main_color')) + .borderRadius(5) + .width('90%') + .height(50) + .onClick(()=>this.delegateFollowList()) + } + .width('100%') + .height('calc(100% - 56vp)') + .backgroundColor(Color.White) + .justifyContent(FlexAlign.Start) + } + .width('100%') + } +} diff --git a/features/patient/src/main/ets/components/FollowPlanListComp.ets b/features/patient/src/main/ets/components/FollowPlanListComp.ets new file mode 100644 index 0000000..8d89648 --- /dev/null +++ b/features/patient/src/main/ets/components/FollowPlanListComp.ets @@ -0,0 +1,312 @@ +import { HMPopInfo, HMRouter, HMRouterMgr } from "@hadss/hmrouter"; +import { HdNav,EmptyViewComp, authStore, HdLoadingDialog, hdHttp, BasicConstant, logger, + HdResponse, + ChangeUtil} from "@itcast/basic"; +import { PullToRefreshLayout, RefreshController } from "refreshlib"; +import { promptAction } from "@kit.ArkUI"; +import { BusinessError } from "@kit.BasicServicesKit"; +import { it } from "@ohos/hypium"; + +@HMRouter({pageUrl:'FollowPlanListComp'}) +@Component +export struct FollowPlanListComp { + @State planList: AppointmentGroup[] = [] + private params: ESObject = HMRouterMgr.getCurrentParam() + scroller = new Scroller() + @State pageNumber:number = 1 + @State totalPageNumer:number = 1 + public controller:RefreshController = new RefreshController() + @State isShowAddPlan:boolean = false + + dialog: CustomDialogController = new CustomDialogController({ + builder: HdLoadingDialog({ message: '加载中...' }), + customStyle: true, + alignment: DialogAlignment.Center + }) + + aboutToAppear(): void { + this.getFollowListData() + } + + getFollowListData() { + const entity = { + "expert_uuid": authStore.getUser().uuid, + "patient_uuid": this.params.patient_uuid, + "page":this.pageNumber.toString() + } as Record + this.dialog.open() + hdHttp.post(BasicConstant.followUpList, entity).then(async (res: HdResponse) => { + this.dialog.close(); + logger.info('Response followUpList'+res); + let json:Record | Array>> = JSON.parse(res+'') as Record | Array>>; + if(json.code == '1') { + this.controller.refreshSuccess(); + this.controller.loadSuccess(); + this.totalPageNumer = Number(json.data["totalPage"]) + const list: AppointmentItem[] = json.data["list"] as AppointmentItem[] + const groupMap: Record = {} + list.forEach(item => { + const groupKey = item.datetime ? item.datetime.substring(0, 7) : '未知' + if (!groupMap[groupKey]) { + groupMap[groupKey] = [] + } + groupMap[groupKey].push(item) + }) + if (this.pageNumber == 1) { + this.planList = Object.keys(groupMap).map(key => ({ + group: key, + items: groupMap[key] + } as AppointmentGroup)) + } else { + let newPlanList = [...this.planList] + Object.keys(groupMap).forEach(key => { + const existGroup = newPlanList.find(g => g.group === key) + if (existGroup) { + existGroup.items = existGroup.items.concat(groupMap[key]) + } else { + newPlanList.push({ + group: key, + items: groupMap[key] + }) + } + }) + this.planList = newPlanList + } + } else { + console.error('获取患者信息失败:'+json.message) + promptAction.showToast({ message: String(json.message), duration: 1000 }) + } + }).catch((err: BusinessError) => { + this.dialog.close(); + this.controller.refreshError(); + console.error(`Response fails: ${err}`); + }) + } + + build() { + Column() { + HdNav({title:'随访计划',isLeftAction:true,rightText:'添加',showRightText:true,showRightIcon:false,rightItemAction:()=>{ + this.isShowAddPlan = !this.isShowAddPlan + },leftItemAction:()=>{ + HMRouterMgr.pop() + }}) + + PullToRefreshLayout({ + scroller:this.scroller, + viewKey:"FollowPlanList", + controller:this.controller, + contentView:()=>{ + this.contentView() + }, + onRefresh:()=>{ + this.pageNumber = 1 + this.getFollowListData() + }, + onCanPullRefresh:()=>{ + if (!this.scroller.currentOffset()) { + /*处理无数据,为空的情况*/ + return true + } + //如果列表到顶,返回true,表示可以下拉,返回false,表示无法下拉 + return this.scroller.currentOffset().yOffset <= 0 + }, + onCanPullLoad: () => { + if (this.pageNumber >= this.totalPageNumer) { + return false; + } else { + return true; + } + }, + onLoad:()=>{ + this.pageNumber++; + this.getFollowListData() + } + }).width('100%').height('calc(100% - 106vp)').clip(true) + } + .width('100%') + } + + @Builder + headerView(item:AppointmentGroup) { + Text(item.group) + .fontSize(15) + .width('100%') + .textAlign(TextAlign.Center) + .backgroundColor('#e3e4e5') + .padding({top:10,bottom:10}) + } + @Builder + contentView() { + List({ scroller: this.scroller }) { + ForEach(this.planList,(item:AppointmentGroup)=>{ + ListItemGroup({header:this.headerView(item)}) { + ForEach(item.items,(listItem:AppointmentItem)=>{ + ListItem() { + Column() { + Row() { + Text(listItem.datetime.slice(-2) + ' 日') + .fontColor($r('app.color.main_color')) + .fontSize(14) + Image($r('app.media.follow_list_rowLine')) + .width(7) + .margin({ left: 10 }) + Column() { + Text(listItem.note) + .fontSize(16) + .maxLines(1) + .textOverflow({ overflow: TextOverflow.Ellipsis }) + Text(listItem.patientname) + .fontSize(16) + .maxLines(1) + .fontColor($r('app.color.main_color')) + } + .alignItems(HorizontalAlign.Start) + .margin({ left: 10 }) + .layoutWeight(1) + Image($r('app.media.course_invoice_to_details')) + .width(20) + .height(20) + } + .width('100%') + .height(70) + .backgroundColor(Color.White) + .padding({ + left: 10, + top: 10, + right: 10, + bottom: 10 + }) + .onClick(()=>{ + HMRouterMgr.push({pageUrl:'FollowDetailsComp',param:{"uuid":listItem.uuid,"nickname":listItem.patientname}},{ + onResult:()=>{ + this.pageNumber = 1 + this.getFollowListData() + } + }) + }) + Blank() + .margin({left:20}) + .height(1) + .backgroundColor('#f4f4f4') + } + } + }) + } + }) + } + .width('100%') + .height('100%') + .scrollBar(BarState.Off) + + EmptyViewComp({promptText:'暂无随访计划',isVisibility:true}) + .width('100%') + .height('100%') + .visibility(this.planList.length>0?Visibility.None:Visibility.Visible) + + this.addPlanPopWindows() + } + + @Builder + addPlanPopWindows() { + Stack(){ + Image($r('app.media.follow_add_plan_back')) + .objectFit(ImageFit.Fill) + .width(140) + .height(120) + .margin({right:10}) + Column() { + Row() { + Image($r('app.media.follow_add_plan_suifang')) + .width(20) + .height(20) + .margin({left:15}) + Text('添加日程') + .fontSize(15) + .fontColor('rgba(146,60,53,1)') + .margin({left:5}) + }.height(60).width('100%') + .onClick(()=>{ + this.isShowAddPlan = false + HMRouterMgr.push({ + pageUrl:'AddScheduleFollowComp', + param:{ + "uuid":this.params.FollowUpUuid, + "patientUuid":this.params.patient_uuid, + "nickname":this.params.nickname, + "realName":this.params.realName + }},{ + onResult:(popInfo:HMPopInfo)=>{ + if (popInfo && popInfo.result && popInfo.result["isRefresh"] !== undefined) { + this.pageNumber = 1 + this.getFollowListData() + } + } + }) + }) + Blank() + .width(110) + .height(1) + .margin({left:15,right:15}) + .backgroundColor('rgba(146,60,53,1)') + Row() { + Image($r('app.media.follow_add_plan_plan')) + .width(20) + .height(20) + .margin({left:15}) + Text('添加随访计划') + .fontSize(15) + .fontColor('rgba(146,60,53,1)') + .margin({left:5}) + }.height(60).width('100%') + .onClick(()=>{ + this.isShowAddPlan = false + HMRouterMgr.push({ + pageUrl:'AddFollowPlanComp', + param:{ + "uuid":this.params.FollowUpUuid, + "patientUuid":this.params.patient_uuid, + "nickname":this.params.nickname, + "realName":this.params.realName + }},{ + onResult:(popInfo:HMPopInfo)=>{ + if (popInfo && popInfo.result && popInfo.result["isRefresh"] !== undefined) { + this.pageNumber = 1 + this.getFollowListData() + } + } + }) + }) + } + .width(140) + .height(120) + .margin({right:10}) + .alignItems(HorizontalAlign.End) + .justifyContent(FlexAlign.Start) + } + .alignContent(Alignment.TopEnd) + .width('100%') + .height('100%') + .backgroundColor('rgba(0,0,0,0.2)') + .visibility(this.isShowAddPlan?Visibility.Visible:Visibility.None) + } +} + +interface AppointmentItem { + datetime: string + isremindme: number + isremindpatient: number + patientname: string + expertname:string + expert_uuid:string + uuid:string + createdate:string + patient_uuid:string + status:string + note:string + type:string +} + +interface AppointmentGroup { + group: string + items: AppointmentItem[] +} \ No newline at end of file diff --git a/features/patient/src/main/ets/components/GroupManagementComp.ets b/features/patient/src/main/ets/components/GroupManagementComp.ets index 610f7e0..12c01ae 100644 --- a/features/patient/src/main/ets/components/GroupManagementComp.ets +++ b/features/patient/src/main/ets/components/GroupManagementComp.ets @@ -181,7 +181,7 @@ export struct GroupManagementComp { }, isLeftAction:true, leftItemAction:()=>{ - HMRouterMgr.pop() + HMRouterMgr.pop({param:{'nameString':this.params.groupNames,"uuidString":this.params.groupUuids}}) } }) // 已选分组 Row() { diff --git a/features/patient/src/main/ets/components/InputFollowContentComp.ets b/features/patient/src/main/ets/components/InputFollowContentComp.ets new file mode 100644 index 0000000..141bd83 --- /dev/null +++ b/features/patient/src/main/ets/components/InputFollowContentComp.ets @@ -0,0 +1,48 @@ +import { HMRouter, HMRouterMgr } from "@hadss/hmrouter"; +import { ChangeUtil, HdNav } from "@itcast/basic"; +import { promptAction } from "@kit.ArkUI"; + +@HMRouter({pageUrl:'InputFollowContentComp'}) +@Component +export struct InputFollowContentComp { + controller:TextAreaController = new TextAreaController() + private params: ESObject = HMRouterMgr.getCurrentParam() + @State followInput:string = '' + + build() { + Column() { + HdNav({ title: '请输入随访内容', showRightIcon: false,showRightText:true,rightText:'保存', isLeftAction:true,rightItemAction:()=>{ + if (this.followInput.length<=0) { + promptAction.showToast({ message: '请输入随访内容', duration: 1000 }) + return + } + HMRouterMgr.pop({param:{"content":this.followInput}}) + },leftItemAction:()=>{ + HMRouterMgr.pop({param:{"content":'请于近日来院复诊、复查'}}) + }}) + // 输入框区域 + TextArea({ + placeholder:'在这里输入内容...(200字以内)', + controller:this.controller, + text:ChangeUtil.stringIsUndefinedAndNull(this.params.content)||String(this.params.content)=='请于近日来院复诊、复查'?'':String(this.params.content) + }) + .onChange((value: string) => { + this.followInput = value + }) + .placeholderFont({size:16}) + .placeholderColor('#999999') + .width('95%') + .height(230) + .margin(10) + .fontSize(16) + .maxLength(200) + .backgroundColor(Color.White) + .borderRadius(5) + .border({ + width:1, + color:'#999999' + }) + } + .width('100%') + } +} diff --git a/features/patient/src/main/ets/components/InspectionReportComp.ets b/features/patient/src/main/ets/components/InspectionReportComp.ets new file mode 100644 index 0000000..4eaaa35 --- /dev/null +++ b/features/patient/src/main/ets/components/InspectionReportComp.ets @@ -0,0 +1,148 @@ +import { authStore, BasicConstant, hdHttp, HdLoadingDialog, HdNav, HdResponse, logger } from "@itcast/basic" +import { BusinessError } from "@kit.BasicServicesKit" +import { promptAction } from "@kit.ArkUI" +import { HMRouter, HMRouterMgr } from "@hadss/hmrouter" + +@HMRouter({ pageUrl: 'InspectionReportComp' }) +@Component +export struct InspectionReportComp { + scroller:Scroller = new Scroller() + private params: ESObject = HMRouterMgr.getCurrentParam() + @State jsonData:Record = {} + @State imgArray:Array> = [] + @State scrollIndex:number = 1 + + dialog: CustomDialogController = new CustomDialogController({ + builder: HdLoadingDialog({ message: '加载中...' }), + customStyle: true, + alignment: DialogAlignment.Center + }) + + aboutToAppear(): void { + this.getCaseDetailAction() + } + + getCaseDetailAction() { + this.dialog.open() + hdHttp.post(BasicConstant.caseDetail, { + "caseUuid": this.params.uuid + } as Record).then(async (res: HdResponse) => { + this.dialog.close(); + logger.info('Response caseUuid'+res); + let json:Record | Array>> = JSON.parse(res+'') as Record | Array>>; + if(json.code == '1') { + this.jsonData = json.data as Record + this.imgArray = json.img as Record[] + } else { + console.error('获取患者信息失败:'+json.message) + promptAction.showToast({ message: String(json.message), duration: 1000 }) + } + }).catch((err: BusinessError) => { + this.dialog.close(); + console.error(`Response fails: ${err}`); + }) + } + + build() { + Column() { + HdNav({title:this.params.diseaseName,showRightIcon:false,isLeftAction:true,showLeftIcon:true,leftItemAction:()=>{ + HMRouterMgr.pop() + }}) + Scroll(this.scroller) { + Column() { + Row() { + Text('疾病诊断:' + String(this.jsonData["diseaseName"])) + .fontSize(15) + .fontColor(Color.White) + .margin({ left: 15 }) + .layoutWeight(1) + Text(String(this.jsonData["createDate"]).substring(0,10)) + .fontSize(15) + .fontColor(Color.White) + .margin({ right: 15 }) + } + .width('100%') + .height(40) + .backgroundColor($r('app.color.main_color')) + + Column() { + Text('化验报告') + .fontSize(15) + .fontColor('#333333') + .width('100%') + .height(40) + .backgroundColor(Color.White) + .padding({ left: 15 }) + if (this.imgArray.length > 0) { + Swiper() { + ForEach(this.imgArray, (item: Record) => { + Stack({alignContent:Alignment.Bottom}) { + Image(BasicConstant.urlImage + item.path) + .alt($r('app.media.home_scroll_default1')) + .objectFit(ImageFit.Cover) + .width('85%') + .height('100%') + }.width('100%') + }) + } + .indicator(false) + .loop(false) + .autoPlay(false) + .onChange((index: number) => { + this.scrollIndex = index+1 + }) + .height('60%') + + Text(this.scrollIndex+'/'+this.imgArray.length) + .zIndex(2) + .fontColor($r('app.color.main_color')) + .width('100%') + .textAlign(TextAlign.Center) + .align(Alignment.Center) + .margin({ bottom: 10 }) + } else { + Text('无检查化验报告') + .fontSize(15) + .fontColor('#666666') + .padding({ left: 15 }) + .height(60) + } + } + .width('100%') + .backgroundColor('#f4f4f4') + .justifyContent(FlexAlign.Start) + .alignItems(HorizontalAlign.Start) + + Column(){ + Text('疾病描述') + .fontSize(15) + .fontColor('#333333') + .backgroundColor(Color.White) + .padding({left:15}) + .width('100%') + .height(40) + Blank() + .width('100%') + .height(1) + .backgroundColor('#f4f4f4') + Text(String(this.jsonData['des'])) + .fontSize(15) + .fontColor('#333333') + .backgroundColor(Color.White) + .width('100%') + .padding({left:15,right:15,top:15}) + } + .width('100%') + .align(Alignment.TopStart) + } + .width('100%') + .align(Alignment.TopStart) + } + .width('100%') + .height('calc(100% - 56vp)') + .backgroundColor(Color.White) + .scrollBar(BarState.Off) + .align(Alignment.TopStart) + } + } +} diff --git a/features/patient/src/main/ets/components/PatientCommonSettingComp.ets b/features/patient/src/main/ets/components/PatientCommonSettingComp.ets new file mode 100644 index 0000000..d2a916d --- /dev/null +++ b/features/patient/src/main/ets/components/PatientCommonSettingComp.ets @@ -0,0 +1,325 @@ +import { HMPopInfo, HMRouter, HMRouterMgr } from "@hadss/hmrouter" +import { BasicConstant, hdHttp, HdNav, HdLoadingDialog, logger, HdResponse, ChangeUtil, + DefaultHintProWindows, + authStore, + PatientData, + patientDbManager} from "@itcast/basic" +import { HashMap } from "@kit.ArkTS"; +import { promptAction, router } from "@kit.ArkUI"; +import { BusinessError } from "@kit.BasicServicesKit"; + +@HMRouter({ pageUrl: 'PatientCommonSettingComp' }) +@Component +export struct PatientCommonSettingComp { + private params: ESObject = HMRouterMgr.getCurrentParam() + @State itemList:Record = {} + scroller:Scroller = new Scroller() + private hintWindowDialog!: CustomDialogController + + dialog: CustomDialogController = new CustomDialogController({ + builder: HdLoadingDialog({ message: '加载中...' }), + customStyle: true, + alignment: DialogAlignment.Center + }) + + private hintPopWindowDialog() { + this.hintWindowDialog = new CustomDialogController({ + builder:DefaultHintProWindows({ + controller:this.hintWindowDialog, + message:'解除患者随访关系', + cancleTitleColor: '#333333', + confirmTitleColor: '#333333', + selectedButton: (index:number)=>{ + if (index === 1) { + this.deletePatientAction() + } + this.hintWindowDialog.close(); + } + }), + alignment: DialogAlignment.Center, + cornerRadius:24, + backgroundColor: ('rgba(0,0,0,0.5)'), + }) + } + + aboutToAppear(): void { + this.getPatientsInfo() + this.hintPopWindowDialog() + } + + getPatientsInfo() { + const hashMap: HashMap = new HashMap(); + hashMap.set('patient_uuid',String(this.params.patient_uuid)); + this.dialog.open() + hdHttp.httpReq(BasicConstant.patientCard,hashMap).then(async (res: HdResponse) => { + this.dialog.close(); + logger.info('Response patientCard'+res); + let json:Record = JSON.parse(res+'') as Record + const isFriend = String(json.isFriend) + if (isFriend == '0') { + promptAction.showToast({ message: '随访关系已解除', duration: 1000 }) + HMRouterMgr.pop() + } else { + if(json.code == '200') { + this.itemList = {"photo":String(json.patient["photo"]), + "realName":String(json.patient["realname"]), + "nickname":String(json.group["nickname"]), + "groupType":String(json.group["name"]), + "is_star":String(json.group["is_star"]), + "group_type":String(json.group["group_type"]), + "groupUuid":String(json.group["uuid"]), + "FollowUpDate":String(json.FollowUpDate), + "FollowUpUuid":String(json.FollowUpUuid), + "note":String(json.group["note"]), + "patientUuid":String(this.params.patient_uuid)} + } else { + console.error('患者详情请求失败:'+json.message) + } + } + }).catch((err: BusinessError) => { + this.dialog.close(); + console.info(`Response fails: ${err}`); + }) + } + + deletePatientAction() { + this.dialog.open() + hdHttp.post(BasicConstant.cancelRes, { + "expertUuid": authStore.getUser().uuid, + "patientUuid":String(this.params.patient_uuid) + } as Record).then(async (res: HdResponse) => { + this.dialog.close(); + logger.info('Response toAddNickname'+res); + let json:Record> = JSON.parse(res+'') as Record> + promptAction.showToast({ message: String(json.message), duration: 1000 }) + if(json.code == '1') { + const singlePatient: PatientData = { + uuid:this.params.patient_uuid as string, + nickname: '', + mobile: '', + realName: '', + nation: '', + sex: 0, + type: 2, + photo: '', + expertUuid: authStore.getUser().uuid + } + const success = await patientDbManager.updatePatientByData(singlePatient) + if (success) { + console.info('修改成功') + } else { + console.info('修改失败') + } + HMRouterMgr.removeAll() + HMRouterMgr.pop() + } else { + console.error('获取患者信息失败:'+json.message) + } + }).catch((err: BusinessError) => { + this.dialog.close(); + console.error(`Response fails: ${err}`); + }) + } + + build() { + Column() { + HdNav({ + title: '常用设置', + showRightIcon: false, + hasBorder: true, + showRightText: false, + isLeftAction:true, + leftItemAction:()=>{ + HMRouterMgr.pop() + } + }) + Scroll(this.scroller) { + Column() { + Row() { + Image(BasicConstant.urlImage + this.itemList.photo) + .width(60) + .height(60) + .borderRadius(6) + .margin({ left: 15 }) + Text(ChangeUtil.stringIsUndefinedAndNull(this.itemList.nickname) ? this.itemList.realName : + this.itemList.nickname) + .fontSize(15) + .fontColor('#333333') + .margin({ left: 15 }) + .layoutWeight(1) + Image($r('app.media.course_invoice_to_details')) + .width(11) + .height(20) + .margin({ right: 15 }) + } + .width('100%') + .height(80) + .margin({ bottom: 10 }) + .backgroundColor(Color.White) + .visibility(this.params.title == '患者详情' ? Visibility.None : Visibility.Visible) + .onClick(()=> HMRouterMgr.push({pageUrl:'PatientDetailsComp',param:{"patient_uuid":String(this.params.patient_uuid)}})) + + Row() { + Text('设置备注') + .fontSize(15) + .fontColor('#333333') + .margin({ left: 15 }) + .layoutWeight(1) + Text(ChangeUtil.stringIsUndefinedAndNull(this.itemList.nickname) ? '给患者添加备注名' : + this.itemList.nickname) + .textAlign(TextAlign.End) + .width('50%') + .margin({ right: 10 }) + .fontSize(15) + .fontColor('#666666') + Image($r('app.media.course_invoice_to_details')) + .width(11) + .height(20) + .margin({ right: 15 }) + } + .width('100%') + .height(50) + .backgroundColor(Color.White) + .margin({ bottom: 1 }) + .onClick(()=> HMRouterMgr.push({pageUrl: 'PatientSetMsgPage',param:{"model":this.itemList}})) + + Row() { + Text('设置分组') + .fontSize(15) + .fontColor('#333333') + .margin({ left: 15 }) + .layoutWeight(1) + Text(ChangeUtil.stringIsUndefinedAndNull(this.itemList.groupType) ? '通过分组给患者分类' : this.itemList.groupType) + .width('50%') + .textAlign(TextAlign.End) + .margin({ right: 10 }) + .fontSize(15) + .fontColor('#666666') + Image($r('app.media.course_invoice_to_details')) + .width(11) + .height(20) + .margin({ right: 15 }) + } + .width('100%') + .height(50) + .backgroundColor(Color.White) + .margin({ bottom: 10 }) + .onClick(()=> HMRouterMgr.push({pageUrl: 'PatientSetMsgPage',param:{"model":this.itemList}})) + + Row() { + Text('患者描述') + .fontSize(15) + .fontColor('#333333') + .margin({ left: 15 }) + .layoutWeight(1) + Text(ChangeUtil.stringIsUndefinedAndNull(this.itemList.note) ? '补充患者关键信息,方便随访患者' : + this.itemList.note) + .textOverflow({overflow:TextOverflow.Ellipsis}) + .maxLines(1) + .textAlign(TextAlign.End) + .width('50%') + .margin({ right: 10 }) + .fontSize(15) + .fontColor('#666666') + Image($r('app.media.course_invoice_to_details')) + .width(11) + .height(20) + .margin({ right: 15 }) + } + .width('100%') + .height(50) + .backgroundColor(Color.White) + .margin({ bottom: 10 }) + .onClick(()=> HMRouterMgr.push({pageUrl: 'PatientSetMsgPage',param:{"model":this.itemList}})) + + Row() { + Text('下次随访时间') + .fontSize(15) + .fontColor('#333333') + .margin({ left: 15 }) + .layoutWeight(1) + Text(ChangeUtil.stringIsUndefinedAndNull(this.itemList.FollowUpDate) ? '添加随访提醒' : this.itemList.FollowUpDate) + .textAlign(TextAlign.End) + .width('50%') + .margin({ right: 10 }) + .fontSize(15) + .fontColor('#666666') + Image($r('app.media.course_invoice_to_details')) + .width(11) + .height(20) + .margin({ right: 15 }) + } + .width('100%') + .height(50) + .backgroundColor(Color.White) + .margin({ bottom: 10 }) + .onClick(()=>{ + if (ChangeUtil.stringIsUndefinedAndNull(this.itemList.FollowUpDate)) { + HMRouterMgr.push({ + pageUrl:'AddFollowPlanComp', + param:{ + "uuid":this.itemList.FollowUpUuid, + "patientUuid":this.itemList.patientUuid, + "nickname":this.itemList.nickname, + "realName":this.itemList.realName}},{ + onResult:(popInfo:HMPopInfo)=>{ + this.getPatientsInfo() + } + }) + } else { + HMRouterMgr.push({ + pageUrl:'FollowDetailsComp', + param:{ + "uuid":this.itemList.FollowUpUuid, + "nickname":this.itemList.nickname, + "realName":this.itemList.realName}},{ + onResult: (popInfo: HMPopInfo) => { + this.getPatientsInfo() + } + }) + } + }) + + Row() { + Text('投诉反馈') + .fontSize(15) + .fontColor('#333333') + .margin({ left: 15 }) + .layoutWeight(1) + Image($r('app.media.course_invoice_to_details')) + .width(11) + .height(20) + .margin({ right: 15 }) + } + .width('100%') + .height(50) + .backgroundColor(Color.White) + .margin({ bottom: 10 }) + .onClick(()=>{ + router.pushUrl({url:'pages/MinePage/FeedbackPage',params:{"title":"投诉反馈"}}) + }) + + Row() { + Text('解除随访') + .width('100%') + .fontSize(15) + .fontColor($r('app.color.main_color')) + .textAlign(TextAlign.Center) + .onClick(() => this.hintWindowDialog.open()) + } + .width('100%') + .height(50) + .alignItems(VerticalAlign.Center) + .backgroundColor(Color.White) + } + .width('100%') + } + .width('100%') + .align(Alignment.TopStart) + .height('calc(100% - 56vp)') + .scrollBar(BarState.Off) + .backgroundColor('#f4f4f4') + } + .height('100%') + } +} diff --git a/features/patient/src/main/ets/components/PatientDetailsComp.ets b/features/patient/src/main/ets/components/PatientDetailsComp.ets index 848edea..2980ca1 100644 --- a/features/patient/src/main/ets/components/PatientDetailsComp.ets +++ b/features/patient/src/main/ets/components/PatientDetailsComp.ets @@ -8,7 +8,7 @@ import { TextSectionAttribute,LastSpanAttribute } from '../utils/Models' import { applyListModel } from '../models/ApplyModel' import { TextExpandView } from '../views/TextExpandView' import call from '@ohos.telephony.call' -import { HMRouter, HMRouterMgr } from "@hadss/hmrouter" +import { HMLifecycleContext, HMRouter, HMRouterMgr, IHMLifecycle } from "@hadss/hmrouter" @HMRouter({ pageUrl: 'PatientDetailsComp' }) @Component @@ -18,7 +18,7 @@ export struct PatientDetailsComp { private params: ESObject = HMRouterMgr.getCurrentParam() // @State params:Record = router.getParams() as Record @State groupArray:Array> = [] - @State footerArray:Array> = [] + @State footerArray:Array> = [{"img":$r('app.media.sendMessage_blackBtn'),"title":"发消息"},{"img":$r('app.media.fuifangPlan_blackBtn'),"title":"制定随访计划"},{"img":$r('app.media.listBing_blackBtn'),"title":"记录病情"}] @State patientCase:Array> = [] @State patientData:Record = {} @State patientData2:applyListModel = {} @@ -41,7 +41,6 @@ export struct PatientDetailsComp { aboutToAppear(): void { this.getPatientCardData() - this.footerArray = [{"img":$r('app.media.sendMessage_blackBtn'),"title":"发消息"},{"img":$r('app.media.fuifangPlan_blackBtn'),"title":"制定随访计划"},{"img":$r('app.media.listBing_blackBtn'),"title":"记录病情"}] } getPatientCardData(){ @@ -343,6 +342,10 @@ export struct PatientDetailsComp { .backgroundColor('#f4f4f4') .borderRadius(3) } + .padding({right:10}) + .onClick(()=>{ + HMRouterMgr.push({pageUrl:'InspectionReportComp',param:item}) + }) }) } } @@ -370,7 +373,30 @@ export struct PatientDetailsComp { .justifyContent(FlexAlign.Center) .backgroundColor(Color.White) }.width('100%').height(50) + .onClick(()=>{ + if (index == 1) { + HMRouterMgr.push({pageUrl:"FollowPlanListComp", + param:{ + "patient_uuid":this.params.patient_uuid, + "FollowUpUuid":this.patientGroupData.FollowUpUuid, + "nickname":this.patientData2.nickname, + "realName":this.patientData2.realName}}) + } else if (index == 2) { + HMRouterMgr.push({pageUrl:"RecordTheIllnessComp", + param:{"patient_uuid":this.params.patient_uuid}}) + } + }) }) } } } + +class TestLifecycle implements IHMLifecycle { + onWillShow(ctx: HMLifecycleContext): void { + console.info('PatientDetailsComp-onWillShow:',ctx); + } + onShown(ctx: HMLifecycleContext): void { + console.info('PatientDetailsComp-onShown:',ctx); + } +} + diff --git a/features/patient/src/main/ets/components/RecordTheIllnessComp.ets b/features/patient/src/main/ets/components/RecordTheIllnessComp.ets new file mode 100644 index 0000000..3ac135d --- /dev/null +++ b/features/patient/src/main/ets/components/RecordTheIllnessComp.ets @@ -0,0 +1,183 @@ +import { HMRouter, HMRouterMgr } from "@hadss/hmrouter"; +import { authStore, hdHttp, BasicConstant, HdNav, HdResponse, logger, HdLoadingDialog, + EmptyViewComp } from "@itcast/basic"; +import { PullToRefreshLayout, RefreshController } from "refreshlib"; +import { promptAction } from "@kit.ArkUI"; +import { BusinessError } from "@kit.BasicServicesKit"; + +@HMRouter({pageUrl:'RecordTheIllnessComp'}) +@Component +export struct RecordTheIllnessComp { + scroller = new Scroller() + private params: ESObject = HMRouterMgr.getCurrentParam() + public controller:RefreshController = new RefreshController() + @State recordList:recordList[] = [] + @State totalPageNumer:number = 1 + @State pageNumber:number = 1 + + dialog: CustomDialogController = new CustomDialogController({ + builder: HdLoadingDialog({ message: '加载中...' }), + customStyle: true, + alignment: DialogAlignment.Center + }) + + aboutToAppear(): void { + this.getRecordListData() + } + + getRecordListData() { + const entity = { + "expert_uuid": authStore.getUser().uuid, + "patient_uuid": this.params.patient_uuid, + "page":this.pageNumber.toString() + } as Record + this.dialog.open() + hdHttp.post(BasicConstant.conditionRecordList, entity).then(async (res: HdResponse) => { + this.dialog.close(); + logger.info('Response conditionRecordList'+res); + let json:Record | Array>> = JSON.parse(res+'') as Record | Array>>; + if(json.code == '1') { + this.controller.refreshSuccess(); + this.controller.loadSuccess(); + this.totalPageNumer = Number(json.data["totalPage"]) + let list = json.data["list"] as recordList[]; + if (this.pageNumber === 1) { + this.recordList = list; + } else { + this.recordList = this.recordList.concat(list); + } + } else { + console.error('获取患者信息失败:'+json.message) + promptAction.showToast({ message: String(json.message), duration: 1000 }) + } + }).catch((err: BusinessError) => { + this.dialog.close(); + this.controller.refreshError(); + console.error(`Response fails: ${err}`); + }) + } + + build() { + Column() { + HdNav({isLeftAction:true,title:'病情记录',showRightText:false,rightIcon:$r('app.media.record_add_list'),rightItemAction:()=>{ + HMRouterMgr.push({pageUrl:'AddRecordIllnessComp'}) + },leftItemAction:()=>{ + HMRouterMgr.pop() + }}) + + PullToRefreshLayout({ + scroller:this.scroller, + viewKey:"RecordListPage", + controller:this.controller, + contentView:()=>{ + this.contentView() + }, + onRefresh:()=>{ + this.pageNumber = 1 + this.recordList = [] + this.getRecordListData() + }, + onCanPullRefresh:()=>{ + if (!this.scroller.currentOffset()) { + /*处理无数据,为空的情况*/ + return true + } + //如果列表到顶,返回true,表示可以下拉,返回false,表示无法下拉 + return this.scroller.currentOffset().yOffset <= 0 + }, + onCanPullLoad: () => { + if (this.pageNumber >= this.totalPageNumer) { + return false; + } else { + return true; + } + }, + onLoad:()=>{ + this.pageNumber++; + this.getRecordListData() + } + }).width('100%').height('calc(100% - 106vp)').clip(true) + } + .width('100%') + } + + @Builder + contentView(){ + List({scroller:this.scroller}){ + ForEach(this.recordList,(item:recordList)=>{ + ListItem(){ + Stack(){ + Text() + .width(2) + .backgroundColor($r('app.color.main_color')) + .margin({left:13}) + Image($r('app.media.record_list_time_dian')) + .width(20).height(20) + .margin({left:4,top:20}) + + Image($r('app.media.record_list_time_back')) + .objectFit(ImageFit.Fill) + .width(140) + .height(30) + .margin({left:25,top:15}) + Text(item.create_date) + .fontSize(16) + .textAlign(TextAlign.Center) + .width(140) + .height(30) + .margin({left:25,top:15}) + + Column() { + Text(item.des) + .fontSize(16) + .width('100%') + + Grid() { + ForEach(item.photo, (photo: string) => { + GridItem() { + Image(BasicConstant.urlImage + photo) + .alt($r('app.media.record_list_default')) + } + .width(item.photo.length<=1?160:80) + .height(item.photo.length<=1?160:80) + .margin({ right: 10, bottom: 10 }) + }) + } + .width('100%') + .margin({top:20}) + + Blank() + .width('100%') + .height(1) + .backgroundColor('#f4f4f4') + .margin({top: 10}) + } + .margin({left:35,top:60,right:15}) + .alignItems(HorizontalAlign.Start) + .justifyContent(FlexAlign.Start) + } + .width('100%') + .alignContent(Alignment.TopStart) + } + .width('100%') + }) + } + .width('100%') + .height('100%') + .scrollBar(BarState.Off) + + EmptyViewComp({promptText:'暂无病情记录',isVisibility:true}) + .width('100%') + .height('100%') + .visibility(this.recordList.length>0?Visibility.None:Visibility.Visible) + } +} + +interface recordList { + create_date: string + des: string + patient_uuid: string + expert_uuid: string + uuid:string + photo:Array +} diff --git a/features/patient/src/main/resources/base/media/follow_add_plan_back.png b/features/patient/src/main/resources/base/media/follow_add_plan_back.png new file mode 100644 index 0000000000000000000000000000000000000000..dcf727990e5922731887398614b11cf79719f594 GIT binary patch literal 2461 zcmb_eZCF!f7=Fo68ktI%pyW;?2?BQZ3EN_PxPeX>4y1rW>9`%X31?^9IfF4XxNwjH znq^u9if9^sq!^ZhA~wZL6KPhO1)7MUp^%7tC3L1@{)n!AaDJTgJnwZs_jA9`d!KWi z)r#18lW8+)0D#G|`OauPb0GsBMKr^_)-*-VTc-y zM-f%F;X5=0fC(>Y6Ozazd5lPjV@$+>VVW^LRSiH$m|2e~(@_#yimJ6bF{A5nJppuJ#fUDl#3m>$=}MuB5f%!Cm_-x;hLQ+m#xit-$Sh_&;1yA^V;N>Z z4g$N|FbtGaA)DhmJ z3{sR(8nt>-i|ZfJ-vhW@E|Td8645D9nN-Z62$))}N+gg*L`F#>xIAuT5StwtG?yL8nj6872xdzn zq`_R?Xsr}inlMyHj@GLFspXAX>u>_5r#eefqc#&&MHz7ndaz@Wc5E%|G5H?Vs>asB z8M79q#K4Yoed3%)mnic%!pE+qlE=PBb(GnSl&ibLY5D@^tg`pKS|b|%1WciUuZ@!pYuq3U{Co}HPObdq)^My~%f>eJ-7 zkJ`k=E}yMi${GB&s?>j5dj+8?eX}I$*X%HQf8CMx=FBT0vs>Vjd{U2xAW=Ww+njC95%TU!Pu1cDfDSRVPE?e z*J5uBS}q7?T}|<)fd;yDgW-DSjX2Ni8SlJucUI6}CuV#eGE901Th|`=)w}V!AaV6m z;f9-TYExNl;jR|s-e6z_ezt1;QSHs=qityLx%r1*H?$OTwHc%_1ceRqd-chFCJP(&|S z76&?hd-W>sWJwEgWs81j*U2Vz$DEOlNzn_UkISQ%xJZ0rXaoNFUkvz9qM%kgTy#El zT65EGi~f^=)3r_QSGmilS035QC_u73QkKhWg^ZjA#T**g1iRoTO6)_nBHQ=V_mvx_ z(rSBm(avvPJezsQm{BYAX)GNW>S|gL+vB&h`FJ^Q^Y|(G=0yE-F~!`_x&+=fl_g7PB{}u zoj}|;gyTZ;grafgt9lx&dJ1d>xxN6RjYBvtBu^+BXTFVKeCPN7OtQs0vSJRl_TYh} z>AA)Iw=V9t-QIsM?&A8ORP6Gy4S;j?kF3kg&f6G0pRcXnjU@NCotozFthi>cdAG0V z+*jK0KYRmHQ&Y^0%gFgaG%a1F7>_=i-!F3Uw+Yx-u{h%{;gprP`qQWSut-oCG{;A+fM3B kduo-(%JpmSzjO@LtU0rx`t}qL#}AV%GFG~G?%R2P1FMfk7XSbN literal 0 HcmV?d00001 diff --git a/features/patient/src/main/resources/base/media/follow_add_plan_plan.png b/features/patient/src/main/resources/base/media/follow_add_plan_plan.png new file mode 100644 index 0000000000000000000000000000000000000000..5b3827ffc17820b082ee97fff346262403d7b79c GIT binary patch literal 2294 zcmaJ@d00~U8a`@*IypINnOTNNnk2h`FeoZul9EP@(Q;LUqoJ_~nBX=pm6&FkEs{&x z!d%A5vYVBajg@JZnw2%za;a%oTbxW=EC-rw?jN@~&vVXidA|4k-tYU~KTdwc(#5tm zb8G+ruw{oZxyF@XdaWSFFSQzrG%n667GJeo7N<%PC_o@kB#Q-MY>6Nqd&BTp91(*hUSgrgU6$c5h$fbsuHMCQlOQ^}NTWpWsU z@u_RDg&cuUEHzzveL`_KRJK&95=ez0o9PEP@}R|H5tV`WrQk_K0zR05#o<^aUm_zY z*oTY_Br}2nSrqaVmMIe^OF*e=3M={>>+@Bt$q*8`F*6fXh}VOnV1-Nq`&2kp{BdNRL)AoybjfXGx2c<^OD~#s0OT8Qd0G1*)Gmxjg zJ-jM$o#PLVl@jrlG6=HUaYx8Zt4J5^-P{fOgz43nLalQ0G1F|gv0Iv}cvZA%W(Q%% z*b6@XJ4VgW&T$R$L2|2?WyUxXZIH;SOALeRw-*Nn5S}G{6|Mc~jiZR@&i0Cilt*Q0 zoehtB`yvqbb+u0Hx>|R!+l?R(>+8r{8)r83Z3^O8Ld@p%43k%F$byW05764jI05vk zs?j&HU(4VQn`dj#qqOQBokb`(mkiXm<3%nayja?=9W6et8QiuZlD zg;d{Jx+W~eYrxA4nRO?7@y&ItvJM+zfj+RooTo60^3q$bgU)JWy=f=z?%c6$!zI$) zkpp_drib)R_o%S>YM0V)=5E~o2PFEWu0geGi^|I2Az zC0frOAGVM{Sbo%uK|r`olI|{uL0~sHXUzl~OU9zZ%2qn%KH6pRz&tuhP`h~+5MxV> za40(;zYCW^c8g~>bMSi*z}+hq!WI{wYhkN)NW98QV6Qtg6(jZ^3E5*!mQ@|~!NHdw z8(@n04xPik4|D5SO1qkHT-%YYbvO8Iv}Gpm85#H{JDyf}t#7p5s`w}S((IC^SXcUt z5OHrHYM)EiJa5}h1qt5}{c^V$?^3$Lvbdlr()FtOu9t6C1dy<^{#)Sj!6WY@H$2BS zJ0%`lMLUDSLT2;~Ueh%8jzMm~iz}LZy>uFX%TfXH`F>VOW0T^{RcMEskJCc9%*;Im zu~)}B2>*i|F?7kkxwpS{aSa52*h6<~;wXG^Hap?Hp(tPfulv0PhX<@@TlMC@@{ZhJ zf9A3HxvlEds%i~o$lkD`<;bBEOSU$r=vg%@yF3$jl?q*-Hry z27M;?S;v+KjmK%{F;RBz_xgScnz*7q92JvxSDcTRda7?eFCI4tM-rs*N?~riX=*&GAthZYe zcD8Xf{N{s*qFUtKDl0aeeUiw?W;7(vXA!?>yu| zEx$OP2~Dl;@}&86z&XFH_t;?3_69SJgKU8jfV2O>9{RId3*;_13*6@42)rmc@Pp82<5>T0(Ll$#ba}04|ece zAP}fE-#-8hV0sZafB?x>#UP~ukrEAoxVTA0Y|a552n*$f^MyqC>t;C|#^(~@yBwKl zrijdo;M3#8Jij<^e@@&14xS5lbA`D`2}%M14`jonf=Ho+ASJ>-@)DG`%8i1yqu|L-7#bOEZ%=jF=16v@ zVR2{@j_gjN;&Cfj3c!gH@PyzBmispr_f@QFAp|02W(rTtkLGb{Vn6`inMD=y^@smw3StGs+!f1Xge^J3+4r+BChKp?BT85EMg zwC`nbe7eyOhVtpeYtLENf;z^ZmnHZcu^8{p-p%MT&5NWO3fTJGcOFzy>E(xJ)Yb2g z7qAOsD4weU$%3It{q*nE?D#asv^^Y z`XuUJM(p|kZNs{I&9WfbE3Ljo>{R)j07}%!o{lf3Up1b4;-P?`zZqk;4u%bxlt_YP zYqxu~FO_EBxfiraB-DB8rQhKCt!T-`lx2e|_tL_>aZdcWw#XNI z`1&ttcmJi3+owqj9zLB~KOiKV%|t)JDH^iVHjCjY6F#zu!KndFjOa z@%gk7ZEE$!sfF=9A*zwRSYzVJ?;hX8+sei0Zuf)PHOs&W(mz{|~ ze4p0cWMlTNRmHI1X&b9{MoQi@+ExVPCPEbaPB6;bdv1cCY9K3+)%O7ovT&)9s2v)s z-dpx!Pa19H(d0 zGp-R#T$jXGZ6UG^9dgd6S-7*!Dk5cHs!<(tJ{-g;x|*Y4?ae{)W0btsmNEoqjg2t?L;;Cym-J*K11 zu^L@6^RpdRXPV!+C#3gXxUvil=aYdYp(cX&)H*{ta|VCiC%@97qsM!yXP~UpFQ<+d zdF+Vkd`$`Eg4p=wwjOe$X50SP*|}#ma(dhrPRB!}%<6qN_3rPmwi&qaz>GE6|3}9u z*4r_k;fT?=u?9)WRby9gIN|a&cAI3(p%poyU5&E(P5P zW~ACx`{lqCvh(tgBU!AAW^J?AQAUWuvkPNYuPJG;Ql?aN3 zbYemPhr*FF5s^3|Pl3ecMe_uCSpu4nxIGlyrh%*i5=6xZHIi(p64KC#uXQ2o-gZqU zg0CT}EIRRzq!Kw?kSS9jU;rt=M?j(agF!SBHGt|LOx+6lQmB4piXWNk=R@^{C^U!~ z0KR#M)@TZ0Iuy$ae-q1kq7y|bl^i0I)oL|K?MIR+GRRaKjYg*Ul6`%BtOy@vu2jX> z_(+vrOA0JRDNu;zDzQuo+7$U|vK$qiXwCGG5+w4svQp)nHdz}+*6`(IDv4q%X$i>T z{C}uK@)oUB#Ug*^`#*)1yj(d#jzyHR9EHF-xO6XDC^^JbAbgcf!IR0dm%7Lm$y73> zNG1oFOwc<)EEUSs%FVCg91avIRjT+>0TRig6RiRyu~-QCF&W|PAYV9;5)eeCvIB#e za4?HW3l3(m{h7>Qc!|rB334QeRJFtv{>f!7%e6T{BDY3nAqw$d5Mj7NCIMep42hS| zg|@8T8?JEqTo}u8$<}1Zwz>Y-oR_Yw=CN(xy4HGl>w83MHM_#<>Q5)L6953Mk7O}; zn&GLFqaWjA@IO7S-&MhOfn#}@1mO|4qw}%cTgki1aqQ<0jguQXw!#g^Up<}JUM6&j zNjfuIzNr1o+o$IH3#N!p%UXhI*Rk!5kNLk`k5^}?(=+Z?G;esJV5k2+vM|=OxOci@ z_Qm3UY8Kpca1Qm!&5XhpVQ9I%q_7eGsLJ1aMbv@T&+ZbQubX$wVVpKjnm;l*dmLV& zeRRI14uxwo>069;qIWL&>-MdwV%PcqYcz&*6*d?*S~mC#LkuU-68Hz z17P$E}K?5CGu z@G#?-o;zuNLi->IlXAMUJ)R&ryb-W3am4LMMMd zA70NL+*oj{ih_Z@sKESsu4IN!HllDXU-{8%=xyHQGT)tdt|mELyd(4)HoC$ggT+lZ zj(DCb{MEfxR^deKWOeGz(R1h!!g}H!*WstB-xMswPEgx=;IkY0f6+RRzVyKHCz6s9 zIa-R+{A{FFKf1@%_rq*T17O$KRSQ~Pb;`M$fwViUqJ`Ys(x4Xb(nNWLWcP-xo8u7U zwUrN^Hy5e*p4(QGJ3jD|I#<}g5q4zy7KgfmcKy>{#t&tOI&dA{5ZU|GNR+ znCcYtkidVYEy``(n%I#JH0CnqKC~wu!&)yh>!zXa@OClo+5K)$N~HK8H*Hw{l%u2W zTm%ZsHa3p^J%KwC_Wc*0+|j&tU1~^oNL15M&~#-n2HmQICl+>Nbn_Di0=iwZ@y^ls zgxaQW|KWTFaQJ2-pc$~69s6=*1>Y-5%b=kjtv>Jsj>yHB;BQ$JVvb5y_8r^!& zV2&<5g>Mqw4|GX((D9w%^0s~5D6FY;;AZhBtxh{mp=!!@q=xjZKG0vavuG5h4^N$k zey=G7xXCl^y{nJuQVA~Hx}q)FfKhjQ#yn+T4V9sspaI&ZOD?Hd<3QE1hqZx+SkJ)k zqH8Uc-Er{8jI(0_`CI?Fink+ha7f(AJQqD{^s}4a{j$}3K?{|&5Q8Al; z+%kF4BTvuX)ZaYilUz90;P?RU<{8mP(N{J-X>e4%JJg$uB)QFNIF$Fg)jfU-Opm`V au1y6RA{L4#?F>D(KXfEJnpF>{>iz?w)j=Hq literal 0 HcmV?d00001 diff --git a/features/patient/src/main/resources/base/media/follow_list_rowLine.png b/features/patient/src/main/resources/base/media/follow_list_rowLine.png new file mode 100644 index 0000000000000000000000000000000000000000..bd77526805ec629de04e916f790369cde9fb4850 GIT binary patch literal 2146 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 literal 0 HcmV?d00001 diff --git a/features/patient/src/main/resources/base/media/record_add_list.png b/features/patient/src/main/resources/base/media/record_add_list.png new file mode 100644 index 0000000000000000000000000000000000000000..25110cca0502fa1de81aee3d9013dfe3d5bd6dc1 GIT binary patch literal 1061 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 lQ!D*Hlj$%1Xd$8@+P^@hvjS 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 literal 0 HcmV?d00001 diff --git a/features/patient/src/main/resources/base/media/record_list_time_dian.png b/features/patient/src/main/resources/base/media/record_list_time_dian.png new file mode 100644 index 0000000000000000000000000000000000000000..52d42a6f6a8f575064b6caa469575d6af437a502 GIT binary patch literal 2760 zcmaJ@dpwi-A0I18?w3f(OyzQ7o6Fk9N;a1rjbR7nlGz?M>|z_69l0E0I)|vNatpbY zQs|C!IXURa9G9c%LUnME6jDOJ=~UdOgqg@_N7DpWFM7CzIsqrlw-30s?{5 z2<~_v`3hfom6haQf5rD1@?`_xC4leC4(AIfTmZD2#ts7@1STZ{@Bt{a_?ULU5d;F8 zFvtP?0OB4DmCdxKtYEB#Opcrl0y*vyawya&fDZ`+A{ZGX7SFT}D$R`Lt3Jd)w zsQ@Agf@5<5h`qJF6%~%KgX}=L?*h4-)Pi zEga*6cl{hoe!@cOd_D&Qg9!uzYk{pbn;QW`pwVa;+y-W2V_qk2-hQWjs4h&%pUn%JekVyRhP$u&$ zn#cD6{>}G)3iHVE902A6@Yu0js(f(arYoU17#tU%@Y!54n;re7izGUm&*stD90(2v zG52S%Xlwz`;uD-m#1L3KK7~aE2zV@1E?~`I&@d>ttqac8-rf$e+ZlmyL85T>cr?nz z&czOmL%QJcU$}TSHI@mm_+PlRf4RtSa#x(djra{Koz=dqdYOicCuUriT{4(dhK!vN#_Pu-#-rC3 zmF;d$6DiFZ81i@nYEDwWO=D`+7u4%@)_DucETt!EO?H58XLPTQb#CdP*>E;Es0S^9 zL(>}944}~9z6&fydcVv}8n9R4?1%Z1s>ZHKKhVX0L@Pmr`GXIusqY0> z9$3R|V~lcw4z=r*@6^GEpehX5L~P+^k1GjXmA{kR<9BZ^ zl+EUH?0TyybbLy?6677au%@9Z!i;S!b}Rw;x4gy~o;aoloAPOb6k*#>>t zb}_{)X4X*6J0nR8vu1y9^Fl|*>}(<`#BX|?-|}OP=vC=~LBGAfdxR}Os21X(R{+;4 zO?`?7Y3c8HS%*;hePj*8ih5wK;+~WgqQbmvFRe&aQa9**wEv_ED@EsE@)p8!gav0t zD2XdN?Rn=+IRZc8_j-sizTJH(h>I)o8Y~?fN;L0q1X&$EJ12=Te6H5>T-yY-bHlmG z$t`^zQ#YC*$M2~g1N9p8?!oz*=e3;7TTG#o|EgGcL9M|O$j>AHq zx@#S>x7F$Y`(8B_EMh(+S9K#$w4-2|Vm(TYUn;G&{!FrS6=n|U_cc$E*Ux(p5|Z69GP9#8)n zOsX+?bu=YK-!Qk}#%9dmApX9RRj^4yP&pN(o@uJ4#`BO!hL&U#WqRw4JZ%{=1J!-k z!VjreWJ+dSD?J8KC$ml%rI~7`btG=}H$xr}ckL%WjY6JET5?a%`Sou-l}O!A10MHBI_f}<)@%wPG@Q&Hnq=M~y6 z6ui@a9BfEf+=3d$_VZGw4s0Tn{pln0_d1S@5vU=q&dxbky(>8KNT*D1-@^f?f!gL! z1```PJ$pXk1MA`yfu>a;*C*q8alhM$u8i4r=I9Y+iU0KW9QKkHO;Txg9q?059Ars4 zb>?<<5=q4uj>eE@ZIe9$A5q#3g1{~r8t#hPx^I#A@J*>&n?tq{3)=XrS6Ky`WPJxz zG#DATglJ9J;~eT=E_UW!!XD^3pmZ-{Dj~p^qcBpHpz>hn&Ga)MLjs^Z)78K(SEgL6 zPdYr^=SeLPb==B(ZIQR3=4fd52zyWQ=2!u1xOLg{Rb|NO+qXv36BAWt=E9y-UMPIh zw6->)a^~>7_@K&;xh3sDI^HfM`}LF!^riVbYvJ>x(zWvsic<>9Q6_!aPSY)ho$DwH z-@h1n-E=B07%#{OB>y0IDDed?&)*!%%0Xku&=EQP?x>*>)2$sZA4bM&imKv`*~gBFa>p%UlLL1a zn}-%BE&iNwWu)|)Rvs*jc%%DfesBB4-et0ip43bi{;{(o`Oc}N@y1sAU8B??n7EJ9 zVPc$8HNE{+V`l+GBlVW_FL?OdAW5HXKF;NkPp~jErl5Y;N9k_~nYLRD^Jlf0 z4fbi!xx-IM`&#?DPPqg}v63EVHa7L=|5kGDTylE7_E`TIF}?eCh^1l|a&?!J#tn-w zv$Dz(&rL71%||dVG=K6hSg1oUM>;W@%zHJ*i0VHZf%v?Q=4HR~F(11^Wmn;&Ek8&N z^jUaw?-8YDw}xJjHzB`=Z@B-Lk{?DQd!D&`Z0t-@R0TO%KizuGHTm4iza_!N6JP5b H`qO^^8;zuS literal 0 HcmV?d00001 diff --git a/products/expert/src/main/ets/pages/MinePage/SettingPage.ets b/products/expert/src/main/ets/pages/MinePage/SettingPage.ets index 9cb4b7d..ce2b54a 100644 --- a/products/expert/src/main/ets/pages/MinePage/SettingPage.ets +++ b/products/expert/src/main/ets/pages/MinePage/SettingPage.ets @@ -146,7 +146,7 @@ struct SettingPage { } else if (index == 5) { this.clearCache(); } else if (index == 6) { - router.pushUrl({url:'pages/MinePage/FeedbackPage'}) + router.pushUrl({url:'pages/MinePage/FeedbackPage',params:{"title":"意见反馈"}}) } else if (index == 7) { router.pushUrl({url:'pages/MinePage/CancelAccount'}) } else if (index == 8) {