diff --git a/.env b/.env index 27b2ff73..89155001 100644 --- a/.env +++ b/.env @@ -8,13 +8,13 @@ VITE_PORT=8080 VITE_OPEN=true # 租户开关 -VITE_APP_TENANT_ENABLE=true +VITE_APP_TENANT_ENABLE=false # 验证码的开关 VITE_APP_CAPTCHA_ENABLE=true # 文档地址的开关 -VITE_APP_DOCALERT_ENABLE=true +VITE_APP_DOCALERT_ENABLE=false # 百度统计 VITE_APP_BAIDU_CODE = a1ff8825baa73c3a78eb96aa40325abc diff --git a/src/api/deviceuser/index.ts b/src/api/deviceuser/index.ts index be687a49..865d8b41 100644 --- a/src/api/deviceuser/index.ts +++ b/src/api/deviceuser/index.ts @@ -46,5 +46,10 @@ export const DeviceuserApi = { // 导出设备人员关联 Excel exportDeviceuser: async (params) => { return await request.download({ url: `/system/deviceuser/export-excel`, params }) - } + }, + + //根据设备ID查询设备人员关联 + getDeviceuserByDeviceId: async (deviceid: number) => { + return await request.get({ url: `/system/deviceuser/getDeviceuserByDeviceId?deviceid=` + deviceid }) + }, } diff --git a/src/api/ecgdata/index.ts b/src/api/ecgdata/index.ts index 695ba054..119c3af6 100644 --- a/src/api/ecgdata/index.ts +++ b/src/api/ecgdata/index.ts @@ -1,65 +1,75 @@ -import request from '@/config/axios' - -// 心电数据采集 VO -export interface EcgdataVO { - id: number // 主键ID - deviceid: number // 设备ID - devicename: string // 设备名称 - userid: number // 人员ID - collecttime: Date // 采集时间 - devicetype: string // 设备类型 - heartrate: number // 心率(次/分) - rhythm: string // 心律类型(窦性心律,房颤等) - printerval: number // PR间期(ms) - qrsduration: number // QRS时限(ms) - qtinterval: number // QT间期(ms) - qtcinterval: number // QTc间期(ms) - paxis: number // P电轴(度) - qrsaxis: number // QRS电轴(度) - taxis: number // T电轴(度) - rv5: number // RV5电压(mV) - sv1: number // SV1电压(mV) - rv5sv1: number // RV5+SV1电压(mV) - stsegment: string // ST段改变 - twave: string // T波改变 - diagnosis: string // 心电图诊断 - ecgimageurl: string // 心电图图片地址 - ecgdataurl: string // 心电图数据文件地址 - orgid: number // 机构ID - orgname: string // 机构名称 - datastatus: number // 数据状态(0:异常,1:正常) - remark: string // 备注 -} - -// 心电数据采集 API -export const EcgdataApi = { - // 查询心电数据采集分页 - getEcgdataPage: async (params: any) => { - return await request.get({ url: `/system/ecgdata/page`, params }) - }, - - // 查询心电数据采集详情 - getEcgdata: async (id: number) => { - return await request.get({ url: `/system/ecgdata/get?id=` + id }) - }, - - // 新增心电数据采集 - createEcgdata: async (data: EcgdataVO) => { - return await request.post({ url: `/system/ecgdata/create`, data }) - }, - - // 修改心电数据采集 - updateEcgdata: async (data: EcgdataVO) => { - return await request.put({ url: `/system/ecgdata/update`, data }) - }, - - // 删除心电数据采集 - deleteEcgdata: async (id: number) => { - return await request.delete({ url: `/system/ecgdata/delete?id=` + id }) - }, - - // 导出心电数据采集 Excel - exportEcgdata: async (params) => { - return await request.download({ url: `/system/ecgdata/export-excel`, params }) - }, -} \ No newline at end of file +import request from '@/config/axios' + +// 心电数据采集 VO +export interface EcgdataVO { + id: number // 主键ID + deviceid: number // 设备ID + devicename: string // 设备名称 + userid: number // 人员ID + collecttime: Date // 采集时间 + devicetype: string // 设备类型 + heartrate: number // 心率(次/分) + rhythm: string // 心律类型(窦性心律,房颤等) + printerval: number // PR间期(ms) + qrsduration: number // QRS时限(ms) + qtinterval: number // QT间期(ms) + qtcinterval: number // QTc间期(ms) + paxis: number // P电轴(度) + qrsaxis: number // QRS电轴(度) + taxis: number // T电轴(度) + rv5: number // RV5电压(mV) + sv1: number // SV1电压(mV) + rv5sv1: number // RV5+SV1电压(mV) + stsegment: string // ST段改变 + twave: string // T波改变 + diagnosis: string // 心电图诊断 + ecgimageurl: string // 心电图图片地址 + ecgdataurl: string // 心电图数据文件地址 + orgid: number // 机构ID + orgname: string // 机构名称 + datastatus: number // 数据状态(0:异常,1:正常) + remark: string // 备注 +} + +// 心电数据采集 API +export const EcgdataApi = { + // 查询心电数据采集分页 + getEcgdataPage: async (params: any) => { + return await request.get({ url: `/system/ecgdata/page`, params }) + }, + + // 查询心电数据采集详情 + getEcgdata: async (id: number) => { + return await request.get({ url: `/system/ecgdata/get?id=` + id }) + }, + + // 新增心电数据采集 + createEcgdata: async (data: EcgdataVO) => { + return await request.post({ url: `/system/ecgdata/create`, data }) + }, + + // 修改心电数据采集 + updateEcgdata: async (data: EcgdataVO) => { + return await request.put({ url: `/system/ecgdata/update`, data }) + }, + + // 删除心电数据采集 + deleteEcgdata: async (id: number) => { + return await request.delete({ url: `/system/ecgdata/delete?id=` + id }) + }, + + // 导出心电数据采集 Excel + exportEcgdata: async (params) => { + return await request.download({ url: `/system/ecgdata/export-excel`, params }) + }, + + // 根据用户ID查询心电采集时间列表 + getEcgdataByUserId: async (userId: number) => { + return await request.get({ url: `/system/ecgdata/getByUserId?userId=` + userId }) + }, + + // 根据时间&ID查询心电数据 + getEcgdataByTime: async (collecttime: Date, userId: number) => { + return await request.get({ url: `/system/ecgdata/getByTime?collecttime=` + collecttime + `&userId=` + userId }) + } +} diff --git a/src/views/devices/Device_Data_Components/ECG_datas.vue b/src/views/devices/Device_Data_Components/ECG_datas.vue index 92afe992..07473a6c 100644 --- a/src/views/devices/Device_Data_Components/ECG_datas.vue +++ b/src/views/devices/Device_Data_Components/ECG_datas.vue @@ -13,14 +13,9 @@
- @@ -32,35 +27,101 @@ - {{ person.name }} + {{ person.username }} (ID: {{ person.userid }})
+ +
+ +
+ +
+ + + + {{ formatTime(time.collecttime) }} + +
+ 暂无采集时间 +
+
+
+
+
+
- -
- -
- 暂无数据 +
+
+ 请从左侧选择人员查看数据
- +
+ 暂无数据 +
+
+ + +
+
+
+
+ {{ field.label }} + {{ selectedPersonData && selectedPersonData[field.key] !== undefined ? selectedPersonData[field.key] : '-' }} +
+
+
+
+
+ +
+ + +
+
+ 心电图诊断:{{ selectedPersonData.diagnosis }} +
+
+
+
-
- 请从左侧选择人员查看数据 -
@@ -68,6 +129,9 @@ @@ -150,6 +293,41 @@ export default { flex-shrink: 0; } +.time-list { + width: 200px; + flex-shrink: 0; +} + +.time-list :deep(.el-card__body) { + padding: 0; + height: 100%; + display: flex; + flex-direction: column; +} + +.time-list-header { + padding: 15px; + border-bottom: 1px solid #EBEEF5; +} + +.header-title { + font-weight: 500; + margin-bottom: 10px; +} + +.time-list :deep(.el-scrollbar__wrap) { + overflow-x: hidden; +} + +.time-list :deep(.el-menu) { + border-right: none; +} + +.time-list :deep(.el-menu-item) { + height: 40px; + line-height: 40px; +} + .data-display { flex: 1; } @@ -182,4 +360,90 @@ export default { .el-scrollbar { height: calc(100vh - 400px) !important; } + +.ecg-fields-container { + padding: 20px; +} + +.ecg-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 15px; + padding: 10px; +} + +.ecg-grid-item { + background-color: #f5f7fa; + border-radius: 8px; + padding: 12px; + transition: all 0.3s ease; + min-width: 0; /* 防止内容溢出 */ +} + +.ecg-grid-item:hover { + transform: translateY(-2px); + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); +} + +.ecg-field-content { + display: flex; + flex-direction: column; + gap: 6px; +} + +.ecg-label { + color: #606266; + font-size: 13px; + font-weight: 500; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.ecg-value { + color: #303133; + font-size: 15px; + font-weight: 600; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.ecg-tabs { + padding: 0 20px; +} + +.ecg-tabs :deep(.el-tabs__header) { + margin-bottom: 20px; +} + +.ecg-tabs :deep(.el-tabs__nav-wrap::after) { + height: 1px; +} + +.ecg-image-container { + display: flex; + justify-content: center; + align-items: center; + min-height: 300px; +} + +.ecg-image { + max-width: 100%; + max-height: 400px; + border-radius: 8px; + box-shadow: 0 2px 12px 0 rgba(0,0,0,0.08); +} + +.no-ecg-image { + color: #909399; + font-size: 18px; +} + +.no-time-data { + padding: 20px; + text-align: center; + color: #909399; + font-size: 14px; +} diff --git a/src/views/devices/devices_cards.vue b/src/views/devices/devices_cards.vue index f9a08fae..e28e3462 100644 --- a/src/views/devices/devices_cards.vue +++ b/src/views/devices/devices_cards.vue @@ -165,8 +165,8 @@ const handleAction = (action) => { // 打开心电数据组件 emit('action', { action: 'openECGData', - deviceId: props.deviceInfo.id, - deviceName: props.deviceInfo.name + deviceId: props.deviceInfo.devicecode, + deviceName: props.deviceInfo.devicename }) } else { emit('action', { diff --git a/src/views/person/index.vue b/src/views/person/index.vue index f3fae6d0..92d0af25 100644 --- a/src/views/person/index.vue +++ b/src/views/person/index.vue @@ -177,12 +177,13 @@ import { dateFormatter } from '@/utils/formatTime' import PersonForm from './PersonFrom.vue' import PersonMember from './Personmember.vue' import { PersonApi, PersonVO } from '@/api/person' +import { getUserProfile } from '@/api/system/user/profile' defineOptions({ name: 'FamilyMember' }) const message = useMessage() // 消息弹窗 const { t } = useI18n() // 国际化 - +const userProfile = ref() const loading = ref(false) // 列表的加载中 const total = ref(0) // 列表的总页数 const list = ref([]) // 列表的数据 @@ -210,6 +211,9 @@ const queryFormRef = ref() // 搜索的表单 const getList = async () => { loading.value = true try { + //首先获取用户信息 + const userProfile = await getUserProfile() + queryParams.orgid = userProfile.dept.id const data = await PersonApi.getPersonPage(queryParams) list.value = data.list total.value = data.total diff --git a/src/views/person/memberdrawer.vue b/src/views/person/memberdrawer.vue index e56a895e..9204ed2f 100644 --- a/src/views/person/memberdrawer.vue +++ b/src/views/person/memberdrawer.vue @@ -55,6 +55,7 @@ import { ref, computed, watch, onMounted } from 'vue' import { PersonApi, type PersonVO } from '@/api/person' import { Icon } from '@/components/Icon' +import { getUserProfile } from '@/api/system/user/profile' interface FamilyMember { id: number @@ -85,13 +86,16 @@ const queryParams = reactive({ pageNo: 1, pageSize: 10, name: '', - mobile: '' + mobile: '', + orgid: undefined, }) // 获取成员数据 const getList = async () => { try { loading.value = true + const userProfile = await getUserProfile() + queryParams.orgid = userProfile.dept.id const res = await PersonApi.getPersonNoFamilyid(queryParams) if (res.list) { list.value = res.list.map((item: PersonVO) => ({ @@ -102,7 +106,8 @@ const getList = async () => { address: item.address || '', createTime: item.createtime, familyid: item.familyid, - familyrelation: item.familyrelation + familyrelation: item.familyrelation, + orgid: item.orgid, })) total.value = res.total } diff --git a/src/views/personarchive/index.vue b/src/views/personarchive/index.vue index ffac5f60..204e86cb 100644 --- a/src/views/personarchive/index.vue +++ b/src/views/personarchive/index.vue @@ -100,13 +100,14 @@ import { dateFormatter } from '@/utils/formatTime' import download from '@/utils/download' import { PersonArchiveApi, PersonArchiveVO } from '@/api/personarchive' import PersonArchiveForm from './PersonArchiveForm.vue' +import { getUserProfile } from '@/api/system/user/profile' /** 人员档案 列表 */ defineOptions({ name: 'PersonArchive' }) const message = useMessage() // 消息弹窗 const { t } = useI18n() // 国际化 - +const userProfile = ref() const loading = ref(true) // 列表的加载中 const list = ref([]) // 列表的数据 const total = ref(0) // 列表的总页数 @@ -155,6 +156,9 @@ const exportLoading = ref(false) // 导出的加载中 const getList = async () => { loading.value = true try { + //首先获取用户信息 + const userProfile = await getUserProfile() + queryParams.orgid = userProfile.dept.id const data = await PersonArchiveApi.getPersonArchivePage(queryParams) list.value = data.list total.value = data.total