Merge remote-tracking branch 'origin/main' into dev-hjf

This commit is contained in:
Jafeng 2026-02-04 11:29:47 +08:00
commit d41bb6cf51
13 changed files with 428 additions and 215 deletions

View File

@ -1,9 +1,9 @@
<template> <template>
<view class="full-page" :style="pageStyle"> <view class="full-page" :class="pageClass" :style="pageStyle">
<view v-if="hasHeader" class="page-header"> <view v-if="hasHeader" class="page-header">
<slot name="header"></slot> <slot name="header"></slot>
</view> </view>
<view class="page-main" :style="mainStyle"> <view class="page-main" :class="mainClass" :style="mainStyle">
<view v-if="customScroll" class="page-scroll"> <view v-if="customScroll" class="page-scroll">
<slot></slot> <slot></slot>
</view> </view>
@ -21,9 +21,7 @@
<view v-if="hasFooter" class="page-footer"> <view v-if="hasFooter" class="page-footer">
<slot name="footer"></slot> <slot name="footer"></slot>
</view> </view>
<!-- #ifdef MP--> <view v-if="showSafeArea" class="safeareaBottom"></view>
<!-- <view class="safeareaBottom"></view> -->
<!-- #endif -->
</view> </view>
</template> </template>
<script setup> <script setup>
@ -33,8 +31,11 @@ import useDebounce from "@/utils/useDebounce";
const emits = defineEmits(["reachBottom"]); const emits = defineEmits(["reachBottom"]);
const props = defineProps({ const props = defineProps({
customScroll: { type: Boolean, default: false }, customScroll: { type: Boolean, default: false },
mainStyle: { default: "" }, mainClass: { type: String, default: "" },
pageStyle: { default: "" }, mainStyle: { default: '' },
pageClass: { type: String, default: "" },
pageStyle: { default: '' },
showSafeArea: { type: Boolean, default: true },
}); });
const slots = useSlots(); const slots = useSlots();
const hasHeader = computed(() => !!slots.header); const hasHeader = computed(() => !!slots.header);

View File

