请输入
菜单

重算产品总库存数量

下载

一、demo脚本

UPDATE ld_products p
LEFT JOIN (
    SELECT
        a.wareid,
        a.productid,
        a.batchtext,
        SUM(a.inventory_qty) AS inventory_qty
    FROM (
        SELECT
            a.warehouseid AS wareid,
            a.productid,
            a.batchtext,
            a.lastqty AS inventory_qty
        FROM ld_warehousecondtions a
        LEFT JOIN ld_products c ON c.productid=a.productid
        WHERE a.modulename='库存初始化'
            AND a.type='确认初始库存'
        UNION ALL
        SELECT
            a.wareid,
            c.productid,
            c.batchtext,
            c.quantity
        FROM ld_stock a
        LEFT JOIN ld_stockdetail c ON c.id=a.stock_id
        LEFT JOIN ld_products p ON p.productid=c.productid
        WHERE a.deleted=0
            AND a.approvestatus<>'已拒绝'
            AND (
                CASE
                    WHEN EXISTS (SELECT 1 FROM ld_systems_deploy WHERE deploy_type=48 AND deploy_value=1) THEN 1=1
                    ELSE a.approvestatus='已批准'
                END)
        UNION ALL
        SELECT
            a.wareid,
            c.productid,
            c.batchtext,
            c.quantity
        FROM ld_salesback a
        LEFT JOIN ld_salesbackdetail c ON c.id=a.salesbackid
        LEFT JOIN ld_products p ON p.productid=c.productid
        WHERE a.deleted=0
            AND a.salesbackstatus='已入库'
            AND (
                CASE
                    WHEN EXISTS (SELECT 1 FROM ld_systems_deploy WHERE deploy_type=48 AND deploy_value=1) THEN 1=1
                    ELSE a.approvestatus='已批准'
                END)
        UNION ALL
        SELECT
            c.wareid,
            c.productid,
            c.batchtext,
            0-c.quantity
        FROM ld_outboundorder a
        LEFT JOIN ld_outboundordercf b ON a.out_id=b.out_id
        LEFT JOIN ld_outboundorderdetail c ON c.id=a.out_id
        LEFT JOIN ld_outboundorderdetailscf d ON d.lineitem_id=c.lineitem_id
        LEFT JOIN ld_products p ON p.productid=c.productid
        WHERE a.deleted=0
            AND a.approvestatus<>'已拒绝'
            AND (
                CASE
                    WHEN EXISTS (SELECT 1 FROM ld_systems_deploy WHERE deploy_type=48 AND deploy_value=1) THEN 1=1
                    ELSE a.approvestatus='已批准'
                END)
        UNION ALL
        SELECT
            a.wareid,
            c.productid,
            c.batchtext,
            0-c.quantity
        FROM ld_purchaseback a
        LEFT JOIN ld_purchasebackdetail c ON c.id=a.purchasebackid
        LEFT JOIN ld_products p ON p.productid=c.productid
        WHERE a.deleted=0
            AND a.purchasebackstatus='已出库'
            AND (
                CASE
                    WHEN EXISTS (SELECT 1 FROM ld_systems_deploy WHERE deploy_type=48 AND deploy_value=1) THEN 1=1
                    ELSE a.purchasebackstatus='结束'
                END)
        UNION ALL
        SELECT
            a.inwarehouse,
            c.productid,
            c.batchtext,
            c.quantity
        FROM ld_warehousetransfer a
        LEFT JOIN ld_warehousetransferdetail c ON c.id=a.warehousetransferid
        LEFT JOIN ld_products p ON p.productid=c.productid
        WHERE a.deleted=0
            AND (
                CASE
                    WHEN EXISTS (SELECT 1 FROM ld_systems_deploy WHERE deploy_type=48 AND deploy_value=1) THEN 1=1
                    ELSE a.transferstatus='已审核'
                END)
        UNION ALL
        SELECT
            a.outwarehouse,
            c.productid,
            c.batchtext,
            0-c.quantity
        FROM ld_warehousetransfer a
        LEFT JOIN ld_warehousetransferdetail c ON c.id=a.warehousetransferid
        LEFT JOIN ld_products p ON p.productid=c.productid
        WHERE a.deleted=0
            AND (
                CASE
                    WHEN EXISTS (SELECT 1 FROM ld_systems_deploy WHERE deploy_type=48 AND deploy_value=1) THEN 1=1
                    ELSE a.transferstatus='已审核'
                END)
        UNION ALL
        SELECT
            a.wareid,
            c.productid,
            c.batchtext,
            c.profitloss
        FROM ld_checks a
        LEFT JOIN ld_checksdetail c ON c.id=a.id
        LEFT JOIN ld_products p ON p.productid=c.productid
        WHERE a.deleted=0
            AND (
                CASE
                    WHEN EXISTS (SELECT 1 FROM ld_systems_deploy WHERE deploy_type=48 AND deploy_value=1) THEN 1=1
                    ELSE a.presence='盘点结束'
                END)
    ) a
    WHERE a.productid>0
    GROUP BY a.productid
) a ON a.productid=p.productid
SET p.qtyinstock=IFNULL(a.inventory_qty,0)
WHERE p.deleted=0
    AND IFNULL(p.qtyinstock,0)<>IFNULL(a.inventory_qty,0);
    
    
/* 算法
    库存初始化数量(确认初始化,不计暂存)
    + 入库单数量(根据库存流水记录触发点判断统计“全部”单据还是“审批状态”为“已批准”的单据)
    + 销售退货单数量(单据状态不等于“中止”,根据库存流水记录触发点判断统计“全部”单据还是“审批状态”为“已批准”的单据)
    - 出库单数量(根据库存流水记录触发点判断统计“全部”单据还是“审批状态”为“已批准”的单据)
    - 采购退货单数量(单据状态不等于“中止”,根据库存流水记录触发点判断统计“全部”单据还是“退货状态”为“结束”的单据)
    + 入库仓库调拨单数量(根据库存流水记录触发点判断统计“全部”单据还是“审批状态”为“已批准”的单据)
    - 出库仓库调拨单数量(根据库存流水记录触发点判断统计“全部”单据还是“审批状态”为“已批准”的单据)
    + 盘点单盈亏数量(根据库存流水记录触发点判断统计“全部”单据还是“审批状态”为“已批准”的单据)
*/

重算产品总库存数量.sql

最近修改: 2025-02-08