1. 修复了接诊页面的剂量、天数输入框过窄
This commit is contained in:
@@ -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>
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user