1. 修复了接诊页面的剂量、天数输入框过窄

This commit is contained in:
李琦
2026-07-15 08:46:37 +08:00
parent 8eca0bd84d
commit 5ff6f0d837
10 changed files with 358 additions and 108 deletions

View File

@@ -0,0 +1,96 @@
<script lang="ts" setup>
import { computed, ref } from 'vue';
import { useVbenModal } from '@vben/common-ui';
import { Form, Input, InputNumber, message } from 'ant-design-vue';
import {
stockInDeliveryWarehouseDrug,
stockOutDeliveryWarehouseDrug,
} from '#/views/system/delivery-warehouse-stock/api';
defineOptions({ name: 'DeliveryWarehouseStockIoModal' });
const mode = ref<'in' | 'out'>('in');
const row = ref<Record<string, any>>({});
const qty = ref<number>(1);
const remark = ref('');
const reloadFn = ref<null | (() => void)>(null);
const title = computed(() =>
mode.value === 'in' ? '手动入库' : '手动出库',
);
const [Modal, modalApi] = useVbenModal({
fullscreenButton: false,
onConfirm: async () => {
const id = Number(row.value?.id);
const n = Number(qty.value);
if (!id || n <= 0) {
message.error('请填写正确的数量');
return;
}
modalApi.setState({ confirmLoading: true });
try {
if (mode.value === 'in') {
await stockInDeliveryWarehouseDrug({
id,
qty: n,
remark: remark.value?.trim() || undefined,
});
message.success('入库成功');
} else {
await stockOutDeliveryWarehouseDrug({
id,
qty: n,
remark: remark.value?.trim() || undefined,
});
message.success('出库成功');
}
reloadFn.value?.();
modalApi.close();
} finally {
modalApi.setState({ confirmLoading: false });
}
},
onOpenChange(isOpen) {
if (!isOpen) {
return;
}
const data = modalApi.getData<{
mode: 'in' | 'out';
row: Record<string, any>;
onSuccess?: () => void;
}>();
mode.value = data?.mode === 'out' ? 'out' : 'in';
row.value = data?.row || {};
qty.value = 1;
remark.value = '';
reloadFn.value = data?.onSuccess || null;
},
});
</script>
<template>
<Modal :title="title" class="w-[480px]">
<div class="mb-3 text-sm text-[hsl(var(--muted-foreground))]">
{{ row.drug?.drug_name || '-' }} /
可用 {{ row.available_stock ?? Math.max((row.stock || 0) - (row.frozen_number || 0), 0) }}
/ 冻结 {{ row.frozen_number ?? 0 }}
/ 库存 {{ row.stock ?? 0 }}
</div>
<Form layout="vertical">
<Form.Item :label="mode === 'in' ? '入库数量' : '出库数量'" required>
<InputNumber v-model:value="qty" :min="1" class="w-full" />
</Form.Item>
<Form.Item label="备注">
<Input.TextArea
v-model:value="remark"
:rows="3"
placeholder="可选,便于追溯"
/>
</Form.Item>
</Form>
</Modal>
</template>

View File

@@ -0,0 +1,110 @@
<script lang="ts" setup>
import { reactive, ref } from 'vue';
import { useVbenDrawer } from '@vben/common-ui';
import { Empty, Spin, Table, Tag } from 'ant-design-vue';
import { getDeliveryWarehouseStockLogList } from '#/views/system/delivery-warehouse-stock/api';
defineOptions({ name: 'DeliveryWarehouseStockLogDrawer' });
const loading = ref(false);
const rows = ref<Record<string, any>[]>([]);
const drugName = ref('');
const pager = reactive({
current: 1,
pageSize: 20,
total: 0,
});
const filter = reactive({
warehouse_drug_id: 0 as number,
drug_id: 0 as number,
});
const columns = [
{ title: '时间', dataIndex: 'created_at', key: 'created_at', width: 170 },
{ title: '类型', dataIndex: 'biz_type_txt', key: 'biz_type_txt', width: 120 },
{ title: '数量', dataIndex: 'qty', key: 'qty', width: 80 },
{ title: '库存前→后', key: 'stock_chg', width: 120 },
{ title: '冻结前→后', key: 'frozen_chg', width: 120 },
{ title: '订单ID', dataIndex: 'order_id', key: 'order_id', width: 90 },
{ title: '备注', dataIndex: 'remark', key: 'remark' },
];
async function loadLogs() {
if (!filter.warehouse_drug_id && !filter.drug_id) {
rows.value = [];
return;
}
loading.value = true;
try {
const res = await getDeliveryWarehouseStockLogList({
page: pager.current,
pageSize: pager.pageSize,
warehouse_drug_id: filter.warehouse_drug_id || undefined,
drug_id: filter.drug_id || undefined,
});
rows.value = res?.items ?? res?.list ?? [];
pager.total = Number(res?.total ?? 0);
} finally {
loading.value = false;
}
}
const [Drawer, drawerApi] = useVbenDrawer({
class: 'w-[720px]',
showConfirmButton: false,
onOpenChange(isOpen) {
if (!isOpen) {
return;
}
const data = drawerApi.getData<{ row: Record<string, any> }>();
const row = data?.row || {};
drugName.value = row.drug?.drug_name || '';
filter.warehouse_drug_id = Number(row.id || 0);
filter.drug_id = Number(row.drug_id || 0);
pager.current = 1;
void loadLogs();
},
});
</script>
<template>
<Drawer :title="`出入库记录${drugName ? ` - ${drugName}` : ''}`">
<Spin :spinning="loading">
<Table
v-if="rows.length"
:columns="columns"
:data-source="rows"
:pagination="{
current: pager.current,
pageSize: pager.pageSize,
total: pager.total,
onChange: (p: number) => {
pager.current = p;
void loadLogs();
},
}"
row-key="id"
size="small"
>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'biz_type_txt'">
<Tag>{{ record.biz_type_txt || record.biz_type }}</Tag>
</template>
<template v-else-if="column.key === 'stock_chg'">
{{ record.stock_before }} → {{ record.stock_after }}
</template>
<template v-else-if="column.key === 'frozen_chg'">
{{ record.frozen_before }} → {{ record.frozen_after }}
</template>
<template v-else-if="column.key === 'order_id'">
{{ record.order_id > 0 ? record.order_id : '-' }}
</template>
</template>
</Table>
<Empty v-else class="py-10" description="暂无出入库记录" />
</Spin>
</Drawer>
</template>