Merge branch 'master' of https://gitea.igandanyiyuan.com/gdxz/uniapp-app
This commit is contained in:
commit
c6ce198c31
@ -1709,7 +1709,7 @@
|
|||||||
"list": [
|
"list": [
|
||||||
{
|
{
|
||||||
"name": "",
|
"name": "",
|
||||||
"path": "pages_app/newsList/newsList",
|
"path": "pages_app/patientMsg/patientMsg",
|
||||||
"query": ""
|
"query": ""
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@ -33,10 +33,11 @@
|
|||||||
:lower-threshold="100"
|
:lower-threshold="100"
|
||||||
>
|
>
|
||||||
<!-- 空状态 -->
|
<!-- 空状态 -->
|
||||||
<view class="empty-state" v-if="recordList.length === 0 && !loading">
|
<empty v-if="recordList.length === 0 && !loading" :emptyDesc="'您暂未添加病情记录'"></empty>
|
||||||
|
<!-- <view class="empty-state" v-if="recordList.length === 0 && !loading">
|
||||||
<text class="empty-text">暂无病情记录</text>
|
<text class="empty-text">暂无病情记录</text>
|
||||||
<button class="add-first-btn" @click="addRecord">添加第一条记录</button>
|
<button class="add-first-btn" @click="addRecord">添加第一条记录</button>
|
||||||
</view>
|
</view> -->
|
||||||
|
|
||||||
<!-- 时间线容器 -->
|
<!-- 时间线容器 -->
|
||||||
<view class="timeline-container" v-else>
|
<view class="timeline-container" v-else>
|
||||||
@ -108,6 +109,7 @@ import { onShow, onLoad } from '@dcloudio/uni-app'
|
|||||||
import navBar from '@/components/navBar/navBar.vue'
|
import navBar from '@/components/navBar/navBar.vue'
|
||||||
import api from '@/api/api.js'
|
import api from '@/api/api.js'
|
||||||
import docUrl from '@/utils/docUrl.js'
|
import docUrl from '@/utils/docUrl.js'
|
||||||
|
import empty from '@/components/empty/empty.vue'
|
||||||
|
|
||||||
const patientUuid = ref('')
|
const patientUuid = ref('')
|
||||||
const getRecordList = (isRefresh = false) => {
|
const getRecordList = (isRefresh = false) => {
|
||||||
@ -200,7 +202,7 @@ const goBack = () => {
|
|||||||
const addRecord = () => {
|
const addRecord = () => {
|
||||||
// 跳转到添加记录页面
|
// 跳转到添加记录页面
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: '/pages_app/addRecord/addRecord?patientUuid=' + patientUuid.value
|
url: '/pages_app/caseRecord/caseRecord?patientUuid=' + patientUuid.value
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -396,7 +398,7 @@ onMounted(() => {
|
|||||||
height: 200rpx;
|
height: 200rpx;
|
||||||
border-radius: 12rpx;
|
border-radius: 12rpx;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.content-image {
|
.content-image {
|
||||||
|
|||||||
@ -41,6 +41,7 @@
|
|||||||
class="description-input"
|
class="description-input"
|
||||||
v-model="des"
|
v-model="des"
|
||||||
placeholder="请输入患者病情"
|
placeholder="请输入患者病情"
|
||||||
|
:adjust-position="false"
|
||||||
></textarea>
|
></textarea>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@ -347,7 +348,7 @@ const saveRecord = () => {
|
|||||||
bottom:150rpx;
|
bottom:150rpx;
|
||||||
z-index:1;
|
z-index:1;
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
padding: 30rpx;
|
padding:0 30rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.form-item {
|
.form-item {
|
||||||
|
|||||||
@ -229,7 +229,12 @@ onMounted(() => {
|
|||||||
|
|
||||||
/* 主要内容区域 */
|
/* 主要内容区域 */
|
||||||
.main-content {
|
.main-content {
|
||||||
margin-top: calc(var(--status-bar-height) + 44px);
|
position: fixed;
|
||||||
|
top: calc(var(--status-bar-height) + 44px);
|
||||||
|
left: 0;
|
||||||
|
right:0;
|
||||||
|
bottom: 0rpx;
|
||||||
|
overflow-y: scroll;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,7 +319,7 @@ onMounted(() => {
|
|||||||
height: 200rpx;
|
height: 200rpx;
|
||||||
border-radius: 12rpx;
|
border-radius: 12rpx;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.report-image {
|
.report-image {
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
|
|
||||||
<!-- 顶部导航栏 -->
|
<!-- 顶部导航栏 -->
|
||||||
<navBar :title="'意见反馈'"></navBar>
|
<navBar :title="'投诉反馈'"></navBar>
|
||||||
|
|
||||||
<!-- 反馈输入区域 -->
|
<!-- 反馈输入区域 -->
|
||||||
<view class="feedback-input-container">
|
<view class="feedback-input-container">
|
||||||
@ -14,6 +14,7 @@
|
|||||||
v-model="feedbackText"
|
v-model="feedbackText"
|
||||||
:maxlength="200"
|
:maxlength="200"
|
||||||
placeholder="尊敬的医生您好,若在交流过程中发现患者发布不适当内容,请您及时填写相关信息,我们将第一时间处理,谢谢您的支持。"
|
placeholder="尊敬的医生您好,若在交流过程中发现患者发布不适当内容,请您及时填写相关信息,我们将第一时间处理,谢谢您的支持。"
|
||||||
|
:adjust-position="false"
|
||||||
@input="onInput"
|
@input="onInput"
|
||||||
></textarea>
|
></textarea>
|
||||||
<!-- <view class="voice-button" @click="toggleVoiceInput">
|
<!-- <view class="voice-button" @click="toggleVoiceInput">
|
||||||
@ -126,9 +127,15 @@
|
|||||||
|
|
||||||
/* 反馈输入区域 */
|
/* 反馈输入区域 */
|
||||||
.feedback-input-container {
|
.feedback-input-container {
|
||||||
margin-top: calc(var(--status-bar-height) + 44px);
|
top: calc(var(--status-bar-height) + 44px);
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 160rpx;
|
||||||
|
overflow-y: scroll;
|
||||||
|
z-index: 1;
|
||||||
padding: 30rpx;
|
padding: 30rpx;
|
||||||
flex: 1;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
.input-area {
|
.input-area {
|
||||||
|
|||||||
@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
<!-- 输入框区域 -->
|
<!-- 输入框区域 -->
|
||||||
<view class="note-box">
|
<view class="note-box">
|
||||||
<textarea class="note-textarea" v-model.trim="note" placeholder="请填写随访内容" auto-height :maxlength="200" />
|
<textarea class="note-textarea" v-model.trim="note" placeholder="请填写随访内容" auto-height :maxlength="200" :adjust-position="false"/>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<!-- 底部删除按钮 -->
|
<!-- 底部删除按钮 -->
|
||||||
@ -106,7 +106,7 @@
|
|||||||
|
|
||||||
}
|
}
|
||||||
.visit-note-page{
|
.visit-note-page{
|
||||||
min-height: 100vh; background:#f5f5f5; padding-bottom: 120rpx;
|
background:#f5f5f5; padding-bottom: 120rpx;
|
||||||
}
|
}
|
||||||
.nav-right{ display:flex; align-items:center; }
|
.nav-right{ display:flex; align-items:center; }
|
||||||
.submit-text{ color:#8B2316; font-size: 30rpx; }
|
.submit-text{ color:#8B2316; font-size: 30rpx; }
|
||||||
|
|||||||
@ -38,8 +38,8 @@
|
|||||||
<!-- 已选中的成员 -->
|
<!-- 已选中的成员 -->
|
||||||
<view class="selected-members" v-if="members.length > 0">
|
<view class="selected-members" v-if="members.length > 0">
|
||||||
<view class="selected-item" v-for="(m, idx) in members" :key="m.uuid || idx">
|
<view class="selected-item" v-for="(m, idx) in members" :key="m.uuid || idx">
|
||||||
<image class="selected-avatar" :src="docUrl + (m.photo || '')" mode="aspectFill" />
|
<image class="selected-avatar" :src="getMemberAvatar(m)" mode="aspectFill" @error="handleMemberAvatarError(m)" />
|
||||||
<text class="selected-name">{{ m.realName || '未知' }}</text>
|
<text class="selected-name">{{ m.nickname || m.realName }}</text>
|
||||||
<view class="remove-selected" @click="removeMember(idx)">
|
<view class="remove-selected" @click="removeMember(idx)">
|
||||||
<text class="remove-text">——</text>
|
<text class="remove-text">——</text>
|
||||||
<!-- <up-icon name="minus" size="43rpx" color="#fff" bold /> -->
|
<!-- <up-icon name="minus" size="43rpx" color="#fff" bold /> -->
|
||||||
@ -68,11 +68,33 @@
|
|||||||
import delImg from "@/static/iv_delete.png"
|
import delImg from "@/static/iv_delete.png"
|
||||||
import addImg from "@/static/addpatient.png"
|
import addImg from "@/static/addpatient.png"
|
||||||
import api from '@/api/api.js'
|
import api from '@/api/api.js'
|
||||||
|
import defaultImg from "@/static/default.png"
|
||||||
import unidialog from '@/components/dialog/dialog.vue'
|
import unidialog from '@/components/dialog/dialog.vue'
|
||||||
const groupUuid = ref('')
|
const groupUuid = ref('')
|
||||||
const groupName = ref('')
|
const groupName = ref('')
|
||||||
const members = ref([])
|
const members = ref([])
|
||||||
const visible = ref(false)
|
const visible = ref(false)
|
||||||
|
const avatarErrorMap = ref({})
|
||||||
|
const getAvatarKey = (member = {}) => String(member.uuid || member.id || member.realName || '')
|
||||||
|
const normalizeAvatarUrl = (photo) => {
|
||||||
|
const raw = String(photo || '').trim()
|
||||||
|
if (!raw) return defaultImg
|
||||||
|
if (/^https?:\/\//i.test(raw)) return raw
|
||||||
|
return `${docUrl}${raw}`
|
||||||
|
}
|
||||||
|
const getMemberAvatar = (member = {}) => {
|
||||||
|
const key = getAvatarKey(member)
|
||||||
|
if (key && avatarErrorMap.value[key]) return defaultImg
|
||||||
|
return normalizeAvatarUrl(member.photo)
|
||||||
|
}
|
||||||
|
const handleMemberAvatarError = (member) => {
|
||||||
|
const key = getAvatarKey(member)
|
||||||
|
if (!key) return
|
||||||
|
avatarErrorMap.value = {
|
||||||
|
...avatarErrorMap.value,
|
||||||
|
[key]: true
|
||||||
|
}
|
||||||
|
}
|
||||||
const confirmDelete = () => {
|
const confirmDelete = () => {
|
||||||
deleteGroup();
|
deleteGroup();
|
||||||
}
|
}
|
||||||
@ -186,6 +208,7 @@
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
const patientListByGroup = async () => {
|
const patientListByGroup = async () => {
|
||||||
|
avatarErrorMap.value = {}
|
||||||
const res = await api.patientListByGroup({
|
const res = await api.patientListByGroup({
|
||||||
group_uuid: groupUuid.value,
|
group_uuid: groupUuid.value,
|
||||||
list_sort:0
|
list_sort:0
|
||||||
|
|||||||
@ -16,6 +16,7 @@
|
|||||||
</uni-nav-bar>
|
</uni-nav-bar>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
|
<view class="content-box">
|
||||||
<!-- 已选中的分组 -->
|
<!-- 已选中的分组 -->
|
||||||
<view class="selected-section">
|
<view class="selected-section">
|
||||||
<view class="tag-list">
|
<view class="tag-list">
|
||||||
@ -44,6 +45,7 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
<!-- 底部添加按钮 -->
|
<!-- 底部添加按钮 -->
|
||||||
<view class="bottom-bar">
|
<view class="bottom-bar">
|
||||||
@ -81,7 +83,9 @@ const loadAllGroups = async () => {
|
|||||||
try {
|
try {
|
||||||
const res = await api.groupList();
|
const res = await api.groupList();
|
||||||
if (res.code === 200) {
|
if (res.code === 200) {
|
||||||
allGroups.value = res.data || [];
|
const hiddenGroupNames = new Set(['待分组患者', '肝系医生非患教组', '肝系医生患教组']);
|
||||||
|
const arr = (res.data || []).filter((item) => !hiddenGroupNames.has(String(item?.name || '').trim()));
|
||||||
|
allGroups.value = arr;
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("加载分组列表失败:", e);
|
console.error("加载分组列表失败:", e);
|
||||||
@ -166,8 +170,17 @@ const saveGroups = () => {
|
|||||||
font-size: 30rpx;
|
font-size: 30rpx;
|
||||||
color: #333;
|
color: #333;
|
||||||
}
|
}
|
||||||
|
.content-box{
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
top: calc(var(--status-bar-height) + 44px);
|
||||||
|
bottom: 140rpx;
|
||||||
|
overflow-y: scroll;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
.selected-section {
|
.selected-section {
|
||||||
margin-top: calc(var(--status-bar-height) + 44px);
|
|
||||||
min-height: 300rpx;
|
min-height: 300rpx;
|
||||||
padding: 30rpx;
|
padding: 30rpx;
|
||||||
border-bottom: 20rpx solid #f0f0f0;
|
border-bottom: 20rpx solid #f0f0f0;
|
||||||
@ -238,7 +251,7 @@ const saveGroups = () => {
|
|||||||
bottom: 0;
|
bottom: 0;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border-top: 1rpx solid #f0f0f0;
|
border-top: 1rpx solid #f0f0f0;
|
||||||
padding: 20rpx 30rpx env(safe-area-inset-bottom);
|
padding: 20rpx 30rpx 20rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.add-btn {
|
.add-btn {
|
||||||
|
|||||||
@ -236,8 +236,15 @@ const getBankLogo = (bankName) => {
|
|||||||
|
|
||||||
/* 银行卡列表样式 */
|
/* 银行卡列表样式 */
|
||||||
.card-list {
|
.card-list {
|
||||||
margin-top: calc(var(--status-bar-height) + 44px);
|
top: calc(var(--status-bar-height) + 44px);
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0rpx;
|
||||||
|
overflow-y: scroll;
|
||||||
|
z-index: 1;
|
||||||
padding: 30rpx;
|
padding: 30rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
.swipe-right {
|
.swipe-right {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|||||||
@ -68,6 +68,7 @@
|
|||||||
class="form-input"
|
class="form-input"
|
||||||
placeholder="请输入您的姓名"
|
placeholder="请输入您的姓名"
|
||||||
v-model="formData.name"
|
v-model="formData.name"
|
||||||
|
:adjust-position="false"
|
||||||
placeholder-style="color: #cccccc"
|
placeholder-style="color: #cccccc"
|
||||||
/>
|
/>
|
||||||
</view>
|
</view>
|
||||||
@ -76,6 +77,7 @@
|
|||||||
<input
|
<input
|
||||||
class="form-input"
|
class="form-input"
|
||||||
placeholder="请输入您的身份证号"
|
placeholder="请输入您的身份证号"
|
||||||
|
:adjust-position="false"
|
||||||
v-model="formData.idNumber"
|
v-model="formData.idNumber"
|
||||||
placeholder-style="color: #cccccc"
|
placeholder-style="color: #cccccc"
|
||||||
/>
|
/>
|
||||||
@ -92,6 +94,7 @@
|
|||||||
:class="{ 'is-filled': !!formData.cardNumber }"
|
:class="{ 'is-filled': !!formData.cardNumber }"
|
||||||
placeholder="仅限借记卡"
|
placeholder="仅限借记卡"
|
||||||
:value="cardNumberDisplay"
|
:value="cardNumberDisplay"
|
||||||
|
:adjust-position="false"
|
||||||
@input="onCardNumberInput"
|
@input="onCardNumberInput"
|
||||||
placeholder-style="color: #cccccc"
|
placeholder-style="color: #cccccc"
|
||||||
/>
|
/>
|
||||||
@ -108,6 +111,7 @@
|
|||||||
class="form-input card-number-input"
|
class="form-input card-number-input"
|
||||||
placeholder="银行预留手机号"
|
placeholder="银行预留手机号"
|
||||||
v-model="formData.mobile"
|
v-model="formData.mobile"
|
||||||
|
:adjust-position="false"
|
||||||
placeholder-style="color: #cccccc"
|
placeholder-style="color: #cccccc"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
@ -297,7 +301,7 @@ const onNextStep = async () => {
|
|||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('身份验证失败:', error);
|
console.error('身份验证失败:', error);
|
||||||
uni.showToast({ title: '网络错误,请重试', icon: 'none' });
|
uni.showToast({ title: res.message, icon: 'none' });
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
}
|
}
|
||||||
} else if (currentStep.value === 2) {
|
} else if (currentStep.value === 2) {
|
||||||
@ -390,12 +394,17 @@ const onCancelSms = () => {
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.idcard-auth-page {
|
.idcard-auth-page {
|
||||||
min-height: 100vh;
|
|
||||||
background: #f5f5f5;
|
background: #f5f5f5;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content-area {
|
.content-area {
|
||||||
margin-top: calc(var(--status-bar-height) + 44px);
|
top: calc(var(--status-bar-height) + 44px);
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
overflow-y: scroll;
|
||||||
|
z-index: 1;
|
||||||
padding: 0rpx 0rpx 0;
|
padding: 0rpx 0rpx 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -96,7 +96,13 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.detail-content {
|
.detail-content {
|
||||||
margin-top: calc(var(--status-bar-height) + 44px);
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
top: calc(var(--status-bar-height) + 44px);
|
||||||
|
bottom: 0;
|
||||||
|
overflow-y: auto;
|
||||||
|
box-sizing: border-box;
|
||||||
background: #ffffff;
|
background: #ffffff;
|
||||||
padding: 0 24rpx;
|
padding: 0 24rpx;
|
||||||
}
|
}
|
||||||
@ -110,14 +116,14 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.label {
|
.label {
|
||||||
font-size: 38rpx;
|
font-size: 30rpx;
|
||||||
color: #2c2c2c;
|
color: #2c2c2c;
|
||||||
}
|
}
|
||||||
|
|
||||||
.value {
|
.value {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
font-size: 38rpx;
|
font-size: 30rpx;
|
||||||
color: #666666;
|
color: #666666;
|
||||||
margin-left: 20rpx;
|
margin-left: 20rpx;
|
||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
|
|||||||
@ -231,7 +231,7 @@ onMounted(() => {
|
|||||||
border-bottom: 1rpx solid #ccc;
|
border-bottom: 1rpx solid #ccc;
|
||||||
|
|
||||||
.header-cell {
|
.header-cell {
|
||||||
font-size: 28rpx;
|
font-size: 30rpx;
|
||||||
color: #333;
|
color: #333;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
|
|
||||||
@ -281,7 +281,7 @@ onMounted(() => {
|
|||||||
border-bottom: 1rpx solid #e5e5e5;
|
border-bottom: 1rpx solid #e5e5e5;
|
||||||
|
|
||||||
.cell {
|
.cell {
|
||||||
font-size: 26rpx;
|
font-size: 30rpx;
|
||||||
|
|
||||||
&.business-type {
|
&.business-type {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
|||||||
@ -399,7 +399,7 @@ const onGetSmsCode = async () => {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('发送短信验证码失败:', error)
|
console.error('发送短信验证码失败:', error)
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: '网络错误,请重试',
|
title:error.message || error.msg,
|
||||||
icon: 'none'
|
icon: 'none'
|
||||||
})
|
})
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
@ -14,6 +14,7 @@
|
|||||||
placeholder="请依据患者的个人信息、疾病资料及患者所咨询的问题详细解答患者的问题(信息仅提问患者及医生可见,最多输入300个字)"
|
placeholder="请依据患者的个人信息、疾病资料及患者所咨询的问题详细解答患者的问题(信息仅提问患者及医生可见,最多输入300个字)"
|
||||||
placeholder-class="ph"
|
placeholder-class="ph"
|
||||||
auto-height
|
auto-height
|
||||||
|
:adjust-position="false"
|
||||||
/>
|
/>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|||||||
@ -137,13 +137,18 @@ onLoad((options) => {
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.detail-page {
|
.detail-page {
|
||||||
min-height: 100vh;
|
|
||||||
background: #f5f5f5;
|
background: #f5f5f5;
|
||||||
}
|
}
|
||||||
|
|
||||||
.order-card {
|
.order-card {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
margin-top: calc(var(--status-bar-height) + 44px);
|
top: calc(var(--status-bar-height) + 44px);
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
right:0;
|
||||||
|
z-index: 10;
|
||||||
|
overflow-y: scroll;
|
||||||
}
|
}
|
||||||
|
|
||||||
.order-top {
|
.order-top {
|
||||||
|
|||||||
@ -450,7 +450,8 @@ $card: #ffffff;
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 26rpx 30rpx;
|
padding: 26rpx 30rpx;
|
||||||
border-bottom: 2rpx solid #f2f2f2;
|
background: #fff;
|
||||||
|
border-bottom: 2rpx solid #ccc;
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
color: #333;
|
color: #333;
|
||||||
|
|
||||||
@ -458,8 +459,8 @@ $card: #ffffff;
|
|||||||
.name { text-align: left; }
|
.name { text-align: left; }
|
||||||
.time { text-align: center; color: #666; }
|
.time { text-align: center; color: #666; }
|
||||||
.qty { text-align: center; }
|
.qty { text-align: center; }
|
||||||
.qty.plus { color: #2dbd85; }
|
.qty.plus { color: #333; }
|
||||||
.qty.minus { color: #e34d4d; }
|
.qty.minus { color: #333; }
|
||||||
}
|
}
|
||||||
|
|
||||||
.empty-wrap { padding-top: 200rpx; display: flex; flex-direction: column; align-items: center; color: #bdbdbd; }
|
.empty-wrap { padding-top: 200rpx; display: flex; flex-direction: column; align-items: center; color: #bdbdbd; }
|
||||||
|
|||||||
@ -1,10 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<navBar :title="from == 'msg' ? '新的患者' : '我的患者'" />
|
<navBar :title="'新的患者'" />
|
||||||
<view class="new-patient-page">
|
<view class="new-patient-page">
|
||||||
<!-- 提醒区域 -->
|
<!-- 提醒区域 -->
|
||||||
|
<view class="contentbox">
|
||||||
<view class="reminder-section">
|
<view class="reminder-section">
|
||||||
<view class="reminder-icon">
|
<view class="reminder-icon">
|
||||||
<uni-icons type="notification" size="16" color="#ff9500"></uni-icons>
|
<up-image :src="tipImg" width="35rpx" height="42rpx"></up-image>
|
||||||
</view>
|
</view>
|
||||||
<text class="reminder-text">提醒: 为了避免不必要的纠纷,请您务必选择线下就诊过的患者</text>
|
<text class="reminder-text">提醒: 为了避免不必要的纠纷,请您务必选择线下就诊过的患者</text>
|
||||||
</view>
|
</view>
|
||||||
@ -15,7 +16,7 @@
|
|||||||
<view class="pending-request" v-for="(item, index) in applyList" :key="index">
|
<view class="pending-request" v-for="(item, index) in applyList" :key="index">
|
||||||
<view class="request-item">
|
<view class="request-item">
|
||||||
<view class="avatar">
|
<view class="avatar">
|
||||||
<up-image :src="docUrl+item.photo" radius="10rpx" width="80rpx" height="80rpx" ></up-image>
|
<up-image :src="docUrl+item.photo" radius="10rpx" width="120rpx" height="120rpx" ></up-image>
|
||||||
</view>
|
</view>
|
||||||
<view class="request-content">
|
<view class="request-content">
|
||||||
<view class="request-time">{{ item.createDate }}</view>
|
<view class="request-time">{{ item.createDate }}</view>
|
||||||
@ -23,7 +24,7 @@
|
|||||||
|
|
||||||
<view class="action-buttons">
|
<view class="action-buttons">
|
||||||
<button class="reject-btn" @click="applyListOperate(item.uuid,3)">拒绝</button>
|
<button class="reject-btn" @click="applyListOperate(item.uuid,3)">拒绝</button>
|
||||||
<button class="agree-btn" @click="applyListOperate(item.uuid,2)">同意</button>
|
<button class="agree-btn" @click="applyListOperate(item.uuid,2,item.content)">同意</button>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@ -34,13 +35,13 @@
|
|||||||
<view class="history-section" v-if="historyList.length > 0">
|
<view class="history-section" v-if="historyList.length > 0">
|
||||||
<view class="section-title">申请记录(近一月)</view>
|
<view class="section-title">申请记录(近一月)</view>
|
||||||
<view class="history-list">
|
<view class="history-list">
|
||||||
<view class="history-item" v-for="(item, index) in historyList" :key="index">
|
<view class="history-item" v-for="(item, index) in historyList" :key="index" @click="goPatientDetail(item.patient_uuid,item.status)">
|
||||||
<view class="avatar">
|
<view class="avatar">
|
||||||
<up-image v-if="docUrl+item.patient_photo" :src="docUrl + item.patient_photo" radius="10rpx" width="80rpx" height="80rpx"></up-image>
|
<up-image v-if="docUrl+item.patient_photo" :src="docUrl + item.patient_photo" radius="10rpx" width="120rpx" height="120rpx"></up-image>
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
<view class="history-content">
|
<view class="history-content">
|
||||||
<view class="history-time">{{ formatDate(item.createDate) }}</view>
|
<view class="history-time">{{ formatDate2(item.create_date) }}</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">
|
||||||
@ -51,8 +52,10 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<empty v-if="applyList.length == 0 && historyList.length == 0" :emptyDesc="'暂无新随访申请患者'" />
|
<empty v-if="applyList.length == 0 && historyList.length == 0" :emptyDesc="'暂无新随访申请患者'" />
|
||||||
|
|
||||||
|
</view>
|
||||||
<!-- 底部按钮 -->
|
<!-- 底部按钮 -->
|
||||||
<view class="bottom-button">
|
<view class="bottom-button">
|
||||||
<button class="add-patient-btn" @click="addPatient">加患者</button>
|
<button class="add-patient-btn" @click="addPatient">加患者</button>
|
||||||
@ -66,9 +69,11 @@ import { onLoad,onShow,onBackPress} from '@dcloudio/uni-app';
|
|||||||
import goImg from "@/static/go_big.png"
|
import goImg from "@/static/go_big.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 navTo from "@/utils/navTo.js"
|
import navTo from "@/utils/navTo.js"
|
||||||
import empty from "@/components/empty/empty.vue"
|
import empty from "@/components/empty/empty.vue"
|
||||||
import navBar from "@/components/navBar/navBar.vue"
|
import navBar from "@/components/navBar/navBar.vue"
|
||||||
|
import tipImg from "@/static/sendgroup_tishi_big.png"
|
||||||
const from=ref('');
|
const from=ref('');
|
||||||
onLoad((options) => {
|
onLoad((options) => {
|
||||||
if(options.from){
|
if(options.from){
|
||||||
@ -167,7 +172,7 @@ const getApplyList = async () => { // 申请列表
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const applyListOperate = async (uuid,status) => {
|
const applyListOperate = async (uuid,status,content) => {
|
||||||
let data = {
|
let data = {
|
||||||
uuid: uuid,
|
uuid: uuid,
|
||||||
status: status
|
status: status
|
||||||
@ -180,11 +185,12 @@ const getApplyList = async () => { // 申请列表
|
|||||||
icon: 'none',
|
icon: 'none',
|
||||||
duration: 1500
|
duration: 1500
|
||||||
});
|
});
|
||||||
|
let nickname = content.split(',')[0].replace('我是', '');
|
||||||
getApplyList();
|
getApplyList();
|
||||||
getRelationRecordLately();
|
getRelationRecordLately();
|
||||||
if(status == 2){
|
if(status == 2){
|
||||||
navTo({
|
navTo({
|
||||||
url: `/pages_app/patientRemark/patientRemark?uuid=${uuid}`
|
url: `/pages_app/patientRemark/patientRemark?uuid=${uuid}&&nickname=${nickname}`
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -195,6 +201,15 @@ const getApplyList = async () => { // 申请列表
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const goPatientDetail = (uuid,status) => {
|
||||||
|
|
||||||
|
if(status == 2){
|
||||||
|
navTo({
|
||||||
|
url: `/pages_app/patientDetail/patientDetail?uuid=${uuid}`
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 辅助方法
|
// 辅助方法
|
||||||
// 格式化日期
|
// 格式化日期
|
||||||
const formatDate = (dateString) => {
|
const formatDate = (dateString) => {
|
||||||
@ -207,6 +222,9 @@ const formatDate = (dateString) => {
|
|||||||
const minutes = String(date.getMinutes()).padStart(2, '0');
|
const minutes = String(date.getMinutes()).padStart(2, '0');
|
||||||
return `${year}-${month}-${day} ${hours}:${minutes}`;
|
return `${year}-${month}-${day} ${hours}:${minutes}`;
|
||||||
};
|
};
|
||||||
|
const formatDate2 = (dateString) => {
|
||||||
|
return dayjs(dateString).format('YYYY-MM-DD HH:mm:ss');
|
||||||
|
}
|
||||||
|
|
||||||
// 获取状态文本
|
// 获取状态文本
|
||||||
const getStatusText = (status) => {
|
const getStatusText = (status) => {
|
||||||
@ -219,7 +237,7 @@ const getStatusText = (status) => {
|
|||||||
|
|
||||||
const addPatient = () => {
|
const addPatient = () => {
|
||||||
navTo({
|
navTo({
|
||||||
url:'/pages_app/myCode/myCode'
|
url:'/pages_app/myCode/myCode?from=myPatient'
|
||||||
});
|
});
|
||||||
// 这里可以跳转到添加患者页面
|
// 这里可以跳转到添加患者页面
|
||||||
};
|
};
|
||||||
@ -227,7 +245,7 @@ const addPatient = () => {
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.new-patient-page {
|
.new-patient-page {
|
||||||
min-height: 100vh;
|
|
||||||
background-color: #f5f5f5;
|
background-color: #f5f5f5;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -322,16 +340,27 @@ const addPatient = () => {
|
|||||||
margin-right: 60rpx; // 为了保持标题居中
|
margin-right: 60rpx; // 为了保持标题居中
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.contentbox{
|
||||||
|
top: calc(var(--status-bar-height) + 44px);
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 100rpx;
|
||||||
|
overflow-y: scroll;
|
||||||
|
z-index: 1;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
.reminder-section {
|
.reminder-section {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: flex-start;
|
align-items:center;
|
||||||
padding: 30rpx;
|
padding: 30rpx;
|
||||||
margin-top: calc(var(--status-bar-height) + 44px);
|
|
||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
margin-bottom: 20rpx;
|
|
||||||
|
|
||||||
.reminder-icon {
|
.reminder-icon {
|
||||||
|
width: 35rpx;
|
||||||
|
height: 42rpx;
|
||||||
margin-right: 20rpx;
|
margin-right: 20rpx;
|
||||||
margin-top: 4rpx;
|
margin-top: 4rpx;
|
||||||
}
|
}
|
||||||
@ -346,11 +375,12 @@ const addPatient = () => {
|
|||||||
|
|
||||||
.follow-up-section {
|
.follow-up-section {
|
||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
margin-bottom: 20rpx;
|
|
||||||
|
|
||||||
.section-title {
|
.section-title {
|
||||||
padding: 30rpx 30rpx 20rpx;
|
padding: 30rpx 30rpx 30rpx;
|
||||||
font-size: 32rpx;
|
font-size: 32rpx;
|
||||||
|
background-color: #f0f0f0;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
color: #333;
|
color: #333;
|
||||||
border-bottom: 1rpx solid #f0f0f0;
|
border-bottom: 1rpx solid #f0f0f0;
|
||||||
@ -361,11 +391,12 @@ const addPatient = () => {
|
|||||||
|
|
||||||
.request-item {
|
.request-item {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 20rpx;
|
|
||||||
|
|
||||||
.avatar {
|
.avatar {
|
||||||
width: 80rpx;
|
width: 120rpx;
|
||||||
height: 80rpx;
|
height: 120rpx;
|
||||||
|
margin-top: 30rpx;
|
||||||
background-color: #ffb6c1;
|
background-color: #ffb6c1;
|
||||||
border-radius: 12rpx;
|
border-radius: 12rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -373,8 +404,8 @@ const addPatient = () => {
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
||||||
.avatar-icon {
|
.avatar-icon {
|
||||||
width: 40rpx;
|
width: 120rpx;
|
||||||
height: 40rpx;
|
height: 120rpx;
|
||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
@ -382,7 +413,7 @@ const addPatient = () => {
|
|||||||
|
|
||||||
.request-content {
|
.request-content {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
margin-left: 20rpx;
|
||||||
.request-text {
|
.request-text {
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
color: #333;
|
color: #333;
|
||||||
@ -444,18 +475,19 @@ const addPatient = () => {
|
|||||||
margin-bottom: 120rpx; // 为底部按钮留出空间
|
margin-bottom: 120rpx; // 为底部按钮留出空间
|
||||||
|
|
||||||
.section-title {
|
.section-title {
|
||||||
padding: 30rpx 30rpx 20rpx;
|
padding: 30rpx 30rpx 30rpx;
|
||||||
font-size: 32rpx;
|
font-size: 32rpx;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
|
background-color: #f0f0f0;
|
||||||
color: #333;
|
color: #333;
|
||||||
border-bottom: 1rpx solid #f0f0f0;
|
border-bottom: 1rpx solid #f0f0f0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.history-list {
|
.history-list {
|
||||||
margin-bottom: 100rpx;
|
margin-bottom: 30rpx;
|
||||||
.history-item {
|
.history-item {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 20rpx;
|
|
||||||
padding: 30rpx;
|
padding: 30rpx;
|
||||||
border-bottom: 1rpx solid #f0f0f0;
|
border-bottom: 1rpx solid #f0f0f0;
|
||||||
|
|
||||||
@ -464,8 +496,9 @@ const addPatient = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.avatar {
|
.avatar {
|
||||||
width: 80rpx;
|
width: 120rpx;
|
||||||
height: 80rpx;
|
height: 120rpx;
|
||||||
|
margin-top: 30rpx;
|
||||||
background-color: #ffb6c1;
|
background-color: #ffb6c1;
|
||||||
border-radius: 12rpx;
|
border-radius: 12rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -482,7 +515,8 @@ const addPatient = () => {
|
|||||||
|
|
||||||
.history-content {
|
.history-content {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
margin-left: 20rpx;
|
||||||
|
min-width: 0;
|
||||||
.nickname {
|
.nickname {
|
||||||
font-size: 30rpx;
|
font-size: 30rpx;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
@ -491,9 +525,14 @@ const addPatient = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.history-text {
|
.history-text {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
font-size: 30rpx;
|
font-size: 30rpx;
|
||||||
color: #333;
|
color: #333;
|
||||||
line-height: 1.4;
|
line-height: 1.4;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
margin-bottom: 20rpx;
|
margin-bottom: 20rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -13,7 +13,8 @@
|
|||||||
>
|
>
|
||||||
<template #right>
|
<template #right>
|
||||||
<view class="nav-right" @click.stop="editPatient">
|
<view class="nav-right" @click.stop="editPatient">
|
||||||
<uni-icons type="compose" size="22" color="#8B2316"></uni-icons>
|
<up-image :src="editImg" width="40rpx" height="40rpx"></up-image>
|
||||||
|
<!-- <uni-icons type="compose" size="22" color="#8B2316"></uni-icons> -->
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
</uni-nav-bar>
|
</uni-nav-bar>
|
||||||
@ -24,10 +25,10 @@
|
|||||||
<image class="avatar" :src="avatarSrc" mode="aspectFill" @error="handleAvatarError"></image>
|
<image class="avatar" :src="avatarSrc" mode="aspectFill" @error="handleAvatarError"></image>
|
||||||
<view class="base-info">
|
<view class="base-info">
|
||||||
<view class="name-row">
|
<view class="name-row">
|
||||||
<text class="name">{{ patientInfo.realName || '未知' }}</text>
|
<text class="name">{{nickname || patientInfo.realName }}</text>
|
||||||
<up-image :src="genderIcon" width="36rpx" height="36rpx"></up-image>
|
<up-image :src="genderIcon" width="36rpx" height="36rpx"></up-image>
|
||||||
</view>
|
</view>
|
||||||
<view class="line"><text class="label">昵称:</text><text class="value">{{nickname }}</text></view>
|
<view class="line" v-if="nickname"><text class="label">昵称:</text><text class="value">{{ patientInfo.realName || '未知' }}</text></view>
|
||||||
<view class="line">
|
<view class="line">
|
||||||
<text class="label">年龄:</text><text class="value">{{ patientDetail.age || '未知' }}</text>
|
<text class="label">年龄:</text><text class="value">{{ patientDetail.age || '未知' }}</text>
|
||||||
<text class="sep">|</text>
|
<text class="sep">|</text>
|
||||||
@ -42,9 +43,16 @@
|
|||||||
|
|
||||||
<!-- 功能分组条目 -->
|
<!-- 功能分组条目 -->
|
||||||
<view class="cell" @click="openGroup" style="margin-top: 20rpx;">
|
<view class="cell" @click="openGroup" style="margin-top: 20rpx;">
|
||||||
|
<text class="cell-label">备注</text>
|
||||||
|
<view class="cell-right">
|
||||||
|
<text class="hint">{{nickname || '给患者添加备注名'}}</text>
|
||||||
|
<uni-icons type="right" color="#999" size="18"></uni-icons>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="cell" @click="openGroup" >
|
||||||
<text class="cell-label">分组</text>
|
<text class="cell-label">分组</text>
|
||||||
<view class="cell-right">
|
<view class="cell-right">
|
||||||
<text class="hint">{{ group.name }}</text>
|
<text class="hint">{{ group.name || '通过分组给患者分类' }}</text>
|
||||||
<uni-icons type="right" color="#999" size="18"></uni-icons>
|
<uni-icons type="right" color="#999" size="18"></uni-icons>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@ -58,27 +66,32 @@
|
|||||||
<view class="cell">
|
<view class="cell">
|
||||||
<text class="cell-label">电话号码</text>
|
<text class="cell-label">电话号码</text>
|
||||||
<view class="cell-right">
|
<view class="cell-right">
|
||||||
<text class="phone">{{ patientInfo.mobile || '未设置' }}</text>
|
<text class="phone" @click="alertDialog">{{ patientInfo.mobile || '未设置' }}</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 患者病史 -->
|
<!-- 患者病史 -->
|
||||||
<view class="history-section" v-if="patientDetail.medicalHistoryContent">
|
<view class="history-section">
|
||||||
<view class="section-title">患者病史</view>
|
<view class="section-title">患者病史</view>
|
||||||
<view class="card history-card">
|
<view class="card history-card" v-if="patientDetail.medicalHistoryContent">
|
||||||
<text class="history-text" :class="{ fold: !showAllHistory }">{{ patientDetail.medicalHistoryContent }}</text>
|
<text class="history-text" :class="{ fold: !showAllHistory }">{{ patientDetail.medicalHistoryContent }}</text>
|
||||||
<text class="toggle" @click="toggleHistory" v-if="patientDetail.medicalHistoryContent">{{ showAllHistory ? '收起' : '展开全部' }}</text>
|
<text class="toggle" @click="toggleHistory" v-if="patientDetail.medicalHistoryContent">{{ showAllHistory ? '收起' : '展开全部' }}</text>
|
||||||
</view>
|
</view>
|
||||||
|
<view class="card history-card" v-else>
|
||||||
|
<text class="history-text">暂无</text>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<!-- 检查报告 -->
|
<!-- 检查报告 -->
|
||||||
<view class="history-section" v-if="patientDetail.patientCase && patientDetail.patientCase.length>0">
|
<view class="history-section" v-if="patientDetail.patientCase && patientDetail.patientCase.length>0">
|
||||||
<view class="section-title">检查报告</view>
|
<view class="section-title">检查报告</view>
|
||||||
<view class="card report-card">
|
<scroll-view class="card report-card-scroll" scroll-x>
|
||||||
|
<view class="report-card">
|
||||||
<view class="report-item" v-for="item in patientDetail.patientCase" :key="item.diseaseUuid" @click="openCase(item.uuid)">
|
<view class="report-item" v-for="item in patientDetail.patientCase" :key="item.diseaseUuid" @click="openCase(item.uuid)">
|
||||||
<view class="report-item-title">{{ $u.timeFormat(item.createDate, 'yyyy-mm-dd') }}</view>
|
<view class="report-item-title">{{ $u.timeFormat(item.createDate, 'yyyy-mm-dd') }}</view>
|
||||||
<view class="report-item-content">{{ item.diseaseName }}</view>
|
<view class="report-item-content">{{ item.diseaseName }}</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
</scroll-view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 底部操作 -->
|
<!-- 底部操作 -->
|
||||||
@ -97,6 +110,15 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
<unidialog
|
||||||
|
:visible="showDialog"
|
||||||
|
@close="showDialog=false"
|
||||||
|
@confirm="confirmDialog"
|
||||||
|
:content="'复制该患者手机号码'"
|
||||||
|
:confirmText="'确定'"
|
||||||
|
:cancelText="'取消'"
|
||||||
|
>
|
||||||
|
</unidialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
@ -111,12 +133,23 @@
|
|||||||
import manImg from "@/static/new_man_big.png"
|
import manImg from "@/static/new_man_big.png"
|
||||||
import womanImg from "@/static/new_woman_big.png"
|
import womanImg from "@/static/new_woman_big.png"
|
||||||
import defaultImg from "@/static/default.png"
|
import defaultImg from "@/static/default.png"
|
||||||
|
import unidialog from '@/components/dialog/dialog.vue'
|
||||||
|
import editImg from "@/static/edit_patitent.png"
|
||||||
const showAllHistory = ref(false);
|
const showAllHistory = ref(false);
|
||||||
|
const showDialog = ref(false);
|
||||||
const patientDetail = ref({});
|
const patientDetail = ref({});
|
||||||
const patient_uuid = ref('');
|
const patient_uuid = ref('');
|
||||||
const note = ref('');
|
const note = ref('');
|
||||||
const avatarLoadError = ref(false);
|
const avatarLoadError = ref(false);
|
||||||
|
const confirmDialog = ()=>{
|
||||||
|
showDialog.value = false;
|
||||||
|
uni.setClipboardData({
|
||||||
|
data: patientInfo.value.mobile,
|
||||||
|
success: () => {
|
||||||
|
uni.showToast({ title: '复制成功', icon: 'none' });
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
// 计算属性:患者基本信息
|
// 计算属性:患者基本信息
|
||||||
const patientInfo = computed(() => {
|
const patientInfo = computed(() => {
|
||||||
return patientDetail.value.patient || {};
|
return patientDetail.value.patient || {};
|
||||||
@ -164,6 +197,12 @@
|
|||||||
url:'/pages_app/patientRemark/patientRemark?uuid=' + patientInfo.value.uuid
|
url:'/pages_app/patientRemark/patientRemark?uuid=' + patientInfo.value.uuid
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
const alertDialog = ()=>{
|
||||||
|
|
||||||
|
if(patientInfo.value.mobile){
|
||||||
|
showDialog.value = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
const editDesc = ()=> uni.showToast({ title:'编辑描述', icon:'none' })
|
const editDesc = ()=> uni.showToast({ title:'编辑描述', icon:'none' })
|
||||||
const sendMessage = async()=>{
|
const sendMessage = async()=>{
|
||||||
let userId=uni.getStorageSync('userInfo').uuid.toLowerCase();
|
let userId=uni.getStorageSync('userInfo').uuid.toLowerCase();
|
||||||
@ -172,6 +211,8 @@
|
|||||||
// navTo({
|
// navTo({
|
||||||
// url:'/pages_chat/chat/index'
|
// url:'/pages_chat/chat/index'
|
||||||
// })
|
// })
|
||||||
|
console.log(patientInfo.value.realName);
|
||||||
|
console.log(nickname.value);
|
||||||
uni.sendNativeEvent('goSendMsg', {
|
uni.sendNativeEvent('goSendMsg', {
|
||||||
msg: {
|
msg: {
|
||||||
patientuuid: patientInfo.value.uuid,
|
patientuuid: patientInfo.value.uuid,
|
||||||
@ -249,15 +290,18 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
.report-card-scroll{
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
.report-card{
|
.report-card{
|
||||||
display: flex;
|
display: inline-flex;
|
||||||
gap: 55rpx;
|
gap: 24rpx;
|
||||||
flex-wrap: wrap;
|
|
||||||
}
|
}
|
||||||
.report-item{
|
.report-item{
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 10rpx;
|
gap: 10rpx;
|
||||||
|
min-width: 260rpx;
|
||||||
|
|
||||||
background: #f5f5f5;
|
background: #f5f5f5;
|
||||||
padding: 20rpx;
|
padding: 20rpx;
|
||||||
@ -282,11 +326,11 @@
|
|||||||
.avatar { width: 140rpx; height: 140rpx; border-radius: 12rpx; margin-right: 20rpx; }
|
.avatar { width: 140rpx; height: 140rpx; border-radius: 12rpx; margin-right: 20rpx; }
|
||||||
.base-info { flex:1; }
|
.base-info { flex:1; }
|
||||||
.name-row { display:flex; align-items:center; margin-bottom: 10rpx; }
|
.name-row { display:flex; align-items:center; margin-bottom: 10rpx; }
|
||||||
.name { font-size: 40rpx; color:#222; margin-right: 10rpx;}
|
.name { font-size: 36rpx; color:#222; margin-right: 10rpx;}
|
||||||
.line { font-size: 28rpx; color:#666; margin-top: 6rpx; display:flex; align-items:center; }
|
.line { font-size: 28rpx; color:#666; margin-top: 6rpx; display:flex; align-items:center; }
|
||||||
.label { color:#999;white-space: nowrap; }
|
.label { color:#666;white-space: nowrap; }
|
||||||
.value { color:#333; }
|
.value { color:#666; }
|
||||||
.sep { color:#ddd; margin: 0 10rpx; }
|
.sep { color:#666; margin: 0 10rpx; }
|
||||||
.multi{
|
.multi{
|
||||||
display: inline;
|
display: inline;
|
||||||
}
|
}
|
||||||
@ -297,9 +341,9 @@
|
|||||||
.hint { font-size: 28rpx; color:#999; margin-right: 12rpx; }
|
.hint { font-size: 28rpx; color:#999; margin-right: 12rpx; }
|
||||||
.phone { font-size: 32rpx; color:#b10000; }
|
.phone { font-size: 32rpx; color:#b10000; }
|
||||||
|
|
||||||
.section-title { padding: 16rpx 30rpx; color:#8B2316; font-size: 30rpx; margin-top: 20rpx; background: #fff;}
|
.section-title { padding: 16rpx 30rpx; color:#333; font-size: 28rpx; margin-top: 20rpx; background: #fff;}
|
||||||
.history-card { position: relative; }
|
.history-card { position: relative; }
|
||||||
.history-text { font-size: 28rpx; color:#666; line-height: 1.7; display:block; }
|
.history-text { font-size: 28rpx; color:#999; line-height: 1.7; display:block; }
|
||||||
.history-text.fold { display:-webkit-box; -webkit-line-clamp: 2; line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
|
.history-text.fold { display:-webkit-box; -webkit-line-clamp: 2; line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
|
||||||
.toggle { position:absolute; right: 20rpx; bottom: 25rpx; color:#b10000; font-size: 28rpx;background: #fff; z-index: 10;}
|
.toggle { position:absolute; right: 20rpx; bottom: 25rpx; color:#b10000; font-size: 28rpx;background: #fff; z-index: 10;}
|
||||||
|
|
||||||
|
|||||||
@ -94,6 +94,7 @@
|
|||||||
<view v-if="isGroupRendering(group, gi)" class="rendering-tip">加载中...</view>
|
<view v-if="isGroupRendering(group, gi)" class="rendering-tip">加载中...</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
<empty v-if="groups.length == 0" :emptyDesc="'暂无分组'" />
|
||||||
</scroll-view>
|
</scroll-view>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
@ -108,6 +109,7 @@ import groupDownImg from "@/static/groupup_big.png"
|
|||||||
import normalImg from "@/static/triangle_normal.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 empty from "@/components/empty/empty.vue"
|
||||||
import dayjs from 'dayjs'
|
import dayjs from 'dayjs'
|
||||||
import navTo from '@/utils/navTo.js'
|
import navTo from '@/utils/navTo.js'
|
||||||
import defaultImg from "@/static/default.png"
|
import defaultImg from "@/static/default.png"
|
||||||
@ -196,7 +198,7 @@ const preprocessGroups = (rawGroups) => {
|
|||||||
const list = Array.isArray(group.patientList) ? group.patientList : [];
|
const list = Array.isArray(group.patientList) ? group.patientList : [];
|
||||||
list.forEach((patient) => {
|
list.forEach((patient) => {
|
||||||
patient._formattedJoinDate = formatYMD(patient.join_date);
|
patient._formattedJoinDate = formatYMD(patient.join_date);
|
||||||
patient._displayName = patient.realName || patient.nickname || '-';
|
patient._displayName = patient.nickname || patient.realName ;
|
||||||
patient._photoUrl = patient.photo ? `${docUrl}${patient.photo}` : defaultImg;
|
patient._photoUrl = patient.photo ? `${docUrl}${patient.photo}` : defaultImg;
|
||||||
});
|
});
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -96,18 +96,19 @@
|
|||||||
<view class="patient-list" v-show="activeTab === 'list'">
|
<view class="patient-list" v-show="activeTab === 'list'">
|
||||||
|
|
||||||
<view class="listbox alertContent" v-if="showAlert">
|
<view class="listbox alertContent" v-if="showAlert">
|
||||||
<image :src="alertImg" class="alert-img" mode="widthFix"></image>
|
|
||||||
<image :src="delImg" class="del-img" mode="widthFix" @click="hideAlert"></image>
|
<image :src="delImg" class="del-img" mode="widthFix" @click="hideAlert"></image>
|
||||||
|
<image :src="alertImg" class="alert-img" mode="widthFix"></image>
|
||||||
</view>
|
</view>
|
||||||
<view class="listbox" v-show="patientList.length>0">
|
<view class="listbox" v-show="patientList.length>0">
|
||||||
<!-- 使用 up-index-list 索引组件,数据动态渲染 -->
|
<scroll-view
|
||||||
<up-index-list :index-list="indexList" v-show="loadFinish" >
|
class="groups-scroll"
|
||||||
|
scroll-y="true"
|
||||||
<!-- 特殊操作项 -->
|
:scroll-into-view="scrollIntoViewId"
|
||||||
<template #header>
|
:scroll-with-animation="true"
|
||||||
|
v-show="loadFinish"
|
||||||
|
>
|
||||||
<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">
|
||||||
<up-image :src="newPatientImg" width="60rpx" height="60rpx"></up-image>
|
<up-image :src="newPatientImg" width="60rpx" height="60rpx"></up-image>
|
||||||
</view>
|
</view>
|
||||||
@ -128,36 +129,40 @@
|
|||||||
<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>
|
|
||||||
<template v-for="group in patientGroups" :key="group.letter" >
|
|
||||||
<up-index-item >
|
|
||||||
<up-index-anchor :text="group.letter" />
|
|
||||||
<view class="group-section">
|
|
||||||
<view class="patient-item" v-for="item in group.items" :key="item.uuid || item.id" >
|
|
||||||
<!-- <template v-if="item.placeholder">
|
|
||||||
<view class="patient-avatar-placeholder">
|
|
||||||
<uni-icons type="person" size="32" color="#ffffff" @click="goPatientDetail(item.uuid)"></uni-icons>
|
|
||||||
</view>
|
|
||||||
</template> -->
|
|
||||||
|
|
||||||
<image class="patient-avatar" :src="item._avatarLoadError ? defaultImg : item.avatarUrl" mode="aspectFill" @error="handlePatientAvatarError(item)" @click="goPatientDetail(item.uuid)"></image>
|
<view
|
||||||
|
class="group-section"
|
||||||
|
v-for="group in patientGroups"
|
||||||
|
:key="group.letter"
|
||||||
|
:id="`anchor-${group.letter}`"
|
||||||
|
>
|
||||||
|
<view class="group-header">{{ group.letter }}</view>
|
||||||
|
<view class="patient-item" v-for="item in group.items" :key="item.uuid || item.id" @longpress="onPatientItemLongPress(item)" @click="goPatientDetail(item.uuid)">
|
||||||
|
<image class="patient-avatar" :src="getPatientAvatar(item)" mode="aspectFill" @error="handlePatientAvatarError(item)" @click.stop="goPatientDetail(item.uuid)"></image>
|
||||||
|
|
||||||
<view class="patient-info" @click="goPatientDetail(item.uuid)">
|
<view class="patient-info">
|
||||||
<text class="patient-name">{{ item.realName }}</text>
|
<text class="patient-name" >{{ item.nickname || item.realName }}</text>
|
||||||
<view class="patient-badge" v-if="item.badge">
|
<view class="patient-badge" v-if="item.badge">
|
||||||
<text class="badge-text">{{ item.badge }}</text>
|
<text class="badge-text">{{ item.badge }}</text>
|
||||||
</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" class="edit-img" width="40rpx" height="40rpx" @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>
|
||||||
</view>
|
</view>
|
||||||
</up-index-item>
|
</scroll-view>
|
||||||
</template>
|
|
||||||
</up-index-list>
|
|
||||||
|
|
||||||
|
<view class="letter-index" v-if="loadFinish && indexList.length > 0">
|
||||||
|
<view
|
||||||
|
class="letter-item"
|
||||||
|
v-for="letter in indexList"
|
||||||
|
:key="letter"
|
||||||
|
:class="{ active: activeLetter === letter }"
|
||||||
|
@click="onLetterTap(letter)"
|
||||||
|
>{{ letter }}</view>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="listbox" v-show="patientList.length === 0">
|
<view class="listbox" v-show="patientList.length === 0">
|
||||||
<view class="special-actions" >
|
<view class="special-actions" >
|
||||||
@ -269,21 +274,28 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
<unidialog :visible="visible" :content="message" @close="visible=false" @confirm="deleteFollowUpFromList"></unidialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, getCurrentInstance, computed, nextTick, shallowRef } from 'vue';
|
import { ref, getCurrentInstance, computed, nextTick, shallowRef } from 'vue';
|
||||||
import { onShow,onLoad,onBackPress} from "@dcloudio/uni-app";
|
import { onShow,onLoad,onBackPress,onHide} 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 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';
|
||||||
|
import unidialog from '@/components/dialog/dialog.vue'
|
||||||
import defaultImg from "@/static/default.png"
|
import defaultImg from "@/static/default.png"
|
||||||
import newPatientImg from "@/static/new_patient.png"
|
import newPatientImg from "@/static/new_patient.png"
|
||||||
import delImg from "@/static/iv_delete.png"
|
import delImg from "@/static/iv_delete.png"
|
||||||
|
import editImg from "@/static/edit_patitent.png"
|
||||||
const patientList = ref([]);
|
const patientList = ref([]);
|
||||||
|
const visible = ref(false)
|
||||||
|
const message = ref('')
|
||||||
|
const selectedPatientUuid = ref('')
|
||||||
|
const selectedPatientName = ref('')
|
||||||
const patientDataLoaded = ref(false);
|
const patientDataLoaded = ref(false);
|
||||||
const patientDataLoading = ref(false);
|
const patientDataLoading = ref(false);
|
||||||
const firstLetterCache = new Map();
|
const firstLetterCache = new Map();
|
||||||
@ -293,6 +305,9 @@
|
|||||||
plus.runtime.quit();
|
plus.runtime.quit();
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
onHide(() => {
|
||||||
|
patientDataLoaded.value = false;
|
||||||
|
});
|
||||||
import alertImg from "@/static/patientgif.png"
|
import alertImg from "@/static/patientgif.png"
|
||||||
const getNavHeight = () => {
|
const getNavHeight = () => {
|
||||||
const systemInfo = uni.getSystemInfoSync();
|
const systemInfo = uni.getSystemInfoSync();
|
||||||
@ -318,9 +333,51 @@
|
|||||||
url: `/pages_app/patientSetting/patientSetting?uuid=${uuid}`
|
url: `/pages_app/patientSetting/patientSetting?uuid=${uuid}`
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
const onPatientItemLongPress = (item) => {
|
||||||
|
if (!item || !item.uuid) return
|
||||||
|
selectedPatientUuid.value = item.uuid
|
||||||
|
selectedPatientName.value = item.nickname || item.realName
|
||||||
|
message.value = `确认解除[${selectedPatientName.value || '该患者'}]的随访关系?`
|
||||||
|
visible.value = true
|
||||||
|
}
|
||||||
|
const deleteFollowUpFromList = async () => {
|
||||||
|
if (!selectedPatientUuid.value) {
|
||||||
|
visible.value = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const res = await api.cancelRes({
|
||||||
|
patientUuid: selectedPatientUuid.value
|
||||||
|
})
|
||||||
|
if (res.code == 1) {
|
||||||
|
uni.showToast({
|
||||||
|
title: '解除成功',
|
||||||
|
icon: 'none'
|
||||||
|
})
|
||||||
|
patientListByGBK()
|
||||||
|
}
|
||||||
|
visible.value = false
|
||||||
|
}
|
||||||
|
const avatarErrorMap = ref({});
|
||||||
|
const getAvatarKey = (item = {}) => String(item.uuid || item.id || item.realName || item.nickname || '');
|
||||||
|
const normalizeAvatarUrl = (photo) => {
|
||||||
|
const raw = String(photo || '').trim();
|
||||||
|
if (!raw) return defaultImg;
|
||||||
|
if (/^https?:\/\//i.test(raw)) return raw;
|
||||||
|
return `${docUrl}${raw}`;
|
||||||
|
};
|
||||||
|
const getPatientAvatar = (item = {}) => {
|
||||||
|
const key = getAvatarKey(item);
|
||||||
|
if (key && avatarErrorMap.value[key]) return defaultImg;
|
||||||
|
return item.avatarUrl || defaultImg;
|
||||||
|
};
|
||||||
const handlePatientAvatarError = (item) => {
|
const handlePatientAvatarError = (item) => {
|
||||||
if (!item) return
|
if (!item) return;
|
||||||
item._avatarLoadError = true
|
const key = getAvatarKey(item);
|
||||||
|
if (!key) return;
|
||||||
|
avatarErrorMap.value = {
|
||||||
|
...avatarErrorMap.value,
|
||||||
|
[key]: true
|
||||||
|
};
|
||||||
}
|
}
|
||||||
const goCode = () => {
|
const goCode = () => {
|
||||||
navTo({
|
navTo({
|
||||||
@ -358,10 +415,8 @@
|
|||||||
|
|
||||||
// 当前激活的标签
|
// 当前激活的标签
|
||||||
const activeTab = ref('message');
|
const activeTab = ref('message');
|
||||||
const letters = ref(['A','C','E','L']);
|
|
||||||
const activeLetter = ref('A');
|
const activeLetter = ref('A');
|
||||||
const scrollIntoViewId = ref('');
|
const scrollIntoViewId = ref('');
|
||||||
let scrollingByClick = false;
|
|
||||||
|
|
||||||
// 控制添加菜单弹窗显示
|
// 控制添加菜单弹窗显示
|
||||||
const showAddMenuFlag = ref(false);
|
const showAddMenuFlag = ref(false);
|
||||||
@ -369,9 +424,19 @@
|
|||||||
// 组件实例(用于 selectorQuery 作用域)
|
// 组件实例(用于 selectorQuery 作用域)
|
||||||
const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance();
|
||||||
|
|
||||||
// up-index-list 索引固定为 26 个大写字母
|
const LETTER_ORDER = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
|
||||||
// 索引固定为 A-Z
|
const sortLetter = (a, b) => {
|
||||||
const indexList = ref('ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''));
|
if (a === '#') return 1;
|
||||||
|
if (b === '#') return -1;
|
||||||
|
const ai = LETTER_ORDER.indexOf(a);
|
||||||
|
const bi = LETTER_ORDER.indexOf(b);
|
||||||
|
if (ai === -1 && bi === -1) return String(a).localeCompare(String(b));
|
||||||
|
if (ai === -1) return 1;
|
||||||
|
if (bi === -1) return -1;
|
||||||
|
return ai - bi;
|
||||||
|
};
|
||||||
|
// up-index-list 索引使用实际分组字母,避免索引与锚点数量不一致
|
||||||
|
const indexList = ref([]);
|
||||||
// 列表高度(像素):窗口高度 - 顶部导航(rpx转px) - 底部tab(约100rpx->px) - 操作区(约200rpx->px)
|
// 列表高度(像素):窗口高度 - 顶部导航(rpx转px) - 底部tab(约100rpx->px) - 操作区(约200rpx->px)
|
||||||
const groupsListHeight = ref(0);
|
const groupsListHeight = ref(0);
|
||||||
const rpxToPx = (rpx) => {
|
const rpxToPx = (rpx) => {
|
||||||
@ -387,10 +452,27 @@
|
|||||||
// 分组数据(可从接口返回后赋值)
|
// 分组数据(可从接口返回后赋值)
|
||||||
const patientGroups = shallowRef([]);
|
const patientGroups = shallowRef([]);
|
||||||
|
|
||||||
// 重建索引时保持固定 A-Z
|
// 根据当前分组重建索引(与 up-index-anchor 一一对应)
|
||||||
const rebuildIndexList = () => {
|
const rebuildIndexList = () => {
|
||||||
// 固定 A-Z,不随分组变化
|
indexList.value = patientGroups.value
|
||||||
indexList.value = patientGroups.value.map(g => g.letter);
|
.map(g => String(g?.letter || '').toUpperCase())
|
||||||
|
.filter((letter, index, arr) => (letter === '#' || /^[A-Z]$/.test(letter)) && arr.indexOf(letter) === index)
|
||||||
|
.sort(sortLetter);
|
||||||
|
activeLetter.value = indexList.value[0] || '';
|
||||||
|
};
|
||||||
|
const onLetterTap = (letter) => {
|
||||||
|
if (!letter) return;
|
||||||
|
const targetId = `anchor-${letter}`;
|
||||||
|
activeLetter.value = letter;
|
||||||
|
// 点击同一字母时,先清空再回填,确保 scroll-into-view 能再次触发
|
||||||
|
if (scrollIntoViewId.value === targetId) {
|
||||||
|
scrollIntoViewId.value = '';
|
||||||
|
nextTick(() => {
|
||||||
|
scrollIntoViewId.value = targetId;
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
scrollIntoViewId.value = targetId;
|
||||||
};
|
};
|
||||||
|
|
||||||
// 生成模拟数据
|
// 生成模拟数据
|
||||||
@ -415,6 +497,7 @@
|
|||||||
}
|
}
|
||||||
// 根据 patientList 构建按拼音首字母的分组
|
// 根据 patientList 构建按拼音首字母的分组
|
||||||
const buildGroupsFromPatients = () => {
|
const buildGroupsFromPatients = () => {
|
||||||
|
avatarErrorMap.value = {};
|
||||||
const map = new Map();
|
const map = new Map();
|
||||||
|
|
||||||
const source = patientList.value || [];
|
const source = patientList.value || [];
|
||||||
@ -422,15 +505,15 @@
|
|||||||
const p = source[i] || {};
|
const p = source[i] || {};
|
||||||
const normalized = {
|
const normalized = {
|
||||||
...p,
|
...p,
|
||||||
avatarUrl: p.photo ? `${docUrl}${p.photo}` : defaultImg,
|
avatarUrl: normalizeAvatarUrl(p.photo),
|
||||||
joinDateYMD: formatYMD(p.join_date)
|
joinDateYMD: formatYMD(p.join_date)
|
||||||
};
|
};
|
||||||
const first = getFirstLetter(normalized.realName || '');
|
const first = getFirstLetter(normalized.nickname || normalized.realName);
|
||||||
const letter = /^[A-Z]$/.test(first) ? first : '#';
|
const letter = /^[A-Z]$/.test(first) ? first : '#';
|
||||||
if (!map.has(letter)) map.set(letter, []);
|
if (!map.has(letter)) map.set(letter, []);
|
||||||
map.get(letter).push(normalized);
|
map.get(letter).push(normalized);
|
||||||
}
|
}
|
||||||
const letters = Array.from(map.keys()).sort((a,b) => a.localeCompare(b));
|
const letters = Array.from(map.keys()).sort(sortLetter);
|
||||||
patientGroups.value = letters.map(l => ({ letter: l, items: map.get(l) }));
|
patientGroups.value = letters.map(l => ({ letter: l, items: map.get(l) }));
|
||||||
rebuildIndexList();
|
rebuildIndexList();
|
||||||
if(patientList.value.length==0){
|
if(patientList.value.length==0){
|
||||||
@ -766,6 +849,15 @@
|
|||||||
followUpLoading.value = false;
|
followUpLoading.value = false;
|
||||||
followUpRefreshing.value = false;
|
followUpRefreshing.value = false;
|
||||||
getFollowUpList(true);
|
getFollowUpList(true);
|
||||||
|
console.log("onShow");
|
||||||
|
console.log(activeTab.value);
|
||||||
|
if(activeTab.value == 'list'){
|
||||||
|
getApplyList();
|
||||||
|
switchTab('list');
|
||||||
|
|
||||||
|
}else if(activeTab.value == 'plan'){
|
||||||
|
switchTab('plan')
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 加载消息列表
|
// 加载消息列表
|
||||||
@ -946,7 +1038,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.tab-text {
|
.tab-text {
|
||||||
font-size: 28rpx;
|
font-size: 32rpx;
|
||||||
color: #999999;
|
color: #999999;
|
||||||
transition: color 0.3s;
|
transition: color 0.3s;
|
||||||
}
|
}
|
||||||
@ -978,18 +1070,12 @@
|
|||||||
|
|
||||||
// 患者列表样式
|
// 患者列表样式
|
||||||
.patient-list {
|
.patient-list {
|
||||||
:deep(.u-index-list__letter){
|
|
||||||
top:50%!important;
|
|
||||||
}
|
|
||||||
:deep(.u-index-list__scroll-view){
|
|
||||||
height:calc(100vh - var(--status-bar-height) - 44px - 103rpx);
|
|
||||||
}
|
|
||||||
// position: fixed;
|
// position: fixed;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
margin-top:calc(var(--status-bar-height) + 44px);
|
margin-top:calc(var(--status-bar-height) + 44px);
|
||||||
height:calc(100vh - var(--status-bar-height) - 44px - 103rpx);
|
height:calc(100vh - var(--status-bar-height) - 44px - 103rpx);
|
||||||
overflow-y: scroll;
|
overflow: hidden;
|
||||||
|
|
||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
|
|
||||||
@ -997,10 +1083,10 @@
|
|||||||
|
|
||||||
.listbox{
|
.listbox{
|
||||||
flex:1;
|
flex:1;
|
||||||
|
height: 100%;
|
||||||
}
|
}
|
||||||
.groups-scroll {
|
.groups-scroll {
|
||||||
display: none;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.special-actions {
|
.special-actions {
|
||||||
@ -1098,7 +1184,7 @@
|
|||||||
background-color: #e4e4e4;
|
background-color: #e4e4e4;
|
||||||
font-size: 36rpx;
|
font-size: 36rpx;
|
||||||
color: #666666;
|
color: #666666;
|
||||||
font-weight: bold;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.patient-item {
|
.patient-item {
|
||||||
@ -1114,8 +1200,8 @@
|
|||||||
|
|
||||||
.patient-avatar,
|
.patient-avatar,
|
||||||
.patient-avatar-placeholder {
|
.patient-avatar-placeholder {
|
||||||
width: 80rpx;
|
width: 90rpx;
|
||||||
height: 80rpx;
|
height: 90rpx;
|
||||||
border-radius: 10rpx;
|
border-radius: 10rpx;
|
||||||
margin-right: 20rpx;
|
margin-right: 20rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -1157,6 +1243,7 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
||||||
.follow-date {
|
.follow-date {
|
||||||
|
margin-top: 8rpx;
|
||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
color: #666666;
|
color: #666666;
|
||||||
margin-left: 10rpx;
|
margin-left: 10rpx;
|
||||||
@ -1207,6 +1294,10 @@
|
|||||||
width: 80%;
|
width: 80%;
|
||||||
max-width: 400rpx;
|
max-width: 400rpx;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
position: fixed;
|
||||||
|
top: calc(var(--status-bar-height) + 48px );
|
||||||
|
z-index: 9999;
|
||||||
|
right: 20rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.menu-item {
|
.menu-item {
|
||||||
@ -1254,7 +1345,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.group-header{
|
.group-header{
|
||||||
text-align: center;
|
text-align: left;
|
||||||
background:#eee;
|
background:#eee;
|
||||||
color:#333;
|
color:#333;
|
||||||
font-size: 30rpx;
|
font-size: 30rpx;
|
||||||
|
|||||||
@ -18,6 +18,12 @@
|
|||||||
<view class="label">备注</view>
|
<view class="label">备注</view>
|
||||||
<input class="input" v-model.trim="remark" :placeholder="groupInfo.nickname || '给患者添加备注名'" placeholder-class="ph" maxlength="20"/>
|
<input class="input" v-model.trim="remark" :placeholder="groupInfo.nickname || '给患者添加备注名'" placeholder-class="ph" maxlength="20"/>
|
||||||
</view>
|
</view>
|
||||||
|
<view class="row" v-if="nickname">
|
||||||
|
<view class="left">申请消息为:我是{{ nickname }}</view>
|
||||||
|
<view class="right" @click="fillNickname">
|
||||||
|
填入
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
<view class="form-block" @click="goGroup">
|
<view class="form-block" @click="goGroup">
|
||||||
<view class="label">分组</view>
|
<view class="label">分组</view>
|
||||||
<view class="iptbox readonly">
|
<view class="iptbox readonly">
|
||||||
@ -28,14 +34,14 @@
|
|||||||
<view class="form-block">
|
<view class="form-block">
|
||||||
<view class="label">描述</view>
|
<view class="label">描述</view>
|
||||||
<view class="textarea-wrap">
|
<view class="textarea-wrap">
|
||||||
<textarea class="textarea" v-model.trim="note" :placeholder="groupInfo.note || '补充患者关键信息,方便随访患者'" placeholder-class="ph" auto-height maxlength="100"/>
|
<textarea class="textarea" v-model.trim="note" :placeholder="groupInfo.note || '补充患者关键信息,方便随访患者'" placeholder-class="ph" auto-height maxlength="100" :adjust-position="false"/>
|
||||||
<view class="textarea-count">已输入{{ noteLength }}/100</view>
|
<view class="textarea-count">已输入{{ noteLength }}/100</view>
|
||||||
</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" :class="{ disabled: isRemarkEmpty }" :disabled="isRemarkEmpty" @click="updateNicknameNote">完成</button>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
@ -52,6 +58,8 @@
|
|||||||
const patientCardData = ref({})
|
const patientCardData = ref({})
|
||||||
const groupInfo = ref({})
|
const groupInfo = ref({})
|
||||||
const noteLength = computed(() => (note.value || '').length)
|
const noteLength = computed(() => (note.value || '').length)
|
||||||
|
const isRemarkEmpty = computed(() => !(remark.value || '').trim())
|
||||||
|
const nickname = ref('')
|
||||||
|
|
||||||
const goBack = () => {
|
const goBack = () => {
|
||||||
uni.navigateBack()
|
uni.navigateBack()
|
||||||
@ -64,6 +72,9 @@
|
|||||||
|
|
||||||
onLoad((options) => {
|
onLoad((options) => {
|
||||||
patientUuid.value = options.uuid || ''
|
patientUuid.value = options.uuid || ''
|
||||||
|
if(options.nickname){
|
||||||
|
nickname.value = options.nickname
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
onShow(() => {
|
onShow(() => {
|
||||||
@ -84,6 +95,7 @@
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
const updateNicknameNote = async() => {
|
const updateNicknameNote = async() => {
|
||||||
|
if (isRemarkEmpty.value) return
|
||||||
const res = await api.updateNicknameNote({
|
const res = await api.updateNicknameNote({
|
||||||
patient_uuid: patientUuid.value,
|
patient_uuid: patientUuid.value,
|
||||||
nickname: remark.value,
|
nickname: remark.value,
|
||||||
@ -104,22 +116,41 @@
|
|||||||
uni.showToast({ title: '保存成功', icon: 'none' })
|
uni.showToast({ title: '保存成功', icon: 'none' })
|
||||||
setTimeout(() => goBack(), 700)
|
setTimeout(() => goBack(), 700)
|
||||||
}
|
}
|
||||||
|
const fillNickname = () => {
|
||||||
|
remark.value = nickname.value
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
.row{
|
||||||
|
margin-top: -20rpx;
|
||||||
|
display: flex;
|
||||||
|
background: #fff;
|
||||||
|
padding:0 30rpx;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
.left{
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.right{
|
||||||
|
font-size: 32rpx;
|
||||||
|
color: #3ec7c0;
|
||||||
|
}
|
||||||
|
}
|
||||||
.contentbox{
|
.contentbox{
|
||||||
top: calc(var(--status-bar-height) + 44px);
|
top: calc(var(--status-bar-height) + 44px);
|
||||||
position: fixed;
|
position: fixed;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
bottom: 125rpx;
|
bottom: 140rpx;
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
.remark-page{
|
.remark-page{
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
background: #f7f7f7;
|
background: #f7f7f7;
|
||||||
padding-bottom: 140rpx;
|
|
||||||
}
|
}
|
||||||
.form-block{
|
.form-block{
|
||||||
.iptbox{
|
.iptbox{
|
||||||
@ -181,7 +212,7 @@
|
|||||||
left: 0; right: 0; bottom: 0;
|
left: 0; right: 0; bottom: 0;
|
||||||
background: #ffffff;
|
background: #ffffff;
|
||||||
border-top: 1rpx solid #f0f0f0;
|
border-top: 1rpx solid #f0f0f0;
|
||||||
padding: 20rpx 24rpx env(safe-area-inset-bottom);
|
padding: 20rpx 24rpx 20rpx;
|
||||||
.save-btn{
|
.save-btn{
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -193,6 +224,10 @@
|
|||||||
border: none;
|
border: none;
|
||||||
border-radius: 12rpx;
|
border-radius: 12rpx;
|
||||||
font-size: 32rpx;
|
font-size: 32rpx;
|
||||||
|
&.disabled{
|
||||||
|
background: #d9d9d9;
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -163,10 +163,23 @@
|
|||||||
.cell-right{
|
.cell-right{
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 16rpx;
|
justify-content: flex-end;
|
||||||
|
flex: 1;
|
||||||
|
margin-left: 20rpx;
|
||||||
|
min-width: 0;
|
||||||
|
|
||||||
.cell-desc{
|
.cell-desc{
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
display: block;
|
||||||
font-size: 26rpx;
|
font-size: 26rpx;
|
||||||
color: #999;
|
color: #999;
|
||||||
|
overflow: hidden;
|
||||||
|
margin-right: 16rpx;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-align: right;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -113,17 +113,17 @@
|
|||||||
</view>
|
</view>
|
||||||
<unidialog
|
<unidialog
|
||||||
:visible="pptVisible"
|
:visible="pptVisible"
|
||||||
:showCancel="false"
|
:cancelText="'取消'"
|
||||||
:showConfirm="true"
|
:confirmText="'保存二维码'"
|
||||||
:confirmText="'知道了'"
|
|
||||||
@close="pptVisible=false"
|
@close="pptVisible=false"
|
||||||
@confirm="pptConfirm"
|
@confirm="pptConfirm"
|
||||||
>
|
>
|
||||||
<template v-slot:content>
|
<template v-slot:content>
|
||||||
<view class="ppt-content">
|
<view class="ppt-content">
|
||||||
<image :src="contactImg" width="80rpx" height="80rpx" class="contact-img" @longpress.stop.prevent="saveContactImgToAlbum"></image>
|
<image :src="contactImg" width="80rpx" height="80rpx" class="contact-img"></image>
|
||||||
<view class="ppt-content-title">
|
<view class="ppt-content-title">
|
||||||
<text style="color:#666">APP下载课件为pdf格式,扫码联系平台文献助手获取原版PPT。</text>
|
<text style="color:#666">APP下载课件为pdf格式,扫码联系平台文献助手获取原版PPT。</text>
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
@ -160,6 +160,7 @@
|
|||||||
const page = ref(1);
|
const page = ref(1);
|
||||||
const pageSize = ref(10);
|
const pageSize = ref(10);
|
||||||
const pptConfirm=()=>{
|
const pptConfirm=()=>{
|
||||||
|
saveContactImgToAlbum();
|
||||||
pptVisible.value=false;
|
pptVisible.value=false;
|
||||||
//feedBack();
|
//feedBack();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -168,7 +168,8 @@ const nativeDownloadPopupInfo = ref({
|
|||||||
imageLeft: 0,
|
imageLeft: 0,
|
||||||
imageSize: 0,
|
imageSize: 0,
|
||||||
buttonTop: 0,
|
buttonTop: 0,
|
||||||
buttonH: 0
|
buttonH: 0,
|
||||||
|
leftButtonW: 0
|
||||||
});
|
});
|
||||||
let downloadLongPressTimer = null;
|
let downloadLongPressTimer = null;
|
||||||
let downloadLongPressTriggered = false;
|
let downloadLongPressTriggered = false;
|
||||||
@ -289,6 +290,7 @@ function createNativeDownloadPopup() {
|
|||||||
const dialogTop = Math.round((screenH - dialogH) / 2);
|
const dialogTop = Math.round((screenH - dialogH) / 2);
|
||||||
const buttonH = uni.upx2px(96);
|
const buttonH = uni.upx2px(96);
|
||||||
const buttonTop = dialogH - buttonH;
|
const buttonTop = dialogH - buttonH;
|
||||||
|
const leftButtonW = Math.round(dialogW / 2);
|
||||||
const titleTop = uni.upx2px(46);
|
const titleTop = uni.upx2px(46);
|
||||||
const imageSize = uni.upx2px(280);
|
const imageSize = uni.upx2px(280);
|
||||||
const imageTop = titleTop + uni.upx2px(72);
|
const imageTop = titleTop + uni.upx2px(72);
|
||||||
@ -306,7 +308,8 @@ function createNativeDownloadPopup() {
|
|||||||
imageLeft,
|
imageLeft,
|
||||||
imageSize,
|
imageSize,
|
||||||
buttonTop,
|
buttonTop,
|
||||||
buttonH
|
buttonH,
|
||||||
|
leftButtonW
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeDownloadMaskView.value = new plus.nativeObj.View('native-download-mask', {
|
nativeDownloadMaskView.value = new plus.nativeObj.View('native-download-mask', {
|
||||||
@ -394,10 +397,29 @@ function createNativeDownloadPopup() {
|
|||||||
height: '1px'
|
height: '1px'
|
||||||
});
|
});
|
||||||
|
|
||||||
nativeDownloadPopupView.value.drawText('知道了', {
|
nativeDownloadPopupView.value.drawRect({ color: '#F0F0F0' }, {
|
||||||
|
left: leftButtonW + 'px',
|
||||||
|
top: buttonTop + 'px',
|
||||||
|
width: '1px',
|
||||||
|
height: buttonH + 'px'
|
||||||
|
});
|
||||||
|
|
||||||
|
nativeDownloadPopupView.value.drawText('取消', {
|
||||||
left: '0px',
|
left: '0px',
|
||||||
top: buttonTop + 'px',
|
top: buttonTop + 'px',
|
||||||
width: dialogW + 'px',
|
width: leftButtonW + 'px',
|
||||||
|
height: buttonH + 'px'
|
||||||
|
}, {
|
||||||
|
size: uni.upx2px(32) + 'px',
|
||||||
|
color: '#666666',
|
||||||
|
align: 'center',
|
||||||
|
verticalAlign: 'middle'
|
||||||
|
});
|
||||||
|
|
||||||
|
nativeDownloadPopupView.value.drawText('保存二维码', {
|
||||||
|
left: leftButtonW + 'px',
|
||||||
|
top: buttonTop + 'px',
|
||||||
|
width: (dialogW - leftButtonW) + 'px',
|
||||||
height: buttonH + 'px'
|
height: buttonH + 'px'
|
||||||
}, {
|
}, {
|
||||||
size: uni.upx2px(32) + 'px',
|
size: uni.upx2px(32) + 'px',
|
||||||
@ -433,18 +455,25 @@ function createNativeDownloadPopup() {
|
|||||||
downloadLongPressTriggered = false;
|
downloadLongPressTriggered = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const { relativeY } = point;
|
const { relativeX, relativeY } = point;
|
||||||
if (relativeY >= info.buttonTop) {
|
if (relativeY >= info.buttonTop) {
|
||||||
|
if (relativeX >= info.leftButtonW) {
|
||||||
|
// 点击“保存二维码”
|
||||||
|
saveNativePopupImageToAlbum();
|
||||||
closeNativeDownloadPopup();
|
closeNativeDownloadPopup();
|
||||||
|
} else {
|
||||||
|
// 点击“取消”
|
||||||
|
closeNativeDownloadPopup();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeDownloadMaskView.value.addEventListener('click', handleDownloadMaskClick, false);
|
nativeDownloadMaskView.value.addEventListener('click', handleDownloadMaskClick, false);
|
||||||
nativeDownloadMaskView.value.addEventListener('touchstart', handleDownloadMaskClick, false);
|
nativeDownloadMaskView.value.addEventListener('touchstart', handleDownloadMaskClick, false);
|
||||||
nativeDownloadPopupView.value.addEventListener('click', handleDownloadPanelClick, false);
|
nativeDownloadPopupView.value.addEventListener('click', handleDownloadPanelClick, false);
|
||||||
nativeDownloadPopupView.value.addEventListener('touchstart', handleDownloadPanelTouchStart, false);
|
// nativeDownloadPopupView.value.addEventListener('touchstart', handleDownloadPanelTouchStart, false);
|
||||||
nativeDownloadPopupView.value.addEventListener('touchend', handleDownloadPanelTouchEnd, false);
|
// nativeDownloadPopupView.value.addEventListener('touchend', handleDownloadPanelTouchEnd, false);
|
||||||
nativeDownloadPopupView.value.addEventListener('touchcancel', handleDownloadPanelTouchEnd, false);
|
// nativeDownloadPopupView.value.addEventListener('touchcancel', handleDownloadPanelTouchEnd, false);
|
||||||
// #endif
|
// #endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -87,6 +87,7 @@
|
|||||||
<textarea
|
<textarea
|
||||||
class="form-textarea"
|
class="form-textarea"
|
||||||
type="text"
|
type="text"
|
||||||
|
:adjust-position="false"
|
||||||
placeholder="不支持关键字/广泛查询"
|
placeholder="不支持关键字/广泛查询"
|
||||||
v-model="literature.literatureName"
|
v-model="literature.literatureName"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -26,6 +26,7 @@
|
|||||||
<textarea
|
<textarea
|
||||||
class="reply-input"
|
class="reply-input"
|
||||||
v-model="replyText"
|
v-model="replyText"
|
||||||
|
:adjust-position="false"
|
||||||
:placeholder="placeholder"
|
:placeholder="placeholder"
|
||||||
:auto-height="true"
|
:auto-height="true"
|
||||||
:maxlength="maxLength"
|
:maxlength="maxLength"
|
||||||
|
|||||||
@ -56,6 +56,7 @@
|
|||||||
v-model="followUpContent"
|
v-model="followUpContent"
|
||||||
placeholder="请输入随访内容"
|
placeholder="请输入随访内容"
|
||||||
:maxlength="500"
|
:maxlength="500"
|
||||||
|
:adjust-position="false"
|
||||||
auto-height
|
auto-height
|
||||||
></textarea>
|
></textarea>
|
||||||
</view>
|
</view>
|
||||||
@ -80,7 +81,7 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<u-overlay :show="show">
|
<up-overlay :show="show">
|
||||||
<view class="warp">
|
<view class="warp">
|
||||||
|
|
||||||
<view class="calendarbox">
|
<view class="calendarbox">
|
||||||
@ -94,11 +95,11 @@
|
|||||||
<uni-calendar class="uni-calendar--hook" @change="change" @monthSwitch="monthSwitch" />
|
<uni-calendar class="uni-calendar--hook" @change="change" @monthSwitch="monthSwitch" />
|
||||||
<view class="calendarbottom">
|
<view class="calendarbottom">
|
||||||
<view class="cancel" @click="show=false">取消</view>
|
<view class="cancel" @click="show=false">取消</view>
|
||||||
<view class="ok">确定</view>
|
<view class="ok" @click="confirmDate">确定</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</u-overlay>
|
</up-overlay>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -118,6 +119,7 @@
|
|||||||
const headerYear = ref('');
|
const headerYear = ref('');
|
||||||
const headerDay = ref('');
|
const headerDay = ref('');
|
||||||
const patientUuid = ref('');
|
const patientUuid = ref('');
|
||||||
|
let tempDate=('');
|
||||||
// 返回上一页
|
// 返回上一页
|
||||||
const goBack = () => {
|
const goBack = () => {
|
||||||
uni.navigateBack();
|
uni.navigateBack();
|
||||||
@ -138,6 +140,12 @@
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const confirmDate=()=>{
|
||||||
|
selectedDate.value = tempDate;
|
||||||
|
//visits.value[dealIndex.value].date = tempDate.value;
|
||||||
|
show.value=false;
|
||||||
|
}
|
||||||
// 提交日程
|
// 提交日程
|
||||||
const submitSchedule = () => {
|
const submitSchedule = () => {
|
||||||
if (!selectedPatient.value) {
|
if (!selectedPatient.value) {
|
||||||
@ -196,7 +204,8 @@
|
|||||||
headerYear.value = `${y}年`;
|
headerYear.value = `${y}年`;
|
||||||
headerDay.value = `${m}月${dd}日周${w}`;
|
headerDay.value = `${m}月${dd}日周${w}`;
|
||||||
datetime.value = `${y}-${m}-${dd}`;
|
datetime.value = `${y}-${m}-${dd}`;
|
||||||
selectedDate.value = `${y}年${m}月${dd}日(星期${w})`;
|
//selectedDate.value = `${y}年${m}月${dd}日(星期${w})`;
|
||||||
|
tempDate= `${y}年${m}月${dd}日(星期${w})`;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -310,19 +310,16 @@
|
|||||||
}
|
}
|
||||||
.content {
|
.content {
|
||||||
background-color: #f5f5f5;
|
background-color: #f5f5f5;
|
||||||
min-height: 100vh;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
.content {
|
|
||||||
background-color: #f5f5f5;
|
|
||||||
min-height: 100vh;
|
|
||||||
|
|
||||||
}
|
|
||||||
.nav-right { display: flex; align-items: center; }
|
.nav-right { display: flex; align-items: center; }
|
||||||
.submit-text { font-size: 32rpx; color: #8B2316; font-weight: 500; }
|
.submit-text { font-size: 32rpx; color: #8B2316; font-weight: 500; }
|
||||||
|
|
||||||
.form-section {
|
.form-section {
|
||||||
margin-top: calc(var(--status-bar-height) + 44px);
|
margin-top: calc(var(--status-bar-height) + 44px);
|
||||||
|
|
||||||
// margin-top: 20rpx;
|
// margin-top: 20rpx;
|
||||||
display: flex; align-items: center; justify-content: space-between;
|
display: flex; align-items: center; justify-content: space-between;
|
||||||
padding: 30rpx; background: #ffffff; border-bottom: 1rpx solid #f0f0f0;
|
padding: 30rpx; background: #ffffff; border-bottom: 1rpx solid #f0f0f0;
|
||||||
|
|||||||
@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
<!-- 输入框区域 -->
|
<!-- 输入框区域 -->
|
||||||
<view class="note-box">
|
<view class="note-box">
|
||||||
<textarea class="note-textarea" v-model.trim="note" placeholder="请填写随访内容" auto-height :maxlength="200" />
|
<textarea class="note-textarea" v-model.trim="note" placeholder="请填写随访内容" auto-height :maxlength="200" :adjust-position="false"/>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@ -44,7 +44,7 @@
|
|||||||
const note = ref('请近日来医院复诊、复查')
|
const note = ref('请近日来医院复诊、复查')
|
||||||
const idx = ref(0)
|
const idx = ref(0)
|
||||||
onLoad((options) => {
|
onLoad((options) => {
|
||||||
console.log(options.patient_name==undefined)
|
console.log(options.patient_name)
|
||||||
patientName.value =options.patient_name ?decodeURIComponent(options.patient_name):'';
|
patientName.value =options.patient_name ?decodeURIComponent(options.patient_name):'';
|
||||||
console.log(patientName.value)
|
console.log(patientName.value)
|
||||||
if (options?.note) note.value = decodeURIComponent(options.note)
|
if (options?.note) note.value = decodeURIComponent(options.note)
|
||||||
@ -68,10 +68,14 @@
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.contentbox{
|
.contentbox{
|
||||||
margin-top: calc(var(--status-bar-height) + 44px);
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
right:0;
|
||||||
|
overflow-y: scroll;
|
||||||
|
top: calc(var(--status-bar-height) + 44px);
|
||||||
}
|
}
|
||||||
.visit-note-page{
|
.visit-note-page{
|
||||||
min-height: 100vh; background:#f5f5f5;
|
background:#f5f5f5;
|
||||||
}
|
}
|
||||||
.nav-right{ display:flex; align-items:center; }
|
.nav-right{ display:flex; align-items:center; }
|
||||||
.submit-text{ color:#8B2316; font-size: 30rpx; }
|
.submit-text{ color:#8B2316; font-size: 30rpx; }
|
||||||
|
|||||||
@ -203,7 +203,10 @@ onShow(() => {
|
|||||||
.floating-add-btn { position: fixed; bottom: 140rpx; right: 30rpx; background-color: #8B2316; border-radius: 50%; width: 100rpx; height: 100rpx; display:flex; flex-direction:column; align-items:center; justify-content:center; z-index:999; box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.1); }
|
.floating-add-btn { position: fixed; bottom: 140rpx; right: 30rpx; background-color: #8B2316; border-radius: 50%; width: 100rpx; height: 100rpx; display:flex; flex-direction:column; align-items:center; justify-content:center; z-index:999; box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.1); }
|
||||||
.floating-add-btn .btn-text{ font-size:20rpx; color:#fff; margin-top:4rpx; }
|
.floating-add-btn .btn-text{ font-size:20rpx; color:#fff; margin-top:4rpx; }
|
||||||
.add-menu-popup { position: fixed; top:0; left:0; right:0; bottom:0; background-color: rgba(0,0,0,0); display:flex; align-items:center; justify-content:center; z-index:1000; }
|
.add-menu-popup { position: fixed; top:0; left:0; right:0; bottom:0; background-color: rgba(0,0,0,0); display:flex; align-items:center; justify-content:center; z-index:1000; }
|
||||||
.menu-content { background:#fff; border-radius:20rpx; box-shadow:0 8rpx 24rpx rgba(0,0,0,0.2); width:80%; max-width:400rpx; overflow:hidden; }
|
.menu-content { background:#fff; border-radius:20rpx; box-shadow:0 8rpx 24rpx rgba(0,0,0,0.2); width:80%; max-width:400rpx; overflow:hidden; position: fixed;
|
||||||
|
top: calc(var(--status-bar-height) + 48px);
|
||||||
|
z-index: 9999;
|
||||||
|
right: 20rpx;}
|
||||||
.menu-item { display:flex; align-items:center; padding:30rpx 40rpx; border-bottom:1rpx solid #f0f0f0; }
|
.menu-item { display:flex; align-items:center; padding:30rpx 40rpx; border-bottom:1rpx solid #f0f0f0; }
|
||||||
.menu-item:last-child{ border-bottom:none; }
|
.menu-item:last-child{ border-bottom:none; }
|
||||||
.menu-text{ font-size:32rpx; color:#333; margin-left:20rpx; }
|
.menu-text{ font-size:32rpx; color:#333; margin-left:20rpx; }
|
||||||
|
|||||||
@ -34,14 +34,14 @@
|
|||||||
<view class="bottom-box">
|
<view class="bottom-box">
|
||||||
<view class="bottom-cell">
|
<view class="bottom-cell">
|
||||||
<image class="bottom-cell-img" :src="readImg" />
|
<image class="bottom-cell-img" :src="readImg" />
|
||||||
<text class="bottom-cell-text">{{ readnum }}</text>
|
<text class="bottom-cell-text">{{ fromatNumber(readnum) }}</text>
|
||||||
</view>
|
</view>
|
||||||
<view class="bottom-cell" @click="toggleAgree">
|
<view class="bottom-cell" @click="toggleAgree">
|
||||||
<image
|
<image
|
||||||
class="bottom-cell-img"
|
class="bottom-cell-img"
|
||||||
:src="isAgree == 1 ? likeImg : dislikeImg"
|
:src="isAgree == 1 ? likeImg : dislikeImg"
|
||||||
/>
|
/>
|
||||||
<text class="bottom-cell-text">{{ agreenum }}</text>
|
<text class="bottom-cell-text">{{ fromatNumber(agreenum) }}</text>
|
||||||
</view>
|
</view>
|
||||||
<view class="bottom-cell" @click="toggleCollect">
|
<view class="bottom-cell" @click="toggleCollect">
|
||||||
<image
|
<image
|
||||||
@ -263,6 +263,13 @@ const getNewsDetail = () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
const fromatNumber = (number) => {
|
||||||
|
if(number < 10000){
|
||||||
|
return number;
|
||||||
|
}else{
|
||||||
|
return (number / 10000).toFixed(1) + 'w';
|
||||||
|
}
|
||||||
|
}
|
||||||
const getKePuCollection = () => {
|
const getKePuCollection = () => {
|
||||||
api
|
api
|
||||||
.getKePuCollection({
|
.getKePuCollection({
|
||||||
|
|||||||
@ -23,10 +23,11 @@
|
|||||||
:placeholder="placeholder"
|
:placeholder="placeholder"
|
||||||
placeholder-class="ph"
|
placeholder-class="ph"
|
||||||
v-model.trim="content"
|
v-model.trim="content"
|
||||||
|
:adjust-position="false"
|
||||||
|
|
||||||
>
|
>
|
||||||
</input>
|
</input>
|
||||||
<textarea v-else v-model.trim="content" :placeholder="placeholderTextArea" placeholder-class="ph" auto-height> </textarea>
|
<textarea v-else v-model.trim="content" :placeholder="placeholderTextArea" placeholder-class="ph" auto-height :adjust-position="false"> </textarea>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -157,6 +157,7 @@
|
|||||||
<textarea
|
<textarea
|
||||||
class="form-textarea"
|
class="form-textarea"
|
||||||
type="text"
|
type="text"
|
||||||
|
:adjust-position="false"
|
||||||
placeholder="不支持关键字/广泛查询"
|
placeholder="不支持关键字/广泛查询"
|
||||||
v-model="literature.literatureName"
|
v-model="literature.literatureName"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -481,7 +481,7 @@ $padding-small: 10px;
|
|||||||
gap: 12px;
|
gap: 12px;
|
||||||
|
|
||||||
.article-image {
|
.article-image {
|
||||||
width: 80px;
|
width: 160px;
|
||||||
height: 80px;
|
height: 80px;
|
||||||
border-radius: $border-radius-small;
|
border-radius: $border-radius-small;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
|
|||||||
@ -306,6 +306,20 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</div>
|
</div>
|
||||||
|
<unidialog
|
||||||
|
:visible="outDialog"
|
||||||
|
:content="'您是否发送您的出/停诊公告?'"
|
||||||
|
@close="outDialog = false"
|
||||||
|
@confirm="confirmOutDialog"
|
||||||
|
>
|
||||||
|
</unidialog>
|
||||||
|
<unidialog
|
||||||
|
:visible="mallDialog"
|
||||||
|
:content="'您是否发送该商品详情?'"
|
||||||
|
@close="mallDialog = false"
|
||||||
|
@confirm="confirmMallDialog"
|
||||||
|
>
|
||||||
|
</unidialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
@ -350,7 +364,7 @@ import hjImg from '@/static/huanjiao.png'
|
|||||||
import picImg from '@/static/im_icon_images_on.png'
|
import picImg from '@/static/im_icon_images_on.png'
|
||||||
import cameraImg from '@/static/im_icon_camera_on.png'
|
import cameraImg from '@/static/im_icon_camera_on.png'
|
||||||
import {onShow,onUnload} from '@dcloudio/uni-app'
|
import {onShow,onUnload} from '@dcloudio/uni-app'
|
||||||
|
import unidialog from "@/components/dialog/dialog.vue";
|
||||||
import {
|
import {
|
||||||
V2NIMTeam,
|
V2NIMTeam,
|
||||||
V2NIMTeamChatBannedMode,
|
V2NIMTeamChatBannedMode,
|
||||||
@ -374,6 +388,9 @@ let patient_uuid='';
|
|||||||
const articleInfo=ref({});
|
const articleInfo=ref({});
|
||||||
const videoInfo=ref({});
|
const videoInfo=ref({});
|
||||||
const textMsg=ref('');
|
const textMsg=ref('');
|
||||||
|
const outDialog = ref(false);
|
||||||
|
const mallDialog = ref(false);
|
||||||
|
|
||||||
const patientListByGBK = async () => {
|
const patientListByGBK = async () => {
|
||||||
|
|
||||||
const res = await api.patientListByGBK();
|
const res = await api.patientListByGBK();
|
||||||
@ -511,7 +528,8 @@ let rawStr="{\"gdxz_content\":\"我已入驻肝胆相照互联网医院,复诊
|
|||||||
const sendMallMsg = () => {
|
const sendMallMsg = () => {
|
||||||
showMallModal.value = false;
|
showMallModal.value = false;
|
||||||
//handleSendTextMsg('mall');
|
//handleSendTextMsg('mall');
|
||||||
senCustomMsg('mall');
|
//senCustomMsg('mall');
|
||||||
|
mallDialog.value = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1023,6 +1041,14 @@ const senCustomMsg = (type:string) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const confirmOutDialog = () => {
|
||||||
|
outDialog.value = false;
|
||||||
|
senCustomMsg('outpatient');
|
||||||
|
}
|
||||||
|
const confirmMallDialog = () => {
|
||||||
|
mallDialog.value = false;
|
||||||
|
senCustomMsg('mall')
|
||||||
|
}
|
||||||
const handleCustom = (type: string, event: any) => {
|
const handleCustom = (type: string, event: any) => {
|
||||||
if (isTeamMute.value) return
|
if (isTeamMute.value) return
|
||||||
if(type == 'reply'){
|
if(type == 'reply'){
|
||||||
@ -1043,7 +1069,8 @@ const handleCustom = (type: string, event: any) => {
|
|||||||
url: '/pages_chat/outpatient/outpatient',
|
url: '/pages_chat/outpatient/outpatient',
|
||||||
})
|
})
|
||||||
}else{
|
}else{
|
||||||
senCustomMsg('outpatient');
|
//senCustomMsg('outpatient');
|
||||||
|
outDialog.value = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1422,7 +1449,8 @@ onUnmounted(() => {
|
|||||||
height:38px;
|
height:38px;
|
||||||
border: 1px solid #CCC;
|
border: 1px solid #CCC;
|
||||||
border-radius: 10rpx;
|
border-radius: 10rpx;
|
||||||
margin-top:-2rpx;
|
// margin-top:-2rpx;
|
||||||
|
margin-bottom:12rpx;
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
color: #666;
|
color: #666;
|
||||||
border-radius: 10rpx;
|
border-radius: 10rpx;
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<view class="form-item">
|
<view class="form-item">
|
||||||
<view class="label">医院 <text class="required">*</text></view>
|
<view class="label">医院 <text class="required">*</text></view>
|
||||||
<view class="value full">
|
<view class="value full">
|
||||||
<input class="input" v-model.trim="form.hospital_name" placeholder="请输入医院名称" @input="onHospitalInput" @keydown.enter.prevent="onHospitalEnter" />
|
<input class="input hospital-input" v-model.trim="form.hospital_name" placeholder="请输入医院名称" @input="onHospitalInput" @keydown.enter.prevent="onHospitalEnter" />
|
||||||
<view v-if="showHospitalList" class="suggestion">
|
<view v-if="showHospitalList" class="suggestion">
|
||||||
<view v-for="h in hospitalList" :key="h.uuid" class="suggestion-item" @click="pickHospital(h)">
|
<view v-for="h in hospitalList" :key="h.uuid" class="suggestion-item" @click="pickHospital(h)">
|
||||||
{{ h.name }}
|
{{ h.name }}
|
||||||
@ -218,7 +218,17 @@ onLoad((options) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.edit-address-page { min-height: 100vh; background: #fff; }
|
.edit-address-page { min-height: 100vh; background: #fff; }
|
||||||
.form-container { padding: 24rpx;margin-top: calc(var(--status-bar-height) + 44px); }
|
.form-container {
|
||||||
|
padding: 0 24rpx;
|
||||||
|
top: calc(var(--status-bar-height) + 44px);
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 160rpx;
|
||||||
|
overflow-y: scroll;
|
||||||
|
z-index: 1;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
.form-item { display: flex; align-items: center; justify-content: space-between; padding: 24rpx 0; }
|
.form-item { display: flex; align-items: center; justify-content: space-between; padding: 24rpx 0; }
|
||||||
.form-item.column { flex-direction: column; align-items: flex-start; }
|
.form-item.column { flex-direction: column; align-items: flex-start; }
|
||||||
@ -229,7 +239,9 @@ onLoad((options) => {
|
|||||||
.value-text { font-size: 30rpx; color: #333; }
|
.value-text { font-size: 30rpx; color: #333; }
|
||||||
.value-text.placeholder { color: #999; }
|
.value-text.placeholder { color: #999; }
|
||||||
.input { width: 100%; font-size: 30rpx; color: #333; }
|
.input { width: 100%; font-size: 30rpx; color: #333; }
|
||||||
|
.hospital-input{
|
||||||
|
padding-left:24rpx;
|
||||||
|
}
|
||||||
.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 { 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 { padding: 20rpx 24rpx; font-size: 28rpx; color: #333; border-bottom: 2rpx solid #f5f5f5; }
|
||||||
.suggestion-item:last-child { border-bottom: 0; }
|
.suggestion-item:last-child { border-bottom: 0; }
|
||||||
|
|||||||
@ -168,10 +168,12 @@ onLoad((options) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
onBackPress(() => {
|
onBackPress(() => {
|
||||||
if(!from.value){
|
// if(!from.value){
|
||||||
|
// plus.runtime.quit();
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
plus.runtime.quit();
|
plus.runtime.quit();
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
});
|
});
|
||||||
const goBack = () => {
|
const goBack = () => {
|
||||||
if(!from.value){
|
if(!from.value){
|
||||||
@ -555,6 +557,7 @@ $red: #D32F2F;
|
|||||||
}
|
}
|
||||||
.name{
|
.name{
|
||||||
padding:20rpx 28rpx;
|
padding:20rpx 28rpx;
|
||||||
|
word-break: break-all;
|
||||||
}
|
}
|
||||||
.phone {
|
.phone {
|
||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
|
|||||||
@ -88,6 +88,7 @@
|
|||||||
/>
|
/>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
@ -97,6 +98,7 @@ import api from "@/api/api.js";
|
|||||||
import { events } from "@/utils/im/constants";
|
import { events } from "@/utils/im/constants";
|
||||||
import { onShow,onLoad,onUnload } from "@dcloudio/uni-app";
|
import { onShow,onLoad,onUnload } from "@dcloudio/uni-app";
|
||||||
import navTo from "@/utils/navTo.js";
|
import navTo from "@/utils/navTo.js";
|
||||||
|
import unidialog from "@/components/dialog/dialog.vue";
|
||||||
import MessageInput from "@/pages_chat/chat/message/message-input.vue";
|
import MessageInput from "@/pages_chat/chat/message/message-input.vue";
|
||||||
const showModal = ref(false);
|
const showModal = ref(false);
|
||||||
const selectedPatients = ref([]);
|
const selectedPatients = ref([]);
|
||||||
@ -106,6 +108,7 @@ const conversationType = ref("1");
|
|||||||
const msg_content = ref("");
|
const msg_content = ref("");
|
||||||
const msg_type = ref("1");
|
const msg_type = ref("1");
|
||||||
const to = ref("");
|
const to = ref("");
|
||||||
|
|
||||||
onLoad((options) => {
|
onLoad((options) => {
|
||||||
if(options.from == 'chatMsg'){
|
if(options.from == 'chatMsg'){
|
||||||
from.value = 'chatMsg';
|
from.value = 'chatMsg';
|
||||||
|
|||||||
@ -12,6 +12,7 @@
|
|||||||
v-model="outpatientInfo"
|
v-model="outpatientInfo"
|
||||||
placeholder="请输入门诊信息..."
|
placeholder="请输入门诊信息..."
|
||||||
:maxlength="500"
|
:maxlength="500"
|
||||||
|
:adjust-position="false"
|
||||||
:auto-height="true"
|
:auto-height="true"
|
||||||
></textarea>
|
></textarea>
|
||||||
|
|
||||||
|
|||||||
@ -238,6 +238,7 @@ const addOutPatient=async()=>{
|
|||||||
title: '发布成功',
|
title: '发布成功',
|
||||||
icon: 'none'
|
icon: 'none'
|
||||||
})
|
})
|
||||||
|
uni.$emit('updateOutPatient');
|
||||||
uni.navigateBack()
|
uni.navigateBack()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -63,7 +63,7 @@
|
|||||||
|
|
||||||
<view class="form-item">
|
<view class="form-item">
|
||||||
<text class="form-label">备注信息</text>
|
<text class="form-label">备注信息</text>
|
||||||
<textarea class="form-textarea" placeholder="请输入备注信息" v-model="formData.remarks" />
|
<textarea class="form-textarea" placeholder="请输入备注信息" v-model="formData.remarks" :adjust-position="false"/>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
|
|||||||
@ -402,6 +402,7 @@ const getTypeText = (type) => {
|
|||||||
}
|
}
|
||||||
// 方法
|
// 方法
|
||||||
const goBack = () => {
|
const goBack = () => {
|
||||||
|
console.log(isEdit.value);
|
||||||
if(isEdit.value){
|
if(isEdit.value){
|
||||||
noticeVisible.value = true;
|
noticeVisible.value = true;
|
||||||
}else{
|
}else{
|
||||||
@ -558,6 +559,7 @@ onShow(() => {
|
|||||||
fetchList();
|
fetchList();
|
||||||
uni.$on('updateOutPatient',()=>{
|
uni.$on('updateOutPatient',()=>{
|
||||||
isEdit.value = true;
|
isEdit.value = true;
|
||||||
|
console.log('更新');
|
||||||
})
|
})
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|||||||
@ -52,7 +52,7 @@
|
|||||||
|
|
||||||
<view class="form-item">
|
<view class="form-item">
|
||||||
<text class="form-label">备注信息</text>
|
<text class="form-label">备注信息</text>
|
||||||
<textarea class="form-textarea" placeholder="请输入备注信息" v-model="formData.remarks" />
|
<textarea class="form-textarea" placeholder="请输入备注信息" v-model="formData.remarks" :adjust-position="false"/>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
|
|||||||
@ -102,6 +102,7 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
<empty v-if="groups.length == 0" :emptyDesc="'暂无分组'" />
|
||||||
</scroll-view>
|
</scroll-view>
|
||||||
<!-- 底部操作栏 -->
|
<!-- 底部操作栏 -->
|
||||||
<view class="bottom-bar">
|
<view class="bottom-bar">
|
||||||
@ -122,6 +123,7 @@ 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'
|
||||||
|
import empty from "@/components/empty/empty.vue"
|
||||||
const list_sort = ref(0);
|
const list_sort = ref(0);
|
||||||
const group_sort = ref(0);
|
const group_sort = ref(0);
|
||||||
|
|
||||||
@ -626,7 +628,7 @@ const handlePatientAvatarError = (patient) => {
|
|||||||
.patient-list-section {
|
.patient-list-section {
|
||||||
top:calc(var(--status-bar-height) + 44px);
|
top:calc(var(--status-bar-height) + 44px);
|
||||||
width:100%;
|
width:100%;
|
||||||
bottom:120rpx; // 预留底部操作栏高度
|
bottom:144rpx; // 预留底部操作栏高度
|
||||||
position: fixed;
|
position: fixed;
|
||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
|
|
||||||
@ -740,14 +742,14 @@ const handlePatientAvatarError = (patient) => {
|
|||||||
bottom: 0;
|
bottom: 0;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
box-shadow: 0 -6rpx 20rpx rgba(0,0,0,0.06);
|
box-shadow: 0 -6rpx 20rpx rgba(0,0,0,0.06);
|
||||||
padding: 20rpx 30rpx env(safe-area-inset-bottom);
|
padding:30rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
.align-right{justify-content:flex-end;}
|
.align-right{justify-content:flex-end;}
|
||||||
|
|
||||||
.clear-btn{
|
.clear-btn{
|
||||||
width: 100%;
|
width: 100%;
|
||||||
margin-bottom: 20rpx;
|
|
||||||
height: 80rpx;
|
height: 80rpx;
|
||||||
line-height: 80rpx;
|
line-height: 80rpx;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|||||||
@ -56,6 +56,7 @@
|
|||||||
:maxlength="-1"
|
:maxlength="-1"
|
||||||
placeholder="请输入回复内容"
|
placeholder="请输入回复内容"
|
||||||
auto-height
|
auto-height
|
||||||
|
:adjust-position="false"
|
||||||
/>
|
/>
|
||||||
<view class="popup-actions">
|
<view class="popup-actions">
|
||||||
<view class="btn cancel" @click="onCancel">取消</view>
|
<view class="btn cancel" @click="onCancel">取消</view>
|
||||||
|
|||||||
@ -49,7 +49,7 @@
|
|||||||
<view class="form-section">
|
<view class="form-section">
|
||||||
<view class="section-title"><text class="title-text">备注</text></view>
|
<view class="section-title"><text class="title-text">备注</text></view>
|
||||||
<view class="remark-box">
|
<view class="remark-box">
|
||||||
<textarea v-model="remark" class="remark" maxlength="300" :placeholder="remarkPh"/>
|
<textarea v-model="remark" class="remark" maxlength="300" :placeholder="remarkPh" :adjust-position="false"/>
|
||||||
<!-- <view class="voice-btn" @click="recordVoice">🎤</view> -->
|
<!-- <view class="voice-btn" @click="recordVoice">🎤</view> -->
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@ -176,6 +176,7 @@ const addStopPatient = async () => {
|
|||||||
note: remark.value
|
note: remark.value
|
||||||
})
|
})
|
||||||
if(res.code==200){
|
if(res.code==200){
|
||||||
|
uni.$emit('updateOutPatient')
|
||||||
uni.showToast({ title: '发布成功', icon: 'none' })
|
uni.showToast({ title: '发布成功', icon: 'none' })
|
||||||
uni.navigateBack()
|
uni.navigateBack()
|
||||||
}
|
}
|
||||||
@ -254,7 +255,8 @@ const submit = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.rowbox{
|
.rowbox{
|
||||||
width: 250rpx;
|
flex:1;
|
||||||
|
margin-left: 30rpx;
|
||||||
}
|
}
|
||||||
.stop-page {
|
.stop-page {
|
||||||
min-height: 100vh; background: #fff;
|
min-height: 100vh; background: #fff;
|
||||||
@ -295,12 +297,12 @@ const submit = () => {
|
|||||||
.title-text { font-size: 32rpx; color: #8B2316; }
|
.title-text { font-size: 32rpx; color: #8B2316; }
|
||||||
.required { color: #8B2316; margin-left: 6rpx; font-size: 28rpx; }
|
.required { color: #8B2316; margin-left: 6rpx; font-size: 28rpx; }
|
||||||
|
|
||||||
.reason-row { display: flex; gap: 20rpx; flex-wrap: wrap; }
|
.reason-row { display: flex; flex-wrap: wrap; justify-content: space-between;}
|
||||||
.reason-btn { flex: 1; text-align: center; height: 80rpx; line-height: 80rpx; border: 2rpx solid #ddd; border-radius: 10rpx; color: #666; }
|
.reason-btn { width:150rpx; 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; }
|
.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; }
|
.add-more { color: #8B2316; font-size: 28rpx; }
|
||||||
.range-row { display: flex; align-items: center; gap: 20rpx; margin-bottom: 20rpx; }
|
.range-row { display: flex; align-items: center; 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; }
|
.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; }
|
.placeholder { color: #999; }
|
||||||
.to-text { color: #666; }
|
.to-text { color: #666; }
|
||||||
|
|||||||
@ -21,7 +21,7 @@
|
|||||||
@click="showAllVideoPopup=!showAllVideoPopup"
|
@click="showAllVideoPopup=!showAllVideoPopup"
|
||||||
>
|
>
|
||||||
<up-image :src="isAllActive?allOnImg:allImg" width="30rpx" height="30rpx" ></up-image>
|
<up-image :src="isAllActive?allOnImg:allImg" width="30rpx" height="30rpx" ></up-image>
|
||||||
<text class="tab-text" :class="{active:isAllActive}">{{typeName}}</text>
|
<text class="tab-text" :class="{active:isAllActive}">{{formatName(typeName)}}</text>
|
||||||
<up-image :src="isAllActive?selectOnImg:selectImg" width="30rpx" height="30rpx" ></up-image>
|
<up-image :src="isAllActive?selectOnImg:selectImg" width="30rpx" height="30rpx" ></up-image>
|
||||||
</view>
|
</view>
|
||||||
<view class="divider"></view>
|
<view class="divider"></view>
|
||||||
@ -136,7 +136,7 @@
|
|||||||
:key="item.uuid"
|
:key="item.uuid"
|
||||||
@click="selectCategory(item.uuid)"
|
@click="selectCategory(item.uuid)"
|
||||||
>
|
>
|
||||||
{{ item.name }}
|
{{ formatName(item.name) }}
|
||||||
</view>
|
</view>
|
||||||
<view v-if="videoTypeList.length === 0" class="empty-content">
|
<view v-if="videoTypeList.length === 0" class="empty-content">
|
||||||
<text>暂无数据</text>
|
<text>暂无数据</text>
|
||||||
@ -221,6 +221,18 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
const videoTypeList=ref([]);
|
const videoTypeList=ref([]);
|
||||||
|
const formatName = (name) => {
|
||||||
|
let nameStr=name.substring(0,4);
|
||||||
|
let lateStr=name.substring(4,name.length);
|
||||||
|
|
||||||
|
let index = nameStr.lastIndexOf("-");
|
||||||
|
|
||||||
|
if (index > -1) {
|
||||||
|
|
||||||
|
return name.substring(index+1,4)+lateStr;
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
};
|
||||||
const patientVideoNew=async ()=>{
|
const patientVideoNew=async ()=>{
|
||||||
const res=await api.patientVideoNew();
|
const res=await api.patientVideoNew();
|
||||||
if(res.code==200){
|
if(res.code==200){
|
||||||
@ -635,29 +647,28 @@
|
|||||||
|
|
||||||
/* Video List */
|
/* Video List */
|
||||||
.video-list {
|
.video-list {
|
||||||
padding: 0 20rpx;
|
padding: 20rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;/* 卡片间距 */
|
flex-direction: column;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.video-item {
|
.video-item {
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
border-radius: 16rpx;
|
border-radius: 12rpx;
|
||||||
margin-bottom: 0;
|
margin-bottom: 16rpx;
|
||||||
overflow: hidden;
|
padding: 20rpx;
|
||||||
box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.1);
|
display: flex;
|
||||||
width: calc((100% - 16rpx) / 2); /* 两列布局,中间间距16rpx */
|
gap: 18rpx;
|
||||||
min-width: 300rpx; /* 确保最小宽度 */
|
box-sizing: border-box;
|
||||||
flex-shrink: 0; /* 防止收缩 */
|
|
||||||
}
|
|
||||||
.video-list .video-item:nth-child(2n+2){
|
|
||||||
margin-left: 16rpx;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.video-thumbnail {
|
.video-thumbnail {
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 200rpx;
|
width: 250rpx;
|
||||||
|
height: 150rpx;
|
||||||
|
border-radius: 10rpx;
|
||||||
|
flex-shrink: 0;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.video-thumbnail image {
|
.video-thumbnail image {
|
||||||
@ -677,7 +688,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.video-info {
|
.video-info {
|
||||||
padding: 24rpx;
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.video-title {
|
.video-title {
|
||||||
@ -685,7 +700,7 @@
|
|||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
color: #333;
|
color: #333;
|
||||||
line-height: 1.4;
|
line-height: 1.4;
|
||||||
margin-bottom: 16rpx;
|
margin-bottom: 12rpx;
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
-webkit-box-orient: vertical;
|
-webkit-box-orient: vertical;
|
||||||
-webkit-line-clamp: 2;
|
-webkit-line-clamp: 2;
|
||||||
@ -702,11 +717,12 @@
|
|||||||
|
|
||||||
.author {
|
.author {
|
||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
color: #999;
|
color: #666;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
margin-right: 20rpx;
|
margin-right: 20rpx;
|
||||||
|
flex: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stats {
|
.stats {
|
||||||
|
|||||||
@ -40,6 +40,7 @@
|
|||||||
v-model="reviewContent"
|
v-model="reviewContent"
|
||||||
placeholder="在这里提交您对精品课的建议,帮助课程继续优化改进(300字以内)"
|
placeholder="在这里提交您对精品课的建议,帮助课程继续优化改进(300字以内)"
|
||||||
maxlength="300"
|
maxlength="300"
|
||||||
|
:adjust-position="false"
|
||||||
:show-confirm-bar="false"
|
:show-confirm-bar="false"
|
||||||
></textarea>
|
></textarea>
|
||||||
<view class="word-count">
|
<view class="word-count">
|
||||||
|
|||||||
BIN
static/sendgroup_tishi_big.png
Normal file
BIN
static/sendgroup_tishi_big.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.5 KiB |
Loading…
x
Reference in New Issue
Block a user