# 预售出库单功能实现总结 ## 功能需求 - 缺货商品(库存=0)仍然可以添加到购物车 - 缺货商品应通过**预售出库单**方式处理 - 普通商品正常创建**销售出库单** - 系统需要自动判断并调用正确的API端点 ## 实现方案 ### 1. 收银台前端逻辑修改 (`sy/home.html`) #### 1.1 商品选择逻辑 **原来的限制**:缺货商品禁止添加 ```javascript // ❌ 旧逻辑 if (!item.mdkc || item.mdkc <= 0) { alert('库存不足,无法添加'); return; } ``` **新的逻辑**:允许缺货商品添加,但标记为预售 ```javascript // ✅ 新逻辑 const isPresale = !item.mdkc || item.mdkc <= 0; this.addgoodlist.push({ quantity: 1, isPresale: isPresale, // 标记是否为预售商品 ...item }); if (isPresale) { alert('该商品库存不足,将作为预售商品处理'); } ``` #### 1.2 套装商品逻辑 **原来的限制**:套装中有任何商品缺货,整个套装禁止添加 ```javascript // ❌ 旧逻辑 if (insufficientStock.length > 0) { alert('套装中以下商品库存不足,无法添加到购物车:...'); return; } ``` **新的逻辑**:允许套装添加,标记其中的缺货商品 ```javascript // ✅ 新逻辑 let hasPresaleItem = false; packageItem.wtSptzMxList.forEach((item) => { if (!product || !product.mdkc || product.mdkc < requiredQty) { hasPresaleItem = true; // 标记该套装包含预售商品 } }); // 即使有缺货商品也允许添加 if (hasPresaleItem) { alert('套装中存在库存不足的商品,将作为预售单处理'); } ``` #### 1.3 购物车显示优化 为预售商品显示视觉提示: ```html 预售
``` ### 2. 结算逻辑修改 (`sy/settlement.html`) #### 2.1 普通支付流程 在 `settlementPay()` 方法中: ```javascript // ✅ 检查是否有预售商品 const hasPresaleItem = this.addgoodlist.some(item => item.isPresale); const apiEndpoint = hasPresaleItem ? "/api/Extend/wtysckd" : "/api/Extend/wtxsckd"; const documentType = hasPresaleItem ? '预售出库单' : '销售出库单'; if (hasPresaleItem) { alert('购物车中存在库存不足的商品,将创建' + documentType); } // 调用正确的API端点 axios({ url: this.baseUrl + apiEndpoint, method: 'POST', data: this.info }).then((res) => { if (res.data.code == 200) { window.alert(documentType + '创建成功'); window.location = 'home.html'; } }); ``` #### 2.2 组合支付流程 在 `finalizeComboPayment()` 方法中实现相同的预售判断逻辑。 ### 3. API端点映射 | 商品类型 | 调用端点 | 说明 | |---------|---------|------| | 全部有货 | `/api/Extend/wtxsckd` | 销售出库单 | | 存在缺货 | `/api/Extend/wtysckd` | 预售出库单 | ## 用户体验流程 ``` 用户操作流程: 1. 选择商品(包括缺货商品) ↓ 2. 系统自动检测库存并标记 - 有货商品 → 正常显示 - 缺货商品 → 显示"预售"标签,黄色背景,红色左边框 ↓ 3. 确认收款 ↓ 4. 系统自动判断: - 全部有货 → 创建销售出库单 (wtXsckd) - 存在缺货 → 创建预售出库单 (wtYsckd) ↓ 5. 返回首页,订单已创建 ``` ## 数据结构 购物车商品对象新增字段: ```javascript { id: "product_id", spmc: "商品名称", quantity: 2, lsj: 99.99, mdkc: 0, // 库存 isPresale: true, // ✅ 新增:标记是否为预售商品 ...otherFields } ``` ## 前后端兼容性 - ✅ 后端 `/api/Extend/wtysckd` 和 `/api/Extend/wtxsckd` API 已存在 - ✅ 两个API的数据结构完全相同 - ✅ 前端只是根据商品类型选择调用不同的端点 - ✅ `isPresale` 标记仅用于前端显示,不发送到后端 ## 测试场景 | 场景 | 预期行为 | |------|---------| | 全部商品有货 | 创建销售出库单 | | 部分商品缺货 | 缺货商品标记为"预售",创建预售出库单 | | 套装包含缺货商品 | 套装允许添加,缺货商品标记为预售 | | 组合支付 + 缺货商品 | 调用预售API创建预售出库单 | ## 优势 1. **提升用户体验**:用户无需被库存限制,可以预售缺货商品 2. **流程自动化**:系统自动判断和调用正确的API 3. **数据清晰**:预售商品通过后台预售出库单管理,易于追踪 4. **视觉友好**:预售商品有明显标记,用户一目了然 5. **零对接成本**:完全利用现有的预售出库单API,无需修改后端