2026-01-19 18:52:18 +08:00
|
|
|
|
<template>
|
|
|
|
|
|
<full-page :customScroll="empty">
|
2026-01-20 19:04:24 +08:00
|
|
|
|
<template #header>
|
|
|
|
|
|
<view class="flex items-center bg-white text-base px-15 py-12">
|
|
|
|
|
|
<view class="flex-shrink-0 mr-5 text-gray">档案所属人</view>
|
|
|
|
|
|
<view class="text-dark">{{ name }}</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="flex items-center py-12 px-15">
|
|
|
|
|
|
<view class="min-w-90 flex items-center bg-white rounded-sm px-10 mr-5" @click="selectType()">
|
|
|
|
|
|
<view class="leading-normal text-base py-5 px-10 text-dark mr-5">
|
|
|
|
|
|
{{ tempType[type] || '全部' }}
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<uni-icons type="down" size="16" color="#666" />
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="w-100 flex items-center bg-white rounded-sm mr-5">
|
|
|
|
|
|
<uni-datetime-picker v-model="dates" type="daterange">
|
|
|
|
|
|
<view class="flex items-center rounded-sm mr-5 px-10 bg-white">
|
|
|
|
|
|
<view class="flex-grow w-0 text-dark truncate leading-normal text-base py-5 mr-5">
|
|
|
|
|
|
{{ dates.length ? dates.join(' ~ ') : '时间筛选' }}
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<uni-icons type="down" size="16" color="#666" />
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</uni-datetime-picker>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view class="flex-grow"></view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
<view v-if="list.length === 0" class="flex items-center justify-center h-full">
|
2026-01-19 18:52:18 +08:00
|
|
|
|
<empty-data />
|
|
|
|
|
|
</view>
|
2026-01-20 19:04:24 +08:00
|
|
|
|
<view v-else class="px-15 pb-15">
|
|
|
|
|
|
<!-- v-for="customer in list" :key="customer._id" -->
|
|
|
|
|
|
<view v-for="i in list" :key="i._id" class="bg-white rounded shadow-lg mb-10"
|
|
|
|
|
|
@click="toRecord(i.medicalType, i._id)">
|
|
|
|
|
|
<view class="flex items-center py-12 px-15">
|
|
|
|
|
|
<view class="text-lg font-semibold text-dark mr-5">
|
|
|
|
|
|
{{ i.date }}
|
2026-01-19 18:52:18 +08:00
|
|
|
|
</view>
|
2026-01-20 19:04:24 +08:00
|
|
|
|
<view v-if="i.medicalType === 'outpatient'"
|
|
|
|
|
|
class="mr-5 px-10 leading-normal text-white text-base bg-warning rounded-full">门诊信息</view>
|
|
|
|
|
|
<view v-else-if="i.medicalType === 'inhospital'"
|
|
|
|
|
|
class="mr-5 px-10 leading-normal text-white text-base bg-success rounded-full">住院信息</view>
|
|
|
|
|
|
<view v-if="i.corp === '其他'" class="px-10 leading-normal text-white text-base bg-danger rounded-full">
|
|
|
|
|
|
外院
|
2026-01-19 18:52:18 +08:00
|
|
|
|
</view>
|
2026-01-20 19:04:24 +08:00
|
|
|
|
<view class="flex-grow"></view>
|
|
|
|
|
|
<view class="flex items-center text-base text-primary">
|
|
|
|
|
|
<view class="mr-5">查看详情</view>
|
|
|
|
|
|
<uni-icons type="right" :size="14" color="#0074ff" />
|
2026-01-19 18:52:18 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
2026-01-20 19:04:24 +08:00
|
|
|
|
<view v-if="i.rows.length" class="px-15 border-b">
|
|
|
|
|
|
<view v-for="row in i.rows" :key="row.key" class="flex leading-normal mb-10">
|
|
|
|
|
|
<view class="flex-shrink-0 mr-5 w-90 text-base text-gray">{{ row.label }}:</view>
|
|
|
|
|
|
<view v-if="row.title === 'diagnosisName'" class="w-0 flex-grow text-base text-dark">
|
|
|
|
|
|
{{ row.value && row.value.join ? row.value.join(', ') : '' }}
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view v-else-if="row.title === 'files'" class="w-0 flex-grow text-base text-dark">
|
|
|
|
|
|
<view v-if="row.value && row.value.length" class="w-full flex flex-wrap">
|
|
|
|
|
|
<image v-for="file in row.value" :src="file.url" class="file-icon" @click.stop="preview(file)" />
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view v-else class="w-0 flex-grow text-base text-dark">
|
|
|
|
|
|
{{ row.value }}
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<!-- <view class="flex leading-normal mb-10">
|
|
|
|
|
|
<view class="flex-shrink-0 mr-5 w-90 text-base text-gray">临床诊断:</view>
|
|
|
|
|
|
<view class="w-0 flex-grow text-base text-dark">龋齿</view>
|
2026-01-19 18:52:18 +08:00
|
|
|
|
</view>
|
2026-01-20 19:04:24 +08:00
|
|
|
|
<view class="flex leading-normal mb-10">
|
|
|
|
|
|
<view class="flex-shrink-0 mr-5 w-90 text-base text-gray">临床诊断:</view>
|
|
|
|
|
|
<view class="w-0 flex-grow text-base text-dark">龋齿</view>
|
|
|
|
|
|
</view> -->
|
2026-01-19 18:52:18 +08:00
|
|
|
|
</view>
|
2026-01-20 19:04:24 +08:00
|
|
|
|
<view v-if="i.dataSource === 'customerReport'" class="px-15 py-12 text-base text-dark">
|
|
|
|
|
|
记录时间:{{ i.createTime }} 记录人:自己
|
2026-01-19 18:52:18 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<template #footer>
|
2026-01-20 19:04:24 +08:00
|
|
|
|
<button-footer v-if="healthTempList.length" confirmText="+新增健康档案" :showCancel="false" @confirm="addArchive()" />
|
2026-01-19 18:52:18 +08:00
|
|
|
|
</template>
|
|
|
|
|
|
</full-page>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
2026-01-20 19:04:24 +08:00
|
|
|
|
import { computed, ref, watch } from 'vue';
|
|
|
|
|
|
import dayjs from 'dayjs';
|
2026-01-19 18:52:18 +08:00
|
|
|
|
import useGuard from '@/hooks/useGuard';
|
|
|
|
|
|
import api from '@/utils/api';
|
|
|
|
|
|
|
|
|
|
|
|
import ButtonFooter from '@/components/button-footer.vue';
|
|
|
|
|
|
import EmptyData from '@/components/empty-data.vue';
|
|
|
|
|
|
import FullPage from '@/components/full-page.vue';
|
2026-01-20 19:04:24 +08:00
|
|
|
|
import { toast } from '../../utils/widget';
|
2026-01-19 18:52:18 +08:00
|
|
|
|
|
2026-01-20 19:04:24 +08:00
|
|
|
|
const tempType = {
|
|
|
|
|
|
outpatient: '门诊信息',
|
|
|
|
|
|
inhospital: '住院信息'
|
|
|
|
|
|
}
|
2026-01-19 18:52:18 +08:00
|
|
|
|
const empty = ref(false)
|
|
|
|
|
|
const { useLoad, useShow } = useGuard();
|
|
|
|
|
|
const corpId = ref('');
|
2026-01-20 19:04:24 +08:00
|
|
|
|
const customerId = ref('');
|
|
|
|
|
|
const dates = ref([])
|
|
|
|
|
|
const list = ref([]);
|
|
|
|
|
|
const name = ref('');
|
|
|
|
|
|
const team = ref(null);
|
|
|
|
|
|
const type = ref('all');
|
2026-01-19 18:52:18 +08:00
|
|
|
|
const teamId = ref('');
|
2026-01-20 19:04:24 +08:00
|
|
|
|
const page = ref(1);
|
|
|
|
|
|
const more = ref(false)
|
|
|
|
|
|
const loading = ref(false);
|
|
|
|
|
|
const qrcode = computed(() => team.value && Array.isArray(team.value.qrcodes) ? team.value.qrcodes[0] : null)
|
|
|
|
|
|
const healthTempList = computed(() => qrcode.value && Array.isArray(qrcode.value.healthTempList) ? qrcode.value.healthTempList.map(i => ({ label: tempType[i.templateType], value: i.templateType })).filter(i => i.label) : [])
|
|
|
|
|
|
const tempShowField = ref(null);
|
|
|
|
|
|
|
|
|
|
|
|
const config = {
|
|
|
|
|
|
outpatient: ["corp", "deptName", "doctor", "diagnosisName", "files"],
|
|
|
|
|
|
inhospital: ["corp", "diagnosisName", "operation", "operationDate", "outhosDate", "files"],
|
|
|
|
|
|
};
|
2026-01-19 18:52:18 +08:00
|
|
|
|
|
|
|
|
|
|
function addArchive() {
|
2026-01-20 19:04:24 +08:00
|
|
|
|
if (healthTempList.value.length > 1) {
|
|
|
|
|
|
uni.showActionSheet({
|
|
|
|
|
|
title: '选择新增档案类型',
|
|
|
|
|
|
itemList: healthTempList.value.map(i => i.label),
|
|
|
|
|
|
success: function (res) {
|
|
|
|
|
|
toRecord(healthTempList.value[res.tapIndex].value)
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
} else {
|
|
|
|
|
|
toRecord(healthTempList.value[0].value)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function getTempRows(type, data) {
|
|
|
|
|
|
if (config[type] && tempShowField.value && tempShowField.value[type]) {
|
|
|
|
|
|
const list = [];
|
|
|
|
|
|
config[type].forEach(i => {
|
|
|
|
|
|
if (tempShowField.value[type][i]) {
|
|
|
|
|
|
list.push({ title: i, label: tempShowField.value[type][i], value: data[i], key: `${i}_${data._id}` })
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
return list;
|
|
|
|
|
|
}
|
|
|
|
|
|
return []
|
2026-01-19 18:52:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-20 19:04:24 +08:00
|
|
|
|
function toRecord(type, id = '') {
|
2026-01-19 18:52:18 +08:00
|
|
|
|
uni.navigateTo({
|
2026-01-20 19:04:24 +08:00
|
|
|
|
url: `/pages/health/record?type=${type}&teamId=${teamId.value}&corpId=${corpId.value}&id=${id}&customerId=${customerId.value}`
|
2026-01-19 18:52:18 +08:00
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-20 19:04:24 +08:00
|
|
|
|
function preview(file) {
|
|
|
|
|
|
if (/image/i.test(file.type)) {
|
|
|
|
|
|
uni.previewImage({
|
|
|
|
|
|
urls: [file.url]
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function selectType() {
|
|
|
|
|
|
const itemList = [{ label: '全部', value: 'all' }, ...healthTempList.value]
|
|
|
|
|
|
uni.showActionSheet({
|
|
|
|
|
|
title: '选择新增档案类型',
|
|
|
|
|
|
itemList: itemList.map(i => i.label),
|
|
|
|
|
|
success: function (res) {
|
|
|
|
|
|
type.value = itemList[res.tapIndex].value;
|
|
|
|
|
|
page.value = 1;
|
|
|
|
|
|
getList()
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async function getTeam() {
|
|
|
|
|
|
const res = await api('getTeamData', { teamId: teamId.value, corpId: corpId.value });
|
|
|
|
|
|
if (res && res.data) {
|
|
|
|
|
|
team.value = res.data;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
toast(res?.message || '获取团队信息失败')
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async function getList() {
|
|
|
|
|
|
if (!tempShowField.value) {
|
|
|
|
|
|
await getTeamHealthTemps()
|
2026-01-19 18:52:18 +08:00
|
|
|
|
}
|
2026-01-20 19:04:24 +08:00
|
|
|
|
if (loading.value) return;
|
|
|
|
|
|
const params = {
|
|
|
|
|
|
corpId: corpId.value,
|
|
|
|
|
|
memberId: customerId.value,
|
|
|
|
|
|
page: page.value,
|
|
|
|
|
|
pageSize: 20,
|
|
|
|
|
|
medicalType: ['outpatient', 'inhospital']
|
|
|
|
|
|
}
|
|
|
|
|
|
if (type.value !== 'all') {
|
|
|
|
|
|
params.medicalType = [type.value]
|
|
|
|
|
|
}
|
|
|
|
|
|
if (dates.value.length) {
|
|
|
|
|
|
params.startTime = dates.value[0];
|
|
|
|
|
|
params.endTime = dates.value[1];
|
|
|
|
|
|
}
|
|
|
|
|
|
loading.value = true;
|
|
|
|
|
|
const res = await api('getCustomerMedicalRecord', params);
|
|
|
|
|
|
loading.value = false;
|
|
|
|
|
|
const arr = res && Array.isArray(res.list) ? res.list.map(i => ({
|
|
|
|
|
|
...i,
|
|
|
|
|
|
date: i.sortTime && dayjs(i.sortTime).isValid ? dayjs(i.sortTime).format('YYYY-MM-DD') : '',
|
|
|
|
|
|
createTime: i.createTime && dayjs(i.createTime).isValid ? dayjs(i.createTime).format('YYYY-MM-DD HH:mm') : '',
|
|
|
|
|
|
rows: getTempRows(i.medicalType, i)
|
|
|
|
|
|
})) : [];
|
|
|
|
|
|
list.value = page.value === 1 ? arr : [...list.value, ...arr];
|
|
|
|
|
|
more.value = page.value < res.pages;
|
|
|
|
|
|
console.log(list.value)
|
2026-01-19 18:52:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-20 19:04:24 +08:00
|
|
|
|
async function getTeamHealthTemps() {
|
|
|
|
|
|
const res = await api('getTeamHealthTemps', { teamId: teamId.value, corpId: corpId.value });
|
2026-01-19 18:52:18 +08:00
|
|
|
|
if (res && res.success) {
|
2026-01-20 19:04:24 +08:00
|
|
|
|
const arr = res && Array.isArray(res.data) ? res.data : [];
|
|
|
|
|
|
tempShowField.value = arr.reduce((m, item) => {
|
|
|
|
|
|
const templateList = Array.isArray(item.templateList) ? item.templateList : [];
|
|
|
|
|
|
const data = {}
|
|
|
|
|
|
templateList.forEach(i => (data[i.title] = i.name));
|
|
|
|
|
|
m[item.templateType] = data
|
|
|
|
|
|
return m
|
|
|
|
|
|
}, {})
|
2026-01-19 18:52:18 +08:00
|
|
|
|
} else {
|
2026-01-20 19:04:24 +08:00
|
|
|
|
toast(res?.message || '获取团队健康档案模板失败');
|
|
|
|
|
|
return Promise.reject()
|
2026-01-19 18:52:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
useLoad(options => {
|
2026-01-20 19:04:24 +08:00
|
|
|
|
name.value = decodeURIComponent(options.name || '');
|
2026-01-19 18:52:18 +08:00
|
|
|
|
teamId.value = options.teamId;
|
|
|
|
|
|
corpId.value = options.corpId;
|
2026-01-20 19:04:24 +08:00
|
|
|
|
customerId.value = options.id || '';
|
|
|
|
|
|
getTeam()
|
|
|
|
|
|
// getTeamHealthTemps();
|
2026-01-19 18:52:18 +08:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
useShow(() => {
|
2026-01-20 19:04:24 +08:00
|
|
|
|
page.value = 1;
|
|
|
|
|
|
getList()
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
watch(dates, n => {
|
|
|
|
|
|
page.value = 1;
|
|
|
|
|
|
getList()
|
2026-01-19 18:52:18 +08:00
|
|
|
|
})
|
|
|
|
|
|
</script>
|
2026-01-20 19:04:24 +08:00
|
|
|
|
<style>
|
|
|
|
|
|
.min-w-90 {
|
|
|
|
|
|
min-width: 180rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.w-90 {
|
|
|
|
|
|
width: 160rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.w-100 {
|
|
|
|
|
|
width: 240rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.whitespace-nowrap {
|
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.file-icon {
|
|
|
|
|
|
margin-right: 10rpx;
|
|
|
|
|
|
margin-bottom: 10rpx;
|
|
|
|
|
|
width: 80rpx;
|
|
|
|
|
|
height: 80rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
</style>
|