Merge commit 'cecb26e762fe652537571972fecca17a576e7cf1' into dev-wdb

This commit is contained in:
wangdongbo 2026-02-09 09:19:28 +08:00
commit 91db27cca7
22 changed files with 132 additions and 103 deletions

View File

@ -25,7 +25,7 @@ const props = defineProps({
} }
}) })
const list = computed(() => props.avatarList.map(i => i || '/static/default-avatar.svg')) const list = computed(() => props.avatarList.map(i => i || '/static/default-avatar.png'))
const size = computed(() => { const size = computed(() => {
const val = Number.isInteger(props.size) && props.size > 0 ? props.size : 144; const val = Number.isInteger(props.size) && props.size > 0 ? props.size : 144;

View File

@ -43,10 +43,10 @@
</view> </view>
</view> </view>
<view class="mt-12 border-primary qrcode p-15 mx-auto rounded" @click="previewImage()"> <view class="mt-12 border-primary qrcode p-15 mx-auto rounded" @click="previewImage()">
<image v-if="qrcode" class="h-full w-full" :src="qrcode"></image> <image v-if="qrcode" class="h-full w-full" :show-menu-by-longpress="true" :src="qrcode"></image>
</view> </view>
<view class="mt-12 text-base text-center text-dark"> <view class="mt-12 text-base text-center text-dark">
点击识别下方二维码加我为好友 长按识别二维码加我为好友
</view> </view>
</view> </view>
</template> </template>

View File

@ -9,9 +9,8 @@
@change="change($event)" /> @change="change($event)" />
</view> </view>
</view> </view>
<template #footer> <template #footer>
<button-footer :showCancel="customerId" cancelText="删除" confirmText="保存" @cancel="unBindArchive()" <button-footer :showCancel="customerId ? true : false" cancelText="删除" confirmText="保存" @cancel="unBindArchive()"
@confirm="confirm()" /> @confirm="confirm()" />
</template> </template>
</full-page> </full-page>
@ -57,10 +56,7 @@ const verifyVisible = ref(false);
const visible = ref(false); const visible = ref(false);
const formData = computed(() => { const formData = computed(() => {
if (customerId.value) { return { ...customer.value, ...form.value, mobile: account.value?.mobile }
return { ...customer.value, ...form.value }
}
return { ...customer.value, ...form.value, mobile: account.value?.mobile }
}); });
function change({ title, value }) { function change({ title, value }) {
@ -86,6 +82,46 @@ function confirm() {
} }
} }
/**
* 产品要求, 建档页面与联系人关系默认选中本人证件类型默认选中身份证
*/
function preProcessFrom() {
const relationItem = formItems.value.find(item => item.title === 'relationship');
const range = relationItem && Array.isArray(relationItem.range) ? relationItem.range : [];
if (range.includes('本人')) {
form.value.relationship = '本人';
}
const cardTypeItem = formItems.value.find(item => item.title === 'cardType');
const cardTypeRange = cardTypeItem && Array.isArray(cardTypeItem.range) ? relationItem.range : [];
if (cardTypeRange.includes('身份证')) {
form.value.cardType = '身份证';
}
}
/**
* 产品要求, 编辑的情况下 姓名身份证号性别年龄出生年月
* 建档成功或者绑定档案成功后姓名身份证号性别年龄出生年月如果有内容的都不允许修改没有内容的则允许编辑
*/
function setDisabledTitles(data) {
const list = ['mobile'];
if (data.name) {
list.push('name');
}
if (data.idCard) {
list.push('idCard');
}
if (data.sex) {
list.push('sex');
}
if (data.age) {
list.push('age');
}
if (data.birthday) {
list.push('birthday');
}
disableTitles.value = list;
}
async function addArchive() { async function addArchive() {
if (loading.value) return; if (loading.value) return;
loading.value = true; loading.value = true;
@ -135,6 +171,10 @@ async function init() {
} }
} }
await getBaseForm(); await getBaseForm();
if (!customerId.value) {
preProcessFrom()
}
} }
async function getArchives() { async function getArchives() {
@ -153,6 +193,11 @@ async function getBaseForm() {
const res = await api('getTeamBaseInfo', { corpId: corpId.value, teamId: teamId.value }); const res = await api('getTeamBaseInfo', { corpId: corpId.value, teamId: teamId.value });
if (res && res.success) { if (res && res.success) {
formItems.value = Array.isArray(res.data) ? res.data : []; formItems.value = Array.isArray(res.data) ? res.data : [];
const mobileIndex = formItems.value.findIndex(item => item.title === 'mobile');
if (mobileIndex > -1) {
formItems.value[mobileIndex].appendText = `(授权手机号不可修改)`;
}
} else { } else {
toast(res?.message || '查询失败'); toast(res?.message || '查询失败');
return Promise.reject() return Promise.reject()
@ -163,6 +208,7 @@ async function getCustomer() {
const res = await api('getCustomerByCustomerId', { customerId: customerId.value }); const res = await api('getCustomerByCustomerId', { customerId: customerId.value });
if (res && res.success && res.data) { if (res && res.success && res.data) {
customer.value = res.data; customer.value = res.data;
setDisabledTitles(res.data)
} else { } else {
await toast(res?.message || '查询档案信息失败'); await toast(res?.message || '查询档案信息失败');
uni.navigateBack(); uni.navigateBack();

View File

@ -53,7 +53,7 @@
class="text-sm mr-2" class="text-sm mr-2"
:class="item.status === 'UNREAD' ? 'text-red-500' : 'text-gray-400'" :class="item.status === 'UNREAD' ? 'text-red-500' : 'text-gray-400'"
> >
{{ item.status === 'UNREAD' ? '未阅读' : '已阅读' }} {{ item.status === 'UNREAD' ? '未阅读' : '查看' }}
</text> </text>
<uni-icons type="right" size="14" :color="item.status === 'UNREAD' ? '#ef4444' : '#9ca3af'"></uni-icons> <uni-icons type="right" size="14" :color="item.status === 'UNREAD' ? '#ef4444' : '#9ca3af'"></uni-icons>
</view> </view>

View File

@ -111,7 +111,19 @@ function handleItemClick(item) {
// //
async function handleConsultantConfirm(customer) { async function handleConsultantConfirm(customer) {
console.log("选择的咨询人:", customer); const teamIds = customer && Array.isArray(customer.teamId) ? customer.teamId : [];
if (!teamIds.includes(props.teamId)) {
const res = await api("authCustomerToTeam", {
corpId: props.team.corpId,
teamId: props.team.teamId,
id: customer._id,
});
if (res && res.success) {
uni.$emit("reloadTeamCustomers");
} else {
toast(res?.message || "授权团队失败");
}
}
// //
uni.showLoading({ title: "创建咨询中..." }); uni.showLoading({ title: "创建咨询中..." });
try { try {

View File

@ -36,19 +36,11 @@
</view> </view>
<scroll-view scroll-x="true"> <scroll-view scroll-x="true">
<view class="flex flex-nowrap pb-5"> <view class="flex flex-nowrap pb-5">
<view <view v-for="i in customers" :key="i._id" class="customer-card flex-shrink-0 mr-15 relative"
v-for="i in customers" :class="current && i._id === current._id ? 'current-customer' : ''" @click="toggle(i)">
:key="i._id"
class="customer-card flex-shrink-0 mr-15 relative"
:class="current && i._id === current._id ? 'current-customer' : ''"
@click="toggle(i)"
>
<!-- 关系标签 --> <!-- 关系标签 -->
<view <view v-if="i.relationship" class="relationship-tag"
v-if="i.relationship" :class="i.relationship === '本人' ? 'tag-blue' : 'tag-green'">
class="relationship-tag"
:class="i.relationship === '本人' ? 'tag-blue' : 'tag-green'"
>
{{ i.relationship }} {{ i.relationship }}
</view> </view>
<view class="flex flex-col items-center"> <view class="flex flex-col items-center">
@ -62,27 +54,18 @@
</view> </view>
</view> </view>
<!-- 选中状态底部条和三角 --> <!-- 选中状态底部条和三角 -->
<view <view v-if="current && i._id === current._id" class="active-indicator">
v-if="current && i._id === current._id"
class="active-indicator"
>
<view class="active-bar"></view> <view class="active-bar"></view>
<view class="active-triangle"></view> <view class="active-triangle"></view>
</view> </view>
</view> </view>
</view> </view>
</scroll-view> </scroll-view>
<view <view v-if="canAuth" class="px-10 py-5 mt-5 flex items-center bg-danger rounded-sm">
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 class="mr-5 w-0 flex-grow text-base text-white">
点击右侧授权按钮, 我们将更精准的为您服务 点击右侧授权按钮, 我们将更精准的为您服务
</view> </view>
<view <view class="px-12 py-5 text-base rounded-sm text-dark bg-white" @click="auth()">
class="px-12 py-5 text-base rounded-sm text-dark bg-white"
@click="auth()"
>
授权 授权
</view> </view>
</view> </view>
@ -92,32 +75,18 @@
<view class="info-content"> <view class="info-content">
<view class="flex items-center justify-between mb-8"> <view class="flex items-center justify-between mb-8">
<view class="info-title">个人基本信息</view> <view class="info-title">个人基本信息</view>
<image <image class="arrow-icon-small" src="/static/home/arrow-right-blue.png" mode="aspectFit"></image>
class="arrow-icon-small"
src="/static/home/arrow-right-blue.png"
mode="aspectFit"
></image>
</view> </view>
<view v-if="baseInfoError" class="text-sm text-danger" <view v-if="baseInfoError" class="text-sm text-danger">请完善您的个人信息</view>
>请完善您的个人信息</view
>
<view v-else class="info-subtitle">完善个人信息</view> <view v-else class="info-subtitle">完善个人信息</view>
</view> </view>
</view> </view>
<view <view v-if="hasHealthTemp" class="ml-10 info-card-new flex-grow" @click="toHealthList()">
v-if="hasHealthTemp"
class="ml-10 info-card-new flex-grow"
@click="toHealthList()"
>
<view class="info-bg info-bg-health"></view> <view class="info-bg info-bg-health"></view>
<view class="info-content"> <view class="info-content">
<view class="flex items-center justify-between mb-8"> <view class="flex items-center justify-between mb-8">
<view class="info-title">健康信息</view> <view class="info-title">健康信息</view>
<image <image class="arrow-icon-small" src="/static/home/arrow-right-blue.png" mode="aspectFit"></image>
class="arrow-icon-small"
src="/static/home/arrow-right-blue.png"
mode="aspectFit"
></image>
</view> </view>
<view class="info-subtitle">上传健康档案</view> <view class="info-subtitle">上传健康档案</view>
</view> </view>
@ -176,16 +145,12 @@ const hasHealthTemp = computed(
); );
const baseInfo = computed(() => const baseInfo = computed(() =>
qrcode.value && qrcode.value &&
qrcode.value.teamFileds && qrcode.value.teamFileds &&
Array.isArray(qrcode.value.teamFileds.baseInfo) Array.isArray(qrcode.value.teamFileds.baseInfo)
? qrcode.value.teamFileds.baseInfo ? qrcode.value.teamFileds.baseInfo
: [] : []
); );
const baseInfoError = computed(() => { const baseInfoError = computed(() => current.value && baseInfo.value.some((i) => i.title && !current.value[i.title]));
const requiredTitles = baseInfo.value
.map((i) => i.title);
return current.value && requiredTitles.some((i) => !current.value[i]);
});
function fillBaseInfo() { function fillBaseInfo() {
if (canAuth.value) { if (canAuth.value) {
@ -201,13 +166,11 @@ function toHealthList() {
if (canAuth.value) { if (canAuth.value) {
toast("请先授权本服务团队"); toast("请先授权本服务团队");
} else { } else {
const name = `${current.value.name} ${ const name = `${current.value.name} ${current.value.relationship ? `(${current.value.relationship})` : ""
current.value.relationship ? `(${current.value.relationship})` : "" }`;
}`;
uni.navigateTo({ uni.navigateTo({
url: `/pages/health/list?teamId=${props.team.teamId}&corpId=${ url: `/pages/health/list?teamId=${props.team.teamId}&corpId=${props.corpId
props.corpId }&id=${current.value._id}&name=${encodeURIComponent(name)}`,
}&id=${current.value._id}&name=${encodeURIComponent(name)}`,
}); });
} }
} }

View File

@ -13,7 +13,7 @@
<view v-for="i in teamates" :key="i.userid" <view v-for="i in teamates" :key="i.userid"
class="member-card flex flex-shrink-0 min-w-120 mr-15 p-15" class="member-card flex flex-shrink-0 min-w-120 mr-15 p-15"
@click="toHomePage(i)"> @click="toHomePage(i)">
<image class="flex-shrink-0 avatar mr-10" :src="i.avatar || '/static/default-avatar.svg'" /> <image class="flex-shrink-0 avatar mr-10" :src="i.avatar || '/static/default-avatar.png'" />
<view class="flex-grow flex flex-col justify-between"> <view class="flex-grow flex flex-col justify-between">
<view> <view>
<view class="member-name leading-normal h-24 text-base font-semibold text-dark whitespace-nowrap"> <view class="member-name leading-normal h-24 text-base font-semibold text-dark whitespace-nowrap">

View File

@ -14,7 +14,7 @@
<view class="doctor-info"> <view class="doctor-info">
<image class="logo" src="/static/logo-plain.png" mode="aspectFill" /> <image class="logo" src="/static/logo-plain.png" mode="aspectFill" />
<view class="doctor-name">柚健康</view> <view class="doctor-name">柚健康</view>
<view class="login-tip">生命全周期健康管理伙伴</view> <view class="login-tip">全周期健康管理伙伴</view>
</view> </view>
</view> </view>
<view v-if="team" class="doctor-avatar"> <view v-if="team" class="doctor-avatar">
@ -216,12 +216,12 @@ onLoad((opts) => {
} }
.doctor-card { .doctor-card {
height: 398rpx; /* min-height: 300rpx; */
background: #fff; background: #fff;
border-radius: 24rpx; border-radius: 24rpx;
background: linear-gradient(180deg, #dbe8ff 0%, #fff 50.25%); background: linear-gradient(180deg, #dbe8ff 0%, #fff 50.25%);
box-shadow: 0 8rpx 32rpx rgba(59, 124, 255, 0.08); box-shadow: 0 8rpx 32rpx rgba(59, 124, 255, 0.08);
padding: 100rpx 24rpx 0rpx 24rpx; padding: 100rpx 24rpx 60rpx 24rpx;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;

View File

@ -13,7 +13,6 @@
</template> </template>
<script setup> <script setup>
import { defineEmits } from 'vue';
const emit = defineEmits(['accept', 'reject']); const emit = defineEmits(['accept', 'reject']);

View File

@ -22,7 +22,6 @@
</template> </template>
<script setup> <script setup>
import { defineEmits } from 'vue';
const emit = defineEmits(['apply']); const emit = defineEmits(['apply']);

View File

@ -12,7 +12,6 @@
</template> </template>
<script setup> <script setup>
import { defineEmits } from 'vue';
const emit = defineEmits(['cancel']); const emit = defineEmits(['cancel']);

View File

@ -10,7 +10,7 @@ export default function useGroupAvatars() {
const groupAvatarMap = ref({}) // { groupID: [avatarUrl1, avatarUrl2, ...] } const groupAvatarMap = ref({}) // { groupID: [avatarUrl1, avatarUrl2, ...] }
const teamStore = useTeamStore() const teamStore = useTeamStore()
const patientDefaultAvatar = '/static/default-patient-avatar.png' const patientDefaultAvatar = '/static/default-patient-avatar.png'
const teamMemberDefaultAvatar = '/static/default-avatar.svg' const teamMemberDefaultAvatar = '/static/default-avatar.png'
/** /**
* 获取单个群聊的头像列表 * 获取单个群聊的头像列表

View File

@ -49,8 +49,8 @@ export default function useGroupChat(groupID) {
if (!member) { if (!member) {
// 如果找不到成员信息,根据是否为团队成员返回默认头像 // 如果找不到成员信息,根据是否为团队成员返回默认头像
// 患者userId为当前账户openid使用 default-patient-avatar.png // 患者userId为当前账户openid使用 default-patient-avatar.png
// 其他情况使用 default-avatar.svg // 其他情况使用 default-avatar.png
return userId === openid.value ? '/static/default-patient-avatar.png' : '/static/default-avatar.svg' return userId === openid.value ? '/static/default-patient-avatar.png' : '/static/default-avatar.png'
} }
// 如果有头像且不为空字符串,返回头像 // 如果有头像且不为空字符串,返回头像
@ -59,8 +59,8 @@ export default function useGroupChat(groupID) {
} }
// 否则根据是否为团队成员返回默认头像 // 否则根据是否为团队成员返回默认头像
// 患者使用 default-patient-avatar.png团队成员使用 default-avatar.svg // 患者使用 default-patient-avatar.png团队成员使用 default-avatar.png
return member.isTeamMember ? '/static/default-avatar.svg' : '/static/default-patient-avatar.png' return member.isTeamMember ? '/static/default-avatar.png' : '/static/default-patient-avatar.png'
} }
// 获取群聊信息和成员头像 // 获取群聊信息和成员头像

View File

@ -1,6 +1,7 @@
<template> <template>
<view class="flex flex-col justify-center h-full bg-white"> <view class="flex flex-col justify-center items-center h-full bg-white">
<view> <image class="service-qrcode" :show-menu-by-longpress="true" src="/static/service-qrcode.jpg" />
<!-- <view>
<view class="mb-10 text-dark text-lg font-semibold text-center mb-10"> <view class="mb-10 text-dark text-lg font-semibold text-center mb-10">
柚康企微客服 柚康企微客服
</view> </view>
@ -13,7 +14,7 @@
<view class="mt-10 px-15 text-base text-dark leading-normal text-center"> <view class="mt-10 px-15 text-base text-dark leading-normal text-center">
我们将为您提供软件使用咨询服务并支持补充病历宣教问卷回访等多种工作模板 我们将为您提供软件使用咨询服务并支持补充病历宣教问卷回访等多种工作模板
</view> </view>
</view> </view> -->
</view> </view>
</template> </template>
@ -22,5 +23,8 @@ const options = { margin: 10 }
</script> </script>
<style> <style>
/* Using global styles from App.vue */ .service-qrcode {
width: 750rpx;
height: 977rpx;
}
</style> </style>

View File

@ -2,7 +2,7 @@
<view v-if="member" class="flex flex-col h-full items-center justify-center"> <view v-if="member" class="flex flex-col h-full items-center justify-center">
<view class="business-card"> <view class="business-card">
<view class="flex"> <view class="flex">
<image class="mr-10 avatar" :src="member.avatar || '/static/default-avatar.svg'"></image> <image class="mr-10 avatar" :src="member.avatar || '/static/default-avatar.png'"></image>
<view class="w-0 flex-grow leading-normal"> <view class="w-0 flex-grow leading-normal">
<view class="flex items-center"> <view class="flex items-center">
<view class="mr-5 text-lg font-semibold text-dark">{{ member.anotherName }}</view> <view class="mr-5 text-lg font-semibold text-dark">{{ member.anotherName }}</view>
@ -12,10 +12,10 @@
</view> </view>
</view> </view>
<view class="mt-12 border-primary qrcode p-15 mx-auto rounded" @click="previewImage()"> <view class="mt-12 border-primary qrcode p-15 mx-auto rounded" @click="previewImage()">
<image v-if="qrcode" class="h-full w-full" :src="qrcode"></image> <image v-if="qrcode" class="h-full w-full" :show-menu-by-longpress="true" :src="qrcode"></image>
</view> </view>
<view class="mt-12 text-base text-center text-dark"> <view class="mt-12 text-base text-center text-dark">
点击识别下方二维码加我为好友 长按识别二维码加我为好友
</view> </view>
</view> </view>
</view> </view>

View File

@ -53,10 +53,10 @@
</view> </view>
<view v-if="qrcode" class="p-15 mt-12 leading-normal bg-white shadow-lg"> <view v-if="qrcode" class="p-15 mt-12 leading-normal bg-white shadow-lg">
<view class="text-lg font-semibold text-center text-dark"> <view class="text-lg font-semibold text-center text-dark">
点击识别下方二维码加我为好友 长按识别下方二维码加我为好友
</view> </view>
<view class="mt-12 border-primary qrcode p-15 mx-auto rounded" @click="previewImage()"> <view class="mt-12 border-primary qrcode p-15 mx-auto rounded" @click="previewImage()">
<image :src="qrcode" class="h-full w-full"></image> <image :src="qrcode" :show-menu-by-longpress="true" class="h-full w-full"></image>
</view> </view>
</view> </view>
<view class="safe-bottom-padding"></view> <view class="safe-bottom-padding"></view>
@ -99,9 +99,9 @@ const services = computed(() => {
}) })
function callNumber() { function callNumber() {
if (member.value && member.value.callNumber) { if (member.value && member.value.externalContact) {
uni.makePhoneCall({ uni.makePhoneCall({
phoneNumber: member.value.callNumber phoneNumber: member.value.externalContact
}) })
} }
} }

View File

@ -11,7 +11,12 @@
</view> </view>
</view> </view>
</view> </view>
<view v-if="team.teamTroduce" class="mt-12 text-base text-dark leading-normal break-all pre-wrap"> <view class="flex items-center justify-between mt-12" @click="showAllIntroduce = !showAllIntroduce">
<view class="text-dark font-semibold">团队介绍</view>
<uni-icons :type="showAllIntroduce ? 'up' : 'down'" size="20" color="#666"></uni-icons>
</view>
<view v-if="team.teamTroduce" class="mt-10 text-base text-dark leading-normal break-all pre-wrap"
:class="showAllIntroduce ? '' : 'line-clamp-2'" @click="showAllIntroduce = !showAllIntroduce">
{{ team.teamTroduce }} {{ team.teamTroduce }}
</view> </view>
<template v-if="teammate.leaders.length"> <template v-if="teammate.leaders.length">
@ -20,7 +25,7 @@
</view> </view>
<view v-for="i in teammate.leaders" :key="i._id" class="mt-12 flex p-10 border-primary rounded-sm" <view v-for="i in teammate.leaders" :key="i._id" class="mt-12 flex p-10 border-primary rounded-sm"
@click="toHomePage(i.userid)"> @click="toHomePage(i.userid)">
<image class="flex-shrink-0 mr-10 avatar" :src="i.avatar || '/static/default-avatar.svg'"></image> <image class="flex-shrink-0 mr-10 avatar" :src="i.avatar || '/static/default-avatar.png'"></image>
<view class="w-0 flex-grow leading-normal"> <view class="w-0 flex-grow leading-normal">
<view class="flex items-center justify-between"> <view class="flex items-center justify-between">
<view class="flex-shrink-0 mr-5 view-lg text-dark font-semibold">{{ i.anotherName }}</view> <view class="flex-shrink-0 mr-5 view-lg text-dark font-semibold">{{ i.anotherName }}</view>
@ -45,7 +50,7 @@
</view> </view>
<view v-for="i in teammate.members" :key="i._id" class="mt-12 flex p-10 border-primary rounded-sm" <view v-for="i in teammate.members" :key="i._id" class="mt-12 flex p-10 border-primary rounded-sm"
@click="toHomePage(i.userid)"> @click="toHomePage(i.userid)">
<image class="flex-shrink-0 mr-10 avatar" :src="i.avatar || '/static/default-avatar.svg'"></image> <image class="flex-shrink-0 mr-10 avatar" :src="i.avatar || '/static/default-avatar.png'"></image>
<view class="w-0 flex-grow leading-normal"> <view class="w-0 flex-grow leading-normal">
<view class="flex items-center justify-between"> <view class="flex items-center justify-between">
<view class="flex-shrink-0 mr-5 view-lg text-dark font-semibold">{{ i.anotherName }}</view> <view class="flex-shrink-0 mr-5 view-lg text-dark font-semibold">{{ i.anotherName }}</view>
@ -79,11 +84,12 @@ const corpId = ref('');
const teamId = ref(''); const teamId = ref('');
const team = ref(null); const team = ref(null);
const corpName = ref(''); const corpName = ref('');
const showAllIntroduce = ref(false);
const { memberJob, memberList: list } = useJob(); const { memberJob, memberList: list } = useJob();
const memberList = computed(() => team.value && Array.isArray(team.value.memberList) ? team.value.memberList : []) const memberList = computed(() => team.value && Array.isArray(team.value.memberList) ? team.value.memberList : [])
const avatarList = computed(() => memberList.value.map(i => i.avatar || '/static/default-avatar.svg').filter(Boolean)) const avatarList = computed(() => memberList.value.map(i => i.avatar || '/static/default-avatar.png').filter(Boolean))
const teammate = computed(() => { const teammate = computed(() => {
const memberLeaderList = team.value && Array.isArray(team.value.memberLeaderList) ? team.value.memberLeaderList : []; const memberLeaderList = team.value && Array.isArray(team.value.memberLeaderList) ? team.value.memberLeaderList : [];

BIN
static/service-qrcode.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

View File

@ -111,6 +111,8 @@ export default defineStore("accountStore", () => {
const corpId = account.value?.corpId; const corpId = account.value?.corpId;
const unionid = account.value?.unionid; const unionid = account.value?.unionid;
const openid = account.value?.openid; const openid = account.value?.openid;
console.clear()
console.log('corpId', corpId, ',unionid', unionid, ',openid', openid)
if (!(corpId && unionid && openid) || externalUserId.value) return; if (!(corpId && unionid && openid) || externalUserId.value) return;
const res = await api('getUnionidToExternalUserid', { unionid, openid, corpId }, false); const res = await api('getUnionidToExternalUserid', { unionid, openid, corpId }, false);
if (res && res.success && typeof res.data === 'string' && res.data.trim()) { if (res && res.success && typeof res.data === 'string' && res.data.trim()) {

View File

@ -144,7 +144,7 @@ function mergeConversationData(conversation, groupDetailsMap) {
name: formatConversationName(groupDetail), name: formatConversationName(groupDetail),
// 更新头像(优先使用已有头像,避免闪动) // 更新头像(优先使用已有头像,避免闪动)
avatar: conversation.avatar || groupDetail.patient?.avatar || '/static/default-avatar.svg' avatar: conversation.avatar || groupDetail.patient?.avatar || '/static/default-avatar.png'
} }
} }

View File

@ -2626,7 +2626,7 @@ class TimChatManager {
conversationID, conversationID,
groupID, groupID,
name: patientName ? `${patientName}的问诊` : groupName || '问诊群聊', name: patientName ? `${patientName}的问诊` : groupName || '问诊群聊',
avatar: '/static/default-avatar.svg', avatar: '/static/default-avatar.png',
lastMessage, lastMessage,
lastMessageTime, lastMessageTime,
unreadCount: conversation.unreadCount || 0, unreadCount: conversation.unreadCount || 0,
@ -2639,7 +2639,7 @@ class TimChatManager {
conversationID: conversation.conversationID, conversationID: conversation.conversationID,
groupID: conversation.conversationID?.replace('GROUP', '') || '', groupID: conversation.conversationID?.replace('GROUP', '') || '',
name: '问诊群聊', name: '问诊群聊',
avatar: '/static/default-avatar.svg', avatar: '/static/default-avatar.png',
lastMessage: '暂无消息', lastMessage: '暂无消息',
lastMessageTime: Date.now(), lastMessageTime: Date.now(),
unreadCount: 0, unreadCount: 0,

View File

@ -1,12 +1,11 @@
export default function useDebounce(callback, delay = 1000) { export default function useDebounce(callback, delay = 500) {
let cd = false; let timer = null
return (...args) => { return (...args) => {
if (cd) return; if (timer) clearTimeout(timer);
cd = true; timer = setTimeout(() => {
callback(...args); callback(...args);
setTimeout(() => { timer = null;
cd = false;
}, delay); }, delay);
} }
} }