This commit is contained in:
Your Name
2026-05-06 18:17:37 +08:00
parent c389fea73c
commit a7fd55aa1c
16 changed files with 2069 additions and 375 deletions
+13
View File
@@ -68,6 +68,19 @@ export function yejiStatsLeadLines(params: {
return request.get({ url: '/stats.yejiStats/leadLines', params })
}
/** 二中心复诊:部门行下钻医助 × 业务订单笔数 */
export function yejiStatsRevisitBreakdown(params: {
start_date: string
end_date: string
dept_id: number
revisit_slot: number
dept_ids?: string
channel_code?: string
tag_id?: string
}) {
return request.get({ url: '/stats.yejiStats/revisitBreakdown', params })
}
export function doctorDailyStatsOverview(params: {
start_date?: string
end_date?: string
+108 -3
View File
@@ -669,6 +669,49 @@
</el-table-column>
</el-table>
<el-alert
v-if="editMode === 'edit'"
type="warning"
:closable="false"
show-icon
class="mt-3"
v-loading="rxLinkedOrderHint.loading"
>
<template #title>业务订单要求(请与本处方保持一致)</template>
<div class="text-sm mt-1 leading-relaxed">
<template
v-if="
rxLinkedOrderHint.orderNo ||
rxLinkedOrderHint.medicationDays != null ||
rxLinkedOrderHint.remarkAssistant
"
>
<p v-if="rxLinkedOrderHint.orderNo" class="mb-1.5">
最近关联订单(按创建倒序):
<span class="font-mono text-primary">{{ rxLinkedOrderHint.orderNo }}</span>
</p>
<p class="mb-1.5">
<span class="font-semibold">服用天数(订单)</span>
{{
rxLinkedOrderHint.medicationDays != null
? `${rxLinkedOrderHint.medicationDays} 天`
: '— 订单未填写'
}}
</p>
<p>
<span class="font-semibold">医助备注(订单)</span>
<span class="whitespace-pre-wrap">{{
rxLinkedOrderHint.remarkAssistant || '— 无'
}}</span>
</p>
</template>
<p v-else-if="!rxLinkedOrderHint.loading" class="text-gray-600">
当前处方暂无关联业务订单,或您无订单列表权限;若有订单,将在此处显示订单内
<span class="font-semibold">服用天数</span>与
<span class="font-semibold">医助备注</span>。
</p>
</div>
</el-alert>
</div>
</el-form-item>
@@ -1183,7 +1226,7 @@
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注">
<el-form-item v-perms="['tcm.prescriptionOrder/editRemarkExtra']" label="药房备注">
<el-input
v-model="createOrderForm.remark_extra"
type="textarea"
@@ -1193,6 +1236,16 @@
show-word-limit
/>
</el-form-item>
<el-form-item label="医助备注">
<el-input
v-model="createOrderForm.remark_assistant"
type="textarea"
:rows="3"
placeholder="选填,医助对内说明"
maxlength="500"
show-word-limit
/>
</el-form-item>
</el-col>
</el-row>
</div>
@@ -1333,6 +1386,7 @@ import {
prescriptionDetail,
prescriptionOrderCreate,
prescriptionOrderPaidPayOrders,
prescriptionOrderLists,
getDoctors,
prescriptionLibraryLists
} from '@/api/tcm'
@@ -1475,6 +1529,7 @@ const createOrderForm = reactive({
amount: 0,
internal_cost: undefined as number | undefined,
remark_extra: '',
remark_assistant: '',
pay_order_ids: [] as number[]
})
@@ -1714,6 +1769,7 @@ function resetCreateOrderForm() {
createOrderForm.amount = 0
createOrderForm.internal_cost = undefined
createOrderForm.remark_extra = ''
createOrderForm.remark_assistant = ''
createOrderForm.pay_order_ids = []
createOrderPatientList.value = []
createOrderPaidOrders.value = []
@@ -1884,7 +1940,8 @@ async function submitCreateOrderFromPrescription() {
tracking_number: createOrderForm.tracking_number || '',
fee_type: createOrderForm.fee_type,
amount: createOrderForm.amount,
remark_extra: createOrderForm.remark_extra || ''
remark_extra: createOrderForm.remark_extra || '',
remark_assistant: createOrderForm.remark_assistant || ''
}
// 添加省市区字段
@@ -2238,6 +2295,52 @@ const editForm = reactive({
times_per_day: 2
})
/** 编辑页:关联业务订单上的服用天数、医助备注(与处方提示一致) */
const rxLinkedOrderHint = reactive({
loading: false,
orderNo: '',
medicationDays: null as number | null,
remarkAssistant: ''
})
function clearRxLinkedOrderHint() {
rxLinkedOrderHint.loading = false
rxLinkedOrderHint.orderNo = ''
rxLinkedOrderHint.medicationDays = null
rxLinkedOrderHint.remarkAssistant = ''
}
async function loadRxLinkedOrderHintForEdit(prescriptionId: number) {
rxLinkedOrderHint.orderNo = ''
rxLinkedOrderHint.medicationDays = null
rxLinkedOrderHint.remarkAssistant = ''
if (!prescriptionId) {
rxLinkedOrderHint.loading = false
return
}
rxLinkedOrderHint.loading = true
try {
const data: any = await prescriptionOrderLists({
page_no: 1,
page_size: 5,
prescription_id: prescriptionId
})
const lists = data?.lists
const row = Array.isArray(lists) && lists.length ? lists[0] : null
if (row) {
rxLinkedOrderHint.orderNo = String(row.order_no || '').trim()
const md = row.medication_days
const mdn = md !== null && md !== undefined && String(md).trim() !== '' ? Number(md) : NaN
rxLinkedOrderHint.medicationDays = Number.isFinite(mdn) && mdn > 0 ? mdn : null
rxLinkedOrderHint.remarkAssistant = String(row.remark_assistant || '').trim()
}
} catch {
/* 无列表权限或网络错误:保持空 */
} finally {
rxLinkedOrderHint.loading = false
}
}
const diagnosisViewRef = ref<{
openViewOnly: (id: number) => Promise<void>
} | null>(null)
@@ -2882,6 +2985,7 @@ const resetForm = () => {
editForm.is_system_auto = 0
editForm.business_prescription_audit_rejected = 0
editForm.business_prescription_audit_remark = ''
clearRxLinkedOrderHint()
}
// 新增处方
@@ -3009,8 +3113,9 @@ const handleEdit = async (row: any) => {
setTimeout(() => {
isLoadingData.value = false
}, 0)
showEdit.value = true
void loadRxLinkedOrderHintForEdit(Number(editForm.id))
nextTick(() => {
formRef.value?.clearValidate()
scheduleEditSignatureInit()
@@ -994,7 +994,7 @@
<template v-if="detailLinkedAppointment">
<div class="flex flex-wrap items-center gap-x-4 gap-y-1 text-[13px]">
<span
>预约 <span class="font-mono text-primary">#{{ detailLinkedAppointment.id }}</span></span
>流转编号(挂号) <span class="font-mono text-primary">#{{ detailLinkedAppointment.id }}</span></span
>
<span class="text-gray-500"
>时间:{{ detailLinkedAppointment.appointment_date }}
@@ -1056,7 +1056,8 @@
{{ expressCompanyLabel(detailData.express_company) }}
</el-descriptions-item>
<el-descriptions-item label="备注" :span="3">{{ detailData.remark_extra || '—' }}</el-descriptions-item>
<el-descriptions-item v-perms="['tcm.prescriptionOrder/editRemarkExtra']" label="药房备注" :span="3">{{ detailData.remark_extra || '—' }}</el-descriptions-item>
<el-descriptions-item label="医助备注" :span="3">{{ detailData.remark_assistant || '—' }}</el-descriptions-item>
<el-descriptions-item label="处方审核意见" :span="3">
<span class="po-audit-remark">{{ detailData.prescription_audit_remark || '—' }}</span>
</el-descriptions-item>
@@ -1527,7 +1528,7 @@
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注">
<el-form-item v-perms="['tcm.prescriptionOrder/editRemarkExtra']" label="药房备注">
<el-input
v-model="editForm.remark_extra"
type="textarea"
@@ -1537,6 +1538,16 @@
show-word-limit
/>
</el-form-item>
<el-form-item label="医助备注">
<el-input
v-model="editForm.remark_assistant"
type="textarea"
:rows="3"
placeholder="选填,医助对内说明"
maxlength="500"
show-word-limit
/>
</el-form-item>
</el-col>
</el-row>
</div>
@@ -2032,11 +2043,11 @@
<div class="rx-rp-cols-head">
<div class="rx-rp-col-head">
<span>用药 (单剂)</span>
<span>总量</span>
<span>{{ prescriptionTabType === 'user' ? '用量' : '总量' }}</span>
</div>
<div class="rx-rp-col-head">
<span>用药 (单剂)</span>
<span>总量</span>
<span>{{ prescriptionTabType === 'user' ? '用量' : '总量' }}</span>
</div>
</div>
</div>
@@ -3521,6 +3532,7 @@ const editForm = reactive({
fee_type: 3,
amount: 0,
remark_extra: '',
remark_assistant: '',
pay_order_ids: [] as number[],
internal_cost: undefined as number | string | undefined,
/** 关联诊单医助 id(只读,来自订单详情;列表筛选用) */
@@ -3771,6 +3783,7 @@ async function openEdit(row: { id: number }) {
editForm.amount = amt
editForm.remark_extra = d.remark_extra || ''
editForm.remark_assistant = d.remark_assistant || ''
const pids = d.pay_order_ids
editForm.pay_order_ids = Array.isArray(pids) ? pids.map((x: unknown) => Number(x)).filter((n) => !Number.isNaN(n)) : []
editForm.internal_cost =
@@ -3809,6 +3822,7 @@ async function submitEdit() {
fee_type: editForm.fee_type,
amount: editForm.amount,
remark_extra: editForm.remark_extra || '',
remark_assistant: editForm.remark_assistant || '',
// BUG FIX: 修复之前无法清空部分选填字段的问题
medication_days: (editForm.medication_days != null && String(editForm.medication_days).trim() !== '') ? editForm.medication_days : '',
@@ -4090,6 +4104,7 @@ async function submitQuickTrack() {
fee_type: Number(d.fee_type) || 3,
amount: Number(d.amount) || 0,
remark_extra: d.remark_extra || '',
remark_assistant: d.remark_assistant || '',
internal_cost: (d.internal_cost != null && d.internal_cost !== '') ? d.internal_cost : '',
pay_order_ids: Array.isArray(d.pay_order_ids) ? d.pay_order_ids : [],
// 仅覆盖快递字段
@@ -1091,7 +1091,8 @@
{{ expressCompanyLabel(detailData.express_company) }}
</el-descriptions-item>
<el-descriptions-item label="备注" :span="3">{{ detailData.remark_extra || '—' }}</el-descriptions-item>
<el-descriptions-item v-perms="['tcm.prescriptionOrder/editRemarkExtra']" label="备注" :span="3">{{ detailData.remark_extra || '' }}</el-descriptions-item>
<el-descriptions-item label="医助备注" :span="3">{{ detailData.remark_assistant || '—' }}</el-descriptions-item>
<el-descriptions-item label="处方审核意见" :span="3">
<span class="po-audit-remark">{{ detailData.prescription_audit_remark || '—' }}</span>
</el-descriptions-item>
@@ -1563,7 +1564,7 @@
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注">
<el-form-item v-perms="['tcm.prescriptionOrder/editRemarkExtra']" label="药房备注">
<el-input
v-model="editForm.remark_extra"
type="textarea"
@@ -1573,6 +1574,16 @@
show-word-limit
/>
</el-form-item>
<el-form-item label="医助备注">
<el-input
v-model="editForm.remark_assistant"
type="textarea"
:rows="3"
placeholder="选填,医助对内说明"
maxlength="500"
show-word-limit
/>
</el-form-item>
</el-col>
</el-row>
</div>
@@ -3575,6 +3586,7 @@ const editForm = reactive({
fee_type: 3,
amount: 0,
remark_extra: '',
remark_assistant: '',
pay_order_ids: [] as number[],
internal_cost: undefined as number | string | undefined,
/** 关联诊单医助 id(只读,来自订单详情;列表筛选用) */
@@ -3825,6 +3837,7 @@ async function openEdit(row: { id: number }) {
editForm.amount = amt
editForm.remark_extra = d.remark_extra || ''
editForm.remark_assistant = d.remark_assistant || ''
const pids = d.pay_order_ids
editForm.pay_order_ids = Array.isArray(pids) ? pids.map((x: unknown) => Number(x)).filter((n) => !Number.isNaN(n)) : []
editForm.internal_cost =
@@ -3863,6 +3876,7 @@ async function submitEdit() {
fee_type: editForm.fee_type,
amount: editForm.amount,
remark_extra: editForm.remark_extra || '',
remark_assistant: editForm.remark_assistant || '',
// BUG FIX:
medication_days: (editForm.medication_days != null && String(editForm.medication_days).trim() !== '') ? editForm.medication_days : '',
@@ -4142,6 +4156,7 @@ async function submitQuickTrack() {
fee_type: Number(d.fee_type) || 3,
amount: Number(d.amount) || 0,
remark_extra: d.remark_extra || '',
remark_assistant: d.remark_assistant || '',
internal_cost: (d.internal_cost != null && d.internal_cost !== '') ? d.internal_cost : '',
pay_order_ids: Array.isArray(d.pay_order_ids) ? d.pay_order_ids : [],
//
File diff suppressed because it is too large Load Diff
+30 -3
View File
@@ -1623,6 +1623,7 @@ defineExpose({
.el-drawer__body {
background: #f8fafc;
min-width: 0;
}
.el-drawer__footer {
@@ -1631,22 +1632,48 @@ defineExpose({
box-shadow: 0 -4px 24px rgb(15 23 42 / 7%);
}
/* Tab 标签保证在窄抽屉内可横向滚动 flex 子项 min-width EP 内层 overflow */
.tcm-diagnosis-tabs.el-tabs {
width: 100%;
max-width: 100%;
min-width: 0;
box-sizing: border-box;
}
.tcm-diagnosis-tabs .el-tabs__header {
min-width: 0;
width: 100%;
}
.tcm-diagnosis-tabs .el-tabs__nav-wrap {
flex: 1;
min-width: 0;
overflow-x: auto;
overflow-y: hidden;
-webkit-overflow-scrolling: touch;
scrollbar-width: none;
scrollbar-width: thin;
scrollbar-color: rgb(148 163 184 / 55%) transparent;
}
.tcm-diagnosis-tabs .el-tabs__nav-wrap::-webkit-scrollbar {
display: none;
height: 0;
height: 4px;
}
.tcm-diagnosis-tabs .el-tabs__nav-wrap::-webkit-scrollbar-thumb {
background-color: rgb(148 163 184 / 55%);
border-radius: 4px;
}
.tcm-diagnosis-tabs .el-tabs__nav-scroll {
overflow: visible !important;
}
.tcm-diagnosis-tabs .el-tabs__nav {
display: flex;
flex-wrap: nowrap;
float: none !important;
width: max-content;
min-width: 100%;
}
.tcm-diagnosis-tabs .el-tabs__item {