# Conflicts:
#	pages.json
#	utils/api.js
This commit is contained in:
wangdongbo 2026-01-29 11:15:15 +08:00
commit ceb5fe8841
14 changed files with 562 additions and 44 deletions

View File

@ -1,5 +1,6 @@
MP_API_BASE_URL=http://localhost:8080
MP_IMAGE_URL=https://patient.youcan365.com
MP_CACHE_PREFIX=development
MP_WX_APP_ID=wx93af55767423938e
MP_CORP_ID=wwe3fb2faa52cf9dfb
MP_TIM_SDK_APP_ID=1600072268
MP_TIM_SDK_APP_ID=1600123876

View File

@ -6,6 +6,12 @@
"navigationBarTitleText": "消息"
}
},
{
"path": "pages/login/redirect-page",
"style": {
"navigationBarTitleText": "登录"
}
},
{
"path": "pages/message/common-phrases",
"style": {
@ -202,13 +208,43 @@
{
"path": "pages/login/login",
"style": {
"navigationBarTitleText": "登录"
"navigationBarTitleText": "授权登录"
}
},
{
"path": "pages/login/redirect-page",
"path": "pages/work/team/invite/invite-patient",
"style": {
"navigationBarTitleText": "登录"
"navigationBarTitleText": "邀请患者"
}
},
{
"path": "pages/work/team/invite/invite-teammate",
"style": {
"navigationBarTitleText": "邀请成员"
}
},
{
"path": "pages/work/team/list/team-list",
"style": {
"navigationBarTitleText": "我的团队"
}
},
{
"path": "pages/work/team/edit/team-edit",
"style": {
"navigationBarTitleText": "修改团队信息"
}
},
{
"path": "pages/work/team/detail/team-detail",
"style": {
"navigationBarTitleText": "团队信息"
}
},
{
"path": "pages/work/service/contact-service",
"style": {
"navigationBarTitleText": "联系企微客服"
}
}
],

View File

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

View File

@ -0,0 +1,207 @@
<template>
<full-page v-if="team" pageClass="bg-white">
<view class="p-15">
<view class="flex items-center h-30 mb-10">
<view class="mr-5 text-dark text-lg font-semibold truncate">{{ team.name }}</view>
<view v-if="isLeader" class="edit-sub flex-shrink-0 flex items-center justify-center rounded-full bg-primary"
@click="toEdit()">
<image class="edit-icon" src="/static/work/pen.svg" mode="aspectFill" />
</view>
</view>
<view class="text-base text-dark leading-normal break-all" :class="expand ? '' : 'line-clamp-3'"
@click="expand = !expand">
{{ team.teamTroduce || '暂无简介' }}
</view>
<view class="mt-12 py-12 flex items-center justify-between">
<view class="text-lg text-dark">团队成员</view>
<view class="flex items-center text-primary text-base" @click="invite()">
邀请成员
</view>
</view>
<view v-for="i in teammates" :key="i._id" class="mb-10 p-10 border rounded flex">
<image class="flex-shrink-0 mr-10 avatar" :src="i.avatar || '/static/default-avatar.png'" />
<view class="w-0 flex-grow">
<view class="flex items-center">
<view class="mr-5 text-lg font-semibold text-dark truncate">{{ i.anotherName }}</view>
<view v-if="i.isCreator"
class="mr-5 px-10 flex-shrink-0 border-auto text-sm leading-normal text-primary rounded-full">
创建人
</view>
<view v-if="i.isLeader"
class="px-10 flex-shrink-0 border-auto text-sm leading-normal text-primary rounded-full">
团队负责人
</view>
<view class="flex-grow"></view>
<view v-if="isLeader && doctorInfo && i.userid !== doctorInfo.userid && !i.isCreator" class="px-5"
@click="showActions(i)">
<uni-icons type="more-filled" size="20" color="#999"></uni-icons>
</view>
</view>
<view class="text-base text-dark leading-normal break-all line-clamp-2 mt-5">
{{ i.memberTroduce || '暂无简介' }}
</view>
</view>
</view>
<view class="safe-bottom-padding"></view>
</view>
<template #footer>
<button-footer v-if="canQuit" cancelText="退出当前团队" :showConfirm="false" @cancel="quit()" />
</template>
</full-page>
</template>
<script setup>
import { computed, ref, watch } from 'vue';
import { storeToRefs } from "pinia";
import useGuard from "@/hooks/useGuard.js";
import useAccountStore from "@/store/account.js";
import api from '@/utils/api';
import { confirm, toast } from "@/utils/widget";
import buttonFooter from '@/components/button-footer.vue';
import fullPage from '@/components/full-page.vue';
const { useLoad, useShow } = useGuard();
const { doctorInfo, account } = storeToRefs(useAccountStore());
const teamId = ref('');
const team = ref(null);
const expand = ref(false);
const canQuit = computed(() => team.value && doctorInfo.value && team.value.creator !== doctorInfo.value.userid);
const isLeader = computed(() => {
const userid = doctorInfo.value?.userid;
const member = teammates.value.find(i => i.userid === userid);
return member?.isLeader || member?.isCreator;
})
const memberList = computed(() => team.value && Array.isArray(team.value.memberList) ? team.value.memberList : [])
const teammates = computed(() => {
const memberLeaderList = team.value && Array.isArray(team.value.memberLeaderList) ? team.value.memberLeaderList : [];
const res = memberList.value.reduce((data, item) => {
if (item.userid === doctorInfo.value.userid) {
data.creator.push(item)
} else if (memberLeaderList.includes(item.userid)) {
data.leaders.push(item)
} else {
data.members.push(item)
}
return data
}, { creator: [], leaders: [], members: [] });
return [
...res.creator.map(i => ({ ...i, isCreator: true, isLeader: true })),
...res.leaders.map(i => ({ ...i, isLeader: true })),
...res.members
]
})
function invite() {
uni.navigateTo({
url: `/pages/work/team/invite/invite-teammate?teamId=${teamId.value}`
})
}
function showActions(i) {
uni.showActionSheet({
itemList: [i.isLeader ? '取消负责人' : '设为负责人', '移出团队'],
success: (res) => {
if (res.tapIndex === 0) {
toggleLeaderRole(i.isLeader ? 'cancel' : 'set', i.userid)
} else {
removeTeammate(i.userid);
}
}
})
}
function toEdit() {
uni.navigateTo({
url: `/pages/work/team/edit/team-edit?teamId=${teamId.value}`
})
}
async function getTeam() {
const res = await api('getTeamData', { teamId: teamId.value, corpId: account.value.corpId });
if (res && res.data) {
team.value = res.data;
} else {
toast(res?.message || '获取团队信息失败')
}
}
async function quit() {
await confirm('确定退出当前团队吗?');
removeTeammate(doctorInfo.value.userid);
}
async function toggleLeaderRole(toggleType, mateId) {
await confirm(toggleType === 'set' ? '确定设为负责人吗?' : '确定取消负责人吗?');
const data = {
corpId: account.value.corpId,
teamId: teamId.value,
mateId,
operatorId: doctorInfo.value.userid,
toggleType
}
const res = await api('toggleTeamLeaderRole', data);
if (res && res.success) {
await toast('操作成功');
getTeam();
} else {
toast(res?.message || '操作失败')
}
}
async function removeTeammate(mateId) {
if (mateId !== doctorInfo.value.userid) {
await confirm('确定移出该成员吗?');
}
const data = {
corpId: account.value.corpId,
teamId: teamId.value,
operatorId: doctorInfo.value.userid,
mateId,
}
const res = await api('removeTeammate', data);
if (res && res.success) {
await toast('操作成功');
getTeam();
} else {
toast(res?.message || '操作失败')
}
}
useLoad(options => {
teamId.value = options.teamId;
})
useShow(() => {
getTeam()
});
</script>
<style>
.min-w-100 {
min-width: 200rpx;
}
.avatar {
width: 120rpx;
height: 128rpx;
}
.edit-sub {
width: 36rpx;
height: 36rpx;
}
.edit-icon {
width: 16rpx;
height: 16rpx;
}
.line-clamp-3 {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
}
</style>

View File

@ -0,0 +1,106 @@
<template>
<full-page pageClass="bg-white">
<view class="pt-40 p-15">
<view class="text-base font-semibold text-dark">团队名称:</view>
<view class="mt-12 p-10 border rounded-sm">
<input v-model="team.name" class="w-full text-base" placeholder="请输入团队名称" />
</view>
<view class="mt-15 text-base font-semibold text-dark">团队名称:</view>
<view class="mt-12 p-10 border rounded-sm">
<textarea v-model="team.teamTroduce" class="w-full text-base leading-normal" placeholder-class="text-base"
placeholder="请输入团队介绍" />
</view>
</view>
<template #footer>
<button-footer confirmText="保存" :showCancel="false" @confirm="save()" />
</template>
</full-page>
</template>
<script setup>
import { computed, ref } from "vue";
import { storeToRefs } from "pinia";
import { onLoad } from "@dcloudio/uni-app";
import useGuard from "@/hooks/useGuard.js";
import useAccountStore from "@/store/account.js";
import api from "@/utils/api.js";
import { toast } from "@/utils/widget";
import buttonFooter from '@/components/button-footer.vue';
import fullPage from '@/components/full-page.vue';
const { useLoad } = useGuard();
const { doctorInfo, account } = storeToRefs(useAccountStore());
const team = ref({ name: '', teamTroduce: '' });
function save() {
if (team.value.name.trim() === '') {
return toast('请输入团队名称')
}
team.value.teamId ? updateTeam() : createTeam();
}
async function createTeam() {
const data = {
corpId: account.value.corpId,
id: doctorInfo.value._id,
userid: doctorInfo.value.userid,
teamName: team.value.name,
teamTroduce: team.value.teamTroduce
}
const res = await api('createOwnTeam', data);
if (res && res.success) {
await toast('保存成功');
uni.navigateBack();
} else {
toast(res.message || '保存失败')
}
}
async function getTeamDetail() {
const res = await api('getTeamData', { teamId: team.value.teamId, corpId: account.value.corpId });
if (res && res.success) {
team.value.name = res.data.name;
team.value.teamTroduce = res.data.teamTroduce;
team.value._id = res.data._id;
}else {
await toast(res.message || '获取团队信息失败')
uni.navigateBack();
}
}
async function updateTeam() {
const data = {
corpId: account.value.corpId,
id: team.value._id,
teamId: team.value.teamId,
name: team.value.name,
teamTroduce: team.value.teamTroduce
}
const res = await api('updateTeamInfo', data);
if (res && res.success) {
await toast('保存成功');
uni.navigateBack();
} else {
toast(res.message || '保存失败')
}
}
onLoad(opts => {
if (opts.teamId) {
team.value.teamId = opts.teamId;
}
uni.setNavigationBarTitle({ title: opts.teamId ? '修改团队信息' : '创建团队' })
})
useLoad(opts => {
if (opts.teamId) {
getTeamDetail();
}
})
</script>
<style>
.pt-40 {
padding-top: 80rpx;
}
</style>

View File

@ -56,10 +56,10 @@ import { onLoad } from "@dcloudio/uni-app";
import useAccountStore from "@/store/account.js";
import useGuard from '@/hooks/useGuard';
import api from "@/utils/api.js";
import { toast } from "@/utils/widget";
import emptyData from "@/components/empty-data.vue";
import renamePopup from "./rename-popup.vue";
import { toast } from "../../../../utils/widget";
const options = { margin: 10 }
@ -136,7 +136,6 @@ useShow(() => {
}
.edit-sub {
width: 36rpx;
height: 36rpx;
}

View File

@ -1,3 +1,52 @@
<template>
<view>邀请成员</view>
</template>
<view v-if="team" class="flex flex-col justify-center h-full bg-white">
<view>
<view class="text-dark text-lg font-semibold text-center mb-10">
{{ team.name }}
</view>
<view class="mb-10 text-dark text-lg font-semibold text-center mb-10">
成员邀请码
</view>
<view class="flex justify-center overflow-hidden">
<uqrcode canvas-id="qrcode" value="https://uqrcode.cn/doc" :options="options"></uqrcode>
</view>
<view class="mt-10 px-15 text-base text-dark leading-normal text-center">
微信扫一扫上面的二维码
</view>
<view class="mt-10 px-15 text-base text-dark leading-normal text-center">
加入我的团队协同开展患者管理服务
</view>
</view>
</view>
</template>
<script setup>
import { ref } from "vue";
import { storeToRefs } from "pinia";
import useGuard from "@/hooks/useGuard.js";
import useAccountStore from "@/store/account.js";
import api from '@/utils/api';
import { toast } from "@/utils/widget";
const options = { margin: 10 };
const team = ref(null);
const teamId = ref('');
const { useLoad, useShow } = useGuard();
const { account } = storeToRefs(useAccountStore());
async function getTeam() {
const res = await api('getTeamData', { teamId: teamId.value, corpId: account.value.corpId });
if (res && res.data) {
team.value = res.data;
} else {
toast(res?.message || '获取团队信息失败')
}
}
useLoad(options => {
teamId.value = options.teamId;
})
useShow(() => {
getTeam()
});
</script>
<style></style>

View File

@ -4,27 +4,31 @@
<empty-data text="暂无团队" />
</view>
<view v-for="(i, idx) in list" :key="idx" class="p-15 mb-10 flex items-center bg-white shadow-lg">
<view class="mr-10 w-0 flex-grow">
<view class="mr-10 w-0 flex-grow" @click="toDetail(i)">
<view class="flex items-center">
<view class="team-name text-lg font-semibold truncate mr-5">
133****2365服务团队133****2365服务团队133****2365服务团队133****2365服务团队133****2365服务团队133****2365服务团队133****2365服务团队
{{ i.name }}
</view>
<view v-if="doctorInfo && i.creator === doctorInfo.userid"
class="px-10 leading-normal text-sm border-auto text-primary rounded-full">创建</view>
<view v-else class="px-10 leading-normal text-sm border-auto text-warning rounded-full">加入</view>
</view>
<view class="mt-10 flex">
<view class="text-base text-dark">成员: 20</view>
<view class="text-base text-dark">患者: 200</view>
<view class="min-w-120 text-base text-dark">
成员: {{ i.memberList && i.memberList.length ? i.memberList.length : 0 }}
</view>
<view class="min-w-120 text-base text-dark">
患者: 200
</view>
</view>
</view>
<view class="flex-shrink-0 flex flex-col items-center justify-center" @click="invitePatient(i)">
<view class="flex-shrink-0 flex flex-col items-center justify-center" @click.stop="invitePatient(i)">
<image class="mb-5 qrcode" src="/static/work/qrcode.svg" />
<view class="w-full text-sm text-dark text-center">邀请患者</view>
</view>
</view>
<template #footer>
<button-footer confirmText="创建团队" :showCancel="false" @confirm="save()" />
<button-footer confirmText="创建团队" :showCancel="false" @confirm="toCreate()" />
</template>
</full-page>
</template>
@ -40,31 +44,44 @@ import emptyData from "@/components/empty-data.vue";
import fullPage from '@/components/full-page.vue';
const { useShow } = useGuard();
const { doctorInfo } = storeToRefs(useAccountStore());
const { doctorInfo, account } = storeToRefs(useAccountStore());
const list = ref([]);
function invitePatient(team) {
uni.navigateTo({ url: `/pages/work/team/invite/invite-patient?teamId=${team.teamId || ''}` })
}
function toCreate() {
uni.navigateTo({ url: '/pages/work/team/edit/team-edit' })
}
function toDetail(team) {
uni.navigateTo({ url: `/pages/work/team/detail/team-detail?teamId=${team.teamId || ''}` })
}
async function getTeams() {
const res = await api('getJoinedTeams', { corpId: account.value?.corpId, mateId: doctorInfo.value?.userid });
const arr = res && Array.isArray(res.data) ? res.data.map(i => ({
id: i._id,
teamId: i.teamId,
name: i.name,
qrcode: i.qrcodes && i.qrcodes[0] && i.qrcodes[0].qrcode ? i.qrcodes[0].qrcode : ''
memberList: i.memberList,
creator: i.creator
})) : [];
list.value = arr;
}
useShow(() => {
console.log(111111)
getTeams();
})
</script>
<style>
.min-w-120 {
min-width: 240rpx;
}
.team-name {
max-width: 60%;
}

View File

@ -43,14 +43,55 @@
</view>
</view>
</view>
<view class="mt-15 px-15 py-12 text-dark text-lg font-semibold bg-white border-b">
待办列表11
<view class="mt-15 px-15 py-12 flex items-center justify-between bg-white">
<view class="text-dark text-lg font-semibold">待办列表</view>
<view class="flex text-base rounded-full bg-gray">
<view class="py-5 px-15 rounded-full bg-primary text-white">个人</view>
<view class="py-5 px-15">团队</view>
</view>
</view>
<view class="py-10 px-15 flex items-center">
<view class="flex-shrink-0 text-sm mr-10">
<text class="text-dark"></text>
<text class="text-danger">23</text>
<text class="text-dark"></text>
</view>
<view class="flex">
<view v-for="i in statusList" :key="i.value" class="mr-5 py-5 px-10 bg-white text-sm rounded-sm"
:class="current == i.value ? 'text-primary' : 'text-dark'">
{{ i.label }}
</view>
</view>
<view class="flex-shrink-0 flex-grow flex justify-end" @click="filtered = !filtered">
<image class="icon-filter" :src="`/static/work/icon-filter${filtered ? 'ed' : ''}.svg`" />
</view>
</view>
</template>
<scroll-view v-if="list.length" scroll-y="true" class="h-full bg-white">
<view class="p-15">
<view v-for="i in 10" class="p-15 bg-primary mb-10"></view>
<scroll-view v-if="list.length" scroll-y="true" class="h-full">
<view v-for="i in 10" :key="i" class="mb-10 shadow-lg bg-white">
<view class="flex items-center justify-between px-15 py-10 border-b">
<view class="text-base text-dark">计划执行: 2025-10-22</view>
<view class="flex items-center">
<view class="text-base text-dark">患者: 李珊珊</view>
</view>
</view>
<view class="py-10 px-15 flex items-center">
<view class="mr-5 text-lg font-semibold">患者满意度调查</view>
<view class="bg-opacity px-10 py-3 leading-normal text-base text-success rounded overflow-hidden">
待处理
</view>
</view>
<view class="px-15 text-base leading-normal text-gray">对于门诊就诊患者的满意度做统计以便优化</view>
<view class="mt-10 px-15 flex items-center">
<view class="mr-5 w-0 flex-grow truncate text-base leading-normal text-dark">
发送内容XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
</view>
<view class="bg-primary px-10 py-3 text-base text-white rounded-sm">发送</view>
</view>
<view class="mt-10 px-15 text-base leading-normal text-gray">张敏西张敏希服务团队</view>
<view class="px-15 pb-10 text-base leading-normal text-gray">创建2026-01-08 张敏西</view>
</view>
</scroll-view>
@ -82,6 +123,7 @@ const certConfig = {
verifying: { text: '认证中', classnames: 'bg-warning text-white' },
unverified: { text: '未认证', classnames: 'bg-gray text-dark' },
};
const statusList = [{ label: '全部', value: 'all' }, { label: '待处理', value: 'pending' }, { label: '已处理', value: 'processed' }]
const { useLoad, useShow } = useGuard();
const { getDoctorInfo } = useAccountStore();
@ -89,6 +131,8 @@ const { doctorInfo } = storeToRefs(useAccountStore());
const { withInfo } = useInfoCheck();
const list = ref([1]);
const visible = ref(false);
const current = ref('all');
const filtered = ref(false)
const certStatus = computed(() => doctorInfo.value?.verifyStatus ? certConfig[doctorInfo.value.verifyStatus] : null)
@ -103,15 +147,15 @@ const handleVerify = () => {
//
const invitePatient = withInfo(() => uni.navigateTo({ url: '/pages/work/team/invite/invite-patient' }));
//
const handleMore = () => {
const handleMore = withInfo(() => {
uni.showActionSheet({
itemList: ["设置", "关于"],
itemList: ["我的团队", "联系客服"], //, ""
success: (res) => {
console.log("选择了第" + (res.tapIndex + 1) + "个按钮");
const url = res.tapIndex === 0 ? '/pages/work/team/list/team-list' : '/pages/work/service/contact-service';
uni.navigateTo({ url });
},
});
};
})
function editProfile() {
uni.navigateTo({
@ -232,12 +276,28 @@ useShow(() => {
}
}
// .empty-state {
// min-height: 600rpx;
// padding: 100rpx 0;
// display: flex;
// flex-direction: column;
// align-items: center;
// justify-content: center;
// width: 100%;
// }</style>
.icon-filter {
width: 42rpx;
height: 42rpx;
}
.bg-opacity {
position: relative;
}
.bg-opacity::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0.2;
background: currentColor;
}
.py-3 {
padding-top: 6rpx;
padding-bottom: 6rpx;
}
</style>

View File

@ -135,7 +135,7 @@ export default [
},
{
path: 'pages/work/profile',
meta: { title: '完善个人信息' }
meta: { title: '完善个人信息', login: true }
},
{
path: 'pages/work/department-select',
@ -151,16 +151,24 @@ export default [
},
{
path: 'pages/work/team/invite/invite-patient',
meta: { title: '邀请患者' }
meta: { title: '邀请患者', login: true }
},
{
path: 'pages/work/team/invite/invite-teammate',
meta: { title: '邀请成员' }
meta: { title: '邀请成员', login: true }
},
{
path: 'pages/work/team/list/team-list',
meta: { title: '我的团队' }
meta: { title: '我的团队', login: true }
},
{
path: 'pages/work/team/edit/team-edit',
meta: { title: '修改团队信息', login: true }
},
{
path: 'pages/work/team/detail/team-detail',
meta: { title: '团队信息', login: true }
},
{
path: 'pages/work/service/contact-service',
meta: { title: '联系企微客服' }

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1769601768503" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12084" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M265.984 96c-34.752 0-61.44-0.192-84.992 3.008-23.552 3.2-46.592 11.328-62.72 29.12-16.192 17.792-21.888 41.664-22.272 65.152-0.384 23.424 3.2 49.216 7.488 82.752 2.88 22.464 11.264 43.904 26.752 62.336 41.664 49.536 119.168 139.136 228.48 220.864a13.44 13.44 0 0 1 4.416 9.152c11.968 146.56 23.04 246.72 28.864 296.256 2.752 23.488 16.192 43.072 35.648 54.4 19.392 11.264 48.192 12.288 69.824-3.008 16.768-11.84 45.76-27.136 73.024-46.912 27.264-19.712 55.68-45.504 63.104-84.736v-0.128c6.4-33.728 16.192-98.368 26.752-215.488a14.016 14.016 0 0 1 4.48-9.28c109.568-81.792 187.2-171.52 228.928-221.12 15.488-18.432 23.872-39.872 26.752-62.336 4.288-33.536 7.872-59.328 7.488-82.752-0.384-23.488-6.208-47.36-22.4-65.152-16.128-17.728-39.04-25.92-62.592-29.12-23.552-3.2-50.24-3.008-84.992-3.008H265.984z m0 64h492.032c34.752 0 60.224 0.192 76.352 2.368 16.128 2.24 20.48 4.864 24 8.768 3.52 3.84 5.376 7.616 5.632 23.104 0.256 15.488-2.688 40.128-7.04 73.6-2.112 16.64-2.176 17.472-12.16 29.44-41.088 48.64-115.072 133.888-218.24 210.944a76.16 76.16 0 0 0-29.952 54.656c-10.432 115.84-20.096 178.752-25.856 209.6-2.432 12.8-15.744 28.8-37.76 44.8-22.016 15.936-49.664 30.336-72.512 46.464-1.92 1.344 0.832 0.768-0.704-0.128a11.264 11.264 0 0 1-4.16-6.464c-5.76-48.832-16.64-148.16-28.608-293.888a76.16 76.16 0 0 0-29.888-55.232c-103.04-77.056-176.896-162.112-217.856-210.752-10.048-11.968-10.112-12.8-12.288-29.44-4.288-33.472-7.232-58.112-6.976-73.6 0.256-15.488 2.112-19.2 5.632-23.104 3.52-3.84 7.872-6.528 24-8.768 16.128-2.176 41.6-2.368 76.352-2.368z" fill="#333333" p-id="12085"></path></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1769601747862" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11031" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M0 0m245.76 0l532.48 0q245.76 0 245.76 245.76l0 532.48q0 245.76-245.76 245.76l-532.48 0q-245.76 0-245.76-245.76l0-532.48q0-245.76 245.76-245.76Z" fill="#2975FF" p-id="11032"></path><path d="M758.02624 547.1744h-120.6272c-11.71456 0-21.21728-10.12736-21.25824-22.6304 0-12.51328 9.59488-22.6816 21.18656-22.6816h120.61696c8.59136 0 16.3328 5.51936 19.6608 13.9776a23.9616 23.9616 0 0 1-4.44416 24.7808c-4.00384 4.3008-9.472 6.656-15.13472 6.5536z m-0.2048 81.5616H636.23168c-11.28448-0.72704-20.09088-10.6496-20.09088-22.66112 0-12.00128 8.8064-21.92384 20.09088-22.65088h121.50784c8.66304-0.04096 16.4864 5.45792 19.84512 13.9264a23.76704 23.76704 0 0 1-4.5056 24.79104 20.3776 20.3776 0 0 1-15.2576 6.5536v0.04096z m0.21504 72.4992h-120.6272c-11.71456 0-21.22752-10.1376-21.26848-22.66112 0-12.43136 9.59488-22.65088 21.18656-22.65088h120.6272c11.70432 0 21.2992 10.21952 21.2992 22.65088a23.27552 23.27552 0 0 1-6.144 16.09728c-3.9936 4.27008-9.43104 6.62528-15.07328 6.5536z" fill="#FFFFFF" p-id="11033"></path><path d="M671.63136 239.88224l-1.18784-0.01024h-401.7152a60.4672 60.4672 0 0 0-51.70176 31.31392l-0.4096 0.82944c-11.776 21.56544-11.78624 49.28512 8.72448 70.4512l2.29376 2.36544 149.4528 119.18336v212.15232l0.06144 2.51904c0.78848 20.1216 11.008 39.59808 30.23872 50.51392l66.46784 36.28032a62.13632 62.13632 0 0 0 56.80128 0l1.69984-0.8704 1.6384-1.00352 2.17088-1.39264a61.31712 61.31712 0 0 0 27.136-51.5584l-0.01024-245.71904 152.33024-122.368 3.9936-5.46816a61.1328 61.1328 0 0 0-47.98464-97.21856z m-1.18784 51.18976a9.97376 9.97376 0 0 1 8.57088 14.6432l-0.73728 1.16736L530.1248 425.90208a48.10752 48.10752 0 0 0-17.9712 35.34848l-0.06144 2.60096v247.3472a10.11712 10.11712 0 0 1-4.84352 8.74496c-2.74432 1.41312-5.9392 1.5872-8.8064 0.53248l-1.19808-0.53248-64.1536-35.03104c-2.90816-1.4848-4.44416-4.43392-4.75136-7.55712l-0.0512-1.18784v-213.6064c0-13.93664-6.05184-27.0336-16.4352-36.21888l-1.9968-1.67936-147.74272-117.8112c-2.92864-3.0208-2.3552-7.04512-0.57344-10.30144a9.25696 9.25696 0 0 1 7.424-5.4272l1.2288-0.0512h400.24064z" fill="#FFFFFF" p-id="11034"></path></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

31
store/team.js Normal file
View File

@ -0,0 +1,31 @@
import { ref } from "vue";
import { defineStore, storeToRefs } from "pinia";
import api from '@/utils/api';
import { toast } from '@/utils/widget';
import useAccountStore from "./account";
export default defineStore("teamStore", () => {
const { account, doctorInfo } = storeToRefs(useAccountStore());
const teams = ref([]);
async function getTeam(teamId) {
if (!teamId || !account.value?.corpId) return;
const res = await api('getTeamData', { teamId, corpId: account.value.corpId });
if (res && res.data) {
return res.data;
} else {
toast(res?.message || '获取团队信息失败')
}
}
async function getTeams() {
const corpId = account.value?.corpId;
const mateId = doctorInfo.value?.corpId;
if (!corpId || !mateId) return;
const res = await api('getJoinedTeams', { corpId, mateId });
teams.value = res && Array.isArray(res.data) ? res.data : [];
}
return { teams, getTeam, getTeams }
})

View File

@ -18,7 +18,10 @@ const urlsConfig = {
submitCertProfile: 'submitCertProfile',
getMemberVerifyStatus: "getMemberVerifyStatus",
getJoinedTeams: "getJoinedTeams",
updateTeamInfo: "updateTeamInfo"
updateTeamInfo: "updateTeamInfo",
createOwnTeam: 'createOwnTeam',
removeTeammate: "removeTeammate",
toggleTeamLeaderRole: "toggleTeamLeaderRole"
},
knowledgeBase: {
@ -106,7 +109,7 @@ const urlsConfig = {
addServiceRecord: 'addServiceRecord',
updateServiceRecord: 'updateServiceRecord',
removeServiceRecord: 'removeServiceRecord',
sendConsultRejectedMessage: "sendConsultRejectedMessage"
// sendConsultRejectedMessage: "sendConsultRejectedMessage"
}
}
@ -116,7 +119,7 @@ const urls = Object.keys(urlsConfig).reduce((acc, path) => {
keys.forEach((key) => {
const data = acc[key];
if (data) {
// throw new Error(`${data[0]}.${data[1]}和${path}.${url}重复了`)
throw new Error(`${data[0]}.${data[1]}${path}.${key}重复了`)
}
acc[key] = [path, config[key]]
return acc