1232 lines
44 KiB
Vue
1232 lines
44 KiB
Vue
|
|
<template>
|
|||
|
|
<!-- 出库 -->
|
|||
|
|
<el-card class="hl-card" style="position: relative">
|
|||
|
|
<template #header>
|
|||
|
|
<span v-text="dialogTitle"></span>
|
|||
|
|
</template>
|
|||
|
|
<div class="abstatus">
|
|||
|
|
<img src="/src/assets/imgs/status/status2.png" v-if="formData.status == 2" alt="" />
|
|||
|
|
<img src="/src/assets/imgs/status/statuszf.png" v-else-if="formData.status == 3" alt="" />
|
|||
|
|
<img src="/src/assets/imgs/status/status16.png" v-else-if="formData.status == 4" alt="" />
|
|||
|
|
<span v-else></span>
|
|||
|
|
</div>
|
|||
|
|
<el-form
|
|||
|
|
ref="formRef" :model="formData" :rules="formRules" label-width="100px" v-loading="formLoading"
|
|||
|
|
:disabled="isShowBtnOther">
|
|||
|
|
<!-- 基础信息 -->
|
|||
|
|
<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%" @change="handleStockType"
|
|||
|
|
:disabled="ctrView || ctrSave">
|
|||
|
|
<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-col :span="24">
|
|||
|
|
<el-form-item prop="projectSubName" label="子项目名称">
|
|||
|
|
<el-input v-model="formData.projectSubName" :disabled="ctrView || ctrSave" readonly>
|
|||
|
|
<template #append><el-button @click="openProjectForm(scope)">
|
|||
|
|
<Icon icon="ep:search" class="mr-5px" />
|
|||
|
|
</el-button></template>
|
|||
|
|
</el-input>
|
|||
|
|
</el-form-item>
|
|||
|
|
</el-col>
|
|||
|
|
</el-row>
|
|||
|
|
<el-row>
|
|||
|
|
<el-col :span="24">
|
|||
|
|
<el-form-item label="领料人" prop="materialReceiver">
|
|||
|
|
<UserSelect v-model="formData.materialReceiver" placeholder="请选择领料人" @update:newValue="handleSelectedUser" class="!w-700px" :disabled="ctrView || ctrSave"/>
|
|||
|
|
</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" class="!w-700px"
|
|||
|
|
:disabled="ctrView || ctrSave || enableHeadNo" />
|
|||
|
|
</el-form-item>
|
|||
|
|
</el-col>
|
|||
|
|
</el-row>
|
|||
|
|
<el-row>
|
|||
|
|
<el-col :span="24">
|
|||
|
|
<el-form-item prop="pickmode" label="领料模式" >
|
|||
|
|
<el-select
|
|||
|
|
v-model="formData.pickmode" placeholder="下拉选择" clearable class="!w-400px" @change="changebom"
|
|||
|
|
:disabled="ctrView || ctrSave">
|
|||
|
|
<el-option
|
|||
|
|
v-for="dict in getIntDictOptions(DICT_TYPE.PICKMODE)" :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 label="单据日期" prop="createTime">
|
|||
|
|
<el-date-picker
|
|||
|
|
v-model="formData.createTime" value-format="x" placeholder="单据日期" disabled
|
|||
|
|
class="!w-400px" />
|
|||
|
|
</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"
|
|||
|
|
:disabled="ctrView || ctrSave">
|
|||
|
|
<el-option v-for="dict in whList" :key="dict.id" :label="dict.whName" :value="dict.id" />
|
|||
|
|
</el-select>
|
|||
|
|
</el-form-item>
|
|||
|
|
</el-col>
|
|||
|
|
</el-row>
|
|||
|
|
<el-row>
|
|||
|
|
<el-col :span="24">
|
|||
|
|
<el-form-item prop="pickcar" label="领料车间" >
|
|||
|
|
<el-select
|
|||
|
|
v-model="formData.pickcar" placeholder="下拉选择" clearable class="!w-400px"
|
|||
|
|
:disabled="ctrView || ctrSave">
|
|||
|
|
<el-option
|
|||
|
|
v-for="dict in getIntDictOptions(DICT_TYPE.PICKCAR)" :key="dict.value"
|
|||
|
|
:label="dict.label" :value="dict.value" />
|
|||
|
|
</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" class="!w-2080px"
|
|||
|
|
:disabled="ctrView || ctrSave" />
|
|||
|
|
</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" :disabled="ctrView || ctrSave"
|
|||
|
|
@click="openMatForm">新增</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 type="index" label="序号" min-width="80" align="center" fixed />
|
|||
|
|
<el-table-column prop="matCode" min-width="180" align="center">
|
|||
|
|
<template #header> <span class="hl-table_header">*</span> 物料编码</template>
|
|||
|
|
<template #default="scope">
|
|||
|
|
<el-form-item :prop="`${scope.$index}.matCode`" :rules="subFormRules.matCode" class="mb-0px!">
|
|||
|
|
<!-- <MaterialSelect v-model="scope.row.matId"
|
|||
|
|
@update:newValue="handleSelectedMaterial(scope.$index, $event)"
|
|||
|
|
v-bind:disabled="ctrView || ctrSave" /> -->
|
|||
|
|
<el-input
|
|||
|
|
class="!w-265px" placeholder="物料编码" :disabled="true || ctrView || ctrSave"
|
|||
|
|
v-model="scope.row.matCode" readonly>
|
|||
|
|
<!-- <template #append><el-button @click="openMatForm" disabled>
|
|||
|
|
<Icon icon="ep:search" class="mr-5px" />
|
|||
|
|
</el-button></template> -->
|
|||
|
|
</el-input>
|
|||
|
|
</el-form-item>
|
|||
|
|
</template>
|
|||
|
|
</el-table-column>
|
|||
|
|
<el-table-column prop="matName" label="物料名称" min-width="180" align="center" />
|
|||
|
|
<el-table-column prop="matType" label="物料类型" min-width="120" align="center">
|
|||
|
|
<!-- <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="规格/型号" min-width="120" align="center" />
|
|||
|
|
|
|||
|
|
<el-table-column prop="matUnit" label="系统单位" min-width="120" align="center">
|
|||
|
|
<!-- <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" min-width="120" align="center">
|
|||
|
|
<template #header> <span class="hl-table_header">*</span>出库库区 </template>
|
|||
|
|
<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%" :disabled="true">
|
|||
|
|
<el-option v-for="dict in rgList" :key="dict.id" :label="dict.rg_name" :value="dict.id" />
|
|||
|
|
</el-select>
|
|||
|
|
</el-form-item>
|
|||
|
|
</template>
|
|||
|
|
</el-table-column>
|
|||
|
|
<el-table-column prop="pnId" min-width="160" align="center">
|
|||
|
|
<template #header> <span class="hl-table_header">*</span>出库库位 </template>
|
|||
|
|
<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%"
|
|||
|
|
:disabled="ctrView || ctrSave" @change="handlePn(scope)">
|
|||
|
|
<el-option
|
|||
|
|
v-for="dict in scope.row.pnlist" :key="dict.id" :label="dict.pn_name"
|
|||
|
|
:value="dict.id" />
|
|||
|
|
</el-select>
|
|||
|
|
</el-form-item>
|
|||
|
|
</template>
|
|||
|
|
</el-table-column>
|
|||
|
|
<el-table-column prop="matRest" label="库存数量" min-width="120" align="center" />
|
|||
|
|
<el-table-column prop="storageOkQty" min-width="120" align="center">
|
|||
|
|
<template #header> <span class="hl-table_header">*</span>出库数量</template>
|
|||
|
|
<template #default="scope">
|
|||
|
|
<el-form-item
|
|||
|
|
:prop="`${scope.$index}.storageOkQty`" :rules="subFormRules.storageOkQty"
|
|||
|
|
class="mb-0px!">
|
|||
|
|
<el-input v-model="scope.row.storageOkQty" :disabled="ctrView || ctrSave" />
|
|||
|
|
</el-form-item>
|
|||
|
|
</template>
|
|||
|
|
</el-table-column>
|
|||
|
|
<el-table-column prop="price" label="库存单价" min-width="120" align="center" />
|
|||
|
|
<el-table-column prop="lotNo" min-width="120" label="批次号" align="center" v-if="false" />
|
|||
|
|
<el-table-column prop="projectSubName" label="子项目名称" align="center" min-width="180">
|
|||
|
|
|
|||
|
|
<template #default="scope">
|
|||
|
|
<el-input v-model="scope.row.projectSubName" disabled>
|
|||
|
|
<template #append></template>
|
|||
|
|
</el-input>
|
|||
|
|
</template>
|
|||
|
|
</el-table-column>
|
|||
|
|
<el-table-column prop="description" min-width="180" label="备注" align="center">
|
|||
|
|
<template #default="scope">
|
|||
|
|
<el-input v-model="scope.row.description" :disabled="ctrView || ctrSave" />
|
|||
|
|
</template>
|
|||
|
|
</el-table-column>
|
|||
|
|
<el-table-column label="操作" align="center" width="100">
|
|||
|
|
<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)"
|
|||
|
|
:disabled="ctrView || ctrDelete">
|
|||
|
|
删除
|
|||
|
|
</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 :action="uploadUrl" :headers="{
|
|||
|
|
Authorization: 'Bearer ' + getAccessToken(),
|
|||
|
|
'tenant-id': getTenantId()
|
|||
|
|
}" name="files" :show-file-list="false" :auto-upload="false" :data="matUploadData"
|
|||
|
|
:on-change="matUploadChange" :on-error="handleError" :on-success="handleSuccess"
|
|||
|
|
:before-upload="before" class="upload-file-uploader">
|
|||
|
|
<el-button type="primary" :disabled="ctrView || ctrSave">
|
|||
|
|
<Icon icon="ep:upload-filled" />上传
|
|||
|
|
</el-button>
|
|||
|
|
</el-upload>
|
|||
|
|
</el-col>
|
|||
|
|
<el-table
|
|||
|
|
:data="formData.attachments" class="hl-table" v-loading.fullscreen.lock="uploading"
|
|||
|
|
element-loading-text="附件上传中..." element-loading-background="rgba(122, 122, 122, 0.6)">
|
|||
|
|
<el-table-column prop="name" label="文件名称" align="center">
|
|||
|
|
<!-- <template #default="scope">
|
|||
|
|
<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" :disabled="ctrView || ctrDelete"
|
|||
|
|
@click="handleDeleteAttachment(scope.$index, scope.row.businessFileType)">
|
|||
|
|
删除
|
|||
|
|
</el-button>
|
|||
|
|
<el-button
|
|||
|
|
link type="primary" size="small" :disabled="ctrView || ctrDelete"
|
|||
|
|
@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>
|
|||
|
|
<el-button @click="() => router.go(-1)" size="large" style="margin-left: 5rem">取 消</el-button>
|
|||
|
|
<el-button @click="handleStatus(4)" type="success" v-if="btnok " size="large">审核</el-button>
|
|||
|
|
</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="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-row justify="center">
|
|||
|
|
<el-col :span="8">
|
|||
|
|
<el-form-item prop="cancel" label="作废人">
|
|||
|
|
{{ userList.find((user) => user.id == formData.cancel)?.nickname }}
|
|||
|
|
</el-form-item>
|
|||
|
|
</el-col>
|
|||
|
|
<el-col :span="8">
|
|||
|
|
<el-form-item prop="cancelTime" label="作废时间">
|
|||
|
|
{{ formatDate(formData.cancelTime, 'YYYY-MM-DD HH:mm') }}
|
|||
|
|
</el-form-item>
|
|||
|
|
</el-col>
|
|||
|
|
</el-row>
|
|||
|
|
</el-card>
|
|||
|
|
</el-form>
|
|||
|
|
<!-- <div class="hl-footer text-center">-->
|
|||
|
|
<!-- -->
|
|||
|
|
<!-- </div>-->
|
|||
|
|
</el-card>
|
|||
|
|
<el-dialog v-model="centerDialogVisible" title="提示" width="30%" center>
|
|||
|
|
<span>
|
|||
|
|
作废该单据后无法复原,请确认是否作废?
|
|||
|
|
</span>
|
|||
|
|
<template #footer>
|
|||
|
|
<span class="dialog-footer">
|
|||
|
|
<el-button type="primary" @click="deleteStorage()">
|
|||
|
|
确认
|
|||
|
|
</el-button>
|
|||
|
|
<el-button @click="centerDialogVisible = false">取消</el-button>
|
|||
|
|
</span>
|
|||
|
|
</template>
|
|||
|
|
</el-dialog>
|
|||
|
|
<!-- 表单弹窗:物料列表 -->
|
|||
|
|
<materials ref="matOpenFormRef" @success="getList" />
|
|||
|
|
<!-- 表单弹窗:物料列表 -->
|
|||
|
|
<projects ref="proOpenFormRef" @success="getProject" />
|
|||
|
|
</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 { useUserStore } from '@/store/modules/user'
|
|||
|
|
import MaterialSelect from '@/views/heli/hlvuestyle/materialSelect.vue'
|
|||
|
|
|
|||
|
|
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'
|
|||
|
|
|
|||
|
|
import materials from './materials.vue'
|
|||
|
|
import projects from './subproject.vue'
|
|||
|
|
import UserSelect from "@/views/heli/hlvuestyle/userSelect.vue";
|
|||
|
|
|
|||
|
|
const reload: any = inject('reload')
|
|||
|
|
|
|||
|
|
const { t } = useI18n() // 国际化
|
|||
|
|
const message = useMessage() // 消息弹窗
|
|||
|
|
const { query } = useRoute()
|
|||
|
|
const router = useRouter()
|
|||
|
|
const centerDialogVisible = ref(false)
|
|||
|
|
const dialogTitle = ref('') // 弹窗的标题
|
|||
|
|
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
|||
|
|
const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
|||
|
|
const formData = ref({
|
|||
|
|
id: undefined,
|
|||
|
|
stockType: 2,
|
|||
|
|
stockInType: undefined,
|
|||
|
|
projectSubName:undefined,
|
|||
|
|
pickmode:undefined,
|
|||
|
|
pickcar:undefined,
|
|||
|
|
projectNo: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: [],
|
|||
|
|
beforeStatus:undefined,
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
const formRules = reactive({
|
|||
|
|
// name: [{ required: true, message: '模具类型不能为空', trigger: 'blur' }],
|
|||
|
|
status: [{ required: true, message: '启用状态不能为空', trigger: 'blur' }],
|
|||
|
|
stockInType: [{ required: true, message: '出库类型不能为空', trigger: 'blur' }],
|
|||
|
|
// projectSubName: [{ required: true, message: '子项目名称不能为空', trigger: 'blur' }],
|
|||
|
|
// pickmode: [{ required: true, message: '领料模式不能为空', trigger: 'blur' }],
|
|||
|
|
// pickcar: [{ 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' }],
|
|||
|
|
matCode: [{ required: true, message: '物料编码不能为空', trigger: 'blur' }],
|
|||
|
|
rgId: [{ required: true, message: '库区不能为空', trigger: 'blur' }],
|
|||
|
|
pnId: [{ required: true, message: '库位不能为空', trigger: 'blur' }],
|
|||
|
|
storageOkQty: [{ required: true, message: '出库数量不能为空', trigger: 'blur' }]
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
|
|||
|
|
const matOpenFormRef = ref()
|
|||
|
|
const proOpenFormRef = ref()
|
|||
|
|
|
|||
|
|
const openMatForm = () => {
|
|||
|
|
// if (formData.value.whId == undefined || formData.value.whId == '') {
|
|||
|
|
// message.alertWarning('请选择入库仓库')
|
|||
|
|
// return
|
|||
|
|
// }
|
|||
|
|
// formData.value.whId
|
|||
|
|
if(formData.value.pickmode==1){
|
|||
|
|
matOpenFormRef.value.open(formData.value.projectNo, 'bomfind')
|
|||
|
|
|
|||
|
|
}else{
|
|||
|
|
matOpenFormRef.value.open(formData.value.whId, 'out')
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const openProjectForm = (scope) => {
|
|||
|
|
|
|||
|
|
proOpenFormRef.value.open(scope)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const handleSelectedUser = (newValue: any) => {
|
|||
|
|
formData.value.materialReceiver = newValue?.id
|
|||
|
|
}
|
|||
|
|
const getList = async (arrMat) => {
|
|||
|
|
|
|||
|
|
arrMat.forEach((row) => {
|
|||
|
|
if (
|
|||
|
|
formData.value.matItemDOList.filter(
|
|||
|
|
(item) =>
|
|||
|
|
item.matId == row.id &&
|
|||
|
|
item.whId == row.whId &&
|
|||
|
|
item.rgId == row.rgId &&
|
|||
|
|
item.pnId == row.pnId
|
|||
|
|
).length == 0
|
|||
|
|
) {
|
|||
|
|
if(row.whId1){
|
|||
|
|
row.matId = row.matId
|
|||
|
|
}else{
|
|||
|
|
row.matId = row.id
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
row.projectNo = formData.value.projectNo
|
|||
|
|
row.projectSubName =formData.value.projectSubName
|
|||
|
|
row.pnlist = ref([])
|
|||
|
|
row.pnlist = pnList.value.filter((pn) => pn.wh_id == row.whId && pn.rg_id == row.rgId)
|
|||
|
|
if (row.pnlist.length == 0) {
|
|||
|
|
row.rgId = ''
|
|||
|
|
row.pnId = ''
|
|||
|
|
row.matRest = 0
|
|||
|
|
row.projectNo = formData.value.projectNo
|
|||
|
|
row.projectSubName =formData.value.projectSubName
|
|||
|
|
}
|
|||
|
|
formData.value.matItemDOList.push(row)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const getProject = async (pro, scope) => {
|
|||
|
|
formData.value.projectSubName=pro.projectSubName
|
|||
|
|
|
|||
|
|
formData.value.projectNo=pro.projectSubId
|
|||
|
|
|
|||
|
|
// formData.value.matItemDOList.forEach(
|
|||
|
|
// (item) => {
|
|||
|
|
// if (item.matId == scope.value.row.matId && item.whId == scope.value.row.whId && item.rgId == scope.value.row.rgId && item.pnId == scope.value.row.pnId) {
|
|||
|
|
// item.projectNo = pro.projectSubId
|
|||
|
|
// item.projectSubName = pro.projectSubName
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// )
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 根据出库类型显示上游单号
|
|||
|
|
const enableHeadNo = ref(false)
|
|||
|
|
const handleStockType = async (typeid) => {
|
|||
|
|
if(typeid==5){
|
|||
|
|
// 当 typeid 等于 5 时,启用验证规则
|
|||
|
|
formRules.projectSubName = [{ required: true, message: '子项目名称不能为空', trigger: 'blur' }]
|
|||
|
|
formRules.pickmode = [{ required: true, message: '领料模式不能为空', trigger: 'blur' }]
|
|||
|
|
formRules.pickcar = [{ required: true, message: '领料车间不能为空', trigger: 'blur' }]
|
|||
|
|
} else {
|
|||
|
|
// 当 typeid 不等于 5 时,移除验证规则
|
|||
|
|
delete formRules.projectSubName
|
|||
|
|
delete formRules.pickmode
|
|||
|
|
delete formRules.pickcar
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
formData.value.headerNo = ''
|
|||
|
|
if (typeid == 1) {
|
|||
|
|
enableHeadNo.value = false
|
|||
|
|
} else {
|
|||
|
|
enableHeadNo.value = true
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
const deleteData = ref<StorageApi.StorageVO>();
|
|||
|
|
const deleteStorage = async() =>{
|
|||
|
|
await StorageApi.updateStorage(deleteData.value)
|
|||
|
|
deleteData.value.cancel = useUserStore().getUser.id
|
|||
|
|
commonResult = 'common.updateSuccess'
|
|||
|
|
await StorageApi.updateStorageStatus(deleteData.value)
|
|||
|
|
|
|||
|
|
message.success(t('common.updateSuccess'))
|
|||
|
|
|
|||
|
|
query.id = formData.value.id
|
|||
|
|
query.type = 'update'
|
|||
|
|
if (sumbefore.value == 0) {
|
|||
|
|
reload()
|
|||
|
|
}
|
|||
|
|
centerDialogVisible.value = false
|
|||
|
|
}
|
|||
|
|
const handleStatus = async (num) => {
|
|||
|
|
formData.value.status = num
|
|||
|
|
const data = formData.value as unknown as StorageApi.StorageVO
|
|||
|
|
if (num == 2) {
|
|||
|
|
// 校验表单
|
|||
|
|
await formRef.value.validate()
|
|||
|
|
if (formData.value.matItemDOList.length === 0) {
|
|||
|
|
message.alertWarning('请添加物料信息!')
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
// 校验子表单
|
|||
|
|
try {
|
|||
|
|
await matSubFormRef.value.validate()
|
|||
|
|
} catch (e) {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var repeatItem = []
|
|||
|
|
formData.value.matItemDOList.forEach(item => {
|
|||
|
|
if (formData.value.matItemDOList.filter((mat) => mat.matId == item.matId && mat.pnId == item.pnId).length > 1) {
|
|||
|
|
var tmpCode = "[" + item.matCode + "]"
|
|||
|
|
if (repeatItem.indexOf(tmpCode) < 0) {
|
|||
|
|
repeatItem.push(tmpCode)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
if (repeatItem.length > 0) {
|
|||
|
|
message.alertWarning(
|
|||
|
|
'物料编码' + repeatItem.join(',') + '出库库位存在多行数据,请修改,避免重复出库'
|
|||
|
|
)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
//获取最新库存信息
|
|||
|
|
const matCurrentData = await StorageMatApi.getStorageMatList(0)
|
|||
|
|
var hasRestNum = true
|
|||
|
|
formData.value.matItemDOList.forEach((rest) => {
|
|||
|
|
if (
|
|||
|
|
matCurrentData.find(
|
|||
|
|
(mat) =>
|
|||
|
|
mat.matId == rest.matId &&
|
|||
|
|
mat.pnId == rest.pnId &&
|
|||
|
|
mat.matRest < Number(rest.storageOkQty)
|
|||
|
|
) !== undefined ||
|
|||
|
|
rest.storageOkQty.length == 0
|
|||
|
|
) {
|
|||
|
|
hasRestNum = false
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
if (!hasRestNum) {
|
|||
|
|
message.alertWarning('物料库存不足')
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
// 提示用户是否保存出库信息
|
|||
|
|
await message.confirm('确认提交出库信息?')
|
|||
|
|
//保存表单数据
|
|||
|
|
await saveFormData()
|
|||
|
|
|
|||
|
|
data.outbound = useUserStore().getUser.id
|
|||
|
|
} else if(num ==3) {
|
|||
|
|
deleteData.value = data;
|
|||
|
|
centerDialogVisible.value = true;
|
|||
|
|
}else{
|
|||
|
|
await StorageApi.updateStorageok(data)
|
|||
|
|
if(formData.value.stockOutType == 1){
|
|||
|
|
const dataMats = formData.value.matItemDOList as unknown as StorageMatApi.StorageMatVO[]
|
|||
|
|
await StorageMatApi.createStorageMatBatch(dataMats, formData.value.id)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
if(num != 3){
|
|||
|
|
await StorageApi.updateStorageStatus(data)
|
|||
|
|
|
|||
|
|
message.success(t('common.updateSuccess'))
|
|||
|
|
|
|||
|
|
query.id = formData.value.id
|
|||
|
|
query.type = 'update'
|
|||
|
|
if (sumbefore.value == 0) {
|
|||
|
|
reload()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ====================附件信息 开始=======================================
|
|||
|
|
const uploadUrl = ref(import.meta.env.VITE_UPLOAD_BATCH_URL)
|
|||
|
|
const matUploadRef = ref()
|
|||
|
|
const matUploadFiles = ref<UploadUserFile[]>([])
|
|||
|
|
const uploading = ref(false)
|
|||
|
|
const matUploadData = ref({
|
|||
|
|
businessType: 'STORAGE',
|
|||
|
|
businessId: formData.value.id,
|
|||
|
|
businessFileType: 'MATERIAL'
|
|||
|
|
})
|
|||
|
|
const matUploadChange = (file, files) => {
|
|||
|
|
matUploadFiles.value = files
|
|||
|
|
refreshAttachments(files, 'MATERIAL')
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 记录待上传、成功上传及失败上传的文件数量
|
|||
|
|
const sumbefore = ref(0)
|
|||
|
|
const successfulUploadsCount = ref(0)
|
|||
|
|
const failedUploadsCount = ref(0)
|
|||
|
|
const failedAttachments = ref<UploadUserFile[]>([])
|
|||
|
|
const failedAttachmentsName = ref()
|
|||
|
|
|
|||
|
|
// 处理单个文件上传成功的情况
|
|||
|
|
const handleSuccess = (response: any, file: UploadUserFile) => {
|
|||
|
|
successfulUploadsCount.value++
|
|||
|
|
// 更新附件信息等其他逻辑...
|
|||
|
|
// console.log('上传成功数量', successfulUploadsCount.value)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 处理单个文件上传失败的情况
|
|||
|
|
const handleError = (error: Error, file: UploadUserFile) => {
|
|||
|
|
failedUploadsCount.value++
|
|||
|
|
if (failedUploadsCount.value > 0) {
|
|||
|
|
// 当有上传错误时
|
|||
|
|
// 将失败的附件添加到failedAttachments.value数组中
|
|||
|
|
failedAttachments.value.push(file)
|
|||
|
|
failedAttachmentsName.value = failedAttachments.value.map((value) => value.name)
|
|||
|
|
}
|
|||
|
|
// console.log('上传失败数量', failedUploadsCount.value)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 文件上传前的钩子
|
|||
|
|
const before = (rawFile) => {
|
|||
|
|
sumbefore.value++
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const refreshAttachments = (files, type) => {
|
|||
|
|
formData.value.attachments = formData.value.attachments.filter((value) => value.id)
|
|||
|
|
|
|||
|
|
// 避免重复添加
|
|||
|
|
const newFiles = files.filter(
|
|||
|
|
(file) => !formData.value.attachments.some((att) => att.name === file.name)
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
for (let i = 0; i < newFiles.length; i++) {
|
|||
|
|
let file = newFiles[i]
|
|||
|
|
file.businessFileType = type
|
|||
|
|
file.createTime = new Date()
|
|||
|
|
formData.value.attachments.push(file)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 排序
|
|||
|
|
formData.value.attachments.sort((v1, v2) => v1.createTime - v2.createTime)
|
|||
|
|
// 文件上传一遍 上传总数等于要上传文件时 刷新页面
|
|||
|
|
const sum = successfulUploadsCount.value + failedUploadsCount.value
|
|||
|
|
// console.log('上传总数', sum)
|
|||
|
|
// console.log('要上传文件数量', sumbefore.value)
|
|||
|
|
if (sumbefore.value !== sum && sumbefore.value !== 0 && sum !== 0) {
|
|||
|
|
// console.log('要上传文件数量不等于上传总数时等待',uploading.value)
|
|||
|
|
uploading.value = true
|
|||
|
|
} else if (sum == sumbefore.value && sumbefore.value > 0 && sum > 0) {
|
|||
|
|
// console.log('要上传文件数量等于上传总数 刷新页面并给出提示')
|
|||
|
|
if (failedUploadsCount.value > 0) {
|
|||
|
|
ElMessageBox.alert(
|
|||
|
|
// 使用错误信息作为提示内容
|
|||
|
|
`文件名为:${failedAttachmentsName.value.join(' / ')}上传失败`,
|
|||
|
|
`文件格式不正确或网络问题 请您稍后再试`,
|
|||
|
|
{
|
|||
|
|
dangerouslyUseHTMLString: false,
|
|||
|
|
confirmButtonText: '知道了',
|
|||
|
|
center: true
|
|||
|
|
}
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
reload()
|
|||
|
|
uploading.value = false
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 删除附件
|
|||
|
|
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) => {
|
|||
|
|
if (url) {
|
|||
|
|
|
|||
|
|
const baseUrl = import.meta.env.VITE_BASE_URL;
|
|||
|
|
url =baseUrl+'/admin-api/'+ url.split('/admin-api/')[1]; const data = await downloadFile(url)
|
|||
|
|
download.any(data, name)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// ====================附件信息 结束=======================================
|
|||
|
|
|
|||
|
|
var commonResult = ''
|
|||
|
|
|
|||
|
|
/** 提交表单 */
|
|||
|
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
|||
|
|
|
|||
|
|
const saveFormData = async () => {
|
|||
|
|
// 提交请求
|
|||
|
|
formLoading.value = true
|
|||
|
|
try {
|
|||
|
|
const data = formData.value as unknown as StorageApi.StorageVO
|
|||
|
|
if (query.type === 'create') {
|
|||
|
|
//库存信息保存
|
|||
|
|
formData.value.id = await StorageApi.createStorage(data)
|
|||
|
|
commonResult = 'common.createSuccess'
|
|||
|
|
} else {
|
|||
|
|
await StorageApi.updateStorage(data)
|
|||
|
|
commonResult = 'common.updateSuccess'
|
|||
|
|
}
|
|||
|
|
//物料信息保存
|
|||
|
|
formData.value.matItemDOList.forEach((item) => {
|
|||
|
|
item.stockId = formData.value.id
|
|||
|
|
item.whId = formData.value.whId
|
|||
|
|
})
|
|||
|
|
const dataMats = formData.value.matItemDOList as unknown as StorageMatApi.StorageMatVO[]
|
|||
|
|
await StorageMatApi.createStorageMatBatch(dataMats, formData.value.id)
|
|||
|
|
|
|||
|
|
if (formData.value.attachments != undefined && formData.value.attachments.length > 0) {
|
|||
|
|
//附件信息保存
|
|||
|
|
matUploadData.value.businessId = formData.value.id
|
|||
|
|
await matUploadRef.value!.submit()
|
|||
|
|
}
|
|||
|
|
await initStatus(formData.value.status)
|
|||
|
|
message.success(t(commonResult))
|
|||
|
|
} finally {
|
|||
|
|
formLoading.value = false
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
const submitForm = async () => {
|
|||
|
|
// 校验表单
|
|||
|
|
await formRef.value.validate()
|
|||
|
|
var repeatItem = []
|
|||
|
|
formData.value.matItemDOList.forEach(item => {
|
|||
|
|
if (formData.value.matItemDOList.filter((mat) => mat.matId == item.matId && mat.pnId == item.pnId).length > 1) {
|
|||
|
|
var tmpCode = "[" + item.matCode + "]"
|
|||
|
|
if (repeatItem.indexOf(tmpCode) < 0) {
|
|||
|
|
repeatItem.push(tmpCode)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
if (repeatItem.length > 0) {
|
|||
|
|
message.alertWarning(
|
|||
|
|
'物料编码' + repeatItem.join(',') + '出库库位存在多行数据,请修改,避免重复出库'
|
|||
|
|
)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
// if (formData.value.matItemDOList.length === 0) {
|
|||
|
|
// message.alertWarning('请添加物料信息!')
|
|||
|
|
// return
|
|||
|
|
// }
|
|||
|
|
// 校验子表单
|
|||
|
|
try {
|
|||
|
|
await matSubFormRef.value.validate()
|
|||
|
|
} catch (e) {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//获取最新库存信息
|
|||
|
|
const matCurrentData = await StorageMatApi.getStorageMatList(0)
|
|||
|
|
var hasRestNum = true
|
|||
|
|
formData.value.matItemDOList.forEach((rest) => {
|
|||
|
|
if (
|
|||
|
|
matCurrentData.find(
|
|||
|
|
(mat) =>
|
|||
|
|
mat.matId == rest.matId &&
|
|||
|
|
mat.pnId == rest.pnId &&
|
|||
|
|
mat.matRest < Number(rest.storageOkQty)
|
|||
|
|
) !== undefined ||
|
|||
|
|
rest.storageOkQty.length == 0
|
|||
|
|
) {
|
|||
|
|
hasRestNum = false
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
if (!hasRestNum) {
|
|||
|
|
message.alertWarning('物料库存不足')
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// // 提示用户是否保存出库信息
|
|||
|
|
// await message.confirm('确认保存出库信息?')
|
|||
|
|
|
|||
|
|
//保存表单数据
|
|||
|
|
await saveFormData()
|
|||
|
|
|
|||
|
|
// 成功后刷新
|
|||
|
|
query.id = formData.value.id
|
|||
|
|
query.type = 'update'
|
|||
|
|
if (sumbefore.value == 0) {
|
|||
|
|
reload()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
const onAddItem = () => {
|
|||
|
|
if (formData.value.whId) {
|
|||
|
|
const newData = {
|
|||
|
|
// 新数据的属性
|
|||
|
|
stockId: 0,
|
|||
|
|
matId: '',
|
|||
|
|
matName: '',
|
|||
|
|
matCode: '',
|
|||
|
|
matType: '',
|
|||
|
|
matSpec: '',
|
|||
|
|
matUnit: '',
|
|||
|
|
whId: '',
|
|||
|
|
rgId: '',
|
|||
|
|
pnId: '',
|
|||
|
|
pnlist: ref([]),
|
|||
|
|
storageOkQty: '',
|
|||
|
|
lotNo: '',
|
|||
|
|
description: '',
|
|||
|
|
productBomItemValueDOList: [],
|
|||
|
|
matList: matList.value
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
formData.value.matItemDOList.push(newData)
|
|||
|
|
} else {
|
|||
|
|
message.alertWarning('请选择出库仓库')
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//删除新增物料信息
|
|||
|
|
const handleDelete2 = (index: number) => {
|
|||
|
|
formData.value.matItemDOList.splice(index, 1)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//仓库全数据
|
|||
|
|
const whList = ref([])
|
|||
|
|
//库区全数据
|
|||
|
|
const rgList = ref([])
|
|||
|
|
//库位全数据
|
|||
|
|
const pnList = ref([])
|
|||
|
|
const handleWh = async (wid) => {
|
|||
|
|
formData.value.matItemDOList = []
|
|||
|
|
|
|||
|
|
formData.value.rgId = ''
|
|||
|
|
// 获得库区列表
|
|||
|
|
rgList.value = (await RgApi.getSimpList()).filter((rg) => rg.wh_id == wid)
|
|||
|
|
|
|||
|
|
// 获得库位列表
|
|||
|
|
pnList.value = (await PnApi.getSimpList()).filter((pn) => pn.wh_id == wid)
|
|||
|
|
|
|||
|
|
//await getMatList()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// const changebom = async (pickmode) => {
|
|||
|
|
// debugger
|
|||
|
|
// if(pickmode==1){
|
|||
|
|
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
const getMatList = async (name) => {
|
|||
|
|
// 获得物料列表
|
|||
|
|
let matParams = {
|
|||
|
|
pageNo: 1,
|
|||
|
|
pageSize: 10,
|
|||
|
|
status: '1'
|
|||
|
|
}
|
|||
|
|
if (name.length > 0) {
|
|||
|
|
matParams.name = name
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//const matLastRemoteData = await StorageMatApi.getStorageMatList(0)
|
|||
|
|
|
|||
|
|
const dataMat = await MaterialApi.getMaterialPage(matParams)
|
|||
|
|
matList.value = dataMat.list
|
|||
|
|
// matList.value = dataMat.list.filter(
|
|||
|
|
// (item) =>
|
|||
|
|
// matLastRemoteData.find(
|
|||
|
|
// (fish) => fish.matId === item.id && fish.whId == formData.value.whId
|
|||
|
|
// ) !== undefined
|
|||
|
|
// )
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const handlePn = async (scope) => {
|
|||
|
|
scope.row.matList = matList.value
|
|||
|
|
// var repeatItem = formData.value.matItemDOList.filter(
|
|||
|
|
// (mat) => mat.matId == scope.row.matId && mat.pnId == scope.row.pnId
|
|||
|
|
// )
|
|||
|
|
// if (repeatItem.length > 1) {
|
|||
|
|
// message.alertWarning(
|
|||
|
|
// '物料编码[' + repeatItem[0].matCode + ']出库库位存在多行数据,请修改,避免重复出库'
|
|||
|
|
// )
|
|||
|
|
// return
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
if (
|
|||
|
|
matLastData.value.find(
|
|||
|
|
(item) =>
|
|||
|
|
item.matId === scope.row.matId &&
|
|||
|
|
item.whId == formData.value.whId &&
|
|||
|
|
item.pnId == scope.row.pnId
|
|||
|
|
)
|
|||
|
|
) {
|
|||
|
|
const matVo = matLastData.value.find(
|
|||
|
|
(item) =>
|
|||
|
|
item.matId === scope.row.matId &&
|
|||
|
|
item.whId == formData.value.whId &&
|
|||
|
|
item.pnId == scope.row.pnId
|
|||
|
|
)
|
|||
|
|
// scope.row.matId = matVo.matId
|
|||
|
|
// scope.row.matName = matVo.matName
|
|||
|
|
// scope.row.matCode = matVo.matCode
|
|||
|
|
// scope.row.matSpec = matVo.matSpec
|
|||
|
|
// scope.row.matType = matVo.materialType
|
|||
|
|
// scope.row.matUnit = matVo.matUnit
|
|||
|
|
scope.row.rgId = matVo.rgId
|
|||
|
|
scope.row.pnId = matVo.pnId
|
|||
|
|
scope.row.matRest = matVo.matRest
|
|||
|
|
// scope.row.storageOkQty = matVo.storageOkQty
|
|||
|
|
// scope.row.lotNo = matVo.lotNo
|
|||
|
|
// scope.row.description = matVo.description
|
|||
|
|
} else {
|
|||
|
|
scope.row.rgId = ''
|
|||
|
|
scope.row.matRest = '0'
|
|||
|
|
message.alertWarning('当前库位无库存数量可出库')
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const matSelectLoading = ref(false)
|
|||
|
|
const remoteMatNameSearch = async (name) => {
|
|||
|
|
matSelectLoading.value = true
|
|||
|
|
// 获得物料列表
|
|||
|
|
await getMatList(name)
|
|||
|
|
matSelectLoading.value = false
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const handleMatName = async (scope, matid) => {
|
|||
|
|
scope.row.matId = scope.row.matList.find((item) => item.id === matid)?.id
|
|||
|
|
scope.row.matName = scope.row.matList.find((item) => item.id === matid)?.name
|
|||
|
|
scope.row.matCode = scope.row.matList.find((item) => item.id === matid)?.code
|
|||
|
|
scope.row.matSpec = scope.row.matList.find((item) => item.id === matid)?.spec
|
|||
|
|
scope.row.matType = scope.row.matList.find((item) => item.id === matid)?.materialType
|
|||
|
|
scope.row.matUnit = scope.row.matList.find((item) => item.id === matid)?.unit
|
|||
|
|
|
|||
|
|
scope.row.rgId = ''
|
|||
|
|
scope.row.pnId = ''
|
|||
|
|
if (matid.length == 0) {
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
scope.row.pnlist = pnList.value.filter(
|
|||
|
|
(pn) =>
|
|||
|
|
pn.wh_id == formData.value.whId &&
|
|||
|
|
matLastData.value.filter((mat) => mat.matId == matid && mat.pnId == pn.id).length > 0
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const matLastData = ref([])
|
|||
|
|
// 按钮控制
|
|||
|
|
const ctrView = ref(false)
|
|||
|
|
const ctrSave = ref(false)
|
|||
|
|
const ctrCancel = ref(true)
|
|||
|
|
const ctrDelete = ref(false)
|
|||
|
|
const btnSave = ref(true)
|
|||
|
|
const btnCancel = ref(false)
|
|||
|
|
const btnok = ref(true)
|
|||
|
|
|
|||
|
|
|
|||
|
|
// 根据页面动作和数据状态控制按钮输入框信息
|
|||
|
|
const initStatus = async (status) => {
|
|||
|
|
switch (status) {
|
|||
|
|
case 1:
|
|||
|
|
ctrView.value = false
|
|||
|
|
ctrSave.value = false
|
|||
|
|
ctrCancel.value = true
|
|||
|
|
ctrDelete.value = false
|
|||
|
|
btnSave.value = true
|
|||
|
|
btnCancel.value = false
|
|||
|
|
break
|
|||
|
|
case 2:
|
|||
|
|
ctrView.value = false
|
|||
|
|
ctrSave.value = true
|
|||
|
|
ctrCancel.value = false
|
|||
|
|
ctrDelete.value = true
|
|||
|
|
btnSave.value = false
|
|||
|
|
btnCancel.value = true
|
|||
|
|
break
|
|||
|
|
case 3:
|
|||
|
|
ctrView.value = true
|
|||
|
|
ctrSave.value = true
|
|||
|
|
ctrCancel.value = true
|
|||
|
|
ctrDelete.value = true
|
|||
|
|
btnSave.value = false
|
|||
|
|
btnCancel.value = false
|
|||
|
|
btnok.value=false
|
|||
|
|
break
|
|||
|
|
case 4:
|
|||
|
|
ctrView.value = true
|
|||
|
|
ctrSave.value = false
|
|||
|
|
ctrCancel.value = true
|
|||
|
|
ctrDelete.value = false
|
|||
|
|
btnSave.value = false
|
|||
|
|
btnCancel.value = false
|
|||
|
|
btnok.value=false
|
|||
|
|
break
|
|||
|
|
default:
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
// 查看页面时可操作控件禁用
|
|||
|
|
if (query.type === 'review') {
|
|||
|
|
ctrView.value = true
|
|||
|
|
ctrSave.value = true
|
|||
|
|
ctrCancel.value = true
|
|||
|
|
ctrDelete.value = true
|
|||
|
|
btnSave.value = false
|
|||
|
|
btnok.value=false
|
|||
|
|
// if(formData.value.status == 4){
|
|||
|
|
// btnCancel.value = true
|
|||
|
|
// }else{
|
|||
|
|
// btnCancel.value = false
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
const matList = ref<MaterialApi.MaterialVO[]>([]) // 物料列表
|
|||
|
|
const matEditList = ref<MaterialApi.MaterialVO[]>([]) // 物料列表
|
|||
|
|
const userList = ref<UserApi.UserVO[]>([]) // 用户列表
|
|||
|
|
const matSimpList = ref([]) // 物料基本信息列表
|
|||
|
|
const matSimpVirtualList = ref([]) // 物料基本信息列表
|
|||
|
|
/** 初始化 **/
|
|||
|
|
onMounted(async () => {
|
|||
|
|
// 页面标题展示
|
|||
|
|
dialogTitle.value = query.type === 'review' ? '查看' : t('action.' + query.type)
|
|||
|
|
|
|||
|
|
//- 获取仓库全数据
|
|||
|
|
whList.value = await WarehouseApi.getWarehouseSimpList()
|
|||
|
|
|
|||
|
|
formData.value.whId = Math.min.apply(Math, whList.value.map(function(i) {return i.id}));
|
|||
|
|
|
|||
|
|
//获取状态为启用的物料信息
|
|||
|
|
await getMatList('')
|
|||
|
|
|
|||
|
|
// // 获取当前最新库存信息
|
|||
|
|
// matLastData.value = await StorageMatApi.getStorageMatList(0)
|
|||
|
|
|
|||
|
|
// 编辑时获取入库单据信息,包括基础信息、物料信息、附件信息
|
|||
|
|
if (query.id) {
|
|||
|
|
// 获取原始物料信息
|
|||
|
|
matSimpList.value = await MaterialApi.getSimpList()
|
|||
|
|
matSimpVirtualList.value = await MaterialApi.getSimpVirtualList()
|
|||
|
|
|
|||
|
|
matEditList.value = matSimpList.value //matSimpList.value.filter( mat => matLastData.value.filter( row => row.matId == mat.id).length>0)
|
|||
|
|
|
|||
|
|
// 获取库存信息
|
|||
|
|
formData.value = await StorageApi.getStorage(query.id)
|
|||
|
|
if (formData.value.vmatName) {
|
|||
|
|
matEditList.value = matSimpVirtualList.value
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 页面控件可视初始化
|
|||
|
|
await initStatus(formData.value.status)
|
|||
|
|
|
|||
|
|
// 获得库区列表
|
|||
|
|
const dataRgList = await RgApi.getSimpList()
|
|||
|
|
rgList.value = dataRgList.filter((rg) => rg.wh_id == formData.value.whId)
|
|||
|
|
|
|||
|
|
// 获得库区列表
|
|||
|
|
const dataPnList = await PnApi.getSimpList()
|
|||
|
|
pnList.value = dataPnList.filter((pn) => pn.wh_id == formData.value.whId)
|
|||
|
|
|
|||
|
|
// 获取库存物料列表信息
|
|||
|
|
|
|||
|
|
const queryParamsMat = reactive({
|
|||
|
|
pageNo: 1,
|
|||
|
|
pageSize: 99,
|
|||
|
|
stockId: query.id
|
|||
|
|
})
|
|||
|
|
const dataMats = await StorageMatApi.getStorageMatPage(queryParamsMat)
|
|||
|
|
formData.value.matItemDOList = dataMats
|
|||
|
|
|
|||
|
|
var matTypes = getIntDictOptions(DICT_TYPE.HELI_MATERIAL_TYPE)
|
|||
|
|
var matUnits = getIntDictOptions(DICT_TYPE.HELI_MATERIAL_UNIT)
|
|||
|
|
// 填充物料原始信息
|
|||
|
|
formData.value.matItemDOList.forEach((item) => {
|
|||
|
|
item.matId = matEditList.value.find((record) => record.id === item.matId)?.id
|
|||
|
|
item.matCode = matEditList.value.find((record) => record.id === item.matId)?.code
|
|||
|
|
item.matName = matEditList.value.find((record) => record.id === item.matId)?.name
|
|||
|
|
item.matSpec = matEditList.value.find((record) => record.id === item.matId)?.spec
|
|||
|
|
item.matType = matTypes.find( op => op.value == matEditList.value.find((record) => record.id === item.matId)?.material_type)?.label
|
|||
|
|
item.matUnit = matUnits.find( op => op.value == matEditList.value.find((record) => record.id === item.matId)?.unit)?.label//matSimpList.value.find((record) => record.id === item.matId)?.unit
|
|||
|
|
// item.matRest = matLastData.value.find(
|
|||
|
|
// (row) => row.matId == item.matId && row.pnId == item.pnId
|
|||
|
|
// )?.matRest
|
|||
|
|
// console.log('ss'+item.matRest);
|
|||
|
|
// item.matRest = item.matRest == undefined || item.matRest.length == 0 ? 0 : item.matRest
|
|||
|
|
item.pnlist = pnList.value.filter((pn) => pn.wh_id === item.whId)
|
|||
|
|
item.matList = matEditList.value.filter((record) => record.id === item.matId)
|
|||
|
|
})
|
|||
|
|
// matList.value = matSimpList.value.filter( mat => matLastData.value.filter( row => row.matId == mat.id).length>0 || formData.value.matItemDOList.filter(fan => fan.matId == mat.id).length>0)
|
|||
|
|
|
|||
|
|
// if(matList.value.length == 0){
|
|||
|
|
// matList.value = matSimpVirtualList.value.filter( mat => matLastData.value.filter( row => row.matId == mat.id).length>0 || formData.value.matItemDOList.filter(fan => fan.matId == mat.id).length>0)
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// 附件信息
|
|||
|
|
let attParams = {
|
|||
|
|
pageNo: 1,
|
|||
|
|
pageSize: 99,
|
|||
|
|
businessId: query.id,
|
|||
|
|
businessType: 'STORAGE'
|
|||
|
|
}
|
|||
|
|
formData.value.attachments = (await getFilePage(attParams)).list
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//用户信息,用于底部数据展示
|
|||
|
|
userList.value = await UserApi.getSimpleUserList()
|
|||
|
|
formData.value.beforeStatus = formData.value.status;
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
//接收物料传递的数据
|
|||
|
|
const handleSelectedMaterial = (currentIndex: number, newValue: any) => {
|
|||
|
|
// console.log(currentIndex,'接收物料对应的数据:', newValue)
|
|||
|
|
formData.value.matItemDOList[currentIndex].matId = newValue?.id
|
|||
|
|
formData.value.matItemDOList[currentIndex].matName = newValue?.name
|
|||
|
|
formData.value.matItemDOList[currentIndex].matCode = newValue?.code
|
|||
|
|
formData.value.matItemDOList[currentIndex].matSpec = newValue?.spec
|
|||
|
|
formData.value.matItemDOList[currentIndex].matType = newValue?.materialType
|
|||
|
|
formData.value.matItemDOList[currentIndex].matUnit = newValue?.unit
|
|||
|
|
|
|||
|
|
formData.value.matItemDOList[currentIndex].rgId = ''
|
|||
|
|
formData.value.matItemDOList[currentIndex].pnId = ''
|
|||
|
|
|
|||
|
|
formData.value.matItemDOList[currentIndex].pnlist = pnList.value.filter(
|
|||
|
|
(pn) =>
|
|||
|
|
pn.wh_id == formData.value.whId &&
|
|||
|
|
matLastData.value.filter((mat) => mat.matId == newValue?.id && mat.pnId == pn.id).length > 0
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
<style>
|
|||
|
|
a {
|
|||
|
|
color: #409eff;
|
|||
|
|
text-decoration: none;
|
|||
|
|
}
|
|||
|
|
</style>
|