fix: 常用方、患者管理
Some checks failed
CI / Test (ubuntu-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Lint (ubuntu-latest) (push) Has been cancelled
CI / Lint (windows-latest) (push) Has been cancelled
CI / Check (ubuntu-latest) (push) Has been cancelled
CI / Check (windows-latest) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Website on push / Deploy Push Playground Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Docs Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Antd Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Element Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Naive Ftp (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
CI / CI OK (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
Issue Close Require / close-issues (push) Has been cancelled
Close stale issues / stale (push) Has been cancelled
Some checks failed
CI / Test (ubuntu-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Lint (ubuntu-latest) (push) Has been cancelled
CI / Lint (windows-latest) (push) Has been cancelled
CI / Check (ubuntu-latest) (push) Has been cancelled
CI / Check (windows-latest) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Website on push / Deploy Push Playground Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Docs Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Antd Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Element Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Naive Ftp (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
CI / CI OK (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
Issue Close Require / close-issues (push) Has been cancelled
Close stale issues / stale (push) Has been cancelled
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
# 开发环境配置`n
|
||||||
# 应用标题
|
# 应用标题
|
||||||
VITE_APP_TITLE=萧康云医
|
VITE_APP_TITLE=萧康云医
|
||||||
|
|
||||||
@@ -6,3 +7,6 @@ VITE_APP_NAMESPACE=xk-admin-
|
|||||||
|
|
||||||
# 应用版本
|
# 应用版本
|
||||||
XK_APP_VERSION=1.0.0
|
XK_APP_VERSION=1.0.0
|
||||||
|
|
||||||
|
# WebSocket 连接地址
|
||||||
|
VITE_WS_URL=ws://localhost:12080/ws
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
# 生产环境配置
|
||||||
VITE_BASE=/
|
VITE_BASE=/
|
||||||
|
|
||||||
# 接口地址
|
# 接口地址
|
||||||
@@ -17,3 +18,6 @@ VITE_INJECT_APP_LOADING=true
|
|||||||
|
|
||||||
# 打包后是否生成dist.zip
|
# 打包后是否生成dist.zip
|
||||||
VITE_ARCHIVER=true
|
VITE_ARCHIVER=true
|
||||||
|
|
||||||
|
# WebSocket 连接地址
|
||||||
|
VITE_WS_URL=wss://api.ws.g.xiaokang88.com/ws
|
||||||
|
|||||||
@@ -5,6 +5,30 @@ import { isFunction } from '@vben/utils';
|
|||||||
|
|
||||||
import SysAudioMp3 from '/public/audio/sys.mp3';
|
import SysAudioMp3 from '/public/audio/sys.mp3';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测是否为开发环境
|
||||||
|
* @returns boolean
|
||||||
|
*/
|
||||||
|
export const isDev = (): boolean => {
|
||||||
|
return import.meta.env.DEV;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测是否为生产环境
|
||||||
|
* @returns boolean
|
||||||
|
*/
|
||||||
|
export const isProd = (): boolean => {
|
||||||
|
return import.meta.env.PROD;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 WebSocket URL
|
||||||
|
* @returns string WebSocket 连接地址
|
||||||
|
*/
|
||||||
|
export const getWebSocketUrl = (): string => {
|
||||||
|
return import.meta.env.VITE_WS_URL || 'ws://localhost:12080/ws';
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
export const playOnceAndDestroySys = () => {
|
export const playOnceAndDestroySys = () => {
|
||||||
const audio = new Audio(SysAudioMp3);
|
const audio = new Audio(SysAudioMp3);
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import { onMounted, onUnmounted, ref } from 'vue';
|
import { onMounted, onUnmounted, ref } from 'vue';
|
||||||
|
|
||||||
|
import { getWebSocketUrl } from '#/util/tool';
|
||||||
|
|
||||||
import { useChatStore } from '../stores/chat';
|
import { useChatStore } from '../stores/chat';
|
||||||
import { useUserStore } from '../stores/user';
|
import { useUserStore } from '../stores/user';
|
||||||
// useVbenUserStore
|
// useVbenUserStore
|
||||||
@@ -21,10 +23,7 @@ export function useWebSocket() {
|
|||||||
chatStore.connectionStatus = 'connecting';
|
chatStore.connectionStatus = 'connecting';
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// const wsUrl = import.meta.env.VITE_WS_URL || "wss://g-ws.nailaoyun.cn/ws"
|
const wsUrl = getWebSocketUrl();
|
||||||
const wsUrl = import.meta.env.VITE_WS_URL || 'ws://localhost:12080/ws';
|
|
||||||
// const wsUrl = 'wss://api.ws.g.xiaokang88.com/ws';
|
|
||||||
// const wsUrl = import.meta.env.VITE_WS_URL || "wss://g-ws.nailaoyun.cn/ws"
|
|
||||||
socket.value = new WebSocket(wsUrl);
|
socket.value = new WebSocket(wsUrl);
|
||||||
|
|
||||||
socket.value.addEventListener('open', handleOpen);
|
socket.value.addEventListener('open', handleOpen);
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
* @author 系统
|
* @author 系统
|
||||||
* @date 2024
|
* @date 2024
|
||||||
*/
|
*/
|
||||||
import { ref } from 'vue';
|
import { h, ref } from 'vue';
|
||||||
|
|
||||||
import { Page, useVbenModal } from '@vben/common-ui';
|
import { Page, useVbenModal } from '@vben/common-ui';
|
||||||
|
|
||||||
@@ -31,10 +31,13 @@ import {
|
|||||||
} from 'ant-design-vue';
|
} from 'ant-design-vue';
|
||||||
import { UserOutlined } from '@ant-design/icons-vue';
|
import { UserOutlined } from '@ant-design/icons-vue';
|
||||||
|
|
||||||
|
import PrescriptionDetail from '#/views/doctor/doctor-reception/components/PrescriptionDetail.vue';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
getPatientDetailApi,
|
getPatientDetailApi,
|
||||||
getPatientRegisterListApi,
|
getPatientRegisterListApi,
|
||||||
getPatientPrescriptionListApi,
|
getPatientPrescriptionListApi,
|
||||||
|
getPatientBaseInfoApi,
|
||||||
savePatientRemarkApi,
|
savePatientRemarkApi,
|
||||||
updatePatientRemarkApi,
|
updatePatientRemarkApi,
|
||||||
type PatientDetail,
|
type PatientDetail,
|
||||||
@@ -42,6 +45,27 @@ import {
|
|||||||
type PrescriptionItem,
|
type PrescriptionItem,
|
||||||
} from '../api';
|
} from '../api';
|
||||||
|
|
||||||
|
// ==================== 类型定义 ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 健康信息类型
|
||||||
|
*/
|
||||||
|
interface UserPatientHealthInquiry {
|
||||||
|
id: number;
|
||||||
|
user_patient_id: number;
|
||||||
|
liver_function: number;
|
||||||
|
renal_function: number;
|
||||||
|
liver_index: string;
|
||||||
|
renal_index: string;
|
||||||
|
person_history: string;
|
||||||
|
allergic_history: string;
|
||||||
|
person_status: number;
|
||||||
|
allergic_status: number;
|
||||||
|
family_status: number;
|
||||||
|
family_history: string;
|
||||||
|
is_delete: number;
|
||||||
|
}
|
||||||
|
|
||||||
// ==================== 响应式数据 ====================
|
// ==================== 响应式数据 ====================
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -104,6 +128,35 @@ const remarkContent = ref('');
|
|||||||
*/
|
*/
|
||||||
const hasRemark = ref(false);
|
const hasRemark = ref(false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 健康信息数据
|
||||||
|
*/
|
||||||
|
const healthInfo = ref<UserPatientHealthInquiry | null>(null);
|
||||||
|
|
||||||
|
// ==================== 处方详情弹窗 ====================
|
||||||
|
|
||||||
|
const [PrescriptionDetailModal, PrescriptionDetailModalApi] = useVbenModal({
|
||||||
|
connectedComponent: PrescriptionDetail,
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打开处方详情
|
||||||
|
* @param prescriptionId 处方ID
|
||||||
|
*/
|
||||||
|
function openPrescriptionDetail(prescriptionId: number) {
|
||||||
|
PrescriptionDetailModalApi.setData({ values: prescriptionId });
|
||||||
|
PrescriptionDetailModalApi.open();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分割字符串为数组
|
||||||
|
* @param str 逗号分隔的字符串
|
||||||
|
*/
|
||||||
|
function splitString(str: string): string[] {
|
||||||
|
if (!str) return [];
|
||||||
|
return str.split(',').filter((item) => item.trim());
|
||||||
|
}
|
||||||
|
|
||||||
// ==================== 表格列配置 ====================
|
// ==================== 表格列配置 ====================
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -126,7 +179,21 @@ const registerColumns = [
|
|||||||
* 处方记录表格列
|
* 处方记录表格列
|
||||||
*/
|
*/
|
||||||
const prescriptionColumns = [
|
const prescriptionColumns = [
|
||||||
{ title: '处方编号', dataIndex: 'prescription_no', key: 'prescription_no' },
|
{
|
||||||
|
title: '处方编号',
|
||||||
|
dataIndex: 'prescription_no',
|
||||||
|
key: 'prescription_no',
|
||||||
|
customRender: ({ text, record }: { text: string; record: PrescriptionItem }) => {
|
||||||
|
return h(
|
||||||
|
Button,
|
||||||
|
{
|
||||||
|
type: 'link',
|
||||||
|
onClick: () => openPrescriptionDetail(record.id),
|
||||||
|
},
|
||||||
|
() => text,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: '类型',
|
title: '类型',
|
||||||
dataIndex: 'prescription_type',
|
dataIndex: 'prescription_type',
|
||||||
@@ -196,6 +263,8 @@ async function loadPatientDetail() {
|
|||||||
patientDetail.value = res;
|
patientDetail.value = res;
|
||||||
remarkContent.value = res.remark || '';
|
remarkContent.value = res.remark || '';
|
||||||
hasRemark.value = !!res.remark;
|
hasRemark.value = !!res.remark;
|
||||||
|
// 同时加载健康信息
|
||||||
|
loadHealthInfo();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('获取患者详情失败:', error);
|
console.error('获取患者详情失败:', error);
|
||||||
message.error('获取患者详情失败');
|
message.error('获取患者详情失败');
|
||||||
@@ -204,6 +273,19 @@ async function loadPatientDetail() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加载健康信息
|
||||||
|
*/
|
||||||
|
async function loadHealthInfo() {
|
||||||
|
try {
|
||||||
|
const res = await getPatientBaseInfoApi(patientId.value);
|
||||||
|
healthInfo.value = res || null;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('获取健康信息失败:', error);
|
||||||
|
healthInfo.value = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 加载挂号记录
|
* 加载挂号记录
|
||||||
*/
|
*/
|
||||||
@@ -401,6 +483,96 @@ function getSexText(sex: number): string {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
|
<!-- 健康信息 -->
|
||||||
|
<Card title="健康信息" class="mt-4">
|
||||||
|
<Descriptions
|
||||||
|
v-if="healthInfo"
|
||||||
|
:column="{ xxl: 2, xl: 2, lg: 2, md: 2, sm: 2, xs: 2 }"
|
||||||
|
bordered
|
||||||
|
>
|
||||||
|
<Descriptions.Item label="肝功能">
|
||||||
|
<span>{{
|
||||||
|
healthInfo.liver_function === 0 ? '正常' : '异常'
|
||||||
|
}}</span>
|
||||||
|
<p
|
||||||
|
v-if="healthInfo.liver_function === 1"
|
||||||
|
class="mt-3"
|
||||||
|
>
|
||||||
|
<Tag
|
||||||
|
v-for="item in splitString(healthInfo.liver_index)"
|
||||||
|
:key="item"
|
||||||
|
color="#455cda"
|
||||||
|
>
|
||||||
|
{{ item }}
|
||||||
|
</Tag>
|
||||||
|
</p>
|
||||||
|
</Descriptions.Item>
|
||||||
|
<Descriptions.Item label="肾功能">
|
||||||
|
<span>{{
|
||||||
|
healthInfo.renal_function === 0 ? '正常' : '异常'
|
||||||
|
}}</span>
|
||||||
|
<p
|
||||||
|
v-if="healthInfo.renal_function === 1"
|
||||||
|
class="mt-3"
|
||||||
|
>
|
||||||
|
<Tag
|
||||||
|
v-for="item in splitString(healthInfo.renal_index)"
|
||||||
|
:key="item"
|
||||||
|
color="#455cda"
|
||||||
|
>
|
||||||
|
{{ item }}
|
||||||
|
</Tag>
|
||||||
|
</p>
|
||||||
|
</Descriptions.Item>
|
||||||
|
<Descriptions.Item label="既往史">
|
||||||
|
<span>{{
|
||||||
|
healthInfo.person_status === 0 ? '无' : '有'
|
||||||
|
}}</span>
|
||||||
|
<p v-if="healthInfo.person_status === 1" class="mt-3">
|
||||||
|
<Tag
|
||||||
|
v-for="item in splitString(healthInfo.person_history)"
|
||||||
|
:key="item"
|
||||||
|
color="#455cda"
|
||||||
|
>
|
||||||
|
{{ item }}
|
||||||
|
</Tag>
|
||||||
|
</p>
|
||||||
|
</Descriptions.Item>
|
||||||
|
<Descriptions.Item label="过敏史">
|
||||||
|
<span>{{
|
||||||
|
healthInfo.allergic_status === 0 ? '无' : '有'
|
||||||
|
}}</span>
|
||||||
|
<p
|
||||||
|
v-if="healthInfo.allergic_status === 1"
|
||||||
|
class="mt-3"
|
||||||
|
>
|
||||||
|
<Tag
|
||||||
|
v-for="item in splitString(healthInfo.allergic_history)"
|
||||||
|
:key="item"
|
||||||
|
color="#455cda"
|
||||||
|
>
|
||||||
|
{{ item }}
|
||||||
|
</Tag>
|
||||||
|
</p>
|
||||||
|
</Descriptions.Item>
|
||||||
|
<Descriptions.Item label="家庭遗传史">
|
||||||
|
<span>{{
|
||||||
|
healthInfo.family_status === 0 ? '无' : '有'
|
||||||
|
}}</span>
|
||||||
|
<p v-if="healthInfo.family_status === 1" class="mt-3">
|
||||||
|
<Tag
|
||||||
|
v-for="item in splitString(String(healthInfo.family_history))"
|
||||||
|
:key="item"
|
||||||
|
color="#455cda"
|
||||||
|
>
|
||||||
|
{{ item }}
|
||||||
|
</Tag>
|
||||||
|
</p>
|
||||||
|
</Descriptions.Item>
|
||||||
|
</Descriptions>
|
||||||
|
<Empty v-else description="暂无健康信息" />
|
||||||
|
</Card>
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
</div>
|
</div>
|
||||||
@@ -442,6 +614,7 @@ function getSexText(sex: number): string {
|
|||||||
</Spin>
|
</Spin>
|
||||||
</Page>
|
</Page>
|
||||||
</Modal>
|
</Modal>
|
||||||
|
<PrescriptionDetailModal />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|||||||
Reference in New Issue
Block a user