更新日期:2026-04-25
涉及模块:进货单、销售单修改、柯沙坡备货单(创建/修改/通知配置)
一、数据库表结构变更
1.1 keshapo_purchase_items 增加 product_id 字段
用于关联 products 表,实现库存扣减与商品同步。
ALTER TABLE keshapo_purchase_items
ADD COLUMN product_id INT DEFAULT NULL AFTER order_id,
ADD KEY idx_product_id (product_id);
1.2 确保 inventory_stock_moves 表存在(由 inventory_lib.php 自动维护)
若手动创建,语句如下:
CREATE TABLE IF NOT EXISTS inventory_stock_moves (
id INT AUTO_INCREMENT PRIMARY KEY,
ref_type VARCHAR(30) NOT NULL,
ref_id INT NOT NULL,
product_id INT NOT NULL,
direction ENUM('IN','OUT') NOT NULL,
quantity INT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_ref (ref_type, ref_id),
KEY idx_product (product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
二、进货单(kd.php)商品入库逻辑
改动说明
- 新增商品自动插入
products 表,单价写入 stock_price(进价)。
- 已有商品若新单价不在历史列表中,以
/ 追加到 stock_price。
- 事务写入
sales_stock 主表 + stock_items 明细表。
- 调用
inventoryApplyPurchase() 增加库存。
核心逻辑
| 步骤 |
操作 |
| 1 |
遍历 $_POST['product'],跳过空名称 |
| 2 |
SELECT product_id, stock_price FROM products WHERE name = ? |
| 3 |
不存在则 INSERT INTO products (name, description, stock_price) |
| 4 |
存在则判断 in_array($item['price'], $currentPrices),追加新价格 |
| 5 |
插入 sales_stock 获取 stock_id |
| 6 |
插入 stock_items 明细 |
| 7 |
inventoryApplyPurchase($pdo, $orderId, $inventoryItems) 加库存 |
三、销售单修改(xg.php)批发价同步逻辑
改动说明
- 销售单单价为批发价,追加到
products.price 字段。
- 不改动
stock_price(进价)字段。
- 新增商品自动插入
products,price 写入批发价。
核心逻辑
| 步骤 |
操作 |
| 1 |
遍历 $_POST['product'],跳过空名称 |
| 2 |
SELECT product_id, price FROM products WHERE name = ? |
| 3 |
不存在则 INSERT INTO products (name, description, price, stock_quantity) |
| 4 |
存在则判断 in_array($unit_price, $currentPrices),追加到 price |
| 5 |
更新 sales_orders 主表 |
| 6 |
删除旧 order_items,插入新明细 |
四、柯沙坡备货单 lib.php 改动
4.1 引入 inventory_lib.php 库存函数
| 函数 |
用途 |
inventoryApplySalesOutbound() |
备货出库,扣减库存 |
inventoryRevertRef() |
撤销旧流水,回滚库存 |
inventoryHasRef() |
检查是否存在库存流水 |
4.2 数量强制整数
keshapoBuildItemsFromPost() 中:
$quantity = (int)($product['quantity'] ?? 0);
4.3 商品同步到 products 表
新增 keshapoSyncProducts() 函数:
| 场景 |
行为 |
| 商品不存在 |
INSERT INTO products (name, description, stock_price, stock_quantity) |
| 商品存在,新单价未记录 |
UPDATE products SET stock_price = CONCAT(stock_price, '/', price) |
| 商品存在,单价已记录 |
仅更新 description |
4.4 创建备货单(keshapoCreateOrder)
| 步骤 |
操作 |
| 1 |
keshapoSyncProducts() 同步商品,获取 productIds |
| 2 |
插入 keshapo_purchase_orders 主表 |
| 3 |
keshapoInsertItems() 插入明细(含 product_id) |
| 4 |
inventoryApplySalesOutbound() 扣减库存 |
4.5 修改备货单(keshapoUpdateOrder)
| 步骤 |
操作 |
| 1 |
读取旧明细,建立 商品名 → outbound_status/outbound_at 映射 |
| 2 |
inventoryRevertRef('sales_out', $orderId) 回滚旧库存 |
| 3 |
更新 keshapo_purchase_orders 主表,重置 prepare_completed = 0 |
| 4 |
删除旧明细,插入新明细 |
| 5 |
商品名相同则保留原 outbound_status 与 outbound_at |
| 6 |
inventoryApplySalesOutbound() 扣减新库存 |
4.6 删除备货单(keshapoDeleteOrder)
| 步骤 |
操作 |
| 1 |
inventoryRevertRef('sales_out', $orderId) 回滚库存 |
| 2 |
DELETE FROM keshapo_purchase_orders WHERE id = ? |
五、前端页面改动
5.1 柯沙坡创建备货单(create.php)
| 改动项 |
原值 |
新值 |
| 数量 input step |
step="0.01" |
step="1" |
| 后端处理 |
原 lib.php 调用 |
内联 keshapoSyncProducts + inventoryApplySalesOutbound 逻辑 |
5.2 柯沙坡修改备货单(edit.php)
| 改动项 |
原值 |
新值 |
| 数量 input step |
step="0.01" |
step="1" |
| 后端处理 |
原 keshapoUpdateOrder |
保留同名商品 outbound_status 状态 |
5.3 柯沙坡通知配置(settings.php)
| 改动项 |
原样式 |
新样式 |
| 按钮容器 |
position: sticky; bottom: 0 |
普通块级,随内容滚动到底部 |
| 容器类名 |
.ab |
删除,改用 .btns |
| 内边距 |
padding: 16px 16px 100px |
padding: 16px 16px 24px |
六、文件对应关系
| 文件路径 |
改动内容 |
/keshapo/lib.php |
新增 keshapoSyncProducts、库存回滚/扣减、状态保留逻辑 |
/keshapo/create.php |
数量 step="1",后端对接 lib.php |
/keshapo/edit.php |
数量 step="1",后端对接 lib.php |
/keshapo/settings.php |
按钮位置改为内容底部 |
/caigou/kd.php |
进货单商品入库、追加进价到 stock_price |
/caigou/xg.php |
销售单修改、追加批发价到 price |
/inventory_lib.php |
库存出入库、回滚、重算函数(已有,无需改动) |
七、SQL 变更汇总(可直接执行)
-- 1. 给 keshapo_purchase_items 增加 product_id 字段
ALTER TABLE keshapo_purchase_items
ADD COLUMN product_id INT DEFAULT NULL AFTER order_id,
ADD KEY idx_product_id (product_id);
-- 2. 确保库存流水表存在(如 inventory_lib.php 未自动创建)
CREATE TABLE IF NOT EXISTS inventory_stock_moves (
id INT AUTO_INCREMENT PRIMARY KEY,
ref_type VARCHAR(30) NOT NULL,
ref_id INT NOT NULL,
product_id INT NOT NULL,
direction ENUM('IN','OUT') NOT NULL,
quantity INT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_ref (ref_type, ref_id),
KEY idx_product (product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
文档结束
说道:这是系统生成的演示评论