2026-01-20 19:36:49 +08:00
|
|
|
|
<template>
|
2026-02-03 09:59:49 +08:00
|
|
|
|
<view class="archive-container">
|
2026-01-20 19:36:49 +08:00
|
|
|
|
<view class="mb-10 flex items-center justify-between">
|
2026-02-03 15:42:32 +08:00
|
|
|
|
<view class="module-title flex-shrink-0 truncate">
|
2026-01-20 19:36:49 +08:00
|
|
|
|
成员档案
|
|
|
|
|
|
</view>
|
2026-02-03 15:42:32 +08:00
|
|
|
|
<view class="flex items-center px-10 leading-normal rounded-sm" @click="toManagePage()">
|
|
|
|
|
|
<image class="manage-icon mr-5" src="/static/home/archive-manage.png" mode="aspectFit"></image>
|
|
|
|
|
|
<view style="font-size: 28rpx; color: #065BD6;">档案管理</view>
|
2026-01-20 19:36:49 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<view v-if="customers.length === 0" class="flex items-center justify-center h-80 border-dashed text-dark rounded">
|
|
|
|
|
|
<uni-icons type="plusempty" size="16" color="#999"></uni-icons>
|
|
|
|
|
|
<view class="text-base text-dark">新建档案</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<scroll-view scroll-x="true">
|
|
|
|
|
|
<view class="flex flex-nowrap pb-5 ">
|
|
|
|
|
|
<view v-for="i in customers" :key="i._id"
|
2026-02-03 15:42:32 +08:00
|
|
|
|
class="customer-card flex-shrink-0 mr-15 relative"
|
2026-02-03 09:59:49 +08:00
|
|
|
|
:class="current && i._id === current._id ? 'current-customer' : ''" @click="toggle(i)">
|
2026-02-03 15:42:32 +08:00
|
|
|
|
<!-- 关系标签 -->
|
|
|
|
|
|
<view v-if="i.relationship" class="relationship-tag"
|
|
|
|
|
|
:class="i.relationship === '本人' ? 'tag-blue' : 'tag-green'">
|
|
|
|
|
|
{{ i.relationship }}
|
|
|
|
|
|
</view>
|
2026-02-03 09:59:49 +08:00
|
|
|
|
<view class="flex flex-col items-center">
|
2026-02-03 10:45:54 +08:00
|
|
|
|
<view class="customer-name text-lg leading-normal font-semibold whitespace-nowrap mb-8"
|
2026-02-03 09:59:49 +08:00
|
|
|
|
:class="current && i._id === current._id ? 'text-primary' : 'text-dark'">
|
2026-01-20 19:36:49 +08:00
|
|
|
|
{{ i.name }}
|
|
|
|
|
|
</view>
|
2026-02-03 10:45:54 +08:00
|
|
|
|
<view class="flex items-center mb-5">
|
|
|
|
|
|
<image
|
|
|
|
|
|
v-if="i.sex"
|
|
|
|
|
|
class="sex-icon mr-5"
|
2026-02-03 15:42:32 +08:00
|
|
|
|
:src="i.sex === '男' ? '/static/home/male.svg' : '/static/home/female.svg'"
|
2026-02-03 10:45:54 +08:00
|
|
|
|
/>
|
|
|
|
|
|
<view class="customer-age text-base leading-normal text-gray">
|
2026-02-03 09:59:49 +08:00
|
|
|
|
{{ i.age > 0 ? i.age + '岁' : '' }}
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
2026-01-20 19:36:49 +08:00
|
|
|
|
</view>
|
2026-02-03 15:42:32 +08:00
|
|
|
|
<!-- 选中状态底部条和三角 -->
|
|
|
|
|
|
<view v-if="current && i._id === current._id" class="active-indicator">
|
|
|
|
|
|
<view class="active-bar"></view>
|
|
|
|
|
|
<view class="active-triangle"></view>
|
|
|
|
|
|
</view>
|
2026-01-20 19:36:49 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</scroll-view>
|
|
|
|
|
|
<view v-if="canAuth" class="px-10 py-5 mt-5 flex items-center bg-danger rounded-sm">
|
|
|
|
|
|
<view class="mr-5 w-0 flex-grow text-base text-white">
|
|
|
|
|
|
该档案还未授权本服务团队,点击右侧授权按钮。我们将更精准的为您服务。
|
|
|
|
|
|
</view>
|
2026-01-21 10:35:08 +08:00
|
|
|
|
<view class="px-12 py-5 text-base rounded-sm text-dark bg-white" @click="auth()">
|
2026-01-20 19:36:49 +08:00
|
|
|
|
授权
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
2026-02-03 10:45:54 +08:00
|
|
|
|
<view v-if="current" class="flex mt-15">
|
|
|
|
|
|
<view class="info-card-new flex-grow mr-10" @click="fillBaseInfo()">
|
|
|
|
|
|
<view class="info-bg info-bg-base"></view>
|
2026-02-03 09:59:49 +08:00
|
|
|
|
<view class="info-content">
|
2026-02-03 10:45:54 +08:00
|
|
|
|
<view class="flex items-center justify-between mb-8">
|
|
|
|
|
|
<view class="info-title">个人基本信息</view>
|
2026-02-03 15:42:32 +08:00
|
|
|
|
<image class="arrow-icon-small" src="/static/home/arrow-right-blue.png" mode="aspectFit"></image>
|
2026-02-03 09:59:49 +08:00
|
|
|
|
</view>
|
2026-02-03 10:45:54 +08:00
|
|
|
|
<view class="info-subtitle">完善个人信息</view>
|
2026-01-20 19:36:49 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
2026-02-03 10:45:54 +08:00
|
|
|
|
<view class="info-card-new flex-grow" @click="toHealthList()">
|
|
|
|
|
|
<view class="info-bg info-bg-health"></view>
|
2026-02-03 09:59:49 +08:00
|
|
|
|
<view class="info-content">
|
2026-02-03 10:45:54 +08:00
|
|
|
|
<view class="flex items-center justify-between mb-8">
|
|
|
|
|
|
<view class="info-title">健康信息</view>
|
2026-02-03 15:42:32 +08:00
|
|
|
|
<image class="arrow-icon-small" src="/static/home/arrow-right-blue.png" mode="aspectFit"></image>
|
2026-02-03 09:59:49 +08:00
|
|
|
|
</view>
|
2026-02-03 10:45:54 +08:00
|
|
|
|
<view class="info-subtitle">上传健康档案</view>
|
2026-01-20 19:36:49 +08:00
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
|
|
|
|
import { computed, ref, watch } from 'vue';
|
|
|
|
|
|
import { storeToRefs } from 'pinia'
|
|
|
|
|
|
import useAccount from '@/store/account';
|
|
|
|
|
|
import api from '@/utils/api';
|
2026-01-21 10:35:08 +08:00
|
|
|
|
import { toast, confirm } from '@/utils/widget';
|
2026-01-20 19:36:49 +08:00
|
|
|
|
|
|
|
|
|
|
const props = defineProps({
|
|
|
|
|
|
corpId: {
|
|
|
|
|
|
type: String,
|
|
|
|
|
|
default: ''
|
|
|
|
|
|
},
|
|
|
|
|
|
customers: {
|
|
|
|
|
|
type: Array,
|
|
|
|
|
|
default: () => []
|
|
|
|
|
|
},
|
|
|
|
|
|
team: {
|
|
|
|
|
|
type: Object,
|
|
|
|
|
|
default: () => ({})
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
|
2026-01-28 13:38:05 +08:00
|
|
|
|
const emit = defineEmits(['update:customers']);
|
|
|
|
|
|
|
2026-01-20 19:36:49 +08:00
|
|
|
|
const { account } = storeToRefs(useAccount());
|
|
|
|
|
|
const current = ref(null);
|
|
|
|
|
|
const customers = ref([]);
|
|
|
|
|
|
|
|
|
|
|
|
const canAuth = computed(() => {
|
|
|
|
|
|
if (current.value && props.team && props.team.teamId) {
|
|
|
|
|
|
const teamIds = Array.isArray(current.value.teamId) ? current.value.teamId : [];
|
|
|
|
|
|
return !teamIds.includes(props.team.teamId);
|
|
|
|
|
|
}
|
|
|
|
|
|
return false
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
function fillBaseInfo() {
|
|
|
|
|
|
if (canAuth.value) {
|
|
|
|
|
|
toast('请先授权本服务团队')
|
|
|
|
|
|
} else {
|
|
|
|
|
|
uni.navigateTo({
|
|
|
|
|
|
url: `/pages/archive/edit-archive?teamId=${props.team.teamId}&corpId=${props.corpId}&id=${current.value._id}`
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function toHealthList() {
|
|
|
|
|
|
if (canAuth.value) {
|
|
|
|
|
|
toast('请先授权本服务团队')
|
|
|
|
|
|
} else {
|
|
|
|
|
|
const name = `${current.value.name} ${current.value.relationship ? `(${current.value.relationship})` : ''}`
|
|
|
|
|
|
uni.navigateTo({
|
|
|
|
|
|
url: `/pages/health/list?teamId=${props.team.teamId}&corpId=${props.corpId}&id=${current.value._id}&name=${encodeURIComponent(name)}`
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function toggle(i) {
|
|
|
|
|
|
current.value = i;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function toManagePage() {
|
|
|
|
|
|
uni.navigateTo({ url: `/pages/archive/archive-manage?corpId=${props.corpId}&teamId=${props.team.teamId}` })
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-21 10:35:08 +08:00
|
|
|
|
async function auth() {
|
|
|
|
|
|
await confirm(`是否授权${props.team.name}提供服务`);
|
|
|
|
|
|
const res = await api('authCustomerToTeam', { corpId: props.corpId, teamId: props.team.teamId, id: current.value._id });
|
|
|
|
|
|
if (res && res.success) {
|
|
|
|
|
|
await toast('授权成功');
|
|
|
|
|
|
getCustomers()
|
|
|
|
|
|
} else {
|
|
|
|
|
|
toast(res?.message || '授权失败');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-20 19:36:49 +08:00
|
|
|
|
async function getCustomers() {
|
|
|
|
|
|
const res = await api('getMiniAppCustomers', { miniAppId: account.value.openid, corpId: props.corpId });
|
|
|
|
|
|
if (res && res.success) {
|
|
|
|
|
|
customers.value = res && Array.isArray(res.data) ? res.data : [];
|
2026-01-21 10:35:08 +08:00
|
|
|
|
const customer = customers.value.find(i => current.value && i._id === current.value._id);
|
|
|
|
|
|
current.value = customer || customers.value[0] || null;
|
2026-01-28 13:38:05 +08:00
|
|
|
|
|
|
|
|
|
|
// 向父组件传递 customers 数据
|
|
|
|
|
|
emit('update:customers', customers.value);
|
2026-01-20 19:36:49 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
toast(res.message || '获取档案失败');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
watch(() => props.corpId, n => {
|
|
|
|
|
|
if (n) {
|
|
|
|
|
|
getCustomers()
|
|
|
|
|
|
} else {
|
|
|
|
|
|
customers.value = [];
|
|
|
|
|
|
}
|
|
|
|
|
|
}, { immediate: true });
|
|
|
|
|
|
|
|
|
|
|
|
</script>
|
|
|
|
|
|
<style scoped>
|
2026-02-03 09:59:49 +08:00
|
|
|
|
.archive-container {
|
|
|
|
|
|
padding: 24rpx 30rpx;
|
|
|
|
|
|
margin: 0 30rpx;
|
2026-02-03 15:42:32 +08:00
|
|
|
|
background: linear-gradient(181deg, #C2DCFF 1.01%, #FFFFFF 43.31%);
|
|
|
|
|
|
border-radius: 16rpx;
|
|
|
|
|
|
box-shadow:
|
|
|
|
|
|
inset 0 2rpx 0 0 rgba(255, 255, 255, 0.82),
|
|
|
|
|
|
0 8rpx 10rpx 0 rgba(60, 169, 145, 0.06);
|
2026-02-03 09:59:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.manage-icon {
|
|
|
|
|
|
width: 32rpx;
|
|
|
|
|
|
height: 32rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-03 15:42:32 +08:00
|
|
|
|
.module-title {
|
|
|
|
|
|
color: #000000;
|
|
|
|
|
|
font-size: 36rpx;
|
|
|
|
|
|
font-weight: 600;
|
|
|
|
|
|
line-height: normal;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-03 09:59:49 +08:00
|
|
|
|
.customer-card {
|
2026-02-03 15:42:32 +08:00
|
|
|
|
width: 160rpx;
|
|
|
|
|
|
height: 160rpx;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
background: linear-gradient(180deg, #FFFFFF 0%, #E6EFFB 100%);
|
|
|
|
|
|
border-radius: 12rpx;
|
|
|
|
|
|
border: 2rpx solid #AECAF2;
|
|
|
|
|
|
transition: all 0.2s;
|
2026-02-03 10:45:54 +08:00
|
|
|
|
position: relative;
|
2026-02-03 09:59:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.current-customer {
|
2026-02-03 10:45:54 +08:00
|
|
|
|
background: #FFFFFF;
|
2026-02-03 15:42:32 +08:00
|
|
|
|
border: 2rpx solid #065BD6;
|
2026-02-03 10:45:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-03 15:42:32 +08:00
|
|
|
|
.customer-name {
|
|
|
|
|
|
margin-top: 12rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.relationship-tag {
|
2026-02-03 10:45:54 +08:00
|
|
|
|
position: absolute;
|
2026-02-03 15:42:32 +08:00
|
|
|
|
top: -2rpx;
|
|
|
|
|
|
right: -10rpx;
|
|
|
|
|
|
padding: 4rpx 16rpx;
|
|
|
|
|
|
font-size: 20rpx;
|
|
|
|
|
|
line-height: normal;
|
|
|
|
|
|
color: #fff;
|
|
|
|
|
|
border-top-left-radius: 16rpx;
|
|
|
|
|
|
border-bottom-left-radius: 16rpx;
|
|
|
|
|
|
z-index: 10;
|
2026-02-03 10:45:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-03 15:42:32 +08:00
|
|
|
|
.relationship-tag::after {
|
2026-02-03 10:45:54 +08:00
|
|
|
|
content: '';
|
|
|
|
|
|
position: absolute;
|
2026-02-03 15:42:32 +08:00
|
|
|
|
right: 0;
|
|
|
|
|
|
bottom: -8rpx;
|
2026-02-03 10:45:54 +08:00
|
|
|
|
width: 0;
|
|
|
|
|
|
height: 0;
|
2026-02-03 15:42:32 +08:00
|
|
|
|
border-right: 10rpx solid transparent;
|
2026-02-03 10:45:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-03 15:42:32 +08:00
|
|
|
|
.tag-blue {
|
|
|
|
|
|
background: #065BD6;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tag-blue::after {
|
|
|
|
|
|
border-top: 8rpx solid #003F96;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tag-green {
|
|
|
|
|
|
background: #1DBF98;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tag-green::after {
|
|
|
|
|
|
border-top: 8rpx solid #0F8C6D;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.active-indicator {
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
bottom: -2rpx;
|
|
|
|
|
|
left: -2rpx;
|
|
|
|
|
|
right: -2rpx;
|
|
|
|
|
|
height: 10rpx;
|
|
|
|
|
|
z-index: 5;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.active-bar {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 100%;
|
|
|
|
|
|
background: #065bd6;
|
|
|
|
|
|
border-bottom-left-radius: 12rpx;
|
|
|
|
|
|
border-bottom-right-radius: 12rpx;
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.active-triangle {
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
top: 100%;
|
|
|
|
|
|
left: 50%;
|
|
|
|
|
|
transform: translateX(-50%) rotate(45deg);
|
|
|
|
|
|
width: 12rpx;
|
|
|
|
|
|
height: 12rpx;
|
|
|
|
|
|
background: #065BD6;
|
|
|
|
|
|
margin-top: -8rpx;
|
2026-02-03 10:45:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.customer-age {
|
|
|
|
|
|
color: #999999;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.mr-15 {
|
|
|
|
|
|
margin-right: 20rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.mt-15 {
|
|
|
|
|
|
margin-top: 24rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.mb-8 {
|
|
|
|
|
|
margin-bottom: 12rpx;
|
2026-02-03 09:59:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.sex-icon {
|
|
|
|
|
|
width: 32rpx;
|
|
|
|
|
|
height: 32rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-03 10:45:54 +08:00
|
|
|
|
.info-card-new {
|
2026-02-03 09:59:49 +08:00
|
|
|
|
position: relative;
|
2026-02-03 10:45:54 +08:00
|
|
|
|
padding: 24rpx;
|
2026-02-03 15:42:32 +08:00
|
|
|
|
border-radius: 16rpx;
|
|
|
|
|
|
background: linear-gradient(115deg, #F4F9FF 14.74%, #DBEAFF 66.11%);
|
2026-02-03 09:59:49 +08:00
|
|
|
|
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);
|
|
|
|
|
|
overflow: hidden;
|
2026-02-03 15:42:32 +08:00
|
|
|
|
width: 310rpx;
|
|
|
|
|
|
height: 94rpx;
|
2026-02-03 10:45:54 +08:00
|
|
|
|
flex: 1;
|
2026-02-03 09:59:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.info-bg {
|
|
|
|
|
|
position: absolute;
|
2026-02-03 10:45:54 +08:00
|
|
|
|
left: 0;
|
|
|
|
|
|
top: 0;
|
2026-02-03 09:59:49 +08:00
|
|
|
|
right: 0;
|
|
|
|
|
|
bottom: 0;
|
2026-02-03 10:45:54 +08:00
|
|
|
|
background-repeat: no-repeat;
|
|
|
|
|
|
background-position: right bottom;
|
|
|
|
|
|
background-size: cover;
|
|
|
|
|
|
opacity: 0.95;
|
|
|
|
|
|
pointer-events: none;
|
2026-02-03 09:59:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.info-content {
|
|
|
|
|
|
position: relative;
|
|
|
|
|
|
z-index: 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-03 10:45:54 +08:00
|
|
|
|
.info-bg-base {
|
2026-02-03 15:42:32 +08:00
|
|
|
|
background-image: url('/static/home/basic-info-bg.svg');
|
2026-02-03 10:45:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.info-bg-health {
|
2026-02-03 15:42:32 +08:00
|
|
|
|
background-image: url('/static/home/health-info-bg.svg');
|
2026-02-03 10:45:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.info-title {
|
|
|
|
|
|
color: #213E80;
|
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
font-weight: 500;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.info-subtitle {
|
|
|
|
|
|
color: #78808F;
|
|
|
|
|
|
font-size: 24rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.arrow-icon-small {
|
|
|
|
|
|
width: 24rpx;
|
|
|
|
|
|
height: 24rpx;
|
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.font-medium {
|
|
|
|
|
|
font-weight: 500;
|
2026-02-03 09:59:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-20 19:36:49 +08:00
|
|
|
|
.h-80 {
|
|
|
|
|
|
height: 160rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.h-normal {
|
|
|
|
|
|
height: 1.5em;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.min-w-100 {
|
|
|
|
|
|
min-width: 200rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-03 09:59:49 +08:00
|
|
|
|
.rounded-lg {
|
|
|
|
|
|
border-radius: 16rpx;
|
2026-01-20 19:36:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
</style>
|