| | |
| | | <div class="table_list"> |
| | | <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" |
| | | :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%" |
| | | :row-class-name="tableRowClassName" |
| | | :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)"> |
| | | <el-table-column align="center" type="selection" width="55" /> |
| | | <el-table-column align="center" label="序号" type="index" width="60" /> |
| | |
| | | <el-table-column label="规格型号" prop="specificationModel" width="200" show-overflow-tooltip /> |
| | | <el-table-column label="单位" prop="unit" width="80" show-overflow-tooltip /> |
| | | <el-table-column label="库存数量" prop="inboundNum0" width="100" show-overflow-tooltip /> |
| | | <el-table-column label="最低库存数量" prop="minStock" width="130" show-overflow-tooltip /> |
| | | <el-table-column label="库存预警数量" prop="warnNum" width="130" show-overflow-tooltip /> |
| | | <el-table-column label="含税单价" prop="taxInclusiveUnitPrice" width="100" show-overflow-tooltip /> |
| | | <el-table-column label="含税总价" prop="taxInclusiveTotalPrice" width="100" show-overflow-tooltip /> |
| | | <el-table-column label="税率(%)" prop="taxRate" width="100" show-overflow-tooltip /> |
| | |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="产品大类:" prop="productId"> |
| | | <el-select disabled v-model="form.productCategory" placeholder="请选择" clearable filterable @change="handleProductChange"> |
| | | <el-select disabled v-model="form.productCategory" placeholder="请选择" clearable filterable> |
| | | <el-option v-for="item in productList" :key="item.id" :label="item.productName" |
| | | :value="item.productName" /> |
| | | </el-select> |
| | |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="规格型号:" prop="productManageId"> |
| | | <el-select disabled v-model="form.specificationModel" placeholder="请先选择产品大类" clearable filterable :disabled="!form.productCategory" |
| | | @change="handleModelChange"> |
| | | <el-select disabled v-model="form.specificationModel" placeholder="请先选择产品大类" clearable filterable :disabled="!form.productCategory"> |
| | | <el-option v-for="item in productModelList" :key="item.id" :label="item.model" |
| | | :value="item.id" /> |
| | | </el-select> |
| | |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="最低库存:" prop="minStock"> |
| | | <el-input v-model="form.minStock" placeholder="请输入最低库存" clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <!-- <el-col :span="12">--> |
| | | <!-- <el-form-item label="库存预警数量:" prop="warnNum">--> |
| | | <!-- <el-input v-model="form.warnNum" placeholder="请输入最低库存" clearable />--> |
| | | <!-- </el-form-item>--> |
| | | <!-- </el-col>--> |
| | | </el-row> |
| | | </el-form> |
| | | <template #footer> |
| | |
| | | |
| | | <script setup> |
| | | import pagination from '@/components/PIMTable/Pagination.vue' |
| | | import { ref } from 'vue' |
| | | import { ref, reactive, toRefs, onMounted, getCurrentInstance } from 'vue' |
| | | import { ElMessageBox } from "element-plus"; |
| | | import useUserStore from '@/store/modules/user' |
| | | import { userListNoPageByTenantId } from "@/api/system/user.js"; |
| | | import { productTreeList,modelList } from "@/api/basicData/product.js" |
| | | import { |
| | | getStockManagePage , |
| | | updateStockManage, |
| | | delStockManage, |
| | | exportStockManage |
| | | } from "@/api/inventoryManagement/stockManage.js"; |
| | | import { |
| | | updateManagement,addSutockIn,selectProductRecordListByPuechaserId,updateStockIn |
| | | updateManagement,updateStockIn |
| | | } from "@/api/inventoryManagement/stockIn.js"; |
| | | |
| | | |
| | |
| | | inboundBatch: '', |
| | | stockQuantity: '', |
| | | boundTime: '', |
| | | minStock: '', // 新增最低库存字段 |
| | | warnNum: '', // 新增最低库存字段 |
| | | salesLedgerProductId: null, |
| | | }, |
| | | rules: { |
| | |
| | | boundTime: [{ required: true, message: '请选择库存时间', trigger: 'change' }], |
| | | inboundTime: [{ required: true, message: '请选择入库时间', trigger: 'change' }], |
| | | inboundPerson: [{ required: true, message: '请选择出库人', trigger: 'change' }], |
| | | minStock: [{ required: true, message: '请输入最低库存', trigger: 'blur' }], |
| | | warnNum: [{ required: true, message: '请输入最低库存', trigger: 'blur' }], |
| | | } |
| | | }) |
| | | const { searchForm, form, rules } = toRefs(data) |
| | |
| | | getStockManagePage({ ...searchForm.value, ...page }).then(res => { |
| | | tableLoading.value = false |
| | | tableData.value = res.data.records |
| | | // console.log('res', res) |
| | | // tableData.value.map(item => { |
| | | // item.children = [] |
| | | // }) |
| | | total.value = res.data.total |
| | | // 数据加载完成后检查库存 |
| | | checkStockAndCreatePurchase(); |
| | | // checkStockAndCreatePurchase(); |
| | | }).catch(() => { |
| | | tableLoading.value = false |
| | | }) |
| | |
| | | return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']); |
| | | }; |
| | | |
| | | // 表格行类名 |
| | | const tableRowClassName = ({ row }) => { |
| | | const stock = Number(row?.inboundNum0 ?? 0); |
| | | const warn = Number(row?.warnNum ?? 0); |
| | | if (!Number.isFinite(stock) || !Number.isFinite(warn)) { |
| | | return ''; |
| | | } |
| | | return stock < warn ? 'row-low-stock' : ''; |
| | | }; |
| | | |
| | | // 打开弹框 |
| | | const openForm = async (type, row) => { |
| | | operationType.value = type |
| | |
| | | productData.value = [] |
| | | let userLists = await userListNoPageByTenantId() |
| | | userList.value = userLists.data |
| | | // customerList().then(res => { |
| | | // customerOption.value = res |
| | | // }) |
| | | // console.log('userStore.id', userStore.id) |
| | | // form.value.entryPerson = userStore.id |
| | | if (type === 'edit') { |
| | | form.value = { ...row } |
| | | productTreeList().then(res =>{ |
| | |
| | | } |
| | | }) |
| | | }) |
| | | |
| | | |
| | | // getSalesLedgerWithProducts({ id: row.id, type: 1 }).then(res => { |
| | | |
| | | // form.value.entryPerson = Number(res.entryPerson) |
| | | // productData.value = form.value.productData |
| | | // fileList.value = form.value.salesLedgerFiles |
| | | // }) |
| | | } |
| | | form.value.entryDate = getCurrentDate() // 设置默认录入日期为当前日期 |
| | | dialogFormVisible.value = true |
| | |
| | | closeDia() |
| | | getList() |
| | | // 提交后检查库存并尝试创建请购单 |
| | | checkStockAndCreatePurchase(); |
| | | // checkStockAndCreatePurchase(); |
| | | }) |
| | | } |
| | | }) |
| | | } |
| | | // const handList = () => { |
| | | // selectProductRecordListByPuechaserId().then(res => { |
| | | // productModelList.value = res.data.filter(item => item.productName === value) |
| | | // console.log('productModelList.value', productModelList.value) |
| | | // }) |
| | | // } |
| | | // 检查库存并创建请购单 |
| | | const checkStockAndCreatePurchase = async () => { |
| | | const stockList = tableData.value; |
| | | // handList() |
| | | for (const item of stockList) { |
| | | if (item.inboundNum0 < item.minStock) { |
| | | try { |
| | | console.log('item', item) |
| | | // const checkStockAndCreatePurchase = async () => { |
| | | // const stockList = tableData.value; |
| | | // // handList() |
| | | // for (const item of stockList) { |
| | | // if (item.inboundNum0 < item.warnNum) { |
| | | // try { |
| | | // const stockInData = { |
| | | // nickName: userStore.nickName,// 使用新格式化函数 |
| | | // details: [{ |
| | | // id: item.salesLedgerProductId, |
| | | // inboundQuantity: item.minStock - item.inboundNum0 |
| | | // }] |
| | | // id: item.id, |
| | | // quantityStock: item.warnNum + item.totalInboundNum,// 使用新格式化函数 |
| | | // }; |
| | | const stockInData = { |
| | | id: item.id, |
| | | quantityStock: item.minStock + item.totalInboundNum,// 使用新格式化函数 |
| | | }; |
| | | |
| | | |
| | | console.log('准备提交的数据:', JSON.parse(JSON.stringify(stockInData))); |
| | | |
| | | loading.value = true |
| | | // await addSutockIn(stockInData) |
| | | await updateStockIn(stockInData) |
| | | proxy.$modal.msgSuccess(`产品 ${item.productCategory} 修改入库成功`) |
| | | loading.value = false |
| | | // // 生成请购单 |
| | | // const createRes = await createPurchaseRequest({ |
| | | // productId: item.productId, |
| | | // requiredQuantity: item.minStock - item.inboundNum0, |
| | | // supplierId: item.supplierId |
| | | // }); |
| | | // if (createRes.code === 200) { |
| | | // // 流转请购单到采购模块 |
| | | // await transferPurchaseRequest({ requestId: createRes.data.id }); |
| | | // proxy.$modal.msgSuccess(`产品 ${item.productName} 请购单已生成并流转`); |
| | | // loading.value = true |
| | | // await updateStockIn(stockInData) |
| | | // proxy.$modal.msgSuccess(`产品 ${item.productCategory} 修改入库成功`) |
| | | // loading.value = false |
| | | // } catch (error) { |
| | | // proxy.$modal.msgError(`产品 ${item.productCategory} 生成请购单失败,请手动处理`); |
| | | // |
| | | // } |
| | | } catch (error) { |
| | | proxy.$modal.msgError(`产品 ${item.productCategory} 生成请购单失败,请手动处理`); |
| | | |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | // } |
| | | // } |
| | | // }; |
| | | // 关闭弹框 |
| | | const closeDia = () => { |
| | | proxy.resetForm("formRef") |
| | |
| | | } |
| | | onMounted(() => { |
| | | getList() |
| | | checkStockAndCreatePurchase(); |
| | | // checkStockAndCreatePurchase(); |
| | | // 每小时检查一次库存 |
| | | const intervalId = setInterval(checkStockAndCreatePurchase, 60 * 60 * 1000); |
| | | // const intervalId = setInterval(checkStockAndCreatePurchase, 60 * 60 * 1000); |
| | | |
| | | onUnmounted(() => { |
| | | // 组件卸载时清除定时器 |
| | | clearInterval(intervalId); |
| | | }); |
| | | // onUnmounted(() => { |
| | | // // 组件卸载时清除定时器 |
| | | // clearInterval(intervalId); |
| | | // }); |
| | | }) |
| | | </script> |
| | | |
| | | <style scoped lang="scss"></style> |
| | | <style scoped lang="scss"> |
| | | :deep(.row-low-stock td) { |
| | | background-color: #fde2e2; |
| | | color: #c45656; |
| | | } |
| | | |
| | | :deep(.row-low-stock:hover > td) { |
| | | background-color: #fcd4d4; |
| | | } |
| | | </style> |