完善药方

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_API_URL=http://192.168.1.131:9200/api
#VITE_SERVER_API_URL=http://127.0.0.1:8000/api
#VITE_API_URL=http://127.0.0.1:9200/api
#VITE_API_URL=https://cms-api.s209.websoft.top/api
VITE_API_URL=https://clinic-api.websoft.top/api

View File

@@ -8,7 +8,7 @@ VITE_DOMAIN=https://your-domain.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
# 应用密钥

View File

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

View File

@@ -19,40 +19,18 @@
styleResponsive ? { md: 19, sm: 19, xs: 24 } : { flex: '1' }
"
>
<a-form-item label="患者" name="userId">
<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-form-item label="处方编号" name="orderNo">
<a-input
allow-clear
placeholder="请输入订单编号"
v-model:value="form.orderNo"
/>
</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-input
allow-clear
placeholder="请输入处方类型 0中药 1西药"
v-model:value="form.prescriptionType"
/>
<a-select v-model:value="form.prescriptionType">
<a-select-option :value="0">中药</a-select-option>
<a-select-option :value="1">西药</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="诊断结果" name="diagnosis">
<a-input
@@ -75,85 +53,139 @@
v-model:value="form.decoctionInstructions"
/>
</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 label="处方药品" name="items">
<div class="medicine-list">
<template v-if="form.items.length">
<div
class="medicine-row"
v-for="item in form.items"
:key="item._key"
>
<a-space :size="12" style="width: 100%" align="center">
<a-select
show-search
allow-clear
placeholder="请选择药品"
v-model:value="item.medicineId"
:options="medicineSelectOptions"
:filter-option="filterMedicineOption"
:loading="medicineLoading"
option-filter-prop="label"
style="flex: 1"
/>
<a-input-number
:min="1"
:precision="0"
placeholder="数量"
v-model:value="item.quantity"
style="width: 120px"
/>
<a-button type="link" danger @click="removeMedicineItem(item._key)">
删除
</a-button>
</a-space>
</div>
</template>
<div v-else class="medicine-empty">尚未选择药品请先添加</div>
<a-button
type="dashed"
block
@click="addMedicineItem"
style="margin-top: 8px"
>
添加药品
</a-button>
</div>
</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>
</ele-modal>
</template>
<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 { assignObject, uuid } from 'ele-admin-pro';
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 { storeToRefs } from 'pinia';
import { ItemType } from 'ele-admin-pro/es/ele-image-upload/types';
import { FormInstance } from 'ant-design-vue/es/form';
import { FileRecord } from '@/api/system/file/model';
type PrescriptionMedicineFormItem = Pick<
ClinicPrescriptionItem,
'id' | 'medicineId' | 'quantity'
> & {
_key: string;
};
// 是否是修改
const isUpdate = ref(false);
const useForm = Form.useForm;
@@ -182,7 +214,11 @@
const images = ref<ItemType[]>([]);
// 用户信息
const form = reactive<ClinicPrescription>({
const form = reactive<
ClinicPrescription & {
items: PrescriptionMedicineFormItem[];
}
>({
id: undefined,
userId: undefined,
doctorId: undefined,
@@ -202,8 +238,55 @@
createTime: undefined,
updateTime: undefined,
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 */
const updateVisible = (value: boolean) => {
@@ -233,8 +316,16 @@
.validate()
.then(() => {
loading.value = true;
const formData = {
...form
const itemsPayload = form.items
.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;
saveOrUpdate(formData)
@@ -257,16 +348,35 @@
(visible) => {
if (visible) {
images.value = [];
loadMedicineOptions();
if (props.data) {
assignObject(form, props.data);
form.items = (props.data.items ?? []).map((item) => createMedicineItem(item));
isUpdate.value = true;
} else {
isUpdate.value = false;
form.items = [];
}
} else {
resetFields();
form.items = [];
}
},
{ immediate: true }
);
</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',
width: 90,
},
// {
// title: '患者',
// dataIndex: 'userId',
// key: 'userId',
// width: 120
// },
// {
// title: '医生',
// dataIndex: 'doctorId',
// key: 'doctorId',
// width: 120
// },
{
title: '患者',
dataIndex: 'userId',
key: 'userId',
width: 120
},
{
title: '医生',
dataIndex: 'doctorId',
key: 'doctorId',
width: 120
},
{
title: '订单编号',
title: '药方编号',
dataIndex: 'orderNo',
key: 'orderNo',
ellipsis: true
},
{
title: '关联就诊表',
dataIndex: 'visitRecordId',
key: 'visitRecordId',
width: 120
},
// {
// title: '关联就诊表',
// dataIndex: 'visitRecordId',
// key: 'visitRecordId',
// width: 120
// },
{
title: '处方类型',
dataIndex: 'prescriptionType',
key: 'prescriptionType',
width: 120
},
{
title: '诊断结果',
dataIndex: 'diagnosis',
key: 'diagnosis',
ellipsis: true
width: 120,
customRender: ({ text }) => ['中药', '西药'][text]
},
// {
// title: '诊断结果',
// dataIndex: 'diagnosis',
// key: 'diagnosis',
// ellipsis: true
// },
{
title: '治疗方案',
dataIndex: 'treatmentPlan',
@@ -153,24 +154,24 @@
key: 'decoctionInstructions',
ellipsis: true
},
{
title: '订单总金额',
dataIndex: 'orderPrice',
key: 'orderPrice',
width: 120
},
{
title: '单价',
dataIndex: 'price',
key: 'price',
width: 120
},
{
title: '实付金额',
dataIndex: 'payPrice',
key: 'payPrice',
width: 120
},
// {
// title: '订单总金额',
// dataIndex: 'orderPrice',
// key: 'orderPrice',
// width: 120
// },
// {
// title: '单价',
// dataIndex: 'price',
// key: 'price',
// width: 120
// },
// {
// title: '实付金额',
// dataIndex: 'payPrice',
// key: 'payPrice',
// width: 120
// },
// {
// title: '是否失效',
// dataIndex: 'isInvalid',