|
@@ -14,7 +14,9 @@ import { CommonModule, DecimalPipe } from '@angular/common';
|
|
import { addIcons } from 'ionicons';
|
|
import { addIcons } from 'ionicons';
|
|
import { radioButtonOffOutline, reloadOutline, checkmarkCircleOutline, closeCircleOutline } from 'ionicons/icons';
|
|
import { radioButtonOffOutline, reloadOutline, checkmarkCircleOutline, closeCircleOutline } from 'ionicons/icons';
|
|
import { IonCard, IonCardContent, IonCardHeader, IonCardSubtitle, IonCardTitle, IonItem, IonList, IonThumbnail } from '@ionic/angular/standalone';
|
|
import { IonCard, IonCardContent, IonCardHeader, IonCardSubtitle, IonCardTitle, IonItem, IonList, IonThumbnail } from '@ionic/angular/standalone';
|
|
-import { CloudObject, CloudQuery } from 'src/lib/ncloud';
|
|
|
|
|
|
+import { CloudObject, CloudQuery, CloudUser } from 'src/lib/ncloud';
|
|
|
|
+import { openUserLoginModal } from 'src/lib/user/modal-user-login/modal-user-login.component';
|
|
|
|
+import { ChatPanelOptions, FmodeChat, FmodeChatMessage, openChatPanelModal } from 'fmode-ng';
|
|
|
|
|
|
addIcons({radioButtonOffOutline, reloadOutline, checkmarkCircleOutline, closeCircleOutline})
|
|
addIcons({radioButtonOffOutline, reloadOutline, checkmarkCircleOutline, closeCircleOutline})
|
|
@Component({
|
|
@Component({
|
|
@@ -33,83 +35,190 @@ export class Tab2Page {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- taskList:AgentTaskStep[] = []
|
|
|
|
|
|
+ // taskList:AgentTaskStep[] = []
|
|
|
|
|
|
- wait(duration:number=1000){
|
|
|
|
- return new Promise(resolve=>{
|
|
|
|
- setTimeout(() => {
|
|
|
|
- resolve(true)
|
|
|
|
- }, duration);
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
|
|
+ // wait(duration:number=1000){
|
|
|
|
+ // return new Promise(resolve=>{
|
|
|
|
+ // setTimeout(() => {
|
|
|
|
+ // resolve(true)
|
|
|
|
+ // }, duration);
|
|
|
|
+ // })
|
|
|
|
+ // }
|
|
|
|
|
|
- shareData:any = {}
|
|
|
|
|
|
+ // shareData:any = {}
|
|
|
|
|
|
- // 任务:完成故事意境描述及图像绘制
|
|
|
|
- doPoemTask(){
|
|
|
|
- // 产生: shareData.PictureDescResult 生成后描述
|
|
|
|
- let task1 = TaskPoemPictureDesc({shareData:this.shareData,modalCtrl:this.modalCtrl});
|
|
|
|
- // 产生: shareData.images 渲染后图片
|
|
|
|
- let task2 = TaskPoemPictureCreate({shareData:this.shareData,modalCtrl:this.modalCtrl});
|
|
|
|
|
|
+ // // 任务:完成故事意境描述及图像绘制
|
|
|
|
+ // doPoemTask(){
|
|
|
|
+ // // 产生: shareData.PictureDescResult 生成后描述
|
|
|
|
+ // let task1 = TaskPoemPictureDesc({shareData:this.shareData,modalCtrl:this.modalCtrl});
|
|
|
|
+ // // 产生: shareData.images 渲染后图片
|
|
|
|
+ // let task2 = TaskPoemPictureCreate({shareData:this.shareData,modalCtrl:this.modalCtrl});
|
|
|
|
|
|
- // 定义任务集
|
|
|
|
- let PoemTaskList = [task1,task2]
|
|
|
|
- // 传递给显示组件
|
|
|
|
- this.taskList = PoemTaskList
|
|
|
|
- // 开始执行任务
|
|
|
|
- TaskExecutor(PoemTaskList)
|
|
|
|
- }
|
|
|
|
|
|
+ // // 定义任务集
|
|
|
|
+ // let PoemTaskList = [task1,task2]
|
|
|
|
+ // // 传递给显示组件
|
|
|
|
+ // this.taskList = PoemTaskList
|
|
|
|
+ // // 开始执行任务
|
|
|
|
+ // TaskExecutor(PoemTaskList)
|
|
|
|
+ // }
|
|
|
|
|
|
|
|
|
|
- testJSON(){
|
|
|
|
- let string = `
|
|
|
|
- ''''json
|
|
|
|
- {
|
|
|
|
- "keshi": "神经内科",
|
|
|
|
- "sympList": [
|
|
|
|
- {
|
|
|
|
- "title": "偏头痛",
|
|
|
|
- "desc": "持续了2天的偏头疼",
|
|
|
|
- "duration": "2天"
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- "title": "发冷",
|
|
|
|
- "desc": "感觉发冷,已经有一天",
|
|
|
|
- "duration": "1天"
|
|
|
|
- }
|
|
|
|
- ]
|
|
|
|
- }
|
|
|
|
- ''''
|
|
|
|
- `
|
|
|
|
- console.log(extactAndParseJsonFromString(string))
|
|
|
|
- }
|
|
|
|
- // 任务集:医疗问诊任务集 完成一次完整的门诊服务
|
|
|
|
- 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
|
|
|
|
- // 开始执行任务
|
|
|
|
- TaskExecutor(InquireServiceTaskList)
|
|
|
|
- }
|
|
|
|
|
|
+ // testJSON(){
|
|
|
|
+ // let string = `
|
|
|
|
+ // ''''json
|
|
|
|
+ // {
|
|
|
|
+ // "keshi": "神经内科",
|
|
|
|
+ // "sympList": [
|
|
|
|
+ // {
|
|
|
|
+ // "title": "偏头痛",
|
|
|
|
+ // "desc": "持续了2天的偏头疼",
|
|
|
|
+ // "duration": "2天"
|
|
|
|
+ // },
|
|
|
|
+ // {
|
|
|
|
+ // "title": "发冷",
|
|
|
|
+ // "desc": "感觉发冷,已经有一天",
|
|
|
|
+ // "duration": "1天"
|
|
|
|
+ // }
|
|
|
|
+ // ]
|
|
|
|
+ // }
|
|
|
|
+ // ''''
|
|
|
|
+ // `
|
|
|
|
+ // console.log(extactAndParseJsonFromString(string))
|
|
|
|
+ // }
|
|
|
|
+ // // 任务集:医疗问诊任务集 完成一次完整的门诊服务
|
|
|
|
+ // 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
|
|
|
|
+ // // 开始执行任务
|
|
|
|
+ // TaskExecutor(InquireServiceTaskList)
|
|
|
|
+ // }
|
|
|
|
|
|
ngOnInit() {
|
|
ngOnInit() {
|
|
// 生命周期:页面加载后,运行医生列表加载函数
|
|
// 生命周期:页面加载后,运行医生列表加载函数
|
|
- this.loadDoctorList()
|
|
|
|
|
|
+ this.loadExpectList()
|
|
}
|
|
}
|
|
|
|
|
|
// 创建用于数据列表存储的属性
|
|
// 创建用于数据列表存储的属性
|
|
- doctorList:Array<CloudObject> = []
|
|
|
|
|
|
+ expectList:Array<CloudObject> = []
|
|
// 查询并加载医生列表的函数
|
|
// 查询并加载医生列表的函数
|
|
- async loadDoctorList(){
|
|
|
|
- let query = new CloudQuery("Doctor");
|
|
|
|
- this.doctorList = await query.find()
|
|
|
|
|
|
+ async loadExpectList(){
|
|
|
|
+ let query = new CloudQuery("Expect");
|
|
|
|
+ this.expectList = await query.find()
|
|
}
|
|
}
|
|
|
|
|
|
-}
|
|
|
|
|
|
+
|
|
|
|
+ /** 示例:问诊根据expect拼接提示词 */
|
|
|
|
+ async openInquiry(expect:any){
|
|
|
|
+ // 验证用户登录
|
|
|
|
+ let currentUser = new CloudUser();
|
|
|
|
+ let userPrompt = ``
|
|
|
|
+ if(!currentUser?.id){
|
|
|
|
+ console.log("用户未登录,请登录后重试");
|
|
|
|
+ let user = await openUserLoginModal(this.modalCtrl);
|
|
|
|
+ if(!user?.id){
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ currentUser = user;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ console.log(expect.get('depart'))
|
|
|
|
+
|
|
|
|
+ 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:false,write:false}
|
|
|
|
+ }
|
|
|
|
+ if(currentUser?.id){
|
|
|
|
+ ACL[currentUser?.id] = {read:true,write:true}
|
|
|
|
+ }
|
|
|
|
+ consult.set({
|
|
|
|
+ title:`${expect.get('depart')?.name || ""}门诊记录${dateStr}-${expect?.get("name")}`,
|
|
|
|
+ expect:expect.toPointer(),
|
|
|
|
+ depart:{
|
|
|
|
+ __type:"Pointer",
|
|
|
|
+ className:"Department",
|
|
|
|
+ objectId:expect.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",expect?.get("name"));
|
|
|
|
+ chat.role.set("title",expect?.get("title"));
|
|
|
|
+ chat.role.set("desc",expect?.get("desc"));
|
|
|
|
+ chat.role.set("tags",expect?.get("qualifications"));
|
|
|
|
+ chat.role.set("avatar",expect?.get("avatar") || "../../assets/image/doctor7.png")
|
|
|
|
+ chat.role.set("prompt",`
|
|
|
|
+ # 角色设定
|
|
|
|
+ 您是${expect?.get("name")},是一位${expect?.get("specialist")}医生,${expect?.get("desc")},年龄${expect?.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)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|