3.9提交

This commit is contained in:
zoujiandong 2026-03-09 18:59:27 +08:00
parent 1fa822ed72
commit 40f5ddf4a5
28 changed files with 841 additions and 219 deletions

View File

@ -2,7 +2,7 @@
<view class="emptybox"> <view class="emptybox">
<view class="empty-image-wrap" :style="imageWrapStyle"> <view class="empty-image-wrap" :style="imageWrapStyle">
<up-image <up-image
:src="props.emptyImg || emptyImg" :src="emptyImage || emptyImg"
:width="renderWidth" :width="renderWidth"
:height="renderHeight" :height="renderHeight"
:mode="imgMode" :mode="imgMode"
@ -16,7 +16,7 @@
import { computed } from 'vue'; import { computed } from 'vue';
import emptyImg from "@/static/icon_empty.png" import emptyImg from "@/static/icon_empty.png"
const props = defineProps({ const props = defineProps({
emptyImg: { emptyImage: {
type: String, type: String,
default: '' default: ''
}, },

View File

@ -1698,7 +1698,7 @@
"list": [ "list": [
{ {
"name": "", "name": "",
"path": "/pages_app/myAccount/myAccount", "path": "pages_chat/outPatient/outPatient",
"query": "" "query": ""
} }
] ]

View File

@ -8,12 +8,12 @@
<!-- 反馈输入区域 --> <!-- 反馈输入区域 -->
<view class="feedback-input-container"> <view class="feedback-input-container">
<view class="input-area"> <view class="input-area">
<text class="input-placeholder" v-show="!feedbackText">欢迎对我们的软件提供建议,帮助我们更好更快的改进"肝胆相照"APP (200字以内)</text> <!-- <text class="input-placeholder" v-show="!feedbackText">欢迎对我们的软件提供建议,帮助我们更好更快的改进"肝胆相照"APP (200字以内)</text> -->
<textarea <textarea
class="feedback-textarea" class="feedback-textarea"
v-model="feedbackText" v-model="feedbackText"
:maxlength="200" :maxlength="200"
placeholder="" placeholder="尊敬的医生您好,若在交流过程中发现患者发布不适当内容,请您及时填写相关信息,我们将第一时间处理,谢谢您的支持。"
@input="onInput" @input="onInput"
></textarea> ></textarea>
<!-- <view class="voice-button" @click="toggleVoiceInput"> <!-- <view class="voice-button" @click="toggleVoiceInput">
@ -24,7 +24,7 @@
<!-- 底部提交按钮 --> <!-- 底部提交按钮 -->
<view class="submit-container"> <view class="submit-container">
<button class="submit-btn" @click="submitFeedback" :disabled="!feedbackText.trim()"> <button class="submit-btn" @click="submitFeedback" >
提交 提交
</button> </button>
</view> </view>
@ -200,10 +200,10 @@
.submit-btn { .submit-btn {
width: 100%; width: 100%;
height: 88rpx; height: 88rpx;
background-color: #ffffff; background-color: #fff;
border: 2rpx solid #e0e0e0; border: 2rpx solid #8B2316;
border-radius: 8rpx; border-radius: 8rpx;
color: #ff0000; color: #8B2316;
font-size: 32rpx; font-size: 32rpx;
font-weight: 500; font-weight: 500;
display: flex; display: flex;

View File

@ -32,9 +32,7 @@
<view class="section-header">分组成员</view> <view class="section-header">分组成员</view>
<view class="add-member" @click="addMember"> <view class="add-member" @click="addMember">
<view class="add-circle"> <up-image :src="addImg" width="120rpx" height="120rpx" />
<up-icon name="plus" size="34" color="#bfbfbf" />
</view>
<text class="add-text">添加组患者</text> <text class="add-text">添加组患者</text>
</view> </view>
<!-- 已选中的成员 --> <!-- 已选中的成员 -->
@ -68,6 +66,7 @@
import navTo from '@/utils/navTo.js' import navTo from '@/utils/navTo.js'
import docUrl from '@/utils/docUrl.js' import docUrl from '@/utils/docUrl.js'
import delImg from "@/static/iv_delete.png" import delImg from "@/static/iv_delete.png"
import addImg from "@/static/addpatient.png"
import api from '@/api/api.js' import api from '@/api/api.js'
import unidialog from '@/components/dialog/dialog.vue' import unidialog from '@/components/dialog/dialog.vue'
const groupUuid = ref('') const groupUuid = ref('')
@ -208,13 +207,13 @@
padding-bottom: 160rpx; padding-bottom: 160rpx;
} }
.save-text{ .save-text{
background:#8B2316; color:#8B2316;
font-size: 30rpx; font-size: 30rpx;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
padding: 15rpx 25rpx; padding: 15rpx 25rpx;
color:#fff;
border-radius: 12rpx; border-radius: 12rpx;
} }

View File

@ -1,6 +1,6 @@
<template> <template>
<view class="group-manage-page"> <view class="group-manage-page">
<view class="nabox"> <view class="navbox">
<view class="status_bar"></view> <view class="status_bar"></view>
<uni-nav-bar <uni-nav-bar
left-icon="left" left-icon="left"
@ -31,7 +31,7 @@
<!-- 所有分组 --> <!-- 所有分组 -->
<view class="all-groups-section"> <view class="all-groups-section">
<view class="section-title">所有分组(选择分组)</view> <view class="section-title"><text calss="red">所有分组</text>(选择分组)</view>
<view class="tag-list"> <view class="tag-list">
<view <view
class="tag-item" class="tag-item"
@ -170,7 +170,7 @@ const saveGroups = () => {
margin-top: calc(var(--status-bar-height) + 44px); margin-top: calc(var(--status-bar-height) + 44px);
min-height: 300rpx; min-height: 300rpx;
padding: 30rpx; padding: 30rpx;
border-bottom: 1rpx solid #f0f0f0; border-bottom: 20rpx solid #f0f0f0;
} }
.all-groups-section { .all-groups-section {
@ -178,9 +178,12 @@ const saveGroups = () => {
} }
.section-title { .section-title {
font-size: 28rpx; font-size: 30rpx;
color: #666; color: #999;
margin-bottom: 20rpx; margin-bottom: 20rpx;
.red{
color: #8b2316;
}
} }
.tag-list { .tag-list {

View File

@ -7,7 +7,8 @@
left-icon="left" left-icon="left"
title="常用银行卡" title="常用银行卡"
@clickLeft="goBack" @clickLeft="goBack"
right-text="添加" right-icon="plusempty"
right-icon-color="#8B2316"
@clickRight="addBankCard" @clickRight="addBankCard"
color="#8B2316" color="#8B2316"
@ -27,6 +28,7 @@
> >
<template v-slot:right> <template v-slot:right>
<view class="swipe-right"> <view class="swipe-right">
<view class="card-delete-btn" @click.stop="handleDeleteBankCard(card)">删除</view> <view class="card-delete-btn" @click.stop="handleDeleteBankCard(card)">删除</view>
</view> </view>
</template> </template>
@ -50,7 +52,11 @@
</uni-swipe-action-item> </uni-swipe-action-item>
</uni-swipe-action> </uni-swipe-action>
</view> </view>
<empty v-if="bankCards.length === 0" imgWidth="50%" empty-img="/static/empty_bank.png" empty-desc="使用常用卡,支付更快捷"></empty> <view class="empty-container" v-if="bankCards.length === 0">
<image :src="emptyBankImg" class="empty-image"></image>
<text class="empty-text">使用常用卡支付更快捷</text>
</view>
<!-- <empty v-if="bankCards.length === 0" :imgWidth="'218rpx'" :imgHeight="'164rpx'" :emptyImage="emptyBankImg" emptyDesc="使用常用卡,支付更快捷"></empty> -->
<!-- 底部导航指示器 --> <!-- 底部导航指示器 -->
<view class="bottom-indicator"></view> <view class="bottom-indicator"></view>
@ -62,6 +68,7 @@ import { ref, onMounted } from 'vue';
import navTo from '@/utils/navTo'; import navTo from '@/utils/navTo';
import api from '@/api/api'; import api from '@/api/api';
import empty from "@/components/empty/empty.vue" import empty from "@/components/empty/empty.vue"
import emptyBankImg from "@/static/empty_bank.png"
const bankCards = ref([]); const bankCards = ref([]);
const openedSwipeUuid = ref(''); const openedSwipeUuid = ref('');
import { onLoad,onBackPress } from '@dcloudio/uni-app'; import { onLoad,onBackPress } from '@dcloudio/uni-app';
@ -199,6 +206,23 @@ onMounted(() => {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.empty-container {
height:800rpx;
min-width:600rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
.empty-image {
width: 218rpx;
height: 164rpx;
}
.empty-text {
margin-top: 20rpx;
font-size: 30rpx;
color: #999;
}
}
.bank-card-page { .bank-card-page {
min-height: 100vh; min-height: 100vh;
background: #F5F5F5; background: #F5F5F5;
@ -241,6 +265,7 @@ onMounted(() => {
border-radius: 16rpx; border-radius: 16rpx;
padding: 30rpx; padding: 30rpx;
display: flex; display: flex;
margin-bottom: 20rpx;
align-items: center; align-items: center;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);

View File

@ -366,15 +366,16 @@ const onConfirmSms = async () => {
}); });
if (res.code === 200) { if (res.code === 200) {
uni.showToast({ title: '银行卡添加成功', icon: 'none' }); uni.showToast({ title: '银行卡添加成功', icon: 'none' });
if (returnTo.value) { uni.navigateBack();
uni.redirectTo({ // if (returnTo.value) {
url: returnTo.value // uni.redirectTo({
}); // url: returnTo.value
} else { // });
navTo({ // } else {
url: '/pages_app/idcardAuth/bankCardList' // navTo({
}); // url: '/pages_app/idcardAuth/bankCardList'
} // });
// }
} else { } else {
uni.showToast({ title: res.msg || '银行卡添加失败', icon: 'none' }); uni.showToast({ title: res.msg || '银行卡添加失败', icon: 'none' });
} }
@ -599,7 +600,7 @@ const onCancelSms = () => {
box-sizing: border-box; box-sizing: border-box;
&.card-number-input.is-filled { &.card-number-input.is-filled {
font-weight: 600; font-weight: normal;
} }
} }

View File

@ -13,6 +13,7 @@
></uni-nav-bar> ></uni-nav-bar>
</view> </view>
<view class="contentbox">
<!-- 账户余额区域 --> <!-- 账户余额区域 -->
<view class="account-summary"> <view class="account-summary">
<view class="profile-section"> <view class="profile-section">
@ -61,9 +62,10 @@
<uni-icons type="right" size="25" color="#999"></uni-icons> <uni-icons type="right" size="25" color="#999"></uni-icons>
</view> </view>
</view> </view>
</view>
<!-- 底部指示器 --> <!-- 底部指示器 -->
<view class="bottom-indicator"></view> <!-- <view class="bottom-indicator"></view> -->
</view> </view>
</template> </template>
@ -73,7 +75,7 @@ import api from '@/api/api.js'
import docUrl from '@/utils/docUrl' import docUrl from '@/utils/docUrl'
import withdrawalsIcon from '@/static/withdrawals.png' import withdrawalsIcon from '@/static/withdrawals.png'
import accountIcon from '@/static/account_icon.png' import accountIcon from '@/static/account_icon.png'
import { onLoad,onBackPress } from '@dcloudio/uni-app'; import { onLoad,onBackPress,onShow } from '@dcloudio/uni-app';
const from = ref(''); const from = ref('');
onLoad((options) => { onLoad((options) => {
if(options.from){ if(options.from){
@ -93,7 +95,7 @@ const withdrawalBalanceFee = ref(0)
const lessWithdrawalBalance = ref(0) const lessWithdrawalBalance = ref(0)
const avatar = ref('') const avatar = ref('')
onMounted(() => { onShow(() => {
getMyAccount() getMyAccount()
let userInfo= uni.getStorageSync('userInfo') let userInfo= uni.getStorageSync('userInfo')
@ -164,6 +166,14 @@ const getMyAccount = async () => {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.contentbox{
position: fixed;
top: calc(var(--status-bar-height) + 44px);
left: 0;
right: 0;
bottom: 0;
}
.my-account-page { .my-account-page {
background-color: #f5f5f5; background-color: #f5f5f5;
min-height: 100vh; min-height: 100vh;
@ -172,13 +182,11 @@ const getMyAccount = async () => {
// //
.account-summary { .account-summary {
margin-top: calc(var(--status-bar-height) + 44px);
background: linear-gradient(135deg, #8B2316, #A0522D); background: linear-gradient(135deg, #8B2316, #A0522D);
// margin: 30rpx; // margin: 30rpx;
// border-radius: 20rpx; // border-radius: 20rpx;
padding: 30rpx 40rpx 10rpx; padding: 30rpx 40rpx 10rpx;
text-align: center; text-align: center;
box-shadow: 0 8rpx 24rpx rgba(139, 35, 22, 0.3);
position: relative; position: relative;
.profile-section { .profile-section {

View File

@ -29,7 +29,7 @@
</view> </view>
<view class="info-row"> <view class="info-row">
<text class="info-label">支付方式</text> <text class="info-label">支付方式</text>
<text class="info-value">{{ detail.payType || "--" }}</text> <text class="info-value">{{ detail.payType}}</text>
</view> </view>
<view class="info-row"> <view class="info-row">
<text class="info-label">支付时间</text> <text class="info-label">支付时间</text>
@ -77,7 +77,7 @@ const formatAmount = (value) => {
if (value === undefined || value === null || value === "") return ""; if (value === undefined || value === null || value === "") return "";
const num = Number(value); const num = Number(value);
if (Number.isNaN(num)) return ""; if (Number.isNaN(num)) return "";
const amount = num > 1000 ? num / 100 : num; const amount = num / 100;
return `${amount.toFixed(2)}`; return `${amount.toFixed(2)}`;
}; };
@ -90,13 +90,15 @@ const formatStatus = (raw) => {
}; };
const formatPayType = (raw) => { const formatPayType = (raw) => {
if (raw === undefined || raw === null || raw === "") return "免费"; if(raw=='balance'){
const text = String(raw).toLowerCase(); return '余额支付';
if (text === "0" || text === "free") return "免费"; }else if(raw=='FREE'){
if (text === "1" || text.includes("wx") || text.includes("wechat")) return "微信"; return '免费'
if (text === "2" || text.includes("ali")) return "支付宝"; }else if(raw=='USEWELFARENUM'){
if (text === "3" || text.includes("balance")) return "余额"; return '免费次数';
return String(raw); }else if(raw=='wx'){
return '微信支付';
}
}; };
const fetchCoursewareDetail = async () => { const fetchCoursewareDetail = async () => {
@ -115,10 +117,11 @@ const fetchCoursewareDetail = async () => {
author: data.provider_name || data.author || data.nickname || "", author: data.provider_name || data.author || data.nickname || "",
amountText: formatAmount(data.pay_amount || data.total_fee || data.amount || data.price || 0), amountText: formatAmount(data.pay_amount || data.total_fee || data.amount || data.price || 0),
createTime: formatDateTime(data.create_date || data.create_time || data.order_time || ""), createTime: formatDateTime(data.create_date || data.create_time || data.order_time || ""),
payType: formatPayType(data.pay_type_name || data.pay_type || data.payment_method || ""), payType: formatPayType(data.pay_channel),
payTime: formatDateTime(data.pay_date || data.pay_time || ""), payTime: formatDateTime(data.pay_date || data.pay_time || ""),
}; };
} catch (error) { } catch (error) {
uni.showToast({ uni.showToast({
title: "获取详情失败", title: "获取详情失败",
icon: "none", icon: "none",
@ -152,8 +155,8 @@ onLoad((options) => {
} }
.download-no { .download-no {
font-size: 32rpx; font-size: 30rpx;
color: #333; color: #000;
} }
.pay-status { .pay-status {
@ -192,8 +195,8 @@ onLoad((options) => {
} }
.info-label { .info-label {
font-size: 18rpx; font-size: 30rpx;
color: #333; color: #000;
} }
.info-value { .info-value {

View File

@ -49,12 +49,15 @@
<scroll-view <scroll-view
scroll-y scroll-y
class="courseware-list" class="courseware-list"
:scroll-top="listScrollTop"
:scroll-into-view="scrollIntoViewId"
refresher-enabled refresher-enabled
@refresherrefresh="onRefresh" @refresherrefresh="onRefresh"
:refresher-triggered="refreshing" :refresher-triggered="refreshing"
@scrolltolower="onLoadMore" @scrolltolower="onLoadMore"
:lower-threshold="100" :lower-threshold="100"
> >
<view id="courseware-top"></view>
<!-- 空状态 --> <!-- 空状态 -->
<view v-if="coursewareList.length === 0 && !loading" class="empty-state"> <view v-if="coursewareList.length === 0 && !loading" class="empty-state">
<text>{{ activeTab === 'download' ? '暂无下载数据' : '暂无分享数据' }}</text> <text>{{ activeTab === 'download' ? '暂无下载数据' : '暂无分享数据' }}</text>
@ -62,21 +65,22 @@
<view class="courseware-item" v-for="(item, index) in coursewareList" :key="index" @click="onItemClick(item)"> <view class="courseware-item" v-for="(item, index) in coursewareList" :key="index" @click="onItemClick(item)">
<view class="item-content"> <view class="item-content">
<view class="courseware-provider" v-if="activeTab === 'share'">
<text class="label">下载医生:</text>
<text class="value">{{ item.providername }}</text>
</view>
<view class="courseware-name"> <view class="courseware-name">
<text class="label">课件名称:</text> <text class="label">课件名称:</text>
<text class="value">{{ item.name }}</text> <text class="value">{{ item.name }}</text>
</view> </view>
<view class="courseware-provider" v-if="item.providername">
<text class="label">{{ activeTab === 'download' ? '提供者' : '下载者' }}:</text>
<text class="value">{{ item.providername }}</text>
</view>
<view class="courseware-time"> <view class="courseware-time">
<text class="label">时间:</text> <text class="label">时间:</text>
<text class="value">{{ item.time }}</text> <text class="value">{{ item.time }}</text>
</view> </view>
<view class="courseware-status" v-if="activeTab === 'download'"> <view class="courseware-status" v-if="activeTab === 'download'">
<text class="label">状态:</text> <text class="label">状态:</text>
<text class="value status-paid">{{ item.status }}</text> <text class="value status-paid">{{item.status}}</text>
</view> </view>
</view> </view>
</view> </view>
@ -95,13 +99,15 @@
</template> </template>
<script setup> <script setup>
import { ref, onMounted } from 'vue'; import { ref, onMounted, nextTick } from 'vue';
import api from '@/api/api'; import api from '@/api/api';
import navTo from '@/utils/navTo.js'; import navTo from '@/utils/navTo.js';
import { onLoad,onBackPress } from '@dcloudio/uni-app'; import { onLoad,onBackPress } from '@dcloudio/uni-app';
import downLoadImg from "@/static/course_download.png" import downLoadImg from "@/static/course_download.png"
import moneyImg from "@/static/course_yuan.png" import moneyImg from "@/static/course_yuan.png"
const activeTab = ref('download'); const activeTab = ref('download');
const listScrollTop = ref(0);
const scrollIntoViewId = ref('');
const refreshing = ref(false); const refreshing = ref(false);
const loading = ref(false); const loading = ref(false);
const noMore = ref(false); const noMore = ref(false);
@ -126,7 +132,16 @@ onLoad((options) => {
onMounted(() => { onMounted(() => {
onRefresh(); onRefresh();
}); });
const getStatusText = (status) => {
console.log(status);
if(status === 'paid'){
return '已支付';
}else if(status === 'unpaid'){
return '未支付';
}else{
return '已分享';
}
};
const goBack = () => { const goBack = () => {
if(!from.value){ if(!from.value){
plus.runtime.quit(); plus.runtime.quit();
@ -143,6 +158,11 @@ onLoad((options) => {
}) })
const switchTab = (tab) => { const switchTab = (tab) => {
activeTab.value = tab; activeTab.value = tab;
listScrollTop.value = 0;
scrollIntoViewId.value = '';
nextTick(() => {
scrollIntoViewId.value = 'courseware-top';
});
// //
page.value = 1; page.value = 1;
noMore.value = false; noMore.value = false;
@ -182,7 +202,7 @@ const onRefresh = () => {
uuid: item.uuid, uuid: item.uuid,
order_id: item.order_id, order_id: item.order_id,
type: item.type, type: item.type,
providername: item.providername providername: item.downloadername
})); }));
// //
@ -354,7 +374,7 @@ const onLoadMore = () => {
.courseware-list { .courseware-list {
// height: calc(100vh - 180rpx - 116rpx - 80rpx); // height: calc(100vh - 180rpx - 116rpx - 80rpx);
position: fixed; position: fixed;
top: 336rpx; // top: calc(var(--status-bar-height) + 44px + 124rpx + 80rpx); //
bottom: 0; bottom: 0;
width: 100%; width: 100%;
} }

View File

@ -83,10 +83,14 @@ import emptyImg from "@/static/icon_empty.png"
import api from '@/api/api.js'; import api from '@/api/api.js';
import { onBackPress,onLoad } from '@dcloudio/uni-app'; import { onBackPress,onLoad } from '@dcloudio/uni-app';
const from=ref(''); const from=ref('');
const user_uuid=ref('');
onLoad((options) => { onLoad((options) => {
if(options.from){ if(options.from){
from.value = options.from; from.value = options.from;
} }
let userInfo= uni.getStorageSync('userInfo')
user_uuid.value = userInfo.uuid;
loadFirstTwoPages();
}); });
onBackPress(() => { onBackPress(() => {
if(!from.value){ if(!from.value){
@ -154,6 +158,7 @@ const getFlowerList = () => {
api.getFlowerList({ api.getFlowerList({
page: page.value, page: page.value,
user_uuid: user_uuid.value,
}).then(res => { }).then(res => {
console.log('接口返回数据:', res); console.log('接口返回数据:', res);
if (res.code === 200 && res.data) { if (res.code === 200 && res.data) {
@ -369,9 +374,7 @@ const testLoadMore = () => {
onLoadMore(); onLoadMore();
}; };
onMounted(async () => {
await loadFirstTwoPages();
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -41,7 +41,7 @@
</view> </view>
<view class="history-content"> <view class="history-content">
<view class="history-time">{{ formatDate(item.createDate) }}</view> <view class="history-time">{{ formatDate(item.createDate) }}</view>
<view class="nickname">{{ item.nickname || item.patient_name }}</view> <view class="nickname">昵称{{ item.nickname || item.patient_name }}</view>
<view class="history-text">{{ item.content}}</view> <view class="history-text">{{ item.content}}</view>
<view class="status-info"> <view class="status-info">
<up-image :src="goImg" width="30rpx" height="30rpx" v-if="item.status==2"></up-image> <up-image :src="goImg" width="30rpx" height="30rpx" v-if="item.status==2"></up-image>
@ -174,6 +174,7 @@ const getApplyList = async () => { // 申请列表
} }
const res = await api.applyListOperate(data); const res = await api.applyListOperate(data);
if(res.code === 200){ if(res.code === 200){
uni.showToast({ uni.showToast({
title: '操作成功', title: '操作成功',
icon: 'none', icon: 'none',
@ -181,6 +182,11 @@ const getApplyList = async () => { // 申请列表
}); });
getApplyList(); getApplyList();
getRelationRecordLately(); getRelationRecordLately();
if(status == 2){
navTo({
url: `/pages_app/patientRemark/patientRemark?uuid=${uuid}`
})
}
} }
}; };
onShow(() => { onShow(() => {
@ -332,8 +338,8 @@ const addPatient = () => {
.reminder-text { .reminder-text {
flex: 1; flex: 1;
font-size: 28rpx; font-size: 32rpx;
color: #333; color: #999;
line-height: 1.5; line-height: 1.5;
} }
} }
@ -478,14 +484,14 @@ const addPatient = () => {
flex: 1; flex: 1;
.nickname { .nickname {
font-size: 28rpx; font-size: 30rpx;
font-weight: normal; font-weight: normal;
color: #8B2316; color: #8B2316;
margin-bottom: 10rpx; margin-bottom: 10rpx;
} }
.history-text { .history-text {
font-size: 28rpx; font-size: 30rpx;
color: #333; color: #333;
line-height: 1.4; line-height: 1.4;
margin-bottom: 20rpx; margin-bottom: 20rpx;

View File

@ -88,11 +88,11 @@
<text class="action-text">发消息</text> <text class="action-text">发消息</text>
</view> </view>
<view class="action" @click="goMakePlan"> <view class="action" @click="goMakePlan">
<up-image :src="planImg" width="44rpx" height="44rpx" ></up-image> <up-image :src="recordImg" width="44rpx" height="44rpx" ></up-image>
<text class="action-text">制定随访计划</text> <text class="action-text">制定随访计划</text>
</view> </view>
<view class="action" @click="recordIllness"> <view class="action" @click="recordIllness">
<up-image :src="recordImg" width="44rpx" height="44rpx" ></up-image> <up-image :src="planImg" width="44rpx" height="44rpx" ></up-image>
<text class="action-text">记录病情</text> <text class="action-text">记录病情</text>
</view> </view>
</view> </view>

View File

@ -22,16 +22,16 @@
<!-- 筛选排序栏 --> <!-- 筛选排序栏 -->
<view class="filter-sort-bar"> <view class="filter-sort-bar">
<view class="sort-section" @click="toggleGroupSort"> <view class="sort-section" @click="toggleGroupSort">
<text class="sort-label">{{ groupSortTitle }}</text> <text class="sort-label" :class="{ 'is-selected': groupSortSelected }">{{ groupSortTitle }}</text>
<view class="imgbox"> <view class="imgbox">
<up-image :src="upImg" width="26rpx" height="26rpx" ></up-image> <up-image :src="groupSortIcon" width="26rpx" height="26rpx" ></up-image>
</view> </view>
</view> </view>
<view class="divider"></view> <view class="divider"></view>
<view class="current-sort" @click="toggleInnerSort"> <view class="current-sort" @click="toggleInnerSort">
<text class="sort-text">{{ innerSortTitle }}</text> <text class="sort-text" :class="{ 'is-selected': innerSortSelected }">{{ innerSortTitle }}</text>
<view class="imgbox"> <view class="imgbox">
<up-image :src="upImg" width="26rpx" height="26rpx" ></up-image> <up-image :src="innerSortIcon" width="26rpx" height="26rpx" ></up-image>
</view> </view>
</view> </view>
</view> </view>
@ -105,12 +105,15 @@ import upImg from "@/static/triangle_green_theme.png"
import downImg from "@/static/triangle_normal.png" import downImg from "@/static/triangle_normal.png"
import groupRightImg from "@/static/groupright_big.png" import groupRightImg from "@/static/groupright_big.png"
import groupDownImg from "@/static/groupup_big.png" import groupDownImg from "@/static/groupup_big.png"
import normalImg from "@/static/triangle_normal.png"
import api from '@/api/api.js'; import api from '@/api/api.js';
import docUrl from '@/utils/docUrl' import docUrl from '@/utils/docUrl'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import navTo from '@/utils/navTo.js' import navTo from '@/utils/navTo.js'
const list_sort = ref(0); const list_sort = ref(0);
const group_sort = ref(0); const group_sort = ref(0);
const groupSortSelected = ref(false);
const innerSortSelected = ref(false);
const from = ref(''); const from = ref('');
onLoad((options) => { onLoad((options) => {
if(options.from){ if(options.from){
@ -148,9 +151,17 @@ const formatYMD = (val) => {
return d.isValid() ? d.format('YYYY-MM-DD') : ''; return d.isValid() ? d.format('YYYY-MM-DD') : '';
}; };
// // /++
const groupSortTitle = computed(() => group_sort.value === 0 ? '按首字母' : '分组人数'); const groupSortTitle = computed(() => {
const innerSortTitle = computed(() => list_sort.value === 0 ? '按首字母' : '随访时间'); if (!groupSortSelected.value) return '分组排序';
return group_sort.value === 0 ? '按首字母' : '分组人数';
});
const innerSortTitle = computed(() => {
if (!innerSortSelected.value) return '组内排序';
return list_sort.value === 0 ? '按首字母' : '随访时间';
});
const groupSortIcon = computed(() => groupSortSelected.value ? upImg : normalImg);
const innerSortIcon = computed(() => innerSortSelected.value ? upImg : normalImg);
const fetchGroupList = async () => { const fetchGroupList = async () => {
@ -261,6 +272,7 @@ const chooseGroupSort = (type) => {
selectedGroupSort.value = type; selectedGroupSort.value = type;
// =0=1 // =0=1
group_sort.value = type === 'letter' ? 0 : 1; group_sort.value = type === 'letter' ? 0 : 1;
groupSortSelected.value = true;
closeGroupSort(); closeGroupSort();
fetchGroupList(); fetchGroupList();
}; };
@ -282,6 +294,7 @@ const chooseInnerSort = (type) => {
selectedInnerSort.value = type; selectedInnerSort.value = type;
// =0访=1 // =0访=1
list_sort.value = type === 'letter' ? 0 : 1; list_sort.value = type === 'letter' ? 0 : 1;
innerSortSelected.value = true;
closeInnerSort(); closeInnerSort();
fetchGroupList(); fetchGroupList();
}; };
@ -327,7 +340,7 @@ const createNew = () => {
.popup-panel { .popup-panel {
position: fixed; position: fixed;
top: 220rpx; /* 紧贴筛选栏 */ top: calc(var(--status-bar-height) + 44px + 82rpx); /* 紧贴筛选栏 */
left: 0; left: 0;
right: 0; right: 0;
background: #fff; background: #fff;
@ -498,7 +511,10 @@ const createNew = () => {
.sort-label { .sort-label {
font-size: 28rpx; font-size: 28rpx;
color: #333; color: #999;
&.is-selected {
color: #8B2316;
}
} }
.sort-icon.down { .sort-icon.down {
@ -524,7 +540,10 @@ const createNew = () => {
.sort-text { .sort-text {
font-size: 28rpx; font-size: 28rpx;
color: #333; color: #999;
&.is-selected {
color: #8B2316;
}
} }
.sort-icon.up { .sort-icon.up {
@ -542,7 +561,7 @@ const createNew = () => {
} }
.patient-list-section { .patient-list-section {
top: 240rpx; top: calc(var(--status-bar-height) + 44px + 100rpx);
width:100%; width:100%;
bottom:0; bottom:0;
position: fixed; position: fixed;

View File

@ -99,11 +99,6 @@
<view class="listbox"> <view class="listbox">
<!-- 使用 up-index-list 索引组件数据动态渲染 -->
<up-index-list :index-list="indexList" v-show="loadFinish" >
<!-- 特殊操作项 -->
<template #header>
<view class="special-actions" > <view class="special-actions" >
<view class="action-item" @click="addNewPatient"> <view class="action-item" @click="addNewPatient">
<view class="action-icon new-patient"> <view class="action-icon new-patient">
@ -127,13 +122,14 @@
<uni-icons type="right" size="20" color="#999"></uni-icons> <uni-icons type="right" size="20" color="#999"></uni-icons>
</view> </view>
</view> </view>
</template> <!-- 使用 up-index-list 索引组件数据动态渲染 -->
<up-index-list :index-list="indexList" v-show="loadFinish" v-if="patientList.length > 0">
<template v-for="group in patientGroups" :key="group.letter" > <template v-for="group in patientGroups" :key="group.letter" >
<up-index-item > <up-index-item >
<up-index-anchor :text="group.letter" /> <up-index-anchor :text="group.letter" v-if="group.items.length > 0"/>
<view class="group-section"> <view class="group-section">
<view class="patient-item" v-for="item in group.items" :key="item.uuid || item.id" > <view class="patient-item" v-for="item in group.items" :key="item.uuid || item.id" v-if="group.items.length > 0">
<template v-if="item.placeholder"> <template v-if="item.placeholder">
<view class="patient-avatar-placeholder"> <view class="patient-avatar-placeholder">
<uni-icons type="person" size="32" color="#ffffff" @click="goPatientDetail(item.uuid)"></uni-icons> <uni-icons type="person" size="32" color="#ffffff" @click="goPatientDetail(item.uuid)"></uni-icons>
@ -149,10 +145,11 @@
</view> </view>
</view> </view>
<view class="patient-status"> <view class="patient-status">
<uni-icons type="compose" size="20" color="#8B2316" @click.stop="editPatient(item.uuid)"></uni-icons> <up-image :src="editImg" width="35rpx" height="35rpx" @click.stop="editPatient(item.uuid)"></up-image>
<text class="follow-date">随访于{{ item.joinDateYMD }}</text> <text class="follow-date">随访于{{ item.joinDateYMD }}</text>
</view> </view>
</view> </view>
<empty v-if="group.items.length === 0" :emptyDesc="'您暂无随访患者'"></empty>
</view> </view>
</up-index-item> </up-index-item>
</template> </template>
@ -252,6 +249,7 @@
import { onShow,onLoad,onBackPress} from "@dcloudio/uni-app"; import { onShow,onLoad,onBackPress} from "@dcloudio/uni-app";
import dayImg from "@/static/visit_data11.png" import dayImg from "@/static/visit_data11.png"
import planImg from "@/static/visitplan.png" import planImg from "@/static/visitplan.png"
import editImg from "@/static/edit_patitent.png"
import api from '@/api/api.js'; import api from '@/api/api.js';
import navTo from '@/utils/navTo.js'; import navTo from '@/utils/navTo.js';
import docUrl from '@/utils/docUrl.js'; import docUrl from '@/utils/docUrl.js';
@ -274,6 +272,7 @@
import pinyin from 'pinyin'; import pinyin from 'pinyin';
import dayjs from 'dayjs' import dayjs from 'dayjs'
import lineImg from "@/static/item_visitplan_fg.png" import lineImg from "@/static/item_visitplan_fg.png"
import empty from '@/components/empty/empty.vue'
const loadFinish = ref(false); const loadFinish = ref(false);
//import ConversationList from './conversation-list/index.vue' //import ConversationList from './conversation-list/index.vue'
const title = ref('患者消息'); const title = ref('患者消息');
@ -398,7 +397,12 @@
} }
const letters = Array.from(map.keys()).sort((a,b) => a.localeCompare(b)); const letters = Array.from(map.keys()).sort((a,b) => a.localeCompare(b));
patientGroups.value = letters.map(l => ({ letter: l, items: map.get(l) })); patientGroups.value = letters.map(l => ({ letter: l, items: map.get(l) }));
console.log(patientGroups.value)
rebuildIndexList(); rebuildIndexList();
if(source.length === 0){
console.log(111122)
indexList.value=[]
}
nextTick(() => { nextTick(() => {
setTimeout(() => { setTimeout(() => {
uni.hideLoading(); uni.hideLoading();
@ -615,14 +619,15 @@
break; break;
case 'list': case 'list':
title.value = '患者列表'; title.value = '患者列表';
if (patientDataLoaded.value) { // if (patientDataLoaded.value) {
loadFinish.value = true; // loadFinish.value = true;
break; // break;
} // }
uni.showLoading({ uni.showLoading({
title: '加载中...', title: '加载中...',
mask: true mask: true
}); });
getApplyList();
patientListByGBK(); patientListByGBK();
// //
break; break;
@ -878,7 +883,7 @@
} }
.tab-text { .tab-text {
font-size: 28rpx; font-size: 32rpx;
color: #999999; color: #999999;
transition: color 0.3s; transition: color 0.3s;
} }
@ -913,6 +918,10 @@
:deep(.u-index-list__scroll-view){ :deep(.u-index-list__scroll-view){
height:calc(100vh - var(--status-bar-height) - 44px - 103rpx); height:calc(100vh - var(--status-bar-height) - 44px - 103rpx);
} }
:deep(.hide-index-bar .u-index-list__sidebar),
:deep(.hide-index-bar .u-index-list__index-box) {
display: none !important;
}
// position: fixed; // position: fixed;
width: 100%; width: 100%;

View File

@ -27,18 +27,21 @@
</view> </view>
<view class="form-block"> <view class="form-block">
<view class="label">描述</view> <view class="label">描述</view>
<textarea class="textarea" v-model.trim="note" :placeholder="groupInfo.note || '补充患者关键信息,方便随访患者'" placeholder-class="ph" auto-height maxlength="140"/> <view class="textarea-wrap">
<textarea class="textarea" v-model.trim="note" :placeholder="groupInfo.note || '补充患者关键信息,方便随访患者'" placeholder-class="ph" auto-height maxlength="100"/>
<view class="textarea-count">已输入{{ noteLength }}/100</view>
</view>
</view> </view>
</view> </view>
<view class="bottom-bar"> <view class="bottom-bar">
<button class="save-btn" @click="updateNicknameNote">保存</button> <button class="save-btn" @click="updateNicknameNote">完成</button>
</view> </view>
</view> </view>
</template> </template>
<script setup> <script setup>
import { ref } from 'vue' import { ref, computed } from 'vue'
import api from '@/api/api.js' import api from '@/api/api.js'
import navTo from '@/utils/navTo.js' import navTo from '@/utils/navTo.js'
import { onLoad, onShow } from '@dcloudio/uni-app' import { onLoad, onShow } from '@dcloudio/uni-app'
@ -48,6 +51,7 @@
const patientUuid = ref('') const patientUuid = ref('')
const patientCardData = ref({}) const patientCardData = ref({})
const groupInfo = ref({}) const groupInfo = ref({})
const noteLength = computed(() => (note.value || '').length)
const goBack = () => { const goBack = () => {
uni.navigateBack() uni.navigateBack()
@ -104,7 +108,13 @@
<style lang="scss" scoped> <style lang="scss" scoped>
.contentbox{ .contentbox{
margin-top: calc(var(--status-bar-height) + 44px); top: calc(var(--status-bar-height) + 44px);
position: fixed;
left: 0;
right: 0;
bottom: 125rpx;
overflow-y: scroll;
z-index: 1;
} }
.remark-page{ .remark-page{
height: 100vh; height: 100vh;
@ -144,12 +154,24 @@
.textarea{ .textarea{
background: #f8f8f8; background: #f8f8f8;
border-radius: 12rpx; border-radius: 12rpx;
padding: 24rpx; padding: 24rpx 24rpx 58rpx;
font-size: 28rpx; font-size: 28rpx;
color: #333; color: #333;
min-height: 180rpx; min-height: 250rpx;
box-sizing: border-box;
width: 100%;
line-height: 1.6; line-height: 1.6;
} }
.textarea-wrap{
position: relative;
}
.textarea-count{
position: absolute;
right: 20rpx;
bottom: 16rpx;
font-size: 24rpx;
color: #999;
}
.ph{ .ph{
color: #bfbfbf; color: #bfbfbf;
} }
@ -166,7 +188,7 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
height: 92rpx; height: 92rpx;
background: #8B2316; background: #3ec7c0;
color: #fff; color: #fff;
border: none; border: none;
border-radius: 12rpx; border-radius: 12rpx;

View File

@ -23,7 +23,7 @@
</view> </view>
</view> </view>
<view class="cell" @click="goGroup"> <view class="cell" @click="goRemark">
<text class="cell-left">设置分组</text> <text class="cell-left">设置分组</text>
<view class="cell-right"> <view class="cell-right">
<text class="cell-desc">{{ groupInfo.name || '通过分组给患者分类' }}</text> <text class="cell-desc">{{ groupInfo.name || '通过分组给患者分类' }}</text>
@ -53,11 +53,12 @@
<uni-icons type="right" size="20" color="#999"></uni-icons> <uni-icons type="right" size="20" color="#999"></uni-icons>
</view> </view>
</view> </view>
<view class="danger-action">
<button class="danger-btn" @click="visible=true">解除随访</button>
</view>
</view> </view>
<view class="danger-block">
<text class="danger-text" @click="visible=true">解除随访</text>
</view>
</view> </view>
<unidialog :visible="visible" :content="message" @close="visible=false" @confirm="deleteFollowUp" ></unidialog> <unidialog :visible="visible" :content="message" @close="visible=false" @confirm="deleteFollowUp" ></unidialog>
</template> </template>
@ -108,8 +109,10 @@
patient_uuid: patientUuid.value patient_uuid: patientUuid.value
}).then(res => { }).then(res => {
if(res.code == 200){ if(res.code == 200){
patientName.value = res.group.nickname || res.patient.realName console.log(res.patient)
message.value = `解除[${patientName.value}]的随访关系?` patientName.value = res.patient.nickname?res.patient.nickname:res.patient.realname;
console.log(patientName.value)
message.value = `确认解除[${patientName.value}]的随访关系?`
patientCardData.value = res patientCardData.value = res
groupInfo.value = res.group || {} groupInfo.value = res.group || {}
} }
@ -124,9 +127,9 @@
title: '解除成功', title: '解除成功',
icon: 'none' icon: 'none'
}) })
uni.redirectTo({ setTimeout(() => {
url: '/pages_app/patientMsg/patientMsg' uni.navigateBack()
}) }, 1000)
} }
visible.value = false visible.value = false
}) })
@ -143,7 +146,7 @@
top: calc(var(--status-bar-height) + 44px); top: calc(var(--status-bar-height) + 44px);
left: 0; left: 0;
right: 0; right: 0;
bottom: 0; bottom: 0rpx;
background: #fff; background: #fff;
.cell{ .cell{
display: flex; display: flex;
@ -168,14 +171,20 @@
} }
} }
} }
.danger-block{ .danger-action{
margin-top: 30rpx; margin-top: 30rpx;
background: #fff; background: #fff;
padding: 40rpx 0;
padding: 20rpx 30rpx calc(20rpx + env(safe-area-inset-bottom));
display: flex; display: flex;
justify-content: center; justify-content: center;
.align-center{ align-items: center; } .danger-btn{
.danger-text{ width: 100%;
height: 92rpx;
line-height: 92rpx;
border: 1rpx solid #8B2316;
background: #fff;
border-radius: 12rpx;
color: #8B2316; color: #8B2316;
font-size: 32rpx; font-size: 32rpx;
} }

View File

@ -46,8 +46,8 @@ import empty from '@/components/empty/empty.vue'
import api from '@/api/api.js' import api from '@/api/api.js'
import navTo from '@/utils/navTo' import navTo from '@/utils/navTo'
const title = ref('执业地点管理') const title = ref('执业地点管理')
import editImg from '@/static/images/edit_icon.png' import editImg from '@/static/edit_icon.png'
import deleteImg from '@/static/images/delete_icon.png' import deleteImg from '@/static/delete_icon.png'
const addressList = ref([]) const addressList = ref([])
const getTypeTag = (type) => { const getTypeTag = (type) => {
@ -175,11 +175,11 @@ const addNew = () => {
.action { .action {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 8rpx;
} }
.icon { font-size: 26rpx; } .icon { font-size: 26rpx; }
.text { font-size: 26rpx; color: #666; } .text { font-size: 26rpx; color: #666; margin-left: 8rpx;margin-top: 3rpx;}
.bottom-actions { .bottom-actions {
position: fixed; position: fixed;

View File

@ -293,6 +293,7 @@ import { ref, getCurrentInstance, computed, onUnmounted, onMounted } from 'vue'
import { ALLOW_AT, events, REPLY_MSG_TYPE_MAP } from '@/utils/im/constants' import { ALLOW_AT, events, REPLY_MSG_TYPE_MAP } from '@/utils/im/constants'
import { emojiMap } from '@/utils/im/emoji' import { emojiMap } from '@/utils/im/emoji'
import { t } from '@/utils/im/i18n' import { t } from '@/utils/im/i18n'
import { pathToBase64 } from "image-tools";
import { handleNoPermission } from '@/utils/im/permission' import { handleNoPermission } from '@/utils/im/permission'
import { customNavigateTo } from '@/utils/im/customNavigate' import { customNavigateTo } from '@/utils/im/customNavigate'
import MessageOneLine from '@/components/MessageOneLine.vue' import MessageOneLine from '@/components/MessageOneLine.vue'
@ -811,26 +812,80 @@ const handleSendImageMsg = () => {
stopAllAudio() stopAllAudio()
uni.chooseImage({ uni.chooseImage({
count: 1, count: 1,
sizeType: ['compressed'], //sizeType: ['compressed'],
sourceType: ['album','camera'],
crop: {
width: 800,
height:800,
resize: true,
quality:100,
},
success: (res) => { success: (res) => {
console.log('第一步成功');
console.log(res.tempFilePaths)
// const imgMsg = uni.$UIKitNIM.V2NIMMessageCreator.createImageMessage( // const imgMsg = uni.$UIKitNIM.V2NIMMessageCreator.createImageMessage(
// res.tempFilePaths[0] // res.tempFilePaths[0]
// ) // )
if(props.isGroupSend){ if(props.isGroupSend){
const fileManager = uni.getFileSystemManager(); console.log('第二步成功');
fileManager.readFile({ uni.getImageInfo({
filePath: res.tempFilePaths[0], src: res.tempFilePaths[0],
encoding: 'base64', success: (result) => {
success: (res) => { console.log('第三步成功');
console.log(result);
if(result.width > 1000){
uni.compressImage({
src: res.tempFilePaths[0],
quality:100,
success: (res2) => {
console.log('第四 步成功');
pathToBase64(res2.tempFilePath)
.then((base64) => {
console.log('转base64成功');
console.log(base64);
let img=base64.split(",")[1];
emits('send',{ emits('send',{
content:res.data, content:img,
msg_type:2, msg_type:2,
}) })
}, })
fail: (error) => { .catch((error) => {
console.log('chooseImage', error) console.log('chooseImage', error);
});
} }
}) })
}else{
pathToBase64(res.tempFilePaths[0])
.then((base64) => {
console.log('转base64成功');
console.log(base64);
let img=base64.split(",")[1];
emits('send',{
content:img,
msg_type:2
})
})
.catch((error) => {
console.log('chooseImage', error);
});
}
}
})
// 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{ }else{
const conversationId = ensureConversationId() const conversationId = ensureConversationId()
if (!conversationId) return if (!conversationId) return

View File

@ -63,7 +63,6 @@
:title="'执业地点'" :title="'执业地点'"
:cancelText="'返回修改'" :cancelText="'返回修改'"
:confirmText="'确认发布'" :confirmText="'确认发布'"
@close="noticeVisible=false" @close="noticeVisible=false"
@confirm="noticeConfirm" @confirm="noticeConfirm"
> >
@ -71,7 +70,7 @@
<view class="ppt-content"> <view class="ppt-content">
<view class="notice-row"> <view class="notice-row">
<view class="name">医院</view> <view class="name">医院</view>
<view class="value" v-if="reason==1">{{ form.hospital_name }}</view> <view class="value">{{ form.hospital_name }}</view>
</view> </view>
<view class="notice-row"> <view class="notice-row">

View File

@ -102,14 +102,9 @@
</view> </view>
<!-- 空状态 --> <!-- 空状态 -->
<view class="card" v-else>
<view class="card-header"> <empty :emptyDesc="'暂无群发消息记录'" v-else></empty>
<text class="label">群发消息记录</text>
</view>
<view class="card-body">
<view class="line">暂无群发消息记录</view>
</view>
</view>
<!-- 加载状态 --> <!-- 加载状态 -->
<view class="loading-state" v-if="loading"> <view class="loading-state" v-if="loading">
@ -152,6 +147,7 @@ import api from '@/api/api.js'
import { onShow,onBackPress,onLoad } from '@dcloudio/uni-app' import { onShow,onBackPress,onLoad } from '@dcloudio/uni-app'
import docUrl from '@/utils/docUrl.js' import docUrl from '@/utils/docUrl.js'
import navTo from '@/utils/navTo.js' import navTo from '@/utils/navTo.js'
import empty from '@/components/empty/empty.vue'
const currentTime = ref('') const currentTime = ref('')
const patientCount = ref(1) const patientCount = ref(1)
const patientName = ref('测试') const patientName = ref('测试')

View File

@ -54,7 +54,11 @@ const addOutPatientA = () => {
}).then(res => { }).then(res => {
console.log(res) console.log(res)
if(res.code==0){ if(res.code==0){
uni.navigateBack() uni.showToast({ title: '提交成功', icon: 'none' })
setTimeout(() => {
uni.navigateBack();
}, 1000);
} }
}) })
} }

View File

@ -137,16 +137,55 @@
</view> </view>
</view> </view>
</view> </view>
<unidialog
:visible="noticeVisible"
:title="'门诊安排'"
:cancelText="'返回修改'"
:confirmText="'确认发布'"
@close="noticeVisible=false"
@confirm="noticeConfirm"
>
<template v-slot:content>
<view class="ppt-content">
<view class="notice-row">
<view class="name">门诊时间</view>
<view class="value" style="display: flex;align-items: center;gap: 10rpx;">
<text class="weekday-text">{{ getWeekdayText(selectedWeekday) }}</text>
<text class="time-text">{{ getTimePeriodText(selectedTimePeriod) }}</text>
</view>
</view>
<view class="notice-row">
<view class="name">门诊地点</view>
<view class="value">
<text class="value-text">{{ selectedLocation.hospital_name }};</text>
<text class="value-text">{{ selectedLocation.office_name }};</text>
<text class="value-text">{{ selectedLocation.location }};</text>
<text class="value-text">
{{ getTypeText(selectedLocation.type) }}
</text>
</view>
</view>
</view>
</template>
</unidialog>
</template> </template>
<script setup> <script setup>
import { ref } from 'vue' import { ref } from 'vue'
import { onLoad, onShow } from "@dcloudio/uni-app"; import { onLoad, onShow } from "@dcloudio/uni-app";
import unidialog from '@/components/dialog/dialog.vue'
import api from "@/api/api.js"; import api from "@/api/api.js";
import navTo from '@/utils/navTo' import navTo from '@/utils/navTo'
import navBar from '@/components/navBar/navBar.vue' import navBar from '@/components/navBar/navBar.vue'
const title = ref('增加门诊安排') const title = ref('增加门诊安排')
const uuid=ref('') const uuid=ref('')
const noticeVisible=ref(false)
const noticeConfirm = () => {
noticeVisible.value = false
submit()
}
// //
const selectedWeekday = ref(null) const selectedWeekday = ref(null)
const selectedTimePeriod = ref('') const selectedTimePeriod = ref('')
@ -155,6 +194,14 @@ const selectedLocation = ref({})
const map = { 1: '普通门诊', 2: '专家门诊', 3: '特需门诊', 4: '专科/专病门诊' } const map = { 1: '普通门诊', 2: '专家门诊', 3: '特需门诊', 4: '专科/专病门诊' }
return map[type] || '普通门诊' return map[type] || '普通门诊'
} }
const getWeekdayText = (weekday) => {
const map = { 1: '周一', 2: '周二', 3: '周三', 4: '周四', 5: '周五', 6: '周六', 7: '周日' }
return map[weekday]
}
const getTimePeriodText = (timePeriod) => {
const map = { a: '上午', b: '下午', c: '晚上', d: '全天' }
return map[timePeriod]
}
onShow(()=>{ onShow(()=>{
listWorkPlace() listWorkPlace()
}) })
@ -166,8 +213,13 @@ const workPlaceList=ref([])
const listWorkPlace=async()=>{ const listWorkPlace=async()=>{
const res = await api.listWorkPlace() const res = await api.listWorkPlace()
if(res.code == 200){ if(res.code == 200){
workPlaceList.value = res.data workPlaceList.value = res.data;
for(let i=0;i<workPlaceList.value.length;i++){
if(workPlaceList.value[i].uuid == selectedLocation.value.uuid){
chooseLocation(workPlaceList.value[i]);
break
}
}
} }
} }
const selectWeekday = (weekday) => { const selectWeekday = (weekday) => {
@ -197,7 +249,7 @@ const updateOutPatient=async()=>{
type:1, type:1,
week: selectedWeekday.value, week: selectedWeekday.value,
day: selectedTimePeriod.value, day: selectedTimePeriod.value,
workplace_uuid: selectedLocation.value workplace_uuid: selectedLocation.value.uuid
}) })
if(res.code == 200){ if(res.code == 200){
@ -213,12 +265,20 @@ const selectTimePeriod = (period) => {
} }
const chooseLocation = (item) => { const chooseLocation = (item) => {
console.log(item)
selectedLocation.value = item selectedLocation.value = item
} }
const getType=(type)=>{ const getType=(type)=>{
const map = { 1: 'a', 2: 'b', 3: 'c', 4: 'd' } const map = { 1: 'a', 2: 'b', 3: 'c', 4: 'd' }
return map[type] return map[type]
} }
const submit=()=>{
if(uuid.value){
updateOutPatient()
}else{
addOutPatient()
}
}
const confirmPublish = () => { const confirmPublish = () => {
if (!selectedWeekday.value) { if (!selectedWeekday.value) {
uni.showToast({ uni.showToast({
@ -244,11 +304,7 @@ const confirmPublish = () => {
return return
} }
if(uuid.value){ noticeVisible.value = true
updateOutPatient()
}else{
addOutPatient()
}
} }
onLoad((options)=>{ onLoad((options)=>{
@ -256,7 +312,8 @@ const confirmPublish = () => {
uuid.value = options.uuid; uuid.value = options.uuid;
selectedWeekday.value = options.week; selectedWeekday.value = options.week;
selectedLocation.value.uuid = options.workplace_uuid; selectedLocation.value.uuid = options.workplace_uuid;
selectedTimePeriod.value = getType(options.type); selectedTimePeriod.value =options.type;
if(uuid.value){ if(uuid.value){
title.value = '编辑门诊安排' title.value = '编辑门诊安排'
} }
@ -264,6 +321,13 @@ const confirmPublish = () => {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.value .weekday-text{
color:red
}
.value .time-text{
color:red;
margin-left: 10rpx;
}
.add-schedule-page { .add-schedule-page {
min-height: 100vh; min-height: 100vh;
background-color: #fff; background-color: #fff;
@ -329,6 +393,26 @@ const confirmPublish = () => {
flex: 1; flex: 1;
text-align: center; text-align: center;
} }
.notice-row{
margin-bottom: 20rpx;
display: flex;
align-items: flex-start;
.name{
width: 160rpx;
white-space: nowrap;
text-align: right;
font-size: 28rpx;
color: #333;
}
.value{
flex: 1;
font-size: 28rpx;
text-align: left;
color: #333;
}
}
.nav-title { .nav-title {
font-size: 34rpx; font-size: 34rpx;
@ -362,7 +446,6 @@ const confirmPublish = () => {
.title-text { .title-text {
font-size: 32rpx; font-size: 32rpx;
color: #8B2316; color: #8B2316;
font-weight: bold;
} }
.required-mark { .required-mark {
@ -543,6 +626,5 @@ const confirmPublish = () => {
.btn-text { .btn-text {
color: #fff; color: #fff;
font-size: 32rpx; font-size: 32rpx;
font-weight: bold;
} }
</style> </style>

View File

@ -15,7 +15,7 @@
> >
<template #right> <template #right>
<view class="nav-right"> <view class="nav-right">
<up-icon name="share" color="#8B2316" size="24"></up-icon> <up-icon name="share" color="#8B2316" size="24" @click="shareToggle"></up-icon>
<up-image :src="siteImg" width="36rpx" height="36rpx" @click="goSite"></up-image> <up-image :src="siteImg" width="36rpx" height="36rpx" @click="goSite"></up-image>
</view> </view>
</template> </template>
@ -34,7 +34,15 @@
</view> </view>
<!-- 主内容区域 --> <!-- 主内容区域 -->
<view class="content-area"> <!-- <view class="content-area"> -->
<scroll-view
class="content-scroll"
scroll-y
refresher-enabled
:refresher-triggered="isRefreshing"
@refresherrefresh="onRefresh"
@scrolltolower="onScrollToLower"
>
<!-- 停诊公告卡片 --> <!-- 停诊公告卡片 -->
<view v-if="currentTab === 'suspension'"> <view v-if="currentTab === 'suspension'">
<view class="announcement-card" v-for="announcement in stopOutPatientList" :key="announcement.uuid"> <view class="announcement-card" v-for="announcement in stopOutPatientList" :key="announcement.uuid">
@ -106,11 +114,11 @@
</view> </view>
<view class="schedule-actions"> <view class="schedule-actions">
<view class="action-btn edit-btn" @click="editSchedule(schedule)"> <view class="action-btn edit-btn" @click="editSchedule(schedule)">
<text class="action-icon"></text> <up-image :src="editImg" width="30rpx" height="30rpx"></up-image>
<text class="action-text">编辑</text> <text class="action-text">编辑</text>
</view> </view>
<view class="action-btn delete-btn" @click="deleteSchedule(schedule.uuid)"> <view class="action-btn delete-btn" @click="deleteSchedule(schedule.uuid)">
<text class="action-icon">🗑</text> <up-image :src="deleteImg" width="30rpx" height="30rpx"></up-image>
<text class="action-text">删除</text> <text class="action-text">删除</text>
</view> </view>
</view> </view>
@ -120,8 +128,12 @@
<view v-else class="empty-state"> <view v-else class="empty-state">
<empty :emptyDesc="'暂无门诊安排'"></empty> <empty :emptyDesc="'暂无门诊安排'"></empty>
</view> </view>
<view v-if="outPatientList.length > 0" class="load-more-tip">
<text>{{ outPatientLoading ? '加载中...' : (hasMoreOutPatient ? '上拉加载更多' : '没有更多数据了') }}</text>
</view> </view>
</view> </view>
</scroll-view>
<!-- </view> -->
<!-- 底部操作按钮 --> <!-- 底部操作按钮 -->
<view class="bottom-actions"> <view class="bottom-actions">
@ -134,6 +146,36 @@
<view class="floating-edit-btn" @click="editAnnouncement"> <view class="floating-edit-btn" @click="editAnnouncement">
<up-image :src="sendImg" width="88rpx" height="88rpx"></up-image> <up-image :src="sendImg" width="88rpx" height="88rpx"></up-image>
</view> </view>
<!-- 分享弹窗 -->
<uni-popup ref="shareRef" type="bottom" safeArea backgroundColor="#fff">
<view class="share-popup">
<view class="share-title">分享到</view>
<view class="share-content">
<view class="share-item" @click="shareToWechat">
<view class="share-icon wechat-icon">
<image class="share-img" :src="wxImg" mode="aspectFill" />
</view>
<text class="share-text">微信</text>
</view>
<view class="share-item" @click="shareToMoments">
<view class="share-icon moments-icon">
<image class="share-img" :src="friendImg" mode="aspectFill" />
</view>
<text class="share-text">朋友圈</text>
</view>
<view class="share-item" @click="shareToWeibo">
<view class="share-icon weibo-icon">
<image class="share-img" :src="sinaImg" mode="aspectFill" />
</view>
<text class="share-text">新浪微博</text>
</view>
</view>
<view class="share-cancel" @click="closeShare">
<text>取消</text>
</view>
</view>
</uni-popup>
</view> </view>
</template> </template>
@ -142,12 +184,27 @@ import { ref, reactive } from 'vue'
import api from '@/api/api' import api from '@/api/api'
import {onShow,onUnload,onLoad,onBackPress} from '@dcloudio/uni-app' import {onShow,onUnload,onLoad,onBackPress} from '@dcloudio/uni-app'
import navTo from '@/utils/navTo' import navTo from '@/utils/navTo'
import other_host from '@/utils/otherHost'
import siteImg from '@/static/zhiyedidian.png' import siteImg from '@/static/zhiyedidian.png'
import empty from '@/components/empty/empty.vue' import empty from '@/components/empty/empty.vue'
import sendImg from '@/static/send_feed.png' import sendImg from '@/static/send_feed.png'
import dateBg from '@/static/data_sign.png' import dateBg from '@/static/data_sign.png'
import editImg from '@/static/edit_icon.png'
import deleteImg from '@/static/delete_icon.png'
import sinaImg from "@/static/share_sina.png"
import wxImg from "@/static/share_weixin.png"
import friendImg from "@/static/share_wxc.png"
import logoImg from "@/static/weiboShare.png"
const SHARE_TITLE = ref('医生门诊详情')
const SHARE_SUMMARY = '肝胆相照®肝胆病在线服务平台'
const page=ref(1); const page=ref(1);
const isRefreshing = ref(false)
const outPatientLoading = ref(false)
const hasMoreOutPatient = ref(true)
const addressList = ref([]); const addressList = ref([]);
const shareRef = ref()
const shareLink = ref('')
// //
const from = ref(''); const from = ref('');
const currentTab = ref('suspension') const currentTab = ref('suspension')
@ -167,16 +224,61 @@ onLoad((options) => {
if(options.from){ if(options.from){
from.value = options.from; from.value = options.from;
} }
fetchList(); try {
const userInfo = uni.getStorageSync('userInfo') || {}
console.log(userInfo.realName)
const expertUuid = userInfo.uuid;
shareLink.value = other_host+'/wxPatient/index.htm#/outPatient?link=share&expertUuid='+expertUuid+'&from=doctor'
SHARE_TITLE.value = userInfo.realName+'医生门诊详情'
} catch (error) {
console.log(error)
}
}); });
const getListOutPatient = async () => { const getListOutPatient = async (reset = false) => {
if (outPatientLoading.value) return;
if (!reset && !hasMoreOutPatient.value) return;
if (reset) {
page.value = 1;
hasMoreOutPatient.value = true;
}
outPatientLoading.value = true;
try {
const res = await api.listOutPatient({ const res = await api.listOutPatient({
page:page.value, page:page.value,
}); });
if(res.code == 200){ if(res.code == 200){
outPatientList.value = res.data.list.list; const pageData = res.data?.list || {};
const newList = Array.isArray(pageData.list) ? pageData.list : [];
if (reset) {
outPatientList.value = newList;
} else {
outPatientList.value = [...outPatientList.value, ...newList];
}
//
if (typeof pageData.totalPage === 'number' && typeof pageData.pageNumber === 'number') {
hasMoreOutPatient.value = pageData.pageNumber < pageData.totalPage;
} else if (typeof pageData.last_page === 'number' && typeof pageData.current_page === 'number') {
hasMoreOutPatient.value = pageData.current_page < pageData.last_page;
} else if (typeof pageData.pages === 'number' && typeof pageData.pageNum === 'number') {
hasMoreOutPatient.value = pageData.pageNum < pageData.pages;
} else if (typeof pageData.isLastPage === 'boolean') {
hasMoreOutPatient.value = !pageData.isLastPage;
} else {
hasMoreOutPatient.value = newList.length > 0;
}
if (hasMoreOutPatient.value) {
page.value += 1;
}
console.log(res.data.note) console.log(res.data.note)
note.value = res.data.note.note; note.value = res.data?.note?.note || '';
}
} finally {
outPatientLoading.value = false;
} }
} }
const stopOutPatientList = ref([]); const stopOutPatientList = ref([]);
@ -229,8 +331,9 @@ const getWeekdayByWeek = (week) => {
const getTimePeriod = (day) => { const getTimePeriod = (day) => {
const timeMap = { const timeMap = {
'a': '上午', 'a': '上午',
'p': '下午', 'b': '下午',
'd': '晚上' 'c': '晚上',
'd': '全天'
}; };
return timeMap[day] || '晚上'; return timeMap[day] || '晚上';
} }
@ -254,11 +357,129 @@ const goBack = () => {
} }
} }
const share = () => { const shareToggle = () => {
uni.showToast({ shareRef.value && shareRef.value.open()
title: '分享功能', }
icon: 'none'
const closeShare = () => {
shareRef.value && shareRef.value.close()
}
const shareToWechat = () => {
// #ifdef APP-PLUS
uni.downloadFile({
url: 'https://doc.igandan.com/app/html/img/2016/20160714132557.png',
success: function (res) {
uni.compressImage({
src: res.tempFilePath,
quality: 60,
success: function (res2) {
uni.share({
provider: "weixin",
scene: "WXSceneSession",
type: 0,
title: SHARE_TITLE.value,
summary: SHARE_SUMMARY,
href: shareLink.value,
imageUrl: res2.tempFilePath,
});
},
});
},
});
// #endif
// #ifdef H5
if (navigator.share) {
navigator
.share({
title: SHARE_TITLE.value,
text: SHARE_SUMMARY,
url: shareLink.value,
}) })
.catch(() => {});
} else {
uni.setClipboardData({
data: `${SHARE_TITLE.value}${shareLink.value}`,
success: () => {
uni.showToast({ title: "已复制到剪贴板", icon: "success" });
},
});
}
// #endif
// #ifdef MP-WEIXIN
uni.showShareMenu({
withShareTicket: true,
menus: ["shareAppMessage", "shareTimeline"],
});
// #endif
closeShare();
}
const shareToMoments = () => {
// #ifdef APP-PLUS
uni.downloadFile({
url: 'https://doc.igandan.com/app/html/img/2016/20160714132557.png',
success: function (res) {
uni.compressImage({
src: res.tempFilePath,
quality: 60,
success: function (res2) {
uni.share({
provider: "weixin",
scene: "WXSceneTimeline",
type: 0,
title: SHARE_TITLE.value,
summary: SHARE_SUMMARY,
href: shareLink.value,
imageUrl: res2.tempFilePath,
});
},
});
},
});
// #endif
// #ifdef H5
uni.setClipboardData({
data: `${SHARE_TITLE.value}${shareLink.value}`,
success: () => {
uni.showToast({ title: "已复制到剪贴板,可分享到朋友圈", icon: "success" });
},
});
// #endif
// #ifdef MP-WEIXIN
uni.showShareMenu({
withShareTicket: true,
menus: ["shareAppMessage", "shareTimeline"],
});
// #endif
closeShare();
}
const shareToWeibo = () => {
// #ifdef APP-PLUS
uni.share({
provider: "sinaweibo",
type: 0,
title: SHARE_TITLE.value,
summary: SHARE_SUMMARY,
href: shareLink.value,
imageUrl: logoImg,
});
// #endif
// #ifdef H5
uni.setClipboardData({
data: `${SHARE_TITLE.value}${shareLink.value}`,
success: () => {
uni.showToast({ title: "已复制到剪贴板,可分享到微博", icon: "success" });
},
});
// #endif
closeShare();
} }
const fetchList = async () => { const fetchList = async () => {
const res = await api.listWorkPlace({}) const res = await api.listWorkPlace({})
@ -276,8 +497,8 @@ const addNew = () => {
onShow(() => { onShow(() => {
getStopOutPatientList(); getStopOutPatientList();
getListOutPatient(); getListOutPatient(true);
fetchList();
}) })
@ -286,7 +507,7 @@ const switchTab = (tab) => {
if(tab=='suspension'){ if(tab=='suspension'){
getStopOutPatientList(); getStopOutPatientList();
}else{ }else{
getListOutPatient(); getListOutPatient(true);
} }
} }
@ -344,7 +565,7 @@ const editAnnouncement = () => {
// //
const refreshData = () => { const refreshData = () => {
getListOutPatient(); getListOutPatient(true);
getStopOutPatientList(); getStopOutPatientList();
} }
@ -355,16 +576,18 @@ const addSchedule = () => {
title: '请先点击右上角设置执业地点', title: '请先点击右上角设置执业地点',
icon: 'none' icon: 'none'
}) })
return
} }else{
navTo({ navTo({
url: '/pages_chat/outManage/outManage' url: '/pages_chat/outManage/outManage'
}) })
}
} }
const editSchedule = (schedule) => { const editSchedule = (schedule) => {
uni.navigateTo({ uni.navigateTo({
url: `/pages_chat/outManage/outManage?uuid=${schedule.uuid}&workplace_uuid=${schedule.workplace_uuid}&week=${schedule.week}&type=${schedule.type}` url: `/pages_chat/outManage/outManage?uuid=${schedule.uuid}&workplace_uuid=${schedule.workplace_uuid}&week=${schedule.week}&type=${schedule.day}`
}) })
} }
@ -382,7 +605,7 @@ const deleteSchedule = async (uuid) => {
title: '删除成功', title: '删除成功',
icon: 'none' icon: 'none'
}); });
getListOutPatient(); getListOutPatient(true);
} else { } else {
uni.showToast({ uni.showToast({
title: deleteRes.msg || '删除失败', title: deleteRes.msg || '删除失败',
@ -399,6 +622,24 @@ const deleteSchedule = async (uuid) => {
} }
}) })
} }
const onRefresh = async () => {
isRefreshing.value = true;
try {
if (currentTab.value === 'suspension') {
await getStopOutPatientList();
} else {
await getListOutPatient(true);
}
} finally {
isRefreshing.value = false;
}
}
const onScrollToLower = () => {
if (currentTab.value !== 'outpatient') return;
getListOutPatient(false);
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@ -525,7 +766,10 @@ const deleteSchedule = async (uuid) => {
/* 标签页样式 */ /* 标签页样式 */
.tab-container { .tab-container {
margin-top: calc(var(--status-bar-height) + 44px); position: fixed;
top: calc(var(--status-bar-height) + 44px);
left: 0;
right: 0;
display: flex; display: flex;
align-items: center; align-items: center;
background-color: #fff; background-color: #fff;
@ -556,9 +800,16 @@ const deleteSchedule = async (uuid) => {
} }
/* 主内容区域 */ /* 主内容区域 */
.content-area {
padding: 30rpx; .content-scroll {
min-height: calc(100vh - 400rpx); top: calc(var(--status-bar-height) + 44px + 118rpx);
position: fixed;
left: 0;
right: 0;
width: 100%;
bottom: 152rpx;
box-sizing: border-box;
} }
/* 停诊公告卡片 */ /* 停诊公告卡片 */
@ -566,7 +817,7 @@ const deleteSchedule = async (uuid) => {
background-color: #fff; background-color: #fff;
border-radius: 16rpx; border-radius: 16rpx;
margin-bottom: 20rpx; margin:0 30rpx 20rpx;
position: relative; position: relative;
.date-bg{ .date-bg{
position: absolute; position: absolute;
@ -683,16 +934,22 @@ const deleteSchedule = async (uuid) => {
.schedule-list { .schedule-list {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 20rpx; margin:0rpx 30rpx 0;
}
.load-more-tip {
display: flex;
justify-content: center;
align-items: center;
color: #999;
font-size: 24rpx;
padding: 20rpx 0 30rpx;
} }
.schedule-card { .schedule-card {
background-color: #fff; background-color: #fff;
border-radius: 12rpx; border-radius: 12rpx;
margin-bottom: 20rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
gap: 30rpx;
} }
.cell-content { .cell-content {
padding: 0 30rpx; padding: 0 30rpx;
@ -797,7 +1054,7 @@ const deleteSchedule = async (uuid) => {
.action-btn { .action-btn {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 8rpx;
padding: 10rpx 20rpx; padding: 10rpx 20rpx;
border-radius: 8rpx; border-radius: 8rpx;
cursor: pointer; cursor: pointer;
@ -805,14 +1062,7 @@ const deleteSchedule = async (uuid) => {
.edit-btn { .edit-btn {
white-space: nowrap; white-space: nowrap;
background-color: #f8f9fa;
border: 1rpx solid #dee2e6;
}
.schedule-actions .delete-btn {
background-color: #fff5f5;
border: 1rpx solid #fed7d7;
} }
.action-icon { .action-icon {
@ -823,6 +1073,8 @@ const deleteSchedule = async (uuid) => {
white-space: nowrap; white-space: nowrap;
font-size: 24rpx; font-size: 24rpx;
color: #666; color: #666;
margin-top: 5rpx;
margin-left: 8rpx;
} }
.edit-btn .action-text { .edit-btn .action-text {
@ -830,7 +1082,7 @@ const deleteSchedule = async (uuid) => {
} }
.delete-btn .action-text { .delete-btn .action-text {
color: #e74c3c; color: #666;
} }
/* 底部操作按钮 */ /* 底部操作按钮 */
@ -839,6 +1091,7 @@ const deleteSchedule = async (uuid) => {
bottom: 0; bottom: 0;
left: 0; left: 0;
right: 0; right: 0;
z-index: 1;
padding: 30rpx; padding: 30rpx;
background-color: #fff; background-color: #fff;
border-top: 1rpx solid #eee; border-top: 1rpx solid #eee;
@ -875,4 +1128,69 @@ const deleteSchedule = async (uuid) => {
color: #fff; color: #fff;
font-size: 32rpx; font-size: 32rpx;
} }
/* 分享弹窗样式 */
.share-popup {
background-color: #fff;
border-radius: 20rpx 20rpx 0 0;
padding: 40rpx 0 0;
}
.share-title {
text-align: center;
font-size: 32rpx;
color: #333;
margin-bottom: 40rpx;
font-weight: 500;
}
.share-content {
display: flex;
justify-content: space-around;
padding: 0 40rpx 40rpx;
}
.share-item {
display: flex;
flex-direction: column;
align-items: center;
flex: 1;
}
.share-icon {
width: 100rpx;
height: 100rpx;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20rpx;
}
.share-img {
width: 100rpx;
height:100rpx;
}
.weibo-icon {
background-color: #e6162d;
}
.share-text {
font-size: 24rpx;
color: #666;
}
.share-cancel {
height: 100rpx;
display: flex;
align-items: center;
justify-content: center;
border-top: 1rpx solid #f0f0f0;
font-size: 32rpx;
color: #333;
}
</style> </style>

View File

@ -216,7 +216,7 @@
/* 列表区域 */ /* 列表区域 */
.list { .list {
position: fixed; position: fixed;
top: calc(var(--status-bar-height) + 44px + 272rpx); /* 导航栏 + 添加入口高度(约) */ top: calc(var(--status-bar-height) + 44px + 140rpx); /* 导航栏 + 添加入口高度(约) */
bottom: 0; bottom: 0;
left: 0; left: 0;
right: 0; right: 0;

View File

@ -1,5 +1,5 @@
<template> <template>
<view class="stop-page"> <view class="stop-page" :class="{ 'picker-open': !showBottom }">
<navBar :title="title" /> <navBar :title="title" />
<view class="content-area"> <view class="content-area">
@ -29,14 +29,14 @@
<view class="range-list" v-if="reason!=3"> <view class="range-list" v-if="reason!=3">
<view class="range-row" v-for="(item,idx) in ranges" :key="idx"> <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-datetime-picker type="daterange" value="item" :start="start" @change="(e)=>handleChange(e,idx)" @show="closeBottom" @close="openBottom" @maskClick="openBottom"/>
<uni-icons type="minus" size="30" color="#8B2316" @click="removeRange(idx)" v-if="idx > 0"></uni-icons> <uni-icons type="minus" size="30" color="#8B2316" @click="removeRange(idx)" v-if="idx > 0"></uni-icons>
</view> </view>
</view> </view>
<view class="range-list" v-if="reason==3"> <view class="range-list" v-if="reason==3">
<view class="range-row" v-for="(item,idx) in ranges" :key="idx"> <view class="range-row" v-for="(item,idx) in ranges" :key="idx">
<uni-datetime-picker type="date" value="item[0]" :start="start" @change="(e)=>handleChangeDate(e,idx)" /> <uni-datetime-picker type="date" value="item[0]" :start="start" @change="(e)=>handleChangeDate(e,idx)" @show="closeBottom" @close="openBottom" @maskClick="openBottom"/>
<view class="rowbox"> <view class="rowbox">
<uni-data-select v-model="item[1]" placeholder="请选择时段" :localdata="rangeData" @change="(e)=>changeRangeData(e,idx)"></uni-data-select> <uni-data-select v-model="item[1]" placeholder="请选择时段" :localdata="rangeData" @change="(e)=>changeRangeData(e,idx)"></uni-data-select>
</view> </view>
@ -55,7 +55,7 @@
</view> </view>
</view> </view>
<view class="bottom-actions"> <view class="bottom-actions" v-if="showBottom">
<view class="confirm-btn" @click="submit"> <view class="confirm-btn" @click="submit">
<text class="btn-text">确定发布</text> <text class="btn-text">确定发布</text>
</view> </view>
@ -120,29 +120,46 @@ const noticeConfirm = () => {
noticeVisible.value = false noticeVisible.value = false
addStopPatient() addStopPatient()
} }
const showBottom = ref(true)
const title = ref('发布停诊') const title = ref('发布停诊')
const reason = ref(1) const reason = ref(1)
const ranges = ref([[]]) const ranges = ref([{}])
const remark = ref('') const remark = ref('')
const remarkPh = '您可以在这里填写想告诉患者的停诊补充信息最多填写300个字哦~' const remarkPh = '您可以在这里填写想告诉患者的停诊补充信息最多填写300个字哦~'
const start = ref(new Date().getTime()) const start = ref(new Date().getTime())
const end = ref( Date.now()+10*365*24*3600*1000) const end = ref( Date.now()+10*365*24*3600*1000)
const selectReason = (val) => { reason.value = val } const selectReason = (val) => {
reason.value = val;
if(val==3){
ranges.value=[{}];
}
}
const addRange = () => { ranges.value.push([]) } const addRange = () => { ranges.value.push([]) }
const rangeData=ref([{text:'上午',value:'上午'},{text:'下午',value:'下午'},{text:'晚上',value:'晚上'},{text:'全天',value:'全天'}]) const rangeData=ref([{text:'上午',value:'上午'},{text:'下午',value:'下午'},{text:'晚上',value:'晚上'},{text:'全天',value:'全天'}])
const closeBottom = () => {
showBottom.value = false
}
const openBottom = () => {
showBottom.value = true
}
const handleChange = (e,idx) => { const handleChange = (e,idx) => {
console.log(e) console.log(e)
ranges.value[idx] =e; ranges.value[idx] =e;
openBottom();
console.log(showBottom.value)
} }
const handleChangeDate = (e,idx) => { const handleChangeDate = (e,idx) => {
console.log(e) console.log(e)
ranges.value[idx][0] =e; ranges.value[idx][0] =e;
openBottom();
console.log(showBottom.value)
} }
const changeRangeData = (e,idx) => { const changeRangeData = (e,idx) => {
console.log(e) console.log(e)
ranges.value[idx][1] =e; ranges.value[idx][1] =e;
} }
const addStopPatient = async () => { const addStopPatient = async () => {
let date_arr=[] let date_arr=[]
@ -152,6 +169,7 @@ const addStopPatient = async () => {
param2:item[1] param2:item[1]
}) })
}) })
//console.log(date_arr)
const res = await api.addStopPatient({ const res = await api.addStopPatient({
type: reason.value, type: reason.value,
date_list: date_arr, date_list: date_arr,
@ -168,8 +186,8 @@ const recordVoice = () => {
} }
const submit = () => { const submit = () => {
console.log(ranges.value);
let invalid=invalid = ranges.value.some(r => !r[0] || !r[1]) let invalid=ranges.value.some(r => !r[0] || !r[1])
if (invalid) { if (invalid) {
if(reason.value==3){ if(reason.value==3){
uni.showToast({ title: '请选择停诊时间或者时间段', icon: 'none' }) uni.showToast({ title: '请选择停诊时间或者时间段', icon: 'none' })
@ -186,6 +204,14 @@ const submit = () => {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.range-list{
position: relative;
z-index:99;
:deep(.uni-date-btn--ok){
position: relative;
z-index:9999;
}
}
.ppt-content{ .ppt-content{
.tip{ .tip{
@ -236,17 +262,32 @@ const submit = () => {
position: relative; position: relative;
z-index:99; z-index:99;
} }
/* iOS 端日期弹层容易被滚动容器裁切,强制提高层级并贴底展示 */
:deep(.uni-calendar__mask){
z-index: 9998 !important;
}
:deep(.uni-calendar--fixed){
z-index: 9999 !important;
bottom: 0 !important;
}
:deep(.uni-date-btn--ok){
position: relative;
z-index: 10000 !important;
}
} }
.content-area { .content-area {
position: fixed; position: fixed;
overflow-y: scroll; overflow-y: scroll;
padding: 30rpx; padding: 30rpx;
width: 100%; width: 100%;
z-index:1; z-index:2;
box-sizing: border-box; box-sizing: border-box;
top: calc(var(--status-bar-height) + 44px); top: calc(var(--status-bar-height) + 44px);
bottom:152rpx; bottom:152rpx;
} }
.stop-page.picker-open .content-area{
overflow: visible;
}
.form-section { margin-bottom: 40rpx; } .form-section { margin-bottom: 40rpx; }
.section-head { display: flex; justify-content: space-between; align-items: center; } .section-head { display: flex; justify-content: space-between; align-items: center; }
@ -268,7 +309,7 @@ const submit = () => {
.remark {box-sizing: border-box; width: 100%; min-height: 220rpx; background: #f2f2f2; border-radius: 10rpx; padding: 20rpx; color: #333; } .remark {box-sizing: border-box; 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; } .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; } .bottom-actions { position: fixed; left: 0; right: 0; bottom: 0; background: #fff; padding: 30rpx; border-top: 1rpx solid #eee; z-index:1;}
.confirm-btn { background: #8B2316; border-radius: 12rpx; padding: 24rpx 0; text-align: center; } .confirm-btn { background: #8B2316; border-radius: 12rpx; padding: 24rpx 0; text-align: center; }
.btn-text { color: #fff; font-size: 32rpx; } .btn-text { color: #fff; font-size: 32rpx; }
</style> </style>

BIN
static/addpatient.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

BIN
static/edit_patitent.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB