| src/views/inventoryManagement/stockManagement/Qualified.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/stockManagement/Unqualified.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/stockManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/stockManagement/rawMaterialRecord.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/views/inventoryManagement/stockManagement/Qualified.vue
@@ -23,7 +23,9 @@ :row-class-name="tableRowClassName" 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="productName" show-overflow-tooltip /> <el-table-column label="ä»åºç¼ç " prop="warehouseCode" show-overflow-tooltip /> <el-table-column label="ä»åº" prop="warehouseName" show-overflow-tooltip /> <el-table-column label="åè´§ç¼ç " prop="productCode" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="model" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" show-overflow-tooltip /> <el-table-column label="åºåæ°é" prop="qualitity" show-overflow-tooltip /> @@ -99,6 +101,7 @@ const data = reactive({ searchForm: { productName: '', rootName:'æå' } }) const { searchForm } = toRefs(data) @@ -186,7 +189,7 @@ type: 'warning', } ).then(() => { proxy.download("/stockInventory/exportStockInventory", {}, 'åæ ¼åºåä¿¡æ¯.xlsx') proxy.download("/stockInventory/exportStockInventory", {}, 'æååºåä¿¡æ¯.xlsx') }).catch(() => { proxy.$modal.msg("已忶") }) src/views/inventoryManagement/stockManagement/Unqualified.vue
@@ -10,21 +10,27 @@ <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <el-button type="primary" @click="isShowNewModal = true">æ°å¢åºå</el-button> <el-button type="primary" @click="isShowNewModal = true">æ°å¢åºå</el-button> <el-button type="info" plain icon="Upload" @click="isShowImportModal = true"> å¯¼å ¥åºå </el-button> <el-button @click="handleOut">导åº</el-button> </div> </div> <div class="table_list"> <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" :expand-row-keys="expandedRowKeys" :row-key="row => row.id" style="width: 100%" :row-class-name="tableRowClassName" height="calc(100vh - 18.5em)"> :expand-row-keys="expandedRowKeys" :row-key="row => row.id" style="width: 100%" :row-class-name="tableRowClassName" 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="productName" show-overflow-tooltip /> <el-table-column label="ä»åºç¼ç " prop="warehouseCode" show-overflow-tooltip /> <el-table-column label="ä»åº" prop="warehouseName" show-overflow-tooltip /> <el-table-column label="åè´§ç¼ç " prop="productCode" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="model" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" show-overflow-tooltip /> <el-table-column label="åºåæ°é" prop="qualitity" show-overflow-tooltip /> <el-table-column label="å»ç»æ°é" prop="lockedQuantity" show-overflow-tooltip /> <el-table-column label="åºåé¢è¦æ°é" prop="warnNum" show-overflow-tooltip /> <el-table-column label="夿³¨" prop="remark" show-overflow-tooltip /> <el-table-column label="æè¿æ´æ°æ¶é´" prop="updateTime" show-overflow-tooltip /> <el-table-column fixed="right" label="æä½" min-width="60" align="center"> @@ -36,24 +42,29 @@ </el-table-column> </el-table> <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="paginationChange" /> :page="page.current" :limit="page.size" @pagination="paginationChange" /> </div> <new-stock-inventory v-if="isShowNewModal" v-model:visible="isShowNewModal" type="unqualified" @completed="handleQuery" /> v-model:visible="isShowNewModal" type="qualified" @completed="handleQuery" /> <subtract-stock-inventory v-if="isShowSubtractModal" v-model:visible="isShowSubtractModal" :record="record" type="unqualified" @completed="handleQuery" /> v-model:visible="isShowSubtractModal" :record="record" type="qualified" @completed="handleQuery" /> <!-- å¯¼å ¥åºå--> <import-stock-inventory v-if="isShowImportModal" v-model:visible="isShowImportModal" type="qualified" @uploadSuccess="handleQuery" /> <!-- å»ç»/è§£å»åºå--> <frozen-and-thaw-stock-inventory v-if="isShowFrozenAndThawModal" v-model:visible="isShowFrozenAndThawModal" :record="record" :operation-type="operationType" type="unqualified" type="qualified" @completed="handleQuery" /> </div> </template> @@ -61,12 +72,12 @@ <script setup> import pagination from '@/components/PIMTable/Pagination.vue' import { ref, reactive, toRefs, onMounted, getCurrentInstance } from 'vue' import { ElMessageBox } from "element-plus"; import { getStockUninventoryListPage } from "@/api/inventoryManagement/stockUninventory.js"; import {ElMessage, ElMessageBox} from "element-plus"; import { getStockInventoryListPage } from "@/api/inventoryManagement/stockInventory.js"; const NewStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/New.vue")); const SubtractStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/Subtract.vue")); const ImportStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/Import.vue")); const FrozenAndThawStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/FrozenAndThaw.vue")); const { proxy } = getCurrentInstance() const tableData = ref([]) const selectedRows = ref([]) @@ -81,13 +92,17 @@ const isShowNewModal = ref(false) // æ¯å¦æ¾ç¤ºé¢ç¨å¼¹æ¡ const isShowSubtractModal = ref(false) // æ¯å¦æ¾ç¤ºå»ç»/è§£å»å¼¹æ¡ const isShowFrozenAndThawModal = ref(false) // æä½ç±»å const operationType = ref('frozen') // æ¯å¦æ¾ç¤ºå¯¼å ¥å¼¹æ¡ const isShowImportModal = ref(false) const data = reactive({ searchForm: { productName: '', rootName:'è¾ æ' } }) const { searchForm } = toRefs(data) @@ -105,7 +120,7 @@ } const getList = () => { tableLoading.value = true getStockUninventoryListPage({ ...searchForm.value, ...page }).then(res => { getStockInventoryListPage({ ...searchForm.value, ...page }).then(res => { tableLoading.value = false tableData.value = res.data.records total.value = res.data.total @@ -115,6 +130,17 @@ tableLoading.value = false }) } const handleFileSuccess = (response) => { const { code, msg } = response; if (code == 200) { ElMessage({ message: "å¯¼å ¥æå", type: "success" }); upload.open = false; emits("uploadSuccess"); } else { ElMessage({ message: msg, type: "error" }); } }; // ç¹å»é¢ç¨ const showSubtractModal = (row) => { @@ -146,25 +172,25 @@ // è¡¨æ ¼è¡ç±»å const tableRowClassName = ({ row }) => { // const stock = Number(row?.unLockedQuantity ?? 0); // const warn = Number(row?.warnNum ?? 0); // if (!Number.isFinite(stock) || !Number.isFinite(warn)) { // return ''; // } // return stock < warn ? 'row-low-stock' : ''; const stock = Number(row?.unLockedQuantity ?? 0); const warn = Number(row?.warnNum ?? 0); if (!Number.isFinite(stock) || !Number.isFinite(warn)) { return ''; } return stock < warn ? 'row-low-stock' : ''; }; // å¯¼åº const handleOut = () => { ElMessageBox.confirm( 'æ¯å¦ç¡®è®¤å¯¼åºï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } 'æ¯å¦ç¡®è®¤å¯¼åºï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { proxy.download("/stockUninventory/exportStockUninventory", {}, 'ä¸åæ ¼åºåä¿¡æ¯.xlsx') proxy.download("/stockInventory/exportStockInventory", {}, 'è¾ æåºåä¿¡æ¯.xlsx') }).catch(() => { proxy.$modal.msg("已忶") }) src/views/inventoryManagement/stockManagement/index.vue
@@ -1,33 +1,51 @@ <template> <div class="app-container"> <el-tabs v-model="activeTab" @tab-change="handleTabChange"> <el-tab-pane v-for="tab in tabs" :label="tab.label" :name="tab.name" :key="tab.name"> <component :is="tab.name === 'qualified' ? QualifiedRecord : UnqualifiedRecord" /> <el-tab-pane v-for="tab in tabs" :label="tab.label" :name="tab.name" :key="tab.name" > <component :is="tab.component" v-if="activeTab === tab.name" :stock-type="tab.name" /> </el-tab-pane> </el-tabs> </div> </template> <script setup> // 1. å¯¼å ¥ shallowRef import { ref, shallowRef } from 'vue' import QualifiedRecord from "@/views/inventoryManagement/stockManagement/Qualified.vue"; import UnqualifiedRecord from "@/views/inventoryManagement/stockManagement/Unqualified.vue"; import rawMaterialRecord from "@/views/inventoryManagement/stockManagement/rawMaterialRecord.vue" const activeTab = ref('qualified') const tabs = ref([ // 2. å ³é®ï¼tabs ç¨ shallowRef å 裹 const tabs = shallowRef([ { label: 'åæ ¼åºå', name: 'qualified' label: 'æååºå', name: 'qualified', component: QualifiedRecord }, { label: 'ä¸åæ ¼åºå', name: 'unqualified' label: 'è¾ æåºå', name: 'assistant', component: UnqualifiedRecord }, { label: 'åææåºå', name: 'rawMaterial', component: rawMaterialRecord } ]) const handleTabChange = (tabName) => { activeTab.value = tabName; } </script> </script> src/views/inventoryManagement/stockManagement/rawMaterialRecord.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,213 @@ <template> <div class="app-container"> <div class="search_form"> <div> <span class="search_title ml10">产å大类ï¼</span> <el-input v-model="searchForm.productName" style="width: 240px" placeholder="请è¾å ¥" clearable/> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <el-button type="primary" @click="isShowNewModal = true">æ°å¢åºå</el-button> <el-button type="info" plain icon="Upload" @click="isShowImportModal = true"> å¯¼å ¥åºå </el-button> <el-button @click="handleOut">导åº</el-button> </div> </div> <div class="table_list"> <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" :expand-row-keys="expandedRowKeys" :row-key="row => row.id" style="width: 100%" :row-class-name="tableRowClassName" 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="warehouseCode" show-overflow-tooltip /> <el-table-column label="ä»åº" prop="warehouseName" show-overflow-tooltip /> <el-table-column label="åè´§ç¼ç " prop="productCode" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="model" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" show-overflow-tooltip /> <el-table-column label="åºåæ°é" prop="qualitity" show-overflow-tooltip /> <el-table-column label="å»ç»æ°é" prop="lockedQuantity" show-overflow-tooltip /> <el-table-column label="åºåé¢è¦æ°é" prop="warnNum" show-overflow-tooltip /> <el-table-column label="夿³¨" prop="remark" show-overflow-tooltip /> <el-table-column label="æè¿æ´æ°æ¶é´" prop="updateTime" show-overflow-tooltip /> <el-table-column fixed="right" label="æä½" min-width="60" align="center"> <template #default="scope"> <el-button link type="primary" size="small" @click="showSubtractModal(scope.row)" :disabled="scope.row.unLockedQuantity === 0">é¢ç¨</el-button> <el-button link type="primary" size="small" v-if="scope.row.unLockedQuantity > 0" @click="showFrozenModal(scope.row)">å»ç»</el-button> <el-button link type="primary" size="small" v-if="scope.row.lockedQuantity > 0" @click="showThawModal(scope.row)">è§£å»</el-button> </template> </el-table-column> </el-table> <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="paginationChange" /> </div> <new-stock-inventory v-if="isShowNewModal" v-model:visible="isShowNewModal" type="qualified" @completed="handleQuery" /> <subtract-stock-inventory v-if="isShowSubtractModal" v-model:visible="isShowSubtractModal" :record="record" type="qualified" @completed="handleQuery" /> <!-- å¯¼å ¥åºå--> <import-stock-inventory v-if="isShowImportModal" v-model:visible="isShowImportModal" type="qualified" @uploadSuccess="handleQuery" /> <!-- å»ç»/è§£å»åºå--> <frozen-and-thaw-stock-inventory v-if="isShowFrozenAndThawModal" v-model:visible="isShowFrozenAndThawModal" :record="record" :operation-type="operationType" type="qualified" @completed="handleQuery" /> </div> </template> <script setup> import pagination from '@/components/PIMTable/Pagination.vue' import { ref, reactive, toRefs, onMounted, getCurrentInstance } from 'vue' import {ElMessage, ElMessageBox} from "element-plus"; import { getStockInventoryListPage } from "@/api/inventoryManagement/stockInventory.js"; const NewStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/New.vue")); const SubtractStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/Subtract.vue")); const ImportStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/Import.vue")); const FrozenAndThawStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/FrozenAndThaw.vue")); const { proxy } = getCurrentInstance() const tableData = ref([]) const selectedRows = ref([]) const record = ref({}) const tableLoading = ref(false) const page = reactive({ current: 1, size: 100, }) const total = ref(0) // æ¯å¦æ¾ç¤ºæ°å¢å¼¹æ¡ const isShowNewModal = ref(false) // æ¯å¦æ¾ç¤ºé¢ç¨å¼¹æ¡ const isShowSubtractModal = ref(false) // æ¯å¦æ¾ç¤ºå»ç»/è§£å»å¼¹æ¡ const isShowFrozenAndThawModal = ref(false) // æä½ç±»å const operationType = ref('frozen') // æ¯å¦æ¾ç¤ºå¯¼å ¥å¼¹æ¡ const isShowImportModal = ref(false) const data = reactive({ searchForm: { productName: '', rootName:'åææ' } }) const { searchForm } = toRefs(data) // æ¥è¯¢å表 /** æç´¢æé®æä½ */ const handleQuery = () => { page.current = 1 getList() } const paginationChange = (obj) => { page.current = obj.page; page.size = obj.limit; getList() } const getList = () => { tableLoading.value = true getStockInventoryListPage({ ...searchForm.value, ...page }).then(res => { tableLoading.value = false tableData.value = res.data.records total.value = res.data.total // æ°æ®å è½½å®æåæ£æ¥åºå // checkStockAndCreatePurchase(); }).catch(() => { tableLoading.value = false }) } const handleFileSuccess = (response) => { const { code, msg } = response; if (code == 200) { ElMessage({ message: "å¯¼å ¥æå", type: "success" }); upload.open = false; emits("uploadSuccess"); } else { ElMessage({ message: msg, type: "error" }); } }; // ç¹å»é¢ç¨ const showSubtractModal = (row) => { record.value = row isShowSubtractModal.value = true } // ç¹å»å»ç» const showFrozenModal = (row) => { record.value = row isShowFrozenAndThawModal.value = true operationType.value = 'frozen' } // ç¹å»è§£å» const showThawModal = (row) => { record.value = row isShowFrozenAndThawModal.value = true operationType.value = 'thaw' } // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { // è¿æ»¤æåæ°æ® selectedRows.value = selection.filter(item => item.id); console.log('selection', selectedRows.value) } const expandedRowKeys = ref([]) // è¡¨æ ¼è¡ç±»å const tableRowClassName = ({ row }) => { const stock = Number(row?.unLockedQuantity ?? 0); const warn = Number(row?.warnNum ?? 0); if (!Number.isFinite(stock) || !Number.isFinite(warn)) { return ''; } return stock < warn ? 'row-low-stock' : ''; }; // å¯¼åº const handleOut = () => { ElMessageBox.confirm( 'æ¯å¦ç¡®è®¤å¯¼åºï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { proxy.download("/stockInventory/exportStockInventory", {}, 'åææåºåä¿¡æ¯.xlsx') }).catch(() => { proxy.$modal.msg("已忶") }) } onMounted(() => { getList() }) </script> <style scoped lang="scss"> :deep(.row-low-stock td) { background-color: #fde2e2; color: #c45656; } :deep(.row-low-stock:hover > td) { background-color: #fcd4d4; } </style>