9.23提交

This commit is contained in:
zoujiandong 2025-09-23 19:00:32 +08:00
parent ae08b222af
commit 70eeb19867
70 changed files with 3187 additions and 140 deletions

View File

@ -508,8 +508,48 @@ const api = {
deleteQuickReply(data){
return request('/expertAPI/deleteQuickReply', data, 'post', false);
},
listOutPatient(data){
return request('/expertAPI/listOutPatient', data, 'post', false);
},
stopOutPatientList(data){
return request('/expertAPI/stopOutPatientList', data, 'post', false);
},
listWorkPlace(data){
return request('/expertAPI/listWorkPlace', data, 'post', false);
},
addOutPatient(data){
return request('/expertAPI/addOutPatient', data, 'post', false);
},
updateOutPatient(data){
return request('/expertAPI/updateOutPatientA', data, 'post', false);
},
deleteOutPatient(data){
return request('/expertAPI/deleteOutPatient', data, 'post', false);
},
addWorkPlace(data){
return request('/expertAPI/addWorkPlace', data, 'post', false);
},
updateWorkPlace(data){
return request('/expertAPI/editWorkPlace', data, 'post', false);
},
deleteWorkPlace(data){
return request('/expertAPI/deleteWorkPlace', data, 'post', false);
},
hospitalList(data){
return request('/expertAPI/hospitalList', data, 'post', false);
},
addStopPatient(data){
return request('/expertAPI/addStopOutPatient', data, 'post', false);
},
deleteStopPatient(data){
return request('/expertAPI/deleteStopOutPatient', data, 'post', false);
},
addOutPatientA(data){
return request('/expertAPI/addOutPatientA', data, 'post', false);
},
delGroupSendMsg(data){
return request('/expertAPI/delGroupSendMsg', data, 'post', false);
},
}
export default api

View File

@ -1107,6 +1107,46 @@
}
}
},
{
"path": "outPatient/outPatient",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": "uni-app分页",
"app": {
"bounce": "none"
}
}
},
{
"path": "addAddress/addAddress",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": "uni-app分页",
"app": {
"bounce": "none"
}
}
},
{
"path": "editAddress/editAddress",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": "uni-app分页",
"app": {
"bounce": "none"
}
}
},
{
"path": "outManage/outManage",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": "uni-app分页",
"app": {
"bounce": "none"
}
}
},
{
"path": "groupMessage/groupMessage",
"style": {
@ -1117,6 +1157,26 @@
}
}
}
,{
"path": "stopPatient/stopPatient",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": "uni-app分页",
"app": {
"bounce": "none"
}
}
}
,{
"path": "note/note",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": "uni-app分页",
"app": {
"bounce": "none"
}
}
}
]
}],

View File

@ -699,7 +699,7 @@
isRefreshing.value = false;
uni.showToast({
title: '刷新成功',
icon: 'success',
icon: 'none',
duration: 1500
});
}, 500);

View File

@ -407,7 +407,7 @@
meetingListBySearchU(filters).then(() => {
uni.showToast({
title: '刷新成功',
icon: 'success',
icon: 'none',
duration: 1500
});
});

View File

@ -7,7 +7,7 @@
<!-- 用户信息卡片 -->
<view class="user-card"
:style="{'background-image': `url(${myInfoBackGround || '/static/big_background_my.png'})`, 'background-size':'cover','background-repeat':'no-repeat'}">
<view class="user-info">
<view class="user-info" @click="goToPage('myInfo')">
<image class="avatar" :src="avatar" mode="aspectFill"></image>
<text class="username">{{username}}</text>
</view>
@ -54,7 +54,7 @@
<up-image :src="sfImg" width="48rpx" height="48rpx"></up-image>
<text>随访二维码</text>
</view>
<view class="service-item" @click="goToPage('qrcode')">
<view class="service-item" @click="goToPage('plan')">
<up-image :src="czjhImg" width="48rpx" height="48rpx"></up-image>
<text>出诊计划</text>
</view>
@ -288,7 +288,7 @@
console.log('签到');
uni.showToast({
title: '签到成功',
icon: 'success'
icon: 'none'
});
};
@ -309,6 +309,12 @@
case 'qrcode':
url="/pages_app/myCode/myCode"
break;
case 'myInfo':
url="/pages_app/personInfo/personInfo"
break;
case 'plan':
url="/pages_chat/outPatient/outPatient"
break;
case 'myVideos':
url="/pages_app/myVideo/myVideo"
break;

View File

@ -288,7 +288,7 @@
await polularScienceArticleListByKeywordsNew(true);
uni.showToast({
title: '刷新成功',
icon: 'success',
icon: 'none',
duration: 1500
});
};

View File

@ -103,7 +103,7 @@
if (res.confirm) {
uni.showToast({
title: '购买成功',
icon: 'success'
icon: 'none'
});
}
}

View File

