|
@@ -28,7 +28,7 @@
|
|
|
<ContentWrap>
|
|
<ContentWrap>
|
|
|
<div class="mb-15px flex items-center justify-between">
|
|
<div class="mb-15px flex items-center justify-between">
|
|
|
<div class="flex items-center">
|
|
<div class="flex items-center">
|
|
|
- <span class="text-16px font-bold">探访公告内容</span>
|
|
|
|
|
|
|
+ <span class="text-16px font-bold">预约须知内容</span>
|
|
|
<span class="ml-10px text-12px text-gray-500">保存后小程序端将展示该内容</span>
|
|
<span class="ml-10px text-12px text-gray-500">保存后小程序端将展示该内容</span>
|
|
|
</div>
|
|
</div>
|
|
|
<div>
|
|
<div>
|
|
@@ -43,33 +43,37 @@
|
|
|
|
|
|
|
|
<el-input
|
|
<el-input
|
|
|
v-loading="loading"
|
|
v-loading="loading"
|
|
|
- v-model="formData.notice"
|
|
|
|
|
|
|
+ v-model="formData.content"
|
|
|
type="textarea"
|
|
type="textarea"
|
|
|
:rows="18"
|
|
:rows="18"
|
|
|
maxlength="2000"
|
|
maxlength="2000"
|
|
|
show-word-limit
|
|
show-word-limit
|
|
|
- placeholder="请输入探访公告内容,每条建议单独一行(换行即视为一条)"
|
|
|
|
|
|
|
+ placeholder="请输入须知内容,每条建议单独一行(换行即视为一条)"
|
|
|
/>
|
|
/>
|
|
|
</ContentWrap>
|
|
</ContentWrap>
|
|
|
|
|
|
|
|
<ContentWrap>
|
|
<ContentWrap>
|
|
|
<div class="mb-15px text-16px font-bold">小程序预览</div>
|
|
<div class="mb-15px text-16px font-bold">小程序预览</div>
|
|
|
<div class="preview-wrap">
|
|
<div class="preview-wrap">
|
|
|
- <div class="preview-title">探访公告</div>
|
|
|
|
|
|
|
+ <div class="preview-title">预约须知</div>
|
|
|
<div class="preview-content">
|
|
<div class="preview-content">
|
|
|
<template v-if="previewLines.length">
|
|
<template v-if="previewLines.length">
|
|
|
<p v-for="(line, index) in previewLines" :key="index" class="preview-line">
|
|
<p v-for="(line, index) in previewLines" :key="index" class="preview-line">
|
|
|
{{ line }}
|
|
{{ line }}
|
|
|
</p>
|
|
</p>
|
|
|
</template>
|
|
</template>
|
|
|
- <div v-else class="text-gray-400">暂无公告内容</div>
|
|
|
|
|
|
|
+ <div v-else class="text-gray-400">暂无须知内容</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</ContentWrap>
|
|
</ContentWrap>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script lang="ts" setup>
|
|
<script lang="ts" setup>
|
|
|
-import { getNoticeCustomer, saveNoticeCustomer } from '@/api/elderly/elder/notice-customer'
|
|
|
|
|
|
|
+import {
|
|
|
|
|
+ createNoticeCustomer,
|
|
|
|
|
+ getNoticeCustomerList,
|
|
|
|
|
+ saveNoticeCustomer
|
|
|
|
|
+} from '@/api/elderly/elder/notice-customer'
|
|
|
import { useUserStore } from '@/store/modules/user'
|
|
import { useUserStore } from '@/store/modules/user'
|
|
|
|
|
|
|
|
defineOptions({ name: 'NoticeCustomer' })
|
|
defineOptions({ name: 'NoticeCustomer' })
|
|
@@ -77,6 +81,9 @@ defineOptions({ name: 'NoticeCustomer' })
|
|
|
const userStore = useUserStore()
|
|
const userStore = useUserStore()
|
|
|
const message = useMessage()
|
|
const message = useMessage()
|
|
|
|
|
|
|
|
|
|
+/** 须知类型固定为预约须知(APPOINTMENT,VISIT 为后端固定文案) */
|
|
|
|
|
+const NOTICE_TYPE = 'APPOINTMENT' as const
|
|
|
|
|
+
|
|
|
const loading = ref(false)
|
|
const loading = ref(false)
|
|
|
const saveLoading = ref(false)
|
|
const saveLoading = ref(false)
|
|
|
|
|
|
|
@@ -85,12 +92,12 @@ const queryParams = reactive({
|
|
|
})
|
|
})
|
|
|
const formData = reactive({
|
|
const formData = reactive({
|
|
|
id: undefined as number | undefined,
|
|
id: undefined as number | undefined,
|
|
|
- notice: ''
|
|
|
|
|
|
|
+ content: ''
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
// 预览:按换行拆分为多条
|
|
// 预览:按换行拆分为多条
|
|
|
const previewLines = computed(() =>
|
|
const previewLines = computed(() =>
|
|
|
- (formData.notice || '')
|
|
|
|
|
|
|
+ (formData.content || '')
|
|
|
.split('\n')
|
|
.split('\n')
|
|
|
.map((item) => item.trim())
|
|
.map((item) => item.trim())
|
|
|
.filter((item) => item)
|
|
.filter((item) => item)
|
|
@@ -102,23 +109,68 @@ const currentTenantId = computed(() => queryParams.tenantIds?.[0])
|
|
|
/** 是否集团账号:集团账号可切换院区,普通院区账号固定为当前院区 */
|
|
/** 是否集团账号:集团账号可切换院区,普通院区账号固定为当前院区 */
|
|
|
const canSwitchTenant = computed(() => !!userStore.getOrgTenant?.multiple)
|
|
const canSwitchTenant = computed(() => !!userStore.getOrgTenant?.multiple)
|
|
|
|
|
|
|
|
-/** 查询院区公告 */
|
|
|
|
|
|
|
+/** 按机构查询须知(返回第一条) */
|
|
|
|
|
+const fetchDetail = async () => {
|
|
|
|
|
+ const list = await getNoticeCustomerList({
|
|
|
|
|
+ type: NOTICE_TYPE,
|
|
|
|
|
+ tenantId: currentTenantId.value
|
|
|
|
|
+ })
|
|
|
|
|
+ return list?.[0]
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 用初始化数据为当前机构创建须知
|
|
|
|
|
+ * 后端未做初始化:机构下无数据时,不传 tenantId 再查一次拿到初始须知,
|
|
|
|
|
+ * 自动创建到当前机构下
|
|
|
|
|
+ */
|
|
|
|
|
+const initNotice = async () => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ const defaultList = await getNoticeCustomerList({ type: NOTICE_TYPE })
|
|
|
|
|
+ const initContent = defaultList?.[0]?.content
|
|
|
|
|
+ if (!initContent) {
|
|
|
|
|
+ return false
|
|
|
|
|
+ }
|
|
|
|
|
+ await createNoticeCustomer({
|
|
|
|
|
+ type: NOTICE_TYPE,
|
|
|
|
|
+ tenantId: currentTenantId.value,
|
|
|
|
|
+ content: initContent
|
|
|
|
|
+ })
|
|
|
|
|
+ return true
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ return false
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/** 查询院区须知:无数据时先自动初始化,再查询回填 */
|
|
|
const getDetail = async () => {
|
|
const getDetail = async () => {
|
|
|
if (!currentTenantId.value) {
|
|
if (!currentTenantId.value) {
|
|
|
- message.warning('请先选择院区')
|
|
|
|
|
|
|
+ message.warning('请先选择机构')
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
loading.value = true
|
|
loading.value = true
|
|
|
try {
|
|
try {
|
|
|
- const data = await getNoticeCustomer(currentTenantId.value)
|
|
|
|
|
- formData.id = data?.id
|
|
|
|
|
- formData.notice = data?.notice || ''
|
|
|
|
|
|
|
+ const detail = await fetchDetail()
|
|
|
|
|
+ if (detail) {
|
|
|
|
|
+ formData.id = detail.id
|
|
|
|
|
+ formData.content = detail.content || ''
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ // 机构下无数据 -> 自动初始化后再查一次回填
|
|
|
|
|
+ const created = await initNotice()
|
|
|
|
|
+ if (created) {
|
|
|
|
|
+ const newDetail = await fetchDetail()
|
|
|
|
|
+ formData.id = newDetail?.id
|
|
|
|
|
+ formData.content = newDetail?.content || ''
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ formData.id = undefined
|
|
|
|
|
+ formData.content = ''
|
|
|
} finally {
|
|
} finally {
|
|
|
loading.value = false
|
|
loading.value = false
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/** 切换院区 / 查询 */
|
|
|
|
|
|
|
+/** 切换机构 / 查询 */
|
|
|
const handleQuery = () => {
|
|
const handleQuery = () => {
|
|
|
getDetail()
|
|
getDetail()
|
|
|
}
|
|
}
|
|
@@ -126,19 +178,20 @@ const handleQuery = () => {
|
|
|
/** 保存 */
|
|
/** 保存 */
|
|
|
const handleSave = async () => {
|
|
const handleSave = async () => {
|
|
|
if (!currentTenantId.value) {
|
|
if (!currentTenantId.value) {
|
|
|
- message.warning('请先选择院区')
|
|
|
|
|
|
|
+ message.warning('请先选择机构')
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
- if (!formData.notice || !formData.notice.trim()) {
|
|
|
|
|
- message.warning('公告内容不能为空')
|
|
|
|
|
|
|
+ if (!formData.content || !formData.content.trim()) {
|
|
|
|
|
+ message.warning('须知内容不能为空')
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
saveLoading.value = true
|
|
saveLoading.value = true
|
|
|
try {
|
|
try {
|
|
|
await saveNoticeCustomer({
|
|
await saveNoticeCustomer({
|
|
|
id: formData.id,
|
|
id: formData.id,
|
|
|
|
|
+ type: NOTICE_TYPE,
|
|
|
tenantId: currentTenantId.value,
|
|
tenantId: currentTenantId.value,
|
|
|
- notice: formData.notice
|
|
|
|
|
|
|
+ content: formData.content
|
|
|
})
|
|
})
|
|
|
message.success('保存成功')
|
|
message.success('保存成功')
|
|
|
await getDetail()
|
|
await getDetail()
|