更新
This commit is contained in:
@@ -1376,8 +1376,8 @@ const handleNewPrescription = async () => {
|
||||
formData.dose_count = 1
|
||||
formData.dose_unit = saved.dose_unit || '剂'
|
||||
formData.usage_days = 7
|
||||
formData.usage_instruction = '水煎服,一日二次'
|
||||
formData.usage_time = '饭前'
|
||||
formData.usage_instruction = ''
|
||||
formData.usage_time = '饭后'
|
||||
formData.usage_way = '温水送服'
|
||||
formData.dietary_taboo = []
|
||||
formData.usage_notes = ''
|
||||
|
||||
@@ -53,6 +53,15 @@
|
||||
</div>
|
||||
<div class="pl-toolbar__line pl-toolbar__line--second">
|
||||
<el-form :model="formData" inline class="pl-toolbar__form">
|
||||
<el-form-item label="处方编号" class="!mb-0">
|
||||
<el-input
|
||||
v-model="formData.sn"
|
||||
placeholder="编号"
|
||||
clearable
|
||||
class="pl-toolbar__input"
|
||||
@keyup.enter="resetPage"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="患者" class="!mb-0">
|
||||
<el-input
|
||||
v-model="formData.patient_name"
|
||||
@@ -944,7 +953,7 @@
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="8">
|
||||
<el-form-item label="疗程" class="create-order-form-item--inline-num">
|
||||
<el-form-item label="服用天数" class="create-order-form-item--inline-num">
|
||||
<div class="flex items-center gap-1 w-full">
|
||||
<el-input-number
|
||||
v-model="createOrderForm.medication_days"
|
||||
@@ -1292,6 +1301,8 @@ function goBusinessOrderList() {
|
||||
|
||||
// 表单数据(与列表接口查询参数一致)
|
||||
const formData = reactive({
|
||||
/** 处方编号(后台 sn,模糊匹配) */
|
||||
sn: '',
|
||||
patient_name: '',
|
||||
/** 处方创建人(医师账号 ID),多选 */
|
||||
creator_ids: [] as number[],
|
||||
@@ -2082,6 +2093,7 @@ function formatListCreateTime(v: unknown) {
|
||||
function resetParams() {
|
||||
syncingDateTab = true
|
||||
dateQuickTab.value = 'all'
|
||||
formData.sn = ''
|
||||
formData.patient_name = ''
|
||||
formData.creator_ids = []
|
||||
formData.audit_filter = 'all'
|
||||
@@ -2501,8 +2513,8 @@ const resetForm = () => {
|
||||
editForm.dose_count = 7
|
||||
editForm.dose_unit = '剂'
|
||||
editForm.usage_days = 7
|
||||
editForm.usage_instruction = '水煎服,一日二次'
|
||||
editForm.usage_time = '饭前'
|
||||
editForm.usage_instruction = ''
|
||||
editForm.usage_time = '饭后'
|
||||
editForm.usage_way = '温水送服'
|
||||
editForm.dietary_taboo = []
|
||||
editForm.usage_notes = ''
|
||||
@@ -2620,8 +2632,8 @@ const handleEdit = async (row: any) => {
|
||||
editForm.dose_unit = src.dose_unit || '剂'
|
||||
editForm.usage_days = src.usage_days ?? 7
|
||||
editForm.times_per_day = src.times_per_day ?? 2
|
||||
editForm.usage_instruction = src.usage_instruction || '水煎服,一日二次'
|
||||
editForm.usage_time = src.usage_time || '饭前'
|
||||
editForm.usage_instruction = src.usage_instruction || ''
|
||||
editForm.usage_time = src.usage_time || '饭后'
|
||||
editForm.usage_way = src.usage_way || '温水送服'
|
||||
editForm.dietary_taboo = src.dietary_taboo
|
||||
? (Array.isArray(src.dietary_taboo) ? src.dietary_taboo : String(src.dietary_taboo).split(',').filter((v: string) => v))
|
||||
|
||||
@@ -78,8 +78,20 @@
|
||||
<el-icon :size="16" class="text-sky-500"><Calendar /></el-icon>
|
||||
{{ listStats.orderHeading }}
|
||||
</div>
|
||||
<div class="mt-2 text-2xl sm:text-[26px] font-bold text-slate-800 tracking-tight tabular-nums">
|
||||
¥{{ listStats.orderStr }}
|
||||
<div class="mt-2 space-y-1.5 min-w-0">
|
||||
<div class="flex flex-col sm:flex-row sm:flex-wrap gap-x-4 gap-y-1 text-sm sm:text-base">
|
||||
<span class="text-slate-600">
|
||||
未取消
|
||||
<span class="text-xl sm:text-[22px] font-bold text-slate-800 tabular-nums"
|
||||
>¥{{ listStats.orderNotCancelledStr }}</span>
|
||||
</span>
|
||||
<span class="text-slate-600">
|
||||
已取消
|
||||
<span class="text-xl sm:text-[22px] font-bold text-slate-500 tabular-nums"
|
||||
>¥{{ listStats.orderCancelledStr }}</span>
|
||||
</span>
|
||||
</div>
|
||||
<p class="text-xs text-slate-400 tabular-nums">合计 ¥{{ listStats.orderStr }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
@@ -92,6 +104,9 @@
|
||||
{{ listStats.periodLine }}
|
||||
</p>
|
||||
<p class="relative mt-1.5 text-xs text-slate-400 leading-relaxed">
|
||||
{{ listStats.orderSplitHint }}
|
||||
</p>
|
||||
<p class="relative mt-0.5 text-xs text-slate-400 leading-relaxed">
|
||||
{{ listStats.scopeHint }}
|
||||
</p>
|
||||
</div>
|
||||
@@ -107,8 +122,20 @@
|
||||
<el-icon :size="16" class="text-emerald-500"><LinkIcon /></el-icon>
|
||||
{{ listStats.payHeading }}
|
||||
</div>
|
||||
<div class="mt-2 text-2xl sm:text-[26px] font-bold text-slate-800 tracking-tight tabular-nums">
|
||||
¥{{ listStats.payStr }}
|
||||
<div class="mt-2 space-y-1.5 min-w-0">
|
||||
<div class="flex flex-col sm:flex-row sm:flex-wrap gap-x-4 gap-y-1 text-sm sm:text-base">
|
||||
<span class="text-slate-600">
|
||||
未取消
|
||||
<span class="text-xl sm:text-[22px] font-bold text-slate-800 tabular-nums"
|
||||
>¥{{ listStats.payNotCancelledStr }}</span>
|
||||
</span>
|
||||
<span class="text-slate-600">
|
||||
已取消
|
||||
<span class="text-xl sm:text-[22px] font-bold text-slate-500 tabular-nums"
|
||||
>¥{{ listStats.payCancelledStr }}</span>
|
||||
</span>
|
||||
</div>
|
||||
<p class="text-xs text-slate-400 tabular-nums">合计 ¥{{ listStats.payStr }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
@@ -121,7 +148,7 @@
|
||||
{{ listStats.periodLine }}
|
||||
</p>
|
||||
<p class="relative mt-1.5 text-xs text-slate-400 leading-relaxed">
|
||||
所选时间内创建订单所关联的支付单金额(与「实付(关联)」含义一致;不含创建时间时默认今日)
|
||||
所选时间内创建订单所关联的支付单金额,按业务订单是否已取消拆分(4=已取消;与「实付(关联)」含义一致;不含创建时间时默认今日)
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -173,6 +200,21 @@
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item class="w-[220px] min-w-[200px]" label="医助部门">
|
||||
<el-tree-select
|
||||
v-model="queryParams.assistant_dept_id"
|
||||
:data="departmentTreeRaw"
|
||||
class="!w-full"
|
||||
clearable
|
||||
filterable
|
||||
check-strictly
|
||||
:default-expand-all="true"
|
||||
node-key="id"
|
||||
:props="assistantDeptTreeProps"
|
||||
placeholder="医助部门(选父级含子级)"
|
||||
@change="onAssistantDeptChange"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item class="w-[200px]" label="医助">
|
||||
<el-select
|
||||
v-model="queryParams.assistant_id"
|
||||
@@ -182,7 +224,7 @@
|
||||
class="!w-full"
|
||||
>
|
||||
<el-option
|
||||
v-for="a in assistantOptions"
|
||||
v-for="a in filteredAssistantOptions"
|
||||
:key="a.id"
|
||||
:label="a.name"
|
||||
:value="a.id"
|
||||
@@ -1077,7 +1119,7 @@
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="8">
|
||||
<el-form-item label="疗程" class="create-order-form-item--inline-num">
|
||||
<el-form-item label="服用天数" class="create-order-form-item--inline-num">
|
||||
<div class="flex items-center gap-1 w-full">
|
||||
<el-input-number
|
||||
v-model="editForm.medication_days"
|
||||
@@ -1912,6 +1954,7 @@ import {
|
||||
import html2canvas from 'html2canvas'
|
||||
import { jsPDF } from 'jspdf'
|
||||
import { getDictData } from '@/api/app'
|
||||
import { deptAll } from '@/api/org/department'
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import feedback from '@/utils/feedback'
|
||||
import { ElMessageBox } from 'element-plus'
|
||||
@@ -1961,16 +2004,68 @@ const servicePackageOptions = ref<Array<{ name: string; value: string }>>([])
|
||||
|
||||
/** 筛选:开方医生、诊单医助(与列表接口 doctor_id / assistant_id 一致) */
|
||||
const doctorOptions = ref<Array<{ id: number; name: string }>>([])
|
||||
const assistantOptions = ref<Array<{ id: number; name: string }>>([])
|
||||
const assistantOptions = ref<Array<{ id: number; name: string; dept_ids?: number[] }>>([])
|
||||
|
||||
/** 部门树(树形下拉里展示层级;与后台 DeptLogic::getSelfAndDescendantIds 选父级含子级一致) */
|
||||
const departmentTreeRaw = ref<unknown[]>([])
|
||||
|
||||
const assistantDeptTreeProps = {
|
||||
value: 'id',
|
||||
label: 'name',
|
||||
children: 'children'
|
||||
}
|
||||
|
||||
type DeptTreeNode = { id?: unknown; name?: unknown; children?: unknown[] }
|
||||
|
||||
function findDeptTreeNode(nodes: unknown[], targetId: number): DeptTreeNode | null {
|
||||
for (const raw of nodes || []) {
|
||||
if (raw == null || typeof raw !== 'object') continue
|
||||
const n = raw as DeptTreeNode
|
||||
if (Number(n.id) === targetId) {
|
||||
return n
|
||||
}
|
||||
const sub = findDeptTreeNode((n.children || []) as unknown[], targetId)
|
||||
if (sub) {
|
||||
return sub
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
function collectDeptSubtreeIds(node: DeptTreeNode): number[] {
|
||||
const id = Number(node.id)
|
||||
const out: number[] = []
|
||||
if (Number.isFinite(id) && id > 0) {
|
||||
out.push(id)
|
||||
}
|
||||
for (const c of node.children || []) {
|
||||
if (c && typeof c === 'object') {
|
||||
out.push(...collectDeptSubtreeIds(c as DeptTreeNode))
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
/** 选中部门及全部下级 id(与列表筛选 backend 含子级一致) */
|
||||
function getDeptSelfAndDescendantIdsFromTree(rootId: number, tree: unknown[]): number[] {
|
||||
const n = findDeptTreeNode(tree, rootId)
|
||||
if (!n) {
|
||||
return [rootId]
|
||||
}
|
||||
return collectDeptSubtreeIds(n)
|
||||
}
|
||||
|
||||
async function loadDoctorAssistantOptions() {
|
||||
try {
|
||||
const [docs, ast] = await Promise.all([getDoctors(), getAssistants()])
|
||||
const [docs, ast, deptTree] = await Promise.all([getDoctors(), getAssistants(), deptAll()])
|
||||
doctorOptions.value = Array.isArray(docs) ? docs : []
|
||||
assistantOptions.value = Array.isArray(ast) ? ast : []
|
||||
const tree = Array.isArray(deptTree) ? deptTree : []
|
||||
departmentTreeRaw.value = tree
|
||||
} catch {
|
||||
doctorOptions.value = []
|
||||
assistantOptions.value = []
|
||||
departmentTreeRaw.value = []
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2068,6 +2163,8 @@ const queryParams = reactive({
|
||||
doctor_id: '' as number | '',
|
||||
/** 诊单医助(后台:关联诊单 assistant_id) */
|
||||
assistant_id: '' as number | '',
|
||||
/** 诊单医助所属部门(后台:assistant_dept_id,la_admin_dept) */
|
||||
assistant_dept_id: '' as number | '',
|
||||
fulfillment_status: '' as number | '',
|
||||
prescription_audit_status: '' as number | '',
|
||||
payment_slip_audit_status: '' as number | ''
|
||||
@@ -2121,6 +2218,11 @@ async function fetchLists(params: Record<string, unknown>) {
|
||||
} else {
|
||||
p.assistant_id = Number(p.assistant_id)
|
||||
}
|
||||
if (p.assistant_dept_id === '' || p.assistant_dept_id === undefined || p.assistant_dept_id === null) {
|
||||
delete p.assistant_dept_id
|
||||
} else {
|
||||
p.assistant_dept_id = Number(p.assistant_dept_id)
|
||||
}
|
||||
if (!p.order_no) delete p.order_no
|
||||
if (!String(p.patient_keyword || '').trim()) delete p.patient_keyword
|
||||
if (!String(p.start_time || '').trim() || !String(p.end_time || '').trim()) {
|
||||
@@ -2135,6 +2237,36 @@ const { pager, getLists, resetPage, resetParams } = usePaging({
|
||||
params: queryParams
|
||||
})
|
||||
|
||||
/** 选医助部门后,医助下拉仅显示该部门及子部门成员(与后台含子级一致) */
|
||||
const filteredAssistantOptions = computed(() => {
|
||||
const deptRaw = queryParams.assistant_dept_id
|
||||
if (deptRaw === '' || deptRaw == null) {
|
||||
return assistantOptions.value
|
||||
}
|
||||
const deptId = Number(deptRaw)
|
||||
if (!Number.isFinite(deptId)) {
|
||||
return assistantOptions.value
|
||||
}
|
||||
const allowed = new Set(getDeptSelfAndDescendantIdsFromTree(deptId, departmentTreeRaw.value))
|
||||
return assistantOptions.value.filter((a) => {
|
||||
const ids = a.dept_ids
|
||||
if (!Array.isArray(ids) || ids.length === 0) return false
|
||||
return ids.map(Number).some((id) => allowed.has(id))
|
||||
})
|
||||
})
|
||||
|
||||
function onAssistantDeptChange() {
|
||||
const cur = queryParams.assistant_id
|
||||
if (cur !== '' && cur != null) {
|
||||
const num = Number(cur)
|
||||
const ok = filteredAssistantOptions.value.some((item) => Number(item.id) === num)
|
||||
if (!ok) {
|
||||
queryParams.assistant_id = ''
|
||||
}
|
||||
}
|
||||
resetPage()
|
||||
}
|
||||
|
||||
const listStats = computed(() => {
|
||||
const ex = pager.extend as Record<string, unknown> | undefined
|
||||
const o = ex?.stats_order_amount ?? ex?.today_order_amount
|
||||
@@ -2145,6 +2277,16 @@ const listStats = computed(() => {
|
||||
return Math.round(x * 100) / 100
|
||||
}
|
||||
const fmt = (v: number) => v.toFixed(2)
|
||||
const hasOrderSplit =
|
||||
ex?.stats_order_amount_not_cancelled !== undefined &&
|
||||
ex?.stats_order_amount_cancelled !== undefined
|
||||
const hasPaySplit =
|
||||
ex?.stats_linked_pay_amount_not_cancelled !== undefined &&
|
||||
ex?.stats_linked_pay_amount_cancelled !== undefined
|
||||
const oNc = hasOrderSplit ? n(ex?.stats_order_amount_not_cancelled) : n(o)
|
||||
const oC = hasOrderSplit ? n(ex?.stats_order_amount_cancelled) : 0
|
||||
const pNc = hasPaySplit ? n(ex?.stats_linked_pay_amount_not_cancelled) : n(pay)
|
||||
const pC = hasPaySplit ? n(ex?.stats_linked_pay_amount_cancelled) : 0
|
||||
const t0 = String(ex?.stats_time_start ?? '').trim()
|
||||
const t1 = String(ex?.stats_time_end ?? '').trim()
|
||||
const useRange = t0 && t1
|
||||
@@ -2155,7 +2297,7 @@ const listStats = computed(() => {
|
||||
let scopeHint = '统计口径:与当前列表数据可见范围一致'
|
||||
if (scope === 'all') {
|
||||
scopeHint =
|
||||
'统计口径:支付单审核白名单角色,按全量订单;与下方筛选项(医生/医助/患者等,不含「创建时间」)一致'
|
||||
'统计口径:支付单审核白名单角色,按全量订单;与下方筛选项(医生/医助/医助部门/患者等,不含「创建时间」)一致'
|
||||
} else if (scope === 'assistant') {
|
||||
scopeHint = '统计口径:仅计诊单医助为本人且满足下方其它筛选项的订单'
|
||||
}
|
||||
@@ -2167,10 +2309,15 @@ const listStats = computed(() => {
|
||||
pay: n(pay),
|
||||
orderStr: fmt(n(o)),
|
||||
payStr: fmt(n(pay)),
|
||||
orderNotCancelledStr: fmt(oNc),
|
||||
orderCancelledStr: fmt(oC),
|
||||
payNotCancelledStr: fmt(pNc),
|
||||
payCancelledStr: fmt(pC),
|
||||
orderHeading: `${headPrefix}业务订单额`,
|
||||
payHeading: `${headPrefix}关联实付`,
|
||||
periodLine,
|
||||
scopeHint
|
||||
scopeHint,
|
||||
orderSplitHint: '未取消与已取消按履约状态区分(4=已取消;上方合计为未取消+已取消)'
|
||||
}
|
||||
})
|
||||
|
||||
@@ -2193,6 +2340,7 @@ function handleReset() {
|
||||
queryParams.patient_keyword = ''
|
||||
queryParams.doctor_id = ''
|
||||
queryParams.assistant_id = ''
|
||||
queryParams.assistant_dept_id = ''
|
||||
queryParams.fulfillment_status = ''
|
||||
queryParams.prescription_audit_status = ''
|
||||
queryParams.payment_slip_audit_status = ''
|
||||
|
||||
Reference in New Issue
Block a user