完善药方

This commit is contained in:
2025-12-01 10:14:28 +08:00
parent 562b020e57
commit 90b89f92d4
5 changed files with 256 additions and 144 deletions

View File

@@ -1,6 +1,4 @@
VITE_APP_NAME=后台管理(开发环境) VITE_APP_NAME=后台管理(开发环境)
#VITE_API_URL=http://192.168.1.131:9200/api #VITE_API_URL=http://127.0.0.1:9200/api
#VITE_SERVER_API_URL=http://127.0.0.1:8000/api
VITE_API_URL=https://clinic-api.websoft.top/api
#VITE_API_URL=https://cms-api.s209.websoft.top/api

View File

@@ -8,7 +8,7 @@ VITE_DOMAIN=https://your-domain.com
VITE_FILE_SERVER=https://your-file-server.com VITE_FILE_SERVER=https://your-file-server.com
# 租户配置 # 租户配置
VITE_TENANT_ID=your_tenant_id VITE_TENANT_ID=VITE_TENANT_ID
VITE_TEMPLATE_ID=10258 VITE_TEMPLATE_ID=10258
# 应用密钥 # 应用密钥

View File

@@ -1,4 +1,5 @@
import type { PageParam } from '@/api'; import type { PageParam } from '@/api';
import type { ClinicPrescriptionItem } from '../../clinicPrescriptionItem/model';
/** /**
* 处方主表 * 处方主表
@@ -45,6 +46,8 @@ export interface ClinicPrescription {
createTime?: string; createTime?: string;
// 修改时间 // 修改时间
updateTime?: string; updateTime?: string;
// 处方药品
items?: ClinicPrescriptionItem[];
} }
/** /**

View File

@@ -19,40 +19,18 @@
styleResponsive ? { md: 19, sm: 19, xs: 24 } : { flex: '1' } styleResponsive ? { md: 19, sm: 19, xs: 24 } : { flex: '1' }
" "
> >
<a-form-item label="患者" name="userId"> <a-form-item label="处方编号" name="orderNo">
<a-input
allow-clear
placeholder="请输入患者"
v-model:value="form.userId"
/>
</a-form-item>
<a-form-item label="医生" name="doctorId">
<a-input
allow-clear
placeholder="请输入医生"
v-model:value="form.doctorId"
/>
</a-form-item>
<a-form-item label="订单编号" name="orderNo">
<a-input <a-input
allow-clear allow-clear
placeholder="请输入订单编号" placeholder="请输入订单编号"
v-model:value="form.orderNo" v-model:value="form.orderNo"
/> />
</a-form-item> </a-form-item>
<a-form-item label="关联就诊表" name="visitRecordId">
<a-input
allow-clear
placeholder="请输入关联就诊表"
v-model:value="form.visitRecordId"
/>
</a-form-item>
<a-form-item label="处方类型 0中药 1西药" name="prescriptionType"> <a-form-item label="处方类型 0中药 1西药" name="prescriptionType">
<a-input <a-select v-model:value="form.prescriptionType">
allow-clear <a-select-option :value="0">中药</a-select-option>
placeholder="请输入处方类型 0中药 1西药" <a-select-option :value="1">西药</a-select-option>
v-model:value="form.prescriptionType" </a-select>
/>
</a-form-item> </a-form-item>
<a-form-item label="诊断结果" name="diagnosis"> <a-form-item label="诊断结果" name="diagnosis">
<a-input <a-input
@@ -75,85 +53,139 @@
v-model:value="form.decoctionInstructions" v-model:value="form.decoctionInstructions"
/> />
</a-form-item> </a-form-item>
<a-form-item label="订单总金额" name="orderPrice"> <a-form-item label="处方药品" name="items">
<a-input <div class="medicine-list">
allow-clear <template v-if="form.items.length">
placeholder="请输入订单总金额" <div
v-model:value="form.orderPrice" class="medicine-row"
/> v-for="item in form.items"
</a-form-item> :key="item._key"
<a-form-item label="单价" name="price"> >
<a-input <a-space :size="12" style="width: 100%" align="center">
allow-clear <a-select
placeholder="请输入单价" show-search
v-model:value="form.price" allow-clear
/> placeholder="请选择药品"
</a-form-item> v-model:value="item.medicineId"
<a-form-item label="实付金额" name="payPrice"> :options="medicineSelectOptions"
<a-input :filter-option="filterMedicineOption"
allow-clear :loading="medicineLoading"
placeholder="请输入实付金额" option-filter-prop="label"
v-model:value="form.payPrice" style="flex: 1"
/> />
</a-form-item> <a-input-number
<a-form-item label="订单是否失效(0未失效 1已失效)" name="isInvalid"> :min="1"
<a-input :precision="0"
allow-clear placeholder="数量"
placeholder="请输入订单是否失效(0未失效 1已失效)" v-model:value="item.quantity"
v-model:value="form.isInvalid" style="width: 120px"
/> />
</a-form-item> <a-button type="link" danger @click="removeMedicineItem(item._key)">
<a-form-item label="结算(0未结算 1已结算)" name="isSettled"> 删除
<a-input </a-button>
allow-clear </a-space>
placeholder="请输入结算(0未结算 1已结算)" </div>
v-model:value="form.isSettled" </template>
/> <div v-else class="medicine-empty">尚未选择药品请先添加</div>
</a-form-item> <a-button
<a-form-item label="结算时间" name="settleTime"> type="dashed"
<a-input block
allow-clear @click="addMedicineItem"
placeholder="请输入结算时间" style="margin-top: 8px"
v-model:value="form.settleTime" >
/> 添加药品
</a-form-item> </a-button>
<a-form-item label="状态, 0正常, 1已完成2已支付3已取消" name="status"> </div>
<a-radio-group v-model:value="form.status">
<a-radio :value="0">显示</a-radio>
<a-radio :value="1">隐藏</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item label="备注" name="comments">
<a-textarea
:rows="4"
:maxlength="200"
placeholder="请输入描述"
v-model:value="form.comments"
/>
</a-form-item>
<a-form-item label="修改时间" name="updateTime">
<a-input
allow-clear
placeholder="请输入修改时间"
v-model:value="form.updateTime"
/>
</a-form-item> </a-form-item>
<!-- <a-form-item label="订单总金额" name="orderPrice">-->
<!-- <a-input-->
<!-- allow-clear-->
<!-- placeholder="请输入订单总金额"-->
<!-- v-model:value="form.orderPrice"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="单价" name="price">-->
<!-- <a-input-->
<!-- allow-clear-->
<!-- placeholder="请输入单价"-->
<!-- v-model:value="form.price"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="实付金额" name="payPrice">-->
<!-- <a-input-->
<!-- allow-clear-->
<!-- placeholder="请输入实付金额"-->
<!-- v-model:value="form.payPrice"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="订单是否失效(0未失效 1已失效)" name="isInvalid">-->
<!-- <a-input-->
<!-- allow-clear-->
<!-- placeholder="请输入订单是否失效(0未失效 1已失效)"-->
<!-- v-model:value="form.isInvalid"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="结算(0未结算 1已结算)" name="isSettled">-->
<!-- <a-input-->
<!-- allow-clear-->
<!-- placeholder="请输入结算(0未结算 1已结算)"-->
<!-- v-model:value="form.isSettled"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="结算时间" name="settleTime">-->
<!-- <a-input-->
<!-- allow-clear-->
<!-- placeholder="请输入结算时间"-->
<!-- v-model:value="form.settleTime"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="状态, 0正常, 1已完成2已支付3已取消" name="status">-->
<!-- <a-radio-group v-model:value="form.status">-->
<!-- <a-radio :value="0">显示</a-radio>-->
<!-- <a-radio :value="1">隐藏</a-radio>-->
<!-- </a-radio-group>-->
<!-- </a-form-item>-->
<!-- <a-form-item label="备注" name="comments">-->
<!-- <a-textarea-->
<!-- :rows="4"-->
<!-- :maxlength="200"-->
<!-- placeholder="请输入描述"-->
<!-- v-model:value="form.comments"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="修改时间" name="updateTime">-->
<!-- <a-input-->
<!-- allow-clear-->
<!-- placeholder="请输入修改时间"-->
<!-- v-model:value="form.updateTime"-->
<!-- />-->
<!-- </a-form-item>-->
</a-form> </a-form>
</ele-modal> </ele-modal>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, reactive, watch } from 'vue'; import { ref, reactive, watch, computed } from 'vue';
import { Form, message } from 'ant-design-vue'; import { Form, message } from 'ant-design-vue';
import { assignObject, uuid } from 'ele-admin-pro'; import { assignObject, uuid } from 'ele-admin-pro';
import { addClinicPrescription, updateClinicPrescription } from '@/api/clinic/clinicPrescription'; import { addClinicPrescription, updateClinicPrescription } from '@/api/clinic/clinicPrescription';
import { ClinicPrescription } from '@/api/clinic/clinicPrescription/model'; import type { ClinicPrescription } from '@/api/clinic/clinicPrescription/model';
import type { ClinicPrescriptionItem } from '@/api/clinic/clinicPrescriptionItem/model';
import { listClinicMedicine } from '@/api/clinic/clinicMedicine';
import type { ClinicMedicine } from '@/api/clinic/clinicMedicine/model';
import { useThemeStore } from '@/store/modules/theme'; import { useThemeStore } from '@/store/modules/theme';
import { storeToRefs } from 'pinia'; import { storeToRefs } from 'pinia';
import { ItemType } from 'ele-admin-pro/es/ele-image-upload/types'; import { ItemType } from 'ele-admin-pro/es/ele-image-upload/types';
import { FormInstance } from 'ant-design-vue/es/form'; import { FormInstance } from 'ant-design-vue/es/form';
import { FileRecord } from '@/api/system/file/model'; import { FileRecord } from '@/api/system/file/model';
type PrescriptionMedicineFormItem = Pick<
ClinicPrescriptionItem,
'id' | 'medicineId' | 'quantity'
> & {
_key: string;
};
// 是否是修改 // 是否是修改
const isUpdate = ref(false); const isUpdate = ref(false);
const useForm = Form.useForm; const useForm = Form.useForm;
@@ -182,7 +214,11 @@
const images = ref<ItemType[]>([]); const images = ref<ItemType[]>([]);
// 用户信息 // 用户信息
const form = reactive<ClinicPrescription>({ const form = reactive<
ClinicPrescription & {
items: PrescriptionMedicineFormItem[];
}
>({
id: undefined, id: undefined,
userId: undefined, userId: undefined,
doctorId: undefined, doctorId: undefined,
@@ -202,8 +238,55 @@
createTime: undefined, createTime: undefined,
updateTime: undefined, updateTime: undefined,
status: 0, status: 0,
comments: '' comments: '',
items: []
}); });
const medicineOptions = ref<ClinicMedicine[]>([]);
const medicineLoading = ref(false);
const medicineSelectOptions = computed(() =>
medicineOptions.value
.filter((item): item is ClinicMedicine & { id: number } => item.id !== undefined)
.map((item) => ({
label: item.name ?? '-',
value: item.id as number,
pinyin: item.pinyin ?? ''
}))
);
const filterMedicineOption = (input: string, option?: Record<string, any>) => {
if (!option) {
return false;
}
const keyword = `${option.label ?? ''} ${option.pinyin ?? ''}`.toLowerCase();
return keyword.includes(input.toLowerCase());
};
const createMedicineItem = (item?: ClinicPrescriptionItem): PrescriptionMedicineFormItem => ({
_key: uuid(),
id: item?.id,
medicineId: item?.medicineId,
quantity: item?.quantity ?? 1
});
const loadMedicineOptions = async () => {
if (medicineLoading.value || medicineOptions.value.length) {
return;
}
medicineLoading.value = true;
try {
medicineOptions.value = await listClinicMedicine();
} catch (e) {
message.error((e as Error).message);
} finally {
medicineLoading.value = false;
}
};
const addMedicineItem = () => {
form.items.push(createMedicineItem());
};
const removeMedicineItem = (key: string) => {
const index = form.items.findIndex((item) => item._key === key);
if (index !== -1) {
form.items.splice(index, 1);
}
};
/* 更新visible */ /* 更新visible */
const updateVisible = (value: boolean) => { const updateVisible = (value: boolean) => {
@@ -233,8 +316,16 @@
.validate() .validate()
.then(() => { .then(() => {
loading.value = true; loading.value = true;
const formData = { const itemsPayload = form.items
...form .filter((item) => item.medicineId)
.map((item) => ({
id: item.id,
medicineId: item.medicineId,
quantity: item.quantity ?? 1
}));
const formData: ClinicPrescription = {
...form,
items: itemsPayload
}; };
const saveOrUpdate = isUpdate.value ? updateClinicPrescription : addClinicPrescription; const saveOrUpdate = isUpdate.value ? updateClinicPrescription : addClinicPrescription;
saveOrUpdate(formData) saveOrUpdate(formData)
@@ -257,16 +348,35 @@
(visible) => { (visible) => {
if (visible) { if (visible) {
images.value = []; images.value = [];
loadMedicineOptions();
if (props.data) { if (props.data) {
assignObject(form, props.data); assignObject(form, props.data);
form.items = (props.data.items ?? []).map((item) => createMedicineItem(item));
isUpdate.value = true; isUpdate.value = true;
} else { } else {
isUpdate.value = false; isUpdate.value = false;
form.items = [];
} }
} else { } else {
resetFields(); resetFields();
form.items = [];
} }
}, },
{ immediate: true } { immediate: true }
); );
</script> </script>
<style scoped>
.medicine-list {
width: 100%;
}
.medicine-row {
margin-bottom: 8px;
}
.medicine-empty {
margin-bottom: 8px;
color: rgba(0, 0, 0, 0.45);
}
</style>

View File

@@ -105,42 +105,43 @@
key: 'id', key: 'id',
width: 90, width: 90,
}, },
// {
// title: '患者',
// dataIndex: 'userId',
// key: 'userId',
// width: 120
// },
// {
// title: '医生',
// dataIndex: 'doctorId',
// key: 'doctorId',
// width: 120
// },
{ {
title: '患者', title: '药方编号',
dataIndex: 'userId',
key: 'userId',
width: 120
},
{
title: '医生',
dataIndex: 'doctorId',
key: 'doctorId',
width: 120
},
{
title: '订单编号',
dataIndex: 'orderNo', dataIndex: 'orderNo',
key: 'orderNo', key: 'orderNo',
ellipsis: true ellipsis: true
}, },
{ // {
title: '关联就诊表', // title: '关联就诊表',
dataIndex: 'visitRecordId', // dataIndex: 'visitRecordId',
key: 'visitRecordId', // key: 'visitRecordId',
width: 120 // width: 120
}, // },
{ {
title: '处方类型', title: '处方类型',
dataIndex: 'prescriptionType', dataIndex: 'prescriptionType',
key: 'prescriptionType', key: 'prescriptionType',
width: 120 width: 120,
}, customRender: ({ text }) => ['中药', '西药'][text]
{
title: '诊断结果',
dataIndex: 'diagnosis',
key: 'diagnosis',
ellipsis: true
}, },
// {
// title: '诊断结果',
// dataIndex: 'diagnosis',
// key: 'diagnosis',
// ellipsis: true
// },
{ {
title: '治疗方案', title: '治疗方案',
dataIndex: 'treatmentPlan', dataIndex: 'treatmentPlan',
@@ -153,24 +154,24 @@
key: 'decoctionInstructions', key: 'decoctionInstructions',
ellipsis: true ellipsis: true
}, },
{ // {
title: '订单总金额', // title: '订单总金额',
dataIndex: 'orderPrice', // dataIndex: 'orderPrice',
key: 'orderPrice', // key: 'orderPrice',
width: 120 // width: 120
}, // },
{ // {
title: '单价', // title: '单价',
dataIndex: 'price', // dataIndex: 'price',
key: 'price', // key: 'price',
width: 120 // width: 120
}, // },
{ // {
title: '实付金额', // title: '实付金额',
dataIndex: 'payPrice', // dataIndex: 'payPrice',
key: 'payPrice', // key: 'payPrice',
width: 120 // width: 120
}, // },
// { // {
// title: '是否失效', // title: '是否失效',
// dataIndex: 'isInvalid', // dataIndex: 'isInvalid',