| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  | <template> | 
					
						
							|  |  |  |  |     <div class="procurementPlan"> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |         <el-row :gutter="20"> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |             <el-col :span="13"> | 
					
						
							|  |  |  |  |                 <el-card> | 
					
						
							|  |  |  |  |                     <div style="display: flex;align-items: center;height: 120px;justify-content: space-around;"> | 
					
						
							|  |  |  |  |                         <div class="img"> | 
					
						
							|  |  |  |  |                             <img src="/assets/caigou.png" alt=""> | 
					
						
							|  |  |  |  |                         </div> | 
					
						
							|  |  |  |  |                         <div class="item"> | 
					
						
							|  |  |  |  |                             <div class="text"> | 
					
						
							|  |  |  |  |                                 待审批计划 | 
					
						
							|  |  |  |  |                             </div> | 
					
						
							|  |  |  |  |                             <div class="count" style="color: rgba(255, 178, 30, 1);"> | 
					
						
							|  |  |  |  |                                 12 | 
					
						
							|  |  |  |  |                             </div> | 
					
						
							|  |  |  |  |                         </div> | 
					
						
							|  |  |  |  |                         <div class="item"> | 
					
						
							|  |  |  |  |                             <div class="text"> | 
					
						
							|  |  |  |  |                                 已批准计划 | 
					
						
							|  |  |  |  |                             </div> | 
					
						
							|  |  |  |  |                             <div class="count" style="color: rgba(67, 101, 220, 1);"> | 
					
						
							|  |  |  |  |                                 28 | 
					
						
							|  |  |  |  |                             </div> | 
					
						
							|  |  |  |  |                         </div> | 
					
						
							|  |  |  |  |                         <div class="item"> | 
					
						
							|  |  |  |  |                             <div class="text"> | 
					
						
							|  |  |  |  |                                 采购中计划 | 
					
						
							|  |  |  |  |                             </div> | 
					
						
							|  |  |  |  |                             <div class="count" style="color: rgba(113, 214, 213, 1);"> | 
					
						
							|  |  |  |  |                                 15 | 
					
						
							|  |  |  |  |                             </div> | 
					
						
							|  |  |  |  |                         </div> | 
					
						
							|  |  |  |  |                         <div class="item"> | 
					
						
							|  |  |  |  |                             <div class="text"> | 
					
						
							|  |  |  |  |                                 已完成计划 | 
					
						
							|  |  |  |  |                             </div> | 
					
						
							|  |  |  |  |                             <div class="count" style="color: rgba(0, 184, 122, 1);"> | 
					
						
							|  |  |  |  |                                 86 | 
					
						
							|  |  |  |  |                             </div> | 
					
						
							|  |  |  |  |                         </div> | 
					
						
							|  |  |  |  |                     </div> | 
					
						
							|  |  |  |  |                 </el-card> | 
					
						
							|  |  |  |  |             </el-col> | 
					
						
							|  |  |  |  |             <el-col :span="11"> | 
					
						
							|  |  |  |  |                 <el-card> | 
					
						
							|  |  |  |  |                     <div style="display: flex;align-items: center;height: 120px;justify-content: space-around;"> | 
					
						
							|  |  |  |  |                         <div class="img"> | 
					
						
							|  |  |  |  |                             <img src="/assets/qian.jpg" alt=""> | 
					
						
							|  |  |  |  |                         </div> | 
					
						
							|  |  |  |  |                         <div class="item"> | 
					
						
							|  |  |  |  |                             <div class="text"> | 
					
						
							|  |  |  |  |                                 本年度已采购金额 | 
					
						
							|  |  |  |  |                             </div> | 
					
						
							|  |  |  |  |                             <div class="count" style="color: rgba(255, 153, 0, 1);"> | 
					
						
							|  |  |  |  |                                 520,000.00 | 
					
						
							|  |  |  |  |                             </div> | 
					
						
							|  |  |  |  |                         </div> | 
					
						
							|  |  |  |  |                         <div class="item"> | 
					
						
							|  |  |  |  |                             <div class="text"> | 
					
						
							|  |  |  |  |                                 本年度采购预算金额 | 
					
						
							|  |  |  |  |                             </div> | 
					
						
							|  |  |  |  |                             <div class="count" style="color: rgba(67, 101, 220, 1);"> | 
					
						
							|  |  |  |  |                                 3,000,000.00 | 
					
						
							|  |  |  |  |                             </div> | 
					
						
							|  |  |  |  |                         </div> | 
					
						
							|  |  |  |  |                     </div> | 
					
						
							|  |  |  |  |                 </el-card> | 
					
						
							|  |  |  |  |             </el-col> | 
					
						
							|  |  |  |  |         </el-row> | 
					
						
							|  |  |  |  |         <el-row style="margin-top: 20px;"> | 
					
						
							|  |  |  |  |             <el-col :span="24"> | 
					
						
							|  |  |  |  |                 <el-card style="border-radius: 10px;"> | 
					
						
							|  |  |  |  |                     <div class="content"> | 
					
						
							|  |  |  |  |                         <div class="tabs"> | 
					
						
							|  |  |  |  |                             <el-button type="success">导出</el-button> | 
					
						
							|  |  |  |  |                             <el-button type="primary" @click="isNewProcurementDialogVisible = true">新建采购申请单</el-button> | 
					
						
							|  |  |  |  |                         </div> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                         <!-- 标签页导航 --> | 
					
						
							|  |  |  |  |                         <div class="tabs"> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                             <el-badge :value="pendingCount" type="warning"> | 
					
						
							|  |  |  |  |                                 <el-button :type="activeTab === 'pending' ? 'primary' : ''" | 
					
						
							|  |  |  |  |                                     @click="changeTab('pending')">待审批</el-button> | 
					
						
							|  |  |  |  |                             </el-badge> | 
					
						
							|  |  |  |  |                             <el-badge :value="purchasingCount" type="info"> | 
					
						
							|  |  |  |  |                                 <el-button :type="activeTab === 'purchasing' ? 'primary' : ''" | 
					
						
							|  |  |  |  |                                     @click="changeTab('purchasing')">采购中</el-button> | 
					
						
							|  |  |  |  |                             </el-badge> | 
					
						
							|  |  |  |  |                             <el-badge :value="rejectedCount" type="danger"> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                                 <el-button :type="activeTab === 'rejected' ? 'primary' : ''" | 
					
						
							|  |  |  |  |                                     @click="changeTab('rejected')"> | 
					
						
							|  |  |  |  |                                     未通过 | 
					
						
							|  |  |  |  |                                 </el-button> | 
					
						
							|  |  |  |  |                             </el-badge> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                             <el-badge :value="approvedCount" type="primary"> | 
					
						
							|  |  |  |  |                                 <el-button :type="activeTab === 'approved' ? 'primary' : ''" | 
					
						
							|  |  |  |  |                                     @click="changeTab('approved')">已通过</el-button> | 
					
						
							|  |  |  |  |                             </el-badge> | 
					
						
							|  |  |  |  |                             <el-badge :value="completedCount" type="success"> | 
					
						
							|  |  |  |  |                                 <el-button :type="activeTab === 'completed' ? 'primary' : ''" | 
					
						
							|  |  |  |  |                                     @click="changeTab('completed')">已完成</el-button> | 
					
						
							|  |  |  |  |                             </el-badge> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                         </div> | 
					
						
							|  |  |  |  |                         <!-- 表格 --> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                          <el-table :data="filteredTableData" border style="width: 100%;margin-top: 15px;"> | 
					
						
							|  |  |  |  |                             <el-table-column type="selection" width="55" align="center" /> | 
					
						
							|  |  |  |  |                             <el-table-column prop="planNumber" label="计划编号" align="center" /> | 
					
						
							|  |  |  |  |                             <el-table-column prop="planName" label="计划名称" align="center" /> | 
					
						
							|  |  |  |  |                             <el-table-column prop="equipmentType" label="设备类型" align="center" /> | 
					
						
							|  |  |  |  |                             <el-table-column prop="requestDept" label="申请部门" align="center" /> | 
					
						
							|  |  |  |  |                             <el-table-column prop="applicant" label="申请人" align="center" /> | 
					
						
							|  |  |  |  |                             <el-table-column prop="requestDate" label="申请日期" align="center" /> | 
					
						
							|  |  |  |  |                             <el-table-column prop="estimatedAmount" label="预计金额" align="center" /> | 
					
						
							|  |  |  |  |                             <el-table-column label="状态" align="center"> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                                 <template #default="scope"> | 
					
						
							|  |  |  |  |                                     <el-tag :type="getStatusTagType(scope.row.status)">{{ scope.row.status }}</el-tag> | 
					
						
							|  |  |  |  |                                 </template> | 
					
						
							|  |  |  |  |                             </el-table-column> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                             <el-table-column label="操作" fixed="right" width="80" align="center"> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                                 <template #default="scope"> | 
					
						
							|  |  |  |  |                                     <el-button type="text" @click="handleView(scope.row)">查看</el-button> | 
					
						
							|  |  |  |  |                                 </template> | 
					
						
							|  |  |  |  |                             </el-table-column> | 
					
						
							|  |  |  |  |                         </el-table> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                         <!-- 分页 --> | 
					
						
							|  |  |  |  |                         <div class="pagination-section"> | 
					
						
							|  |  |  |  |                             <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" | 
					
						
							|  |  |  |  |                                 :current-page="currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="pageSize" | 
					
						
							|  |  |  |  |                                 layout="total, sizes, prev, pager, next, jumper" :total="total" background /> | 
					
						
							|  |  |  |  |                         </div> | 
					
						
							|  |  |  |  |                     </div> | 
					
						
							|  |  |  |  |                 </el-card> | 
					
						
							|  |  |  |  |             </el-col> | 
					
						
							|  |  |  |  |         </el-row> | 
					
						
							|  |  |  |  |         <el-dialog v-model="isNewProcurementDialogVisible" title="新建采购申请单" width="60%" :close-on-click-modal="false"> | 
					
						
							|  |  |  |  |             <div class="new-procurement-form"> | 
					
						
							|  |  |  |  |                 <!-- 基础信息 --> | 
					
						
							|  |  |  |  |                 <div class="form-section"> | 
					
						
							|  |  |  |  |                     <h3>基础信息</h3> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                     <!-- 输入框行 --> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                     <el-row :gutter="20"> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                         <el-col :span="12"> | 
					
						
							|  |  |  |  |                             <el-form-item label="计划名称"> | 
					
						
							|  |  |  |  |                                 <el-input v-model="newProcurementForm.planName" placeholder="请填写" /> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                             </el-form-item> | 
					
						
							|  |  |  |  |                         </el-col> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                         <el-col :span="12"> | 
					
						
							|  |  |  |  |                             <el-form-item label="合同名称"> | 
					
						
							|  |  |  |  |                                 <el-input v-model="newProcurementForm.contractName" placeholder="请填写" /> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                             </el-form-item> | 
					
						
							|  |  |  |  |                         </el-col> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                     </el-row> | 
					
						
							|  |  |  |  |                     <!-- 下拉框行 --> | 
					
						
							|  |  |  |  |                     <el-row :gutter="20"> | 
					
						
							|  |  |  |  |                         <el-col :span="8"> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                             <el-form-item label="合同类型"> | 
					
						
							|  |  |  |  |                                 <el-select v-model="newProcurementForm.contractType" placeholder="请选择"> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                                     <el-option v-for="option in wz_contract_type" :key="option.value" :label="option.label" :value="option.value" /> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                                 </el-select> | 
					
						
							|  |  |  |  |                             </el-form-item> | 
					
						
							|  |  |  |  |                         </el-col> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                         <el-col :span="8"> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                             <el-form-item label="采购类型"> | 
					
						
							|  |  |  |  |                                 <el-select v-model="newProcurementForm.procurementType" placeholder="请选择"> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                                     <el-option v-for="option in wz_purchase_type" :key="option.value" :label="option.label" :value="option.value" /> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                                 </el-select> | 
					
						
							|  |  |  |  |                             </el-form-item> | 
					
						
							|  |  |  |  |                         </el-col> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                         <el-col :span="8"> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                             <el-form-item label="仓库地址"> | 
					
						
							|  |  |  |  |                                 <el-select v-model="newProcurementForm.contractAddress" placeholder="请选择"> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                                     <el-option v-for="option in contractAddressOptions" :key="option.value" :label="option.label" :value="option.value" /> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                                 </el-select> | 
					
						
							|  |  |  |  |                             </el-form-item> | 
					
						
							|  |  |  |  |                         </el-col> | 
					
						
							|  |  |  |  |                     </el-row> | 
					
						
							|  |  |  |  |                 </div> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 <!-- 供应商信息 --> | 
					
						
							|  |  |  |  |                 <div class="form-section"> | 
					
						
							|  |  |  |  |                     <h3>供应商信息</h3> | 
					
						
							|  |  |  |  |                     <el-row :gutter="20"> | 
					
						
							|  |  |  |  |                         <el-col :span="6"> | 
					
						
							|  |  |  |  |                             <el-form-item label="供应商单位"> | 
					
						
							|  |  |  |  |                                 <el-select v-model="newProcurementForm.supplierUnit" placeholder="请选择"> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                                     <el-option v-for="option in supplierUnitOptions" :key="option.value" :label="option.label" :value="option.value" /> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                                 </el-select> | 
					
						
							|  |  |  |  |                             </el-form-item> | 
					
						
							|  |  |  |  |                         </el-col> | 
					
						
							|  |  |  |  |                         <el-col :span="6"> | 
					
						
							|  |  |  |  |                             <el-form-item label="送货时间"> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                                 <el-date-picker | 
					
						
							|  |  |  |  |                                     v-model="newProcurementForm.deliveryTime" | 
					
						
							|  |  |  |  |                                     type="date" | 
					
						
							|  |  |  |  |                                     placeholder="请选择送货日期" | 
					
						
							|  |  |  |  |                                     value-format="YYYY-MM-DD" | 
					
						
							|  |  |  |  |                                     style="width: 100%" | 
					
						
							|  |  |  |  |                                 /> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                             </el-form-item> | 
					
						
							|  |  |  |  |                         </el-col> | 
					
						
							|  |  |  |  |                     </el-row> | 
					
						
							|  |  |  |  |                 </div> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 <!-- 产品信息 --> | 
					
						
							|  |  |  |  |                 <div class="form-section"> | 
					
						
							|  |  |  |  |                     <h3>产品信息</h3> | 
					
						
							|  |  |  |  |                     <el-table :data="newProcurementForm.products" border style="width: 100%"> | 
					
						
							|  |  |  |  |                         <el-table-column prop="productName" label="产品名称"> | 
					
						
							|  |  |  |  |                             <template #default="scope"> | 
					
						
							|  |  |  |  |                                 <el-input v-model="scope.row.productName" placeholder="请填写" /> | 
					
						
							|  |  |  |  |                             </template> | 
					
						
							|  |  |  |  |                         </el-table-column> | 
					
						
							|  |  |  |  |                         <el-table-column prop="productModel" label="产品型号"> | 
					
						
							|  |  |  |  |                             <template #default="scope"> | 
					
						
							|  |  |  |  |                                 <el-input v-model="scope.row.productModel" placeholder="请填写" /> | 
					
						
							|  |  |  |  |                             </template> | 
					
						
							|  |  |  |  |                         </el-table-column> | 
					
						
							|  |  |  |  |                         <el-table-column prop="productPrice" label="产品单价"> | 
					
						
							|  |  |  |  |                             <template #default="scope"> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                                 <el-input v-model="scope.row.productPrice" placeholder="请填写" type="number" @change="calculateTotalPrice(scope.row)" /> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                             </template> | 
					
						
							|  |  |  |  |                         </el-table-column> | 
					
						
							|  |  |  |  |                         <el-table-column prop="purchaseQuantity" label="购买数量"> | 
					
						
							|  |  |  |  |                             <template #default="scope"> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                                 <el-input v-model="scope.row.purchaseQuantity" placeholder="请填写" type="number" @change="calculateTotalPrice(scope.row)" /> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                             </template> | 
					
						
							|  |  |  |  |                         </el-table-column> | 
					
						
							|  |  |  |  |                         <el-table-column prop="unit" label="单位"> | 
					
						
							|  |  |  |  |                             <template #default="scope"> | 
					
						
							|  |  |  |  |                                 <el-input v-model="scope.row.unit" placeholder="请填写" /> | 
					
						
							|  |  |  |  |                             </template> | 
					
						
							|  |  |  |  |                         </el-table-column> | 
					
						
							|  |  |  |  |                         <el-table-column prop="totalPrice" label="合计" :formatter="calculateTotalPrice"> | 
					
						
							|  |  |  |  |                             <template #default="scope"> | 
					
						
							|  |  |  |  |                                 <span>{{ calculateTotalPrice(scope.row) }}</span> | 
					
						
							|  |  |  |  |                             </template> | 
					
						
							|  |  |  |  |                         </el-table-column> | 
					
						
							|  |  |  |  |                         <el-table-column label="操作" fixed="right" width="80"> | 
					
						
							|  |  |  |  |                             <template #default="scope"> | 
					
						
							|  |  |  |  |                                 <el-button type="text" @click="removeProduct(scope.$index)"
 | 
					
						
							|  |  |  |  |                                     :disabled="newProcurementForm.products.length <= 1">删除</el-button> | 
					
						
							|  |  |  |  |                             </template> | 
					
						
							|  |  |  |  |                         </el-table-column> | 
					
						
							|  |  |  |  |                     </el-table> | 
					
						
							|  |  |  |  |                     <el-button type="primary" size="small" @click="addProduct" style="margin-top: 10px">添加产品</el-button> | 
					
						
							|  |  |  |  |                 </div> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 <!-- 合同条款 --> | 
					
						
							|  |  |  |  |                 <div class="form-section"> | 
					
						
							|  |  |  |  |                     <h3>合同条款</h3> | 
					
						
							|  |  |  |  |                     <el-row :gutter="20"> | 
					
						
							|  |  |  |  |                         <el-col :span="6"> | 
					
						
							|  |  |  |  |                             <el-form-item label="付款条件"> | 
					
						
							|  |  |  |  |                                 <el-select v-model="newProcurementForm.paymentTerms" placeholder="请选择"> | 
					
						
							|  |  |  |  |                                     <el-option label="请选择" value="" /> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                                     <el-option v-for="option in wz_payment_terms" :key="option.value" :label="option.label" :value="option.value" /> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                                 </el-select> | 
					
						
							|  |  |  |  |                             </el-form-item> | 
					
						
							|  |  |  |  |                         </el-col> | 
					
						
							|  |  |  |  |                         <el-col :span="6"> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                             <el-form-item label="发票开具方式"> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                                 <el-select v-model="newProcurementForm.settlementMethod" placeholder="请选择"> | 
					
						
							|  |  |  |  |                                     <el-option label="请选择" value="" /> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |                                     <el-option v-for="option in wz_invoicing_way" :key="option.value" :label="option.label" :value="option.value" /> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |                                 </el-select> | 
					
						
							|  |  |  |  |                             </el-form-item> | 
					
						
							|  |  |  |  |                         </el-col> | 
					
						
							|  |  |  |  |                     </el-row> | 
					
						
							|  |  |  |  |                 </div> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 <!-- 附件上传 --> | 
					
						
							|  |  |  |  |                 <div class="form-section"> | 
					
						
							|  |  |  |  |                     <h3>附件上传</h3> | 
					
						
							|  |  |  |  |                     <div class="upload-section"> | 
					
						
							|  |  |  |  |                         <el-upload class="upload-demo" action="" :on-preview="handlePreview" :on-remove="handleRemove" | 
					
						
							|  |  |  |  |                             :before-remove="beforeRemove" multiple :limit="5" :on-exceed="handleExceed" | 
					
						
							|  |  |  |  |                             :file-list="newProcurementForm.fileList" list-type="text"> | 
					
						
							|  |  |  |  |                             <el-button type="primary" :icon="Upload">上传文件</el-button> | 
					
						
							|  |  |  |  |                             <template #tip> | 
					
						
							|  |  |  |  |                                 <div class="el-upload__tip"> | 
					
						
							|  |  |  |  |                                     请将文件拖到此处,或点击上传<br> | 
					
						
							|  |  |  |  |                                     最多上传5个文件,单个文件大小不超过20M | 
					
						
							|  |  |  |  |                                 </div> | 
					
						
							|  |  |  |  |                             </template> | 
					
						
							|  |  |  |  |                         </el-upload> | 
					
						
							|  |  |  |  |                     </div> | 
					
						
							|  |  |  |  |                 </div> | 
					
						
							|  |  |  |  |             </div> | 
					
						
							|  |  |  |  |             <template #footer> | 
					
						
							|  |  |  |  |                 <div class="dialog-footer"> | 
					
						
							|  |  |  |  |                     <el-button @click="cancelNewProcurement">取消</el-button> | 
					
						
							|  |  |  |  |                     <el-button @click="saveDraft">保存草稿</el-button> | 
					
						
							|  |  |  |  |                     <el-button type="primary" @click="submitProcurement">提交申请</el-button> | 
					
						
							|  |  |  |  |                 </div> | 
					
						
							|  |  |  |  |             </template> | 
					
						
							|  |  |  |  |         </el-dialog> | 
					
						
							|  |  |  |  |     </div> | 
					
						
							|  |  |  |  | </template> | 
					
						
							|  |  |  |  | <style sc oped lang="scss"> | 
					
						
							|  |  |  |  | .procurementPlan { | 
					
						
							|  |  |  |  |     background-color: #F2F8FC; | 
					
						
							|  |  |  |  |     padding: 20px; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | .img { | 
					
						
							|  |  |  |  |     img { | 
					
						
							|  |  |  |  |         display: block; | 
					
						
							|  |  |  |  |         width: 80px; | 
					
						
							|  |  |  |  |         height: 80px; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | .item { | 
					
						
							|  |  |  |  |     text-align: center; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     .text { | 
					
						
							|  |  |  |  |         font-size: 14px; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     .count { | 
					
						
							|  |  |  |  |         font-size: 25px; | 
					
						
							|  |  |  |  |         font-weight: 600; | 
					
						
							|  |  |  |  |         text-align: left; | 
					
						
							|  |  |  |  |         margin-top: 10px; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | .tabs { | 
					
						
							|  |  |  |  |     display: flex; | 
					
						
							|  |  |  |  |     gap: 10px; | 
					
						
							|  |  |  |  |     padding: 10px 0; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | .content { | 
					
						
							|  |  |  |  |     padding: 10px 0; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /* 分页区域样式 */ | 
					
						
							|  |  |  |  | .pagination-section { | 
					
						
							|  |  |  |  |     background-color: #fff; | 
					
						
							|  |  |  |  |     border-radius: 8px; | 
					
						
							|  |  |  |  |     display: flex; | 
					
						
							|  |  |  |  |     justify-content: flex-end; | 
					
						
							|  |  |  |  |     align-items: center; | 
					
						
							|  |  |  |  |     margin-top: 15px; | 
					
						
							|  |  |  |  |     padding: 10px 0; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | .pagination-controls .el-pagination { | 
					
						
							|  |  |  |  |     margin: 0; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | .pagination-controls .el-pagination button { | 
					
						
							|  |  |  |  |     min-width: 32px; | 
					
						
							|  |  |  |  |     height: 32px; | 
					
						
							|  |  |  |  |     line-height: 32px; | 
					
						
							|  |  |  |  |     border-radius: 4px; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | .pagination-controls .el-pagination .el-pager li { | 
					
						
							|  |  |  |  |     min-width: 32px; | 
					
						
							|  |  |  |  |     height: 32px; | 
					
						
							|  |  |  |  |     line-height: 32px; | 
					
						
							|  |  |  |  |     border-radius: 4px; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | .pagination-controls .el-pagination .el-pager li.active { | 
					
						
							|  |  |  |  |     background-color: #409eff; | 
					
						
							|  |  |  |  |     color: #fff; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | </style> | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  | <script setup lang="ts"> | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  | import { ref, reactive, computed } from 'vue'; | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  | import { useRouter } from 'vue-router'; | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  | import { Upload } from '@element-plus/icons-vue'; | 
					
						
							|  |  |  |  | import { ElMessage, ElMessageBox } from 'element-plus'; | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  | import { useProcurementDraftStore } from '@/store/modules/procurementDraft'; | 
					
						
							|  |  |  |  | const { proxy } = getCurrentInstance() as ComponentInternalInstance; | 
					
						
							|  |  |  |  | const { wz_invoicing_way,wz_payment_terms,wz_purchase_type,wz_contract_type} = toRefs<any>(proxy?.useDict('wz_invoicing_way','wz_payment_terms','wz_purchase_type','wz_contract_type')); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  | const router = useRouter(); | 
					
						
							|  |  |  |  | // 新建采购申请单对话框是否可见
 | 
					
						
							|  |  |  |  | const isNewProcurementDialogVisible = ref(false); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 当前激活的标签页
 | 
					
						
							|  |  |  |  | const activeTab = ref('pending'); | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | // 计算各状态的数量
 | 
					
						
							|  |  |  |  | const pendingCount = computed(() => { | 
					
						
							|  |  |  |  |     return tableData.value.filter(item => item.status === '待审批').length; | 
					
						
							|  |  |  |  | }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const purchasingCount = computed(() => { | 
					
						
							|  |  |  |  |     return tableData.value.filter(item => item.status === '采购中').length; | 
					
						
							|  |  |  |  | }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const rejectedCount = computed(() => { | 
					
						
							|  |  |  |  |     return tableData.value.filter(item => item.status === '未通过').length; | 
					
						
							|  |  |  |  | }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const approvedCount = computed(() => { | 
					
						
							|  |  |  |  |     return tableData.value.filter(item => item.status === '已通过').length; | 
					
						
							|  |  |  |  | }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const completedCount = computed(() => { | 
					
						
							|  |  |  |  |     return tableData.value.filter(item => item.status === '已完成').length; | 
					
						
							|  |  |  |  | }); | 
					
						
							|  |  |  |  | // 下拉框选项数据
 | 
					
						
							|  |  |  |  | const contractAddressOptions = [ | 
					
						
							|  |  |  |  |     { label: '主仓库', value: 'main' }, | 
					
						
							|  |  |  |  |     { label: '一号仓库', value: 'warehouse1' }, | 
					
						
							|  |  |  |  |     { label: '二号仓库', value: 'warehouse2' }, | 
					
						
							|  |  |  |  |     { label: '三号仓库', value: 'warehouse3' }, | 
					
						
							|  |  |  |  |     { label: '车间仓库', value: 'workshop' } | 
					
						
							|  |  |  |  | ]; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const supplierUnitOptions = [ | 
					
						
							|  |  |  |  |     { label: '供应商A', value: 'supplierA' }, | 
					
						
							|  |  |  |  |     { label: '供应商B', value: 'supplierB' }, | 
					
						
							|  |  |  |  |     { label: '供应商C', value: 'supplierC' }, | 
					
						
							|  |  |  |  |     { label: '供应商D', value: 'supplierD' }, | 
					
						
							|  |  |  |  |     { label: '供应商E', value: 'supplierE' } | 
					
						
							|  |  |  |  | ]; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  | // 新建采购申请单表单数据
 | 
					
						
							|  |  |  |  | const newProcurementForm = reactive({ | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |     planName: '', | 
					
						
							|  |  |  |  |     contractName: '', | 
					
						
							|  |  |  |  |     contractType: '', | 
					
						
							|  |  |  |  |     procurementType: '', | 
					
						
							|  |  |  |  |     contractAddress: '', | 
					
						
							|  |  |  |  |     supplierUnit: '', | 
					
						
							|  |  |  |  |     deliveryTime: '', | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |     paymentTerms: '', | 
					
						
							|  |  |  |  |     settlementMethod: '', | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |     products: [{ | 
					
						
							|  |  |  |  |         productName: '', | 
					
						
							|  |  |  |  |         productModel: '', | 
					
						
							|  |  |  |  |         productPrice: '', | 
					
						
							|  |  |  |  |         purchaseQuantity: '', | 
					
						
							|  |  |  |  |         unit: '' | 
					
						
							|  |  |  |  |     }], | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |     fileList: [] | 
					
						
							|  |  |  |  | }); | 
					
						
							|  |  |  |  | // 表格数据
 | 
					
						
							|  |  |  |  | const tableData = ref([ | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |         planNumber: 'PLAN-2023-0615-001', | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |         planName: 'Q2风电轴承采购计划', | 
					
						
							|  |  |  |  |         equipmentType: '风电设备', | 
					
						
							|  |  |  |  |         requestDept: '运维部', | 
					
						
							|  |  |  |  |         applicant: '王主管', | 
					
						
							|  |  |  |  |         requestDate: '2023-06-15 10:30', | 
					
						
							|  |  |  |  |         estimatedAmount: '300,000.00', | 
					
						
							|  |  |  |  |         status: '待审批' | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |         planNumber: 'PLAN-2023-0615-002', | 
					
						
							|  |  |  |  |         planName: '发电机维修备件采购', | 
					
						
							|  |  |  |  |         equipmentType: '发电设备', | 
					
						
							|  |  |  |  |         requestDept: '维修部', | 
					
						
							|  |  |  |  |         applicant: '李工程师', | 
					
						
							|  |  |  |  |         requestDate: '2023-06-16 09:15', | 
					
						
							|  |  |  |  |         estimatedAmount: '150,000.00', | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |         status: '待审批' | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         planNumber: 'PLAN-2023-0615-003', | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |         planName: 'Q2润滑油采购计划', | 
					
						
							|  |  |  |  |         equipmentType: '通用设备', | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |         requestDept: '运维部', | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |         applicant: '张助理', | 
					
						
							|  |  |  |  |         requestDate: '2023-06-17 14:20', | 
					
						
							|  |  |  |  |         estimatedAmount: '50,000.00', | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |         status: '待审批' | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |         planNumber: 'PLAN-2023-0614-004', | 
					
						
							|  |  |  |  |         planName: '液压系统配件采购', | 
					
						
							|  |  |  |  |         equipmentType: '液压设备', | 
					
						
							|  |  |  |  |         requestDept: '工程部', | 
					
						
							|  |  |  |  |         applicant: '赵经理', | 
					
						
							|  |  |  |  |         requestDate: '2023-06-14 11:45', | 
					
						
							|  |  |  |  |         estimatedAmount: '220,000.00', | 
					
						
							|  |  |  |  |         status: '采购中' | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |     }, | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |         planNumber: 'PLAN-2023-0613-005', | 
					
						
							|  |  |  |  |         planName: '控制面板更新采购', | 
					
						
							|  |  |  |  |         equipmentType: '电气设备', | 
					
						
							|  |  |  |  |         requestDept: '电气部', | 
					
						
							|  |  |  |  |         applicant: '陈工程师', | 
					
						
							|  |  |  |  |         requestDate: '2023-06-13 16:10', | 
					
						
							|  |  |  |  |         estimatedAmount: '180,000.00', | 
					
						
							|  |  |  |  |         status: '采购中' | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |     }, | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |         planNumber: 'PLAN-2023-0612-006', | 
					
						
							|  |  |  |  |         planName: '安全防护装备采购', | 
					
						
							|  |  |  |  |         equipmentType: '安全设备', | 
					
						
							|  |  |  |  |         requestDept: '安全部', | 
					
						
							|  |  |  |  |         applicant: '孙主管', | 
					
						
							|  |  |  |  |         requestDate: '2023-06-12 08:50', | 
					
						
							|  |  |  |  |         estimatedAmount: '80,000.00', | 
					
						
							|  |  |  |  |         status: '未通过' | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |     }, | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |         planNumber: 'PLAN-2023-0611-007', | 
					
						
							|  |  |  |  |         planName: '水泵维修配件采购', | 
					
						
							|  |  |  |  |         equipmentType: '水处理设备', | 
					
						
							|  |  |  |  |         requestDept: '水处理部', | 
					
						
							|  |  |  |  |         applicant: '周工程师', | 
					
						
							|  |  |  |  |         requestDate: '2023-06-11 13:30', | 
					
						
							|  |  |  |  |         estimatedAmount: '60,000.00', | 
					
						
							|  |  |  |  |         status: '已通过' | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |     }, | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |         planNumber: 'PLAN-2023-0610-008', | 
					
						
							|  |  |  |  |         planName: '风机叶片检测设备采购', | 
					
						
							|  |  |  |  |         equipmentType: '检测设备', | 
					
						
							|  |  |  |  |         requestDept: '质检部', | 
					
						
							|  |  |  |  |         applicant: '吴经理', | 
					
						
							|  |  |  |  |         requestDate: '2023-06-10 10:20', | 
					
						
							|  |  |  |  |         estimatedAmount: '450,000.00', | 
					
						
							|  |  |  |  |         status: '已通过' | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |     }, | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |         planNumber: 'PLAN-2023-0609-009', | 
					
						
							|  |  |  |  |         planName: '仓库货架更新采购', | 
					
						
							|  |  |  |  |         equipmentType: '仓储设备', | 
					
						
							|  |  |  |  |         requestDept: '仓储部', | 
					
						
							|  |  |  |  |         applicant: '郑主管', | 
					
						
							|  |  |  |  |         requestDate: '2023-06-09 15:40', | 
					
						
							|  |  |  |  |         estimatedAmount: '90,000.00', | 
					
						
							|  |  |  |  |         status: '已完成' | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |     }, | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |         planNumber: 'PLAN-2023-0608-010', | 
					
						
							|  |  |  |  |         planName: '办公设备更新采购', | 
					
						
							|  |  |  |  |         equipmentType: '办公设备', | 
					
						
							|  |  |  |  |         requestDept: '行政部', | 
					
						
							|  |  |  |  |         applicant: '冯助理', | 
					
						
							|  |  |  |  |         requestDate: '2023-06-08 11:10', | 
					
						
							|  |  |  |  |         estimatedAmount: '120,000.00', | 
					
						
							|  |  |  |  |         status: '已完成' | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |     }, | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |         planNumber: 'PLAN-2023-0607-011', | 
					
						
							|  |  |  |  |         planName: '消防设备年检采购', | 
					
						
							|  |  |  |  |         equipmentType: '消防设备', | 
					
						
							|  |  |  |  |         requestDept: '安全部', | 
					
						
							|  |  |  |  |         applicant: '蒋经理', | 
					
						
							|  |  |  |  |         requestDate: '2023-06-07 09:30', | 
					
						
							|  |  |  |  |         estimatedAmount: '40,000.00', | 
					
						
							|  |  |  |  |         status: '已完成' | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |     }, | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  |         planNumber: 'PLAN-2023-0606-012', | 
					
						
							|  |  |  |  |         planName: '网络设备升级采购', | 
					
						
							|  |  |  |  |         equipmentType: 'IT设备', | 
					
						
							|  |  |  |  |         requestDept: 'IT部', | 
					
						
							|  |  |  |  |         applicant: '沈工程师', | 
					
						
							|  |  |  |  |         requestDate: '2023-06-06 14:50', | 
					
						
							|  |  |  |  |         estimatedAmount: '160,000.00', | 
					
						
							|  |  |  |  |         status: '已完成' | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | ]); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 分页相关
 | 
					
						
							|  |  |  |  | const currentPage = ref(1); | 
					
						
							|  |  |  |  | const pageSize = ref(10); | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  | const total = computed(() => filteredTableData.value.length); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 状态映射关系
 | 
					
						
							|  |  |  |  | const statusMap = { | 
					
						
							|  |  |  |  |     pending: '待审批', | 
					
						
							|  |  |  |  |     purchasing: '采购中', | 
					
						
							|  |  |  |  |     rejected: '未通过', | 
					
						
							|  |  |  |  |     approved: '已通过', | 
					
						
							|  |  |  |  |     completed: '已完成' | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 根据activeTab筛选后的数据
 | 
					
						
							|  |  |  |  | const filteredTableData = computed(() => { | 
					
						
							|  |  |  |  |     if (activeTab.value === 'all') { | 
					
						
							|  |  |  |  |         return tableData.value; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     return tableData.value.filter(item => item.status === statusMap[activeTab.value]); | 
					
						
							|  |  |  |  | }); | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | // 切换标签页
 | 
					
						
							|  |  |  |  | const changeTab = (tab) => { | 
					
						
							|  |  |  |  |     activeTab.value = tab; | 
					
						
							|  |  |  |  |     currentPage.value = 1; // 切换标签页时重置到第一页
 | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 获取状态标签类型
 | 
					
						
							|  |  |  |  | const getStatusTagType = (status) => { | 
					
						
							|  |  |  |  |     switch (status) { | 
					
						
							|  |  |  |  |         case '待审批': | 
					
						
							|  |  |  |  |             return 'warning'; | 
					
						
							|  |  |  |  |         case '采购中': | 
					
						
							|  |  |  |  |             return 'info'; | 
					
						
							|  |  |  |  |         case '未通过': | 
					
						
							|  |  |  |  |             return 'danger'; | 
					
						
							|  |  |  |  |         case '已通过': | 
					
						
							|  |  |  |  |             return 'primary'; | 
					
						
							|  |  |  |  |         case '已完成': | 
					
						
							|  |  |  |  |             return 'success'; | 
					
						
							|  |  |  |  |         default: | 
					
						
							|  |  |  |  |             return ''; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 查看详情
 | 
					
						
							|  |  |  |  | const handleView = (row) => { | 
					
						
							|  |  |  |  |     console.log('查看采购计划详情:', row); | 
					
						
							|  |  |  |  |     router.push({ | 
					
						
							|  |  |  |  |         path: '/materialManagement/planDetails', | 
					
						
							|  |  |  |  |         query: { | 
					
						
							|  |  |  |  |             planNumber: row.planNumber | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     }); | 
					
						
							|  |  |  |  |     // 这里可以实现查看详情的逻辑,比如打开详情弹窗或跳转到详情页
 | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 分页大小变化
 | 
					
						
							|  |  |  |  | const handleSizeChange = (size) => { | 
					
						
							|  |  |  |  |     pageSize.value = size; | 
					
						
							|  |  |  |  |     currentPage.value = 1; | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 当前页码变化
 | 
					
						
							|  |  |  |  | const handleCurrentChange = (current) => { | 
					
						
							|  |  |  |  |     currentPage.value = current; | 
					
						
							|  |  |  |  | }; | 
					
						
							| 
									
										
										
										
											2025-09-24 20:06:58 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | // 计算产品总价
 | 
					
						
							|  |  |  |  | const calculateTotalPrice = (row) => { | 
					
						
							|  |  |  |  |     if (!row.productPrice || !row.purchaseQuantity) { | 
					
						
							|  |  |  |  |         return '0.00'; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     const price = parseFloat(row.productPrice); | 
					
						
							|  |  |  |  |     const quantity = parseInt(row.purchaseQuantity); | 
					
						
							|  |  |  |  |     if (isNaN(price) || isNaN(quantity)) { | 
					
						
							|  |  |  |  |         return '0.00'; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     return (price * quantity).toFixed(2); | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 添加产品
 | 
					
						
							|  |  |  |  | const addProduct = () => { | 
					
						
							|  |  |  |  |     newProcurementForm.products.push({ | 
					
						
							|  |  |  |  |         productName: '', | 
					
						
							|  |  |  |  |         productModel: '', | 
					
						
							|  |  |  |  |         productPrice: '', | 
					
						
							|  |  |  |  |         purchaseQuantity: '', | 
					
						
							|  |  |  |  |         unit: '' | 
					
						
							|  |  |  |  |     }); | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 删除产品
 | 
					
						
							|  |  |  |  | const removeProduct = (index) => { | 
					
						
							|  |  |  |  |     if (newProcurementForm.products.length <= 1) { | 
					
						
							|  |  |  |  |         ElMessage({ message: '至少保留一个产品信息', type: 'warning' }); | 
					
						
							|  |  |  |  |         return; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     newProcurementForm.products.splice(index, 1); | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 重置新建采购申请表单
 | 
					
						
							|  |  |  |  | const resetNewProcurementForm = () => { | 
					
						
							|  |  |  |  |     newProcurementForm.planName = ''; | 
					
						
							|  |  |  |  |     newProcurementForm.contractName = ''; | 
					
						
							|  |  |  |  |     newProcurementForm.contractType = ''; | 
					
						
							|  |  |  |  |     newProcurementForm.procurementType = ''; | 
					
						
							|  |  |  |  |     newProcurementForm.contractAddress = ''; | 
					
						
							|  |  |  |  |     newProcurementForm.supplierUnit = ''; | 
					
						
							|  |  |  |  |     newProcurementForm.deliveryTime = ''; | 
					
						
							|  |  |  |  |     newProcurementForm.paymentTerms = ''; | 
					
						
							|  |  |  |  |     newProcurementForm.settlementMethod = ''; | 
					
						
							|  |  |  |  |     newProcurementForm.products = [{ | 
					
						
							|  |  |  |  |         productName: '', | 
					
						
							|  |  |  |  |         productModel: '', | 
					
						
							|  |  |  |  |         productPrice: '', | 
					
						
							|  |  |  |  |         purchaseQuantity: '', | 
					
						
							|  |  |  |  |         unit: '' | 
					
						
							|  |  |  |  |     }]; | 
					
						
							|  |  |  |  |     newProcurementForm.fileList = []; | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 取消新建采购申请
 | 
					
						
							|  |  |  |  | const cancelNewProcurement = () => { | 
					
						
							|  |  |  |  |     // 检查是否有未保存的内容
 | 
					
						
							|  |  |  |  |     const hasContent = Object.values(newProcurementForm).some(value => { | 
					
						
							|  |  |  |  |         if (Array.isArray(value)) { | 
					
						
							|  |  |  |  |             return value.length > 0 &&  | 
					
						
							|  |  |  |  |                    value.some(item =>  | 
					
						
							|  |  |  |  |                        typeof item === 'object' &&  | 
					
						
							|  |  |  |  |                        Object.values(item).some(v => v) | 
					
						
							|  |  |  |  |                    ); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |         return !!value; | 
					
						
							|  |  |  |  |     }); | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     if (hasContent) { | 
					
						
							|  |  |  |  |         ElMessageBox.confirm('表单内容尚未保存,确定要关闭吗?', '提示', { | 
					
						
							|  |  |  |  |             confirmButtonText: '确定', | 
					
						
							|  |  |  |  |             cancelButtonText: '取消', | 
					
						
							|  |  |  |  |             type: 'warning' | 
					
						
							|  |  |  |  |         }).then(() => { | 
					
						
							|  |  |  |  |             resetNewProcurementForm(); | 
					
						
							|  |  |  |  |             isNewProcurementDialogVisible.value = false; | 
					
						
							|  |  |  |  |         }); | 
					
						
							|  |  |  |  |     } else { | 
					
						
							|  |  |  |  |         resetNewProcurementForm(); | 
					
						
							|  |  |  |  |         isNewProcurementDialogVisible.value = false; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 草稿校验函数
 | 
					
						
							|  |  |  |  | const validateDraft = () => { | 
					
						
							|  |  |  |  |     // 草稿只需要计划名称作为必填项
 | 
					
						
							|  |  |  |  |     if (!newProcurementForm.planName.trim()) { | 
					
						
							|  |  |  |  |         ElMessage({ message: '请填写计划名称', type: 'error' }); | 
					
						
							|  |  |  |  |         return false; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     // 检查已填写的产品信息的有效性
 | 
					
						
							|  |  |  |  |     for (let i = 0; i < newProcurementForm.products.length; i++) { | 
					
						
							|  |  |  |  |         const product = newProcurementForm.products[i]; | 
					
						
							|  |  |  |  |         if (product.productName && !product.productModel) { | 
					
						
							|  |  |  |  |             ElMessage({ message: `第${i + 1}行产品:填写了产品名称,请也填写产品型号`, type: 'warning' }); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |         if (product.productPrice && parseFloat(product.productPrice) <= 0) { | 
					
						
							|  |  |  |  |             ElMessage({ message: `第${i + 1}行产品:产品单价应大于0`, type: 'warning' }); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |         if (product.purchaseQuantity && parseInt(product.purchaseQuantity) <= 0) { | 
					
						
							|  |  |  |  |             ElMessage({ message: `第${i + 1}行产品:购买数量应大于0`, type: 'warning' }); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     return true; | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 保存草稿
 | 
					
						
							|  |  |  |  | const saveDraft = () => { | 
					
						
							|  |  |  |  |     // 验证草稿
 | 
					
						
							|  |  |  |  |     if (!validateDraft()) { | 
					
						
							|  |  |  |  |         return; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     // 使用pinia store保存草稿
 | 
					
						
							|  |  |  |  |     const draftStore = useProcurementDraftStore(); | 
					
						
							|  |  |  |  |     const savedDraft = draftStore.saveDraft(newProcurementForm.planName, newProcurementForm); | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     console.log('保存草稿:', { | 
					
						
							|  |  |  |  |         draftNumber: savedDraft.draftNumber, | 
					
						
							|  |  |  |  |         saveTime: savedDraft.saveTime, | 
					
						
							|  |  |  |  |         content: savedDraft.content | 
					
						
							|  |  |  |  |     }); | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     ElMessage({ message: `草稿已成功保存(编号:${savedDraft.draftNumber}),您可以在草稿箱中查看`, type: 'success' }); | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 表单校验函数
 | 
					
						
							|  |  |  |  | const validateForm = () => { | 
					
						
							|  |  |  |  |     // 基础信息校验
 | 
					
						
							|  |  |  |  |     if (!newProcurementForm.planName.trim()) { | 
					
						
							|  |  |  |  |         ElMessage({ message: '请填写计划名称', type: 'error' }); | 
					
						
							|  |  |  |  |         return false; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     if (!newProcurementForm.contractName.trim()) { | 
					
						
							|  |  |  |  |         ElMessage({ message: '请填写合同名称', type: 'error' }); | 
					
						
							|  |  |  |  |         return false; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     if (!newProcurementForm.contractType) { | 
					
						
							|  |  |  |  |         ElMessage({ message: '请选择合同类型', type: 'error' }); | 
					
						
							|  |  |  |  |         return false; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     if (!newProcurementForm.procurementType) { | 
					
						
							|  |  |  |  |         ElMessage({ message: '请选择采购类型', type: 'error' }); | 
					
						
							|  |  |  |  |         return false; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     if (!newProcurementForm.contractAddress) { | 
					
						
							|  |  |  |  |         ElMessage({ message: '请选择仓库地址', type: 'error' }); | 
					
						
							|  |  |  |  |         return false; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     if (!newProcurementForm.supplierUnit) { | 
					
						
							|  |  |  |  |         ElMessage({ message: '请选择供应商单位', type: 'error' }); | 
					
						
							|  |  |  |  |         return false; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     // 产品信息校验
 | 
					
						
							|  |  |  |  |     const hasValidProduct = newProcurementForm.products.some(product => { | 
					
						
							|  |  |  |  |         return product.productName &&  | 
					
						
							|  |  |  |  |                product.productModel &&  | 
					
						
							|  |  |  |  |                product.productPrice && parseFloat(product.productPrice) > 0 &&  | 
					
						
							|  |  |  |  |                product.purchaseQuantity && parseInt(product.purchaseQuantity) > 0 &&  | 
					
						
							|  |  |  |  |                product.unit; | 
					
						
							|  |  |  |  |     }); | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     if (!hasValidProduct) { | 
					
						
							|  |  |  |  |         ElMessage({ message: '请至少填写一个有效的产品信息', type: 'error' }); | 
					
						
							|  |  |  |  |         return false; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     // 检查每个产品的有效性
 | 
					
						
							|  |  |  |  |     for (let i = 0; i < newProcurementForm.products.length; i++) { | 
					
						
							|  |  |  |  |         const product = newProcurementForm.products[i]; | 
					
						
							|  |  |  |  |         if (product.productName || product.productModel || product.productPrice || product.purchaseQuantity || product.unit) { | 
					
						
							|  |  |  |  |             if (!product.productName) { | 
					
						
							|  |  |  |  |                 ElMessage({ message: `第${i + 1}行产品:请填写产品名称`, type: 'error' }); | 
					
						
							|  |  |  |  |                 return false; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             if (!product.productModel) { | 
					
						
							|  |  |  |  |                 ElMessage({ message: `第${i + 1}行产品:请填写产品型号`, type: 'error' }); | 
					
						
							|  |  |  |  |                 return false; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             if (!product.productPrice) { | 
					
						
							|  |  |  |  |                 ElMessage({ message: `第${i + 1}行产品:请填写产品单价`, type: 'error' }); | 
					
						
							|  |  |  |  |                 return false; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             if (parseFloat(product.productPrice) <= 0) { | 
					
						
							|  |  |  |  |                 ElMessage({ message: `第${i + 1}行产品:产品单价必须大于0`, type: 'error' }); | 
					
						
							|  |  |  |  |                 return false; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             if (!product.purchaseQuantity) { | 
					
						
							|  |  |  |  |                 ElMessage({ message: `第${i + 1}行产品:请填写购买数量`, type: 'error' }); | 
					
						
							|  |  |  |  |                 return false; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             if (parseInt(product.purchaseQuantity) <= 0) { | 
					
						
							|  |  |  |  |                 ElMessage({ message: `第${i + 1}行产品:购买数量必须大于0`, type: 'error' }); | 
					
						
							|  |  |  |  |                 return false; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             if (!product.unit) { | 
					
						
							|  |  |  |  |                 ElMessage({ message: `第${i + 1}行产品:请填写单位`, type: 'error' }); | 
					
						
							|  |  |  |  |                 return false; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     return true; | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 提交申请
 | 
					
						
							|  |  |  |  | const submitProcurement = () => { | 
					
						
							|  |  |  |  |     // 表单验证
 | 
					
						
							|  |  |  |  |     if (!validateForm()) { | 
					
						
							|  |  |  |  |         return; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     // 确认提交
 | 
					
						
							|  |  |  |  |     ElMessageBox.confirm('确定要提交采购申请单吗?提交后将进入审批流程,不可撤销。', '确认提交', { | 
					
						
							|  |  |  |  |         confirmButtonText: '确认提交', | 
					
						
							|  |  |  |  |         cancelButtonText: '取消', | 
					
						
							|  |  |  |  |         type: 'warning' | 
					
						
							|  |  |  |  |     }).then(() => { | 
					
						
							|  |  |  |  |         // 计算总金额
 | 
					
						
							|  |  |  |  |         const totalAmount = newProcurementForm.products.reduce((sum, product) => { | 
					
						
							|  |  |  |  |             const price = parseFloat(product.productPrice) || 0; | 
					
						
							|  |  |  |  |             const quantity = parseInt(product.purchaseQuantity) || 0; | 
					
						
							|  |  |  |  |             return sum + (price * quantity); | 
					
						
							|  |  |  |  |         }, 0); | 
					
						
							|  |  |  |  |          | 
					
						
							|  |  |  |  |         // 生成计划编号
 | 
					
						
							|  |  |  |  |         const today = new Date(); | 
					
						
							|  |  |  |  |         const dateStr = today.getFullYear() + '-' +  | 
					
						
							|  |  |  |  |                        String(today.getMonth() + 1).padStart(2, '0') + '-' +  | 
					
						
							|  |  |  |  |                        String(today.getDate()).padStart(2, '0'); | 
					
						
							|  |  |  |  |         const randomNum = Math.floor(100 + Math.random() * 900); | 
					
						
							|  |  |  |  |         const planNumber = `PLAN-${dateStr}-${randomNum}`; | 
					
						
							|  |  |  |  |          | 
					
						
							|  |  |  |  |         // 模拟提交数据
 | 
					
						
							|  |  |  |  |         const newPlan = { | 
					
						
							|  |  |  |  |             planNumber: planNumber, | 
					
						
							|  |  |  |  |             planName: newProcurementForm.planName, | 
					
						
							|  |  |  |  |             equipmentType: newProcurementForm.procurementType, | 
					
						
							|  |  |  |  |             requestDept: '当前部门', | 
					
						
							|  |  |  |  |             applicant: '当前用户', | 
					
						
							|  |  |  |  |             requestDate: new Date().toLocaleString(), | 
					
						
							|  |  |  |  |             estimatedAmount: totalAmount.toFixed(2), | 
					
						
							|  |  |  |  |             status: '待审批' | 
					
						
							|  |  |  |  |         }; | 
					
						
							|  |  |  |  |          | 
					
						
							|  |  |  |  |         // 添加到表格数据中
 | 
					
						
							|  |  |  |  |         tableData.value.unshift(newPlan); | 
					
						
							|  |  |  |  |          | 
					
						
							|  |  |  |  |         ElMessage({ message: '采购申请单已成功提交,等待审批!', type: 'success' }); | 
					
						
							|  |  |  |  |          | 
					
						
							|  |  |  |  |         // 关闭对话框并重置表单
 | 
					
						
							|  |  |  |  |         resetNewProcurementForm(); | 
					
						
							|  |  |  |  |         isNewProcurementDialogVisible.value = false; | 
					
						
							|  |  |  |  |     }).catch(() => { | 
					
						
							|  |  |  |  |         // 用户取消了提交
 | 
					
						
							|  |  |  |  |     }); | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 文件上传相关方法
 | 
					
						
							|  |  |  |  | const handlePreview = (uploadFile) => { | 
					
						
							|  |  |  |  |     console.log('预览文件:', uploadFile); | 
					
						
							|  |  |  |  |     ElMessage({ message: '文件预览功能待实现', type: 'info' }); | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const handleRemove = (uploadFile, uploadFiles) => { | 
					
						
							|  |  |  |  |     console.log('删除文件:', uploadFile); | 
					
						
							|  |  |  |  |     // 从fileList中移除文件
 | 
					
						
							|  |  |  |  |     const index = newProcurementForm.fileList.findIndex(file => file.uid === uploadFile.uid); | 
					
						
							|  |  |  |  |     if (index !== -1) { | 
					
						
							|  |  |  |  |         newProcurementForm.fileList.splice(index, 1); | 
					
						
							|  |  |  |  |         ElMessage({ message: `文件 "${uploadFile.name}" 已移除`, type: 'success' }); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const beforeRemove = (uploadFile, uploadFiles) => { | 
					
						
							|  |  |  |  |     return ElMessageBox.confirm(`确定要删除文件 "${uploadFile.name}" 吗?`, '确认删除', { | 
					
						
							|  |  |  |  |         confirmButtonText: '确认', | 
					
						
							|  |  |  |  |         cancelButtonText: '取消', | 
					
						
							|  |  |  |  |         type: 'warning' | 
					
						
							|  |  |  |  |     }); | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const handleExceed = (files, uploadFiles) => { | 
					
						
							|  |  |  |  |     ElMessage({ message: '最多只能上传5个文件,已自动过滤多余文件', type: 'warning' }); | 
					
						
							|  |  |  |  | }; | 
					
						
							| 
									
										
										
										
											2025-09-20 20:38:57 +08:00
										 |  |  |  | </script> |