| src/views/financialManagement/payable/purchaseIn.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/financialManagement/receivable/salesOut.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/dispatchLog/Record.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/receiptManagement/Record.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/stockManagement/Record.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/procurementManagement/procurementPlan/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/productionManagement/productionTraceability/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/productionManagement/workOrder/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/productionManagement/workOrderManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/productionPlan/productionPlan/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/qualityManagement/nearExpiryReturn/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/views/financialManagement/payable/purchaseIn.vue
@@ -98,7 +98,7 @@ slot: "inboundDate", }, { label: "产品名称", prop: "productName", minWidth: "140" }, { label: "产品规格", prop: "specificationModel", minWidth: "140" }, { label: "规格型号", prop: "specificationModel", minWidth: "140" }, { label: "金额", prop: "inboundAmount", src/views/financialManagement/receivable/salesOut.vue
@@ -1,27 +1,33 @@ <template> <!-- 销售出库 --> <div class="app-container"> <el-form :model="filters" :inline="true"> <el-form :model="filters" :inline="true"> <el-form-item label="出库单号:"> <el-input v-model="filters.outboundBatches" placeholder="请输入出库单号" clearable style="width: 200px;" /> <el-input v-model="filters.outboundBatches" placeholder="请输入出库单号" clearable style="width: 200px;" /> </el-form-item> <el-form-item label="客户名称:"> <el-input v-model="filters.customerName" placeholder="请输入客户名称" clearable style="width: 200px;" /> <el-input v-model="filters.customerName" placeholder="请输入客户名称" clearable style="width: 200px;" /> </el-form-item> <el-form-item label="出库日期:"> <el-date-picker v-model="filters.dateRange" <el-date-picker v-model="filters.dateRange" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" clearable /> clearable /> </el-form-item> <el-form-item> <el-button type="primary" @click="onSearch">搜索</el-button> <el-button type="primary" @click="onSearch">搜索</el-button> <el-button @click="resetFilters">重置</el-button> </el-form-item> </el-form> @@ -29,11 +35,11 @@ <div class="actions"> <div></div> <div> <el-button @click="handleOut" icon="Download">导出</el-button> <el-button @click="handleOut" icon="Download">导出</el-button> </div> </div> <PIMTable rowKey="id" <PIMTable rowKey="id" :column="columns" :tableData="dataList" :tableLoading="tableLoading" @@ -42,8 +48,7 @@ size: pagination.pageSize, total: pagination.total, }" @pagination="changePage" /> @pagination="changePage" /> </div> </div> </template> @@ -76,13 +81,19 @@ { label: "客户名称", prop: "customerName", minWidth: "180" }, { label: "出库日期", prop: "shippingDate", width: "170" }, { label: "产品名称", prop: "productName", minWidth: "140" }, { label: "产品规格", prop: "specificationModel", minWidth: "140" }, { label: "规格型号", prop: "specificationModel", minWidth: "140" }, { label: "金额", prop: "outboundAmount", minWidth: "120", align: "right", formatData: (val) => (val === null || val === undefined || val === "" ? "" : Number(val).toLocaleString("zh-CN", { minimumFractionDigits: 2, maximumFractionDigits: 2 })), formatData: val => val === null || val === undefined || val === "" ? "" : Number(val).toLocaleString("zh-CN", { minimumFractionDigits: 2, maximumFractionDigits: 2, }), }, { label: "发货编号", prop: "shippingNo", minWidth: "140" }, { label: "销售订单号", prop: "salesContractNo", minWidth: "150" }, @@ -115,7 +126,7 @@ current: pagination.currentPage, size: pagination.pageSize, }) .then((res) => { .then(res => { const ok = res.code === 200 || res.code === 0; if (ok && res.data) { pagination.total = res.data.total ?? 0; src/views/inventoryManagement/dispatchLog/Record.vue
@@ -1,14 +1,14 @@ <template> <div> <div class="search_form" style="margin-bottom: 10px"> <el-form ref="searchFormRef" <div class="search_form" style="margin-bottom: 10px"> <el-form ref="searchFormRef" :model="searchForm" class="demo-form-inline" > class="demo-form-inline"> <el-row :gutter="20"> <el-col :span="4"> <el-form-item label="出库日期" prop="timeStr"> <el-form-item label="出库日期" prop="timeStr"> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="请选择日期" @@ -18,16 +18,17 @@ </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="产品大类" prop="productName"> <el-form-item label="产品大类" prop="productName"> <el-input v-model="searchForm.productName" style="width: 240px" placeholder="请输入" clearable/> </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="产品规格" prop="model"> <el-form-item label="规格型号" prop="model"> <el-input v-model="searchForm.model" style="width: 240px" placeholder="请输入" @@ -35,7 +36,8 @@ </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="批号" prop="batchNo"> <el-form-item label="批号" prop="batchNo"> <el-input v-model="searchForm.batchNo" style="width: 240px" placeholder="请输入" @@ -43,29 +45,26 @@ </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="来源" prop="recordType"> <el-select v-model="searchForm.recordType" <el-form-item label="来源" prop="recordType"> <el-select v-model="searchForm.recordType" style="width: 240px" placeholder="请选择" clearable > <el-option v-for="item in stockRecordTypeOptions" clearable> <el-option v-for="item in stockRecordTypeOptions" :key="item.value" :label="item.label" :value="item.value" /> :value="item.value" /> </el-select> </el-form-item> </el-col> <!-- 按钮 --> <el-col :span="4"> <el-form-item> <el-button type="primary" @click="getList"> <el-button type="primary" @click="getList"> 搜索 </el-button> <el-button @click="resetSearch"> 重置 </el-button> @@ -75,77 +74,81 @@ </el-form> </div> <div class="actions"> <el-button type="primary" @click="handleBatchApprove">审批</el-button> <el-button type="primary" @click="handleBatchApprove">审批</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> <el-button type="danger" plain @click="handleDelete">删除</el-button> <el-button type="primary" plain @click="handlePrint">打印</el-button> </div> <div class="table_list"> <el-table :data="tableData" <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" :expand-row-keys="expandedRowKeys" :row-key="(row) => row.id" style="width: 100%" 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="出库批次" 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="outboundBatches" min-width="100" show-overflow-tooltip /> <el-table-column label="出库日期" show-overflow-tooltip /> <el-table-column label="出库日期" prop="createTime" show-overflow-tooltip /> <el-table-column label="产品大类" 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="batchNo" show-overflow-tooltip /> <el-table-column label="单位" prop="unit" show-overflow-tooltip /> <el-table-column label="出库数量" show-overflow-tooltip /> <el-table-column label="规格型号" prop="model" show-overflow-tooltip /> <el-table-column label="批号" prop="batchNo" show-overflow-tooltip /> <el-table-column label="单位" prop="unit" show-overflow-tooltip /> <el-table-column label="出库数量" prop="stockOutNum" show-overflow-tooltip /> <el-table-column label="出库人" prop="createBy" show-overflow-tooltip /> <el-table-column label="来源" prop="recordType" show-overflow-tooltip> show-overflow-tooltip /> <el-table-column label="出库人" prop="createBy" show-overflow-tooltip /> <el-table-column label="来源" prop="recordType" show-overflow-tooltip> <template #default="scope"> {{ getRecordType(scope.row.recordType) }} </template> </el-table-column> <el-table-column label="审批状态" <el-table-column label="审批状态" prop="approvalStatus" show-overflow-tooltip > show-overflow-tooltip> <template #default="scope"> <el-tag :type="getApprovalStatusTagType(scope.row.approvalStatus)" size="small" > <el-tag :type="getApprovalStatusTagType(scope.row.approvalStatus)" size="small"> {{ getApprovalStatusLabel(scope.row.approvalStatus) }} </el-tag> </template> </el-table-column> </el-table> <pagination v-show="total > 0" <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="paginationChange" /> @pagination="paginationChange" /> </div> </div> </template> @@ -211,9 +214,9 @@ searchFormRef.value?.resetFields(); page.current = 1; getList(); } }; const paginationChange = (obj) => { const paginationChange = obj => { page.current = obj.page; page.size = obj.limit; getList(); @@ -225,10 +228,10 @@ ...page, topParentProductId: props.topParentProductId, }) .then((res) => { .then(res => { tableLoading.value = false; tableData.value = res.data.records; tableData.value.map((item) => { tableData.value.map(item => { item.children = []; }); total.value = res.data.total; @@ -238,9 +241,9 @@ }); }; const getRecordType = (recordType) => { const getRecordType = recordType => { return ( stockRecordTypeOptions.value.find((item) => item.value === recordType) stockRecordTypeOptions.value.find(item => item.value === recordType) ?.label || "" ); }; @@ -258,7 +261,7 @@ REJECTED: "驳回", }; const getApprovalStatusLabel = (status) => { const getApprovalStatusLabel = status => { if (status === null || status === undefined || status === "") { return "待审批"; } @@ -266,7 +269,7 @@ }; // 通过/驳回固定色;其余(含待审批、空值、未映射但文案为待审批)统一用 warning 预警色 const getApprovalStatusTagType = (status) => { const getApprovalStatusTagType = status => { if ( status === 1 || status === "1" || @@ -287,20 +290,20 @@ // 获取来源类型选项 const fetchStockRecordTypeOptions = () => { if (props.type === "0") { findAllQualifiedStockOutRecordTypeOptions().then((res) => { findAllQualifiedStockOutRecordTypeOptions().then(res => { stockRecordTypeOptions.value = res.data; }); return; } findAllUnQualifiedStockOutRecordTypeOptions().then((res) => { findAllUnQualifiedStockOutRecordTypeOptions().then(res => { stockRecordTypeOptions.value = res.data; }); }; // 表格选择数据 const handleSelectionChange = (selection) => { const handleSelectionChange = selection => { // 过滤掉子数据 selectedRows.value = selection.filter((item) => item.id); selectedRows.value = selection.filter(item => item.id); console.log("selection", selectedRows.value); }; const expandedRowKeys = ref([]); @@ -310,7 +313,7 @@ proxy.$modal.msgWarning("请选择数据"); return; } const ids = selectedRows.value.map((item) => item.id); const ids = selectedRows.value.map(item => item.id); ElMessageBox.confirm("请选择审批结果", "审批", { confirmButtonText: "通过", cancelButtonText: "驳回", @@ -327,7 +330,7 @@ proxy.$modal.msgError("审批通过失败"); }); }) .catch((action) => { .catch(action => { if (action === "cancel") { batchApproveStockOutRecords({ ids, approvalStatus: 2 }) .then(() => { @@ -366,7 +369,7 @@ const handleDelete = () => { let ids = []; if (selectedRows.value.length > 0) { ids = selectedRows.value.map((item) => item.id); ids = selectedRows.value.map(item => item.id); } else { proxy.$modal.msgWarning("请选择数据"); return; @@ -377,7 +380,7 @@ type: "warning", }) .then(() => { delPendingStockOut(ids).then((res) => { delPendingStockOut(ids).then(res => { proxy.$modal.msgSuccess("删除成功"); getList(); }); @@ -656,7 +659,7 @@ }; // 格式化日期 const formatDate = (dateString) => { const formatDate = dateString => { if (!dateString) return getCurrentDate(); const date = new Date(dateString); const year = date.getFullYear(); @@ -666,7 +669,7 @@ }; // 格式化日期时间 const formatDateTime = (date) => { const formatDateTime = date => { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, "0"); const day = String(date.getDate()).padStart(2, "0"); src/views/inventoryManagement/receiptManagement/Record.vue
@@ -1,14 +1,14 @@ <template> <div> <div class="search_form" style="margin-bottom: 10px;"> <el-form ref="searchFormRef" <div class="search_form" style="margin-bottom: 10px;"> <el-form ref="searchFormRef" :model="searchForm" class="demo-form-inline" > class="demo-form-inline"> <el-row :gutter="20"> <el-col :span="4"> <el-form-item label="入库日期" prop="timeStr"> <el-form-item label="入库日期" prop="timeStr"> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="请选择日期" @@ -18,16 +18,17 @@ </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="产品大类" prop="productName"> <el-form-item label="产品大类" prop="productName"> <el-input v-model="searchForm.productName" style="width: 240px" placeholder="请输入" clearable/> </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="产品规格" prop="model"> <el-form-item label="规格型号" prop="model"> <el-input v-model="searchForm.model" style="width: 240px" placeholder="请输入" @@ -35,7 +36,8 @@ </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="批号" prop="batchNo"> <el-form-item label="批号" prop="batchNo"> <el-input v-model="searchForm.batchNo" style="width: 240px" placeholder="请输入" @@ -43,7 +45,8 @@ </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="来源" prop="recordType"> <el-form-item label="来源" prop="recordType"> <el-select v-model="searchForm.recordType" style="width: 240px" placeholder="请选择" @@ -58,10 +61,10 @@ <!-- 按钮 --> <el-col :span="4"> <el-form-item> <el-button type="primary" @click="getList"> <el-button type="primary" @click="getList"> 搜索 </el-button> <el-button @click="resetSearch"> 重置 </el-button> @@ -132,8 +135,7 @@ {{ getRecordType(scope.row.recordType) }} </template> </el-table-column> <el-table-column v-if="showSourceOrderNoColumn" <el-table-column v-if="showSourceOrderNoColumn" label="源单号" width="150" prop="sourceOrderNo" @@ -146,7 +148,8 @@ prop="approvalStatus" show-overflow-tooltip> <template #default="scope"> <el-tag :type="getApprovalStatusTagType(scope.row.approvalStatus)" size="small"> <el-tag :type="getApprovalStatusTagType(scope.row.approvalStatus)" size="small"> {{ getApprovalStatusLabel(scope.row.approvalStatus) }} </el-tag> </template> @@ -190,13 +193,13 @@ type: { type: String, required: true, default: '0' default: "0", }, topParentProductId: { type: [String, Number], default: undefined } }) default: undefined, }, }); const tableData = ref([]); const selectedRows = ref([]); @@ -225,11 +228,14 @@ searchFormRef.value?.resetFields(); page.current = 1; getList(); } }; const getRecordType = (recordType) => { return stockRecordTypeOptions.value.find(item => item.value === recordType)?.label || '' } const getRecordType = recordType => { return ( stockRecordTypeOptions.value.find(item => item.value === recordType) ?.label || "" ); }; const approvalStatusLabelMap = { 0: "待审批", @@ -244,7 +250,7 @@ }; approvalStatusLabelMap[3] = "待确认"; const getApprovalStatusLabel = (status) => { const getApprovalStatusLabel = status => { if (status === null || status === undefined || status === "") { return "待审批"; } @@ -252,32 +258,64 @@ }; // 通过/驳回固定色;其余(含待审批、空值、未映射但文案为待审批)统一用 warning 预警色 const getApprovalStatusTagType = (status) => { if (status === 1 || status === "1" || status === "approved" || status === "APPROVED") return "success"; if (status === 2 || status === "2" || status === "rejected" || status === "REJECTED") return "danger"; const getApprovalStatusTagType = status => { if ( status === 1 || status === "1" || status === "approved" || status === "APPROVED" ) return "success"; if ( status === 2 || status === "2" || status === "rejected" || status === "REJECTED" ) return "danger"; return "warning"; }; const isPendingApproval = status => { return status === 0 || status === "0" || status === "pending" || status === "PENDING" || status === null || status === undefined || status === ""; return ( status === 0 || status === "0" || status === "pending" || status === "PENDING" || status === null || status === undefined || status === "" ); }; const isRejectedApproval = status => { return status === 2 || status === "2" || status === "rejected" || status === "REJECTED"; return ( status === 2 || status === "2" || status === "rejected" || status === "REJECTED" ); }; const isRowSelectable = row => { return isPendingApproval(row?.approvalStatus) || isRejectedApproval(row?.approvalStatus); return ( isPendingApproval(row?.approvalStatus) || isRejectedApproval(row?.approvalStatus) ); }; const canBatchApprove = computed(() => { return selectedRows.value.length > 0 && selectedRows.value.every(row => isPendingApproval(row.approvalStatus)); return ( selectedRows.value.length > 0 && selectedRows.value.every(row => isPendingApproval(row.approvalStatus)) ); }); const canReverseApprove = computed(() => { return selectedRows.value.length > 0 && selectedRows.value.every(row => isRejectedApproval(row.approvalStatus)); return ( selectedRows.value.length > 0 && selectedRows.value.every(row => isRejectedApproval(row.approvalStatus)) ); }); const canDelete = computed(() => canBatchApprove.value); @@ -286,7 +324,7 @@ return topParentProductId === 276 || topParentProductId === 278; }); const formatSourceOrderNo = (value) => { const formatSourceOrderNo = value => { const text = String(value ?? "").trim(); return text || "--"; }; @@ -299,33 +337,44 @@ const getList = () => { tableLoading.value = true; getStockInRecordListPage(Object.assign({}, {...searchForm.value, ...page, topParentProductId: props.topParentProductId})) getStockInRecordListPage( Object.assign( {}, { ...searchForm.value, ...page, topParentProductId: props.topParentProductId, } ) ) .then(res => { tableData.value = res.data.records; total.value = res.data.total || 0; }).finally(() => { tableLoading.value = false; }) .finally(() => { tableLoading.value = false; }); }; // 获取来源类型选项 const fetchStockRecordTypeOptions = () => { if (props.type === '0') { findAllQualifiedStockInRecordTypeOptions() .then(res => { if (props.type === "0") { findAllQualifiedStockInRecordTypeOptions().then(res => { stockRecordTypeOptions.value = res.data; }) return }); return; } // findAllUnQualifiedStockInRecordTypeOptions() // .then(res => { // stockRecordTypeOptions.value = res.data; // }) } }; // 表格选择数据 const handleSelectionChange = selection => { selectedRows.value = selection.filter(item => item.id && isRowSelectable(item)); selectedRows.value = selection.filter( item => item.id && isRowSelectable(item) ); }; const expandedRowKeys = ref([]); @@ -378,7 +427,7 @@ proxy.$modal.msgError("审批通过失败"); }); }) .catch((action) => { .catch(action => { if (action === "cancel") { batchApproveStockInRecords({ids, approvalStatus: 2}) .then(() => { @@ -403,7 +452,11 @@ }) .then(() => { // 根据不同的 tab 类型调用不同的导出接口 proxy.download("/stockInRecord/exportStockInRecord", {type: props.type}, props.type === '0' ? "合格入库.xlsx" : "不合格入库.xlsx"); proxy.download( "/stockInRecord/exportStockInRecord", { type: props.type }, props.type === "0" ? "合格入库.xlsx" : "不合格入库.xlsx" ); }) .catch(() => { proxy.$modal.msg("已取消"); src/views/inventoryManagement/stockManagement/Record.vue
@@ -1,23 +1,22 @@ <template> <div> <div class="search_form mb10"> <el-form ref="searchFormRef" <el-form ref="searchFormRef" :model="searchForm" class="demo-form-inline" > class="demo-form-inline"> <el-row :gutter="20"> <el-col :span="4"> <el-form-item label="产品大类" prop="productName"> <el-form-item label="产品大类" prop="productName"> <el-input v-model="searchForm.productName" style="width: 240px" placeholder="请输入" clearable/> </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="产品规格" prop="model"> <el-form-item label="规格型号" prop="model"> <el-input v-model="searchForm.model" style="width: 240px" placeholder="请输入" @@ -25,7 +24,8 @@ </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="批号" prop="batchNo"> <el-form-item label="批号" prop="batchNo"> <el-input v-model="searchForm.batchNo" style="width: 240px" placeholder="请输入" @@ -35,10 +35,10 @@ <!-- 按钮 --> <el-col :span="4"> <el-form-item> <el-button type="primary" @click="getList"> <el-button type="primary" @click="getList"> 搜索 </el-button> <el-button @click="resetSearch"> 重置 </el-button> @@ -47,23 +47,19 @@ </el-row> </el-form> <div> <el-button type="primary" @click="isShowNewModal = true" >新增库存</el-button > <el-button type="info" <el-button type="primary" @click="isShowNewModal = true">新增库存</el-button> <el-button type="info" plain icon="Upload" @click="isShowImportModal = true" > @click="isShowImportModal = true"> 导入库存 </el-button> <el-button @click="handleOut">导出</el-button> </div> </div> <div class="table_list"> <el-table :data="tableData" <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" @@ -71,112 +67,92 @@ :row-key="(row, index) => index" 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="产品名称" height="calc(100vh - 18.5em)"> <el-table-column align="center" type="selection" width="55" /> <el-table-column align="center" label="序号" type="index" width="60" /> <el-table-column label="产品名称" prop="productName" show-overflow-tooltip /> <el-table-column label="规格型号" prop="model" show-overflow-tooltip /> <el-table-column label="单位" prop="unit" show-overflow-tooltip /> <el-table-column label="批号" prop="batchNo" show-overflow-tooltip /> <el-table-column label="合格库存数量" 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="batchNo" show-overflow-tooltip /> <el-table-column label="合格库存数量" prop="qualifiedQuantity" show-overflow-tooltip /> <el-table-column label="不合格库存数量" show-overflow-tooltip /> <el-table-column label="不合格库存数量" prop="unQualifiedQuantity" show-overflow-tooltip /> <el-table-column label="合格冻结数量" show-overflow-tooltip /> <el-table-column label="合格冻结数量" prop="qualifiedLockedQuantity" show-overflow-tooltip /> <el-table-column label="不合格冻结数量" show-overflow-tooltip /> <el-table-column label="不合格冻结数量" prop="unQualifiedLockedQuantity" show-overflow-tooltip /> <el-table-column label="库存预警数量" show-overflow-tooltip /> <el-table-column label="库存预警数量" prop="warnNum" show-overflow-tooltip /> <el-table-column label="备注" prop="remark" show-overflow-tooltip /> <el-table-column label="最近更新时间" show-overflow-tooltip /> <el-table-column label="备注" prop="remark" show-overflow-tooltip /> <el-table-column label="最近更新时间" prop="updateTime" show-overflow-tooltip /> <el-table-column fixed="right" show-overflow-tooltip /> <el-table-column fixed="right" label="操作" min-width="80" align="center" > align="center"> <template #default="scope"> <el-button link <el-button link type="primary" @click="showDetailModal(scope.row)" >详情</el-button > @click="showDetailModal(scope.row)">详情</el-button> </template> </el-table-column> </el-table> <pagination v-show="total > 0" <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="paginationChange" /> @pagination="paginationChange" /> </div> <batch-no-qty-detail v-if="isShowDetailModal" <batch-no-qty-detail v-if="isShowDetailModal" v-model:visible="isShowDetailModal" :record="record" @subtract="handleDetailSubtract" @frozen="handleDetailFrozen" @thaw="handleDetailThaw" /> <new-stock-inventory v-if="isShowNewModal" @thaw="handleDetailThaw" /> <new-stock-inventory v-if="isShowNewModal" v-model:visible="isShowNewModal" :top-product-parent-id="props.productId" @completed="handleQuery" /> <subtract-stock-inventory v-if="isShowSubtractModal" @completed="handleQuery" /> <subtract-stock-inventory v-if="isShowSubtractModal" v-model:visible="isShowSubtractModal" :record="record" :type="record.stockType" @completed="handleQuery" /> @completed="handleQuery" /> <!-- 导入库存--> <import-stock-inventory v-if="isShowImportModal" <import-stock-inventory v-if="isShowImportModal" v-model:visible="isShowImportModal" type="qualified" @uploadSuccess="handleQuery" /> @uploadSuccess="handleQuery" /> <!-- 冻结/解冻库存--> <frozen-and-thaw-stock-inventory v-if="isShowFrozenAndThawModal" <frozen-and-thaw-stock-inventory v-if="isShowFrozenAndThawModal" v-model:visible="isShowFrozenAndThawModal" :record="record" :operation-type="operationType" :type="record.stockType" @completed="handleQuery" /> @completed="handleQuery" /> </div> </template> @@ -245,7 +221,7 @@ searchFormRef.value?.resetFields(); page.current = 1; getList(); } }; // 查询列表 /** 搜索按钮操作 */ @@ -253,7 +229,7 @@ page.current = 1; getList(); }; const paginationChange = (obj) => { const paginationChange = obj => { page.current = obj.page; page.size = obj.limit; getList(); @@ -261,7 +237,7 @@ const getList = () => { tableLoading.value = true; getStockInventoryListPageCombined({ ...searchForm.value, ...page }) .then((res) => { .then(res => { tableLoading.value = false; tableData.value = res.data.records; total.value = res.data.total; @@ -273,7 +249,7 @@ }); }; const handleFileSuccess = (response) => { const handleFileSuccess = response => { const { code, msg } = response; if (code == 200) { ElMessage({ message: "导入成功", type: "success" }); @@ -285,13 +261,13 @@ }; // 点击领用 const showSubtractModal = (row) => { const showSubtractModal = row => { record.value = row; isShowSubtractModal.value = true; }; // 点击详情 const showDetailModal = (row) => { const showDetailModal = row => { if (!row?.productId || !row?.productModelId) { proxy.$modal.msgError("当前数据缺少产品ID或规格型号ID"); return; @@ -300,39 +276,39 @@ isShowDetailModal.value = true; }; const handleDetailSubtract = (row) => { const handleDetailSubtract = row => { isShowDetailModal.value = false; showSubtractModal(row); }; const handleDetailFrozen = (row) => { const handleDetailFrozen = row => { isShowDetailModal.value = false; showFrozenModal(row); }; const handleDetailThaw = (row) => { const handleDetailThaw = row => { isShowDetailModal.value = false; showThawModal(row); }; // 点击冻结 const showFrozenModal = (row) => { const showFrozenModal = row => { record.value = row; isShowFrozenAndThawModal.value = true; operationType.value = "frozen"; }; // 点击解冻 const showThawModal = (row) => { const showThawModal = row => { record.value = row; isShowFrozenAndThawModal.value = true; operationType.value = "thaw"; }; // 表格选择数据 const handleSelectionChange = (selection) => { const handleSelectionChange = selection => { // 过滤掉子数据 selectedRows.value = selection.filter((item) => item.id); selectedRows.value = selection.filter(item => item.id); console.log("selection", selectedRows.value); }; const expandedRowKeys = ref([]); src/views/procurementManagement/procurementPlan/index.vue
@@ -1,141 +1,183 @@ <template> <div class="app-container"> <!-- 搜索区域 --> <el-card class="search-card" shadow="never"> <el-form :model="searchForm" :inline="true" class="search-form"> <el-card class="search-card" shadow="never"> <el-form :model="searchForm" :inline="true" class="search-form"> <el-form-item label="计划名称"> <el-input v-model="searchForm.planName" placeholder="请输入计划名称" clearable /> <el-input v-model="searchForm.planName" placeholder="请输入计划名称" clearable /> </el-form-item> <el-form-item label="状态"> <el-select v-model="searchForm.status" placeholder="请选择状态" clearable style="width: 150px"> <el-option label="启用" value="active" /> <el-option label="禁用" value="disabled" /> <el-select v-model="searchForm.status" placeholder="请选择状态" clearable style="width: 150px"> <el-option label="启用" value="active" /> <el-option label="禁用" value="disabled" /> </el-select> </el-form-item> <el-form-item> <el-button type="primary" @click="handleSearch"> <el-icon><Search /></el-icon> <el-button type="primary" @click="handleSearch"> <el-icon> <Search /> </el-icon> 搜索 </el-button> <el-button @click="handleReset"> <el-icon><Refresh /></el-icon> <el-icon> <Refresh /> </el-icon> 重置 </el-button> </el-form-item> </el-form> </el-card> <!-- 操作按钮 --> <el-card class="table-card" shadow="never"> <el-card class="table-card" shadow="never"> <div class="table-header"> <div class="table-title">采购计划列表</div> <div class="table-actions"> <el-button type="primary" @click="handleAdd"> <el-icon><Plus /></el-icon> <el-button type="primary" @click="handleAdd"> <el-icon> <Plus /> </el-icon> 新增计划 </el-button> <el-button type="info" @click="handleExport"> <el-icon><Download /></el-icon> <el-button type="info" @click="handleExport"> <el-icon> <Download /> </el-icon> 导出 </el-button> </div> </div> <!-- 数据表格 --> <el-table v-loading="loading" <el-table v-loading="loading" :data="tableData" stripe border style="width: 100%" > <el-table-column prop="planName" label="计划名称" min-width="150" /> <el-table-column prop="description" label="描述" min-width="200" show-overflow-tooltip /> <el-table-column prop="formula" label="计算公式" min-width="200" show-overflow-tooltip> style="width: 100%"> <el-table-column prop="planName" label="计划名称" min-width="150" /> <el-table-column prop="description" label="描述" min-width="200" show-overflow-tooltip /> <el-table-column prop="formula" label="计算公式" min-width="200" show-overflow-tooltip> <template #default="{ row }"> <el-tag type="info" size="small">{{ row.formula }}</el-tag> <el-tag type="info" size="small">{{ row.formula }}</el-tag> </template> </el-table-column> <el-table-column prop="status" label="状态" width="80" align="center"> <el-table-column prop="status" label="状态" width="80" align="center"> <template #default="{ row }"> <el-tag :type="row.status === 'active' ? 'success' : 'info'" size="small"> <el-tag :type="row.status === 'active' ? 'success' : 'info'" size="small"> {{ row.status === 'active' ? '启用' : '禁用' }} </el-tag> </template> </el-table-column> <el-table-column prop="updateTime" label="最后计算时间" width="160" /> <el-table-column label="操作" width="200" fixed="right" align="center"> <el-table-column prop="updateTime" label="最后计算时间" width="160" /> <el-table-column label="操作" width="200" fixed="right" align="center"> <template #default="{ row }"> <el-button type="primary" link @click="handleEdit(row)">编辑</el-button> <el-button type="success" link @click="handleCalculate(row)">计算</el-button> <el-button type="danger" link @click="handleDelete(row)">删除</el-button> <el-button type="primary" link @click="handleEdit(row)">编辑</el-button> <el-button type="success" link @click="handleCalculate(row)">计算</el-button> <el-button type="danger" link @click="handleDelete(row)">删除</el-button> </template> </el-table-column> </el-table> <!-- 分页 --> <div class="pagination-container"> <el-pagination v-model:current-page="pagination.current" <el-pagination v-model:current-page="pagination.current" v-model:page-size="pagination.size" :page-sizes="[10, 20, 50, 100]" :total="total" layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> @current-change="handleCurrentChange" /> </div> </el-card> <!-- 新增/编辑对话框 --> <FormDialog v-model="dialogVisible" <FormDialog v-model="dialogVisible" :title="dialogType === 'add' ? '新增采购计划' : '编辑采购计划'" :width="'1000px'" :operation-type="dialogType" :close-on-click-modal="false" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false" > @cancel="dialogVisible = false"> <div class="form-container"> <!-- 基本信息 --> <div class="form-section"> <div class="section-title">基本信息</div> <el-form ref="formRef" <el-form ref="formRef" :model="formData" :rules="formRules" label-width="120px" > label-width="120px"> <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="编码" prop="code"> <el-input v-model="formData.code" placeholder="系统自动生成" disabled /> <el-form-item label="编码" prop="code"> <el-input v-model="formData.code" placeholder="系统自动生成" disabled /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="名称" prop="planName" required> <el-input v-model="formData.planName" placeholder="请输入计划名称" /> <el-form-item label="名称" prop="planName" required> <el-input v-model="formData.planName" placeholder="请输入计划名称" /> </el-form-item> </el-col> </el-row> <el-form-item label="描述" prop="description"> <el-input v-model="formData.description" <el-form-item label="描述" prop="description"> <el-input v-model="formData.description" type="textarea" :rows="3" placeholder="请输入计划描述" /> placeholder="请输入计划描述" /> </el-form-item> <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="状态" prop="status"> <el-select v-model="formData.status" placeholder="请选择状态" style="width: 100%"> <el-option label="启用" value="active" /> <el-option label="禁用" value="disabled" /> <el-form-item label="状态" prop="status"> <el-select v-model="formData.status" placeholder="请选择状态" style="width: 100%"> <el-option label="启用" value="active" /> <el-option label="禁用" value="disabled" /> </el-select> </el-form-item> </el-col> @@ -147,12 +189,13 @@ </el-row> </el-form> </div> <!-- 计算参数 --> <div class="form-section"> <div class="section-title">计算参数</div> <el-tabs v-model="activeTab" class="param-tabs"> <el-tab-pane label="需求参数" name="demand"> <el-tabs v-model="activeTab" class="param-tabs"> <el-tab-pane label="需求参数" name="demand"> <div class="checkbox-group"> <el-checkbox v-model="formData.considerExistingStock">考虑现有库存</el-checkbox> <el-checkbox v-model="formData.warehouseControl">仓库运行MRP的控制</el-checkbox> @@ -163,7 +206,8 @@ <el-checkbox v-model="formData.negativeStockAsDemand">负库存作为需求</el-checkbox> </div> </el-tab-pane> <el-tab-pane label="计算参数" name="calculation"> <el-tab-pane label="计算参数" name="calculation"> <div class="checkbox-group"> <el-checkbox v-model="formData.considerExistingStock">考虑现有库存</el-checkbox> <el-checkbox v-model="formData.warehouseControl">仓库运行MRP的控制</el-checkbox> @@ -176,7 +220,6 @@ </el-tab-pane> </el-tabs> </div> <!-- 汇总合并选项 --> <div class="form-section"> <div class="section-title">汇总合并选项</div> @@ -186,20 +229,20 @@ <el-checkbox v-model="formData.summaryDemandDate">需求日期</el-checkbox> </div> </div> <!-- 计算公式 --> <div class="form-section"> <div class="section-title">计算公式</div> <div class="formula-input-section"> <el-form-item label="计算公式" prop="formula" required> <el-input v-model="formData.formula" <el-form-item label="计算公式" prop="formula" required> <el-input v-model="formData.formula" placeholder="例如: 预计出库数量 - 现有库存 + 安全库存 - 预计入库数量" @input="validateFormula" /> @input="validateFormula" /> </el-form-item> <div class="formula-help"> <el-text type="info" size="small"> <el-text type="info" size="small"> 支持变量:预计出库数量、现有库存、安全库存、预计入库数量 </el-text> </div> @@ -207,87 +250,117 @@ </div> </div> </FormDialog> <!-- 产品选择对话框 --> <FormDialog v-model="productSelectDialogVisible" <FormDialog v-model="productSelectDialogVisible" title="选择产品" :width="'800px'" :close-on-click-modal="false" @close="productSelectDialogVisible = false" @confirm="handleConfirmProductSelection" @cancel="productSelectDialogVisible = false" > @cancel="productSelectDialogVisible = false"> <div class="product-select"> <el-alert title="请选择要计算的产品" <el-alert title="请选择要计算的产品" type="info" :closable="false" show-icon > show-icon> <template #default> <p>选择产品后,系统将根据当前计算公式和产品库存情况进行计算。</p> </template> </el-alert> <el-table v-loading="productLoading" <el-table v-loading="productLoading" :data="productList" @selection-change="handleProductSelectionChange" stripe border style="width: 100%; margin-top: 20px;" > <el-table-column type="selection" width="55" /> <el-table-column prop="productCategory" label="产品大类" min-width="150" /> <el-table-column prop="specificationModel" label="产品规格" width="120" /> <el-table-column prop="inboundNum0" label="现有库存" width="100" align="right" /> <el-table-column prop="inboundNum" label="安全库存" width="100" align="right" /> <el-table-column prop="inboundNum" label="预计出库" width="100" align="right" /> <el-table-column prop="inboundNum0" label="预计入库" width="100" align="right" /> style="width: 100%; margin-top: 20px;"> <el-table-column type="selection" width="55" /> <el-table-column prop="productCategory" label="产品大类" min-width="150" /> <el-table-column prop="specificationModel" label="规格型号" width="120" /> <el-table-column prop="inboundNum0" label="现有库存" width="100" align="right" /> <el-table-column prop="inboundNum" label="安全库存" width="100" align="right" /> <el-table-column prop="inboundNum" label="预计出库" width="100" align="right" /> <el-table-column prop="inboundNum0" label="预计入库" width="100" align="right" /> </el-table> </div> </FormDialog> <!-- 计算结果对话框 --> <FormDialog v-model="calculateDialogVisible" <FormDialog v-model="calculateDialogVisible" title="采购计算结果" :width="'1000px'" :close-on-click-modal="false" @close="calculateDialogVisible = false" @confirm="handleCreatePurchaseOrder" @cancel="calculateDialogVisible = false" > @cancel="calculateDialogVisible = false"> <div class="calculate-result"> <el-alert title="计算结果" <el-alert title="计算结果" type="success" :closable="false" show-icon > show-icon> <template #default> <p>基于当前配置的计算公式和库存情况,系统已计算出各产品的采购需求。</p> </template> </el-alert> <el-table :data="calculateResult" stripe border style="width: 100%; margin-top: 20px;"> <el-table-column prop="productCategory" label="产品大类" min-width="150" /> <el-table-column prop="specificationModel" label="产品规格" width="120" /> <el-table-column prop="inboundNum0" label="现有库存" width="100" align="right" /> <el-table-column prop="inboundNum" label="安全库存" width="100" align="right" /> <el-table-column prop="inboundNum" label="预计出库数量" width="120" align="right" /> <el-table-column prop="inboundNum0" label="预计入库数量" width="120" align="right" /> <el-table-column prop="weeklyNetDemand" label="按周净需求" width="120" align="right"> <el-table :data="calculateResult" stripe border style="width: 100%; margin-top: 20px;"> <el-table-column prop="productCategory" label="产品大类" min-width="150" /> <el-table-column prop="specificationModel" label="规格型号" width="120" /> <el-table-column prop="inboundNum0" label="现有库存" width="100" align="right" /> <el-table-column prop="inboundNum" label="安全库存" width="100" align="right" /> <el-table-column prop="inboundNum" label="预计出库数量" width="120" align="right" /> <el-table-column prop="inboundNum0" label="预计入库数量" width="120" align="right" /> <el-table-column prop="weeklyNetDemand" label="按周净需求" width="120" align="right"> <template #default="{ row }"> <el-tag :type="row.weeklyNetDemand > 0 ? 'warning' : 'success'" size="small"> <el-tag :type="row.weeklyNetDemand > 0 ? 'warning' : 'success'" size="small"> {{ row.weeklyNetDemand }} </el-tag> </template> </el-table-column> <el-table-column prop="suggestedPurchase" label="建议采购" width="100" align="right"> <el-table-column prop="suggestedPurchase" label="建议采购" width="100" align="right"> <template #default="{ row }"> <el-tag :type="row.suggestedPurchase > 0 ? 'danger' : 'success'" size="small"> <el-tag :type="row.suggestedPurchase > 0 ? 'danger' : 'success'" size="small"> {{ row.suggestedPurchase }} </el-tag> </template> @@ -299,43 +372,49 @@ </template> <script setup> import FormDialog from '@/components/Dialog/FormDialog.vue'; import {ref, reactive, onMounted, getCurrentInstance} from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' import { Search, Refresh, Plus, Download } from '@element-plus/icons-vue' import {listPage,add,update,del,listPageCopy} from "@/api/procurementManagement/procurementPlan.js" import FormDialog from "@/components/Dialog/FormDialog.vue"; import { ref, reactive, onMounted, getCurrentInstance } from "vue"; import { ElMessage, ElMessageBox } from "element-plus"; import { Search, Refresh, Plus, Download } from "@element-plus/icons-vue"; import { listPage, add, update, del, listPageCopy, } from "@/api/procurementManagement/procurementPlan.js"; // 响应式数据 const loading = ref(false) const submitLoading = ref(false) const dialogVisible = ref(false) const productSelectDialogVisible = ref(false) const calculateDialogVisible = ref(false) const dialogType = ref('add') const productLoading = ref(false) const selectedProducts = ref([]) const currentPlan = ref(null) const loading = ref(false); const submitLoading = ref(false); const dialogVisible = ref(false); const productSelectDialogVisible = ref(false); const calculateDialogVisible = ref(false); const dialogType = ref("add"); const productLoading = ref(false); const selectedProducts = ref([]); const currentPlan = ref(null); // 搜索表单 const searchForm = reactive({ planName: '', status: '' }) planName: "", status: "", }); // 分页数据 const pagination = reactive({ current: 1, size: 20 }) size: 20, }); // 表单数据 const formData = reactive({ code: '', planName: '', description: '', status: '', code: "", planName: "", description: "", status: "", isSystemPreset: false, formula: '', formula: "", // 计算参数 considerExistingStock: false, warehouseControl: false, @@ -347,166 +426,158 @@ // 汇总合并选项 summaryMaterial: false, summaryAuxAttributes: false, summaryDemandDate: false }) summaryDemandDate: false, }); // 当前激活的标签页 const activeTab = ref('demand') const activeTab = ref("demand"); // 表单验证规则 const formRules = { planName: [ { required: true, message: '请输入计划名称', trigger: 'blur' } ], status: [ { required: true, message: '请选择状态', trigger: 'change' } ], formula: [ { required: true, message: '请输入计算公式', trigger: 'blur' } ] } planName: [{ required: true, message: "请输入计划名称", trigger: "blur" }], status: [{ required: true, message: "请选择状态", trigger: "change" }], formula: [{ required: true, message: "请输入计算公式", trigger: "blur" }], }; // 表格数据 const tableData = ref([]) const tableData = ref([]); // 产品列表数据 const productList = ref([ { id: 4, productName: '产品D', productCode: 'PD004', productName: "产品D", productCode: "PD004", existingStock: 90, safetyStock: 40, expectedOutbound: 160, expectedInbound: 35 } ]) expectedInbound: 35, }, ]); // 计算结果数据 const calculateResult = ref([ { productName: '产品A', productName: "产品A", existingStock: 100, safetyStock: 50, expectedOutbound: 200, expectedInbound: 30, weeklyNetDemand: 120, suggestedPurchase: 150 suggestedPurchase: 150, }, { productName: '产品B', productName: "产品B", existingStock: 80, safetyStock: 30, expectedOutbound: 150, expectedInbound: 20, weeklyNetDemand: 100, suggestedPurchase: 120 } ]) const total = ref(0) suggestedPurchase: 120, }, ]); const total = ref(0); // 方法 const handleSearch = () => { pagination.current = 1 loadData() } pagination.current = 1; loadData(); }; const handleReset = () => { Object.assign(searchForm, { planName: '', status: '' }) handleSearch() } planName: "", status: "", }); handleSearch(); }; const loadData = () => { loading.value = true loading.value = true; listPage({...searchForm,...pagination}).then(res => { if(res.code === 200){ tableData.value = res.data.records total.value = res.data.total loading.value = false tableData.value = res.data.records; total.value = res.data.total; loading.value = false; } }) } }); }; const handleAdd = () => { dialogType.value = 'add' resetForm() dialogType.value = "add"; resetForm(); // 自动生成编码 formData.code = 'CGJH' + String(Date.now()).slice(-4) dialogVisible.value = true } formData.code = "CGJH" + String(Date.now()).slice(-4); dialogVisible.value = true; }; const handleEdit = (row) => { dialogType.value = 'edit' Object.assign(formData, row) dialogVisible.value = true } const handleEdit = row => { dialogType.value = "edit"; Object.assign(formData, row); dialogVisible.value = true; }; const handleDelete = async (row) => { const handleDelete = async row => { try { await ElMessageBox.confirm('确定要删除这个采购计划吗?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }) let ids = [row.id] await ElMessageBox.confirm("确定要删除这个采购计划吗?", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning", }); let ids = [row.id]; del(ids).then(res =>{ if(res.code === 200){ ElMessage.success('删除成功') loadData() ElMessage.success("删除成功"); loadData(); } }) }); } catch { // 用户取消删除 } } }; const handleSubmit = async () => { try { // 表单验证 if (!formData.planName || !formData.formula) { ElMessage.error('请填写必填项') return ElMessage.error("请填写必填项"); return; } submitLoading.value = true submitLoading.value = true; if (dialogType.value === 'add') { if (dialogType.value === "add") { add(formData).then(res => { if(res.code === 200){ ElMessage.success('新增成功') dialogVisible.value = false loadData() ElMessage.success("新增成功"); dialogVisible.value = false; loadData(); } }) }); } else { // 编辑 update(formData).then(res => { if(res.code === 200){ ElMessage.success('编辑成功') dialogVisible.value = false loadData() ElMessage.success("编辑成功"); dialogVisible.value = false; loadData(); } }) }); } } catch (error) { ElMessage.error('操作失败') ElMessage.error("操作失败"); } finally { submitLoading.value = false submitLoading.value = false; } } }; const resetForm = () => { Object.assign(formData, { code: '', planName: '', description: '', status: '', code: "", planName: "", description: "", status: "", isSystemPreset: false, formula: '预计出库数量 - 现有库存 + 安全库存 - 预计入库数量', formula: "预计出库数量 - 现有库存 + 安全库存 - 预计入库数量", // 计算参数 considerExistingStock: false, warehouseControl: false, @@ -518,52 +589,52 @@ // 汇总合并选项 summaryMaterial: false, summaryAuxAttributes: false, summaryDemandDate: false }) activeTab.value = 'demand' } summaryDemandDate: false, }); activeTab.value = "demand"; }; const validateFormula = () => { // 简单的公式验证 const formula = formData.formula const formula = formData.formula; if (formula && !/^[a-zA-Z\u4e00-\u9fa5\s\*\+\-\/\(\)\d\.]+$/.test(formula)) { ElMessage.warning('公式格式可能不正确,请检查') ElMessage.warning("公式格式可能不正确,请检查"); } } }; const handleCalculate = (row) => { currentPlan.value = row productSelectDialogVisible.value = true loadProductList() } const handleCalculate = row => { currentPlan.value = row; productSelectDialogVisible.value = true; loadProductList(); }; const loadProductList = () => { productLoading.value = true productLoading.value = true; // 模拟加载产品数据 listPageCopy({size:-1}).then(res => { if(res.code === 200){ productList.value = res.data.records productLoading.value = false productList.value = res.data.records; productLoading.value = false; } }) } }); }; const handleProductSelectionChange = (selection) => { selectedProducts.value = selection } const handleProductSelectionChange = selection => { selectedProducts.value = selection; }; const handleConfirmProductSelection = () => { if (selectedProducts.value.length === 0) { ElMessage.warning('请选择要计算的产品') return ElMessage.warning("请选择要计算的产品"); return; } ElMessage.success(`正在计算 ${currentPlan.value.planName} 的采购需求...`) productSelectDialogVisible.value = false ElMessage.success(`正在计算 ${currentPlan.value.planName} 的采购需求...`); productSelectDialogVisible.value = false; // 根据选择的产品和计算公式进行计算 calculateWithSelectedProducts() } calculateWithSelectedProducts(); }; const calculateWithSelectedProducts = () => { // 模拟计算过程 @@ -571,8 +642,12 @@ const result = selectedProducts.value.map(product => { // 这里应该根据实际的计算公式进行计算 // 示例:预计出库数量 - 现有库存 + 安全库存 - 预计入库数量 const weeklyNetDemand = product.inboundNum - product.inboundNum0 + product.inboundNum - product.inboundNum0 const suggestedPurchase = Math.max(0, weeklyNetDemand) const weeklyNetDemand = product.inboundNum - product.inboundNum0 + product.inboundNum - product.inboundNum0; const suggestedPurchase = Math.max(0, weeklyNetDemand); return { productCategory: product.productCategory, @@ -580,18 +655,17 @@ inboundNum0: product.inboundNum0, inboundNum: product.inboundNum, weeklyNetDemand: weeklyNetDemand, suggestedPurchase: suggestedPurchase } }) suggestedPurchase: suggestedPurchase, }; }); calculateResult.value = result calculateDialogVisible.value = true } calculateResult.value = result; calculateDialogVisible.value = true; }; const handleCreatePurchaseOrder = () => { calculateDialogVisible.value = false } calculateDialogVisible.value = false; }; const { proxy } = getCurrentInstance(); const handleExport = () => { ElMessageBox.confirm("内容将被导出,是否确认导出?", "导出", { @@ -605,23 +679,22 @@ .catch(() => { proxy.$modal.msg("已取消"); }); } }; const handleSizeChange = size => { pagination.size = size; loadData(); }; const handleSizeChange = (size) => { pagination.size = size loadData() } const handleCurrentChange = (current) => { pagination.current = current loadData() } const handleCurrentChange = current => { pagination.current = current; loadData(); }; // 生命周期 onMounted(() => { loadData() }) loadData(); }); </script> <style scoped> src/views/productionManagement/productionTraceability/index.vue
@@ -35,7 +35,7 @@ border> <el-descriptions-item label="生产订单号">{{ rowData.productionOrderDto?.npsNo || '-' }}</el-descriptions-item> <el-descriptions-item label="产品名称">{{ rowData.productionOrderDto?.productName || '-' }}</el-descriptions-item> <el-descriptions-item label="产品规格">{{ rowData.productionOrderDto?.model || '-' }}</el-descriptions-item> <el-descriptions-item label="规格型号">{{ rowData.productionOrderDto?.model || '-' }}</el-descriptions-item> <!-- <el-descriptions-item label="物料编码">{{ rowData.productionOrderDto?.materialCode || '-' }}</el-descriptions-item> --> <el-descriptions-item label="计划数量">{{ rowData.productionOrderDto?.quantity || 0 }} <span class="unit">{{ rowData.productionOrderDto?.unit || '-' }}</span></el-descriptions-item> <el-descriptions-item label="当前状态"> src/views/productionManagement/workOrder/index.vue
@@ -93,7 +93,7 @@ <span class="info-value">{{ transferCardRowData.productName }}</span> </div> <div class="info-item"> <span class="info-label">产品规格</span> <span class="info-label">规格型号</span> <span class="info-value">{{ transferCardRowData.model }}</span> </div> <!-- <div class="info-item"> src/views/productionManagement/workOrderManagement/index.vue
@@ -57,7 +57,7 @@ <span class="info-value">{{ transferCardRowData.productName }}</span> </div> <div class="info-item"> <span class="info-label">产品规格</span> <span class="info-label">规格型号</span> <span class="info-value">{{ transferCardRowData.model }}</span> </div> <div class="info-item"> src/views/productionPlan/productionPlan/index.vue
@@ -56,7 +56,7 @@ style="width: 160px;" @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="产品规格:" <el-form-item label="规格型号:" prop="model"> <el-input v-model="searchForm.model" placeholder="请输入" @@ -121,7 +121,7 @@ </el-row> <el-row :gutter="20"> <el-col> <el-form-item label="产品规格"> <el-form-item label="规格型号"> <div class="info-display">{{ mergeForm.model || '-' }}</div> </el-form-item> </el-col> @@ -186,7 +186,7 @@ @change="handleProductChange" style="width: 100%" /> </el-form-item> <el-form-item label="产品规格" <el-form-item label="规格型号" prop="productModelId"> <el-select v-model="form.productModelId" @change="handleChangeSpecification" @@ -321,7 +321,7 @@ }, }, { label: "产品规格", label: "规格型号", prop: "model", width: "150px", className: "spec-cell", @@ -507,7 +507,7 @@ const rules = reactive({ productId: [{ required: true, message: "请选择产品", trigger: "change" }], productModelId: [ { required: true, message: "请选择产品规格", trigger: "change" }, { required: true, message: "请选择规格型号", trigger: "change" }, ], qtyRequired: [{ required: true, message: "请输入数量", trigger: "blur" }], requiredDate: [ @@ -686,17 +686,17 @@ }); }; // 选中的产品规格ID // 选中的规格型号ID const selectedProductModelId = ref(""); // 表格选择数据 const handleSelectionChange = selection => { selectedRows.value = selection; // 如果有选中的行,记录第一个选中行的产品规格ID // 如果有选中的行,记录第一个选中行的规格型号ID if (selection.length > 0) { selectedProductModelId.value = selection[0].productModelId; } else { // 如果没有选中的行,清空产品规格ID // 如果没有选中的行,清空规格型号ID selectedProductModelId.value = ""; } }; @@ -717,7 +717,7 @@ if (!selectedProductModelId.value) { return true; } // 如果有选中的行,只有产品规格ID相同的行才可选择 // 如果有选中的行,只有规格型号ID相同的行才可选择 return row.productModelId === selectedProductModelId.value; }; // 拉取数据按钮操作 src/views/qualityManagement/nearExpiryReturn/index.vue
@@ -1,25 +1,27 @@ <template> <div class="app-container"> <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> <el-form-item label="产品名称" prop="productName"> <el-input v-model="queryParams.productName" <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> <el-form-item label="产品名称" prop="productName"> <el-input v-model="queryParams.productName" placeholder="请输入产品名称" clearable @keyup.enter.native="handleQuery" /> @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item label="批次号" prop="batchNumber"> <el-input v-model="queryParams.batchNumber" <el-form-item label="批次号" prop="batchNumber"> <el-input v-model="queryParams.batchNumber" placeholder="请输入批次号" clearable @keyup.enter.native="handleQuery" /> @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item label="退回日期" prop="returnDate"> <el-date-picker clearable <el-form-item label="退回日期" prop="returnDate"> <el-date-picker clearable v-model="queryParams.returnDate" type="date" value-format="YYYY-MM-DD" @@ -27,125 +29,160 @@ </el-date-picker> </el-form-item> <el-form-item> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button> </el-form-item> </el-form> <el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> <el-button type="primary" <el-button type="primary" plain icon="Plus" @click="handleAdd" >新增</el-button> @click="handleAdd">新增</el-button> </el-col> <el-col :span="1.5"> <el-button type="success" <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" >修改</el-button> @click="handleUpdate">修改</el-button> </el-col> <el-col :span="1.5"> <el-button type="danger" <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" >删除</el-button> @click="handleDelete">删除</el-button> </el-col> <el-col :span="1.5"> <el-button type="warning" <el-button type="warning" plain icon="Download" @click="handleExport" >导出</el-button> @click="handleExport">导出</el-button> </el-col> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> </el-row> <el-table v-loading="loading" :data="nearExpiryReturnList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> <el-table-column label="序号" type="index" width="50" align="center" /> <el-table-column label="产品名称" prop="productName" /> <el-table-column label="产品规格" prop="productSpec" /> <el-table-column label="批次号" prop="batchNumber" /> <el-table-column label="生产日期" prop="productionDate" align="center"> <el-table v-loading="loading" :data="nearExpiryReturnList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> <el-table-column label="序号" type="index" width="50" align="center" /> <el-table-column label="产品名称" prop="productName" /> <el-table-column label="规格型号" prop="productSpec" /> <el-table-column label="批次号" prop="batchNumber" /> <el-table-column label="生产日期" prop="productionDate" align="center"> <template #default="scope"> <span>{{ parseTime(scope.row.productionDate, '{y}-{m}-{d}') }}</span> </template> </el-table-column> <el-table-column label="到期日期" prop="expiryDate" align="center"> <el-table-column label="到期日期" prop="expiryDate" align="center"> <template #default="scope"> <span>{{ parseTime(scope.row.expiryDate, '{y}-{m}-{d}') }}</span> </template> </el-table-column> <el-table-column label="退回数量" prop="returnQuantity" /> <el-table-column label="退回原因" prop="returnReason" /> <el-table-column label="退回日期" prop="returnDate" align="center"> <el-table-column label="退回数量" prop="returnQuantity" /> <el-table-column label="退回原因" prop="returnReason" /> <el-table-column label="退回日期" prop="returnDate" align="center"> <template #default="scope"> <span>{{ parseTime(scope.row.returnDate, '{y}-{m}-{d}') }}</span> </template> </el-table-column> <el-table-column label="处理状态" prop="status" align="center"> <el-table-column label="处理状态" prop="status" align="center"> <template #default="scope"> <dict-tag :options="statusOptions" :value="scope.row.status"/> <dict-tag :options="statusOptions" :value="scope.row.status" /> </template> </el-table-column> <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-button size="mini" type="text" icon="Edit" @click="handleUpdate(scope.row)">修改</el-button> <el-button size="mini" type="text" icon="Delete" @click="handleDelete(scope.row)">删除</el-button> <el-button size="mini" type="text" icon="Edit" @click="handleUpdate(scope.row)">修改</el-button> <el-button size="mini" type="text" icon="Delete" @click="handleDelete(scope.row)">删除</el-button> </template> </el-table-column> </el-table> <pagination v-show="total>0" <pagination v-show="total>0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> @pagination="getList" /> <!-- 添加或修改临期退回台账对话框 --> <el-dialog :title="title" v-model="open" width="800px" append-to-body> <el-form ref="formRef" :model="form" :rules="rules" label-width="100px"> <el-dialog :title="title" v-model="open" width="800px" append-to-body> <el-form ref="formRef" :model="form" :rules="rules" label-width="100px"> <el-row> <el-col :span="12"> <el-form-item label="产品名称" prop="productName"> <el-input v-model="form.productName" placeholder="请输入产品名称" /> <el-form-item label="产品名称" prop="productName"> <el-input v-model="form.productName" placeholder="请输入产品名称" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="产品规格" prop="productSpec"> <el-input v-model="form.productSpec" placeholder="请输入产品规格" /> <el-form-item label="规格型号" prop="productSpec"> <el-input v-model="form.productSpec" placeholder="请输入规格型号" /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="批次号" prop="batchNumber"> <el-input v-model="form.batchNumber" placeholder="请输入批次号" /> <el-form-item label="批次号" prop="batchNumber"> <el-input v-model="form.batchNumber" placeholder="请输入批次号" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="退回数量" prop="returnQuantity"> <el-input-number v-model="form.returnQuantity" controls-position="right" :min="1" /> <el-form-item label="退回数量" prop="returnQuantity"> <el-input-number v-model="form.returnQuantity" controls-position="right" :min="1" /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="生产日期" prop="productionDate"> <el-date-picker clearable <el-form-item label="生产日期" prop="productionDate"> <el-date-picker clearable v-model="form.productionDate" type="date" value-format="YYYY-MM-DD" @@ -154,9 +191,9 @@ </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="到期日期" prop="expiryDate"> <el-date-picker clearable <el-form-item label="到期日期" prop="expiryDate"> <el-date-picker clearable v-model="form.expiryDate" type="date" value-format="YYYY-MM-DD" @@ -167,9 +204,9 @@ </el-row> <el-row> <el-col :span="12"> <el-form-item label="退回日期" prop="returnDate"> <el-date-picker clearable <el-form-item label="退回日期" prop="returnDate"> <el-date-picker clearable v-model="form.returnDate" type="date" value-format="YYYY-MM-DD" @@ -178,36 +215,43 @@ </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="处理状态" prop="status"> <el-select v-model="form.status" placeholder="请选择处理状态"> <el-option v-for="dict in statusOptions" <el-form-item label="处理状态" prop="status"> <el-select v-model="form.status" placeholder="请选择处理状态"> <el-option v-for="dict in statusOptions" :key="dict.value" :label="dict.label" :value="dict.value" ></el-option> :value="dict.value"></el-option> </el-select> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item label="退回原因" prop="returnReason"> <el-input v-model="form.returnReason" type="textarea" placeholder="请输入退回原因" /> <el-form-item label="退回原因" prop="returnReason"> <el-input v-model="form.returnReason" type="textarea" placeholder="请输入退回原因" /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item label="备注" prop="remark"> <el-input v-model="form.remark" type="textarea" placeholder="请输入备注" /> <el-form-item label="备注" prop="remark"> <el-input v-model="form.remark" type="textarea" placeholder="请输入备注" /> </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 type="primary" @click="submitForm">确 定</el-button> <el-button @click="cancel">取 消</el-button> </div> </template> @@ -237,7 +281,7 @@ const statusOptions = ref([ { label: "待处理", value: "0" }, { label: "处理中", value: "1" }, { label: "已完成", value: "2" } { label: "已完成", value: "2" }, ]); const data = reactive({ @@ -247,37 +291,37 @@ pageSize: 10, productName: null, batchNumber: null, returnDate: null returnDate: null, }, rules: { productName: [ { required: true, message: "产品名称不能为空", trigger: "blur" } { required: true, message: "产品名称不能为空", trigger: "blur" }, ], productSpec: [ { required: true, message: "产品规格不能为空", trigger: "blur" } { required: true, message: "规格型号不能为空", trigger: "blur" }, ], batchNumber: [ { required: true, message: "批次号不能为空", trigger: "blur" } { required: true, message: "批次号不能为空", trigger: "blur" }, ], returnQuantity: [ { required: true, message: "退回数量不能为空", trigger: "blur" } { required: true, message: "退回数量不能为空", trigger: "blur" }, ], productionDate: [ { required: true, message: "生产日期不能为空", trigger: "blur" } { required: true, message: "生产日期不能为空", trigger: "blur" }, ], expiryDate: [ { required: true, message: "到期日期不能为空", trigger: "blur" } { required: true, message: "到期日期不能为空", trigger: "blur" }, ], returnDate: [ { required: true, message: "退回日期不能为空", trigger: "blur" } { required: true, message: "退回日期不能为空", trigger: "blur" }, ], returnReason: [ { required: true, message: "退回原因不能为空", trigger: "blur" } { required: true, message: "退回原因不能为空", trigger: "blur" }, ], status: [ { required: true, message: "处理状态不能为空", trigger: "change" } ] } { required: true, message: "处理状态不能为空", trigger: "change" }, ], }, }); const { queryParams, form, rules } = toRefs(data); @@ -310,7 +354,7 @@ returnReason: null, returnDate: null, status: null, remark: null remark: null, }; proxy.resetForm("formRef"); } @@ -371,15 +415,21 @@ /** 删除按钮操作 */ function handleDelete(row) { const deleteIds = row.id || ids.value; ElMessageBox.confirm('是否确认删除临期退回台账编号为"' + deleteIds + '"的数据项?', "警告", { ElMessageBox.confirm( '是否确认删除临期退回台账编号为"' + deleteIds + '"的数据项?', "警告", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning" }).then(function() { type: "warning", } ) .then(function () { // 不调用接口,只显示成功提示 proxy.$modal.msgSuccess("删除成功"); getList(); }).catch(() => {}); }) .catch(() => {}); } /** 导出按钮操作 */