| src/api/inventoryManagement/stockIn.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/api/inventoryManagement/stockManage.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/api/inventoryManagement/stockOut.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/dispatchLog/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/issueManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/receiptManagement/components/formDia.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/receiptManagement/components/formDiaManual.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/receiptManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/stockManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/procurementManagement/procurementLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/inventoryManagement/stockIn.js
@@ -9,6 +9,33 @@ }); }; // æ¥è¯¢çäº§å ¥åºä¿¡æ¯å表 export const getStockInPageByProduction = (params) => { return request({ url: "/stockin/listPageByProduction", method: "get", params, }); }; // åºåºå°è´¦-æ¥è¯¢æå¨å ¥åºä¿¡æ¯å表 export const getStockInPageByCustom = (params) => { return request({ url: "/stockmanagement/listPageByCustom", method: "get", params, }); }; // åºåºå°è´¦-æ¥è¯¢ç产åºåºä¿¡æ¯å表 export const getStockInPageByProduct = (params) => { return request({ url: "/stockmanagement/listPageByProduct", method: "get", params, }); }; // ä¿®æ¹å ¥åºåä¿¡æ¯ export const updateStockIn = (data) => { return request({ @@ -36,6 +63,24 @@ }) } // æ°å¢æå¨å ¥åºä¿¡æ¯ export function addStockInCustom(data) { return request({ url: '/stockin/addCustom', method: 'post', data: data }) } // ç¼è¾æå¨å ¥åºä¿¡æ¯ export function updateStockInCustom(data) { return request({ url: '/stockin/updateCustom', method: 'post', data: data }) } // å é¤å ¥åºä¿¡æ¯ export function delStockIn(ids) { return request({ @@ -45,6 +90,15 @@ }) } // å 餿å¨å ¥åºä¿¡æ¯ export function delStockInCustom(ids) { return request({ url: '/stockin/delteCustom', method: 'post', data: ids }) } // 导åºå ¥åºä¿¡æ¯ export function exportStockIn(query) { return request({ src/api/inventoryManagement/stockManage.js
@@ -9,6 +9,24 @@ }); }; // æ¥è¯¢çäº§å ¥åºåºåä¿¡æ¯å表 export const getStockManagePageByProduction = (params) => { return request({ url: "/stockin/listPageCopyByProduction", method: "get", params, }); }; // æ¥è¯¢æå¨å ¥åºåºåä¿¡æ¯å表 export const getStockManagePageByCustom = (params) => { return request({ url: "/stockin/listPageCopyByCustom", method: "get", params, }); }; // ä¿®æ¹åºåä¿¡æ¯ export const updateStockManage = (data) => { @@ -38,7 +56,7 @@ }) } //åºåºæ¥å£ // åºåºç®¡ç-é¢ç¨æ¥å£ export const stockOut = (data) => { return request({ url: '/stockmanagement/stockout', src/api/inventoryManagement/stockOut.js
@@ -1,6 +1,6 @@ import request from "@/utils/request"; //æ¥è¯¢åºåºå表 // åºåºå°è´¦-éè´åºåºæ¥è¯¢åºåºå表 export const getStockOutPage = (params) => { return request({ url: "/stockmanagement/listPage", @@ -35,13 +35,3 @@ data: ids }) } //导åºåºåºä¿¡æ¯ export const exportStockOut = (query) => { return request({ url: '/stockmanagement/export', method: 'get', params: query, responseType: 'blob' }) } src/views/inventoryManagement/dispatchLog/index.vue
@@ -1,37 +1,209 @@ <template> <div class="app-container"> <div class="search_form"> <div> <span class="search_title">ä¾åºååç§°ï¼</span> <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <span class="search_title ml10">åºåºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px" >æç´¢</el-button > </div> <div> <!-- <el-button type="primary" @click="openForm('add')">æ°å¢</el-button> --> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</el-button> <el-button type="primary" plain @click="handlePrint">æå°</el-button> </div> </div> <el-tabs v-model="activeTab" @tab-change="handleTabChange"> <el-tab-pane label="ç产åºåº" name="production"> <div class="search_form"> <div> <span class="search_title">客æ·åç§°ï¼</span> <el-input v-model="searchForm.customerName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <span class="search_title ml10">åºåºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</el-button> <el-button type="primary" plain @click="handlePrint">æå°</el-button> </div> </div> <div class="table_list"> <el-table :data="tableData" border v-loading="tableLoading" :expand-row-keys="expandedRowKeys" :row-key="(row) => row.id" show-summary style="width: 100%" :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)" > <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="åºåºæ¥æ" prop="createTime" min-width="250" show-overflow-tooltip /> <el-table-column label="客æ·åç§°" prop="customerName" width="250" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productCategory" width="100" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" width="100" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" width="80" show-overflow-tooltip /> <el-table-column label="åºåºæ°é" prop="inboundNum" width="100" 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-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" width="180" show-overflow-tooltip /> <el-table-column label="åºåºäºº" prop="createBy" width="80" show-overflow-tooltip /> </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> </el-tab-pane> <el-tab-pane label="éè´åºåº" name="purchase"> <div class="search_form"> <div> <span class="search_title">ä¾åºååç§°ï¼</span> <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <span class="search_title ml10">åºåºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</el-button> <el-button type="primary" plain @click="handlePrint">æå°</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" show-summary style="width: 100%" :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="createTime" min-width="250" show-overflow-tooltip /> <el-table-column label="ä¾åºååç§°" prop="supplierName" width="250" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productCategory" width="100" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" width="100" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" width="80" show-overflow-tooltip /> <el-table-column label="åºåºæ°é" prop="inboundNum" width="100" 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-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" width="180" show-overflow-tooltip /> <el-table-column label="åºåºäºº" prop="createBy" width="80" show-overflow-tooltip /> </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> </el-tab-pane> <el-tab-pane label="æå¨åºåº" name="manual"> <div class="search_form"> <div> <span class="search_title">ä¾åºååç§°ï¼</span> <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <span class="search_title ml10">åºåºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</el-button> <el-button type="primary" plain @click="handlePrint">æå°</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" show-summary style="width: 100%" :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="createTime" min-width="250" show-overflow-tooltip /> <el-table-column label="ä¾åºååç§°" prop="supplierName" width="250" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productCategory" width="100" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" width="100" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" width="80" show-overflow-tooltip /> <el-table-column label="ç©åç±»å" prop="itemType" width="120" show-overflow-tooltip /> <el-table-column label="åºåºæ°é" prop="inboundNum" width="100" 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-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" width="180" show-overflow-tooltip /> <el-table-column label="åºåºäºº" prop="createBy" width="80" show-overflow-tooltip /> </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> </el-tab-pane> </el-tabs> <div class="table_list"> <el-table :data="tableData" @@ -258,17 +430,22 @@ <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 { getStockOutPage, delStockOut, } from "@/api/inventoryManagement/stockOut.js"; import { getStockInPageByProduct, getStockInPageByCustom, } from "@/api/inventoryManagement/stockIn.js"; const userStore = useUserStore(); const { proxy } = getCurrentInstance(); const tableData = ref([]); const activeTab = ref('production'); const selectedRows = ref([]); const tableLoading = ref(false); const page = reactive({ @@ -285,6 +462,7 @@ const data = reactive({ searchForm: { supplierName: "", customerName: "", timeStr: "", }, form: { @@ -322,7 +500,23 @@ }; const getList = () => { tableLoading.value = true; getStockOutPage({ ...searchForm.value, ...page }) const params = { ...page } if (activeTab.value === 'production') { params.customerName = searchForm.value.customerName params.timeStr = searchForm.value.timeStr } else { params.supplierName = searchForm.value.supplierName params.timeStr = searchForm.value.timeStr } // æ ¹æ®ä¸åç tab ç±»åè°ç¨ä¸åçæ¥å£ const apiCall = activeTab.value === 'production' ? getStockInPageByProduct(params) : activeTab.value === 'manual' ? getStockInPageByCustom(params) : getStockOutPage(params) apiCall .then((res) => { tableLoading.value = false; tableData.value = res.data.records; @@ -336,6 +530,15 @@ }); }; const handleTabChange = () => { page.current = 1 searchForm.value.supplierName = '' searchForm.value.customerName = '' searchForm.value.timeStr = '' selectedRows.value = [] getList() }; // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { // è¿æ»¤æåæ°æ® src/views/inventoryManagement/issueManagement/index.vue
@@ -1,56 +1,159 @@ <template> <div class="app-container"> <div class="search_form"> <div> <span class="search_title">ä¾åºååç§°ï¼</span> <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <span class="search_title ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <!-- <el-button type="primary" @click="openForm('add')">æ°å¢åºåº</el-button> --> <el-button @click="handleOut">导åº</el-button> <!-- <el-button type="danger" plain @click="handleDelete">å é¤</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" show-summary style="width: 100%" :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="createTime" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºæ¹æ¬¡" prop="inboundBatches" width="160" show-overflow-tooltip /> <el-table-column label="ä¾åºååç§°" prop="supplierName" width="240" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productCategory" width="100" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" width="200" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" width="70" show-overflow-tooltip /> <el-table-column label="å ¥åºæ°é" prop="inboundNum" width="90" show-overflow-tooltip /> <el-table-column label="åºåæ°é" prop="inboundNum0" width="90" 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="80" show-overflow-tooltip /> <el-table-column label="ä¸å«ç¨æ»ä»·" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºäºº" prop="createBy" width="80" 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="openForm(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> <el-tabs v-model="activeTab" @tab-change="handleTabChange"> <el-tab-pane label="ç产åºåº" name="production"> <div class="search_form"> <div> <span class="search_title">客æ·åç§°ï¼</span> <el-input v-model="searchForm.customerName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <span class="search_title ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <el-button @click="handleOut">导åº</el-button> </div> </div> <div class="table_list"> <el-table :data="tableData" border v-loading="tableLoading" :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%" :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)"> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="å ¥åºæ¶é´" prop="createTime" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºæ¹æ¬¡" prop="inboundBatches" width="160" show-overflow-tooltip /> <el-table-column label="客æ·åç§°" prop="customerName" width="240" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productCategory" width="100" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" width="200" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" width="70" show-overflow-tooltip /> <el-table-column label="å ¥åºæ°é" prop="inboundNum" width="90" 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="80" show-overflow-tooltip /> <el-table-column label="ä¸å«ç¨æ»ä»·" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºäºº" prop="createBy" width="80" 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="openForm(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> </el-tab-pane> <el-tab-pane label="éè´åºåº" name="purchase"> <div class="search_form"> <div> <span class="search_title">ä¾åºååç§°ï¼</span> <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <span class="search_title ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <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" show-summary style="width: 100%" :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="createTime" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºæ¹æ¬¡" prop="inboundBatches" width="160" show-overflow-tooltip /> <el-table-column label="ä¾åºååç§°" prop="supplierName" width="240" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productCategory" width="100" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" width="200" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" width="70" show-overflow-tooltip /> <el-table-column label="å ¥åºæ°é" prop="inboundNum" width="90" 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="80" show-overflow-tooltip /> <el-table-column label="ä¸å«ç¨æ»ä»·" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºäºº" prop="createBy" width="80" 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="openForm(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> </el-tab-pane> <el-tab-pane label="æå¨åºåº" name="manual"> <div class="search_form"> <div> <span class="search_title">ä¾åºååç§°ï¼</span> <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <span class="search_title ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <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" show-summary style="width: 100%" :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="inboundDate" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºæ¹æ¬¡" prop="inboundBatches" width="160" show-overflow-tooltip /> <el-table-column label="ä¾åºååç§°" prop="supplierName" width="240" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productCategory" width="100" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" width="200" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" width="70" show-overflow-tooltip /> <el-table-column label="ç©åç±»å" prop="itemType" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºæ°é" prop="inboundNum" width="90" 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="80" show-overflow-tooltip /> <el-table-column label="ä¸å«ç¨æ»ä»·" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºäºº" prop="createBy" width="80" 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="openForm(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> </el-tab-pane> </el-tabs> <el-dialog v-model="dialogFormVisible" :title="'æ°å¢åºåº'" width="40%" @close="closeDia"> <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> <el-form-item label="åºåºæ°éï¼" prop="salesContractNo"> @@ -78,12 +181,14 @@ <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 { getStockInPage getStockInPage, getStockInPageByProduction, getStockInPageByCustom } from "@/api/inventoryManagement/stockIn.js"; import { getStockManagePage, @@ -106,14 +211,16 @@ // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const dialogFormVisible = ref(false) const activeTab = ref('production') const data = reactive({ searchForm: { supplierName: '', customerName: '', inboundQuantity:'', inboundTime:'', nickName: '', userId: '', timeStr: '', timeStr: '', }, form: { productrecordId: '', @@ -139,14 +246,38 @@ } const getList = () => { tableLoading.value = true getStockInPage({ ...searchForm.value, ...page }).then(res => { const params = { ...page } if (activeTab.value === 'production') { params.customerName = searchForm.value.customerName params.timeStr = searchForm.value.timeStr } else { params.supplierName = searchForm.value.supplierName params.timeStr = searchForm.value.timeStr } let apiCall if (activeTab.value === 'production') { apiCall = getStockInPageByProduction(params) } else if (activeTab.value === 'manual') { apiCall = getStockInPageByCustom(params) } else { apiCall = getStockInPage(params) } apiCall.then(res => { tableLoading.value = false tableData.value = res.data.records total.value = res.data.total console.log('res', res.data.records) }).catch(() => { tableLoading.value = false }) } const handleTabChange = () => { page.current = 1 searchForm.value.supplierName = '' searchForm.value.customerName = '' searchForm.value.timeStr = '' selectedRows.value = [] getList() } const findNodeById = (nodes, productId) => { @@ -212,12 +343,14 @@ } proxy.$refs["formRef"].validate(valid => { if (valid && currentRowId.value) { const typeMap = { production: 2, purchase: 1, manual: 3 } const outData = { id: currentRowId.value, // åå§è®°å½ID salesLedgerProductId: salesLedgerProductId.value, salesLedgerProductId: activeTab.value === 'manual' ? 0 : salesLedgerProductId.value, quantity: form.value.inboundQuantity, // åºåºæ°é time: form.value.inboundTime, // åºåºæ¶é´ userId: form.value.nickName // æä½äºº userId: form.value.nickName, // æä½äºº type: typeMap[activeTab.value] // åºåºç±»åï¼éè´1ï¼ç产2ï¼æå¨3 } console.log(outData) src/views/inventoryManagement/receiptManagement/components/formDia.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,387 @@ <template> <el-dialog v-model="dialogFormVisible" :title="getDialogTitle()" width="70%" @close="closeDia"> <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> <el-form-item label="éè´è®¢åå·" prop="purchaseContractNumber"> <el-select v-model="form.purchaseContractNumber" placeholder="è¯·éæ©éè´è®¢åå·" clearable filterable remote :remote-method="loadPurchaseOptions" :loading="loadingPurchaseOptions" @change="handlePurchaseChange" :disabled="operationType === 'edit'" style="width: 100%" > <el-option v-for="item in purchaseOptions" :key="item.purchaseContractNumber" :label="formatPurchaseOption(item)" :value="item.purchaseContractNumber" /> </el-select> </el-form-item> <el-table :data="productList" border v-loading="loadingProducts" @selection-change="handleSelectionChange" > <el-table-column align="center" type="selection" width="55" /> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="产å大类" prop="productCategory" /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" /> <el-table-column label="åä½" prop="unit" width="70" /> <el-table-column label="ä¾åºå" prop="supplierName" width="100" /> <el-table-column label="éè´æ°é" prop="quantity" width="100" /> <el-table-column label="å¾ å ¥åºæ°é" prop="quantity0" width="100" /> <el-table-column label="æ¬æ¬¡å ¥åºæ°é" prop="quantityStock" width="150"> <template #default="scope"> <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="scope.row.quantityStock" /> </template> </el-table-column> <el-table-column label="ç¨ç(%)" prop="taxRate" width="120" /> <el-table-column label="å«ç¨åä»·(å )" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" width="150" /> <el-table-column label="å«ç¨æ»ä»·(å )" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" width="150" /> <el-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" width="150" /> </el-table> </el-form> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="submitForm">确认</el-button> <el-button @click="closeDia">åæ¶</el-button> </div> </template> </el-dialog> </template> <script setup> import { ref, reactive, toRefs, getCurrentInstance } from 'vue' import useUserStore from '@/store/modules/user' import { updateStockIn, addSutockIn, selectProductRecordListByPuechaserId } from "@/api/inventoryManagement/stockIn.js"; import { purchaseListPage } from "@/api/procurementManagement/procurementLedger.js"; const userStore = useUserStore() const { proxy } = getCurrentInstance() const emit = defineEmits(['close', 'success']) const operationType = ref('')// æä½ç±»å: 'add' æ 'edit' const dialogFormVisible = ref(false)// å¼¹æ¡æ¾ç¤ºç¶æ const productList = ref([]);// 产ååè¡¨æ°æ® const loadingProducts = ref(false);// 产åå è½½ç¶æ const selectedRows = ref([]) // 产åè¡¨æ ¼éä¸è¡ const purchaseOptions = ref([]) const loadingPurchaseOptions = ref(false) const loading = ref(false); const data = reactive({ form: { id: null, purchaseContractNumber: '', // éè´è®¢åå· supplierId: null, // ä¾åºåID supplierName: '', // ä¾åºååç§° inboundTime: '', // å ¥åºæ¶é´ inboundBatch: '', // å ¥åºæ¹æ¬¡ recorderId: userStore.userId, // å½å ¥äººID recorderName: userStore.name, // å½å ¥äººå§å entryDate: getCurrentDate(), // å½å ¥æ¥æ remark: '', // 夿³¨ }, rules: { purchaseContractNumber: [{ required: true, message: "请è¾å ¥éè´ååå·", trigger: "blur" }], supplierId: [{ required: true, message: "è¯·éæ©ä¾åºå", trigger: "change" }], inboundTime: [{ required: true, message: "è¯·éæ©å ¥åºæ¶é´", trigger: "change" }], inboundBatch: [{ required: true, message: "请è¾å ¥å ¥åºæ¹æ¬¡", trigger: "blur" }] } }) const { form, rules } = toRefs(data) // å¨æè®¡ç®å¯¹è¯æ¡æ é¢ const getDialogTitle = () => { return operationType.value === 'add' ? 'æ°å¢å ¥åº' : 'ç¼è¾å ¥åº' } const formatPurchaseOption = (item = {}) => { const contract = item.purchaseContractNumber || '--'; const supplier = item.supplierName ? ` · ${item.supplierName}` : ''; return `${contract}${supplier}`; }; const loadPurchaseOptions = async (keyword = '') => { try { loadingPurchaseOptions.value = true; const res = await purchaseListPage({ current: -1, size: -1, purchaseContractNumber: keyword, }); const records = res.data?.records || []; purchaseOptions.value = records; if ( form.value.purchaseContractNumber && !purchaseOptions.value.find( (item) => item.purchaseContractNumber === form.value.purchaseContractNumber ) ) { purchaseOptions.value.push({ purchaseContractNumber: form.value.purchaseContractNumber, supplierName: form.value.supplierName, supplierId: form.value.supplierId, }); } } finally { loadingPurchaseOptions.value = false; } }; const handlePurchaseChange = (value) => { form.value.purchaseContractNumber = value || ''; const matched = purchaseOptions.value.find( (item) => item.purchaseContractNumber === value ); if (matched) { form.value.supplierName = matched.supplierName || form.value.supplierName; form.value.supplierId = matched.supplierId || form.value.supplierId; } if (!value) { productList.value = []; return; } fetchProductsByContract(); }; const exceedsAddLimit = (product) => { const stock = Number(product?.quantityStock ?? 0); const waiting = Number(product?.quantity0 ?? 0); if (!Number.isFinite(stock) || !Number.isFinite(waiting)) { return false; } return stock > waiting; }; const exceedsEditLimit = (product) => { const stock = Number(product?.quantityStock ?? 0); const waiting = Number(product?.quantity0 ?? 0); const original = Number(product?.originalQuantityStock ?? 0); if (!Number.isFinite(stock) || !Number.isFinite(waiting) || !Number.isFinite(original)) { return false; } return stock > waiting + original; }; const formattedNumber = (row, column, cellValue) => { return parseFloat(cellValue).toFixed(2); }; const fetchProductsByContract = async () => { if (!form.value.purchaseContractNumber) { proxy.$modal.msgWarning('è¯·éæ©ååå·') return } try { loadingProducts.value = true const productRes = await selectProductRecordListByPuechaserId({ purchaseContractNumber: form.value.purchaseContractNumber }); if (!productRes.data || productRes.data.length === 0) { proxy.$modal.msgWarning('该åå䏿²¡æäº§åè®°å½') productList.value = []; return } productList.value = productRes.data.map(item => ({ ...item, quantityStock: 0, originalQuantityStock: Number(item.quantityStock ?? item.inboundQuantity ?? 0), })) } catch (error) { console.error('æ¥è¯¢äº§åè®°å½å¤±è´¥:', error) proxy.$modal.msgError('æ¥è¯¢äº§åè®°å½å¤±è´¥') productList.value = []; } finally { loadingProducts.value = false } } const updatePro = async () => { if (selectedRows.value.length === 0) { proxy.$modal.msgWarning('请å éæ©äº§å'); return; } const target = selectedRows.value[0]; const stock = Number(target?.quantityStock ?? 0); if (!Number.isFinite(stock) || stock <= 0) { proxy.$modal.msgWarning('è¯·å¡«åææçå ¥åºæ°é'); return; } if (exceedsEditLimit(target)) { proxy.$modal.msgError('æ¬æ¬¡å ¥åºæ°éä¸è½è¶ è¿åå ¥åºæ°éä¸å¾ å ¥åºæ°éä¹å'); return; } const stockInData = { id: selectedRows.value[0].recordId, quantityStock: Number(selectedRows.value[0].quantityStock), }; await updateStockIn(stockInData) proxy.$modal.msgSuccess('ä¿®æ¹å ¥åºæå') closeDia() emit('success') } const submitForm = async () => { if (selectedRows.value.length === 0) { proxy.$modal.msgWarning('请å éæ©éè´ååå¹¶éæ©äº§å') return } if(operationType.value !== 'add'){ await updatePro() return } try { await proxy.$refs.formRef.validate() const invalidProducts = selectedRows.value.filter((product) => { const stock = Number(product?.quantityStock ?? 0); if (!Number.isFinite(stock) || stock <= 0) { return true; } return exceedsAddLimit(product); }) if (invalidProducts.length > 0) { proxy.$modal.msgError('æ¬æ¬¡å ¥åºæ°éé大äº0ï¼ä¸ä¸è½è¶ è¿å¾ å ¥åºæ°é') return } const stockInData = { ...form.value, inboundTime: formatDateTime(form.value.inboundTime), nickName: userStore.nickName, details: selectedRows.value.map(product => ({ id: product.id, inboundQuantity: Number(product.quantityStock) })), }; loading.value = true await addSutockIn(stockInData) proxy.$modal.msgSuccess('æ°å¢å ¥åºæå') closeDia() emit('success') } catch (error) { console.error('æäº¤å¤±è´¥:', error) if (!error.errors) { proxy.$modal.msgError('æä½å¤±è´¥ï¼è¯·éè¯') } } finally { loading.value = false } } const closeDia = () => { proxy.$refs.formRef.resetFields() dialogFormVisible.value = false emit('close') } const handleSelectionChange = (selection) => { selectedRows.value = selection.filter(item => item.id); } function formatDateTime(date = new Date(), includeTime = true) { const d = new Date(date); const year = d.getFullYear(); const month = String(d.getMonth() + 1).padStart(2, '0'); const day = String(d.getDate()).padStart(2, '0'); if (!includeTime) { return `${year}-${month}-${day}`; } const hours = String(d.getHours()).padStart(2, '0'); const minutes = String(d.getMinutes()).padStart(2, '0'); const seconds = String(d.getSeconds()).padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } function getCurrentDate() { return formatDateTime(new Date(), false); } const openDialog = async (type, row) => { operationType.value = type dialogFormVisible.value = true selectedRows.value = [] await loadPurchaseOptions(); if (type === 'add') { form.value = { id: null, purchaseContractNumber: '', supplierId: null, supplierName: '', inboundTime: '', inboundBatch: '', recorderId: userStore.userId, recorderName: userStore.name, entryDate: getCurrentDate(), remark: '' } productList.value = [] } else { form.value = JSON.parse(JSON.stringify(row)) try { loadingProducts.value = true const res = await selectProductRecordListByPuechaserId({ purchaseContractNumber: form.value.purchaseContractNumber, id: row.id }); productList.value = res.data.map(item => ({ ...item, quantityStock: Number(item.quantityStock ?? item.inboundQuantity ?? row.inboundNum ?? 0), originalQuantityStock: Number(item.quantityStock ?? item.inboundQuantity ?? row.inboundNum ?? 0), })) selectedRows.value = productList.value } catch (error) { console.error('å 载产å失败:', error) proxy.$modal.msgError('å 载产å失败') productList.value = [] } finally { loadingProducts.value = false } } } defineExpose({ openDialog, }) </script> <style scoped lang="scss"></style> src/views/inventoryManagement/receiptManagement/components/formDiaManual.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,352 @@ <template> <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? 'æ°å¢æå¨å ¥åº' : 'ç¼è¾æå¨å ¥åº'" width="70%" @close="closeDia"> <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> <div style="margin-bottom: 10px;" v-if="operationType === 'add'"> <el-button type="primary" @click="addProductRow">æ°å¢</el-button> </div> <el-table :data="productList" border v-loading="loadingProducts" > <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="产å大类" prop="productCategory" width="200"> <template #default="scope"> <el-input v-model="scope.row.productCategory" placeholder="请è¾å ¥äº§å大类" /> </template> </el-table-column> <el-table-column label="è§æ ¼åå·" prop="specificationModel" width="200"> <template #default="scope"> <el-input v-model="scope.row.specificationModel" placeholder="请è¾å ¥è§æ ¼åå·" /> </template> </el-table-column> <el-table-column label="åä½" prop="unit" width="100"> <template #default="scope"> <el-input v-model="scope.row.unit" placeholder="请è¾å ¥åä½" /> </template> </el-table-column> <el-table-column label="ä¾åºå" prop="supplierName" width="200"> <template #default="scope"> <el-input v-model="scope.row.supplierName" placeholder="请è¾å ¥ä¾åºå" /> </template> </el-table-column> <el-table-column label="ç©åç±»å" prop="itemType" width="140"> <template #default="scope"> <el-select v-model="scope.row.itemType" placeholder="è¯·éæ©ç©åç±»å" style="width: 100%"> <el-option v-for="item in itemTypeOptions" :key="item.value" :label="item.label" :value="item.value" /> </el-select> </template> </el-table-column> <el-table-column label="å ¥åºæ°é" prop="inboundNum" width="150"> <template #default="scope"> <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="scope.row.inboundNum" @change="() => calculateTotalPrice(scope.row)" /> </template> </el-table-column> <el-table-column label="å ¥åºæ¥æ" prop="inboundDate" width="180"> <template #default="scope"> <el-date-picker v-model="scope.row.inboundDate" type="date" placeholder="è¯·éæ©å ¥åºæ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" style="width: 100%" /> </template> </el-table-column> <el-table-column label="ç¨ç(%)" prop="taxRate" width="150"> <template #default="scope"> <el-select v-model="scope.row.taxRate" placeholder="è¯·éæ©ç¨ç" style="width: 100%" @change="() => calculateExclusivePrice(scope.row)"> <el-option v-for="item in taxRateOptions" :key="item.value" :label="item.label" :value="item.value" /> </el-select> </template> </el-table-column> <el-table-column label="å«ç¨åä»·(å )" prop="taxInclusiveUnitPrice" width="180" > <template #default="scope"> <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="scope.row.taxInclusiveUnitPrice" @change="calculateTotalPrice(scope.row)" /> </template> </el-table-column> <el-table-column label="å«ç¨æ»ä»·(å )" prop="taxInclusiveTotalPrice" width="180" > <template #default="scope"> <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="scope.row.taxInclusiveTotalPrice" @change="calculateExclusivePrice(scope.row)" /> </template> </el-table-column> <el-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" width="180" > <template #default="scope"> <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="scope.row.taxExclusiveTotalPrice" /> </template> </el-table-column> <el-table-column label="æä½" width="80" v-if="operationType === 'add'"> <template #default="scope"> <el-button type="danger" size="small" @click="removeProductRow(scope.$index)">å é¤</el-button> </template> </el-table-column> </el-table> </el-form> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="submitForm">确认</el-button> <el-button @click="closeDia">åæ¶</el-button> </div> </template> </el-dialog> </template> <script setup> import { ref, reactive, toRefs, getCurrentInstance } from 'vue' import useUserStore from '@/store/modules/user' import { addStockInCustom, updateStockInCustom, } from "@/api/inventoryManagement/stockIn.js"; const userStore = useUserStore() const { proxy } = getCurrentInstance() const emit = defineEmits(['close', 'success']) const operationType = ref('')// æä½ç±»å: 'add' æ 'edit' const dialogFormVisible = ref(false)// å¼¹æ¡æ¾ç¤ºç¶æ const productList = ref([]);// 产ååè¡¨æ°æ® const loadingProducts = ref(false);// 产åå è½½ç¶æ const loading = ref(false); function formatDateTime(date = new Date(), includeTime = true) { const d = new Date(date); const year = d.getFullYear(); const month = String(d.getMonth() + 1).padStart(2, '0'); const day = String(d.getDate()).padStart(2, '0'); if (!includeTime) { return `${year}-${month}-${day}`; } const hours = String(d.getHours()).padStart(2, '0'); const minutes = String(d.getMinutes()).padStart(2, '0'); const seconds = String(d.getSeconds()).padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } function getCurrentDate() { return formatDateTime(new Date(), false); } const itemTypeOptions = [ { label: 'ç©æ', value: 'ç©æ' }, { label: 'åæ', value: 'åæ' }, { label: 'æå', value: 'æå' }, { label: 'å ¶ä»', value: 'å ¶ä»' }, ] const taxRateOptions = [ { label: '1', value: 1 }, { label: '6', value: 6 }, { label: '13', value: 13 }, ] const data = reactive({ form: { id: null, supplierId: null, // ä¾åºåID supplierName: '', // ä¾åºååç§° recorderId: userStore.userId, // å½å ¥äººID recorderName: userStore.name, // å½å ¥äººå§å entryDate: getCurrentDate(), // å½å ¥æ¥æ remark: '', // 夿³¨ }, rules: { supplierName: [{ required: true, message: "请è¾å ¥ä¾åºååç§°", trigger: "blur" }] } }) const { form, rules } = toRefs(data) // æ°å¢äº§åè¡ const addProductRow = () => { productList.value.push({ id: null, productCategory: '', specificationModel: '', unit: '', supplierName: form.value.supplierName || '', itemType: '', inboundNum: 0, inboundDate: '', taxRate: null, taxInclusiveUnitPrice: 0, taxInclusiveTotalPrice: 0, taxExclusiveTotalPrice: 0, }); }; // å é¤äº§åè¡ const removeProductRow = (index) => { productList.value.splice(index, 1); }; // 计ç®å«ç¨æ»ä»·ï¼æ ¹æ®åä»·åæ°éï¼ const calculateTotalPrice = (row) => { const unitPrice = Number(row.taxInclusiveUnitPrice || 0); const quantity = Number(row.inboundNum || 0); row.taxInclusiveTotalPrice = unitPrice * quantity; calculateExclusivePrice(row); }; // 计ç®ä¸å«ç¨æ»ä»·ï¼æ ¹æ®å«ç¨æ»ä»·åç¨çï¼ const calculateExclusivePrice = (row) => { const totalPrice = Number(row.taxInclusiveTotalPrice || 0); const taxRate = Number(row.taxRate || 0); row.taxExclusiveTotalPrice = totalPrice / (1 + taxRate / 100); }; const submitForm = async () => { try { await proxy.$refs.formRef.validate() if (!productList.value.length) { proxy.$modal.msgError('请è³å°æ·»å 䏿¡äº§åæ°æ®') return } // éªè¯æå¨æ·»å çæ°æ®å¿ å¡«åæ®µ for (let i = 0; i < productList.value.length; i++) { const product = productList.value[i]; if (!product.productCategory || !product.specificationModel || !product.unit) { proxy.$modal.msgError(`第${i + 1}è¡äº§åæ°æ®æªå¡«å宿´ï¼äº§å大类ãè§æ ¼åå·ãåä½ä¸ºå¿ å¡«ï¼`) return } if (!product.itemType) { proxy.$modal.msgError(`第${i + 1}è¡è¯·éæ©ç©åç±»å`) return } if (!product.inboundDate) { proxy.$modal.msgError(`第${i + 1}è¡è¯·éæ©å ¥åºæ¥æ`) return } const stock = Number(product?.inboundNum ?? 0); if (!Number.isFinite(stock) || stock <= 0) { proxy.$modal.msgError(`第${i + 1}è¡æ¬æ¬¡å ¥åºæ°éé大äº0`) return } } const payloadList = productList.value.map(product => ({ id: product.id ?? null, inboundNum: Number(product.inboundNum), productCategory: product.productCategory, specificationModel: product.specificationModel, unit: product.unit, supplierName: product.supplierName || form.value.supplierName, itemType: product.itemType, inboundDate: formatDateTime(product.inboundDate, false), taxRate: Number(product.taxRate || 0), taxInclusiveUnitPrice: Number(product.taxInclusiveUnitPrice || 0), taxInclusiveTotalPrice: Number(product.taxInclusiveTotalPrice || 0), taxExclusiveTotalPrice: Number(product.taxExclusiveTotalPrice || 0), })); loading.value = true if (operationType.value === 'edit') { const editPayload = payloadList[0] await updateStockInCustom(editPayload) } else { await addStockInCustom(payloadList) } proxy.$modal.msgSuccess(operationType.value === 'edit' ? 'ç¼è¾æå¨å ¥åºæå' : 'æ°å¢æå¨å ¥åºæå') closeDia() emit('success') } catch (error) { console.error('æäº¤å¤±è´¥:', error) if (!error.errors) { proxy.$modal.msgError('æä½å¤±è´¥ï¼è¯·éè¯') } } finally { loading.value = false } } const closeDia = () => { proxy.$refs.formRef.resetFields() dialogFormVisible.value = false productList.value = [] emit('close') } const openDialog = async (type, row) => { operationType.value = type dialogFormVisible.value = true if (type === 'add') { form.value = { id: null, supplierId: null, supplierName: '', recorderId: userStore.userId, recorderName: userStore.name, entryDate: getCurrentDate(), remark: '' } productList.value = [] } else { // ç¼è¾æ¨¡å¼ï¼å°è¡æ°æ®å¡«å å°è¡¨æ ¼ä¸ä»¥æ¯æä¿®æ¹ form.value = { id: row?.id ?? null, supplierId: row?.supplierId ?? null, supplierName: row?.supplierName ?? '', recorderId: userStore.userId, recorderName: userStore.name, entryDate: getCurrentDate(), remark: row?.remark ?? '' } productList.value = [{ id: row?.id ?? null, productCategory: row?.productCategory ?? '', specificationModel: row?.specificationModel ?? '', unit: row?.unit ?? '', supplierName: row?.supplierName ?? '', itemType: row?.itemType ?? '', inboundNum: Number(row?.inboundNum ?? row?.inboundQuantity ?? 0), inboundDate: row?.inboundDate ?? row?.createTime ?? '', taxRate: Number(row?.taxRate ?? 0), taxInclusiveUnitPrice: Number(row?.taxInclusiveUnitPrice ?? 0), taxInclusiveTotalPrice: Number(row?.taxInclusiveTotalPrice ?? 0), taxExclusiveTotalPrice: Number(row?.taxExclusiveTotalPrice ?? 0), }] } } defineExpose({ openDialog, }) </script> <style scoped lang="scss"></style> src/views/inventoryManagement/receiptManagement/index.vue
@@ -1,162 +1,188 @@ <template> <div class="app-container"> <div class="search_form"> <div> <span class="search_title">ä¾åºååç§°ï¼</span> <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <span class="search_title ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <el-button type="primary" @click="openForm('add')">æ°å¢å ¥åº</el-button> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</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" show-summary style="width: 100%" :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="createTime" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºæ¹æ¬¡" prop="inboundBatches" width="160" show-overflow-tooltip /> <el-table-column label="ä¾åºååç§°" prop="supplierName" width="240" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productCategory" width="100" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" width="200" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" width="70" show-overflow-tooltip /> <el-table-column label="å ¥åºæ°é" prop="inboundNum" width="90" 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="80" show-overflow-tooltip /> <el-table-column label="ä¸å«ç¨æ»ä»·" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºäºº" prop="createBy" width="80" 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="openForm('edit', scope.row);" :disabled="scope.row.createUser !== userStore.id">ç¼è¾</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> <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? 'æ°å¢å ¥åº' : 'ç¼è¾å ¥åº'" width="70%" @close="closeDia"> <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> <el-form-item label="éè´è®¢åå·" prop="purchaseContractNumber"> <el-select v-model="form.purchaseContractNumber" placeholder="è¯·éæ©éè´è®¢åå·" clearable filterable remote :remote-method="loadPurchaseOptions" :loading="loadingPurchaseOptions" @change="handlePurchaseChange" :disabled="operationType === 'edit'" style="width: 100%" > <el-option v-for="item in purchaseOptions" :key="item.purchaseContractNumber" :label="formatPurchaseOption(item)" :value="item.purchaseContractNumber" /> </el-select> </el-form-item> <el-table :data="productList" border v-loading="loadingProducts" @selection-change="handleSelectionChange" > <el-table-column align="center" type="selection" width="55" /> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="产å大类" prop="productCategory" /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" /> <el-table-column label="åä½" prop="unit" width="70" /> <el-table-column label="ä¾åºå" prop="supplierName" width="100" /> <el-table-column label="éè´æ°é" prop="quantity" width="100" /> <el-table-column label="å¾ å ¥åºæ°é" prop="quantity0" width="100" /> <el-table-column label="æ¬æ¬¡å ¥åºæ°é" prop="quantityStock" width="150"> <template #default="scope"> <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="scope.row.quantityStock" /> </template> </el-table-column> <el-table-column label="ç¨ç(%)" prop="taxRate" width="120" /> <el-table-column label="å«ç¨åä»·(å )" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" width="150" /> <el-table-column label="å«ç¨æ»ä»·(å )" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" width="150" /> <el-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" width="150" /> </el-table> </el-form> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="submitForm">确认</el-button> <el-button @click="closeDia">åæ¶</el-button> <el-tabs v-model="activeTab" @tab-change="handleTabChange"> <el-tab-pane label="çäº§å ¥åº" name="production"> <div class="search_form"> <div> <span class="search_title">客æ·åç§°ï¼</span> <el-input v-model="searchForm.customerName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <span class="search_title ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <el-button @click="handleOut">导åº</el-button> </div> </div> </template> </el-dialog> <div class="table_list"> <el-table :data="tableData" border v-loading="tableLoading" :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%" :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)"> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="å ¥åºæ¶é´" prop="createTime" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºæ¹æ¬¡" prop="inboundBatches" width="160" show-overflow-tooltip /> <el-table-column label="客æ·åç§°" prop="customerName" width="240" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productCategory" width="100" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" width="200" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" width="70" show-overflow-tooltip /> <el-table-column label="å ¥åºæ°é" prop="inboundNum" width="90" 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="80" show-overflow-tooltip /> <el-table-column label="ä¸å«ç¨æ»ä»·" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºäºº" prop="createBy" width="80" show-overflow-tooltip /> </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> </el-tab-pane> <el-tab-pane label="éè´å ¥åº" name="purchase"> <div class="search_form"> <div> <span class="search_title">ä¾åºååç§°ï¼</span> <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <span class="search_title ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <el-button type="primary" @click="openForm('add', 'purchase')">æ°å¢å ¥åº</el-button> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</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" show-summary style="width: 100%" :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="createTime" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºæ¹æ¬¡" prop="inboundBatches" width="160" show-overflow-tooltip /> <el-table-column label="ä¾åºååç§°" prop="supplierName" width="240" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productCategory" width="100" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" width="200" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" width="70" show-overflow-tooltip /> <el-table-column label="å ¥åºæ°é" prop="inboundNum" width="90" 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="80" show-overflow-tooltip /> <el-table-column label="ä¸å«ç¨æ»ä»·" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºäºº" prop="createBy" width="80" 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="openForm('edit', scope.row, 'purchase');" :disabled="scope.row.createUser !== userStore.id">ç¼è¾</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> </el-tab-pane> <el-tab-pane label="æå¨å ¥åº" name="manual"> <div class="search_form"> <div> <span class="search_title">ä¾åºååç§°ï¼</span> <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <span class="search_title ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <el-button type="primary" @click="openForm('add', 'manual')">æ°å¢å ¥åº</el-button> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</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" show-summary style="width: 100%" :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="inboundDate" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºæ¹æ¬¡" prop="inboundBatches" width="160" show-overflow-tooltip /> <el-table-column label="ä¾åºååç§°" prop="supplierName" width="240" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productCategory" width="100" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" width="200" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" width="70" show-overflow-tooltip /> <el-table-column label="ç©åç±»å" prop="itemType" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºæ°é" prop="inboundNum" width="90" 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="80" show-overflow-tooltip /> <el-table-column label="ä¸å«ç¨æ»ä»·" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºäºº" prop="createBy" width="80" 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="openForm('edit', scope.row, 'manual');" :disabled="scope.row.createBy !== userStore.nickName">ç¼è¾</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> </el-tab-pane> </el-tabs> <form-dia ref="formDia" @close="handleQuery" @success="handleQuery"></form-dia> <form-dia-manual ref="formDiaManual" @close="handleQuery" @success="handleQuery"></form-dia-manual> </div> </template> <script setup> import pagination from '@/components/PIMTable/Pagination.vue' import { ref, reactive, toRefs, onMounted, getCurrentInstance } from 'vue' import { ref, reactive, toRefs, onMounted, getCurrentInstance, nextTick } from 'vue' import { ElMessageBox } from "element-plus"; import useUserStore from '@/store/modules/user' import { getStockInPage, updateStockIn, addSutockIn, getStockInPageByProduction, getStockInPageByCustom, delStockIn, selectProductRecordListByPuechaserId delStockInCustom, } from "@/api/inventoryManagement/stockIn.js"; import { purchaseListPage } from "@/api/procurementManagement/procurementLedger.js"; import FormDia from './components/formDia.vue' import FormDiaManual from './components/formDiaManual.vue' const userStore = useUserStore() const { proxy } = getCurrentInstance() const tableData = ref([]) const selectedRows = ref([]) const userList = ref([]) const purchaseOptions = ref([]) const loadingPurchaseOptions = ref(false) const loading = ref(false); const tableLoading = ref(false) const formDia = ref() const formDiaManual = ref() const activeTab = ref('production') // å½åæ¿æ´»ç tab const page = reactive({ current: 1, @@ -164,107 +190,14 @@ }) const total = ref(0) // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref('')// æä½ç±»å: 'add' æ 'edit' const dialogFormVisible = ref(false)// å¼¹æ¡æ¾ç¤ºç¶æ const productList = ref([]);// 产ååè¡¨æ°æ® const loadingProducts = ref(false);// 产åå è½½ç¶æ const productSelectedRows = ref([]) // 产åè¡¨æ ¼éä¸è¡ const data = reactive({ searchForm: { supplierName: '', timeStr: '', customerName: '', timeStr: '', }, form: { id: null, purchaseContractNumber: '', // éè´è®¢åå· supplierId: null, // ä¾åºåID supplierName: '', // ä¾åºååç§° inboundTime: '', // å ¥åºæ¶é´ inboundBatch: '', // å ¥åºæ¹æ¬¡ recorderId: userStore.userId, // å½å ¥äººID recorderName: userStore.name, // å½å ¥äººå§å entryDate: getCurrentDate(), // å½å ¥æ¥æ remark: '', // 夿³¨ }, rules: { purchaseContractNumber: [{ required: true, message: "请è¾å ¥éè´ååå·", trigger: "blur" }], supplierId: [{ required: true, message: "è¯·éæ©ä¾åºå", trigger: "change" }], inboundTime: [{ required: true, message: "è¯·éæ©å ¥åºæ¶é´", trigger: "change" }], inboundBatch: [{ required: true, message: "请è¾å ¥å ¥åºæ¹æ¬¡", trigger: "blur" }] } }) const { searchForm, form, rules } = toRefs(data) const formatPurchaseOption = (item = {}) => { const contract = item.purchaseContractNumber || '--'; const supplier = item.supplierName ? ` · ${item.supplierName}` : ''; return `${contract}${supplier}`; }; const loadPurchaseOptions = async (keyword = '') => { try { loadingPurchaseOptions.value = true; const res = await purchaseListPage({ current: -1, size: -1, purchaseContractNumber: keyword, }); const records = res.data?.records || []; purchaseOptions.value = records; if ( form.value.purchaseContractNumber && !purchaseOptions.value.find( (item) => item.purchaseContractNumber === form.value.purchaseContractNumber ) ) { purchaseOptions.value.push({ purchaseContractNumber: form.value.purchaseContractNumber, supplierName: form.value.supplierName, supplierId: form.value.supplierId, }); } } finally { loadingPurchaseOptions.value = false; } }; const handlePurchaseChange = (value) => { form.value.purchaseContractNumber = value || ''; const matched = purchaseOptions.value.find( (item) => item.purchaseContractNumber === value ); if (matched) { form.value.supplierName = matched.supplierName || form.value.supplierName; form.value.supplierId = matched.supplierId || form.value.supplierId; } if (!value) { productList.value = []; return; } fetchProductsByContract(); }; const exceedsAddLimit = (product) => { const stock = Number(product?.quantityStock ?? 0); const waiting = Number(product?.quantity0 ?? 0); if (!Number.isFinite(stock) || !Number.isFinite(waiting)) { return false; } return stock > waiting; }; const exceedsEditLimit = (product) => { const stock = Number(product?.quantityStock ?? 0); const waiting = Number(product?.quantity0 ?? 0); const original = Number(product?.originalQuantityStock ?? 0); if (!Number.isFinite(stock) || !Number.isFinite(waiting) || !Number.isFinite(original)) { return false; } return stock > waiting + original; }; const formattedNumber = (row, column, cellValue) => { return parseFloat(cellValue).toFixed(2); }; const { searchForm } = toRefs(data) // æ¥è¯¢å表 /** æç´¢æé®æä½ */ const handleQuery = () => { @@ -278,281 +211,117 @@ } const getList = () => { tableLoading.value = true getStockInPage({ ...searchForm.value, ...page }).then(res => { const params = { ...page } // æ ¹æ®ä¸åç tab ç±»åä¼ éä¸åçæ¥è¯¢åæ° if (activeTab.value === 'production') { params.customerName = searchForm.value.customerName params.timeStr = searchForm.value.timeStr } else { params.supplierName = searchForm.value.supplierName params.timeStr = searchForm.value.timeStr } // æ ¹æ®ä¸åç tab ç±»åè°ç¨ä¸åçæ¥å£ const apiCall = activeTab.value === 'production' ? getStockInPageByProduction(params) : activeTab.value === 'manual' ? getStockInPageByCustom(params) : getStockInPage(params) apiCall.then(res => { tableLoading.value = false tableData.value = res.data.records total.value = res.data.total console.log('tableData:', tableData.value) }).catch(() => { tableLoading.value = false }) } // è°ç¨selectProductRecordListByPuechaserIdè¿ä¸ªæ¹æ³æ ¹æ®ååæ¥è¯¢å°idï¼åè°ç¨getProductRecordByhetongè¿ä¸ªæ¹æ³æ ¹æ®idæ¥è¯¢å°äº§å订åè®°å½ // æ°å¢æ ¹æ®ååå·æ¥è¯¢äº§åè®°å½çæ¹æ³ const fetchProductsByContract = async () => { if (!form.value.purchaseContractNumber) { proxy.$modal.msgWarning('è¯·éæ©ååå·') return } try { loadingProducts.value = true // æ ¹æ®ååæ¥è¯¢äº§åè®°å½ const productRes = await selectProductRecordListByPuechaserId({ purchaseContractNumber: form.value.purchaseContractNumber }); console.log('productRes:', productRes) if (!productRes.data || productRes.data.length === 0) { proxy.$modal.msgWarning('该åå䏿²¡æäº§åè®°å½') productList.value = []; return } // å¤çäº§åæ°æ®ï¼æ·»å æ¬æ¬¡å ¥åºæ°éåæ®µ productList.value = productRes.data.map(item => ({ ...item, quantityStock: 0, originalQuantityStock: Number(item.quantityStock ?? item.inboundQuantity ?? 0), })) } catch (error) { console.error('æ¥è¯¢äº§åè®°å½å¤±è´¥:', error) proxy.$modal.msgError('æ¥è¯¢äº§åè®°å½å¤±è´¥') productList.value = []; } finally { loadingProducts.value = false } // 忢 tab const handleTabChange = (tabName) => { page.current = 1 // 忢 tab æ¶æ¸ 空æç´¢æ¡ä»¶ searchForm.value.supplierName = '' searchForm.value.customerName = '' searchForm.value.timeStr = '' getList() } // æå¼å¼¹æ¡ const openForm = async (type, row) => { operationType.value = type dialogFormVisible.value = true selectedRows.value = [] await loadPurchaseOptions(); if (type === 'add') { // æ°å¢æ¶åå§å表å form.value = { id: null, purchaseContractNumber: '', supplierId: null, supplierName: '', inboundTime: '', inboundBatch: '', recorderId: userStore.userId, recorderName: userStore.name, entryDate: getCurrentDate(), remark: '' } productList.value = [] // æ¸ ç©ºäº§åå表 const openForm = async (type, row, tabType) => { const currentTab = tabType || activeTab.value await nextTick(() => { if (currentTab === 'manual') { formDiaManual.value?.openDialog(type, row) } else { form.value = JSON.parse(JSON.stringify(row)) try { loadingProducts.value = true // æ ¹æ®ååå·å 载对åºç产åå表ï¼å设 getProductByContract æ¯å¯ç¨æ¥å£ï¼ const res = await selectProductRecordListByPuechaserId({ purchaseContractNumber: form.value.purchaseContractNumber, id: row.id }); productList.value = res.data.map(item => ({ ...item, quantityStock: Number(item.quantityStock ?? item.inboundQuantity ?? row.inboundNum ?? 0), originalQuantityStock: Number(item.quantityStock ?? item.inboundQuantity ?? row.inboundNum ?? 0), })) selectedRows.value = productList.value } catch (error) { console.error('å 载产å失败:', error) proxy.$modal.msgError('å 载产å失败') productList.value = [] } finally { loadingProducts.value = false } formDia.value?.openDialog(type, row) } } }) } const updatePro = async () => { // åå¤æäº¤æ°æ® // åå¤æäº¤æ°æ® - ä¿®æ¹ä¸ºå端éè¦çæ ¼å¼ if (selectedRows.value.length === 0) { proxy.$modal.msgWarning('请å éæ©äº§å'); return; } const target = selectedRows.value[0]; const stock = Number(target?.quantityStock ?? 0); if (!Number.isFinite(stock) || stock <= 0) { proxy.$modal.msgWarning('è¯·å¡«åææçå ¥åºæ°é'); return; } if (exceedsEditLimit(target)) { proxy.$modal.msgError('æ¬æ¬¡å ¥åºæ°éä¸è½è¶ è¿åå ¥åºæ°éä¸å¾ å ¥åºæ°éä¹å'); return; } const stockInData = { id: selectedRows.value[0].recordId, quantityStock: Number(selectedRows.value[0].quantityStock),// ä½¿ç¨æ°æ ¼å¼å彿° }; await updateStockIn(stockInData) proxy.$modal.msgSuccess('ä¿®æ¹å ¥åºæå') closeDia() getList() // å·æ°å表 } // æäº¤è¡¨å const submitForm = async () => { // éªè¯è³å°éæ©äºä¸ä¸ªäº§å if (selectedRows.value.length === 0) { proxy.$modal.msgWarning('请å éæ©éè´ååå¹¶éæ©äº§å') return } if(operationType.value !== 'add'){ await updatePro() return } try { await proxy.$refs.formRef.validate() // éªè¯å ¥åºæ°é const invalidProducts = selectedRows.value.filter((product) => { const stock = Number(product?.quantityStock ?? 0); if (!Number.isFinite(stock) || stock <= 0) { return true; } return exceedsAddLimit(product); }) if (invalidProducts.length > 0) { proxy.$modal.msgError('æ¬æ¬¡å ¥åºæ°éé大äº0ï¼ä¸ä¸è½è¶ è¿å¾ å ¥åºæ°é') return } // åå¤æäº¤æ°æ® - ä¿®æ¹ä¸ºå端éè¦çæ ¼å¼ const stockInData = { // å ¥åºååºæ¬ä¿¡æ¯ ...form.value, inboundTime: formatDateTime(form.value.inboundTime), nickName: userStore.nickName, details: selectedRows.value.map(product => ({ id: product.id, // id: product.salesLedgerProductId, inboundQuantity: Number(product.quantityStock) })), }; // è°ç¨API loading.value = true await addSutockIn(stockInData) proxy.$modal.msgSuccess('æ°å¢å ¥åºæå') closeDia() getList() // å·æ°å表 } catch (error) { console.error('æäº¤å¤±è´¥:', error) if (!error.errors) { proxy.$modal.msgError('æä½å¤±è´¥ï¼è¯·éè¯') } } finally { loading.value = false } } // å ³éå¼¹æ¡ const closeDia = () => { proxy.$refs.formRef.resetFields() dialogFormVisible.value = false } // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { // è¿æ»¤æåæ°æ® selectedRows.value = selection.filter(item => item.id); } const handleSelectionChange = (selection) => { selectedRows.value = selection.filter(item => item.id) } const expandedRowKeys = ref([]) const expandedRowKeys = ref([]) // 主表åè®¡æ¹æ³ const summarizeMainTable = (param) => { return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']); }; const summarizeMainTable = (param) => { return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']) } // å¯¼åº const handleOut = () => { ElMessageBox.confirm( 'æ¯å¦ç¡®è®¤å¯¼åºï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { proxy.download("/stockin/export", {}, 'å ¥åºå°è´¦.xlsx') }).catch(() => { proxy.$modal.msg("已忶") }) } // å é¤ const handleDelete = () => { let ids = [] if (selectedRows.value.length > 0) { // æ£æ¥æ¯å¦æä»äººç»´æ¤çæ°æ® const unauthorizedData = selectedRows.value.filter(item => item.createUser !== userStore.id); if (unauthorizedData.length > 0) { proxy.$modal.msgWarning("ä¸å¯å é¤ä»äººç»´æ¤çæ°æ®"); return; } ids = selectedRows.value.map(item => item.id); } else { proxy.$modal.msgWarning('è¯·éæ©æ°æ®') return } ElMessageBox.confirm( 'éä¸çå 容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { delStockIn({ids:ids}).then(res => { proxy.$modal.msgSuccess("å 餿å") getList() }) }).catch(() => { proxy.$modal.msg("已忶") }) } // è·åå½åæ¥æå¹¶æ ¼å¼å为 YYYY-MM-DD // ä¿®æ¹ä¸ºæ´éç¨çæ¥ææ¶é´æ ¼å¼å彿° function formatDateTime(date = new Date(), includeTime = true) { const d = new Date(date); const year = d.getFullYear(); const month = String(d.getMonth() + 1).padStart(2, '0'); const day = String(d.getDate()).padStart(2, '0'); if (!includeTime) { return `${year}-${month}-${day}`; // ä¿æåæ getCurrentDate åè½ } // æ°å¢æ¶é´é¨åæ ¼å¼å const hours = String(d.getHours()).padStart(2, '0'); const minutes = String(d.getMinutes()).padStart(2, '0'); const seconds = String(d.getSeconds()).padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } // ä¿æåæ getCurrentDate çå ¼å®¹æ§ function getCurrentDate() { return formatDateTime(new Date(), false); } onMounted(() => { getList() const handleOut = () => { ElMessageBox.confirm('æ¯å¦ç¡®è®¤å¯¼åºï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', }).then(() => { proxy.download("/stockin/export", {}, 'å ¥åºå°è´¦.xlsx') }).catch(() => { proxy.$modal.msg("已忶") }) } // å é¤ const handleDelete = () => { if (selectedRows.value.length === 0) { proxy.$modal.msgWarning('è¯·éæ©æ°æ®') return } // æ£æ¥æ¯å¦æä»äººç»´æ¤çæ°æ® const unauthorizedData = selectedRows.value.filter(item => item.createBy !== userStore.nickName) if (unauthorizedData.length > 0) { proxy.$modal.msgWarning("ä¸å¯å é¤ä»äººç»´æ¤çæ°æ®") return } const ids = selectedRows.value.map(item => item.id) ElMessageBox.confirm('éä¸çå 容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼', 'å é¤', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', }).then(() => { // æ ¹æ®å½å tab ç±»åéæ©ä¸åçå 餿¥å£ const deleteApi = activeTab.value === 'manual' ? delStockInCustom : delStockIn deleteApi({ ids }).then(() => { proxy.$modal.msgSuccess("å 餿å") getList() }).catch(() => { proxy.$modal.msgError("å é¤å¤±è´¥") }) }).catch(() => { proxy.$modal.msg("已忶") }) } onMounted(() => { getList() }) </script> <style scoped lang="scss"></style> src/views/inventoryManagement/stockManagement/index.vue
@@ -1,56 +1,164 @@ <template> <div class="app-container"> <div class="search_form"> <div> <span class="search_title">ä¾åºååç§°ï¼</span> <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <span class="search_title ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <!-- <el-button type="primary" @click="openForm('add')">æ°å¢</el-button> --> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</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" 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="createTime" width="100" show-overflow-tooltip /> <el-table-column label="ä¾åºååç§°" prop="supplierName" width="240" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productCategory" width="100" show-overflow-tooltip /> <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="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-table-column label="ä¸å«ç¨æ»ä»·" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºäºº" prop="createBy" width="80" 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="openForm('edit', scope.row);" :disabled="scope.row.createUser !== userStore.id">ç¼è¾</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> <el-tabs v-model="activeTab" @tab-change="handleTabChange"> <el-tab-pane label="çäº§å ¥åº" name="production"> <div class="search_form"> <div> <span class="search_title">客æ·åç§°ï¼</span> <el-input v-model="searchForm.customerName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <span class="search_title ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</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" 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="createTime" width="100" show-overflow-tooltip /> <el-table-column label="客æ·åç§°" prop="customerName" width="240" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productCategory" width="100" show-overflow-tooltip /> <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="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-table-column label="ä¸å«ç¨æ»ä»·" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºäºº" prop="createBy" width="80" 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="openForm('edit', scope.row);" :disabled="scope.row.createUser !== userStore.id">ç¼è¾</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> </el-tab-pane> <el-tab-pane label="éè´å ¥åº" name="purchase"> <div class="search_form"> <div> <span class="search_title">ä¾åºååç§°ï¼</span> <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <span class="search_title ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</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" 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="createTime" width="100" show-overflow-tooltip /> <el-table-column label="ä¾åºååç§°" prop="supplierName" width="240" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productCategory" width="100" show-overflow-tooltip /> <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="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-table-column label="ä¸å«ç¨æ»ä»·" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºäºº" prop="createBy" width="80" 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="openForm('edit', scope.row);" :disabled="scope.row.createUser !== userStore.id">ç¼è¾</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> </el-tab-pane> <el-tab-pane label="æå¨å ¥åº" name="manual"> <div class="search_form"> <div> <span class="search_title">ä¾åºååç§°ï¼</span> <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <span class="search_title ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</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" 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="createTime" width="100" show-overflow-tooltip /> <el-table-column label="ä¾åºååç§°" prop="supplierName" width="240" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productCategory" width="100" show-overflow-tooltip /> <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="itemType" width="120" show-overflow-tooltip /> <el-table-column label="åºåæ°é" prop="inboundNum" width="100" 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-table-column label="ä¸å«ç¨æ»ä»·" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip /> <el-table-column label="å ¥åºäºº" prop="createBy" width="80" 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="openForm('edit', scope.row);" :disabled="scope.row.createBy !== userStore.nickName">ç¼è¾</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> </el-tab-pane> </el-tabs> <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? 'æ°å¢åºå' : 'ç¼è¾åºå'" width="70%" @close="closeDia"> <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> @@ -158,6 +266,8 @@ import { productTreeList,modelList } from "@/api/basicData/product.js" import { getStockManagePage, getStockManagePageByProduction, getStockManagePageByCustom, delStockManage, } from "@/api/inventoryManagement/stockManage.js"; import { @@ -186,10 +296,12 @@ // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref('') const dialogFormVisible = ref(false) const activeTab = ref('production') const data = reactive({ searchForm: { supplierName: '', timeStr: '', customerName: '', timeStr: '', }, form: { supplierId: null, @@ -242,9 +354,31 @@ page.size = obj.limit; getList() } const buildQueryParams = () => { const params = { ...page, timeStr: searchForm.value.timeStr, } if (activeTab.value === 'production') { params.customerName = searchForm.value.customerName } else { params.supplierName = searchForm.value.supplierName } return params } const getList = () => { tableLoading.value = true getStockManagePage({ ...searchForm.value, ...page }).then(res => { const params = buildQueryParams() let apiCall if (activeTab.value === 'production') { apiCall = getStockManagePageByProduction(params) } else if (activeTab.value === 'manual') { apiCall = getStockManagePageByCustom(params) } else { apiCall = getStockManagePage(params) } apiCall.then(res => { tableLoading.value = false tableData.value = res.data.records total.value = res.data.total @@ -253,6 +387,16 @@ }).catch(() => { tableLoading.value = false }) } // 忢 tab const handleTabChange = () => { page.current = 1 searchForm.value.supplierName = '' searchForm.value.customerName = '' searchForm.value.timeStr = '' selectedRows.value = [] getList() } // è¡¨æ ¼éæ©æ°æ® @@ -357,7 +501,8 @@ type: 'warning', } ).then(() => { proxy.download("/stockin/exportCopy", {}, 'åºåä¿¡æ¯.xlsx') const exportParams = buildQueryParams() proxy.download("/stockin/exportCopy", exportParams, 'åºåä¿¡æ¯.xlsx') }).catch(() => { proxy.$modal.msg("已忶") }) @@ -367,7 +512,7 @@ let ids = [] if (selectedRows.value.length > 0) { // æ£æ¥æ¯å¦æä»äººç»´æ¤çæ°æ® const unauthorizedData = selectedRows.value.filter(item => item.createUser !== userStore.id); const unauthorizedData = selectedRows.value.filter(item => item.createBy !== userStore.nickName); if (unauthorizedData.length > 0) { proxy.$modal.msgWarning("ä¸å¯å é¤ä»äººç»´æ¤çæ°æ®"); return; src/views/procurementManagement/procurementLedger/index.vue
@@ -53,7 +53,7 @@ show-summary :summary-method="summarizeMainTable" @expand-change="expandChange" height="calc(100vh - 18.5em)" height="calc(100vh - 19em)" > <el-table-column align="center" type="selection" width="55" /> <el-table-column type="expand">