tab2.page.ts 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. import { Component } from '@angular/core';
  2. import { Router } from '@angular/router';
  3. import { IonHeader, IonToolbar, IonTitle, IonContent, ModalController, IonButton } from '@ionic/angular/standalone';
  4. import { ExploreContainerComponent } from '../explore-container/explore-container.component';
  5. import { ChatPanelOptions, FmChatModalInput, FmodeChat, FmodeChatMessage, openChatPanelModal } from 'fmode-ng';
  6. // import { ModalAudioMessageComponent } from 'fmode-ng/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component';
  7. import Parse from "parse";
  8. import {
  9. IonCard,
  10. IonCardHeader,
  11. IonCardTitle,
  12. IonCardSubtitle,
  13. IonCardContent,
  14. IonGrid,
  15. IonRow,
  16. IonCol,
  17. IonIcon
  18. } from '@ionic/angular/standalone';
  19. @Component({
  20. selector: 'app-tab2',
  21. templateUrl: 'tab2.page.html',
  22. styleUrls: ['tab2.page.scss'],
  23. standalone: true,
  24. imports: [
  25. IonHeader, IonToolbar, IonTitle, IonContent, ExploreContainerComponent,
  26. IonButton,
  27. IonCard,
  28. IonCardHeader,
  29. IonCardTitle,
  30. IonCardSubtitle,
  31. IonCardContent,
  32. IonGrid,
  33. IonRow,
  34. IonCol,
  35. IonIcon,
  36. // ASR语音输入模块
  37. FmChatModalInput,
  38. // ModalAudioMessageComponent
  39. ]
  40. })
  41. export class Tab2Page {
  42. constructor(
  43. private modalCtrl:ModalController,
  44. private router:Router,
  45. ) {
  46. }
  47. title:string = "123"
  48. /** 示例:问诊ChatPanel面板 */
  49. openInquiry(){
  50. localStorage.setItem("company","E4KpGvTEto")
  51. let options:ChatPanelOptions = {
  52. roleId:"2DXJkRsjXK",
  53. onChatInit:(chat:FmodeChat)=>{
  54. console.log("onChatInit");
  55. console.log("预设角色",chat.role);
  56. // 角色名称
  57. chat.role.set("name","晓晓");
  58. // 角色称号
  59. chat.role.set("title","全科医生");
  60. // 角色描述
  61. chat.role.set("desc","一名亲切和蔼的门诊全科主任医生,晓晓,年龄36岁");
  62. // 角色标签
  63. chat.role.set("tags",["全科","门诊"]);
  64. // 角色头像
  65. chat.role.set("avatar","https://nova-cloud.obs.cn-south-1.myhuaweicloud.com/storage/aigc/imagine/Q4Zif7fTbK-0.png")
  66. // 角色提示词
  67. chat.role.set("prompt",`
  68. # 角色设定
  69. 您是一名亲切和蔼的专业的全科医生,晓晓,年龄36岁,需要完成一次完整的门诊服务。
  70. # 对话环节
  71. 0.导诊(根据用户基本情况,引导挂号合适的科室)
  72. 1.预设的问询方式(感冒问呼吸、肚子疼叩诊)
  73. - 打招呼,以用户自述为主
  74. - 当信息充足时候,确认用户症状对应的科室,并进入下一个环节
  75. 2.拓展的问询细节
  76. 例如:用户反映呼吸不畅,拓展出:是否咳嗽;是否感觉痛或者痒等其他需要的问题。
  77. - 当问询细节补充完成后进入下一个环节
  78. 3.初步的诊断结果,并且同时列出检查检验项目
  79. 初步诊断:确定需要有哪些进一步检查
  80. 检查检验:获取医学客观数据
  81. - 等待用户提交客观数据,进入下一阶段
  82. 4.给出诊断方案并给出处方
  83. - 完成处方时,请在消息结尾附带: [完成]
  84. # 开始话语
  85. 当您准备好了,可以以一个医生的身份,向来访的用户打招呼。`);
  86. // 对话灵感分类
  87. let promptCates = [
  88. {
  89. "img": "https://file-cloud.fmode.cn/UP2cStyjuk/20231211/r1ltv1023812146.png",
  90. "name": "外科"
  91. },
  92. {
  93. "img": "https://file-cloud.fmode.cn/UP2cStyjuk/20231211/fo81fg034154259.png",
  94. "name": "内科"
  95. },
  96. {
  97. "img": "https://file-cloud.fmode.cn/UP2cStyjuk/20231211/fc1nqi034201098.png",
  98. "name": "心理"
  99. }
  100. ]
  101. setTimeout(() => {
  102. chat.role.set("promptCates",promptCates)
  103. }, 500);
  104. // 对话灵感列表
  105. let promptList = [
  106. {
  107. cate:"外科",img:"https://file-cloud.fmode.cn/UP2cStyjuk/20231211/r1ltv1023812146.png",
  108. messageList:["局部疼痛或肿胀","伤口出血或感染","关节活动受限","体表肿块或结节","外伤后活动障碍","皮肤溃疡不愈合","异物刺入或嵌顿","术后并发症复查","肢体麻木或无力","运动损伤疼痛"]
  109. },
  110. {
  111. cate:"内科",img:"https://file-cloud.fmode.cn/UP2cStyjuk/20231211/fo81fg034154259.png",
  112. messageList:["反复发热或低热","持续咳嗽咳痰","胸闷气短心悸","慢性腹痛腹泻","头晕头痛乏力","体重骤增或骤减","食欲异常或消化不良","尿频尿急尿痛","睡眠障碍易醒","异常出汗或怕冷"]
  113. },
  114. {
  115. cate:"心理",img:"https://file-cloud.fmode.cn/UP2cStyjuk/20231211/fc1nqi034201098.png",
  116. messageList:["持续情绪低落","焦虑紧张不安","失眠或睡眠过多","注意力难以集中","社交恐惧回避","强迫思维或行为","记忆减退疑虑","躯体无器质性疼痛","自杀倾向念头","现实感丧失体验"]
  117. },
  118. ]
  119. let ChatPrompt = Parse.Object.extend("ChatPrompt");
  120. setTimeout(() => {
  121. chat.promptList = promptList.map(item=>{
  122. let prompt = new ChatPrompt();
  123. prompt.set(item);
  124. prompt.img = item.img;
  125. return prompt;
  126. })
  127. }, 500);
  128. },
  129. onMessage:(chat:FmodeChat,message:FmodeChatMessage)=>{
  130. console.log("onMessage",message)
  131. let content:any = message?.content
  132. if(typeof content == "string"){
  133. if(content?.indexOf("[完成]")>-1){
  134. console.log("门诊已完成")
  135. }
  136. }
  137. },
  138. onChatSaved:(chat:FmodeChat)=>{
  139. // chat?.chatSession?.id 本次会话的 chatId
  140. console.log("onChatSaved",chat,chat?.chatSession,chat?.chatSession?.id)
  141. }
  142. }
  143. openChatPanelModal(this.modalCtrl,options)
  144. }
  145. /**
  146. * 开始聊天
  147. */
  148. openChat(){
  149. let options:ChatPanelOptions = {
  150. roleId:"2DXJkRsjXK",
  151. onChatSaved:(chat:FmodeChat)=>{
  152. // chat?.chatSession?.id 本次会话的 chatId
  153. console.log("onChatSaved",chat,chat?.chatSession,chat?.chatSession?.id)
  154. },
  155. }
  156. openChatPanelModal(this.modalCtrl,options)
  157. }
  158. /**
  159. * 恢复聊天
  160. * @chatId 从onChatSaved生命周期中,获取chat?.chatSession?.id
  161. */
  162. restoreChat(chatId:string){
  163. let options:ChatPanelOptions = {
  164. roleId:"2DXJkRsjXK",
  165. chatId:chatId
  166. }
  167. openChatPanelModal(this.modalCtrl,options)
  168. }
  169. goChat(){
  170. this.router.navigateByUrl("/chat/session/role/2DXJkRsjXK")
  171. }
  172. // audioModalHeightPoint:number = 0.35;
  173. // async startTalk(){
  174. // // 根据手机兼容性,适配组件弹出高度
  175. // let height = document.body.clientHeight || 960;
  176. // this.audioModalHeightPoint = Number((165/height).toFixed(2));
  177. // // 弹出组件
  178. // let modal:any
  179. // let chat:any
  180. // modal = await this.modalCtrl.create({
  181. // component:ModalAudioMessageComponent,
  182. // componentProps:{
  183. // chat:chat,
  184. // modal:modal,
  185. // onBreakPointSet:()=>{
  186. // modal?.setCurrentBreakpoint(this.audioModalHeightPoint)
  187. // }
  188. // }
  189. // })
  190. // modal.present();
  191. // }
  192. }