|
@@ -8,7 +8,7 @@ import Drawer from '@/components/Drawer/index.vue'
|
|
|
import {InStoreageFormType} from '@/hooks/useDepot'
|
|
import {InStoreageFormType} from '@/hooks/useDepot'
|
|
|
import InStorageProduct from './InStorageProduct.vue'
|
|
import InStorageProduct from './InStorageProduct.vue'
|
|
|
import {CirclePlus, Delete} from '@element-plus/icons-vue'
|
|
import {CirclePlus, Delete} from '@element-plus/icons-vue'
|
|
|
-import {Storehouse_StockIn_Add} from '@/api/storehouse/index'
|
|
|
|
|
|
|
+import {Storehouse_StockIn_Add,Storehouse_StockIn_Generate_Number} from '@/api/storehouse/index'
|
|
|
import ImageCom from '@/components/Image/index.vue'
|
|
import ImageCom from '@/components/Image/index.vue'
|
|
|
import ReceiveUser from "@/views/storehouse/outStock/receiveUser.vue";
|
|
import ReceiveUser from "@/views/storehouse/outStock/receiveUser.vue";
|
|
|
|
|
|
|
@@ -20,6 +20,11 @@ const drawerRef = ref<InstanceType<typeof Drawer> | null>(null)
|
|
|
const drawerSnRef = ref<InstanceType<typeof InStorageSn> | null>(null)
|
|
const drawerSnRef = ref<InstanceType<typeof InStorageSn> | null>(null)
|
|
|
const drawerProductRef = ref<InstanceType<typeof InStorageProduct> | null>(null)
|
|
const drawerProductRef = ref<InstanceType<typeof InStorageProduct> | null>(null)
|
|
|
|
|
|
|
|
|
|
+// 防抖相关
|
|
|
|
|
+const isSubmitting = ref(false)
|
|
|
|
|
+const isGeneratingNumber = ref(false)
|
|
|
|
|
+let generateNumberTimer: NodeJS.Timeout | null = null
|
|
|
|
|
+
|
|
|
const data: any = reactive({
|
|
const data: any = reactive({
|
|
|
optionsType: [{id: 1, T_name: '入库'}, {id: 2, T_name: '退库'}]
|
|
optionsType: [{id: 1, T_name: '入库'}, {id: 2, T_name: '退库'}]
|
|
|
})
|
|
})
|
|
@@ -34,6 +39,7 @@ const form = reactive<InStoreageFormType>({
|
|
|
T_project: '',
|
|
T_project: '',
|
|
|
T_return_user: '',
|
|
T_return_user: '',
|
|
|
T_return_user_name: '',
|
|
T_return_user_name: '',
|
|
|
|
|
+ T_batch_number: ''
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const validate_T_product = (rule: any, value: any, callback: any) => {
|
|
const validate_T_product = (rule: any, value: any, callback: any) => {
|
|
@@ -108,24 +114,77 @@ const determineSNorCount = (DeviceSnData: any) => {
|
|
|
return false
|
|
return false
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * 生成入库单号(防抖)
|
|
|
|
|
+ */
|
|
|
|
|
+const generateStockInNumber = async () => {
|
|
|
|
|
+ if (isGeneratingNumber.value) return
|
|
|
|
|
+
|
|
|
|
|
+ // 清除之前的定时器
|
|
|
|
|
+ if (generateNumberTimer) {
|
|
|
|
|
+ clearTimeout(generateNumberTimer)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ generateNumberTimer = setTimeout(async () => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ isGeneratingNumber.value = true
|
|
|
|
|
+ const res: any = await Storehouse_StockIn_Generate_Number({
|
|
|
|
|
+ User_tokey: globalStore.GET_User_tokey
|
|
|
|
|
+ })
|
|
|
|
|
+ if (res.Code === 200) {
|
|
|
|
|
+ form.T_number = res.Data
|
|
|
|
|
+ } else {
|
|
|
|
|
+ ElMessage.error('生成入库单号失败:' + (res.Msg || '系统错误'))
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error('生成入库单号失败:', error)
|
|
|
|
|
+ ElMessage.error('生成入库单号失败,请重试')
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ isGeneratingNumber.value = false
|
|
|
|
|
+ }
|
|
|
|
|
+ }, 500) // 500ms 防抖延迟
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 页面加载时生成入库单号
|
|
|
|
|
+if (!form.T_number) {
|
|
|
|
|
+ generateStockInNumber()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
const AddInStorage = (formEl: FormInstance | undefined) => {
|
|
const AddInStorage = (formEl: FormInstance | undefined) => {
|
|
|
if (!formEl) return
|
|
if (!formEl) return
|
|
|
|
|
+
|
|
|
|
|
+ // 防止重复提交
|
|
|
|
|
+ if (isSubmitting.value) {
|
|
|
|
|
+ ElMessage.warning('正在提交中,请勿重复操作')
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
form.T_product = getDeviceSnToProduct()
|
|
form.T_product = getDeviceSnToProduct()
|
|
|
formEl.validate(async valid => {
|
|
formEl.validate(async valid => {
|
|
|
if (valid) {
|
|
if (valid) {
|
|
|
- const res: any = await Storehouse_StockIn_Add({
|
|
|
|
|
- User_tokey: globalStore.GET_User_tokey,
|
|
|
|
|
- ...form,
|
|
|
|
|
- T_product: form.T_product.join('')
|
|
|
|
|
- })
|
|
|
|
|
- if (res.Code === 200) {
|
|
|
|
|
- ElMessage.success('入库成功!')
|
|
|
|
|
- drawerProductRef.value?.clearSelection()
|
|
|
|
|
- nextTick(() => {
|
|
|
|
|
- emit('onUpdateList')
|
|
|
|
|
- resetForm(ruleFormRef.value)
|
|
|
|
|
- drawerRef.value?.closeDrawer()
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ isSubmitting.value = true
|
|
|
|
|
+ const res: any = await Storehouse_StockIn_Add({
|
|
|
|
|
+ User_tokey: globalStore.GET_User_tokey,
|
|
|
|
|
+ ...form,
|
|
|
|
|
+ T_product: form.T_product.join('')
|
|
|
})
|
|
})
|
|
|
|
|
+ if (res.Code === 200) {
|
|
|
|
|
+ ElMessage.success('入库成功!')
|
|
|
|
|
+ drawerProductRef.value?.clearSelection()
|
|
|
|
|
+ nextTick(() => {
|
|
|
|
|
+ emit('onUpdateList')
|
|
|
|
|
+ resetForm(ruleFormRef.value)
|
|
|
|
|
+ drawerRef.value?.closeDrawer()
|
|
|
|
|
+ })
|
|
|
|
|
+ } else {
|
|
|
|
|
+ ElMessage.error('入库失败:' + (res.Msg || '系统错误'))
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error('入库失败:', error)
|
|
|
|
|
+ ElMessage.error('入库失败,请重试')
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ isSubmitting.value = false
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
@@ -153,6 +212,18 @@ const resetForm = (formEl: FormInstance | undefined) => {
|
|
|
drawerSnRef.value?.clearDeviceSn()
|
|
drawerSnRef.value?.clearDeviceSn()
|
|
|
tableData.value = []
|
|
tableData.value = []
|
|
|
formEl.resetFields()
|
|
formEl.resetFields()
|
|
|
|
|
+
|
|
|
|
|
+ // 清理防抖定时器
|
|
|
|
|
+ if (generateNumberTimer) {
|
|
|
|
|
+ clearTimeout(generateNumberTimer)
|
|
|
|
|
+ generateNumberTimer = null
|
|
|
|
|
+ }
|
|
|
|
|
+ isSubmitting.value = false
|
|
|
|
|
+ isGeneratingNumber.value = false
|
|
|
|
|
+
|
|
|
|
|
+ // 重置后重新生成单号
|
|
|
|
|
+ form.T_number = ''
|
|
|
|
|
+ generateStockInNumber()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -230,7 +301,13 @@ const getReturnUserInfo = ({T_uuid, T_name}: { T_uuid: string; T_name: string })
|
|
|
/**
|
|
/**
|
|
|
* 入库调用
|
|
* 入库调用
|
|
|
*/
|
|
*/
|
|
|
-const openDrawer = () => drawerRef.value?.openDrawer()
|
|
|
|
|
|
|
+const openDrawer = () => {
|
|
|
|
|
+ drawerRef.value?.openDrawer()
|
|
|
|
|
+ // 打开抽屉时生成单号
|
|
|
|
|
+ if (!form.T_number) {
|
|
|
|
|
+ generateStockInNumber()
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
defineExpose({
|
|
defineExpose({
|
|
|
openDrawer
|
|
openDrawer
|
|
|
})
|
|
})
|
|
@@ -244,8 +321,24 @@ defineExpose({
|
|
|
</template>
|
|
</template>
|
|
|
<el-form ref="ruleFormRef" :model="form" :rules="rules">
|
|
<el-form ref="ruleFormRef" :model="form" :rules="rules">
|
|
|
<el-form-item label="入库单号:" :label-width="formLabelWidth" prop="T_number">
|
|
<el-form-item label="入库单号:" :label-width="formLabelWidth" prop="T_number">
|
|
|
- <el-input v-model="form.T_number" type="text" :disabled="true" placeholder="系统自动生成"
|
|
|
|
|
- class="w-50"/>
|
|
|
|
|
|
|
+ <div class="w-50" style="display: flex; align-items: center; gap: 8px;">
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="form.T_number"
|
|
|
|
|
+ type="text"
|
|
|
|
|
+ :disabled="true"
|
|
|
|
|
+ placeholder="系统自动生成"
|
|
|
|
|
+ style="flex: 1;"
|
|
|
|
|
+ />
|
|
|
|
|
+ <el-button
|
|
|
|
|
+ type="primary"
|
|
|
|
|
+ size="small"
|
|
|
|
|
+ :loading="isGeneratingNumber"
|
|
|
|
|
+ :disabled="isGeneratingNumber"
|
|
|
|
|
+ @click="generateStockInNumber"
|
|
|
|
|
+ >
|
|
|
|
|
+ {{ isGeneratingNumber ? '生成中...' : '重新生成' }}
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ </div>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
<el-form-item label="入库仓库:" :label-width="formLabelWidth" prop="T_depot_id">
|
|
<el-form-item label="入库仓库:" :label-width="formLabelWidth" prop="T_depot_id">
|
|
|
<el-select v-model="form.T_depot_id" class="w-50" clearable placeholder="请选择入库仓库~">
|
|
<el-select v-model="form.T_depot_id" class="w-50" clearable placeholder="请选择入库仓库~">
|
|
@@ -271,6 +364,14 @@ defineExpose({
|
|
|
value-format="YYYY-MM-DD"
|
|
value-format="YYYY-MM-DD"
|
|
|
/>
|
|
/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
|
|
+ <el-form-item label="入库批次:" :label-width="formLabelWidth" prop="T_batch_number">
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="form.T_batch_number"
|
|
|
|
|
+ type="text"
|
|
|
|
|
+ placeholder="请输入入库批次号"
|
|
|
|
|
+ class="w-50"
|
|
|
|
|
+ />
|
|
|
|
|
+ </el-form-item>
|
|
|
<el-form-item label="入库明细:" :label-width="formLabelWidth" prop="T_product">
|
|
<el-form-item label="入库明细:" :label-width="formLabelWidth" prop="T_product">
|
|
|
<el-table
|
|
<el-table
|
|
|
:data="tableData"
|
|
:data="tableData"
|
|
@@ -365,7 +466,14 @@ defineExpose({
|
|
|
<div class="btn">
|
|
<div class="btn">
|
|
|
<el-divider>
|
|
<el-divider>
|
|
|
<el-button @click="closeInStorage">取消</el-button>
|
|
<el-button @click="closeInStorage">取消</el-button>
|
|
|
- <el-button color="#626aef" @click="AddInStorage(ruleFormRef)">提交</el-button>
|
|
|
|
|
|
|
+ <el-button
|
|
|
|
|
+ color="#626aef"
|
|
|
|
|
+ :loading="isSubmitting"
|
|
|
|
|
+ :disabled="isSubmitting || isGeneratingNumber"
|
|
|
|
|
+ @click="AddInStorage(ruleFormRef)"
|
|
|
|
|
+ >
|
|
|
|
|
+ {{ isSubmitting ? '提交中...' : '提交' }}
|
|
|
|
|
+ </el-button>
|
|
|
</el-divider>
|
|
</el-divider>
|
|
|
</div>
|
|
</div>
|
|
|
<ReceiveUser ref="receiveUserdialog" :dept_leader="0" @onUserInfo="getReturnUserInfo" title="选择退库人"/>
|
|
<ReceiveUser ref="receiveUserdialog" :dept_leader="0" @onUserInfo="getReturnUserInfo" title="选择退库人"/>
|