Files
pasd_pc/src/components/drugFiling/index.vue

271 lines
6.4 KiB
Vue
Raw Normal View History

2025-07-28 14:59:31 +08:00
<template>
<el-dialog
:title="title"
v-model="visible"
width="1550px"
append-to-body
>
<el-form
@submit.prevent
:inline="true"
class="demo-form-inline"
>
<el-form-item label="查询条件">
<el-input
v-model="searchForm.query"
placeholder="请输入药品名称或条码"
></el-input>
</el-form-item>
<el-form-item>
<el-button
type="primary"
@click="searchArchives"
>查询</el-button>
<el-button
icon="Refresh"
@click="resetQuery"
>重置</el-button>
</el-form-item>
</el-form>
<el-table
:data="mergedData"
:border="parentBorder"
style="width: 100%"
@row-click="selectRow"
v-loading="loading"
>
<el-table-column
label="序号"
type="index"
width="50"
/>
<el-table-column
label="药品名称"
width="250px"
align="center"
prop="medicineName"
/>
<el-table-column
label="生产厂家"
width="250px"
align="center"
prop="manufacturer"
/>
<el-table-column
label="条码"
align="center"
width="150px"
prop="barcode"
/>
<el-table-column
label="规格"
align="center"
width="200px"
prop="specification"
/>
<el-table-column
label="批号"
align="center"
prop="batch"
/>
<el-table-column
label="所在库房"
align="center"
prop="storeroomName"
/>
<el-table-column
label="生产日期"
align="center"
prop="expiryDate"
/>
<el-table-column
label="剩余盒数"
align="center"
prop="boxCount"
/>
<el-table-column
label="零售价"
align="center"
prop="retailPrice"
/>
<el-table-column
label="操作"
align="center"
fixed="right"
width="100"
>
<template #default="scope">
<el-button
type="text"
size="small"
@click="confirmSelection(scope.row)"
>选择</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="handlePagination"
/>
<template #footer>
<span class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup>
import { ref, reactive, onMounted, computed } from 'vue';
import { ElMessage } from 'element-plus';
import { listArchive } from '@/api/healthcare/inventory/DrugFiling/archive.js';
const props = defineProps({
title: String,
});
const emit = defineEmits(['selectedArchive']);
const visible = ref(false);
const archiveList = ref([]);
const mergedData = ref([]);
const selectedArchive = ref(null);
const parentBorder = ref(false);
const searchForm = reactive({
query: ''
});
const queryParams = reactive({
pageNum: 1,
pageSize: 10,
medicineName: null,
barcode: null,
});
const total = ref(0);
const loading = ref(false);
onMounted(() => {
loadArchives();
});
// 加载药品档案列表
function loadArchives() {
loading.value = true;
listArchive(queryParams).then(response => {
const rows = response.rows || [];
const formattedRows = rows.map(row => ({
...row,
drugFilings: row.drugFilings || [] // 确保每个 row 都有 drugFilings 集合,即使为空
}));
archiveList.value = formattedRows;
total.value = response.total;
console.log("获取药品档案archiveList", archiveList.value);
// 合并 archiveList 和 drugFilings
mergedData.value = formattedRows.flatMap(row => [
2026-03-13 14:32:43 +08:00
{
...row,
filingId: null,
packCount: row.packCount ?? 0,
inventoryUnit: row.inventoryUnit,
splitUnit: row.splitUnit,
minNumber: row.minNumber,
unitQuantity: row.minNumber ?? row.unitQuantity,
isSplit: row.isSplit
},
2025-07-28 14:59:31 +08:00
...row.drugFilings.map(filing => ({
medicineName: row.medicineName,
manufacturer: row.manufacturer,
barcode: row.barcode,
specification: row.specification,
batch: filing.batch,
expiryDate: filing.expiryDate,
boxCount: filing.boxCount,
2026-03-13 14:32:43 +08:00
packCount: filing.packCount,
2025-07-28 14:59:31 +08:00
retailPrice: filing.retailPrice,
2026-03-13 14:32:43 +08:00
minPrice: filing.minPrice,
minNumber: filing.minNumber ?? row.minNumber,
unitQuantity: filing.minNumber ?? row.minNumber,
inventoryUnit: filing.inventoryUnit ?? row.inventoryUnit,
splitUnit: filing.splitUnit ?? row.splitUnit,
2025-07-28 14:59:31 +08:00
filingId: filing.id,
archiveId: row.id,
storeroomId: filing.storeroomId,
2026-03-13 14:32:43 +08:00
storeroomName: filing.storeroomName,
isSplit: row.isSplit
2025-07-28 14:59:31 +08:00
}))
]);
console.log("合并后的数据mergedData", mergedData.value);
}).catch(error => {
ElMessage.error("加载药品档案失败:" + error.message);
}).finally(() => {
loading.value = false;
});
}
// 查询按钮
function searchArchives() {
queryParams.pageNum = 1; // 重置分页
queryParams.medicineName = null;
queryParams.barcode = null;
const query = searchForm.query.trim();
if (query) {
if (/^\d+$/.test(query)) { // 判断是否为数字(条码)
queryParams.barcode = query;
} else {
queryParams.medicineName = query;
}
}
loadArchives();
}
// 重置按钮
function resetQuery() {
searchForm.query = '';
queryParams.medicineName = null;
queryParams.barcode = null;
queryParams.pageNum = 1; // 重置分页
loadArchives();
}
// 选择行时触发
function selectRow(row) {
selectedArchive.value = row;
}
// 确认选择并关闭弹窗
function confirmSelection(row) {
if (row) {
emit('selectedArchive', row);
visible.value = false;
}
}
// 显示弹窗
const showSelector = () => {
visible.value = true;
};
defineExpose({ showSelector });
// 分页处理
function handlePagination(pagination) {
queryParams.pageNum = pagination.page;
queryParams.pageSize = pagination.limit;
console.log("分页参数:", queryParams);
loadArchives();
}
</script>
<style scoped>
.demo-form-inline {
display: flex;
justify-content: space-between;
align-items: center;
}
2026-03-13 14:32:43 +08:00
</style>