处方增加禁用修改
This commit is contained in:
@@ -88,13 +88,17 @@
|
||||
共 <strong>{{ formData.herbs.length }}</strong> 味(主方 {{ mainHerbCount }} / 辅方
|
||||
{{ auxHerbCount }})· 可手动添加、从处方库或粘贴药方批量录入
|
||||
</p>
|
||||
<p v-if="herbsLocked" class="rp-toolbar__lock-tip">
|
||||
<el-tag type="danger" size="small" effect="plain">禁用修改</el-tag>
|
||||
含「禁用修改」处方库模板,药材已锁定,不可增删改,如需调整请重新「从处方库导入」覆盖
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="rp-toolbar__actions" role="toolbar" aria-label="处方药材快捷操作">
|
||||
<el-button type="primary" size="small" :icon="CirclePlus" @click="handleAddHerb('主方')">
|
||||
<el-button type="primary" size="small" :icon="CirclePlus" :disabled="herbsLocked" @click="handleAddHerb('主方')">
|
||||
添加主方
|
||||
</el-button>
|
||||
<el-button type="primary" plain size="small" @click="handleAddHerb('辅方')">
|
||||
<el-button type="primary" plain size="small" :disabled="herbsLocked" @click="handleAddHerb('辅方')">
|
||||
添加辅方
|
||||
</el-button>
|
||||
<el-button
|
||||
@@ -135,7 +139,7 @@
|
||||
:class="{ 'herb-editor-card--dup': isDuplicateHerbName(row.index) }"
|
||||
>
|
||||
<div class="herb-editor-card__title">主方 {{ row.index + 1 }}</div>
|
||||
<MedicineNameSelect v-model="formData.herbs[row.index].name" class="herb-editor-card__select" />
|
||||
<MedicineNameSelect v-model="formData.herbs[row.index].name" :disabled="herbsLocked" class="herb-editor-card__select" />
|
||||
<div
|
||||
v-if="isDuplicateHerbName(row.index)"
|
||||
class="herb-editor-card__dup-hint text-amber-600 text-xs mb-1"
|
||||
@@ -148,11 +152,12 @@
|
||||
:min="0.1"
|
||||
:step="1"
|
||||
:precision="1"
|
||||
:disabled="herbsLocked"
|
||||
placeholder="剂量(克)"
|
||||
class="herb-editor-card__dose"
|
||||
/>
|
||||
<span class="text-gray-500 shrink-0">克</span>
|
||||
<el-button type="danger" size="small" link @click="handleRemoveHerb(row.index)">
|
||||
<el-button v-if="!herbsLocked" type="danger" size="small" link @click="handleRemoveHerb(row.index)">
|
||||
删除
|
||||
</el-button>
|
||||
</div>
|
||||
@@ -171,7 +176,7 @@
|
||||
:class="{ 'herb-editor-card--dup': isDuplicateHerbName(row.index) }"
|
||||
>
|
||||
<div class="herb-editor-card__title">辅方</div>
|
||||
<MedicineNameSelect v-model="formData.herbs[row.index].name" class="herb-editor-card__select" />
|
||||
<MedicineNameSelect v-model="formData.herbs[row.index].name" :disabled="herbsLocked" class="herb-editor-card__select" />
|
||||
<div
|
||||
v-if="isDuplicateHerbName(row.index)"
|
||||
class="herb-editor-card__dup-hint text-amber-600 text-xs mb-1"
|
||||
@@ -184,11 +189,12 @@
|
||||
:min="0.1"
|
||||
:step="1"
|
||||
:precision="1"
|
||||
:disabled="herbsLocked"
|
||||
placeholder="剂量(克)"
|
||||
class="herb-editor-card__dose"
|
||||
/>
|
||||
<span class="text-gray-500 shrink-0">克</span>
|
||||
<el-button type="danger" size="small" link @click="handleRemoveHerb(row.index)">
|
||||
<el-button v-if="!herbsLocked" type="danger" size="small" link @click="handleRemoveHerb(row.index)">
|
||||
删除
|
||||
</el-button>
|
||||
</div>
|
||||
@@ -1028,6 +1034,8 @@ interface Herb {
|
||||
name: string
|
||||
dosage: number
|
||||
formula_type?: FormulaType
|
||||
/** 来自「禁用修改」处方库模板:锁定后不可增删改,只能再次导入覆盖 */
|
||||
locked?: boolean
|
||||
}
|
||||
|
||||
type AuxUsageForm = {
|
||||
@@ -1044,11 +1052,15 @@ function normalizeFormulaType(v: unknown): FormulaType {
|
||||
}
|
||||
|
||||
function normalizeHerbRow(raw: any): Herb {
|
||||
return {
|
||||
const row: Herb = {
|
||||
name: String(raw?.name ?? '').trim(),
|
||||
dosage: Number(raw?.dosage) || 0,
|
||||
formula_type: normalizeFormulaType(raw?.formula_type)
|
||||
}
|
||||
if (raw?.locked === true || raw?.locked === 1) {
|
||||
row.locked = true
|
||||
}
|
||||
return row
|
||||
}
|
||||
|
||||
function defaultAuxUsage(prescriptionType = '浓缩水丸'): AuxUsageForm {
|
||||
@@ -1430,6 +1442,12 @@ const auxHerbRows = computed(() =>
|
||||
const mainHerbCount = computed(() => mainHerbRows.value.length)
|
||||
const auxHerbCount = computed(() => auxHerbRows.value.length)
|
||||
|
||||
/**
|
||||
* 整张处方是否被锁定:只要任一药材来自「禁用修改」模板即锁定。
|
||||
* 锁定后:不可增删改任意药材,仅可再次「从处方库导入」覆盖。
|
||||
*/
|
||||
const herbsLocked = computed(() => formData.herbs.some((h) => (h as Herb).locked === true))
|
||||
|
||||
const libraryDoctorId = computed(() => {
|
||||
const uid = Number(userStore.userInfo?.id)
|
||||
return uid > 0 ? uid : 0
|
||||
@@ -2029,10 +2047,18 @@ function findDuplicateHerbNames(): string[] {
|
||||
}
|
||||
|
||||
const handleAddHerb = (formulaType: FormulaType = '主方') => {
|
||||
if (herbsLocked.value) {
|
||||
feedback.msgWarning('该处方含「禁用修改」模板,药材已锁定,请重新从处方库导入覆盖')
|
||||
return
|
||||
}
|
||||
formData.herbs.push({ name: '', dosage: 6, formula_type: formulaType })
|
||||
}
|
||||
|
||||
const handleRemoveHerb = (index: number) => {
|
||||
if (herbsLocked.value) {
|
||||
feedback.msgWarning('该处方含「禁用修改」模板,药材已锁定,不可删除')
|
||||
return
|
||||
}
|
||||
formData.herbs.splice(index, 1)
|
||||
}
|
||||
|
||||
@@ -2089,10 +2115,18 @@ const handleImportLibrary = (row: any) => {
|
||||
}
|
||||
|
||||
const formulaType = normalizeFormulaType(row.formula_type)
|
||||
const imported = (JSON.parse(JSON.stringify(row.herbs)) as any[]).map((h) => ({
|
||||
...normalizeHerbRow(h),
|
||||
formula_type: formulaType
|
||||
}))
|
||||
// 「禁用修改」模板:导入的药材打上锁定标记 → 整张处方锁定(不可增删改,只能再次导入覆盖)
|
||||
const isLockedTemplate = Number(row?.disable_edit) === 1
|
||||
const imported = (JSON.parse(JSON.stringify(row.herbs)) as any[]).map((h) => {
|
||||
const herb = normalizeHerbRow(h)
|
||||
herb.formula_type = formulaType
|
||||
if (isLockedTemplate) {
|
||||
herb.locked = true
|
||||
} else {
|
||||
delete herb.locked
|
||||
}
|
||||
return herb
|
||||
})
|
||||
if (libraryImportMode.value === 'replace') {
|
||||
const kept = formData.herbs.filter((h) => normalizeFormulaType(h.formula_type) !== formulaType)
|
||||
formData.herbs = [...kept, ...imported]
|
||||
@@ -2532,6 +2566,17 @@ defineExpose({
|
||||
color: var(--el-text-color-regular);
|
||||
}
|
||||
|
||||
.rp-toolbar__lock-tip {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
flex-wrap: wrap;
|
||||
margin: 6px 0 0;
|
||||
font-size: 12px;
|
||||
line-height: 1.55;
|
||||
color: var(--el-color-danger);
|
||||
}
|
||||
|
||||
.rp-toolbar__actions {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
||||
@@ -679,17 +679,21 @@
|
||||
粘贴文本解析药名与剂量;须与药品库名称完全一致才录入(导入至主方)
|
||||
</span>
|
||||
</div>
|
||||
<div v-if="herbsLocked" class="flex items-center gap-2 flex-wrap mt-2 text-xs text-[var(--el-color-danger)]">
|
||||
<el-tag type="danger" size="small" effect="plain">禁用修改</el-tag>
|
||||
含「禁用修改」处方库模板,药材已锁定,不可增删改,如需调整请重新「从处方库导入」覆盖
|
||||
</div>
|
||||
|
||||
<div class="herb-formula-block mt-3">
|
||||
<div class="herb-formula-block__head">
|
||||
<el-tag type="primary" size="small">主方</el-tag>
|
||||
<el-button type="primary" size="small" @click="addHerb('主方')">添加主方药材</el-button>
|
||||
<el-button type="primary" size="small" :disabled="herbsLocked" @click="addHerb('主方')">添加主方药材</el-button>
|
||||
</div>
|
||||
<el-table :data="mainHerbRows" class="mt-2" border empty-text="暂无主方药材">
|
||||
<el-table-column label="序号" type="index" width="60" />
|
||||
<el-table-column label="药材名称" min-width="220">
|
||||
<template #default="{ row }">
|
||||
<MedicineNameSelect v-model="editForm.herbs[row.index].name" class="w-full" />
|
||||
<MedicineNameSelect v-model="editForm.herbs[row.index].name" :disabled="herbsLocked" class="w-full" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="剂量(克)" min-width="120">
|
||||
@@ -699,6 +703,7 @@
|
||||
:min="0"
|
||||
:precision="1"
|
||||
:step="0.5"
|
||||
:disabled="herbsLocked"
|
||||
placeholder="剂量"
|
||||
class="w-full"
|
||||
/>
|
||||
@@ -706,7 +711,8 @@
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="80">
|
||||
<template #default="{ row }">
|
||||
<el-button type="danger" link @click="removeHerb(row.index)">删除</el-button>
|
||||
<el-button v-if="!herbsLocked" type="danger" link @click="removeHerb(row.index)">删除</el-button>
|
||||
<span v-else class="text-gray-400 text-xs">已锁定</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -715,7 +721,7 @@
|
||||
<div class="herb-formula-block mt-4">
|
||||
<div class="herb-formula-block__head">
|
||||
<el-tag type="warning" size="small">辅方</el-tag>
|
||||
<el-button type="primary" size="small" plain @click="addHerb('辅方')">
|
||||
<el-button type="primary" size="small" plain :disabled="herbsLocked" @click="addHerb('辅方')">
|
||||
添加辅方药材
|
||||
</el-button>
|
||||
</div>
|
||||
@@ -723,7 +729,7 @@
|
||||
<el-table-column label="序号" type="index" width="60" />
|
||||
<el-table-column label="药材名称" min-width="220">
|
||||
<template #default="{ row }">
|
||||
<MedicineNameSelect v-model="editForm.herbs[row.index].name" class="w-full" />
|
||||
<MedicineNameSelect v-model="editForm.herbs[row.index].name" :disabled="herbsLocked" class="w-full" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="剂量(克)" min-width="120">
|
||||
@@ -733,6 +739,7 @@
|
||||
:min="0"
|
||||
:precision="1"
|
||||
:step="0.5"
|
||||
:disabled="herbsLocked"
|
||||
placeholder="剂量"
|
||||
class="w-full"
|
||||
/>
|
||||
@@ -740,7 +747,8 @@
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="80">
|
||||
<template #default="{ row }">
|
||||
<el-button type="danger" link @click="removeHerb(row.index)">删除</el-button>
|
||||
<el-button v-if="!herbsLocked" type="danger" link @click="removeHerb(row.index)">删除</el-button>
|
||||
<span v-else class="text-gray-400 text-xs">已锁定</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -1698,7 +1706,7 @@ import jsPDF from 'jspdf'
|
||||
const TcmDiagnosisEditView = defineAsyncComponent(() => import('@/views/tcm/diagnosis/edit.vue'))
|
||||
|
||||
type FormulaType = '主方' | '辅方'
|
||||
type HerbRow = { name: string; dosage: number; formula_type: FormulaType }
|
||||
type HerbRow = { name: string; dosage: number; formula_type: FormulaType; locked?: boolean }
|
||||
|
||||
type AuxUsageForm = {
|
||||
dosage_amount?: number
|
||||
@@ -1798,11 +1806,15 @@ function normalizeFormulaType(v: unknown): FormulaType {
|
||||
}
|
||||
|
||||
function normalizeHerbRow(raw: any): HerbRow {
|
||||
return {
|
||||
const row: HerbRow = {
|
||||
name: String(raw?.name ?? '').trim(),
|
||||
dosage: Number(raw?.dosage) || 0,
|
||||
formula_type: normalizeFormulaType(raw?.formula_type)
|
||||
}
|
||||
if (raw?.locked === true || raw?.locked === 1) {
|
||||
row.locked = true
|
||||
}
|
||||
return row
|
||||
}
|
||||
|
||||
function normalizeSlipHerbs(raw: unknown): HerbRow[] {
|
||||
@@ -2481,6 +2493,12 @@ const auxHerbRows = computed(() =>
|
||||
.filter(({ herb }) => normalizeFormulaType(herb.formula_type) === '辅方')
|
||||
)
|
||||
|
||||
/**
|
||||
* 整张处方是否被锁定:只要任一药材来自「禁用修改」处方库模板即锁定。
|
||||
* 锁定后不可增删改任意药材,只能再次「从处方库导入」覆盖。
|
||||
*/
|
||||
const herbsLocked = computed(() => editForm.herbs.some((h) => (h as HerbRow).locked === true))
|
||||
|
||||
const slipDietaryText = computed(() => {
|
||||
const d = slipView.value?.dietary_taboo
|
||||
if (Array.isArray(d)) return d.filter(Boolean).join('、')
|
||||
@@ -3441,10 +3459,18 @@ const handleImportLibrary = (row: any) => {
|
||||
return
|
||||
}
|
||||
const formulaType = normalizeFormulaType(row.formula_type)
|
||||
const imported = (JSON.parse(JSON.stringify(row.herbs)) as any[]).map((h) => ({
|
||||
...normalizeHerbRow(h),
|
||||
formula_type: formulaType
|
||||
}))
|
||||
// 「禁用修改」模板:导入药材打上锁定标记 → 整张处方锁定(不可增删改,只能再次导入覆盖)
|
||||
const isLockedTemplate = Number(row?.disable_edit) === 1
|
||||
const imported = (JSON.parse(JSON.stringify(row.herbs)) as any[]).map((h) => {
|
||||
const herb = normalizeHerbRow(h)
|
||||
herb.formula_type = formulaType
|
||||
if (isLockedTemplate) {
|
||||
herb.locked = true
|
||||
} else {
|
||||
delete herb.locked
|
||||
}
|
||||
return herb
|
||||
})
|
||||
if (libraryImportMode.value === 'replace') {
|
||||
const kept = editForm.herbs.filter((h) => normalizeFormulaType(h.formula_type) !== formulaType)
|
||||
editForm.herbs = [...kept, ...imported]
|
||||
@@ -3650,6 +3676,10 @@ async function handlePasteRecipeImport() {
|
||||
|
||||
// 添加药材(主方 / 辅方)
|
||||
const addHerb = (formulaType: FormulaType = '主方') => {
|
||||
if (herbsLocked.value) {
|
||||
feedback.msgWarning('该处方含「禁用修改」模板,药材已锁定,请重新从处方库导入覆盖')
|
||||
return
|
||||
}
|
||||
editForm.herbs.push({
|
||||
name: '',
|
||||
dosage: 0,
|
||||
@@ -3659,6 +3689,10 @@ const addHerb = (formulaType: FormulaType = '主方') => {
|
||||
|
||||
// 删除药材
|
||||
const removeHerb = (index: number) => {
|
||||
if (herbsLocked.value) {
|
||||
feedback.msgWarning('该处方含「禁用修改」模板,药材已锁定,不可删除')
|
||||
return
|
||||
}
|
||||
editForm.herbs.splice(index, 1)
|
||||
}
|
||||
|
||||
|
||||
@@ -71,6 +71,13 @@
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="禁用修改" min-width="100">
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="row.disable_edit ? 'danger' : 'info'">
|
||||
{{ row.disable_edit ? '已禁用' : '可修改' }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="创建人" prop="creator_name" min-width="100" />
|
||||
<el-table-column label="创建时间" prop="create_time" min-width="160" />
|
||||
<el-table-column label="操作" width="180" fixed="right">
|
||||
@@ -193,6 +200,21 @@
|
||||
勾选后,所有医生都可以查看和使用此处方模板
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="禁用修改" prop="disable_edit">
|
||||
<div class="flex flex-col gap-1 leading-none">
|
||||
<el-switch
|
||||
v-model="editForm.disable_edit"
|
||||
:active-value="1"
|
||||
:inactive-value="0"
|
||||
active-text="开启"
|
||||
inactive-text="关闭"
|
||||
/>
|
||||
<div class="text-xs text-gray-400 leading-relaxed">
|
||||
开启后,导入此模板到处方时将锁定整张处方的药材,不可增删改,只能再次导入覆盖
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer v-if="editMode !== 'view'">
|
||||
@@ -236,7 +258,8 @@ const editForm = reactive({
|
||||
prescription_name: '',
|
||||
formula_type: '主方',
|
||||
herbs: [] as Array<{ name: string; dosage: number }>,
|
||||
is_public: 0
|
||||
is_public: 0,
|
||||
disable_edit: 0
|
||||
})
|
||||
|
||||
// 表单验证规则
|
||||
@@ -293,6 +316,7 @@ const resetForm = () => {
|
||||
editForm.formula_type = '主方'
|
||||
editForm.herbs = []
|
||||
editForm.is_public = 0
|
||||
editForm.disable_edit = 0
|
||||
}
|
||||
|
||||
// 新增处方
|
||||
@@ -310,6 +334,7 @@ const handleView = (row: any) => {
|
||||
editForm.formula_type = row.formula_type || '主方'
|
||||
editForm.herbs = row.herbs ? JSON.parse(JSON.stringify(row.herbs)) : []
|
||||
editForm.is_public = row.is_public ?? 0
|
||||
editForm.disable_edit = row.disable_edit ?? 0
|
||||
showEdit.value = true
|
||||
}
|
||||
|
||||
@@ -321,6 +346,7 @@ const handleEdit = (row: any) => {
|
||||
editForm.formula_type = row.formula_type || '主方'
|
||||
editForm.herbs = row.herbs ? JSON.parse(JSON.stringify(row.herbs)) : []
|
||||
editForm.is_public = row.is_public ?? 0
|
||||
editForm.disable_edit = row.disable_edit ?? 0
|
||||
showEdit.value = true
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user