@ -57,7 +57,7 @@ const groups = computed(() => {
style: `width: ${size.value.md}rpx; height: ${size.value.md}rpx;` style: `width: ${size.value.md}rpx; height: ${size.value.md}rpx;`
} }
} }
return { list: [list.value.slice(0, 1)], style: `width: ${size.value.lg}rpx; height: ${size.lg}rpx;` } return { list: [list.value.slice(0, 1)], style: `width: ${size.value.lg}rpx; height: ${size.value.lg}rpx;` }
}) })
function reGenerate() { function reGenerate() {

View File

@ -1,165 +1,171 @@
{ {
"pages": [ "pages": [
{ {
"path": "pages/home/home", "path": "pages/home/home",
"style": { "style": {
"navigationBarTitleText": "首页", "navigationBarTitleText": "首页",
"navigationStyle": "custom" "navigationStyle": "custom"
} }
}, },
{ {
"path": "pages/article/article-list", "path": "pages/article/article-list",
"style": { "style": {
"navigationBarTitleText": "我的宣教" "navigationBarTitleText": "我的宣教"
} }
}, },
{ {
"path": "pages/survey/survey-list", "path": "pages/survey/survey-list",
"style": { "style": {
"navigationBarTitleText": "我的问卷" "navigationBarTitleText": "我的问卷"
} }
}, },
{ {
"path": "pages/message/message", "path": "pages/message/message",
"style": { "style": {
"navigationBarTitleText": "消息" "navigationBarTitleText": "消息"
} }
}, },
{ {
"path": "pages/message/index", "path": "pages/message/index",
"style": { "style": {
"navigationBarTitleText": "聊天", "navigationBarTitleText": "聊天",
"enablePullDownRefresh": false "enablePullDownRefresh": false
} }
}, },
{ {
"path": "pages/login/login", "path": "pages/login/login",
"style": { "style": {
"navigationBarTitleText": "柚健康" "navigationBarTitleText": "柚健康"
} }
}, },
{ {
"path": "pages/login/redirect-page", "path": "pages/login/redirect-page",
"style": { "style": {
"navigationBarTitleText": "柚健康" "navigationBarTitleText": "柚健康"
} }
}, },
{ {
"path": "pages/archive/archive-manage", "path": "pages/archive/archive-manage",
"style": { "style": {
"navigationBarTitleText": "档案管理" "navigationBarTitleText": "档案管理"
} }
}, },
{ {
"path": "pages/archive/edit-archive", "path": "pages/archive/edit-archive",
"style": { "style": {
"navigationBarTitleText": "新增档案" "navigationBarTitleText": "新增档案"
} }
}, },
{ {
"path": "pages/health/list", "path": "pages/archive/archive-result",
"style": { "style": {
"navigationBarTitleText": "健康信息" "navigationBarTitleText": "团队服务"
} }
}, },
{ {
"path": "pages/health/record", "path": "pages/health/list",
"style": { "style": {
"navigationBarTitleText": "健康信息" "navigationBarTitleText": "健康信息"
} }
}, },
{ {
"path": "pages/library/diagnosis-list", "path": "pages/health/record",
"style": { "style": {
"navigationBarTitleText": "选择诊断" "navigationBarTitleText": "健康信息"
} }
}, },
{ {
"path": "pages/team/team-detail", "path": "pages/library/diagnosis-list",
"style": { "style": {
"navigationBarTitleText": "团队介绍" "navigationBarTitleText": "选择诊断"
} }
}, },
{ {
"path": "pages/team/homepage", "path": "pages/team/team-detail",
"style": { "style": {
"navigationBarTitleText": "个人主页" "navigationBarTitleText": "团队介绍"
} }
}, },
{ {
"path": "pages/team/friend", "path": "pages/team/homepage",
"style": { "style": {
"navigationBarTitleText": "添加好友" "navigationBarTitleText": "个人主页"
} }
}, },
{ {
"path": "pages/web-view/web-view", "path": "pages/team/friend",
"style": { "style": {
"navigationBarTitleText": "" "navigationBarTitleText": "添加好友"
} }
}, },
{ {
"path": "pages/mine/mine", "path": "pages/web-view/web-view",
"style": { "style": {
"navigationBarTitleText": "我的" "navigationBarTitleText": ""
} }
}, },
{ {
"path": "pages/mine/contact", "path": "pages/mine/mine",
"style": { "style": {
"navigationBarTitleText": "联系客服" "navigationBarTitleText": "我的"
} }
}, },
{ {
"path": "pages/common/privacy", "path": "pages/mine/contact",
"style": { "style": {
"navigationBarTitleText": "隐私政策" "navigationBarTitleText": "联系客服"
} }
}, },
{ {
"path": "pages/common/agreement", "path": "pages/common/privacy",
"style": { "style": {
"navigationBarTitleText": "用户协议" "navigationBarTitleText": "隐私政策"
} }
}, },
{ {
"path": "pages/article/article-detail", "path": "pages/common/agreement",
"style": { "style": {
"navigationBarTitleText": "宣教文章" "navigationBarTitleText": "用户协议"
} }
} },
], {
"globalStyle": { "path": "pages/article/article-detail",
"navigationBarTextStyle": "white", "style": {
"navigationBarTitleText": "uni-app", "navigationBarTitleText": "宣教文章"
"navigationBarBackgroundColor": "#065bd6", }
"backgroundColor": "#065bd6" }
}, ],
"tabBar": { "globalStyle": {
"color": "#666666", "navigationBarTextStyle": "white",
"selectedColor": "#007aff", "navigationBarTitleText": "uni-app",
"backgroundColor": "#ffffff", "navigationBarBackgroundColor": "#065bd6",
"borderStyle": "white", "backgroundColor": "#065bd6"
"list": [ },
{ "tabBar": {
"pagePath": "pages/home/home", "color": "#666666",
"iconPath": "static/tabbar/home.png", "selectedColor": "#007aff",
"selectedIconPath": "static/tabbar/home_selected.png", "backgroundColor": "#ffffff",
"text": "消息" "borderStyle": "white",
}, "list": [
{ {
"pagePath": "pages/message/message", "pagePath": "pages/home/home",
"iconPath": "static/tabbar/consult.png", "iconPath": "static/tabbar/home.png",
"selectedIconPath": "static/tabbar/consult_selected.png", "selectedIconPath": "static/tabbar/home_selected.png",
"text": "咨询" "text": "消息"
}, },
{ {
"pagePath": "pages/mine/mine", "pagePath": "pages/message/message",
"iconPath": "static/tabbar/mine.png", "iconPath": "static/tabbar/consult.png",
"selectedIconPath": "static/tabbar/mine_selected.png", "selectedIconPath": "static/tabbar/consult_selected.png",
"text": "我的" "text": "咨询"
} },
] {
}, "pagePath": "pages/mine/mine",
"uniIdRouter": {} "iconPath": "static/tabbar/mine.png",
} "selectedIconPath": "static/tabbar/mine_selected.png",
"text": "我的"
}
]
},
"uniIdRouter": {}
}

View File

@ -0,0 +1,142 @@
<template>
<full-page mainClass="bg-white">
<template #header>
<view class="mb-10 py-30 flex items-center justify-center bg-white shadow-lg">
<icon class="mr-5" type="success" size="24" />
<view class="text-lg font-semibold">建档成功</view>
</view>
</template>
<view v-if="friends.length" class="px-15">
<view class="py-12 text-base tont-semibold text-dark">
您可以加以下人员为好友, 随时提供一对一服务
</view>
<template v-if="friends.length > 1">
<view v-for="i in friends" :key="i.userid"
class="flex items-center mb-10 overflow-hidden border-primary rounded" @click="toFriend(i.userid)">
<view class="flex-shrink-0 p-10">
<image class="avatar" :src="i.avatar || '/static/default-avatar.png'"></image>
</view>
<view class="flex-grow w-0 py-10 align-stretch">
<view class="truncate">
<text class="mr-5 text-lg text-dark font-semibold">{{ i.anotherName }}</text>
<text class="text-base text-gray"> {{ memberJob[i.userid] }}</text>
</view>
<view class="mt-5 text-base line-clamp-2 leading-normal">
{{ i.memberTroduce || '暂无简介' }}
</view>
</view>
<view class="px-15 flex items-center align-stretch bg-primary text-base text-white text-center">
加好友
</view>
</view>
</template>
<template v-else-if="friends.length === 1 && qrcode">
<view class="mt-15 px-15">
<view class="flex">
<image class="mr-10 avatar" :src="member.avatar || '/static/default-avatar.png'"></image>
<view class="w-0 flex-grow leading-normal">
<view class="flex items-center">
<view class="mr-5 text-lg font-semibold text-dark">{{ member.anotherName }}</view>
<view class="text-base text-warning">@企业微信</view>
</view>
<view class="truncate text-base text-dark">{{ memberJob[member.userid] }}</view>
</view>
</view>
<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>
</view>
<view class="mt-12 text-base text-center text-dark">
点击识别下方二维码加我为好友
</view>
</view>
</template>
</view>
</full-page>
</template>
<script setup>
import { computed, ref, watch } from 'vue';
import { storeToRefs } from 'pinia';
import useGuard from '@/hooks/useGuard';
import useJob from '@/hooks/useJob';
import useAccount from '@/store/account';
import api from '@/utils/api';
import FullPage from '@/components/full-page.vue';
const team = ref(null);
const { useLoad } = useGuard();
const { account } = storeToRefs(useAccount());
const { memberJob, memberList: list } = useJob();
const qrcode = ref('');
const friends = computed(() => {
const memberList = Array.isArray(team.value?.memberList) ? team.value.memberList : [];
const friendlyMembers = Array.isArray(team.value?.friendlyMembers) ? team.value.friendlyMembers : [];
return memberList.filter(i => i && i.userid && friendlyMembers.includes(i.userid))
})
const member = computed(() => friends.value[0])
function previewImage() {
if (!qrcode.value) return;
uni.previewImage({
urls: [qrcode.value]
})
}
function toFriend(userid) {
uni.navigateTo({ url: `/pages/team/friend?corpId=${account.value?.corpId}&userid=${userid}` })
}
async function getQrcode(userid) {
const res = await api('addContactWay', { corpUserId: userid, corpId: account.value?.corpId, unionid: account.value?.openid });
if (res && res.data) {
qrcode.value = res.data;
}
}
async function getTeam(corpId, teamId) {
const res = await api('getTeamData', { teamId, corpId });
if (res && res.data) {
team.value = res.data;
} else {
toast(res?.message || '获取团队信息失败')
}
}
useLoad(options => {
if (options.teamId && options.corpId) {
getTeam(options.corpId, options.teamId);
}
})
watch(friends, n => {
list.value = Array.isArray(n) ? n : [];
if (n.length === 1) {
getQrcode(n[0].userid)
}
}, { immediate: true })
</script>
<style>
.py-30 {
padding-top: 60rpx;
padding-bottom: 60rpx
}
.avatar {
width: 120rpx;
height: 128rpx;
}
.align-stretch {
align-self: stretch
}
.mt-5 {
margin-top: 10rpx
}
.qrcode {
width: 560rpx;
height: 560rpx;
}
</style>

View File

@ -11,7 +11,7 @@
</view> </view>
<template #footer> <template #footer>
<button-footer confirmText="新增档案" :showCancel="false" @confirm="confirm()" /> <button-footer confirmText="保存" :showCancel="false" @confirm="confirm()" />
</template> </template>
</full-page> </full-page>
<bind-popup :customers="customers" :corpName="corpName" :visible="visible" @close="visible = false" <bind-popup :customers="customers" :corpName="corpName" :visible="visible" @close="visible = false"
@ -38,7 +38,8 @@ import formTemplate from '@/components/form-template/index.vue';
const empty = ref(false) const empty = ref(false)
const { useLoad } = useGuard(); const { useLoad } = useGuard();
const { account } = storeToRefs(useAccount()); const { account, externalUserId } = storeToRefs(useAccount());
const { getExternalUserId } = useAccount()
const corpId = ref(''); const corpId = ref('');
const corpName = ref(''); const corpName = ref('');
const customer = ref({}); const customer = ref({});
@ -56,15 +57,6 @@ const visible = ref(false);
const formData = computed(() => ({ ...customer.value, ...form.value })); const formData = computed(() => ({ ...customer.value, ...form.value }));
function back() {
const pages = getCurrentPages();
if (pages.length > 1) {
uni.navigateBack();
} else {
uni.redirectTo({ url: `/pages/home/home?corpId=${corpId.value}&teamId=${teamId.value}` })
}
}
function change({ title, value }) { function change({ title, value }) {
if (title) { if (title) {
form.value[title] = value; form.value[title] = value;
@ -80,7 +72,7 @@ function change({ title, value }) {
} }
function confirm() { function confirm() {
if (!tempRef.value.verify() || Object.keys(form.value).length === 0) return; if (!tempRef.value.verify()) return;
if (customerId.value) { if (customerId.value) {
updateArchive(); updateArchive();
} else { } else {
@ -97,12 +89,15 @@ async function addArchive() {
teamId: teamId.value, teamId: teamId.value,
corpId: corpId.value, corpId: corpId.value,
mobile: account.value.mobile, mobile: account.value.mobile,
miniAppId: account.value.openid miniAppId: account.value.openid,
externalUserId: externalUserId.value,
} }
loading.value = false; loading.value = false;
const res = await api('addCustomer', { params }); const res = await api('addCustomer', { params });
if (res && res.success) { if (res && res.success) {
back() uni.redirectTo({
url: `/pages/archive/archive-result?corpId=${corpId.value}&teamId=${teamId.value}`
})
} else { } else {
toast(res?.message || '新增档案失败'); toast(res?.message || '新增档案失败');
} }
@ -122,12 +117,15 @@ async function bindArchive(customerId) {
async function init() { async function init() {
if (customerId.value) { if (customerId.value) {
await getCustomer() await getCustomer();
} else { } else {
const res = await getArchives(); const res = await getArchives();
if (res.length > 0) { if (res.length > 0) {
visible.value = true; visible.value = true;
} }
if (!externalUserId.value) {
getExternalUserId();
}
} }
await getBaseForm(); await getBaseForm();
} }
@ -166,6 +164,32 @@ async function getCustomer() {
} }
} }
async function updateArchive() {
if (Object.keys(form.value).length > 0) {
const res = await api('updateCustomer', { id: customerId.value, ...form.value });
if (res && res.success) {
await toast('修改成功');
uni.navigateBack();
} else {
toast(res?.message || '修改失败');
}
} else {
uni.navigateBack();
}
}
// async updateCustomer() {
// if (Object.keys(this.form).length === 0) return this.editMemberId;
// const { success, message } = await updateCustomer(
// this.editMemberId,
// this.form
// );
// if (success) return this.editMemberId;
// this.widget.hideLoading();
// this.widget.toast(message);
// return Promise.reject();
// },
onLoad(options => { onLoad(options => {
customerId.value = options.id || ''; customerId.value = options.id || '';
uni.setNavigationBarTitle({ title: customerId.value ? '编辑档案' : '新增档案' }) uni.setNavigationBarTitle({ title: customerId.value ? '编辑档案' : '新增档案' })

View File

@ -17,8 +17,8 @@
手机号快捷登录 手机号快捷登录
</button> </button>
<!-- <button v-if="checked" class="login-btn" type="primary" @click="getPhoneNumber()"> <!-- <button v-if="checked" class="login-btn" type="primary" @click="getPhoneNumber()">
手机号快捷登录 手机号快捷登录
</button> --> </button> -->
<button v-else class="login-btn" type="primary" @click="remind()"> <button v-else class="login-btn" type="primary" @click="remind()">
手机号快捷登录 手机号快捷登录
</button> </button>
@ -35,6 +35,7 @@
import { ref } from "vue"; import { ref } from "vue";
import { onLoad } from "@dcloudio/uni-app"; import { onLoad } from "@dcloudio/uni-app";
import useAccountStore from "@/store/account"; import useAccountStore from "@/store/account";
import api from '@/utils/api';
import { get } from "@/utils/cache"; import { get } from "@/utils/cache";
import { toast } from "@/utils/widget"; import { toast } from "@/utils/widget";
@ -71,16 +72,27 @@ function remind() {
} }
function toHome() { function toHome() {
uni.navigateTo({ uni.switchTab({
url: "/pages/home/home", url: "/pages/home/home",
}); });
} }
async function checkTeamArchive(account) {
const res = await api('getWxAppCustomerCount', { miniAppId: account.openid, corpId: account.corpId, teamId: '1nYlVrNXGT173674701967643308' || team.value.teamId });
if (res && res.data > 0) {
toHome();
} else {
attempToPage(redirectUrl.value)
}
}
async function getPhoneNumber(e) { async function getPhoneNumber(e) {
const phoneCode = e && e.detail && e.detail.code; const phoneCode = e && e.detail && e.detail.code;
if (e && !phoneCode) return; // if (e && !phoneCode) return;
const res = await login(phoneCode); const res = await login(phoneCode);
if (res && redirectUrl.value) { if (res && team.value) {
checkTeamArchive(res)
} else if (res && redirectUrl.value) {
await attempToPage(redirectUrl.value); await attempToPage(redirectUrl.value);
} else if (res) { } else if (res) {
toHome(); toHome();
@ -99,7 +111,6 @@ onLoad((opts) => {
if (opts.source === "teamInvite") { if (opts.source === "teamInvite") {
team.value = get("invite-team-info"); team.value = get("invite-team-info");
redirectUrl.value = `/pages/archive/edit-archive?teamId=${team.value.teamId}&corpId=${team.value.corpId}`; redirectUrl.value = `/pages/archive/edit-archive?teamId=${team.value.teamId}&corpId=${team.value.corpId}`;
console.log("redirectUrl", redirectUrl.value);
return; return;
} }
redirectUrl.value = opts.redirectUrl || ""; redirectUrl.value = opts.redirectUrl || "";

View File

@ -15,13 +15,13 @@ const corpId = ref("");
const loading = ref(false); const loading = ref(false);
const team = ref(null); const team = ref(null);
async function changeTeam({ teamId, corpId, corpName }) { async function changeTeam({ teamId, corpId }) {
loading.value = true; loading.value = true;
const res = await api("getTeamData", { teamId, corpId, withCorpName: true }); const res = await api("getTeamData", { teamId, corpId, withCorpName: true });
loading.value = false; loading.value = false;
if (res && res.data) { if (res && res.data) {
team.value = res.data; team.value = res.data;
team.value.corpName = corpName; team.value.corpName = res.data.corpName;
set("invite-team-info", { set("invite-team-info", {
corpId: team.value.corpId, corpId: team.value.corpId,
teamId: team.value.teamId, teamId: team.value.teamId,
@ -45,9 +45,7 @@ onLoad((options) => {
typeof options.q === "string" ? decodeURIComponent(options.q) : ""; typeof options.q === "string" ? decodeURIComponent(options.q) : "";
const [, url = ""] = href.split("?"); const [, url = ""] = href.split("?");
const data = url.split("&").reduce((acc, cur) => { const data = url.split("&").reduce((acc, cur) => {
console.log(cur);
const [key, value] = cur.split("="); const [key, value] = cur.split("=");
console.log(key, "=====", value);
acc[key] = value; acc[key] = value;
return acc; return acc;
}, {}); }, {});

View File

@ -14,13 +14,18 @@
<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" :src="qrcode"></image>
</view> </view>
<view class="mt-12 text-base text-center text-dark">
点击识别下方二维码加我为好友
</view>
</view> </view>
</view> </view>
</template> </template>
<script setup> <script setup>
import { ref, watch } from 'vue'; import { ref, watch } from 'vue';
import { storeToRefs } from 'pinia';
import { onLoad, onShow } from '@dcloudio/uni-app'; import { onLoad, onShow } from '@dcloudio/uni-app';
import useJob from '@/hooks/useJob'; import useJob from '@/hooks/useJob';
import useAccount from '@/store/account';
import api from '@/utils/api'; import api from '@/utils/api';
import { toast } from '@/utils/widget'; import { toast } from '@/utils/widget';
@ -29,6 +34,7 @@ const userid = ref('');
const qrcode = ref('') const qrcode = ref('')
const member = ref(null); const member = ref(null);
const { memberJob, memberList } = useJob(); const { memberJob, memberList } = useJob();
const { account } = storeToRefs(useAccount());
function previewImage() { function previewImage() {
if (!qrcode.value) return; if (!qrcode.value) return;
@ -50,7 +56,7 @@ async function getMember() {
} }
async function getQrcode() { async function getQrcode() {
const res = await api('addContactWay', { corpUserId: userid.value, corpId: corpId.value }); const res = await api('addContactWay', { corpUserId: userid.value, corpId: corpId.value, unionid: account.value?.openid });
if (res && res.data) { if (res && res.data) {
qrcode.value = res.data; qrcode.value = res.data;
} }

View File

@ -53,7 +53,7 @@
</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" class="h-full w-full"></image>
@ -128,7 +128,7 @@ async function getMember() {
} }
async function getQrcode() { async function getQrcode() {
const res = await api('addContactWay', { corpUserId: userid.value, corpId: corpId.value }); const res = await api('addContactWay', { corpUserId: userid.value, corpId: corpId.value, unionid: account.value?.openid });
if (res && res.data) { if (res && res.data) {
qrcode.value = res.data; qrcode.value = res.data;
} }

View File

@ -11,7 +11,7 @@
</view> </view>
</view> </view>
</view> </view>
<view v-if="team.teamTroduce" class="mt-12 text-base text-dark leading-normal break-all"> <view v-if="team.teamTroduce" class="mt-12 text-base text-dark leading-normal break-all pre-wrap">
{{ team.teamTroduce }} {{ team.teamTroduce }}
</view> </view>
<template v-if="teammate.leaders.length"> <template v-if="teammate.leaders.length">
@ -152,4 +152,8 @@ page {
width: 120rpx; width: 120rpx;
height: 128rpx; height: 128rpx;
} }
.pre-wrap {
white-space: pre-wrap;
}
</style> </style>

View File

@ -20,6 +20,10 @@ export default [
path: 'pages/archive/edit-archive', path: 'pages/archive/edit-archive',
meta: { title: '新增档案', login: true } meta: { title: '新增档案', login: true }
}, },
{
path: 'pages/archive/archive-result',
meta: { title: '团队服务' }
},
{ {
path: 'pages/article/article-list', path: 'pages/article/article-list',
meta: { title: '健康宣教', login: true } meta: { title: '健康宣教', login: true }

View File

@ -1,11 +1,10 @@
import { ref } from "vue"; import { ref, watch } from "vue";
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import api from '@/utils/api'; import api from '@/utils/api';
import { toast } from '@/utils/widget'; import { toast } from '@/utils/widget';
import { initGlobalTIM, globalTimChatManager } from "@/utils/tim-chat.js"; import { initGlobalTIM, globalTimChatManager } from "@/utils/tim-chat.js";
const env = __VITE_ENV__; const env = __VITE_ENV__;
export default defineStore("accountStore", () => { export default defineStore("accountStore", () => {
const appid = env.MP_WX_APP_ID; const appid = env.MP_WX_APP_ID;
const corpId = env.MP_CORP_ID; const corpId = env.MP_CORP_ID;
@ -13,11 +12,11 @@ export default defineStore("accountStore", () => {
const loading = ref(false) const loading = ref(false)
const isIMInitialized = ref(false); const isIMInitialized = ref(false);
const openid = ref(""); const openid = ref("");
async function login(phoneCode = '') { const externalUserId = ref('');
async function login(phoneCode = '') {
if (loading.value) return; if (loading.value) return;
loading.value = true; loading.value = true;
try { try {
const { code } = await uni.login({ const { code } = await uni.login({
appid, appid,
@ -26,20 +25,20 @@ export default defineStore("accountStore", () => {
}); });
if (code) { if (code) {
const res = await api('wxAppLogin', { const res = await api('wxAppLogin', {
appId:appid, appId: appid,
phoneCode, phoneCode,
code, code,
corpId corpId
}); });
loading.value = false loading.value = false
if (res.success && res.data && res.data.mobile) { if (res.success && res.data && res.data.mobile) {
account.value = res.data; account.value = res.data;
openid.value = res.data.openid; openid.value = res.data.openid;
// 保存账户信息和 openId 到本地存储 // 保存账户信息和 openId 到本地存储
uni.setStorageSync('account', res.data); uni.setStorageSync('account', res.data);
uni.setStorageSync('openid', res.data.openid); uni.setStorageSync('openid', res.data.openid);
initIMAfterLogin(openid.value) initIMAfterLogin(openid.value)
return res.data return res.data
} }
@ -62,21 +61,21 @@ export default defineStore("accountStore", () => {
console.error('无法获取 openidIM 初始化失败'); console.error('无法获取 openidIM 初始化失败');
return false; return false;
} }
console.log('开始初始化 IMuserID:', userID); console.log('开始初始化 IMuserID:', userID);
const success = await initGlobalTIM(userID); const success = await initGlobalTIM(userID);
if (!success) { if (!success) {
console.error('initGlobalTIM 返回失败'); console.error('initGlobalTIM 返回失败');
return false; return false;
} }
// 验证 TIM 实例是否真正创建成功 // 验证 TIM 实例是否真正创建成功
if (!globalTimChatManager || !globalTimChatManager.tim) { if (!globalTimChatManager || !globalTimChatManager.tim) {
console.error('IM 初始化后 TIM 实例不存在'); console.error('IM 初始化后 TIM 实例不存在');
return false; return false;
} }
isIMInitialized.value = true; isIMInitialized.value = true;
console.log('IM 初始化成功'); console.log('IM 初始化成功');
return true; return true;
@ -102,11 +101,26 @@ export default defineStore("accountStore", () => {
account.value = null; account.value = null;
openid.value = ""; openid.value = "";
isIMInitialized.value = false; isIMInitialized.value = false;
// 清除本地存储 // 清除本地存储
uni.removeStorageSync('account'); uni.removeStorageSync('account');
uni.removeStorageSync('openid'); uni.removeStorageSync('openid');
} }
return { account, login, initIMAfterLogin, logout, openid, isIMInitialized } async function getExternalUserId() {
const corpId = account.value?.corpId;
const unionid = account.value?.unionid;
const openid = account.value?.openid;
if (!(corpId && unionid && openid) || externalUserId.value) return;
const res = await api('getUnionidToExternalUserid', { unionid, openid, corpId }, false);
if (res && res.success && typeof res.data === 'string' && res.data.trim()) {
externalUserId.value = res.data.trim();
}
}
watch(account, n => {
getExternalUserId()
}, { immediate: true })
return { account, login, initIMAfterLogin, logout, openid, isIMInitialized, externalUserId, getExternalUserId }
}) })

View File

@ -46,6 +46,9 @@ const urlsConfig = {
getMedicalRecordById: 'getMedicalRecordById', getMedicalRecordById: 'getMedicalRecordById',
unbindMiniAppArchive: 'unbindMiniAppArchive', unbindMiniAppArchive: 'unbindMiniAppArchive',
updateMedicalRecord: 'updateMedicalRecord', updateMedicalRecord: 'updateMedicalRecord',
getUnionidToExternalUserid: 'getUnionidToExternalUserid',
getWxAppCustomerCount: "getWxAppCustomerCount",
updateCustomer: 'update'
}, },
wecom: { wecom: {
addContactWay: 'addContactWay' addContactWay: 'addContactWay'