hospital-admin/src/components/addVisitConfigModal.vue
zoujiandong 1863bdde50 6.17
2024-06-17 10:31:22 +08:00

412 lines
11 KiB
Vue

<template>
<!-- Modal -->
<a-modal
v-model:visible="modalVisible"
fullscreen
:title="title"
title-align="start"
:footer="false"
@cancel="handleClose"
>
<a-form
:model="modalForm"
ref="modalFormRefConfig"
:auto-label-width="true"
:rules="rules"
>
<div class="titlebox" style="margin-bottom: 35px">
<div class="bar"></div>
<div class="name">随访包配置信息</div>
</div>
<a-row :gutter="24">
<a-col :span="12">
<a-form-item field="doctor_id" label="选择医生:">
<a-select
v-model="modalForm.doctor_id"
placeholder="请选择医生"
allow-search
:loading="loading"
@search="handleGetDoctor"
@change="changeDoctor"
>
<a-option
v-for="item in doctorList"
:key="item.doctor_id"
:value="item.doctor_id"
:label="item.user_name"
>
{{ item.user_name }}
</a-option>
</a-select>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="12">
<a-form-item field="monthly_frequency" label="每月次数:">
<div class="row">
<a-input-number
v-model="modalForm.monthly_frequency"
:style="{ width: '320px' }"
placeholder="请输入每月次数"
class="input-demo-num"
:step="1"
:precision="0"
:min="0"
/>
<span>0表示不限次数</span>
</div>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="12">
<a-form-item field="service_rounds" label="每次问诊回合数:">
<div class="row">
<a-input-number
v-model="modalForm.service_rounds"
:style="{ width: '320px' }"
placeholder="请输入每次问诊回合数"
class="input-demo-num "
:step="1"
:precision="0"
:min="0"
/>
<span>0表示不限回合数</span>
</div>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="12">
<a-form-item
field="doctor_config_follow_package_item"
label="服务包明细:"
>
<div>
<a-space style="margin-bottom: 10px" v-if="package_data.length<4">
<a-button type="primary" @click="addPackage">添加</a-button>
</a-space>
<a-table
:columns="package_columns"
:data="package_data"
style="width: 100%"
:pagination="false"
>
<template #service_period="{ record }">
<a-select
v-model="record.service_period"
placeholder="请选择周期"
>
<a-option :key="30" :value="30" label="30" :disabled="selectData.includes(30)">30 </a-option>
<a-option :key="90" :value="90" label="90" :disabled="selectData.includes(90)">90 </a-option>
<a-option :key="180" :value="180" label="180" :disabled="selectData.includes(180)">180 </a-option>
<a-option :key="360" :value="360" label="360" :disabled="selectData.includes(360)">360 </a-option>
</a-select>
</template>
<template #service_price="{ record }">
<div class="box" >
<a-input-number v-model="record.service_price" :min="0" />
<span class="tips" >建议价格设置为:{{ }}
<span v-if="record.service_period==30">{{tuwenPrice*10*0.5.toFixed(2)}}</span>
<span v-else-if="record.service_period==90">{{tuwenPrice*30*0.4.toFixed(2)}}</span>
<span v-else-if="record.service_period==180">{{tuwenPrice*60*0.3.toFixed(2)}}</span>
<span v-else-if="record.service_period==360">{{ tuwenPrice*120*0.2.toFixed(2) }}</span>
<span v-else>单次图文*10次*0.5</span>
</span>
</div>
</template>
<template #action="{ record }">
<a-button
type="primary"
status="danger"
@click="removePackage(record.follow_package_item_id)"
>删除</a-button
>
</template>
</a-table>
</div>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="12">
<a-form-item field="is_enable" label="状态:">
<a-switch
v-model="modalForm.is_enable"
:checked-value="1"
:unchecked-value="0"
/>
</a-form-item>
</a-col>
</a-row>
<a-divider />
</a-form>
<div class="titlebox">
<div class="bar"></div>
<div class="name">操作</div>
</div>
<a-row :gutter="24" style="margin-top: 35px">
<a-col :span="24">
<a-form-item field="" label="" no-style>
<a-space>
<a-button
type="primary"
@click="handleSubmit"
v-has="'admin:sysVisitconfigList:save'"
>保存</a-button
>
</a-space>
</a-form-item>
</a-col>
</a-row>
</a-modal>
</template>
<script setup>
import {
ref,
toRefs,
watch,
getCurrentInstance,
reactive,
computed,
defineExpose,
} from 'vue';
import {
addVisitConfig,
updateVisitConfig,
getDoctorList,
} from '@/api/inquiry/service';
import { parseTime } from '@/utils/parseTime';
import {getInquiryconfigDetail} from "@/api/inquiry/config"
const { proxy } = getCurrentInstance();
const package_data = ref([]);
const tuwenPrice=ref(null);
const props = defineProps({
// 是否显示
modalVisible: {
type: Boolean,
default: false,
},
id: {
type: String,
default: '',
},
modalForm: {
type: Object,
default: {
user_id: '',
},
},
});
const title = ref('添加问诊配置');
const loading = ref(false);
const doctorList = ref([]);
const slectData=ref([]);
const handleGetDoctor = async (name = '', id = '') => {
loading.value = true;
const { code, data } = await getDoctorList({
user_name: name,
doctor_id: id,
});
if (code == 200) {
doctorList.value = data;
}
loading.value = false;
};
const selectData= computed(() => {
return package_data.value.map(item=>item.service_period)
})
const addPackage = () => {
if(!modalForm.value.doctor_id){
proxy.$message.warning('请先选择医生');
return false
}
package_data.value.push({
service_period: null,
service_price:null,
follow_package_item_id: new Date().getTime(),
});
};
const removePackage = (id) => {
let arr = package_data.value;
for (let i = 0; i < arr.length; i++) {
if (arr[i].follow_package_item_id == id) {
package_data.value.splice(i, 1);
break;
}
}
};
const reset = () => {
package_data.value = [];
};
const configDetail=async()=>{
const {code,data}=await getInquiryconfigDetail({
inquiry_config_id:'',
inquiry_type:1,
inquiry_mode:1,
doctor_id:modalForm.doctor_id
});
if(code==200){
if(data.inquiry_price){
tuwenPrice.value=data.inquiry_price;
}else{
proxy.$message.warning('该医生需要开启图文问诊,才能开通此服务');
}
let itemname = props.modalForm.doctor_config_follow_package_item;
if (itemname) {
package_data.value = itemname.map((item) => {
return {
service_period: item.service_period,
service_price: item.service_price,
follow_package_item_id: item.follow_package_item_id,
};
});
}
}
}
const package_columns = [
// {
// title: '服务包名称',
// dataIndex: 'name',
// slotName: 'name'
// },
{
title: '服务包周期(天)',
dataIndex: 'service_period',
slotName: 'service_period',
},
{
title: '服务价格(元)',
dataIndex: 'service_price',
slotName: 'service_price',
},
{
title: '操作',
dataIndex: 'action',
slotName: 'action',
},
];
const changeDoctor=()=>{
configDetail();
}
const { modalVisible, id, modalForm } = toRefs(props);
const emits = defineEmits(['healthVisibleChange', 'freshList']);
watch(
() => props.id,
(newVal, oldValval) => {
if (props.id) {
title.value = '修改随访包配置';
} else {
title.value = '添加随访包配置';
handleGetDoctor();
}
},
{ immediate: true }
);
watch(
() => props.modalForm,
(newVal, oldValval) => {
if (props.modalForm.doctor_inquiry_config) {
handleGetDoctor('', props.modalForm.doctor_inquiry_config.doctor_id);
changeDoctor();
}
},
{ immediate: true, deep: true }
);
// Akiraka 20230210 关闭弹窗
const handleClose = () => {
proxy.$refs.modalFormRefConfig.resetFields();
reset();
emits('healthVisibleChange', false);
};
const handleSubmit = () => {
proxy.$refs.modalFormRefConfig.validate(async (valid) => {
let data = null;
if(package_data.value.length==0){
proxy.$message.warning('请添加服务包明细');
return false
}
for (let i = 0; i < package_data.value.length; i++) {
if(!package_data.value[i].service_period){
proxy.$message.warning('服务周期不能为空');
return false
};
if(!package_data.value[i].service_price){
proxy.$message.warning('服务价格不能为空');
return false
};
}
let { doctor_id, monthly_frequency, service_rounds, is_enable } =
modalForm.value;
let obj = {
doctor_id,
monthly_frequency,
service_rounds,
is_enable,
doctor_config_follow_package_item: package_data.value,
};
if (!valid) {
if (props.id) {
data = await updateVisitConfig(props.id, obj);
} else {
data = await addVisitConfig(obj);
}
if (data.code == 200) {
props.id
? proxy.$message.success('修改成功')
: proxy.$message.success('添加成功');
emits('freshList', '');
}
handleClose();
} else {
console.log(valid);
proxy.$message.error('表单校验失败');
//done(false);
}
});
};
const rules = {
monthly_frequency: [{ required: true, message: '请选择每月次数' }],
doctor_id: [{ required: true, message: '请选择医生' }],
service_rounds: [{ required: true, message: '请输入服务回合数' }],
is_enable: [{ required: true, message: '请选择状态' }],
//doctor_config_follow_package_item:[{type:Array, required: true, message: '请添加服务包明细' }]
};
defineExpose({
reset,
});
</script>
<style scoped>
.row{
display: flex;
flex-direction: column;
}
.row span{
font-size: 12px;
color:#999;
}
.box{
margin-top: 20px;
}
.box.active{
margin-top: 0px;
}
.tips{
color:red;
font-size: 12px;
}
</style>