heli-mes/mes-ui/mes-ui-admin-vue3/src/views/heli/storage/index.vue
2026-01-16 16:13:02 +08:00

379 lines
12 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>
<el-card class="hl-card">
<template #header> <span>入库管理</span></template>
<ContentWrap class="borderxx">
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="108px"
>
<el-form-item label="入库单号" prop="stockNo">
<el-input
v-model="queryParams.stockNo"
placeholder="入库单号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="上游单号" prop="headerNo">
<el-input
v-model="queryParams.headerNo"
placeholder="上游单号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="物料编码" prop="matNo">
<el-input
v-model="queryParams.matNo"
placeholder="物料编码"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="物料名称" prop="matName">
<el-input
v-model="queryParams.matName"
placeholder="物料名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="入库类型" prop="stockInType">
<el-select
v-model="queryParams.stockInType"
placeholder="下拉选择"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_STORAGE_IN_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="入库仓库" prop="whId">
<el-select v-model="queryParams.whId" placeholder="下拉选择" clearable class="!w-240px">
<el-option
v-for="dict in warehouseList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="单据状态" prop="status">
<el-select v-model="queryParams.status" placeholder="下拉选择" clearable class="!w-240px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_STORAGE_IN_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery" type="primary"
><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button
>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button type="primary" plain @click="openDetail('create')">
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true" class="hl-table">
<!-- <el-table-column label="主键id" align="center" prop="id" /> -->
<el-table-column type="index" width="100" fixed label="序号" align="center" />
<el-table-column label="入库单号" align="center" prop="stockNo" min-width="210" fixed />
<!-- <template #default="scope">-->
<!-- <el-button text type="primary" @click="openDetail('review',scope.row.id)">-->
<!-- {{scope.row.stockNo}}-->
<!-- </el-button>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="入库类型" align="center" prop="stockInType" min-width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_STORAGE_IN_TYPE" :value="scope.row.stockInType" />
</template>
</el-table-column>
<el-table-column label="上游单号" align="center" prop="headerNo" min-width="200" />
<el-table-column label="入库仓库" align="center" prop="whId" min-width="120">
<template #default="scope">
{{ warehouseList.find((tag) => tag.id === scope.row.whId)?.whName }}
</template>
</el-table-column>
<el-table-column label="即入即出" align="center" prop="inOutFlag" min-width="90" >
<template #default="scope">
<el-tag :type="scope.row.inOutFlag ? 'success' : 'info'">
{{ scope.row.inOutFlag ? '是' : '否' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="description" min-width="160" />
<el-table-column label="创建人" align="center" prop="creator" min-width="120">
<template #default="scope">
{{ userList.find((user) => user.id === scope.row.creator)?.nickname }}
</template>
</el-table-column>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
min-width="240"
/>
<el-table-column label="提交人" align="center" prop="keeper" min-width="120">
<template #default="scope">
{{ userList.find((user) => user.id == scope.row.keeper)?.nickname }}
</template>
</el-table-column>
<el-table-column
label="提交时间"
align="center"
prop="keeperTime"
:formatter="dateFormatter"
min-width="240"
/>
<!-- <el-table-column label="作废人" align="center" prop="cancel" min-width="120">-->
<!-- <template #default="scope">-->
<!-- {{ userList.find((user) => user.id == scope.row.cancel)?.nickname }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column-->
<!-- label="作废时间"-->
<!-- align="center"-->
<!-- prop="cancelTime"-->
<!-- :formatter="dateFormatter"-->
<!-- min-width="240"-->
<!-- />-->
<el-table-column label="单据状态" align="center" prop="status" min-width="120" fixed="right">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_STORAGE_IN_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" min-width="180" fixed="right">
<template #default="scope">
<el-button link type="primary" @click="openDetail('update', scope.row.id)" v-if="scope.row.status != 3&&scope.row.status!=4">
编辑
</el-button>
<el-button link type="primary" @click="openDetail('review', scope.row.id)">
查看详情
</el-button>
<!-- <el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
>
删除
</el-button> -->
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
</el-card>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import * as StorageApi from '@/api/heli/storage'
import * as WarehouseApi from '@/api/heli/warehouse'
import * as UserApi from '@/api/system/user'
import routeParamsCache from '@/utils/routeParamsCache'
import axios from "axios";
import {getAccessToken, getTenantId} from "@/utils/auth";
defineOptions({ name: 'Storage' })
const message = useMessage() // 消息弹窗
const { t } = useI18n() // 国际化
const router = useRouter() // 路由
const loading = ref(true) // 列表的加载中
const list = ref([]) // 列表的数据
const total = ref(0) // 列表的总页数
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
stockType: 1,
stockInType: undefined,
stockOutType: undefined,
stockNo: undefined,
headerNo: undefined,
description: undefined,
status: undefined,
whId: undefined,
creator: undefined,
createTime: [],
updater: undefined,
updateTime: [],
keeper: undefined,
keeperTime: [],
outbound: undefined,
outboundTime: [],
cancel: undefined,
cancelTime: [],
matNo: undefined,
matName: undefined
})
const queryFormRef = ref() // 搜索的表单
const exportLoading = ref(false) // 导出的加载中
const warehouseList = ref([])
const userList = ref<UserApi.UserVO[]>([]) // 用户列表
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await StorageApi.getStoragePage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 导出按钮操作 */
const handleExport = async () => {
if (!queryParams.stockNo){
message.error("请输入入库单号")
return
}
try {
// 导出的二次确认
await message.exportConfirm()
// 发起导出
exportLoading.value = true
loading.value = true;
// 收集选中的ID
const baseUrl = import.meta.env.VITE_BASE_URL;
// 使用axios直接请求文件流
const response = await axios({
url: baseUrl+'/admin-api/heli/storage/export-excel-new',
method: 'get',
headers: { // 这里应该是headers而不是header
'tenant-id': getTenantId(),
'Authorization': getAccessToken()
},
params: {
stockNo: queryParams.stockNo ? queryParams.stockNo : undefined
},
responseType: 'blob' // 关键指定响应类型为blob
})
// 创建下载链接
const url = window.URL.createObjectURL(new Blob([response.data]))
const link = document.createElement('a')
link.href = url
link.setAttribute('download', '入库单.xlsx') // 设置下载文件名
document.body.appendChild(link)
link.click()
// 清理
document.body.removeChild(link)
window.URL.revokeObjectURL(url)
} catch (error) {
console.error('导出失败:', error)
message.error('导出失败,请重试')
} finally {
loading.value = false;
exportLoading.value = false
// 清理选中的ID
queryParams.ids = []
}
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 详情操作 新增/查看 */
const openDetail = (active: string, id?: number) => {
router.push({ path: '/inventory/storagedetail', query: { type: active, id: id } })
}
/** 初始化 **/
const route = useRoute()
const routeValue = ref('')
onMounted(async () => {
let params = routeParamsCache.get(route.path);
routeValue.value = route.path
if (params ) {
Object.assign(queryParams, params);
}
const queryParamsWarehouse = reactive({
pageNo: 1,
pageSize: 99
})
const data = await WarehouseApi.getWarehousePage(queryParamsWarehouse)
data.list.forEach((element) => {
element.label = element.whName
element.value = element.id
})
warehouseList.value = data.list
userList.value = await UserApi.getSimpleUserList()
await getList()
})
onBeforeUnmount(() => {
const plainParams = JSON.parse(JSON.stringify(queryParams));
routeParamsCache.set(routeValue.value, plainParams);
});
window.addEventListener('beforeunload', () => {
const plainParams = JSON.parse(JSON.stringify(queryParams));
routeParamsCache.set(routeValue.value, plainParams);
});
onActivated(() => {
getList()
})
</script>