Files
his/openhis-ui-vue3/src/views/catalog/diagnosistreatment/components/diagnosisTreatmentDialog.vue
2025-09-03 15:54:55 +08:00

613 lines
20 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="app-container">
<!-- 添加或修改用户配置对话框 -->
<el-dialog :title="title" v-model="visible" width="800px" append-to-body>
<el-form
:model="form"
:rules="rules"
ref="diagnosisTreatmentRef"
label-width="110px"
label-position="left"
>
<div class="title">
<el-button
type="primary"
plain
@click="handleImportYb()"
size="small"
style="margin-left: 5px; margin-top: -10px; margin-bottom: 20px"
>从医保目录导入</el-button
>
</div>
<el-row :gutter="24">
<el-col :span="8" v-if="form.id != undefined">
<el-form-item label="编号" prop="busNo">
<el-input v-model="form.busNo" placeholder="请输入编码" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="name">
<el-input v-model="form.name" placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="所属科室" prop="orgId">
<el-tree-select
v-model="form.orgId"
:data="deptOptions"
:props="{
value: 'id',
label: 'name',
children: 'children',
}"
value-key="id"
placeholder="请选择提供部门"
check-strictly
filterable
clearable
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="8">
<el-form-item label="地点" prop="locationId">
<el-tree-select
v-model="form.locationId"
:data="locationOptions"
:props="{
value: 'id',
label: 'name',
children: 'children',
}"
value-key="id"
placeholder="请选择地点"
check-strictly
clearable
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="目录分类" prop="categoryCode">
<el-select v-model="form.categoryCode" clearable filterable :disabled="false">
<el-option
v-for="category in activity_category_code"
:key="category.value"
:label="category.label"
:value="category.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="业务类型" prop="typeEnum">
<el-select v-model="form.typeEnum" placeholder="" clearable filterable>
<el-option
v-for="item in typeEnumOptions"
:key="item.value"
:label="item.info"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<!-- <el-col :span="8">
<el-form-item label="状态" prop="statusEnum">
<el-select v-model="form.statusEnum" clearable>
<el-option
v-for="status in statusFlagOptions"
:key="status.value"
:label="status.info"
:value="status.value"
/>
</el-select>
</el-form-item>
</el-col> -->
</el-row>
<el-row :gutter="24">
<el-col :span="8">
<el-form-item label="医保标记" prop="ybFlag">
<el-checkbox v-model="form.ybFlag"></el-checkbox>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="医保对码标记" prop="ybMatchFlag">
<el-checkbox v-model="form.ybMatchFlag"></el-checkbox>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="医保编码" prop="conditionCode">
<el-input v-model="form.ybNo" placeholder="" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="8">
<el-form-item label="医保类别" prop="ybType">
<el-select
v-model="form.ybType"
placeholder="医保类别"
clearable
filterable
style="width: 240px"
>
<el-option
v-for="dict in med_chrgitm_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="身体部位" prop="bodySiteCode">
<el-tree-select
v-model="form.bodySiteCode"
:data="bodyOptions"
:props="{
value: 'id',
label: 'name',
children: 'children',
}"
value-key="id"
placeholder="请选择身体部位"
check-strictly
filterable
clearable
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="所需标本" prop="specimenCode">
<el-select v-model="form.specimenCode" clearable filterable>
<el-option
v-for="category in specimen_code"
:key="category.value"
:label="category.label"
:value="category.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="8">
<el-form-item label="医保等级" prop="chrgitmLv">
<el-select v-model="form.chrgitmLv" placeholder="" clearable filterable>
<el-option
v-for="item in chrgitm_lv"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<!-- <el-col :span="8">
<el-form-item label="执行科室" prop="ruleId">
<el-select v-model="form.ruleId" placeholder="" clearable>
<el-option
v-for="item in exeOrganizations"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col> -->
<el-col :span="8">
<el-form-item label="使用单位" prop="permittedUnitCode">
<el-select v-model="form.permittedUnitCode" clearable filterable>
<el-option
v-for="category in unit_code"
:key="category.value"
:label="category.label"
:value="category.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="财务类型" prop="itemTypeCode">
<el-select v-model="form.itemTypeCode" clearable filterable>
<el-option
v-for="category in fin_type_code"
:key="category.value"
:label="category.label"
:value="category.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<!-- <el-col :span="8">
<el-form-item label="购入价" prop="purchasePrice">
<el-input
v-model="form.purchasePrice"
placeholder=""
:disabled="form.id != undefined"
/>
</el-form-item>
</el-col> -->
<el-col :span="8">
<el-form-item label="零售价" prop="retailPrice">
<el-input
v-model="form.retailPrice"
placeholder=""
:disabled="false"
@input="updatePrices"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="最高零售价" prop="maximumRetailPrice">
<el-input v-model="form.maximumRetailPrice" placeholder="" :disabled="false" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="划价标记" prop="maximumRetailPrice">
<el-checkbox
v-model="form.pricing_flag"
:true-value="1"
:false-value="0"
></el-checkbox>
</el-form-item>
</el-col>
</el-row>
<div class="treatment-items-section">
<div v-for="(item, index) in treatmentItems" :key="index" class="form-row">
<el-row :gutter="24">
<el-col :span="8">
<el-form-item label="诊疗子项">
<el-select v-model="item.adviceDefinitionId" placeholder="诊疗子项" filterable>
<el-option
v-for="item in diagnosisTreatmentList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="执行次数">
<el-input-number
v-model="item.childrenRequestNum"
controls-position="right"
:min="1"
:max="999"
/>
</el-form-item>
</el-col>
<el-col :span="8" style="display: flex; align-items: center; padding-bottom: 15px">
<el-button @click="addItem" circle type="priamry" size="small" plain icon="Plus" />
<el-button
@click="removeItem(index)"
circle
type="danger"
size="small"
plain
icon="Minus"
/>
</el-col>
</el-row>
</div>
</div>
<el-row :gutter="24">
<el-col :span="16">
<el-form-item label="说明" prop="descriptionText">
<el-input
v-model="form.descriptionText"
:autosize="{ minRows: 4, maxRows: 10 }"
type="textarea"
placeholder=""
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer v-if="title != '查看'">
<div class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="DiagnosisTreatmentDialog">
import {
getDiagnosisTreatmentList,
editDiagnosisTreatment,
addDiagnosisTreatment,
deptTreeSelect,
bodyTreeSelect,
locationTreeSelect,
} from './diagnosistreatment';
const { proxy } = getCurrentInstance();
const { unit_code, med_chrgitm_type, fin_type_code, activity_category_code, chrgitm_lv } =
proxy.useDict(
'unit_code',
'med_chrgitm_type',
'fin_type_code',
'activity_category_code',
'chrgitm_lv'
);
const title = ref('');
const visible = ref(false);
const emits = defineEmits(['submit']); // 声明自定义事件
const categoryCode = ref('');
const deptOptions = ref(undefined); // 部门树选项
const bodyOptions = ref(undefined); // 身体部位树选项
const locationOptions = ref(undefined); // 地点树选项
const diagnosisCategoryOptions = ref(undefined);
const statusFlagOptions = ref(undefined);
const exeOrganizations = ref(undefined);
const typeEnumOptions = ref(undefined);
const diagnosisTreatmentList = ref([]);
const data = reactive({
form: {},
rules: {
// busNo: [{ required: true, message: "编码不能为空", trigger: "blur" }],
name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
// statusEnum: [{ required: true, message: "状态不能为空", trigger: "blur" }],
categoryCode: [{ required: true, message: '诊疗目录不能为空', trigger: 'blur' }],
// typeEnum: [{ required: true, message: '器材种类不能为空', trigger: 'blur' }],
permittedUnitCode: [{ required: true, message: '使用单位不能为空', trigger: 'blur' }],
// ybFlag: [{ required: true, message: "医保标记不能为空", trigger: "blur" }],
// ybMatchFlag: [
// { required: true, message: "医保对码标记不能为空", trigger: "blur" },
// ],
// purchasePrice: [
// { required: true, message: "购入价不能为空", trigger: "blur" },
// ],
retailPrice: [{ required: true, message: '零售价不能为空', trigger: 'blur' }],
// maximumRetailPrice: [{ required: true, message: '最高零售价不能为空', trigger: 'blur' }],
ybType: [{ required: true, message: '医保类型不能为空', trigger: 'blur' }],
chrgitmLv: [{ required: true, message: '医保等级不能为空', trigger: 'blur' }],
itemTypeCode: [{ required: true, message: '财务类型不能为空', trigger: 'blur' }],
},
});
const { queryParams, form, rules } = toRefs(data);
const props = defineProps({
item: {
type: Object,
required: false,
},
title: {
type: String,
required: false,
},
currentCategoryEnum: {
type: String,
required: true,
},
diagnosisCategoryOptions: {
type: Object,
required: false,
},
statusFlagOptions: {
type: Object,
required: false,
},
exeOrganizations: {
type: Object,
required: false,
},
typeEnumOptions: {
type: Object,
required: false,
},
});
// 表单数组,初始一条记录
const treatmentItems = ref([{ adviceDefinitionId: '', childrenRequestNum: 1 }]);
// 添加表单项
function addItem() {
treatmentItems.value.push({ adviceDefinitionId: '', childrenRequestNum: 1 });
}
// 删除表单项
function removeItem(index) {
if (treatmentItems.value.length > 1) {
treatmentItems.value.splice(index, 1);
}
}
function handleImportYb() {
emits('ybDialog');
}
// 显示弹框
function show() {
reset();
getLocationTree();
getItemList();
getBodyTree();
getDeptTree();
title.value = '';
title.value = props.title;
diagnosisCategoryOptions.value = props.diagnosisCategoryOptions;
statusFlagOptions.value = props.statusFlagOptions;
exeOrganizations.value = props.exeOrganizations;
typeEnumOptions.value = props.typeEnumOptions;
form.value.categoryCode = props.currentCategoryEnum;
visible.value = true;
}
function setValue(row) {
form.value = {
name: formatValue(row.medicalServiceName), //医疗服务项目名称
ybNo: formatValue(row.medicalCatalogCode), // 医保编码
categoryCode: props.currentCategoryEnum,
// chrgitmLv: formatValue(
// row.insuranceClass == '甲' ? '1' : row.insuranceClass == '乙' ? '2' : '3'
// ), // 医保等级
};
}
// 显示弹框
function edit() {
reset();
getLocationTree();
getItemList();
getBodyTree();
getDeptTree();
title.value = '';
title.value = props.title;
form.value = props.item;
form.value.chrgitmLv = form.value.chrgitmLv ? form.value.chrgitmLv.toString() : undefined;
treatmentItems.value = props.item.childrenJson
? JSON.parse(props.item.childrenJson)
: [{ adviceDefinitionId: '', childrenRequestNum: 1 }];
form.value.permittedUnitCode = form.value.permittedUnitCode
? form.value.permittedUnitCode.toString()
: undefined;
diagnosisCategoryOptions.value = props.diagnosisCategoryOptions;
statusFlagOptions.value = props.statusFlagOptions;
exeOrganizations.value = props.exeOrganizations;
typeEnumOptions.value = props.typeEnumOptions;
visible.value = true;
}
/** 重置操作表单 */
function reset() {
form.value = {
id: undefined,
busNo: undefined, // 编码
name: undefined, // 名称
locationId: undefined, // 地点
orgId: undefined, // 执行科室
pyStr: undefined, // 拼音码
wbStr: undefined, // 五笔码
categoryCode: undefined, // 类别
typeEnum: undefined, // 类型编码
// statusEnum: undefined, // 状态(包括 1预置2启用3停用
ybFlag: undefined, // 医保标记
ybMatchFlag: undefined, // 医保对码标记
ybNo: undefined, // 医保编码
ybType: undefined, // 医保类型
bodySiteCode: undefined, // 身体部位
specimenCode: undefined, // 所需标本
ruleId: undefined, // 执行科室
permittedUnitCode: undefined, // 使用单位
itemTypeCode: undefined, // 最小收费
// purchasePrice: undefined, // 购入价
retailPrice: undefined, // 零售价
maximumRetailPrice: undefined, // 最高零售价
descriptionText: undefined, // 说明
chrgitmLv: undefined, //医保等级
};
treatmentItems.value = [{ adviceDefinitionId: '', childrenRequestNum: 1 }];
proxy.resetForm('diagnosisTreatmentRef');
}
/** 提交按钮 */
function submitForm() {
form.value.ybFlag ? (form.value.ybFlag = 1) : (form.value.ybFlag = 0);
form.value.ybMatchFlag ? (form.value.ybMatchFlag = 1) : (form.value.ybMatchFlag = 0);
form.value.ruleId ? (form.value.ruleId = 1) : (form.value.ruleId = 0);
form.value.childrenJson =
treatmentItems.value.length > 0 && treatmentItems.value[0].adviceDefinitionId != ''
? JSON.stringify(treatmentItems.value)
: undefined;
proxy.$refs['diagnosisTreatmentRef'].validate((valid) => {
if (valid) {
if (form.value.id != undefined) {
editDiagnosisTreatment(form.value).then((response) => {
// 触发自定义事件,并传递数据给父组件
emits('submit');
proxy.$modal.msgSuccess('修改成功');
visible.value = false;
reset(); // 重置表单数据
});
} else {
addDiagnosisTreatment(form.value).then((response) => {
// 触发自定义事件,并传递数据给父组件
emits('submit');
proxy.$modal.msgSuccess('新增成功');
visible.value = false;
reset(); // 重置表单数据
});
}
}
});
}
/** 查询部门下拉树结构 */
function getDeptTree() {
deptTreeSelect().then((response) => {
console.log(response, 'response查询部门下拉树结构');
deptOptions.value = response.data.records;
});
}
/** 查询身体部位拉树结构 */
function getBodyTree() {
bodyTreeSelect().then((response) => {
console.log(response, 'response查询身体部位下拉树结构');
bodyOptions.value = response.data.records;
});
}
/** 查询地点下拉树结构 */
function getLocationTree() {
locationTreeSelect({ formList: '8,4,10' }).then((response) => {
console.log(response, 'response查询部门下拉树结构');
locationOptions.value = response.data.records;
});
}
/** 取消按钮 */
function cancel() {
visible.value = false;
reset();
}
// 获取诊疗子项列表,只筛出无子项的数据
function getItemList() {
getDiagnosisTreatmentList({ statusEnum: 2, pageSize: 1000, pageNo: 1 }).then((res) => {
diagnosisTreatmentList.value = res.data.records.filter((item) => {
return item.childrenJson == null;
});
});
}
function formatValue(str) {
if (str === null || str === undefined || str === '' || str === 'null') {
return undefined;
}
return str;
}
// 在这里可以根据购入价来更新零售价
function updatePrices(value) {
form.value.maximumRetailPrice = form.value.retailPrice;
}
defineExpose({
show,
edit,
setValue,
});
</script>
<style scoped>
.el-form--inline .el-form-item {
display: inline-flex;
vertical-align: middle;
margin-right: 10px !important;
}
/* 使用深度选择器 */
.custom-label-spacing :deep(.el-form-item__label) {
line-height: 1.2; /* 调整行间距 */
margin-bottom: 4px; /* 调整 label 和输入框之间的间距 */
}
</style>