2 天以前 e731bf5f64d71ed93a570d505c52dc44d491175e
src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -86,6 +86,48 @@
        </if>
    </select>
    <!-- 报废品选料:只查产品树「危废处置次生危废」大类(含其所有子节点)下的合格库存,带批号。
         大类名按业务口径写死在这里,改口径只需改这一处。
         该查询以 WITH 开头,而数据权限拦截器只处理 select 开头的 SQL,因此不会追加 dept_id/create_user,
         与「库存是共用基础数据、选料不应受建单人限制」的口径一致;保留 /*data_scope*/ 标记让这个意图显式可读。
         不影响原 pagestockInventory -->
    <select id="selectScrapStockPage" resultType="com.ruoyi.stock.dto.StockInventoryDto">
        WITH RECURSIVE scrap_product_tree AS (
            SELECT id
            FROM product
            WHERE product_name = '危废处置次生危废'
            UNION ALL
            SELECT p.id
            FROM product p
            INNER JOIN scrap_product_tree t ON p.parent_id = t.id
        )
        select /*data_scope*/ si.id,
        si.product_model_id,
        si.batch_no,
        si.qualitity,
        COALESCE(si.locked_quantity, 0) as locked_quantity,
        (si.qualitity - COALESCE(si.locked_quantity, 0)) as un_locked_quantity,
        si.remark,
        si.version,
        pm.model,
        pm.unit,
        p.product_name
        from stock_inventory si
        left join product_model pm on si.product_model_id = pm.id
        left join product p on pm.product_id = p.id
        where pm.product_id in (select id from scrap_product_tree)
        <if test="ew.productModelId != null">
            and si.product_model_id = #{ew.productModelId}
        </if>
        <if test="ew.batchNo != null and ew.batchNo != ''">
            and si.batch_no like concat('%',#{ew.batchNo},'%')
        </if>
        <if test="ew.productName != null and ew.productName != ''">
            and p.product_name like concat('%',#{ew.productName},'%')
        </if>
        order by si.update_time desc
    </select>
    <select id="pageListCombinedStockInventory" resultType="com.ruoyi.stock.dto.StockInventoryDto">
        WITH RECURSIVE product_tree AS (
        SELECT id
@@ -120,7 +162,91 @@
        unit,
        product_name,
        product_id,
        'combined' as stockType
        'combined' as stockType,
        (
        select sir.tank_no
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        order by sir.id desc
        limit 1
        ) as tank_no,
        (
        select sir.oil_product
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        order by sir.id desc
        limit 1
        ) as oil_product,
        (
        select sir.tank_inspection_status
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        order by sir.id desc
        limit 1
        ) as tank_inspection_status,
        (
        select sir.unloading_crane_position
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        order by sir.id desc
        limit 1
        ) as unloading_crane_position,
        (
        select sir.density
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        order by sir.id desc
        limit 1
        ) as density,
        (
        select sir.unload_photos
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        order by sir.id desc
        limit 1
        ) as unload_photos,
        (
        select sir.gross_weight
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        order by sir.id desc
        limit 1
        ) as gross_weight,
        (
        select sir.tare_weight
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        order by sir.id desc
        limit 1
        ) as tare_weight,
        (
        select sir.net_weight
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        order by sir.id desc
        limit 1
        ) as net_weight,
        (
        select sir.loss_quantity
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        order by sir.id desc
        limit 1
        ) as loss_quantity,
        (
        select sir.actual_volume
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        order by sir.id desc
        limit 1
        ) as actual_volume,
        (
        select sir.pound_photos
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        order by sir.id desc
        limit 1
        ) as pound_photos
        from (
        select
        si.batch_no,
@@ -222,7 +348,7 @@
        unit,
        product_name,
        product_id
        order by combined.id desc
        order by create_time desc
    </select>
    <select id="listStockInventoryExportData" resultType="com.ruoyi.stock.execl.StockInventoryExportData">
@@ -259,7 +385,15 @@
            unit,
            product_name,
            product_id,
            'combined' as stockType
            'combined' as stockType,
            (
            select sir.tank_no
            from stock_in_record sir
            where sir.product_model_id = combined.product_model_id
            and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
            order by sir.id desc
            limit 1
            ) as tank_no
        from (
            select
            si.batch_no,
@@ -352,7 +486,11 @@
        su.nick_name as create_by
        from
        stock_in_record sir
        left join stock_inventory si on sir.product_model_id = si.product_model_id
        left join (
            select product_model_id, sum(qualitity) as qualitity
            from stock_inventory
            group by product_model_id
        ) si on sir.product_model_id = si.product_model_id
        left join product_model pm on sir.product_model_id = pm.id
        left join product p on pm.product_id = p.id
        left join sys_user su on sir.create_user = su.user_id
@@ -466,13 +604,25 @@
                AND create_time &lt;= #{endDate}) AS combined_counts
    </select>
    <!-- 出入库趋势:产品分类必须递归取整棵子树。
         产品树是「大类 -> 品类 -> 具体产品」三层,产品型号(product_model)挂在叶子产品上,
         只比对直接子节点(p.parent_id = root)永远命中不到型号,趋势图恒为空。
         递归 CTE 写在括号内,让语句仍以 SELECT 开头,数据权限拦截器照常对 stock_in_record 生效 -->
    <select id="selectDailyStockInCounts" resultType="java.util.Map">
        SELECT DATE(sir.create_time) AS date,
               SUM(sir.stock_in_num) AS count
        FROM stock_in_record sir
                 JOIN product_model pm ON sir.product_model_id = pm.id
                 JOIN product p ON pm.product_id = p.id
        WHERE (p.parent_id = #{rootCategoryId} OR p.id = #{rootCategoryId})
        WHERE p.id IN (WITH RECURSIVE product_tree AS (SELECT id
                                                       FROM product
                                                       WHERE id = #{rootCategoryId}
                                                       UNION ALL
                                                       SELECT p2.id
                                                       FROM product p2
                                                                JOIN product_tree pt ON p2.parent_id = pt.id)
                       SELECT id
                       FROM product_tree)
          AND sir.create_time &gt;= #{startDate}
          AND sir.create_time &lt;= #{endDate}
        GROUP BY DATE(sir.create_time)
@@ -485,7 +635,15 @@
        FROM stock_out_record sor
                 JOIN product_model pm ON sor.product_model_id = pm.id
                 JOIN product p ON pm.product_id = p.id
        WHERE (p.parent_id = #{rootCategoryId} OR p.id = #{rootCategoryId})
        WHERE p.id IN (WITH RECURSIVE product_tree AS (SELECT id
                                                       FROM product
                                                       WHERE id = #{rootCategoryId}
                                                       UNION ALL
                                                       SELECT p2.id
                                                       FROM product p2
                                                                JOIN product_tree pt ON p2.parent_id = pt.id)
                       SELECT id
                       FROM product_tree)
          AND sor.create_time &gt;= #{startDate}
          AND sor.create_time &lt;= #{endDate}
        GROUP BY DATE(sor.create_time)
@@ -569,7 +727,382 @@
        MAX(version) as version,
        MAX(remark) as remark,
        'combined' as stockType
        'combined' as stockType,
        (
        select sir.oil_product
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as oil_product,
        (
        select sir.tank_inspection_status
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as tank_inspection_status,
        (
        select sir.unloading_crane_position
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as unloading_crane_position,
        (
        select sir.density
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as density,
        (
        select sir.unload_photos
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as unload_photos,
        (
        select sir.gross_weight
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as gross_weight,
        (
        select sir.tare_weight
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as tare_weight,
        (
        select sir.net_weight
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as net_weight,
        (
        select sir.loss_quantity
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as loss_quantity,
        (
        select sir.actual_volume
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as actual_volume,
        (
        select sir.pound_photos
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as pound_photos,
        (
        select sor.out_category
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_category,
        (
        select sor.out_date
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_date,
        (
        select sor.out_tonnage
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_tonnage,
        (
        select sor.customer_name
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_customer_name,
        (
        select sor.loading_inspection_status
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as loading_inspection_status,
        (
        select sor.loading_crane_position
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as loading_crane_position,
        (
        select sor.density
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_density,
        (
        select sor.driver_name
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_driver_name,
        (
        select sor.truck_plate_no
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_truck_plate_no,
        (
        select sor.loading_photos
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as loading_photos,
        (
        select sor.pound_photos
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_pound_photos,
        (
        select sor.oil_depot_name
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_oil_depot_name,
        (
        select sor.tank_no
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_tank_no,
        (
        select sor.oil_product
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_oil_product,
        (
        select sor.contact_person
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_contact_person,
        (
        select sor.contact_phone
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_contact_phone,
        (
        select sor.gross_weight
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_gross_weight,
        (
        select sor.tare_weight
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_tare_weight,
        (
        select sor.net_weight
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_net_weight,
        (
        select sor.loss_quantity
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_loss_quantity,
        (
        select sor.actual_volume
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_actual_volume,
        (
        select sor.driver_phone
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_driver_phone,
        (
        select sor.escort_name
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_escort_name,
        (
        select sor.escort_phone
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_escort_phone,
        (
        select sor.trailer_plate_no
        from stock_out_record sor
        where sor.product_model_id = combined.product_model_id
        order by sor.id desc
        limit 1
        ) as out_trailer_plate_no,
        (
        select sir.oil_depot_name
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as oil_depot_name,
        (
        select sir.inbound_category
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as inbound_category,
        (
        select sir.tank_no
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as tank_no,
        (
        select sir.inbound_time
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as inbound_time,
        (
        select sir.original_quantity
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as original_quantity,
        (
        select sir.customer_name
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as customer_name,
        (
        select sir.contact_person
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as contact_person,
        (
        select sir.contact_phone
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as contact_phone,
        (
        select sir.driver_name
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as driver_name,
        (
        select sir.driver_phone
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as driver_phone,
        (
        select sir.escort_name
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as escort_name,
        (
        select sir.escort_phone
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as escort_phone,
        (
        select sir.truck_plate_no
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as truck_plate_no,
        (
        select sir.trailer_plate_no
        from stock_in_record sir
        where sir.product_model_id = combined.product_model_id
        and (sir.batch_no = combined.batch_no or (combined.batch_no is null and sir.batch_no is null))
        order by sir.id desc
        limit 1
        ) as trailer_plate_no
        from (
        select
        si.batch_no,
@@ -670,7 +1203,7 @@
        product_name,
        product_id
        order by
        batch_no
        MAX(update_time) desc
    </select>
</mapper>