This commit is contained in:
Your Name
2026-08-12 14:48:57 +08:00
parent bc9ad1d3cd
commit 6d9fe1bbf8
403 changed files with 1790 additions and 1573 deletions
@@ -0,0 +1,538 @@
<template>
<div ref="paperRef" class="rx-paper">
<div class="rx-notice">
<span class="rx-notice-text">
服药前请核对姓名电话医生等信息以及服法医嘱等要点
</span>
<span class="rx-notice-meta">
<span>日期{{ dateText }}</span>
<span>编号{{ serialText }}</span>
</span>
</div>
<div class="rx-info">
<div class="rx-info-row">
<div class="rx-info-cell">
<span class="rx-key">姓名</span>
<span class="rx-val">{{ data?.patient_name || '—' }}</span>
</div>
<div class="rx-info-cell">
<span class="rx-key">性别</span>
<span class="rx-val">{{ genderLabel }}</span>
</div>
<div class="rx-info-cell">
<span class="rx-key">年龄</span>
<span class="rx-val">{{ ageText }}</span>
</div>
<div class="rx-info-cell">
<span class="rx-key">电话</span>
<span class="rx-val">{{ data?.phone || data?.recipient_phone || '—' }}</span>
</div>
</div>
<div class="rx-info-row rx-info-row-full">
<div class="rx-info-cell">
<span class="rx-key">收件信息</span>
<span class="rx-val">{{ recipientText }}</span>
</div>
</div>
<div class="rx-info-row rx-info-row-full">
<div class="rx-info-cell">
<span class="rx-key">临床诊断</span>
<span class="rx-val">{{ data?.clinical_diagnosis || '—' }}</span>
</div>
</div>
</div>
<div class="rx-rp">
<div class="rx-watermark">药房联</div>
<div class="rx-rp-head">
<div class="rx-rp-label">Rp.</div>
<div class="rx-rp-cols-head">
<div class="rx-rp-col-head">
<span>用药 (单剂)</span>
<span>总量</span>
</div>
<div class="rx-rp-col-head">
<span>用药 (单剂)</span>
<span>总量</span>
</div>
</div>
</div>
<div class="rx-herbs">
<template v-if="mainHerbs.length">
<div class="rx-herb-section-label">主方</div>
<div
v-for="(h, i) in mainHerbs"
:key="'main-' + i"
class="rx-herb-cell"
>
<span class="rx-herb-name">{{ h.name }} ({{ h.dosage }})</span>
<span class="rx-herb-total">{{ herbTotal(h.dosage) }}</span>
</div>
</template>
<template v-if="auxHerbs.length">
<div class="rx-herb-section-label rx-herb-section-label--aux">辅方</div>
<div
v-for="(h, i) in auxHerbs"
:key="'aux-' + i"
class="rx-herb-cell"
>
<span class="rx-herb-name">{{ h.name }} ({{ h.dosage }})</span>
<span class="rx-herb-total">{{ herbTotal(h.dosage) }}</span>
</div>
</template>
</div>
</div>
<div class="rx-text">
<p>主方服法{{ usageText }}</p>
<p v-if="auxUsageText">辅方服法{{ auxUsageText }}</p>
<p v-if="adviceText">医嘱{{ adviceText }}</p>
<p v-if="dietaryText">忌口{{ dietaryText }}</p>
<p v-if="remarkText">备注{{ remarkText }}</p>
<p v-if="pharmacyRemarkText" class="rx-text-warn">
药房备注{{ pharmacyRemarkText }}
</p>
<p v-if="outPelletText" class="rx-text-warn">
出丸{{ outPelletText }}
</p>
</div>
<div class="rx-bottom">
<div class="rx-bot-row rx-bot-row-1">
<div class="rx-bot-cell rx-bot-stack rx-bot-doctor">
<div class="rx-bot-label">医师</div>
<div class="rx-bot-doctor-body">
<img
v-if="data?.doctor_signature"
:src="data.doctor_signature"
alt="医师签名"
class="rx-bot-sign-img"
/>
<div v-if="!data?.doctor_signature" class="rx-bot-doctor-name">
{{ data?.doctor_name || '' }}
</div>
</div>
</div>
<div class="rx-bot-cell rx-bot-meta">
<span class="rx-bot-meta-key">类型:</span>
<span class="rx-bot-meta-val">{{ typeText }}</span>
</div>
<div class="rx-bot-cell rx-bot-meta">
<span class="rx-bot-meta-key">天数:</span>
<span class="rx-bot-meta-val">{{ data?.dose_count || '—' }}</span>
</div>
<div class="rx-bot-cell rx-bot-meta">
<span class="rx-bot-meta-key">单剂量:</span>
<span class="rx-bot-meta-val">{{ perDoseAmount }}</span>
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { computed, ref } from 'vue'
import {
getAuxHerbs,
getMainHerbs,
rxAdviceText,
rxAuxUsageText,
rxDateText,
rxHerbTotal,
rxOutPelletText,
rxPerDoseAmount,
rxPharmacyRemarkText,
rxRecipientText,
rxRemarkText,
rxSerialText,
rxTypeText,
rxUsageText,
slipAgeText,
slipDietaryText,
slipGenderLabel
} from './utils'
defineOptions({ name: 'PrescriptionSlip' })
const props = defineProps<{
/** 处方详情 / 列表行(字段与 tcm.prescription/detail 对齐) */
data: Record<string, any> | null | undefined
}>()
const paperRef = ref<HTMLElement | null>(null)
const dateText = computed(() => rxDateText(props.data))
const serialText = computed(() => rxSerialText(props.data))
const recipientText = computed(() => rxRecipientText(props.data))
const genderLabel = computed(() => slipGenderLabel(props.data?.gender))
const ageText = computed(() => slipAgeText(props.data?.age))
const mainHerbs = computed(() => getMainHerbs(props.data))
const auxHerbs = computed(() => getAuxHerbs(props.data))
const usageText = computed(() => rxUsageText(props.data))
const auxUsageText = computed(() => rxAuxUsageText(props.data))
const adviceText = computed(() => rxAdviceText(props.data))
const dietaryText = computed(() => slipDietaryText(props.data))
const remarkText = computed(() => rxRemarkText(props.data))
const pharmacyRemarkText = computed(() => rxPharmacyRemarkText(props.data))
const outPelletText = computed(() => rxOutPelletText(props.data))
const typeText = computed(() => rxTypeText(props.data))
const perDoseAmount = computed(() => rxPerDoseAmount(props.data))
function herbTotal(dosage: number | string) {
return rxHerbTotal(props.data, dosage)
}
defineExpose({
/** 供打印 / html2canvas 使用的纸张根节点 */
paperEl: paperRef,
/** 兼容旧用法:直接拿到 DOM */
$el: paperRef
})
</script>
<style lang="scss" scoped>
/* ============================================================
* 处方笺(A4 药房联)样式
* 严格按 A4210mm × 297mmpadding 8mm 10mm
* 唯一视觉基准:consumer/prescription/index.vue
* ============================================================ */
.rx-paper {
width: 210mm;
min-height: 297mm;
margin: 0 auto;
background: #fff;
box-sizing: border-box;
padding: 8mm 10mm;
color: #1f1f1f;
font-size: 13px;
line-height: 1.5;
font-family: 'Microsoft YaHei', 'PingFang SC', -apple-system, BlinkMacSystemFont, 'Segoe UI',
sans-serif;
box-shadow: 0 0 0 1px #d6d6d6, 0 6px 24px rgba(0, 0, 0, 0.06);
overflow: visible;
}
.rx-notice {
display: flex;
align-items: center;
justify-content: space-between;
background: #f3f4f6;
border: 1px solid #e5e7eb;
padding: 6px 10px;
border-radius: 2px;
font-size: 12px;
color: #1f1f1f;
margin-bottom: 6px;
.rx-notice-text {
flex: 1;
}
.rx-notice-meta {
display: inline-flex;
gap: 24px;
white-space: nowrap;
}
}
.rx-info {
border: 1px solid #c8c8c8;
border-bottom: none;
}
.rx-info-row {
display: grid;
grid-template-columns: repeat(4, 1fr);
border-bottom: 1px solid #c8c8c8;
}
.rx-info-row-full {
grid-template-columns: 1fr;
}
.rx-info-cell {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 10px;
font-size: 13px;
border-right: 1px solid #c8c8c8;
min-height: 32px;
&:last-child {
border-right: none;
}
.rx-key {
color: #1f1f1f;
flex-shrink: 0;
}
.rx-val {
flex: 1;
min-width: 0;
word-break: break-all;
}
}
.rx-rp {
position: relative;
border-left: 1px solid #c8c8c8;
border-right: 1px solid #c8c8c8;
padding: 8px 10px 16px;
overflow: hidden;
box-sizing: border-box;
width: 100%;
}
.rx-watermark {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: 88px;
font-weight: 700;
color: rgba(0, 0, 0, 0.06);
transform: rotate(-22deg);
letter-spacing: 0.18em;
pointer-events: none;
user-select: none;
z-index: 0;
}
.rx-rp-head {
display: grid;
grid-template-columns: 36px 1fr;
align-items: end;
column-gap: 8px;
padding-bottom: 4px;
border-bottom: 1px solid #d4d4d4;
margin-bottom: 6px;
position: relative;
z-index: 1;
width: 100%;
box-sizing: border-box;
}
.rx-rp-label {
font-size: 16px;
font-weight: 700;
color: #1f1f1f;
line-height: 1;
}
.rx-rp-cols-head {
display: grid;
grid-template-columns: 1fr 1fr;
column-gap: 24px;
width: 100%;
box-sizing: border-box;
min-width: 0;
}
.rx-rp-col-head {
display: grid;
grid-template-columns: 1fr 64px;
column-gap: 8px;
font-size: 13px;
color: #1f1f1f;
min-width: 0;
& > span:last-child {
text-align: right;
}
}
.rx-herbs {
padding-left: 44px;
display: grid;
grid-template-columns: 1fr 1fr;
column-gap: 24px;
row-gap: 6px;
position: relative;
z-index: 1;
width: 100%;
box-sizing: border-box;
}
.rx-herb-section-label {
grid-column: 1 / -1;
font-size: 12px;
font-weight: 600;
color: #409eff;
line-height: 1.4;
}
.rx-herb-section-label--aux {
color: #e6a23c;
margin-top: 4px;
}
.rx-herb-cell {
display: grid;
grid-template-columns: 1fr 64px;
column-gap: 8px;
font-size: 13px;
line-height: 1.85;
min-width: 0;
}
.rx-herb-name {
color: #1f1f1f;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.rx-herb-total {
color: #1f1f1f;
text-align: right;
font-variant-numeric: tabular-nums;
white-space: nowrap;
}
.rx-text {
border: 1px solid #c8c8c8;
border-top: none;
padding: 10px 12px;
font-size: 13px;
line-height: 1.85;
p {
margin: 0;
}
.rx-text-warn {
color: #d72424;
font-weight: 600;
}
}
.rx-bottom {
border: 1px solid #c8c8c8;
border-top: none;
}
.rx-bot-row {
display: grid;
border-bottom: 1px solid #c8c8c8;
&:last-child {
border-bottom: none;
}
}
.rx-bot-row-1 {
grid-template-columns: 1.4fr 0.6fr 0.6fr 0.6fr 0.6fr 1.7fr 0.95fr 1.25fr;
min-height: 70px;
}
.rx-bot-cell {
border-right: 1px solid #c8c8c8;
padding: 6px 10px;
font-size: 12px;
color: #1f1f1f;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
min-height: 32px;
box-sizing: border-box;
&:last-child {
border-right: none;
}
}
.rx-bot-stack {
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
}
.rx-bot-label {
font-size: 13px;
color: #1f1f1f;
margin-bottom: 4px;
}
.rx-bot-doctor {
.rx-bot-doctor-body {
flex: 1;
display: flex;
align-items: center;
gap: 6px;
min-height: 36px;
}
.rx-bot-doctor-name {
font-size: 13px;
color: #1f1f1f;
}
.rx-bot-sign-img {
max-height: 40px;
max-width: 110px;
object-fit: contain;
}
}
.rx-bot-meta {
flex-wrap: nowrap;
.rx-bot-meta-key {
color: #1f1f1f;
margin-right: 6px;
white-space: nowrap;
flex-shrink: 0;
line-height: 1.4;
}
.rx-bot-meta-val {
font-weight: 500;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
min-width: 0;
line-height: 1.4;
}
}
</style>
<!-- 全局打印样式body * 选择器不能放进 scoped -->
<style>
@media print {
body * {
visibility: hidden !important;
}
.rx-paper,
.rx-paper * {
visibility: visible !important;
}
.rx-paper {
position: fixed !important;
left: 0 !important;
top: 0 !important;
width: 210mm !important;
height: 297mm !important;
margin: 0 !important;
padding: 8mm 10mm !important;
box-shadow: none !important;
page-break-after: always;
}
@page {
size: A4;
margin: 0;
}
}
</style>
@@ -0,0 +1,291 @@
/**
* 处方笺(A4 药房联)字段计算
* 唯一视觉基准:consumer/prescription/index.vue 查看态
*/
export type FormulaType = '主方' | '辅方'
export type SlipHerb = {
medicine_id?: number
name: string
dosage: number
formula_type?: FormulaType | string
}
export type AuxUsageForm = {
dosage_amount: number
dosage_bag_count: number
need_decoction: boolean
bags_per_dose: number
times_per_day: number
usage_days: number
prescription_name?: string
}
export function formatNum(n: number): string {
if (!isFinite(n)) return '0'
return Number.isInteger(n) ? String(n) : n.toFixed(2).replace(/\.?0+$/, '')
}
export function slipGenderLabel(g: unknown) {
if (g === 1 || g === '1') return '男'
if (g === 0 || g === '0') return '女'
return '—'
}
export function slipAgeText(age: unknown) {
if (age === null || age === undefined || age === '') return '—'
return `${age}`
}
export function normalizeFormulaType(v: unknown): FormulaType {
return v === '辅方' ? '辅方' : '主方'
}
function padN(n: number) {
return String(n).padStart(2, '0')
}
export function defaultAuxUsage(prescriptionType = '浓缩水丸'): AuxUsageForm {
if (prescriptionType === '饮片') {
return {
dosage_amount: 50,
dosage_bag_count: 1,
need_decoction: false,
bags_per_dose: 1,
times_per_day: 3,
usage_days: 7
}
}
if (prescriptionType === '浓缩水丸') {
return {
dosage_amount: 5,
dosage_bag_count: 1,
need_decoction: false,
bags_per_dose: 1,
times_per_day: 3,
usage_days: 7
}
}
return {
dosage_amount: 1,
dosage_bag_count: 1,
need_decoction: false,
bags_per_dose: 1,
times_per_day: 3,
usage_days: 7
}
}
export function normalizeAuxUsageForm(raw: unknown, prescriptionType: string): AuxUsageForm {
const base = defaultAuxUsage(prescriptionType)
if (!raw || typeof raw !== 'object') return { ...base }
const o = raw as Record<string, unknown>
return {
dosage_amount:
o.dosage_amount !== null && o.dosage_amount !== undefined && o.dosage_amount !== ''
? Number(o.dosage_amount)
: base.dosage_amount,
dosage_bag_count: o.dosage_bag_count != null ? Number(o.dosage_bag_count) || 1 : base.dosage_bag_count,
need_decoction: o.need_decoction === 1 || o.need_decoction === true,
bags_per_dose: o.bags_per_dose != null ? Number(o.bags_per_dose) || 1 : base.bags_per_dose,
times_per_day: o.times_per_day != null ? Number(o.times_per_day) || 3 : base.times_per_day,
usage_days: o.usage_days != null ? Number(o.usage_days) || 7 : base.usage_days,
prescription_name: String(o.prescription_name ?? '').trim()
}
}
export function buildUsageSegmentText(
usage: {
prescription_type?: string
dosage_amount?: number | null
dosage_unit?: string
dosage_bag_count?: number
times_per_day?: number
usage_way?: string
usage_time?: string
},
fallbackWay?: string,
fallbackTime?: string
): string {
const pt = usage.prescription_type || '浓缩水丸'
const times = Number(usage.times_per_day) > 0 ? Number(usage.times_per_day) : 3
const amount = usage.dosage_amount != null ? Number(usage.dosage_amount) : 10
const unit = usage.dosage_unit || (pt === '饮片' ? 'ml' : 'g')
const usageWay = usage.usage_way || fallbackWay || '温水送服'
const usageTime = usage.usage_time || fallbackTime || ''
const seg: string[] = []
seg.push(`每天${times}`)
if (pt === '浓缩水丸') {
const bags = Number(usage.dosage_bag_count) > 0 ? Number(usage.dosage_bag_count) : 1
seg.push(`一次${bags}`)
seg.push(`每袋${amount}${unit}`)
} else {
seg.push(`一次${amount}${unit}`)
}
seg.push(usageWay)
if (usageTime) seg.push(usageTime)
return seg.join(', ')
}
export function getSlipHerbs(data: Record<string, any> | null | undefined): SlipHerb[] {
const h = data?.herbs
return Array.isArray(h) ? (h as SlipHerb[]) : []
}
export function getMainHerbs(data: Record<string, any> | null | undefined): SlipHerb[] {
return getSlipHerbs(data).filter((h) => normalizeFormulaType(h.formula_type) === '主方')
}
export function getAuxHerbs(data: Record<string, any> | null | undefined): SlipHerb[] {
return getSlipHerbs(data).filter((h) => normalizeFormulaType(h.formula_type) === '辅方')
}
export function getDoseCount(data: Record<string, any> | null | undefined): number {
const n = Number(data?.dose_count)
return Number.isFinite(n) && n > 0 ? n : 1
}
export function rxDateText(data: Record<string, any> | null | undefined): string {
if (!data) return '—'
const ts = data.create_time ?? data.update_time ?? null
if (ts) {
const t = String(ts).length === 10 ? Number(ts) * 1000 : Number(ts)
const d = new Date(t)
if (!isNaN(d.getTime())) {
return `${d.getFullYear()}-${padN(d.getMonth() + 1)}-${padN(d.getDate())} ${padN(d.getHours())}:${padN(d.getMinutes())}`
}
}
return data.prescription_date || '—'
}
export function rxSerialText(data: Record<string, any> | null | undefined): string {
if (!data) return '—'
return (
data.order_no ||
data.serial_no ||
data.serial_number ||
data.no ||
data.prescription_no ||
data.sn ||
data.visit_no ||
(data.id ? `G${data.id}` : '—')
)
}
export function rxRecipientText(data: Record<string, any> | null | undefined): string {
if (!data) return '—'
if (data.recipient_text) return data.recipient_text
const parts: string[] = []
if (data.recipient_name || data.patient_name) parts.push(data.recipient_name || data.patient_name)
if (data.recipient_phone || data.phone) parts.push(data.recipient_phone || data.phone)
let region = data.region
if (Array.isArray(region)) region = region.filter(Boolean).join('')
if (!region) {
region = [data.shipping_province, data.shipping_city, data.shipping_district]
.filter(Boolean)
.join('')
}
if (region) parts.push(String(region))
if (data.shipping_address) parts.push(String(data.shipping_address))
else if (data.address) parts.push(String(data.address))
return parts.length ? parts.join('') : '—'
}
export function rxPerDoseAmount(data: Record<string, any> | null | undefined): string {
const list = getSlipHerbs(data)
const sum = list.reduce((acc, h) => acc + (Number(h?.dosage) || 0), 0)
return formatNum(sum)
}
export function rxHerbTotal(data: Record<string, any> | null | undefined, dosage: number | string): string {
const d = Number(dosage) || 0
return formatNum(d * getDoseCount(data))
}
export function rxTypeText(data: Record<string, any> | null | undefined): string {
if (!data) return '—'
const t = data.prescription_type || '浓缩水丸'
return /丸|散|膏|片/.test(t) ? `浓缩丸-${t}` : t
}
export function rxUsageText(data: Record<string, any> | null | undefined): string {
if (!data) return '—'
if (data.usage_text) return data.usage_text
return buildUsageSegmentText(data)
}
export function rxAuxUsageText(data: Record<string, any> | null | undefined): string {
if (!data || !getAuxHerbs(data).length) return ''
const aux = normalizeAuxUsageForm(data.aux_usage, data.prescription_type || '浓缩水丸')
return buildUsageSegmentText(
{
prescription_type: data.prescription_type,
dosage_amount: aux.dosage_amount,
dosage_unit: data.dosage_unit,
dosage_bag_count: aux.dosage_bag_count,
times_per_day: aux.times_per_day,
usage_way: data.usage_way,
usage_time: data.usage_time
},
data.usage_way,
data.usage_time
)
}
export function rxAdviceText(data: Record<string, any> | null | undefined): string {
if (!data) return ''
return data.medical_advice || data.doctor_advice || ''
}
export function slipDietaryText(data: Record<string, any> | null | undefined): string {
const d = data?.dietary_taboo
if (Array.isArray(d)) return d.filter(Boolean).join('、')
if (typeof d === 'string' && d.trim()) return d.trim()
return ''
}
export function rxRemarkText(data: Record<string, any> | null | undefined): string {
if (!data) return ''
const parts: string[] = []
parts.push(`${getSlipHerbs(data).length}味药`)
if (data.usage_notes) parts.push(String(data.usage_notes))
if (data.remark) parts.push(String(data.remark))
return parts.join(' ')
}
export function rxPharmacyRemarkText(data: Record<string, any> | null | undefined): string {
if (!data) return ''
return data.pharmacy_remark || data.pharmacy_note || ''
}
function computeOutPellet(data: Record<string, any>): string {
if ((data.prescription_type || '浓缩水丸') === '浓缩水丸') {
const days = Number(data.medication_days ?? data.usage_days ?? data.dose_count)
const times = Number(data.times_per_day)
const doseG = Number(data.dosage_amount)
const bags = Number(data.dosage_bag_count) > 0 ? Number(data.dosage_bag_count) : 1
if (
Number.isFinite(days) &&
Number.isFinite(times) &&
Number.isFinite(doseG) &&
days > 0 &&
times > 0 &&
doseG > 0
) {
return formatNum(days * times * doseG * bags)
}
}
const explicit = data.out_pellet || data.out_pellet_text || data.total_weight
if (explicit && Number(explicit) > 0) return formatNum(Number(explicit))
const list = getSlipHerbs(data)
if (!list.length) return ''
const perDose = list.reduce((acc, h) => acc + (Number(h?.dosage) || 0), 0)
return formatNum(perDose * getDoseCount(data))
}
export function rxOutPelletText(data: Record<string, any> | null | undefined): string {
if (!data) return ''
const out = computeOutPellet(data)
return out ? `${out}` : ''
}
+9 -194
View File
@@ -534,13 +534,6 @@
</div> </div>
<div v-else class="rx-wrap"> <div v-else class="rx-wrap">
<el-tabs
v-model="prescriptionTabType"
class="rx-slip-tabs"
>
<el-tab-pane label="药房联" name="internal" />
<el-tab-pane label="处方联" name="user" />
</el-tabs>
<div class="rx-toolbar"> <div class="rx-toolbar">
<el-tag v-if="savedPrescription.void_status === 1" type="danger" size="small">已作废</el-tag> <el-tag v-if="savedPrescription.void_status === 1" type="danger" size="small">已作废</el-tag>
<el-tag v-else-if="approvedPreviewOnly" type="success" size="small">已通过</el-tag> <el-tag v-else-if="approvedPreviewOnly" type="success" size="small">已通过</el-tag>
@@ -565,190 +558,11 @@
</div> </div>
<div class="prescription-preview-content"> <div class="prescription-preview-content">
<div v-if="savedPrescription" ref="prescriptionPrintRef" class="rx-paper"> <PrescriptionSlip
<div class="rx-title">{{ prescriptionTabType === 'internal' ? '药房联' : SLIP_TITLE }}</div> v-if="savedPrescription"
<div class="rx-notice"> ref="rxSlipRef"
<span class="rx-notice-text"> :data="savedPrescription"
{{ />
prescriptionTabType === 'user'
? '服药前请核对姓名、电话、医生等信息以及医嘱等要点'
: '服药前请核对姓名、电话、医生等信息以及服法、医嘱等要点'
}}
</span>
<span class="rx-notice-meta">
<span>日期{{ rxDateText }}</span>
<span>编号{{ rxSerialText }}</span>
</span>
</div>
<div class="rx-info">
<div class="rx-info-row">
<div class="rx-info-cell">
<span class="rx-key">姓名</span>
<span class="rx-val">{{ savedPrescription.patient_name || '—' }}</span>
</div>
<div class="rx-info-cell">
<span class="rx-key">性别</span>
<span class="rx-val">{{ slipGenderLabel(savedPrescription.gender) }}</span>
</div>
<div class="rx-info-cell">
<span class="rx-key">年龄</span>
<span class="rx-val">{{ slipAgeText(savedPrescription.age) }}</span>
</div>
<div class="rx-info-cell">
<span class="rx-key">电话</span>
<span class="rx-val">{{ savedPrescription.phone || '—' }}</span>
</div>
</div>
<div class="rx-info-row rx-info-row-full">
<div class="rx-info-cell">
<span class="rx-key">门诊号</span>
<span class="rx-val">{{ savedPrescription.visit_no || '—' }}</span>
</div>
</div>
<div v-if="savedPrescription.pulse || savedPrescription.tongue" class="rx-info-row rx-info-row-full">
<div v-if="savedPrescription.pulse" class="rx-info-cell">
<span class="rx-key">面象</span>
<span class="rx-val">{{ savedPrescription.pulse }}</span>
</div>
<div v-if="savedPrescription.tongue" class="rx-info-cell">
<span class="rx-key">舌象</span>
<span class="rx-val">{{ savedPrescription.tongue }}</span>
</div>
</div>
<div class="rx-info-row rx-info-row-full">
<div class="rx-info-cell">
<span class="rx-key">临床诊断</span>
<span class="rx-val">{{ savedPrescription.clinical_diagnosis || '—' }}</span>
</div>
</div>
</div>
<div class="rx-rp">
<div class="rx-watermark">{{ prescriptionTabType === 'internal' ? '药房联' : '处方联' }}</div>
<div class="rx-rp-head">
<div class="rx-rp-label">Rp.</div>
<div class="rx-rp-cols-head">
<div class="rx-rp-col-head">
<span>用药 (单剂)</span>
<span>{{ prescriptionTabType === 'user' ? '用量' : '总量' }}</span>
</div>
<div class="rx-rp-col-head">
<span>用药 (单剂)</span>
<span>{{ prescriptionTabType === 'user' ? '用量' : '总量' }}</span>
</div>
</div>
</div>
<div class="rx-herbs">
<template v-if="prescriptionTabType === 'internal'">
<template v-if="savedMainHerbs.length">
<div class="rx-herb-section-label">主方</div>
<div
v-for="(h, i) in savedMainHerbs"
:key="'main-' + i"
class="rx-herb-cell"
>
<span class="rx-herb-name">{{ h.name }} ({{ h.dosage }})</span>
<span class="rx-herb-total">{{ rxHerbTotal(h.dosage) }}</span>
</div>
</template>
<template v-if="savedAuxHerbs.length">
<div class="rx-herb-section-label rx-herb-section-label--aux">辅方</div>
<div
v-for="(h, i) in savedAuxHerbs"
:key="'aux-' + i"
class="rx-herb-cell"
>
<span class="rx-herb-name">{{ h.name }} ({{ h.dosage }})</span>
<span class="rx-herb-total">{{ rxHerbTotal(h.dosage) }}</span>
</div>
</template>
</template>
<template v-else>
<template v-if="savedMainHerbs.length">
<div class="rx-herb-section-label">主方</div>
<div
v-for="(h, i) in savedMainHerbs"
:key="'user-main-' + i"
class="rx-herb-cell"
>
<span class="rx-herb-name">{{ h.name }}</span>
<span class="rx-herb-total">{{ h.dosage }}</span>
</div>
</template>
<template v-if="savedAuxHerbs.length">
<div class="rx-herb-section-label rx-herb-section-label--aux">辅方</div>
<div
v-for="(h, i) in savedAuxHerbs"
:key="'user-aux-' + i"
class="rx-herb-cell"
>
<span class="rx-herb-name">{{ h.name }}</span>
<span class="rx-herb-total">{{ h.dosage }}</span>
</div>
</template>
</template>
</div>
</div>
<div class="rx-text">
<template v-if="prescriptionTabType === 'internal'">
<p v-if="savedAuxUsageText">主方服法{{ rxUsageText }}</p>
<p v-else>服法{{ rxUsageText }}</p>
<p v-if="savedAuxUsageText">辅方服法{{ savedAuxUsageText }}</p>
</template>
<p v-if="rxAdviceText">医嘱{{ rxAdviceText }}</p>
<p v-if="prescriptionTabType === 'internal' && rxRemarkText">备注{{ rxRemarkText }}</p>
<p v-if="savedPrescription.dietary_taboo && savedPrescription.dietary_taboo.length">
忌口{{ Array.isArray(savedPrescription.dietary_taboo) ? savedPrescription.dietary_taboo.join('') : savedPrescription.dietary_taboo }}
</p>
<p v-if="rxPharmacyRemarkText" class="rx-text-warn">药房备注{{ rxPharmacyRemarkText }}</p>
<p
v-if="prescriptionTabType === 'internal' && rxOutPelletText && savedPrescription.prescription_type !== '饮片'"
class="rx-text-warn"
>
出丸{{ rxOutPelletText }}
</p>
</div>
<div class="rx-bottom">
<div
class="rx-bot-row rx-bot-row-1"
:class="{ 'rx-bot-row-1--user': prescriptionTabType === 'user' }"
>
<div class="rx-bot-cell rx-bot-stack rx-bot-doctor">
<div class="rx-bot-label">医师</div>
<div class="rx-bot-doctor-body">
<img
v-if="savedPrescription.doctor_signature"
:src="savedPrescription.doctor_signature"
alt="医师签名"
class="rx-bot-sign-img"
/>
<div v-if="!savedPrescription.doctor_signature" class="rx-bot-doctor-name">
{{ savedPrescription.doctor_name || '' }}
</div>
</div>
</div>
<div v-if="prescriptionTabType === 'internal'" class="rx-bot-cell rx-bot-meta">
<span class="rx-bot-meta-key">类型:</span>
<span class="rx-bot-meta-val">{{ rxTypeText }}</span>
</div>
<div class="rx-bot-cell rx-bot-meta">
<span class="rx-bot-meta-key">天数:</span>
<span class="rx-bot-meta-val">{{ rxSlipMedicationDaysText }}</span>
</div>
<div v-if="prescriptionTabType === 'internal'" class="rx-bot-cell rx-bot-meta">
<span class="rx-bot-meta-key">剂量:</span>
<span class="rx-bot-meta-val">{{ rxPerDoseAmount }}</span>
</div>
</div>
<div v-if="prescriptionTabType === 'user'" class="rx-bot-row rx-hospital-row">
<div class="rx-hospital-line">成都双流甄养堂互联网医院有限公司 联系方式4001667339</div>
<div class="rx-hospital-line">地址四川省成都市双流区黄甲街道黄龙大道二段280号</div>
</div>
</div>
</div>
<!-- 详细病历 - 单独A3纸张 --> <!-- 详细病历 - 单独A3纸张 -->
<div v-if="savedPrescription.case_record && !hideCaseRecordPreview" ref="caseRecordPrintRef" class="case-record-a3"> <div v-if="savedPrescription.case_record && !hideCaseRecordPreview" ref="caseRecordPrintRef" class="case-record-a3">
@@ -1045,6 +859,7 @@ import { formatDiabetesDiscoveryDisplay } from '@/utils/diabetes-discovery-displ
import { prescriptionAdd, prescriptionDetail, prescriptionGetByAppointment, prescriptionVoid, tcmDiagnosisDetail, prescriptionLibraryLists } from '@/api/tcm' import { prescriptionAdd, prescriptionDetail, prescriptionGetByAppointment, prescriptionVoid, tcmDiagnosisDetail, prescriptionLibraryLists } from '@/api/tcm'
import { medicineLists } from '@/api/medicine' import { medicineLists } from '@/api/medicine'
import { getDictData } from '@/api/app' import { getDictData } from '@/api/app'
import PrescriptionSlip from '@/components/prescription-slip/index.vue'
import html2canvas from 'html2canvas' import html2canvas from 'html2canvas'
import { jsPDF } from 'jspdf' import { jsPDF } from 'jspdf'
import useUserStore from '@/stores/modules/user' import useUserStore from '@/stores/modules/user'
@@ -1219,7 +1034,7 @@ const visible = ref(false)
const formRef = ref() const formRef = ref()
const saving = ref(false) const saving = ref(false)
const voiding = ref(false) const voiding = ref(false)
const prescriptionPrintRef = ref<HTMLElement>() const rxSlipRef = ref<InstanceType<typeof PrescriptionSlip> | null>(null)
const caseRecordPrintRef = ref<HTMLElement>() const caseRecordPrintRef = ref<HTMLElement>()
const signatureCanvasRef = ref<HTMLCanvasElement>() const signatureCanvasRef = ref<HTMLCanvasElement>()
/** 当前一笔的 pointerId(配合 setPointerCapture,移出画布仍跟手) */ /** 当前一笔的 pointerId(配合 setPointerCapture,移出画布仍跟手) */
@@ -1229,7 +1044,7 @@ const SIGNATURE_CSS_W = 560
const SIGNATURE_CSS_H = 168 const SIGNATURE_CSS_H = 168
const savedPrescription = ref<any>(null) const savedPrescription = ref<any>(null)
/** 预览联次:药房联 / 处方联(与消费者处方查看一致) */ /** 预览联次:药房联 / 处方联(与消费者处方查看一致) */
const prescriptionTabType = ref<'internal' | 'user'>('internal') const prescriptionTabType = ref<'internal' | 'user'>('internal') // 保留兼容 openPreview options.slipType
/** 诊单列表「查看」仅展示处方联,不展示详细病历 A3 */ /** 诊单列表「查看」仅展示处方联,不展示详细病历 A3 */
const hideCaseRecordPreview = ref(false) const hideCaseRecordPreview = ref(false)
@@ -2397,7 +2212,7 @@ const handleNewPrescription = async () => {
} }
const captureElement = async (): Promise<HTMLCanvasElement> => { const captureElement = async (): Promise<HTMLCanvasElement> => {
const el = prescriptionPrintRef.value const el = (rxSlipRef.value as { paperEl?: HTMLElement | null } | null)?.paperEl ?? null
if (!el) throw new Error('未找到处方内容') if (!el) throw new Error('未找到处方内容')
return html2canvas(el, { return html2canvas(el, {
scale: 2, scale: 2,
+11 -534
View File
@@ -342,144 +342,8 @@
<div v-if="slipView.audit_remark" class="mt-1">驳回意见{{ slipView.audit_remark }}</div> <div v-if="slipView.audit_remark" class="mt-1">驳回意见{{ slipView.audit_remark }}</div>
</div> </div>
<!-- A4 处方纸 --> <!-- A4 处方纸统一组件与全端药房联一比一 -->
<div v-if="slipView" ref="rxPaperRef" class="rx-paper"> <PrescriptionSlip v-if="slipView" ref="rxSlipRef" :data="slipView" />
<!-- 顶部告知栏 -->
<div class="rx-notice">
<span class="rx-notice-text">
服药前请核对姓名电话医生等信息以及服法医嘱等要点
</span>
<span class="rx-notice-meta">
<span>日期{{ rxDateText }}</span>
<span>编号{{ rxSerialText }}</span>
</span>
</div>
<!-- 患者信息表 -->
<div class="rx-info">
<div class="rx-info-row">
<div class="rx-info-cell">
<span class="rx-key">姓名</span>
<span class="rx-val">{{ slipView.patient_name || '—' }}</span>
</div>
<div class="rx-info-cell">
<span class="rx-key">性别</span>
<span class="rx-val">{{ slipGenderLabel(slipView.gender) }}</span>
</div>
<div class="rx-info-cell">
<span class="rx-key">年龄</span>
<span class="rx-val">{{ slipAgeText(slipView.age) }}</span>
</div>
<div class="rx-info-cell">
<span class="rx-key">电话</span>
<span class="rx-val">{{ slipView.phone || '—' }}</span>
</div>
</div>
<div class="rx-info-row rx-info-row-full">
<div class="rx-info-cell">
<span class="rx-key">收件信息</span>
<span class="rx-val">{{ rxRecipientText }}</span>
</div>
</div>
<div class="rx-info-row rx-info-row-full">
<div class="rx-info-cell">
<span class="rx-key">临床诊断</span>
<span class="rx-val">{{ slipView.clinical_diagnosis || '—' }}</span>
</div>
</div>
</div>
<!-- Rp 区域带水印 -->
<div class="rx-rp">
<div class="rx-watermark">药房联</div>
<div class="rx-rp-head">
<div class="rx-rp-label">Rp.</div>
<div class="rx-rp-cols-head">
<div class="rx-rp-col-head">
<span>用药 (单剂)</span>
<span>总量</span>
</div>
<div class="rx-rp-col-head">
<span>用药 (单剂)</span>
<span>总量</span>
</div>
</div>
</div>
<div class="rx-herbs">
<template v-if="slipMainHerbs.length">
<div class="rx-herb-section-label">主方</div>
<div
v-for="(h, i) in slipMainHerbs"
:key="'main-' + i"
class="rx-herb-cell"
>
<span class="rx-herb-name">{{ h.name }} ({{ h.dosage }})</span>
<span class="rx-herb-total">{{ rxHerbTotal(h.dosage) }}</span>
</div>
</template>
<template v-if="slipAuxHerbs.length">
<div class="rx-herb-section-label rx-herb-section-label--aux">辅方</div>
<div
v-for="(h, i) in slipAuxHerbs"
:key="'aux-' + i"
class="rx-herb-cell"
>
<span class="rx-herb-name">{{ h.name }} ({{ h.dosage }})</span>
<span class="rx-herb-total">{{ rxHerbTotal(h.dosage) }}</span>
</div>
</template>
</div>
</div>
<!-- 服法 / 医嘱 / 备注 / 药房备注 / 出丸 -->
<div class="rx-text">
<p>主方服法{{ rxUsageText }}</p>
<p v-if="rxAuxUsageText">辅方服法{{ rxAuxUsageText }}</p>
<p v-if="rxAdviceText">医嘱{{ rxAdviceText }}</p>
<p v-if="slipDietaryText">忌口{{ slipDietaryText }}</p>
<p v-if="rxRemarkText">备注{{ rxRemarkText }}</p>
<p v-if="rxPharmacyRemarkText" class="rx-text-warn">
药房备注{{ rxPharmacyRemarkText }}
</p>
<p v-if="rxOutPelletText" class="rx-text-warn">
出丸{{ rxOutPelletText }}
</p>
</div>
<!-- 底部表医师/审方/配药/复核/发药 + 类型/剂数/单剂量 -->
<div class="rx-bottom">
<div class="rx-bot-row rx-bot-row-1">
<div class="rx-bot-cell rx-bot-stack rx-bot-doctor">
<div class="rx-bot-label">医师</div>
<div class="rx-bot-doctor-body">
<img
v-if="slipView.doctor_signature"
:src="slipView.doctor_signature"
alt="医师签名"
class="rx-bot-sign-img"
/>
<div v-if="!slipView.doctor_signature" class="rx-bot-doctor-name">
{{ slipView.doctor_name || '' }}
</div>
</div>
</div>
<div class="rx-bot-cell rx-bot-meta">
<span class="rx-bot-meta-key">类型:</span>
<span class="rx-bot-meta-val">{{ rxTypeText }}</span>
</div>
<div class="rx-bot-cell rx-bot-meta">
<span class="rx-bot-meta-key">天数:</span>
<span class="rx-bot-meta-val">{{ slipView.dose_count || '—' }}</span>
</div>
<div class="rx-bot-cell rx-bot-meta">
<span class="rx-bot-meta-key">单剂量:</span>
<span class="rx-bot-meta-val">{{ rxPerDoseAmount }}</span>
</div>
</div>
</div>
</div>
<!-- 审核痕迹不进入打印区 --> <!-- 审核痕迹不进入打印区 -->
<div <div
@@ -1719,6 +1583,7 @@ import { hasPermission } from '@/utils/perm'
import type { FormInstance, FormRules } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus'
import DaterangePicker from '@/components/daterange-picker/index.vue' import DaterangePicker from '@/components/daterange-picker/index.vue'
import MedicineNameSelect from '@/components/medicine-name-select/index.vue' import MedicineNameSelect from '@/components/medicine-name-select/index.vue'
import PrescriptionSlip from '@/components/prescription-slip/index.vue'
import { Search, Download, Printer, EditPen } from '@element-plus/icons-vue' import { Search, Download, Printer, EditPen } from '@element-plus/icons-vue'
import { computed, onMounted, reactive, ref, watch, nextTick, defineAsyncComponent } from 'vue' import { computed, onMounted, reactive, ref, watch, nextTick, defineAsyncComponent } from 'vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
@@ -2542,9 +2407,14 @@ const slipDietaryText = computed(() => {
/* ============================================================ /* ============================================================
* A4 处方笺(药房联)相关计算 * A4 处方笺(药房联)相关计算
* ============================================================ */ * ============================================================ */
const rxPaperRef = ref<HTMLElement | null>(null) const rxSlipRef = ref<InstanceType<typeof PrescriptionSlip> | null>(null)
const downloadingSlip = ref(false) const downloadingSlip = ref(false)
function getRxPaperEl(): HTMLElement | null {
const exposed = rxSlipRef.value as { paperEl?: HTMLElement | null } | null
return exposed?.paperEl ?? null
}
const padN = (n: number) => String(n).padStart(2, '0') const padN = (n: number) => String(n).padStart(2, '0')
const rxDateText = computed(() => { const rxDateText = computed(() => {
@@ -2752,7 +2622,7 @@ function handlePrintSlip() {
/* === 下载 PDFA4 === */ /* === 下载 PDFA4 === */
async function handleDownloadSlip() { async function handleDownloadSlip() {
const node = rxPaperRef.value const node = getRxPaperEl()
if (!node) { if (!node) {
feedback.msgWarning('处方笺尚未渲染完成') feedback.msgWarning('处方笺尚未渲染完成')
return return
@@ -4155,10 +4025,7 @@ onMounted(async () => {
overflow-y: auto; overflow-y: auto;
} }
/* ============================================================ /* 查看区外壳A4 纸张样式见 @/components/prescription-slip */
* 处方笺A4 药房联样式
* 严格按 A4210mm × 297mmpadding 12mm
* ============================================================ */
.rx-wrap { .rx-wrap {
min-height: 160px; min-height: 160px;
background: #f5f6f8; background: #f5f6f8;
@@ -4193,370 +4060,6 @@ onMounted(async () => {
border: 1px solid #fecaca; border: 1px solid #fecaca;
} }
/* === A4 === */
.rx-paper {
width: 210mm;
min-height: 297mm;
margin: 0 auto;
background: #fff;
box-sizing: border-box;
padding: 8mm 10mm;
color: #1f1f1f;
font-size: 13px;
line-height: 1.5;
font-family: "Microsoft YaHei", "PingFang SC", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
box-shadow: 0 0 0 1px #d6d6d6, 0 6px 24px rgba(0, 0, 0, 0.06);
/* 防止 html2canvas 把内部表格裁切 */
overflow: visible;
}
/* === 顶部告知 === */
.rx-notice {
display: flex;
align-items: center;
justify-content: space-between;
background: #f3f4f6;
border: 1px solid #e5e7eb;
padding: 6px 10px;
border-radius: 2px;
font-size: 12px;
color: #1f1f1f;
margin-bottom: 6px;
.rx-notice-text {
flex: 1;
}
.rx-notice-meta {
display: inline-flex;
gap: 24px;
white-space: nowrap;
}
}
/* === 患者信息表 === */
.rx-info {
border: 1px solid #c8c8c8;
border-bottom: none;
}
.rx-info-row {
display: grid;
grid-template-columns: repeat(4, 1fr);
border-bottom: 1px solid #c8c8c8;
}
.rx-info-row-full {
grid-template-columns: 1fr;
}
.rx-info-cell {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 10px;
font-size: 13px;
border-right: 1px solid #c8c8c8;
min-height: 32px;
&:last-child { border-right: none; }
.rx-key {
color: #1f1f1f;
flex-shrink: 0;
}
.rx-val {
flex: 1;
min-width: 0;
word-break: break-all;
}
}
/* === Rp 区域 + 水印 === */
.rx-rp {
position: relative;
border-left: 1px solid #c8c8c8;
border-right: 1px solid #c8c8c8;
padding: 8px 10px 16px;
overflow: hidden;
box-sizing: border-box;
width: 100%;
}
.rx-watermark {
position: absolute;
/* 不使用 inset 简写html2canvas inset 解析不稳定
* 会导致水印容器尺寸异常进而影响内层网格对齐 */
top: 0;
right: 0;
bottom: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: 88px;
font-weight: 700;
color: rgba(0, 0, 0, 0.06);
transform: rotate(-22deg);
letter-spacing: 0.18em;
pointer-events: none;
user-select: none;
z-index: 0;
}
.rx-rp-head {
display: grid;
grid-template-columns: 36px 1fr;
align-items: end;
column-gap: 8px;
padding-bottom: 4px;
border-bottom: 1px solid #d4d4d4;
margin-bottom: 6px;
position: relative;
z-index: 1;
width: 100%;
box-sizing: border-box;
}
.rx-rp-label {
font-size: 16px;
font-weight: 700;
color: #1f1f1f;
line-height: 1;
}
.rx-rp-cols-head {
display: grid;
grid-template-columns: 1fr 1fr;
column-gap: 24px;
width: 100%;
box-sizing: border-box;
min-width: 0;
}
/* 注意列内 1fr 64px .rx-herb-cell 完全一致
* 配合 .rx-herbs .rx-rp-cols-head 同样的左侧 44px 缩进
* 即可保证用药 (单剂)与药材名总量与总量数字精确对齐 */
.rx-rp-col-head {
display: grid;
grid-template-columns: 1fr 64px;
column-gap: 8px;
font-size: 13px;
color: #1f1f1f;
min-width: 0;
& > span:last-child {
text-align: right;
}
}
.rx-herbs {
/* 与 .rx-rp-head 中 Rp. 列(36px) + column-gap(8px) 等宽缩进,
* 这样下方两列的左右边界与表头两列完全对齐。 */
padding-left: 44px;
display: grid;
grid-template-columns: 1fr 1fr;
column-gap: 24px;
row-gap: 6px;
position: relative;
z-index: 1;
width: 100%;
box-sizing: border-box;
}
.rx-herb-section-label {
grid-column: 1 / -1;
font-size: 12px;
font-weight: 600;
color: #409eff;
line-height: 1.4;
}
.rx-herb-section-label--aux {
color: #e6a23c;
margin-top: 4px;
}
.herb-formula-block__head {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 8px;
}
.usage-formula-title {
font-size: 13px;
font-weight: 600;
margin: 8px 0 4px;
color: #409eff;
}
.usage-formula-title--aux {
color: #e6a23c;
margin-top: 12px;
}
.rx-herb-cell {
display: grid;
grid-template-columns: 1fr 64px;
column-gap: 8px;
font-size: 13px;
line-height: 1.85;
min-width: 0;
}
.rx-herb-name {
color: #1f1f1f;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.rx-herb-total {
color: #1f1f1f;
text-align: right;
font-variant-numeric: tabular-nums;
white-space: nowrap;
}
/* === 服法 / 备注 文本块 === */
.rx-text {
border: 1px solid #c8c8c8;
border-top: none;
padding: 10px 12px;
font-size: 13px;
line-height: 1.85;
p { margin: 0; }
.rx-text-warn {
color: #d72424;
font-weight: 600;
}
}
/* === 底部表格 === */
.rx-bottom {
border: 1px solid #c8c8c8;
border-top: none;
}
.rx-bot-row {
display: grid;
border-bottom: 1px solid #c8c8c8;
&:last-child { border-bottom: none; }
}
.rx-bot-row-1 {
/* 类型/剂数/单剂量 三个 meta 列适当加宽,
* 避免"浓缩丸-浓缩水丸"被强制折行后把整行挤错位 */
grid-template-columns: 1.4fr 0.6fr 0.6fr 0.6fr 0.6fr 1.7fr 0.95fr 1.25fr;
min-height: 70px;
}
.rx-bot-row-2 {
grid-template-columns: repeat(6, 1fr);
}
/* 默认:单行内容左对齐、上下居中(适配 类型/剂数/单剂量/费用 等格子)。
* 需要"标题置顶 + 签名留白"的格子(医师/审方/配药/复核/发药)请加 .rx-bot-stack。
* 这样无需任何 !important 反向覆盖,html2canvas/原生渲染表现一致。 */
.rx-bot-cell {
border-right: 1px solid #c8c8c8;
padding: 6px 10px;
font-size: 12px;
color: #1f1f1f;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
min-height: 32px;
box-sizing: border-box;
&:last-child { border-right: none; }
}
.rx-bot-stack {
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
}
.rx-bot-label {
font-size: 13px;
color: #1f1f1f;
margin-bottom: 4px;
}
.rx-bot-doctor {
.rx-bot-doctor-body {
flex: 1;
display: flex;
align-items: center;
gap: 6px;
min-height: 36px;
}
.rx-bot-doctor-name {
font-size: 13px;
color: #1f1f1f;
}
.rx-bot-sign-img {
max-height: 40px;
max-width: 110px;
object-fit: contain;
}
}
.rx-bot-meta {
flex-wrap: nowrap;
.rx-bot-meta-key {
color: #1f1f1f;
margin-right: 6px;
white-space: nowrap;
flex-shrink: 0;
line-height: 1.4;
}
.rx-bot-meta-val {
font-weight: 500;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
min-width: 0;
line-height: 1.4;
}
}
.rx-fee {
font-size: 13px;
line-height: 1.4;
padding: 8px 10px;
.rx-fee-key {
color: #1f1f1f;
margin-right: 6px;
white-space: nowrap;
}
.rx-fee-val {
font-variant-numeric: tabular-nums;
white-space: nowrap;
}
}
.rx-fee-total {
font-weight: 700;
background: #fafafa;
.rx-fee-val { font-weight: 700; }
}
/* === 审核痕迹不打印 === */ /* === 审核痕迹不打印 === */
.rx-audit { .rx-audit {
margin-top: 12px; margin-top: 12px;
@@ -4569,8 +4072,6 @@ onMounted(async () => {
border-radius: 4px; border-radius: 4px;
} }
/* 打印控制规则放到非 scoped 的全局 style 中,参见底部 <style> */
/* 创建业务订单弹窗宽松留白默认字号卡片化信息区 */ /* 创建业务订单弹窗宽松留白默认字号卡片化信息区 */
.create-order-dialog { .create-order-dialog {
:deep(.el-dialog__header) { :deep(.el-dialog__header) {
@@ -4865,28 +4366,4 @@ onMounted(async () => {
} }
</style> </style>
<!-- 全局打印样式不能 scoped否则 body * 不生效 -->
<style>
@media print {
body * { visibility: hidden !important; }
.rx-paper, .rx-paper * { visibility: visible !important; }
.rx-paper {
position: fixed !important;
left: 0 !important;
top: 0 !important;
width: 210mm !important;
height: 297mm !important;
margin: 0 !important;
padding: 8mm 10mm !important;
box-shadow: none !important;
page-break-after: always;
}
@page {
size: A4;
margin: 0;
}
}
</style>
@@ -1770,12 +1770,6 @@
</div> </div>
</template> </template>
<div v-loading="prescriptionViewLoading" class="rx-wrap"> <div v-loading="prescriptionViewLoading" class="rx-wrap">
<!-- 处方签签 -->
<el-tabs v-model="prescriptionTabType" class="mx-4 mt-2" style="margin-bottom: 0px; z-index: 1; position: relative;" v-if="prescriptionViewData">
<el-tab-pane label="药房联" name="internal" />
<el-tab-pane label="处方联" name="user" />
</el-tabs>
<!-- 状态条不进入打印/导出范围 --> <!-- 状态条不进入打印/导出范围 -->
<div class="rx-statusbar" v-if="prescriptionViewData"> <div class="rx-statusbar" v-if="prescriptionViewData">
<el-tag <el-tag
@@ -1824,205 +1818,11 @@
<div v-if="prescriptionViewData.audit_remark" class="mt-1">驳回意见{{ prescriptionViewData.audit_remark }}</div> <div v-if="prescriptionViewData.audit_remark" class="mt-1">驳回意见{{ prescriptionViewData.audit_remark }}</div>
</div> </div>
<!-- A4 处方纸药房联 --> <PrescriptionSlip
<div v-if="prescriptionViewData" ref="prescriptionSlipPrintRef" class="rx-paper"> v-if="prescriptionViewData"
<div class="rx-title">{{ prescriptionTabType === 'internal' ? '药房联' : SLIP_TITLE }}</div> ref="rxSlipRef"
<div class="rx-notice"> :data="prescriptionViewData"
<span class="rx-notice-text"> />
{{
prescriptionTabType === 'user'
? '服药前请核对姓名、电话、医生等信息以及医嘱等要点'
: '服药前请核对姓名、电话、医生等信息以及服法、医嘱等要点'
}}
</span>
<div class="rx-notice-meta">
<div class="rx-meta-item">
<span class="rx-meta-label">日期</span>
<span class="rx-meta-value">{{ rxDateText }}</span>
</div>
<div class="rx-meta-item">
<span class="rx-meta-label">处方编号</span>
<span class="rx-meta-value">{{ rxPrescriptionSnText }}</span>
</div>
<div class="rx-meta-item">
<span class="rx-meta-label">流转编号挂号</span>
<span class="rx-meta-value">{{ rxAppointmentFlowText }}</span>
</div>
<div v-if="rxBusinessOrderNoText" class="rx-meta-item">
<span class="rx-meta-label">业务单号</span>
<span class="rx-meta-value">{{ rxBusinessOrderNoText }}</span>
</div>
</div>
</div>
<div class="rx-info">
<div class="rx-info-row">
<div class="rx-info-cell">
<span class="rx-key">姓名</span>
<span class="rx-val">{{ prescriptionViewData.patient_name || '—' }}</span>
</div>
<div class="rx-info-cell">
<span class="rx-key">性别</span>
<span class="rx-val">{{ slipGenderLabel(prescriptionViewData.gender) }}</span>
</div>
<div class="rx-info-cell">
<span class="rx-key">年龄</span>
<span class="rx-val">{{ slipAgeText(prescriptionViewData.age) }}</span>
</div>
<div class="rx-info-cell">
<span class="rx-key">电话</span>
<span class="rx-val">{{ prescriptionViewData.phone || prescriptionViewData.recipient_phone || '—' }}</span>
</div>
</div>
<div class="rx-info-row rx-info-row-full">
<div class="rx-info-cell">
<span class="rx-key">收件信息</span>
<span class="rx-val">{{ rxRecipientText }}</span>
</div>
</div>
<div class="rx-info-row rx-info-row-full">
<div class="rx-info-cell">
<span class="rx-key">临床诊断</span>
<span class="rx-val">{{ prescriptionViewData.clinical_diagnosis || '—' }}</span>
</div>
</div>
</div>
<div class="rx-rp">
<div class="rx-watermark">{{ prescriptionTabType === 'internal' ? '药房联' : '处方联' }}</div>
<div class="rx-rp-head">
<div class="rx-rp-label">Rp.</div>
<div class="rx-rp-cols-head">
<div class="rx-rp-col-head">
<span>用药 (单剂)</span>
<span>{{ prescriptionTabType === 'user' ? '用量' : '总量' }}</span>
</div>
<div class="rx-rp-col-head">
<span>用药 (单剂)</span>
<span>{{ prescriptionTabType === 'user' ? '用量' : '总量' }}</span>
</div>
</div>
</div>
<div class="rx-herbs">
<template v-if="prescriptionTabType === 'internal'">
<template v-if="slipMainHerbs.length">
<div class="rx-herb-section-label">主方</div>
<div
v-for="(h, i) in slipMainHerbs"
:key="'main-' + i"
class="rx-herb-cell"
>
<span class="rx-herb-name">{{ h.name }} ({{ h.dosage }})</span>
<span class="rx-herb-total">{{ rxHerbTotal(h.dosage) }}</span>
</div>
</template>
<template v-if="slipAuxHerbs.length">
<div class="rx-herb-section-label rx-herb-section-label--aux">
辅方<span v-if="slipAuxLibraryName" class="rx-herb-library-name">{{ slipAuxLibraryName }}</span>
</div>
<div
v-for="(h, i) in slipAuxHerbs"
:key="'aux-' + i"
class="rx-herb-cell"
>
<span class="rx-herb-name">{{ h.name }} ({{ h.dosage }})</span>
<span class="rx-herb-total">{{ rxHerbTotal(h.dosage) }}</span>
</div>
</template>
</template>
<template v-else>
<template v-if="slipMainHerbs.length">
<div class="rx-herb-section-label">主方</div>
<div
v-for="(h, i) in slipMainHerbs"
:key="'user-main-' + i"
class="rx-herb-cell"
>
<span class="rx-herb-name">{{ h.name }}</span>
<span class="rx-herb-total">{{ h.dosage }}</span>
</div>
</template>
<template v-if="slipAuxHerbs.length">
<div class="rx-herb-section-label rx-herb-section-label--aux">辅方</div>
<div
v-for="(h, i) in slipAuxHerbs"
:key="'user-aux-' + i"
class="rx-herb-cell"
>
<span class="rx-herb-name">{{ h.name }}</span>
<span class="rx-herb-total">{{ h.dosage }}</span>
</div>
</template>
</template>
</div>
</div>
<div class="rx-text">
<template v-if="prescriptionTabType === 'internal'">
<p v-if="rxAuxUsageText">主服法{{ rxUsageText }}</p>
<p v-else>服法{{ rxUsageText }}</p>
<p v-if="rxAuxUsageText">辅服法{{ rxAuxUsageText }}</p>
</template>
<p v-if="rxAdviceText">医嘱{{ rxAdviceText }}</p>
<p v-if="slipDietaryText">忌口{{ slipDietaryText }}</p>
<p v-if="prescriptionTabType === 'internal' && rxRemarkText">备注{{ rxRemarkText }}</p>
<p v-if="rxPharmacyRemarkText" class="rx-text-warn">
药房备注{{ rxPharmacyRemarkText }}
</p>
<p
v-if="prescriptionTabType === 'internal' && rxOutPelletText && prescriptionViewData?.prescription_type !== '饮片'"
class="rx-text-warn"
>
出丸{{ rxOutPelletText }}
</p>
</div>
<div class="rx-bottom">
<div
class="rx-bot-row rx-bot-row-1"
:class="{ 'rx-bot-row-1--user': prescriptionTabType === 'user' }"
>
<div class="rx-bot-cell rx-bot-doctor">
<div class="rx-bot-label rx-bot-label--doctor">医师</div>
<div class="rx-bot-doctor-body">
<img
v-if="prescriptionViewData.doctor_signature"
:src="prescriptionViewData.doctor_signature"
alt="医师签名"
class="rx-bot-sign-img"
/>
<span
v-if="!prescriptionViewData.doctor_signature"
class="rx-bot-doctor-name"
>{{ prescriptionViewData.doctor_name || '—' }}</span>
</div>
</div>
<div v-if="prescriptionTabType === 'internal'" class="rx-bot-cell rx-bot-meta">
<span class="rx-bot-meta-key">类型:</span>
<span class="rx-bot-meta-val">{{ rxTypeText }}</span>
</div>
<div class="rx-bot-cell rx-bot-meta">
<span class="rx-bot-meta-key">天数:</span>
<span class="rx-bot-meta-val">
{{
detailData?.medication_days != null &&
String(detailData.medication_days).trim() !== ''
? detailData.medication_days + ' 天'
: '—'
}} </span>
</div>
<div v-if="prescriptionTabType === 'internal'" class="rx-bot-cell rx-bot-meta">
<span class="rx-bot-meta-key">剂量:</span>
<span class="rx-bot-meta-val">{{ rxPerDoseAmount }}</span>
</div>
</div>
</div>
<div class="rx-bot-row rx-hospital-row">
<div class="rx-hospital-line">成都双流甄养堂互联网医院有限公司 联系方式4001667339</div>
<div class="rx-hospital-line">地址四川省成都市双流区黄甲街道黄龙大道二段280号</div>
</div>
</div>
<!-- 审核痕迹不进入导出 --> <!-- 审核痕迹不进入导出 -->
<div <div
@@ -2281,6 +2081,7 @@ import {
getDoctors, getDoctors,
getAssistants getAssistants
} from '@/api/tcm' } from '@/api/tcm'
import PrescriptionSlip from '@/components/prescription-slip/index.vue'
import html2canvas from 'html2canvas' import html2canvas from 'html2canvas'
import { jsPDF } from 'jspdf' import { jsPDF } from 'jspdf'
import { getDictData } from '@/api/app' import { getDictData } from '@/api/app'
@@ -4665,8 +4466,7 @@ const prescriptionViewLoading = ref(false)
const prescriptionViewData = ref<any>(null) const prescriptionViewData = ref<any>(null)
/** 药房联辅方标题:处方库中该辅方模板的 prescription_name(导入或药材匹配解析) */ /** 药房联辅方标题:处方库中该辅方模板的 prescription_name(导入或药材匹配解析) */
const slipAuxLibraryName = ref('') const slipAuxLibraryName = ref('')
const prescriptionTabType = ref('internal') const rxSlipRef = ref<InstanceType<typeof PrescriptionSlip> | null>(null)
const prescriptionSlipPrintRef = ref<HTMLElement | null>(null)
const prescriptionSlipExporting = ref(false) const prescriptionSlipExporting = ref(false)
function buildSlipUsageSegmentText( function buildSlipUsageSegmentText(
@@ -5064,8 +4864,7 @@ async function openPrescriptionView(row: any) {
prescriptionViewLoading.value = true prescriptionViewLoading.value = true
prescriptionViewData.value = null prescriptionViewData.value = null
slipAuxLibraryName.value = '' slipAuxLibraryName.value = ''
prescriptionTabType.value = 'internal'
try { try {
const res: any = await prescriptionDetail({ id: row.prescription_id }) const res: any = await prescriptionDetail({ id: row.prescription_id })
const base = res?.data ?? res ?? null const base = res?.data ?? res ?? null
@@ -5135,7 +4934,7 @@ async function preloadSlipImagesToDataUrl(el: HTMLElement): Promise<void> {
async function capturePrescriptionSlipCanvas(): Promise<HTMLCanvasElement> { async function capturePrescriptionSlipCanvas(): Promise<HTMLCanvasElement> {
await nextTick() await nextTick()
const el = prescriptionSlipPrintRef.value const el = (rxSlipRef.value as { paperEl?: HTMLElement | null } | null)?.paperEl ?? null
if (!el) throw new Error('未找到处方笺内容') if (!el) throw new Error('未找到处方笺内容')
el.scrollIntoView({ behavior: 'instant', block: 'nearest' }) el.scrollIntoView({ behavior: 'instant', block: 'nearest' })
await preloadSlipImagesToDataUrl(el) await preloadSlipImagesToDataUrl(el)
@@ -2390,145 +2390,11 @@
<div v-if="prescriptionViewData.audit_remark" class="mt-1">驳回意见{{ prescriptionViewData.audit_remark }}</div> <div v-if="prescriptionViewData.audit_remark" class="mt-1">驳回意见{{ prescriptionViewData.audit_remark }}</div>
</div> </div>
<!-- A4 处方纸药房联 --> <PrescriptionSlip
<div v-if="prescriptionViewData" ref="prescriptionSlipPrintRef" class="rx-paper"> v-if="prescriptionViewData"
<div class="rx-title">{{ SLIP_TITLE }}</div> ref="rxSlipRef"
<div class="rx-notice"> :data="prescriptionViewData"
<span class="rx-notice-text"> />
服药前请核对姓名电话医生等信息以及服法医嘱等要点
</span>
<div class="rx-notice-meta">
<div class="rx-meta-item">
<span class="rx-meta-label">日期</span>
<span class="rx-meta-value">{{ rxDateText }}</span>
</div>
<div class="rx-meta-item">
<span class="rx-meta-label">处方编号</span>
<span class="rx-meta-value">{{ rxPrescriptionSnText }}</span>
</div>
<div class="rx-meta-item">
<span class="rx-meta-label">流转编号挂号</span>
<span class="rx-meta-value">{{ rxAppointmentFlowText }}</span>
</div>
<div v-if="rxBusinessOrderNoText" class="rx-meta-item">
<span class="rx-meta-label">业务单号</span>
<span class="rx-meta-value">{{ rxBusinessOrderNoText }}</span>
</div>
</div>
</div>
<div class="rx-info">
<div class="rx-info-row">
<div class="rx-info-cell">
<span class="rx-key">姓名</span>
<span class="rx-val">{{ prescriptionViewData.patient_name || '—' }}</span>
</div>
<div class="rx-info-cell">
<span class="rx-key">性别</span>
<span class="rx-val">{{ slipGenderLabel(prescriptionViewData.gender) }}</span>
</div>
<div class="rx-info-cell">
<span class="rx-key">年龄</span>
<span class="rx-val">{{ slipAgeText(prescriptionViewData.age) }}</span>
</div>
<div class="rx-info-cell">
<span class="rx-key">电话</span>
<span class="rx-val">{{ prescriptionViewData.phone || prescriptionViewData.recipient_phone || '—' }}</span>
</div>
</div>
<div class="rx-info-row rx-info-row-full">
<div class="rx-info-cell">
<span class="rx-key">收件信息</span>
<span class="rx-val">{{ rxRecipientText }}</span>
</div>
</div>
<div class="rx-info-row rx-info-row-full">
<div class="rx-info-cell">
<span class="rx-key">临床诊断</span>
<span class="rx-val">{{ prescriptionViewData.clinical_diagnosis || '—' }}</span>
</div>
</div>
</div>
<div class="rx-rp">
<div class="rx-watermark">药房联</div>
<div class="rx-rp-head">
<div class="rx-rp-label">Rp.</div>
<div class="rx-rp-cols-head">
<div class="rx-rp-col-head">
<span>用药 (单剂)</span>
<span>总量</span>
</div>
<div class="rx-rp-col-head">
<span>用药 (单剂)</span>
<span>总量</span>
</div>
</div>
</div>
<div class="rx-herbs">
<div v-for="(h, i) in slipHerbsList" :key="i" class="rx-herb-cell">
<span class="rx-herb-name">{{ h.name }} ({{ h.dosage }})</span>
<span class="rx-herb-total">{{ rxHerbTotal(h.dosage) }}</span>
</div>
</div>
</div>
<div class="rx-text">
<p>服法{{ rxUsageText }}</p>
<p v-if="rxAdviceText">医嘱{{ rxAdviceText }}</p>
<p v-if="slipDietaryText">忌口{{ slipDietaryText }}</p>
<p v-if="rxRemarkText">备注{{ rxRemarkText }}</p>
<p v-if="rxPharmacyRemarkText" class="rx-text-warn">
药房备注{{ rxPharmacyRemarkText }}
</p>
<p v-if="rxOutPelletText" class="rx-text-warn">
出丸{{ rxOutPelletText }}
</p>
</div>
<div class="rx-bottom">
<div class="rx-bot-row rx-bot-row-1">
<div class="rx-bot-cell rx-bot-doctor">
<div class="rx-bot-label rx-bot-label--doctor">医师</div>
<div class="rx-bot-doctor-body">
<img
v-if="prescriptionViewData.doctor_signature"
:src="prescriptionViewData.doctor_signature"
alt="医师签名"
class="rx-bot-sign-img"
/>
<span
v-if="!prescriptionViewData.doctor_signature"
class="rx-bot-doctor-name"
>{{ prescriptionViewData.doctor_name || '—' }}</span>
</div>
</div>
<div class="rx-bot-cell rx-bot-meta">
<span class="rx-bot-meta-key">类型:</span>
<span class="rx-bot-meta-val">{{ rxTypeText }}</span>
</div>
<div class="rx-bot-cell rx-bot-meta">
<span class="rx-bot-meta-key">天数:</span>
<span class="rx-bot-meta-val">
{{
detailData.medication_days != null &&
String(detailData.medication_days).trim() !== ''
? detailData.medication_days + ' 天'
: '—'
}} </span>
</div>
<div class="rx-bot-cell rx-bot-meta">
<span class="rx-bot-meta-key">剂量:</span>
<span class="rx-bot-meta-val">{{ rxPerDoseAmount }}</span>
</div>
</div>
</div>
<div class="rx-bot-row rx-hospital-row">
<div class="rx-hospital-line">成都双流甄养堂互联网医院有限公司 联系方式4001667339</div>
<div class="rx-hospital-line">地址四川省成都市双流区黄甲街道黄龙大道二段280号</div>
</div>
</div>
<!-- 审核痕迹不进入导出 --> <!-- 审核痕迹不进入导出 -->
<div <div
@@ -2750,6 +2616,7 @@ import {
supplyModeLabel, supplyModeLabel,
supplyModeTagType supplyModeTagType
} from './components/prescription-order-utils' } from './components/prescription-order-utils'
import PrescriptionSlip from '@/components/prescription-slip/index.vue'
import html2canvas from 'html2canvas' import html2canvas from 'html2canvas'
import { jsPDF } from 'jspdf' import { jsPDF } from 'jspdf'
import { getDictData } from '@/api/app' import { getDictData } from '@/api/app'
@@ -5429,7 +5296,7 @@ const SLIP_ADDRESS_LINE = '地址:四川省成都市双流区黄甲街道黄
const prescriptionViewVisible = ref(false) const prescriptionViewVisible = ref(false)
const prescriptionViewLoading = ref(false) const prescriptionViewLoading = ref(false)
const prescriptionViewData = ref<any>(null) const prescriptionViewData = ref<any>(null)
const prescriptionSlipPrintRef = ref<HTMLElement | null>(null) const rxSlipRef = ref<InstanceType<typeof PrescriptionSlip> | null>(null)
const prescriptionSlipExporting = ref(false) const prescriptionSlipExporting = ref(false)
// //
@@ -5763,7 +5630,7 @@ async function preloadSlipImagesToDataUrl(el: HTMLElement): Promise<void> {
async function capturePrescriptionSlipCanvas(): Promise<HTMLCanvasElement> { async function capturePrescriptionSlipCanvas(): Promise<HTMLCanvasElement> {
await nextTick() await nextTick()
const el = prescriptionSlipPrintRef.value const el = (rxSlipRef.value as { paperEl?: HTMLElement | null } | null)?.paperEl ?? null
if (!el) throw new Error('未找到处方笺内容') if (!el) throw new Error('未找到处方笺内容')
el.scrollIntoView({ behavior: 'instant', block: 'nearest' }) el.scrollIntoView({ behavior: 'instant', block: 'nearest' })
await preloadSlipImagesToDataUrl(el) await preloadSlipImagesToDataUrl(el)
@@ -16,9 +16,20 @@ from datetime import date, datetime
from pathlib import Path from pathlib import Path
from typing import Any from typing import Any
from PySide6.QtCore import QBuffer, QByteArray, QDate, QIODevice, QPoint, Qt, QTimer, Signal from PySide6.QtCore import (
QBuffer,
QByteArray,
QDate,
QIODevice,
QPoint,
QRectF,
Qt,
QTimer,
Signal,
)
from PySide6.QtGui import ( from PySide6.QtGui import (
QColor, QColor,
QFont,
QImage, QImage,
QMouseEvent, QMouseEvent,
QPageSize, QPageSize,
@@ -2437,7 +2448,14 @@ def _status_text(value: Any) -> str:
def render_case_record_html(prescription: Any) -> str: def render_case_record_html(prescription: Any) -> str:
"""Render the immutable diagnosis snapshot stored with a prescription.""" """Render the immutable diagnosis snapshot as the admin A3 case sheet.
``QTextDocument`` only implements a deliberately small HTML/CSS subset. In
particular, CSS grid and ``display: table-row`` silently degrade into a
vertical text stream. The admin preview uses a three-column grid, so this
version expresses that layout with real HTML tables which Qt renders
consistently on screen, printers and PDF devices.
"""
source = _mapping(prescription) source = _mapping(prescription)
snapshot = _mapping(source.get("case_record")) snapshot = _mapping(source.get("case_record"))
@@ -2452,11 +2470,35 @@ def render_case_record_html(prescription: Any) -> str:
value = json.dumps(value, ensure_ascii=False, default=str) value = json.dumps(value, ensure_ascii=False, default=str)
return html.escape(display_text(value, default)) return html.escape(display_text(value, default))
def value(*keys: str, default: Any = None) -> Any:
for key in keys:
translated = case.get(f"{key}_text")
if translated not in (None, ""):
return translated
candidate = case.get(key)
if candidate not in (None, ""):
return candidate
return default
def present_date(raw: Any) -> Any:
return None if raw in (None, "", 0, "0", "0000-00-00") else raw
gender = case.get("gender", source.get("gender")) gender = case.get("gender", source.get("gender"))
gender_label = "" if gender in (1, "1") else "" if gender in (0, "0", 2, "2") else "" gender_label = (
marital = {0: "未婚", 1: "已婚", 2: "离异"}.get(_int(case.get("marital_status"), -1), "") case.get("gender_text")
or case.get("gender_desc")
or ("" if gender in (1, "1") else "" if gender in (0, "0", 2, "2") else "")
)
marital = case.get("marital_status_text") or {0: "未婚", 1: "已婚", 2: "离异"}.get(
_int(case.get("marital_status"), -1), ""
)
age = case.get("age") or source.get("age")
age_text = f"{age}" if age not in (None, "") and not str(age).endswith("") else age
diabetes_history = value("diabetes_discovery_year")
if diabetes_history not in (None, "") and str(diabetes_history).strip().isdigit():
diabetes_history = f"{str(diabetes_history).strip()}"
blood_pressure = "" blood_pressure = ""
if case.get("systolic_pressure") not in (None, "") or case.get("diastolic_pressure") not in ( if case.get("systolic_pressure") not in (None, "") and case.get("diastolic_pressure") not in (
None, None,
"", "",
): ):
@@ -2465,102 +2507,173 @@ def render_case_record_html(prescription: Any) -> str:
f"{display_text(case.get('diastolic_pressure'))} mmHg" f"{display_text(case.get('diastolic_pressure'))} mmHg"
) )
def section(title: str, fields: Sequence[tuple[str, Any]]) -> str: diagnosis_type = value("diagnosis_type_desc", "diagnosis_type")
rows = "".join( diagnosis_type = _DIAGNOSIS_TYPE_LABELS.get(str(diagnosis_type or "").strip(), diagnosis_type)
f'<div class="item"><span class="label">{html.escape(label)}</span>'
f'<span class="value">{esc(value)}</span></div>' def field_cell(label: str, field_value: Any, *, colspan: int = 1) -> str:
for label, value in fields return (
f'<td class="cr-item" colspan="{colspan}">'
'<table class="cr-kv" width="100%" cellspacing="0" cellpadding="0"><tr>'
f'<td class="cr-label">{html.escape(label)}</td>'
f'<td class="cr-value">{esc(field_value)}</td>'
"</tr></table></td>"
)
def section(
title: str,
fields: Sequence[tuple[str, Any, bool]],
) -> str:
rows: list[str] = []
pending: list[str] = []
for label, field_value, full_width in fields:
if full_width:
if pending:
pending.extend('<td class="cr-item empty"></td>' for _ in range(3 - len(pending)))
rows.append(f'<tr>{"".join(pending)}</tr>')
pending = []
rows.append(f'<tr>{field_cell(label, field_value, colspan=3)}</tr>')
continue
pending.append(field_cell(label, field_value))
if len(pending) == 3:
rows.append(f'<tr>{"".join(pending)}</tr>')
pending = []
if pending:
pending.extend('<td class="cr-item empty"></td>' for _ in range(3 - len(pending)))
rows.append(f'<tr>{"".join(pending)}</tr>')
return (
'<table class="cr-section" width="100%" cellspacing="0" cellpadding="0">'
f'<tr><td class="cr-section-title">{html.escape(title)}</td></tr>'
'<tr><td><table class="cr-grid" width="100%" cellspacing="0" cellpadding="0">'
f'{"".join(rows)}</table></td></tr>'
'<tr><td class="cr-rule"></td></tr></table>'
) )
return f'<section><h2>{html.escape(title)}</h2><div class="grid">{rows}</div></section>'
sections = [ sections = [
section( section(
"基本信息", "基本信息",
( (
("诊单ID", case.get("id") or case.get("diagnosis_id") or source.get("diagnosis_id")), (
("姓名", case.get("patient_name") or source.get("patient_name")), "诊单ID",
("身份证号", case.get("id_card")), case.get("id") or case.get("diagnosis_id") or source.get("diagnosis_id"),
("手机号", case.get("phone") or source.get("phone")), False,
("性别", gender_label), ),
("年龄", case.get("age") or source.get("age")), ("姓名", case.get("patient_name") or source.get("patient_name"), False),
("婚姻状态", marital), ("身份证号", case.get("id_card"), False),
("身高", f"{case.get('height')} cm" if case.get("height") not in (None, "") else None), ("手机号", case.get("phone") or source.get("phone"), False),
("体重", f"{case.get('weight')} kg" if case.get("weight") not in (None, "") else None), ("性别", gender_label, False),
("地区", case.get("region")), ("年龄", age_text, False),
("婚姻状态", marital, False),
(
"身高",
f"{case.get('height')} cm" if case.get("height") not in (None, "") else None,
False,
),
(
"体重",
f"{case.get('weight')} kg" if case.get("weight") not in (None, "") else None,
False,
),
("地区", case.get("region"), False),
), ),
), ),
section( section(
"生命体征", "生命体征",
( (
("血压", blood_pressure), ("血压", blood_pressure, False),
( (
"空腹血糖", "空腹血糖",
f"{case.get('fasting_blood_sugar')} mmol/L" f"{case.get('fasting_blood_sugar')} mmol/L"
if case.get("fasting_blood_sugar") not in (None, "") if case.get("fasting_blood_sugar") not in (None, "")
else None, else None,
False,
), ),
), ),
), ),
section( section(
"主诉与诊断", "主诉",
( (
("诊断日期", case.get("diagnosis_date")), ("诊断日期", present_date(value("diagnosis_date")), False),
("诊断类型", case.get("diagnosis_type_desc") or case.get("diagnosis_type")), ("诊断类型", diagnosis_type, False),
("证型", case.get("syndrome_type_desc") or case.get("syndrome_type")), ("证型", value("syndrome_type_desc", "syndrome_type"), False),
("糖尿病期数", case.get("diabetes_type_desc") or case.get("diabetes_type")), ("糖尿病期数", value("diabetes_type_desc", "diabetes_type"), False),
("糖尿病病史", case.get("diabetes_discovery_year")), ("发现糖尿病病史", diabetes_history, False),
("当地医院诊断", case.get("local_hospital_diagnosis")), ("当地医院诊断", value("local_hospital_diagnosis"), True),
("当地就诊医院", case.get("local_hospital_name")), ("当地就诊医院", value("local_hospital_name"), True),
("症状补充", case.get("symptoms") or case.get("clinical_diagnosis")),
), ),
), ),
section( section(
"现病史", "现病史",
( (
("口腔感觉", case.get("appetite")), ("口腔感觉", value("appetite"), True),
("每日饮水量", case.get("water_intake")), ("每日饮水量", value("water_intake"), True),
("体重变化", case.get("weight_change")), ("体重变化", value("weight_change"), True),
("脂肪肝程度", case.get("fatty_liver_degree")), ("脂肪肝程度", value("fatty_liver_degree"), True),
("饮食情况", case.get("diet_condition")), ("饮食情况", value("diet_condition"), True),
("肢体感觉", case.get("body_feeling")), ("肢体感觉", value("body_feeling"), True),
("睡眠情况", case.get("sleep_condition")), ("睡眠情况", value("sleep_condition"), True),
("眼睛情况", case.get("eye_condition")), ("眼睛情况", value("eye_condition"), True),
("头部感觉", case.get("head_feeling")), ("头部感觉", value("head_feeling"), True),
("出汗情况", case.get("sweat_condition")), ("出汗情况", value("sweat_condition"), True),
("皮肤情况", case.get("skin_condition")), ("皮肤情况", value("skin_condition"), True),
("小便情况", case.get("urine_condition")), ("小便情况", value("urine_condition"), True),
("大便情况", case.get("stool_condition")), ("大便情况", value("stool_condition"), True),
("腰肾情况", case.get("kidney_condition")), ("腰肾情况", value("kidney_condition"), True),
("其他补充", case.get("symptoms") or case.get("clinical_diagnosis"), True),
), ),
), ),
section( section(
"病史与中医诊断", "既往史",
( (
("既往史", case.get("past_history")), ("", value("past_history"), True),
("外伤史", "" if _bool(case.get("trauma_history")) else ""), ),
("手术史", "" if _bool(case.get("surgery_history")) else ""), ),
("过敏史", "" if _bool(case.get("allergy_history")) else ""), section(
("家族病史", "" if _bool(case.get("family_history")) else ""), "其他病史",
("妊娠哺乳史", "" if _bool(case.get("pregnancy_history")) else ""), (
("舌象", case.get("tongue_coating") or case.get("tongue")), ("外伤史", "" if _bool(case.get("trauma_history")) else "", False),
("脉象", case.get("pulse")), ("手术史", "" if _bool(case.get("surgery_history")) else "", False),
("治则", case.get("treatment_principle")), ("过敏史", "" if _bool(case.get("allergy_history")) else "", False),
("医嘱", case.get("doctor_advice")), ("家族病史", "" if _bool(case.get("family_history")) else "", False),
(
"妊娠哺乳史",
"" if _bool(case.get("pregnancy_history")) else "",
False,
),
),
),
section(
"诊断信息",
(
("舌象", case.get("tongue_coating") or case.get("tongue"), True),
("脉象", case.get("pulse"), True),
("治则", case.get("treatment_principle"), True),
("医嘱", case.get("doctor_advice"), True),
), ),
), ),
] ]
return f""" return f"""
<!doctype html><html><head><meta charset="utf-8"><style> <!doctype html><html><head><meta charset="utf-8"><style>
body {{ font-family:"Microsoft YaHei","PingFang SC",sans-serif; color:#17231d; margin:18px; }} body {{ margin:0; padding:12px; background:#eef1f5; color:#303133;
h1 {{ text-align:center; font-size:22px; margin:0 0 18px; }} font-family:"Microsoft YaHei","PingFang SC","Segoe UI",sans-serif;
section {{ margin:0 0 16px; border:1px solid #bdc7c2; }} font-size:13px; }}
h2 {{ font-size:15px; margin:0; padding:8px 10px; background:#edf2ef; }} .paper {{ width:100%; margin:0 auto; background:#ffffff; border:1px solid #dcdfe6; }}
.grid {{ display:table; width:100%; }} .paper-content {{ padding:26px 30px 34px; vertical-align:top; }}
.item {{ display:table-row; }} h1 {{ text-align:center; font-size:20px; font-weight:600; margin:0;
.label,.value {{ display:table-cell; padding:7px 10px; border-top:1px solid #d7dfdb; }} padding:0 0 14px; border-bottom:2px solid #303133; }}
.label {{ width:120px; color:#65736c; font-weight:600; }} .cr-section {{ margin-top:14px; border-collapse:collapse; }}
.value {{ line-height:1.6; }} .cr-section-title {{ padding:0 0 8px; color:#303133; font-size:15px; font-weight:600; }}
</style></head><body><h1>详细病历</h1>{''.join(sections)}</body></html> .cr-grid {{ table-layout:fixed; border-collapse:collapse; }}
.cr-item {{ width:33.33%; padding:4px 10px 5px 0; vertical-align:top; }}
.cr-item.empty {{ padding:0; }}
.cr-kv {{ border-collapse:collapse; table-layout:fixed; }}
.cr-label {{ width:88px; padding:0 7px 0 0; color:#909399; white-space:nowrap;
vertical-align:top; line-height:1.65; }}
.cr-value {{ padding:0; color:#303133; vertical-align:top; line-height:1.65; }}
.cr-rule {{ height:1px; border-bottom:1px solid #eeeeee; }}
</style></head><body>
<table class="paper" width="100%" cellspacing="0" cellpadding="0"><tr>
<td class="paper-content"><h1>甄养堂 详细病历</h1>{''.join(sections)}</td>
</tr></table></body></html>
""" """
@@ -2568,18 +2681,20 @@ def render_prescription_html(prescription: Any, *, print_layout: bool = False) -
"""Build the pharmacy-copy A4 slip used by preview, print and PDF export.""" """Build the pharmacy-copy A4 slip used by preview, print and PDF export."""
source = _mapping(prescription) source = _mapping(prescription)
paper_width = "100%" if print_layout else "820px" # consumer/prescription/index.vue uses a strict 210 x 297 mm sheet. At
paper_dimensions = 'width="100%"' if print_layout else 'width="820" height="1050"' # Qt's 96 logical DPI this is 794 x 1123 px; keeping the HTML width fixed
body_padding = "0" if print_layout else "10px" # prevents QTextDocument from stretching the medicine columns with the
body_background = "#ffffff" if print_layout else "#eef1f5" # containing dialog.
paper_width = "100%" if print_layout else "794px"
paper_dimensions = 'width="100%"' if print_layout else 'width="794" height="1123"'
body_padding = "0" if print_layout else "12px"
body_background = "#ffffff" if print_layout else "#f5f6f8"
paper_border = "0" if print_layout else "1px solid #d6d6d6" paper_border = "0" if print_layout else "1px solid #d6d6d6"
base_font_size = "10px" if print_layout else "13px" base_font_size = "10px" if print_layout else "13px"
notice_font_size = "8.5px" if print_layout else "11px" notice_font_size = "8.5px" if print_layout else "12px"
rp_font_size = "12px" if print_layout else "16px" rp_font_size = "12px" if print_layout else "16px"
section_font_size = "9px" if print_layout else "12px" section_font_size = "9px" if print_layout else "12px"
watermark_height = "58px" if print_layout else "76px" bottom_height = "44px" if print_layout else "70px"
watermark_font_size = "41px" if print_layout else "54px"
bottom_height = "44px" if print_layout else "58px"
herbs = _herb_rows(prescription) herbs = _herb_rows(prescription)
dose_count = max(1, _int(source.get("dose_count"), 1)) dose_count = max(1, _int(source.get("dose_count"), 1))
main = [row for row in herbs if _formula(row.get("formula_type")) == "主方"] main = [row for row in herbs if _formula(row.get("formula_type")) == "主方"]
@@ -2662,13 +2777,15 @@ def render_prescription_html(prescription: Any, *, print_layout: bool = False) -
if not rows: if not rows:
return "" return ""
output = [ output = [
f'<tr><td class="rp-indent"></td><td class="section {kind}" colspan="4">' f'<tr><td class="rp-indent"></td><td class="section {kind}" colspan="5">'
f"{html.escape(title)}</td></tr>" f"{html.escape(title)}</td></tr>"
] ]
for index in range(0, len(rows), 2): for index in range(0, len(rows), 2):
pair = rows[index : index + 2] pair = rows[index : index + 2]
cells: list[str] = [] cells: list[str] = []
for row in pair: for pair_index, row in enumerate(pair):
if pair_index == 1:
cells.append('<td class="rp-gap"></td>')
dosage = number_text(row.get("dosage")) dosage = number_text(row.get("dosage"))
total = number_text(_float(row.get("dosage")) * dose_count) total = number_text(_float(row.get("dosage")) * dose_count)
cells.extend( cells.extend(
@@ -2678,7 +2795,13 @@ def render_prescription_html(prescription: Any, *, print_layout: bool = False) -
) )
) )
if len(pair) == 1: if len(pair) == 1:
cells.extend(('<td class="herb-name">&nbsp;</td>', '<td class="herb-total"></td>')) cells.extend(
(
'<td class="rp-gap"></td>',
'<td class="herb-name">&nbsp;</td>',
'<td class="herb-total"></td>',
)
)
output.append(f'<tr><td class="rp-indent"></td>{"".join(cells)}</tr>') output.append(f'<tr><td class="rp-indent"></td>{"".join(cells)}</tr>')
return "".join(output) return "".join(output)
@@ -2740,7 +2863,6 @@ def render_prescription_html(prescription: Any, *, print_layout: bool = False) -
pharmacy_remark = ( pharmacy_remark = (
source.get("pharmacy_remark") source.get("pharmacy_remark")
or source.get("pharmacy_note") or source.get("pharmacy_note")
or source.get("remark_extra")
) )
explicit_out = ( explicit_out = (
@@ -2783,7 +2905,7 @@ def render_prescription_html(prescription: Any, *, print_layout: bool = False) -
herb_html = herb_group(main, "主方", "main") + herb_group(aux, "辅方", "aux") herb_html = herb_group(main, "主方", "main") + herb_group(aux, "辅方", "aux")
if not herb_html: if not herb_html:
herb_html = ( herb_html = (
'<tr><td class="rp-indent"></td><td class="empty-herbs" colspan="4">' '<tr><td class="rp-indent"></td><td class="empty-herbs" colspan="5">'
"暂无药材明细</td></tr>" "暂无药材明细</td></tr>"
) )
text_rows = [f"<p>主方服法:{esc(main_usage_text)}</p>"] text_rows = [f"<p>主方服法:{esc(main_usage_text)}</p>"]
@@ -2815,55 +2937,58 @@ def render_prescription_html(prescription: Any, *, print_layout: bool = False) -
return f""" return f"""
<!doctype html> <!doctype html>
<html><head><meta charset="utf-8"><style> <html><head><meta charset="utf-8"><style>
body {{ margin:0; padding:{body_padding}; background:{body_background}; color:#151515; body {{ margin:0; padding:{body_padding}; background:{body_background}; color:#1f1f1f;
font-family:"Microsoft YaHei","PingFang SC","Segoe UI",sans-serif; font-family:"Microsoft YaHei","PingFang SC",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;
font-size:{base_font_size}; }} font-size:{base_font_size}; line-height:1.5; }}
.paper {{ width:{paper_width}; margin:0 auto; background:#ffffff; .paper {{ width:{paper_width}; margin:0 auto; background:#ffffff;
border:{paper_border}; border-collapse:separate; border-spacing:0; }} border:{paper_border}; border-collapse:separate; border-spacing:0;
box-shadow:{"none" if print_layout else "0 0 0 1px #d6d6d6"}; }}
.paper-content {{ padding:8mm 10mm; vertical-align:top; }} .paper-content {{ padding:8mm 10mm; vertical-align:top; }}
.notice {{ width:100%; border:1px solid #e5e7eb; border-collapse:collapse; .notice {{ width:100%; border:1px solid #e5e7eb; border-collapse:collapse;
table-layout:fixed; background:#f3f4f6; margin:0 0 6px; table-layout:fixed; background:#f3f4f6; margin:0 0 6px;
font-size:{notice_font_size}; }} font-size:{notice_font_size}; color:#1f1f1f; }}
.notice td {{ border:0; padding:6px 10px; }} .notice td {{ border:0; padding:6px 10px; }}
.notice-text {{ width:49%; }} .notice-text {{ width:49%; }}
.notice-meta {{ width:51%; text-align:right; }} .notice-meta {{ width:51%; text-align:right; white-space:nowrap; }}
.info {{ width:100%; border-collapse:collapse; table-layout:fixed; }} .info {{ width:100%; border-collapse:collapse; table-layout:fixed; }}
.info td {{ border:1px solid #c8c8c8; padding:6px 10px; vertical-align:middle; }} .info td {{ border:1px solid #c8c8c8; padding:6px 10px; vertical-align:middle; font-size:13px; }}
.info .full {{ border-top:0; }} .info .full {{ border-top:0; }}
.key {{ white-space:nowrap; }} .key {{ white-space:nowrap; color:#1f1f1f; }}
.rp {{ width:100%; border-collapse:collapse; table-layout:fixed; .rp-frame {{ width:100%; border-collapse:collapse; table-layout:fixed;
border-left:1px solid #c8c8c8; border-right:1px solid #c8c8c8; }} border-left:1px solid #c8c8c8; border-right:1px solid #c8c8c8; }}
.rp td {{ border:0; padding:3px 6px; vertical-align:middle; }} .rp-padding {{ padding:8px 10px 16px; }}
.rp .rp-head td {{ border-bottom:1px solid #d4d4d4; padding-top:9px; padding-bottom:5px; }} .rp {{ width:100%; border-collapse:collapse; table-layout:fixed; }}
.rp-indent {{ width:34px; }} .rp td {{ border:0; padding:3px 0; vertical-align:middle; }}
.rp-mark {{ width:34px; font-size:{rp_font_size}; font-weight:700; }} .rp .rp-head td {{ border-bottom:1px solid #d4d4d4; padding-top:4px; padding-bottom:4px; }}
.rp-indent {{ width:44px; }}
.rp-mark {{ width:44px; padding-right:8px !important;
font-size:{rp_font_size}; font-weight:700; color:#1f1f1f; }}
.drug-head {{ color:#1f1f1f; }} .drug-head {{ color:#1f1f1f; }}
.total-head, .herb-total {{ width:62px; text-align:right; white-space:nowrap; }} .total-head, .herb-total {{ width:64px; text-align:right; white-space:nowrap;
font-variant-numeric:tabular-nums; }}
.rp-gap {{ width:24px; padding:0 !important; }}
.section {{ padding-top:7px !important; padding-bottom:1px !important; .section {{ padding-top:7px !important; padding-bottom:1px !important;
font-size:{section_font_size}; font-weight:600; }} font-size:{section_font_size}; font-weight:600; }}
.section.main {{ color:#409eff; }} .section.main {{ color:#409eff; }}
.section.aux {{ color:#e6a23c; }} .section.aux {{ color:#e6a23c; }}
.herb-name {{ line-height:1.65; white-space:nowrap; }} .herb-name {{ line-height:1.85; white-space:nowrap; color:#1f1f1f; }}
.empty-herbs {{ color:#8a8f98; padding:18px 6px !important; text-align:center; }} .empty-herbs {{ color:#8a8f98; padding:18px 6px !important; text-align:center; }}
.watermark {{ height:{watermark_height}; color:#eeeeee; text-align:center; .rx-text {{ border:1px solid #c8c8c8; border-top:0; padding:10px 12px; line-height:1.85; font-size:13px; }}
font-size:{watermark_font_size}; .rx-text p {{ margin:0; padding:0; }}
font-weight:700; letter-spacing:18px; vertical-align:middle !important; }}
.rx-text {{ border:1px solid #c8c8c8; border-top:0; padding:9px 12px; line-height:1.65; }}
.rx-text p {{ margin:1px 0; padding:0; }}
.warning {{ color:#d72424; font-weight:600; }} .warning {{ color:#d72424; font-weight:600; }}
.bottom {{ width:100%; border-collapse:collapse; table-layout:fixed; }} .bottom {{ width:100%; border-collapse:collapse; table-layout:fixed; }}
.bottom td {{ border:1px solid #c8c8c8; border-top:0; padding:7px 10px; .bottom td {{ border:1px solid #c8c8c8; border-top:0; padding:6px 10px;
height:{bottom_height}; vertical-align:middle; }} height:{bottom_height}; vertical-align:middle; font-size:12px; color:#1f1f1f; }}
.bottom .doctor {{ width:22%; vertical-align:top; }} .bottom .doctor {{ width:28%; vertical-align:top; }}
.doctor-title {{ display:block; margin-bottom:4px; }} .doctor-title {{ display:block; margin-bottom:4px; font-size:13px; }}
.doctor-name {{ display:block; margin-top:8px; }} .doctor-name {{ display:block; margin-top:8px; font-size:13px; }}
.signature {{ max-width:130px; max-height:42px; vertical-align:middle; }} .signature {{ max-width:110px; max-height:40px; vertical-align:middle; object-fit:contain; }}
.meta-key {{ white-space:nowrap; }} .meta-key {{ white-space:nowrap; margin-right:6px; }}
.audit {{ width:{paper_width}; margin:8px auto 0; padding:8px 4px; color:#7b8492; .audit {{ width:{paper_width}; margin:12px auto 0; padding:8px 12px; color:#6b7280;
border-top:1px dashed #cfd5dd; font-size:12px; line-height:1.7; }} border:1px dashed #d4d4d4; background:#fafafa; border-radius:4px;
font-size:12px; line-height:1.6; }}
</style></head><body> </style></head><body>
<table class="paper" {paper_dimensions}><tr><td class="paper-content" valign="top"> <table align="center" class="paper" {paper_dimensions}><tr><td class="paper-content" valign="top">
<table width="100%"><tr><td height="14"></td></tr></table>
<table class="notice" width="100%"><tr> <table class="notice" width="100%"><tr>
<td class="notice-text">服药前请核对姓名、电话、医生等信息以及服法、医嘱等要点</td> <td class="notice-text">服药前请核对姓名、电话、医生等信息以及服法、医嘱等要点</td>
<td class="notice-meta">日期:{esc(date_text())}  编号:{esc(serial)}</td> <td class="notice-meta">日期:{esc(date_text())}  编号:{esc(serial)}</td>
@@ -2876,13 +3001,15 @@ body {{ margin:0; padding:{body_padding}; background:{body_background}; color:#1
<tr><td class="full" colspan="4"><span class="key">收件信息</span> {esc(recipient_text)}</td></tr> <tr><td class="full" colspan="4"><span class="key">收件信息</span> {esc(recipient_text)}</td></tr>
<tr><td class="full" colspan="4"><span class="key">临床诊断</span> {esc(source.get("clinical_diagnosis"))}</td></tr> <tr><td class="full" colspan="4"><span class="key">临床诊断</span> {esc(source.get("clinical_diagnosis"))}</td></tr>
</table> </table>
<table class="rp-frame" title="药房联" width="100%"><tr><td class="rp-padding">
<table class="rp" width="100%"> <table class="rp" width="100%">
<col width="34"/><col/><col width="62"/><col/><col width="62"/> <col width="44"/><col/><col width="64"/><col width="24"/><col/><col width="64"/>
<tr class="rp-head"><td class="rp-mark">Rp.</td><td class="drug-head">用药 (单剂)</td> <tr class="rp-head"><td class="rp-mark">Rp.</td><td class="drug-head">用药 (单剂)</td>
<td class="total-head">总量</td><td class="drug-head">用药 (单剂)</td><td class="total-head">总量</td></tr> <td class="total-head">总量</td><td class="rp-gap"></td>
<td class="drug-head">用药 (单剂)</td><td class="total-head">总量</td></tr>
{herb_html} {herb_html}
<tr><td class="rp-indent"></td><td class="watermark" colspan="4">药房联</td></tr>
</table> </table>
</td></tr></table>
<div class="rx-text">{"".join(text_rows)}</div> <div class="rx-text">{"".join(text_rows)}</div>
<table class="bottom" width="100%"><tr> <table class="bottom" width="100%"><tr>
<td class="doctor"><span class="doctor-title">医师</span>{signature_html}</td> <td class="doctor"><span class="doctor-title">医师</span>{signature_html}</td>
@@ -2896,6 +3023,57 @@ body {{ margin:0; padding:{body_padding}; background:{body_background}; color:#1
""" """
class _PrescriptionPaperPreview(QTextBrowser):
"""A4 prescription preview with the consumer page's floating watermark.
Qt rich text cannot paint CSS absolute-positioned or transformed elements,
so placing the watermark in the HTML makes it consume a table row and
deforms the paper. Paint it over the viewport at the corresponding
document position instead.
"""
_PAPER_WIDTH = 794
def __init__(self, prescription: Any, parent: QWidget | None = None) -> None:
super().__init__(parent)
herbs = _herb_rows(prescription)
main_count = sum(
1 for row in herbs if _formula(row.get("formula_type")) == "主方"
)
aux_count = len(herbs) - main_count
medicine_rows = (main_count + 1) // 2 + (aux_count + 1) // 2
section_count = int(main_count > 0) + int(aux_count > 0)
rp_height = 65 + medicine_rows * 30 + section_count * 22
self._watermark_document_y = 150 + rp_height // 2
def paintEvent(self, event: Any) -> None: # noqa: N802 - Qt override
super().paintEvent(event)
viewport = self.viewport()
center_y = self._watermark_document_y - self.verticalScrollBar().value()
if center_y < -90 or center_y > viewport.height() + 90:
return
paper_width = min(self._PAPER_WIDTH, viewport.width())
paper_left = max(0.0, (viewport.width() - paper_width) / 2)
painter = QPainter(viewport)
painter.setRenderHint(QPainter.RenderHint.Antialiasing)
painter.translate(paper_left + paper_width / 2, center_y)
painter.rotate(-22)
painter.setPen(QColor(31, 31, 31, 15))
font = QFont(
"Microsoft YaHei UI",
-1,
QFont.Weight.Bold,
)
font.setPixelSize(84)
painter.setFont(font)
painter.drawText(
QRectF(-230, -70, 460, 140),
Qt.AlignmentFlag.AlignCenter,
"药房联",
)
painter.end()
class PrescriptionDetailDialog(QDialog): class PrescriptionDetailDialog(QDialog):
diagnosis_requested = Signal(int) diagnosis_requested = Signal(int)
orders_requested = Signal(int) orders_requested = Signal(int)
@@ -2937,12 +3115,12 @@ class PrescriptionDetailDialog(QDialog):
pdf_button.clicked.connect(self.choose_pdf_path) pdf_button.clicked.connect(self.choose_pdf_path)
actions.addWidget(pdf_button) actions.addWidget(pdf_button)
root.addLayout(actions) root.addLayout(actions)
self.preview = QTextBrowser() self.preview = _PrescriptionPaperPreview(prescription)
self.preview.setObjectName("PrescriptionPaperPreview") self.preview.setObjectName("PrescriptionPaperPreview")
self.preview.setOpenExternalLinks(False) self.preview.setOpenExternalLinks(False)
self.preview.setStyleSheet( self.preview.setStyleSheet(
"QTextBrowser#PrescriptionPaperPreview {" "QTextBrowser#PrescriptionPaperPreview {"
"background-color:#EEF1F5; border:1px solid #D8DEE8; padding:0;}" "background-color:#F5F6F8; border:1px solid #D8DEE8; padding:0;}"
) )
self.preview.setDocument(self.document) self.preview.setDocument(self.document)
self.tabs = QTabWidget() self.tabs = QTabWidget()
@@ -2952,8 +3130,15 @@ class PrescriptionDetailDialog(QDialog):
self.case_preview: QTextBrowser | None = None self.case_preview: QTextBrowser | None = None
if case_record: if case_record:
self.case_document = QTextDocument(self) self.case_document = QTextDocument(self)
self.case_document.setDocumentMargin(0)
self.case_document.setHtml(render_case_record_html(prescription)) self.case_document.setHtml(render_case_record_html(prescription))
self.case_preview = QTextBrowser() self.case_preview = QTextBrowser()
self.case_preview.setObjectName("CaseRecordPaperPreview")
self.case_preview.setOpenExternalLinks(False)
self.case_preview.setStyleSheet(
"QTextBrowser#CaseRecordPaperPreview {"
"background-color:#EEF1F5; border:1px solid #D8DEE8; padding:0;}"
)
self.case_preview.setDocument(self.case_document) self.case_preview.setDocument(self.case_document)
case_index = self.tabs.addTab(self.case_preview, "详细病历") case_index = self.tabs.addTab(self.case_preview, "详细病历")
if initial_tab == "case": if initial_tab == "case":
+225 -26
View File
@@ -8,8 +8,8 @@ from datetime import date, timedelta
from pathlib import Path from pathlib import Path
from typing import Any from typing import Any
from PySide6.QtCore import Qt, QTimer, QUrl, Signal from PySide6.QtCore import QSize, Qt, QTimer, QUrl, Signal
from PySide6.QtGui import QDesktopServices, QPixmap, QTextCursor from PySide6.QtGui import QDesktopServices, QIcon, QPixmap, QTextCursor
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
QDialog, QDialog,
QFileDialog, QFileDialog,
@@ -139,6 +139,73 @@ def _is_local_material_reference(value: str) -> bool:
) )
class _NoteAttachmentPreview(QPushButton):
"""Responsive inline thumbnail that remains clickable for a full preview."""
_THUMBNAIL_HEIGHT = 132
def __init__(self, caption: str, parent: QWidget | None = None) -> None:
super().__init__("正在加载图片…", parent)
self._source_pixmap = QPixmap()
self.setObjectName("NoteAttachmentPreview")
self.setProperty("variant", "secondary")
self.setProperty("loadState", "loading")
self.setAccessibleName(f"查看{caption}大图")
self.setCursor(Qt.CursorShape.PointingHandCursor)
self.setMinimumWidth(168)
self.setFixedHeight(self._THUMBNAIL_HEIGHT)
self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)
def _refresh_preview(self) -> None:
if self._source_pixmap.isNull():
return
available = QSize(max(120, self.width() - 12), self._THUMBNAIL_HEIGHT - 12)
rendered = self._source_pixmap.scaled(
available,
Qt.AspectRatioMode.KeepAspectRatio,
Qt.TransformationMode.SmoothTransformation,
)
self.setIcon(QIcon(rendered))
self.setIconSize(rendered.size())
def show_loading(self) -> None:
self._source_pixmap = QPixmap()
self.setIcon(QIcon())
self.setText("正在加载图片…")
self.setProperty("loadState", "loading")
self.setEnabled(False)
def show_preview(self, pixmap: QPixmap) -> None:
"""Render the decoded image directly in the note card."""
self._source_pixmap = pixmap.scaled(
QSize(960, 720),
Qt.AspectRatioMode.KeepAspectRatio,
Qt.TransformationMode.SmoothTransformation,
)
self.setText("")
self._refresh_preview()
self.setProperty("loadState", "ready")
self.setEnabled(True)
self.style().unpolish(self)
self.style().polish(self)
def show_failure(self) -> None:
"""Keep a failed attachment actionable so the user can retry it."""
self._source_pixmap = QPixmap()
self.setIcon(QIcon())
self.setText("图片加载失败\n点击重试")
self.setProperty("loadState", "failed")
self.setEnabled(True)
self.style().unpolish(self)
self.style().polish(self)
def resizeEvent(self, event: Any) -> None: # noqa: N802 - Qt override
super().resizeEvent(event)
self._refresh_preview()
class QueueRow(QWidget): class QueueRow(QWidget):
"""Compact appointment summary rendered inside the queue list.""" """Compact appointment summary rendered inside the queue list."""
@@ -232,6 +299,7 @@ class ReceptionPage(QWidget):
self._pending_report_files: list[str] = [] self._pending_report_files: list[str] = []
self._note_busy = False self._note_busy = False
self._attachment_preview_generation = 0 self._attachment_preview_generation = 0
self._attachment_render_generation = 0
self._can_complete = has_permission(self.permissions, "doctor.appointment/complete") self._can_complete = has_permission(self.permissions, "doctor.appointment/complete")
self._can_note = has_permission(self.permissions, "doctor.appointment/addDoctorNote") self._can_note = has_permission(self.permissions, "doctor.appointment/addDoctorNote")
@@ -1238,6 +1306,8 @@ class ReceptionPage(QWidget):
self.daily_text.setText("\n".join(lines) if lines else "近 30 日暂无日常记录。") self.daily_text.setText("\n".join(lines) if lines else "近 30 日暂无日常记录。")
def _render_notes(self, notes: list[Any]) -> None: def _render_notes(self, notes: list[Any]) -> None:
self._attachment_render_generation += 1
render_generation = self._attachment_render_generation
clear_layout(self.notes_layout) clear_layout(self.notes_layout)
self.notes_count.setText(f"{len(notes)}") self.notes_count.setText(f"{len(notes)}")
if not notes: if not notes:
@@ -1262,44 +1332,159 @@ class ReceptionPage(QWidget):
meta.setProperty("role", "muted") meta.setProperty("role", "muted")
layout.addWidget(meta) layout.addWidget(meta)
note_id = _as_int(first_value(note, "id", "note_id", default=None)) note_id = _as_int(first_value(note, "id", "note_id", default=None))
image_attachments: list[tuple[str, str, str]] = []
file_attachments: list[tuple[str, str, str]] = []
for image_type, caption in ( for image_type, caption in (
("tongue_images", "舌苔图"), ("tongue_images", "舌苔图"),
("report_files", "检查报告"), ("report_files", "检查报告"),
): ):
for path in _sequence(first_value(note, image_type, default=[])): for path in _sequence(first_value(note, image_type, default=[])):
path_text = str(path).strip() path_text = str(path).strip()
attachment = QWidget() attachment = (image_type, caption, path_text)
attachment_layout = QHBoxLayout(attachment) if _is_image_attachment(path_text):
attachment_layout.setContentsMargins(0, 0, 0, 0) image_attachments.append(attachment)
label = QLabel(f"{caption}{_attachment_name(path_text)}") else:
label.setToolTip(path_text) file_attachments.append(attachment)
label.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse)
attachment_layout.addWidget(label, 1) if image_attachments:
preview_button = QPushButton( image_title = QLabel("图片附件 · 点击图片查看大图")
"预览" if _is_image_attachment(path_text) else "打开" image_title.setProperty("role", "muted")
) layout.addWidget(image_title)
preview_button.setProperty("variant", "secondary") image_host = QWidget()
preview_button.setEnabled(bool(path_text)) image_grid = QGridLayout(image_host)
preview_button.clicked.connect( image_grid.setContentsMargins(0, 0, 0, 0)
lambda _checked=False, current_path=path_text, button=preview_button: ( image_grid.setHorizontalSpacing(10)
image_grid.setVerticalSpacing(10)
for index, (image_type, caption, path_text) in enumerate(
image_attachments
):
tile = QFrame()
tile.setObjectName("NoteAttachmentTile")
tile_layout = QVBoxLayout(tile)
tile_layout.setContentsMargins(8, 8, 8, 8)
tile_layout.setSpacing(6)
preview = _NoteAttachmentPreview(caption)
preview.setToolTip(f"{caption}{path_text}\n点击查看大图")
preview.clicked.connect(
lambda _checked=False, current_path=path_text, button=preview: (
self._preview_note_attachment(current_path, button) self._preview_note_attachment(current_path, button)
) )
) )
attachment_layout.addWidget(preview_button) tile_layout.addWidget(preview)
footer = QHBoxLayout()
footer.setSpacing(6)
label = QLabel(f"{caption} · {_attachment_name(path_text)}")
label.setObjectName("NoteAttachmentName")
label.setToolTip(path_text)
label.setTextInteractionFlags(
Qt.TextInteractionFlag.TextSelectableByMouse
)
label.setMinimumWidth(0)
label.setSizePolicy(
QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Preferred
)
footer.addWidget(label, 1)
if self._can_note and note_id is not None: if self._can_note and note_id is not None:
delete_button = QPushButton("删除") delete_button = QPushButton("删除")
delete_button.setProperty("variant", "secondary") delete_button.setProperty("variant", "secondary")
delete_button.clicked.connect( delete_button.clicked.connect(
lambda _checked=False, current_note_id=note_id, current_type=image_type, current_path=str(path), button=delete_button: ( lambda _checked=False, current_note_id=note_id, current_type=image_type, current_path=path_text, button=delete_button: (
self._delete_note_attachment( self._delete_note_attachment(
current_note_id, current_type, current_path, button current_note_id, current_type, current_path, button
) )
) )
) )
attachment_layout.addWidget(delete_button) footer.addWidget(delete_button)
layout.addWidget(attachment) tile_layout.addLayout(footer)
row, column = divmod(index, 3)
image_grid.addWidget(tile, row, column)
self._load_note_thumbnail(path_text, preview, render_generation)
for column in range(3):
image_grid.setColumnStretch(column, 1)
layout.addWidget(image_host)
for image_type, caption, path_text in file_attachments:
attachment = QWidget()
attachment_layout = QHBoxLayout(attachment)
attachment_layout.setContentsMargins(0, 0, 0, 0)
label = QLabel(f"{caption}{_attachment_name(path_text)}")
label.setToolTip(path_text)
label.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse)
attachment_layout.addWidget(label, 1)
open_button = QPushButton("打开")
open_button.setProperty("variant", "secondary")
open_button.setEnabled(bool(path_text))
open_button.clicked.connect(
lambda _checked=False, current_path=path_text, button=open_button: (
self._preview_note_attachment(current_path, button)
)
)
attachment_layout.addWidget(open_button)
if self._can_note and note_id is not None:
delete_button = QPushButton("删除")
delete_button.setProperty("variant", "secondary")
delete_button.clicked.connect(
lambda _checked=False, current_note_id=note_id, current_type=image_type, current_path=path_text, button=delete_button: (
self._delete_note_attachment(
current_note_id, current_type, current_path, button
)
)
)
attachment_layout.addWidget(delete_button)
layout.addWidget(attachment)
self.notes_layout.addWidget(card) self.notes_layout.addWidget(card)
def _load_note_thumbnail(
self,
path: str,
preview: _NoteAttachmentPreview,
generation: int,
) -> None:
"""Download and paint a note image without opening another window."""
download = getattr(self.repository, "download_public_image", None)
if not callable(download):
preview.show_failure()
return
run_async(
lambda: invoke(self.repository, "download_public_image", url=path),
on_success=lambda payload: self._apply_note_thumbnail(
payload, preview, generation
),
on_error=lambda _error: self._fail_note_thumbnail(preview, generation),
)
def _apply_note_thumbnail(
self,
payload: Any,
preview: _NoteAttachmentPreview,
generation: int,
) -> None:
if generation != self._attachment_render_generation:
return
content = bytes(payload or b"")
pixmap = QPixmap()
if (
not content
or len(content) > 10 * 1024 * 1024
or not pixmap.loadFromData(content)
or pixmap.isNull()
):
self._fail_note_thumbnail(preview, generation)
return
with suppress(RuntimeError):
preview.show_preview(pixmap)
def _fail_note_thumbnail(
self,
preview: _NoteAttachmentPreview,
generation: int,
) -> None:
if generation != self._attachment_render_generation:
return
with suppress(RuntimeError):
preview.show_failure()
def _preview_note_attachment(self, path: str, button: QPushButton) -> None: def _preview_note_attachment(self, path: str, button: QPushButton) -> None:
"""Preview note images in-app and open non-image reports safely.""" """Preview note images in-app and open non-image reports safely."""
@@ -1325,8 +1510,11 @@ class ReceptionPage(QWidget):
return return
self._attachment_preview_generation += 1 self._attachment_preview_generation += 1
generation = self._attachment_preview_generation generation = self._attachment_preview_generation
button.setEnabled(False) if isinstance(button, _NoteAttachmentPreview):
button.setText("加载中…") button.show_loading()
else:
button.setEnabled(False)
button.setText("加载中…")
run_async( run_async(
lambda: invoke(self.repository, "download_public_image", url=target), lambda: invoke(self.repository, "download_public_image", url=target),
on_success=lambda payload: self._show_note_image_preview( on_success=lambda payload: self._show_note_image_preview(
@@ -1346,13 +1534,21 @@ class ReceptionPage(QWidget):
) -> None: ) -> None:
if generation != self._attachment_preview_generation: if generation != self._attachment_preview_generation:
return return
button.setEnabled(True)
button.setText("预览")
content = bytes(payload or b"") content = bytes(payload or b"")
pixmap = QPixmap() pixmap = QPixmap()
if not content or len(content) > 10 * 1024 * 1024 or not pixmap.loadFromData(content): if not content or len(content) > 10 * 1024 * 1024 or not pixmap.loadFromData(content):
if isinstance(button, _NoteAttachmentPreview):
button.show_failure()
else:
button.setEnabled(True)
button.setText("预览")
show_toast(self, "服务器返回的图片无法预览。", "danger", 4600) show_toast(self, "服务器返回的图片无法预览。", "danger", 4600)
return return
if isinstance(button, _NoteAttachmentPreview):
button.show_preview(pixmap)
else:
button.setEnabled(True)
button.setText("预览")
dialog = QDialog(self) dialog = QDialog(self)
dialog.setWindowTitle(f"预览 · {_attachment_name(path)}") dialog.setWindowTitle(f"预览 · {_attachment_name(path)}")
dialog.setModal(True) dialog.setModal(True)
@@ -1387,8 +1583,11 @@ class ReceptionPage(QWidget):
) -> None: ) -> None:
if generation != self._attachment_preview_generation: if generation != self._attachment_preview_generation:
return return
button.setEnabled(True) if isinstance(button, _NoteAttachmentPreview):
button.setText("预览") button.show_failure()
else:
button.setEnabled(True)
button.setText("预览")
show_toast(self, f"图片预览失败:{friendly_error(error)}", "danger", 5200) show_toast(self, f"图片预览失败:{friendly_error(error)}", "danger", 5200)
def _reset_detail_content(self, seed: Any = None) -> None: def _reset_detail_content(self, seed: Any = None) -> None:
+27
View File
@@ -205,6 +205,33 @@ QPushButton[variant="secondary"]:checked {
border-color: $indigo_pressed; border-color: $indigo_pressed;
} }
QFrame#NoteAttachmentTile {
background-color: $surface;
border: 1px solid $line;
border-radius: 10px;
}
QPushButton#NoteAttachmentPreview {
min-height: 132px;
padding: 6px;
color: $muted;
background-color: $surface_alt;
border: 1px solid $line;
border-radius: 8px;
font-weight: 500;
}
QPushButton#NoteAttachmentPreview:hover {
background-color: $indigo_pale;
border-color: $indigo_hover;
}
QPushButton#NoteAttachmentPreview[loadState="failed"] {
color: $danger;
background-color: $danger_pale;
}
QLabel#NoteAttachmentName {
color: $text_soft;
font-size: 12px;
}
QPushButton[variant="danger"] { QPushButton[variant="danger"] {
color: $danger; color: $danger;
background-color: $danger_pale; background-color: $danger_pale;
+12 -1
View File
@@ -423,6 +423,8 @@ def test_order_payload_and_a4_print_document(
assert "黄芪" in rendered assert "黄芪" in rendered
assert "酸枣仁" in rendered assert "酸枣仁" in rendered
assert "服药前请核对姓名、电话、医生等信息" in rendered assert "服药前请核对姓名、电话、医生等信息" in rendered
assert '<table align="center" class="paper" width="794" height="1123"' in rendered
assert '<col width="44"/><col/><col width="64"/><col width="24"/>' in rendered
assert "Rp." in rendered assert "Rp." in rendered
assert "药房联" in rendered assert "药房联" in rendered
assert "主方" in rendered assert "主方" in rendered
@@ -433,8 +435,9 @@ def test_order_payload_and_a4_print_document(
assert "每天2次, 一次2袋, 每袋5g, 温水送服, 饭后" in rendered assert "每天2次, 一次2袋, 每袋5g, 温水送服, 饭后" in rendered
viewer = PrescriptionDetailDialog(prescription) viewer = PrescriptionDetailDialog(prescription)
document_html = viewer.document.toHtml() document_html = viewer.document.toHtml()
assert "药房联" in document_html
assert "用药 (单剂)" in document_html assert "用药 (单剂)" in document_html
assert viewer.document.idealWidth() == pytest.approx(794.0)
assert viewer.preview.__class__.__name__ == "_PrescriptionPaperPreview"
viewer.close() viewer.close()
order.close() order.close()
application.processEvents() application.processEvents()
@@ -450,6 +453,7 @@ def test_prescription_detail_can_open_immutable_case_record_tab(
"case_record": { "case_record": {
"patient_name": "林晓岚", "patient_name": "林晓岚",
"phone": "13800138000", "phone": "13800138000",
"diagnosis_type": "follow_up",
"local_hospital_name": "市中医院", "local_hospital_name": "市中医院",
"symptoms": "口渴乏力", "symptoms": "口渴乏力",
"tongue_coating": "舌红少苔", "tongue_coating": "舌红少苔",
@@ -461,8 +465,15 @@ def test_prescription_detail_can_open_immutable_case_record_tab(
assert viewer.tabs.tabText(viewer.tabs.currentIndex()) == "详细病历" assert viewer.tabs.tabText(viewer.tabs.currentIndex()) == "详细病历"
assert viewer.case_document is not None assert viewer.case_document is not None
case_html = viewer.case_document.toHtml() case_html = viewer.case_document.toHtml()
source_html = dialog_module.render_case_record_html(prescription)
assert "甄养堂 详细病历" in case_html
assert '<table class="cr-grid"' in source_html
assert "follow_up" not in case_html
assert "复诊" in case_html
assert "市中医院" in case_html assert "市中医院" in case_html
assert "口渴乏力" in case_html assert "口渴乏力" in case_html
assert viewer.case_preview is not None
assert viewer.case_preview.objectName() == "CaseRecordPaperPreview"
viewer.close() viewer.close()
application.processEvents() application.processEvents()
+8 -2
View File
@@ -69,8 +69,9 @@ def test_note_attachment_preview_type_is_extension_aware(path: str, expected: bo
assert _is_image_attachment(path) is expected assert _is_image_attachment(path) is expected
def test_note_attachments_offer_image_preview_and_file_open( def test_note_attachments_expand_images_and_keep_file_open(
application: QApplication, application: QApplication,
immediate_async: None,
) -> None: ) -> None:
page = ReceptionPage(DemoDoctorRepository(), PermissionSet([])) page = ReceptionPage(DemoDoctorRepository(), PermissionSet([]))
page._render_notes( page._render_notes(
@@ -87,8 +88,13 @@ def test_note_attachments_offer_image_preview_and_file_open(
] ]
) )
previews = page.notes_container.findChildren(
QPushButton, "NoteAttachmentPreview"
)
assert len(previews) == 2
assert all(button.text() == "" for button in previews)
assert all(not button.icon().isNull() for button in previews)
labels = [button.text() for button in page.notes_container.findChildren(QPushButton)] labels = [button.text() for button in page.notes_container.findChildren(QPushButton)]
assert labels.count("预览") == 2
assert labels.count("打开") == 1 assert labels.count("打开") == 1
page.close() page.close()
application.processEvents() application.processEvents()
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import t from"./error-BrIrdwkW.js";import{o,q as r,r as a,v as n,D as c,s}from"./.pnpm-CC7b2w5D.js";import"./index-SornbJeu.js";const p="/admin/assets/no_perms-jDxcYpYC.png",i={class:"error404"},x=o({__name:"403",setup(m){return(_,e)=>(r(),a("div",i,[n(t,{code:"403",title:"您的账号权限不足,请联系管理员添加权限!","show-btn":!1},{content:c(()=>[...e[0]||(e[0]=[s("div",{class:"flex justify-center"},[s("img",{class:"w-[150px] h-[150px]",src:p,alt:""})],-1)])]),_:1})]))}});export{x as default}; import t from"./error-Db3RUzsa.js";import{o,q as r,r as a,v as n,D as c,s}from"./.pnpm-C1KTa5cB.js";import"./index-Cxx1IoGl.js";const p="/admin/assets/no_perms-jDxcYpYC.png",i={class:"error404"},x=o({__name:"403",setup(m){return(_,e)=>(r(),a("div",i,[n(t,{code:"403",title:"您的账号权限不足,请联系管理员添加权限!","show-btn":!1},{content:c(()=>[...e[0]||(e[0]=[s("div",{class:"flex justify-center"},[s("img",{class:"w-[150px] h-[150px]",src:p,alt:""})],-1)])]),_:1})]))}});export{x as default};
@@ -1 +1 @@
import e from"./error-BrIrdwkW.js";import{o,q as r,r as t,v as s}from"./.pnpm-CC7b2w5D.js";import"./index-SornbJeu.js";const a={class:"error404"},d=o({__name:"404",setup(c){return(n,_)=>(r(),t("div",a,[s(e,{code:"404",title:"哎呀,出错了!您访问的页面不存在…"})]))}});export{d as default}; import e from"./error-Db3RUzsa.js";import{o,q as r,r as t,v as s}from"./.pnpm-C1KTa5cB.js";import"./index-Cxx1IoGl.js";const a={class:"error404"},d=o({__name:"404",setup(c){return(n,_)=>(r(),t("div",a,[s(e,{code:"404",title:"哎呀,出错了!您访问的页面不存在…"})]))}});export{d as default};
@@ -1 +1 @@
import{o as C,R as D,q as d,r as I,ac as N,O as u,bj as B,D as o,v as l,bk as E,br as L,L as i,T as r,s as p,bi as R,M as w}from"./.pnpm-CC7b2w5D.js";import{a as V}from"./doctor-M_b8mA9M.js";import{m as A,_ as M}from"./index-SornbJeu.js";const P={class:"appointment-record-panel"},$={class:"cell-stack"},j={class:"font-medium"},q={class:"text-gray-500 text-sm"},O={class:"cell-stack"},F={class:"text-gray-500 text-sm"},G=C({__name:"AppointmentRecordPanel",props:{diagnosisId:{}},setup(v,{expose:y}){const f=v,m=w(!1),g=w([]),h=w({});function x(t){return t?String(t).length>=8?String(t).slice(0,5):t:""}function k(t){return t==="morning"?"上午":t==="afternoon"?"下午":t==="all"?"全天":t||"—"}function S(t){const n=t.channel_source??t.channels??"";if(n===""||n===null||n===void 0)return"—";const a=String(n),s=h.value[a]||a,c=String(t.channel_source_detail??"").trim();return c!==""?`${s}${c}`:s}function T(t){return[...t].sort((n,a)=>{const s=String(n.appointment_date||""),c=String(a.appointment_date||"");if(s!==c)return c.localeCompare(s);const _=String(n.appointment_time||""),e=String(a.appointment_time||"");return _!==e?e.localeCompare(_):Number(a.id||0)-Number(n.id||0)})}const z=async()=>{try{const t=await A({type:"channels"}),n=((t==null?void 0:t.channels)||[]).filter(s=>s.status!==0),a={};for(const s of n)s.value!=null&&(a[String(s.value)]=s.name||String(s.value));h.value=a}catch{h.value={}}},b=async()=>{if(f.diagnosisId){m.value=!0;try{await z();const t=await V({patient_id:f.diagnosisId,diag_scope_relax:1,page_no:1,page_size:500}),n=(t==null?void 0:t.lists)||[];g.value=T(n)}catch(t){console.error(t),g.value=[]}finally{m.value=!1}}};return D(()=>f.diagnosisId,()=>{b()},{immediate:!0}),y({refresh:b}),(t,n)=>{const a=E,s=L,c=B,_=R;return d(),I("div",P,[N((d(),u(c,{data:g.value,border:"",stripe:"","empty-text":"暂无挂号记录"},{default:o(()=>[l(a,{label:"ID",prop:"id",width:"72",align:"center"}),l(a,{label:"状态",width:"100",align:"center"},{default:o(({row:e})=>[l(s,{type:e.status===1?"success":e.status===2?"info":e.status===3?"primary":"danger",size:"small",effect:"light"},{default:o(()=>[i(r(e.status_desc||"—"),1)]),_:2},1032,["type"])]),_:1}),l(a,{label:"患者(挂号人)","min-width":"150"},{default:o(({row:e})=>[p("div",$,[p("span",j,r(e.patient_name||"—"),1),p("span",q,r(e.patient_phone||""),1)])]),_:1}),l(a,{label:"挂号医生",prop:"doctor_name",width:"110","show-overflow-tooltip":""}),l(a,{label:"挂号助理",width:"110","show-overflow-tooltip":""},{default:o(({row:e})=>[i(r(e.assistant_name||"—"),1)]),_:1}),l(a,{label:"预约时间","min-width":"130"},{default:o(({row:e})=>[p("div",O,[p("span",null,r(e.appointment_date||"—"),1),p("span",F,r(x(e.appointment_time)),1)])]),_:1}),l(a,{label:"时段",width:"80",align:"center"},{default:o(({row:e})=>[i(r(k(e.period)),1)]),_:1}),l(a,{label:"类型",width:"100","show-overflow-tooltip":""},{default:o(({row:e})=>[i(r(e.appointment_type_desc||"—"),1)]),_:1}),l(a,{label:"渠道",width:"110","show-overflow-tooltip":""},{default:o(({row:e})=>[i(r(S(e)),1)]),_:1}),l(a,{label:"确认诊单",width:"92",align:"center"},{default:o(({row:e})=>[e.diagnosis_confirmed?(d(),u(s,{key:0,type:"success",size:"small",effect:"plain"},{default:o(()=>[...n[0]||(n[0]=[i("已确认",-1)])]),_:1})):(d(),u(s,{key:1,type:"warning",size:"small",effect:"plain"},{default:o(()=>[...n[1]||(n[1]=[i("未确认",-1)])]),_:1}))]),_:1}),l(a,{label:"开方",width:"80",align:"center"},{default:o(({row:e})=>[e.has_prescription?(d(),u(s,{key:0,type:"success",size:"small",effect:"plain"},{default:o(()=>[...n[2]||(n[2]=[i("已开方",-1)])]),_:1})):(d(),u(s,{key:1,type:"info",size:"small",effect:"plain"},{default:o(()=>[...n[3]||(n[3]=[i("未开方",-1)])]),_:1}))]),_:1}),l(a,{label:"备注",prop:"remark","min-width":"100","show-overflow-tooltip":""}),l(a,{label:"创建时间",width:"165",prop:"create_time"})]),_:1},8,["data"])),[[_,m.value]])])}}}),Q=M(G,[["__scopeId","data-v-4de87dfa"]]);export{Q as default}; import{o as C,R as D,q as d,r as I,ac as N,O as u,bj as B,D as o,v as l,bk as E,br as L,L as i,T as r,s as p,bi as R,M as w}from"./.pnpm-C1KTa5cB.js";import{a as V}from"./doctor-fOWXzRlL.js";import{m as A,_ as M}from"./index-Cxx1IoGl.js";const P={class:"appointment-record-panel"},$={class:"cell-stack"},j={class:"font-medium"},q={class:"text-gray-500 text-sm"},O={class:"cell-stack"},F={class:"text-gray-500 text-sm"},G=C({__name:"AppointmentRecordPanel",props:{diagnosisId:{}},setup(v,{expose:y}){const f=v,m=w(!1),g=w([]),h=w({});function x(t){return t?String(t).length>=8?String(t).slice(0,5):t:""}function k(t){return t==="morning"?"上午":t==="afternoon"?"下午":t==="all"?"全天":t||"—"}function S(t){const n=t.channel_source??t.channels??"";if(n===""||n===null||n===void 0)return"—";const a=String(n),s=h.value[a]||a,c=String(t.channel_source_detail??"").trim();return c!==""?`${s}${c}`:s}function T(t){return[...t].sort((n,a)=>{const s=String(n.appointment_date||""),c=String(a.appointment_date||"");if(s!==c)return c.localeCompare(s);const _=String(n.appointment_time||""),e=String(a.appointment_time||"");return _!==e?e.localeCompare(_):Number(a.id||0)-Number(n.id||0)})}const z=async()=>{try{const t=await A({type:"channels"}),n=((t==null?void 0:t.channels)||[]).filter(s=>s.status!==0),a={};for(const s of n)s.value!=null&&(a[String(s.value)]=s.name||String(s.value));h.value=a}catch{h.value={}}},b=async()=>{if(f.diagnosisId){m.value=!0;try{await z();const t=await V({patient_id:f.diagnosisId,diag_scope_relax:1,page_no:1,page_size:500}),n=(t==null?void 0:t.lists)||[];g.value=T(n)}catch(t){console.error(t),g.value=[]}finally{m.value=!1}}};return D(()=>f.diagnosisId,()=>{b()},{immediate:!0}),y({refresh:b}),(t,n)=>{const a=E,s=L,c=B,_=R;return d(),I("div",P,[N((d(),u(c,{data:g.value,border:"",stripe:"","empty-text":"暂无挂号记录"},{default:o(()=>[l(a,{label:"ID",prop:"id",width:"72",align:"center"}),l(a,{label:"状态",width:"100",align:"center"},{default:o(({row:e})=>[l(s,{type:e.status===1?"success":e.status===2?"info":e.status===3?"primary":"danger",size:"small",effect:"light"},{default:o(()=>[i(r(e.status_desc||"—"),1)]),_:2},1032,["type"])]),_:1}),l(a,{label:"患者(挂号人)","min-width":"150"},{default:o(({row:e})=>[p("div",$,[p("span",j,r(e.patient_name||"—"),1),p("span",q,r(e.patient_phone||""),1)])]),_:1}),l(a,{label:"挂号医生",prop:"doctor_name",width:"110","show-overflow-tooltip":""}),l(a,{label:"挂号助理",width:"110","show-overflow-tooltip":""},{default:o(({row:e})=>[i(r(e.assistant_name||"—"),1)]),_:1}),l(a,{label:"预约时间","min-width":"130"},{default:o(({row:e})=>[p("div",O,[p("span",null,r(e.appointment_date||"—"),1),p("span",F,r(x(e.appointment_time)),1)])]),_:1}),l(a,{label:"时段",width:"80",align:"center"},{default:o(({row:e})=>[i(r(k(e.period)),1)]),_:1}),l(a,{label:"类型",width:"100","show-overflow-tooltip":""},{default:o(({row:e})=>[i(r(e.appointment_type_desc||"—"),1)]),_:1}),l(a,{label:"渠道",width:"110","show-overflow-tooltip":""},{default:o(({row:e})=>[i(r(S(e)),1)]),_:1}),l(a,{label:"确认诊单",width:"92",align:"center"},{default:o(({row:e})=>[e.diagnosis_confirmed?(d(),u(s,{key:0,type:"success",size:"small",effect:"plain"},{default:o(()=>[...n[0]||(n[0]=[i("已确认",-1)])]),_:1})):(d(),u(s,{key:1,type:"warning",size:"small",effect:"plain"},{default:o(()=>[...n[1]||(n[1]=[i("未确认",-1)])]),_:1}))]),_:1}),l(a,{label:"开方",width:"80",align:"center"},{default:o(({row:e})=>[e.has_prescription?(d(),u(s,{key:0,type:"success",size:"small",effect:"plain"},{default:o(()=>[...n[2]||(n[2]=[i("已开方",-1)])]),_:1})):(d(),u(s,{key:1,type:"info",size:"small",effect:"plain"},{default:o(()=>[...n[3]||(n[3]=[i("未开方",-1)])]),_:1}))]),_:1}),l(a,{label:"备注",prop:"remark","min-width":"100","show-overflow-tooltip":""}),l(a,{label:"创建时间",width:"165",prop:"create_time"})]),_:1},8,["data"])),[[_,m.value]])])}}}),Q=M(G,[["__scopeId","data-v-4de87dfa"]]);export{Q as default};
@@ -1 +1 @@
import{o as T,R as C,q as _,r as b,ac as D,O as h,bj as $,D as r,v as n,bk as L,L as c,T as d,br as k,s as E,a1 as A,w as P,u as B,ch as F,bi as M,M as w}from"./.pnpm-CC7b2w5D.js";import{ae as V}from"./tcm-CyNc7e6S.js";import{_ as q}from"./index-SornbJeu.js";const K={class:"assign-log-panel"},j={key:1,class:"text-gray-400"},z=T({__name:"AssignLogPanel",props:{diagnosisId:{}},setup(v,{expose:y}){const u=v,m=w(!1),p=w([]);function N(a){const e=a.related_po_creator_name;if(e!=null&&String(e).trim()!=="")return String(e);const t=Number(a.related_po_creator_id);return Number.isFinite(t)&&t>0?`ID:${t}`:"—"}function x(a){const e=a.related_po_create_time_text;if(e!=null&&String(e).trim()!=="")return String(e);const t=Number(a.related_po_create_time);if(!Number.isFinite(t)||t<=0)return"—";const s=new Date(t*1e3);if(Number.isNaN(s.getTime()))return"—";const o=l=>String(l).padStart(2,"0");return`${s.getFullYear()}-${o(s.getMonth()+1)}-${o(s.getDate())} ${o(s.getHours())}:${o(s.getMinutes())}:${o(s.getSeconds())}`}function f(a,e){const t=e==="from"?"from_assistant_name":"to_assistant_name",s=e==="from"?"from_assistant_id":"to_assistant_id",o=a[t];if(o!=null&&String(o).trim()!==""&&String(o)!=="—")return String(o);const l=Number(a[s]);return Number.isFinite(l)&&l>0?`ID:${l}`:"—"}const g=async()=>{if(u.diagnosisId){m.value=!0;try{const a=await V({id:u.diagnosisId}),e=Array.isArray(a)?a:[];p.value=e}catch(a){console.error(a),p.value=[]}finally{m.value=!1}}};return C(()=>u.diagnosisId,()=>{g()},{immediate:!0}),y({refresh:g}),(a,e)=>{const t=L,s=k,o=P,l=A,S=$,I=M;return _(),b("div",K,[D((_(),h(S,{data:p.value,border:"",stripe:"","empty-text":"暂无指派记录"},{default:r(()=>[n(t,{label:"操作时间",width:"175",prop:"create_time_text"}),n(t,{label:"原医助","min-width":"120"},{default:r(({row:i})=>[c(d(f(i,"from")),1)]),_:1}),n(t,{label:"新医助","min-width":"120"},{default:r(({row:i})=>[c(d(f(i,"to")),1)]),_:1}),n(t,{label:"继承",width:"72",align:"center"},{default:r(({row:i})=>[Number(i.is_inherit)===1?(_(),h(s,{key:0,type:"success",size:"small"},{default:r(()=>[...e[0]||(e[0]=[c("是",-1)])]),_:1})):(_(),b("span",j,"否"))]),_:1}),n(t,{label:"快照·业务单创建人","min-width":"130","show-overflow-tooltip":""},{default:r(({row:i})=>[c(d(N(i)),1)]),_:1}),n(t,{label:"快照·业务单创建时间",width:"190"},{header:r(()=>[e[1]||(e[1]=E("span",null,"快照·业务单创建时间",-1)),n(l,{placement:"top",content:"related_po_create_time:触发本次操作的处方业务订单 create_time;与原文助一致时表示医助创建订单时间"},{default:r(()=>[n(o,{class:"assign-log-col-hint"},{default:r(()=>[n(B(F))]),_:1})]),_:1})]),default:r(({row:i})=>[c(d(x(i)),1)]),_:1}),n(t,{label:"操作人",width:"110",prop:"operator_name"}),n(t,{label:"操作账号",width:"120",prop:"operator_account","show-overflow-tooltip":""}),n(t,{label:"IP",width:"130",prop:"ip","show-overflow-tooltip":""})]),_:1},8,["data"])),[[I,m.value]])])}}}),Y=q(z,[["__scopeId","data-v-f670e3e6"]]);export{Y as default}; import{o as T,R as C,q as _,r as b,ac as D,O as h,bj as $,D as i,v as n,bk as L,L as c,T as d,br as k,s as E,a1 as A,w as P,u as B,ci as F,bi as M,M as w}from"./.pnpm-C1KTa5cB.js";import{ae as V}from"./tcm-DJJMkqKG.js";import{_ as q}from"./index-Cxx1IoGl.js";const K={class:"assign-log-panel"},j={key:1,class:"text-gray-400"},z=T({__name:"AssignLogPanel",props:{diagnosisId:{}},setup(v,{expose:y}){const u=v,m=w(!1),p=w([]);function N(a){const e=a.related_po_creator_name;if(e!=null&&String(e).trim()!=="")return String(e);const t=Number(a.related_po_creator_id);return Number.isFinite(t)&&t>0?`ID:${t}`:"—"}function x(a){const e=a.related_po_create_time_text;if(e!=null&&String(e).trim()!=="")return String(e);const t=Number(a.related_po_create_time);if(!Number.isFinite(t)||t<=0)return"—";const s=new Date(t*1e3);if(Number.isNaN(s.getTime()))return"—";const o=l=>String(l).padStart(2,"0");return`${s.getFullYear()}-${o(s.getMonth()+1)}-${o(s.getDate())} ${o(s.getHours())}:${o(s.getMinutes())}:${o(s.getSeconds())}`}function f(a,e){const t=e==="from"?"from_assistant_name":"to_assistant_name",s=e==="from"?"from_assistant_id":"to_assistant_id",o=a[t];if(o!=null&&String(o).trim()!==""&&String(o)!=="—")return String(o);const l=Number(a[s]);return Number.isFinite(l)&&l>0?`ID:${l}`:"—"}const g=async()=>{if(u.diagnosisId){m.value=!0;try{const a=await V({id:u.diagnosisId}),e=Array.isArray(a)?a:[];p.value=e}catch(a){console.error(a),p.value=[]}finally{m.value=!1}}};return C(()=>u.diagnosisId,()=>{g()},{immediate:!0}),y({refresh:g}),(a,e)=>{const t=L,s=k,o=P,l=A,S=$,I=M;return _(),b("div",K,[D((_(),h(S,{data:p.value,border:"",stripe:"","empty-text":"暂无指派记录"},{default:i(()=>[n(t,{label:"操作时间",width:"175",prop:"create_time_text"}),n(t,{label:"原医助","min-width":"120"},{default:i(({row:r})=>[c(d(f(r,"from")),1)]),_:1}),n(t,{label:"新医助","min-width":"120"},{default:i(({row:r})=>[c(d(f(r,"to")),1)]),_:1}),n(t,{label:"继承",width:"72",align:"center"},{default:i(({row:r})=>[Number(r.is_inherit)===1?(_(),h(s,{key:0,type:"success",size:"small"},{default:i(()=>[...e[0]||(e[0]=[c("是",-1)])]),_:1})):(_(),b("span",j,"否"))]),_:1}),n(t,{label:"快照·业务单创建人","min-width":"130","show-overflow-tooltip":""},{default:i(({row:r})=>[c(d(N(r)),1)]),_:1}),n(t,{label:"快照·业务单创建时间",width:"190"},{header:i(()=>[e[1]||(e[1]=E("span",null,"快照·业务单创建时间",-1)),n(l,{placement:"top",content:"related_po_create_time:触发本次操作的处方业务订单 create_time;与原文助一致时表示医助创建订单时间"},{default:i(()=>[n(o,{class:"assign-log-col-hint"},{default:i(()=>[n(B(F))]),_:1})]),_:1})]),default:i(({row:r})=>[c(d(x(r)),1)]),_:1}),n(t,{label:"操作人",width:"110",prop:"operator_name"}),n(t,{label:"操作账号",width:"120",prop:"operator_account","show-overflow-tooltip":""}),n(t,{label:"IP",width:"130",prop:"ip","show-overflow-tooltip":""})]),_:1},8,["data"])),[[I,m.value]])])}}}),Y=q(z,[["__scopeId","data-v-f670e3e6"]]);export{Y as default};
@@ -1 +1 @@
import{o as B,R as D,q as E,O,D as I,r as _,T as S,P as x,ac as W,s as h,ad as P,v as U,K as $,L as j,bt as H,p as K,M as v,dg as c}from"./.pnpm-CC7b2w5D.js";import{af as Y}from"./tcm-CyNc7e6S.js";import{_ as q}from"./index-SornbJeu.js";const z={key:0,class:"watch-state"},F={key:1,class:"watch-state watch-error"},G=B({__name:"AssistantWatchCallDialog",props:{modelValue:{type:Boolean},diagnosisId:{}},emits:["update:modelValue","closed"],setup(R,{emit:A}){const u=R,g=A,y=K({get:()=>u.modelValue,set:t=>g("update:modelValue",t)}),r=v(null),l=v(!1),i=v(""),f=v("旁观视频通话"),n=new Map;let a=null,p=0;function w(t,e){return`${t}\0${String(e)}`}function N(t){return t.startsWith("patient_")?"患者":t.startsWith("doctor_")?"医护":t}async function T(t){if(!a||!r.value||t.streamType!==c.TYPE.STREAM_TYPE_MAIN)return;const e=w(t.userId,t.streamType);if(n.has(e))return;const o=document.createElement("div");o.className="watch-tile";const s=document.createElement("div");s.className="watch-tile-cap",s.textContent=N(t.userId);const d=document.createElement("div");d.className="watch-tile-view",o.appendChild(s),o.appendChild(d),r.value.appendChild(o),n.set(e,{wrap:o,userId:t.userId,streamType:t.streamType});try{await a.startRemoteVideo({userId:t.userId,streamType:t.streamType,view:d})}catch(b){console.warn("[AssistantWatchCall] startRemoteVideo",b)}}async function V(t){if(!a)return;const e=w(t.userId,t.streamType),o=n.get(e);if(o){try{await a.stopRemoteVideo({userId:t.userId,streamType:t.streamType})}catch{}o.wrap.remove(),n.delete(e)}}function C(){a&&(a.on(c.EVENT.REMOTE_VIDEO_AVAILABLE,T),a.on(c.EVENT.REMOTE_VIDEO_UNAVAILABLE,V))}function k(){a&&(a.off(c.EVENT.REMOTE_VIDEO_AVAILABLE,T),a.off(c.EVENT.REMOTE_VIDEO_UNAVAILABLE,V))}async function m(){if(k(),a){for(const[,t]of n){try{await a.stopRemoteVideo({userId:t.userId,streamType:t.streamType})}catch{}t.wrap.remove()}n.clear(),r.value&&(r.value.innerHTML="");try{await a.exitRoom()}catch{}try{a.destroy()}catch{}a=null}else n.clear(),r.value&&(r.value.innerHTML="")}async function L(){const t=++p;if(await m(),!u.diagnosisId){i.value="诊单无效";return}l.value=!0,i.value="",f.value="旁观视频通话";try{const e=await Y({diagnosis_id:u.diagnosisId});if(t!==p)return;e.patientName&&(f.value=`旁观视频通话 · ${e.patientName}`),a=c.create(),C();const o={sdkAppId:e.sdkAppId,userId:e.userId,userSig:e.userSig,autoReceiveAudio:!0,autoReceiveVideo:!0,...e.roomId!=null&&e.roomId>0?{roomId:e.roomId}:{strRoomId:e.strRoomId}};if(!(e.roomId!=null&&e.roomId>0)&&!e.strRoomId)throw new Error("缺少房间号");if(await a.enterRoom(o),t!==p){await m();return}l.value=!1}catch(e){l.value=!1;let o="进入房间失败";if(typeof e=="string")o=e;else if(e&&typeof e=="object"){const s=e;s.msg?o=String(s.msg):s.message&&(o=String(s.message))}i.value=o,await m()}}function M(){m(),l.value=!1,i.value="",f.value="旁观视频通话",g("closed")}return D(()=>[u.modelValue,u.diagnosisId],([t,e])=>{if(!t){p++,m();return}e>0&&L()}),(t,e)=>{const o=$,s=H;return E(),O(s,{modelValue:y.value,"onUpdate:modelValue":e[1]||(e[1]=d=>y.value=d),title:f.value,width:"760px","destroy-on-close":"","append-to-body":"","close-on-click-modal":!1,class:"assistant-watch-call-dialog",onClosed:M},{footer:I(()=>[e[3]||(e[3]=h("span",{class:"watch-hint"},"仅观看,不会开启摄像头与麦克风",-1)),U(o,{type:"primary",onClick:e[0]||(e[0]=d=>y.value=!1)},{default:I(()=>[...e[2]||(e[2]=[j("离开",-1)])]),_:1})]),default:I(()=>[l.value?(E(),_("div",z,"正在连接房间…")):i.value?(E(),_("div",F,S(i.value),1)):x("",!0),W(h("div",{ref_key:"gridRef",ref:r,class:"watch-grid"},null,512),[[P,!l.value&&!i.value]])]),_:1},8,["modelValue","title"])}}}),Z=q(G,[["__scopeId","data-v-7aff665d"]]);export{Z as default}; import{o as B,R as D,q as E,O,D as I,r as _,T as S,P as x,ac as W,s as h,ad as P,v as U,K as $,L as j,bt as H,p as K,M as v,dg as c}from"./.pnpm-C1KTa5cB.js";import{af as Y}from"./tcm-DJJMkqKG.js";import{_ as q}from"./index-Cxx1IoGl.js";const z={key:0,class:"watch-state"},F={key:1,class:"watch-state watch-error"},G=B({__name:"AssistantWatchCallDialog",props:{modelValue:{type:Boolean},diagnosisId:{}},emits:["update:modelValue","closed"],setup(R,{emit:A}){const u=R,g=A,y=K({get:()=>u.modelValue,set:t=>g("update:modelValue",t)}),r=v(null),l=v(!1),i=v(""),f=v("旁观视频通话"),n=new Map;let a=null,p=0;function w(t,e){return`${t}\0${String(e)}`}function N(t){return t.startsWith("patient_")?"患者":t.startsWith("doctor_")?"医护":t}async function T(t){if(!a||!r.value||t.streamType!==c.TYPE.STREAM_TYPE_MAIN)return;const e=w(t.userId,t.streamType);if(n.has(e))return;const o=document.createElement("div");o.className="watch-tile";const s=document.createElement("div");s.className="watch-tile-cap",s.textContent=N(t.userId);const d=document.createElement("div");d.className="watch-tile-view",o.appendChild(s),o.appendChild(d),r.value.appendChild(o),n.set(e,{wrap:o,userId:t.userId,streamType:t.streamType});try{await a.startRemoteVideo({userId:t.userId,streamType:t.streamType,view:d})}catch(b){console.warn("[AssistantWatchCall] startRemoteVideo",b)}}async function V(t){if(!a)return;const e=w(t.userId,t.streamType),o=n.get(e);if(o){try{await a.stopRemoteVideo({userId:t.userId,streamType:t.streamType})}catch{}o.wrap.remove(),n.delete(e)}}function C(){a&&(a.on(c.EVENT.REMOTE_VIDEO_AVAILABLE,T),a.on(c.EVENT.REMOTE_VIDEO_UNAVAILABLE,V))}function k(){a&&(a.off(c.EVENT.REMOTE_VIDEO_AVAILABLE,T),a.off(c.EVENT.REMOTE_VIDEO_UNAVAILABLE,V))}async function m(){if(k(),a){for(const[,t]of n){try{await a.stopRemoteVideo({userId:t.userId,streamType:t.streamType})}catch{}t.wrap.remove()}n.clear(),r.value&&(r.value.innerHTML="");try{await a.exitRoom()}catch{}try{a.destroy()}catch{}a=null}else n.clear(),r.value&&(r.value.innerHTML="")}async function L(){const t=++p;if(await m(),!u.diagnosisId){i.value="诊单无效";return}l.value=!0,i.value="",f.value="旁观视频通话";try{const e=await Y({diagnosis_id:u.diagnosisId});if(t!==p)return;e.patientName&&(f.value=`旁观视频通话 · ${e.patientName}`),a=c.create(),C();const o={sdkAppId:e.sdkAppId,userId:e.userId,userSig:e.userSig,autoReceiveAudio:!0,autoReceiveVideo:!0,...e.roomId!=null&&e.roomId>0?{roomId:e.roomId}:{strRoomId:e.strRoomId}};if(!(e.roomId!=null&&e.roomId>0)&&!e.strRoomId)throw new Error("缺少房间号");if(await a.enterRoom(o),t!==p){await m();return}l.value=!1}catch(e){l.value=!1;let o="进入房间失败";if(typeof e=="string")o=e;else if(e&&typeof e=="object"){const s=e;s.msg?o=String(s.msg):s.message&&(o=String(s.message))}i.value=o,await m()}}function M(){m(),l.value=!1,i.value="",f.value="旁观视频通话",g("closed")}return D(()=>[u.modelValue,u.diagnosisId],([t,e])=>{if(!t){p++,m();return}e>0&&L()}),(t,e)=>{const o=$,s=H;return E(),O(s,{modelValue:y.value,"onUpdate:modelValue":e[1]||(e[1]=d=>y.value=d),title:f.value,width:"760px","destroy-on-close":"","append-to-body":"","close-on-click-modal":!1,class:"assistant-watch-call-dialog",onClosed:M},{footer:I(()=>[e[3]||(e[3]=h("span",{class:"watch-hint"},"仅观看,不会开启摄像头与麦克风",-1)),U(o,{type:"primary",onClick:e[0]||(e[0]=d=>y.value=!1)},{default:I(()=>[...e[2]||(e[2]=[j("离开",-1)])]),_:1})]),default:I(()=>[l.value?(E(),_("div",z,"正在连接房间…")):i.value?(E(),_("div",F,S(i.value),1)):x("",!0),W(h("div",{ref_key:"gridRef",ref:r,class:"watch-grid"},null,512),[[P,!l.value&&!i.value]])]),_:1},8,["modelValue","title"])}}}),Z=q(G,[["__scopeId","data-v-7aff665d"]]);export{Z as default};
@@ -1 +1 @@
import{o as N,di as O,R as P,q as d,r as f,v as o,D as i,K as V,L as n,P as h,ac as D,O as w,bj as L,bk as j,T as u,s as y,bi as z,M as v}from"./.pnpm-CC7b2w5D.js";import M from"./RecordingPlaybackBlock-WrjdJKdw.js";import{U as k}from"./index-DDHtrTz0.js";import{i as c,_ as q}from"./index-SornbJeu.js";import{aj as K,ak as x,al as A}from"./tcm-CyNc7e6S.js";import"./RecordingVideoPlayer-BQTd_gWd.js";import"./file-BfK3TJqs.js";const F={class:"call-record-panel"},G={key:0,class:"call-record-toolbar"},H={class:"call-record-empty"},J={class:"call-record-empty__desc"},Q={key:0,class:"text-primary"},W={key:1,class:"text-gray-400"},X=N({__name:"CallRecordPanel",props:{diagnosisId:{},readOnly:{type:Boolean,default:!1}},setup(_,{expose:R}){const r=_,p=v(!1),g=v([]),U=O("toolbarUploadRef"),m=async()=>{if(r.diagnosisId){p.value=!0;try{g.value=await K({diagnosis_id:r.diagnosisId})||[]}catch(e){console.error(e),g.value=[]}finally{p.value=!1}}};P(()=>r.diagnosisId,()=>{m()},{immediate:!0}),R({refresh:m});function C(e){return{1:"进行中",2:"已结束",3:"未接听",4:"已取消"}[e]??"—"}async function S(e){const t=b(e);if(!t){c.msgError("上传成功但未返回视频地址");return}try{const a=await A({diagnosis_id:r.diagnosisId});await x({diagnosis_id:r.diagnosisId,call_record_id:Number((a==null?void 0:a.id)||0),file_url:t}),c.msgSuccess("视频回放上传成功"),await m()}catch(a){c.msgError((a==null?void 0:a.message)||"写入回放失败")}}async function E(e,t){const a=b(t);if(!a){c.msgError("上传成功但未返回视频地址");return}try{await x({diagnosis_id:r.diagnosisId,call_record_id:Number(e.id||0),file_url:a}),c.msgSuccess("视频回放上传成功"),await m()}catch(l){c.msgError((l==null?void 0:l.message)||"写入回放失败")}}function b(e){var t,a;return String(((t=e==null?void 0:e.data)==null?void 0:t.uri)||((a=e==null?void 0:e.data)==null?void 0:a.url)||"").trim()}return(e,t)=>{const a=V,l=j,I=L,B=z;return d(),f("div",F,[_.readOnly?h("",!0):(d(),f("div",G,[o(k,{ref_key:"toolbarUploadRef",ref:U,type:"video",direct:"",multiple:!1,limit:1,"show-progress":!0,onSuccess:S},{default:i(()=>[o(a,{type:"primary"},{default:i(()=>[...t[0]||(t[0]=[n("上传视频",-1)])]),_:1})]),_:1},512)])),D((d(),w(I,{data:g.value,border:"",stripe:""},{empty:i(()=>[y("div",H,[t[1]||(t[1]=y("div",{class:"call-record-empty__title"},"暂无通话记录",-1)),y("div",J,u(_.readOnly?"暂无录制回放数据。":"现在可以直接点击上方“上传视频”。系统会自动生成一条默认通话记录来承载回放。"),1)])]),default:i(()=>[o(l,{label:"录制回放","min-width":"320"},{default:i(({row:s})=>[o(M,{"record-id":s.id,urls:s.recording_urls_list},null,8,["record-id","urls"])]),_:1}),o(l,{label:"开始时间",width:"170",prop:"start_time_text"}),o(l,{label:"结束时间",width:"170",prop:"end_time_text"}),o(l,{label:"通话类型",width:"100"},{default:i(({row:s})=>[n(u(s.call_type===1?"语音":"视频"),1)]),_:1}),o(l,{label:"房间号",width:"180"},{default:i(({row:s})=>[s.room_id?(d(),f("span",Q,u(s.room_id),1)):(d(),f("span",W,"—"))]),_:1}),o(l,{label:"时长",width:"110",prop:"duration_text"}),o(l,{label:"状态",width:"90"},{default:i(({row:s})=>[n(u(C(s.status)),1)]),_:1}),o(l,{label:"录制",width:"100"},{default:i(({row:s})=>[n(u(s.recording_status_text||"—"),1)]),_:1}),_.readOnly?h("",!0):(d(),w(l,{key:0,label:"上传回放",width:"180"},{default:i(({row:s})=>[o(k,{type:"video",direct:"",multiple:!1,limit:1,"show-progress":!0,onSuccess:T=>E(s,T)},{default:i(()=>[o(a,{type:"primary",plain:"",size:"small"},{default:i(()=>[...t[2]||(t[2]=[n("上传视频",-1)])]),_:1})]),_:1},8,["onSuccess"])]),_:1}))]),_:1},8,["data"])),[[B,p.value]])])}}}),sa=q(X,[["__scopeId","data-v-78d5c9e4"]]);export{sa as default}; import{o as N,di as O,R as P,q as d,r as f,v as o,D as i,K as V,L as n,P as h,ac as D,O as w,bj as L,bk as j,T as u,s as y,bi as z,M as v}from"./.pnpm-C1KTa5cB.js";import M from"./RecordingPlaybackBlock-BLiZhM1Y.js";import{U as k}from"./index-CZyPOnHt.js";import{i as c,_ as q}from"./index-Cxx1IoGl.js";import{aj as K,ak as x,al as A}from"./tcm-DJJMkqKG.js";import"./RecordingVideoPlayer-ByTd0pZe.js";import"./file-D2AwthSZ.js";const F={class:"call-record-panel"},G={key:0,class:"call-record-toolbar"},H={class:"call-record-empty"},J={class:"call-record-empty__desc"},Q={key:0,class:"text-primary"},W={key:1,class:"text-gray-400"},X=N({__name:"CallRecordPanel",props:{diagnosisId:{},readOnly:{type:Boolean,default:!1}},setup(_,{expose:R}){const r=_,p=v(!1),g=v([]),U=O("toolbarUploadRef"),m=async()=>{if(r.diagnosisId){p.value=!0;try{g.value=await K({diagnosis_id:r.diagnosisId})||[]}catch(e){console.error(e),g.value=[]}finally{p.value=!1}}};P(()=>r.diagnosisId,()=>{m()},{immediate:!0}),R({refresh:m});function C(e){return{1:"进行中",2:"已结束",3:"未接听",4:"已取消"}[e]??"—"}async function S(e){const t=b(e);if(!t){c.msgError("上传成功但未返回视频地址");return}try{const a=await A({diagnosis_id:r.diagnosisId});await x({diagnosis_id:r.diagnosisId,call_record_id:Number((a==null?void 0:a.id)||0),file_url:t}),c.msgSuccess("视频回放上传成功"),await m()}catch(a){c.msgError((a==null?void 0:a.message)||"写入回放失败")}}async function E(e,t){const a=b(t);if(!a){c.msgError("上传成功但未返回视频地址");return}try{await x({diagnosis_id:r.diagnosisId,call_record_id:Number(e.id||0),file_url:a}),c.msgSuccess("视频回放上传成功"),await m()}catch(l){c.msgError((l==null?void 0:l.message)||"写入回放失败")}}function b(e){var t,a;return String(((t=e==null?void 0:e.data)==null?void 0:t.uri)||((a=e==null?void 0:e.data)==null?void 0:a.url)||"").trim()}return(e,t)=>{const a=V,l=j,I=L,B=z;return d(),f("div",F,[_.readOnly?h("",!0):(d(),f("div",G,[o(k,{ref_key:"toolbarUploadRef",ref:U,type:"video",direct:"",multiple:!1,limit:1,"show-progress":!0,onSuccess:S},{default:i(()=>[o(a,{type:"primary"},{default:i(()=>[...t[0]||(t[0]=[n("上传视频",-1)])]),_:1})]),_:1},512)])),D((d(),w(I,{data:g.value,border:"",stripe:""},{empty:i(()=>[y("div",H,[t[1]||(t[1]=y("div",{class:"call-record-empty__title"},"暂无通话记录",-1)),y("div",J,u(_.readOnly?"暂无录制回放数据。":"现在可以直接点击上方“上传视频”。系统会自动生成一条默认通话记录来承载回放。"),1)])]),default:i(()=>[o(l,{label:"录制回放","min-width":"320"},{default:i(({row:s})=>[o(M,{"record-id":s.id,urls:s.recording_urls_list},null,8,["record-id","urls"])]),_:1}),o(l,{label:"开始时间",width:"170",prop:"start_time_text"}),o(l,{label:"结束时间",width:"170",prop:"end_time_text"}),o(l,{label:"通话类型",width:"100"},{default:i(({row:s})=>[n(u(s.call_type===1?"语音":"视频"),1)]),_:1}),o(l,{label:"房间号",width:"180"},{default:i(({row:s})=>[s.room_id?(d(),f("span",Q,u(s.room_id),1)):(d(),f("span",W,"—"))]),_:1}),o(l,{label:"时长",width:"110",prop:"duration_text"}),o(l,{label:"状态",width:"90"},{default:i(({row:s})=>[n(u(C(s.status)),1)]),_:1}),o(l,{label:"录制",width:"100"},{default:i(({row:s})=>[n(u(s.recording_status_text||"—"),1)]),_:1}),_.readOnly?h("",!0):(d(),w(l,{key:0,label:"上传回放",width:"180"},{default:i(({row:s})=>[o(k,{type:"video",direct:"",multiple:!1,limit:1,"show-progress":!0,onSuccess:T=>E(s,T)},{default:i(()=>[o(a,{type:"primary",plain:"",size:"small"},{default:i(()=>[...t[2]||(t[2]=[n("上传视频",-1)])]),_:1})]),_:1},8,["onSuccess"])]),_:1}))]),_:1},8,["data"])),[[B,p.value]])])}}}),sa=q(X,[["__scopeId","data-v-78d5c9e4"]]);export{sa as default};
@@ -1 +1 @@
import{o as T,ap as V,R as I,q as o,r as l,v as a,K as N,D as i,L as c,P as k,ac as z,bi as M,u as p,O as f,bk as O,T as _,F as P,br as j,s as F,bj as R,bB as A,M as w}from"./.pnpm-CC7b2w5D.js";import{am as q}from"./tcm-CyNc7e6S.js";import{_ as H}from"./index-SornbJeu.js";const K={class:"case-record-list"},Y={key:0,class:"mb-3 flex justify-end"},G={key:0},J={key:1,class:"text-gray-400"},Q={class:"void-detail text-xs text-gray-500 mt-1"},U=T({__name:"CaseRecordList",props:{diagnosisId:{type:Number,default:0},readOnly:{type:Boolean,default:!1}},emits:["view","openPrescription"],setup(y,{expose:x,emit:C}){const m=y,b=C,r=w([]),d=w(!1),u=async()=>{if(m.diagnosisId){d.value=!0;try{const t=await q({diagnosis_id:m.diagnosisId});r.value=Array.isArray(t)?t:[]}catch(t){console.error("获取病历记录失败:",t),r.value=[]}finally{d.value=!1}}},S=t=>{if(!t)return"";const e=new Date(t*1e3);return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")} ${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}`},B=t=>{b("view",t)},$=()=>{b("openPrescription")};return V(()=>{u()}),I(()=>m.diagnosisId,()=>{u()}),x({refresh:u}),(t,e)=>{const h=N,n=O,v=j,E=R,D=A,L=M;return o(),l("div",K,[y.readOnly?k("",!0):(o(),l("div",Y,[a(h,{type:"primary",size:"small",onClick:$},{default:i(()=>[...e[0]||(e[0]=[c("开方",-1)])]),_:1})])),z((o(),f(E,{data:p(r),border:""},{default:i(()=>[a(n,{prop:"prescription_date",label:"就诊日期",width:"120"}),a(n,{prop:"visit_no",label:"门诊号",width:"120"}),a(n,{prop:"clinical_diagnosis",label:"临床诊断","min-width":"160","show-overflow-tooltip":""}),a(n,{label:"处方摘要","min-width":"180"},{default:i(({row:s})=>[s.herbs&&s.herbs.length?(o(),l("span",G,_(s.herbs.slice(0,3).map(g=>`${g.name}${g.dosage}`).join("、"))+_(s.herbs.length>3?"...":""),1)):(o(),l("span",J,"—"))]),_:1}),a(n,{prop:"doctor_name",label:"医师",width:"90","show-overflow-tooltip":""}),a(n,{label:"状态",width:"140",align:"center"},{default:i(({row:s})=>[s.void_status===1?(o(),l(P,{key:0},[a(v,{type:"danger",size:"small"},{default:i(()=>[...e[1]||(e[1]=[c("已作废",-1)])]),_:1}),F("div",Q,_(s.void_by_name||"—")+" "+_(S(s.void_time)),1)],64)):(o(),f(v,{key:1,type:"success",size:"small"},{default:i(()=>[...e[2]||(e[2]=[c("正常",-1)])]),_:1}))]),_:1}),a(n,{label:"操作",width:"120",fixed:"right"},{default:i(({row:s})=>[a(h,{link:"",type:"primary",size:"small",onClick:g=>B(s)},{default:i(()=>[...e[3]||(e[3]=[c(" 查看 ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[L,p(d)]]),!p(d)&&p(r).length===0?(o(),f(D,{key:1,description:"暂无病历记录,开方后会自动显示",class:"mt-4"})):k("",!0)])}}}),ee=H(U,[["__scopeId","data-v-043d2738"]]);export{ee as default}; import{o as T,ap as V,R as I,q as o,r as l,v as a,K as N,D as i,L as c,P as k,ac as z,bi as M,u as p,O as f,bk as O,T as _,F as P,br as j,s as F,bj as R,bB as A,M as w}from"./.pnpm-C1KTa5cB.js";import{am as q}from"./tcm-DJJMkqKG.js";import{_ as H}from"./index-Cxx1IoGl.js";const K={class:"case-record-list"},Y={key:0,class:"mb-3 flex justify-end"},G={key:0},J={key:1,class:"text-gray-400"},Q={class:"void-detail text-xs text-gray-500 mt-1"},U=T({__name:"CaseRecordList",props:{diagnosisId:{type:Number,default:0},readOnly:{type:Boolean,default:!1}},emits:["view","openPrescription"],setup(y,{expose:x,emit:C}){const m=y,b=C,r=w([]),d=w(!1),u=async()=>{if(m.diagnosisId){d.value=!0;try{const t=await q({diagnosis_id:m.diagnosisId});r.value=Array.isArray(t)?t:[]}catch(t){console.error("获取病历记录失败:",t),r.value=[]}finally{d.value=!1}}},S=t=>{if(!t)return"";const e=new Date(t*1e3);return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")} ${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}`},B=t=>{b("view",t)},$=()=>{b("openPrescription")};return V(()=>{u()}),I(()=>m.diagnosisId,()=>{u()}),x({refresh:u}),(t,e)=>{const h=N,n=O,v=j,E=R,D=A,L=M;return o(),l("div",K,[y.readOnly?k("",!0):(o(),l("div",Y,[a(h,{type:"primary",size:"small",onClick:$},{default:i(()=>[...e[0]||(e[0]=[c("开方",-1)])]),_:1})])),z((o(),f(E,{data:p(r),border:""},{default:i(()=>[a(n,{prop:"prescription_date",label:"就诊日期",width:"120"}),a(n,{prop:"visit_no",label:"门诊号",width:"120"}),a(n,{prop:"clinical_diagnosis",label:"临床诊断","min-width":"160","show-overflow-tooltip":""}),a(n,{label:"处方摘要","min-width":"180"},{default:i(({row:s})=>[s.herbs&&s.herbs.length?(o(),l("span",G,_(s.herbs.slice(0,3).map(g=>`${g.name}${g.dosage}`).join("、"))+_(s.herbs.length>3?"...":""),1)):(o(),l("span",J,"—"))]),_:1}),a(n,{prop:"doctor_name",label:"医师",width:"90","show-overflow-tooltip":""}),a(n,{label:"状态",width:"140",align:"center"},{default:i(({row:s})=>[s.void_status===1?(o(),l(P,{key:0},[a(v,{type:"danger",size:"small"},{default:i(()=>[...e[1]||(e[1]=[c("已作废",-1)])]),_:1}),F("div",Q,_(s.void_by_name||"—")+" "+_(S(s.void_time)),1)],64)):(o(),f(v,{key:1,type:"success",size:"small"},{default:i(()=>[...e[2]||(e[2]=[c("正常",-1)])]),_:1}))]),_:1}),a(n,{label:"操作",width:"120",fixed:"right"},{default:i(({row:s})=>[a(h,{link:"",type:"primary",size:"small",onClick:g=>B(s)},{default:i(()=>[...e[3]||(e[3]=[c(" 查看 ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[L,p(d)]]),!p(d)&&p(r).length===0?(o(),f(D,{key:1,description:"暂无病历记录,开方后会自动显示",class:"mt-4"})):k("",!0)])}}}),ee=H(U,[["__scopeId","data-v-043d2738"]]);export{ee as default};
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
import{_ as o}from"./GancaoSubmissionReconcileButton.vue_vue_type_script_setup_true_lang-0x2X0iXL.js";import"./.pnpm-CC7b2w5D.js";import"./tcm-CyNc7e6S.js";import"./index-SornbJeu.js";export{o as default};
@@ -0,0 +1 @@
import{_ as o}from"./GancaoSubmissionReconcileButton.vue_vue_type_script_setup_true_lang-CTGxGmsz.js";import"./.pnpm-C1KTa5cB.js";import"./tcm-DJJMkqKG.js";import"./index-Cxx1IoGl.js";export{o as default};
@@ -1 +1 @@
import{o as U,be as F,q as f,r as k,F as M,ac as D,O as E,D as t,L as u,K as G,v as r,bt as B,bh as q,b9 as P,aw as A,b6 as L,bc as T,bf as K,b7 as z,P as g,p as W,M as v,ba as $}from"./.pnpm-CC7b2w5D.js";import{p as j}from"./tcm-CyNc7e6S.js";import{i as C}from"./index-SornbJeu.js";const X=U({__name:"GancaoSubmissionReconcileButton",props:{order:{}},emits:["resolved"],setup(N,{emit:w}){const d=N,y=w,V=W(()=>{var m,p,a;const i=String(((m=d.order)==null?void 0:m.pharmacy_claim_target)||"").trim().toLowerCase(),e=String(((p=d.order)==null?void 0:p.pharmacy_claim_status)||"").trim().toUpperCase(),n=Number(((a=d.order)==null?void 0:a.pharmacy_claim_lease_expires_at)||0),c=e==="PENDING"&&n>0&&n<=Math.floor(Date.now()/1e3);return i==="gancao"&&(c||["UNKNOWN","PENDING_RECONCILE"].includes(e))}),s=v(!1),_=v(!1),o=$({resolution:"CONFIRM_SUCCESS",remote_order_no:"",note:""});function O(){o.resolution="CONFIRM_SUCCESS",o.remote_order_no="",o.note="",s.value=!0}async function b(){var e;const i=Number((e=d.order)==null?void 0:e.id);if(i){if(o.resolution==="CONFIRM_SUCCESS"&&!o.remote_order_no.trim()){C.msgError("请填写甘草药方单号");return}if(!o.note.trim()){C.msgError("请填写甘草后台核对依据");return}_.value=!0;try{await j({id:i,resolution:o.resolution,remote_order_no:o.resolution==="CONFIRM_SUCCESS"?o.remote_order_no.trim():"",note:o.note.trim()}),C.msgSuccess("甘草提交核对已记录"),s.value=!1,y("resolved")}catch{}finally{_.value=!1}}}return(i,e)=>{const n=G,c=q,m=K,p=T,a=L,S=z,R=P,x=B,I=F("perms");return V.value?(f(),k(M,{key:0},[D((f(),E(n,{type:"danger",size:"small",plain:"",onClick:O},{default:t(()=>[...e[5]||(e[5]=[u("核对甘草提交",-1)])]),_:1})),[[I,["tcm.prescriptionOrder/confirmGancaoSubmission"]]]),r(x,{modelValue:s.value,"onUpdate:modelValue":e[4]||(e[4]=l=>s.value=l),title:"人工核对甘草提交",width:"min(92vw, 520px)","append-to-body":"","destroy-on-close":"","close-on-click-modal":!1},{footer:t(()=>[r(n,{onClick:e[3]||(e[3]=l=>s.value=!1)},{default:t(()=>[...e[8]||(e[8]=[u("取消",-1)])]),_:1}),r(n,{type:"primary",loading:_.value,onClick:b},{default:t(()=>[...e[9]||(e[9]=[u("确认并记录",-1)])]),_:1},8,["loading"])]),default:t(()=>[r(c,{title:"请先在甘草后台核对。本操作会写入不可变更的审计记录。",type:"warning",closable:!1,"show-icon":"",class:"mb-4"}),r(R,{"label-width":"100px",onSubmit:A(b,["prevent"])},{default:t(()=>[r(a,{label:"核对结果",required:""},{default:t(()=>[r(p,{modelValue:o.resolution,"onUpdate:modelValue":e[0]||(e[0]=l=>o.resolution=l)},{default:t(()=>[r(m,{label:"CONFIRM_SUCCESS"},{default:t(()=>[...e[6]||(e[6]=[u("确认已创建",-1)])]),_:1}),r(m,{label:"CONFIRM_NOT_CREATED"},{default:t(()=>[...e[7]||(e[7]=[u("确认未创建",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),o.resolution==="CONFIRM_SUCCESS"?(f(),E(a,{key:0,label:"甘草单号",required:""},{default:t(()=>[r(S,{modelValue:o.remote_order_no,"onUpdate:modelValue":e[1]||(e[1]=l=>o.remote_order_no=l),maxlength:"64",clearable:""},null,8,["modelValue"])]),_:1})):g("",!0),r(a,{label:"核对依据",required:""},{default:t(()=>[r(S,{modelValue:o.note,"onUpdate:modelValue":e[2]||(e[2]=l=>o.note=l),type:"textarea",rows:3,maxlength:"1000","show-word-limit":"",placeholder:"例如:核对时间、甘草后台查询条件及结果"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue"])],64)):g("",!0)}}});export{X as _}; import{o as U,be as F,q as f,r as k,F as M,ac as D,O as E,D as t,L as u,K as G,v as r,bt as B,bh as q,b9 as P,aw as A,b6 as L,bc as T,bf as K,b7 as z,P as g,p as W,M as v,ba as $}from"./.pnpm-C1KTa5cB.js";import{p as j}from"./tcm-DJJMkqKG.js";import{i as C}from"./index-Cxx1IoGl.js";const X=U({__name:"GancaoSubmissionReconcileButton",props:{order:{}},emits:["resolved"],setup(N,{emit:w}){const d=N,y=w,V=W(()=>{var m,p,a;const i=String(((m=d.order)==null?void 0:m.pharmacy_claim_target)||"").trim().toLowerCase(),e=String(((p=d.order)==null?void 0:p.pharmacy_claim_status)||"").trim().toUpperCase(),n=Number(((a=d.order)==null?void 0:a.pharmacy_claim_lease_expires_at)||0),c=e==="PENDING"&&n>0&&n<=Math.floor(Date.now()/1e3);return i==="gancao"&&(c||["UNKNOWN","PENDING_RECONCILE"].includes(e))}),s=v(!1),_=v(!1),o=$({resolution:"CONFIRM_SUCCESS",remote_order_no:"",note:""});function O(){o.resolution="CONFIRM_SUCCESS",o.remote_order_no="",o.note="",s.value=!0}async function b(){var e;const i=Number((e=d.order)==null?void 0:e.id);if(i){if(o.resolution==="CONFIRM_SUCCESS"&&!o.remote_order_no.trim()){C.msgError("请填写甘草药方单号");return}if(!o.note.trim()){C.msgError("请填写甘草后台核对依据");return}_.value=!0;try{await j({id:i,resolution:o.resolution,remote_order_no:o.resolution==="CONFIRM_SUCCESS"?o.remote_order_no.trim():"",note:o.note.trim()}),C.msgSuccess("甘草提交核对已记录"),s.value=!1,y("resolved")}catch{}finally{_.value=!1}}}return(i,e)=>{const n=G,c=q,m=K,p=T,a=L,S=z,R=P,x=B,I=F("perms");return V.value?(f(),k(M,{key:0},[D((f(),E(n,{type:"danger",size:"small",plain:"",onClick:O},{default:t(()=>[...e[5]||(e[5]=[u("核对甘草提交",-1)])]),_:1})),[[I,["tcm.prescriptionOrder/confirmGancaoSubmission"]]]),r(x,{modelValue:s.value,"onUpdate:modelValue":e[4]||(e[4]=l=>s.value=l),title:"人工核对甘草提交",width:"min(92vw, 520px)","append-to-body":"","destroy-on-close":"","close-on-click-modal":!1},{footer:t(()=>[r(n,{onClick:e[3]||(e[3]=l=>s.value=!1)},{default:t(()=>[...e[8]||(e[8]=[u("取消",-1)])]),_:1}),r(n,{type:"primary",loading:_.value,onClick:b},{default:t(()=>[...e[9]||(e[9]=[u("确认并记录",-1)])]),_:1},8,["loading"])]),default:t(()=>[r(c,{title:"请先在甘草后台核对。本操作会写入不可变更的审计记录。",type:"warning",closable:!1,"show-icon":"",class:"mb-4"}),r(R,{"label-width":"100px",onSubmit:A(b,["prevent"])},{default:t(()=>[r(a,{label:"核对结果",required:""},{default:t(()=>[r(p,{modelValue:o.resolution,"onUpdate:modelValue":e[0]||(e[0]=l=>o.resolution=l)},{default:t(()=>[r(m,{label:"CONFIRM_SUCCESS"},{default:t(()=>[...e[6]||(e[6]=[u("确认已创建",-1)])]),_:1}),r(m,{label:"CONFIRM_NOT_CREATED"},{default:t(()=>[...e[7]||(e[7]=[u("确认未创建",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),o.resolution==="CONFIRM_SUCCESS"?(f(),E(a,{key:0,label:"甘草单号",required:""},{default:t(()=>[r(S,{modelValue:o.remote_order_no,"onUpdate:modelValue":e[1]||(e[1]=l=>o.remote_order_no=l),maxlength:"64",clearable:""},null,8,["modelValue"])]),_:1})):g("",!0),r(a,{label:"核对依据",required:""},{default:t(()=>[r(S,{modelValue:o.note,"onUpdate:modelValue":e[2]||(e[2]=l=>o.note=l),type:"textarea",rows:3,maxlength:"1000","show-word-limit":"",placeholder:"例如:核对时间、甘草后台查询条件及结果"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue"])],64)):g("",!0)}}});export{X as _};
@@ -1 +1 @@
import{o as F,R as q,q as t,r as n,v as i,D as c,s as o,L as _,bh as G,w as H,u as x,cV as $,K as j,by as J,ac as K,F as E,G as O,O as f,bB as W,P as v,bi as Q,M as m,p as U,ae as X,T as r,br as Z,aa as ee,bq as se,a8 as ae,E as C}from"./.pnpm-CC7b2w5D.js";import{d as te}from"./dayjs-o4qa-HO_.js";import{ar as ne,as as oe}from"./tcm-CyNc7e6S.js";import{p as re}from"./im-business-message-parse-CemYOgNU.js";import{_ as le}from"./index-SornbJeu.js";const ie={class:"im-chat-record-panel"},ce={class:"toolbar mb-3"},de={class:"chat-wrap"},_e={key:0,class:"chat-list"},ue={class:"meta"},fe={class:"name"},me={class:"time"},pe={class:"bubble"},ye={key:0,class:"friendly-text"},ge={class:"friendly-main"},ve={key:0,class:"friendly-sub"},he={key:1,class:"text-content"},we={key:2,class:"text-content"},be={key:3,class:"muted"},ke=F({__name:"ImChatRecordPanel",props:{diagnosisId:{}},setup(B,{expose:M}){const u=B,d=m(!1),p=m(!1),y=ae([]),L=m(""),g=m(""),D={text:"",image:"图片",file:"文件",sound:"语音",video:"视频",location:"位置",custom:"自定义",face:"表情",other:""},h=U(()=>y.value.map(e=>{const a=P(e);let l="";return a!=null&&a.tag?l=a.tag:l=D[e.msg_type]||(e.msg_type!=="other"?e.msg_type:""),{raw:e,friendly:a,tag:l}}));function N(e){if(e==null||!e)return"—";const a=e>1e12?Math.floor(e/1e3):e;return te.unix(a).format("YYYY-MM-DD HH:mm:ss")}function P(e){const a=(e.text||"").trim();if(!a)return null;const l=a.startsWith("{")&&(/\bbusinessID\b/.test(a)||/\bcmd\b/.test(a));return e.msg_type==="custom"||l?re(a):null}function R(e){return e.is_from_doctor?e.from_staff_name?`医生(${e.from_staff_name}`:"医生/员工":g.value?`患者(${g.value}`:"患者"}async function w(){if(u.diagnosisId){d.value=!0;try{const e=await ne({diagnosis_id:u.diagnosisId,only_archived:1});y.value=(e==null?void 0:e.lists)||[],L.value=(e==null?void 0:e.patient_im_id)||"",g.value=(e==null?void 0:e.patient_name)||""}catch(e){console.error(e),y.value=[]}finally{d.value=!1}}}function b(){w()}async function S(){if(u.diagnosisId){p.value=!0;try{await oe({diagnosis_id:u.diagnosisId}),C.success('已发起后台同步,几秒后请点击"重新加载已归档"查看新消息')}catch(e){console.error(e),C.error("发起同步失败")}finally{p.value=!1}}}return q(()=>u.diagnosisId,()=>{w()},{immediate:!0}),M({refresh:b}),(e,a)=>{const l=G,k=H,I=j,T=Z,V=ee,Y=se,z=W,A=Q;return t(),n("div",ie,[i(l,{type:"info","show-icon":"",closable:!1,class:"mb-4",title:"说明"},{default:c(()=>[...a[0]||(a[0]=[o("p",{class:"panel-tip"},[_(" 展示单聊记录:已合并患者 与 "),o("strong",null,"所有医生 / 医助账号"),_("分别产生的会话,按时间排序。 数据由后台定时任务从腾讯云 IM 漫游消息同步至本地归档;点击下方按钮可立即触发后台同步。 ")],-1)])]),_:1}),o("div",ce,[i(I,{type:"primary",link:"",loading:p.value,onClick:S},{default:c(()=>[i(k,{class:"mr-1"},{default:c(()=>[i(x($))]),_:1}),a[1]||(a[1]=_(" 同步最新(后台异步) ",-1))]),_:1},8,["loading"]),i(I,{type:"primary",link:"",loading:d.value,onClick:b},{default:c(()=>[i(k,{class:"mr-1"},{default:c(()=>[i(x(J))]),_:1}),a[2]||(a[2]=_(" 重新加载已归档 ",-1))]),_:1},8,["loading"])]),K((t(),n("div",de,[!d.value&&h.value.length?(t(),n("div",_e,[(t(!0),n(E,null,O(h.value,s=>(t(),n("div",{key:s.raw.msg_id,class:X(["chat-row",s.raw.is_from_doctor?"from-doctor":"from-patient"])},[o("div",ue,[o("span",fe,r(R(s.raw)),1),o("span",me,r(N(s.raw.time)),1),s.tag?(t(),f(T,{key:0,size:"small",type:"info",class:"ml-2"},{default:c(()=>[_(r(s.tag),1)]),_:2},1024)):v("",!0)]),o("div",pe,[s.raw.msg_type==="image"&&s.raw.image_url?(t(),f(V,{key:0,src:s.raw.image_url,"preview-src-list":[s.raw.image_url],fit:"contain",class:"chat-img"},null,8,["src","preview-src-list"])):(s.raw.msg_type==="file"||s.raw.msg_type==="sound"||s.raw.msg_type==="video")&&s.raw.file_url?(t(),f(Y,{key:1,href:s.raw.file_url,target:"_blank",type:"primary"},{default:c(()=>[_(r(s.raw.file_name||"打开文件"),1)]),_:2},1032,["href"])):(t(),n(E,{key:2},[s.friendly?(t(),n("div",ye,[o("div",ge,r(s.friendly.main),1),s.friendly.sub?(t(),n("div",ve,r(s.friendly.sub),1)):v("",!0)])):s.raw.msg_type==="text"&&s.raw.text?(t(),n("div",he,r(s.raw.text),1)):s.raw.text?(t(),n("div",we,r(s.raw.text),1)):(t(),n("span",be,"(无法展示该消息类型)"))],64))])],2))),128))])):d.value?v("",!0):(t(),f(z,{key:1,description:"暂无 IM 聊天记录"}))])),[[A,d.value]])])}}}),Me=le(ke,[["__scopeId","data-v-58b699dd"]]);export{Me as default}; import{o as F,R as q,q as t,r as n,v as i,D as c,s as o,L as _,bh as G,w as H,u as x,cV as $,K as j,by as J,ac as K,F as E,G as O,O as f,bB as W,P as v,bi as Q,M as m,p as U,ae as X,T as r,br as Z,aa as ee,bq as se,a8 as ae,E as C}from"./.pnpm-C1KTa5cB.js";import{d as te}from"./dayjs-DznSeB-q.js";import{ar as ne,as as oe}from"./tcm-DJJMkqKG.js";import{p as re}from"./im-business-message-parse-DXRL3M5q.js";import{_ as le}from"./index-Cxx1IoGl.js";const ie={class:"im-chat-record-panel"},ce={class:"toolbar mb-3"},de={class:"chat-wrap"},_e={key:0,class:"chat-list"},ue={class:"meta"},fe={class:"name"},me={class:"time"},pe={class:"bubble"},ye={key:0,class:"friendly-text"},ge={class:"friendly-main"},ve={key:0,class:"friendly-sub"},he={key:1,class:"text-content"},we={key:2,class:"text-content"},be={key:3,class:"muted"},ke=F({__name:"ImChatRecordPanel",props:{diagnosisId:{}},setup(B,{expose:M}){const u=B,d=m(!1),p=m(!1),y=ae([]),L=m(""),g=m(""),D={text:"",image:"图片",file:"文件",sound:"语音",video:"视频",location:"位置",custom:"自定义",face:"表情",other:""},h=U(()=>y.value.map(e=>{const a=P(e);let l="";return a!=null&&a.tag?l=a.tag:l=D[e.msg_type]||(e.msg_type!=="other"?e.msg_type:""),{raw:e,friendly:a,tag:l}}));function N(e){if(e==null||!e)return"—";const a=e>1e12?Math.floor(e/1e3):e;return te.unix(a).format("YYYY-MM-DD HH:mm:ss")}function P(e){const a=(e.text||"").trim();if(!a)return null;const l=a.startsWith("{")&&(/\bbusinessID\b/.test(a)||/\bcmd\b/.test(a));return e.msg_type==="custom"||l?re(a):null}function R(e){return e.is_from_doctor?e.from_staff_name?`医生(${e.from_staff_name}`:"医生/员工":g.value?`患者(${g.value}`:"患者"}async function w(){if(u.diagnosisId){d.value=!0;try{const e=await ne({diagnosis_id:u.diagnosisId,only_archived:1});y.value=(e==null?void 0:e.lists)||[],L.value=(e==null?void 0:e.patient_im_id)||"",g.value=(e==null?void 0:e.patient_name)||""}catch(e){console.error(e),y.value=[]}finally{d.value=!1}}}function b(){w()}async function S(){if(u.diagnosisId){p.value=!0;try{await oe({diagnosis_id:u.diagnosisId}),C.success('已发起后台同步,几秒后请点击"重新加载已归档"查看新消息')}catch(e){console.error(e),C.error("发起同步失败")}finally{p.value=!1}}}return q(()=>u.diagnosisId,()=>{w()},{immediate:!0}),M({refresh:b}),(e,a)=>{const l=G,k=H,I=j,T=Z,V=ee,Y=se,z=W,A=Q;return t(),n("div",ie,[i(l,{type:"info","show-icon":"",closable:!1,class:"mb-4",title:"说明"},{default:c(()=>[...a[0]||(a[0]=[o("p",{class:"panel-tip"},[_(" 展示单聊记录:已合并患者 与 "),o("strong",null,"所有医生 / 医助账号"),_("分别产生的会话,按时间排序。 数据由后台定时任务从腾讯云 IM 漫游消息同步至本地归档;点击下方按钮可立即触发后台同步。 ")],-1)])]),_:1}),o("div",ce,[i(I,{type:"primary",link:"",loading:p.value,onClick:S},{default:c(()=>[i(k,{class:"mr-1"},{default:c(()=>[i(x($))]),_:1}),a[1]||(a[1]=_(" 同步最新(后台异步) ",-1))]),_:1},8,["loading"]),i(I,{type:"primary",link:"",loading:d.value,onClick:b},{default:c(()=>[i(k,{class:"mr-1"},{default:c(()=>[i(x(J))]),_:1}),a[2]||(a[2]=_(" 重新加载已归档 ",-1))]),_:1},8,["loading"])]),K((t(),n("div",de,[!d.value&&h.value.length?(t(),n("div",_e,[(t(!0),n(E,null,O(h.value,s=>(t(),n("div",{key:s.raw.msg_id,class:X(["chat-row",s.raw.is_from_doctor?"from-doctor":"from-patient"])},[o("div",ue,[o("span",fe,r(R(s.raw)),1),o("span",me,r(N(s.raw.time)),1),s.tag?(t(),f(T,{key:0,size:"small",type:"info",class:"ml-2"},{default:c(()=>[_(r(s.tag),1)]),_:2},1024)):v("",!0)]),o("div",pe,[s.raw.msg_type==="image"&&s.raw.image_url?(t(),f(V,{key:0,src:s.raw.image_url,"preview-src-list":[s.raw.image_url],fit:"contain",class:"chat-img"},null,8,["src","preview-src-list"])):(s.raw.msg_type==="file"||s.raw.msg_type==="sound"||s.raw.msg_type==="video")&&s.raw.file_url?(t(),f(Y,{key:1,href:s.raw.file_url,target:"_blank",type:"primary"},{default:c(()=>[_(r(s.raw.file_name||"打开文件"),1)]),_:2},1032,["href"])):(t(),n(E,{key:2},[s.friendly?(t(),n("div",ye,[o("div",ge,r(s.friendly.main),1),s.friendly.sub?(t(),n("div",ve,r(s.friendly.sub),1)):v("",!0)])):s.raw.msg_type==="text"&&s.raw.text?(t(),n("div",he,r(s.raw.text),1)):s.raw.text?(t(),n("div",we,r(s.raw.text),1)):(t(),n("span",be,"(无法展示该消息类型)"))],64))])],2))),128))])):d.value?v("",!0):(t(),f(z,{key:1,description:"暂无 IM 聊天记录"}))])),[[A,d.value]])])}}}),Me=le(ke,[["__scopeId","data-v-58b699dd"]]);export{Me as default};
@@ -1 +1 @@
import{_ as m}from"./MediaSourceSelect.vue_vue_type_script_setup_true_lang-Ds8_XODJ.js";import"./.pnpm-CC7b2w5D.js";export{m as default}; import{_ as m}from"./MediaSourceSelect.vue_vue_type_script_setup_true_lang-E4oG3NCo.js";import"./.pnpm-C1KTa5cB.js";export{m as default};
@@ -1 +1 @@
import{o as g,q as n,O as s,D as V,r as C,F as v,G as h,bn as B,u as c,P as p,t as w,ae as S,bm as k,p as i}from"./.pnpm-CC7b2w5D.js";const z=g({__name:"MediaSourceSelect",props:{modelValue:{default:""},options:{},loading:{type:Boolean,default:!1},placeholder:{default:"请选择自媒体来源"},clearable:{type:Boolean,default:!0},filterable:{type:Boolean,default:!0},allowCreate:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},selectClass:{},selectStyle:{}},emits:["update:modelValue","change","visible-change"],setup(e,{emit:m}){const u=e,o=m,d=i(()=>(u.options||[]).map(l=>typeof l=="string"?{name:l}:{name:l.name,value:l.value})),f=i(()=>d.value.some(l=>l.name===u.modelValue)),b=l=>{o("visible-change",l)};return(l,t)=>{const r=B,y=k;return n(),s(y,{"model-value":e.modelValue,placeholder:e.placeholder,clearable:e.clearable,filterable:e.filterable,"allow-create":e.allowCreate,"default-first-option":e.allowCreate,disabled:e.disabled,loading:e.loading,class:S(e.selectClass),style:w(e.selectStyle),"onUpdate:modelValue":t[0]||(t[0]=a=>o("update:modelValue",a)),onChange:t[1]||(t[1]=a=>o("change",a)),onVisibleChange:b},{default:V(()=>[(n(!0),C(v,null,h(c(d),a=>(n(),s(r,{key:a.name,label:a.name,value:a.name},null,8,["label","value"]))),128)),e.modelValue&&!c(f)?(n(),s(r,{key:`__legacy_${e.modelValue}`,label:`${e.modelValue}(已停用)`,value:e.modelValue},null,8,["label","value"])):p("",!0)]),_:1},8,["model-value","placeholder","clearable","filterable","allow-create","default-first-option","disabled","loading","class","style"])}}});export{z as _}; import{o as g,q as n,O as s,D as V,r as C,F as v,G as h,bn as B,u as c,P as p,t as w,ae as S,bm as k,p as i}from"./.pnpm-C1KTa5cB.js";const z=g({__name:"MediaSourceSelect",props:{modelValue:{default:""},options:{},loading:{type:Boolean,default:!1},placeholder:{default:"请选择自媒体来源"},clearable:{type:Boolean,default:!0},filterable:{type:Boolean,default:!0},allowCreate:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},selectClass:{},selectStyle:{}},emits:["update:modelValue","change","visible-change"],setup(e,{emit:m}){const u=e,o=m,d=i(()=>(u.options||[]).map(l=>typeof l=="string"?{name:l}:{name:l.name,value:l.value})),f=i(()=>d.value.some(l=>l.name===u.modelValue)),b=l=>{o("visible-change",l)};return(l,t)=>{const r=B,y=k;return n(),s(y,{"model-value":e.modelValue,placeholder:e.placeholder,clearable:e.clearable,filterable:e.filterable,"allow-create":e.allowCreate,"default-first-option":e.allowCreate,disabled:e.disabled,loading:e.loading,class:S(e.selectClass),style:w(e.selectStyle),"onUpdate:modelValue":t[0]||(t[0]=a=>o("update:modelValue",a)),onChange:t[1]||(t[1]=a=>o("change",a)),onVisibleChange:b},{default:V(()=>[(n(!0),C(v,null,h(c(d),a=>(n(),s(r,{key:a.name,label:a.name,value:a.name},null,8,["label","value"]))),128)),e.modelValue&&!c(f)?(n(),s(r,{key:`__legacy_${e.modelValue}`,label:`${e.modelValue}(已停用)`,value:e.modelValue},null,8,["label","value"])):p("",!0)]),_:1},8,["model-value","placeholder","clearable","filterable","allow-create","default-first-option","disabled","loading","class","style"])}}});export{z as _};
@@ -1 +1 @@
import{o as S,q as a,r as l,ae as x,v as r,D as m,L as d,T as i,a0 as D,s as n,O as g,br as G,P as B,aa as K,u as v,bE as L,w as q,bF as A,bG as H,bH as O,F as P,K as U,p as u}from"./.pnpm-CC7b2w5D.js";import{t as j,_ as J}from"./index-SornbJeu.js";const Q={class:"msg-body"},R={class:"msg-meta"},W={class:"msg-sender"},X={class:"msg-time"},Y={key:0,class:"content-text"},Z={key:2,class:"content-pending"},ee=["src"],se={key:4,class:"content-pending"},te=["src"],ae={key:6,class:"content-pending"},ne={key:7,class:"content-file"},le={class:"file-meta"},ie=["title"],oe={class:"file-info"},ce={key:8,class:"content-fallback"},re={class:"fallback-title"},me={class:"fallback-desc"},ue=S({__name:"MessageBubble",props:{message:{}},setup(s){const o=s,w=u(()=>o.message.from_is_staff),c=u(()=>(o.message.media||[]).find(t=>t.status===1)??null),_=u(()=>{const e=o.message.from_profile;return e&&e.name||o.message.from_user}),z=u(()=>{const e=o.message.from_profile;return(e==null?void 0:e.avatar)||""}),F=u(()=>(_.value||"").slice(-2)||"?"),E=u(()=>{const e=o.message.msgtype;return e==="image"||e==="video"||e==="voice"?"bubble-media":e==="file"?"bubble-file":"bubble-text"}),C=u(()=>{switch(o.message.msgtype){case"link":return"[链接]";case"weapp":return"[小程序]";case"chatrecord":return"[聊天记录]";case"location":return"[位置]";case"card":return"[名片]";case"meeting":return"[会议]";case"docmsg":return"[文档]";case"mixed":return"[混合消息]";case"emotion":return"[表情]";default:return`[${o.message.msgtype}]`}});function M(e){return e?j(e*1e3,"mm-dd hh:MM"):""}function N(e){return e?e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:e<1024*1024*1024?`${(e/1024/1024).toFixed(2)} MB`:`${(e/1024/1024/1024).toFixed(2)} GB`:""}function $(e){window.open(e,"_blank","noopener")}return(e,t)=>{var k,y,p,h;const T=D,b=G,V=K,f=q,I=U;return a(),l("div",{class:x(["msg-bubble",{"is-staff":w.value}])},[r(T,{class:"msg-avatar",size:36,src:z.value},{default:m(()=>[d(i(F.value),1)]),_:1},8,["src"]),n("div",Q,[n("div",R,[n("span",W,i(_.value),1),n("span",X,i(M(s.message.send_time)),1),s.message.action==="recall"?(a(),g(b,{key:0,size:"small",type:"info"},{default:m(()=>[...t[1]||(t[1]=[d(" 已撤回 ",-1)])]),_:1})):B("",!0)]),n("div",{class:x(["msg-content",E.value])},[s.message.msgtype==="text"||s.message.msgtype==="markdown"?(a(),l("div",Y,i(s.message.content),1)):s.message.msgtype==="image"&&((k=c.value)!=null&&k.file_url)?(a(),g(V,{key:1,src:c.value.file_url,"preview-src-list":[c.value.file_url],fit:"contain",class:"content-image","hide-on-click-modal":""},null,8,["src","preview-src-list"])):s.message.msgtype==="image"?(a(),l("div",Z,[r(f,null,{default:m(()=>[r(v(L))]),_:1}),t[2]||(t[2]=n("span",null,"图片下载中…",-1))])):s.message.msgtype==="video"&&((y=c.value)!=null&&y.file_url)?(a(),l("video",{key:3,src:c.value.file_url,controls:"",class:"content-video"},null,8,ee)):s.message.msgtype==="video"?(a(),l("div",se,[r(f,null,{default:m(()=>[r(v(A))]),_:1}),t[3]||(t[3]=n("span",null,"视频下载中…",-1))])):s.message.msgtype==="voice"&&((p=c.value)!=null&&p.file_url)?(a(),l("audio",{key:5,src:c.value.file_url,controls:"",class:"content-audio"},null,8,te)):s.message.msgtype==="voice"?(a(),l("div",ae,[r(f,null,{default:m(()=>[r(v(H))]),_:1}),n("span",null,"语音下载中…("+i(s.message.play_length)+"s",1)])):s.message.msgtype==="file"?(a(),l("div",ne,[r(f,{size:24},{default:m(()=>[r(v(O))]),_:1}),n("div",le,[n("div",{class:"file-name",title:s.message.file_name},i(s.message.file_name||"未命名文件"),9,ie),n("div",oe,[d(i(N(s.message.file_size))+" ",1),s.message.file_ext?(a(),l(P,{key:0},[d("· "+i(s.message.file_ext),1)],64)):B("",!0)])]),(h=c.value)!=null&&h.file_url?(a(),g(I,{key:0,size:"small",type:"primary",link:"",onClick:t[0]||(t[0]=de=>$(c.value.file_url))},{default:m(()=>[...t[4]||(t[4]=[d(" 下载 ",-1)])]),_:1})):(a(),g(b,{key:1,size:"small",type:"info"},{default:m(()=>[...t[5]||(t[5]=[d("下载中…",-1)])]),_:1}))])):(a(),l("div",ce,[n("div",re,i(C.value),1),n("div",me,i(s.message.content),1)]))],2)])],2)}}}),ve=J(ue,[["__scopeId","data-v-b5ff1168"]]);export{ve as default}; import{o as S,q as a,r as l,ae as x,v as r,D as m,L as d,T as i,a0 as D,s as n,O as g,br as G,P as B,aa as K,u as v,bE as L,w as q,bF as A,bG as H,bH as O,F as P,K as U,p as u}from"./.pnpm-C1KTa5cB.js";import{t as j,_ as J}from"./index-Cxx1IoGl.js";const Q={class:"msg-body"},R={class:"msg-meta"},W={class:"msg-sender"},X={class:"msg-time"},Y={key:0,class:"content-text"},Z={key:2,class:"content-pending"},ee=["src"],se={key:4,class:"content-pending"},te=["src"],ae={key:6,class:"content-pending"},ne={key:7,class:"content-file"},le={class:"file-meta"},ie=["title"],oe={class:"file-info"},ce={key:8,class:"content-fallback"},re={class:"fallback-title"},me={class:"fallback-desc"},ue=S({__name:"MessageBubble",props:{message:{}},setup(s){const o=s,w=u(()=>o.message.from_is_staff),c=u(()=>(o.message.media||[]).find(t=>t.status===1)??null),_=u(()=>{const e=o.message.from_profile;return e&&e.name||o.message.from_user}),z=u(()=>{const e=o.message.from_profile;return(e==null?void 0:e.avatar)||""}),F=u(()=>(_.value||"").slice(-2)||"?"),E=u(()=>{const e=o.message.msgtype;return e==="image"||e==="video"||e==="voice"?"bubble-media":e==="file"?"bubble-file":"bubble-text"}),C=u(()=>{switch(o.message.msgtype){case"link":return"[链接]";case"weapp":return"[小程序]";case"chatrecord":return"[聊天记录]";case"location":return"[位置]";case"card":return"[名片]";case"meeting":return"[会议]";case"docmsg":return"[文档]";case"mixed":return"[混合消息]";case"emotion":return"[表情]";default:return`[${o.message.msgtype}]`}});function M(e){return e?j(e*1e3,"mm-dd hh:MM"):""}function N(e){return e?e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:e<1024*1024*1024?`${(e/1024/1024).toFixed(2)} MB`:`${(e/1024/1024/1024).toFixed(2)} GB`:""}function $(e){window.open(e,"_blank","noopener")}return(e,t)=>{var k,y,p,h;const T=D,b=G,V=K,f=q,I=U;return a(),l("div",{class:x(["msg-bubble",{"is-staff":w.value}])},[r(T,{class:"msg-avatar",size:36,src:z.value},{default:m(()=>[d(i(F.value),1)]),_:1},8,["src"]),n("div",Q,[n("div",R,[n("span",W,i(_.value),1),n("span",X,i(M(s.message.send_time)),1),s.message.action==="recall"?(a(),g(b,{key:0,size:"small",type:"info"},{default:m(()=>[...t[1]||(t[1]=[d(" 已撤回 ",-1)])]),_:1})):B("",!0)]),n("div",{class:x(["msg-content",E.value])},[s.message.msgtype==="text"||s.message.msgtype==="markdown"?(a(),l("div",Y,i(s.message.content),1)):s.message.msgtype==="image"&&((k=c.value)!=null&&k.file_url)?(a(),g(V,{key:1,src:c.value.file_url,"preview-src-list":[c.value.file_url],fit:"contain",class:"content-image","hide-on-click-modal":""},null,8,["src","preview-src-list"])):s.message.msgtype==="image"?(a(),l("div",Z,[r(f,null,{default:m(()=>[r(v(L))]),_:1}),t[2]||(t[2]=n("span",null,"图片下载中…",-1))])):s.message.msgtype==="video"&&((y=c.value)!=null&&y.file_url)?(a(),l("video",{key:3,src:c.value.file_url,controls:"",class:"content-video"},null,8,ee)):s.message.msgtype==="video"?(a(),l("div",se,[r(f,null,{default:m(()=>[r(v(A))]),_:1}),t[3]||(t[3]=n("span",null,"视频下载中…",-1))])):s.message.msgtype==="voice"&&((p=c.value)!=null&&p.file_url)?(a(),l("audio",{key:5,src:c.value.file_url,controls:"",class:"content-audio"},null,8,te)):s.message.msgtype==="voice"?(a(),l("div",ae,[r(f,null,{default:m(()=>[r(v(H))]),_:1}),n("span",null,"语音下载中…("+i(s.message.play_length)+"s",1)])):s.message.msgtype==="file"?(a(),l("div",ne,[r(f,{size:24},{default:m(()=>[r(v(O))]),_:1}),n("div",le,[n("div",{class:"file-name",title:s.message.file_name},i(s.message.file_name||"未命名文件"),9,ie),n("div",oe,[d(i(N(s.message.file_size))+" ",1),s.message.file_ext?(a(),l(P,{key:0},[d("· "+i(s.message.file_ext),1)],64)):B("",!0)])]),(h=c.value)!=null&&h.file_url?(a(),g(I,{key:0,size:"small",type:"primary",link:"",onClick:t[0]||(t[0]=de=>$(c.value.file_url))},{default:m(()=>[...t[4]||(t[4]=[d(" 下载 ",-1)])]),_:1})):(a(),g(b,{key:1,size:"small",type:"info"},{default:m(()=>[...t[5]||(t[5]=[d("下载中…",-1)])]),_:1}))])):(a(),l("div",ce,[n("div",re,i(C.value),1),n("div",me,i(s.message.content),1)]))],2)])],2)}}}),ve=J(ue,[["__scopeId","data-v-b5ff1168"]]);export{ve as default};
@@ -1,2 +1,2 @@
import{o as ie,R as oe,q as n,r as o,O as k,K as le,D as r,L as P,P as m,v as l,s as d,F as w,G as E,bB as ae,b7 as re,bt as de,p as ue,M as g,T as U,aa as me,u as V,d7 as z,aw as M,w as ce,bH as pe,e as ge}from"./.pnpm-CC7b2w5D.js";import{_ as fe}from"./picker-gGGrlx7D.js";import{e as ve,c as _e,i as f,_ as ye}from"./index-SornbJeu.js";import{a as T,d as he}from"./patient-BzQg6Kip.js";import{h as ke}from"./perm-DFYc57r7.js";import"./index-BfmIKXtC.js";import"./index-Bigk9abY.js";import"./index.vue_vue_type_script_setup_true_lang-DHXV5Zdc.js";import"./index-DP3bicdH.js";import"./index-DDHtrTz0.js";import"./file-BfK3TJqs.js";import"./index.vue_vue_type_script_setup_true_lang-CYjIL6rl.js";import"./usePaging-Cer8s1LR.js";const we={class:"note-timeline-wrap"},Ie={key:0,class:"timeline-actions"},Ce={class:"upload-trigger"},be={class:"upload-trigger"},xe={key:1,class:"note-timeline"},Ee={class:"timeline-date"},Ve={class:"timeline-body"},Ne={key:0,class:"timeline-content"},Se={key:1,class:"timeline-images"},De={key:2,class:"timeline-images"},Be={key:0,class:"thumb-wrap"},Ae={key:1,class:"file-wrap"},Pe=["href","title"],Ue={class:"file-name"},W=8e3,ze=ie({__name:"NoteTimeline",props:{notes:{},diagnosisId:{},readonly:{type:Boolean}},emits:["refresh"],setup(u,{emit:j}){const c=u,I=j,X=ue(()=>ke(["doctor.appointment/addDoctorNote"])),v=g(!1),C=g(""),N=g(!1),q=ve(),_=t=>q.getImageUrl(t),S=g([]),D=g([]),y=g(0),h=g(0),H=["jpg","jpeg","png","gif","bmp","webp","svg"],B=t=>{var i;const e=((i=t.split(".").pop())==null?void 0:i.toLowerCase().split("?")[0])||"";return H.includes(e)},$=t=>{var i;const e=t.split("/");return decodeURIComponent(((i=e[e.length-1])==null?void 0:i.split("?")[0])||"文件")},K=t=>t.filter(B).map(_),Z=(t,e)=>{const i=t.filter(B),b=t[e];return i.indexOf(b)},J=t=>t?t.split(` import{o as ie,R as oe,q as n,r as o,O as k,K as le,D as r,L as P,P as m,v as l,s as d,F as w,G as E,bB as ae,b7 as re,bt as de,p as ue,M as g,T as U,aa as me,u as V,d7 as z,aw as M,w as ce,bH as pe,e as ge}from"./.pnpm-C1KTa5cB.js";import{_ as fe}from"./picker-CNX2EN3u.js";import{e as ve,c as _e,i as f,_ as ye}from"./index-Cxx1IoGl.js";import{a as T,d as he}from"./patient-BpamRx-E.js";import{h as ke}from"./perm-CZ2bIVzs.js";import"./index-B3Fu5tec.js";import"./index-BhA3CyxZ.js";import"./index.vue_vue_type_script_setup_true_lang-CerDQAzd.js";import"./index-B-rCQZ_o.js";import"./index-CZyPOnHt.js";import"./file-D2AwthSZ.js";import"./index.vue_vue_type_script_setup_true_lang-0C3mdvgv.js";import"./usePaging--aAVZOna.js";const we={class:"note-timeline-wrap"},Ie={key:0,class:"timeline-actions"},Ce={class:"upload-trigger"},be={class:"upload-trigger"},xe={key:1,class:"note-timeline"},Ee={class:"timeline-date"},Ve={class:"timeline-body"},Ne={key:0,class:"timeline-content"},Se={key:1,class:"timeline-images"},De={key:2,class:"timeline-images"},Be={key:0,class:"thumb-wrap"},Ae={key:1,class:"file-wrap"},Pe=["href","title"],Ue={class:"file-name"},W=8e3,ze=ie({__name:"NoteTimeline",props:{notes:{},diagnosisId:{},readonly:{type:Boolean}},emits:["refresh"],setup(u,{emit:j}){const c=u,I=j,X=ue(()=>ke(["doctor.appointment/addDoctorNote"])),v=g(!1),C=g(""),N=g(!1),q=ve(),_=t=>q.getImageUrl(t),S=g([]),D=g([]),y=g(0),h=g(0),H=["jpg","jpeg","png","gif","bmp","webp","svg"],B=t=>{var i;const e=((i=t.split(".").pop())==null?void 0:i.toLowerCase().split("?")[0])||"";return H.includes(e)},$=t=>{var i;const e=t.split("/");return decodeURIComponent(((i=e[e.length-1])==null?void 0:i.split("?")[0])||"文件")},K=t=>t.filter(B).map(_),Z=(t,e)=>{const i=t.filter(B),b=t[e];return i.indexOf(b)},J=t=>t?t.split(`
`).filter(Boolean):[],Q=t=>{if(!c.diagnosisId)return;const e=Array.isArray(t)?t:[t];if(e.length<=y.value){y.value=e.length;return}const i=e.slice(y.value);y.value=e.length,i.length>0&&T({diagnosis_id:c.diagnosisId,tongue_images:i}).then(()=>{f.msgSuccess("舌苔照片已添加"),I("refresh")})},Y=t=>{if(!c.diagnosisId)return;const e=Array.isArray(t)?t:[t];if(e.length<=h.value){h.value=e.length;return}const i=e.slice(h.value);h.value=e.length,i.length>0&&T({diagnosis_id:c.diagnosisId,report_files:i}).then(()=>{f.msgSuccess("检查报告已添加"),I("refresh")})};oe(()=>c.notes,()=>{S.value=[],D.value=[],y.value=0,h.value=0});const ee=async()=>{if(!c.diagnosisId){f.msgWarning("当前无诊单,无法添加备注");return}const t=C.value.trim();if(!t){f.msgWarning("请输入备注内容");return}N.value=!0;try{await T({diagnosis_id:c.diagnosisId,content:t}),f.msgSuccess("备注保存成功"),C.value="",v.value=!1,I("refresh")}catch(e){f.msgError((e==null?void 0:e.message)||"保存失败")}finally{N.value=!1}},A=async(t,e,i)=>{try{await ge.confirm("确认删除?","提示",{type:"warning"})}catch{return}await he({note_id:t,image_type:e,image_path:i}),f.msgSuccess("已删除"),I("refresh")};return(t,e)=>{const i=le,b=_e,F=fe,L=me,x=ce,te=ae,se=re,ne=de;return n(),o("div",we,[!u.readonly&&u.diagnosisId?(n(),o("div",Ie,[X.value?(n(),k(i,{key:0,type:"primary",plain:"",size:"small",onClick:e[0]||(e[0]=s=>v.value=!0)},{default:r(()=>[...e[6]||(e[6]=[P(" 添加备注 ",-1)])]),_:1})):m("",!0),l(F,{modelValue:S.value,"onUpdate:modelValue":e[1]||(e[1]=s=>S.value=s),limit:99,type:"image","exclude-domain":!0,onChange:Q},{upload:r(()=>[d("div",Ce,[l(b,{size:20,name:"el-icon-Plus"}),e[7]||(e[7]=d("span",null,"舌苔照片",-1))])]),_:1},8,["modelValue"]),l(F,{modelValue:D.value,"onUpdate:modelValue":e[2]||(e[2]=s=>D.value=s),limit:99,type:"file","exclude-domain":!0,onChange:Y},{upload:r(()=>[d("div",be,[l(b,{size:20,name:"el-icon-Plus"}),e[8]||(e[8]=d("span",null,"检查报告",-1))])]),_:1},8,["modelValue"])])):m("",!0),u.notes.length?(n(),o("div",xe,[(n(!0),o(w,null,E(u.notes,s=>{var R,G;return n(),o("div",{key:s.id,class:"timeline-node"},[e[11]||(e[11]=d("div",{class:"timeline-dot"},null,-1)),d("div",Ee,U(s.note_date),1),d("div",Ve,[s.content?(n(),o("div",Ne,[(n(!0),o(w,null,E(J(s.content),(a,p)=>(n(),o("div",{key:p,class:"content-line"},U(a),1))),128))])):m("",!0),(R=s.tongue_images)!=null&&R.length?(n(),o("div",Se,[e[9]||(e[9]=d("span",{class:"images-label"},"舌苔照片",-1)),(n(!0),o(w,null,E(s.tongue_images,(a,p)=>(n(),o("div",{key:p,class:"thumb-wrap"},[l(L,{src:_(a),"preview-src-list":s.tongue_images.map(_),"initial-index":p,"z-index":W,fit:"cover",class:"timeline-thumb","preview-teleported":""},null,8,["src","preview-src-list","initial-index"]),u.readonly?m("",!0):(n(),k(x,{key:0,class:"thumb-delete",onClick:M(O=>A(s.id,"tongue_images",a),["stop"])},{default:r(()=>[l(V(z))]),_:1},8,["onClick"]))]))),128))])):m("",!0),(G=s.report_files)!=null&&G.length?(n(),o("div",De,[e[10]||(e[10]=d("span",{class:"images-label"},"检查报告",-1)),(n(!0),o(w,null,E(s.report_files,(a,p)=>(n(),o(w,{key:p},[B(a)?(n(),o("div",Be,[l(L,{src:_(a),"preview-src-list":K(s.report_files),"initial-index":Z(s.report_files,p),"z-index":W,fit:"cover",class:"timeline-thumb","preview-teleported":""},null,8,["src","preview-src-list","initial-index"]),u.readonly?m("",!0):(n(),k(x,{key:0,class:"thumb-delete",onClick:M(O=>A(s.id,"report_files",a),["stop"])},{default:r(()=>[l(V(z))]),_:1},8,["onClick"]))])):(n(),o("div",Ae,[d("a",{href:_(a),target:"_blank",class:"file-link",title:$(a)},[l(x,{size:20},{default:r(()=>[l(V(pe))]),_:1}),d("span",Ue,U($(a)),1)],8,Pe),u.readonly?m("",!0):(n(),k(x,{key:0,class:"file-delete",onClick:M(O=>A(s.id,"report_files",a),["stop"])},{default:r(()=>[l(V(z))]),_:1},8,["onClick"]))]))],64))),128))])):m("",!0)])])}),128))])):m("",!0),!u.notes.length&&u.readonly?(n(),k(te,{key:2,description:"暂无备注","image-size":48})):m("",!0),l(ne,{modelValue:v.value,"onUpdate:modelValue":e[5]||(e[5]=s=>v.value=s),title:"添加备注",width:"480px","append-to-body":""},{footer:r(()=>[l(i,{onClick:e[4]||(e[4]=s=>v.value=!1)},{default:r(()=>[...e[12]||(e[12]=[P("取消",-1)])]),_:1}),l(i,{type:"primary",loading:N.value,onClick:ee},{default:r(()=>[...e[13]||(e[13]=[P("保存",-1)])]),_:1},8,["loading"])]),default:r(()=>[l(se,{modelValue:C.value,"onUpdate:modelValue":e[3]||(e[3]=s=>C.value=s),type:"textarea",rows:4,placeholder:"输入今日备注...",maxlength:"500","show-word-limit":""},null,8,["modelValue"])]),_:1},8,["modelValue"])])}}}),Ke=ye(ze,[["__scopeId","data-v-530ad386"]]);export{Ke as default}; `).filter(Boolean):[],Q=t=>{if(!c.diagnosisId)return;const e=Array.isArray(t)?t:[t];if(e.length<=y.value){y.value=e.length;return}const i=e.slice(y.value);y.value=e.length,i.length>0&&T({diagnosis_id:c.diagnosisId,tongue_images:i}).then(()=>{f.msgSuccess("舌苔照片已添加"),I("refresh")})},Y=t=>{if(!c.diagnosisId)return;const e=Array.isArray(t)?t:[t];if(e.length<=h.value){h.value=e.length;return}const i=e.slice(h.value);h.value=e.length,i.length>0&&T({diagnosis_id:c.diagnosisId,report_files:i}).then(()=>{f.msgSuccess("检查报告已添加"),I("refresh")})};oe(()=>c.notes,()=>{S.value=[],D.value=[],y.value=0,h.value=0});const ee=async()=>{if(!c.diagnosisId){f.msgWarning("当前无诊单,无法添加备注");return}const t=C.value.trim();if(!t){f.msgWarning("请输入备注内容");return}N.value=!0;try{await T({diagnosis_id:c.diagnosisId,content:t}),f.msgSuccess("备注保存成功"),C.value="",v.value=!1,I("refresh")}catch(e){f.msgError((e==null?void 0:e.message)||"保存失败")}finally{N.value=!1}},A=async(t,e,i)=>{try{await ge.confirm("确认删除?","提示",{type:"warning"})}catch{return}await he({note_id:t,image_type:e,image_path:i}),f.msgSuccess("已删除"),I("refresh")};return(t,e)=>{const i=le,b=_e,F=fe,L=me,x=ce,te=ae,se=re,ne=de;return n(),o("div",we,[!u.readonly&&u.diagnosisId?(n(),o("div",Ie,[X.value?(n(),k(i,{key:0,type:"primary",plain:"",size:"small",onClick:e[0]||(e[0]=s=>v.value=!0)},{default:r(()=>[...e[6]||(e[6]=[P(" 添加备注 ",-1)])]),_:1})):m("",!0),l(F,{modelValue:S.value,"onUpdate:modelValue":e[1]||(e[1]=s=>S.value=s),limit:99,type:"image","exclude-domain":!0,onChange:Q},{upload:r(()=>[d("div",Ce,[l(b,{size:20,name:"el-icon-Plus"}),e[7]||(e[7]=d("span",null,"舌苔照片",-1))])]),_:1},8,["modelValue"]),l(F,{modelValue:D.value,"onUpdate:modelValue":e[2]||(e[2]=s=>D.value=s),limit:99,type:"file","exclude-domain":!0,onChange:Y},{upload:r(()=>[d("div",be,[l(b,{size:20,name:"el-icon-Plus"}),e[8]||(e[8]=d("span",null,"检查报告",-1))])]),_:1},8,["modelValue"])])):m("",!0),u.notes.length?(n(),o("div",xe,[(n(!0),o(w,null,E(u.notes,s=>{var R,G;return n(),o("div",{key:s.id,class:"timeline-node"},[e[11]||(e[11]=d("div",{class:"timeline-dot"},null,-1)),d("div",Ee,U(s.note_date),1),d("div",Ve,[s.content?(n(),o("div",Ne,[(n(!0),o(w,null,E(J(s.content),(a,p)=>(n(),o("div",{key:p,class:"content-line"},U(a),1))),128))])):m("",!0),(R=s.tongue_images)!=null&&R.length?(n(),o("div",Se,[e[9]||(e[9]=d("span",{class:"images-label"},"舌苔照片",-1)),(n(!0),o(w,null,E(s.tongue_images,(a,p)=>(n(),o("div",{key:p,class:"thumb-wrap"},[l(L,{src:_(a),"preview-src-list":s.tongue_images.map(_),"initial-index":p,"z-index":W,fit:"cover",class:"timeline-thumb","preview-teleported":""},null,8,["src","preview-src-list","initial-index"]),u.readonly?m("",!0):(n(),k(x,{key:0,class:"thumb-delete",onClick:M(O=>A(s.id,"tongue_images",a),["stop"])},{default:r(()=>[l(V(z))]),_:1},8,["onClick"]))]))),128))])):m("",!0),(G=s.report_files)!=null&&G.length?(n(),o("div",De,[e[10]||(e[10]=d("span",{class:"images-label"},"检查报告",-1)),(n(!0),o(w,null,E(s.report_files,(a,p)=>(n(),o(w,{key:p},[B(a)?(n(),o("div",Be,[l(L,{src:_(a),"preview-src-list":K(s.report_files),"initial-index":Z(s.report_files,p),"z-index":W,fit:"cover",class:"timeline-thumb","preview-teleported":""},null,8,["src","preview-src-list","initial-index"]),u.readonly?m("",!0):(n(),k(x,{key:0,class:"thumb-delete",onClick:M(O=>A(s.id,"report_files",a),["stop"])},{default:r(()=>[l(V(z))]),_:1},8,["onClick"]))])):(n(),o("div",Ae,[d("a",{href:_(a),target:"_blank",class:"file-link",title:$(a)},[l(x,{size:20},{default:r(()=>[l(V(pe))]),_:1}),d("span",Ue,U($(a)),1)],8,Pe),u.readonly?m("",!0):(n(),k(x,{key:0,class:"file-delete",onClick:M(O=>A(s.id,"report_files",a),["stop"])},{default:r(()=>[l(V(z))]),_:1},8,["onClick"]))]))],64))),128))])):m("",!0)])])}),128))])):m("",!0),!u.notes.length&&u.readonly?(n(),k(te,{key:2,description:"暂无备注","image-size":48})):m("",!0),l(ne,{modelValue:v.value,"onUpdate:modelValue":e[5]||(e[5]=s=>v.value=s),title:"添加备注",width:"480px","append-to-body":""},{footer:r(()=>[l(i,{onClick:e[4]||(e[4]=s=>v.value=!1)},{default:r(()=>[...e[12]||(e[12]=[P("取消",-1)])]),_:1}),l(i,{type:"primary",loading:N.value,onClick:ee},{default:r(()=>[...e[13]||(e[13]=[P("保存",-1)])]),_:1},8,["loading"])]),default:r(()=>[l(se,{modelValue:C.value,"onUpdate:modelValue":e[3]||(e[3]=s=>C.value=s),type:"textarea",rows:4,placeholder:"输入今日备注...",maxlength:"500","show-word-limit":""},null,8,["modelValue"])]),_:1},8,["modelValue"])])}}}),Ke=ye(ze,[["__scopeId","data-v-530ad386"]]);export{Ke as default};
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{m as I,f as p,a as w}from"./diag-display-DCz_VAqj.js";import{o as y,q as x,r as B,s as e,T as a,u as i,P as N}from"./.pnpm-CC7b2w5D.js";import{_ as V}from"./index-SornbJeu.js";const b={class:"card patient-card"},q={class:"patient-hero"},D={class:"patient-name"},E={class:"patient-meta"},G={key:0},S=y({__name:"PatientInfoCard",props:{apt:{default:()=>({})},diag:{default:()=>({})}},setup(t){return(T,n)=>{var d,s,o,c,m,l,r,g,u,f,h,v,k,P,C;return x(),B("div",b,[n[0]||(n[0]=e("div",{class:"card-title"},"患者信息",-1)),e("div",q,[e("div",D,a(((d=t.apt)==null?void 0:d.patient_name)||"—"),1),e("div",E,[e("div",null,a(i(I)((s=t.apt)==null?void 0:s.patient_phone))+" · "+a(i(p)((o=t.diag)==null?void 0:o.gender))+" · "+a(((c=t.diag)==null?void 0:c.age)!=null?t.diag.age+"岁":"—"),1),e("div",null,a((m=t.diag)!=null&&m.height?t.diag.height+"cm":"—")+" / "+a((l=t.diag)!=null&&l.weight?t.diag.weight+"kg":"—")+" · "+a(((r=t.diag)==null?void 0:r.region)||"—"),1),e("div",null," 预约:"+a((g=t.apt)==null?void 0:g.appointment_date)+" "+a((u=t.apt)==null?void 0:u.appointment_time)+" · "+a(i(w)((f=t.apt)==null?void 0:f.period)),1),e("div",null,"医生:"+a(((h=t.apt)==null?void 0:h.doctor_name)||"—")+" 客服:"+a(((v=t.apt)==null?void 0:v.assistant_name)||"—"),1),e("div",null," 状态:"+a(((k=t.apt)==null?void 0:k.status_desc)||"—")+" · "+a((P=t.apt)!=null&&P.has_prescription?"已开方":"未开方"),1),(C=t.apt)!=null&&C.remark?(x(),B("div",G,"备注:"+a(t.apt.remark),1)):N("",!0)])])])}}}),F=V(S,[["__scopeId","data-v-1b0de09c"]]);export{F as default}; import{m as I,f as p,a as w}from"./diag-display-DCz_VAqj.js";import{o as y,q as x,r as B,s as e,T as a,u as i,P as N}from"./.pnpm-C1KTa5cB.js";import{_ as V}from"./index-Cxx1IoGl.js";const b={class:"card patient-card"},q={class:"patient-hero"},D={class:"patient-name"},E={class:"patient-meta"},G={key:0},S=y({__name:"PatientInfoCard",props:{apt:{default:()=>({})},diag:{default:()=>({})}},setup(t){return(T,n)=>{var d,s,o,c,m,l,r,g,u,f,h,v,k,P,C;return x(),B("div",b,[n[0]||(n[0]=e("div",{class:"card-title"},"患者信息",-1)),e("div",q,[e("div",D,a(((d=t.apt)==null?void 0:d.patient_name)||"—"),1),e("div",E,[e("div",null,a(i(I)((s=t.apt)==null?void 0:s.patient_phone))+" · "+a(i(p)((o=t.diag)==null?void 0:o.gender))+" · "+a(((c=t.diag)==null?void 0:c.age)!=null?t.diag.age+"岁":"—"),1),e("div",null,a((m=t.diag)!=null&&m.height?t.diag.height+"cm":"—")+" / "+a((l=t.diag)!=null&&l.weight?t.diag.weight+"kg":"—")+" · "+a(((r=t.diag)==null?void 0:r.region)||"—"),1),e("div",null," 预约:"+a((g=t.apt)==null?void 0:g.appointment_date)+" "+a((u=t.apt)==null?void 0:u.appointment_time)+" · "+a(i(w)((f=t.apt)==null?void 0:f.period)),1),e("div",null,"医生:"+a(((h=t.apt)==null?void 0:h.doctor_name)||"—")+" 客服:"+a(((v=t.apt)==null?void 0:v.assistant_name)||"—"),1),e("div",null," 状态:"+a(((k=t.apt)==null?void 0:k.status_desc)||"—")+" · "+a((P=t.apt)!=null&&P.has_prescription?"已开方":"未开方"),1),(C=t.apt)!=null&&C.remark?(x(),B("div",G,"备注:"+a(t.apt.remark),1)):N("",!0)])])])}}}),F=V(S,[["__scopeId","data-v-1b0de09c"]]);export{F as default};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{o as L,q as i,r as c,s as d,F as v,O as m,bq as q,D as _,L as k,P as y,G as B,p as f,T as w}from"./.pnpm-CC7b2w5D.js";import H from"./RecordingVideoPlayer-BQTd_gWd.js";import{e as I,_ as P}from"./index-SornbJeu.js";const R={key:0,class:"recording-list"},C={class:"recording-item"},V={key:1,class:"recording-alternates"},N={class:"recording-alternates__links"},D={key:1,class:"text-gray-400"},E=L({__name:"RecordingPlaybackBlock",props:{recordId:{},urls:{}},setup(l){const $=l,h=I(),u=f(()=>{const e=$.urls||[],t=new Set,r=[];for(const o of e){const s=String(o??"").trim();!s||t.has(s)||(t.add(s),r.push(s))}return r}),a=f(()=>{const e=u.value;if(!e.length)return null;const t=e.find(n=>/\.mp4(\?|#|$)/i.test(n));if(t)return t;const r=e.find(n=>/\.m3u8(\?|#|$)/i.test(n)&&/vod-qcloud\.com/i.test(n));if(r)return r;const o=e.find(n=>/\.m3u8(\?|#|$)/i.test(n)&&/\.cos\.[^/]+\.myqcloud\.com/i.test(n));if(o)return o;const s=e.find(n=>/\.m3u8(\?|#|$)/i.test(n));return s||e[0]}),p=f(()=>{const e=u.value,t=a.value;return t?e.filter(r=>r!==t):e.slice(1)});function b(e){if(!e||typeof e!="string")return!1;const t=e.trim();return/^https?:\/\//i.test(t)?/\.(mp4|webm|ogg|mov|mkv|m4v|m3u8)(\?|#|$)/i.test(t):/\.(mp4|webm|ogg|mov|mkv|m4v|m3u8)(\?|#|$)/i.test(t)||t.startsWith("/uploads/")}function g(e){return h.getImageUrl(String(e||"").trim())}function S(e,t){const r=e.trim();return/\.mp4(\?|#|$)/i.test(r)?`MP4 ${t+1}`:/vod-qcloud\.com/i.test(r)&&/\.m3u8/i.test(r)?`点播 ${t+1}`:/\.cos\.[^/]+\.myqcloud\.com/i.test(r)&&/\.m3u8/i.test(r)?`COS HLS ${t+1}`:/\.m3u8/i.test(r)?`HLS ${t+1}`:`链接 ${t+1}`}return(e,t)=>{const r=q;return u.value.length?(i(),c("div",R,[d("div",C,[a.value?(i(),c(v,{key:0},[b(a.value)?(i(),m(H,{key:`${l.recordId}-${a.value}`,src:a.value},null,8,["src"])):(i(),m(r,{key:1,href:g(a.value),target:"_blank",type:"primary"},{default:_(()=>[...t[0]||(t[0]=[k(" 打开回放 ",-1)])]),_:1},8,["href"]))],64)):y("",!0),p.value.length?(i(),c("div",V,[t[1]||(t[1]=d("span",{class:"recording-alternates__label"},"备用地址",-1)),d("div",N,[(i(!0),c(v,null,B(p.value,(o,s)=>(i(),m(r,{key:`${l.recordId}-alt-${s}-${o.slice(-32)}`,href:g(o),target:"_blank",type:"primary",class:"recording-alternates__link"},{default:_(()=>[k(w(S(o,s)),1)]),_:2},1032,["href"]))),128))])])):y("",!0)])])):(i(),c("span",D,"暂无"))}}}),x=P(E,[["__scopeId","data-v-d67b2e91"]]);export{x as default}; import{o as L,q as i,r as c,s as d,F as v,O as m,bq as q,D as _,L as k,P as y,G as B,p as f,T as w}from"./.pnpm-C1KTa5cB.js";import H from"./RecordingVideoPlayer-ByTd0pZe.js";import{e as I,_ as P}from"./index-Cxx1IoGl.js";const R={key:0,class:"recording-list"},C={class:"recording-item"},V={key:1,class:"recording-alternates"},N={class:"recording-alternates__links"},D={key:1,class:"text-gray-400"},E=L({__name:"RecordingPlaybackBlock",props:{recordId:{},urls:{}},setup(l){const $=l,h=I(),u=f(()=>{const e=$.urls||[],t=new Set,r=[];for(const o of e){const s=String(o??"").trim();!s||t.has(s)||(t.add(s),r.push(s))}return r}),a=f(()=>{const e=u.value;if(!e.length)return null;const t=e.find(n=>/\.mp4(\?|#|$)/i.test(n));if(t)return t;const r=e.find(n=>/\.m3u8(\?|#|$)/i.test(n)&&/vod-qcloud\.com/i.test(n));if(r)return r;const o=e.find(n=>/\.m3u8(\?|#|$)/i.test(n)&&/\.cos\.[^/]+\.myqcloud\.com/i.test(n));if(o)return o;const s=e.find(n=>/\.m3u8(\?|#|$)/i.test(n));return s||e[0]}),p=f(()=>{const e=u.value,t=a.value;return t?e.filter(r=>r!==t):e.slice(1)});function b(e){if(!e||typeof e!="string")return!1;const t=e.trim();return/^https?:\/\//i.test(t)?/\.(mp4|webm|ogg|mov|mkv|m4v|m3u8)(\?|#|$)/i.test(t):/\.(mp4|webm|ogg|mov|mkv|m4v|m3u8)(\?|#|$)/i.test(t)||t.startsWith("/uploads/")}function g(e){return h.getImageUrl(String(e||"").trim())}function S(e,t){const r=e.trim();return/\.mp4(\?|#|$)/i.test(r)?`MP4 ${t+1}`:/vod-qcloud\.com/i.test(r)&&/\.m3u8/i.test(r)?`点播 ${t+1}`:/\.cos\.[^/]+\.myqcloud\.com/i.test(r)&&/\.m3u8/i.test(r)?`COS HLS ${t+1}`:/\.m3u8/i.test(r)?`HLS ${t+1}`:`链接 ${t+1}`}return(e,t)=>{const r=q;return u.value.length?(i(),c("div",R,[d("div",C,[a.value?(i(),c(v,{key:0},[b(a.value)?(i(),m(H,{key:`${l.recordId}-${a.value}`,src:a.value},null,8,["src"])):(i(),m(r,{key:1,href:g(a.value),target:"_blank",type:"primary"},{default:_(()=>[...t[0]||(t[0]=[k(" 打开回放 ",-1)])]),_:1},8,["href"]))],64)):y("",!0),p.value.length?(i(),c("div",V,[t[1]||(t[1]=d("span",{class:"recording-alternates__label"},"备用地址",-1)),d("div",N,[(i(!0),c(v,null,B(p.value,(o,s)=>(i(),m(r,{key:`${l.recordId}-alt-${s}-${o.slice(-32)}`,href:g(o),target:"_blank",type:"primary",class:"recording-alternates__link"},{default:_(()=>[k(w(S(o,s)),1)]),_:2},1032,["href"]))),128))])])):y("",!0)])])):(i(),c("span",D,"暂无"))}}}),x=P(E,[["__scopeId","data-v-d67b2e91"]]);export{x as default};
@@ -1,2 +1,2 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/.pnpm-CC7b2w5D.js","assets/.pnpm-B3v8nGpq.css"])))=>i.map(i=>d[i]); const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/.pnpm-C1KTa5cB.js","assets/.pnpm-B3v8nGpq.css"])))=>i.map(i=>d[i]);
import{o as K,ap as z,n as S,R as H,aq as G,q as v,r as p,s as f,ac as O,ad as W,b8 as $,aw as j,F as w,v as k,D as I,u as J,b5 as Q,w as X,P,L as Y,bq as Z,M as _,p as E,al as ee}from"./.pnpm-CC7b2w5D.js";import{e as ae,_ as ne}from"./index-SornbJeu.js";const te={class:"recording-playback__shell"},re=["preload"],oe=["onKeydown"],le=K({__name:"RecordingVideoPlayer",props:{src:{}},setup(B){const V=B,A=ae(),b=_(null),m=_(null),c=_(!1),s=_(!1),t=_(!1);let d=null,r=null,l=0,u=null;function i(){u!==null&&(clearTimeout(u),u=null)}const y=E(()=>{const e=String(V.src||"").trim();return e?N(A.getImageUrl(e)):""}),D=E(()=>{if(!s.value)return"none";const e=y.value;return e&&!L(e)?"metadata":"none"}),q=E(()=>!s.value||t.value);function N(e){if(!e||!/^https?:\/\//i.test(e))return e;try{const a=new URL(e),n=a.hostname.toLowerCase();if(n.includes("myqcloud.com")||n.includes("vod-qcloud.com")||n.includes("vod-qcloud"))return a.pathname.includes("+")&&(a.pathname=a.pathname.replace(/\+/g,"%2B")),a.href}catch{}return e}function L(e){return/\.m3u8(\?|#|$)/i.test(e)}function U(){var n;t.value=!1,i();const e=m.value,a=(n=e==null?void 0:e.error)==null?void 0:n.code;a===MediaError.MEDIA_ERR_ABORTED||a===1||(c.value=!0)}function h(){d&&(d.destroy(),d=null);const e=m.value;e&&(e.pause(),e.removeAttribute("src"),e.load())}function R(e,a){let n=!1;const o=()=>{n||a!==l||(n=!0,i(),t.value=!1)};e.addEventListener("loadedmetadata",()=>o(),{once:!0}),e.addEventListener("loadeddata",()=>o(),{once:!0}),e.addEventListener("canplay",()=>o(),{once:!0}),e.addEventListener("playing",()=>o(),{once:!0}),e.addEventListener("progress",()=>{try{e.buffered.length>0&&e.buffered.end(0)>0&&o("progress-buffered")}catch{}},{passive:!0})}async function g(){if(!s.value)return;await S();const e=m.value,a=y.value;if(!e)return;if(!a){t.value=!1,i();return}const n=++l;if(t.value=!0,i(),h(),c.value=!1,L(a)){try{const o=await ee(()=>import("./.pnpm-CC7b2w5D.js").then(M=>M.dN),__vite__mapDeps([0,1])),x=o.default;if(x.isSupported()){d=new x({enableWorker:!0,lowLatencyMode:!1,maxBufferLength:20,maxMaxBufferLength:120}),d.on(o.Events.MANIFEST_PARSED,()=>{n===l&&(t.value=!1,i())}),d.on(o.Events.ERROR,(M,F)=>{if(F.fatal){if(n!==l)return;t.value=!1,i(),c.value=!0,h()}}),d.loadSource(a),d.attachMedia(e),u=setTimeout(()=>{u=null,n===l&&t.value&&(t.value=!1)},45e3);return}if(e.canPlayType("application/vnd.apple.mpegurl")){R(e,n),e.src=a,u=setTimeout(()=>{u=null,n===l&&t.value&&(t.value=!1)},45e3);return}}catch{if(n!==l)return;t.value=!1,i(),c.value=!0;return}if(n!==l)return;t.value=!1,i(),c.value=!0;return}R(e,n),e.src=a,u=setTimeout(()=>{u=null,n===l&&t.value&&(t.value=!1)},25e3)}function C(){const e=b.value;if(!e||typeof IntersectionObserver>"u"){s.value=!0,g();return}r=new IntersectionObserver(a=>{for(const n of a)if(n.isIntersecting){r==null||r.disconnect(),r=null,s.value=!0,g();break}},{root:null,rootMargin:"240px 0px",threshold:0}),r.observe(e)}function T(){r==null||r.disconnect(),r=null,s.value||(s.value=!0),g()}return z(()=>{S(()=>{C()})}),H(y,()=>{s.value&&g()}),G(()=>{r==null||r.disconnect(),r=null,i(),l++,h()}),(e,a)=>{const n=X,o=Z;return v(),p("div",{ref_key:"wrapRef",ref:b,class:"recording-playback"},[f("div",te,[O(f("video",{ref_key:"videoRef",ref:m,class:"recording-video",controls:"",playsinline:"","webkit-playsinline":"",preload:D.value,onError:U},null,40,re),[[W,!c.value]]),!c.value&&q.value?(v(),p("div",{key:0,class:"recording-playback__overlay",role:"button",tabindex:"0",onClick:T,onKeydown:$(j(T,["prevent"]),["enter"])},[s.value?(v(),p(w,{key:1},[k(n,{class:"recording-playback__spin"},{default:I(()=>[k(J(Q))]),_:1}),a[2]||(a[2]=f("span",null,"正在加载…",-1))],64)):(v(),p(w,{key:0},[a[0]||(a[0]=f("span",{class:"recording-playback__overlay-title"},"预览待加载",-1)),a[1]||(a[1]=f("span",{class:"recording-playback__overlay-desc"},"滚动至此处将自动加载(减轻并发卡顿),也可点击立即加载",-1))],64))],40,oe)):P("",!0)]),c.value?(v(),p(w,{key:0},[k(o,{href:y.value||"#",target:"_blank",type:"primary"},{default:I(()=>[...a[3]||(a[3]=[Y("在新窗口打开",-1)])]),_:1},8,["href"]),a[4]||(a[4]=f("div",{class:"recording-playback__hint"}," 内嵌播放失败(编码不支持、跨域或私有存储等)时可尝试在新窗口打开。 ",-1))],64)):P("",!0)],512)}}}),ie=ne(le,[["__scopeId","data-v-749b0199"]]);export{ie as default}; import{o as K,ap as z,n as S,R as H,aq as G,q as v,r as p,s as f,ac as O,ad as W,b8 as $,aw as j,F as w,v as k,D as I,u as J,b5 as Q,w as X,P,L as Y,bq as Z,M as _,p as E,al as ee}from"./.pnpm-C1KTa5cB.js";import{e as ae,_ as ne}from"./index-Cxx1IoGl.js";const te={class:"recording-playback__shell"},re=["preload"],oe=["onKeydown"],le=K({__name:"RecordingVideoPlayer",props:{src:{}},setup(B){const V=B,A=ae(),b=_(null),m=_(null),c=_(!1),s=_(!1),t=_(!1);let d=null,r=null,l=0,u=null;function i(){u!==null&&(clearTimeout(u),u=null)}const y=E(()=>{const e=String(V.src||"").trim();return e?N(A.getImageUrl(e)):""}),D=E(()=>{if(!s.value)return"none";const e=y.value;return e&&!L(e)?"metadata":"none"}),q=E(()=>!s.value||t.value);function N(e){if(!e||!/^https?:\/\//i.test(e))return e;try{const a=new URL(e),n=a.hostname.toLowerCase();if(n.includes("myqcloud.com")||n.includes("vod-qcloud.com")||n.includes("vod-qcloud"))return a.pathname.includes("+")&&(a.pathname=a.pathname.replace(/\+/g,"%2B")),a.href}catch{}return e}function L(e){return/\.m3u8(\?|#|$)/i.test(e)}function U(){var n;t.value=!1,i();const e=m.value,a=(n=e==null?void 0:e.error)==null?void 0:n.code;a===MediaError.MEDIA_ERR_ABORTED||a===1||(c.value=!0)}function h(){d&&(d.destroy(),d=null);const e=m.value;e&&(e.pause(),e.removeAttribute("src"),e.load())}function R(e,a){let n=!1;const o=()=>{n||a!==l||(n=!0,i(),t.value=!1)};e.addEventListener("loadedmetadata",()=>o(),{once:!0}),e.addEventListener("loadeddata",()=>o(),{once:!0}),e.addEventListener("canplay",()=>o(),{once:!0}),e.addEventListener("playing",()=>o(),{once:!0}),e.addEventListener("progress",()=>{try{e.buffered.length>0&&e.buffered.end(0)>0&&o("progress-buffered")}catch{}},{passive:!0})}async function g(){if(!s.value)return;await S();const e=m.value,a=y.value;if(!e)return;if(!a){t.value=!1,i();return}const n=++l;if(t.value=!0,i(),h(),c.value=!1,L(a)){try{const o=await ee(()=>import("./.pnpm-C1KTa5cB.js").then(M=>M.dN),__vite__mapDeps([0,1])),x=o.default;if(x.isSupported()){d=new x({enableWorker:!0,lowLatencyMode:!1,maxBufferLength:20,maxMaxBufferLength:120}),d.on(o.Events.MANIFEST_PARSED,()=>{n===l&&(t.value=!1,i())}),d.on(o.Events.ERROR,(M,F)=>{if(F.fatal){if(n!==l)return;t.value=!1,i(),c.value=!0,h()}}),d.loadSource(a),d.attachMedia(e),u=setTimeout(()=>{u=null,n===l&&t.value&&(t.value=!1)},45e3);return}if(e.canPlayType("application/vnd.apple.mpegurl")){R(e,n),e.src=a,u=setTimeout(()=>{u=null,n===l&&t.value&&(t.value=!1)},45e3);return}}catch{if(n!==l)return;t.value=!1,i(),c.value=!0;return}if(n!==l)return;t.value=!1,i(),c.value=!0;return}R(e,n),e.src=a,u=setTimeout(()=>{u=null,n===l&&t.value&&(t.value=!1)},25e3)}function C(){const e=b.value;if(!e||typeof IntersectionObserver>"u"){s.value=!0,g();return}r=new IntersectionObserver(a=>{for(const n of a)if(n.isIntersecting){r==null||r.disconnect(),r=null,s.value=!0,g();break}},{root:null,rootMargin:"240px 0px",threshold:0}),r.observe(e)}function T(){r==null||r.disconnect(),r=null,s.value||(s.value=!0),g()}return z(()=>{S(()=>{C()})}),H(y,()=>{s.value&&g()}),G(()=>{r==null||r.disconnect(),r=null,i(),l++,h()}),(e,a)=>{const n=X,o=Z;return v(),p("div",{ref_key:"wrapRef",ref:b,class:"recording-playback"},[f("div",te,[O(f("video",{ref_key:"videoRef",ref:m,class:"recording-video",controls:"",playsinline:"","webkit-playsinline":"",preload:D.value,onError:U},null,40,re),[[W,!c.value]]),!c.value&&q.value?(v(),p("div",{key:0,class:"recording-playback__overlay",role:"button",tabindex:"0",onClick:T,onKeydown:$(j(T,["prevent"]),["enter"])},[s.value?(v(),p(w,{key:1},[k(n,{class:"recording-playback__spin"},{default:I(()=>[k(J(Q))]),_:1}),a[2]||(a[2]=f("span",null,"正在加载…",-1))],64)):(v(),p(w,{key:0},[a[0]||(a[0]=f("span",{class:"recording-playback__overlay-title"},"预览待加载",-1)),a[1]||(a[1]=f("span",{class:"recording-playback__overlay-desc"},"滚动至此处将自动加载(减轻并发卡顿),也可点击立即加载",-1))],64))],40,oe)):P("",!0)]),c.value?(v(),p(w,{key:0},[k(o,{href:y.value||"#",target:"_blank",type:"primary"},{default:I(()=>[...a[3]||(a[3]=[Y("在新窗口打开",-1)])]),_:1},8,["href"]),a[4]||(a[4]=f("div",{class:"recording-playback__hint"}," 内嵌播放失败(编码不支持、跨域或私有存储等)时可尝试在新窗口打开。 ",-1))],64)):P("",!0)],512)}}}),ie=ne(le,[["__scopeId","data-v-749b0199"]]);export{ie as default};
File diff suppressed because one or more lines are too long
@@ -1,2 +1,2 @@
import{o as T,q as e,r as t,v as m,b7 as V,s as d,D as w,L as I,K as E,P as r,F as u,G as v,T as g,O as C,bB as z,M as p}from"./.pnpm-CC7b2w5D.js";import{a4 as L}from"./tcm-CyNc7e6S.js";import{i as M,_ as S}from"./index-SornbJeu.js";/* empty css */const D={class:"tracking-timeline-wrap"},F={key:0,class:"timeline-input"},H={class:"input-actions"},q={key:1,class:"tracking-timeline"},A={class:"timeline-date"},G={class:"timeline-body"},K={key:0,class:"timeline-content"},O=T({__name:"TrackingNoteTimeline",props:{notes:{},diagnosisId:{},readonly:{type:Boolean}},emits:["refresh"],setup(n,{emit:f}){const c=n,y=f,o=p(""),l=p(!1),_=s=>s?s.split(` import{o as T,q as e,r as t,v as m,b7 as V,s as d,D as w,L as I,K as E,P as r,F as u,G as v,T as g,O as C,bB as z,M as p}from"./.pnpm-C1KTa5cB.js";import{a4 as L}from"./tcm-DJJMkqKG.js";import{i as M,_ as S}from"./index-Cxx1IoGl.js";/* empty css */const D={class:"tracking-timeline-wrap"},F={key:0,class:"timeline-input"},H={class:"input-actions"},q={key:1,class:"tracking-timeline"},A={class:"timeline-date"},G={class:"timeline-body"},K={key:0,class:"timeline-content"},O=T({__name:"TrackingNoteTimeline",props:{notes:{},diagnosisId:{},readonly:{type:Boolean}},emits:["refresh"],setup(n,{emit:f}){const c=n,y=f,o=p(""),l=p(!1),_=s=>s?s.split(`
`).filter(Boolean):[],k=async()=>{if(!c.diagnosisId)return;const s=o.value.trim();if(s){l.value=!0;try{await L({diagnosis_id:c.diagnosisId,tracking_content:s}),M.msgSuccess("已添加"),o.value="",y("refresh")}finally{l.value=!1}}};return(s,i)=>{const b=V,h=E,B=z;return e(),t("div",D,[!n.readonly&&n.diagnosisId?(e(),t("div",F,[m(b,{modelValue:o.value,"onUpdate:modelValue":i[0]||(i[0]=a=>o.value=a),type:"textarea",rows:2,placeholder:"输入跟踪备注,回车换行;保存后将以「[HH:MM] 内容」追加到当天记录",maxlength:"1000","show-word-limit":"",resize:"none",disabled:l.value},null,8,["modelValue","disabled"]),d("div",H,[m(h,{type:"primary",size:"small",loading:l.value,disabled:!o.value.trim(),onClick:k},{default:w(()=>[...i[1]||(i[1]=[I(" 添加 ",-1)])]),_:1},8,["loading","disabled"])])])):r("",!0),n.notes.length?(e(),t("div",q,[(e(!0),t(u,null,v(n.notes,a=>(e(),t("div",{key:a.id,class:"timeline-node"},[i[2]||(i[2]=d("div",{class:"timeline-dot"},null,-1)),d("div",A,g(a.note_date),1),d("div",G,[a.content?(e(),t("div",K,[(e(!0),t(u,null,v(_(a.content),(x,N)=>(e(),t("div",{key:N,class:"content-line"},g(x),1))),128))])):r("",!0)])]))),128))])):r("",!0),!n.notes.length&&n.readonly?(e(),C(B,{key:2,description:"暂无跟踪备注","image-size":48})):r("",!0)])}}}),Q=S(O,[["__scopeId","data-v-82b635bd"]]);export{Q as default}; `).filter(Boolean):[],k=async()=>{if(!c.diagnosisId)return;const s=o.value.trim();if(s){l.value=!0;try{await L({diagnosis_id:c.diagnosisId,tracking_content:s}),M.msgSuccess("已添加"),o.value="",y("refresh")}finally{l.value=!1}}};return(s,i)=>{const b=V,h=E,B=z;return e(),t("div",D,[!n.readonly&&n.diagnosisId?(e(),t("div",F,[m(b,{modelValue:o.value,"onUpdate:modelValue":i[0]||(i[0]=a=>o.value=a),type:"textarea",rows:2,placeholder:"输入跟踪备注,回车换行;保存后将以「[HH:MM] 内容」追加到当天记录",maxlength:"1000","show-word-limit":"",resize:"none",disabled:l.value},null,8,["modelValue","disabled"]),d("div",H,[m(h,{type:"primary",size:"small",loading:l.value,disabled:!o.value.trim(),onClick:k},{default:w(()=>[...i[1]||(i[1]=[I(" 添加 ",-1)])]),_:1},8,["loading","disabled"])])])):r("",!0),n.notes.length?(e(),t("div",q,[(e(!0),t(u,null,v(n.notes,a=>(e(),t("div",{key:a.id,class:"timeline-node"},[i[2]||(i[2]=d("div",{class:"timeline-dot"},null,-1)),d("div",A,g(a.note_date),1),d("div",G,[a.content?(e(),t("div",K,[(e(!0),t(u,null,v(_(a.content),(x,N)=>(e(),t("div",{key:N,class:"content-line"},g(x),1))),128))])):r("",!0)])]))),128))])):r("",!0),!n.notes.length&&n.readonly?(e(),C(B,{key:2,description:"暂无跟踪备注","image-size":48})):r("",!0)])}}}),Q=S(O,[["__scopeId","data-v-82b635bd"]]);export{Q as default};
@@ -1 +0,0 @@
import{_ as o}from"./account-adjust.vue_vue_type_script_setup_true_lang-B1oNjpjX.js";import"./.pnpm-CC7b2w5D.js";import"./index-BfmIKXtC.js";import"./index-SornbJeu.js";export{o as default};
@@ -0,0 +1 @@
import{_ as o}from"./account-adjust.vue_vue_type_script_setup_true_lang-B-w5z28y.js";import"./.pnpm-C1KTa5cB.js";import"./index-B3Fu5tec.js";import"./index-Cxx1IoGl.js";export{o as default};
@@ -1 +1 @@
import{o as h,R as v,q,O as B,D as l,s as D,v as t,b9 as F,u as n,b6 as I,L as u,T as w,bc as j,bf as S,b7 as T,a8 as y,ba as U,p as G}from"./.pnpm-CC7b2w5D.js";import{_ as L}from"./index-BfmIKXtC.js";import{i as V}from"./index-SornbJeu.js";const M={class:"pr-8"},H=h({__name:"account-adjust",props:{show:{type:Boolean,required:!0},value:{type:[Number,String],required:!0}},emits:["update:show","confirm"],setup(d,{emit:k}){const s=y(),i=d,f=k,o=U({action:1,num:"",remark:""}),m=y(),c=G(()=>Number(i.value)+Number(o.num)*(o.action==1?1:-1)),R={num:[{required:!0,message:"请输入调整的金额"}]},g=e=>{if(e.includes("-"))return V.msgError("请输入正整数");o.num=e},x=async()=>{var e;await((e=s.value)==null?void 0:e.validate()),f("confirm",o)},E=()=>{var e;f("update:show",!1),(e=s.value)==null||e.resetFields()};return v(()=>i.show,e=>{var a,r;e?(a=m.value)==null||a.open():(r=m.value)==null||r.close()}),v(c,e=>{e<0&&(V.msgError("调整后余额需大于0"),o.num="")}),(e,a)=>{const r=I,_=S,C=j,b=T,N=F;return q(),B(L,{ref_key:"popupRef",ref:m,title:"余额调整",width:"500px",onConfirm:x,async:!0,onClose:E},{default:l(()=>[D("div",M,[t(N,{ref_key:"formRef",ref:s,model:n(o),"label-width":"120px",rules:R},{default:l(()=>[t(r,{label:"当前余额"},{default:l(()=>[u("¥ "+w(d.value),1)]),_:1}),t(r,{label:"余额增减",required:"",prop:"action"},{default:l(()=>[t(C,{modelValue:n(o).action,"onUpdate:modelValue":a[0]||(a[0]=p=>n(o).action=p)},{default:l(()=>[t(_,{value:1},{default:l(()=>[...a[2]||(a[2]=[u("增加余额",-1)])]),_:1}),t(_,{value:2},{default:l(()=>[...a[3]||(a[3]=[u("扣减余额",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(r,{label:"调整余额",prop:"num"},{default:l(()=>[t(b,{"model-value":n(o).num,placeholder:"请输入调整的金额",type:"number",onInput:g},null,8,["model-value"])]),_:1}),t(r,{label:"调整后余额"},{default:l(()=>[u(" ¥ "+w(n(c)),1)]),_:1}),t(r,{label:"备注",prop:"remark"},{default:l(()=>[t(b,{modelValue:n(o).remark,"onUpdate:modelValue":a[1]||(a[1]=p=>n(o).remark=p),type:"textarea",rows:4},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])])]),_:1},512)}}});export{H as _}; import{o as h,R as v,q,O as B,D as l,s as D,v as t,b9 as F,u as n,b6 as I,L as u,T as w,bc as j,bf as S,b7 as T,a8 as y,ba as U,p as G}from"./.pnpm-C1KTa5cB.js";import{_ as L}from"./index-B3Fu5tec.js";import{i as V}from"./index-Cxx1IoGl.js";const M={class:"pr-8"},H=h({__name:"account-adjust",props:{show:{type:Boolean,required:!0},value:{type:[Number,String],required:!0}},emits:["update:show","confirm"],setup(d,{emit:k}){const s=y(),i=d,f=k,o=U({action:1,num:"",remark:""}),m=y(),c=G(()=>Number(i.value)+Number(o.num)*(o.action==1?1:-1)),R={num:[{required:!0,message:"请输入调整的金额"}]},g=e=>{if(e.includes("-"))return V.msgError("请输入正整数");o.num=e},x=async()=>{var e;await((e=s.value)==null?void 0:e.validate()),f("confirm",o)},E=()=>{var e;f("update:show",!1),(e=s.value)==null||e.resetFields()};return v(()=>i.show,e=>{var a,r;e?(a=m.value)==null||a.open():(r=m.value)==null||r.close()}),v(c,e=>{e<0&&(V.msgError("调整后余额需大于0"),o.num="")}),(e,a)=>{const r=I,_=S,C=j,b=T,N=F;return q(),B(L,{ref_key:"popupRef",ref:m,title:"余额调整",width:"500px",onConfirm:x,async:!0,onClose:E},{default:l(()=>[D("div",M,[t(N,{ref_key:"formRef",ref:s,model:n(o),"label-width":"120px",rules:R},{default:l(()=>[t(r,{label:"当前余额"},{default:l(()=>[u("¥ "+w(d.value),1)]),_:1}),t(r,{label:"余额增减",required:"",prop:"action"},{default:l(()=>[t(C,{modelValue:n(o).action,"onUpdate:modelValue":a[0]||(a[0]=p=>n(o).action=p)},{default:l(()=>[t(_,{value:1},{default:l(()=>[...a[2]||(a[2]=[u("增加余额",-1)])]),_:1}),t(_,{value:2},{default:l(()=>[...a[3]||(a[3]=[u("扣减余额",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(r,{label:"调整余额",prop:"num"},{default:l(()=>[t(b,{"model-value":n(o).num,placeholder:"请输入调整的金额",type:"number",onInput:g},null,8,["model-value"])]),_:1}),t(r,{label:"调整后余额"},{default:l(()=>[u(" ¥ "+w(n(c)),1)]),_:1}),t(r,{label:"备注",prop:"remark"},{default:l(()=>[t(b,{modelValue:n(o).remark,"onUpdate:modelValue":a[1]||(a[1]=p=>n(o).remark=p),type:"textarea",rows:4},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])])]),_:1},512)}}});export{H as _};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
import{_ as o}from"./add-nav.vue_vue_type_script_setup_true_lang-DW1znYtt.js";import"./.pnpm-C1KTa5cB.js";import"./index-B-rCQZ_o.js";import"./index-Cxx1IoGl.js";import"./picker-BaeJGhM3.js";import"./index-B3Fu5tec.js";import"./index.vue_vue_type_script_setup_true_lang-CerDQAzd.js";import"./article-BaVF8uYW.js";import"./usePaging--aAVZOna.js";import"./picker-CNX2EN3u.js";import"./index-BhA3CyxZ.js";import"./index-CZyPOnHt.js";import"./file-D2AwthSZ.js";import"./index.vue_vue_type_script_setup_true_lang-0C3mdvgv.js";export{o as default};
@@ -1 +0,0 @@
import{_ as o}from"./add-nav.vue_vue_type_script_setup_true_lang-C2JaYgWT.js";import"./.pnpm-CC7b2w5D.js";import"./index-DP3bicdH.js";import"./index-SornbJeu.js";import"./picker-unxcKHGX.js";import"./index-BfmIKXtC.js";import"./index.vue_vue_type_script_setup_true_lang-DHXV5Zdc.js";import"./article-Bw62itOD.js";import"./usePaging-Cer8s1LR.js";import"./picker-gGGrlx7D.js";import"./index-Bigk9abY.js";import"./index-DDHtrTz0.js";import"./file-BfK3TJqs.js";import"./index.vue_vue_type_script_setup_true_lang-CYjIL6rl.js";export{o as default};
@@ -1 +1 @@
import{o as E,q as p,r as C,s as l,v as a,u as c,bQ as B,C as N,D as d,O as $,b7 as z,b6 as D,I,K as A,L,p as R}from"./.pnpm-CC7b2w5D.js";import{_ as q}from"./index-DP3bicdH.js";import{_ as F}from"./picker-unxcKHGX.js";import{_ as K}from"./picker-gGGrlx7D.js";import{c as O,i as r}from"./index-SornbJeu.js";const P={class:"bg-fill-light flex items-center w-full p-4 mb-4"},Q={class:"upload-btn w-[60px] h-[60px]"},S={class:"ml-3 flex-1"},T={class:"flex items-center"},j={class:"flex items-center mt-[18px]"},G={class:"flex-1 flex items-center"},H={class:"drag-move cursor-move ml-auto"},Z=E({__name:"add-nav",props:{modelValue:{type:Array,default:()=>[]},max:{type:Number,default:100},min:{type:Number,default:1}},emits:["update:modelValue"],setup(_,{emit:f}){const t=_,V=f,m=R({get(){return t.modelValue},set(s){V("update:modelValue",s)}}),x=()=>{var s;((s=t.modelValue)==null?void 0:s.length)<t.max?m.value.push({image:"",name:"导航名称",link:{},is_show:"1"}):r.msgError(`最多添加${t.max}`)},v=s=>{var e;if(((e=t.modelValue)==null?void 0:e.length)<=t.min)return r.msgError(`最少保留${t.min}`);m.value.splice(s,1)};return(s,e)=>{const u=O,g=K,b=z,h=F,k=I,w=D,y=q,U=A;return p(),C("div",null,[l("div",null,[a(c(B),{class:"draggable",modelValue:c(m),"onUpdate:modelValue":e[0]||(e[0]=o=>N(m)?m.value=o:null),animation:"300",handle:".drag-move","item-key":"index"},{item:d(({element:o,index:i})=>[(p(),$(y,{class:"w-[467px]",key:i,onClose:n=>v(i)},{default:d(()=>[l("div",P,[a(g,{modelValue:o.image,"onUpdate:modelValue":n=>o.image=n,"upload-class":"bg-body",size:"60px","exclude-domain":""},{upload:d(()=>[l("div",Q,[a(u,{name:"el-icon-Plus",size:20})])]),_:1},8,["modelValue","onUpdate:modelValue"]),l("div",S,[l("div",T,[e[1]||(e[1]=l("span",{class:"text-tx-regular flex-none mr-3"},"名称",-1)),a(b,{modelValue:o.name,"onUpdate:modelValue":n=>o.name=n,placeholder:"请输入名称"},null,8,["modelValue","onUpdate:modelValue"])]),l("div",j,[e[2]||(e[2]=l("span",{class:"text-tx-regular flex-none mr-3"},"链接",-1)),a(h,{modelValue:o.link,"onUpdate:modelValue":n=>o.link=n},null,8,["modelValue","onUpdate:modelValue"])]),a(w,{label:"是否显示",class:"mt-[18px]"},{default:d(()=>[l("div",G,[a(k,{modelValue:o.is_show,"onUpdate:modelValue":n=>o.is_show=n,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),l("div",H,[a(u,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"])]),l("div",null,[a(U,{type:"primary",onClick:x},{default:d(()=>[...e[3]||(e[3]=[L("添加",-1)])]),_:1})])])}}});export{Z as _}; import{o as E,q as p,r as C,s as l,v as a,u as c,bQ as B,C as N,D as d,O as $,b7 as z,b6 as D,I,K as A,L,p as R}from"./.pnpm-C1KTa5cB.js";import{_ as q}from"./index-B-rCQZ_o.js";import{_ as F}from"./picker-BaeJGhM3.js";import{_ as K}from"./picker-CNX2EN3u.js";import{c as O,i as r}from"./index-Cxx1IoGl.js";const P={class:"bg-fill-light flex items-center w-full p-4 mb-4"},Q={class:"upload-btn w-[60px] h-[60px]"},S={class:"ml-3 flex-1"},T={class:"flex items-center"},j={class:"flex items-center mt-[18px]"},G={class:"flex-1 flex items-center"},H={class:"drag-move cursor-move ml-auto"},Z=E({__name:"add-nav",props:{modelValue:{type:Array,default:()=>[]},max:{type:Number,default:100},min:{type:Number,default:1}},emits:["update:modelValue"],setup(_,{emit:f}){const t=_,V=f,m=R({get(){return t.modelValue},set(s){V("update:modelValue",s)}}),x=()=>{var s;((s=t.modelValue)==null?void 0:s.length)<t.max?m.value.push({image:"",name:"导航名称",link:{},is_show:"1"}):r.msgError(`最多添加${t.max}`)},v=s=>{var e;if(((e=t.modelValue)==null?void 0:e.length)<=t.min)return r.msgError(`最少保留${t.min}`);m.value.splice(s,1)};return(s,e)=>{const u=O,g=K,b=z,h=F,k=I,w=D,y=q,U=A;return p(),C("div",null,[l("div",null,[a(c(B),{class:"draggable",modelValue:c(m),"onUpdate:modelValue":e[0]||(e[0]=o=>N(m)?m.value=o:null),animation:"300",handle:".drag-move","item-key":"index"},{item:d(({element:o,index:i})=>[(p(),$(y,{class:"w-[467px]",key:i,onClose:n=>v(i)},{default:d(()=>[l("div",P,[a(g,{modelValue:o.image,"onUpdate:modelValue":n=>o.image=n,"upload-class":"bg-body",size:"60px","exclude-domain":""},{upload:d(()=>[l("div",Q,[a(u,{name:"el-icon-Plus",size:20})])]),_:1},8,["modelValue","onUpdate:modelValue"]),l("div",S,[l("div",T,[e[1]||(e[1]=l("span",{class:"text-tx-regular flex-none mr-3"},"名称",-1)),a(b,{modelValue:o.name,"onUpdate:modelValue":n=>o.name=n,placeholder:"请输入名称"},null,8,["modelValue","onUpdate:modelValue"])]),l("div",j,[e[2]||(e[2]=l("span",{class:"text-tx-regular flex-none mr-3"},"链接",-1)),a(h,{modelValue:o.link,"onUpdate:modelValue":n=>o.link=n},null,8,["modelValue","onUpdate:modelValue"])]),a(w,{label:"是否显示",class:"mt-[18px]"},{default:d(()=>[l("div",G,[a(k,{modelValue:o.is_show,"onUpdate:modelValue":n=>o.is_show=n,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),l("div",H,[a(u,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"])]),l("div",null,[a(U,{type:"primary",onClick:x},{default:d(()=>[...e[3]||(e[3]=[L("添加",-1)])]),_:1})])])}}});export{Z as _};
@@ -1 +1 @@
import{r as n}from"./index-SornbJeu.js";function e(t){return n.get({url:"/auth.admin/lists",params:t},{ignoreCancelToken:!0})}function i(t){return n.post({url:"/auth.admin/add",params:t})}function r(t){return n.post({url:"/auth.admin/edit",params:t})}function u(t){return n.post({url:"/auth.admin/delete",params:t})}function d(t){return n.get({url:"/auth.admin/detail",params:t})}export{e as a,r as b,u as c,i as d,d as e}; import{r as n}from"./index-Cxx1IoGl.js";function e(t){return n.get({url:"/auth.admin/lists",params:t},{ignoreCancelToken:!0})}function i(t){return n.post({url:"/auth.admin/add",params:t})}function r(t){return n.post({url:"/auth.admin/edit",params:t})}function u(t){return n.post({url:"/auth.admin/delete",params:t})}function d(t){return n.get({url:"/auth.admin/detail",params:t})}export{e as a,r as b,u as c,i as d,d as e};
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{r as e}from"./index-SornbJeu.js";function a(t){return e.get({url:"/article.articleCate/lists",params:t})}function l(t){return e.get({url:"/article.articleCate/all",params:t})}function i(t){return e.post({url:"/article.articleCate/add",params:t})}function c(t){return e.post({url:"/article.articleCate/edit",params:t})}function u(t){return e.post({url:"/article.articleCate/delete",params:t})}function n(t){return e.get({url:"/article.articleCate/detail",params:t})}function s(t){return e.post({url:"/article.articleCate/updateStatus",params:t})}function o(t){return e.get({url:"/article.article/lists",params:t})}function d(t){return e.post({url:"/article.article/add",params:t})}function f(t){return e.post({url:"/article.article/edit",params:t})}function C(t){return e.post({url:"/article.article/delete",params:t})}function p(t){return e.get({url:"/article.article/detail",params:t})}function g(t){return e.post({url:"/article.article/updateStatus",params:t})}export{a,u as b,s as c,c as d,i as e,n as f,p as g,f as h,d as i,l as j,o as k,g as l,C as m}; import{r as e}from"./index-Cxx1IoGl.js";function a(t){return e.get({url:"/article.articleCate/lists",params:t})}function l(t){return e.get({url:"/article.articleCate/all",params:t})}function i(t){return e.post({url:"/article.articleCate/add",params:t})}function c(t){return e.post({url:"/article.articleCate/edit",params:t})}function u(t){return e.post({url:"/article.articleCate/delete",params:t})}function n(t){return e.get({url:"/article.articleCate/detail",params:t})}function s(t){return e.post({url:"/article.articleCate/updateStatus",params:t})}function o(t){return e.get({url:"/article.article/lists",params:t})}function d(t){return e.post({url:"/article.article/add",params:t})}function f(t){return e.post({url:"/article.article/edit",params:t})}function C(t){return e.post({url:"/article.article/delete",params:t})}function p(t){return e.get({url:"/article.article/detail",params:t})}function g(t){return e.post({url:"/article.article/updateStatus",params:t})}export{a,u as b,s as c,c as d,i as e,n as f,p as g,f as h,d as i,l as j,o as k,g as l,C as m};
@@ -1 +1 @@
import{r as e}from"./index-SornbJeu.js";function r(s){return e.get({url:"/asset.AssetUser/lists",params:s})}function u(s){return e.post({url:"/asset.AssetUser/add",params:s})}function a(s){return e.post({url:"/asset.AssetUser/edit",params:s})}function i(s){return e.post({url:"/asset.AssetUser/delete",params:s})}function o(s){return e.get({url:"/asset.AssetResource/lists",params:s})}function n(s){return e.post({url:"/asset.AssetResource/add",params:s})}function A(s){return e.post({url:"/asset.AssetResource/edit",params:s})}function c(s){return e.post({url:"/asset.AssetResource/delete",params:s})}export{o as a,c as b,A as c,n as d,r as e,a as f,i as g,u as h}; import{r as e}from"./index-Cxx1IoGl.js";function r(s){return e.get({url:"/asset.AssetUser/lists",params:s})}function u(s){return e.post({url:"/asset.AssetUser/add",params:s})}function a(s){return e.post({url:"/asset.AssetUser/edit",params:s})}function i(s){return e.post({url:"/asset.AssetUser/delete",params:s})}function o(s){return e.get({url:"/asset.AssetResource/lists",params:s})}function n(s){return e.post({url:"/asset.AssetResource/add",params:s})}function A(s){return e.post({url:"/asset.AssetResource/edit",params:s})}function c(s){return e.post({url:"/asset.AssetResource/delete",params:s})}export{o as a,c as b,A as c,n as d,r as e,a as f,i as g,u as h};
@@ -0,0 +1 @@
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-DMX38Vjl.js";import"./.pnpm-C1KTa5cB.js";import"./index-B-rCQZ_o.js";import"./index-Cxx1IoGl.js";import"./picker-BaeJGhM3.js";import"./index-B3Fu5tec.js";import"./index.vue_vue_type_script_setup_true_lang-CerDQAzd.js";import"./article-BaVF8uYW.js";import"./usePaging--aAVZOna.js";import"./picker-CNX2EN3u.js";import"./index-BhA3CyxZ.js";import"./index-CZyPOnHt.js";import"./file-D2AwthSZ.js";import"./index.vue_vue_type_script_setup_true_lang-0C3mdvgv.js";import"./index.vue_vue_type_script_setup_true_lang-CScz2Hxp.js";export{o as default};
@@ -1 +0,0 @@
import{_ as m}from"./attr.vue_vue_type_script_setup_true_lang-CJsXI2CE.js";import"./.pnpm-CC7b2w5D.js";export{m as default};
@@ -1 +1 @@
import{o as b,q as c,r as V,s as v,v as t,D as a,Y as x,X as E,u as l,b9 as g,F as k,p as w}from"./.pnpm-CC7b2w5D.js";import{_ as p}from"./menu-set.vue_vue_type_script_setup_true_lang-CZOHA2kA.js";import"./index-DP3bicdH.js";import"./index-SornbJeu.js";import"./picker-unxcKHGX.js";import"./index-BfmIKXtC.js";import"./index.vue_vue_type_script_setup_true_lang-DHXV5Zdc.js";import"./article-Bw62itOD.js";import"./usePaging-Cer8s1LR.js";import"./picker-gGGrlx7D.js";import"./index-Bigk9abY.js";import"./index-DDHtrTz0.js";import"./file-BfK3TJqs.js";import"./index.vue_vue_type_script_setup_true_lang-CYjIL6rl.js";const $=b({__name:"attr",props:{modelValue:{type:Object,default:()=>({nav:[],menu:{}})}},emits:["update:modelValue"],setup(s,{emit:u}){const d=s,i=u,o=w({get(){return d.modelValue},set(n){i("update:modelValue",n)}});return(n,e)=>{const r=E,f=x,_=g;return c(),V(k,null,[e[2]||(e[2]=v("div",{class:"title flex items-center before:w-[3px] before:h-[14px] before:block before:bg-primary before:mr-2"}," pc导航设置 ",-1)),t(_,{class:"mt-4","label-width":"70px"},{default:a(()=>[t(f,{"model-value":"nav"},{default:a(()=>[t(r,{label:"主导航设置",name:"nav"},{default:a(()=>[t(p,{modelValue:l(o).nav,"onUpdate:modelValue":e[0]||(e[0]=m=>l(o).nav=m)},null,8,["modelValue"])]),_:1}),t(r,{label:"菜单设置",name:"menu"},{default:a(()=>[t(p,{modelValue:l(o).menu,"onUpdate:modelValue":e[1]||(e[1]=m=>l(o).menu=m)},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})],64)}}});export{$ as default}; import{o as b,q as c,r as V,s as v,v as t,D as a,Y as x,X as E,u as l,b9 as g,F as k,p as w}from"./.pnpm-C1KTa5cB.js";import{_ as p}from"./menu-set.vue_vue_type_script_setup_true_lang-DBOQoi51.js";import"./index-B-rCQZ_o.js";import"./index-Cxx1IoGl.js";import"./picker-BaeJGhM3.js";import"./index-B3Fu5tec.js";import"./index.vue_vue_type_script_setup_true_lang-CerDQAzd.js";import"./article-BaVF8uYW.js";import"./usePaging--aAVZOna.js";import"./picker-CNX2EN3u.js";import"./index-BhA3CyxZ.js";import"./index-CZyPOnHt.js";import"./file-D2AwthSZ.js";import"./index.vue_vue_type_script_setup_true_lang-0C3mdvgv.js";const $=b({__name:"attr",props:{modelValue:{type:Object,default:()=>({nav:[],menu:{}})}},emits:["update:modelValue"],setup(s,{emit:u}){const d=s,i=u,o=w({get(){return d.modelValue},set(n){i("update:modelValue",n)}});return(n,e)=>{const r=E,f=x,_=g;return c(),V(k,null,[e[2]||(e[2]=v("div",{class:"title flex items-center before:w-[3px] before:h-[14px] before:block before:bg-primary before:mr-2"}," pc导航设置 ",-1)),t(_,{class:"mt-4","label-width":"70px"},{default:a(()=>[t(f,{"model-value":"nav"},{default:a(()=>[t(r,{label:"主导航设置",name:"nav"},{default:a(()=>[t(p,{modelValue:l(o).nav,"onUpdate:modelValue":e[0]||(e[0]=m=>l(o).nav=m)},null,8,["modelValue"])]),_:1}),t(r,{label:"菜单设置",name:"menu"},{default:a(()=>[t(p,{modelValue:l(o).menu,"onUpdate:modelValue":e[1]||(e[1]=m=>l(o).menu=m)},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})],64)}}});export{$ as default};
@@ -1 +0,0 @@
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-BNruz2qH.js";import"./.pnpm-CC7b2w5D.js";import"./add-nav.vue_vue_type_script_setup_true_lang-C2JaYgWT.js";import"./index-DP3bicdH.js";import"./index-SornbJeu.js";import"./picker-unxcKHGX.js";import"./index-BfmIKXtC.js";import"./index.vue_vue_type_script_setup_true_lang-DHXV5Zdc.js";import"./article-Bw62itOD.js";import"./usePaging-Cer8s1LR.js";import"./picker-gGGrlx7D.js";import"./index-Bigk9abY.js";import"./index-DDHtrTz0.js";import"./file-BfK3TJqs.js";import"./index.vue_vue_type_script_setup_true_lang-CYjIL6rl.js";export{o as default};
@@ -0,0 +1 @@
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-D_pPXHcq.js";import"./.pnpm-C1KTa5cB.js";import"./add-nav.vue_vue_type_script_setup_true_lang-DW1znYtt.js";import"./index-B-rCQZ_o.js";import"./index-Cxx1IoGl.js";import"./picker-BaeJGhM3.js";import"./index-B3Fu5tec.js";import"./index.vue_vue_type_script_setup_true_lang-CerDQAzd.js";import"./article-BaVF8uYW.js";import"./usePaging--aAVZOna.js";import"./picker-CNX2EN3u.js";import"./index-BhA3CyxZ.js";import"./index-CZyPOnHt.js";import"./file-D2AwthSZ.js";import"./index.vue_vue_type_script_setup_true_lang-0C3mdvgv.js";export{o as default};
@@ -1 +0,0 @@
import{_ as m}from"./attr.vue_vue_type_script_setup_true_lang-v_9nOl7c.js";import"./.pnpm-CC7b2w5D.js";export{m as default};
@@ -1 +0,0 @@
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-DrmxiGmt.js";import"./.pnpm-CC7b2w5D.js";import"./picker-gGGrlx7D.js";import"./index-BfmIKXtC.js";import"./index-SornbJeu.js";import"./index-Bigk9abY.js";import"./index.vue_vue_type_script_setup_true_lang-DHXV5Zdc.js";import"./index-DP3bicdH.js";import"./index-DDHtrTz0.js";import"./file-BfK3TJqs.js";import"./index.vue_vue_type_script_setup_true_lang-CYjIL6rl.js";import"./usePaging-Cer8s1LR.js";export{o as default};
@@ -0,0 +1 @@
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-keaJgqFX.js";import"./.pnpm-C1KTa5cB.js";import"./add-nav.vue_vue_type_script_setup_true_lang-DW1znYtt.js";import"./index-B-rCQZ_o.js";import"./index-Cxx1IoGl.js";import"./picker-BaeJGhM3.js";import"./index-B3Fu5tec.js";import"./index.vue_vue_type_script_setup_true_lang-CerDQAzd.js";import"./article-BaVF8uYW.js";import"./usePaging--aAVZOna.js";import"./picker-CNX2EN3u.js";import"./index-BhA3CyxZ.js";import"./index-CZyPOnHt.js";import"./file-D2AwthSZ.js";import"./index.vue_vue_type_script_setup_true_lang-0C3mdvgv.js";export{o as default};
@@ -1 +0,0 @@
import{_ as m}from"./attr.vue_vue_type_script_setup_true_lang-DewbCXfu.js";import"./.pnpm-CC7b2w5D.js";export{m as default};
@@ -0,0 +1 @@
import{_ as m}from"./attr.vue_vue_type_script_setup_true_lang-B-dt5wFe.js";import"./.pnpm-C1KTa5cB.js";export{m as default};
@@ -0,0 +1 @@
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-Dot-5pr7.js";import"./.pnpm-C1KTa5cB.js";import"./index.vue_vue_type_script_setup_true_lang-CScz2Hxp.js";import"./picker-CNX2EN3u.js";import"./index-B3Fu5tec.js";import"./index-Cxx1IoGl.js";import"./index-BhA3CyxZ.js";import"./index.vue_vue_type_script_setup_true_lang-CerDQAzd.js";import"./index-B-rCQZ_o.js";import"./index-CZyPOnHt.js";import"./file-D2AwthSZ.js";import"./index.vue_vue_type_script_setup_true_lang-0C3mdvgv.js";import"./usePaging--aAVZOna.js";export{o as default};
@@ -0,0 +1 @@
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-BSBOWQnL.js";import"./.pnpm-C1KTa5cB.js";import"./index-B-rCQZ_o.js";import"./index-Cxx1IoGl.js";import"./picker-BaeJGhM3.js";import"./index-B3Fu5tec.js";import"./index.vue_vue_type_script_setup_true_lang-CerDQAzd.js";import"./article-BaVF8uYW.js";import"./usePaging--aAVZOna.js";import"./picker-CNX2EN3u.js";import"./index-BhA3CyxZ.js";import"./index-CZyPOnHt.js";import"./file-D2AwthSZ.js";import"./index.vue_vue_type_script_setup_true_lang-0C3mdvgv.js";export{o as default};
@@ -1 +0,0 @@
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-DdNVKlLK.js";import"./.pnpm-CC7b2w5D.js";import"./index.vue_vue_type_script_setup_true_lang-Bd2sXtUT.js";import"./picker-gGGrlx7D.js";import"./index-BfmIKXtC.js";import"./index-SornbJeu.js";import"./index-Bigk9abY.js";import"./index.vue_vue_type_script_setup_true_lang-DHXV5Zdc.js";import"./index-DP3bicdH.js";import"./index-DDHtrTz0.js";import"./file-BfK3TJqs.js";import"./index.vue_vue_type_script_setup_true_lang-CYjIL6rl.js";import"./usePaging-Cer8s1LR.js";export{o as default};
@@ -0,0 +1 @@
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-DneoXzdE.js";import"./.pnpm-C1KTa5cB.js";import"./picker-CNX2EN3u.js";import"./index-B3Fu5tec.js";import"./index-Cxx1IoGl.js";import"./index-BhA3CyxZ.js";import"./index.vue_vue_type_script_setup_true_lang-CerDQAzd.js";import"./index-B-rCQZ_o.js";import"./index-CZyPOnHt.js";import"./file-D2AwthSZ.js";import"./index.vue_vue_type_script_setup_true_lang-0C3mdvgv.js";import"./usePaging--aAVZOna.js";export{o as default};
@@ -1 +0,0 @@
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-DygS_tQ2.js";import"./.pnpm-CC7b2w5D.js";import"./index-DP3bicdH.js";import"./index-SornbJeu.js";import"./picker-unxcKHGX.js";import"./index-BfmIKXtC.js";import"./index.vue_vue_type_script_setup_true_lang-DHXV5Zdc.js";import"./article-Bw62itOD.js";import"./usePaging-Cer8s1LR.js";import"./picker-gGGrlx7D.js";import"./index-Bigk9abY.js";import"./index-DDHtrTz0.js";import"./file-BfK3TJqs.js";import"./index.vue_vue_type_script_setup_true_lang-CYjIL6rl.js";export{o as default};
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
import{_ as m}from"./attr.vue_vue_type_script_setup_true_lang-Crc8ECqw.js";import"./.pnpm-C1KTa5cB.js";export{m as default};
@@ -0,0 +1 @@
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-n-HgGvnU.js";import"./.pnpm-C1KTa5cB.js";import"./index-B-rCQZ_o.js";import"./index-Cxx1IoGl.js";import"./picker-BaeJGhM3.js";import"./index-B3Fu5tec.js";import"./index.vue_vue_type_script_setup_true_lang-CerDQAzd.js";import"./article-BaVF8uYW.js";import"./usePaging--aAVZOna.js";import"./picker-CNX2EN3u.js";import"./index-BhA3CyxZ.js";import"./index-CZyPOnHt.js";import"./file-D2AwthSZ.js";import"./index.vue_vue_type_script_setup_true_lang-0C3mdvgv.js";export{o as default};
@@ -1 +0,0 @@
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-B2Yyeotm.js";import"./.pnpm-CC7b2w5D.js";import"./index-DP3bicdH.js";import"./index-SornbJeu.js";import"./picker-unxcKHGX.js";import"./index-BfmIKXtC.js";import"./index.vue_vue_type_script_setup_true_lang-DHXV5Zdc.js";import"./article-Bw62itOD.js";import"./usePaging-Cer8s1LR.js";import"./picker-gGGrlx7D.js";import"./index-Bigk9abY.js";import"./index-DDHtrTz0.js";import"./file-BfK3TJqs.js";import"./index.vue_vue_type_script_setup_true_lang-CYjIL6rl.js";import"./index.vue_vue_type_script_setup_true_lang-Bd2sXtUT.js";export{o as default};
@@ -1 +0,0 @@
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-DBHAYMC5.js";import"./.pnpm-CC7b2w5D.js";import"./index-DP3bicdH.js";import"./index-SornbJeu.js";import"./picker-unxcKHGX.js";import"./index-BfmIKXtC.js";import"./index.vue_vue_type_script_setup_true_lang-DHXV5Zdc.js";import"./article-Bw62itOD.js";import"./usePaging-Cer8s1LR.js";import"./picker-gGGrlx7D.js";import"./index-Bigk9abY.js";import"./index-DDHtrTz0.js";import"./file-BfK3TJqs.js";import"./index.vue_vue_type_script_setup_true_lang-CYjIL6rl.js";export{o as default};
@@ -0,0 +1 @@
import{_ as m}from"./attr.vue_vue_type_script_setup_true_lang-C6DHyy0n.js";import"./.pnpm-C1KTa5cB.js";export{m as default};
@@ -1 +0,0 @@
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-BDlCZTa8.js";import"./.pnpm-CC7b2w5D.js";import"./add-nav.vue_vue_type_script_setup_true_lang-C2JaYgWT.js";import"./index-DP3bicdH.js";import"./index-SornbJeu.js";import"./picker-unxcKHGX.js";import"./index-BfmIKXtC.js";import"./index.vue_vue_type_script_setup_true_lang-DHXV5Zdc.js";import"./article-Bw62itOD.js";import"./usePaging-Cer8s1LR.js";import"./picker-gGGrlx7D.js";import"./index-Bigk9abY.js";import"./index-DDHtrTz0.js";import"./file-BfK3TJqs.js";import"./index.vue_vue_type_script_setup_true_lang-CYjIL6rl.js";export{o as default};
@@ -0,0 +1 @@
import{_ as o}from"./attr-setting.vue_vue_type_script_setup_true_lang-DPqpk4ZS.js";import"./.pnpm-C1KTa5cB.js";import"./index-B8QxRZ_R.js";import"./attr-DJCmS0fQ.js";import"./index-B-rCQZ_o.js";import"./index-Cxx1IoGl.js";import"./picker-BaeJGhM3.js";import"./index-B3Fu5tec.js";import"./index.vue_vue_type_script_setup_true_lang-CerDQAzd.js";import"./article-BaVF8uYW.js";import"./usePaging--aAVZOna.js";import"./picker-CNX2EN3u.js";import"./index-BhA3CyxZ.js";import"./index-CZyPOnHt.js";import"./file-D2AwthSZ.js";import"./index.vue_vue_type_script_setup_true_lang-0C3mdvgv.js";import"./content.vue_vue_type_script_setup_true_lang-DPajVJbA.js";import"./decoration-img-Vzh-KZHw.js";import"./attr.vue_vue_type_script_setup_true_lang-DneoXzdE.js";import"./content-Dt1esG11.js";import"./attr.vue_vue_type_script_setup_true_lang-BSBOWQnL.js";import"./content.vue_vue_type_script_setup_true_lang-B6Am_aBA.js";import"./attr.vue_vue_type_script_setup_true_lang-D_pPXHcq.js";import"./add-nav.vue_vue_type_script_setup_true_lang-DW1znYtt.js";import"./content-aJRGigxP.js";import"./attr.vue_vue_type_script_setup_true_lang-keaJgqFX.js";import"./content.vue_vue_type_script_setup_true_lang-DHWW-fo2.js";import"./attr.vue_vue_type_script_setup_true_lang-B-dt5wFe.js";import"./content-gcCdV-yA.js";import"./decoration-BF4ut0tN.js";import"./attr.vue_vue_type_script_setup_true_lang-Dot-5pr7.js";import"./index.vue_vue_type_script_setup_true_lang-CScz2Hxp.js";import"./content-CCuj-Ob7.js";import"./content.vue_vue_type_script_setup_true_lang-Cw1yD5Dq.js";import"./attr.vue_vue_type_script_setup_true_lang-C6DHyy0n.js";import"./content-DG3FcGDA.js";import"./attr.vue_vue_type_script_setup_true_lang-n-HgGvnU.js";import"./content.vue_vue_type_script_setup_true_lang-PyGFHp9z.js";import"./attr.vue_vue_type_script_setup_true_lang-Crc8ECqw.js";import"./content-D3p-zkka.js";export{o as default};
@@ -1 +0,0 @@
import{_ as o}from"./attr-setting.vue_vue_type_script_setup_true_lang-RGeecE77.js";import"./.pnpm-CC7b2w5D.js";import"./index-Di0-tO8O.js";import"./attr-U3IAGYZF.js";import"./index-DP3bicdH.js";import"./index-SornbJeu.js";import"./picker-unxcKHGX.js";import"./index-BfmIKXtC.js";import"./index.vue_vue_type_script_setup_true_lang-DHXV5Zdc.js";import"./article-Bw62itOD.js";import"./usePaging-Cer8s1LR.js";import"./picker-gGGrlx7D.js";import"./index-Bigk9abY.js";import"./index-DDHtrTz0.js";import"./file-BfK3TJqs.js";import"./index.vue_vue_type_script_setup_true_lang-CYjIL6rl.js";import"./content.vue_vue_type_script_setup_true_lang-CeoyoYIX.js";import"./decoration-img-zDzCUUZF.js";import"./attr.vue_vue_type_script_setup_true_lang-DrmxiGmt.js";import"./content--VLrUUow.js";import"./attr.vue_vue_type_script_setup_true_lang-DygS_tQ2.js";import"./content.vue_vue_type_script_setup_true_lang-yWOsbiYN.js";import"./attr.vue_vue_type_script_setup_true_lang-BNruz2qH.js";import"./add-nav.vue_vue_type_script_setup_true_lang-C2JaYgWT.js";import"./content-emGjKktb.js";import"./attr.vue_vue_type_script_setup_true_lang-BDlCZTa8.js";import"./content.vue_vue_type_script_setup_true_lang-BpYL2yrb.js";import"./attr.vue_vue_type_script_setup_true_lang-DewbCXfu.js";import"./content-DCf4mmcM.js";import"./decoration-D5QeKSeQ.js";import"./attr.vue_vue_type_script_setup_true_lang-DdNVKlLK.js";import"./index.vue_vue_type_script_setup_true_lang-Bd2sXtUT.js";import"./content-CH7Ve0_r.js";import"./content.vue_vue_type_script_setup_true_lang-BJ9y-rrz.js";import"./attr.vue_vue_type_script_setup_true_lang-v_9nOl7c.js";import"./content-CMWowPiE.js";import"./attr.vue_vue_type_script_setup_true_lang-DBHAYMC5.js";import"./content.vue_vue_type_script_setup_true_lang-Dgn4YEDy.js";import"./attr.vue_vue_type_script_setup_true_lang-CJsXI2CE.js";import"./content-BHK9LOrx.js";export{o as default};
@@ -1 +1 @@
import{o as g,q as a,r as b,v as c,bg as y,D as r,s as x,T as _,a2 as h,O as i,a3 as w,a4 as v,u as C}from"./.pnpm-CC7b2w5D.js";import{e as k}from"./index-Di0-tO8O.js";const B={class:"pages-setting"},D={class:"title flex items-center before:w-[3px] before:h-[14px] before:block before:bg-primary before:mr-2 text-xl font-medium"},O=g({__name:"attr-setting",props:{widget:{type:Object,default:()=>({})},type:{type:String,default:"mobile"}},emits:["update:content"],setup(e,{emit:d}){const m=d,p=n=>{m("update:content",n)};return(n,E)=>{const f=y,u=h;return a(),b("div",B,[c(f,{shadow:"never",class:"!border-none flex"},{default:r(()=>{var t;return[x("div",D,_((t=e.widget)==null?void 0:t.title),1)]}),_:1}),c(u,{class:"w-full",style:{height:"calc(100% - 60px)"}},{default:r(()=>{var t,s,o,l;return[(a(),i(w,null,[(a(),i(v((s=C(k)[(t=e.widget)==null?void 0:t.name])==null?void 0:s.attr),{content:(o=e.widget)==null?void 0:o.content,styles:(l=e.widget)==null?void 0:l.styles,type:e.type,"onUpdate:content":p},null,40,["content","styles","type"]))],1024))]}),_:1})])}}});export{O as _}; import{o as g,q as a,r as b,v as c,bg as y,D as r,s as x,T as _,a2 as h,O as i,a3 as w,a4 as v,u as C}from"./.pnpm-C1KTa5cB.js";import{e as k}from"./index-B8QxRZ_R.js";const B={class:"pages-setting"},D={class:"title flex items-center before:w-[3px] before:h-[14px] before:block before:bg-primary before:mr-2 text-xl font-medium"},O=g({__name:"attr-setting",props:{widget:{type:Object,default:()=>({})},type:{type:String,default:"mobile"}},emits:["update:content"],setup(e,{emit:d}){const m=d,p=n=>{m("update:content",n)};return(n,E)=>{const f=y,u=h;return a(),b("div",B,[c(f,{shadow:"never",class:"!border-none flex"},{default:r(()=>{var t;return[x("div",D,_((t=e.widget)==null?void 0:t.title),1)]}),_:1}),c(u,{class:"w-full",style:{height:"calc(100% - 60px)"}},{default:r(()=>{var t,s,o,l;return[(a(),i(w,null,[(a(),i(v((s=C(k)[(t=e.widget)==null?void 0:t.name])==null?void 0:s.attr),{content:(o=e.widget)==null?void 0:o.content,styles:(l=e.widget)==null?void 0:l.styles,type:e.type,"onUpdate:content":p},null,40,["content","styles","type"]))],1024))]}),_:1})])}}});export{O as _};
@@ -1 +1 @@
import{o as e,q as t,r as o}from"./.pnpm-CC7b2w5D.js";const p=e({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},setup(n){return(r,a)=>(t(),o("div"))}});export{p as _}; import{o as e,q as t,r as o}from"./.pnpm-C1KTa5cB.js";const p=e({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},setup(n){return(r,a)=>(t(),o("div"))}});export{p as _};
@@ -1 +1 @@
import{o as j,q as d,r as b,v as o,D as s,bg as F,s as n,u as p,bQ as S,O as _,b6 as q,P as r,b7 as z,I as A,K,L,b9 as P,p as Q,cm as v}from"./.pnpm-CC7b2w5D.js";import{_ as R}from"./index-DP3bicdH.js";import{c as T,i as k}from"./index-SornbJeu.js";import{_ as G}from"./picker-unxcKHGX.js";import{_ as H}from"./picker-gGGrlx7D.js";const J={class:"flex-1"},M={class:"bg-fill-light w-full p-4 mt-4"},W={class:"flex-1"},X={class:"flex-1 flex items-center"},Y={class:"drag-move cursor-move ml-auto"},Z={key:0,class:"mt-4"},f=5,ae=j({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})},type:{type:String,default:"mobile"}},emits:["update:content"],setup(m,{emit:y}){const u=y,c=m,g=Q({get:()=>c.content,set:a=>{u("update:content",a)}}),w=()=>{var a;if(((a=c.content.data)==null?void 0:a.length)<f){const e=v(c.content);e.data.push({is_show:"1",image:"",name:"",link:{}}),u("update:content",e)}else k.msgError(`最多添加${f}张图片`)},E=a=>{var i;if(((i=c.content.data)==null?void 0:i.length)<=1)return k.msgError("最少保留一张图片");const e=v(c.content);e.data.splice(a,1),u("update:content",e)};return(a,e)=>{const i=H,U=G,C=z,h=q,B=A,D=T,N=R,$=K,I=F,O=P;return d(),b("div",null,[o(O,{"label-width":"70px"},{default:s(()=>[o(I,{shadow:"never",class:"!border-none flex mt-2"},{default:s(()=>{var x;return[e[2]||(e[2]=n("div",{class:"flex items-end"},[n("div",{class:"text-base text-[#101010] font-medium"},"图片设置"),n("div",{class:"text-xs text-tx-secondary ml-2"}," 最多添加5张,建议图片尺寸:750px*200px ")],-1)),n("div",J,[o(p(S),{class:"draggable",modelValue:p(g).data,"onUpdate:modelValue":e[0]||(e[0]=t=>p(g).data=t),animation:"300",handle:".drag-move"},{item:s(({element:t,index:V})=>[(d(),_(N,{key:V,onClose:l=>E(V),class:"w-full"},{default:s(()=>[n("div",M,[o(i,{width:"396px",height:"196px",modelValue:t.image,"onUpdate:modelValue":l=>t.image=l,"upload-class":"bg-body","exclude-domain":""},null,8,["modelValue","onUpdate:modelValue"]),n("div",W,[o(h,{class:"mt-[18px]",label:"图片链接"},{default:s(()=>[m.type=="mobile"?(d(),_(U,{key:0,modelValue:t.link,"onUpdate:modelValue":l=>t.link=l},null,8,["modelValue","onUpdate:modelValue"])):r("",!0),m.type=="pc"?(d(),_(C,{key:1,placeholder:"请输入链接",modelValue:t.link.path,"onUpdate:modelValue":l=>t.link.path=l},null,8,["modelValue","onUpdate:modelValue"])):r("",!0)]),_:2},1024),o(h,{label:"是否显示",class:"mt-[18px] !mb-0"},{default:s(()=>[n("div",X,[o(B,{modelValue:t.is_show,"onUpdate:modelValue":l=>t.is_show=l,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),n("div",Y,[o(D,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"])]),((x=m.content.data)==null?void 0:x.length)<f?(d(),b("div",Z,[o($,{class:"w-full",type:"primary",onClick:w},{default:s(()=>[...e[1]||(e[1]=[L("添加图片",-1)])]),_:1})])):r("",!0)]}),_:1})]),_:1})])}}});export{ae as _}; import{o as j,q as d,r as b,v as o,D as s,bg as F,s as l,u as p,bQ as S,O as _,b6 as q,P as r,b7 as z,I as A,K,L,b9 as P,p as Q,cn as v}from"./.pnpm-C1KTa5cB.js";import{_ as R}from"./index-B-rCQZ_o.js";import{c as T,i as k}from"./index-Cxx1IoGl.js";import{_ as G}from"./picker-BaeJGhM3.js";import{_ as H}from"./picker-CNX2EN3u.js";const J={class:"flex-1"},M={class:"bg-fill-light w-full p-4 mt-4"},W={class:"flex-1"},X={class:"flex-1 flex items-center"},Y={class:"drag-move cursor-move ml-auto"},Z={key:0,class:"mt-4"},f=5,ae=j({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})},type:{type:String,default:"mobile"}},emits:["update:content"],setup(m,{emit:y}){const u=y,c=m,g=Q({get:()=>c.content,set:a=>{u("update:content",a)}}),w=()=>{var a;if(((a=c.content.data)==null?void 0:a.length)<f){const e=v(c.content);e.data.push({is_show:"1",image:"",name:"",link:{}}),u("update:content",e)}else k.msgError(`最多添加${f}张图片`)},E=a=>{var i;if(((i=c.content.data)==null?void 0:i.length)<=1)return k.msgError("最少保留一张图片");const e=v(c.content);e.data.splice(a,1),u("update:content",e)};return(a,e)=>{const i=H,U=G,C=z,h=q,B=A,D=T,N=R,$=K,I=F,O=P;return d(),b("div",null,[o(O,{"label-width":"70px"},{default:s(()=>[o(I,{shadow:"never",class:"!border-none flex mt-2"},{default:s(()=>{var x;return[e[2]||(e[2]=l("div",{class:"flex items-end"},[l("div",{class:"text-base text-[#101010] font-medium"},"图片设置"),l("div",{class:"text-xs text-tx-secondary ml-2"}," 最多添加5张,建议图片尺寸:750px*200px ")],-1)),l("div",J,[o(p(S),{class:"draggable",modelValue:p(g).data,"onUpdate:modelValue":e[0]||(e[0]=t=>p(g).data=t),animation:"300",handle:".drag-move"},{item:s(({element:t,index:V})=>[(d(),_(N,{key:V,onClose:n=>E(V),class:"w-full"},{default:s(()=>[l("div",M,[o(i,{width:"396px",height:"196px",modelValue:t.image,"onUpdate:modelValue":n=>t.image=n,"upload-class":"bg-body","exclude-domain":""},null,8,["modelValue","onUpdate:modelValue"]),l("div",W,[o(h,{class:"mt-[18px]",label:"图片链接"},{default:s(()=>[m.type=="mobile"?(d(),_(U,{key:0,modelValue:t.link,"onUpdate:modelValue":n=>t.link=n},null,8,["modelValue","onUpdate:modelValue"])):r("",!0),m.type=="pc"?(d(),_(C,{key:1,placeholder:"请输入链接",modelValue:t.link.path,"onUpdate:modelValue":n=>t.link.path=n},null,8,["modelValue","onUpdate:modelValue"])):r("",!0)]),_:2},1024),o(h,{label:"是否显示",class:"mt-[18px] !mb-0"},{default:s(()=>[l("div",X,[o(B,{modelValue:t.is_show,"onUpdate:modelValue":n=>t.is_show=n,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),l("div",Y,[o(D,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"])]),((x=m.content.data)==null?void 0:x.length)<f?(d(),b("div",Z,[o($,{class:"w-full",type:"primary",onClick:w},{default:s(()=>[...e[1]||(e[1]=[L("添加图片",-1)])]),_:1})])):r("",!0)]}),_:1})]),_:1})])}}});export{ae as _};
@@ -1 +1 @@
import{o as e,q as t,r as o}from"./.pnpm-CC7b2w5D.js";const p=e({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},setup(n){return(r,a)=>(t(),o("div"))}});export{p as _}; import{o as e,q as t,r as o}from"./.pnpm-C1KTa5cB.js";const p=e({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},setup(n){return(r,a)=>(t(),o("div"))}});export{p as _};
@@ -1 +1 @@
import{o as e,q as t,r as o}from"./.pnpm-CC7b2w5D.js";const p=e({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},setup(n){return(r,a)=>(t(),o("div"))}});export{p as _}; import{o as e,q as t,r as o}from"./.pnpm-C1KTa5cB.js";const p=e({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},setup(n){return(r,a)=>(t(),o("div"))}});export{p as _};
@@ -1 +1 @@
import{o as j,q as V,r as v,v as e,D as t,s,L as h,bg as q,b6 as A,u as m,bQ as K,ae as M,b7 as O,I as Q,K as R,T as w,P as G,b9 as H,F as J,p as y}from"./.pnpm-CC7b2w5D.js";import{_ as W}from"./index-DP3bicdH.js";import{_ as X}from"./picker-unxcKHGX.js";import{_ as Y}from"./picker-gGGrlx7D.js";import{c as Z,i as b}from"./index-SornbJeu.js";import{_ as ee}from"./index.vue_vue_type_script_setup_true_lang-Bd2sXtUT.js";const le={class:"mb-[18px] max-w-[400px]"},oe={class:"bg-fill-light w-full p-4 mt-4"},te={class:"upload-btn w-[60px] h-[60px]"},se={class:"upload-btn w-[60px] h-[60px]"},ae={class:"flex-1 flex items-center"},ne={class:"drag-move cursor-move ml-auto"},de={key:0,class:"mt-4"},c=5,p=2,_e=j({__name:"attr",props:{modelValue:{type:Object,default:()=>({list:[],style:{}})}},emits:["update:modelValue"],setup(k,{emit:U}){const C=k,E=U,n=y({get(){return C.modelValue},set(a){E("update:modelValue",a)}}),$=y(()=>{var a;return((a=n.value.list)==null?void 0:a.filter(l=>l.is_show=="1"))||[]}),z=()=>{var a;((a=n.value.list)==null?void 0:a.length)<c?n.value.list.push({name:"",selected:"",unselected:"",is_show:1,link:{}}):b.msgError(`最多添加${c}`)},B=a=>{var l;if(((l=n.value.list)==null?void 0:l.length)<=p)return b.msgError(`最少保留${p}`);n.value.list.splice(a,1)},D=a=>a.relatedContext.index!=0,F=a=>{if($.value.length<p)return a.is_show=1,b.msgError(`最少显示${p}`)};return(a,l)=>{const _=q,x=ee,i=A,f=Z,g=Y,N=O,I=X,P=Q,S=W,T=R,L=H;return V(),v(J,null,[e(_,{shadow:"never",class:"!border-none flex"},{default:t(()=>[...l[3]||(l[3]=[s("div",{class:"title flex items-center before:w-[3px] before:h-[14px] before:block before:bg-primary before:mr-2 text-xl font-medium"},[h(" 底部导航设置 "),s("span",{class:"form-tips ml-[10px] !mt-0"}," 至少添加2个导航,最多添加5个导航 ")],-1)])]),_:1}),e(L,{"label-width":"70px"},{default:t(()=>[e(_,{shadow:"never",class:"!border-none flex mt-2"},{default:t(()=>[l[4]||(l[4]=s("div",{class:"flex items-end mb-4"},[s("div",{class:"text-base text-[#101010] font-medium"},"展示样式")],-1)),e(i,{label:"默认颜色"},{default:t(()=>[e(x,{class:"max-w-[400px]",modelValue:m(n).style.default_color,"onUpdate:modelValue":l[0]||(l[0]=u=>m(n).style.default_color=u),"default-color":"#999999"},null,8,["modelValue"])]),_:1}),e(i,{label:"选中颜色",style:{"margin-bottom":"0"}},{default:t(()=>[e(x,{class:"max-w-[400px]",modelValue:m(n).style.selected_color,"onUpdate:modelValue":l[1]||(l[1]=u=>m(n).style.selected_color=u),"default-color":"#4173ff"},null,8,["modelValue"])]),_:1})]),_:1}),e(_,{shadow:"never",class:"!border-none flex mt-2"},{default:t(()=>{var u;return[l[7]||(l[7]=s("div",{class:"flex items-end mb-4"},[s("div",{class:"text-base text-[#101010] font-medium"},"菜单设置"),s("div",{class:"text-xs text-tx-secondary ml-2"},"建议图片尺寸:100px*100px")],-1)),s("div",le,[e(m(K),{class:"draggable",modelValue:m(n).list,"onUpdate:modelValue":l[2]||(l[2]=o=>m(n).list=o),animation:"300",draggable:".draggable",handle:".drag-move",move:D,"item-key":"index"},{item:t(({element:o,index:r})=>[e(S,{onClose:d=>B(r),class:M(["max-w-[400px]",{draggable:r!=0}]),"show-close":r!==0},{default:t(()=>[s("div",oe,[e(i,{label:"导航图标"},{default:t(()=>[e(g,{modelValue:o.unselected,"onUpdate:modelValue":d=>o.unselected=d,"upload-class":"bg-body","exclude-domain":"",size:"60px"},{upload:t(()=>[s("div",te,[e(f,{name:"el-icon-Plus",size:16}),l[5]||(l[5]=s("span",{class:"text-xs leading-5"}," 未选中 ",-1))])]),_:1},8,["modelValue","onUpdate:modelValue"]),e(g,{modelValue:o.selected,"onUpdate:modelValue":d=>o.selected=d,"exclude-domain":"","upload-class":"bg-body",size:"60px"},{upload:t(()=>[s("div",se,[e(f,{name:"el-icon-Plus",size:16}),l[6]||(l[6]=s("span",{class:"text-xs leading-5"}," 选中 ",-1))])]),_:1},8,["modelValue","onUpdate:modelValue"])]),_:2},1024),e(i,{label:"导航名称"},{default:t(()=>[e(N,{modelValue:o.name,"onUpdate:modelValue":d=>o.name=d,placeholder:"请输入名称"},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),e(i,{label:"链接地址"},{default:t(()=>[e(I,{"is-tab":!0,disabled:r===0,modelValue:o.link,"onUpdate:modelValue":d=>o.link=d},null,8,["disabled","modelValue","onUpdate:modelValue"])]),_:2},1024),e(i,{label:"是否显示"},{default:t(()=>[s("div",ae,[e(P,{disabled:r==0,modelValue:o.is_show,"onUpdate:modelValue":d=>o.is_show=d,"active-value":1,"inactive-value":0,onChange:d=>F(o)},null,8,["disabled","modelValue","onUpdate:modelValue","onChange"]),s("div",ne,[e(f,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])]),_:2},1032,["onClose","show-close","class"])]),_:1},8,["modelValue"])]),((u=m(n).list)==null?void 0:u.length)<c?(V(),v("div",de,[e(T,{class:"w-full",type:"primary",onClick:z},{default:t(()=>{var o;return[h(" 添加导航 "+w((o=m(n).list)==null?void 0:o.length)+" / "+w(c),1)]}),_:1})])):G("",!0)]}),_:1})]),_:1})],64)}}});export{_e as _}; import{o as j,q as V,r as v,v as e,D as t,s,L as h,bg as q,b6 as A,u as m,bQ as K,ae as M,b7 as O,I as Q,K as R,T as w,P as G,b9 as H,F as J,p as y}from"./.pnpm-C1KTa5cB.js";import{_ as W}from"./index-B-rCQZ_o.js";import{_ as X}from"./picker-BaeJGhM3.js";import{_ as Y}from"./picker-CNX2EN3u.js";import{c as Z,i as b}from"./index-Cxx1IoGl.js";import{_ as ee}from"./index.vue_vue_type_script_setup_true_lang-CScz2Hxp.js";const le={class:"mb-[18px] max-w-[400px]"},oe={class:"bg-fill-light w-full p-4 mt-4"},te={class:"upload-btn w-[60px] h-[60px]"},se={class:"upload-btn w-[60px] h-[60px]"},ae={class:"flex-1 flex items-center"},ne={class:"drag-move cursor-move ml-auto"},de={key:0,class:"mt-4"},c=5,p=2,_e=j({__name:"attr",props:{modelValue:{type:Object,default:()=>({list:[],style:{}})}},emits:["update:modelValue"],setup(k,{emit:U}){const C=k,E=U,n=y({get(){return C.modelValue},set(a){E("update:modelValue",a)}}),$=y(()=>{var a;return((a=n.value.list)==null?void 0:a.filter(l=>l.is_show=="1"))||[]}),z=()=>{var a;((a=n.value.list)==null?void 0:a.length)<c?n.value.list.push({name:"",selected:"",unselected:"",is_show:1,link:{}}):b.msgError(`最多添加${c}`)},B=a=>{var l;if(((l=n.value.list)==null?void 0:l.length)<=p)return b.msgError(`最少保留${p}`);n.value.list.splice(a,1)},D=a=>a.relatedContext.index!=0,F=a=>{if($.value.length<p)return a.is_show=1,b.msgError(`最少显示${p}`)};return(a,l)=>{const _=q,x=ee,i=A,f=Z,g=Y,N=O,I=X,P=Q,S=W,T=R,L=H;return V(),v(J,null,[e(_,{shadow:"never",class:"!border-none flex"},{default:t(()=>[...l[3]||(l[3]=[s("div",{class:"title flex items-center before:w-[3px] before:h-[14px] before:block before:bg-primary before:mr-2 text-xl font-medium"},[h(" 底部导航设置 "),s("span",{class:"form-tips ml-[10px] !mt-0"}," 至少添加2个导航,最多添加5个导航 ")],-1)])]),_:1}),e(L,{"label-width":"70px"},{default:t(()=>[e(_,{shadow:"never",class:"!border-none flex mt-2"},{default:t(()=>[l[4]||(l[4]=s("div",{class:"flex items-end mb-4"},[s("div",{class:"text-base text-[#101010] font-medium"},"展示样式")],-1)),e(i,{label:"默认颜色"},{default:t(()=>[e(x,{class:"max-w-[400px]",modelValue:m(n).style.default_color,"onUpdate:modelValue":l[0]||(l[0]=u=>m(n).style.default_color=u),"default-color":"#999999"},null,8,["modelValue"])]),_:1}),e(i,{label:"选中颜色",style:{"margin-bottom":"0"}},{default:t(()=>[e(x,{class:"max-w-[400px]",modelValue:m(n).style.selected_color,"onUpdate:modelValue":l[1]||(l[1]=u=>m(n).style.selected_color=u),"default-color":"#4173ff"},null,8,["modelValue"])]),_:1})]),_:1}),e(_,{shadow:"never",class:"!border-none flex mt-2"},{default:t(()=>{var u;return[l[7]||(l[7]=s("div",{class:"flex items-end mb-4"},[s("div",{class:"text-base text-[#101010] font-medium"},"菜单设置"),s("div",{class:"text-xs text-tx-secondary ml-2"},"建议图片尺寸:100px*100px")],-1)),s("div",le,[e(m(K),{class:"draggable",modelValue:m(n).list,"onUpdate:modelValue":l[2]||(l[2]=o=>m(n).list=o),animation:"300",draggable:".draggable",handle:".drag-move",move:D,"item-key":"index"},{item:t(({element:o,index:r})=>[e(S,{onClose:d=>B(r),class:M(["max-w-[400px]",{draggable:r!=0}]),"show-close":r!==0},{default:t(()=>[s("div",oe,[e(i,{label:"导航图标"},{default:t(()=>[e(g,{modelValue:o.unselected,"onUpdate:modelValue":d=>o.unselected=d,"upload-class":"bg-body","exclude-domain":"",size:"60px"},{upload:t(()=>[s("div",te,[e(f,{name:"el-icon-Plus",size:16}),l[5]||(l[5]=s("span",{class:"text-xs leading-5"}," 未选中 ",-1))])]),_:1},8,["modelValue","onUpdate:modelValue"]),e(g,{modelValue:o.selected,"onUpdate:modelValue":d=>o.selected=d,"exclude-domain":"","upload-class":"bg-body",size:"60px"},{upload:t(()=>[s("div",se,[e(f,{name:"el-icon-Plus",size:16}),l[6]||(l[6]=s("span",{class:"text-xs leading-5"}," 选中 ",-1))])]),_:1},8,["modelValue","onUpdate:modelValue"])]),_:2},1024),e(i,{label:"导航名称"},{default:t(()=>[e(N,{modelValue:o.name,"onUpdate:modelValue":d=>o.name=d,placeholder:"请输入名称"},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),e(i,{label:"链接地址"},{default:t(()=>[e(I,{"is-tab":!0,disabled:r===0,modelValue:o.link,"onUpdate:modelValue":d=>o.link=d},null,8,["disabled","modelValue","onUpdate:modelValue"])]),_:2},1024),e(i,{label:"是否显示"},{default:t(()=>[s("div",ae,[e(P,{disabled:r==0,modelValue:o.is_show,"onUpdate:modelValue":d=>o.is_show=d,"active-value":1,"inactive-value":0,onChange:d=>F(o)},null,8,["disabled","modelValue","onUpdate:modelValue","onChange"]),s("div",ne,[e(f,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])]),_:2},1032,["onClose","show-close","class"])]),_:1},8,["modelValue"])]),((u=m(n).list)==null?void 0:u.length)<c?(V(),v("div",de,[e(T,{class:"w-full",type:"primary",onClick:z},{default:t(()=>{var o;return[h(" 添加导航 "+w((o=m(n).list)==null?void 0:o.length)+" / "+w(c),1)]}),_:1})])):G("",!0)]}),_:1})]),_:1})],64)}}});export{_e as _};
@@ -1 +1 @@
import{o as V,q as E,r as w,v as t,D as o,bg as y,b6 as g,b7 as B,u as s,s as a,bc as C,bf as N,L as u,b9 as U,p as j}from"./.pnpm-CC7b2w5D.js";import{_ as k}from"./add-nav.vue_vue_type_script_setup_true_lang-C2JaYgWT.js";const D={class:"flex-1"},O=V({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(p,{emit:i}){const f=i,_=p,l=j({get:()=>_.content,set:m=>{f("update:content",m)}});return(m,e)=>{const x=B,c=g,d=y,r=N,b=C,v=U;return E(),w("div",null,[t(v,{"label-width":"70px"},{default:o(()=>[t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[t(c,{label:"标题"},{default:o(()=>[t(x,{class:"w-[396px]",modelValue:s(l).title,"onUpdate:modelValue":e[0]||(e[0]=n=>s(l).title=n)},null,8,["modelValue"])]),_:1})]),_:1}),t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[5]||(e[5]=a("div",{class:"flex items-end mb-4"},[a("div",{class:"text-base text-[#101010] font-medium"},"展示样式")],-1)),t(b,{modelValue:s(l).style,"onUpdate:modelValue":e[1]||(e[1]=n=>s(l).style=n)},{default:o(()=>[t(r,{value:1},{default:o(()=>[...e[3]||(e[3]=[u("横排",-1)])]),_:1}),t(r,{value:2},{default:o(()=>[...e[4]||(e[4]=[u("竖排",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[6]||(e[6]=a("div",{class:"flex items-end mb-4"},[a("div",{class:"text-base text-[#101010] font-medium"},"菜单"),a("div",{class:"text-xs text-tx-secondary ml-2"},"建议图片尺寸:100px*100px")],-1)),a("div",D,[t(k,{modelValue:s(l).data,"onUpdate:modelValue":e[2]||(e[2]=n=>s(l).data=n)},null,8,["modelValue"])])]),_:1})]),_:1})])}}});export{O as _}; import{o as V,q as E,r as w,v as t,D as o,bg as y,b6 as g,b7 as B,u as s,s as a,bc as C,bf as N,L as u,b9 as U,p as j}from"./.pnpm-C1KTa5cB.js";import{_ as k}from"./add-nav.vue_vue_type_script_setup_true_lang-DW1znYtt.js";const D={class:"flex-1"},O=V({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(p,{emit:i}){const f=i,_=p,l=j({get:()=>_.content,set:m=>{f("update:content",m)}});return(m,e)=>{const x=B,c=g,d=y,r=N,b=C,v=U;return E(),w("div",null,[t(v,{"label-width":"70px"},{default:o(()=>[t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[t(c,{label:"标题"},{default:o(()=>[t(x,{class:"w-[396px]",modelValue:s(l).title,"onUpdate:modelValue":e[0]||(e[0]=n=>s(l).title=n)},null,8,["modelValue"])]),_:1})]),_:1}),t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[5]||(e[5]=a("div",{class:"flex items-end mb-4"},[a("div",{class:"text-base text-[#101010] font-medium"},"展示样式")],-1)),t(b,{modelValue:s(l).style,"onUpdate:modelValue":e[1]||(e[1]=n=>s(l).style=n)},{default:o(()=>[t(r,{value:1},{default:o(()=>[...e[3]||(e[3]=[u("横排",-1)])]),_:1}),t(r,{value:2},{default:o(()=>[...e[4]||(e[4]=[u("竖排",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[6]||(e[6]=a("div",{class:"flex items-end mb-4"},[a("div",{class:"text-base text-[#101010] font-medium"},"菜单"),a("div",{class:"text-xs text-tx-secondary ml-2"},"建议图片尺寸:100px*100px")],-1)),a("div",D,[t(k,{modelValue:s(l).data,"onUpdate:modelValue":e[2]||(e[2]=n=>s(l).data=n)},null,8,["modelValue"])])]),_:1})]),_:1})])}}});export{O as _};
@@ -1 +1 @@
import{o as V,q as b,r as w,v as e,D as n,bg as x,b6 as g,b7 as k,u as o,s as E,b9 as U,p as v}from"./.pnpm-CC7b2w5D.js";import{_ as q}from"./picker-gGGrlx7D.js";const C=V({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(u,{emit:p}){const r=p,i=u,l=v({get:()=>i.content,set:d=>{r("update:content",d)}});return(d,t)=>{const s=k,m=g,_=q,c=x,f=U;return b(),w("div",null,[e(f,{"label-width":"90px",size:"large","label-position":"top"},{default:n(()=>[e(c,{shadow:"never",class:"!border-none flex mt-2"},{default:n(()=>[e(m,{label:"平台名称"},{default:n(()=>[e(s,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).title,"onUpdate:modelValue":t[0]||(t[0]=a=>o(l).title=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"客服二维码"},{default:n(()=>[E("div",null,[e(_,{modelValue:o(l).qrcode,"onUpdate:modelValue":t[1]||(t[1]=a=>o(l).qrcode=a),"exclude-domain":""},null,8,["modelValue"])])]),_:1}),e(m,{label:"备注"},{default:n(()=>[e(s,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).remark,"onUpdate:modelValue":t[2]||(t[2]=a=>o(l).remark=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"联系电话"},{default:n(()=>[e(s,{class:"w-[400px]",modelValue:o(l).mobile,"onUpdate:modelValue":t[3]||(t[3]=a=>o(l).mobile=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"服务时间"},{default:n(()=>[e(s,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).time,"onUpdate:modelValue":t[4]||(t[4]=a=>o(l).time=a)},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})])}}});export{C as _}; import{o as V,q as b,r as w,v as e,D as n,bg as x,b6 as g,b7 as k,u as o,s as E,b9 as U,p as v}from"./.pnpm-C1KTa5cB.js";import{_ as q}from"./picker-CNX2EN3u.js";const C=V({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(u,{emit:p}){const r=p,i=u,l=v({get:()=>i.content,set:d=>{r("update:content",d)}});return(d,t)=>{const s=k,m=g,_=q,c=x,f=U;return b(),w("div",null,[e(f,{"label-width":"90px",size:"large","label-position":"top"},{default:n(()=>[e(c,{shadow:"never",class:"!border-none flex mt-2"},{default:n(()=>[e(m,{label:"平台名称"},{default:n(()=>[e(s,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).title,"onUpdate:modelValue":t[0]||(t[0]=a=>o(l).title=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"客服二维码"},{default:n(()=>[E("div",null,[e(_,{modelValue:o(l).qrcode,"onUpdate:modelValue":t[1]||(t[1]=a=>o(l).qrcode=a),"exclude-domain":""},null,8,["modelValue"])])]),_:1}),e(m,{label:"备注"},{default:n(()=>[e(s,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).remark,"onUpdate:modelValue":t[2]||(t[2]=a=>o(l).remark=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"联系电话"},{default:n(()=>[e(s,{class:"w-[400px]",modelValue:o(l).mobile,"onUpdate:modelValue":t[3]||(t[3]=a=>o(l).mobile=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"服务时间"},{default:n(()=>[e(s,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).time,"onUpdate:modelValue":t[4]||(t[4]=a=>o(l).time=a)},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})])}}});export{C as _};
@@ -1 +1 @@
import{o as E,q as s,O as r,D as t,v as l,bg as F,b6 as C,bc as N,u as a,bf as z,L as p,b7 as B,P as i,s as b,b9 as O,p as j}from"./.pnpm-CC7b2w5D.js";import{_ as D}from"./index.vue_vue_type_script_setup_true_lang-Bd2sXtUT.js";import{_ as I}from"./picker-gGGrlx7D.js";const G=E({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(d,{emit:g}){const y=g,x=d,o=j({get:()=>x.content,set:f=>{y("update:content",f)}});return(f,e)=>{const m=z,_=N,u=C,v=B,V=I,k=D,U=F,w=O;return s(),r(w,{ref:"form","label-width":"80px",size:"large"},{default:t(()=>[l(U,{shadow:"never",class:"!border-none flex mt-2"},{default:t(()=>[l(u,{label:"页面标题"},{default:t(()=>[l(_,{modelValue:a(o).title_type,"onUpdate:modelValue":e[0]||(e[0]=n=>a(o).title_type=n)},{default:t(()=>[l(m,{value:"1"},{default:t(()=>[...e[7]||(e[7]=[p("文字",-1)])]),_:1}),l(m,{value:"2"},{default:t(()=>[...e[8]||(e[8]=[p("图片",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),d.content.title_type==1?(s(),r(u,{key:0},{default:t(()=>[l(v,{modelValue:a(o).title,"onUpdate:modelValue":e[1]||(e[1]=n=>a(o).title=n),maxlength:"8","show-word-limit":"",class:"w-[300px]",placeholder:"请输入页面标题"},null,8,["modelValue"])]),_:1})):i("",!0),d.content.title_type==2?(s(),r(u,{key:1},{default:t(()=>[l(V,{modelValue:a(o).title_img,"onUpdate:modelValue":e[2]||(e[2]=n=>a(o).title_img=n),limit:1,size:"100px"},null,8,["modelValue"]),e[9]||(e[9]=b("div",{class:"form-tips"},"建议图片尺寸:300px*40px",-1))]),_:1})):i("",!0),d.content.title_type==1?(s(),r(u,{key:2,label:"文字颜色"},{default:t(()=>[l(_,{modelValue:a(o).text_color,"onUpdate:modelValue":e[3]||(e[3]=n=>a(o).text_color=n)},{default:t(()=>[l(m,{value:"1"},{default:t(()=>[...e[10]||(e[10]=[p("白色",-1)])]),_:1}),l(m,{value:"2"},{default:t(()=>[...e[11]||(e[11]=[p("黑色",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})):i("",!0),l(u,{label:"页面背景"},{default:t(()=>[l(_,{modelValue:a(o).bg_type,"onUpdate:modelValue":e[4]||(e[4]=n=>a(o).bg_type=n)},{default:t(()=>[l(m,{value:"1"},{default:t(()=>[...e[12]||(e[12]=[p("背景颜色",-1)])]),_:1}),l(m,{value:"2"},{default:t(()=>[...e[13]||(e[13]=[p("背景图片",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),d.content.bg_type==1?(s(),r(u,{key:3},{default:t(()=>[l(k,{modelValue:a(o).bg_color,"onUpdate:modelValue":e[5]||(e[5]=n=>a(o).bg_color=n),"reset-color":"#F5F5F5"},null,8,["modelValue"])]),_:1})):i("",!0),d.content.bg_type==2?(s(),r(u,{key:4},{default:t(()=>[l(V,{modelValue:a(o).bg_image,"onUpdate:modelValue":e[6]||(e[6]=n=>a(o).bg_image=n),limit:1,size:"100px"},null,8,["modelValue"]),e[14]||(e[14]=b("div",{class:"form-tips"},"建议图片尺寸:750px*高度不限",-1))]),_:1})):i("",!0)]),_:1})]),_:1},512)}}});export{G as _}; import{o as E,q as s,O as r,D as t,v as l,bg as F,b6 as C,bc as N,u as a,bf as z,L as p,b7 as B,P as i,s as b,b9 as O,p as j}from"./.pnpm-C1KTa5cB.js";import{_ as D}from"./index.vue_vue_type_script_setup_true_lang-CScz2Hxp.js";import{_ as I}from"./picker-CNX2EN3u.js";const G=E({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(d,{emit:g}){const y=g,x=d,o=j({get:()=>x.content,set:f=>{y("update:content",f)}});return(f,e)=>{const m=z,_=N,u=C,v=B,V=I,k=D,U=F,w=O;return s(),r(w,{ref:"form","label-width":"80px",size:"large"},{default:t(()=>[l(U,{shadow:"never",class:"!border-none flex mt-2"},{default:t(()=>[l(u,{label:"页面标题"},{default:t(()=>[l(_,{modelValue:a(o).title_type,"onUpdate:modelValue":e[0]||(e[0]=n=>a(o).title_type=n)},{default:t(()=>[l(m,{value:"1"},{default:t(()=>[...e[7]||(e[7]=[p("文字",-1)])]),_:1}),l(m,{value:"2"},{default:t(()=>[...e[8]||(e[8]=[p("图片",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),d.content.title_type==1?(s(),r(u,{key:0},{default:t(()=>[l(v,{modelValue:a(o).title,"onUpdate:modelValue":e[1]||(e[1]=n=>a(o).title=n),maxlength:"8","show-word-limit":"",class:"w-[300px]",placeholder:"请输入页面标题"},null,8,["modelValue"])]),_:1})):i("",!0),d.content.title_type==2?(s(),r(u,{key:1},{default:t(()=>[l(V,{modelValue:a(o).title_img,"onUpdate:modelValue":e[2]||(e[2]=n=>a(o).title_img=n),limit:1,size:"100px"},null,8,["modelValue"]),e[9]||(e[9]=b("div",{class:"form-tips"},"建议图片尺寸:300px*40px",-1))]),_:1})):i("",!0),d.content.title_type==1?(s(),r(u,{key:2,label:"文字颜色"},{default:t(()=>[l(_,{modelValue:a(o).text_color,"onUpdate:modelValue":e[3]||(e[3]=n=>a(o).text_color=n)},{default:t(()=>[l(m,{value:"1"},{default:t(()=>[...e[10]||(e[10]=[p("白色",-1)])]),_:1}),l(m,{value:"2"},{default:t(()=>[...e[11]||(e[11]=[p("黑色",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})):i("",!0),l(u,{label:"页面背景"},{default:t(()=>[l(_,{modelValue:a(o).bg_type,"onUpdate:modelValue":e[4]||(e[4]=n=>a(o).bg_type=n)},{default:t(()=>[l(m,{value:"1"},{default:t(()=>[...e[12]||(e[12]=[p("背景颜色",-1)])]),_:1}),l(m,{value:"2"},{default:t(()=>[...e[13]||(e[13]=[p("背景图片",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),d.content.bg_type==1?(s(),r(u,{key:3},{default:t(()=>[l(k,{modelValue:a(o).bg_color,"onUpdate:modelValue":e[5]||(e[5]=n=>a(o).bg_color=n),"reset-color":"#F5F5F5"},null,8,["modelValue"])]),_:1})):i("",!0),d.content.bg_type==2?(s(),r(u,{key:4},{default:t(()=>[l(V,{modelValue:a(o).bg_image,"onUpdate:modelValue":e[6]||(e[6]=n=>a(o).bg_image=n),limit:1,size:"100px"},null,8,["modelValue"]),e[14]||(e[14]=b("div",{class:"form-tips"},"建议图片尺寸:750px*高度不限",-1))]),_:1})):i("",!0)]),_:1})]),_:1},512)}}});export{G as _};
@@ -1 +1 @@
import{o as k,q as d,r as u,v as l,D as o,bg as F,s,bc as U,u as n,bf as B,L as x,b6 as C,bm as N,F as b,G as c,bn as O,b9 as j,p as D}from"./.pnpm-CC7b2w5D.js";import{_ as G}from"./add-nav.vue_vue_type_script_setup_true_lang-C2JaYgWT.js";const L={class:"flex-1 mt-4"},I=k({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(v,{emit:V}){const y=V,w=v,a=D({get:()=>w.content,set:m=>{y("update:content",m)}});return(m,e)=>{const r=B,E=U,p=O,_=N,i=C,f=F,g=j;return d(),u("div",null,[l(g,{"label-width":"70px"},{default:o(()=>[l(f,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[6]||(e[6]=s("div",{class:"flex items-end mb-4"},[s("div",{class:"text-base text-[#101010] font-medium"},"展示样式")],-1)),l(E,{modelValue:n(a).style,"onUpdate:modelValue":e[0]||(e[0]=t=>n(a).style=t)},{default:o(()=>[l(r,{value:1},{default:o(()=>[...e[4]||(e[4]=[x("固定显示",-1)])]),_:1}),l(r,{value:2},{default:o(()=>[...e[5]||(e[5]=[x("分页滑动",-1)])]),_:1})]),_:1},8,["modelValue"]),l(i,{label:"每行数量",class:"mt-4"},{default:o(()=>[l(_,{modelValue:n(a).per_line,"onUpdate:modelValue":e[1]||(e[1]=t=>n(a).per_line=t),style:{width:"300px"}},{default:o(()=>[(d(),u(b,null,c(5,t=>l(p,{key:t,label:t+"个",value:t},null,8,["label","value"])),64))]),_:1},8,["modelValue"])]),_:1}),l(i,{label:"显示行数"},{default:o(()=>[l(_,{modelValue:n(a).show_line,"onUpdate:modelValue":e[2]||(e[2]=t=>n(a).show_line=t),style:{width:"300px"}},{default:o(()=>[(d(),u(b,null,c(2,t=>l(p,{key:t,label:t+"行",value:t},null,8,["label","value"])),64))]),_:1},8,["modelValue"])]),_:1})]),_:1}),l(f,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[7]||(e[7]=s("div",{class:"flex items-end"},[s("div",{class:"text-base text-[#101010] font-medium"},"菜单设置"),s("div",{class:"text-xs text-tx-secondary ml-2"},"建议图片尺寸:100px*100px")],-1)),s("div",L,[l(G,{modelValue:n(a).data,"onUpdate:modelValue":e[3]||(e[3]=t=>n(a).data=t)},null,8,["modelValue"])])]),_:1})]),_:1})])}}});export{I as _}; import{o as k,q as d,r as u,v as l,D as o,bg as F,s,bc as U,u as n,bf as B,L as x,b6 as C,bm as N,F as b,G as c,bn as O,b9 as j,p as D}from"./.pnpm-C1KTa5cB.js";import{_ as G}from"./add-nav.vue_vue_type_script_setup_true_lang-DW1znYtt.js";const L={class:"flex-1 mt-4"},I=k({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(v,{emit:V}){const y=V,w=v,a=D({get:()=>w.content,set:m=>{y("update:content",m)}});return(m,e)=>{const r=B,E=U,p=O,_=N,i=C,f=F,g=j;return d(),u("div",null,[l(g,{"label-width":"70px"},{default:o(()=>[l(f,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[6]||(e[6]=s("div",{class:"flex items-end mb-4"},[s("div",{class:"text-base text-[#101010] font-medium"},"展示样式")],-1)),l(E,{modelValue:n(a).style,"onUpdate:modelValue":e[0]||(e[0]=t=>n(a).style=t)},{default:o(()=>[l(r,{value:1},{default:o(()=>[...e[4]||(e[4]=[x("固定显示",-1)])]),_:1}),l(r,{value:2},{default:o(()=>[...e[5]||(e[5]=[x("分页滑动",-1)])]),_:1})]),_:1},8,["modelValue"]),l(i,{label:"每行数量",class:"mt-4"},{default:o(()=>[l(_,{modelValue:n(a).per_line,"onUpdate:modelValue":e[1]||(e[1]=t=>n(a).per_line=t),style:{width:"300px"}},{default:o(()=>[(d(),u(b,null,c(5,t=>l(p,{key:t,label:t+"个",value:t},null,8,["label","value"])),64))]),_:1},8,["modelValue"])]),_:1}),l(i,{label:"显示行数"},{default:o(()=>[l(_,{modelValue:n(a).show_line,"onUpdate:modelValue":e[2]||(e[2]=t=>n(a).show_line=t),style:{width:"300px"}},{default:o(()=>[(d(),u(b,null,c(2,t=>l(p,{key:t,label:t+"行",value:t},null,8,["label","value"])),64))]),_:1},8,["modelValue"])]),_:1})]),_:1}),l(f,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[7]||(e[7]=s("div",{class:"flex items-end"},[s("div",{class:"text-base text-[#101010] font-medium"},"菜单设置"),s("div",{class:"text-xs text-tx-secondary ml-2"},"建议图片尺寸:100px*100px")],-1)),s("div",L,[l(G,{modelValue:n(a).data,"onUpdate:modelValue":e[3]||(e[3]=t=>n(a).data=t)},null,8,["modelValue"])])]),_:1})]),_:1})])}}});export{I as _};
@@ -1 +1 @@
import{o as I,q as i,r as g,v as t,D as l,bg as O,s,u,bQ as j,O as F,b6 as q,b7 as z,I as A,K,L,P,b9 as Q,p as R,cm as b}from"./.pnpm-CC7b2w5D.js";import{_ as S}from"./index-DP3bicdH.js";import{c as T,i as v}from"./index-SornbJeu.js";import{_ as G}from"./picker-unxcKHGX.js";import{_ as H}from"./picker-gGGrlx7D.js";const J={class:"bg-fill-light flex items-center w-full p-4 mt-4"},M={class:"ml-3 flex-1"},W={class:"flex-1 flex items-center"},X={class:"drag-move cursor-move ml-auto"},Y={key:0,class:"mt-4"},p=5,le=I({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(r,{emit:h}){const m=h,c=r,f=R({get:()=>c.content,set:a=>{m("update:content",a)}}),k=()=>{var a;if(((a=c.content.data)==null?void 0:a.length)<p){const e=b(c.content);e.data.push({is_show:"1",image:"",name:"",link:{}}),m("update:content",e)}else v.msgError(`最多添加${p}张图片`)},w=a=>{var d;if(((d=c.content.data)==null?void 0:d.length)<=1)return v.msgError("最少保留一张图片");const e=b(c.content);e.data.splice(a,1),m("update:content",e)};return(a,e)=>{const d=H,y=z,_=q,E=G,U=A,C=T,B=S,D=K,N=O,$=Q;return i(),g("div",null,[t($,{"label-width":"70px"},{default:l(()=>[t(N,{shadow:"never",class:"!border-none flex mt-2"},{default:l(()=>{var x;return[e[2]||(e[2]=s("div",{class:"flex items-end mb-4"},[s("div",{class:"text-base text-[#101010] font-medium"},"菜单"),s("div",{class:"text-xs text-tx-secondary ml-2"}," 最多添加5张,建议图片尺寸:750px*200px ")],-1)),t(u(j),{class:"draggable",modelValue:u(f).data,"onUpdate:modelValue":e[0]||(e[0]=o=>u(f).data=o),animation:"300",handle:".drag-move","item-key":"index"},{item:l(({element:o,index:V})=>[(i(),F(B,{key:V,onClose:n=>w(V),class:"w-[467px]"},{default:l(()=>[s("div",J,[t(d,{modelValue:o.image,"onUpdate:modelValue":n=>o.image=n,"upload-class":"bg-body","exclude-domain":""},null,8,["modelValue","onUpdate:modelValue"]),s("div",M,[t(_,{label:"图片名称"},{default:l(()=>[t(y,{modelValue:o.name,"onUpdate:modelValue":n=>o.name=n,placeholder:"请输入名称"},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),t(_,{class:"mt-[18px]",label:"图片链接"},{default:l(()=>[t(E,{modelValue:o.link,"onUpdate:modelValue":n=>o.link=n},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),t(_,{label:"是否显示",class:"mt-[18px]"},{default:l(()=>[s("div",W,[t(U,{modelValue:o.is_show,"onUpdate:modelValue":n=>o.is_show=n,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),s("div",X,[t(C,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"]),((x=r.content.data)==null?void 0:x.length)<p?(i(),g("div",Y,[t(D,{class:"w-full",type:"primary",onClick:k},{default:l(()=>[...e[1]||(e[1]=[L("添加图片",-1)])]),_:1})])):P("",!0)]}),_:1})]),_:1})])}}});export{le as _}; import{o as I,q as i,r as g,v as t,D as l,bg as O,s,u,bQ as j,O as F,b6 as q,b7 as z,I as A,K,L,P,b9 as Q,p as R,cn as b}from"./.pnpm-C1KTa5cB.js";import{_ as S}from"./index-B-rCQZ_o.js";import{c as T,i as v}from"./index-Cxx1IoGl.js";import{_ as G}from"./picker-BaeJGhM3.js";import{_ as H}from"./picker-CNX2EN3u.js";const J={class:"bg-fill-light flex items-center w-full p-4 mt-4"},M={class:"ml-3 flex-1"},W={class:"flex-1 flex items-center"},X={class:"drag-move cursor-move ml-auto"},Y={key:0,class:"mt-4"},p=5,le=I({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(r,{emit:h}){const m=h,c=r,f=R({get:()=>c.content,set:a=>{m("update:content",a)}}),k=()=>{var a;if(((a=c.content.data)==null?void 0:a.length)<p){const e=b(c.content);e.data.push({is_show:"1",image:"",name:"",link:{}}),m("update:content",e)}else v.msgError(`最多添加${p}张图片`)},w=a=>{var d;if(((d=c.content.data)==null?void 0:d.length)<=1)return v.msgError("最少保留一张图片");const e=b(c.content);e.data.splice(a,1),m("update:content",e)};return(a,e)=>{const d=H,y=z,_=q,E=G,U=A,C=T,B=S,D=K,N=O,$=Q;return i(),g("div",null,[t($,{"label-width":"70px"},{default:l(()=>[t(N,{shadow:"never",class:"!border-none flex mt-2"},{default:l(()=>{var x;return[e[2]||(e[2]=s("div",{class:"flex items-end mb-4"},[s("div",{class:"text-base text-[#101010] font-medium"},"菜单"),s("div",{class:"text-xs text-tx-secondary ml-2"}," 最多添加5张,建议图片尺寸:750px*200px ")],-1)),t(u(j),{class:"draggable",modelValue:u(f).data,"onUpdate:modelValue":e[0]||(e[0]=o=>u(f).data=o),animation:"300",handle:".drag-move","item-key":"index"},{item:l(({element:o,index:V})=>[(i(),F(B,{key:V,onClose:n=>w(V),class:"w-[467px]"},{default:l(()=>[s("div",J,[t(d,{modelValue:o.image,"onUpdate:modelValue":n=>o.image=n,"upload-class":"bg-body","exclude-domain":""},null,8,["modelValue","onUpdate:modelValue"]),s("div",M,[t(_,{label:"图片名称"},{default:l(()=>[t(y,{modelValue:o.name,"onUpdate:modelValue":n=>o.name=n,placeholder:"请输入名称"},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),t(_,{class:"mt-[18px]",label:"图片链接"},{default:l(()=>[t(E,{modelValue:o.link,"onUpdate:modelValue":n=>o.link=n},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),t(_,{label:"是否显示",class:"mt-[18px]"},{default:l(()=>[s("div",W,[t(U,{modelValue:o.is_show,"onUpdate:modelValue":n=>o.is_show=n,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),s("div",X,[t(C,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"]),((x=r.content.data)==null?void 0:x.length)<p?(i(),g("div",Y,[t(D,{class:"w-full",type:"primary",onClick:k},{default:l(()=>[...e[1]||(e[1]=[L("添加图片",-1)])]),_:1})])):P("",!0)]}),_:1})]),_:1})])}}});export{le as _};

Some files were not shown because too many files have changed in this diff Show More