| src/api/inventoryManagement/stockInRecord.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/api/inventoryManagement/stockInventory.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/receiptManagement/components/formDia.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/receiptManagement/components/formDiaProduct.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/receiptManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/stockManagement/New.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/stockManagement/Subtract.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/stockManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/inventoryManagement/stockInRecord.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ import request from "@/utils/request"; // æ¥è¯¢å ¥åºä¿¡æ¯å表 export const getStockInRecordListPage = (params) => { return request({ url: "/stockInRecord/listPage", method: "get", params, }); }; export const updateStockInRecord = (id, data) => { return request({ url: "/stockInRecord/" + id, method: "put", data: data, }); }; export const batchDeleteStockInRecords = (ids) => { return request({ url: "/stockInRecord", method: "delete", data: ids, }); }; src/api/inventoryManagement/stockInventory.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ import request from "@/utils/request.js"; // å页æ¥è¯¢åºåè®°å½å表 export const getStockInventoryListPage = (params) => { return request({ url: "/stockInventory/pagestockInventory", method: "get", params, }); }; // å建åºåè®°å½ export const createStockInventory = (params) => { return request({ url: "/stockInventory/addstockInventory", method: "post", params, }); }; // åå°åºåè®°å½ export const subtractStockInventory = (params) => { return request({ url: "/stockInventory/subtractStockInventory", method: "post", params, }); }; src/views/inventoryManagement/receiptManagement/components/formDia.vue
ÎļþÒÑɾ³ý src/views/inventoryManagement/receiptManagement/components/formDiaProduct.vue
ÎļþÒÑɾ³ý src/views/inventoryManagement/receiptManagement/index.vue
@@ -1,300 +1,81 @@ <template> <div class="app-container"> <el-tabs v-model="activeTab" @tab-change="handleTabChange"> <el-tab-pane label="æåå ¥åº" name="production"> <div class="search_form"> <div> <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"/> <span class="search_title ml10">产å大类ï¼</span> <el-input v-model="searchForm.productCategory" style="width: 240px" placeholder="请è¾å ¥" clearable/> <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%" :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" show-overflow-tooltip/> <el-table-column label="éå®ååå·" prop="salesContractNo" width="180" show-overflow-tooltip/> <el-table-column label="产å大类" prop="productCategory" show-overflow-tooltip/> <el-table-column label="è§æ ¼åå·" prop="specificationModel" show-overflow-tooltip/> <el-table-column label="åä½" prop="unit" width="70" show-overflow-tooltip/> <el-table-column label="å ¥åºæ°é" prop="inboundNum" width="100" show-overflow-tooltip/> <el-table-column label="åä»·(å )" prop="unitPrice" width="150"></el-table-column> <el-table-column label="æ»ä»·(å )" prop="totalPrice" width="150"></el-table-column> <!-- <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, 'production');">ç¼è¾</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 ml10">å ¥åºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery"/> <span class="search_title ml10">产å大类ï¼</span> <el-input v-model="searchForm.productCategory" style="width: 240px" placeholder="请è¾å ¥" clearable/> <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="purchaseContractNumber" width="180" show-overflow-tooltip/> <el-table-column label="ä¾åºååç§°" prop="supplierName" width="240" show-overflow-tooltip/> <el-table-column label="产å大类" prop="productCategory" show-overflow-tooltip/> <el-table-column label="è§æ ¼åå·" prop="specificationModel" show-overflow-tooltip/> <el-table-column label="åä½" prop="unit" width="70" show-overflow-tooltip/> <el-table-column label="å ¥åºæ°é" prop="inboundNum" width="100" show-overflow-tooltip/> <el-table-column label="å«ç¨åä»·(å )" prop="taxInclusiveUnitPrice" width="150"></el-table-column> <el-table-column label="å«ç¨æ»ä»·(å )" prop="taxInclusiveTotalPrice" width="150"></el-table-column> <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 :disabled="scope.row.type == 1" type="primary" size="small" @click="openForm('edit', scope.row, 'purchase');">ç¼è¾ </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="product"> <div class="search_form"> <div> <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"/> <span class="search_title ml10">产å大类ï¼</span> <el-input v-model="searchForm.productCategory" style="width: 240px" placeholder="请è¾å ¥" clearable/> <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="productCategory" show-overflow-tooltip/> <el-table-column label="è§æ ¼åå·" prop="specificationModel" show-overflow-tooltip/> <el-table-column label="åä½" prop="unit" width="220" show-overflow-tooltip/> <el-table-column label="å ¥åºæ°é" prop="inboundNum" width="220" show-overflow-tooltip/> <el-table-column label="å ¥åºäºº" prop="createBy" width="220" 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="pageProductChange"/> </div> </el-tab-pane> </el-tabs> <form-dia ref="formDia" @close="handleQuery" @success="handleQuery"></form-dia> <form-dia-product ref="formDiaProduct" @close="handleQuery" @success="handleQuery"></form-dia-product> <div class="search_form"> <div> <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"/> <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 @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="inboundBatches" width="280" show-overflow-tooltip/> <el-table-column label="å ¥åºæ¶é´" prop="createTime" show-overflow-tooltip/> <el-table-column label="产å大类" prop="productName" 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="stockInNum" show-overflow-tooltip/> <el-table-column label="å ¥åºäºº" prop="createBy" 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="pageProductChange"/> </div> </div> </template> @@ -309,29 +90,16 @@ nextTick, } from "vue"; import {ElMessageBox} from "element-plus"; import useUserStore from "@/store/modules/user"; import dayjs from "dayjs"; import { getStockInPage, getStockInPageByProduction, getStockInPageByProductProduction, delStockIn, } from "@/api/inventoryManagement/stockIn.js"; import FormDia from "./components/formDia.vue"; import FormDiaProduct from "./components/formDiaProduct.vue"; // è·åå½åæ¥æ function getCurrentDate() { return dayjs().format("YYYY-MM-DD"); } getStockInRecordListPage, batchDeleteStockInRecords, } from "@/api/inventoryManagement/stockInRecord.js"; const {proxy} = getCurrentInstance(); const tableData = ref([]); const selectedRows = ref([]); const tableLoading = ref(false); const formDia = ref(); const formDiaProduct = ref(); const activeTab = ref("production"); // å½åæ¿æ´»ç tab const page = reactive({ @@ -342,9 +110,7 @@ const data = reactive({ searchForm: { supplierName: "", customerName: "", productCategory: "", productName: "", timeStr: "", }, }); @@ -365,89 +131,18 @@ page.size = obj.limit; getList(); }; const getList = () => { tableLoading.value = true; 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; } params.productCategory = searchForm.value.productCategory; if (activeTab.value === "product") { getStockInPageByProductProduction(params) .then(res => { tableLoading.value = false; tableData.value = res.data.records; }); }else { // æ ¹æ®ä¸åç tab ç±»åè°ç¨ä¸åçæ¥å£ const apiCall = activeTab.value === "production" ? getStockInPageByProduction(params) : getStockInPage(params); apiCall .then(res => { tableLoading.value = false; tableData.value = res.data.records; // åç«¯è®¡ç®æ»ä»·ï¼æ»ä»· = unitPrice * inboundNum tableData.value = tableData.value.map(item => { // 使ç¨å ¥åºæ°éè®¡ç®æ»ä»· const inboundNum = Number(item.inboundNum) || 0; const unitPrice = Number(item.unitPrice) || 0; const taxInclusiveUnitPrice = Number(item.taxInclusiveUnitPrice) || 0; // æ ¹æ®æ ç¾é¡µç±»å计ç®ä¸åçæ»ä»· if (activeTab.value === "production") { // æååºåï¼æ»ä»· = unitPrice * å ¥åºæ°é item.totalPrice = (unitPrice * inboundNum).toFixed(2); } else { // åæåææåºåï¼å«ç¨æ»ä»· = taxInclusiveUnitPrice * å ¥åºæ°é item.taxInclusiveTotalPrice = ( taxInclusiveUnitPrice * inboundNum ).toFixed(2); } return item; }); total.value = res.data.total; }) .catch(() => { tableLoading.value = false; }); } }; // 忢 tab const handleTabChange = tabName => { page.current = 1; // 忢 tab æ¶æ¸ 空æç´¢æ¡ä»¶ searchForm.value.supplierName = ""; searchForm.value.customerName = ""; searchForm.value.timeStr = ""; searchForm.value.productCategory = ""; getList(); }; // æå¼å¼¹æ¡ const openForm = async (type, row, tabType) => { const currentTab = tabType || activeTab.value; await nextTick(() => { if (currentTab === "production") { formDiaProduct.value?.openDialog(type, row); } else { formDia.value?.openDialog(type, row); } }); params.timeStr = searchForm.value.timeStr; params.productName = searchForm.value.productName; getStockInRecordListPage(params) .then(res => { tableData.value = res.data.records; }).finally(() => { tableLoading.value = false; }) }; // è¡¨æ ¼éæ©æ°æ® @@ -500,20 +195,7 @@ type: "warning", }) .then(() => { // æ ¹æ®å½å tab ç±»åéæ©ä¸åçå 餿¥å£åtypeåæ° let deleteApi, deleteParams; if (activeTab.value === "production") { // æåå é¤ï¼typeä¼ 2 deleteApi = delStockIn; deleteParams = {ids, type: 2}; } else { // åæå é¤ï¼typeä¼ 1 deleteApi = delStockIn; deleteParams = {ids, type: 1}; } deleteApi(deleteParams) batchDeleteStockInRecords(ids) .then(() => { proxy.$modal.msgSuccess("å 餿å"); getList(); src/views/inventoryManagement/stockManagement/New.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,163 @@ <template> <div> <el-dialog v-model="isShow" title="æ°å¢åºå" width="800" @close="closeModal" > <el-form label-width="140px" :model="formState" label-position="top" ref="formRef"> <el-form-item label="产ååç§°" prop="productModelId" :rules="[ { required: true, message: 'è¯·éæ©äº§å', trigger: 'change', } ]" > <el-button type="primary" @click="showProductSelectDialog = true"> {{ formState.productName ? formState.productName : 'éæ©äº§å' }} </el-button> </el-form-item> <el-form-item label="è§æ ¼" prop="productModelName" > <el-input v-model="formState.productModelName" disabled /> </el-form-item> <el-form-item label="åä½" prop="unit" > <el-input v-model="formState.unit" disabled /> </el-form-item> <el-form-item label="æ°é" prop="qualitity" > <el-input-number v-model="formState.qualitity" :step="1" :min="0" style="width: 100%" /> </el-form-item> <el-form-item label="夿³¨" prop="remark"> <el-input v-model="formState.remark" type="textarea" /> </el-form-item> </el-form> <!-- 产åéæ©å¼¹çª --> <ProductSelectDialog v-model="showProductSelectDialog" @confirm="handleProductSelect" single /> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="handleSubmit">确认</el-button> <el-button @click="closeModal">åæ¶</el-button> </div> </template> </el-dialog> </div> </template> <script setup> import {ref, computed, getCurrentInstance} from "vue"; import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue"; import {createStockInventory} from "@/api/inventoryManagement/stockInventory.js"; const props = defineProps({ visible: { type: Boolean, required: true, }, }); const emit = defineEmits(['update:visible', 'completed']); // ååºå¼æ°æ®ï¼æ¿ä»£é项å¼ç dataï¼ const formState = ref({ productId: undefined, productModelId: undefined, productName: "", productModelName: "", unit: "", qualitity: 0, remark: '', }); const isShow = computed({ get() { return props.visible; }, set(val) { emit('update:visible', val); }, }); const showProductSelectDialog = ref(false); let { proxy } = getCurrentInstance() const closeModal = () => { // éç½®è¡¨åæ°æ® formState.value = { productId: undefined, productModelId: undefined, productName: "", productModelName: "", description: '', }; isShow.value = false; }; // 产åéæ©å¤ç const handleProductSelect = async (products) => { if (products && products.length > 0) { const product = products[0]; console.log(product) formState.value.productId = product.productId; formState.value.productName = product.productName; formState.value.productModelName = product.model; formState.value.productModelId = product.id; formState.value.unit = product.unit; showProductSelectDialog.value = false; // 触å表åéªè¯æ´æ° proxy.$refs["formRef"]?.validateField('productModelId'); } }; const handleSubmit = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { // éªè¯æ¯å¦éæ©äºäº§ååè§æ ¼ if (!formState.value.productModelId) { proxy.$modal.msgError("è¯·éæ©äº§å"); return; } if (!formState.value.productModelId) { proxy.$modal.msgError("è¯·éæ©è§æ ¼"); return; } createStockInventory(formState.value).then(res => { // å ³éæ¨¡ææ¡ isShow.value = false; // åç¥ç¶ç»ä»¶å·²å®æ emit('completed'); proxy.$modal.msgSuccess("æäº¤æå"); }) } }) }; defineExpose({ closeModal, handleSubmit, isShow, }); </script> src/views/inventoryManagement/stockManagement/Subtract.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,180 @@ <template> <div> <el-dialog v-model="isShow" title="é¢ç¨" width="800" @close="closeModal" > <el-form label-width="140px" :model="formState" label-position="top" ref="formRef"> <el-form-item label="产ååç§°" prop="productModelId" :rules="[ { required: true, message: 'è¯·éæ©äº§å', trigger: 'change', } ]" > <el-button type="primary" @click="showProductSelectDialog = true" disabled> {{ formState.productName ? formState.productName : 'éæ©äº§å' }} </el-button> </el-form-item> <el-form-item label="è§æ ¼" prop="productModelName" > <el-input v-model="formState.model" disabled /> </el-form-item> <el-form-item label="åä½" prop="unit" > <el-input v-model="formState.unit" disabled /> </el-form-item> <el-form-item label="æ°é" prop="qualitity" > <el-input-number v-model="formState.qualitity" :step="1" :min="0" style="width: 100%" /> </el-form-item> <el-form-item label="夿³¨" prop="remark"> <el-input v-model="formState.remark" type="textarea" /> </el-form-item> </el-form> <!-- 产åéæ©å¼¹çª --> <ProductSelectDialog v-model="showProductSelectDialog" @confirm="handleProductSelect" single /> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="handleSubmit">确认</el-button> <el-button @click="closeModal">åæ¶</el-button> </div> </template> </el-dialog> </div> </template> <script setup> import {ref, computed, getCurrentInstance} from "vue"; import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue"; import {subtractStockInventory} from "@/api/inventoryManagement/stockInventory.js"; const props = defineProps({ visible: { type: Boolean, required: true, }, record: { type: Object, default: () => {}, } }); const emit = defineEmits(['update:visible', 'completed']); onMounted(() => { initFormData() }) const initFormData = () => { if (props.record) { formState.value = { ...formState.value, ...props.record, } } } // ååºå¼æ°æ®ï¼æ¿ä»£é项å¼ç dataï¼ const formState = ref({ productId: undefined, productModelId: undefined, productName: "", model: "", unit: "", qualitity: 0, remark: '', }); const isShow = computed({ get() { return props.visible; }, set(val) { emit('update:visible', val); }, }); const showProductSelectDialog = ref(false); let { proxy } = getCurrentInstance() const closeModal = () => { // éç½®è¡¨åæ°æ® formState.value = { productId: undefined, productModelId: undefined, productName: "", productModelName: "", description: '', }; isShow.value = false; }; // 产åéæ©å¤ç const handleProductSelect = async (products) => { if (products && products.length > 0) { const product = products[0]; console.log(product) formState.value.productId = product.productId; formState.value.productName = product.productName; formState.value.productModelName = product.model; formState.value.productModelId = product.id; formState.value.unit = product.unit; showProductSelectDialog.value = false; // 触å表åéªè¯æ´æ° proxy.$refs["formRef"]?.validateField('productModelId'); } }; const handleSubmit = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { // éªè¯æ¯å¦éæ©äºäº§ååè§æ ¼ if (!formState.value.productModelId) { proxy.$modal.msgError("è¯·éæ©äº§å"); return; } if (!formState.value.productModelId) { proxy.$modal.msgError("è¯·éæ©è§æ ¼"); return; } subtractStockInventory(formState.value).then(res => { // å ³éæ¨¡ææ¡ isShow.value = false; // åç¥ç¶ç»ä»¶å·²å®æ emit('completed'); proxy.$modal.msgSuccess("æäº¤æå"); }) } }) }; defineExpose({ closeModal, handleSubmit, isShow, }); </script> src/views/inventoryManagement/stockManagement/index.vue
@@ -2,150 +2,48 @@ <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" /> <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="openForm('add')">æ°å¢</el-button> --> <el-button type="primary" @click="isShowNewModal = true">æ°å¢åºå</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)"> :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="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 label="å ¥åºæ¥æ" prop="createTime" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productName" 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="warnNum" 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="openForm('edit', scope.row);">ç¼è¾</el-button> <el-button link type="primary" size="small" @click="showSubtractModal(scope.row)" :disabled="scope.row.qualitity > 0">é¢ç¨</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-row :gutter="30"> <el-col :span="12"> <el-form-item label="ä¾åºååç§°ï¼" prop="supplierName"> <el-input disabled v-model="form.supplierName" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="产å大类ï¼" prop="productId"> <el-select disabled v-model="form.productCategory" placeholder="è¯·éæ©" clearable filterable> <el-option v-for="item in productList" :key="item.id" :label="item.productName" :value="item.productName" /> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="è§æ ¼åå·ï¼" prop="productManageId"> <el-select disabled v-model="form.specificationModel" placeholder="请å éæ©äº§å大类" clearable filterable :disabled="!form.productCategory"> <el-option v-for="item in productModelList" :key="item.id" :label="item.model" :value="item.id" /> </el-select> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="åä½ï¼" prop="customerId"> <el-input disabled v-model="form.unit" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="åºåæ¶é´ï¼" prop="projectName"> <el-date-picker style="width: 100%" v-model="form.updateTime" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="å ¥åºæ¶é´ï¼" prop="projectName"> <el-date-picker style="width: 100%" v-model="form.createTime" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <new-stock-inventory v-if="isShowNewModal" v-model:visible="isShowNewModal" @completed="handleQuery" /> <el-col :span="12"> <el-form-item label="å«ç¨åä»·ï¼" prop="customerId"> <el-input disabled v-model="form.taxInclusiveUnitPrice" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="å«ç¨æ»ä»·ï¼" prop="customerContractNo"> <el-input disabled v-model="form.taxInclusiveTotalPrice" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="ç¨çï¼" prop="customerId"> <el-input disabled v-model="form.taxRate" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ä¸å«ç¨æ»ä»·ï¼" prop="entryDate"> <el-input disabled v-model="form.taxExclusiveTotalPrice" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="åºåºäººï¼" prop="entryPerson"> <el-select v-model="form.createUser" placeholder="è¯·éæ©" clearable> <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" /> </el-select> </el-form-item> </el-col> <!-- <el-col :span="12">--> <!-- <el-form-item label="åºåé¢è¦æ°éï¼" prop="warnNum">--> <!-- <el-input v-model="form.warnNum" placeholder="请è¾å ¥æä½åºå" clearable />--> <!-- </el-form-item>--> <!-- </el-col>--> </el-row> </el-form> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="submitForm">确认</el-button> <el-button @click="closeDia">åæ¶</el-button> </div> </template> </el-dialog> <subtract-stock-inventory v-if="isShowSubtractModal" v-model:visible="isShowSubtractModal" :record="record" @completed="handleQuery" /> </div> </template> @@ -153,84 +51,30 @@ import pagination from '@/components/PIMTable/Pagination.vue' import { ref, reactive, toRefs, onMounted, getCurrentInstance } from 'vue' import { ElMessageBox } from "element-plus"; import useUserStore from '@/store/modules/user' import { userListNoPageByTenantId } from "@/api/system/user.js"; import { productTreeList,modelList } from "@/api/basicData/product.js" import { getCurrentDate } from "@/utils/index.js"; import { getStockManagePage, delStockManage, } from "@/api/inventoryManagement/stockManage.js"; import { updateManagement,updateStockIn } from "@/api/inventoryManagement/stockIn.js"; 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 userStore = useUserStore() const { proxy } = getCurrentInstance() const tableData = ref([]) const productData = ref([]) const selectedRows = ref([]) const userList = ref([]) const productList = ref([]) const productModelList = ref([]) // const customerOption = ref([]) const record = ref({}) const tableLoading = ref(false) const page = reactive({ current: 1, size: 100, }) const total = ref(0) const fileList = ref([]) const loading = ref(false); // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref('') const dialogFormVisible = ref(false) // æ¯å¦æ¾ç¤ºæ°å¢å¼¹æ¡ const isShowNewModal = ref(false) // æ¯å¦æ¾ç¤ºé¢ç¨å¼¹æ¡ const isShowSubtractModal = ref(false) const data = reactive({ searchForm: { supplierName: '', timeStr: '', }, form: { supplierId: null, supplierName: '', productId: null, productName: '', userId: userStore.userId, nickName: '', productModelId: null, model: '', unit: '', productrecordId: null, taxInclusiveUnitPrice: '', taxInclusiveTotalPrice: '', taxRate: '', taxExclusiveTotalPrice: '', inboundTime: '', inboundBatch: '', stockQuantity: '', boundTime: '', warnNum: '', // æ°å¢æä½åºååæ®µ salesLedgerProductId: null, }, rules: { supplierName: [{ required: true, message: '请è¾å ¥ä¾åºååç§°', trigger: 'blur' }], productCategory: [{ required: true, message: 'è¯·éæ©äº§å大类', trigger: 'change' }], specificationModel: [{ required: true, message: '请è¾å ¥è§æ ¼åå·', trigger: 'blur' }], unit: [{ required: true, message: '请è¾å ¥åä½', trigger: 'blur' }], stockQuantity: [{ required: true, message: '请è¾å ¥åºåºæ°é', trigger: 'blur' }], taxInclusiveUnitPrice: [{ required: true, message: '请è¾å ¥å«ç¨åä»·', trigger: 'blur' }], taxInclusiveTotalPrice: [{ required: true, message: '请è¾å ¥å«ç¨æ»ä»·', trigger: 'blur' }], taxRate: [{ required: true, message: '请è¾å ¥ç¨ç', trigger: 'blur' }], taxExclusiveTotalPrice: [{ required: true, message: '请è¾å ¥ä¸å«ç¨æ»ä»·', trigger: 'blur' }], boundTime: [{ required: true, message: 'è¯·éæ©åºåæ¶é´', trigger: 'change' }], inboundTime: [{ required: true, message: 'è¯·éæ©å ¥åºæ¶é´', trigger: 'change' }], inboundPerson: [{ required: true, message: 'è¯·éæ©åºåºäºº', trigger: 'change' }], warnNum: [{ required: true, message: '请è¾å ¥æä½åºå', trigger: 'blur' }], } }) const { searchForm, form, rules } = toRefs(data) const { searchForm } = toRefs(data) // æ¥è¯¢å表 /** æç´¢æé®æä½ */ @@ -245,7 +89,7 @@ } const getList = () => { tableLoading.value = true getStockManagePage({ ...searchForm.value, ...page }).then(res => { getStockInventoryListPage({ ...searchForm.value, ...page }).then(res => { tableLoading.value = false tableData.value = res.data.records total.value = res.data.total @@ -256,19 +100,19 @@ }) } // ç¹å»é¢ç¨ const showSubtractModal = (row) => { record.value = row isShowSubtractModal.value = true } // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { // è¿æ»¤æåæ°æ® selectedRows.value = selection.filter(item => item.id); console.log('selection', selectedRows.value) } const expandedRowKeys = ref([]) // 主表åè®¡æ¹æ³ const summarizeMainTable = (param) => { return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']); }; // è¡¨æ ¼è¡ç±»å const tableRowClassName = ({ row }) => { @@ -279,74 +123,6 @@ } return stock < warn ? 'row-low-stock' : ''; }; // æå¼å¼¹æ¡ const openForm = async (type, row) => { operationType.value = type form.value = {} productData.value = [] let userLists = await userListNoPageByTenantId() userList.value = userLists.data if (type === 'edit') { form.value = { ...row } productTreeList().then(res =>{ productList.value = res productList.value.forEach(i =>{ if (i.label === row.productCategory) { modelList({ id: i.id }).then((res) => { productModelList.value = res; }); } }) }) } form.value.entryDate = getCurrentDate() // 设置é»è®¤å½å ¥æ¥æä¸ºå½åæ¥æ dialogFormVisible.value = true } // æäº¤è¡¨å const submitForm = () => { console.log(form.value) proxy.$refs["formRef"].validate(valid => { if (valid) { updateManagement(form.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeDia() getList() // æäº¤åæ£æ¥åºåå¹¶å°è¯å建请è´å // checkStockAndCreatePurchase(); }) } }) } // æ£æ¥åºåå¹¶å建请è´å // const checkStockAndCreatePurchase = async () => { // const stockList = tableData.value; // // handList() // for (const item of stockList) { // if (item.inboundNum0 < item.warnNum) { // try { // const stockInData = { // id: item.id, // quantityStock: item.warnNum + item.totalInboundNum,// ä½¿ç¨æ°æ ¼å¼å彿° // }; // loading.value = true // await updateStockIn(stockInData) // proxy.$modal.msgSuccess(`产å ${item.productCategory} ä¿®æ¹å ¥åºæå`) // loading.value = false // } catch (error) { // proxy.$modal.msgError(`产å ${item.productCategory} çæè¯·è´å失败ï¼è¯·æå¨å¤ç`); // // } // } // } // }; // å ³éå¼¹æ¡ const closeDia = () => { proxy.resetForm("formRef") dialogFormVisible.value = false } // å¯¼åº const handleOut = () => { @@ -363,47 +139,9 @@ 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(() => { delStockManage({ids:ids}).then(res => { proxy.$modal.msgSuccess("å 餿å") getList() }) }).catch(() => { proxy.$modal.msg("已忶") }) } onMounted(() => { getList() // checkStockAndCreatePurchase(); // æ¯å°æ¶æ£æ¥ä¸æ¬¡åºå // const intervalId = setInterval(checkStockAndCreatePurchase, 60 * 60 * 1000); // onUnmounted(() => { // // ç»ä»¶å¸è½½æ¶æ¸ é¤å®æ¶å¨ // clearInterval(intervalId); // }); }) </script>