Files
his/openhis-ui-vue3/src/views/medicationmanagement/purchaseDocument/index.vue

1895 lines
62 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="app-container" v-loading="pageLoading" loading-text="审批中。。。">
<el-row :gutter="10" class="mb8" v-if="viewStatus">
<el-col :span="1.5">
<el-button
v-if="viewStatus != 'view'"
plain
type="primary"
icon="Edit"
@click="handelApply"
>审批通过</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
v-if="viewStatus != 'view'"
type="primary"
plain
icon="Edit"
@click="handleReject"
>驳回</el-button
>
</el-col>
</el-row>
<el-row :gutter="10" class="mb8" v-else>
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="submitAudit"
>提交审核</el-button
>
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="EditPen" @click="handleTotalAmount">
计算金额
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleSave"
>批量保存</el-button
>
</el-col>
</el-row>
<el-button type="primary" plain icon="Printer" @click="handlePrint"> 打印单据 </el-button>
<el-button type="primary" plain @click="handleExport" v-if="viewStatus == 'view'">
导出
</el-button>
<el-form
:model="receiptHeaderForm"
ref="receiptHeaderRef"
:inline="true"
label-width="100px"
:rules="rules"
>
<el-form-item label="单据号:" prop="busNo">
<el-input
v-model="receiptHeaderForm.busNo"
placeholder="单据号:"
clearable
style="width: 200px"
:disabled="true"
/>
</el-form-item>
<el-form-item label="经手人:" prop="practitionerId" label-width="120px">
<el-select
v-model="receiptHeaderForm.practitionerId"
placeholder=""
clearable
filterable
:disabled="viewStatus == 'view' || viewStatus == 'apply'"
style="width: 150px"
>
<el-option
v-for="practitioner in practitionerListOptions"
:key="practitioner.value"
:label="practitioner.label"
:value="practitioner.value"
/>
</el-select>
</el-form-item>
<el-form-item label="制单日期:">
<el-date-picker
v-model="receiptHeaderForm.occurrenceTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetime"
:disabled="viewStatus == 'view' || viewStatus == 'apply'"
/>
</el-form-item>
<el-form-item label="供应商:" prop="supplierId">
<el-select
v-model="receiptHeaderForm.supplierId"
placeholder=""
clearable
filterable
style="width: 150px"
:disabled="viewStatus == 'view' || viewStatus == 'apply'"
v-if="viewStatus != 'apply' && viewStatus != 'view'"
>
<el-option
v-for="supplier in supplierListOptions"
:key="supplier.value"
:label="supplier.label"
:value="supplier.value"
/>
</el-select>
<el-input
placeholder="供应商名称"
v-model="receiptHeaderForm.supplierName"
clearable
disabled
v-else-if="viewStatus == 'view' || viewStatus == 'apply'"
/>
</el-form-item>
<el-form-item label="药品类型:" prop="medicationType">
<el-select
v-model="receiptHeaderForm.medicationType"
placeholder=""
clearable
filterable
style="width: 150px"
:disabled="disabledForm"
@change="
(value) => {
itemType = value;
}
"
>
<el-option
v-for="itemType in purchase_type"
:key="itemType.value"
:label="itemType.label"
:value="itemType.value"
/>
</el-select>
</el-form-item>
<el-form-item label="仓库类型:" prop="purposeTypeEnum">
<el-select
v-model="receiptHeaderForm.purposeTypeEnum"
placeholder=""
clearable
style="width: 150px"
:disabled="disabledForm"
@change="handleChangeLocationType"
>
<el-option
v-for="dict in warehous_type"
:key="dict.value"
:label="dict.label"
:disabled="disabledForm"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-form>
<el-tabs type="border-card">
<el-tab-pane label="入库单明细">
<el-row :gutter="10" class="mb8" v-if="!viewStatus">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="addNewRow"
>添加行</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="deleteSelectedRows"
>删除行</el-button
>
</el-col>
</el-row>
<el-form
:model="form"
:rules="tableRules"
ref="formRef"
:disabled="viewStatus == 'apply'"
>
<!-- @cell-mouse-enter="handleMouseEnter" -->
<!-- v-click-outside-row="handleClickOutside" @row-click="handleRowClick" 点击行以外的部分自动保存 -->
<el-scrollbar height="calc(100vh - 500px)">
<el-table
row-key="rowKey"
v-loading="loading"
:data="form.purchaseinventoryList"
@selection-change="handleSelectionChange"
ref="tableRef"
@cell-mouse-leave="handleMouseLeave"
>
<el-table-column type="selection" width="50" align="center" />
<el-table-column
label="项目"
align="center"
key="name"
prop="name"
width="200"
fixed
>
<template #default="scope">
<el-form-item
:prop="`purchaseinventoryList.${scope.$index}.name`"
:rules="tableRules.name"
>
<el-input
v-if="viewStatus == 'view'"
v-model="scope.row.name"
placeholder=""
disabled
/>
<PopoverList
v-else
@search="handleSearch"
:width="1000"
:modelValue="scope.row.name"
>
<template #popover-content="{}">
<MedicineList
@selectRow="(row) => selectRow(row, scope.$index)"
:searchKey="medicineSearchKey"
:itemType="itemType"
/>
</template>
</PopoverList>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="规格"
align="center"
key="statusEnum_enumText"
prop="statusEnum_enumText"
width="150"
>
<template #default="scope">
<el-form-item
:prop="`purchaseinventoryList.${scope.$index}.volume`"
:rules="tableRules.volume"
>
<el-input v-model="scope.row.volume" placeholder="" disabled />
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="厂家/产地"
align="center"
key="manufacturerText"
prop="manufacturerText"
:show-overflow-tooltip="true"
width="160"
>
<template #default="scope">
<el-form-item
:prop="`purchaseinventoryList.${scope.$index}.manufacturerText`"
:rules="tableRules.manufacturerText"
>
<el-input v-model="scope.row.manufacturerText" placeholder="" disabled />
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="仓库"
align="center"
key="purposeLocationId"
prop="purposeLocationId"
:show-overflow-tooltip="true"
width="180"
>
<template #default="scope">
<el-form-item
:prop="`purchaseinventoryList.${scope.$index}.purposeLocationId`"
:rules="tableRules.purposeLocationId"
>
<div class="select_wrapper_div">
<el-select
v-model="scope.row.purposeLocationId"
placeholder="请选择仓库"
:class="{ 'error-border': scope.row.error }"
clearable
:disabled="viewStatus == 'view'"
>
<el-option
v-for="(item, index) in locationList"
:key="index"
:label="item.name"
:value="item.id"
@click="handleLocationClick(item, scope.row, scope.$index)"
/>
</el-select>
</div>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="采购数量"
align="center"
key="itemQuantity"
prop="itemQuantity"
width="120"
>
<template #default="scope">
<el-form-item
:prop="`purchaseinventoryList.${scope.$index}.itemQuantity`"
:rules="tableRules.itemQuantity"
>
<div class="select_wrapper_div">
<el-input
:disabled="viewStatus == 'view'"
v-model="scope.row.itemQuantity"
placeholder=""
@blur="handleTotalPrice(scope.$index)"
:class="{ 'error-border': scope.row.error }"
/>
</div>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="计量单位"
align="center"
key="unitCode"
prop="unitCode"
:show-overflow-tooltip="true"
width="90"
>
<template #default="scope">
<el-form-item
:prop="`purchaseinventoryList.${scope.$index}.unitCode`"
:rules="tableRules.unitCode"
>
<!-- :disabled="data.isEdit" -->
<div class="select_wrapper_div">
<el-select
v-model="scope.row.unitCode"
placeholder=" "
:class="{ 'error-border': scope.row.error }"
:clearable="false"
:disabled="viewStatus == 'view'"
@change="
(value) => handleUnitCodeChange(scope.row, scope.$index, value)
"
>
<template v-if="scope.row.unitList && scope.row.partPercent > 1">
<el-option
:label="scope.row.unitList.unitCode_dictText"
:value="scope.row.unitList.unitCode"
/>
<el-option
:label="scope.row.unitList.minUnitCode_dictText"
:value="scope.row.unitList.minUnitCode"
/>
</template>
<template v-if="scope.row.unitList && scope.row.partPercent == 1">
<el-option
:label="scope.row.unitList.unitCode_dictText"
:value="scope.row.unitList.unitCode"
/>
</template>
<template v-if="!scope.row.unitList">
<el-option
:label="scope.row.unitCode_dictText"
:value="scope.row.unitCode"
/>
</template>
</el-select>
</div>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="药品追溯码"
align="center"
key="traceNo"
prop="traceNo"
width="130"
>
<template #default="scope">
<el-tooltip
:content="formatContent(scope.row.traceNo)"
placement="top"
popper-class="custom-tooltip"
>
<el-form-item
:prop="`purchaseinventoryList.${scope.$index}.traceNo`"
:rules="tableRules.traceNo"
>
<el-input
:disabled="viewStatus == 'view'"
v-model="scope.row.traceNo"
@change="(value) => handleTraceNoInput(value, scope.row)"
placeholder=""
:id="'traceNo' + `${scope.$index}`"
/>
</el-form-item>
</el-tooltip>
</template>
</el-table-column>
<el-table-column
label="追溯码包装"
align="center"
key="packagingLevels"
prop="packagingLevels"
width="130"
>
<template #default="scope">
<el-form-item
:prop="`purchaseinventoryList.${scope.$index}.packagingLevels`"
:rules="tableRules.packagingLevels"
>
<el-input
v-model="scope.row.packagingLevels"
placeholder=""
:disabled="viewStatus == 'view'"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="采购单价(包装单位) "
align="center"
key="price"
prop="price"
width="160"
>
<template #default="scope">
<el-form-item
:prop="`purchaseinventoryList.${scope.$index}.price`"
:rules="tableRules.price"
>
<div class="select_wrapper_div">
<el-input
v-model="scope.row.price"
placeholder=""
@blur="handleTotalPrice(scope.$index)"
:class="{ 'error-border': scope.row.error }"
:disabled="viewStatus == 'view'"
>
<template #suffix></template>
</el-input>
</div>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="合计金额 "
align="center"
key="totalPrice"
prop="totalPrice"
width="130"
>
<template #default="scope">
<el-form-item
:prop="`purchaseinventoryList.${scope.$index}.totalPrice`"
>
<el-input disabled v-model="scope.row.totalPrice" placeholder="">
<template #suffix></template>
</el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="产品批号"
align="center"
key="lotNumber"
prop="lotNumber"
width="160"
>
<template #default="scope">
<el-form-item
:prop="`purchaseinventoryList.${scope.$index}.lotNumber`"
:rules="tableRules.lotNumber"
>
<el-input
v-model="scope.row.lotNumber"
placeholder=""
maxlength="100"
:disabled="viewStatus == 'view'"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="生产日期"
align="center"
key="startTime"
prop="startTime"
width="150"
>
<template #default="scope">
<el-form-item
:prop="`purchaseinventoryList.${scope.$index}.startTime`"
:rules="tableRules.startTime"
>
<el-date-picker
v-model="scope.row.startTime"
type="date"
placeholder="选择日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
:disabled="viewStatus == 'view'"
@change="changeValStart($event, scope.$index)"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="有效期至"
align="center"
key="endTime"
prop="endTime"
width="150"
>
<template #default="scope">
<el-form-item
:prop="`purchaseinventoryList.${scope.$index}.endTime`"
:rules="tableRules.endTime"
>
<el-date-picker
:disabled="viewStatus == 'view'"
v-model="scope.row.endTime"
type="date"
placeholder="选择日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
@change="changeValEnd($event, scope.$index)"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="发票号 "
align="center"
key="invoiceNo"
prop="invoiceNo"
width="130"
>
<template #default="scope">
<el-form-item
:prop="`purchaseinventoryList.${scope.$index}.invoiceNo`"
:rules="tableRules.invoiceNo"
>
<el-input
v-model="scope.row.invoiceNo"
placeholder=""
style="text-align: center !important"
:disabled="viewStatus == 'view'"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="备注"
align="center"
key="remake"
prop="remake"
width="130"
>
<template #default="scope">
<el-form-item
:prop="`purchaseinventoryList.${scope.$index}.remake`"
:rules="tableRules.remake"
>
<el-input
v-model="scope.row.remake"
placeholder=""
:disabled="viewStatus == 'view'"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="货位"
align="center"
key="locationStoreName"
prop="locationStoreName"
width="180"
>
<template #default="scope">
<el-form-item
:prop="`purchaseinventoryList.${scope.$index}.locationStoreName`"
:rules="tableRules.locationStoreName"
>
<div class="select_wrapper_div">
<el-select
v-model="scope.row.locationStoreName"
placeholder="请选择货位"
:class="{ 'error-border': scope.row.error }"
clearable
:disabled="viewStatus == 'view'"
>
</el-select>
</div>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="总库存数量"
align="center"
key="quantity"
prop="quantity"
width="120"
>
<template #default="scope">
<el-form-item
:prop="`purchaseinventoryList.${scope.$index}.quantity`"
:rules="tableRules.quantity"
>
<el-input v-model="scope.row.quantity" placeholder="" disabled />
</el-form-item>
</template>
</el-table-column>
<el-table-column
v-if="!viewStatus"
label="操作"
align="center"
width="80"
class-name="small-padding fixed-width"
fixed="right"
>
<template #default="scope">
<el-button
link
type="primary"
icon="Edit"
@click="handleScan(scope.row, scope.$index)"
>扫码</el-button
>
</template>
</el-table-column>
</el-table>
</el-scrollbar>
</el-form>
</el-tab-pane>
</el-tabs>
<el-row
:gutter="10"
class="mb8"
style="
margin-top: 15px;
display: flex;
align-items: center;
justify-content: flex-start;
"
>
<el-col :span="3">
<span>制单人{{ userUserStore.name }}</span>
</el-col>
<!-- <el-col :span="2">
<span>审核人</span>
</el-col>
<el-col :span="2">
<span>单据状态</span>
</el-col> -->
<el-col :span="6">
<el-row
:gutter="8"
style="display: flex; align-items: center; justify-content: flex-start"
>
<el-col :span="10">
<span>合计金额{{ totalAmount ? totalAmount.toFixed(4) : 0 }}</span>
</el-col>
<!-- <el-col :span="10">
<el-input v-model="totalAmount" placeholder="" disabled />
</el-col> -->
</el-row>
</el-col>
</el-row>
<!-- </el-dialog> -->
<TraceNoDialog
:ypName="ypName"
:rowData="rowData"
:openDialog="openTraceNoDialog"
@submit="submit"
@cancel="openTraceNoDialog = false"
/>
</div>
</template>
<script setup name="PurchaseDocument">
import {
addPurchaseinventory,
delPurchaseinventory,
getCount,
getDispensaryListAll,
getInit,
getInitBusNo,
getPharmacyList,
getPharmacyListAll,
purchaseInventoryApproved,
reject,
submitApproval,
} from "./components/api";
import PopoverList from "@/components/OpenHis/popoverList/index.vue";
import MedicineList from "./components/medicineList.vue";
import TraceNoDialog from "@/components/OpenHis/TraceNoDialog/index.vue";
import {formatDate, formatDateymd} from "@/utils/index";
import {useStore} from "@/store/store";
import useUserStore from "@/store/modules/user";
import {ElMessage} from "element-plus";
import {nextTick, onMounted, onUnmounted, ref, watch} from "vue";
import useTagsViewStore from "@/store/modules/tagsView";
import {isEqual} from "lodash";
import templateJson from "./components/templateJson.json";
import {hiprint} from "vue-plugin-hiprint";
const route = useRoute();
const router = useRouter();
const tagsViewStore = useTagsViewStore();
const userUserStore = useUserStore();
const store = useStore();
const rowData = ref({});
const { proxy } = getCurrentInstance();
const {
warehous_type,
category_code,
service_type_code,
specialty_code,
purchase_type,
} = proxy.useDict(
"warehous_type",
"category_code",
"service_type_code",
"specialty_code",
"purchase_type"
);
const viewStatus = ref("");
const startTimeOld = ref("");
const endTimeOld = ref("");
const purchaseinventoryList = ref([]);
const open = ref(false);
const loading = ref(false);
const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");
const visible = ref(false);
const openTraceNoDialog = ref(false);
const ypName = ref("");
const rowIndex = ref(-1);
const totalAmount = ref(0);
const editData = ref({});
const pageLoading = ref(false);
const form = reactive({
purchaseinventoryList: [],
});
const forms = reactive({
purchaseinventoryList: [],
});
const receiptHeaderForm = reactive({
busNo: undefined,
occurrenceTime: formatDate(new Date()),
practitionerId: userUserStore.practitionerId,
});
const data = reactive({
isEdit: false,
isAdding: true,
queryParams: {
pageNo: 1,
pageSize: 10,
searchKey: undefined, // 供应商名称
busNo: undefined, // 编码
statusEnum: undefined, // 状态
supplierId: undefined, // 供应商ID
applyTimeStart: undefined, // 申请时间开始
practitionerId: undefined, // 经手人ID
},
rules: {
practitionerId: [{ required: true, message: "请选择经手人", trigger: "change" }],
supplierId: [{ required: true, message: "请选择供应商", trigger: "change" }],
purposeTypeEnum: [{ required: true, message: "请选择仓库类型", trigger: "change" }],
medicationType: [{ required: true, message: "请选择药品类型", trigger: "change" }],
},
tableRules: {
itemId: [{ required: true, message: '项目不能为空', trigger: 'blur' }],
statusEnum_enumText: [{ required: true, message: '规格不能为空', trigger: 'blur' }],
unitCode: [{ required: true, message: '计量单位不能为空', trigger: 'blur' }],
purposeLocationId: [{ required: true, message: '目的仓库不能为空', trigger: 'blur' }],
lotNumber: [{ required: true, message: '产品批号不能为空', trigger: 'change' }],
startTime: [{ required: true, message: '开始时间不能为空', trigger: 'blur' }],
endTime: [{ required: true, message: '结束时间不能为空', trigger: 'blur' }],
price: [{ required: true, message: '单价不能为空', trigger: 'blur' }],
invoiceNo: [{ required: true, message: '发票号不能为空', trigger: 'blur' }],
totalPrice: [{ required: true, message: '总价不能为空', trigger: 'blur' }],
},
});
const { queryParams, rules, tableRules } = toRefs(data);
const itemTypeOptions = ref(undefined); // 入库项目类型
const practitionerListOptions = ref(undefined); // 查询经手人列表
const supplierListOptions = ref(undefined); // 供应商列表
const selectedRows = ref([]); // 用于存储选中的行
const emit = defineEmits(["refresh"]);
const tableRef = ref(undefined); // 表格引用
const currentRow = ref({}); // 当前操作的行
const medicineSearchKey = ref("");
const itemType = ref("");
const price = ref(0);
const unitMap = ref({});
const currentEditRow = ref({});
const currentIndex = ref(-1);
const currentRowId = ref("");
const disabledForm = computed(() => {
return form.purchaseinventoryList.length > 0;
});
const rowList = ref([]);
const saveRowObject = ref({});
watch(
() => store.currentData,
(newVlaue) => {
if (newVlaue) {
editData.value.editRow = newVlaue?.editRow;
editData.value.item = newVlaue?.item;
// 使用nextTick确保变量初始化完成后再执行edit
nextTick(() => {
edit();
});
} else {
editData.value = {};
// 使用nextTick确保变量初始化完成后再执行show
nextTick(() => {
show();
});
}
},
{ immediate: true }
);
watch(
() => route.query.view,
(newVlaue) => {
getPurchaseinventoryTypeList();
if (newVlaue) {
viewStatus.value = newVlaue;
} else {
viewStatus.value = "";
}
},
{ immediate: true }
);
watch(
() => form.purchaseinventoryList,
(newVlaue) => {
if (newVlaue && newVlaue.length > 0) {
if (viewStatus.value) {
handleTotalAmount();
}
}
},
{ immediate: true }
);
onMounted(() => {
if (route.query.view) {
viewStatus.value = route.query.view;
// 查看模式下不要清空store数据让watch监听器自然处理
} else {
viewStatus.value = "";
// 正常进入模式下清空store数据确保显示空表单
store.clearCurrentData();
}
// 不再直接调用show()而是让watch监听器根据store.currentData状态来决定
});
// 关键修复在组件卸载时清除store数据确保离开页面后再次进入时不会显示历史记录
onUnmounted(() => {
document.removeEventListener("click", handleClickOutside);
// 只有在非查看模式下才清除store数据
if (!viewStatus.value) {
store.clearCurrentData();
}
});
function addNewRow() {
// 先校验表头表单
proxy.$refs['receiptHeaderRef'].validate((valid) => {
if (valid) {
// 检查表格中是否有未保存的行
const unsavedRows = form.purchaseinventoryList.filter((row) => !row.isSave);
if (unsavedRows.length > 0) {
// 校验表格中未保存的行
proxy.$refs['formRef'].validate((tableValid) => {
if (!tableValid) {
proxy.$message.warning('请先完善当前行的必填信息后再添加新行');
return;
}
// 手动检查未保存行的必填字段
const invalidRows = [];
unsavedRows.forEach((row, index) => {
const rowIndex = form.purchaseinventoryList.indexOf(row);
const errors = [];
// 检查必填字段
if (!row.itemId || !row.name) {
errors.push('项目');
}
if (!row.volume) {
errors.push('规格');
}
if (!row.unitCode) {
errors.push('计量单位');
}
if (!row.purposeLocationId) {
errors.push('仓库');
}
if (!row.itemQuantity || row.itemQuantity === '' || row.itemQuantity === 0) {
errors.push('采购数量');
}
if (!row.lotNumber) {
errors.push('产品批号');
}
if (!row.startTime) {
errors.push('生产日期');
}
if (!row.endTime) {
errors.push('有效期至');
}
if (!row.price || row.price === '' || row.price === 0) {
errors.push('采购单价');
}
if (!row.invoiceNo || row.invoiceNo === '') {
errors.push('发票号');
}
if (!row.totalPrice || row.totalPrice === '' || row.totalPrice === 0) {
errors.push('合计金额');
}
if (errors.length > 0) {
invalidRows.push({
rowIndex: rowIndex + 1,
errors: errors.join('、'),
});
}
});
if (invalidRows.length > 0) {
const errorMsg = invalidRows
.map((item) => `${item.rowIndex}行缺少:${item.errors}`)
.join('');
proxy.$message.warning(errorMsg + ',请完善后再添加新行');
return;
}
// 所有校验通过,允许新增
const newRow = {
rowKey: Date.now(),
id: '',
itemTable: '',
itemQuantity: '',
itemId: '',
unitCode: '',
remake: '',
supplierId: '',
purposeTypeEnum: '',
purposeLocationId: null,
purposeLocationStoreId: null,
practitionerId: '',
traceNo: '',
invoiceNo: '-',
startTime: '',
endTime: '',
price: '',
totalPrice: '',
sellPrice: '',
minSellPrice: '',
unitList: {}, // 单位列表
isEditing: true, // 标记当前行是否正在编辑
error: false, // 新增 error 字段
isSave: false, // 当前行是否保存
};
form.purchaseinventoryList.push(newRow);
data.isAdding = true; // 设置标志位为 true表示有未保存的
});
} else {
// 没有未保存的行,直接新增
const newRow = {
rowKey: Date.now(),
id: '',
itemTable: '',
itemQuantity: '',
itemId: '',
unitCode: '',
remake: '',
supplierId: '',
purposeTypeEnum: '',
purposeLocationId: null,
purposeLocationStoreId: null,
practitionerId: '',
traceNo: '',
invoiceNo: '-',
startTime: '',
endTime: '',
price: '',
totalPrice: '',
sellPrice: '',
minSellPrice: '',
unitList: {}, // 单位列表
isEditing: true, // 标记当前行是否正在编辑
error: false, // 新增 error 字段
isSave: false, // 当前行是否保存
};
form.purchaseinventoryList.push(newRow);
data.isAdding = true; // 设置标志位为 true表示有未保存的
}
}
});
}
function handleBlur(row, index) {
let hasError = false;
if (!row.itemTable) {
if (receiptHeaderForm.medicationType === "1") {
row.itemTable = "med_medication_definition";
} else {
row.itemTable = "adm_device_definition";
}
}
row.practitionerId = receiptHeaderForm.practitionerId;
row.busNo = receiptHeaderForm.busNo;
row.occurrenceTime = receiptHeaderForm.occurrenceTime;
row.supplierId = receiptHeaderForm.supplierId;
row.purposeTypeEnum = receiptHeaderForm.purposeTypeEnum;
}
const handleMouseEnter = (row, column, cell, event) => {};
const handleMouseLeave = (row, column, cell, event) => {};
// 点击行时记录当前行
function handleRowClick(row) {
if (row.id != currentRowId.value) {
handleClickOutside();
}
currentEditRow.value = JSON.parse(JSON.stringify(row));
if (row.id) {
currentIndex.value = form.purchaseinventoryList.findIndex(
(item) => item.id == row.id
);
currentRowId.value = row.id;
} else {
currentIndex.value = form.purchaseinventoryList.length - 1;
}
currentRow.value = row;
}
function saveRow(row, index) {
form.purchaseinventoryList[index] = row;
addPurchaseinventory(row).then((response) => {
reset();
data.isAdding = false; // 允许新增下一行
proxy.$message.success("保存成功!");
visible.value = false;
});
}
function handleScan(row, index) {
if (row.purposeLocationId && row.lotNumber) {
rowData.value = row;
rowData.value.locationId = row.purposeLocationId;
rowData.value.itemType = receiptHeaderForm.medicationType;
ypName.value = row.name;
openTraceNoDialog.value = true;
currentIndex.value = index;
} else {
proxy.$message.warning("请先选择仓库和产品批号!");
}
}
function submit(value) {
if (form.purchaseinventoryList[currentIndex.value].traceNo) {
form.purchaseinventoryList[currentIndex.value].traceNo =
form.purchaseinventoryList[currentIndex.value].traceNo + "," + value;
} else {
form.purchaseinventoryList[currentIndex.value].traceNo = value;
}
openTraceNoDialog.value = false;
}
function formatContent(value) {
let content = "";
if (value) {
value.split(",").forEach((item, index) => {
content += `[${index + 1}] ${item}\n`;
});
return content;
}
}
// 药品列表搜索
function handleSearch(value) {
medicineSearchKey.value = value;
}
const locationList = ref([]);
// 选择药品
function selectRow(rowValue, index) {
form.purchaseinventoryList[index] = { id: form.purchaseinventoryList[index].id };
price.value = 0;
rowIndex.value = index;
form.purchaseinventoryList[index].rowKey = Date.now();
form.purchaseinventoryList[index].itemId = rowValue.definitionId;
form.purchaseinventoryList[index].name = rowValue.name;
form.purchaseinventoryList[index].volume = rowValue.volume;
form.purchaseinventoryList[index].minUnitCode = rowValue.minUnitCode;
form.purchaseinventoryList[index].unitCode = rowValue.unitCode;
form.purchaseinventoryList[index].manufacturerText = rowValue.manufacturerText;
form.purchaseinventoryList[index].partPercent = rowValue.partPercent;
form.purchaseinventoryList[index].invoiceNo = '-';
form.purchaseinventoryList[index].price = rowValue.purchaseAmount || 0;
price.value = rowValue.purchaseAmount || 0;
form.purchaseinventoryList[index].unitList = rowValue.unitList[0];
unitMap.value['unitCode'] = rowValue.unitCode;
unitMap.value['minUnitCode'] = rowValue.minUnitCode;
unitMap.value['currentCode'] = rowValue.unitCode;
form.purchaseinventoryList[index].itemQuantity = 0;
form.purchaseinventoryList[index].totalPrice = 0;
}
let totalQuantity = 0;
// 选择仓库
function handleLocationClick(item, row, index) {
getCount({
itemId: row.itemId,
orgLocationId: item.id,
}).then((res) => {
if (res.data) {
totalQuantity = 0;
res.data.forEach((item) => {
totalQuantity += item.orgQuantity;
});
form.purchaseinventoryList[index].quantity =
handleTotalQuantity(
totalQuantity,
row.partPercent,
row.unitList.unitCode_dictText,
row.unitList.minUnitCode_dictText
) || 0;
form.purchaseinventoryList[index].itemTable = res.data[0].itemTable || '';
form.purchaseinventoryList[index].startTime = formatDateymd(res.data[0].productionDate) || '';
form.purchaseinventoryList[index].endTime = formatDateymd(res.data[0].expirationDate) || '';
startTimeOld.value = form.purchaseinventoryList[index].startTime
? form.purchaseinventoryList[index].startTime
: "";
endTimeOld.value = form.purchaseinventoryList[index].endTime
? form.purchaseinventoryList[index].endTime
: "";
}
});
}
// 处理总数量不整时显示的情况,例 10盒2片
function handleTotalQuantity(quantity, partPercent, unitCode, minUnitCode) {
if (quantity % partPercent != 0) {
return (
Math.floor(quantity / partPercent).toString() +
" " +
unitCode +
(quantity % partPercent).toString() +
" " +
minUnitCode
);
}
return quantity / partPercent;
}
function getNextDayZeroTimeStamp(selectedTime) {
const now = new Date(selectedTime);
const nextDay = new Date(now);
nextDay.setDate(now.getDate());
return nextDay.getTime();
}
function changeValStart(val, index) {
const selectedTime = val;
const validTime = this.getNextDayZeroTimeStamp(selectedTime);
if (form.purchaseinventoryList[index].endTime) {
const endTime = formatDateymd(form.purchaseinventoryList[index].endTime);
const getNextDayZeroTime = this.getNextDayZeroTimeStamp(endTime);
if (getNextDayZeroTime < validTime) {
proxy.$message.warning("生产日期必须小于等于有效期!");
form.purchaseinventoryList[index].startTime = startTimeOld.value;
return;
}
}
}
function changeValEnd(val, index) {
const selectedTimes = val;
const validTimes = this.getNextDayZeroTimeStamp(selectedTimes);
if (form.purchaseinventoryList[index].startTime) {
const startTime = formatDateymd(form.purchaseinventoryList[index].startTime);
const getNextDayZeroTimes = this.getNextDayZeroTimeStamp(startTime);
if (getNextDayZeroTimes > validTimes) {
proxy.$message.warning("有效期必须大于等于生产日期!");
form.purchaseinventoryList[index].endTime = endTimeOld.value;
return;
}
}
}
// 切换仓库类型获取药房/药库/耗材库列表
function handleChangeLocationType(value) {
// 确保locationList变量已初始化
if (!locationList) {
console.warn("locationList未初始化");
return;
}
if (value == 16) {
// 药房类型
getPharmacyList().then((res) => {
const list = res?.data || [];
if (!list.length) {
getPharmacyListAll().then((res2) => {
locationList.value = res2?.data || [];
});
} else {
locationList.value = list;
}
});
} else if (value == 11) {
// 根据用户说明标识为11的是药库
// 直接使用getDispensaryListAll获取药库数据而不是从药房数据中过滤
getDispensaryListAll()
.then((res) => {
const pharmacies = res?.data || [];
console.log("===== 药库数据获取结果 =====");
console.log("获取到的药库数量:", pharmacies.length);
console.log("药库列表:", pharmacies);
// 直接使用获取到的药库数据
locationList.value = pharmacies;
// 如果没有找到药库,显示提示信息
if (pharmacies.length === 0) {
console.warn("未获取到任何药库数据");
}
})
.catch((error) => {
console.error("获取药库列表失败:", error);
locationList.value = [];
});
} else if (value == 17) {
// 耗材库类型 - 确保只显示中心耗材库
console.log("选择了耗材库类型,设置中心耗材库");
// 只设置一个硬编码的中心耗材库使用数字ID避免类型转换错误
const centralSupplyWarehouse = {
id: 1, // 使用数字ID而不是字符串
locationStoreId: 1, // 使用数字ID而不是字符串
locationStoreName: "中心耗材库",
formEnum: "17",
storeName: "中心耗材库",
name: "中心耗材库",
};
// 直接设置locationList只包含中心耗材库
locationList.value = [centralSupplyWarehouse];
console.log("已设置仅包含中心耗材库的列表");
// 可选:如果需要在后台记录日志,可以保留获取数据的逻辑但不覆盖显示
getPharmacyListAll()
.then((res) => {
console.log("后台获取仓库数据(仅供参考,不影响显示):", res?.data?.length || 0);
})
.catch((error) => {
console.error("后台获取仓库数据失败(不影响显示):", error);
});
}
}
// 单位处理
function handleUnitCodeChange(row, index, value) {
if (
//小单位
unitMap.value["unitCode"] != value &&
unitMap.value["currentCode"] == unitMap.value["unitCode"]
) {
// 总库存数
form.purchaseinventoryList[index].quantity = totalQuantity;
// 采购数量
form.purchaseinventoryList[index].itemQuantity = undefined;
} else {
//大单位
form.purchaseinventoryList[index].quantity =
handleTotalQuantity(
totalQuantity,
row.partPercent,
row.unitList.unitCode_dictText,
row.unitList.minUnitCode_dictText
) || 0;
form.purchaseinventoryList[index].itemQuantity = undefined;
}
form.purchaseinventoryList[index].totalPrice = undefined;
unitMap.value["currentCode"] = value;
}
// 计算总价
function handleTotalPrice(index) {
let purchaseItem = form.purchaseinventoryList[index];
if (!purchaseItem.unitList) {
purchaseItem.unitList = {
unitCode: purchaseItem.unitCode,
unitCode_dictText: purchaseItem.unitCode_dictText,
};
}
if (purchaseItem.price > 0 && purchaseItem.itemQuantity > 0) {
if (purchaseItem.unitCode == purchaseItem.unitList.unitCode) {
//大单位
form.purchaseinventoryList[index].totalPrice = (
purchaseItem.price * purchaseItem.itemQuantity
).toFixed(4);
} else {
// 小单位
form.purchaseinventoryList[index].totalPrice = (
(purchaseItem.price / purchaseItem.partPercent) *
purchaseItem.itemQuantity
).toFixed(4);
}
}
if (form.purchaseinventoryList[index].itemQuantity == 0) {
form.purchaseinventoryList[index].totalPrice = 0;
}
}
// 批量保存
function handleSave(row, index) {
rowList.value = [];
form.purchaseinventoryList.map((row, index) => {
if (row) {
handleBlur(row);
proxy.$refs["receiptHeaderRef"].validate((valid) => {
if (valid) {
proxy.$refs["formRef"].validate((valid) => {
if (valid) {
if (row.itemQuantity == 0) {
proxy.$message.warning("采购数量不能为0");
return;
}
rowList.value.push(JSON.parse(JSON.stringify(row)));
if (
rowList._rawValue &&
rowList._rawValue.length == form.purchaseinventoryList.length
) {
addPurchaseinventorys(rowList._rawValue);
}
}
});
}
});
}
});
}
function addPurchaseinventorys(rowList) {
addPurchaseinventory(JSON.parse(JSON.stringify(rowList))).then((res) => {
if (res.data) {
proxy.$message.success("保存成功!");
form.purchaseinventoryList.map((row, index) => {
form.purchaseinventoryList[index].id = res.data[index];
form.purchaseinventoryList[index].isSave = true;
});
}
});
}
function handleTraceNoInput(value, row) {
row.traceNo = value.concat(',');
}
/** 选择条数 */
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.id);
selectedRows.value = selection;
single.value = selection.length != 1;
multiple.value = !selection.length;
}
// 预览单据函数 - 简化实现,避免复杂嵌套数据结构
// 预览单据函数 - 完整修复版
function handlePrintPreview() {
console.log("开始执行预览功能");
// 检查是否存在数据
if (!form.purchaseinventoryList || form.purchaseinventoryList.length === 0) {
ElMessage.warning("没有数据可预览");
return;
}
// 检查是否所有必填字段都已填写
const hasEmptyFields = form.purchaseinventoryList.some((row) => {
return !row.name || !row.itemQuantity || !row.price || !row.totalPrice;
});
if (hasEmptyFields) {
ElMessage.warning("请确保所有药品信息完整后再预览");
return;
}
// 检查templateJson是否已正确导入
if (!templateJson) {
console.error("错误templateJson未定义请检查导入");
ElMessage.error("打印模板未加载,请刷新页面重试");
return;
}
try {
// 安全获取供应商名称
let supplierName = "";
if (supplierListOptions.value && receiptHeaderForm.supplierId) {
const filteredSuppliers = supplierListOptions.value.filter((item) => {
return item.value == receiptHeaderForm.supplierId;
});
supplierName = filteredSuppliers.length > 0 ? filteredSuppliers[0].label : "";
}
// 计算总金额
const totalAmount = form.purchaseinventoryList.reduce((accumulator, currentRow) => {
return accumulator + (Number(currentRow.totalPrice) || 0);
}, 0);
// 重新构建包含药品清单的数据结构
const printData = {
supplierName: supplierName || "",
totalAmount: totalAmount.toFixed(2),
...receiptHeaderForm,
purchaseinventoryList: form.purchaseinventoryList.map((item, index) => ({
...item,
rowNumber: index + 1, // 添加序号
itemQuantity: Number(item.itemQuantity) || 0,
price: Number(item.price).toFixed(2),
totalPrice: Number(item.totalPrice).toFixed(2),
})),
};
console.log("打印数据:", printData);
// 创建打印模板实例
const hiprintTemplate = new hiprint.PrintTemplate({
template: templateJson,
});
// 打开预览窗口(推荐)
hiprintTemplate.print(
printData,
{},
{
callback: () => {
console.log("预览窗口已打开");
},
}
);
} catch (error) {
console.error("打印预览失败:", error);
ElMessage.error("预览失败,请检查打印模板配置");
}
}
// 直接打印函数(不预览)
function handleDirectPrint() {
console.log("开始执行直接打印");
// 检查是否存在数据
if (!form.purchaseinventoryList || form.purchaseinventoryList.length === 0) {
ElMessage.warning("没有数据可打印");
return;
}
// 检查是否所有必填字段都已填写
const hasEmptyFields = form.purchaseinventoryList.some((row) => {
return !row.name || !row.itemQuantity || !row.price || !row.totalPrice;
});
if (hasEmptyFields) {
ElMessage.warning("请确保所有药品信息完整后再打印");
return;
}
// 检查templateJson是否已正确导入
if (!templateJson) {
console.error("错误templateJson未定义请检查导入");
ElMessage.error("打印模板未加载,请刷新页面重试");
return;
}
try {
// 安全获取供应商名称
let supplierName = "";
if (supplierListOptions.value && receiptHeaderForm.supplierId) {
const filteredSuppliers = supplierListOptions.value.filter((item) => {
return item.value == receiptHeaderForm.supplierId;
});
supplierName = filteredSuppliers.length > 0 ? filteredSuppliers[0].label : "";
}
// 计算总金额
const totalAmount = form.purchaseinventoryList.reduce((accumulator, currentRow) => {
return accumulator + (Number(currentRow.totalPrice) || 0);
}, 0);
// 重新构建包含药品清单的数据结构
const printData = {
supplierName: supplierName || "",
totalAmount: totalAmount.toFixed(2),
...receiptHeaderForm,
purchaseinventoryList: form.purchaseinventoryList.map((item, index) => ({
...item,
rowNumber: index + 1,
itemQuantity: Number(item.itemQuantity) || 0,
price: Number(item.price).toFixed(2),
totalPrice: Number(item.totalPrice).toFixed(2),
})),
};
console.log("打印数据:", printData);
// 创建打印模板实例
const hiprintTemplate = new hiprint.PrintTemplate({
template: templateJson,
});
// 直接打印到指定打印机
hiprintTemplate.print2(printData, {
printer: "", // 留空使用默认打印机,或指定打印机名称如 'EPSON LQ-80KFII'
title: "采购入库单",
});
ElMessage.success("打印任务已发送");
} catch (error) {
console.error("打印失败:", error);
ElMessage.error("打印失败,请检查打印机连接");
}
}
// 选择打印机后打印
function handlePrintWithSelectPrinter() {
console.log("开始选择打印机");
// 检查是否存在数据
if (!form.purchaseinventoryList || form.purchaseinventoryList.length === 0) {
ElMessage.warning("没有数据可打印");
return;
}
// 检查是否所有必填字段都已填写
const hasEmptyFields = form.purchaseinventoryList.some((row) => {
return !row.name || !row.itemQuantity || !row.price || !row.totalPrice;
});
if (hasEmptyFields) {
ElMessage.warning("请确保所有药品信息完整后再打印");
return;
}
// 检查templateJson是否已正确导入
if (!templateJson) {
console.error("错误templateJson未定义请检查导入");
ElMessage.error("打印模板未加载,请刷新页面重试");
return;
}
try {
// 安全获取供应商名称
let supplierName = "";
if (supplierListOptions.value && receiptHeaderForm.supplierId) {
const filteredSuppliers = supplierListOptions.value.filter((item) => {
return item.value == receiptHeaderForm.supplierId;
});
supplierName = filteredSuppliers.length > 0 ? filteredSuppliers[0].label : "";
}
// 计算总金额
const totalAmount = form.purchaseinventoryList.reduce((accumulator, currentRow) => {
return accumulator + (Number(currentRow.totalPrice) || 0);
}, 0);
// 重新构建包含药品清单的数据结构
const printData = {
supplierName: supplierName || "",
totalAmount: totalAmount.toFixed(2),
...receiptHeaderForm,
purchaseinventoryList: form.purchaseinventoryList.map((item, index) => ({
...item,
rowNumber: index + 1,
itemQuantity: Number(item.itemQuantity) || 0,
price: Number(item.price).toFixed(2),
totalPrice: Number(item.totalPrice).toFixed(2),
})),
};
console.log("打印数据:", printData);
// 创建打印模板实例
const hiprintTemplate = new hiprint.PrintTemplate({
template: templateJson,
});
// 获取打印机列表并选择
hiprint.hiwebSocket.getPrinterList((printerList) => {
if (!printerList || printerList.length === 0) {
ElMessage.error("未检测到打印机,请检查打印服务");
return;
}
// 这里可以弹出选择框让用户选择打印机
// 简单示例:使用第一台打印机
const selectedPrinter = printerList[0].name;
hiprintTemplate.print2(printData, {
printer: selectedPrinter,
title: "采购入库单",
});
ElMessage.success(`正在使用 ${selectedPrinter} 打印`);
});
} catch (error) {
console.error("打印失败:", error);
ElMessage.error("打印失败,请检查打印服务连接");
}
}
// 工具函数:格式化打印数据
function formatPrintData() {
// 安全获取供应商名称
let supplierName = "";
if (supplierListOptions.value && receiptHeaderForm.supplierId) {
const filteredSuppliers = supplierListOptions.value.filter((item) => {
return item.value == receiptHeaderForm.supplierId;
});
supplierName = filteredSuppliers.length > 0 ? filteredSuppliers[0].label : "";
}
// 计算总金额
const totalAmount = form.purchaseinventoryList.reduce((accumulator, currentRow) => {
return accumulator + (Number(currentRow.totalPrice) || 0);
}, 0);
// 返回格式化后的数据
return {
supplierName: supplierName || "",
totalAmount: totalAmount.toFixed(2),
totalQuantity: form.purchaseinventoryList.reduce(
(sum, item) => sum + (Number(item.itemQuantity) || 0),
0
),
printDate: new Date().toLocaleString("zh-CN"),
...receiptHeaderForm,
purchaseinventoryList: form.purchaseinventoryList,
};
}
function deleteSelectedRows() {
let length = selectedRows.value.length;
let ids = [];
if (selectedRows.value[0].id) {
ids = selectedRows.value.map((item) => {
return item.id;
});
}
if (selectedRows.value[length - 1].isSave) {
delPurchaseinventory(ids).then((res) => {
if (res.code == 200) {
proxy.$message.success("删除成功");
}
});
} else {
if (length > 1) {
delPurchaseinventory(ids.slice(0, -1)).then((res) => {
if (res.code == 200) {
proxy.$message.success("删除成功");
}
});
}
}
form.purchaseinventoryList = form.purchaseinventoryList.filter(
(row) => !selectedRows.value.includes(row)
);
data.isAdding = false;
currentIndex.value = -1;
}
/**计算合计金额 */
function handleTotalAmount() {
totalAmount.value = form.purchaseinventoryList.reduce((accumulator, currentRow) => {
return accumulator + (Number(currentRow.totalPrice) || 0);
}, 0);
}
/** 重置操作表单 */
function reset() {
proxy.resetForm('receiptHeaderRef');
form.purchaseinventoryList = [];
// 完全重置所有表单字段
Object.assign(receiptHeaderForm, {
busNo: undefined,
practitionerId: userUserStore.practitionerId,
occurrenceTime: formatDate(new Date()),
supplierId: undefined,
medicationType: "1",
purposeTypeEnum: undefined,
});
// 重置编辑数据
editData.value = {};
}
// 显示弹框
function show() {
data.isEdit = false;
data.isAdding = false;
reset();
visible.value = true;
getPurchaseinventoryTypeList();
getInitBusNo().then((res) => {
if (res.data && res.data.busNo) {
receiptHeaderForm.busNo = res.data.busNo;
}
});
}
// 显示弹框
function edit() {
data.isAdding = false;
data.isEdit = true;
visible.value = true;
receiptHeaderForm.value = editData.value.item.length > 0 ? editData.value.item[0] : {};
receiptHeaderForm.busNo = editData.value.editRow.supplyBusNo;
receiptHeaderForm.supplierId = editData.value.editRow.supplierId;
receiptHeaderForm.supplierName = editData.value.item[0].supplierName;
receiptHeaderForm.practitionerId = editData.value.editRow.practitionerId;
receiptHeaderForm.occurrenceTime = editData.value.item[0].occurrenceTime
? formatDate(editData.value.item[0].occurrenceTime)
: formatDate(new Date());
//仓库类型
receiptHeaderForm.purposeTypeEnum = editData.value.editRow.purposeTypeEnum
? editData.value.editRow.purposeTypeEnum.toString()
: editData.value.item[0].purposeTypeEnum.toString();
receiptHeaderForm.medicationType =
editData.value.item[0].itemTable == "med_medication_definition" ? "1" : "2";
total.value = form.purchaseinventoryList.length;
handleChangeLocationType(
editData.value.editRow.purposeTypeEnum
? editData.value.editRow.purposeTypeEnum.toString()
: editData.value.item[0].purposeTypeEnum.toString()
);
setTimeout(() => {
form.purchaseinventoryList = editData.value.item.map((item) => {
return {
...item,
name: item.itemName,
volume: item.totalVolume,
// manufacturerText: item.supplierName,
quantity: item.totalQuantity,
startTime: formatDateymd(item.startTime),
endTime: formatDateymd(item.endTime),
applyTime: formatDate(item.applyTime),
isSave: true,
};
});
}, 100);
loading.value = false;
// 使用 Promise 确保数据加载完成
Promise.resolve().then(() => {
form.purchaseinventoryList = editData.value.item.map((item) => {
return {
...item,
name: item.itemName,
volume: item.totalVolume,
manufacturer: item.supplierName,
quantity: item.totalQuantity,
// 仓库字段回显Promise 阶段再保障一次)
purposeLocationId:
item.purposeLocationId || editData.value.editRow?.purposeLocationId || null,
locationStoreName: item.locationStoreName || "",
purposeLocationStoreId: item.purposeLocationStoreId || null,
startTime: formatDateymd(item.startTime),
endTime: formatDateymd(item.endTime),
applyTime: formatDate(item.applyTime),
isSave: true,
};
});
});
}
function getPurchaseinventoryTypeList() {
getInit().then((response) => {
itemTypeOptions.value = response.data.itemTypeOptions; // 活动标记
practitionerListOptions.value = response.data.practitionerListOptions; // 预约必填标记
supplierListOptions.value = response.data.supplierListOptions; // 供应商列表
});
}
// reject
function handleReject() {
reject(route.query.supplyBusNo).then((res) => {
if (res.code == 200) {
proxy.$modal.msgSuccess("操作成功");
tagsViewStore.delView(router.currentRoute.value);
store.clearCurrentData();
// 跳转到审核页面
router.replace({
path: '/aaaa/billapproval',
query: { type: 'purchaseDocument' },
});
}
});
}
function handelApply() {
pageLoading.value = true;
purchaseInventoryApproved(route.query.supplyBusNo)
.then((res) => {
if (res.code == 200) {
pageLoading.value = false;
proxy.$modal.msgSuccess("操作成功");
tagsViewStore.delView(router.currentRoute.value);
store.clearCurrentData();
// 跳转到审核页面
router.replace({
path: '/aaaa/billapproval',
query: { type: 'purchaseDocument' },
});
}
})
.catch(() => {
pageLoading.value = false;
});
}
/** 提交审核 */
function submitAudit() {
let length = form.purchaseinventoryList.length;
if (length < 1) {
proxy.$modal.msgWarning("请先添加单据");
} else if (!form.purchaseinventoryList[length - 1].isSave) {
proxy.$modal.msgWarning("第" + length + "行单据未保存,请先保存");
} else {
submitApproval(receiptHeaderForm.busNo).then((res) => {
if (res.code == 200) {
proxy.$modal.msgSuccess("提交审批成功");
emit("refresh");
visible.value = false;
// 关闭当前页
tagsViewStore.delView(router.currentRoute.value);
// 跳转到退货单管理页面
router.replace({ path: "purchaseinventory" });
}
});
}
}
function handleClickOutside() {
if (
currentIndex.value != -1 &&
!isEqual(currentEditRow.value, form.purchaseinventoryList[currentIndex.value])
) {
handleSave(form.purchaseinventoryList[currentIndex.value], currentIndex.value);
}
}
defineExpose({
show,
edit,
});
getPurchaseinventoryTypeList();
// 导出
const exportRequiredParams = ref({
pageNo: 1,
pageSize: 10,
busNo: route.query.supplyBusNo,
});
function handleExport() {
proxy.downloadGet(
'/inventory-manage/purchase/excel-out',
{
...exportRequiredParams.value,
},
`入库单据明细_${proxy.formatDateStr(new Date(), 'YYYY-MM-DD')}.xlsx`
);
}
</script>
<style scoped>
.custom-tree-node {
display: flex;
align-items: center;
}
.title {
font-weight: bold;
font-size: large;
margin-bottom: 10px;
}
.error-border {
border: 1px solid red;
}
</style>