heli-mes/mes-ui/mes-ui-admin-vue3/src/views/heli/storagecheck/checkdetail.vue

871 lines
32 KiB
Vue
Raw Normal View History

2025-01-09 18:29:48 +08:00
<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="" />
<span v-else></span>
</div>
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="200px" 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="stockNo" label="盘点单号">
<el-input v-model="formData.stockNo" disabled placeholder="系统自动生成" 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 disabled class="!w-400px" @change="handleWh">
<el-option v-for="dict in whList" :key="dict.id" :label="dict.wh_name" :value="dict.id" />
</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="status" label="单据状态">
<el-select v-model="formData.status" placeholder="下拉选择" clearable class="!w-400px" disabled>
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_STORAGE_MAT_CHECK_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="checkType" label="盘点类型">
<el-select v-model="formData.checkType" clearable class="!w-400px" disabled>
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_STORAGE_MAT_CHECK_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">
2025-01-16 00:28:54 +08:00
<el-row>
2025-01-09 18:29:48 +08:00
<el-col :span="24">
2025-01-16 00:28:54 +08:00
<el-form-item label="排除库存为0的物料?" prop="noZero" >
<el-switch
v-model="noZeroSwich"
inline-prompt
active-text="是"
inactive-text="否"
disabled="true"
/>
<!-- <el-radio-group v-model="formData.noZero" disabled>
2025-01-09 18:29:48 +08:00
<el-radio v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" :key="dict.value" :label="dict.value">
{{ dict.label }}
</el-radio>
2025-01-16 00:28:54 +08:00
</el-radio-group> -->
2025-01-09 18:29:48 +08:00
</el-form-item>
</el-col>
2025-01-16 00:28:54 +08:00
</el-row>
2025-01-09 18:29:48 +08:00
<el-row>
<el-col :span="24">
<el-form-item label="盘点开始日期" prop="checkTime">
<el-date-picker v-model="formData.checkTime" value-format="x" placeholder="盘点开始时间" class="!w-220px" disabled />
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
<el-row>
<el-col :span="16">
<el-form-item label="备注" prop="description">
<el-input type="textarea" v-model="formData.description" show-word-limit maxlength="200" disabled />
</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>
2025-01-16 00:28:54 +08:00
<el-button class="hl-addbutton" type="primary" size="large" :disabled="ctrView || ctrSave" @click="openMatForm">获取物料</el-button>
2025-01-09 18:29:48 +08:00
</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="matCode" label="物料编码" min-width="120" align="center" />
<el-table-column prop="matName" label="物料名称" min-width="140" align="center" />
<el-table-column prop="matType" label="物料类型" min-width="120" align="center" />
<el-table-column prop="shortName" label="物料简称" min-width="120" align="center" />
<el-table-column prop="matSpec" label="规格/型号" min-width="120" align="center" />
<el-table-column prop="matBrand" label="品牌" min-width="120" align="center" />
<el-table-column prop="rgId" min-width="140" 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!">
2025-01-16 00:28:54 +08:00
<el-select v-model="scope.row.rgId" placeholder="" style="width: 100%" @change="(val)=>handleRg(val,scope)" :disabled="ctrView || ctrSave">
2025-01-09 18:29:48 +08:00
<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="180" 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!">
2025-01-16 00:28:54 +08:00
<el-select v-model="scope.row.pnId" placeholder="" style="width: 100%" @change="(val)=>handlePn(val,scope)" :disabled="ctrView || ctrSave">
2025-01-09 18:29:48 +08:00
<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" align="center" min-width="180" >
2025-01-09 18:29:48 +08:00
<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!">
2025-07-06 09:43:59 +08:00
<el-input-number v-model="scope.row.storageOkQty" :min="0" @change="(val)=>handleSub(val,scope)" :disabled="ctrView || ctrSave"/>
2025-01-09 18:29:48 +08:00
</el-form-item>
</template>
</el-table-column>
2025-07-05 22:46:22 +08:00
<!-- <el-table-column prop="money" min-width="120" align="center" >
2025-01-09 18:29:48 +08:00
<template #header> <span class="hl-table_header">*</span>金额</template>
<template #default="scope">
<el-form-item :prop="`${scope.$index}.money`" :rules="subFormRules.money" class="mb-0px!" >
<el-input v-model="scope.row.money" :disabled="ctrView || ctrSave" />
2025-01-09 18:29:48 +08:00
</el-form-item>
</template>
2025-07-05 22:46:22 +08:00
</el-table-column> -->
<el-table-column prop="onemoney" label="单价" align="center" min-width="180" >
2025-07-05 22:46:22 +08:00
<template #default="scope">
<el-form-item :prop="`${scope.$index}.onemoney`" class="mb-0px!">
2025-07-06 09:43:59 +08:00
<el-input-number v-model="scope.row.onemoney" :min="0" :disabled="ctrView || ctrSave"/>
2025-07-05 22:46:22 +08:00
</el-form-item>
</template>
</el-table-column>
2025-01-09 18:29:48 +08:00
<el-table-column prop="matSub" label="盈亏差异" min-width="120" align="center">
<template #default="scope">
<div v-if="scope.row.matSub<0" style="color:#EC808D;">
{{scope.row.matSub}}
</div>
<span v-else-if="scope.row.matSub>0" style="color:#63A103;">
+{{scope.row.matSub}}
</span>
<span v-else>
{{scope.row.matSub}}
</span>
</template>
</el-table-column>
<el-table-column prop="matUnit" label="库存单位" min-width="120" align="center" />
<el-table-column label="操作" align="center" width="240">
<template #default="scope" >
2025-01-16 00:28:54 +08:00
<el-button link type="danger" size="small" @click.prevent="handleDelete2(scope.$index)" :disabled="ctrView || ctrDelete" v-if="scope.row.isCopy==1">
2025-01-09 18:29:48 +08:00
删除
</el-button>
2025-01-16 00:28:54 +08:00
<el-button link type="primary" v-if="scope.row.isCopy==0" @click="handleCopy(scope.$index, scope.row)" :disabled="ctrView || ctrDelete">复制</el-button>
2025-01-09 18:29:48 +08:00
</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>
2025-01-16 00:28:54 +08:00
<el-upload
ref="matUploadRef" :file-list="matUploadFiles" multiple :action="uploadUrl" :headers="{
2025-01-09 18:29:48 +08:00
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">
2025-01-16 00:28:54 +08:00
<el-button type="primary" :disabled="ctrView || ctrSave">
2025-01-09 18:29:48 +08:00
<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="附件上传中..." style="margin-top: 10px" 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">
2025-01-16 00:28:54 +08:00
<el-button link type="danger" size="small" @click="handleDeleteAttachment(scope.$index, scope.row.businessFileType)" :disabled="ctrView || ctrDelete">
2025-01-09 18:29:48 +08:00
删除
</el-button>
2025-01-16 00:28:54 +08:00
<el-button link type="primary" size="small" @click="downloadAttachment(scope.row.name, scope.row.url)" :disabled="ctrView || ctrDelete">
2025-01-09 18:29:48 +08:00
下载
</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>
2025-07-20 20:38:44 +08:00
<el-button @click="() => router.go(-1)" size="large" style="margin-left: 5rem"> </el-button>
<el-button @click="submitForm" type="success" v-if="btnSave" size="large">
</el-button>
<el-button @click="handleStatus(2)" type="primary" v-if="btnSave" size="large">
</el-button>
<el-button @click="handleStatus(3)" type="danger" v-if="btnCancel" size="large">
</el-button>
2025-01-09 18:29:48 +08:00
</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="keepTime" 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="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> -->
2025-01-16 00:28:54 +08:00
<el-dialog v-model="centerDialogVisible" title="提醒" width="30%" center>
<span>
提交后将修改库存数量是否继续
</span>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="sureToSubmit()">
2025-01-16 00:28:54 +08:00
确认
</el-button>
<el-button @click="centerDialogVisible = false">取消</el-button>
2025-01-16 00:28:54 +08:00
</span>
</template>
</el-dialog>
<el-dialog v-model="deleteDialogVisible" title="提醒" width="30%" center>
<span>
删除后单据将被作废是否继续
</span>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="sureToDelete()">
2025-01-16 00:28:54 +08:00
确认
</el-button>
<el-button @click="deleteDialogVisible = false">取消</el-button>
2025-01-16 00:28:54 +08:00
</span>
</template>
</el-dialog>
2025-01-09 18:29:48 +08:00
</el-card>
</el-form>
2025-07-20 20:38:44 +08:00
<!-- <div class="hl-footer text-center">-->
<!-- -->
<!-- </div>-->
2025-01-09 18:29:48 +08:00
</el-card>
<!-- 表单弹窗物料列表 -->
<materials ref="matOpenFormRef" @success="getList" />
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { useRoute } from 'vue-router'
import { dateFormatter, formatDate } from '@/utils/formatTime'
import { getIntDictOptions, getDictLabel, DICT_TYPE } from '@/utils/dict'
import { getAccessToken, getTenantId } from '@/utils/auth'
import { useUserStore } from '@/store/modules/user'
import * as CheckApi from '@/api/heli/storagecheck'
import * as CheckMatApi from '@/api/heli/storagecheckmat'
import * as MatApi from '@/api/heli/material'
import * as UserApi from '@/api/system/user'
import * as WhApi from '@/api/heli/warehouse'
import * as RgApi from '@/api/heli/rg'
import * as PnApi from '@/api/heli/pn'
import type { UploadUserFile } from 'element-plus'
import { deleteFile, downloadFile, getFilePage } from '@/api/infra/file'
import download from '@/utils/download'
2025-01-16 00:28:54 +08:00
import materials from './materialsNew.vue'
2025-01-09 18:29:48 +08:00
const reload: any = inject('reload')
2025-01-16 00:28:54 +08:00
const centerDialogVisible = ref(false)
const deleteDialogVisible = ref(false)
2025-01-09 18:29:48 +08:00
const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗
const { query } = useRoute()
const router = useRouter()
2025-01-16 00:28:54 +08:00
const noZeroSwich = ref(false)
2025-01-09 18:29:48 +08:00
const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 表单的加载中1修改时的数据加载2提交的按钮禁用
const formData = ref({
id: undefined,
stockNo: undefined,
checkType: undefined,
checkTime: undefined,
status: undefined,
noZero: undefined,
whId: undefined,
description: 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 matOpenFormRef = ref()
const openMatForm = () => {
//noZero: number,whId?: number,isAll?: number
matOpenFormRef.value.open(formData.value.noZero, formData.value.whId, formData.value.checkType)
}
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' }],
storageOkQty: [{ required: true, message: '盘点数量不能为空', trigger: 'blur' }],
money: [{ required: true, message: '金额不能为空', trigger: 'blur' }]
})
const handleStatus = async (num) => {
2025-01-16 00:28:54 +08:00
formData.value.status = num
2025-01-09 18:29:48 +08:00
if (num == 2) {
// 校验表单
await formRef.value.validate()
if (formData.value.matItemDOList == undefined || formData.value.matItemDOList.length === 0) {
message.alertWarning('请添加物料信息!')
return
}
// 校验子表单
try {
var isRepeat = false
formData.value.matItemDOList.forEach((item) => {
if (
formData.value.matItemDOList.filter(
(mat) => mat.matId == item.matId && mat.pnId == item.pnId
).length > 1
) {
isRepeat = true
}
})
if (isRepeat) {
message.alertWarning('存在相同库位的物料信息,请修改,避免重复盘点!')
return
}
await matSubFormRef.value.validate()
} catch (e) {
return
}
formData.value.keeper = useUserStore().getUser.id
centerDialogVisible.value = true;
2025-01-09 18:29:48 +08:00
} else {
2025-01-16 00:28:54 +08:00
deleteDialogVisible.value = true;
}
}
const sureToDelete = async() =>{
2025-01-09 18:29:48 +08:00
formData.value.cancel = useUserStore().getUser.id
const data = formData.value as unknown as CheckApi.StorageCheckVO
2025-01-16 00:28:54 +08:00
deleteDialogVisible.value = false;
2025-01-09 18:29:48 +08:00
await CheckApi.updateStorageCheck(data)
2025-01-16 00:28:54 +08:00
await initStatus(formData.value.status)
if (sumbefore.value == 0) {
reload()
}
2025-01-09 18:29:48 +08:00
}
const getList = async (arrMat) => {
arrMat.forEach((row) => {
row.cid = matCount
if (
formData.value.matItemDOList.filter(
(item) =>
item.matId == row.id &&
item.whId == row.whId &&
item.rgId == row.rgId &&
item.pnId == row.pnId
).length == 0
) {
row.isCopy = 0
row.matId = row.id
row.pnlist = ref([])
row.pnlist = pnList.value.filter((pn) => pn.rg_id == row.rgId)
if (row.pnlist.length == 0) {
row.rgId = ''
row.pnId = ''
row.matRest = 0
}
2025-07-05 22:46:22 +08:00
console.log(row.price)
if(row.price){
row.onemoney = row.price
}
2025-01-09 18:29:48 +08:00
formData.value.matItemDOList.push(row)
matCount = matCount + 1
}
})
//formData.value.matItemDOList = arrMat
}
// 复制数据
const handleCopy = (index, item) => {
const data: any = formData.value.matItemDOList[index]
// 复制数据
const newData: any = {
...data,
isCopy: 1,
cid: matCount
}
// 添加新数据
formData.value.matItemDOList.splice(index + 1, 0, newData)
matCount = matCount + 1
}
const userList = ref<UserApi.UserVO[]>([]) // 用户列表
// ====================附件信息 开始=======================================
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: 'STORAGECHECK',
businessId: formData.value.id,
businessFileType: ''
})
const matUploadChange = (file, files) => {
matUploadFiles.value = files
refreshAttachments(files, '')
}
// 记录待上传、成功上传及失败上传的文件数量
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)
2025-01-09 18:29:48 +08:00
download.any(data, name)
}
}
// ====================附件信息 结束=======================================
/** 提交表单 */
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
const saveFormData = async () => {
// 提交请求
formLoading.value = true
try {
const data = formData.value as unknown as CheckApi.StorageCheckVO
await CheckApi.updateStorageCheck(data)
//物料信息保存
if (formData.value.matItemDOList) {
formData.value.matItemDOList.forEach((item) => {
item.checkId = formData.value.id
item.whId = formData.value.whId
})
}
const dataMats = formData.value.matItemDOList as unknown as CheckMatApi.StorageCheckMatVO[]
await CheckMatApi.createCheckMatBatch(dataMats, formData.value.id)
if (formData.value.attachments != undefined && formData.value.attachments.length > 0) {
//附件信息保存
matUploadData.value.businessId = formData.value.id
await matUploadRef.value!.submit()
}
message.success(t('common.updateSuccess'))
} finally {
formLoading.value = false
}
}
2025-01-16 00:28:54 +08:00
const sureToSubmit = async() =>{
centerDialogVisible.value = false;
//保存表单数据
await saveFormData()
await CheckApi.updateStorageCheckStatus(formData.value.id)
await initStatus(formData.value.status)
if (sumbefore.value == 0) {
reload()
}
2025-01-16 00:28:54 +08:00
}
2025-01-09 18:29:48 +08:00
const submitForm = async () => {
// 校验表单
await formRef.value.validate()
2025-01-16 00:28:54 +08:00
if (formData.value.matItemDOList == undefined || formData.value.matItemDOList.length === 0) {
message.alertWarning('请添加物料信息!')
return
}
2025-01-09 18:29:48 +08:00
// 校验子表单
try {
var isRepeat = false
formData.value.matItemDOList.forEach((item) => {
if (
formData.value.matItemDOList.filter(
(mat) => mat.matId == item.matId && mat.pnId == item.pnId
).length > 1
) {
isRepeat = true
}
})
if (isRepeat) {
message.alertWarning('存在相同库位的物料信息,请修改,避免重复盘点!')
return
}
2025-01-16 00:28:54 +08:00
2025-01-09 18:29:48 +08:00
await matSubFormRef.value.validate()
} catch (e) {
return
}
//保存表单数据
await saveFormData()
await initStatus(formData.value.status)
// 成功后刷新
if (sumbefore.value == 0) {
reload()
}
2025-01-09 18:29:48 +08:00
}
var matCount = 1
//删除新增物料信息
const handleDelete2 = (index: number) => {
var itemDelteing = formData.value.matItemDOList[index]
if (itemDelteing.isCopy == 0) {
message.alertWarning('原始物料不能删除')
} else {
formData.value.matItemDOList.splice(index, 1)
}
}
//仓库全数据
const whList = ref([])
//库区全数据
var rgList = ref([])
//库位全数据
var pnList = ref([])
const handleRg = async (rgid, scope) => {
//-------------------库位全数据
scope.row.pnId = ''
scope.row.pnlist = pnList.value.filter((pn) => pn.rg_id === rgid)
//-------------------
}
const handlePn = async (pnid, scope) => {
//-------------------库位全数据
if (
formData.value.matItemDOList.filter(
(item) =>
item.id == scope.row.id &&
item.whId == scope.row.whId &&
item.rgId == scope.row.rgId &&
item.pnId == pnid
).length > 1
) {
scope.row.matRest = 0
message.alertWarning('物料编码' + scope.row.matCode + ',当前库位已存在,请修改,避免重复盘点')
return
}
2025-07-05 01:00:01 +08:00
var currentMatRest = await CheckApi.getStorageNowMatRestNew(scope.row.id, scope.row.pnId)
2025-01-09 18:29:48 +08:00
scope.row.matRest = currentMatRest
if (scope.row.storageOkQty == undefined || scope.row.storageOkQty == '') {
scope.row.matSub = 0
} else {
scope.row.matSub = scope.row.storageOkQty - scope.row.matRest
}
//-------------------
}
const handleSub = async (pNum, scope) => {
//-------------------库位全数据
// scope.row.matSub = Number(pNum) - Number(scope.row.matRest)
// console.log(typeof scope.row.matSub)
2025-07-06 09:43:59 +08:00
if(scope.row.storageOkQty < 0){
2025-07-20 20:38:44 +08:00
scope.row.storageOkQty = 0;
2025-01-09 18:29:48 +08:00
2025-07-06 09:43:59 +08:00
}
2025-01-09 18:29:48 +08:00
const matSubValue = Number(pNum) - Number(scope.row.matRest)
scope.row.matSub = matSubValue.toFixed(2) // 保留两位小数
console.log(typeof scope.row.matSub)
}
//仓库列表
const init_page_wh = async () => {
whList.value = await WhApi.getSimpList()
}
//库区列表
const init_page_rg = async () => {
var rgData = await RgApi.getSimpList()
rgList.value = rgData.filter((item) => item.wh_id == formData.value.whId)
}
//库位列表
const init_page_pn = async () => {
var pnData = await PnApi.getSimpList()
pnList.value = pnData.filter((item) => item.wh_id == formData.value.whId)
}
// 按钮控制
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 initStatus = async (status) => {
switch (status) {
case 1:
ctrView.value = false
ctrSave.value = false
ctrCancel.value = true
ctrDelete.value = false
btnSave.value = true
btnCancel.value = true
break
case 2:
ctrView.value = false
ctrSave.value = true
ctrCancel.value = false
ctrDelete.value = true
btnSave.value = false
btnCancel.value = false
break
case 3:
ctrView.value = true
ctrSave.value = true
ctrCancel.value = true
ctrDelete.value = true
btnSave.value = false
btnCancel.value = false
break
default:
break
}
// 查看页面时可操作控件禁用
if (query.type === 'review') {
ctrView.value = true
ctrSave.value = true
ctrCancel.value = true
ctrDelete.value = true
btnSave.value = false
btnCancel.value = false
}
}
/** 初始化 **/
onMounted(async () => {
dialogTitle.value = query.type === 'update' ? '编辑页' : '详情页'
formData.value = await CheckApi.getStorageCheck(query.id)
2025-01-16 00:28:54 +08:00
if(formData.value.noZero != 2){
noZeroSwich.value = true
}
2025-01-09 18:29:48 +08:00
// 页面控件可视初始化
await initStatus(formData.value.status)
await init_page_wh()
await init_page_rg()
await init_page_pn()
const dataCheckMats = await CheckMatApi.getStorageCheckListByCheckID(query.id)
formData.value.matItemDOList = dataCheckMats
if (formData.value.matItemDOList == undefined) {
formData.value.matItemDOList = []
}
const dataMatSimples = await MatApi.getSimpList()
formData.value.matItemDOList.forEach((item) => {
var matFind = dataMatSimples.find((simp) => simp.id == item.matId)
item.isCopy = 0
item.matName = matFind?.name
item.matCode = matFind?.code
item.matSpec = matFind?.spec
item.matUnit = getDictLabel(DICT_TYPE.HELI_MATERIAL_UNIT, matFind?.unit)
item.matType = getDictLabel(DICT_TYPE.HELI_MATERIAL_TYPE, matFind?.unit)
item.matBrand = matFind?.brand
item.shortName = matFind?.short_name
item.matSub = item.storageOkQty - item.matRest
item.pnlist = pnList.value.filter((pn) => pn.rg_id == item.rgId)
})
formData.value.matItemDOList.sort((a, b) => a.matCode - b.matCode)
formData.value.matItemDOList.forEach((item) => {
item.cid = matCount
matCount = matCount + 1
})
// 附件信息
let attParams = {
pageNo: 1,
pageSize: 99,
businessId: query.id,
businessType: 'STORAGECHECK'
}
formData.value.attachments = (await getFilePage(attParams)).list
//用户信息
userList.value = await UserApi.getSimpleUserList()
})
</script>
<style>
a {
color: #409eff;
text-decoration: none;
}
</style>