|
@@ -1,10 +1,8 @@
|
|
import { Component, OnInit } from '@angular/core';
|
|
import { Component, OnInit } from '@angular/core';
|
|
-import{ChatPanelOptions,FmChatModalInput,FmodeChat,FmodeChatMessage,openChatPanelModal}from 'fmode-ng';
|
|
|
|
-import Parse from "parse";
|
|
|
|
-import{ModalController}from '@ionic/angular/standalone';
|
|
|
|
-import { CloudUser, CloudQuery } from 'src/lib/ncloud';
|
|
|
|
|
|
+import{ModalController, AlertController}from '@ionic/angular/standalone';
|
|
|
|
+import { CloudUser, CloudQuery, CloudObject } from 'src/lib/ncloud';
|
|
import { importTestData } from 'src/lib/import.data';
|
|
import { importTestData } from 'src/lib/import.data';
|
|
-
|
|
|
|
|
|
+import { AddDataModalComponent } from 'src/app/tab1/add-data-modal/add-data-modal.component';
|
|
@Component({
|
|
@Component({
|
|
selector: 'app-tab1',
|
|
selector: 'app-tab1',
|
|
templateUrl: 'tab1.page.html',
|
|
templateUrl: 'tab1.page.html',
|
|
@@ -18,16 +16,237 @@ export class Tab1Page implements OnInit{
|
|
heartRate: [] as any[],
|
|
heartRate: [] as any[],
|
|
loading: true
|
|
loading: true
|
|
};
|
|
};
|
|
|
|
+ todayData = {
|
|
|
|
+ bloodGlucose: [] as any[],
|
|
|
|
+ bloodPressure: [] as any[],
|
|
|
|
+ heartRate: [] as any[],
|
|
|
|
+ loading: true}
|
|
|
|
+ // 更新 metrics 结构以包含时间和时间戳
|
|
|
|
+ metrics: Array<{
|
|
|
|
+ name: string;
|
|
|
|
+ value: string;
|
|
|
|
+ unit: string;
|
|
|
|
+ trend: string;
|
|
|
|
+ trendColor: string;
|
|
|
|
+ reference: string;
|
|
|
|
+ abnormal: boolean;
|
|
|
|
+ time: string;
|
|
|
|
+ timestamp: Date | null;
|
|
|
|
+}> = [
|
|
|
|
+ {
|
|
|
|
+ name: '血糖',
|
|
|
|
+ value: '--',
|
|
|
|
+ unit: 'mmol/L',
|
|
|
|
+ trend: 'caret-up',
|
|
|
|
+ trendColor: 'medium',
|
|
|
|
+ reference: '3.9-6.1',
|
|
|
|
+ abnormal: false,
|
|
|
|
+ time: '暂无数据',
|
|
|
|
+ timestamp: null
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ name: '血压',
|
|
|
|
+ value: '--/--',
|
|
|
|
+ unit: 'mmHg',
|
|
|
|
+ trend: 'caret-down',
|
|
|
|
+ trendColor: 'medium',
|
|
|
|
+ reference: '120/80',
|
|
|
|
+ abnormal: false,
|
|
|
|
+ time: '暂无数据',
|
|
|
|
+ timestamp: null
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ name: '心率',
|
|
|
|
+ value: '--',
|
|
|
|
+ unit: '次/分',
|
|
|
|
+ trend: 'caret-up',
|
|
|
|
+ trendColor: 'medium',
|
|
|
|
+ reference: '60-100',
|
|
|
|
+ abnormal: false,
|
|
|
|
+ time: '暂无数据',
|
|
|
|
+ timestamp: null
|
|
|
|
+ }
|
|
|
|
+];
|
|
constructor(
|
|
constructor(
|
|
- private modalCtrl:ModalController
|
|
|
|
|
|
+ private modalCtrl:ModalController,
|
|
|
|
+ private alertCtrl:AlertController
|
|
){}
|
|
){}
|
|
|
|
|
|
async ngOnInit() {
|
|
async ngOnInit() {
|
|
await this.loadHealthData();
|
|
await this.loadHealthData();
|
|
|
|
+ await this.loadTodayData();
|
|
}
|
|
}
|
|
// 加载健康数据
|
|
// 加载健康数据
|
|
- // 在 tab1.page.ts 中更新以下方法
|
|
|
|
|
|
+ async loadTodayData() {
|
|
|
|
+ try {
|
|
|
|
+ this.todayData.loading = true;
|
|
|
|
+
|
|
|
|
+ const user = new CloudUser();
|
|
|
|
+ const currentUser = await user.current();
|
|
|
|
+
|
|
|
|
+ if (!currentUser?.id) {
|
|
|
|
+ console.warn('未获取到当前用户');
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 获取今天0点的时间
|
|
|
|
+ const today = new Date();
|
|
|
|
+ today.setHours(0, 0, 0, 0);
|
|
|
|
+
|
|
|
|
+ const [glucose, pressure, heartRate] = await Promise.all([
|
|
|
|
+ this.queryTodayData('BloodGlucose', currentUser, today),
|
|
|
|
+ this.queryTodayData('BloodPressure', currentUser, today),
|
|
|
|
+ this.queryTodayData('HeartRate', currentUser, today)
|
|
|
|
+ ]);
|
|
|
|
+
|
|
|
|
+ this.todayData = {
|
|
|
|
+ bloodGlucose: glucose,
|
|
|
|
+ bloodPressure: pressure,
|
|
|
|
+ heartRate: heartRate,
|
|
|
|
+ loading: false
|
|
|
|
+ };
|
|
|
|
+ } catch (error) {
|
|
|
|
+ console.error('加载今日数据失败:', error);
|
|
|
|
+ this.todayData.loading = false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private async queryTodayData(className: string, user: CloudUser, date: Date): Promise<any[]> {
|
|
|
|
+ const query = new CloudQuery(className);
|
|
|
|
+ query.equalTo('patient', {
|
|
|
|
+ __type: 'Pointer',
|
|
|
|
+ className: '_User',
|
|
|
|
+ objectId: user.id
|
|
|
|
+ });
|
|
|
|
+ query.greaterThan('measurementTime', date);
|
|
|
|
+ query.descending('measurementTime'); // 按时间降序排列
|
|
|
|
+ return await query.find();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 打开添加数据模态框
|
|
|
|
+ async openAddDataModal() {
|
|
|
|
+ const modal = await this.modalCtrl.create({
|
|
|
|
+ component: AddDataModalComponent
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ await modal.present();
|
|
|
|
+
|
|
|
|
+ const { data } = await modal.onWillDismiss();
|
|
|
|
+ if (data) {
|
|
|
|
+ await this.saveHealthData(data.type, data.formData);
|
|
|
|
+ await this.loadTodayData(); // 重新加载今日数据
|
|
|
|
+ await this.loadHealthData(); // 重新加载所有健康数据
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 保存健康数据
|
|
|
|
+ async saveHealthData(type: string, formData: any) {
|
|
|
|
+ try {
|
|
|
|
+ const user = new CloudUser();
|
|
|
|
+ const currentUser = await user.current();
|
|
|
|
+
|
|
|
|
+ if (!currentUser?.id) {
|
|
|
|
+ console.warn('未获取到当前用户');
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ let className = '';
|
|
|
|
+ let dataObject: any = {
|
|
|
|
+ patient: {
|
|
|
|
+ __type: 'Pointer',
|
|
|
|
+ className: '_User',
|
|
|
|
+ objectId: currentUser.id
|
|
|
|
+ },
|
|
|
|
+ measurementTime: new Date()
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ switch (type) {
|
|
|
|
+ case 'bloodGlucose':
|
|
|
|
+ className = 'BloodGlucose';
|
|
|
|
+ dataObject.glucoseValue = parseFloat(formData.value);
|
|
|
|
+ dataObject.measurementType = formData.measurementType || '空腹';
|
|
|
|
+ if (formData.notes) dataObject.notes = formData.notes;
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case 'bloodPressure':
|
|
|
|
+ className = 'BloodPressure';
|
|
|
|
+ const values = formData.value.split('/');
|
|
|
|
+ dataObject.systolic = parseInt(values[0]);
|
|
|
|
+ dataObject.diastolic = parseInt(values[1]);
|
|
|
|
+ dataObject.pulse = parseInt(formData.pulse) || 0;
|
|
|
|
+ if (formData.notes) dataObject.notes = formData.notes;
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case 'heartRate':
|
|
|
|
+ className = 'HeartRate';
|
|
|
|
+ dataObject.heartRate = parseInt(formData.value);
|
|
|
|
+ dataObject.measurementMethod = formData.measurementMethod || '手动测量';
|
|
|
|
+ if (formData.notes) dataObject.notes = formData.notes;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const healthData = new CloudObject(className);
|
|
|
|
+ healthData.set(dataObject);
|
|
|
|
+ await healthData.save();
|
|
|
|
+
|
|
|
|
+ const alert = await this.alertCtrl.create({
|
|
|
|
+ header: '成功',
|
|
|
|
+ message: '数据添加成功',
|
|
|
|
+ buttons: ['确定']
|
|
|
|
+ });
|
|
|
|
+ await alert.present();
|
|
|
|
+
|
|
|
|
+ } catch (error) {
|
|
|
|
+ console.error('保存数据失败:', error);
|
|
|
|
+
|
|
|
|
+ const alert = await this.alertCtrl.create({
|
|
|
|
+ header: '错误',
|
|
|
|
+ message: '数据添加失败,请重试',
|
|
|
|
+ buttons: ['确定']
|
|
|
|
+ });
|
|
|
|
+ await alert.present();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 辅助方法:获取血糖状态
|
|
|
|
+ getGlucoseStatus(value: number): string {
|
|
|
|
+ if (value <= 6.1) return '正常';
|
|
|
|
+ if (value <= 7.0) return '偏高';
|
|
|
|
+ return '过高';
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 辅助方法:获取血糖颜色
|
|
|
|
+ getGlucoseColor(value: number): string {
|
|
|
|
+ if (value <= 6.1) return 'success';
|
|
|
|
+ if (value <= 7.0) return 'warning';
|
|
|
|
+ return 'danger';
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 辅助方法:获取血压状态
|
|
|
|
+ getPressureStatus(systolic: number, diastolic: number): string {
|
|
|
|
+ if (systolic <= 120 && diastolic <= 80) return '正常';
|
|
|
|
+ if ((systolic <= 140 && diastolic <= 90)) return '偏高';
|
|
|
|
+ return '过高';
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 辅助方法:获取血压颜色
|
|
|
|
+ getPressureColor(systolic: number, diastolic: number): string {
|
|
|
|
+ if (systolic <= 120 && diastolic <= 80) return 'success';
|
|
|
|
+ if ((systolic <= 140 && diastolic <= 90)) return 'warning';
|
|
|
|
+ return 'danger';
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 辅助方法:获取心率状态
|
|
|
|
+ getHeartRateStatus(value: number): string {
|
|
|
|
+ if (value >= 60 && value <= 100) return '正常';
|
|
|
|
+ return '异常';
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 辅助方法:获取心率颜色
|
|
|
|
+ getHeartRateColor(value: number): string {
|
|
|
|
+ if (value >= 60 && value <= 100) return 'success';
|
|
|
|
+ return 'warning';
|
|
|
|
+ }
|
|
async loadHealthData() {
|
|
async loadHealthData() {
|
|
try {
|
|
try {
|
|
this.healthData.loading = true;
|
|
this.healthData.loading = true;
|
|
@@ -58,12 +277,117 @@ async loadHealthData() {
|
|
heartRate: heartRate,
|
|
heartRate: heartRate,
|
|
loading: false
|
|
loading: false
|
|
};
|
|
};
|
|
|
|
+ this.updateMetricsOverview();
|
|
} catch (error) {
|
|
} catch (error) {
|
|
console.error('加载失败:', error);
|
|
console.error('加载失败:', error);
|
|
this.healthData.loading = false;
|
|
this.healthData.loading = false;
|
|
}
|
|
}
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+// 更新概览数据
|
|
|
|
+ updateMetricsOverview() {
|
|
|
|
+ // 更新血糖数据
|
|
|
|
+ if (this.healthData.bloodGlucose.length > 0) {
|
|
|
|
+ const latestGlucose = this.healthData.bloodGlucose[0];
|
|
|
|
+ const glucoseValue = latestGlucose.get('glucoseValue');
|
|
|
|
+ const measureTime = new Date(latestGlucose.get('measurementTime'));
|
|
|
|
+
|
|
|
|
+ this.metrics[0].value = glucoseValue.toFixed(1);
|
|
|
|
+ this.metrics[0].time = this.formatTime(measureTime);
|
|
|
|
+ this.metrics[0].timestamp = measureTime;
|
|
|
|
+
|
|
|
|
+ // 设置趋势和异常状态
|
|
|
|
+ if (glucoseValue > 6.1) {
|
|
|
|
+ this.metrics[0].abnormal = true;
|
|
|
|
+ this.metrics[0].trendColor = glucoseValue > 7.0 ? 'danger' : 'warning';
|
|
|
|
+ } else {
|
|
|
|
+ this.metrics[0].abnormal = false;
|
|
|
|
+ this.metrics[0].trendColor = 'success';
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 更新血压数据
|
|
|
|
+ if (this.healthData.bloodPressure.length > 0) {
|
|
|
|
+ const latestPressure = this.healthData.bloodPressure[0];
|
|
|
|
+ const systolic = latestPressure.get('systolic');
|
|
|
|
+ const diastolic = latestPressure.get('diastolic');
|
|
|
|
+ const measureTime = new Date(latestPressure.get('measurementTime'));
|
|
|
|
+
|
|
|
|
+ this.metrics[1].value = `${systolic}/${diastolic}`;
|
|
|
|
+ this.metrics[1].time = this.formatTime(measureTime);
|
|
|
|
+ this.metrics[1].timestamp = measureTime;
|
|
|
|
+
|
|
|
|
+ // 设置趋势和异常状态
|
|
|
|
+ if (systolic > 120 || diastolic > 80) {
|
|
|
|
+ this.metrics[1].abnormal = true;
|
|
|
|
+ this.metrics[1].trendColor = (systolic > 140 || diastolic > 90) ? 'danger' : 'warning';
|
|
|
|
+ } else {
|
|
|
|
+ this.metrics[1].abnormal = false;
|
|
|
|
+ this.metrics[1].trendColor = 'success';
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 更新心率数据
|
|
|
|
+ if (this.healthData.heartRate.length > 0) {
|
|
|
|
+ const latestHeartRate = this.healthData.heartRate[0];
|
|
|
|
+ const heartRateValue = latestHeartRate.get('heartRate');
|
|
|
|
+ const measureTime = new Date(latestHeartRate.get('measurementTime'));
|
|
|
|
+
|
|
|
|
+ this.metrics[2].value = heartRateValue.toString();
|
|
|
|
+ this.metrics[2].time = this.formatTime(measureTime);
|
|
|
|
+ this.metrics[2].timestamp = measureTime;
|
|
|
|
+
|
|
|
|
+ // 设置趋势和异常状态
|
|
|
|
+ if (heartRateValue < 60 || heartRateValue > 100) {
|
|
|
|
+ this.metrics[2].abnormal = true;
|
|
|
|
+ this.metrics[2].trendColor = 'warning';
|
|
|
|
+ } else {
|
|
|
|
+ this.metrics[2].abnormal = false;
|
|
|
|
+ this.metrics[2].trendColor = 'success';
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 格式化时间显示
|
|
|
|
+ formatTime(date: any): string {
|
|
|
|
+ if (!date) return '暂无数据';
|
|
|
|
+
|
|
|
|
+ let dateObj: Date;
|
|
|
|
+
|
|
|
|
+ if (date instanceof Date) {
|
|
|
|
+ dateObj = date;
|
|
|
|
+ } else if (typeof date === 'string') {
|
|
|
|
+ dateObj = new Date(date);
|
|
|
|
+ } else if (typeof date === 'number') {
|
|
|
|
+ dateObj = new Date(date);
|
|
|
|
+ } else {
|
|
|
|
+ return '暂无数据';
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (isNaN(dateObj.getTime())) {
|
|
|
|
+ return '无效日期';
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return this.formatDate(dateObj);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+private formatDate(date: Date): string {
|
|
|
|
+ const now = new Date();
|
|
|
|
+ const diffHours = Math.floor((now.getTime() - date.getTime()) / (1000 * 60 * 60));
|
|
|
|
+
|
|
|
|
+ if (diffHours < 24) {
|
|
|
|
+ return `今天 ${this.formatTwoDigits(date.getHours())}:${this.formatTwoDigits(date.getMinutes())}`;
|
|
|
|
+ } else if (diffHours < 48) {
|
|
|
|
+ return `昨天 ${this.formatTwoDigits(date.getHours())}:${this.formatTwoDigits(date.getMinutes())}`;
|
|
|
|
+ } else {
|
|
|
|
+ return `${date.getMonth() + 1}月${date.getDate()}日 ${this.formatTwoDigits(date.getHours())}:${this.formatTwoDigits(date.getMinutes())}`;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 更新数据查询方法
|
|
private async queryData(className: string, user: CloudUser, date: Date): Promise<any[]> {
|
|
private async queryData(className: string, user: CloudUser, date: Date): Promise<any[]> {
|
|
const query = new CloudQuery(className);
|
|
const query = new CloudQuery(className);
|
|
query.equalTo('patient', {
|
|
query.equalTo('patient', {
|
|
@@ -73,9 +397,24 @@ private async queryData(className: string, user: CloudUser, date: Date): Promise
|
|
});
|
|
});
|
|
query.greaterThan('measurementTime', date);
|
|
query.greaterThan('measurementTime', date);
|
|
query.ascending('measurementTime');
|
|
query.ascending('measurementTime');
|
|
- return await query.find();
|
|
|
|
|
|
+
|
|
|
|
+ const results = await query.find();
|
|
|
|
+
|
|
|
|
+ // 转换日期格式
|
|
|
|
+ return results.map(item => {
|
|
|
|
+ const time = item.get('measurementTime');
|
|
|
|
+ if (time && !(time instanceof Date)) {
|
|
|
|
+ item.data['measurementTime'] = new Date(time);
|
|
|
|
+ }
|
|
|
|
+ return item;
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // 辅助函数:格式化两位数
|
|
|
|
+ formatTwoDigits(num: number): string {
|
|
|
|
+ return num < 10 ? `0${num}` : num.toString();
|
|
|
|
+ }
|
|
|
|
+
|
|
async importData() {
|
|
async importData() {
|
|
try {
|
|
try {
|
|
this.healthData = {
|
|
this.healthData = {
|
|
@@ -100,144 +439,9 @@ async importData() {
|
|
}, 1000);
|
|
}, 1000);
|
|
}
|
|
}
|
|
|
|
|
|
-openConsult(chatId?:string){
|
|
|
|
- localStorage.setItem("company","E4KpGvTEto")
|
|
|
|
- let options:ChatPanelOptions = {
|
|
|
|
- roleId:"2DXJkRsjXK",
|
|
|
|
- //chatId:chatId,//若存在则恢复对话,不存在则开启新对话1
|
|
|
|
- onChatInit:(chat:FmodeChat)=>{
|
|
|
|
- console.log("onChatInit");
|
|
|
|
- console.log("预设角色",chat.role);
|
|
|
|
- // 角色名称
|
|
|
|
- chat.role.set("name","丁德文");
|
|
|
|
- // 角色称号
|
|
|
|
- chat.role.set("title","慢性病医生");
|
|
|
|
- // 角色描述
|
|
|
|
- chat.role.set("desc","一名亲切和蔼的慢性病医生,丁德文,年龄46岁");
|
|
|
|
- // 角色标签
|
|
|
|
- chat.role.set("tags",["内科","初诊"]);
|
|
|
|
- // 角色头像
|
|
|
|
- chat.role.set("avatar","/assets/images/0.jpg")
|
|
|
|
- // 角色提示词
|
|
|
|
- chat.role.set("prompt",`
|
|
|
|
-# 角色设定
|
|
|
|
-您是一名亲切和蔼的专业的慢性病医生,丁德文,年龄46岁,需要完成一次完整且专业的慢性病问诊服务。
|
|
|
|
-
|
|
|
|
-# 对话环节
|
|
|
|
-0.导诊(根据用户基本情况,匹配对应的慢性病病症)
|
|
|
|
-1.预设的问询方式
|
|
|
|
-- 打招呼,以用户自述为主
|
|
|
|
-- 当信息充足时候,确认用户症状慢性病病症,并进入下一个环节
|
|
|
|
-2.拓展的问询细节
|
|
|
|
-例如:用户反映呼吸不畅,拓展出:是否咳嗽;是否感觉痛或者痒等其他需要的问题。
|
|
|
|
-- 当问询细节补充完成后进入下一个环节
|
|
|
|
-3.初步的诊断结果,并且同时列出检查检验项目
|
|
|
|
-初步诊断:确定需要有哪些进一步检查
|
|
|
|
-检查检验:获取医学客观数据
|
|
|
|
-- 等待用户提交客观数据,进入下一阶段
|
|
|
|
-4.给出诊断方案并给出处方
|
|
|
|
-- 完成处方时,请在消息结尾附带: [完成]
|
|
|
|
-
|
|
|
|
-# 开始话语
|
|
|
|
-当您准备好了,可以以一个医生的身份,向来访的用户打招呼。`);
|
|
|
|
- // 对话灵感分类
|
|
|
|
- let promptCates = [
|
|
|
|
- {
|
|
|
|
- "img": "/assets/icon/tnb.jpeg",
|
|
|
|
- "name": "糖尿病"
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- "img": "/assets/icon/gxy.jpeg",
|
|
|
|
- "name": "高血压"
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- "img": "/assets/icon/gxb.jpeg",
|
|
|
|
- "name": "冠心病"
|
|
|
|
- }
|
|
|
|
- ]
|
|
|
|
- setTimeout(() => {
|
|
|
|
- chat.role.set("promptCates",promptCates)
|
|
|
|
- }, 500);
|
|
|
|
- // 对话灵感列表
|
|
|
|
- let promptList = [
|
|
|
|
- {
|
|
|
|
- cate:"糖尿病",img:"/assets/icon/tnb.jpeg",
|
|
|
|
- messageList:["异常口渴(多饮","尿频且尿量增多","体重短期内明显下降","饥饿感强烈(多食)","伤口愈合缓慢","皮肤干燥瘙痒","手脚麻木或刺痛感(周围神经病变)"]
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- cate:"高血压",img:"/assets/icon/gxy.jpeg",
|
|
|
|
- messageList:["持续性头痛(尤其后脑勺部位)","经常性头晕或眩晕","视物模糊(短暂性)","耳鸣(如嗡嗡声)","心悸或心律不齐","疲劳感明显(即使休息后)","夜间多尿或起夜频繁"]
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- cate:"冠心病",img:"/assets/icon/gxb.jpeg",
|
|
|
|
- messageList:["胸痛或压迫感(心绞痛,可放射至左肩/下颌)","活动后气促(如爬楼梯时)","心悸或心跳漏搏感","突发冷汗伴恶心","不明原因疲劳(尤其女性患者)","下肢水肿(晚期症状)","夜间平卧时呼吸困难(需高枕卧位)"]
|
|
|
|
- },
|
|
|
|
- ]
|
|
|
|
- let ChatPrompt = Parse.Object.extend("ChatPrompt");
|
|
|
|
- setTimeout(() => {
|
|
|
|
- chat.promptList = promptList.map(item=>{
|
|
|
|
- let prompt = new ChatPrompt();
|
|
|
|
- prompt.set(item);
|
|
|
|
- prompt.img = item.img;
|
|
|
|
- return prompt;
|
|
|
|
- })
|
|
|
|
- }, 500);
|
|
|
|
-
|
|
|
|
- // 功能按钮区域预设
|
|
|
|
- chat.leftButtons = [
|
|
|
|
- { // 提示 当角色配置预设提示词时 显示
|
|
|
|
- title:"话题灵感", // 按钮标题
|
|
|
|
- showTitle:true, // 是否显示标题文字
|
|
|
|
- icon:"color-wand-outline", // 标题icon图标
|
|
|
|
- onClick:()=>{ // 按钮点击事件
|
|
|
|
- chat.isPromptModalOpen = true
|
|
|
|
- },
|
|
|
|
- show:()=>{ // 按钮显示条件
|
|
|
|
- return chat?.promptList?.length // 存在话题提示词时显示
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- ]
|
|
|
|
-
|
|
|
|
- },
|
|
|
|
- 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)
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
timeRange = 'week';
|
|
timeRange = 'week';
|
|
|
|
|
|
- metrics = [
|
|
|
|
- {
|
|
|
|
- name: '血糖',
|
|
|
|
- value: '6.5',
|
|
|
|
- unit: 'mmol/L',
|
|
|
|
- trend: 'caret-up',
|
|
|
|
- trendColor: 'success',
|
|
|
|
- reference: '3.9-6.1',
|
|
|
|
- abnormal: false
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- name: '血压',
|
|
|
|
- value: '135/85',
|
|
|
|
- unit: 'mmHg',
|
|
|
|
- trend: 'caret-down',
|
|
|
|
- trendColor: 'danger',
|
|
|
|
- reference: '120/80',
|
|
|
|
- abnormal: true
|
|
|
|
- }
|
|
|
|
- ];
|
|
|
|
|
|
+
|
|
|
|
|
|
tasks = [
|
|
tasks = [
|
|
{
|
|
{
|