feat(i18n): 实现病例模板统计模块国际化功能

- 将病例模板统计相关界面文本替换为国际化标签
- 添加 vue-i18n 依赖并配置翻译函数
- 实现表单验证消息的国际化显示
- 将按钮、表格列标题等界面元素转换为多语言支持
- 重构表单验证规则以支持动态国际化消息
- 更新常用诊断、耗材绑定等其他模块的国际化内容
This commit is contained in:
2026-06-26 13:02:51 +08:00
parent 1d4c168787
commit 8f20634b46
26 changed files with 932 additions and 883 deletions

View File

@@ -12,7 +12,7 @@
class="pan-btn blue-btn"
@click="addNewRow"
>
<i class="icon-plus" /> 添加新行
<i class="icon-plus" /> {{ $t('basic.invoice.addRow') }}
</button>
<button
class="pan-btn green-btn"
@@ -29,7 +29,7 @@
class="alert alert-danger error-messages"
>
<h4 class="error-title">
验证失败
{{ $t('basic.invoice.validationFailed') }}
</h4>
<ul class="error-list">
<li
@@ -49,14 +49,14 @@
<table class="table table-bordered table-hover">
<thead>
<tr>
<th>序号</th>
<th>操作员</th>
<th>员工账号</th>
<th>领用日期</th>
<th>起始号码</th>
<th>终止号码</th>
<th>当前使用号码</th>
<th>操作</th>
<th>{{ $t('common.seq') }}</th>
<th>{{ $t('basic.invoice.operator') }}</th>
<th>{{ $t('basic.invoice.employeeAccount') }}</th>
<th>{{ $t('basic.invoice.receiveDate') }}</th>
<th>{{ $t('basic.invoice.startNum') }}</th>
<th>{{ $t('basic.invoice.endNum') }}</th>
<th>{{ $t('basic.invoice.currentNum') }}</th>
<th>{{ $t('common.action') }}</th>
</tr>
</thead>
<tbody>
@@ -78,7 +78,7 @@
@change="updateOperatorFromEmployeeId(item)"
>
<option value="">
请选择操作员
{{ $t('basic.invoice.selectOperator') }}
</option>
<option
v-for="user in userList"
@@ -107,7 +107,7 @@
v-model="item.date"
type="date"
class="form-control"
placeholder="领用日期"
:placeholder="$t('basic.invoice.receiveDate')"
>
<span v-else>{{ item.date || '-' }}</span>
</div>
@@ -118,7 +118,7 @@
v-if="item.isActive"
v-model="item.startNum"
class="form-control"
placeholder="请输入起始号码"
:placeholder="$t('basic.invoice.placeholderStartNum')"
maxlength="12"
>
<span
@@ -133,7 +133,7 @@
v-if="item.isActive"
v-model="item.endNum"
class="form-control"
placeholder="请输入终止号码"
:placeholder="$t('basic.invoice.placeholderEndNum')"
maxlength="12"
>
<span
@@ -148,7 +148,7 @@
v-if="item.isActive"
v-model="item.currentNum"
class="form-control"
placeholder="当前使用号码"
:placeholder="$t('basic.invoice.currentNum')"
maxlength="12"
>
<span
@@ -161,25 +161,25 @@
<button
v-if="!item.isActive"
class="pan-btn-link blue-btn-link"
title="编辑"
:title="$t('common.edit')"
@click="toggleEdit(item.keyId)"
>
<i class="icon-edit" /> 编辑
<i class="icon-edit" /> {{ $t('common.edit') }}
</button>
<button
v-if="item.isActive"
class="pan-btn-link info-btn-link"
title="取消"
:title="$t('common.cancel')"
@click="toggleEdit(item.keyId)"
>
<i class="icon-cancel" /> 取消
<i class="icon-cancel" /> {{ $t('common.cancel') }}
</button>
<button
class="pan-btn-link red-btn-link"
title="删除"
:title="$t('common.delete')"
@click="deleteRow(item)"
>
<i class="icon-delete" /> 删除
<i class="icon-delete" /> {{ $t('common.delete') }}
</button>
</td>
</tr>
@@ -188,7 +188,7 @@
colspan="8"
class="no-data-row"
>
暂无数据请添加新记录
{{ $t('basic.invoice.noDataHint') }}
</td>
</tr>
</tbody>

View File

