出库管理 页面及接口

出库管理 页面及接口
pull/1/head
siontion 9 months ago
parent a37b927698
commit 444d060763

@ -31,10 +31,14 @@
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="单据日期" prop="createTime"> <el-form-item prop="industry" label="单据状态">
{{ formatDate(formData.createTime, 'YYYY-MM-DD HH:mm') }} <el-select v-model="formData.status" placeholder="下拉选择" clearable class="!w-700px" disabled>
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_STORAGE_STATUS)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -48,13 +52,10 @@
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-row v-if="isShow"> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item prop="industry" label="单据状态"> <el-form-item label="单据日期" prop="createTime">
<el-select v-model="formData.status" placeholder="下拉选择" clearable class="!w-400px" disabled> {{ formatDate(formData.createTime, 'YYYY-MM-DD HH:mm') }}
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_STORAGE_STATUS)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>

@ -0,0 +1,737 @@
<template>
<el-card class="hl-card">
<template #header>
<span v-text="dialogTitle"></span>
</template>
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px" v-loading="formLoading">
<!-- 基础信息 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">基础信息</span>
</template>
<el-row>
<el-col :span="8">
<el-row>
<el-col :span="24">
<el-form-item prop="name" label="出库单号">
<el-input v-model="formData.stockNo" disabled placeholder="系统自动生成" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item prop="stockInType" label="出库类型">
<el-select v-model="formData.stockInType" clearable style="width: 100%">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_STORAGE_OUT_TYPE)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="8">
<el-row>
<el-col :span="24">
<el-form-item prop="industry" label="单据状态">
<el-select v-model="formData.status" placeholder="下拉选择" clearable class="!w-700px" disabled>
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_STORAGE_STATUS)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item prop="headerNo" label="上游单号">
<el-input v-model="formData.headerNo" />
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="8">
<el-row>
<el-col :span="24">
<el-form-item label="单据日期" prop="createTime">
{{ formatDate(formData.createTime, 'YYYY-MM-DD HH:mm') }}
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item prop="whId" label="出库仓库" required>
<el-select v-model="formData.whId" placeholder="下拉选择" clearable class="!w-400px" @change="handleWh">
<el-option v-for="dict in warehouseList" :key="dict.id" :label="dict.whName" :value="dict.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="备注" prop="description">
<el-input type="textarea" v-model="formData.description" show-word-limit maxlength="200" />
</el-form-item>
</el-col>
</el-row>
</el-card>
<!-- 物料信息 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">物料信息</span>
</template>
<el-row>
<el-col>
<el-card class="hl-incard">
<el-col>
<el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem"></el-button>
</el-col>
<el-form ref="matSubFormRef" :model="formData.matItemDOList" :rules="subFormRules"
v-loading="subFormLoading" label-width="0">
<el-table :data="formData.matItemDOList" class="hl-table">
<el-table-column prop="cid" label="序号" :width="80" />
<el-table-column prop="matId" label="物料名称">
<template #default="scope">
<el-form-item :prop="`${scope.$index}.matId`" :rules="subFormRules.matId" class="mb-0px!">
<el-select v-model="scope.row.matId" placeholder="物料编码" :remote-method="remoteMatCodeSearch"
remote-show-suffix remote clearable reserve-keyword filterable :loading="matSelectLoading"
@change="(val) => handleMatCode(scope, val)" class="!w-180px">
<el-option v-for="item in matList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="matCode" label="物料编码">
<!-- <template #default="scope">
<el-input v-model="scope.row.matName"
:disabled="!scope.row.editable" />
<el-select v-model="scope.row.matName" placeholder="物料名称" :remote-method="remoteMatSearch"
remote-show-suffix remote clearable reserve-keyword filterable :loading="matSelectLoading" @click="handleMatName"
class="!w-180px">
<el-option v-for="item in matList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</template> -->
</el-table-column>
<el-table-column prop="matType" label="物料类型">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_MATERIAL_TYPE" :value="scope.row.matType"
v-if="scope.row.matType ? true : false" />
</template>
</el-table-column>
<el-table-column prop="matSpec" label="规格/型号" />
<el-table-column prop="matUnit" label="系统单位">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_MATERIAL_UNIT" :value="scope.row.matUnit"
v-if="scope.row.matUnit ? true : false" />
</template>
</el-table-column>
<el-table-column prop="rgId" width="140" label="出库库区" required>
<template #default="scope">
<el-form-item :prop="`${scope.$index}.rgId`" :rules="subFormRules.rgId" class="mb-0px!">
<el-select v-model="scope.row.rgId" placeholder="" style="width: 100%" @change="handleRg(scope)">
<el-option v-for="dict in rgList" :key="dict.id" :label="dict.rgName" :value="dict.id" />
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="pnId" width="140" label="出库库位" required>
<template #default="scope">
<el-form-item :prop="`${scope.$index}.pnId`" :rules="subFormRules.pnId" class="mb-0px!">
<el-select v-model="scope.row.pnId" placeholder="" style="width: 100%">
<el-option v-for="dict in scope.row.pnlist" :key="dict.id" :label="dict.pnName"
:value="dict.id" />
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="storageOkQty" width="120" label="出库数量" required>
<template #default="scope">
<el-input v-model="scope.row.storageOkQty" />
</template>
</el-table-column>
<el-table-column prop="lotNo" width="120" label="批次号">
<template #default="scope">
<el-input v-model="scope.row.lotNo" />
</template>
</el-table-column>
<el-table-column prop="description" width="150" label="备注">
<template #default="scope">
<el-input v-model="scope.row.description" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="240">
<template #default="scope">
<!-- <el-button v-if="!scope.row.editable" type="primary" size="small" link
@click="handleEdit(scope.$index)">
编辑
</el-button>
<el-button link v-else type="success" size="small" @click="handleSave(scope.$index)">
保存
</el-button>
<el-button link type="primary" @click="handlefuke(scope.$index, scope.row)">复制</el-button> -->
<el-button link type="danger" size="small" @click.prevent="handleDelete2(scope.$index)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-form>
</el-card>
</el-col>
</el-row>
</el-card>
<!-- 附件信息 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">附件信息</span>
</template>
<el-row>
<el-col>
<el-card class="hl-incard">
<el-col>
<el-upload ref="matUploadRef" :file-list="matUploadFiles" multiple :limit="10" :action="uploadUrl"
:headers="{ 'Authorization': 'Bearer ' + getAccessToken(), 'tenant-id': getTenantId() }" name="files"
:show-file-list="false" :auto-upload="false"
:data="{ 'businessType': 'STORAGE', 'businessId': formData.id, 'businessFileType': 'MATERIAL' }"
:on-change="matUploadChange" class="upload-file-uploader">
<el-button type="primary">
<Icon icon="ep:upload-filled" />上传
</el-button>
</el-upload>
</el-col>
<el-table :data="formData.attachments" class="hl-table">
<el-table-column prop="name" label="文件名称" align="center">
<template #default="scope">
<!-- <div></div> -->
<a :href="scope.row.url" target="_blank" style="color: #409eff">{{ scope.row.name }} </a>
</template>
</el-table-column>
<el-table-column prop="createTime" align="center" label="上传日期" :formatter="dateFormatter" />
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button link type="danger" size="small"
@click="handleDeleteAttachment(scope.$index, scope.row.businessFileType)">
删除
</el-button>
<el-button link type="primary" size="small" v-if="isShow"
@click="downloadAttachment(scope.row.name, scope.row.url)">
下载 </el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</el-col>
</el-row>
</el-card>
<!-- 系统信息 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">系统信息</span>
</template>
<el-row justify="center">
<el-col :span="8">
<el-form-item prop="creator" label="创建人">
{{ userList.find((user) => user.id == formData.creator)?.nickname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="createTime" label="创建时间">
{{ formatDate(formData.createTime, 'YYYY-MM-DD HH:mm') }}
</el-form-item>
</el-col>
</el-row>
<el-row justify="center">
<el-col :span="8">
<el-form-item prop="keeper" label="出库人">
{{ userList.find((user) => user.id == formData.keeper)?.nickname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="keeperTime" label="出库时间">
{{ formatDate(formData.keeperTime, 'YYYY-MM-DD HH:mm') }}
</el-form-item>
</el-col>
</el-row>
<el-row justify="center">
<el-col :span="8">
<el-form-item prop="outbound" label="作废人">
{{ userList.find((user) => user.id == formData.outbound)?.nickname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="outboundTime" label="作废时间">
{{ formatDate(formData.outboundTime, 'YYYY-MM-DD HH:mm') }}
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
<div class="text-center hl-footer">
<el-button @click="() => router.go(-1)" size="large"> </el-button>
<el-button @click="submitForm" v-if="isShowBtnGroup" type="success" :disabled="formLoading" size="large">
</el-button>
<el-button @click="handleStatus(2)" v-if="isShowBtnGroup" type="primary" :disabled="formLoading" size="large">
</el-button>
<el-button @click="handleStatus(3)" v-if="isShowBtnCancel" type="danger" :disabled="formLoading" size="large">
</el-button>
</div>
</el-card>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { useRoute } from "vue-router"
import { dateFormatter, formatDate } from "@/utils/formatTime"
import type { UploadUserFile } from 'element-plus'
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import * as StorageApi from '@/api/heli/storage'
import * as StorageMatApi from '@/api/heli/storagemat'
import { getAccessToken, getTenantId } from "@/utils/auth"
import * as MaterialApi from '@/api/heli/material'
import * as WarehouseApi from '@/api/heli/warehouse'
import * as RgApi from '@/api/heli/rg'
import * as PnApi from '@/api/heli/pn'
import { deleteFile, downloadFile, getFilePage } from "@/api/infra/file"
import download from "@/utils/download"
import * as UserApi from "@/api/system/user";
const reload = inject('reload')
const { t } = useI18n() //
const message = useMessage() //
const { query } = useRoute()
const router = useRouter();
const isShow = ref(false)
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
stockType: 2,
stockInType: undefined,
stockOutType: undefined,
stockNo: undefined,
headerNo: undefined,
description: undefined,
status: 1,
whId: undefined,
creator: undefined,
createTime: undefined,
keeper: undefined,
keeperTime: undefined,
outbound: undefined,
outboundTime: undefined,
cancel: undefined,
cancelTime: undefined,
matItemDOList: [],
attachments: []
})
const formRules = reactive({
// name: [{ required: true, message: '', trigger: 'blur' }],
status: [{ required: true, message: '启用状态不能为空', trigger: 'blur' }],
stockInType: [{ required: true, message: '出库类型不能为空', trigger: 'blur' }],
whId: [{ required: true, message: '出库仓库不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
const matSubFormRef = ref() // Ref
const subFormLoading = ref(false) //
const subFormRules = reactive({
matId: [{ required: true, message: '物料不能为空', trigger: 'blur' }],
rgId: [{ required: true, message: '库区不能为空', trigger: 'blur' }],
pnId: [{ required: true, message: '库位不能为空', trigger: 'blur' }],
})
const handleStatus = (async (num) => {
formData.value.status = num
const dataUpdate = formData.value as unknown as StorageApi.StorageVO
await StorageApi.updateStorage(dataUpdate)
message.success(t('common.updateSuccess'))
switch (num) {
case 1:
isShowBtnGroup.value = true;
isShowBtnCancel.value = false;
break
case 2:
isShowBtnGroup.value = false;
isShowBtnCancel.value = true;
break
case 3:
isShowBtnGroup.value = false;
isShowBtnCancel.value = false;
break;
default:
break
}
})
const userList = ref<UserApi.UserVO[]>([]) //
// ==================== =======================================
const uploadUrl = ref(import.meta.env.VITE_UPLOAD_BATCH_URL)
const matUploadRef = ref();
const matUploadFiles = ref<UploadUserFile[]>([]);
const matUploadChange = (file, files) => {
matUploadFiles.value = files;
refreshAttachments(files, 'MATERIAL')
}
const refreshAttachments = (files, type) => {
formData.value.attachments = formData.value.attachments.filter((value, index, array) => {
return value.businessFileType != type;
});
for (let i = 0; i < files.length; i++) {
let file = files[i];
file.businessFileType = type;
file.createTime = new Date();
formData.value.attachments.push(file);
}
//
formData.value.attachments.sort((v1, v2) => {
return v1.businessFileType == v2.businessFileType ? 0 : 1;
})
}
//
const handleDeleteAttachment = async (index, type) => {
const deletedAttachments = formData.value.attachments.splice(index, 1);
for (let i = 0; i < deletedAttachments.length; i++) {
const attachment = deletedAttachments[i];
if (attachment.id) {
//
await deleteFile(attachment.id);
}
//
matUploadFiles.value = matUploadFiles.value.filter(file1 => {
return file1.name != attachment.name || file1.businessFileType != type;
})
}
}
//
const downloadAttachment = async (name, url) => {
const data = await downloadFile(url)
download.any(data, name);
}
// ==================== =======================================
const storageid = ref()
var commonResult = ''
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
try {
await matSubFormRef.value.validate()
} catch (e) {
return
}
//
formLoading.value = true
try {
const data = formData.value as unknown as StorageApi.StorageVO
if (query.type === 'create') {
//
storageid.value = await StorageApi.createStorage(data)
commonResult = 'common.createSuccess'
} else {
storageid.value = data.id
await StorageApi.updateStorage(data)
commonResult = 'common.updateSuccess'
}
//
formData.value.matItemDOList.forEach(item => {
item.stockId = storageid.value
item.whId = formData.value.whId
})
const dataMats = formData.value.matItemDOList as unknown as StorageMatApi.StorageMatVO[]
await StorageMatApi.createStorageMatBatch(dataMats)
//
matUploadFiles.value = { 'businessType': 'STORAGE', 'businessId': storageid, 'businessFileType': '' }
matUploadRef.value!.submit()
message.success(t(commonResult))
//
reload();
} finally {
formLoading.value = false
}
}
var matCount = 1
const onAddItem = () => {
const newData = {
//
cid: matCount,
stockId: 0,
matId: '',
matName: '',
matCode: '',
matType: '',
matSpec: '',
matUnit: '',
whId: '',
rgId: '',
pnId: '',
pnlist: ref([]),
storageOkQty: '',
lotNo: '',
description: '',
productBomItemValueDOList: []
}
matCount = matCount + 1
formData.value.matItemDOList.push(newData)
}
//
const handlefuke = (index, item) => {
const data: any = formData.value.matItemDOList[index]
//
const newData: any = {
...data,
cid: matCount,
stockId: item.stockId,
matId: item.matId,
matName: item.matName,
matCode: item.matCode,
matType: item.matType,
matSpec: item.matSpec,
matUnit: item.matUnit,
whId: item.whId,
rgId: item.rgId,
pnId: item.pnId,
pnlist: item.pnlist,
storageOkQty: item.storageOkQty,
lotNo: item.lotNo,
description: item.description,
productBomItemValueDOList: []
}
matCount = matCount + 1
//
formData.value.matItemDOList.splice(index + 1, 0, newData)
}
//
const handleDelete2 = (index: number) => {
formData.value.matItemDOList.splice(index, 1)
}
//
const warehouseList = ref([])
//
var rgList = ref([])
//
var pnList = ref([])
const handleWh = (async (wid) => {
//-------------------
const queryParamsRg = reactive({
pageNo: 1,
pageSize: 99,
whId: wid
})
const dataRg = await RgApi.getRgPage(queryParamsRg)
rgList.value = []
pnList.value = []
rgList.value = dataRg.list
formData.value.matItemDOList.forEach(item => {
item.rgId = ''
item.pnId = ''
item.pnlist.value = []
})
//-------------------
})
const handleRg = (async (scope) => {
//-------------------
const queryParamsRPn = reactive({
pageNo: 1,
pageSize: 99,
rgId: scope.row.rgId,
pnStatus: 1
})
const dataPn = await PnApi.getPnPage(queryParamsRPn)
scope.row.pnid = ''
scope.row.pnlist = dataPn.list
//-------------------
})
const matList = ref<MaterialApi.MaterialVO[]>([]) //
const matSelectLoading = ref(false);
const remoteMatCodeSearch = async (code) => {
matSelectLoading.value = true
//
let matParams = {
pageNo: 1,
pageSize: 10,
name: code,
status: "1"
}
const dataMat = await MaterialApi.getMaterialPage(matParams)
matList.value = []
matList.value = dataMat.list
matSelectLoading.value = false
}
const handleMatCode = async (scope, matid) => {
if (matid) {
const matVo = await MaterialApi.getMaterial(scope.row.matId)
scope.row.matId = matVo.id
scope.row.matName = matVo.name
scope.row.matSpec = matVo.spec
scope.row.matType = matVo.materialType
scope.row.matUnit = matVo.unit
} else {
scope.row.matId = ''
scope.row.matCode = ''
scope.row.matName = ''
scope.row.matSpec = ''
scope.row.matType = ''
scope.row.matUnit = ''
}
}
const isShowBtnGroup = ref(true)
const isShowBtnCancel = ref(false)
/** 初始化 **/
onMounted(async () => {
//
let matParams = {
pageNo: 1,
pageSize: 99,
status: "1"
}
const dataMat = await MaterialApi.getMaterialPage(matParams)
matList.value = []
matList.value = dataMat.list
dialogTitle.value = t('action.' + query.type)
isShow.value = query.type == "create" ? false : true
//-------------------
const data = await WarehouseApi.getWarehouseSimpList()
warehouseList.value = data
//-------------------
if (query.id) {
//
formData.value = await StorageApi.getStorage(query.id)
switch (formData.value.status) {
case 1:
isShowBtnGroup.value = true;
isShowBtnCancel.value = false;
break
case 2:
isShowBtnGroup.value = false;
isShowBtnCancel.value = true;
break
case 3:
isShowBtnGroup.value = false;
isShowBtnCancel.value = false;
break;
default:
break
}
//
const queryParamsRg = reactive({
pageNo: 1,
pageSize: 99,
status: 1,
whId: formData.value.whId
})
const dataRg = await RgApi.getRgPage(queryParamsRg)
rgList.value = []
rgList.value = dataRg.list
//
const queryParamsPn = reactive({
pageNo: 1,
pageSize: 99
})
const dataPn = await PnApi.getPnPage(queryParamsPn)
pnList.value = []
pnList.value = dataPn.list
//
const queryParamsMat = reactive({
pageNo: 1,
pageSize: 99,
stockId: query.id
})
const dataMats = await StorageMatApi.getStorageMatPage(queryParamsMat)
formData.value.matItemDOList = dataMats.list
//
const queryParamsMat2 = reactive({
pageNo: 1,
pageSize: 99,
status: 1
})
const matVos = await MaterialApi.getMaterialPage(queryParamsMat2)
formData.value.matItemDOList.forEach(item => {
item.cid = matCount
item.matId = matVos.list.find((record) => record.id === item.matId)?.id
//item.matCode = matVos.list.find( (record) => record.id === item.matId)?.id
item.matName = matVos.list.find((record) => record.id === item.matId)?.name
item.matSpec = matVos.list.find((record) => record.id === item.matId)?.spec
item.matType = matVos.list.find((record) => record.id === item.matId)?.materialType
item.matUnit = matVos.list.find((record) => record.id === item.matId)?.unit
item.pnlist = pnList.value.filter((pn) => pn.rgId === item.rgId)
matCount = matCount + 1
})
//
let attParams = {
pageNo: 1,
pageSize: 99,
businessId: query.id,
businessType: 'STORAGE'
}
formData.value.attachments = (await getFilePage(attParams)).list;
}
//
userList.value = await UserApi.getSimpleUserList()
})
</script>
<style>
a {
color: #409eff;
text-decoration: none;
}</style>

@ -0,0 +1,316 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<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_OUT_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_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><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"
v-hasPermi="['heli:storage:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button> -->
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<!-- <el-table-column label="主键id" align="center" prop="id" /> -->
<el-table-column label="出库单号" align="center" prop="stockNo" />
<el-table-column label="出库类型" align="center" prop="stockInType">
<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" />
<el-table-column label="出库仓库" align="center" prop="whId" >
<template #default="scope">
{{ warehouseList.find((tag) => tag.id === scope.row.whId)?.whName }}
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="description" />
<el-table-column label="创建人" align="center" prop="creator" >
<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"
width="180px"
/>
<el-table-column label="提交人" align="center" prop="keeper" >
<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"
width="180px"
/>
<el-table-column label="作废人" align="center" prop="cancel" >
<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"
width="180px"
/>
<el-table-column label="单据状态" align="center" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_STORAGE_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button
link
type="primary"
@click="openDetail('update',scope.row.id)"
>
编辑
</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>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import * as StorageApi from '@/api/heli/storage'
import * as WarehouseApi from '@/api/heli/warehouse'
import * as UserApi from "@/api/system/user";
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: 2,
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 formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 详情操作 新增/查看 */
const openDetail = (active: string,id?: number) => {
router.push({ path: '/inventory/storageoutdetail', query: {type: active,id: id}});
}
/** 初始化 **/
onMounted(async () => {
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()
})
onActivated(() => {
getList()
})
</script>
Loading…
Cancel
Save