Merge branch 'master' into bug-5-20

This commit is contained in:
Your Name
2026-05-20 17:15:51 +08:00
276 changed files with 452 additions and 421 deletions
@@ -252,7 +252,7 @@
v-model="queryParams.assistant_id"
clearable
filterable
placeholder="诊单医助"
placeholder="订单创建人"
class="!w-full"
>
<el-option
@@ -2709,6 +2709,8 @@ const prescriptionOrderDetailButtonText = computed(() =>
/** 与 server/config/project.php prescription_order_finance_roles 保持一致 */
const FINANCE_ROLE_IDS = [0, 3, 6]
/** 与 server/config/project.php order_edit_all_roles 一致:可绕过「双审通过后创建人禁编」 */
const ORDER_EDIT_ALL_ROLE_IDS = [0, 3]
/** 判断当前用户是否有查看财务字段(内部成本)的权限 */
const canViewFinanceFields = () => {
@@ -2914,9 +2916,9 @@ const queryParams = reactive({
express_company: '' as '' | 'sf' | 'jd',
/** 开方医生(后台:关联处方 creator_id */
doctor_id: '' as number | '',
/** 诊单医助(后台:关联诊单 assistant_id */
/** 订单创建人(后台:业务订单 creator_id */
assistant_id: '' as number | '',
/** 诊单医助所属部门(后台:assistant_dept_idla_admin_dept */
/** 创建人所属部门(后台:assistant_dept_idla_admin_dept */
assistant_dept_id: '' as number | '',
fulfillment_status: '' as number | '',
prescription_audit_status: '' as number | '',
@@ -3363,8 +3365,32 @@ function formatTime(v: unknown) {
return String(v)
}
function canBypassCreatorDualAuditEditLock(): boolean {
const u = userStore.userInfo
if (!u) return false
if (Number(u.root) === 1) return true
const ids = Array.isArray(u.role_ids) ? u.role_ids.map((n: unknown) => Number(n)) : []
return ids.some((id) => ORDER_EDIT_ALL_ROLE_IDS.includes(id))
}
function isCurrentUserOrderCreator(row: { creator_id?: number }) {
const uid = Number(userStore.userInfo?.id)
return uid > 0 && Number(row.creator_id) === uid
}
/** 处方审核 + 支付单审核均已通过 */
function isDualAuditPassed(row: {
prescription_audit_status?: number
payment_slip_audit_status?: number
}) {
return Number(row.prescription_audit_status) === 1 && Number(row.payment_slip_audit_status) === 1
}
function canEditRow(row: {
creator_id?: number
fulfillment_status?: number
prescription_audit_status?: number
payment_slip_audit_status?: number
gancao_reciperl_order_no?: string | null
gancao_submit_time?: number | null
}) {
@@ -3372,6 +3398,15 @@ function canEditRow(row: {
// (3)(4)
if (fs === 3 || fs === 4) return false
// /
if (
isCurrentUserOrderCreator(row) &&
isDualAuditPassed(row) &&
!canBypassCreatorDualAuditEditLock()
) {
return false
}
const gcNo = String(row.gancao_reciperl_order_no || '').trim()
const gcTime = Number(row.gancao_submit_time || 0)
const gcLocked = gcNo !== '' || gcTime > 0
@@ -4407,7 +4442,25 @@ async function goEditOrderNextStep() {
}
}
async function openEdit(row: { id: number }) {
async function openEdit(row: {
id: number
creator_id?: number
prescription_audit_status?: number
payment_slip_audit_status?: number
fulfillment_status?: number
gancao_reciperl_order_no?: string | null
gancao_submit_time?: number | null
}) {
if (!canEditRow(row)) {
if (
isCurrentUserOrderCreator(row) &&
isDualAuditPassed(row) &&
!canBypassCreatorDualAuditEditLock()
) {
feedback.msgWarning('处方与支付单均已审核通过,创建人不可再编辑')
}
return
}
editOrderStep.value = 0
editOrderPrescription.value = null
editVisible.value = true
@@ -3047,14 +3047,48 @@ function formatTime(v: unknown) {
return String(v)
}
/** 与 server/config/project.php order_edit_all_roles 一致 */
const ORDER_EDIT_ALL_ROLE_IDS = [0, 3]
function canBypassCreatorDualAuditEditLock(): boolean {
const u = userStore.userInfo
if (!u) return false
if (Number(u.root) === 1) return true
const ids = Array.isArray(u.role_ids) ? u.role_ids.map((n: unknown) => Number(n)) : []
return ids.some((id) => ORDER_EDIT_ALL_ROLE_IDS.includes(id))
}
function isCurrentUserOrderCreator(row: { creator_id?: number }) {
const uid = Number(userStore.userInfo?.id)
return uid > 0 && Number(row.creator_id) === uid
}
function isDualAuditPassed(row: {
prescription_audit_status?: number
payment_slip_audit_status?: number
}) {
return Number(row.prescription_audit_status) === 1 && Number(row.payment_slip_audit_status) === 1
}
function canEditRow(row: {
creator_id?: number
fulfillment_status?: number
prescription_audit_status?: number
payment_slip_audit_status?: number
gancao_reciperl_order_no?: string | null
gancao_submit_time?: number | null
}) {
const fs = Number(row.fulfillment_status)
if (fs === 3 || fs === 4) return false
if (
isCurrentUserOrderCreator(row) &&
isDualAuditPassed(row) &&
!canBypassCreatorDualAuditEditLock()
) {
return false
}
const gcNo = String(row.gancao_reciperl_order_no || '').trim()
const gcTime = Number(row.gancao_submit_time || 0)
const gcLocked = gcNo !== '' || gcTime > 0
@@ -3932,7 +3966,25 @@ async function goEditOrderNextStep() {
}
}
async function openEdit(row: { id: number }) {
async function openEdit(row: {
id: number
creator_id?: number
prescription_audit_status?: number
payment_slip_audit_status?: number
fulfillment_status?: number
gancao_reciperl_order_no?: string | null
gancao_submit_time?: number | null
}) {
if (!canEditRow(row)) {
if (
isCurrentUserOrderCreator(row) &&
isDualAuditPassed(row) &&
!canBypassCreatorDualAuditEditLock()
) {
feedback.msgWarning('处方与支付单均已审核通过,创建人不可再编辑')
}
return
}
editOrderStep.value = 0
editOrderPrescription.value = null
editVisible.value = true
@@ -131,7 +131,7 @@
<el-descriptions-item label="医师">{{ detailPrescription.doctor_name || '—' }}</el-descriptions-item>
<el-descriptions-item label="类型">{{ detailPrescription.prescription_type || '—' }}</el-descriptions-item>
<el-descriptions-item label="临床诊断" :span="2">{{ detailPrescription.clinical_diagnosis || '—' }}</el-descriptions-item>
<el-descriptions-item label="剂数 / 用法" :span="2">
<el-descriptions-item label="剂数 / 用法" :span="2" v-if="showPrescriptionAuditFilter">
{{ detailData.dose_count ?? detailPrescription.dose_count ?? '' }} {{ detailData.dose_unit || '' }} ·
{{ detailPrescription.usage_instruction || detailPrescription.usage_method || '' }}
</el-descriptions-item>
@@ -379,6 +379,22 @@ const buildParams = () => {
queryParams.scene = 'diagnosis_edit'
}
/** 诊间医助角色(与 DiagnosisLists 等一致) */
const TCM_ASSISTANT_ROLE_ID = 2
/** 与 server/config/project.php prescription_audit_roles 默认一致,可处方审核的角色 */
const PRESCRIPTION_AUDIT_ROLE_IDS = [0, 3, 6]
/**
* 是否展示「处方审核」相关字段
*/
const showPrescriptionAuditFilter = computed(() => {
const u = userStore.userInfo
if (!u || Number(u.root) === 1) return true
const ids = Array.isArray(u.role_ids) ? u.role_ids.map((n: unknown) => Number(n)) : []
if (!ids.includes(TCM_ASSISTANT_ROLE_ID)) return true
return ids.some((id) => PRESCRIPTION_AUDIT_ROLE_IDS.includes(id))
})
// ─── 详情抽屉 ───
const detailVisible = ref(false)
const detailLoading = ref(false)