@@ -2,7 +2,7 @@
<!-- 病历文件基本信息弹窗 -->
<el-dialog
v-model="dialogVisible"
:title="formData.id ? '编辑模板' : '新增模板'"
:title="formData.id ? $t('basic.caseStats.editTemplate') : $t('basic.caseStats.addTemplate')"
width="900px"
destroy-on-close
@open="handleOpen"
@@ -20,18 +20,18 @@
>
<el-col :span="24">
<el-form-item
label="模板名称"
:label="$t('basic.caseStats.templateName')"
prop="name"
>
<el-input
v-model="formData.name"
placeholder="请输入模板名称"
:placeholder="$t('basic.caseStats.templateNamePlaceholder')"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item
label="使用范围"
:label="$t('basic.caseStats.useRange')"
prop="useRange"
>
<el-radio-group v-model="formData.useRange">
@@ -39,31 +39,31 @@
:value="0"
size="large"
>
全院
{{ $t('basic.caseStats.hospital') }}
</el-radio>
<el-radio
:value="1"
size="large"
>
指定机构
{{ $t('basic.caseStats.designatedOrg') }}
</el-radio>
<el-radio
:value="2"
size="large"
>
指定用户
{{ $t('basic.caseStats.designatedUser') }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item
label="备注"
:label="$t('common.remark')"
prop="remark"
>
<el-input
v-model="formData.remark"
placeholder="请输入版本"
:placeholder="$t('basic.caseTemplate.versionPlaceholder')"
/>
</el-form-item>
</el-col>
@@ -73,20 +73,23 @@
<template #footer>
<div class="dialog-footer" />
<el-button @click="dialogVisible = false">
取消
{{ $t('common.cancel') }}
</el-button>
<el-button
type="primary"
@click="submitForm"
>
确定
{{ $t('common.confirm') }}
</el-button>
</template>
</el-dialog>
</template>
<script setup>
import {onMounted, ref} from 'vue';
import {computed, onMounted, ref} from 'vue';
import {ElMessage} from 'element-plus';
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
const emits = defineEmits(['submitOk']);
const props = defineProps({
@@ -115,9 +118,9 @@ const formData = ref({
remark: '',
});
// 表单验证规则(响应式,支持动态验证)
const rules = reactive({
name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
});
const rules = computed(() => ({
name: [{ required: true, message: t('basic.caseStats.namePlaceholder'), trigger: 'blur' }],
}));
const handleOpen = () => {
if (props.formData) {
formData.value = props.formData;
@@ -134,7 +137,7 @@ const submitForm = () => {
saveForm();
} else {
// 表单验证失败
ElMessage.error('请填写必填项');
ElMessage.error(t('basic.caseStats.fillRequired'));
return false;
}
});

View File

@@ -7,12 +7,12 @@
:inline="true"
>
<el-form-item
label="名称"
:label="$t('basic.caseStats.name')"
prop="searchKey"
>
<el-input
v-model="queryParams.searchKey"
placeholder="请输入名称搜索"
:placeholder="$t('basic.caseStats.nameSearchPlaceholder')"
clearable
style="width: 200px"
@keyup.enter="handleQuery"
@@ -24,13 +24,13 @@
icon="Search"
@click="handleQuery"
>
搜索
{{ $t('common.search') }}
</el-button>
<el-button
icon="Refresh"
@click="resetQuery"
>
重置
{{ $t('common.reset') }}
</el-button>
</el-form-item>
</el-form>
@@ -46,7 +46,7 @@
icon="Plus"
@click="handleAdd"
>
新增
{{ $t('common.add') }}
</el-button>
</el-col>
@@ -61,17 +61,17 @@
:data="statisticsList"
>
<vxe-column
title="属性名称"
:title="$t('basic.caseStats.attrName')"
align="center"
field="name"
/>
<vxe-column
title="属性代码"
:title="$t('basic.caseStats.attrCode')"
align="center"
field="code"
/>
<vxe-column
title="属性类型"
:title="$t('basic.caseStats.attrType')"
align="center"
field="typeEnum"
>
@@ -80,45 +80,45 @@
</template>
</vxe-column>
<vxe-column
title="统计值单位"
:title="$t('basic.caseStats.statUnit')"
align="center"
field="unit"
/>
<vxe-column
title="是否必填"
:title="$t('basic.caseStats.required')"
align="center"
field="required"
>
<template #default="scope">
{{ scope.row.required === 1 ? '必填' : '不必填' }}
{{ scope.row.required === 1 ? $t('basic.caseStats.isRequired') : $t('basic.caseStats.notRequired') }}
</template>
</vxe-column>
<vxe-column
title="是否统计"
:title="$t('basic.caseStats.isStatistics')"
align="center"
field="isStatistics"
>
<template #default="scope">
{{ scope.row.isStatistics === 1 ? '统计' : '不统计' }}
{{ scope.row.isStatistics === 1 ? $t('basic.caseStats.statistics') : $t('basic.caseStats.noStatistics') }}
</template>
</vxe-column>
<vxe-column
title="字典名称"
:title="$t('basic.caseStats.dictName')"
align="center"
field="dictName"
/>
<vxe-column
title="字典类型"
:title="$t('basic.caseStats.dictType')"
align="center"
field="dictType"
/>
<vxe-column
title="备注"
:title="$t('common.remark')"
align="center"
field="remark"
/>
<vxe-column
title="操作"
:title="$t('common.operation')"
width="180"
align="center"
class-name="small-padding fixed-width"
@@ -130,7 +130,7 @@
icon="Edit"
@click="handleUpdate(scope.row)"
>
修改
{{ $t('basic.caseStats.modify') }}
</el-button>
<el-button
link
@@ -138,7 +138,7 @@
icon="Delete"
@click="handleDelete(scope.row)"
>
删除
{{ $t('common.delete') }}
</el-button>
</template>
</vxe-column>
@@ -166,34 +166,34 @@
label-width="80px"
>
<el-form-item
label="属性名称"
:label="$t('basic.caseStats.attrName')"
prop="name"
>
<el-input
v-model="form.name"
placeholder="请输入属性名称"
:placeholder="$t('basic.caseStats.attrNamePlaceholder')"
/>
</el-form-item>
<el-form-item
label="属性代码"
:label="$t('basic.caseStats.attrCode')"
prop="code"
>
<el-input
v-model="form.code"
placeholder="请输入属性代码"
:placeholder="$t('basic.caseStats.attrCodePlaceholder')"
/>
</el-form-item>
<el-form-item
label="体温单类型编码"
:label="$t('basic.caseStats.tempTypeCode')"
prop="typeCode"
>
<el-input
v-model="form.typeCode"
placeholder="请输入体温单属性编码"
:placeholder="$t('basic.caseStats.tempTypeCodePlaceholder')"
/>
</el-form-item>
<el-form-item
label="岗位顺序"
:label="$t('basic.caseStats.displayOrder')"
prop="displayOrder"
>
<el-input-number
@@ -203,7 +203,7 @@
/>
</el-form-item>
<el-form-item
label="属性类型"
:label="$t('basic.caseStats.attrType')"
prop="typeEnum"
>
<el-radio-group v-model="form.typeEnum">
@@ -219,42 +219,42 @@
</el-radio-group>
</el-form-item>
<el-form-item
label="是否必填"
:label="$t('basic.caseStats.required')"
prop="required"
>
<el-switch
v-model="form.required"
:active-value="1"
:inactive-value="0"
active-text=""
inactive-text=""
:active-text="$t('common.yes')"
:inactive-text="$t('common.no')"
inline-prompt
/>
</el-form-item>
<el-form-item
label="是否统计"
:label="$t('basic.caseStats.isStatistics')"
prop="isStatistics"
>
<el-switch
v-model="form.isStatistics"
:active-value="1"
:inactive-value="0"
active-text=""
inactive-text=""
:active-text="$t('common.yes')"
:inactive-text="$t('common.no')"
inline-prompt
/>
</el-form-item>
<el-form-item
label="单位"
:label="$t('basic.caseStats.unit')"
prop="unit"
>
<el-input
v-model="form.unit"
placeholder="请输入统计值单位"
:placeholder="$t('basic.caseStats.unitPlaceholder')"
/>
</el-form-item>
<el-form-item
label="字典名称"
:label="$t('basic.caseStats.dictName')"
prop="dictType"
>
<el-select
@@ -274,13 +274,13 @@
</el-select>
</el-form-item>
<el-form-item
label="备注"
:label="$t('common.remark')"
prop="remark"
>
<el-input
v-model="form.remark"
type="textarea"
placeholder="请输入内容"
:placeholder="$t('basic.caseStats.contentPlaceholder')"
/>
</el-form-item>
</el-form>
@@ -290,10 +290,10 @@
type="primary"
@click="submitForm"
>
{{ $t('common.confirm') }}
</el-button>
<el-button @click="cancel">
{{ $t('common.cancel') }}
</el-button>
</div>
</template>
@@ -304,6 +304,9 @@
<script setup name="Post">
import {add, deleteStatistics, getPageList, init, update} from './api';
import {optionselect as getDictOptionselect} from '@/api/system/dict/type';
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
const { proxy } = getCurrentInstance();
const { sys_normal_disable } = proxy.useDict('sys_normal_disable');
@@ -323,13 +326,14 @@ const data = reactive({
pageSize: 10,
searchKey: undefined,
},
rules: {
name: [{ required: true, message: '请输入属性名称', trigger: 'blur' }],
code: [{ required: true, message: '请输入属性代码', trigger: 'blur' }],
},
});
const { queryParams, form, rules } = toRefs(data);
const rules = computed(() => ({
name: [{ required: true, message: t('basic.caseStats.attrNamePlaceholder'), trigger: 'blur' }],
code: [{ required: true, message: t('basic.caseStats.attrCodePlaceholder'), trigger: 'blur' }],
}));
const { queryParams, form } = toRefs(data);
/** 查询岗位列表 */
function getList() {
@@ -377,14 +381,14 @@ function resetQuery() {
function handleAdd() {
reset();
open.value = true;
title.value = '添加统计';
title.value = t('basic.caseStats.addTitle');
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset();
form.value = row;
open.value = true;
title.value = '修改统计';
title.value = t('basic.caseStats.editTitle');
}
/** 提交按钮 */
function submitForm() {
@@ -395,13 +399,13 @@ function submitForm() {
if (valid) {
if (form.value.id != undefined) {
update(form.value).then((response) => {
proxy.$modal.msgSuccess('修改成功');
proxy.$modal.msgSuccess(t('basic.caseStats.modifySuccess'));
open.value = false;
getList();
});
} else {
add(form.value).then((response) => {
proxy.$modal.msgSuccess('新增成功');
proxy.$modal.msgSuccess(t('basic.caseStats.addSuccess'));
open.value = false;
getList();
});
@@ -412,20 +416,20 @@ function submitForm() {
/** 删除按钮操作 */
function handleDelete(row) {
proxy.$modal
.confirm('是否确认删除编号为"' + row.id + '"的数据项?')
.confirm(t('basic.caseStats.confirmDeleteItem', { id: row.id }))
.then(function () {
return deleteStatistics(row.id);
})
.then(() => {
getList();
proxy.$modal.msgSuccess('删除成功');
proxy.$modal.msgSuccess(t('basic.caseStats.deleteSuccess'));
})
.catch(() => {});
}
const typeEnumsOptions = ref([]);
const typeEnums = (value) => {
if (typeEnumsOptions.value.length) {
return typeEnumsOptions.value.find((item) => item.value == value)?.info || '未知';
return typeEnumsOptions.value.find((item) => item.value == value)?.info || t('basic.caseStats.unknown');
}
};
const initPage = async () => {

View File

@@ -4,18 +4,18 @@
<el-space>
<el-input
v-model="queryParams.searchKey"
placeholder="请输入名称搜索"
:placeholder="$t('basic.caseStats.nameSearchPlaceholder')"
clearable
/>
<el-button @click="refresh">
查询
{{ $t('common.search') }}
</el-button>
<el-button
type="primary"
@click="newTemplate"
>
新建
{{ $t('basic.caseStats.create') }}
</el-button>
</el-space>
</div>
@@ -26,25 +26,25 @@
>
<vxe-column
field="name"
title="名称"
:title="$t('basic.caseStats.name')"
/>
<vxe-column
field="count"
title="数量"
:title="$t('basic.caseStats.count')"
/>
<vxe-column title="操作">
<vxe-column :title="$t('common.operation')">
<template #default="scope">
<el-button
type="primary"
@click="editStatistics(scope.row)"
>
编辑
{{ $t('common.edit') }}
</el-button>
<el-button
type="danger"
@click="deleteStatistics(scope.row)"
>
删除
{{ $t('common.delete') }}
</el-button>
</template>
</vxe-column>
@@ -53,7 +53,7 @@
</div>
<EditStatistics
v-model:dialog-visible="dialogVisible"
:title="currentNodeData ? '编辑病历文件信息' : '病历文件基本信息'"
:title="currentNodeData ? $t('basic.caseTemplate.editFileInfo') : $t('basic.caseTemplate.fileInfo')"
:form-data="formData"
:current-node-data="currentNodeData"
@submit-ok="handleSubmitOk"
@@ -64,6 +64,9 @@
import {onMounted, reactive, ref} from 'vue';
import {init,} from './api';
import EditStatistics from './components/editStatistics.vue';
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
const queryParams = ref({
pageNo: 1,

View File

@@ -3,13 +3,13 @@
<el-card shadow="never">
<template #header>
<div class="card-header">
<span class="card-title">常用诊断</span>
<span class="card-title">{{ $t('commonDiagnosis.title') }}</span>
<el-button
type="primary"
icon="Plus"
@click="handleAdd"
>
新增诊断
{{ $t('common.add') }}
</el-button>
</div>
</template>
@@ -194,30 +194,32 @@
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { ref, onMounted, computed } from 'vue'
import { ElMessage } from 'element-plus'
import { useI18n } from 'vue-i18n'
import { getDiagnosisPage, addDiagnosis, updateDiagnosis, stopDiagnosis, startDiagnosis } from './components/api'
const { t } = useI18n()
const loading = ref(false); const tableData = ref([]); const total = ref(0)
const queryParams = ref({ searchKey: '', pageNo: 1, pageSize: 10 })
const formVisible = ref(false); const formTitle = ref('新增诊断'); const isEdit = ref(false); const formRef = ref()
const formVisible = ref(false); const formTitle = ref(t('commonDiagnosis.addTitle')); const isEdit = ref(false); const formRef = ref()
const form = ref({ id: null, conditionCode: '', name: '', pyStr: '', typeCode: 'WEST' })
const rules = { conditionCode: [{ required: true, message: '请输入编码', trigger: 'blur' }], name: [{ required: true, message: '请输入名称', trigger: 'blur' }] }
const rules = computed(() => ({ conditionCode: [{ required: true, message: t('commonDiagnosis.msgInputCode'), trigger: 'blur' }], name: [{ required: true, message: t('commonDiagnosis.msgInputName'), trigger: 'blur' }] }))
function getList() {
loading.value = true
getDiagnosisPage(queryParams.value).then(res => { tableData.value = res.data?.records || []; total.value = res.data?.total || 0 }).finally(() => { loading.value = false })
}
function handleQuery() { queryParams.value.pageNo = 1; getList() }
function resetQuery() { queryParams.value = { searchKey: '', pageNo: 1, pageSize: 10 }; getList() }
function handleAdd() { isEdit.value = false; formTitle.value = '新增诊断'; form.value = { id: null, conditionCode: '', name: '', pyStr: '', typeCode: 'WEST' }; formVisible.value = true }
function handleEdit(row) { isEdit.value = true; formTitle.value = '编辑诊断'; form.value = { ...row }; formVisible.value = true }
function handleAdd() { isEdit.value = false; formTitle.value = t('commonDiagnosis.addTitle'); form.value = { id: null, conditionCode: '', name: '', pyStr: '', typeCode: 'WEST' }; formVisible.value = true }
function handleEdit(row) { isEdit.value = true; formTitle.value = t('commonDiagnosis.editTitle'); form.value = { ...row }; formVisible.value = true }
function submitForm() {
formRef.value.validate(valid => { if (!valid) return
const action = isEdit.value ? updateDiagnosis(form.value) : addDiagnosis(form.value)
action.then(res => { if (res.code === 200) { ElMessage.success(isEdit.value ? '修改成功' : '新增成功'); formVisible.value = false; getList() } else ElMessage.error(res.msg || '操作失败') })
action.then(res => { if (res.code === 200) { ElMessage.success(isEdit.value ? t('commonDiagnosis.msgEditSuccess') : t('commonDiagnosis.msgAddSuccess')); formVisible.value = false; getList() } else ElMessage.error(res.msg || t('common.operationFailed')) })
})
}
function handleStop(row) { stopDiagnosis(row.id).then(res => { if (res.code === 200) { ElMessage.success('已停用'); getList() } }) }
function handleStart(row) { startDiagnosis(row.id).then(res => { if (res.code === 200) { ElMessage.success('已启用'); getList() } }) }
function handleStop(row) { stopDiagnosis(row.id).then(res => { if (res.code === 200) { ElMessage.success(t('commonDiagnosis.msgStopped')); getList() } }) }
function handleStart(row) { startDiagnosis(row.id).then(res => { if (res.code === 200) { ElMessage.success(t('commonDiagnosis.msgStarted')); getList() } }) }
onMounted(() => getList())
</script>
<style lang="scss" scoped>

View File

@@ -8,18 +8,18 @@
@cell-click="clickRow"
>
<vxe-column
title="项目名称"
:title="$t('basic.consumables.itemName')"
align="center"
field="name"
width="300"
/>
<vxe-column
title="类型"
:title="$t('basic.consumables.type')"
align="center"
field="typeEnum_enumText"
/>
<vxe-column
title="价格"
:title="$t('basic.consumables.price')"
align="right"
field="retailPrice"
>
@@ -28,7 +28,7 @@
</template>
</vxe-column>
<vxe-column
title="说明"
:title="$t('basic.consumables.description')"
align="center"
field="descriptionText"
/>
@@ -39,8 +39,11 @@
<script setup>
import {getActivityList} from './api';
import {watch} from 'vue';
import { useI18n } from 'vue-i18n'
import {throttle} from 'lodash-es';
const { t } = useI18n()
const props = defineProps({
searchKey: {
type: String,

View File

@@ -7,7 +7,7 @@
:disabled="buttonDisabled"
@click="handleAddPrescription()"
>
添加绑定项目
{{ $t('basic.consumables.addBinding') }}
</el-button>
</div>
<el-form
@@ -24,7 +24,7 @@
@checkbox-change="handleSelectionChange"
>
<vxe-column
title="项目类型"
:title="$t('basic.consumables.itemType')"
align="center"
field="type"
width="150"
@@ -43,12 +43,12 @@
>
<el-option
v-if="props.tab == 1 || props.tab == 3"
label="诊疗"
:label="$t('basic.consumables.diagnosis')"
value="1"
/>
<el-option
v-if="props.tab != 3"
label="耗材"
:label="$t('basic.consumables.consumable')"
value="2"
/>
</el-select>
@@ -56,7 +56,7 @@
</template>
</vxe-column>
<vxe-column
title="项目名"
:title="$t('basic.consumables.itemName')"
align="center"
field="name"
>
@@ -89,7 +89,7 @@
</template>
</vxe-column>
<vxe-column
title="绑定数量"
:title="$t('basic.consumables.bindQuantity')"
align="center"
field="quantity"
width="250"
@@ -109,7 +109,7 @@
</template>
</vxe-column>
<vxe-column
title="单位"
:title="$t('basic.consumables.unit')"
align="center"
field="unitCode_dictText"
width="100"
@@ -168,7 +168,7 @@
</template>
</vxe-column> -->
<vxe-column
title="启用状态"
:title="$t('basic.consumables.enableStatus')"
align="center"
field="statusEnum"
width="250"
@@ -196,7 +196,7 @@
</template>
</vxe-column>
<vxe-column
title="操作"
:title="$t('common.operation')"
align="center"
fixed="right"
width="250"
@@ -208,7 +208,7 @@
type="primary"
@click="handleEdit(scope.rowIndex)"
>
编辑
{{ $t('common.edit') }}
</el-button>
<el-button
v-if="scope.row.isEdit"
@@ -216,7 +216,7 @@
type="primary"
@click="handleSave(scope.row, scope.rowIndex)"
>
保存
{{ $t('common.save') }}
</el-button>
<el-button
v-if="scope.row.isEdit"
@@ -232,14 +232,14 @@
}
"
>
取消
{{ $t('common.cancel') }}
</el-button>
<el-button
link
type="primary"
@click.stop="handleDelete(scope.row, scope.rowIndex)"
>
删除
{{ $t('common.delete') }}
</el-button>
</template>
</vxe-column>
@@ -249,12 +249,15 @@
</template>
<script setup>
import {reactive, watch} from 'vue';
import {reactive, watch, computed} from 'vue';
import { useI18n } from 'vue-i18n'
import {bind, deleteBind, init} from './api';
import PopoverList from '@/components/HealthLinkHis/popoverList/index.vue';
import DeviceList from './deviceList.vue';
import ActivityList from './activityList.vue';
const { t } = useI18n()
const emit = defineEmits(['refresh']);
const total = ref(0);
const queryParams = ref({});
@@ -262,11 +265,11 @@ const consumablesList = ref([]);
const searchKey = ref('');
const rowIndex = ref(-1);
const isAdd = ref(true);
const rules = ref({
name: [{ required: true, message: '请选择耗材项', trigger: 'change' }],
quantity: [{ required: true, message: '请输入绑定数量', trigger: 'blur' }],
rangeCode: [{ required: true, message: '请选择使用范围', trigger: 'blur' }],
});
const rules = computed(() => ({
name: [{ required: true, message: t('basic.consumables.selectConsumable'), trigger: 'change' }],
quantity: [{ required: true, message: t('basic.consumables.enterQuantity'), trigger: 'blur' }],
rangeCode: [{ required: true, message: t('basic.consumables.selectRange'), trigger: 'blur' }],
}));
const form = reactive({
consumablesList: [],
});
@@ -311,7 +314,7 @@ watch(
typeCode: item.typeCode,
typeCode_dictText: item.typeCode_dictText,
type: item.activityName ? '1' : '2',
type_dictText: item.activityName ? '诊疗' : '耗材',
type_dictText: item.activityName ? t('basic.consumables.diagnosis') : t('basic.consumables.consumable'),
};
});
isAdd.value = true;
@@ -332,7 +335,7 @@ const { proxy } = getCurrentInstance();
const { use_range } = proxy.useDict('use_range');
function handleAddPrescription() {
if (!isAdd.value) {
proxy.$modal.msgWarning('请先保存当前行');
proxy.$modal.msgWarning(t('basic.consumables.saveFirst'));
return;
}
form.consumablesList.push({
@@ -365,7 +368,7 @@ function handleSave(row, index) {
devActTable: row.type == '1' ? 'wor_activity_definition' : 'adm_device_definition',
}).then((res) => {
if (res.code === 200) {
proxy.$modal.msgSuccess('操作成功');
proxy.$modal.msgSuccess(t('common.message'));
emit('refresh');
isAdd.value = true;
}
@@ -377,10 +380,10 @@ function handleSave(row, index) {
function handleDelete(row, index) {
if (row.id) {
proxy.$modal.confirm('确认删除当前绑定项目吗').then(() => {
proxy.$modal.confirm(t('basic.consumables.confirmDeleteBinding')).then(() => {
deleteBind(row.id).then((res) => {
if (res.code == 200) {
proxy.$modal.msgSuccess('删除成功');
proxy.$modal.msgSuccess(t('basic.consumables.deleteSuccess'));
emit('refresh');
}
});

View File

@@ -8,29 +8,29 @@
@cell-click="clickRow"
>
<vxe-column
title="项目名称"
:title="$t('basic.consumables.itemName')"
align="center"
field="name"
width="200"
/>
<vxe-column
title="分类"
:title="$t('basic.consumables.category')"
align="center"
field="categoryCode_dictText"
width="150"
/>
<vxe-column
title="种类"
:title="$t('basic.consumables.kind')"
align="center"
field="typeCode_dictText"
/>
<vxe-column
title="规格"
:title="$t('basic.consumables.spec')"
align="center"
field="size"
/>
<vxe-column
title="价格"
:title="$t('basic.consumables.price')"
align="right"
field="retailPrice"
>
@@ -39,7 +39,7 @@
</template>
</vxe-column>
<vxe-column
title="生产厂家"
:title="$t('basic.consumables.manufacturer')"
align="center"
field="supplyId_dictText"
/>
@@ -50,8 +50,11 @@
<script setup>
import {getFullDeviceList} from './api';
import {watch} from 'vue';
import { useI18n } from 'vue-i18n'
import {throttle} from 'lodash-es';
const { t } = useI18n()
const props = defineProps({
searchKey: {
type: String,

View File

@@ -46,19 +46,19 @@
@cell-click="clickRow"
>
<vxe-column
title="项目名"
:title="$t('basic.consumables.itemName')"
align="center"
field="name"
/>
</vxe-table>
</el-tab-pane>
<el-tab-pane
label="号源"
:label="$t('basic.consumables.numberSource')"
:name="3"
>
<el-input
v-model="queryParamsRegistration.searchKey"
placeholder="请输入项目名"
:placeholder="$t('basic.consumables.itemNamePlaceholder')"
clearable
style="width: 100%; margin-bottom: 10px"
@keyup.enter="getRegistrationList"
@@ -77,7 +77,7 @@
@cell-click="clickRow"
>
<vxe-column
title="项目名"
:title="$t('basic.consumables.itemName')"
align="center"
field="name"
/>

View File

@@ -34,15 +34,15 @@
@change="handleRangeChange"
>
<el-option
label="个人"
:label="$t('basic.medOrderSet.personal')"
value="personal"
/>
<el-option
label="科室"
:label="$t('basic.medOrderSet.department')"
value="department"
/>
<el-option
label="全院"
:label="$t('basic.medOrderSet.hospital')"
value="hospital"
/>
</el-select>
@@ -50,12 +50,12 @@
<el-form-item
v-if="currentTab === 'personal' && !isDoctorStation && !showRangeSelector"
label="参与者"
:label="$t('basic.medOrderSet.participant')"
prop="practitionerId"
>
<el-select
v-model="formData.practitionerId"
placeholder="请选择参与者"
:placeholder="$t('basic.medOrderSet.selectParticipant')"
clearable
style="width: 220px"
>
@@ -81,7 +81,7 @@
value-key="id"
check-strictly
default-expand-all
placeholder="请选择科室"
:placeholder="$t('basic.medOrderSet.selectDept')"
style="width: 220px"
:render-after-expand="false"
@change="handleOrgChange"
@@ -95,13 +95,13 @@
type="primary"
@click="handleAddRow"
>
新增
{{ $t('common.add') }}
</el-button>
<el-button @click="handleCombineGroup">
组合
{{ $t('basic.medOrderSet.combine') }}
</el-button>
<el-button @click="handleSplitGroup">
拆组
{{ $t('basic.medOrderSet.splitGroup') }}
</el-button>
</div>
@@ -120,7 +120,7 @@
:selectable="isRowSelectable"
/>
<vxe-column
title=""
:title="$t('basic.medOrderSet.group')"
align="center"
width="60"
>
@@ -129,7 +129,7 @@
</template>
</vxe-column>
<vxe-column
title="类型"
:title="$t('basic.medOrderSet.type')"
align="center"
width="160"
>
@@ -140,22 +140,22 @@
size="small"
>
<el-radio-button value="1">
长期
{{ $t('basic.medOrderSet.longTerm') }}
</el-radio-button>
<el-radio-button value="2">
临时
{{ $t('basic.medOrderSet.temporary') }}
</el-radio-button>
</el-radio-group>
</template>
<span v-else>
{{
scope.row.therapyEnum == '1' ? '长期' : scope.row.therapyEnum == '2' ? '临时' : '-'
scope.row.therapyEnum == '1' ? $t('basic.medOrderSet.longTerm') : scope.row.therapyEnum == '2' ? $t('basic.medOrderSet.temporary') : '-'
}}
</span>
</template>
</vxe-column>
<vxe-column
title="医嘱"
:title="$t('basic.medOrderSet.order')"
align="center"
field="productName"
width="300"
@@ -179,7 +179,7 @@
:ref="'adviceRef' + scope.rowIndex"
v-model="scope.row.adviceName"
style="width: 100%"
placeholder="请选择项目"
:placeholder="$t('basic.medOrderSet.selectItem')"
@input="(value) => handleInput(value, scope.row, scope.rowIndex)"
@click="handleFocus(scope.row, scope.rowIndex)"
@keyup.enter.stop="handleFocus(scope.row, scope.rowIndex)"
@@ -202,7 +202,7 @@
</vxe-column>
<vxe-column
title="单次剂量"
:title="$t('basic.medOrderSet.singleDose')"
align="center"
width="250"
>
@@ -248,7 +248,7 @@
</vxe-column>
<vxe-column
title="给药途径"
:title="$t('basic.medOrderSet.route')"
align="center"
width="150"
>
@@ -257,7 +257,7 @@
<template v-if="scope.row.adviceType == 1 || !scope.row.adviceDefinitionId">
<el-select
v-model="scope.row.methodCode"
placeholder="给药途径"
:placeholder="$t('basic.medOrderSet.route')"
clearable
filterable
>
@@ -279,7 +279,7 @@
</vxe-column>
<vxe-column
title="用药频次"
:title="$t('basic.medOrderSet.frequency')"
align="center"
width="150"
>
@@ -288,7 +288,7 @@
<template v-if="scope.row.adviceType == 1 || !scope.row.adviceDefinitionId">
<el-select
v-model="scope.row.rateCode"
placeholder="频次"
:placeholder="$t('basic.medOrderSet.frequency')"
style="width: 120px"
filterable
>
@@ -310,7 +310,7 @@
</vxe-column>
<vxe-column
title="用药天数"
:title="$t('basic.medOrderSet.medicationDays')"
align="center"
width="100"
>
@@ -332,7 +332,7 @@
</vxe-column>
<vxe-column
title="总量/执行次数"
:title="$t('basic.medOrderSet.totalOrExec')"
align="center"
width="150"
field="sortNumber"
@@ -351,7 +351,7 @@
</vxe-column>
<vxe-column
title="单位"
:title="$t('basic.medOrderSet.unit')"
align="center"
width="120"
field="unitCode"
@@ -360,7 +360,7 @@
<template v-if="!scope.row.groupPackageId">
<el-select
v-model="scope.row.selectUnitCode"
placeholder="请选择单位"
:placeholder="$t('basic.medOrderSet.selectUnit')"
@change="handleUnitChange(scope.row)"
>
<el-option
@@ -382,7 +382,7 @@
</vxe-column>
<vxe-column
title="操作"
:title="$t('common.operation')"
align="center"
width="80"
>
@@ -400,14 +400,14 @@
<template #footer>
<el-button @click="dialogVisible = false">
取 消
{{ $t('common.cancel') }}
</el-button>
<el-button
type="primary"
:loading="submitLoading"
@click="submitForm"
>
确 定
{{ $t('common.confirm') }}
</el-button>
</template>
</el-dialog>
@@ -485,14 +485,14 @@ const adviceTableRef = ref();
const formRules = computed(() => {
const rules = {
name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
name: [{ required: true, message: t('basic.medOrderSet.namePlaceholder'), trigger: 'blur' }],
};
// 独立页面:个人必须选参与者;科室必须选科室
if (!props.isDoctorStation && currentTab.value === 'personal') {
rules.practitionerId = [{ required: true, message: '请选择参与者', trigger: 'change' }];
rules.practitionerId = [{ required: true, message: t('basic.medOrderSet.selectParticipant'), trigger: 'change' }];
}
if (currentTab.value === 'department') {
rules.organizationId = [{ required: true, message: '请选择科室', trigger: 'change' }];
rules.organizationId = [{ required: true, message: t('basic.medOrderSet.selectDept'), trigger: 'change' }];
}
return rules;
});
@@ -509,7 +509,7 @@ onMounted(() => {
function openAdd(tab) {
currentTab.value = tab;
isEdit.value = false;
dialogTitle.value = '新增医嘱';
dialogTitle.value = t('basic.medOrderSet.addOrder');
dialogVisible.value = true;
if (props.showRangeSelector) rangeSelectValue.value = tab;
@@ -553,7 +553,7 @@ function handleRangeChange(tab) {
function openFromSelection(tab, rows = []) {
currentTab.value = tab;
isEdit.value = false;
dialogTitle.value = '另存组套';
dialogTitle.value = t('basic.medOrderSet.saveAsSet');
dialogVisible.value = true;
if (props.showRangeSelector) rangeSelectValue.value = tab;
@@ -573,7 +573,7 @@ function openFromSelection(tab, rows = []) {
const validRows = (rows || []).filter((i) => i.adviceDefinitionId);
if (validRows.length === 0) {
proxy.$modal.msgWarning('所选医嘱中没有有效的医嘱项,请先选择医嘱后再另存组套');
proxy.$modal.msgWarning(t('basic.medOrderSet.noValidOrders'));
dialogVisible.value = false;
return;
}
@@ -623,7 +623,7 @@ function openFromSelection(tab, rows = []) {
function openEdit(tab, row) {
currentTab.value = tab;
isEdit.value = true;
dialogTitle.value = '编辑医嘱';
dialogTitle.value = t('basic.medOrderSet.editOrder');
dialogVisible.value = true;
formData.groupPackageId = row.groupPackageId;
@@ -696,13 +696,13 @@ function handleSelectionChange(selection) {
function handleCombineGroup() {
const rows = selectedRows.value || [];
if (rows.length <= 1) {
proxy.$modal.msgWarning('至少选择两项');
proxy.$modal.msgWarning(t('basic.medOrderSet.selectAtLeastTwo'));
return;
}
// 必须都已选择医嘱
if (rows.some((r) => !r.adviceDefinitionId)) {
proxy.$modal.msgWarning('请先完成医嘱选择');
proxy.$modal.msgWarning(t('basic.medOrderSet.completeOrderSelection'));
return;
}
@@ -712,7 +712,7 @@ function handleCombineGroup() {
if (r.methodCode != null) methodSet.add(r.methodCode);
});
if (methodSet.size > 1) {
proxy.$modal.msgWarning('同一分组药品用法必须相同');
proxy.$modal.msgWarning(t('basic.medOrderSet.sameGroupUsage'));
return;
}
@@ -722,7 +722,7 @@ function handleCombineGroup() {
if (r.rateCode != null) rateSet.add(r.rateCode);
});
if (rateSet.size > 1) {
proxy.$modal.msgWarning('同一分组药品频次必须相同');
proxy.$modal.msgWarning(t('basic.medOrderSet.sameGroupFrequency'));
return;
}
@@ -741,7 +741,7 @@ function handleCombineGroup() {
groupIndex.value += 1;
prescriptionList.value = newList;
prescriptionRef.value?.clearSelection?.();
proxy.$modal.msgSuccess('组套成功');
proxy.$modal.msgSuccess(t('basic.medOrderSet.combineSuccess'));
}
function isRowSelectable(row) {
@@ -781,11 +781,11 @@ function getRateOptions(row) {
function handleSplitGroup() {
const rows = selectedRows.value || [];
if (rows.length < 1) {
proxy.$modal.msgWarning('至少选择一项');
proxy.$modal.msgWarning(t('basic.medOrderSet.selectAtLeastOne'));
return;
}
if (rows.some((r) => !r.groupId)) {
proxy.$modal.msgWarning('包含非组合数据无法拆组');
proxy.$modal.msgWarning(t('basic.medOrderSet.cannotSplit'));
return;
}
@@ -800,7 +800,7 @@ function handleSplitGroup() {
prescriptionList.value = newList;
prescriptionRef.value?.clearSelection?.();
proxy.$modal.msgSuccess('拆组成功');
proxy.$modal.msgSuccess(t('basic.medOrderSet.splitSuccess'));
}
function submitForm() {
@@ -810,7 +810,7 @@ function submitForm() {
// 验证至少选择了一条医嘱
const detailList = prescriptionList.value.filter((item) => item.adviceDefinitionId);
if (detailList.length === 0) {
proxy?.$modal?.msgWarning?.('请至少选择一条医嘱');
proxy?.$modal?.msgWarning?.(t('basic.medOrderSet.selectAtLeastOneOrder'));
return;
}
@@ -818,27 +818,27 @@ function submitForm() {
const westernMedicineRows = detailList.filter((item) => item.adviceType == 1);
for (const row of westernMedicineRows) {
if (!row.dose && row.dose !== 0) {
proxy?.$modal?.msgWarning?.('单次剂量为必填项');
proxy?.$modal?.msgWarning?.(t('basic.medOrderSet.doseRequired'));
return;
}
if (!row.methodCode) {
proxy?.$modal?.msgWarning?.('给药途径为必填项');
proxy?.$modal?.msgWarning?.(t('basic.medOrderSet.routeRequired'));
return;
}
if (!row.rateCode) {
proxy?.$modal?.msgWarning?.('用药频次为必填项');
proxy?.$modal?.msgWarning?.(t('basic.medOrderSet.frequencyRequired'));
return;
}
if (!row.dispensePerDuration && row.dispensePerDuration !== 0) {
proxy?.$modal?.msgWarning?.('用药天数为必填项');
proxy?.$modal?.msgWarning?.(t('basic.medOrderSet.daysRequired'));
return;
}
if (!row.sortNumber && row.sortNumber !== 0) {
proxy?.$modal?.msgWarning?.('总量/执行次数为必填项');
proxy?.$modal?.msgWarning?.(t('basic.medOrderSet.quantityRequired'));
return;
}
if (!row.selectUnitCode) {
proxy?.$modal?.msgWarning?.('单位为必填项');
proxy?.$modal?.msgWarning?.(t('basic.medOrderSet.unitRequired'));
return;
}
}
@@ -888,19 +888,19 @@ function submitForm() {
.then((res) => {
console.log('[submitForm] 保存API返回:', res);
if (res.code === 200) {
ElMessage.success(res.message || '保存成功');
ElMessage.success(res.message || t('basic.medOrderSet.saveSuccess'));
console.log('[submitForm] 准备触发 saved 事件');
emit('saved');
console.log('[submitForm] saved 事件已触发');
dialogVisible.value = false;
prescriptionList.value = [];
} else {
proxy?.$modal?.msgError?.(res.message || '保存失败');
proxy?.$modal?.msgError?.(res.message || t('basic.medOrderSet.saveFailed'));
}
})
.catch((err) => {
console.error('保存失败:', err);
proxy?.$modal?.msgError?.(err?.message || '保存失败,请检查网络或联系管理员');
proxy?.$modal?.msgError?.(err?.message || t('basic.medOrderSet.saveFailedNetwork'));
})
.finally(() => {
submitLoading.value = false;
@@ -1001,14 +1001,14 @@ function handleUnitChange(row) {
function handleDeleteRow(index) {
if (prescriptionList.value.length <= 1) {
proxy.$modal.msgWarning('至少保留一行');
proxy.$modal.msgWarning(t('basic.medOrderSet.keepOneRow'));
return;
}
proxy.$modal
.confirm('确定要删除该行吗?')
.confirm(t('basic.medOrderSet.confirmDeleteRow'))
.then(() => {
prescriptionList.value.splice(index, 1);
proxy.$modal.msgSuccess('删除成功');
proxy.$modal.msgSuccess(t('basic.medOrderSet.deleteSuccess'));
})
.catch(() => {});
}
@@ -1036,7 +1036,7 @@ function handleOrgChange(value) {
};
const selectedNode = findNode(organization.value);
if (selectedNode && !isLeafNode(selectedNode)) {
proxy.$modal.msgWarning('只能选择末级科室');
proxy.$modal.msgWarning(t('basic.medOrderSet.selectLeafDept'));
formData.organizationId = null;
}
}

View File

@@ -5,7 +5,7 @@
@tab-change="handleTabChange"
>
<el-tab-pane
label="个人"
:label="$t('basic.medOrderSet.personal')"
name="personal"
>
<div class="mb10">
@@ -16,7 +16,7 @@
<el-col :span="6">
<el-input
v-model="personalQuery.searchKey"
placeholder="请输入名称"
:placeholder="$t('basic.medOrderSet.namePlaceholder')"
clearable
@keyup.enter="getPersonalListData"
/>
@@ -27,7 +27,7 @@
icon="Search"
@click="getPersonalListData"
>
查询
{{ $t('common.search') }}
</el-button>
</el-col>
</el-row>
@@ -37,7 +37,7 @@
icon="Plus"
@click="handleAdd('personal')"
>
新增
{{ $t('common.add') }}
</el-button>
</div>
<vxe-table
@@ -47,14 +47,14 @@
>
<vxe-column
field="name"
title="名称"
:title="$t('basic.medOrderSet.name')"
/>
<vxe-column
field="practitionerName"
title="参与者"
:title="$t('basic.medOrderSet.participant')"
/>
<vxe-column
title="操作"
:title="$t('common.operation')"
width="150"
>
<template #default="scope">
@@ -64,7 +64,7 @@
icon="Edit"
@click="handleEdit('personal', scope.row)"
>
编辑
{{ $t('common.edit') }}
</el-button>
<el-button
link
@@ -72,15 +72,15 @@
icon="Delete"
@click="handleDelete('personal', scope.row)"
>
删除
{{ $t('common.delete') }}
</el-button>
</template>
</vxe-column>
</vxe-table>
</el-tab-pane>
<el-tab-pane
label="科室"
<el-tab-pane
:label="$t('basic.medOrderSet.department')"
name="department"
>
<div class="mb10">
@@ -91,7 +91,7 @@
<el-col :span="6">
<el-input
v-model="departmentQuery.searchKey"
placeholder="请输入名称"
:placeholder="$t('basic.medOrderSet.namePlaceholder')"
clearable
@keyup.enter="getDepartmentListData"
/>
@@ -102,7 +102,7 @@
icon="Search"
@click="getDepartmentListData"
>
查询
{{ $t('common.search') }}
</el-button>
</el-col>
</el-row>
@@ -112,7 +112,7 @@
icon="Plus"
@click="handleAdd('department')"
>
新增
{{ $t('common.add') }}
</el-button>
</div>
<vxe-table
@@ -122,14 +122,14 @@
>
<vxe-column
field="name"
title="名称"
:title="$t('basic.medOrderSet.name')"
/>
<vxe-column
field="organizationName"
title="科室"
:title="$t('basic.medOrderSet.department')"
/>
<vxe-column
title="操作"
:title="$t('common.operation')"
width="150"
>
<template #default="scope">
@@ -139,7 +139,7 @@
icon="Edit"
@click="handleEdit('department', scope.row)"
>
编辑
{{ $t('common.edit') }}
</el-button>
<el-button
link
@@ -147,15 +147,15 @@
icon="Delete"
@click="handleDelete('department', scope.row)"
>
删除
{{ $t('common.delete') }}
</el-button>
</template>
</vxe-column>
</vxe-table>
</el-tab-pane>
<el-tab-pane
label="全院"
<el-tab-pane
:label="$t('basic.medOrderSet.hospital')"
name="hospital"
>
<div class="mb10">
@@ -166,7 +166,7 @@
<el-col :span="6">
<el-input
v-model="hospitalQuery.searchKey"
placeholder="请输入名称"
:placeholder="$t('basic.medOrderSet.namePlaceholder')"
clearable
@keyup.enter="getHospitalListData"
/>
@@ -177,7 +177,7 @@
icon="Search"
@click="getHospitalListData"
>
查询
{{ $t('common.search') }}
</el-button>
</el-col>
</el-row>
@@ -187,7 +187,7 @@
icon="Plus"
@click="handleAdd('hospital')"
>
新增
{{ $t('common.add') }}
</el-button>
</div>
<vxe-table
@@ -197,10 +197,10 @@
>
<vxe-column
field="name"
title="名称"
:title="$t('basic.medOrderSet.name')"
/>
<vxe-column
title="操作"
:title="$t('common.operation')"
width="150"
>
<template #default="scope">
@@ -210,7 +210,7 @@
icon="Edit"
@click="handleEdit('hospital', scope.row)"
>
编辑
{{ $t('common.edit') }}
</el-button>
<el-button
link
@@ -218,7 +218,7 @@
icon="Delete"
@click="handleDelete('hospital', scope.row)"
>
删除
{{ $t('common.delete') }}
</el-button>
</template>
</vxe-column>
@@ -242,24 +242,24 @@
<el-row>
<el-col :span="12">
<el-form-item
label="名称"
:label="$t('basic.medOrderSet.name')"
prop="name"
>
<el-input
v-model="formData.name"
placeholder="请输入名称"
:placeholder="$t('basic.medOrderSet.namePlaceholder')"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
v-if="currentTab == 'personal'"
label="参与者"
:label="$t('basic.medOrderSet.participant')"
prop="practitionerId"
>
<el-select
v-model="formData.practitionerId"
placeholder="请选择参与者"
:placeholder="$t('basic.medOrderSet.selectParticipant')"
clearable
>
<el-option
@@ -272,7 +272,7 @@
</el-form-item>
<el-form-item
v-if="currentTab == 'department'"
label="科室"
:label="$t('basic.medOrderSet.department')"
prop="organizationId"
>
<el-tree-select
@@ -283,7 +283,7 @@
value-key="id"
check-strictly
default-expand-all
placeholder="请选择科室"
:placeholder="$t('basic.medOrderSet.selectDept')"
:render-after-expand="false"
@change="handleOrgChange"
/>
@@ -300,7 +300,7 @@
@cell-click="clickRow"
>
<vxe-column
title="医嘱"
:title="$t('basic.medOrderSet.order')"
align="center"
field="productName"
>
@@ -323,7 +323,7 @@
:ref="'adviceRef' + scope.rowIndex"
v-model="scope.row.adviceName"
style="width: 50%"
placeholder="请选择项目"
:placeholder="$t('basic.medOrderSet.selectItem')"
@input="(value) => handleInput(value, scope.row, scope.rowIndex)"
@click="handleFocus(scope.row, scope.rowIndex)"
@keyup.enter.stop="handleFocus(scope.row, scope.rowIndex)"
@@ -347,7 +347,7 @@
</template>
</vxe-column>
<vxe-column
title="单次剂量"
:title="$t('basic.medOrderSet.singleDose')"
align="center"
width="250"
field="sortNumber"
@@ -383,7 +383,7 @@
</template>
</vxe-column>
<vxe-column
title="给药途径"
:title="$t('basic.medOrderSet.route')"
align="center"
width="150"
field="sortNumber"
@@ -393,7 +393,7 @@
<template v-if="!scope.row.groupPackageId">
<el-select
v-model="scope.row.methodCode"
placeholder="给药途径"
:placeholder="$t('basic.medOrderSet.route')"
clearable
filterable
>
@@ -411,7 +411,7 @@
</template>
</vxe-column>
<vxe-column
title="用药频次"
:title="$t('basic.medOrderSet.frequency')"
align="center"
width="150"
field="sortNumber"
@@ -421,7 +421,7 @@
<template v-if="!scope.row.groupPackageId">
<el-select
v-model="scope.row.rateCode"
placeholder="频次"
:placeholder="$t('basic.medOrderSet.frequency')"
style="width: 120px"
filterable
>
@@ -439,7 +439,7 @@
</template>
</vxe-column>
<vxe-column
title="用药天数"
:title="$t('basic.medOrderSet.medicationDays')"
align="center"
width="100"
field="sortNumber"
@@ -458,7 +458,7 @@
</template>
</vxe-column>
<vxe-column
title="总量/执行次数"
:title="$t('basic.medOrderSet.totalOrExec')"
align="center"
width="150"
field="sortNumber"
@@ -476,7 +476,7 @@
</template>
</vxe-column>
<vxe-column
title="单位"
:title="$t('basic.medOrderSet.unit')"
align="center"
width="120"
field="unitCode"
@@ -485,7 +485,7 @@
<template v-if="!scope.row.groupPackageId">
<el-select
v-model="scope.row.selectUnitCode"
placeholder="请选择单位"
:placeholder="$t('basic.medOrderSet.selectUnit')"
@change="handleUnitChange(scope.row)"
>
<el-option
@@ -506,7 +506,7 @@
</template>
</vxe-column>
<vxe-column
title="操作"
:title="$t('common.operation')"
align="center"
width="80"
>
@@ -523,14 +523,14 @@
</vxe-table>
<template #footer>
<el-button @click="dialogVisible = false">
取 消
{{ $t('common.cancel') }}
</el-button>
<el-button
type="primary"
:loading="submitLoading"
@click="submitForm"
>
{{ $t('common.confirm') }}
</el-button>
</template>
</el-dialog>
@@ -538,7 +538,8 @@
</template>
<script setup>
import {onMounted, reactive, ref} from 'vue';
import {computed, onMounted, reactive, ref} from 'vue';
import {useI18n} from 'vue-i18n';
import {
deleteGroup,
getAllList,
@@ -557,6 +558,7 @@ import useUserStore from '@/store/modules/user';
// 获取当前实例用于使用proxy
const { proxy } = getCurrentInstance();
const { t } = useI18n();
// 定义tab相关数据
const activeTab = ref('personal');
@@ -605,9 +607,9 @@ const nextId = ref(1);
const rowIndex = ref(0);
// 表单验证规则
const formRules = {
name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
};
const formRules = computed(() => ({
name: [{ required: true, message: t('basic.medOrderSet.namePlaceholder'), trigger: 'blur' }],
}));
// 表单引用
const formRef = ref();
@@ -650,7 +652,7 @@ function getPersonalListData() {
.catch((error) => {
console.error('获取个人医嘱列表失败:', error);
loading.personal = false;
proxy.$modal.msgError('获取个人医嘱列表失败');
proxy.$modal.msgError(t('basic.medOrderSet.getPersonalFailed'));
});
}
@@ -665,7 +667,7 @@ function getDepartmentListData() {
.catch((error) => {
console.error('获取科室医嘱列表失败:', error);
loading.department = false;
proxy.$modal.msgError('获取科室医嘱列表失败');
proxy.$modal.msgError(t('basic.medOrderSet.getDeptFailed'));
});
}
@@ -680,7 +682,7 @@ function getHospitalListData() {
.catch((error) => {
console.error('获取全院医嘱列表失败:', error);
loading.hospital = false;
proxy.$modal.msgError('获取全院医嘱列表失败');
proxy.$modal.msgError(t('basic.medOrderSet.getAllFailed'));
});
}
@@ -704,7 +706,7 @@ function handleTabChange(tab) {
function handleAdd(tab) {
currentTab.value = tab;
isEdit.value = false;
dialogTitle.value = '新增医嘱';
dialogTitle.value = t('basic.medOrderSet.addOrder');
dialogVisible.value = true;
// 重置表单
prescriptionList.value.unshift({
@@ -739,7 +741,7 @@ function handleEdit(tab, row) {
currentTab.value = tab;
isEdit.value = true;
currentRow.value = row;
dialogTitle.value = '编辑医嘱';
dialogTitle.value = t('basic.medOrderSet.editOrder');
dialogVisible.value = true;
formData.groupPackageId = row.groupPackageId;
formData.name = row.name;
@@ -790,7 +792,7 @@ function handleEdit(tab, row) {
function handleDelete(tab, row) {
// 显示确认框
proxy.$modal
.confirm('确定要删除该医嘱吗?')
.confirm(t('basic.medOrderSet.confirmDelete'))
.then(() => {
deleteGroup({ groupPackageId: row.groupPackageId }).then((res) => {
proxy.$modal.msgSuccess(res.msg);
@@ -834,11 +836,11 @@ function submitForm() {
savePersonal(params).then((res) => {
console.log('保存个人组套返回:', res);
if (res.code === 200) {
ElMessage.success(res.msg || '保存成功');
ElMessage.success(res.msg || t('basic.medOrderSet.saveSuccess'));
// 重新获取数据以保持一致性
fetchAllData();
} else {
ElMessage.error(res.msg || '保存失败');
ElMessage.error(res.msg || t('basic.medOrderSet.saveFailed'));
}
submitLoading.value = false;
dialogVisible.value = false;
@@ -846,7 +848,7 @@ function submitForm() {
prescriptionList.value = [];
}).catch((err) => {
console.error('保存个人组套失败:', err);
ElMessage.error('保存失败: ' + (err.message || '未知错误'));
ElMessage.error(t('basic.medOrderSet.saveFailed') + ': ' + (err.message || '未知错误'));
submitLoading.value = false;
});
break;
@@ -854,11 +856,11 @@ function submitForm() {
saveDepartment(params).then((res) => {
console.log('保存科室组套返回:', res);
if (res.code === 200) {
ElMessage.success(res.msg || '保存成功');
ElMessage.success(res.msg || t('basic.medOrderSet.saveSuccess'));
// 重新获取数据以保持一致性
fetchAllData();
} else {
ElMessage.error(res.msg || '保存失败');
ElMessage.error(res.msg || t('basic.medOrderSet.saveFailed'));
}
submitLoading.value = false;
dialogVisible.value = false;
@@ -866,7 +868,7 @@ function submitForm() {
prescriptionList.value = [];
}).catch((err) => {
console.error('保存科室组套失败:', err);
ElMessage.error('保存失败: ' + (err.message || '未知错误'));
ElMessage.error(t('basic.medOrderSet.saveFailed') + ': ' + (err.message || '未知错误'));
submitLoading.value = false;
});
break;
@@ -874,11 +876,11 @@ function submitForm() {
saveAll(params).then((res) => {
console.log('保存全院组套返回:', res);
if (res.code === 200) {
ElMessage.success(res.msg || '保存成功');
ElMessage.success(res.msg || t('basic.medOrderSet.saveSuccess'));
// 重新获取数据以保持一致性
fetchAllData();
} else {
ElMessage.error(res.msg || '保存失败');
ElMessage.error(res.msg || t('basic.medOrderSet.saveFailed'));
}
submitLoading.value = false;
dialogVisible.value = false;
@@ -886,7 +888,7 @@ function submitForm() {
prescriptionList.value = [];
}).catch((err) => {
console.error('保存全院组套失败:', err);
ElMessage.error('保存失败: ' + (err.message || '未知错误'));
ElMessage.error(t('basic.medOrderSet.saveFailed') + ': ' + (err.message || '未知错误'));
submitLoading.value = false;
});
break;
@@ -982,16 +984,16 @@ function handleUnitChange(row) {
function handleDeleteRow(index, row) {
// 确保至少保留一行
if (prescriptionList.value.length <= 1) {
proxy.$modal.msgWarning('至少保留一行');
proxy.$modal.msgWarning(t('basic.medOrderSet.keepOneRow'));
return;
}
// 确认删除
proxy.$modal
.confirm('确定要删除该行吗?')
.confirm(t('basic.medOrderSet.confirmDeleteRow'))
.then(() => {
prescriptionList.value.splice(index, 1);
proxy.$modal.msgSuccess('删除成功');
proxy.$modal.msgSuccess(t('basic.medOrderSet.deleteSuccess'));
})
.catch(() => {
// 取消删除
@@ -1032,7 +1034,7 @@ function handleOrgChange(value) {
// 如果选中的不是叶子节点,则清空选择
if (selectedNode && !isLeafNode(selectedNode)) {
proxy.$modal.msgWarning('只能选择末级科室');
proxy.$modal.msgWarning(t('basic.medOrderSet.selectLeafDept'));
formData.organizationId = null;
}
}

View File

@@ -60,7 +60,7 @@
<el-select
v-model="scope.row.inventoryId"
style="width: 180px; margin-right: 20px"
placeholder="药房"
:placeholder="$t('basic.ordersCombo.pharmacy')"
>
<el-option
v-for="item in scope.row.stockList"
@@ -69,13 +69,13 @@
:label="
item.locationName +
' ' +
'批次号: ' +
$t('basic.ordersCombo.lotNumber') + ' ' +
item.lotNumber +
' ' +
' 库存:' +
' ' + $t('basic.ordersCombo.stock') +
item.quantity / scope.row.partPercent +
item.unitCode_dictText +
' 单价:' +
' ' + $t('basic.ordersCombo.unitPrice') +
item.price.toFixed(2) +
'/' +
item.unitCode_dictText
@@ -86,7 +86,7 @@
</el-form-item>
<el-form-item
v-if="scope.row.injectFlag == 1"
label="执行次数:"
:label="$t('basic.ordersCombo.executeCount')"
prop="executeNum"
class="required-field"
data-prop="executeNum"
@@ -111,7 +111,7 @@
<div class="form-group">
<!-- 单次剂量 -->
<el-form-item
label="单次剂量:"
:label="$t('basic.ordersCombo.singleDose')"
prop="dose"
class="required-field"
data-prop="dose"
@@ -244,7 +244,7 @@
</el-select>
</el-form-item>
<el-form-item
label="用药天数:"
:label="$t('basic.ordersCombo.medicationDays')"
prop="dispensePerDuration"
class="required-field"
data-prop="dispensePerDuration"
@@ -262,13 +262,13 @@
@input="calculateTotalAmount(scope.row, scope.rowIndex)"
>
<template #suffix>
{{ $t('basic.ordersCombo.day') }}
</template>
</el-input-number>
</el-form-item>
<el-form-item
label="总量:"
:label="$t('basic.ordersCombo.totalQuantity')"
prop="quantity"
>
<el-input-number
@@ -300,7 +300,7 @@
type="primary"
@click="handleSaveSign(scope.row, scope.rowIndex)"
>
保存
{{ $t('common.save') }}
</el-button>
</div>
</template>
@@ -345,14 +345,14 @@
/>
</el-select>
<el-form-item
label="数量:"
:label="$t('basic.ordersCombo.quantity')"
prop="quantity"
class="required-field"
data-prop="quantity"
>
<el-input-number
v-model="scope.row.quantity"
placeholder="数量"
:placeholder="$t('basic.ordersCombo.quantity')"
style="width: 70px"
controls-position="right"
:controls="false"
@@ -378,14 +378,14 @@
</template>
</el-select>
<span class="total-amount">
总金额:{{ scope.row.totalPrice ? scope.row.totalPrice + ' 元' : '0.00 元' }}
{{ $t('basic.ordersCombo.totalAmount') }}{{ scope.row.totalPrice ? scope.row.totalPrice + ' ' + $t('basic.ordersCombo.yuan') : '0.00 ' + $t('basic.ordersCombo.yuan') }}
</span>
</div>
<el-button
type="primary"
@click="handleSaveSign(scope.row, scope.rowIndex)"
>
保存
{{ $t('common.save') }}
</el-button>
</div>
</template>
@@ -395,19 +395,19 @@
{{
scope.row.adviceName + ' ' + scope.row.unitPrice
? Number(scope.row.unitPrice).toFixed(2)
: '-' + '元'
: '-' + $t('basic.ordersCombo.yuan')
}}
</span>
<div class="form-group">
<el-form-item
label="执行次数:"
:label="$t('basic.ordersCombo.executeCount')"
prop="quantity"
class="required-field"
data-prop="quantity"
>
<el-input-number
v-model="scope.row.quantity"
placeholder="执行次数"
:placeholder="$t('basic.ordersCombo.executeCount')"
style="width: 100px; margin: 0 20px"
controls-position="right"
:controls="false"
@@ -422,10 +422,10 @@
:props="{ value: 'id', label: 'name', children: 'children' }"
value-key="id"
check-strictly
placeholder="请选择执行科室"
:placeholder="$t('basic.ordersCombo.selectExecDept')"
/>
<span class="total-amount">
总金额:{{ scope.row.totalPrice ? scope.row.totalPrice + ' 元' : '0.00 元' }}
{{ $t('basic.ordersCombo.totalAmount') }}{{ scope.row.totalPrice ? scope.row.totalPrice + ' ' + $t('basic.ordersCombo.yuan') : '0.00 ' + $t('basic.ordersCombo.yuan') }}
</span>
<span style="font-size: 16px; font-weight: 600">
<!-- 金额: {{ scope.row.priceList[0].price }} -->
@@ -435,7 +435,7 @@
type="primary"
@click="handleSaveSign(scope.row, scope.rowIndex)"
>
保存
{{ $t('common.save') }}
</el-button>
</div>
</template>
@@ -484,7 +484,7 @@
</template>
</vxe-column>
<vxe-column
title="医嘱项目"
:title="$t('basic.ordersCombo.orderItem')"
align="center"
field="productName"
width="400"
@@ -534,7 +534,7 @@
:ref="'adviceRef' + scope.rowIndex"
v-model="scope.row.adviceName"
style="width: 50%"
placeholder="请选择项目"
:placeholder="$t('basic.ordersCombo.selectItem')"
@input="handleChange"
@click="handleFocus(scope.row, scope.rowIndex)"
@keyup.enter.stop="handleFocus(scope.row, scope.rowIndex)"
@@ -568,18 +568,18 @@
v-if="scope.row.statusEnum == 2"
type="success"
>
已签发
{{ $t('basic.ordersCombo.issued') }}
</el-tag>
<el-tag
v-else-if="scope.row.statusEnum == 1"
type=""
>
待签发
{{ $t('basic.ordersCombo.pendingIssue') }}
</el-tag>
</template>
</vxe-column>
<vxe-column
title="单次剂量"
:title="$t('basic.ordersCombo.singleDose')"
align="center"
field=""
>
@@ -594,7 +594,7 @@
</template>
</vxe-column>
<vxe-column
title="总量"
:title="$t('basic.ordersCombo.totalQuantity')"
align="center"
field=""
>
@@ -605,7 +605,7 @@
</template>
</vxe-column>
<vxe-column
title="总金额"
:title="$t('basic.ordersCombo.totalAmount')"
align="right"
field=""
header-align="center"
@@ -615,12 +615,12 @@
v-if="!scope.row.isEdit"
style="text-align: right"
>
{{ scope.row.totalPrice ? Number(scope.row.totalPrice).toFixed(2) + ' ' : '-' }}
{{ scope.row.totalPrice ? Number(scope.row.totalPrice).toFixed(2) + ' ' + $t('basic.ordersCombo.yuan') : '-' }}
</span>
</template>
</vxe-column>
<vxe-column
title="药房/科室"
:title="$t('basic.ordersCombo.pharmacyDept')"
align="center"
field=""
width="200"
@@ -632,7 +632,7 @@
</template>
</vxe-column>
<vxe-column
title="频次/用法"
:title="$t('basic.ordersCombo.freqUsage')"
align="center"
field=""
width="180"
@@ -647,7 +647,7 @@
? scope.row.rateCode_dictText +
' ' +
scope.row.dispensePerDuration +
'天' +
$t('basic.ordersCombo.day') +
' ' +
scope.row.methodCode_dictText
: ''
@@ -656,7 +656,7 @@
</template>
</vxe-column>
<vxe-column
title="注射药品"
:title="$t('basic.ordersCombo.injectDrug')"
align="center"
field=""
width="80"
@@ -668,7 +668,7 @@
</template>
</vxe-column>
<vxe-column
title="皮试"
:title="$t('basic.ordersCombo.skinTest')"
align="center"
field=""
width="80"
@@ -687,8 +687,11 @@
import {getOrgTree, saveOrderGroup} from './api';
import adviceBaseList from './adviceBaseList';
import {computed, getCurrentInstance, nextTick, ref, watch} from 'vue';
import {useI18n} from 'vue-i18n';
import {calculateQuantityByDays, formatNumber} from '@/utils/his';
const { t } = useI18n();
const emit = defineEmits(['selectDiagnosis']);
const total = ref(0);
const queryParams = ref({});
@@ -704,13 +707,13 @@ const nextId = ref(1);
const unitCodeList = ref([]);
const adviceTableRef = ref([]);
const organization = ref([]);
const rowRules = ref({
conditionDefinitionId: [{ required: true, message: '请选择诊断', trigger: 'change' }],
dose: [{ required: true, message: '请输入单次剂量', trigger: 'change' }],
doseQuantity: [{ required: true, message: '请输入单次剂量', trigger: 'change' }],
quantity: [{ required: true, message: '请输入数量', trigger: 'change' }],
dispensePerDuration: [{ required: true, message: '请输入用药天数', trigger: 'change' }],
});
const rowRules = computed(() => ({
conditionDefinitionId: [{ required: true, message: t('basic.ordersCombo.selectDiagnosis'), trigger: 'change' }],
dose: [{ required: true, message: t('basic.ordersCombo.enterDose'), trigger: 'change' }],
doseQuantity: [{ required: true, message: t('basic.ordersCombo.enterDose'), trigger: 'change' }],
quantity: [{ required: true, message: t('basic.ordersCombo.enterQuantity'), trigger: 'change' }],
dispensePerDuration: [{ required: true, message: t('basic.ordersCombo.enterDays'), trigger: 'change' }],
}));
const unitMap = ref({
dose: 'dose',
minUnit: 'minUnit',
@@ -750,14 +753,14 @@ const adviceTypeList = computed(() => {
label: item.label,
value: parseInt(item.value) || item.value
}));
return [...list, { label: '全部', value: undefined }];
return [...list, { label: t('basic.ordersCombo.all'), value: undefined }];
}
// 默认值
return [
{ label: '西药中成药', value: 1 },
{ label: '耗材', value: 4 },
{ label: '诊疗', value: 3 },
{ label: '全部', value: undefined },
{ label: t('basic.ordersCombo.westernMedicine'), value: 1 },
{ label: t('basic.consumables.consumable'), value: 4 },
{ label: t('basic.consumables.diagnosis'), value: 3 },
{ label: t('basic.ordersCombo.all'), value: undefined },
];
});
onMounted(() => {
@@ -810,7 +813,7 @@ function getRowDisabled(row) {
// 新增医嘱
function handleAddPrescription() {
if (isAdding.value) {
proxy.$modal.msgWarning('请先保存当前医嘱');
proxy.$modal.msgWarning(t('basic.ordersCombo.saveFirst'));
return;
}
isAdding.value = true;
@@ -917,7 +920,7 @@ function selectAdviceBase(key, row) {
if (row.adviceType != 3) {
if (row.inventoryList && row.inventoryList.length == 0) {
expandOrder.value = [];
proxy.$modal.msgWarning('该项目无库存');
proxy.$modal.msgWarning(t('basic.ordersCombo.noStock'));
return;
}
stockList.value = row.inventoryList.map((item, index) => {
@@ -930,7 +933,7 @@ function selectAdviceBase(key, row) {
})[0];
if (stock != {} && stock != undefined) {
if (stock.quantity <= 0) {
proxy.$modal.msgWarning('该项目库存不足,请选择其它库房');
proxy.$modal.msgWarning(t('basic.ordersCombo.insufficientStock'));
// return;
}
combinationList.value[rowIndex.value].lotNumber = stock.lotNumber;
@@ -977,7 +980,7 @@ function handleDelete() {
};
});
if (deleteList.length == 0) {
proxy.$modal.msgWarning('请选择要删除的处方');
proxy.$modal.msgWarning(t('basic.ordersCombo.selectPrescription'));
return;
}
if (!deleteList[0].requestId) {
@@ -1009,14 +1012,14 @@ function handleNumberClick(item, index) {
*/
function handleSave() {
if (expandOrder.value.length > 0) {
proxy.$modal.msgWarning('请先保存当前医嘱');
proxy.$modal.msgWarning(t('basic.ordersCombo.saveFirst'));
return;
}
let saveList = combinationList.value.filter((item) => {
return item.statusEnum == 1;
});
if (saveList.length == 0) {
proxy.$modal.msgWarning('当前无可签发处方');
proxy.$modal.msgWarning(t('basic.ordersCombo.noPrescription'));
return;
}
if (!validateGroups(saveList)) {
@@ -1048,7 +1051,7 @@ function handleSaveSign(row, index) {
row.minUnitQuantity = row.quantity * row.partPercent;
savePrescription({ adviceSaveList: [row] }).then((res) => {
if (res.code === 200) {
proxy.$modal.msgSuccess('保存成功');
proxy.$modal.msgSuccess(t('basic.ordersCombo.saveSuccess'));
// getListInfo(true);
nextId.value == 1;
}
@@ -1065,7 +1068,7 @@ function saveCombination() {
params.groupJson = JSON.stringify(combinationList.value);
saveOrderGroup(params).then((res) => {
if (res.code === 200) {
proxy.$modal.msgSuccess('保存成功');
proxy.$modal.msgSuccess(t('basic.ordersCombo.saveSuccess'));
}
});
}
@@ -1115,7 +1118,7 @@ function combination() {
uniqueValues.add(combinationList.value[index].methodCode);
});
if (uniqueValues.size != 1) {
proxy.$modal.msgWarning('同一分组药品用法必须相同');
proxy.$modal.msgWarning(t('basic.ordersCombo.sameGroupUsage'));
return;
}
let timeStamp = new Date().now().toString();
@@ -1355,10 +1358,10 @@ function validateGroups(saveList) {
.map((group) => group.groupId);
if (countStr.length > 0) {
proxy.$modal.msgWarning('分组"' + countStr + '"数量超出限制');
proxy.$modal.msgWarning(t('basic.ordersCombo.groupCountExceeded', { group: countStr }));
return false;
} else if (totalStr.length > 0) {
proxy.$modal.msgWarning('分组"' + totalStr + '"金额总和超出限制');
proxy.$modal.msgWarning(t('basic.ordersCombo.groupAmountExceeded', { group: totalStr }));
return false;
}
return true;

View File

@@ -15,32 +15,32 @@
@cell-click="clickRow"
>
<vxe-column
title="名称"
:title="$t('basic.tcmOrderSet.name')"
align="center"
field="adviceName"
/>
<vxe-column
title="类型"
:title="$t('basic.tcmOrderSet.type')"
align="center"
field="categoryCodeText"
/>
<vxe-column
title="医保等级"
:title="$t('basic.tcmOrderSet.insuranceLevel')"
align="center"
field="chrgitmLv_dictText"
/>
<vxe-column
title="包装单位"
:title="$t('basic.tcmOrderSet.packUnit')"
align="center"
field="unitCode_dictText"
/>
<vxe-column
title="最小单位"
:title="$t('basic.tcmOrderSet.minUnit')"
align="center"
field="minUnitCode_dictText"
/>
<vxe-column
title="库存数量"
:title="$t('basic.tcmOrderSet.stockQuantity')"
align="center"
>
<template #default="scope">
@@ -63,9 +63,12 @@
<script setup>
import { ref, watch, nextTick } from 'vue';
import { useI18n } from 'vue-i18n';
import { getTcmMedicine } from './api';
import { debounce } from 'lodash-es';
const { t } = useI18n();
const props = defineProps({
searchKey: {
type: String,

View File

@@ -14,7 +14,7 @@
class="tree-card panel-shadow"
>
<template #header>
<span>中医组套</span>
<span>{{ $t('basic.tcmOrderSet.tcmSet') }}</span>
</template>
<el-tree
:data="treeData"
@@ -43,19 +43,19 @@
plain
@click="clearForm"
>
清空
{{ $t('basic.tcmOrderSet.clear') }}
</el-button>
<el-button
type="primary"
@click="createNew"
>
新建
{{ $t('basic.tcmOrderSet.create') }}
</el-button>
<el-button
type="primary"
@click="saveCommonForm"
>
保存
{{ $t('common.save') }}
</el-button>
</div>
<div class="common-bar">
@@ -64,41 +64,41 @@
:inline="true"
class="demo-form-inline"
>
<el-form-item label="组套名称">
<el-form-item :label="$t('basic.tcmOrderSet.setName')">
<el-input
v-model="commonForm.name"
placeholder="组套名称"
:placeholder="$t('basic.tcmOrderSet.setNamePlaceholder')"
clearable
/>
</el-form-item>
<el-form-item label="使用范围">
<el-form-item :label="$t('basic.tcmOrderSet.useRange')">
<el-select
v-model="commonForm.useRange"
placeholder="个人/科室/全院"
:placeholder="$t('basic.tcmOrderSet.rangePlaceholder')"
clearable
@change="handleRangeChange"
>
<el-option
label="个人"
:label="$t('basic.tcmOrderSet.personal')"
value="personal"
/>
<el-option
label="科室"
:label="$t('basic.tcmOrderSet.department')"
value="department"
/>
<el-option
label="全院"
:label="$t('basic.tcmOrderSet.hospital')"
value="hospital"
/>
</el-select>
</el-form-item>
<el-form-item
v-if="commonForm.useRange === 'personal'"
label="使用人"
:label="$t('basic.tcmOrderSet.user')"
>
<el-select
v-model="commonForm.practitionerId"
placeholder="请选择使用人"
:placeholder="$t('basic.tcmOrderSet.selectUser')"
clearable
style="width: 200px"
>
@@ -112,7 +112,7 @@
</el-form-item>
<el-form-item
v-if="commonForm.useRange === 'department'"
label="科室"
:label="$t('basic.tcmOrderSet.department')"
>
<el-tree-select
v-model="commonForm.organizationId"
@@ -122,15 +122,15 @@
value-key="id"
check-strictly
default-expand-all
placeholder="请选择科室"
:placeholder="$t('basic.tcmOrderSet.selectDept')"
style="width: 200px"
:render-after-expand="false"
/>
</el-form-item>
<el-form-item label="用法">
<el-form-item :label="$t('basic.tcmOrderSet.usage')">
<el-select
v-model="commonForm.method"
placeholder="用法"
:placeholder="$t('basic.tcmOrderSet.usage')"
clearable
>
<el-option
@@ -141,10 +141,10 @@
/>
</el-select>
</el-form-item>
<el-form-item label="频次">
<el-form-item :label="$t('basic.tcmOrderSet.frequency')">
<el-select
v-model="commonForm.frequency"
placeholder="频次"
:placeholder="$t('basic.tcmOrderSet.frequency')"
clearable
>
<el-option
@@ -193,7 +193,7 @@
type="primary"
text
:icon="Edit"
title="编辑"
:title="$t('common.edit')"
@click.stop="editDrug(item)"
/>
<el-button
@@ -201,7 +201,7 @@
type="danger"
text
:icon="Delete"
title="删除"
:title="$t('common.delete')"
@click.stop="removeDrug(index)"
/>
</div>
@@ -232,7 +232,7 @@
<template #reference>
<el-input
v-model="item.drugName"
placeholder="请选择中药"
:placeholder="$t('basic.tcmOrderSet.selectTcmDrug')"
clearable
@input="(val) => handleSearchKeyChange(val, item)"
@click="() => handleClick(item)"
@@ -262,14 +262,14 @@
link
@click.stop="saveDrug(item)"
>
保存
{{ $t('common.save') }}
</el-button>
<el-button
type="danger"
link
@click.stop="removeDrug(index)"
>
删除
{{ $t('common.delete') }}
</el-button>
</div>
</div>
@@ -286,7 +286,7 @@
<el-icon class="add-icon">
<Plus />
</el-icon>
<span>新增</span>
<span>{{ $t('common.add') }}</span>
</div>
</el-card>
</div>
@@ -298,6 +298,7 @@
<script setup name="TcmMedicalOrderSet">
import { ref, reactive, onMounted, getCurrentInstance } from 'vue';
import { useI18n } from 'vue-i18n';
import { ElMessage } from 'element-plus';
import {
getPersonalList,
@@ -313,6 +314,8 @@ import {
import TcmMedicineList from './components/tcmMedicineList.vue';
import { Edit, Delete, Plus } from '@element-plus/icons-vue';
const { t } = useI18n();
const { proxy } = getCurrentInstance();
// 字典数据
@@ -342,7 +345,7 @@ function loadTreeData() {
treeData.value = [
{
id: 'personal',
label: '个人',
label: t('basic.tcmOrderSet.personal'),
children: personalList.map((item) => ({
id: item.groupPackageId,
value: item.groupPackageId,
@@ -353,7 +356,7 @@ function loadTreeData() {
},
{
id: 'department',
label: '科室',
label: t('basic.tcmOrderSet.department'),
children: deptList.map((item) => ({
id: item.groupPackageId,
value: item.groupPackageId,
@@ -364,7 +367,7 @@ function loadTreeData() {
},
{
id: 'hospital',
label: '全院',
label: t('basic.tcmOrderSet.hospital'),
children: allList.map((item) => ({
id: item.groupPackageId,
value: item.groupPackageId,
@@ -376,7 +379,7 @@ function loadTreeData() {
];
})
.catch(() => {
ElMessage.error('加载组套树失败');
ElMessage.error(t('basic.tcmOrderSet.loadTreeFailed'));
});
}
@@ -499,7 +502,7 @@ function handleTreeNodeClick(data, node) {
currentSetName.value = data.label;
})
.catch(() => {
ElMessage.error('加载组套详情失败');
ElMessage.error(t('basic.tcmOrderSet.loadDetailFailed'));
});
}
@@ -510,7 +513,7 @@ function addDrug() {
const last = drugList.value[drugList.value.length - 1];
// 如果上一个药品未选择药品,不允许添加下一个
if (!last.orderDefinitionId) {
ElMessage.warning('请先选择上一个药品');
ElMessage.warning(t('basic.tcmOrderSet.selectPrevDrug'));
return;
}
// 如果上一个药品已有药品ID且处于编辑状态自动保存
@@ -527,15 +530,15 @@ function addDrug() {
// 删除药品
function removeDrug(index) {
if (drugList.value.length <= 1) {
ElMessage.warning('至少保留一条药品信息');
ElMessage.warning(t('basic.tcmOrderSet.keepOneDrug'));
return;
}
drugList.value.splice(index, 1);
}
function validateDrug(item) {
if (!item.orderDefinitionId) return '请选择中药';
if (!item.quantity || Number(item.quantity) <= 0) return '请填写数量';
if (!item.orderDefinitionId) return t('basic.tcmOrderSet.selectTcmDrug');
if (!item.quantity || Number(item.quantity) <= 0) return t('basic.tcmOrderSet.enterQuantity');
return '';
}
@@ -614,38 +617,38 @@ function createNew() {
function saveCommonForm() {
// 校验组套名称
if (!commonForm.name) {
ElMessage.warning('请填写组套名称');
ElMessage.warning(t('basic.tcmOrderSet.enterSetName'));
return;
}
// 校验使用范围
if (!commonForm.useRange) {
ElMessage.warning('请选择使用范围');
ElMessage.warning(t('basic.tcmOrderSet.selectUseRange'));
return;
}
// 校验个人时选择使用人
if (commonForm.useRange === 'personal' && !commonForm.practitionerId) {
ElMessage.warning('请选择使用人');
ElMessage.warning(t('basic.tcmOrderSet.selectUser'));
return;
}
// 校验科室时选择科室
if (commonForm.useRange === 'department' && !commonForm.organizationId) {
ElMessage.warning('请选择科室');
ElMessage.warning(t('basic.tcmOrderSet.selectDept'));
return;
}
// 校验药品列表
if (drugList.value.length === 0) {
ElMessage.warning('请添加药品');
ElMessage.warning(t('basic.tcmOrderSet.addDrug'));
return;
}
// 校验每个药品
for (let i = 0; i < drugList.value.length; i++) {
const item = drugList.value[i];
if (!item.orderDefinitionId) {
ElMessage.warning(`请选择第${i + 1}个药品`);
ElMessage.warning(t('basic.tcmOrderSet.selectDrugN', { n: i + 1 }));
return;
}
if (!item.quantity || Number(item.quantity) <= 0) {
ElMessage.warning(`请填写第${i + 1}个药品的数量`);
ElMessage.warning(t('basic.tcmOrderSet.enterDrugQuantity', { n: i + 1 }));
return;
}
}
@@ -694,11 +697,11 @@ function saveCommonForm() {
saveApi(data)
.then(() => {
ElMessage.success('保存成功');
ElMessage.success(t('basic.tcmOrderSet.saveSuccess'));
loadTreeData();
})
.catch((err) => {
ElMessage.error('保存失败' + (err.message || '未知错误'));
ElMessage.error(t('basic.tcmOrderSet.saveFailed') + '' + (err.message || '未知错误'));
});
}
</script>

View File

@@ -3,13 +3,13 @@
<el-card shadow="never">
<template #header>
<div class="card-header">
<span class="card-title">中医处方</span>
<span class="card-title">{{ $t('basic.tcmPrescription.tcmPrescription') }}</span>
<el-button
type="primary"
icon="Plus"
@click="handleAdd"
>
新增处方
{{ $t('basic.tcmPrescription.addPrescription') }}
</el-button>
</div>
</template>
@@ -18,10 +18,10 @@
:model="queryParams"
label-width="80px"
>
<el-form-item label="关键字">
<el-form-item :label="$t('basic.tcmPrescription.keyword')">
<el-input
v-model="queryParams.searchKey"
placeholder="处方名称/编码"
:placeholder="$t('basic.tcmPrescription.searchPlaceholder')"
clearable
style="width: 200px"
@keyup.enter="handleQuery"
@@ -33,13 +33,13 @@
icon="Search"
@click="handleQuery"
>
搜索
{{ $t('common.search') }}
</el-button>
<el-button
icon="Refresh"
@click="resetQuery"
>
重置
{{ $t('common.reset') }}
</el-button>
</el-form-item>
</el-form>
@@ -51,28 +51,28 @@
>
<vxe-column
type="seq"
title="序号"
:title="$t('basic.tcmPrescription.seq')"
width="60"
/>
<vxe-column
field="conditionCode"
title="编码"
:title="$t('basic.tcmPrescription.code')"
width="120"
/>
<vxe-column
field="name"
title="处方名称"
:title="$t('basic.tcmPrescription.prescriptionName')"
min-width="200"
show-overflow="title"
/>
<vxe-column
field="typeCode"
title="类型"
:title="$t('basic.tcmPrescription.type')"
width="100"
/>
<vxe-column
field="status"
title="状态"
:title="$t('common.status')"
width="80"
align="center"
>
@@ -81,12 +81,12 @@
:type="row.status === '0' ? 'success' : 'info'"
size="small"
>
{{ row.status === '0' ? '启用' : '停用' }}
{{ row.status === '0' ? $t('common.enabled') : $t('common.disabled') }}
</el-tag>
</template>
</vxe-column>
<vxe-column
title="操作"
:title="$t('common.operation')"
width="120"
fixed="right"
>
@@ -97,7 +97,7 @@
icon="Edit"
@click="handleEdit(row)"
>
编辑
{{ $t('common.edit') }}
</el-button>
</template>
</vxe-column>
@@ -123,59 +123,61 @@
label-width="100px"
>
<el-form-item
label="处方编码"
:label="$t('basic.tcmPrescription.prescriptionCode')"
prop="conditionCode"
>
<el-input
v-model="form.conditionCode"
placeholder="处方编码"
:placeholder="$t('basic.tcmPrescription.codePlaceholder')"
/>
</el-form-item>
<el-form-item
label="处方名称"
:label="$t('basic.tcmPrescription.prescriptionName')"
prop="name"
>
<el-input
v-model="form.name"
placeholder="处方名称"
:placeholder="$t('basic.tcmPrescription.namePlaceholder')"
/>
</el-form-item>
<el-form-item label="证型">
<el-form-item :label="$t('basic.tcmPrescription.pattern')">
<el-input
v-model="form.typeCode"
placeholder="中医证型"
:placeholder="$t('basic.tcmPrescription.patternPlaceholder')"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="formVisible = false">
取消
{{ $t('common.cancel') }}
</el-button>
<el-button
type="primary"
@click="submitForm"
>
确定
{{ $t('common.confirm') }}
</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { ref, computed, onMounted } from 'vue'
import { useI18n } from 'vue-i18n'
import { ElMessage } from 'element-plus'
import { getTcmPage, addTcm, updateTcm } from './components/api'
const { t } = useI18n()
const loading = ref(false); const tableData = ref([]); const total = ref(0)
const queryParams = ref({ searchKey: '', pageNo: 1, pageSize: 10 })
const formVisible = ref(false); const formTitle = ref('新增处方'); const isEdit = ref(false); const formRef = ref()
const form = ref({ id: null, conditionCode: '', name: '', typeCode: '' })
const rules = { conditionCode: [{ required: true, message: '请输入编码', trigger: 'blur' }], name: [{ required: true, message: '请输入名称', trigger: 'blur' }] }
const rules = computed(() => ({ conditionCode: [{ required: true, message: t('basic.tcmPrescription.codePlaceholder'), trigger: 'blur' }], name: [{ required: true, message: t('basic.tcmPrescription.namePlaceholder'), trigger: 'blur' }] }))
function getList() { loading.value = true; getTcmPage(queryParams.value).then(res => { tableData.value = res.data?.records || []; total.value = res.data?.total || 0 }).finally(() => { loading.value = false }) }
function handleQuery() { queryParams.value.pageNo = 1; getList() }
function resetQuery() { queryParams.value = { searchKey: '', pageNo: 1, pageSize: 10 }; getList() }
function handleAdd() { isEdit.value = false; formTitle.value = '新增处方'; form.value = { id: null, conditionCode: '', name: '', typeCode: '' }; formVisible.value = true }
function handleEdit(row) { isEdit.value = true; formTitle.value = '编辑处方'; form.value = { ...row }; formVisible.value = true }
function submitForm() { formRef.value.validate(valid => { if (!valid) return; const action = isEdit.value ? updateTcm(form.value) : addTcm(form.value); action.then(res => { if (res.code === 200) { ElMessage.success(isEdit.value ? '修改成功' : '新增成功'); formVisible.value = false; getList() } else ElMessage.error(res.msg || '操作失败') }) }) }
function handleAdd() { isEdit.value = false; formTitle.value = t('basic.tcmPrescription.addPrescription'); form.value = { id: null, conditionCode: '', name: '', typeCode: '' }; formVisible.value = true }
function handleEdit(row) { isEdit.value = true; formTitle.value = t('basic.tcmPrescription.editPrescription'); form.value = { ...row }; formVisible.value = true }
function submitForm() { formRef.value.validate(valid => { if (!valid) return; const action = isEdit.value ? updateTcm(form.value) : addTcm(form.value); action.then(res => { if (res.code === 200) { ElMessage.success(isEdit.value ? t('basic.tcmPrescription.editSuccess') : t('basic.tcmPrescription.addSuccess')); formVisible.value = false; getList() } else ElMessage.error(res.msg || t('basic.tcmPrescription.operationFailed')) }) }) }
onMounted(() => getList())
</script>
<style lang="scss" scoped>

View File

@@ -464,13 +464,13 @@
}"
value-key="id"
check-strictly
placeholder="请选择上级科室/病区/床位"
:placeholder="$t('basic.ward.selectParent')"
/>
</template>
<template v-else>
<el-select
v-model="form.busNoParent"
placeholder="请选择上级科室/病区/床位"
:placeholder="$t('basic.ward.selectParent')"
clearable
filterable
style="width: 100%"
@@ -492,10 +492,10 @@
type="primary"
@click="submitForm"
>
确 定
{{ $t('common.confirm') }}
</el-button>
<el-button @click="cancel">
取 消
{{ $t('common.cancel') }}
</el-button>
</div>
</template>
@@ -541,7 +541,7 @@ const querybedParams = ref({
// locationFormList: [4],
});
// 病区、病房、病床类型
const type = ref('病区');
const type = ref('basic.ward.wardArea');
// 病区列表
const wardList = ref([]);
// 床位列表
@@ -570,21 +570,21 @@ const form = reactive({
name: '',
busNo: '',
});
const upLabel = ref('关联科室');
const title = ref('新增');
const rules = ref({
const upLabel = ref('basic.ward.linkedDept');
const title = ref('common.add');
const rules = computed(() => ({
name: [
{ required: true, message: '请输入名称', trigger: 'blur' },
{ required: true, min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' },
{ required: true, message: t('basic.ward.inputName'), trigger: 'blur' },
{ required: true, min: 2, max: 20, message: t('basic.ward.nameLength'), trigger: 'blur' },
],
busNoParent: [
{
required: true,
message: '请选择上级' + type.value,
message: t('basic.ward.selectParentType', { type: t(type.value) }),
trigger: 'blur',
},
],
});
}));
// 递归过滤树形数据只保留classEnum包含住院(2)的科室
function filterOrgByClassEnum(orgList, targetClassEnum = '2') {
if (!orgList || !Array.isArray(orgList)) return [];
@@ -687,17 +687,17 @@ const getHomeOrBed = (formEnum) => {
function handleRadioChange(val) {
let formEnum = 4;
if (val == 4) {
type.value = '病区';
upLabel.value = '关联科室';
type.value = 'basic.ward.wardArea';
upLabel.value = 'basic.ward.linkedDept';
return;
} else if (val == 10) {
type.value = '病房';
upLabel.value = '所属病区';
type.value = 'basic.ward.room';
upLabel.value = 'basic.ward.parentWard';
formEnum = 4;
// queryParams.value.formEnum = 4;
} else {
type.value = '床位';
upLabel.value = '所属病房';
type.value = 'basic.ward.bed';
upLabel.value = 'basic.ward.parentRoom';
formEnum = 10;
// queryParams.value.formEnum = 10;
}
@@ -752,7 +752,7 @@ function checkSelectable(row, index) {
function handleEnable(row) {
return enableLocation([row.id]).then((res) => {
if (res.code == 200) {
proxy.$modal.msgSuccess('启用成功');
proxy.$modal.msgSuccess(t('basic.ward.enableSuccess'));
}
});
}
@@ -760,7 +760,7 @@ function handleEnable(row) {
function handleUnable(row) {
return unableLocation([row.id]).then((res) => {
if (res.code == 200) {
proxy.$modal.msgSuccess('停用成功');
proxy.$modal.msgSuccess(t('basic.ward.disableSuccess'));
}
});
}
@@ -770,7 +770,7 @@ function handleEnableBatch(tableRef) {
return item.id;
});
if (list.length == 0) {
proxy.$modal.msgError('请选择要启用的数据');
proxy.$modal.msgError(t('basic.ward.selectEnableData'));
return;
}
enableLocation(list).then((res) => {
@@ -785,7 +785,7 @@ function handleUnableBatch(tableRef) {
return item.id;
});
if (list.length == 0) {
proxy.$modal.msgError('请选择要停用的数据');
proxy.$modal.msgError(t('basic.ward.selectDisableData'));
return;
}
unableLocation(list).then((res) => {
@@ -829,7 +829,7 @@ function submitForm() {
if (!(params.organizationId && params.organizationId.length > 0)) {
ElMessage({
type: 'error',
message: '请选择关联科室!',
message: t('basic.ward.selectLinkedDept'),
});
return;
}
@@ -837,7 +837,7 @@ function submitForm() {
if (!(params.busNo && params.busNo.length > 0)) {
ElMessage({
type: 'error',
message: '请选择所属病区!',
message: t('basic.ward.selectParentWard'),
});
return;
}

View File

@@ -22,7 +22,7 @@
style="margin-left: 5px; margin-top: -10px; margin-bottom: 20px"
@click="handleImportYb()"
>
从医保目录导入
{{ $t('catalog.device.importFromYb') }}
</el-button>
</div>
<el-row :gutter="24">
@@ -31,32 +31,32 @@
:span="8"
>
<el-form-item
label="编号"
:label="$t('catalog.device.code')"
prop="busNo"
>
<el-input
v-model="form.busNo"
clearable
placeholder="请输入编码"
:placeholder="$t('catalog.device.enterCode')"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
label="器材名称"
:label="$t('catalog.device.deviceName')"
prop="name"
>
<el-input
v-model="form.name"
clearable
placeholder="请输入器材名称"
:placeholder="$t('catalog.device.enterDeviceName')"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
label="器材分类"
:label="$t('catalog.device.category')"
prop="categoryCode"
>
<el-tree-select
@@ -75,7 +75,7 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="器材种类"
:label="$t('catalog.device.deviceType')"
prop="typeCode"
>
<el-select
@@ -94,7 +94,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="提供部门"
:label="$t('catalog.device.provideDept')"
prop="orgId"
>
<el-tree-select
@@ -102,7 +102,7 @@
:data="deptOptions"
:props="{ value: 'id', label: 'name', children: 'children' }"
value-key="id"
placeholder="请选择提供部门"
:placeholder="$t('catalog.device.selectDept')"
check-strictly
clearable
filterable
@@ -111,7 +111,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="地点"
:label="$t('catalog.device.location')"
prop="locationId"
>
<el-tree-select
@@ -119,7 +119,7 @@
:data="locationOptions"
:props="{ value: 'id', label: 'name', children: 'children' }"
value-key="id"
placeholder="请选择地点"
:placeholder="$t('catalog.device.selectLocation')"
check-strictly
clearable
filterable
@@ -130,7 +130,7 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="包装单位"
:label="$t('catalog.device.packUnit')"
prop="unitCode"
>
<el-select
@@ -151,7 +151,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="销售单位"
:label="$t('catalog.device.salesUnit')"
prop="salesUnitCode"
>
<el-select
@@ -170,7 +170,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="最小单位"
:label="$t('catalog.device.minUnit')"
prop="minUnitCode"
>
<el-select
@@ -192,7 +192,7 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="包装规格"
:label="$t('catalog.device.packSpec')"
prop="size"
>
<el-input
@@ -204,7 +204,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="拆零比"
:label="$t('catalog.device.partPercent')"
prop="partPercent"
>
<el-input-number
@@ -217,7 +217,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="产品型号"
:label="$t('catalog.device.modelNumber')"
prop="modelNumber"
>
<el-input
@@ -230,7 +230,7 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="批准文号"
:label="$t('catalog.device.approvalNumber')"
prop="approvalNumber"
>
<el-input
@@ -241,7 +241,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="医保编码"
:label="$t('catalog.device.ybCode')"
prop="ybNo"
>
<el-input
@@ -252,7 +252,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="医药机构目录编码"
:label="$t('catalog.device.ybOrgCode')"
prop="ybOrgNo"
label-width="125px"
>
@@ -264,7 +264,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="主要成分"
:label="$t('catalog.device.substance')"
prop="substanceText"
>
<el-input
@@ -275,7 +275,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="警戒线最低值(常规单位)"
:label="$t('catalog.device.alertMin')"
prop="itemMinQuantity"
label-width="180px"
>
@@ -288,7 +288,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="警戒线最高值(常规单位)"
:label="$t('catalog.device.alertMax')"
prop="itemMaxQuantity"
label-width="180px"
>
@@ -303,7 +303,7 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="生产厂家"
:label="$t('catalog.device.manufacturer')"
prop="manufacturerText"
>
<el-input
@@ -314,7 +314,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="供应商"
:label="$t('catalog.device.supplier')"
prop="supplyId"
>
<el-select
@@ -334,7 +334,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="过敏标记"
:label="$t('catalog.device.allergenFlag')"
prop="allergenFlag"
>
<el-checkbox v-model="form.allergenFlag" />
@@ -344,7 +344,7 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="医保标记"
:label="$t('catalog.device.ybFlag')"
prop="ybFlag"
>
<el-checkbox v-model="form.ybFlag" />
@@ -352,7 +352,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="医保对码标记"
:label="$t('catalog.device.ybMatchFlag')"
prop="ybMatchFlag"
>
<el-checkbox v-model="form.ybMatchFlag" />
@@ -360,7 +360,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="高值器材标志"
:label="$t('catalog.device.hvcmFlag')"
prop="hvcmFlag"
>
<el-checkbox v-model="form.hvcmFlag" />
@@ -370,7 +370,7 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="财务类型"
:label="$t('catalog.device.financeType')"
prop="itemTypeCode"
>
<el-select
@@ -390,12 +390,12 @@
</el-col>
<el-col :span="8">
<el-form-item
label="医保类别"
:label="$t('catalog.device.ybCategory')"
prop="ybType"
>
<el-select
v-model="form.ybType"
placeholder="医保类别"
:placeholder="$t('catalog.device.ybCategory')"
clearable
filterable
style="width: 240px"
@@ -412,7 +412,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="适用范围"
:label="$t('catalog.device.jurisdiction')"
prop="jurisdiction"
>
<el-input
@@ -425,7 +425,7 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="购入价"
:label="$t('catalog.device.purchasePrice')"
prop="purchasePrice"
>
<el-input
@@ -437,7 +437,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="零售价"
:label="$t('catalog.device.retailPrice')"
prop="retailPrice"
>
<el-input
@@ -449,7 +449,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="最高零售价"
:label="$t('catalog.device.maxRetailPrice')"
prop="maximumRetailPrice"
>
<el-input
@@ -463,12 +463,12 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="医保等级"
:label="$t('catalog.device.ybLevel')"
prop="chrgitmLv"
>
<el-select
v-model="form.chrgitmLv"
placeholder="医保等级"
:placeholder="$t('catalog.device.ybLevel')"
clearable
filterable
style="width: 240px"
@@ -487,7 +487,7 @@
<el-row :gutter="24">
<el-col :span="16">
<el-form-item
label="说明"
:label="$t('catalog.device.description')"
prop="description"
>
<el-input
@@ -501,7 +501,7 @@
</el-row>
</el-form>
<template
v-if="title != '查看'"
v-if="title != $t('common.view')"
#footer
>
<div class="dialog-footer">
@@ -509,10 +509,10 @@
type="primary"
@click="submitForm"
>
{{ $t('common.confirm') }}
</el-button>
<el-button @click="cancel">
{{ $t('common.cancel') }}
</el-button>
</div>
</template>
@@ -523,8 +523,11 @@
<script setup name="MedicineDialog">
import {addDevice, deptTreeSelect, editDevice, locationTreeSelect} from './device';
import {getDicts} from '@/api/system/dict/data';
import { useI18n } from 'vue-i18n';
import { computed } from 'vue';
const { proxy } = getCurrentInstance();
const { t } = useI18n();
const { device_type_code, unit_code, fin_type_code, chrgitm_lv, med_chrgitm_type } = proxy.useDict(
'device_type_code',
'unit_code',
@@ -540,30 +543,31 @@ const locationOptions = ref(undefined); // 地点树选项
const unitCodeOptions = ref([]); // 包装单位选项列表(用于搜索)
const unitCodeLoading = ref(false); // 包装单位搜索加载状态
const rules = computed(() => ({
name: [{ required: true, message: t('catalog.device.nameRequired'), trigger: 'blur' }],
categoryCode: [{ required: true, message: t('catalog.device.categoryRequired'), trigger: 'blur' }],
unitCode: [{ required: true, message: t('catalog.device.unitRequired'), trigger: 'blur' }],
size: [{ required: true, message: t('catalog.device.sizeRequired'), trigger: 'blur' }],
partPercent: [{ required: true, message: t('catalog.device.partPercentRequired'), trigger: 'blur' }],
minUnitCode: [{ required: true, message: t('catalog.device.minUnitRequired'), trigger: 'blur' }],
itemMinQuantity: [{ required: true, message: t('catalog.device.alertMinRequired'), trigger: 'blur' }],
itemMaxQuantity: [{ required: true, message: t('catalog.device.alertMaxRequired'), trigger: 'blur' }],
salesUnitCode: [{ required: true, message: t('catalog.device.salesUnitRequired'), trigger: 'blur' }],
manufacturerId: [{ required: true, message: t('catalog.device.manufacturerRequired'), trigger: 'blur' }],
ruleId: [{ required: true, message: t('catalog.device.deptRequired'), trigger: 'blur' }],
locationId: [{ required: true, message: t('catalog.device.locationRequired'), trigger: 'blur' }],
purchasePrice: [{ required: true, message: t('catalog.device.purchasePriceRequired'), trigger: 'blur' }],
retailPrice: [{ required: true, message: t('catalog.device.retailPriceRequired'), trigger: 'blur' }],
ybType: [{ required: true, message: t('catalog.device.ybTypeRequired'), trigger: 'blur' }],
chrgitmLv: [{ required: true, message: t('catalog.device.ybLevelRequired'), trigger: 'blur' }],
itemTypeCode: [{ required: true, message: t('catalog.device.financeTypeRequired'), trigger: 'blur' }],
}));
const data = reactive({
form: {},
rules: {
name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
categoryCode: [{ required: true, message: '器材分类不能为空', trigger: 'blur' }],
unitCode: [{ required: true, message: '包装单位不能为空', trigger: 'blur' }],
size: [{ required: true, message: '包装规格不能为空', trigger: 'blur' }],
partPercent: [{ required: true, message: '拆零比不能为空', trigger: 'blur' }],
minUnitCode: [{ required: true, message: '最小使用单位不能为空', trigger: 'blur' }],
itemMinQuantity: [{ required: true, message: '警戒线最低值不能为空', trigger: 'blur' }],
itemMaxQuantity: [{ required: true, message: '警戒线最高值不能为空', trigger: 'blur' }],
salesUnitCode: [{ required: true, message: '销售单位不能为空', trigger: 'blur' }],
manufacturerId: [{ required: true, message: '生产厂家不能为空', trigger: 'blur' }],
ruleId: [{ required: true, message: '执行科室不能为空', trigger: 'blur' }],
locationId: [{ required: true, message: '地点不能为空', trigger: 'blur' }],
purchasePrice: [{ required: true, message: '购入价不能为空', trigger: 'blur' }],
retailPrice: [{ required: true, message: '零售价不能为空', trigger: 'blur' }],
ybType: [{ required: true, message: '医保类型不能为空', trigger: 'blur' }],
chrgitmLv: [{ required: true, message: '医保等级不能为空', trigger: 'blur' }],
itemTypeCode: [{ required: true, message: '财务类型不能为空', trigger: 'blur' }],
},
});
const { form, rules } = toRefs(data);
const { form } = toRefs(data);
const props = defineProps({
item: {
@@ -699,7 +703,7 @@ function submitForm() {
editDevice(form.value).then((response) => {
// 触发自定义事件,并传递数据给父组件
emits('submit');
proxy.$modal.msgSuccess('修改成功');
proxy.$modal.msgSuccess(t('common.message'));
visible.value = false;
reset(); // 重置表单数据
});
@@ -707,7 +711,7 @@ function submitForm() {
addDevice(form.value).then((response) => {
// 触发自定义事件,并传递数据给父组件
emits('submit');
proxy.$modal.msgSuccess('新增成功');
proxy.$modal.msgSuccess(t('catalog.device.addSuccess'));
visible.value = false;
reset(); // 重置表单数据
});

View File

@@ -7,7 +7,7 @@
:xs="24"
>
<div class="head-title">
器材目录
{{ $t('catalog.device.title') }}
</div>
<div class="head-container">
<el-tree
@@ -37,20 +37,20 @@
>
<el-row :gutter="24">
<el-form-item
label="项目名"
:label="$t('catalog.device.itemName')"
prop="searchKey"
label-width="55"
>
<el-input
v-model="queryParams.searchKey"
placeholder="品名/商品名/英文品名/编码/拼音"
:placeholder="$t('catalog.device.searchPlaceholder')"
clearable
style="width: 220px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item
label="状态"
:label="$t('common.status')"
prop="statusEnum"
label-width="50"
>
@@ -67,7 +67,7 @@
</el-select>
</el-form-item>
<el-form-item
label="医保是否对码"
:label="$t('catalog.device.ybMatch')"
prop="ybMatchFlag"
label-width="100"
>
@@ -98,7 +98,7 @@
icon="Plus"
@click="openAddDevice"
>
添加新项目
{{ $t('catalog.device.addNew') }}
</el-button>
</el-col>
<el-col :span="1.5">
@@ -109,7 +109,7 @@
:disabled="multiple"
@click="handleClose"
>
停用
{{ $t('common.disabled') }}
</el-button>
</el-col>
<el-col :span="1.5">
@@ -120,7 +120,7 @@
:disabled="multiple"
@click="handleStart"
>
启用
{{ $t('common.enabled') }}
</el-button>
</el-col>
<el-col :span="1.5">
@@ -130,7 +130,7 @@
icon="Upload"
@click="handleImport"
>
导入
{{ $t('common.import') }}
</el-button>
</el-col>
<el-col :span="1.5">
@@ -140,7 +140,7 @@
icon="Search"
@click="getList"
>
查询
{{ $t('common.search') }}
</el-button>
</el-col>
<!-- <el-col :span="1.5">
@@ -167,7 +167,7 @@
/>
<vxe-column
key="busNo"
title="编码"
:title="$t('catalog.device.code')"
align="center"
field="busNo"
show-overflow="title"
@@ -175,7 +175,7 @@
/>
<vxe-column
key="name"
title="器材名称"
:title="$t('catalog.device.deviceName')"
align="center"
field="name"
show-overflow="title"
@@ -183,7 +183,7 @@
/>
<vxe-column
key="size"
title="包装规格"
:title="$t('catalog.device.packSpec')"
align="center"
field="size"
width="100"
@@ -198,7 +198,7 @@
/> -->
<vxe-column
key="categoryCode_dictText"
title="器材分类"
:title="$t('catalog.device.category')"
align="center"
field="categoryCode_dictText"
show-overflow="title"
@@ -214,7 +214,7 @@
/> -->
<vxe-column
key="unitCode_dictText"
title="包装单位"
:title="$t('catalog.device.packUnit')"
align="center"
field="unitCode_dictText"
show-overflow="title"
@@ -222,7 +222,7 @@
/>
<vxe-column
key="partPercent"
title="拆零比"
:title="$t('catalog.device.partPercent')"
align="center"
field="partPercent"
show-overflow="title"
@@ -238,7 +238,7 @@
<vxe-column
key="minUnitCode_dictText"
title="最小使用单位"
:title="$t('catalog.device.minUnit')"
align="center"
field="minUnitCode_dictText"
show-overflow="title"
@@ -268,7 +268,7 @@
<vxe-column
key="salesUnitCode_dictText"
title="销售单位"
:title="$t('catalog.device.salesUnit')"
align="center"
field="salesUnitCode_dictText"
show-overflow="title"
@@ -291,7 +291,7 @@
/> -->
<vxe-column
key="ybNo"
title="医保编码"
:title="$t('catalog.device.ybCode')"
align="center"
field="ybNo"
show-overflow="title"
@@ -299,7 +299,7 @@
/>
<vxe-column
key="ybOrgNo"
title="医药机构目录编码"
:title="$t('catalog.device.ybOrgCode')"
align="center"
field="ybOrgNo"
show-overflow="title"
@@ -315,7 +315,7 @@
/> -->
<vxe-column
key="statusEnum_enumText"
title="状态"
:title="$t('common.status')"
align="center"
field="statusEnum_enumText"
show-overflow="title"
@@ -331,7 +331,7 @@
/> -->
<vxe-column
key="manufacturerText"
title="生产厂家"
:title="$t('catalog.device.manufacturer')"
align="center"
field="manufacturerText"
show-overflow="title"
@@ -385,7 +385,7 @@
/> -->
<vxe-column
key="retailPrice"
title="售价"
:title="$t('catalog.device.price')"
align="center"
field="retailPrice"
show-overflow="title"
@@ -393,7 +393,7 @@
/>
<vxe-column
key="itemTypeCode_dictText"
title="财务类别"
:title="$t('catalog.device.financeType')"
align="center"
field="itemTypeCode_dictText"
show-overflow="title"
@@ -401,7 +401,7 @@
/>
<vxe-column
key="hvcmFlag_enumText"
title="高值器材标志"
:title="$t('catalog.device.hvcmFlag')"
align="center"
field="hvcmFlag_enumText"
show-overflow="title"
@@ -416,7 +416,7 @@
width="90"
/> -->
<vxe-column
title="操作"
:title="$t('common.operation')"
align="center"
width="150"
class-name="small-padding fixed-width"
@@ -429,7 +429,7 @@
icon="Edit"
@click="openEditDevice(scope.row)"
>
编辑
{{ $t('common.edit') }}
</el-button>
</template>
</vxe-column>
@@ -490,18 +490,18 @@
<upload-filled />
</el-icon>
<div class="el-upload__text">
将文件拖到此处,或<em>点击上传</em>
{{ $t('catalog.device.dragOrClick') }}<em>{{ $t('catalog.device.clickUpload') }}</em>
</div>
<template #tip>
<div class="el-upload__tip text-center">
<span>仅允许导入xls、xlsx格式文件。</span>
<span>{{ $t('catalog.device.uploadTip') }}</span>
<el-link
type="primary"
:underline="false"
style="font-size: 12px; vertical-align: baseline"
@click="importTemplate"
>
下载模板
{{ $t('catalog.device.downloadTemplate') }}
</el-link>
</div>
</template>
@@ -512,10 +512,10 @@
type="primary"
@click="submitFileForm"
>
确 定
{{ $t('common.confirm') }}
</el-button>
<el-button @click="upload.open = false">
取 消
{{ $t('common.cancel') }}
</el-button>
</div>
</template>
@@ -536,8 +536,10 @@ import {
import deviceDialog from './components/deviceDialog';
import DeviceYbDialog from './components/deviceYbDialog';
import {nextTick} from 'vue';
import { useI18n } from 'vue-i18n';
const { proxy } = getCurrentInstance();
const { t } = useI18n();
const deviceList = ref([]);
const loading = ref(true);
@@ -605,7 +607,7 @@ function getDiseaseTreatmentList() {
return parseInt(a.value) - parseInt(b.value);
}
);
deviceCategories.value.push({ info: '全部', value: '' });
deviceCategories.value.push({ info: t('catalog.device.all'), value: '' });
deviceCategorieList.value = response.data.deviceCategories.sort((a, b) => {
return parseInt(a.value) - parseInt(b.value);
});
@@ -640,13 +642,13 @@ function handleStart() {
const stardIds = ids.value;
// selectedData
proxy.$modal
.confirm('是否确定启用数据!')
.confirm(t('catalog.device.confirmEnable'))
.then(function () {
return startDevice(stardIds);
})
.then(() => {
getList();
proxy.$modal.msgSuccess('启用成功');
proxy.$modal.msgSuccess(t('catalog.device.enableSuccess'));
})
.catch(() => {});
}
@@ -654,13 +656,13 @@ function handleStart() {
function handleClose() {
const stopIds = ids.value;
proxy.$modal
.confirm('是否确认停用数据!')
.confirm(t('catalog.device.confirmDisable'))
.then(function () {
return stopDevice(stopIds);
})
.then(() => {
getList();
proxy.$modal.msgSuccess('停用成功');
proxy.$modal.msgSuccess(t('catalog.device.disableSuccess'));
})
.catch(() => {});
}
@@ -677,7 +679,7 @@ function handleExport() {
/** 导入按钮操作 */
function handleImport() {
upload.title = '器材目录导入';
upload.title = t('catalog.device.importTitle');
upload.open = true;
}
/** 下载模板操作 */
@@ -701,7 +703,7 @@ const handleFileSuccess = (response, file, fileList) => {
"<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
response.msg +
'</div>',
'导入结果',
t('catalog.device.importResult'),
{ dangerouslyUseHTMLString: true }
);
getList();
@@ -721,7 +723,7 @@ function handleSelectionChange(selection) {
/** 打开新增弹窗 */
function openAddDevice() {
title.value = '新增';
title.value = t('common.add');
nextTick(() => {
proxy.$refs.deviceRef.show();
});
@@ -758,7 +760,7 @@ function getDeviceInfo(row) {
? (currentData.value.allergenFlag = true)
: (currentData.value.allergenFlag = false);
}
title.value = '编辑';
title.value = t('common.edit');
nextTick(() => {
proxy.$refs['deviceRef'].edit();
});

View File

@@ -22,7 +22,7 @@
style="margin-left: 5px; margin-top: -10px; margin-bottom: 20px"
@click="handleImportYb()"
>
从医保目录导入
{{ $t('catalog.diagnosis.importFromYb') }}
</el-button>
</div>
<el-row :gutter="24">
@@ -31,30 +31,30 @@
:span="8"
>
<el-form-item
label="编号"
:label="$t('catalog.diagnosis.code')"
prop="busNo"
>
<el-input
v-model="form.busNo"
placeholder="请输入编码"
:placeholder="$t('catalog.diagnosis.enterCode')"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
label="项目名称"
:label="$t('catalog.diagnosis.itemNameFull')"
prop="name"
>
<el-input
v-model="form.name"
placeholder="请输入名称"
:placeholder="$t('catalog.diagnosis.enterName')"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
label="所属科室"
:label="$t('catalog.diagnosis.department')"
prop="orgId"
>
<el-tree-select
@@ -66,7 +66,7 @@
children: 'children',
}"
value-key="id"
placeholder="请选择提供部门"
:placeholder="$t('catalog.diagnosis.selectDept')"
check-strictly
filterable
clearable
@@ -75,12 +75,12 @@
</el-col>
<el-col :span="8">
<el-form-item
label="项目编码"
:label="$t('catalog.diagnosis.itemCode')"
prop="busNo"
>
<el-input
v-model="form.busNo"
placeholder="请输入项目编码"
:placeholder="$t('catalog.diagnosis.enterItemCode')"
/>
</el-form-item>
</el-col>
@@ -88,7 +88,7 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="地点"
:label="$t('catalog.diagnosis.location')"
prop="locationId"
>
<el-tree-select
@@ -100,7 +100,7 @@
children: 'children',
}"
value-key="id"
placeholder="请选择地点"
:placeholder="$t('catalog.diagnosis.selectLocation')"
check-strictly
clearable
/>
@@ -108,7 +108,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="目录分类"
:label="$t('catalog.diagnosis.categoryType')"
prop="categoryCode"
>
<el-select
@@ -128,7 +128,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="业务类型"
:label="$t('catalog.diagnosis.bizType')"
prop="typeEnum"
>
<el-select
@@ -151,7 +151,7 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="医保标记"
:label="$t('catalog.diagnosis.ybFlag')"
prop="ybFlag"
>
<el-checkbox v-model="form.ybFlag" />
@@ -159,7 +159,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="医保对码标记"
:label="$t('catalog.diagnosis.ybMatchFlag')"
prop="ybMatchFlag"
>
<el-checkbox v-model="form.ybMatchFlag" />
@@ -167,7 +167,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="医保编码"
:label="$t('catalog.diagnosis.ybCode')"
prop="conditionCode"
>
<el-input
@@ -182,12 +182,12 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="医保类别"
:label="$t('catalog.diagnosis.ybCategory')"
prop="ybType"
>
<el-select
v-model="form.ybType"
placeholder="医保类别"
:placeholder="$t('catalog.diagnosis.ybCategory')"
clearable
filterable
style="width: 240px"
@@ -204,7 +204,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="身体部位"
:label="$t('catalog.diagnosis.bodySite')"
prop="bodySiteCode"
>
<el-tree-select
@@ -216,7 +216,7 @@
children: 'children',
}"
value-key="id"
placeholder="请选择身体部位"
:placeholder="$t('catalog.diagnosis.selectBodySite')"
check-strictly
filterable
clearable
@@ -226,7 +226,7 @@
<el-col :span="8">
<el-form-item
label="所需标本"
:label="$t('catalog.diagnosis.specimen')"
prop="specimenCode"
>
<el-select
@@ -248,7 +248,7 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="医保等级"
:label="$t('catalog.diagnosis.ybLevel')"
prop="chrgitmLv"
>
<el-select
@@ -270,7 +270,7 @@
<el-col :span="8">
<el-form-item
label="使用单位"
:label="$t('catalog.diagnosis.useUnit')"
prop="permittedUnitCode"
>
<el-select
@@ -290,7 +290,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="财务类型"
:label="$t('catalog.diagnosis.financeType')"
prop="itemTypeCode"
>
<el-select
@@ -314,7 +314,7 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="零售价"
:label="$t('catalog.diagnosis.retailPrice')"
prop="retailPrice"
>
<el-input
@@ -326,7 +326,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="最高零售价"
:label="$t('catalog.diagnosis.maxRetailPrice')"
prop="maximumRetailPrice"
>
<el-input
@@ -338,7 +338,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="划价标记"
:label="$t('catalog.diagnosis.pricingFlag')"
prop="maximumRetailPrice"
>
<el-checkbox
@@ -357,7 +357,7 @@
>
<el-row :gutter="24">
<el-col :span="8">
<el-form-item label="诊疗子项">
<el-form-item :label="$t('catalog.diagnosis.subItem')">
<div style="position: relative">
<PopoverList
:width="1000"
@@ -394,7 +394,7 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="执行次数">
<el-form-item :label="$t('catalog.diagnosis.execCount')">
<el-input-number
v-model="item.childrenRequestNum"
controls-position="right"
@@ -440,7 +440,7 @@
<el-row :gutter="24">
<el-col :span="16">
<el-form-item
label="说明"
:label="$t('catalog.diagnosis.descLabel')"
prop="descriptionText"
>
<el-input
@@ -456,13 +456,13 @@
style="display: flex; align-items: center; justify-content: flex-start"
>
<div style="font-size: 18px; font-weight: bold; color: #276ef1">
总价: ¥{{ totalPrice }}
{{ $t('catalog.diagnosis.totalPrice') }}: ¥{{ totalPrice }}
</div>
</el-col>
</el-row>
</el-form>
<template
v-if="title != '查看'"
v-if="title != $t('common.view')"
#footer
>
<div class="dialog-footer">
@@ -470,10 +470,10 @@
type="primary"
@click="submitForm"
>
确 定
{{ $t('common.confirm') }}
</el-button>
<el-button @click="cancel">
取 消
{{ $t('common.cancel') }}
</el-button>
</div>
</template>
@@ -493,9 +493,11 @@ import {
} from './diagnosistreatment';
import PopoverList from '@/components/HealthLinkHis/popoverList/index.vue';
import medicineList from './medicineList.vue';
import {getCurrentInstance, nextTick, watch} from 'vue';
import {computed, getCurrentInstance, nextTick, watch} from 'vue';
import { useI18n } from 'vue-i18n';
const { proxy } = getCurrentInstance();
const { t } = useI18n();
const { specimen_code, unit_code, med_chrgitm_type, fin_type_code, activity_category_code, chrgitm_lv } =
proxy.useDict(
'specimen_code',
@@ -518,20 +520,21 @@ const filteredUnitCode = ref([]);
// 标记是否正在进行过滤查询
const isFilteringUnitCode = ref(false);
const rules = computed(() => ({
name: [{ required: true, message: t('catalog.diagnosis.nameRequired'), trigger: 'blur' }],
categoryCode: [{ required: true, message: t('catalog.diagnosis.categoryRequired'), trigger: 'blur' }],
permittedUnitCode: [{ required: true, message: t('catalog.diagnosis.unitRequired'), trigger: 'blur' }],
retailPrice: [{ required: true, message: t('catalog.diagnosis.priceRequired'), trigger: 'blur' }],
ybType: [{ required: true, message: t('catalog.diagnosis.ybTypeRequired'), trigger: 'blur' }],
chrgitmLv: [{ required: true, message: t('catalog.diagnosis.ybLevelRequired'), trigger: 'blur' }],
itemTypeCode: [{ required: true, message: t('catalog.diagnosis.financeTypeRequired'), trigger: 'blur' }],
}));
const data = reactive({
form: {},
rules: {
name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
categoryCode: [{ required: true, message: '诊疗目录不能为空', trigger: 'blur' }],
permittedUnitCode: [{ required: true, message: '使用单位不能为空', trigger: 'blur' }],
retailPrice: [{ required: true, message: '零售价不能为空', trigger: 'blur' }],
ybType: [{ required: true, message: '医保类型不能为空', trigger: 'blur' }],
chrgitmLv: [{ required: true, message: '医保等级不能为空', trigger: 'blur' }],
itemTypeCode: [{ required: true, message: '财务类型不能为空', trigger: 'blur' }],
},
});
const { form, rules } = toRefs(data);
const { form } = toRefs(data);
const props = defineProps({
item: {
@@ -598,7 +601,7 @@ function calculateTotalPrice() {
}
} catch (error) {
totalPrice.value = '0.00';
proxy.$modal.msgWarning('价格计算过程中遇到错误,请检查输入数据');
proxy.$modal.msgWarning(t('catalog.diagnosis.priceCalcError'));
}
}
@@ -773,12 +776,12 @@ async function submitForm() {
isValidatingYbNo.value = true;
const isUnique = await validateYbNoUnique(form.value.ybNo, form.value.id);
if (!isUnique) {
proxy.$modal.msgWarning('医保编码已存在,请输入其他医保编码');
proxy.$modal.msgWarning(t('catalog.diagnosis.ybCodeExists'));
return;
}
} catch (error) {
console.error('医保编码校验失败:', error);
proxy.$modal.msgError('医保编码校验失败,请稍后重试');
proxy.$modal.msgError(t('catalog.diagnosis.ybCodeCheckFailed'));
return;
} finally {
isValidatingYbNo.value = false;
@@ -789,7 +792,7 @@ async function submitForm() {
editDiagnosisTreatment(form.value).then((response) => {
// 触发自定义事件,并传递数据给父组件
emits('submit');
proxy.$modal.msgSuccess('修改成功');
proxy.$modal.msgSuccess(t('common.message'));
visible.value = false;
reset(); // 重置表单数据
});
@@ -797,7 +800,7 @@ async function submitForm() {
addDiagnosisTreatment(form.value).then((response) => {
// 触发自定义事件,并传递数据给父组件
emits('submit');
proxy.$modal.msgSuccess('新增成功');
proxy.$modal.msgSuccess(t('catalog.diagnosis.addSuccess'));
visible.value = false;
reset(); // 重置表单数据
});

View File

@@ -7,7 +7,7 @@
:xs="24"
>
<div class="head-title">
诊疗目录
{{ $t('catalog.diagnosis.title') }}
</div>
<div class="head-container">
<el-tree
@@ -37,13 +37,13 @@
>
<el-row :gutter="24">
<el-form-item
label="项目名"
:label="$t('catalog.diagnosis.itemName')"
prop="searchKey"
label-width="55"
>
<el-input
v-model="queryParams.searchKey"
placeholder="品名/商品名/英文品名/编码/拼音"
:placeholder="$t('catalog.diagnosis.searchPlaceholder')"
clearable
style="width: 220px"
@keyup.enter="handleQuery"
@@ -51,7 +51,7 @@
</el-form-item>
<el-form-item
label="状态"
:label="$t('common.status')"
prop="statusEnum"
label-width="80"
>
@@ -68,7 +68,7 @@
</el-select>
</el-form-item>
<el-form-item
label="医保是否对码"
:label="$t('catalog.diagnosis.ybMatch')"
prop="ybMatchFlag"
label-width="120"
>
@@ -87,7 +87,7 @@
</el-form-item>
<el-form-item
label="类型"
:label="$t('catalog.diagnosis.type')"
prop="typeEnum"
label-width="100"
>
@@ -105,7 +105,7 @@
</el-select>
</el-form-item>
<el-form-item
label="划价标记"
:label="$t('catalog.diagnosis.pricingFlag')"
prop="pricingFlag"
label-width="80"
>
@@ -137,7 +137,7 @@
icon="Plus"
@click="openAddDiagnosisTreatment"
>
添加新项目
{{ $t('catalog.diagnosis.addNew') }}
</el-button>
</el-col>
<el-col :span="1.5">
@@ -148,7 +148,7 @@
:disabled="multiple"
@click="handleClose"
>
停用
{{ $t('common.disabled') }}
</el-button>
</el-col>
<el-col :span="1.5">
@@ -159,7 +159,7 @@
:disabled="multiple"
@click="handleStart"
>
启用
{{ $t('common.enabled') }}
</el-button>
</el-col>
@@ -171,7 +171,7 @@
:disabled="multiple"
@click="handlePricingFlag(1)"
>
允许划价
{{ $t('catalog.diagnosis.allowPricing') }}
</el-button>
</el-col>
@@ -183,7 +183,7 @@
:disabled="multiple"
@click="handlePricingFlag(0)"
>
禁止划价
{{ $t('catalog.diagnosis.forbidPricing') }}
</el-button>
</el-col>
@@ -194,7 +194,7 @@
icon="Upload"
@click="handleImport"
>
导入
{{ $t('common.import') }}
</el-button>
</el-col>
@@ -205,7 +205,7 @@
icon="Search"
@click="getList"
>
查询
{{ $t('common.search') }}
</el-button>
</el-col>
<!-- <el-col :span="1.5">
@@ -233,7 +233,7 @@
/>
<vxe-column
key="busNo"
title="编码"
:title="$t('catalog.diagnosis.code')"
align="center"
field="busNo"
show-overflow="title"
@@ -241,7 +241,7 @@
/>
<vxe-column
key="name"
title="项目名称"
:title="$t('catalog.diagnosis.itemNameFull')"
align="center"
field="name"
show-overflow="title"
@@ -250,7 +250,7 @@
<vxe-column
key="categoryCode_dictText"
title="目录类别"
:title="$t('catalog.diagnosis.categoryType')"
align="center"
field="categoryCode_dictText"
show-overflow="title"
@@ -258,7 +258,7 @@
/>
<vxe-column
key="retailPrice"
title="售价"
:title="$t('catalog.diagnosis.price')"
align="center"
field="retailPrice"
show-overflow="title"
@@ -266,7 +266,7 @@
/>
<vxe-column
key="itemTypeCode_dictText"
title="财务类别"
:title="$t('catalog.diagnosis.financeType')"
align="center"
field="itemTypeCode_dictText"
show-overflow="title"
@@ -274,28 +274,28 @@
/>
<vxe-column
key="permittedUnitCode_dictText"
title="使用单位"
:title="$t('catalog.diagnosis.useUnit')"
align="center"
field="permittedUnitCode_dictText"
show-overflow="title"
/>
<vxe-column
key="ybNo"
title="医保编码"
:title="$t('catalog.diagnosis.ybCode')"
align="center"
field="ybNo"
show-overflow="title"
/>
<vxe-column
key="statusEnum_enumText"
title="状态"
:title="$t('common.status')"
align="center"
field="statusEnum_enumText"
show-overflow="title"
/>
<vxe-column
key="pricingFlag_enumText"
title="划价标记"
:title="$t('catalog.diagnosis.pricingFlag')"
align="center"
field="pricingFlag_enumText"
show-overflow="title"
@@ -306,12 +306,12 @@
:type="scope.row.pricingFlag === 1 ? 'success' : scope.row.pricingFlag === 0 ? 'danger' : 'info'"
size="small"
>
{{ scope.row.pricingFlag_enumText || (scope.row.pricingFlag === 1 ? '允许' : scope.row.pricingFlag === 0 ? '不允许' : '未设置') }}
{{ scope.row.pricingFlag_enumText || (scope.row.pricingFlag === 1 ? $t('catalog.diagnosis.allowed') : scope.row.pricingFlag === 0 ? $t('catalog.diagnosis.notAllowed') : $t('catalog.diagnosis.notSet')) }}
</el-tag>
</template>
</vxe-column>
<vxe-column
title="操作"
:title="$t('common.operation')"
align="center"
width="150"
class-name="small-padding fixed-width"
@@ -324,7 +324,7 @@
icon="Edit"
@click="openEditDiagnosisTreatment(scope.row)"
>
编辑
{{ $t('common.edit') }}
</el-button>
</template>
</vxe-column>
@@ -387,18 +387,18 @@
<upload-filled />
</el-icon>
<div class="el-upload__text">
将文件拖到此处,或<em>点击上传</em>
{{ $t('catalog.diagnosis.dragOrClick') }}<em>{{ $t('catalog.diagnosis.clickUpload') }}</em>
</div>
<template #tip>
<div class="el-upload__tip text-center">
<span>仅允许导入xls、xlsx格式文件。</span>
<span>{{ $t('catalog.diagnosis.uploadTip') }}</span>
<el-link
type="primary"
:underline="false"
style="font-size: 12px; vertical-align: baseline"
@click="importTemplate"
>
下载模板
{{ $t('catalog.diagnosis.downloadTemplate') }}
</el-link>
</div>
</template>
@@ -409,10 +409,10 @@
type="primary"
@click="submitFileForm"
>
确 定
{{ $t('common.confirm') }}
</el-button>
<el-button @click="upload.open = false">
取 消
{{ $t('common.cancel') }}
</el-button>
</div>
</template>
@@ -422,6 +422,7 @@
<script setup name="DiagnosisTreatment">
import {getToken} from '@/utils/auth';
import { useI18n } from 'vue-i18n';
import {
getDiagnosisTreatmentList,
getDiagnosisTreatmentOne,
@@ -436,6 +437,7 @@ import DiagTreYbDialog from './components/diagTreYbDialog';
import {nextTick} from 'vue';
const { proxy } = getCurrentInstance();
const { t } = useI18n();
const diagnosisTreatmentList = ref([]);
const loading = ref(true);
@@ -502,7 +504,7 @@ function getDiseaseTreatmentList() {
diagnosisCategoryOptions.value = response.data.diagnosisCategoryOptions.sort((a, b) => {
return parseInt(a.value) - parseInt(b.value);
});
diagnosisCategoryOptions.value.push({ info: '全部', value: '' });
diagnosisCategoryOptions.value.push({ info: t('catalog.diagnosis.all'), value: '' });
statusFlagOptions.value = response.data.statusFlagOptions;
exeOrganizations.value = response.data.exeOrganizations;
typeEnumOptions.value = response.data.typeEnumOptions;
@@ -535,13 +537,13 @@ function handleStart() {
const stardIds = ids.value;
// selectedData
proxy.$modal
.confirm('是否确定启用数据!')
.confirm(t('catalog.diagnosis.confirmEnable'))
.then(function () {
return startDiseaseTreatment(stardIds);
})
.then(() => {
getList();
proxy.$modal.msgSuccess('启用成功');
proxy.$modal.msgSuccess(t('catalog.diagnosis.enableSuccess'));
})
.catch(() => {});
}
@@ -549,13 +551,13 @@ function handleStart() {
function handleClose() {
const stopIds = ids.value;
proxy.$modal
.confirm('是否确认停用数据!')
.confirm(t('catalog.diagnosis.confirmDisable'))
.then(function () {
return stopDiseaseTreatment(stopIds);
})
.then(() => {
getList();
proxy.$modal.msgSuccess('停用成功');
proxy.$modal.msgSuccess(t('catalog.diagnosis.disableSuccess'));
})
.catch(() => {});
}
@@ -563,15 +565,15 @@ function handleClose() {
/** 批量设置划价标记 */
function handlePricingFlag(pricingFlag) {
const selectedIds = ids.value;
const flagText = pricingFlag === 1 ? '允许划价' : '禁止划价';
const flagText = pricingFlag === 1 ? t('catalog.diagnosis.allowPricing') : t('catalog.diagnosis.forbidPricing');
proxy.$modal
.confirm(`是否确认将选中的诊疗项目设置为"${flagText}"`)
.confirm(t('catalog.diagnosis.confirmPricing', { flag: flagText }))
.then(function () {
return updatePricingFlag(selectedIds, pricingFlag);
})
.then(() => {
getList();
proxy.$modal.msgSuccess(`批量设置${flagText}成功`);
proxy.$modal.msgSuccess(t('catalog.diagnosis.batchPricingSuccess', { flag: flagText }));
})
.catch(() => {});
}
@@ -588,7 +590,7 @@ function handleExport() {
/** 导入按钮操作 */
function handleImport() {
upload.title = '诊疗目录导入';
upload.title = t('catalog.diagnosis.importTitle');
upload.open = true;
}
/** 下载模板操作 */
@@ -612,7 +614,7 @@ const handleFileSuccess = (response, file, fileList) => {
"<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
response.msg +
'</div>',
'导入结果',
t('catalog.diagnosis.importResult'),
{ dangerouslyUseHTMLString: true }
);
getList();
@@ -632,7 +634,7 @@ function handleSelectionChange(selection) {
/** 打开新增弹窗 */
function openAddDiagnosisTreatment() {
title.value = '新增';
title.value = t('common.add');
nextTick(() => {
proxy.$refs.diagnosisTreatmentRef.show();
});
@@ -660,7 +662,7 @@ function getDiagnosisTreatmentInfo(row) {
currentData.value.ybMatchFlag == 1
? (currentData.value.ybMatchFlag = true)
: (currentData.value.ybMatchFlag = false);
title.value = '编辑';
title.value = t('common.edit');
nextTick(() => {
proxy.$refs['diagnosisTreatmentRef'].edit();
});

View File

@@ -274,12 +274,12 @@
<el-row>
<el-col :span="12">
<el-form-item
label="名称"
:label="$t('catalog.disease.name')"
prop="name"
>
<el-input
v-model="form.name"
placeholder="请输入名称"
:placeholder="$t('catalog.disease.enterName')"
:disabled="form.id != undefined"
/>
</el-form-item>
@@ -289,12 +289,12 @@
:span="12"
>
<el-form-item
label="编码"
:label="$t('catalog.disease.code')"
prop="conditionCode"
>
<el-input
v-model="form.conditionCode"
placeholder="请输入编码"
:placeholder="$t('catalog.disease.enterCode')"
disabled
/>
</el-form-item>
@@ -303,12 +303,12 @@
<el-row>
<el-col :span="12">
<el-form-item
label="疾病类型"
:label="$t('catalog.disease.diseaseType')"
prop="sourceEnum"
>
<el-select
v-model="form.sourceEnum"
placeholder="请选择"
:placeholder="$t('common.pleaseSelect')"
clearable
:disabled="form.sourceEnum != '' && form.sourceEnum != undefined"
>
@@ -323,12 +323,12 @@
</el-col>
<el-col :span="12">
<el-form-item
label="诊断类型"
:label="$t('catalog.disease.diagnosisType')"
prop="typeCode"
>
<el-select
v-model="form.typeCode"
placeholder="请选择"
:placeholder="$t('common.pleaseSelect')"
clearable
>
<el-option
@@ -360,7 +360,7 @@
</el-col> -->
<el-col :span="12">
<el-form-item
label="医保编码"
:label="$t('catalog.disease.ybCode')"
prop="ybNo"
>
<el-input
@@ -373,7 +373,7 @@
<el-row>
<el-col :span="12">
<el-form-item
label="医保标记"
:label="$t('catalog.disease.ybFlag')"
prop="ybFlag"
>
<el-checkbox v-model="form.ybFlag" />
@@ -381,7 +381,7 @@
</el-col>
<el-col :span="12">
<el-form-item
label="医保对码"
:label="$t('catalog.disease.ybMatch')"
prop="ybMatchFlag"
>
<el-checkbox v-model="form.ybMatchFlag" />
@@ -391,12 +391,12 @@
<el-row>
<el-col :span="12">
<el-form-item
label="报卡类型"
:label="$t('catalog.disease.reportType')"
prop="reportTypeCode"
>
<el-select
v-model="form.reportTypeCode"
placeholder="请选择"
:placeholder="$t('common.pleaseSelect')"
clearable
>
<el-option
@@ -412,7 +412,7 @@
<el-row :gutter="24">
<el-col :span="16">
<el-form-item
label="说明"
:label="$t('catalog.disease.descLabel')"
prop="description"
>
<el-input
@@ -431,10 +431,10 @@
type="primary"
@click="submitForm"
>
{{ $t('common.confirm') }}
</el-button>
<el-button @click="cancel">
{{ $t('common.cancel') }}
</el-button>
</div>
</template>
@@ -506,7 +506,7 @@ function getDiseaseCategoryList() {
).sort((a, b) => {
return parseInt(a.value) - parseInt(b.value);
});
conditionDefinitionOptions.value.push({ info: '全部', value: '' });
conditionDefinitionOptions.value.push({ info: t('catalog.disease.all'), value: '' });
conditionDefinitionList.value = JSON.parse(
JSON.stringify(response.data.diseaseCategoryList)
).sort((a, b) => {
@@ -541,13 +541,13 @@ function handleQuery() {
function handleStart(row) {
const stardIds = row.id || ids.value;
proxy.$modal
.confirm('是否确定启用数据!')
.confirm(t('catalog.disease.confirmEnable'))
.then(function () {
return startDisease(stardIds);
})
.then(() => {
getList();
proxy.$modal.msgSuccess('启用成功');
proxy.$modal.msgSuccess(t('catalog.disease.enableSuccess'));
})
.catch(() => {});
}
@@ -555,13 +555,13 @@ function handleStart(row) {
function handleClose(row) {
const stopIds = row.id || ids.value;
proxy.$modal
.confirm('是否确认停用数据!')
.confirm(t('catalog.disease.confirmDisable'))
.then(function () {
return stopDisease(stopIds);
})
.then(() => {
getList();
proxy.$modal.msgSuccess('停用成功');
proxy.$modal.msgSuccess(t('catalog.disease.disableSuccess'));
})
.catch(() => {});
}
@@ -613,7 +613,7 @@ function handleAdd() {
reset();
form.value.sourceEnum = conditionDefinition.value;
open.value = true;
title.value = '新增';
title.value = t('catalog.disease.addTitle');
}
/** 修改按钮操作 */
function handleUpdate(row) {
@@ -630,7 +630,7 @@ function handleUpdate(row) {
// console.log(row, "row");
// form.value = JSON.parse(JSON.stringify(row));
open.value = true;
title.value = '病种编辑';
title.value = t('catalog.disease.editTitle');
}
/** 提交按钮 */
function submitForm() {
@@ -642,13 +642,13 @@ function submitForm() {
if (form.value.id != undefined) {
console.log(form.value, 'editDisease', form.value.statusEnum);
editDisease(form.value).then((response) => {
proxy.$modal.msgSuccess('修改成功');
proxy.$modal.msgSuccess(t('common.message'));
open.value = false;
getList();
});
} else {
addDisease(form.value).then((response) => {
proxy.$modal.msgSuccess('新增成功');
proxy.$modal.msgSuccess(t('catalog.disease.addSuccess'));
open.value = false;
getList();
});

View File

@@ -12,7 +12,7 @@
type="border-card"
>
<el-tab-pane
label="基本信息"
:label="$t('catalog.medicine.basicInfo')"
name="basic"
>
<el-form
@@ -23,7 +23,7 @@
label-position="left"
>
<div class="title">
基本信息
{{ $t('catalog.medicine.basicInfo') }}
<el-button
type="primary"
plain
@@ -31,7 +31,7 @@
style="margin-left: 32px"
@click="handleImportYb()"
>
从医保目录导入
{{ $t('catalog.medicine.importFromYb') }}
</el-button>
</div>
<el-row :gutter="24">
@@ -40,7 +40,7 @@
:span="6"
>
<el-form-item
label="药品编号"
:label="$t('catalog.medicine.drugNo')"
prop="busNo"
>
<el-input
@@ -52,7 +52,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="通用名称"
:label="$t('catalog.medicine.genericName')"
prop="name"
>
<el-input
@@ -63,7 +63,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="商品名称"
:label="$t('catalog.medicine.brandName')"
prop="merchandiseName"
>
<el-input
@@ -74,12 +74,12 @@
</el-col>
<el-col :span="6">
<el-form-item
label="医保等级"
:label="$t('catalog.medicine.ybLevel')"
prop="chrgitmLv"
>
<el-select
v-model="form.chrgitmLv"
placeholder="医保等级"
:placeholder="$t('catalog.medicine.ybLevel')"
clearable
style="width: 240px"
:disabled="form.isEditInfoDisable === 1 || form.isEditInfoDisable === 2"
@@ -97,7 +97,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="医保编码"
:label="$t('catalog.medicine.ybCode')"
prop="ybNo"
>
<el-input
@@ -110,7 +110,7 @@
<el-row :gutter="24">
<el-col :span="6">
<el-form-item
label="贯标国家编码"
:label="$t('catalog.medicine.nationalCode')"
prop="nationalDrugCode"
>
<el-input
@@ -121,7 +121,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="药品分类"
:label="$t('catalog.medicine.drugCategory')"
prop="categoryCode"
>
<el-select
@@ -141,7 +141,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="生产厂家 "
:label="$t('catalog.medicine.manufacturer')"
prop="manufacturerText"
>
<el-input
@@ -152,7 +152,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="医保对码"
:label="$t('catalog.medicine.ybMatch')"
prop="ybMatchFlag"
>
<el-checkbox
@@ -165,7 +165,7 @@
<el-row :gutter="24">
<el-col :span="6">
<el-form-item
label="69码"
:label="$t('catalog.medicine.code69')"
prop="drug69Code"
>
<el-input
@@ -176,12 +176,12 @@
</el-col>
</el-row>
<div class="title">
临床信息
{{ $t('catalog.medicine.clinicalInfo') }}
</div>
<el-row :gutter="24">
<el-col :span="6">
<el-form-item
label="药品性质"
:label="$t('catalog.medicine.drugProperty')"
prop="pharmacologyCategoryCode"
>
<el-select
@@ -199,7 +199,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="规格"
:label="$t('catalog.medicine.specification')"
prop="totalVolume"
>
<el-input
@@ -211,7 +211,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="计量换算"
:label="$t('catalog.medicine.conversion')"
prop="totalVolume"
>
<el-input
@@ -224,7 +224,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="剂量单位"
:label="$t('catalog.medicine.doseUnit')"
prop="doseUnitCode"
>
<el-select
@@ -246,7 +246,7 @@
<el-row :gutter="24">
<el-col :span="6">
<el-form-item
label="剂型"
:label="$t('catalog.medicine.doseForm')"
prop="doseFormCode"
>
<el-select
@@ -266,7 +266,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="用量限定"
:label="$t('catalog.medicine.usageLimit')"
prop="usageLimit"
>
<el-input
@@ -277,7 +277,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="用法"
:label="$t('catalog.medicine.method')"
prop="methodCode"
>
<el-select
@@ -296,7 +296,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="用药频次"
:label="$t('catalog.medicine.frequency')"
prop="rateCode"
>
<el-select
@@ -317,7 +317,7 @@
<el-row :gutter="24">
<el-col :span="6">
<el-form-item
label="单次剂量"
:label="$t('catalog.medicine.singleDose')"
prop="dose"
>
<el-input
@@ -328,7 +328,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="单次最大剂量"
:label="$t('catalog.medicine.maxDose')"
prop="maxUnit"
>
<el-input
@@ -339,7 +339,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="用法说明"
:label="$t('catalog.medicine.dosageInstruction')"
prop="dosageInstruction"
>
<el-select
@@ -358,7 +358,7 @@
</el-col>
</el-row>
<div class="title">
库存信息
{{ $t('catalog.medicine.stockInfo') }}
</div>
<el-row :gutter="24">
<!-- <el-col :span="6">
@@ -380,7 +380,7 @@
</el-col> -->
<el-col :span="6">
<el-form-item
label="采购入库位置"
:label="$t('catalog.medicine.stockLocation')"
prop="locationId"
>
<el-tree-select
@@ -392,7 +392,7 @@
children: 'children',
}"
value-key="id"
placeholder="请选择采购入库位置"
:placeholder="$t('catalog.medicine.selectStockLocation')"
check-strictly
clearable
filterable
@@ -401,7 +401,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="包装单位"
:label="$t('catalog.medicine.packUnit')"
prop="unitCode"
>
<el-select
@@ -421,7 +421,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="最小单位"
:label="$t('catalog.medicine.minUnit')"
prop="minUnitCode"
>
<el-select
@@ -441,7 +441,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="警戒线最低值(常规单位)"
:label="$t('catalog.medicine.alertMin')"
prop="itemMinQuantity"
label-width="180px"
>
@@ -458,7 +458,7 @@
<el-row :gutter="24">
<el-col :span="6">
<el-form-item
label="门诊拆分属性"
:label="$t('catalog.medicine.outpatientSplit')"
prop="partAttributeEnum"
>
<el-select
@@ -476,7 +476,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="住院临时医嘱拆分属性"
:label="$t('catalog.medicine.inpatientSplit')"
prop="thoPartAttributeEnum"
class="custom-label-height"
>
@@ -495,7 +495,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="拆零比"
:label="$t('catalog.medicine.partPercent')"
prop="partPercent"
>
<el-input-number
@@ -511,7 +511,7 @@
<el-col :span="6">
<el-form-item
label="警戒线最高值(常规单位)"
:label="$t('catalog.medicine.alertMax')"
prop="itemMaxQuantity"
label-width="180px"
>
@@ -525,12 +525,12 @@
</el-col>
</el-row>
<div class="title">
价格信息
{{ $t('catalog.medicine.priceInfo') }}
</div>
<el-row :gutter="24">
<el-col :span="6">
<el-form-item
label="购入价"
:label="$t('catalog.medicine.purchasePrice')"
prop="purchasePrice"
>
<el-input
@@ -543,7 +543,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="零售价"
:label="$t('catalog.medicine.retailPrice')"
prop="retailPrice"
>
<el-input
@@ -556,7 +556,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="最高零售价"
:label="$t('catalog.medicine.maxRetailPrice')"
prop="maximumRetailPrice"
>
<el-input
@@ -568,12 +568,12 @@
</el-col>
</el-row>
<div class="title">
业务信息
{{ $t('catalog.medicine.bizInfo') }}
</div>
<el-row :gutter="24">
<el-col :span="6">
<el-form-item
label="财务类型"
:label="$t('catalog.medicine.financeType')"
prop="typeCode"
>
<el-select
@@ -593,7 +593,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="药品版本"
:label="$t('catalog.medicine.version')"
prop="version"
>
<el-input
@@ -604,7 +604,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="批准文号"
:label="$t('catalog.medicine.approvalNumber')"
prop="approvalNumber"
>
<el-input
@@ -638,12 +638,12 @@
<el-row :gutter="24">
<el-col :span="6">
<el-form-item
label="医保类别"
:label="$t('catalog.medicine.ybCategory')"
prop="ybType"
>
<el-select
v-model="form.ybType"
placeholder="医保类别"
:placeholder="$t('catalog.medicine.ybCategory')"
clearable
filterable
style="width: 240px"
@@ -672,7 +672,7 @@
</el-col> -->
<el-col :span="6">
<el-form-item
label="基药标识"
:label="$t('catalog.medicine.essentialDrug')"
prop="basicFlag"
>
<el-checkbox
@@ -683,7 +683,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="皮试判别"
:label="$t('catalog.medicine.skinTest')"
prop="skinTestFlag"
>
<el-checkbox
@@ -696,7 +696,7 @@
<el-row :gutter="24">
<el-col :span="6">
<el-form-item
label="注射药品"
:label="$t('catalog.medicine.injectable')"
prop="injectFlag"
>
<el-checkbox
@@ -707,7 +707,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="儿童用药标志"
:label="$t('catalog.medicine.childrenDrug')"
prop="childrenFlag"
>
<el-checkbox v-model="form.childrenFlag" />
@@ -715,7 +715,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="自制药标识"
:label="$t('catalog.medicine.selfMade')"
prop="selfFlag"
>
<el-checkbox v-model="form.selfFlag" />
@@ -723,7 +723,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="是否活性"
:label="$t('catalog.medicine.isActive')"
prop="activeFlag"
>
<el-checkbox
@@ -736,7 +736,7 @@
<el-row :gutter="24">
<el-col :span="6">
<el-form-item
label="限制使用"
:label="$t('catalog.medicine.restricted')"
prop="restrictedFlag"
>
<el-checkbox v-model="form.restrictedFlag" />
@@ -744,7 +744,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="限制使用范围"
:label="$t('catalog.medicine.restrictedScope')"
prop="restrictedScope"
>
<el-input
@@ -755,7 +755,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="抗生素"
:label="$t('catalog.medicine.antibiotic')"
prop="antibioticFlag"
>
<el-checkbox v-model="form.antibioticFlag" />
@@ -763,7 +763,7 @@
</el-col>
<el-col :span="6">
<el-form-item
label="处方标志"
:label="$t('catalog.medicine.rxFlag')"
prop="rxFlag"
>
<el-radio-group
@@ -787,7 +787,7 @@
<!-- <el-tab-pane label="抗生素信息" v-if="form.id != undefined && form.antibioticFlag"> -->
<el-tab-pane
v-if="form.antibioticFlag"
label="抗生素信息"
:label="$t('catalog.medicine.antibioticInfo')"
name="antibiotic"
>
<el-form
@@ -800,7 +800,7 @@
<el-row :gutter="24">
<el-col :span="20">
<el-form-item
label="抗生素分类"
:label="$t('catalog.medicine.antibioticCategory')"
prop="antibioticCode"
>
<el-select
@@ -820,7 +820,7 @@
<el-row :gutter="24">
<el-col :span="12">
<el-form-item
label="权限级别"
:label="$t('catalog.medicine.permissionLevel')"
prop="conditionCode"
class="custom-label-spacing"
>
@@ -841,12 +841,12 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="单次剂量"
:label="$t('catalog.medicine.singleDose')"
prop="dose"
>
<el-input
v-model="antibioticForm.dose"
placeholder="输入剂量"
:placeholder="$t('catalog.medicine.enterDose')"
/>
</el-form-item>
</el-col>
@@ -867,7 +867,7 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="频次范围"
:label="$t('catalog.medicine.frequencyRange')"
prop="minRateCode"
>
<el-input
@@ -890,13 +890,13 @@
</el-form-item>
</el-col>
<el-col :span="6">
(小时一次)
({{ $t('catalog.medicine.hoursPerTime') }})
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="8">
<el-form-item
label="DDD值"
:label="$t('catalog.medicine.dddValue')"
prop="dddCode"
>
<!-- <el-select v-model="antibioticForm.dddCode" clearable>
@@ -915,7 +915,7 @@
</el-col>
<el-col :span="8">
<el-form-item
label="DDD单位"
:label="$t('catalog.medicine.dddUnit')"
prop="dddUnitCode"
>
<el-select
@@ -941,10 +941,10 @@
type="primary"
@click="submitForm"
>
{{ $t('common.confirm') }}
</el-button>
<el-button @click="cancel">
{{ $t('common.cancel') }}
</el-button>
</div>
</template>
@@ -954,9 +954,12 @@
<script setup name="MedicineDialog">
import {deptTreeSelect, locationTreeSelect, medicineDictMap} from './medicine';
import { useI18n } from 'vue-i18n';
import { computed } from 'vue';
const router = useRouter();
const { proxy } = getCurrentInstance();
const { t } = useI18n();
const {
med_category_code,
system_categories,
@@ -1025,47 +1028,41 @@ const statusRestrictedOptions = ref(undefined);
const partAttributeEnumOptions = ref(undefined);
const tempOrderSplitPropertyOptions = ref(undefined);
const activeName = ref('basic');
const rules = computed(() => ({
locationId: [{ required: true, message: t('catalog.medicine.locationRequired'), trigger: 'blur' }],
doseFormCode: [{ required: true, message: t('catalog.medicine.doseFormRequired'), trigger: 'blur' }],
totalVolume: [{ required: true, message: t('catalog.medicine.specRequired'), trigger: 'blur' }],
doseUnitCode: [{ required: true, message: t('catalog.medicine.doseUnitRequired'), trigger: 'blur' }],
manufacturerText: [{ required: true, message: t('catalog.medicine.manufacturerRequired'), trigger: 'blur' }],
busNo: [{ required: true, message: t('catalog.medicine.busNoRequired'), trigger: 'blur' }],
name: [{ required: true, message: t('catalog.medicine.nameRequired'), trigger: 'blur' }],
categoryCode: [{ required: true, message: t('catalog.medicine.categoryRequired'), trigger: 'blur' }],
unitConversionRatio: [{ required: true, message: t('catalog.medicine.conversionRequired'), trigger: 'blur' }],
merchandiseName: [{ required: true, message: t('catalog.medicine.merchNameRequired'), trigger: 'blur' }],
unitCode: [{ required: true, message: t('catalog.medicine.unitRequired'), trigger: 'blur' }],
minUnitCode: [{ required: true, message: t('catalog.medicine.minUnitRequired'), trigger: 'blur' }],
ingredient: [{ required: true, message: t('catalog.medicine.ingredientRequired'), trigger: 'blur' }],
partPercent: [{ required: true, message: t('catalog.medicine.partPercentRequired'), trigger: 'blur' }],
doseFrom: [{ required: true, message: t('catalog.medicine.doseFormTypeRequired'), trigger: 'blur' }],
ybNo: [{ required: false, message: t('catalog.medicine.ybCodeRequired'), trigger: 'blur' }],
pharmacologyCategoryCode: [{ required: true, message: t('catalog.medicine.pharmaRequired'), trigger: 'blur' }],
supplyId: [{ required: true, message: t('catalog.medicine.supplierRequired'), trigger: 'blur' }],
nationalDrugCode: [{ required: false, message: t('catalog.medicine.nationalCodeRequired'), trigger: 'blur' }],
partAttributeEnum: [{ required: true, message: t('catalog.medicine.splitAttrRequired'), trigger: 'blur' }],
thoPartAttributeEnum: [{ required: true, message: t('catalog.medicine.tempSplitRequired'), trigger: 'blur' }],
purchasePrice: [{ required: true, message: t('catalog.medicine.purchasePriceRequired'), trigger: 'blur' }],
retailPrice: [{ required: true, message: t('catalog.medicine.retailPriceRequired'), trigger: 'blur' }],
ybType: [{ required: true, message: t('catalog.medicine.ybTypeRequired'), trigger: 'blur' }],
rxFlag: [{ required: true, message: t('catalog.medicine.rxFlagRequired'), trigger: 'blur' }],
chrgitmLv: [{ required: true, message: t('catalog.medicine.ybLevelRequired'), trigger: 'blur' }],
typeCode: [{ required: true, message: t('catalog.medicine.financeTypeRequired'), trigger: 'blur' }],
}));
const data = reactive({
form: {},
antibioticForm: {},
rules: {
locationId: [{ required: true, message: '所在位置不能为空', trigger: 'blur' }],
doseFormCode: [{ required: true, message: '剂型不能为空', trigger: 'blur' }],
totalVolume: [{ required: true, message: '规格不能为空', trigger: 'blur' }],
doseUnitCode: [{ required: true, message: '剂量单位不能为空', trigger: 'blur' }],
manufacturerText: [{ required: true, message: '生产厂家不能为空', trigger: 'blur' }],
busNo: [{ required: true, message: '药品编号不能为空', trigger: 'blur' }],
name: [{ required: true, message: '药品名称不能为空', trigger: 'blur' }],
categoryCode: [{ required: true, message: '药品分类不能为空', trigger: 'blur' }],
unitConversionRatio: [{ required: true, message: '计量换算不能为空', trigger: 'blur' }],
merchandiseName: [{ required: true, message: '商品名称不能为空', trigger: 'blur' }],
unitCode: [{ required: true, message: '药品单位不能为空', trigger: 'blur' }],
minUnitCode: [{ required: true, message: '最小单位不能为空', trigger: 'blur' }],
ingredient: [{ required: true, message: '成分不能为空', trigger: 'blur' }],
partPercent: [{ required: true, message: '拆零比不能为空', trigger: 'blur' }],
doseFrom: [{ required: true, message: '剂量形式不能为空', trigger: 'blur' }],
ybNo: [{ required: false, message: '医保编码不能为空', trigger: 'blur' }],
pharmacologyCategoryCode: [{ required: true, message: '药品性质不能为空', trigger: 'blur' }],
supplyId: [{ required: true, message: '供应商不能为空', trigger: 'blur' }],
nationalDrugCode: [{ required: false, message: '贯标国家编码不能为空', trigger: 'blur' }],
partAttributeEnum: [{ required: true, message: '拆分属性不能为空', trigger: 'blur' }],
thoPartAttributeEnum: [
{
required: true,
message: '住院临时医嘱拆分属性不能为空',
trigger: 'blur',
},
],
purchasePrice: [{ required: true, message: '购入价不能为空', trigger: 'blur' }],
retailPrice: [{ required: true, message: '零售价不能为空', trigger: 'blur' }],
ybType: [{ required: true, message: '医保类型不能为空', trigger: 'blur' }],
rxFlag: [{ required: true, message: '处方标志不能为空', trigger: 'blur' }],
chrgitmLv: [{ required: true, message: '医保等级不能为空', trigger: 'blur' }],
typeCode: [{ required: true, message: '财务类型不能为空', trigger: 'blur' }],
},
});
const { form, antibioticForm, rules } = toRefs(data);
const { form, antibioticForm } = toRefs(data);
const props = defineProps({
item: {
@@ -1105,7 +1102,7 @@ const props = defineProps({
function validateMaxUnit(rule, value, callback) {
const numberRegex = /^[0-9]+$/; // 正则表达式,确保输入为数字
if (!numberRegex.test(value)) {
callback(new Error('请输入有效的数字'));
callback(new Error(t('catalog.medicine.validNumber')));
} else {
callback();
}
@@ -1124,7 +1121,7 @@ function getLocationTree() {
}
// 显示弹框
function show(row) {
title.value = '新增药品';
title.value = t('catalog.medicine.addTitle');
activeName.value = 'basic';
getLocationTree();
getDeptTree();
@@ -1184,7 +1181,7 @@ function formatValue(str) {
// 显示弹框
function edit() {
title.value = '编辑药品';
title.value = t('catalog.medicine.editTitle');
reset();
activeName.value = 'basic';
getLocationTree();
@@ -1363,10 +1360,10 @@ function submitForm() {
function handleLvChange(value) {
if (value != 3) {
setTimeout(() => {
data.rules.ybNo = [{ required: true, message: '医保编码不能为空', trigger: 'blur' }];
data.rules.ybNo = [{ required: true, message: t('catalog.medicine.ybCodeRequired'), trigger: 'blur' }];
data.rules.nationalDrugCode = [
{ required: true, message: '贯标国家编码不能为空', trigger: 'blur' },
{ required: true, message: t('catalog.medicine.nationalCodeRequired'), trigger: 'blur' },
];
}, 0);
setTimeout(() => {

View File

@@ -8,7 +8,7 @@
>
<div class="head-container">
<div class="head-title">
药品目录
{{ $t('catalog.medicine.title') }}
</div>
<el-tree
ref="medicationTreeRef"
@@ -38,13 +38,13 @@
<el-row :gutter="24">
<!-- <el-col :span="5"> -->
<el-form-item
label="药品"
:label="$t('catalog.medicine.drugLabel')"
prop="searchKey"
label-width="40"
>
<el-input
v-model="queryParams.searchKey"
placeholder="品名/商品名/英文品名/编码/拼音"
:placeholder="$t('catalog.medicine.searchPlaceholder')"
clearable
style="width: 240px"
@keyup.enter="handleQuery"
@@ -53,7 +53,7 @@
<!-- </el-col> -->
<!-- <el-col :span="5"> -->
<el-form-item
label="状态"
:label="$t('common.status')"
prop="statusEnum"
label-width="100"
>
@@ -72,7 +72,7 @@
<!-- </el-col> -->
<!-- <el-col :span="4"> -->
<el-form-item
label="医保对码"
:label="$t('catalog.medicine.ybMatch')"
prop="ybMatchFlag"
label-width="100"
>
@@ -90,7 +90,7 @@
</el-select>
</el-form-item>
<el-form-item
label="医保接口编号"
:label="$t('catalog.medicine.ybInterfaceNo')"
prop="searchKey"
label-width="120"
>
@@ -103,13 +103,13 @@
/>
</el-form-item>
<el-form-item
label="版本号"
:label="$t('catalog.medicine.versionNo')"
prop="searchKey"
label-width="120"
>
<el-input
v-model="queryParams.v"
placeholder="版本号"
:placeholder="$t('catalog.medicine.versionNo')"
clearable
style="width: 240px"
@keyup.enter="handleQuery"
@@ -134,7 +134,7 @@
icon="Plus"
@click="openAddMedicine"
>
添加新项目
{{ $t('catalog.medicine.addNew') }}
</el-button>
</el-col>
<el-col :span="1.5">
@@ -145,7 +145,7 @@
:disabled="multiple"
@click="handleClose"
>
停用
{{ $t('common.disabled') }}
</el-button>
</el-col>
<el-col :span="1.5">
@@ -156,7 +156,7 @@
:disabled="multiple"
@click="handleStart"
>
启用
{{ $t('common.enabled') }}
</el-button>
</el-col>
@@ -167,7 +167,7 @@
icon="Upload"
@click="handleImport"
>
导入
{{ $t('common.import') }}
</el-button>
</el-col>
@@ -178,7 +178,7 @@
icon="Search"
@click="getList"
>
查询
{{ $t('common.search') }}
</el-button>
</el-col>
<el-col :span="1.5">
@@ -188,7 +188,7 @@
icon="Search"
@click="getYbCatalog"
>
查询目录
{{ $t('catalog.medicine.queryCatalog') }}
</el-button>
</el-col>
<!-- <el-col :span="1.5">
@@ -216,7 +216,7 @@
/>
<vxe-column
key="busNo"
title="药品编号"
:title="$t('catalog.medicine.drugNo')"
align="center"
field="busNo"
show-overflow="title"
@@ -225,7 +225,7 @@
/>
<vxe-column
key="name"
title="药品名称"
:title="$t('catalog.medicine.drugName')"
align="center"
field="name"
show-overflow="title"
@@ -236,7 +236,7 @@
/>
<vxe-column
key="totalVolume"
title="规格"
:title="$t('catalog.medicine.specification')"
align="center"
field="totalVolume"
show-overflow="title"
@@ -245,7 +245,7 @@
/>
<vxe-column
key="statusEnum_enumText"
title="药品状态"
:title="$t('catalog.medicine.drugStatus')"
align="center"
field="statusEnum_enumText"
show-overflow="title"
@@ -269,7 +269,7 @@
</vxe-column>
<vxe-column
key="categoryCode_dictText"
title="药品分类"
:title="$t('catalog.medicine.drugCategory')"
align="center"
field="categoryCode_dictText"
show-overflow="title"
@@ -292,7 +292,7 @@
<vxe-column
key="ybNo"
title="医保编码"
:title="$t('catalog.medicine.ybCode')"
align="center"
field="ybNo"
show-overflow="title"
@@ -300,14 +300,14 @@
/>
<vxe-column
key="ybMatchFlag_enumText"
title="医保是否对码"
:title="$t('catalog.medicine.ybMatchStatus')"
align="center"
field="ybMatchFlag_enumText"
show-overflow="title"
/>
<vxe-column
key="drug69Code"
title="69"
:title="$t('catalog.medicine.code69')"
align="center"
field="drug69Code"
show-overflow="title"
@@ -322,7 +322,7 @@
/> -->
<vxe-column
key="purchasePrice"
title="采购价"
:title="$t('catalog.medicine.purchasePrice')"
align="center"
field="purchasePrice"
show-overflow="title"
@@ -330,14 +330,14 @@
/>
<vxe-column
key="retailPrice"
title="售价"
:title="$t('catalog.medicine.price')"
align="center"
field="retailPrice"
show-overflow="title"
width="90"
/>
<vxe-column
title="操作"
:title="$t('common.operation')"
align="center"
width="150"
class-name="small-padding fixed-width"
@@ -350,7 +350,7 @@
icon="Edit"
@click="openEditMedicine(scope.row)"
>
编辑
{{ $t('common.edit') }}
</el-button>
</template>
</vxe-column>
@@ -414,18 +414,18 @@
<upload-filled />
</el-icon>
<div class="el-upload__text">
将文件拖到此处,或<em>点击上传</em>
{{ $t('catalog.medicine.dragOrClick') }}<em>{{ $t('catalog.medicine.clickUpload') }}</em>
</div>
<template #tip>
<div class="el-upload__tip text-center">
<span>仅允许导入xls、xlsx格式文件。</span>
<span>{{ $t('catalog.medicine.uploadTip') }}</span>
<el-link
type="primary"
:underline="false"
style="font-size: 12px; vertical-align: baseline"
@click="importTemplate"
>
下载模板
{{ $t('catalog.medicine.downloadTemplate') }}
</el-link>
</div>
</template>
@@ -436,10 +436,10 @@
type="primary"
@click="submitFileForm"
>
确 定
{{ $t('common.confirm') }}
</el-button>
<el-button @click="upload.open = false">
取 消
{{ $t('common.cancel') }}
</el-button>
</div>
</template>
@@ -463,8 +463,10 @@ import {
import medicineDialog from './components/medicineDialog';
import MedicineYbDialog from './components/medicineYbDialog';
import {nextTick} from 'vue';
import { useI18n } from 'vue-i18n';
const { proxy } = getCurrentInstance();
const { t } = useI18n();
const medicationList = ref([]);
const open = ref(false);
@@ -534,7 +536,7 @@ const filterNode = (value, data) => {
function getMedicationCategoryList() {
getMedicationCategory().then((response) => {
medicationOptions.value = response.data.medicationCategoryCodeOptions;
medicationOptions.value.unshift({ info: '全部', value: '' });
medicationOptions.value.unshift({ info: t('catalog.medicine.all'), value: '' });
statusFlagOptions.value = response.data.statusFlagOptions;
domainEnumOptions.value = response.data.domainFlagOptions;
supplierListOptions.value = response.data.supplierListOptions;
@@ -577,13 +579,13 @@ function handleQuery() {
function handleStart() {
const startIds = ids.value;
proxy.$modal
.confirm('是否确定启用数据!')
.confirm(t('catalog.medicine.confirmEnable'))
.then(function () {
return startMedication(startIds);
})
.then(() => {
getList();
proxy.$modal.msgSuccess('启用成功');
proxy.$modal.msgSuccess(t('catalog.medicine.enableSuccess'));
})
.catch(() => {});
}
@@ -591,13 +593,13 @@ function handleStart() {
function handleClose() {
const stopIds = ids.value;
proxy.$modal
.confirm('是否确认停用数据!')
.confirm(t('catalog.medicine.confirmDisable'))
.then(function () {
return stopMedication(stopIds);
})
.then(() => {
getList();
proxy.$modal.msgSuccess('停用成功');
proxy.$modal.msgSuccess(t('catalog.medicine.disableSuccess'));
})
.catch(() => {});
}
@@ -614,7 +616,7 @@ function handleExport() {
/** 导入按钮操作 */
function handleImport() {
upload.title = '药品目录导入';
upload.title = t('catalog.medicine.importTitle');
upload.open = true;
}
/** 下载模板操作 */
@@ -638,7 +640,7 @@ const handleFileSuccess = (response, file, fileList) => {
"<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
response.msg +
'</div>',
'导入结果',
t('catalog.medicine.importResult'),
{ dangerouslyUseHTMLString: true }
);
getList();
@@ -687,7 +689,7 @@ function getMedicationInfo(row) {
function submitForm(formData) {
if (formData.id != undefined) {
editMedication(formData).then((response) => {
proxy.$modal.msgSuccess('修改成功');
proxy.$modal.msgSuccess(t('common.message'));
proxy.$refs['medicineRef'].cancel();
open.value = false;
getList();
@@ -697,7 +699,7 @@ function submitForm(formData) {
} else {
addMedication(formData).then((response) => {
if (response.code == 200) {
proxy.$modal.msgSuccess('新增成功');
proxy.$modal.msgSuccess(t('catalog.medicine.addSuccess'));
proxy.$refs['medicineRef'].cancel();
open.value = false;
getList();

View File

@@ -9,10 +9,10 @@
:inline="true"
size="small"
>
<el-form-item label="项目名">
<el-form-item :label="$t('catalog.national.itemName')">
<el-input
v-model="queryParams.searchKey"
placeholder="国临编码/国临名称/医保编码/医保名称"
:placeholder="$t('catalog.national.searchPlaceholder')"
clearable
style="width: 280px"
/>
@@ -24,13 +24,13 @@
icon="Search"
@click="handleQuery"
>
查询
{{ $t('common.search') }}
</el-button>
<el-button
icon="Refresh"
@click="resetQuery"
>
重置
{{ $t('common.reset') }}
</el-button>
</el-form-item>
</el-form>
@@ -46,26 +46,26 @@
icon="Plus"
@click="handleAdd"
>
添加新项目
{{ $t('catalog.national.addNew') }}
</el-button>
<el-button
type="danger"
icon="Stop"
@click="handleDelete"
>
删除
{{ $t('common.delete') }}
</el-button>
<el-button
type="success"
icon="Check"
>
启用
{{ $t('common.enabled') }}
</el-button>
<el-button
type="info"
icon="Download"
>
导入
{{ $t('common.import') }}
</el-button>
</el-col>
@@ -85,7 +85,7 @@
<vxe-column
key="glNo"
field="glNo"
title="国临版疾病编码"
:title="$t('catalog.national.glCode')"
show-overflow="title"
align="center"
width="180"
@@ -94,7 +94,7 @@
<vxe-column
key="glName"
field="glName"
title="国临版疾病名称"
:title="$t('catalog.national.glName')"
show-overflow="title"
align="center"
min-width="200"
@@ -103,7 +103,7 @@
<vxe-column
key="icd10No"
field="icd10No"
title="医保版疾病编码"
:title="$t('catalog.national.icd10Code')"
show-overflow="title"
align="center"
width="180"
@@ -112,13 +112,13 @@
<vxe-column
key="icd10Name"
field="icd10Name"
title="医保版疾病名称"
:title="$t('catalog.national.icd10Name')"
show-overflow="title"
align="center"
min-width="200"
/>
<vxe-column
title="操作"
:title="$t('common.operation')"
width="120"
align="center"
>
@@ -129,7 +129,7 @@
size="small"
@click="handleEdit(scope.row)"
>
编辑
{{ $t('common.edit') }}
</el-button>
</template>
</vxe-column>
@@ -151,7 +151,7 @@
<!-- 添加对话框 -->
<el-dialog
v-model="addDialogVisible"
title="添加国临编码"
:title="$t('catalog.national.addTitle')"
width="600px"
:before-close="handleClose"
>
@@ -163,62 +163,62 @@
size="small"
>
<el-form-item
label="国临版疾病编码"
:label="$t('catalog.national.glCode')"
prop="glNo"
>
<el-input
v-model="addFormData.glNo"
placeholder="请输入国临版疾病编码"
:placeholder="$t('catalog.national.enterGlNo')"
clearable
/>
</el-form-item>
<el-form-item
label="国临版疾病名称"
:label="$t('catalog.national.glName')"
prop="glName"
>
<el-input
v-model="addFormData.glName"
placeholder="请输入国临版疾病名称"
:placeholder="$t('catalog.national.enterGlName')"
clearable
/>
</el-form-item>
<el-form-item
label="医保版疾病编码"
:label="$t('catalog.national.icd10Code')"
prop="icd10No"
>
<el-input
v-model="addFormData.icd10No"
placeholder="请输入医保版疾病编码"
:placeholder="$t('catalog.national.enterIcd10No')"
clearable
/>
</el-form-item>
<el-form-item
label="医保版疾病名称"
:label="$t('catalog.national.icd10Name')"
prop="icd10Name"
>
<el-input
v-model="addFormData.icd10Name"
placeholder="请输入医保版疾病名称"
:placeholder="$t('catalog.national.enterIcd10Name')"
clearable
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="handleClose">
取消
{{ $t('common.cancel') }}
</el-button>
<el-button
type="primary"
@click="handleSubmit"
>
确定
{{ $t('common.confirm') }}
</el-button>
</template>
</el-dialog>
<!-- 编辑对话框 -->
<el-dialog
v-model="editDialogVisible"
title="编辑国临编码"
:title="$t('catalog.national.editTitle')"
width="600px"
:before-close="handleEditClose"
>
@@ -230,55 +230,55 @@
size="small"
>
<el-form-item
label="国临版疾病编码"
:label="$t('catalog.national.glCode')"
prop="glNo"
>
<el-input
v-model="editFormData.glNo"
placeholder="请输入国临版疾病编码"
:placeholder="$t('catalog.national.enterGlNo')"
clearable
/>
</el-form-item>
<el-form-item
label="国临版疾病名称"
:label="$t('catalog.national.glName')"
prop="glName"
>
<el-input
v-model="editFormData.glName"
placeholder="请输入国临版疾病名称"
:placeholder="$t('catalog.national.enterGlName')"
clearable
/>
</el-form-item>
<el-form-item
label="医保版疾病编码"
:label="$t('catalog.national.icd10Code')"
prop="icd10No"
>
<el-input
v-model="editFormData.icd10No"
placeholder="请输入医保版疾病编码"
:placeholder="$t('catalog.national.enterIcd10No')"
clearable
/>
</el-form-item>
<el-form-item
label="医保版疾病名称"
:label="$t('catalog.national.icd10Name')"
prop="icd10Name"
>
<el-input
v-model="editFormData.icd10Name"
placeholder="请输入医保版疾病名称"
:placeholder="$t('catalog.national.enterIcd10Name')"
clearable
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="handleEditClose">
取消
{{ $t('common.cancel') }}
</el-button>
<el-button
type="primary"
@click="handleEditSubmit"
>
确定
{{ $t('common.confirm') }}
</el-button>
</template>
</el-dialog>
@@ -286,13 +286,15 @@
</template>
<script setup name="NationalCode">
import {onMounted, reactive, ref} from 'vue';
import {computed, onMounted, reactive, ref} from 'vue';
import {useRoute, useRouter} from 'vue-router';
import {ElMessage, ElMessageBox} from 'element-plus';
import request from '@/utils/request';
import { useI18n } from 'vue-i18n';
const router = useRouter();
const route = useRoute();
const { t } = useI18n();
// 页面数据
const loading = ref(true);
@@ -323,20 +325,20 @@ const editFormData = reactive({
});
// 表单验证规则
const rules = {
const rules = computed(() => ({
glNo: [
{ required: true, message: '请输入国临版疾病编码', trigger: 'blur' }
{ required: true, message: t('catalog.national.enterGlNo'), trigger: 'blur' }
],
glName: [
{ required: true, message: '请输入国临版疾病名称', trigger: 'blur' }
{ required: true, message: t('catalog.national.enterGlName'), trigger: 'blur' }
],
icd10No: [
{ required: true, message: '请输入医保版疾病编码', trigger: 'blur' }
{ required: true, message: t('catalog.national.enterIcd10No'), trigger: 'blur' }
],
icd10Name: [
{ required: true, message: '请输入医保版疾病名称', trigger: 'blur' }
{ required: true, message: t('catalog.national.enterIcd10Name'), trigger: 'blur' }
]
};
}));
// 查询参数
const queryParams = reactive({
@@ -375,14 +377,14 @@ function handleCurrentChange(current) {
function handleDelete() {
// 安全检查ids.value是否存在且为数组
if (!ids.value || ids.value.length === 0) {
ElMessage.warning('请先选择要删除的数据');
ElMessage.warning(t('catalog.national.selectToDelete'));
return;
}
// 显示确认对话框
ElMessageBox.confirm('确定要删除选中的数据吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
ElMessageBox.confirm(t('catalog.national.confirmDeleteSelected'), t('common.tip'), {
confirmButtonText: t('common.confirm'),
cancelButtonText: t('common.cancel'),
type: 'warning'
}).then(() => {
loading.value = true;
@@ -392,7 +394,7 @@ function handleDelete() {
if (validIds.length === 0) {
loading.value = false;
ElMessage.warning('没有有效的数据可删除');
ElMessage.warning(t('catalog.national.noValidData'));
return;
}
@@ -407,18 +409,18 @@ function handleDelete() {
}).then(res => {
loading.value = false;
if (res.code === 200) {
ElMessage.success('删除成功');
ElMessage.success(t('catalog.national.deleteSuccess'));
// 刷新列表
getList();
// 清空选中状态
ids.value = [];
} else {
ElMessage.error(res.msg || '删除失败');
ElMessage.error(res.msg || t('catalog.national.deleteFailed'));
}
}).catch(error => {
loading.value = false;
console.error('删除数据失败:', error);
ElMessage.error('删除失败,请稍后重试');
ElMessage.error(t('catalog.national.deleteFailedRetry'));
});
}).catch(() => {
// 用户取消删除操作
@@ -492,16 +494,16 @@ function handleEditSubmit() {
loading.value = false;
if (res.code === 200) {
console.log('编辑国临编码成功');
ElMessage.success('编辑成功');
ElMessage.success(t('catalog.national.editSuccess'));
editDialogVisible.value = false;
getList();
} else {
ElMessage.error(res.msg || '编辑失败');
ElMessage.error(res.msg || t('catalog.national.editFailed'));
}
}).catch(error => {
loading.value = false;
console.error('编辑国临编码失败:', error);
ElMessage.error('编辑失败,请稍后重试');
ElMessage.error(t('catalog.national.editFailedRetry'));
});
}
});
@@ -514,7 +516,7 @@ function handleSubmit() {
// 先进行查重校验
checkAddDuplicate().then(isDuplicate => {
if (isDuplicate) {
ElMessage.warning('该项目已存在,请检查国临编码或医保编码是否重复');
ElMessage.warning(t('catalog.national.duplicateWarning'));
return;
}
@@ -528,23 +530,23 @@ function handleSubmit() {
loading.value = false;
if (res.code === 200) {
// 成功提示
ElMessage.success('添加成功');
ElMessage.success(t('catalog.national.addSuccess'));
// 关闭对话框
addDialogVisible.value = false;
// 刷新列表
getList();
} else {
// 失败提示
ElMessage.error(res.msg || '添加失败');
ElMessage.error(res.msg || t('catalog.national.addFailed'));
}
}).catch(error => {
loading.value = false;
console.error('添加国临编码失败:', error);
ElMessage.error('添加失败,请稍后重试');
ElMessage.error(t('catalog.national.addFailedRetry'));
});
}).catch(error => {
console.error('查重校验失败:', error);
ElMessage.error('校验失败,请稍后重试');
ElMessage.error(t('catalog.national.checkFailedRetry'));
});
}
});

View File

@@ -2,16 +2,16 @@
<div class="app-container">
<el-card shadow="never">
<template #header>
<span class="card-title">服务目录</span>
<span class="card-title">{{ $t('catalog.service.title') }}</span>
</template>
<el-form
:inline="true"
:model="queryParams"
>
<el-form-item label="搜索">
<el-form-item :label="$t('common.search')">
<el-input
v-model="queryParams.searchKey"
placeholder="服务名称/编码"
:placeholder="$t('catalog.service.searchPlaceholder')"
clearable
@keyup.enter="handleQuery"
/>
@@ -22,14 +22,14 @@
icon="Search"
@click="handleQuery"
>
搜索
{{ $t('common.search') }}
</el-button>
<el-button
type="success"
icon="Plus"
@click="handleAdd"
>
新增
{{ $t('common.add') }}
</el-button>
</el-form-item>
</el-form>
@@ -40,41 +40,41 @@
>
<vxe-column
type="seq"
title="序号"
:title="$t('catalog.service.seq')"
width="60"
/>
<vxe-column
field="itemCode"
title="服务编码"
:title="$t('catalog.service.code')"
/>
<vxe-column
field="itemName"
title="服务名称"
:title="$t('catalog.service.name')"
/>
<vxe-column
field="itemSpec"
title="规格"
:title="$t('catalog.service.spec')"
/>
<vxe-column
field="unit"
title="单位"
:title="$t('catalog.service.unit')"
/>
<vxe-column
field="price"
title="价格"
:title="$t('catalog.service.price')"
/>
<vxe-column
field="status"
title="状态"
:title="$t('common.status')"
>
<template #default="{ row }">
<el-tag :type="row.status === '0' ? 'success' : 'danger'">
{{ row.status === '0' ? '正常' : '停用' }}
{{ row.status === '0' ? $t('common.normal') : $t('common.disabled') }}
</el-tag>
</template>
</vxe-column>
<vxe-column
title="操作"
:title="$t('common.operation')"
width="150"
>
<template #default="{ row }">
@@ -83,14 +83,14 @@
link
@click="handleEdit(row)"
>
编辑
{{ $t('common.edit') }}
</el-button>
<el-button
type="danger"
link
@click="handleDelete(row)"
>
删除
{{ $t('common.delete') }}
</el-button>
</template>
</vxe-column>
@@ -102,6 +102,9 @@
import { ref, onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getList, remove } from './components/api'
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const queryParams = ref({ searchKey: '', pageNum: 1, pageSize: 10 })
const tableData = ref([])
const handleQuery = async () => {
@@ -110,12 +113,12 @@ const handleQuery = async () => {
tableData.value = res.data?.records || res.data || []
} catch (e) { tableData.value = [] }
}
const handleAdd = () => { ElMessage.info('新增功能开发中') }
const handleEdit = (row) => { ElMessage.info('编辑功能开发中') }
const handleAdd = () => { ElMessage.info(t('catalog.service.developing')) }
const handleEdit = (row) => { ElMessage.info(t('catalog.service.developing')) }
const handleDelete = async (row) => {
await ElMessageBox.confirm('确认删除?', '提示', { type: 'warning' })
await ElMessageBox.confirm(t('common.confirmDelete'), t('common.tip'), { type: 'warning' })
await remove(row.id)
ElMessage.success('删除成功')
ElMessage.success(t('catalog.service.deleteSuccess'))
handleQuery()
}
onMounted(() => handleQuery())

View File

@@ -148,8 +148,8 @@ const priorityTagType = (priority) => {
}
const priorityLabel = (priority) => {
const map = { 2: '最高', 1: '紧急', 0: '普通' }
return map[priority] || '普通'
const map = { 2: t('cdss.rules.priorityHighest'), 1: t('cdss.rules.priorityUrgent'), 0: t('cdss.rules.priorityNormal') }
return map[priority] || t('cdss.rules.priorityNormal')
}
const getList = async () => {