yuebuzu-creater 4 месяцев назад
Родитель
Сommit
174825234c

+ 13 - 0
wisdom-app/src/app/page/page-create-agent/page-create-agent.component.html

@@ -35,4 +35,17 @@
     </ion-list>
   </div>
   <ion-button (click)="createAgent()" expand="block" color="primary" >创建ai医生</ion-button>
+  
+  <ion-list>
+    <ion-item (click)="openInquiry(agent)" *ngFor="let agent of agentList" lines="none">
+      <ion-thumbnail slot="start">
+        <img [src]="agent.get('avatar') || '../../assets/image/doctor7.png'" [alt]="agent.get('name')" />
+      </ion-thumbnail>
+      <div class="doctor-info">
+        <h3>{{ agent.get('name') }}({{ agent.get('age') }}岁)</h3>
+        <p>{{ agent.get('desc') }}</p>
+      </div>
+    </ion-item>
+  </ion-list>
+
 </ion-content>

+ 117 - 3
wisdom-app/src/app/page/page-create-agent/page-create-agent.component.ts

@@ -3,7 +3,7 @@ import { Router } from '@angular/router';
 import { CloudObject, CloudQuery, CloudUser } from 'src/lib/ncloud';
 import { IonHeader, IonToolbar, IonTitle, IonContent, IonButton,IonIcon, ModalController, IonTextarea, IonInput, IonCard, IonCardHeader, IonCardTitle, IonThumbnail, IonCardContent, IonCardSubtitle, IonItem, IonList, IonLabel, IonAvatar, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
 import { CommonModule } from '@angular/common';
-import { AvatarModule } from 'fmode-ng';
+import { AvatarModule, ChatPanelOptions, FmodeChat, FmodeChatMessage, openChatPanelModal } from 'fmode-ng';
 
 
 @Component({
@@ -63,6 +63,17 @@ export class PageCreateAgentComponent  implements OnInit {
     this.desc = e.detail.value;
     console.log(this.desc);
   }
+  // 头像 大模型生成图片
+  avatar: string = ''
+  getAvatar() {
+    // 通过大模型生成图片 根据用户的描述年龄性别名字
+    this.avatar = ''
+  }
+  changeDesc(e:any): any{
+    // 通过大模型,根据用户的描述将desc更标准
+    return "标准描述"
+  }
+
   // 创建医生
   createAgent() {
     localStorage.setItem("company","E4KpGvTEto")
@@ -77,15 +88,118 @@ export class PageCreateAgentComponent  implements OnInit {
     if(this.currentUser?.id){
       ACL[this.currentUser?.id] = {read:true,write:true}
     }
+    let description = this.desc
+    description = this.changeDesc(description)
     consult.set({
-      avatar:``,
+      avatar:`${this.avatar}`,
       name:`${this.name}`,
       age:`${this.age}`,
       gender:`${this.gender}`,
-      desc:`${this.desc}`,
+      desc:`${description}`,
       user:this.currentUser.toPointer(),
       ACL:ACL,
     })
+    consult.save();
+    console.log(consult);
+  }
+  
+  agentList: Array<CloudObject> = [];
+  async loadAgentData() {
+    let query = new CloudQuery("DoctorAgent")
+    this.agentList = await query.find()
+    console.log(this.agentList);
+  }
+
+  openInquiry(doctor:CloudObject){
+    // 验证用户登录
+    let currentUser = new CloudUser();
+    let userPrompt = ``
+    if(currentUser?.get("realname")){
+            userPrompt += `当前来访的患者,姓名:${currentUser?.get("realname")}`
+          }
+    if(currentUser?.get("gender")){
+      userPrompt += `,性别:${currentUser?.get("gender")}`
+    }
+    if(currentUser?.get("age")){
+      userPrompt += `,年龄:${currentUser?.get("age")}`
+    }
+    
+    localStorage.setItem("company","E4KpGvTEto")
+
+    let consult = new CloudObject("Consultation")
+    let now = new Date();
+    let dateStr = `${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}`
+    // 对象权限的精确指定
+    let ACL:any = {
+      "*":{read:true,write:true}
+    }
+    if(currentUser?.id){
+      ACL[currentUser?.id] = {read:true,write:true}
+    }
+    consult.set({
+      title:`${doctor.get('depart')?.name || ""}门诊记录${dateStr}-${doctor?.get("name")}`,
+      doctor:doctor.toPointer(),
+      depart:{
+        __type:"Pointer",
+        className:"Department",
+        objectId:doctor.get("depart")?.objectId
+      },
+      user:currentUser.toPointer(),
+      ACL:ACL
+    })
+
+    let options:ChatPanelOptions = {
+      roleId:"2DXJkRsjXK",
+      onChatInit:(chat:FmodeChat)=>{
+        console.log("onChatInit");
+              console.log("预设角色",chat.role);
+              chat.role.set("name",doctor?.get("name"));
+              chat.role.set("title",doctor?.get("title"));
+              chat.role.set("desc",doctor?.get("desc"));
+              chat.role.set("tags",doctor?.get("qualifications"));
+              chat.role.set("avatar",doctor?.get("avatar") || "../../assets/image/doctor7.png")
+              chat.role.set("prompt",`
+# 角色设定
+您是${doctor?.get("name")},${doctor?.get("desc")},年龄${doctor?.get("age")}岁,需要完成一次完整的门诊服务。
+
+# 对话环节
+0.导诊(根据用户基本情况,引导挂号合适的科室)
+1.预设的问询方式(根据不同症状来问询具体的情况)
+- 打招呼,以用户自述为主
+- 当信息充足时候,确认用户症状对应的科室,并进入下一个环节
+2.拓展的问询细节
+例如:用户反映呼吸不畅,拓展出:是否咳嗽;是否感觉痛或者痒等其他需要的问题。
+- 当问询细节补充完成后进入下一个环节
+3.初步的诊断结果,并且同时列出检查检验项目
+初步诊断:确定需要有哪些进一步检查
+检查检验:获取医学客观数据
+- 等待用户提交客观数据,进入下一阶段
+4.给出诊断方案并给出处方
+- 完成处方时,请在消息结尾附带: [处方完成]
 
+# 开始话语
+当您准备好了,可以以一个医生的身份,向来访的用户打招呼。
+${userPrompt}
+`);
+        },
+        onMessage:(chat:FmodeChat,message:FmodeChatMessage)=>{
+          console.log("onMessage",message)
+          let content:any = message?.content
+          if(typeof content == "string"){
+            if(content?.indexOf("[处方完成]")>-1){
+              console.log("门诊已完成")
+              consult.set({
+                content:content // 处方内容
+              })
+              consult.save();
+            }
+          }
+        },
+        onChatSaved:(chat:FmodeChat)=>{
+          // chat?.chatSession?.id 本次会话的 chatId
+          console.log("onChatSaved",chat,chat?.chatSession,chat?.chatSession?.id)
+        }
+      }
+      openChatPanelModal(this.modalCtrl,options)
   }
 }

+ 3 - 2
wisdom-app/src/app/page/page-inquiry/page-inquiry.component.ts

@@ -33,7 +33,8 @@ addIcons({radioButtonOffOutline,reloadOutline,checkmarkCircleOutline,closeCircle
 
 export class PageInquiryComponent  implements OnInit {
   createAI(){
-    this.router.navigate(['/tabs/tab1']);
+    this.router.navigate(['/tabs/create-agent']);
+    console.log("createAI")
   }
 
   ngOnInit(){
@@ -160,7 +161,7 @@ export class PageInquiryComponent  implements OnInit {
       let dateStr = `${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}`
       // 对象权限的精确指定
       let ACL:any = {
-        "*":{read:false,write:false}
+        "*":{read:true,write:true}
       }
       if(currentUser?.id){
         ACL[currentUser?.id] = {read:true,write:true}