@ -100,7 +100,7 @@ const sendCode = () => {
type: 6
}).then(res => {
if (res.code === 200) {
uni.showToast({ title: '验证码已发送', icon: 'success' });
uni.showToast({ title: '验证码已发送', icon: 'none' });
} else {
uni.showToast({ title: res.msg || '验证码发送失败', icon: 'none' });
}
@ -125,7 +125,7 @@ const onConfirm = () => {
oldMobile: uni.getStorageSync('userInfo').mobile
}).then(res => {
if (res.code === 200) {
uni.showToast({ title: '更换手机号成功', icon: 'success' });
uni.showToast({ title: '更换手机号成功', icon: 'none' });
} else {
uni.showToast({ title: res.msg || '更换手机号失败', icon: 'none' });
}

View File

@ -76,7 +76,7 @@ const onConfirm = () => {
password: newPwd.value
}).then(res => {
if (res.code === 200) {
uni.showToast({ title: '修改密码成功', icon: 'success' });
uni.showToast({ title: '修改密码成功', icon: 'none' });
//
uni.clearStorageSync();
setTimeout(() => {

View File

@ -92,7 +92,7 @@
}).then(res => {
console.log(res);
uni.hideLoading();
uni.showToast({ title: '注销申请已提交', icon: 'success' });
uni.showToast({ title: '注销申请已提交', icon: 'none' });
setTimeout(() => {
uni.navigateBack();
}, 1500);

View File

@ -73,7 +73,7 @@
}).then(res => {
console.log(res);
uni.hideLoading();
uni.showToast({ title: '提交成功', icon: 'success' });
uni.showToast({ title: '提交成功', icon: 'none' });
});
uni.navigateBack();
};

View File

@ -84,7 +84,7 @@
const ec = curr?.getOpenerEventChannel?.()
ec?.emit && ec.emit('onVisitNoteSubmit', { note: note.value, idx: Number(idx.value) })
} catch (e) {}
uni.showToast({ title: '已添加', icon: 'success' })
uni.showToast({ title: '已添加', icon: 'none' })
setTimeout(() => goBack(), 600)
}
const noop = () => {}

View File

@ -225,7 +225,7 @@ const refreshData = async () => {
uni.showToast({
title: '刷新成功',
icon: 'success'
icon: 'none'
})
} catch (error) {
console.error('刷新失败:', error)
@ -345,7 +345,7 @@ const downloadGuideline = (item) => {
if (res.statusCode === 200) {
uni.showToast({
title: '下载成功',
icon: 'success'
icon: 'none'
})
}
},

View File

@ -237,7 +237,7 @@ const onNextStep = async () => {
const res = {code:200}
if (res.code === 200) {
uni.showToast({ title: '身份验证成功', icon: 'success' });
uni.showToast({ title: '身份验证成功', icon: 'none' });
currentStep.value = 2;
isLoading.value = false;
} else {
@ -283,7 +283,7 @@ const onGetSmsCode = async () => {
type: 3
});
if (res.code === 200) {
uni.showToast({ title: '短信验证码发送成功', icon: 'success' });
uni.showToast({ title: '短信验证码发送成功', icon: 'none' });
// 60
countdown.value = 60;
if (countdownTimer) clearInterval(countdownTimer);
@ -314,7 +314,7 @@ const onConfirmSms = async () => {
id_name: formData.value.name
});
if (res.code === 200) {
uni.showToast({ title: '银行卡添加成功', icon: 'success' });
uni.showToast({ title: '银行卡添加成功', icon: 'none' });
navTo({
url: '/pages_app/idcardAuth/bankCardList'
});

View File

@ -627,7 +627,7 @@
isRefreshing.value = false;
uni.showToast({
title: '刷新成功',
icon: 'success',
icon: 'none',
duration: 1500
});
}, 500);

View File

@ -143,7 +143,7 @@
uni.hideLoading();
uni.showToast({
title: '登录成功',
icon: 'success'
icon: 'none'
});
//

View File

@ -315,7 +315,7 @@ const onGetSmsCode = async () => {
if (res.code === 200) {
uni.showToast({
title: '短信验证码发送成功',
icon: 'success'
icon: 'none'
})
// 60
countdown.value = 60
@ -368,7 +368,7 @@ const onConfirmSms = async () => {
if(res.code === 200){
uni.showToast({
title: '提现申请已提交',
icon: 'success'
icon: 'none'
})
uni.navigateBack()
}

View File

@ -100,7 +100,7 @@ const onSave = () => {
uni.hideLoading();
uni.showToast({
title: '保存成功',
icon: 'success',
icon: 'none',
duration: 2000
});
},

View File

@ -154,7 +154,7 @@ const deleteSelected = () => {
uni.showToast({
title: '删除成功',
icon: 'success'
icon: 'none'
});
} else {
uni.showToast({

View File

@ -168,7 +168,7 @@ const onRefresh = async () => {
noMore.value = false;
records.value = []; //
getFlowerList(); //
uni.showToast({ title: '刷新成功', icon: 'success' });
uni.showToast({ title: '刷新成功', icon: 'none' });
} catch (error) {
console.error('刷新失败:', error);
uni.showToast({ title: '刷新失败', icon: 'error' });

View File

@ -102,7 +102,7 @@ const rejectRequest = () => {
if (res.confirm) {
uni.showToast({
title: '已拒绝申请',
icon: 'success'
icon: 'none'
});
// API
}
@ -118,7 +118,7 @@ const agreeRequest = () => {
if (res.confirm) {
uni.showToast({
title: '已同意申请',
icon: 'success'
icon: 'none'
});
// API
}

View File

@ -236,7 +236,7 @@
setTimeout(() => {
uni.showToast({
title: '签到成功 +2积分',
icon: 'success'
icon: 'none'
});
//

View File

@ -119,7 +119,7 @@
api.exchangeWelfareCard({password: code}).then(res => {
console.log(res)
if (res.code == 200) {
uni.showToast({ title: '兑换成功', icon: 'success' })
uni.showToast({ title: '兑换成功', icon: 'none' })
uni.navigateBack()
}
})

View File

@ -467,7 +467,7 @@
uni.showToast({
title: '刷新成功',
icon: 'success'
icon: 'none'
});
};

View File

@ -454,7 +454,7 @@
await getApplyList();
uni.showToast({
title: '刷新成功',
icon: 'success',
icon: 'none',
duration: 1500
});
} catch (error) {
@ -475,7 +475,7 @@
await getFollowUpList(true);
uni.showToast({
title: '刷新成功',
icon: 'success',
icon: 'none',
duration: 1500
});
};
@ -619,7 +619,8 @@
<style lang="scss" scoped>
.content {
background-color: #f5f5f5;
min-height: 100vh;
height: 100vh;
overflow-y: hidden;
}
.linebox{
@ -784,11 +785,12 @@
.patient-list {
height:calc(100vh - 265rpx);
overflow-y: scroll;
display: flex;
flex-direction:column;
background-color: #ffffff;
margin-top: 20rpx;
padding-bottom: 500rpx;
position: relative;
.listbox{
flex:1;

View File

@ -92,7 +92,7 @@
return
}
// TODO:
uni.showToast({ title: '保存成功', icon: 'success' })
uni.showToast({ title: '保存成功', icon: 'none' })
setTimeout(() => goBack(), 700)
}
</script>

View File

@ -119,7 +119,7 @@
if (res.confirm) {
uni.showToast({
title: '支付成功',
icon: 'success'
icon: 'none'
});
}
}

View File

@ -116,7 +116,7 @@ const exchangeGoods = () => {
if (res.confirm) {
uni.showToast({
title: '兑换成功',
icon: 'success'
icon: 'none'
});
}
}

View File

@ -271,7 +271,7 @@
page.value = 1;
noMore.value = false;
productsList.value = [...initialProducts];
uni.showToast({ title: '刷新成功', icon: 'success' });
uni.showToast({ title: '刷新成功', icon: 'none' });
} finally {
refreshing.value = false;
}

View File

@ -204,7 +204,7 @@
uni.showToast({
title: '刷新成功',
icon: 'success'
icon: 'none'
});
} catch (error) {
uni.showToast({

View File

@ -249,7 +249,7 @@
console.log(2)
uni.showToast({
title: '登录成功',
icon: 'success'
icon: 'none'
});
console.log(3)
uni.redirectTo({
@ -262,7 +262,7 @@
// uni.hideLoading();
// uni.showToast({
// title: '',
// icon: 'success'
// icon: 'none'
// });
// //

View File

@ -278,7 +278,7 @@
uni.showToast({
title: '添加成功',
icon: 'success'
icon: 'none'
});
};
@ -296,7 +296,7 @@
uni.showToast({
title: '删除成功',
icon: 'success'
icon: 'none'
});
};

View File

@ -130,7 +130,7 @@
}).then(res=>{
console.log(res)
if(res.code==200){
uni.showToast({ title: '提交成功', icon: 'success' });
uni.showToast({ title: '提交成功', icon: 'none' });
setTimeout(()=>uni.navigateBack(),700);
}
})

View File

@ -387,7 +387,7 @@
uni.showToast({
title: '刷新成功',
icon: 'success'
icon: 'none'
});
};

View File

@ -45,7 +45,8 @@
import docUrl from '@/utils/docUrl.js'
import { onShow,onLoad} from "@dcloudio/uni-app";
import api from '@/api/api.js'
import navTo from '@/utils/navTo.js'
const from = ref('');
const keyword = ref('')
const selectedIds = ref([])
const patientList = ref([])
@ -65,7 +66,10 @@
}
};
onLoad(() => {
onLoad((options) => {
if(options.from == 'chatMsg'){
from.value = 'chatMsg';
}
// ID
try {
const preSelected = uni.getStorageSync('preSelectedIds')
@ -118,11 +122,20 @@
const ec = curr?.getOpenerEventChannel?.()
ec?.emit && ec.emit('onPatientsSelected', payload);
console.log(selectedDetail.value)
uni.$emit('selectedChatPatientsSingle', { patients: selectedDetail.value });
uni.$emit('selectedChatPatientsSingle', {patients: selectedDetail.value });
} catch (e) {}
// 使
try { uni.setStorageSync('patientsSelectedPayload', payload) } catch (e) {}
uni.navigateBack()
try {
uni.setStorageSync('patientsSelectedPayload', payload) } catch (e) {}
uni.setStorageSync('selectedChatPatientsSingle', {patients: selectedDetail.value })
if(from.value == 'chatMsg'){
navTo({
url: '/pages_chat/groupSend/groupSend?from=chatMsg'
})
}else{
uni.navigateBack()
}
}
</script>

View File

@ -188,7 +188,7 @@
if (res.confirm) {
uni.showToast({
title: '缓存已清除',
icon: 'success'
icon: 'none'
});
}
}

View File

@ -159,7 +159,7 @@ const deleteSelected = () => {
uni.showToast({
title: '删除成功',
icon: 'success'
icon: 'none'
});
}
}

View File

@ -178,7 +178,7 @@
}).then(res=>{
console.log(res)
if(res.code==200){
uni.showToast({ title: '已提交', icon: 'success' });
uni.showToast({ title: '已提交', icon: 'none' });
setTimeout(()=>uni.navigateBack(),700);
}
})
@ -186,7 +186,7 @@
const goBack=()=>uni.navigateBack();
const submitPlan=()=>{
addFollowUps();
uni.showToast({ title: '已提交', icon: 'success' });
uni.showToast({ title: '已提交', icon: 'none' });
setTimeout(()=>uni.navigateBack(),1000);
};
const selectPatient=()=>{

View File

@ -55,7 +55,7 @@
const ec = curr?.getOpenerEventChannel?.()
ec?.emit && ec.emit('onVisitNoteSubmit', { note: note.value, idx: Number(idx.value) })
} catch (e) {}
uni.showToast({ title: '已添加', icon: 'success' })
uni.showToast({ title: '已添加', icon: 'none' })
setTimeout(() => goBack(), 600)
}
const noop = () => {}

View File

@ -109,7 +109,7 @@ const onSave = () => {
content: content.value
})
uni.showToast({ title: '保存成功', icon: 'success' })
uni.showToast({ title: '保存成功', icon: 'none' })
setTimeout(() => goBack(), 300)
}
</script>

View File

@ -495,7 +495,7 @@
uni.showToast({
title: '添加成功',
icon: 'success'
icon: 'none'
});
};
@ -513,7 +513,7 @@
uni.showToast({
title: '删除成功',
icon: 'success'
icon: 'none'
});
};

View File

@ -233,7 +233,7 @@ const refreshData = async () => {
uni.showToast({
title: '刷新成功',
icon: 'success'
icon: 'none'
})
} catch (error) {
console.error('刷新失败:', error)
@ -352,7 +352,7 @@ const downloadGuideline = (item) => {
if (res.statusCode === 200) {
uni.showToast({
title: '下载成功',
icon: 'success'
icon: 'none'
})
}
},

View File

@ -0,0 +1,191 @@
<template>
<view class="address-manage-page">
<!-- 导航栏 -->
<navBar :title="title" />
<!-- 列表区域 -->
<view class="list-container">
<view v-for="item in addressList" :key="item.uuid" class="card">
<view class="card-body">
<view class="name">{{ item.hospital_name }}</view>
<view class="dept">{{ item.office_name }}</view>
<view class="city-and-tag">
<text class="city">{{ item.location }}</text>
<view class="tag">{{ getTypeTag(item.type) }}</view>
</view>
</view>
<view class="card-actions">
<view class="action" @click="edit(item)">
<text class="icon"></text>
<text class="text">编辑</text>
</view>
<view class="action" @click="remove(item)">
<text class="icon">🗑</text>
<text class="text">删除</text>
</view>
</view>
</view>
</view>
<!-- 底部新增按钮 -->
<view class="bottom-actions">
<view class="add-btn" @click="addNew">
<text class="btn-text">新增执业地点</text>
</view>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue'
import { onShow } from '@dcloudio/uni-app'
import navBar from '@/components/navBar/navBar.vue'
import api from '@/api/api.js'
import navTo from '@/utils/navTo'
const title = ref('执业地点管理')
const addressList = ref([])
const getTypeTag = (type) => {
// 稿1=/
return type === 1 ? '普通门诊' : '专科/专病门诊'
}
const fetchList = async () => {
const res = await api.listWorkPlace({})
if (res && res.code === 200 && Array.isArray(res.data)) {
addressList.value = res.data
}
}
onShow(() => {
fetchList()
})
const edit = (item) => {
navTo({
url: '/pages_chat/editAddress/editAddress?uuid='+item.uuid+'&type='+item.type+'&hospital_uuid='+item.hospital_uuid+'&hospital_name='+item.hospital_name+'&office_name='+item.office_name+'&location='+item.location
})
}
const remove = (item) => {
uni.showModal({
title: '删除确认',
content: '确定删除该执业地点吗?',
success: (res) => {
if (res.confirm) {
api.deleteWorkPlace({uuid:item.uuid}).then(res=>{
if(res.code==200){
uni.showToast({ title: '已删除', icon: 'none' })
fetchList()
}
})
}
}
})
}
const addNew = () => {
navTo({
url: '/pages_chat/editAddress/editAddress'
})
}
</script>
<style lang="scss" scoped>
.address-manage-page {
min-height: 100vh;
background-color: #f5f5f5;
}
.list-container {
padding: 24rpx;
}
.card {
background-color: #fff;
border-radius: 16rpx;
overflow: hidden;
margin-bottom: 20rpx;
box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.04);
}
.card-body {
padding: 28rpx;
}
.name {
font-size: 36rpx;
color: #333;
font-weight: 600;
}
.dept {
margin-top: 18rpx;
font-size: 28rpx;
color: #666;
}
.city-and-tag {
margin-top: 18rpx;
display: flex;
align-items: center;
gap: 16rpx;
}
.city {
font-size: 28rpx;
color: #666;
}
.tag {
border: 2rpx solid #8B2316;
color: #8B2316;
border-radius: 24rpx;
padding: 2rpx 18rpx;
white-space: nowrap;
font-size: 22rpx;
display: flex;
align-items: center;
justify-content: center;
}
.card-actions {
display: flex;
justify-content: flex-end;
align-items: center;
gap: 36rpx;
padding: 20rpx 28rpx;
border-top: 2rpx solid #f0f0f0;
}
.action {
display: flex;
align-items: center;
gap: 8rpx;
}
.icon { font-size: 26rpx; }
.text { font-size: 26rpx; color: #666; }
.bottom-actions {
position: fixed;
left: 0;
right: 0;
bottom: 0;
background: #fff;
padding: 24rpx;
border-top: 1rpx solid #eee;
}
.add-btn {
background: #8B2316;
border-radius: 12rpx;
padding: 24rpx 0;
text-align: center;
}
.btn-text { color: #fff; font-size: 32rpx; font-weight: 600; }
</style>

View File

@ -268,7 +268,7 @@
await polularScienceArticleListByKeywordsNew(true);
uni.showToast({
title: '刷新成功',
icon: 'success',
icon: 'none',
duration: 1500
});
};

View File

@ -2,7 +2,7 @@
<div class="msg-custom" :style="{ fontSize: (fontSize || 16) + 'px' }">
<view
class="customCell cloumn"
v-if="JSON.parse(msg.attachment.raw).gdxz_ext_data == '[肝胆商城]'"
v-if="JSON.parse(msg.attachment.raw).gdxz_ext_data == '[肝胆商城]' || JSON.parse(msg.attachment.raw).gdxz_type == '[肝胆商城]'"
@click="goToDetail(JSON.parse(msg.attachment.raw).gdxz_url)"
>
<view class="title">{{ JSON.parse(msg.attachment.raw).gdxz_title }}</view>
@ -18,7 +18,7 @@
</view>
<view
class="customCell cloumn"
v-else-if="JSON.parse(msg.attachment.raw).gdxz_ext_data == '[公益咨询]'"
v-else-if="JSON.parse(msg.attachment.raw).gdxz_ext_data == '[公益咨询]' || JSON.parse(msg.attachment.raw).gdxz_type == '[公益咨询]'"
@click="goDetail(JSON.parse(msg.attachment.raw).gdxz_id)"
>
<view class="title">{{ JSON.parse(msg.attachment.raw).gdxz_title }}</view>
@ -34,7 +34,7 @@
</view>
<view
class="customCell cloumn"
v-else-if="JSON.parse(msg.attachment.raw).gdxz_ext_data == '[门诊公告]'"
v-else-if="JSON.parse(msg.attachment.raw).gdxz_ext_data == '[门诊公告]' || JSON.parse(msg.attachment.raw).gdxz_type == '[门诊公告]'"
@click="goToDetail(JSON.parse(msg.attachment.raw).gdxz_url)"
>
@ -53,7 +53,7 @@
class="customCell cloumn"
v-else-if="
JSON.parse(msg.attachment.raw).gdxz_ext_data == '[图文科普]' ||
JSON.parse(msg.attachment.raw).gdxz_ext_data == '[视频科普]'
JSON.parse(msg.attachment.raw).gdxz_ext_data == '[视频科普]' || JSON.parse(msg.attachment.raw).gdxz_type == '[患教科普]' || JSON.parse(msg.attachment.raw).gdxz_type == '[视频科普]'
"
@click="goToDetail(JSON.parse(msg.attachment.raw).gdxz_url)"
>
@ -73,7 +73,7 @@
<view
class="customCell cloumn"
v-else-if="JSON.parse(msg.attachment.raw).gdxz_ext_data == '[互联网医院]'"
v-else-if="JSON.parse(msg.attachment.raw).gdxz_ext_data == '[互联网医院]' || JSON.parse(msg.attachment.raw).gdxz_type == '[互联网医院]'"
@click="goToMiniProgram"
>

View File

@ -56,7 +56,7 @@
<div class="msg-button-group">
<div
@tap="handleAudioVisible"
v-if="!(isWeb || isHarmonyOs)"
v-if="!(isWeb || isHarmonyOs || isGroupSend)"
class="msg-input-button"
>
<Icon
@ -139,7 +139,7 @@
class="send-more-panel"
@click.stop="() => {}"
>
<div class="send-more-panel-item-wrapper">
<div class="send-more-panel-item-wrapper" v-if="!(isGroupSend)">
<div
class="send-more-panel-item"
@tap="(event:any) => handleSendVideoMsg('camera', event)"
@ -148,7 +148,7 @@
</div>
<div class="icon-text">{{ t('shootText') }}</div>
</div>
<div class="send-more-panel-item-wrapper">
<div class="send-more-panel-item-wrapper" v-if="!(isGroupSend)">
<div
class="send-more-panel-item"
@tap="(event: any) => handleSendVideoMsg('album', event)"
@ -306,6 +306,7 @@ import {
isAndroidOrIosApp,
isHarmonyOs,
} from '@/utils/im/index'
// @ts-ignore
import UniPopup from '@/components/uni-components/uni-popup/components/uni-popup/uni-popup.vue'
// @ts-ignore
@ -362,12 +363,14 @@ const props = withDefaults(
defineProps<{
conversationType: V2NIMConst.V2NIMConversationType
to: string
isGroupSend?: boolean
replyMsgsMap?: {
[key: string]: V2NIMMessageForUI
}
}>(),
{}
)
const emits = defineEmits(['send'])
/** 会话ID */
const conversationId =
props.conversationType ===
@ -418,6 +421,22 @@ const handleCall = (type: number) => {
})
}
}
const outPatientList = ref([]);
const getListOutPatient = async () => {
const res = await api.listOutPatient({
page:1,
});
if(res.code == 200){
outPatientList.value = res.data.list.list;
}
}
const stopOutPatientList = ref([]);
const getStopOutPatientList = async () => {
const res = await api.stopOutPatientList();
if(res.code == 200){
stopOutPatientList.value = res.data;
}
}
onShow(() => {
uni.$on('articelItem', (article) => {
console.log('article', article);
@ -433,6 +452,8 @@ onShow(() => {
uni.$on('quickReply', (reply) => {
inputText.value= reply;
});
getListOutPatient();
getStopOutPatientList();
});
onUnload(() => {
uni.$off('articelItem');
@ -539,6 +560,7 @@ const onSelectSince = (type: string) => {
}
}
/** 点击@ 群成员 */
const handleMentionItemClick = (member: MentionedMember) => {
//@ts-ignore
@ -619,8 +641,19 @@ const handleSendTextMsg = (type:string) => {
let mallText='纽娃复合营养素固体饮料主要成分是:蜂花粉、乳清蛋白粉、灰树花粉、低聚木糖、蚕蛹氨基酸、麦芽粉、薏苡仁粉、烟酸、磷脂,以及其他调味品、辅助原料。科学配比制成,含有丰富的蛋白质、氨基酸、维生素、微量元素及其他营养元素,点击链接了解详情。'
let text = type==='mall'?mallText:replaceEmoji(inputText.value)
const textMsg = uni.$UIKitNIM.V2NIMMessageCreator.createTextMessage(text)
let serverExtension={"gdxz_nickName":"测试","gdxz_sessionType":"general"};
uni.$UIKitStore.msgStore
//let serverExtension={"gdxz_nickName":"","gdxz_sessionType":"general"};
if(props.isGroupSend){
emits('send',{
content:textMsg,
msg_type:1,
})
inputText.value = ''
isReplyMsg.value = false
replyMsg.value = undefined
selectedAtMembers.value = [];
}else{
uni.$UIKitStore.msgStore
.sendMessageActive({
msg: textMsg as unknown as V2NIMMessage,
conversationId,
@ -648,6 +681,7 @@ const handleSendTextMsg = (type:string) => {
senCustomMsg('mall');
}
}
}
/** 发送文件消息 */
const handleSendFileMsg = () => {
@ -763,7 +797,22 @@ const handleSendImageMsg = () => {
const imgMsg = uni.$UIKitNIM.V2NIMMessageCreator.createImageMessage(
res.tempFilePaths[0]
)
if(props.isGroupSend){
const fileManager = uni.getFileSystemManager();
fileManager.readFile({
filePath: res.tempFilePaths[0],
encoding: 'base64',
success: (res) => {
emits('send',{
content:res.data,
msg_type:2,
})
},
fail: (error) => {
console.log('chooseImage', error)
}
})
}else{
uni.$UIKitStore.msgStore
.sendMessageActive({
msg: imgMsg as unknown as V2NIMMessage,
@ -783,28 +832,43 @@ const handleSendImageMsg = () => {
title: t('sendImageFailedText'),
})
})
},
/** uniapp 提供的chooseImage api 在鸿蒙上表现为不支持选择gif在其他端支持 */
fail: (error) => {
}
},
/** uniapp 提供的chooseImage api 在鸿蒙上表现为不支持选择gif在其他端支持 */
fail: (error) => {
console.log('chooseImage', error)
},
/** 没有开启权限时,提示开启权限 */
complete: handleNoPermission,
})
}
const senCustomMsg = (type:string) => {
let rawStr="";
let text="";
let msg_type=0;
let msg_content="";
let doctor_id="";
if(type == 'hospital'){
doctor_id='';
msg_type=8;
msg_content="https://img.applets.igandanyiyuan.com/applet/admin/avatar/2023071813261420200708181049.png";
text="[互联网医院]";
rawStr=`{\"gdxz_content\":\"我已入驻肝胆相照互联网医院,复诊购药一站式服务,快来看看吧\",\"gdxz_ext_data\":\"[互联网医院]\",\"gdxz_id\":\"1681174885629431808\",\"gdxz_img\":\"https://img.applets.igandanyiyuan.com/applet/admin/avatar/2023071813261420200708181049.png\",\"gdxz_title\":\"肝胆相照互联网医院\",\"gdxz_type\":\"[互联网医院]\",\"gdxz_url\":\"\"}`;
}else if(type == 'mall'){
msg_type=6;
msg_content="";
text="[肝胆商城]";
rawStr=`{\"gdxz_content\":\"肝胆相照®肝胆病在线公共服务平台\",\"gdxz_ext_data\":\"[肝胆商城]\",\"gdxz_id\":\"\",\"gdxz_img\":\"\",\"gdxz_title\":\"纽娃复合营养素固体饮料\",\"gdxz_type\":\"[肝胆商城]\",\"gdxz_url\":\"https://wx.igandan.com/shop_notify/setInfo?patient_uuid=${patient_uuid}&expert_uuid=${expert_uuid}\"}`;
}else if(type == 'outpatient'){
msg_type=5;
msg_content="";
text="[门诊公告]";
rawStr=`{\"gdxz_content\":\"门诊详情\",\"gdxz_ext_data\":\"[门诊公告]\",\"gdxz_id\":\"\",\"gdxz_img\":\"\",\"gdxz_title\":\"${expert_name}医生门诊详情\",\"gdxz_type\":\"[门诊公告]\",\"gdxz_url\":\"https://dev-wx.igandan.com/wxPatient/index.htm#/outPatient?link=share&expertUuid=${expert_uuid}\"}`
}else if(type == 'article'){
msg_type=3;
msg_content=articleInfo.value.uuid;
text="[图文科普]";
let content='"'+articleInfo.value.summary+'"';
let id='"'+articleInfo.value.uuid+'"';
@ -812,6 +876,8 @@ const senCustomMsg = (type:string) => {
let path='"'+docUrl+articleInfo.value.path+'"';
rawStr=`{\"gdxz_content\":${content},\"gdxz_ext_data\":\"[图文科普]\",\"gdxz_id\":${id},\"gdxz_img\":\"http://doc.igandan.org/app/book/pdf/2019/20190613152617.png\",\"gdxz_title\":${title},\"gdxz_type\":\"[图文科普]\",\"gdxz_url\":${path}}`
}else if(type == 'video'){
msg_type=4;
msg_content=videoInfo.value.uuid;
let content='"'+videoInfo.value.note+'"';
let id='"'+videoInfo.value.uuid+'"';
let title='"'+videoInfo.value.name+'"';
@ -820,6 +886,12 @@ const senCustomMsg = (type:string) => {
rawStr=`{\"gdxz_content\":${content},\"gdxz_ext_data\":\"[视频科普]\",\"gdxz_id\":${id},\"gdxz_img\":\"http://doc.igandan.org/app/book/pdf/2019/20190613152617.png\",\"gdxz_title\":${title},\"gdxz_type\":\"[视频科普]\",\"gdxz_url\":${path}}`
}
const customMsg = uni.$UIKitNIM.V2NIMMessageCreator.createCustomMessage(text,rawStr)
if(props.isGroupSend){
emits('send',{
content:msg_content,
msg_type:msg_type,
})
}else{
uni.$UIKitStore.msgStore
.sendMessageActive({
msg: customMsg as unknown as V2NIMMessage,
@ -839,6 +911,7 @@ const senCustomMsg = (type:string) => {
title: '发送失败',
})
})
}
}
const handleCustom = (type: string, event: any) => {
@ -853,10 +926,18 @@ const handleCustom = (type: string, event: any) => {
showMallModal.value = true
patientListByGBK();
}else if(type == 'outpatient'){
senCustomMsg('outpatient');
// navTo({
// url: '/pages_chat/outpatient/outpatient',
// })
// navTo({
// url: '/pages_chat/outpatient/outpatient',
// })
if( outPatientList.value.length==0 && stopOutPatientList.value.length==0 ){
navTo({
url: '/pages_chat/outpatient/outpatient',
})
}else{
senCustomMsg('outpatient');
}
}else if(type == 'hospital'){
senCustomMsg('hospital');
}

View File

@ -0,0 +1,178 @@
<template>
<view class="edit-address-page">
<navBar :title="pageTitle" />
<view class="form-container">
<!-- 医院输入联想搜索 -->
<view class="form-item">
<view class="label">医院 <text class="required">*</text></view>
<view class="value full">
<input class="input" v-model.trim="form.hospital_name" placeholder="请输入医院名称" @input="onHospitalInput" @keydown.enter.prevent="onHospitalEnter" />
<view v-if="showHospitalList" class="suggestion">
<view v-for="h in hospitalList" :key="h.uuid" class="suggestion-item" @click="pickHospital(h)">
{{ h.name }}
</view>
<view v-if="hospitalList.length===0" class="suggestion-empty">无匹配医院</view>
</view>
</view>
</view>
<!-- 分割线 -->
<view class="divider"></view>
<!-- 科室 -->
<view class="form-item">
<view class="label">科室 <text class="required">*</text></view>
<view class="value">
<input class="input" v-model.trim="form.office_name" placeholder="请输入科室" />
</view>
</view>
<view class="divider"></view>
<!-- 地址 -->
<view class="form-item">
<view class="label">地址 <text class="required">*</text></view>
<view class="value">
<input class="input" v-model.trim="form.location" placeholder="请输入地址" />
</view>
</view>
<view class="divider big"></view>
<!-- 门诊类型 -->
<view class="form-item column">
<view class="label">门诊类型 <text class="required">*</text></view>
<view class="type-row">
<view class="type-btn" :class="{active: form.type==1}" @click="selectType(1)">普通门诊</view>
<view class="type-btn" :class="{active: form.type==2}" @click="selectType(2)">专家门诊</view>
<view class="type-btn" :class="{active: form.type==3}" @click="selectType(3)">特需门诊</view>
<view class="type-btn" :class="{active: form.type==4}" @click="selectType(4)">专科/专病门诊</view>
</view>
</view>
</view>
<view class="bottom-actions">
<view class="submit-btn" @click="submit">
<text class="btn-text">{{form.uuid?'确定修改':'确定新增'}}</text>
</view>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
import navBar from '@/components/navBar/navBar.vue'
import api from '@/api/api.js'
const pageTitle = ref('新增执业地点')
const form = ref({
hospital_uuid: '',
hospital_name: '',
office_name: '',
location: '',
type: 4
})
const selectType = (t) => { form.value.type = t }
//
const hospitalList = ref([])
const showHospitalList = ref(false)
let hospitalTimer = null
const onHospitalInput = (e) => {
showHospitalList.value = true
if (hospitalTimer) clearTimeout(hospitalTimer)
hospitalTimer = setTimeout(() => {
fetchHospitals(e.detail.value || form.value.hospital_name)
}, 300)
}
const onHospitalEnter = () => {
fetchHospitals(form.value.hospital_name)
}
const fetchHospitals = async (keyword) => {
if (!keyword) { hospitalList.value = []; return }
const res = await api.getHospitalList({ name: keyword })
if (res && res.code === 200) {
hospitalList.value = res.data || []
}
}
const pickHospital = (h) => {
form.value.hospital_uuid = h.uuid
form.value.hospital_name = h.name
showHospitalList.value = false
}
const validate = () => {
if (!form.value.hospital_name) return '请选择医院'
if (!form.value.office_name) return '请输入科室'
if (!form.value.location) return '请输入地址'
if (!form.value.type) return '请选择门诊类型'
return ''
}
const submit = async () => {
const err = validate()
if (err) { uni.showToast({ title: err, icon: 'none' }); return }
//
try {
const res =form.value.uuid?await api.updateWorkPlace(form.value) : await api.addWorkPlace(form.value)
if (res.code === 200) {
let title = form.value.uuid ? '修改成功' : '新增成功'
uni.showToast({ title: title, icon: 'none' })
uni.navigateBack()
}
} catch (e) {
uni.showToast({ title: '提交失败', icon: 'none' })
}
}
onLoad((options) => {
// /
if (options) {
if(options.uuid){
form.value.uuid = options.uuid;
form.value.type = options.type;
form.value.hospital_uuid = options.hospital_uuid;
form.value.hospital_name = options.hospital_name;
form.value.office_name = options.office_name;
form.value.location = options.location;
}
if(options.uuid){
pageTitle.value = '修改执业地点'
}
}
})
</script>
<style lang="scss" scoped>
.edit-address-page { min-height: 100vh; background: #fff; }
.form-container { padding: 24rpx; }
.form-item { display: flex; align-items: center; justify-content: space-between; padding: 24rpx 0; }
.form-item.column { flex-direction: column; align-items: flex-start; }
.label { font-size: 30rpx; color: #333; }
.required { color: #8B2316; margin-left: 6rpx; }
.value { flex: 1; margin-left: 24rpx; }
.value.full { width: 100%; margin-left: 0; position: relative; }
.value-text { font-size: 30rpx; color: #333; }
.value-text.placeholder { color: #999; }
.input { width: 100%; font-size: 30rpx; color: #333; }
.suggestion { position: absolute; top: 84rpx; left: 0; right: 0; background: #fff; border: 2rpx solid #eee; border-radius: 10rpx; max-height: 480rpx; overflow-y: auto; z-index: 10; }
.suggestion-item { padding: 20rpx 24rpx; font-size: 28rpx; color: #333; border-bottom: 2rpx solid #f5f5f5; }
.suggestion-item:last-child { border-bottom: 0; }
.suggestion-empty { padding: 20rpx 24rpx; font-size: 26rpx; color: #999; }
.divider { height: 2rpx; background: #eee; }
.divider.big { margin-top: 10rpx; }
.type-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20rpx; margin-top: 20rpx; width: 100%; }
.type-btn { text-align: center; border: 2rpx solid #ddd; border-radius: 12rpx; height: 96rpx; line-height: 96rpx; color: #999; font-size: 24rpx;}
.type-btn.active { border-color: #8B2316; color: #8B2316; background: url('@/static/addoutpa_true.png') right bottom/39rpx 39rpx no-repeat; }
.bottom-actions { position: fixed; left: 0; right: 0; bottom: 0; background: #fff; padding: 30rpx; border-top: 1rpx solid #eee; }
.submit-btn { background: #8B2316; border-radius: 12rpx; padding: 24rpx 0; text-align: center; }
.btn-text { color: #fff; font-size: 32rpx; font-weight: 600; }
</style>

View File

@ -22,19 +22,30 @@
<view class="card-header">
<text class="label">{{ item.realname.split(',').length }}位患者</text>
<view class="close" @click="onClear">
<view class="close" @click="delGroupSendMsg(item)">
<text>×</text>
</view>
</view>
<view class="line" >
{{ item.realname }}
</view>
<view class="line phone" >
<view class="line phone" v-if="item.msg_type==1">
{{ item.msg_content }}
</view>
<view class="line phone" v-if="item.msg_type==3" @click="onDetail(item)">
<view class="custom">
<view class="title">{{JSON.parse(item.msg_content).summary }}</view>
<view class="row">
<view class="left">{{ docUrl+JSON.parse(item.msg_content).path }}</view>
<view class="right">
<image :src="docUrl+JSON.parse(item.msg_content).imgPath" ></image>
</view>
</view>
</view>
</view>
</view>
<view class="card-footer">
<view class="btn-outline" @click="onResend">再发一条</view>
<view class="btn-outline" @click="onResend(item)">再发一条</view>
</view>
</view>
</view>
@ -64,8 +75,8 @@
</scroll-view>
<!-- 底部按钮 -->
<view class="bottom-bar">
<view class="btn-primary" @click="openModal">群发消息</view>
<view class="bottom-bar" @click="openModal">
<view class="btn-primary" >群发消息</view>
</view>
<!-- 弹窗与遮罩 -->
<view v-if="showModal" class="mask" @click="closeModal"></view>
@ -88,6 +99,8 @@ import { ref, onMounted } from 'vue'
import navBar from '@/components/navBar/navBar.vue'
import api from '@/api/api.js'
import { onShow } from '@dcloudio/uni-app'
import docUrl from '@/utils/docUrl.js'
import navTo from '@/utils/navTo.js'
const currentTime = ref('')
const patientCount = ref(1)
const patientName = ref('测试')
@ -168,9 +181,13 @@ const onRefresh = async () => {
await listGroupSendMsg(true);
refreshing.value = false;
uni.showToast({ title: '刷新成功', icon: 'success' });
uni.showToast({ title: '刷新成功', icon: 'none' });
};
const onDetail = (item) => {
navTo({
url: `/pages_app/webview/webview?url=${encodeURIComponent(docUrl+JSON.parse(item.msg_content).path)}`,
})
}
//
const onLoadMore = async () => {
if(!hasMore.value || loading.value) return;
@ -197,19 +214,49 @@ const closeModal = () => {
const onSelect = (type) => {
showModal.value = false;
if (type === 'single') {
uni.showToast({ title: '单独选择', icon: 'none' });
navTo({
url: "/pages_app/selectPatient/selectPatient?from=chatMsg"
})
} else if (type === 'group') {
uni.showToast({ title: '分组选择', icon: 'none' });
navTo({
url: '/pages_chat/patientGroup/patientGroup',
})
}
};
const onClear = () => {
const delGroupSendMsg = (obj) => {
//
patientCount.value = 0
patientName.value = ''
patientPhone.value = ''
uni.showModal({
title: '提示',
content: '确定删除该群发消息吗?',
success: (res) => {
if(res.confirm){
api.delGroupSendMsg({
uuid: obj.uuid
}).then(res => {
if(res.code == 200){
uni.showToast({ title: '删除成功', icon: 'none' })
list.value = list.value.filter(item => obj.uuid != item.uuid)
}
})
}
}
})
}
const onResend = () => {
uni.showToast({ title: '已触发再发一条', icon: 'none' })
const onResend = (obj) => {
let arr=[];
let idArr=obj.patient_uuid.split(',');
obj.realname.split(',').forEach((item,index) => {
arr.push({
uuid: idArr[index],
realName: item,
})
})
uni.setStorageSync('selectedChatPatientsSingle', {
patients: arr
});
navTo({
url: `/pages_chat/groupSend/groupSend?from=chatMsg`
})
}
const onSendGroup = () => {
uni.showToast({ title: '已触发群发', icon: 'none' })
@ -222,6 +269,46 @@ $brand: #8B2316;
$brand-deep: #8B2316;
$primary: #00cbc0;
$red: #D32F2F;
.custom{
padding: 25rpx;
border-radius: 16rpx;
border: 2rpx solid #f0f0f0;
width:80%;
margin: 0 auto;
.title{
font-size: 32rpx;
color: #333;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
font-size: 32rpx;
}
.row{
margin-top: 20rpx;
display: flex;
align-items: center;
justify-content: space-between;
.left{
font-size: 24rpx;
color: #999;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
}
.right{
image{
width: 150rpx;
height: 150rpx;
margin-left: 20rpx;
}
}
}
}
/* 遮罩与弹窗 */
.mask {
position: fixed;
@ -286,9 +373,8 @@ $red: #D32F2F;
.scroll-container {
position: fixed;
top: 140rpx;
width:100%;
bottom: 200rpx;
bottom: 107rpx;
}
@ -332,8 +418,8 @@ $red: #D32F2F;
.label { font-size: 32rpx; color: #333; }
.close {
position: absolute;
right: -15rpx;
top: -18rpx;
right: -30rpx;
top: -36rpx;
width: 100rpx;
height: 100rpx;
border-bottom-left-radius: 100rpx;

View File

@ -1,5 +1,5 @@
<template>
<view class="page">
<view class="page" @touchstart="handleTapContent">
<!-- 顶部导航 -->
<uni-nav-bar
left-icon="left"
@ -32,9 +32,9 @@
<text class="label"
>消息将发送给{{ selectedPatients.length }}位患者</text
>
<view class="close" @click="onClear">
<!-- <view class="close" @click="onClear">
<text>×</text>
</view>
</view> -->
</view>
<view class="card-body">
<view class="patient-list">
@ -57,16 +57,7 @@
</view>
</view>
<!-- 底部按钮 -->
<view class="bottom-bar">
<view style="height: 'auto'">
<!-- <MessageInput
:reply-msgs-map="replyMsgsMap"
:conversation-type="conversationType"
:to="to"
/> -->
</view>
</view>
<!-- 弹窗与遮罩 -->
<view v-if="showModal" class="mask" @click="closeModal"></view>
@ -82,21 +73,38 @@
</view>
</view>
</view>
<!-- 底部按钮 -->
<view class="bottom-bar">
<view style="height:auto;width:100%">
<MessageInput
:isGroupSend="true"
@send="send"
/>
</view>
</view>
</template>
<script setup>
import { ref, onMounted } from "vue";
import navBar from "@/components/navBar/navBar.vue";
import api from "@/api/api.js";
import { events } from "@/utils/im/constants";
import { onShow,onLoad,onUnload } from "@dcloudio/uni-app";
import navTo from "@/utils/navTo.js";
import MessageInput from "@/pages_chat/chat/message/message-input.vue";
const showModal = ref(false);
const selectedPatients = ref([]);
const from = ref('');
const replyMsgsMap = ref({});
const conversationType = ref("1");
const msg_content = ref("");
const msg_type = ref("1");
const to = ref("");
onLoad((options) => {
if(options.from == 'chatMsg'){
from.value = 'chatMsg';
}
})
const toggleModal = () => {
showModal.value = !showModal.value;
}
@ -110,6 +118,12 @@ const goBack = () => {
}
});
}
const send = (data) => {
console.log(data);
msg_content.value = data.content;
msg_type.value = data.msg_type;
addGroupSendMsg4YunXin();
}
const addGroupSendMsg4YunXin=async()=>{
const res=await api.addGroupSendMsg4YunXin({
patient_user_uuid: selectedPatients.value.map(item => item.uuid).join(','),
@ -128,6 +142,12 @@ const addGroupSendMsg4YunXin=async()=>{
onMounted(() => {
//
});
const handleTapContent= () => {
uni.$emit(events.CLOSE_PANEL)
setTimeout(() => {
uni.$emit(events.CLOSE_PANEL)
}, 300)
}
onShow(() => {
try {
@ -135,10 +155,16 @@ onShow(() => {
console.log(data)
selectedPatients.value = data.patients;
});
uni.$on('selectedChatPatientsSingle',(data)=>{
if(from.value == 'chatMsg'){
console.log(uni.getStorageSync('selectedChatPatientsSingle'))
selectedPatients.value = uni.getStorageSync('selectedChatPatientsSingle').patients;
}else{
uni.$on('selectedChatPatientsSingle',(data)=>{
console.log(data)
selectedPatients.value = data.patients;
});
}
} catch (e) {
console.error('接收已选患者失败', e);
}
@ -159,7 +185,7 @@ const onSelect = (type) => {
showModal.value = false;
if (type === "single") {
navTo({
url: "/pages_app/selectPatient/selectPatient"
url: "/pages_app/selectPatient/selectPatient?from=chat"
})
//
} else if (type === "group") {
@ -289,8 +315,7 @@ $red: #d32f2f;
left: 0;
right: 0;
bottom: 0;
background: $primary;
height: 100rpx;
min-height: 100rpx;
display: flex;
align-items: center;
justify-content: center;

261
pages_chat/note/note.vue Normal file
View File

@ -0,0 +1,261 @@
<template>
<view class="outpatient-info-page">
<!-- 导航栏 -->
<navBar title="门诊信息" />
<!-- 主内容区域 -->
<view class="content-area">
<view class="input-container">
<textarea
class="text-input"
v-model="outpatientInfo"
placeholder="请输入门诊信息..."
:maxlength="500"
:auto-height="true"
></textarea>
<!-- 语音输入按钮 -->
<!-- <view class="voice-input-btn" @click="startVoiceInput">
<text class="voice-icon">🎤</text>
</view> -->
</view>
</view>
<!-- 底部提交按钮 -->
<view class="bottom-actions">
<view class="submit-btn" @click="submitInfo">
<text class="submit-text">提交</text>
</view>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue'
import navBar from '@/components/navBar/navBar.vue'
import api from '@/api/api'
import {onLoad} from '@dcloudio/uni-app'
onLoad((options) => {
console.log(options.note)
console.log(decodeURIComponent(options.note))
outpatientInfo.value = decodeURIComponent(options.note);
})
//
const outpatientInfo = ref('')
const addOutPatientA = () => {
api.addOutPatientA({
note: outpatientInfo.value,
type:2,
week: "",
workplace_uuid: "",
day: "",
uuid: "",
}).then(res => {
console.log(res)
if(res.code==0){
uni.navigateBack()
}
})
}
//
const goBack = () => {
uni.navigateBack()
}
const startVoiceInput = () => {
uni.showToast({
title: '语音输入功能',
icon: 'none'
})
//
}
const submitInfo = () => {
if (!outpatientInfo.value.trim()) {
uni.showToast({
title: '请输入门诊信息',
icon: 'none'
})
return
}
addOutPatientA()
}
</script>
<style lang="scss" scoped>
.outpatient-info-page {
min-height: 100vh;
background-color: #fff;
display: flex;
flex-direction: column;
}
/* 状态栏样式 */
.status-bar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20rpx 30rpx;
background-color: #fff;
font-size: 28rpx;
color: #333;
}
.status-right {
display: flex;
align-items: center;
gap: 10rpx;
}
.network-type {
font-size: 24rpx;
color: #666;
}
.signal-bars {
display: flex;
align-items: end;
gap: 2rpx;
margin: 0 10rpx;
}
.bar {
width: 4rpx;
background-color: #333;
border-radius: 1rpx;
}
.bar:nth-child(1) { height: 8rpx; }
.bar:nth-child(2) { height: 12rpx; }
.bar:nth-child(3) { height: 16rpx; }
.bar:nth-child(4) { height: 20rpx; }
.battery-text {
font-size: 24rpx;
color: #333;
}
.battery-icon {
font-size: 20rpx;
}
/* 导航栏样式 */
.nav-bar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20rpx 30rpx;
background-color: #fff;
border-bottom: 1rpx solid #eee;
}
.nav-left {
width: 60rpx;
}
.back-arrow {
font-size: 50rpx;
color: #8B2316;
}
.nav-center {
flex: 1;
text-align: center;
}
.nav-title {
font-size: 34rpx;
color: #8B2316;
font-weight: 500;
}
.nav-right {
width: 60rpx;
}
/* 主内容区域 */
.content-area {
padding: 40rpx 30rpx;
display: flex;
flex-direction: column;
}
.input-container {
position: relative;
flex: 1;
display: flex;
flex-direction: column;
}
.text-input {
flex: 1;
width: 100%;
min-height: 600rpx;
padding: 30rpx;
border: 2rpx solid #e0e0e0;
border-radius: 12rpx;
font-size: 32rpx;
color: #333;
background-color: #fff;
resize: none;
outline: none;
box-sizing: border-box;
}
.text-input:focus {
border-color: #8B2316;
}
/* 语音输入按钮 */
.voice-input-btn {
position: absolute;
bottom: 20rpx;
right: 20rpx;
width: 80rpx;
height: 80rpx;
background-color: #8B2316;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4rpx 12rpx rgba(139, 35, 22, 0.3);
}
.voice-icon {
font-size: 36rpx;
color: #fff;
}
/* 底部提交按钮 */
.bottom-actions {
position: fixed;
bottom: 20rpx;
left:30rpx;
right: 30rpx;
background-color: #fff;
}
.submit-btn {
background-color: #fff;
border: 2rpx solid #8B2316;
border-radius: 12rpx;
padding: 25rpx;
color: #8B2316;
text-align: center;
}
.submit-text {
color: #8B2316;
font-size: 32rpx;
font-weight: 500;
}
.submit-btn:active {
background-color: #f5f5f5;
}
</style>

View File

@ -0,0 +1,547 @@
<template>
<view class="add-schedule-page">
<!-- 导航栏 -->
<navBar :title="title" />
<!-- 主内容区域 -->
<view class="content-area">
<!-- 门诊时间选择 -->
<view class="form-section">
<view class="section-title">
<text class="title-text">门诊时间</text>
<text class="required-mark">*</text>
</view>
<!-- 星期选择 -->
<view class="weekday-selection">
<view class="weekday-row">
<view
class="weekday-btn"
:class="{ active: selectedWeekday == 1 }"
@click="selectWeekday(1)"
>
<text class="weekday-text">周一</text>
</view>
<view
class="weekday-btn"
:class="{ active: selectedWeekday == 2 }"
@click="selectWeekday(2)"
>
<text class="weekday-text">周二</text>
</view>
<view
class="weekday-btn"
:class="{ active: selectedWeekday == 3 }"
@click="selectWeekday(3)"
>
<text class="weekday-text">周三</text>
</view>
<view
class="weekday-btn"
:class="{ active: selectedWeekday == 4 }"
@click="selectWeekday(4)"
>
<text class="weekday-text">周四</text>
</view>
</view>
<view class="weekday-row">
<view
class="weekday-btn"
:class="{ active: selectedWeekday == 5 }"
@click="selectWeekday(5)"
>
<text class="weekday-text">周五</text>
</view>
<view
class="weekday-btn"
:class="{ active: selectedWeekday == 6 }"
@click="selectWeekday(6)"
>
<text class="weekday-text">周六</text>
</view>
<view
class="weekday-btn"
:class="{ active: selectedWeekday== 7 }"
@click="selectWeekday(7)"
>
<text class="weekday-text">周日</text>
</view>
<view class="weekday-btn empty"></view>
</view>
</view>
<!-- 时间段选择 -->
<view class="time-period-selection">
<view
class="time-btn"
:class="{ active: selectedTimePeriod === 'a' }"
@click="selectTimePeriod('a')"
>
<text class="time-text">上午</text>
</view>
<view
class="time-btn"
:class="{ active: selectedTimePeriod === 'b' }"
@click="selectTimePeriod('b')"
>
<text class="time-text">下午</text>
</view>
<view
class="time-btn"
:class="{ active: selectedTimePeriod === 'c' }"
@click="selectTimePeriod('c')"
>
<text class="time-text">晚上</text>
</view>
<view
class="time-btn"
:class="{ active: selectedTimePeriod === 'd' }"
@click="selectTimePeriod('d')"
>
<text class="time-text">全天</text>
</view>
</view>
</view>
<!-- 门诊地点选择 -->
<view class="form-section form-site">
<view class="section-title">
<text class="title-text">门诊地点</text>
<text class="required-mark">*</text>
</view>
<view class="location-card"
v-for="item in workPlaceList"
:key="item.uuid"
:class="{ active:selectedLocation.uuid === item.uuid }"
@click="chooseLocation(item)">
<view class="location-content">
<text class="hospital-name">{{ item.hospital_name }}</text>
<text class="office-number">{{ item.office_name }}</text>
<view class="location-bottom">
<text class="location-text">{{ item.location }}</text>
<view class="clinic-type-tag">
{{ getTypeText(item.type) }}
</view>
</view>
</view>
<!-- <view class="check-icon"></view> -->
</view>
</view>
</view>
<!-- 底部确定按钮 -->
<view class="bottom-actions">
<view class="confirm-btn" @click="confirmPublish">
<text class="btn-text">{{ uuid? '确定修改' : '确定发布' }}</text>
</view>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue'
import { onLoad, onShow } from "@dcloudio/uni-app";
import api from "@/api/api.js";
import navTo from '@/utils/navTo'
import navBar from '@/components/navBar/navBar.vue'
const title = ref('增加门诊安排')
const uuid=ref('')
//
const selectedWeekday = ref(null)
const selectedTimePeriod = ref('')
const selectedLocation = ref({})
const getTypeText = (type) => {
const map = { 1: '普通门诊', 2: '专家门诊', 3: '特需门诊', 4: '专科/专病门诊' }
return map[type] || '普通门诊'
}
onShow(()=>{
listWorkPlace()
})
//
const goBack = () => {
uni.navigateBack()
}
const workPlaceList=ref([])
const listWorkPlace=async()=>{
const res = await api.listWorkPlace()
if(res.code == 200){
workPlaceList.value = res.data
}
}
const selectWeekday = (weekday) => {
selectedWeekday.value = weekday
}
const addOutPatient=async()=>{
const res = await api.addOutPatient({
week: selectedWeekday.value,
day: selectedTimePeriod.value,
note:'',
type:1,
workplace_uuid: selectedLocation.value.uuid
})
if(res.code == 200){
uni.showToast({
title: '发布成功',
icon: 'none'
})
uni.navigateBack()
}
}
const updateOutPatient=async()=>{
const res = await api.updateOutPatient({
uuid: uuid.value,
note:'',
type:1,
week: selectedWeekday.value,
day: selectedTimePeriod.value,
workplace_uuid: selectedLocation.value
})
if(res.code == 200){
uni.showToast({
title: '修改成功',
icon: 'none'
})
uni.navigateBack()
}
}
const selectTimePeriod = (period) => {
selectedTimePeriod.value = period
}
const chooseLocation = (item) => {
selectedLocation.value = item
}
const getType=(type)=>{
const map = { 1: 'a', 2: 'b', 3: 'c', 4: 'd' }
return map[type]
}
const confirmPublish = () => {
if (!selectedWeekday.value) {
uni.showToast({
title: '请选择门诊时间',
icon: 'none'
})
return
}
if (!selectedTimePeriod.value) {
uni.showToast({
title: '请选择时间段',
icon: 'none'
})
return
}
if (!selectedLocation.value) {
uni.showToast({
title: '请选择门诊地点',
icon: 'none'
})
return
}
if(uuid.value){
updateOutPatient()
}else{
addOutPatient()
}
}
onLoad((options)=>{
console.log(options)
uuid.value = options.uuid;
selectedWeekday.value = options.week;
selectedLocation.value.uuid = options.workplace_uuid;
selectedTimePeriod.value = getType(options.type);
if(uuid.value){
title.value = '编辑门诊安排'
}
})
</script>
<style lang="scss" scoped>
.add-schedule-page {
min-height: 100vh;
background-color: #fff;
}
/* 状态栏样式 */
.status-bar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20rpx 30rpx;
background-color: #fff;
font-size: 28rpx;
color: #333;
}
.status-right {
display: flex;
align-items: center;
gap: 10rpx;
}
.network-speed {
font-size: 24rpx;
color: #666;
}
.network-type {
font-size: 24rpx;
color: #666;
}
.wifi-icon, .battery-icon {
font-size: 24rpx;
}
.battery {
font-size: 24rpx;
color: #333;
}
/* 导航栏样式 */
.nav-bar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20rpx 30rpx;
background-color: #fff;
border-bottom: 1rpx solid #eee;
}
.nav-left {
width: 60rpx;
}
.back-arrow {
font-size: 50rpx;
color: #8B2316;
font-weight: bold;
}
.nav-center {
flex: 1;
text-align: center;
}
.nav-title {
font-size: 34rpx;
color: #8B2316;
font-weight: bold;
}
.nav-right {
width: 60rpx;
}
/* 主内容区域 */
.content-area {
padding: 40rpx 30rpx;
}
/* 表单区域 */
.form-section {
margin-bottom: 60rpx;
}
.form-site{
margin-bottom: 120rpx;
}
.section-title {
display: flex;
align-items: center;
margin-bottom: 30rpx;
}
.title-text {
font-size: 32rpx;
color: #8B2316;
font-weight: bold;
}
.required-mark {
color: #8B2316;
font-size: 32rpx;
margin-left: 4rpx;
}
/* 星期选择样式 */
.weekday-row {
display: flex;
gap: 20rpx;
margin-bottom: 20rpx;
}
.weekday-btn {
flex: 1;
height: 80rpx;
border: 2rpx solid #ddd;
border-radius: 8rpx;
display: flex;
align-items: center;
justify-content: center;
background-color: #fff;
}
.weekday-btn.active {
border-color: #8B2316;
background: url('@/static/addoutpa_true.png') no-repeat right bottom;
background-size:39rpx 39rpx;
//
}
.weekday-btn.empty {
border: none;
background-color: transparent;
}
.weekday-text {
font-size: 28rpx;
color: #666;
}
.weekday-btn.active .weekday-text {
color:#8B2316;
}
/* 时间段选择样式 */
.time-period-selection {
padding-top: 20rpx;
display: flex;
border-top: 2rpx solid #f0f0f0;
gap: 20rpx;
}
.time-btn {
flex: 1;
height: 80rpx;
border: 2rpx solid #ddd;
border-radius: 8rpx;
display: flex;
align-items: center;
justify-content: center;
background-color: #fff;
}
.time-btn.active {
border-color: #8B2316;
background: url('@/static/addoutpa_true.png') no-repeat right bottom;
background-size:39rpx 39rpx;
}
.time-text {
font-size: 28rpx;
color: #666;
}
.time-btn.active .time-text {
color:#8B2316;
}
/* 门诊地点选择样式 */
.location-card {
border: 2rpx solid #999;
border-radius: 12rpx;
padding: 30rpx;
background-color: #fff;
position: relative;
min-height: 200rpx;
margin-bottom: 30rpx;
}
.location-card.active{
border: 2rpx solid #8B2316;
background: url('@/static/addoutpa_true.png') no-repeat right bottom;
background-size:77rpx 77rpx;
}
.location-content {
display: flex;
flex-direction: column;
gap: 15rpx;
}
.hospital-name {
font-size: 28rpx;
color: #333;
line-height: 1.4;
}
.office-number {
font-size: 32rpx;
color: #333;
font-weight: bold;
}
.location-bottom {
display: flex;
align-items: center;
gap: 15rpx;
}
.location-text {
font-size: 28rpx;
color: #333;
}
.clinic-type-tag {
border: 2rpx solid #8B2316;
border-radius: 20rpx;
padding: 2rpx 16rpx;
white-space: nowrap;
background-color: transparent;
font-size: 24rpx;
color: #8B2316;
display: flex;
align-items: center;
justify-content: center;
}
.check-icon {
position: absolute;
bottom: 20rpx;
right: 20rpx;
width: 40rpx;
height: 40rpx;
background-color: #8B2316;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
font-size: 24rpx;
font-weight: bold;
}
/* 底部按钮样式 */
.bottom-actions {
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: 30rpx;
background-color: #fff;
border-top: 1rpx solid #eee;
}
.confirm-btn {
background-color: #8B2316;
border-radius: 12rpx;
padding: 25rpx;
text-align: center;
}
.btn-text {
color: #fff;
font-size: 32rpx;
font-weight: bold;
}
</style>

View File

@ -0,0 +1,325 @@
<template>
<view class="add-schedule-page">
<!-- 导航栏 -->
<uni-nav-bar
left-icon="left"
title="增加门诊安排"
@clickLeft="goBack"
fixed
color="#8B2316"
height="140rpx"
:border="false"
backgroundColor="#eee"
/>
<!-- 表单内容 -->
<view class="form-container">
<view class="form-item">
<text class="form-label">选择日期</text>
<picker mode="date" :value="formData.date" @change="onDateChange">
<view class="picker-input">
<text class="picker-text">{{ formData.date || '请选择日期' }}</text>
<text class="picker-arrow"></text>
</view>
</picker>
</view>
<view class="form-item">
<text class="form-label">时间段</text>
<picker mode="selector" :range="timePeriods" :value="timePeriodIndex" @change="onTimePeriodChange">
<view class="picker-input">
<text class="picker-text">{{ timePeriods[timePeriodIndex] || '请选择时间段' }}</text>
<text class="picker-arrow"></text>
</view>
</picker>
</view>
<view class="form-item">
<text class="form-label">医院名称</text>
<input class="form-input" placeholder="请输入医院名称" v-model="formData.hospital_name" />
</view>
<view class="form-item">
<text class="form-label">诊室号</text>
<input class="form-input" placeholder="请输入诊室号" v-model="formData.room_number" />
</view>
<view class="form-item">
<text class="form-label">价格</text>
<input class="form-input" placeholder="请输入价格" v-model="formData.price" type="number" />
</view>
<view class="form-item">
<text class="form-label">门诊类型</text>
<view class="checkbox-group">
<view class="checkbox-item" @click="toggleSpecial">
<view class="checkbox" :class="{ checked: formData.is_special }">
<text class="checkbox-icon" v-if="formData.is_special"></text>
</view>
<text class="checkbox-text">特需门诊</text>
</view>
</view>
</view>
<view class="form-item">
<text class="form-label">备注信息</text>
<textarea class="form-textarea" placeholder="请输入备注信息" v-model="formData.remarks" />
</view>
</view>
<!-- 底部按钮 -->
<view class="bottom-actions">
<view class="save-btn" @click="saveSchedule">
<text class="btn-text">保存</text>
</view>
<view class="publish-btn" @click="publishSchedule">
<text class="btn-text">发布</text>
</view>
</view>
</view>
</template>
<script setup>
import { reactive, ref } from 'vue'
import api from '@/api/api'
//
const formData = reactive({
date: '',
time_period: '',
hospital_name: '',
room_number: '',
price: '',
is_special: false,
remarks: ''
})
const timePeriods = ['上午', '下午', '晚上']
const timePeriodIndex = ref(0)
//
const goBack = () => {
uni.navigateBack()
}
const onDateChange = (e) => {
formData.date = e.detail.value
}
const onTimePeriodChange = (e) => {
timePeriodIndex.value = e.detail.value
formData.time_period = timePeriods[e.detail.value]
}
const toggleSpecial = () => {
formData.is_special = !formData.is_special
}
const saveSchedule = async () => {
if (!formData.date || !formData.hospital_name) {
uni.showToast({
title: '请填写必要信息',
icon: 'none'
})
return
}
try {
const res = await api.addOutPatient(formData)
if (res.code === 200) {
uni.showToast({
title: '保存成功',
icon: 'none'
})
setTimeout(() => {
uni.navigateBack()
}, 1500)
} else {
uni.showToast({
title: res.msg || '保存失败',
icon: 'none'
})
}
} catch (error) {
uni.showToast({
title: '保存失败',
icon: 'none'
})
}
}
const publishSchedule = async () => {
if (!formData.date || !formData.hospital_name) {
uni.showToast({
title: '请填写必要信息',
icon: 'none'
})
return
}
uni.showModal({
title: '确认发布',
content: '确定要发布这条门诊安排吗?',
success: async (res) => {
if (res.confirm) {
try {
const publishRes = await api.publishOutPatient(formData)
if (publishRes.code === 200) {
uni.showToast({
title: '发布成功',
icon: 'none'
})
setTimeout(() => {
uni.navigateBack()
}, 1500)
} else {
uni.showToast({
title: publishRes.msg || '发布失败',
icon: 'none'
})
}
} catch (error) {
uni.showToast({
title: '发布失败',
icon: 'none'
})
}
}
}
})
}
</script>
<style lang="scss" scoped>
.add-schedule-page {
min-height: 100vh;
background-color: #f5f5f5;
padding-bottom: 120rpx;
}
/* 表单容器 */
.form-container {
padding: 30rpx;
}
.form-item {
background-color: #fff;
border-radius: 12rpx;
padding: 30rpx;
margin-bottom: 20rpx;
}
.form-label {
display: block;
font-size: 28rpx;
color: #333;
margin-bottom: 20rpx;
}
.form-input {
width: 100%;
font-size: 28rpx;
color: #333;
border: none;
outline: none;
}
.picker-input {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20rpx 0;
}
.picker-text {
font-size: 28rpx;
color: #333;
}
.picker-arrow {
font-size: 24rpx;
color: #999;
}
.checkbox-group {
display: flex;
flex-direction: column;
gap: 20rpx;
}
.checkbox-item {
display: flex;
align-items: center;
gap: 15rpx;
}
.checkbox {
width: 40rpx;
height: 40rpx;
border: 2rpx solid #ddd;
border-radius: 8rpx;
display: flex;
align-items: center;
justify-content: center;
background-color: #fff;
}
.checkbox.checked {
background-color: #8B2316;
border-color: #8B2316;
}
.checkbox-icon {
color: #fff;
font-size: 24rpx;
}
.checkbox-text {
font-size: 28rpx;
color: #333;
}
.form-textarea {
width: 100%;
min-height: 120rpx;
font-size: 28rpx;
color: #333;
border: none;
outline: none;
line-height: 1.5;
}
/* 底部按钮 */
.bottom-actions {
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: 30rpx;
background-color: #fff;
border-top: 1rpx solid #eee;
display: flex;
gap: 20rpx;
}
.save-btn {
flex: 1;
background-color: #6c757d;
border-radius: 12rpx;
padding: 25rpx;
text-align: center;
}
.publish-btn {
flex: 1;
background-color: #8B2316;
border-radius: 12rpx;
padding: 25rpx;
text-align: center;
}
.btn-text {
color: #fff;
font-size: 32rpx;
}
</style>

View File

@ -0,0 +1,825 @@
<template>
<view class="outpatient-page">
<!-- 导航栏 -->
<uni-nav-bar
left-icon="left"
title="出/停诊公告"
@clickLeft="goBack"
fixed
color="#8B2316"
height="140rpx"
:border="false"
backgroundColor="#eee"
>
<template #right>
<view class="nav-right">
<up-icon name="share" color="#8B2316" size="24"></up-icon>
<up-icon name="map" color="#8B2316" size="24" @click="goSite"></up-icon>
</view>
</template>
</uni-nav-bar>
<!-- 标签页 -->
<view class="tab-container">
<view class="tab-item" :class="{ active: currentTab === 'suspension' }" @click="switchTab('suspension')">
<text class="tab-text">停诊公告</text>
</view>
<view class="tab-divider"></view>
<view class="tab-item" :class="{ active: currentTab === 'outpatient' }" @click="switchTab('outpatient')">
<text class="tab-text">门诊安排</text>
</view>
</view>
<!-- 主内容区域 -->
<view class="content-area">
<!-- 停诊公告卡片 -->
<view v-if="currentTab === 'suspension'">
<view class="announcement-card" v-for="announcement in stopOutPatientList" :key="announcement.uuid">
<view class="card-header">
<view class="date-tag">
<view class="tag-dot"></view>
<text class="tag-date">{{ formatDate(announcement.expire_date) }}</text>
</view>
<view class="delete-btn" @click="deleteAnnouncement(announcement.uuid)">
<text class="delete-icon"></text>
</view>
</view>
<view class="card-content">
<view class="info-row">
<text class="info-label">停诊原因:</text>
<text class="info-value">{{ getStopReason(announcement.type) }}</text>
</view>
<view class="info-row">
<text class="info-label">停诊时间:</text>
<text class="info-value">{{ announcement.date_list[0]?.param1 }} ~ {{ announcement.date_list[0]?.param2 }}</text>
</view>
<view class="info-row remarks-row">
<text class="info-label">备注:</text>
<view class="remarks-input" v-if="announcement.note">{{ announcement.note }}</view>
</view>
</view>
</view>
<!-- 空状态 -->
<view v-if="stopOutPatientList.length === 0" class="empty-state">
<text class="empty-text">暂无停诊公告</text>
</view>
</view>
<!-- 门诊安排内容 -->
<view v-if="currentTab === 'outpatient'">
<view v-if="outPatientList.length > 0" class="schedule-list">
<!-- 门诊安排列表 -->
<view class="schedule-card" v-for="schedule in outPatientList" :key="schedule.uuid">
<view class="cell-content">
<view class="schedule-left">
<view class="weekday">{{ getWeekdayByWeek(schedule.week) }}</view>
<view class="time-period">{{ getTimePeriod(schedule.day) }}</view>
</view>
<view class="schedule-right">
<view class="hospital-info">
<text class="hospital-name">{{ schedule.hospital_name || '首都医科大学附属北京佑安医院' }}</text>
<view class="office-info">
<text class="office-name">{{ schedule.office_name || '肝病科' }}</text>
</view>
<view class="location-info">
<text class="location">{{ schedule.location || '北京' }}</text>
<view class="type-tag" v-if="schedule.type">
{{ getTypeText(schedule.type) }}
</view>
</view>
</view>
</view>
</view>
<view class="schedule-actions">
<view class="action-btn edit-btn" @click="editSchedule(schedule)">
<text class="action-icon"></text>
<text class="action-text">编辑</text>
</view>
<view class="action-btn delete-btn" @click="deleteSchedule(schedule.uuid)">
<text class="action-icon">🗑</text>
<text class="action-text">删除</text>
</view>
</view>
</view>
</view>
<view v-else class="empty-state">
<text class="empty-text">暂无门诊安排</text>
</view>
</view>
</view>
<!-- 底部操作按钮 -->
<view class="bottom-actions">
<view class="publish-btn" @click="currentTab === 'suspension' ? publishNew() : addSchedule()">
<text class="btn-text">{{ currentTab === 'suspension' ? '发布新的停诊' : '增加门诊安排' }}</text>
</view>
</view>
<!-- 浮动编辑按钮 -->
<view class="floating-edit-btn" @click="editAnnouncement">
<text class="edit-icon"></text>
</view>
</view>
</template>
<script setup>
import { ref, reactive } from 'vue'
import api from '@/api/api'
import {onShow,onUnload,onLoad} from '@dcloudio/uni-app'
import navTo from '@/utils/navTo'
const page=ref(1);
//
const currentTab = ref('suspension')
const remarks = ref('')
const note = ref('')
const outpatientSchedules = ref([])
const outPatientList = ref([]);
const getListOutPatient = async () => {
const res = await api.listOutPatient({
page:page.value,
});
if(res.code == 200){
outPatientList.value = res.data.list.list;
console.log(res.data.note)
note.value = res.data.note.note;
}
}
const stopOutPatientList = ref([]);
const getStopOutPatientList = async () => {
const res = await api.stopOutPatientList();
if(res.code == 200){
stopOutPatientList.value = res.data;
}
}
//
const formatDate = (timestamp) => {
if (!timestamp) return '';
const date = new Date(timestamp * 1000);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
}
const goSite = () => {
navTo({
url: '/pages_chat/addAddress/addAddress'
})
}
const getStopReason = (type) => {
const reasonMap = {
1: '出差',
2: '休假',
3: '临时安排',
4: '其他'
};
return reasonMap[type] || '其他';
}
//
const getWeekday = (date) => {
if (!date) return '周一';
const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
const d = new Date(date);
return weekdays[d.getDay()];
}
// week
const getWeekdayByWeek = (week) => {
const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
return weekdays[week] || '周一';
}
// day
const getTimePeriod = (day) => {
const timeMap = {
'a': '上午',
'p': '下午',
'd': '晚上'
};
return timeMap[day] || '晚上';
}
// type
const getTypeText = (type) => {
const typeMap = {
1: '普通门诊',
2: '专家门诊',
3: '特需门诊',
4: '专科/专病门诊'
};
return typeMap[type] || '普通门诊';
}
//
const goBack = () => {
uni.navigateBack({
delta: 1,
fail() {
uni.redirectTo({
url: '/pages/index/index'
})
}
})
}
const share = () => {
uni.showToast({
title: '分享功能',
icon: 'none'
})
}
const addNew = () => {
uni.showToast({
title: '添加新内容',
icon: 'none'
})
}
onLoad((options) => {
})
onShow(() => {
getStopOutPatientList();
getListOutPatient();
})
const switchTab = (tab) => {
currentTab.value = tab;
if(tab=='suspension'){
getStopOutPatientList();
}else{
getListOutPatient();
}
}
const deleteAnnouncement = async (uuid) => {
uni.showModal({
title: '确认删除',
content: '确定要删除这条停诊公告吗?',
success: async (res) => {
if (res.confirm) {
try {
const deleteRes = await api.deleteStopPatient({ uuid });
if (deleteRes.code === 200) {
uni.showToast({
title: '删除成功',
icon: 'none'
});
getStopOutPatientList();
} else {
uni.showToast({
title: deleteRes.msg || '删除失败',
icon: 'none'
});
}
} catch (error) {
uni.showToast({
title: '删除失败',
icon: 'none'
});
}
}
}
})
}
const publishNew = () => {
if(stopOutPatientList.value.length>=2){
uni.showToast({
title: '最多发布2条停诊公告',
icon: 'none'
})
return
}
//
navTo({
url: '/pages_chat/stopPatient/stopPatient'
})
}
const editAnnouncement = () => {
navTo({
url: '/pages_chat/note/note?note='+note.value
})
}
//
const refreshData = () => {
getListOutPatient();
getStopOutPatientList();
}
//
const addSchedule = () => {
navTo({
url: '/pages_chat/outManage/outManage'
})
}
const editSchedule = (schedule) => {
uni.navigateTo({
url: `/pages_chat/outManage/outManage?uuid=${schedule.uuid}&workplace_uuid=${schedule.workplace_uuid}&week=${schedule.week}&type=${schedule.type}`
})
}
const deleteSchedule = async (uuid) => {
uni.showModal({
title: '确认删除',
content: '确定要删除这条门诊安排吗?',
success: async (res) => {
if (res.confirm) {
try {
const deleteRes = await api.deleteOutPatient({ uuid });
if (deleteRes.code === 200) {
outPatientList.value = outPatientList.value.filter(item => item.uuid !== uuid);
uni.showToast({
title: '删除成功',
icon: 'none'
});
getListOutPatient();
} else {
uni.showToast({
title: deleteRes.msg || '删除失败',
icon: 'none'
});
}
} catch (error) {
uni.showToast({
title: '删除失败',
icon: 'none'
});
}
}
}
})
}
</script>
<style lang="scss" scoped>
.outpatient-page {
min-height: 100vh;
background-color: #f5f5f5;
position: relative;
}
/* 状态栏样式 */
.status-bar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20rpx 30rpx;
background-color: #fff;
font-size: 28rpx;
color: #333;
}
.status-right {
display: flex;
align-items: center;
gap: 10rpx;
}
.network-type {
font-size: 24rpx;
color: #666;
}
.signal-bars {
display: flex;
align-items: end;
gap: 2rpx;
margin: 0 10rpx;
}
.bar {
width: 4rpx;
background-color: #333;
border-radius: 1rpx;
}
.bar:nth-child(1) { height: 8rpx; }
.bar:nth-child(2) { height: 12rpx; }
.bar:nth-child(3) { height: 16rpx; }
.bar:nth-child(4) { height: 20rpx; }
.battery {
display: flex;
align-items: center;
}
.battery-text {
font-size: 24rpx;
color: #333;
}
/* 导航栏样式 */
.nav-bar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20rpx 30rpx;
background-color: #fff;
border-bottom: 1rpx solid #eee;
}
.nav-left {
width: 60rpx;
}
.back-arrow {
font-size: 50rpx;
color: #8B2316;
}
.nav-center {
flex: 1;
text-align: center;
}
.nav-title {
font-size: 34rpx;
color: #8B2316;
}
.nav-right {
display: flex;
align-items: center;
gap: 20rpx;
width: 60rpx;
justify-content: flex-end;
}
.nav-icon {
width: 40rpx;
height: 40rpx;
display: flex;
align-items: center;
justify-content: center;
}
.icon-share {
font-size: 32rpx;
color: #666;
}
.add-icon {
background-color: #8B2316;
border-radius: 50%;
}
.icon-add {
font-size: 28rpx;
color: #fff;
}
/* 标签页样式 */
.tab-container {
display: flex;
align-items: center;
background-color: #fff;
padding: 0 30rpx;
border-bottom: 1rpx solid #eee;
}
.tab-item {
flex: 1;
text-align: center;
padding: 30rpx 0;
position: relative;
}
.tab-item.active .tab-text {
color: #8B2316;
}
.tab-text {
font-size: 30rpx;
color: #666;
}
.tab-divider {
width: 2rpx;
height: 40rpx;
background-color: #ddd;
}
/* 主内容区域 */
.content-area {
padding: 30rpx;
min-height: calc(100vh - 400rpx);
}
/* 停诊公告卡片 */
.announcement-card {
background-color: #fff;
border-radius: 16rpx;
padding: 30rpx;
margin-bottom: 20rpx;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30rpx;
}
.date-tag {
display: flex;
align-items: center;
background-color: #20c997;
padding: 10rpx 20rpx;
border-radius: 20rpx;
gap: 10rpx;
}
.tag-dot {
width: 12rpx;
height: 12rpx;
background-color: #fff;
border-radius: 50%;
}
.tag-date {
color: #fff;
font-size: 24rpx;
}
.announcement-card .delete-btn {
width: 40rpx;
height: 40rpx;
background-color: #8B2316;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.delete-icon {
color: #fff;
font-size: 24rpx;
}
.card-content {
/* 卡片内容样式 */
display: flex;
flex-direction: column;
}
.info-row {
display: flex;
align-items: center;
margin-bottom: 20rpx;
}
.info-label {
font-size: 28rpx;
color: #333;
margin-right: 20rpx;
min-width: 120rpx;
}
.info-value {
font-size: 28rpx;
color: #666;
flex: 1;
}
.remarks-row {
align-items: flex-start;
}
.remarks-input {
flex: 1;
background-color: #fff;
border-radius: 8rpx;
font-size: 28rpx;
color: #333;
}
/* 空状态样式 */
.empty-state {
display: flex;
align-items: center;
justify-content: center;
height: 400rpx;
}
.empty-text {
font-size: 28rpx;
color: #999;
}
/* 门诊安排样式 */
.schedule-list {
display: flex;
flex-direction: column;
gap: 20rpx;
}
.schedule-card {
background-color: #fff;
border-radius: 12rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
gap: 30rpx;
}
.cell-content {
padding: 0 30rpx;
display: flex;
align-items: flex-start;
}
.schedule-left {
height: 200rpx;
border-right: 2rpx solid #f0f0f0;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
min-width: 120rpx;
}
.weekday {
font-size: 36rpx;
color: #333;
margin-bottom: 10rpx;
}
.time-period {
font-size: 24rpx;
color: #666;
}
.schedule-right {
flex: 1;
height: 200rpx;
margin-left: 30prx;
display: flex;
flex-direction: column;
justify-content: center;
}
.hospital-name {
font-size: 28rpx;
color: #333;
line-height: 1.4;
margin-bottom: 15rpx;
display: block;
}
.office-info {
margin-bottom: 15rpx;
}
.office-name {
font-size: 32rpx;
color: #333;
}
.location-info {
display: flex;
align-items: center;
gap: 15rpx;
}
.location {
font-size: 28rpx;
color: #666;
}
.price-info {
display: flex;
align-items: center;
gap: 15rpx;
}
.hospital-info {
padding-left: 30rpx;
}
.price {
font-size: 32rpx;
color: #333;
}
.type-tag {
background-color: transparent;
border: 2rpx solid #8B2316;
border-radius: 20rpx;
padding:2rpx 16rpx;
font-size: 20rpx;
color: #8B2316;
display: flex;
align-items: center;
justify-content: center;
}
.schedule-actions {
padding: 30rpx;
border-top: 2rpx solid #f0f0f0;
display: flex;
gap: 30rpx;
justify-content: flex-end;
}
.action-btn {
display: flex;
align-items: center;
gap: 8rpx;
padding: 10rpx 20rpx;
border-radius: 8rpx;
cursor: pointer;
}
.edit-btn {
white-space: nowrap;
background-color: #f8f9fa;
border: 1rpx solid #dee2e6;
}
.schedule-actions .delete-btn {
background-color: #fff5f5;
border: 1rpx solid #fed7d7;
}
.action-icon {
font-size: 24rpx;
}
.action-text {
white-space: nowrap;
font-size: 24rpx;
color: #666;
}
.edit-btn .action-text {
color: #495057;
}
.delete-btn .action-text {
color: #e74c3c;
}
/* 底部操作按钮 */
.bottom-actions {
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: 30rpx;
background-color: #fff;
border-top: 1rpx solid #eee;
}
.publish-btn {
background-color: #8B2316;
border-radius: 12rpx;
padding: 25rpx;
text-align: center;
}
.btn-text {
color: #fff;
font-size: 32rpx;
}
/* 浮动编辑按钮 */
.floating-edit-btn {
position: fixed;
bottom: 120rpx;
right: 30rpx;
width: 80rpx;
height: 80rpx;
background-color: #20c997;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4rpx 12rpx rgba(32, 201, 151, 0.3);
}
.edit-icon {
color: #fff;
font-size: 32rpx;
}
</style>

View File

@ -0,0 +1,258 @@
<template>
<view class="publish-page">
<!-- 导航栏 -->
<view class="nav-bar">
<view class="nav-left" @click="goBack">
<text class="back-arrow"></text>
</view>
<view class="nav-center">
<text class="nav-title">发布停诊公告</text>
</view>
<view class="nav-right">
<text class="save-btn" @click="saveAnnouncement">保存</text>
</view>
</view>
<!-- 表单内容 -->
<view class="form-container">
<view class="form-item">
<text class="form-label">停诊日期</text>
<picker mode="date" :value="formData.date" @change="onDateChange">
<view class="picker-input">
<text class="picker-text">{{ formData.date || '请选择日期' }}</text>
<text class="picker-arrow"></text>
</view>
</picker>
</view>
<view class="form-item">
<text class="form-label">停诊原因</text>
<input class="form-input" placeholder="请输入停诊原因" v-model="formData.reason" />
</view>
<view class="form-item">
<text class="form-label">开始时间</text>
<picker mode="date" :value="formData.startDate" @change="onStartDateChange">
<view class="picker-input">
<text class="picker-text">{{ formData.startDate || '请选择开始时间' }}</text>
<text class="picker-arrow"></text>
</view>
</picker>
</view>
<view class="form-item">
<text class="form-label">结束时间</text>
<picker mode="date" :value="formData.endDate" @change="onEndDateChange">
<view class="picker-input">
<text class="picker-text">{{ formData.endDate || '请选择结束时间' }}</text>
<text class="picker-arrow"></text>
</view>
</picker>
</view>
<view class="form-item">
<text class="form-label">备注信息</text>
<textarea class="form-textarea" placeholder="请输入备注信息" v-model="formData.remarks" />
</view>
</view>
<!-- 底部按钮 -->
<view class="bottom-actions">
<view class="publish-btn" @click="publishAnnouncement">
<text class="btn-text">发布公告</text>
</view>
</view>
</view>
</template>
<script setup>
import { reactive } from 'vue'
//
const formData = reactive({
date: '',
reason: '',
startDate: '',
endDate: '',
remarks: ''
})
//
const goBack = () => {
uni.navigateBack()
}
const onDateChange = (e) => {
formData.date = e.detail.value
}
const onStartDateChange = (e) => {
formData.startDate = e.detail.value
}
const onEndDateChange = (e) => {
formData.endDate = e.detail.value
}
const saveAnnouncement = () => {
// 稿
uni.showToast({
title: '保存成功',
icon: 'none'
})
}
const publishAnnouncement = () => {
if (!formData.date || !formData.reason) {
uni.showToast({
title: '请填写必要信息',
icon: 'none'
})
return
}
uni.showModal({
title: '确认发布',
content: '确定要发布这条停诊公告吗?',
success: (res) => {
if (res.confirm) {
//
uni.showToast({
title: '发布成功',
icon: 'none'
})
setTimeout(() => {
uni.navigateBack()
}, 1500)
}
}
})
}
</script>
<style lang="scss" scoped>
.publish-page {
min-height: 100vh;
background-color: #f5f5f5;
}
/* 导航栏样式 */
.nav-bar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20rpx 30rpx;
background-color: #fff;
border-bottom: 1rpx solid #eee;
}
.nav-left {
width: 60rpx;
}
.back-arrow {
font-size: 50rpx;
color: #e74c3c;
font-weight: bold;
}
.nav-center {
flex: 1;
text-align: center;
}
.nav-title {
font-size: 34rpx;
color: #e74c3c;
font-weight: bold;
}
.nav-right {
width: 60rpx;
text-align: right;
}
.save-btn {
font-size: 28rpx;
color: #e74c3c;
}
/* 表单容器 */
.form-container {
padding: 30rpx;
}
.form-item {
background-color: #fff;
border-radius: 12rpx;
padding: 30rpx;
margin-bottom: 20rpx;
}
.form-label {
display: block;
font-size: 28rpx;
color: #333;
margin-bottom: 20rpx;
font-weight: bold;
}
.form-input {
width: 100%;
font-size: 28rpx;
color: #333;
border: none;
outline: none;
}
.picker-input {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20rpx 0;
}
.picker-text {
font-size: 28rpx;
color: #333;
}
.picker-arrow {
font-size: 24rpx;
color: #999;
}
.form-textarea {
width: 100%;
min-height: 120rpx;
font-size: 28rpx;
color: #333;
border: none;
outline: none;
line-height: 1.5;
}
/* 底部按钮 */
.bottom-actions {
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: 30rpx;
background-color: #fff;
border-top: 1rpx solid #eee;
}
.publish-btn {
background-color: #c0392b;
border-radius: 12rpx;
padding: 25rpx;
text-align: center;
}
.btn-text {
color: #fff;
font-size: 32rpx;
font-weight: bold;
}
</style>

View File

@ -17,7 +17,7 @@
</template>
</uni-nav-bar>
<!-- 筛选排序栏 -->
<view class="filter-sort-bar">
<!-- <view class="filter-sort-bar">
<view class="sort-section" @click="toggleGroupSort">
<text class="sort-label">{{ groupSortTitle }}</text>
<view class="imgbox">
@ -31,7 +31,7 @@
<up-image :src="upImg" width="26rpx" height="26rpx" ></up-image>
</view>
</view>
</view>
</view> -->
<!-- 分组排序弹窗 -->
<view v-if="showGroupSort" class="popup-panel">
@ -578,7 +578,7 @@ const clearSelection = () => {
}
.patient-list-section {
top: 240rpx;
top: 140rpx;
width:100%;
bottom:120rpx; //
position: fixed;

View File

@ -65,6 +65,7 @@
<script setup>
import { ref, onMounted, getCurrentInstance } from 'vue'
import { onLoad,onShow} from '@dcloudio/uni-app'
// @ts-ignore
const delUuid=ref('');
import UniPopup from '@/components/uni-components/uni-popup/components/uni-popup/uni-popup.vue'
@ -87,7 +88,12 @@
// @ts-ignore
popupRef.value && popupRef.value.open('center')
}
onShow(() => {Confirm
getQuickReplyList()
})
onload(() => {
getQuickReplyList()
})
const onSelect = (text) => {
uni.$emit('quickReply', text);
uni.navigateBack()
@ -156,7 +162,6 @@
onCancel()
}
onMounted(() => {})
</script>
<style scoped lang="scss">

View File

@ -299,7 +299,7 @@
await polularScienceArticleListByKeywordsNew(true);
uni.showToast({
title: '刷新成功',
icon: 'success',
icon: 'none',
duration: 1500
});
};

View File

@ -0,0 +1,139 @@
<template>
<view class="stop-page">
<navBar :title="title" />
<view class="content-area">
<!-- 停诊原因 -->
<view class="form-section">
<view class="section-title">
<text class="title-text">停诊原因</text>
<text class="required">*</text>
</view>
<view class="reason-row">
<view class="reason-btn" :class="{active: reason===1}" @click="selectReason(1)">出差</view>
<view class="reason-btn" :class="{active: reason===2}" @click="selectReason(2)">休假</view>
<view class="reason-btn" :class="{active: reason===3}" @click="selectReason(3)">临时安排</view>
<view class="reason-btn" :class="{active: reason===4}" @click="selectReason(4)">其他</view>
</view>
</view>
<!-- 停诊时间 -->
<view class="form-section">
<view class="section-head">
<view class="section-title">
<text class="title-text">停诊时间</text>
<text class="required">*</text>
</view>
<view class="add-more" @click="addRange">+ 再次添加</view>
</view>
<view class="range-list">
<view class="range-row" v-for="(item,idx) in ranges" :key="idx">
<uni-datetime-picker type="daterange" value="item" :start="start" @change="(e)=>handleChange(e,idx)" />
<uni-icons type="minus" size="30" color="#8B2316" @click="removeRange(idx)" v-if="idx > 0"></uni-icons>
</view>
</view>
</view>
<!-- 备注 -->
<view class="form-section">
<view class="section-title"><text class="title-text">备注</text></view>
<view class="remark-box">
<textarea v-model="remark" class="remark" maxlength="300" :placeholder="remarkPh"/>
<!-- <view class="voice-btn" @click="recordVoice">🎤</view> -->
</view>
</view>
</view>
<view class="bottom-actions">
<view class="confirm-btn" @click="submit">
<text class="btn-text">确定发布</text>
</view>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue'
import { onShow } from '@dcloudio/uni-app'
import navBar from '@/components/navBar/navBar.vue'
import api from '@/api/api'
const title = ref('发布停诊')
const reason = ref(1)
const ranges = ref([[]])
const remark = ref('')
const remarkPh = '您可以在这里填写想告诉患者的停诊补充信息最多填写300个字哦~'
const start = ref(new Date().getTime())
const end = ref( Date.now()+10*365*24*3600*1000)
const selectReason = (val) => { reason.value = val }
const addRange = () => { ranges.value.push([]) }
const handleChange = (e,idx) => {
console.log(e)
ranges.value[idx] =e;
}
const addStopPatient = async () => {
let date_arr=[]
ranges.value.forEach(item=>{
date_arr.push({
param1:item[0],
param2:item[1]
})
})
const res = await api.addStopPatient({
type: reason.value,
date_list: date_arr,
note: remark.value
})
if(res.code==200){
uni.showToast({ title: '发布成功', icon: 'none' })
uni.navigateBack()
}
}
const recordVoice = () => {
uni.showToast({ title: '语音录入(示意)', icon: 'none' })
}
const submit = () => {
console.log(ranges.value)
const invalid = ranges.value.some(r => r.length==0)
if (invalid) {
uni.showToast({ title: '请选择停诊起止时间', icon: 'none' })
return
}
addStopPatient()
}
</script>
<style lang="scss" scoped>
.stop-page { min-height: 100vh; background: #fff; }
.content-area { padding: 30rpx; }
.form-section { margin-bottom: 40rpx; }
.section-head { display: flex; justify-content: space-between; align-items: center; }
.section-title { display: flex; align-items: center; margin-bottom: 20rpx; }
.title-text { font-size: 32rpx; color: #8B2316; font-weight: 600; }
.required { color: #8B2316; margin-left: 6rpx; font-size: 28rpx; }
.reason-row { display: flex; gap: 20rpx; flex-wrap: wrap; }
.reason-btn { flex: 1; text-align: center; height: 80rpx; line-height: 80rpx; border: 2rpx solid #ddd; border-radius: 10rpx; color: #666; }
.reason-btn.active { border-color: #8B2316; color: #8B2316; background: url('@/static/addoutpa_true.png') right bottom/39rpx 39rpx no-repeat; }
.add-more { color: #8B2316; font-size: 28rpx; }
.range-row { display: flex; align-items: center; gap: 20rpx; margin-bottom: 20rpx; }
.date-input { flex: 1; height: 80rpx; border: 2rpx solid #ddd; border-radius: 10rpx; display: flex; align-items: center; padding: 0 24rpx; color: #333; }
.placeholder { color: #999; }
.to-text { color: #666; }
.remark-box { position: relative; }
.remark { width: 100%; min-height: 220rpx; background: #f2f2f2; border-radius: 10rpx; padding: 20rpx; color: #333; }
.voice-btn { position: absolute; right: 20rpx; bottom: 20rpx; width: 88rpx; height: 88rpx; border-radius: 50%; background: #8B2316; display: flex; align-items: center; justify-content: center; color: #fff; font-size: 40rpx; }
.bottom-actions { position: fixed; left: 0; right: 0; bottom: 0; background: #fff; padding: 30rpx; border-top: 1rpx solid #eee; }
.confirm-btn { background: #8B2316; border-radius: 12rpx; padding: 24rpx 0; text-align: center; }
.btn-text { color: #fff; font-size: 32rpx; font-weight: 600; }
</style>

View File

@ -616,7 +616,7 @@ const submitReply = (reviewId) => {
uni.showToast({
title: '回复成功',
icon: 'success'
icon: 'none'
})
}
})

View File

@ -238,7 +238,7 @@ const confirmPayment = () => {
payParams,
//
(res) => {
uni.showToast({ title: '支付成功', icon: 'success' })
uni.showToast({ title: '支付成功', icon: 'none' })
//
},
//

View File

@ -140,7 +140,7 @@ const submitReview = () => {
uni.hideLoading()
uni.showToast({
title: '评价提交成功',
icon: 'success'
icon: 'none'
})
}
uni.navigateBack()

View File

@ -176,7 +176,7 @@ const downloadInvoice = () => {
if (res.statusCode === 200) {
uni.showToast({
title: '下载成功',
icon: 'success'
icon: 'none'
})
//

View File

@ -162,7 +162,7 @@ export default {
if (res.confirm) {
uni.showToast({
title: '提交成功',
icon: 'success'
icon: 'none'
})
//

View File

@ -217,7 +217,7 @@ const copyOrderNumber = (orderNumber) => {
success: () => {
uni.showToast({
title: '订单号已复制',
icon: 'success'
icon: 'none'
})
}
})
@ -417,7 +417,7 @@ const payExcellencourseOrderContinue = (order) => {
payParams,
//
(res) => {
uni.showToast({ title: '支付成功', icon: 'success' })
uni.showToast({ title: '支付成功', icon: 'none' })
//
getOrderList()
},
@ -456,7 +456,7 @@ const cancelExcellencourseOrder = (order) => {
if (res.code == 200) {
uni.showToast({
title: '订单已取消',
icon: 'success',
icon: 'none',
duration: 2000
})
//

View File

@ -85,7 +85,7 @@ const goExchange = (item) => {
api.pointTicketExchange({uuid: item.uuid}).then(res => {
console.log(res)
if (res.code === 200 || res.code === '200') {
uni.showToast({ title: '兑换成功', icon: 'success' })
uni.showToast({ title: '兑换成功', icon: 'none' })
getPointTicketList()
}
})

View File

@ -198,7 +198,7 @@ const submit = () => {
list.unshift(address)
}
uni.setStorageSync(STORAGE_KEY, list)
uni.showToast({ title: '提交成功', icon: 'success' })
uni.showToast({ title: '提交成功', icon: 'none' })
setTimeout(() => { uni.navigateBack() }, 500)
}
</script>

View File

@ -67,7 +67,7 @@ const remove = (item) => {
const select = (item) => {
uni.setStorageSync(SELECTED_KEY, item)
uni.showToast({ title: '已选择该地址', icon: 'success' })
uni.showToast({ title: '已选择该地址', icon: 'none' })
setTimeout(() => uni.navigateBack(), 300)
}
</script>

View File

@ -147,7 +147,7 @@ const goAddress = () => {
goods_api.createGoodsOrder(data).then(res => {
console.log(res)
if (res.code == 200) {
uni.showToast({ title: '兑换成功', icon: 'success' })
uni.showToast({ title: '兑换成功', icon: 'none' })
uni.navigateBack()
} else {
uni.showToast({ title: res.msg, icon: 'none' })

BIN
static/addoutpa_true.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -133,13 +133,18 @@ export const request = (url, data = {}, method = 'post', loading = false, conten
})
n(res)
} else {
uni.showToast({
title: res.data.message,
icon: 'none',
});
n(res)
if(url.indexOf('addOutPatientA')!=-1){
e(res.data)
}else{
uni.showToast({
title: res.data.message,
icon: 'none'
});
n(res)
}
}
},
fail: function(err) {