import { Component, OnInit, ChangeDetectorRef } from '@angular/core'; import { Router } from '@angular/router'; import { addIcons } from 'ionicons'; import { checkmarkCircle, calendar, helpCircle } from 'ionicons/icons'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { IonButtons, IonItem, IonList, IonHeader, IonIcon, IonToolbar, IonContent, IonSegment, IonSegmentButton, IonGrid, IonRow, IonCol, IonButton, IonLabel, IonBadge, IonInput, ModalController } from '@ionic/angular/standalone'; import { FmodeChatCompletion, ImagineWork, DalleOptions, ChatPanelOptions, FmodeChat, FmodeChatMessage, openChatPanelModal } from "fmode-ng"; import { AgentTaskStep } from './agent/agent.task'; import { TaskPoemPictureDesc } from './agent/tasks/poem/poem-desc'; import { TaskPoemPictureCreate } from './agent/tasks/poem/poem-picture'; import { startTask } from './agent/agent.start'; import { TaskInqueryUserStory } from './agent/tasks/poem/inquiry/1.inquiry-user-story'; import { TaskInqueryDoctorQuestion } from './agent/tasks/poem/inquiry/2.inquiry-doctor-question'; import { TaskInqueryUserAnswer } from './agent/tasks/poem/inquiry/3.inquiry-user-answer'; @Component({ selector: 'app-tab2', templateUrl: 'tab2.page.html', styleUrls: ['tab2.page.scss'], standalone: true, imports: [ IonButtons, IonItem, IonList, IonIcon, FormsModule, CommonModule, IonHeader, IonToolbar, IonContent, IonSegment, IonSegmentButton, IonGrid, IonRow, IonCol, IonButton, IonLabel, IonBadge, IonInput ] }) export class Tab2Page implements OnInit { selectedTab: string = 'checkin'; // 默认选中的tab weekPlan: any[] = [ { date: '周一', bodyPart: '胸部', tasks: ['卧推', '哑铃飞鸟', '俯卧撑', '仰卧起坐'], completed: false }, { date: '周二', bodyPart: '背部', tasks: ['引体向上', '划船', '拉力器背肌'], completed: false }, { date: '周三', bodyPart: '腿部', tasks: ['深蹲', '腿推', '腿弯举'], completed: false }, { date: '周四', bodyPart: '肩部', tasks: ['肩推', '侧平举', '前平举'], completed: false }, { date: '周五', bodyPart: '腹部', tasks: ['仰卧起坐', '卷腹', 'Russian twist'], completed: false } ]; constructor(private router: Router, private modalCtrl: ModalController, private cdr: ChangeDetectorRef) { addIcons({ checkmarkCircle, calendar, helpCircle }); } ngOnInit() { // 初始时不需要强制触发视图更新 } editPlan(day: any) { console.log('编辑计划:', day); // 这里可以打开一个编辑页面或者弹窗,修改该计划 // 示例:打开编辑页面 // this.navCtrl.navigateForward('/edit-plan', { queryParams: { plan: day } }); } // 删除计划 deletePlan(day: any) { console.log('删除计划:', day); const index = this.weekPlan.indexOf(day); if (index !== -1) { this.weekPlan.splice(index, 1); } } //问诊区域 taskList: AgentTaskStep[] = [] //一个等待一秒的函数 每经过一秒 wait(duration: number = 1000) { return new Promise(resolve => { setTimeout(() => { resolve(true) }, duration); }) } shareData: any = {} // 任务:完成故事意境描述及图像绘制 doPoemTask() { let task1 = TaskPoemPictureDesc({ shareData: this.shareData, modalCtrl: this.modalCtrl }); let task2 = TaskPoemPictureCreate({ shareData: this.shareData, modalCtrl: this.modalCtrl }); let PoemTaskList = [task1, task2] this.taskList = PoemTaskList startTask(PoemTaskList) } doInqueryTask() { let task1 = TaskInqueryUserStory({ shareData: this.shareData, modalCtrl: this.modalCtrl }); let task2 = TaskInqueryDoctorQuestion({ shareData: this.shareData, modalCtrl: this.modalCtrl }); let task3 = TaskInqueryUserAnswer({ shareData: this.shareData, modalCtrl: this.modalCtrl }); // 定义任务集 let InquireServiceTaskList = [ task1, task2, task3 ] // 传递给显示组件 this.taskList = InquireServiceTaskList // 开始执行任务 startTask(InquireServiceTaskList) } // 聊天页面 openInquiry() { localStorage.setItem("company", "E4KpGvTEto") let options: ChatPanelOptions = { roleId: "2DXJkRsjXK", onChatInit: (chat: FmodeChat) => { console.log("onChatInit"); console.log("预设角色", chat.role); chat.role.set("name", "晓晓"); chat.role.set("title", "全科医生"); chat.role.set("desc", "一名亲切和蔼的门诊全科主任医生,晓晓,年龄36岁"); chat.role.set("tags", ["全科", "门诊"]); chat.role.set("avatar", "https://nova-cloud.obs.cn-south-1.myhuaweicloud.com/storage/aigc/imagine/Q4Zif7fTbK-0.png") chat.role.set("prompt", ` # 角色设定 您是一名亲切和蔼的专业的全科医生,晓晓,年龄36岁,需要完成一次完整的门诊服务。 # 对话环节 0.导诊(根据用户基本情况,引导挂号合适的科室) 1.预设的问询方式(感冒问呼吸、肚子疼叩诊) - 打招呼,以用户自述为主 - 当信息充足时候,确认用户症状对应的科室,并进入下一个环节 2.拓展的问询细节 例如:用户反映呼吸不畅,拓展出:是否咳嗽;是否感觉痛或者痒等其他需要的问题。 - 当问询细节补充完成后进入下一个环节 3.初步的诊断结果,并且同时列出检查检验项目 初步诊断:确定需要有哪些进一步检查 检查检验:获取医学客观数据 - 等待用户提交客观数据,进入下一阶段 4.给出诊断方案并给出处方 - 完成处方时,请在消息结尾附带: [完成] # 开始话语 当您准备好了,可以以一个医生的身份,向来访的用户打招呼。`); }, onMessage: (chat: FmodeChat, message: FmodeChatMessage) => { console.log("onMessage", message) let content: any = message?.content if (typeof content == "string") { if (content?.indexOf("[完成]") > -1) { console.log("门诊已完成") } } }, onChatSaved: (chat: FmodeChat) => { // chat?.chatSession?.id 本次会话的 chatId console.log("onChatSaved", chat, chat?.chatSession, chat?.chatSession?.id) } } openChatPanelModal(this.modalCtrl, options) } openChat() { let options: ChatPanelOptions = { roleId: "2DXJkRsjXK", onChatSaved: (chat: FmodeChat) => { // chat?.chatSession?.id 本次会话的 chatId console.log("onChatSaved", chat, chat?.chatSession, chat?.chatSession?.id) }, } openChatPanelModal(this.modalCtrl, options) } restoreChat(chatId: string) { let options: ChatPanelOptions = { roleId: "2DXJkRsjXK", chatId: chatId } openChatPanelModal(this.modalCtrl, options) } goChat() { this.router.navigateByUrl("/chat/session/role/2DXJkRsjXK") } // audioModalHeightPoint:number = 0.35; // async startTalk(){ // // 根据手机兼容性,适配组件弹出高度 // let height = document.body.clientHeight || 960; // this.audioModalHeightPoint = Number((165/height).toFixed(2)); // // 弹出组件 // let modal:any // let chat:any // modal = await this.modalCtrl.create({ // component:ModalAudioMessageComponent, // componentProps:{ // chat:chat, // modal:modal, // onBreakPointSet:()=>{ // modal?.setCurrentBreakpoint(this.audioModalHeightPoint) // } // } // }) // modal.present(); // } // 页面跳转功能 goToPage(page: string) { // 更新选中的tab this.selectedTab = page; this.router.navigate([`/tabs/${page}`]); // 然后再进行路由跳转 // 手动检测视图变化,确保数据绑定正确 this.cdr.detectChanges(); } }