ZengTao
2025-11-11 aa5d2f68e1d97f7a1b20fa15e1bde9195544bb3e
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml
@@ -13,10 +13,75 @@
        <result column="engineer_id" property="engineerId"/>
        <result column="tempering_layout_id" property="temperingLayoutId"/>
        <result column="slot" property="slot"/>
        <result column="glass_count" property="glassCount"/>
        <result column="max_sequence" property="maxSequence"/>
        <result column="min_sequence" property="minSequence"/>
        <result column="remain_width" property="remainWidth"/>
    </resultMap>
    <resultMap id="virtualSlotSequenceDTO" type="com.mes.bigstorage.entity.dto.BigStorageRelationDTO">
        <result column="engineer_id" property="engineerId"/>
        <result column="tempering_layout_id" property="temperingLayoutId"/>
        <result column="virtual_slot" property="virtualSlot"/>
    </resultMap>
    <resultMap id="baseSlotSequenceDTO" type="com.mes.bigstorage.entity.dto.BigStorageSequenceDTO">
        <result column="slot" property="slot"/>
        <result column="max_sequence" property="maxSequence"/>
        <result column="min_sequence" property="minSequence"/>
    </resultMap>
    <resultMap id="temperingGlassCount" type="com.mes.bigstorage.entity.dto.TemperingGlassCountDTO">
        <result column="engineer_id" property="engineerId"/>
        <result column="engineer_name" property="engineerName"/>
        <result column="tempering_layout_id" property="temperingLayoutId"/>
        <result column="films_id" property="filmsId"/>
        <result column="thickness" property="thickness"/>
        <result column="total_count" property="totalCount"/>
        <result column="real_count" property="realCount"/>
        <result column="damage_count" property="damageCount"/>
        <result column="lack_count" property="lackCount"/>
    </resultMap>
    <resultMap id="glassInfoLackDTO" type="com.mes.bigstorage.entity.dto.GlassInfoLackDTO">
        <result column="flow_card_id" property="flowCardId"/>
        <result column="width" property="width"/>
        <result column="height" property="height"/>
        <result column="thickness" property="thickness"/>
        <result column="filmsid" property="filmsid"/>
        <result column="total_layer" property="totalLayer"/>
        <result column="layer" property="layer"/>
        <result column="tempering_layout_id" property="temperingLayoutId"/>
        <result column="tempering_feed_sequence" property="temperingFeedSequence"/>
        <result column="x_coordinate" property="xCoordinate"/>
        <result column="y_coordinate" property="yCoordinate"/>
        <result column="angle" property="angle"/>
        <result column="engineer_id" property="engineerId"/>
        <result column="glass_id" property="glassId"/>
        <result column="is_damage" property="isDamage"/>
    </resultMap>
    <select id="temperingIsAllByTemperingLayoutId" resultMap="temperingLayoutDTO">
        SELECT T.*
        FROM (
                 SELECT ENGINEER_ID, TEMPERING_LAYOUT_ID, COUNT(distinct TEMPERING_FEED_SEQUENCE) AS COUNT
                 FROM BIG_STORAGE_CAGE_DETAILS
                 WHERE STATE = 100
                   and ENGINEER_ID = #{engineerId}
                   AND TEMPERING_LAYOUT_ID = #{temperingLayoutId}
                 GROUP BY ENGINEER_ID, TEMPERING_LAYOUT_ID
             ) T
                 INNER JOIN (SELECT ENGINEER_ID,
                                    TEMPERING_LAYOUT_ID,
                                    COUNT(distinct TEMPERING_FEED_SEQUENCE) AS COUNT
                             FROM GLASS_INFO
                             WHERE ENGINEER_ID = #{engineerId}
                               AND TEMPERING_LAYOUT_ID = #{temperingLayoutId}
                             GROUP BY ENGINEER_ID,
                                 TEMPERING_LAYOUT_ID) T1
                            ON T.ENGINEER_ID = T1.ENGINEER_ID
                                AND T.TEMPERING_LAYOUT_ID = T1.TEMPERING_LAYOUT_ID
                                AND T.COUNT = T1.COUNT
    </select>
    <select id="temperingIsAll" resultMap="temperingLayoutDTO">
        SELECT T2.*
@@ -24,33 +89,36 @@
                 SELECT T.ENGINEER_ID,
                        T.TEMPERING_LAYOUT_ID,
                        COUNT(T.TEMPERING_FEED_SEQUENCE) AS COUNT
                 FROM
                     GLASS_INFO T
                 FROM GLASS_INFO T
                     LEFT JOIN DAMAGE T1
                 ON T.ENGINEER_ID = T1.ENGINEER_ID
                     AND T.GLASS_ID = T1.GLASS_ID
                 WHERE
                     T1.GLASS_ID IS NULL
                 GROUP BY
                     T.ENGINEER_ID,
                     AND (T1.TYPE = 8
                     OR T1.TYPE = 9)
                 WHERE T1.GLASS_ID IS NULL
                 GROUP BY T.ENGINEER_ID,
                     T.TEMPERING_LAYOUT_ID
             ) T2
                 INNER JOIN (SELECT ENGINEER_ID, TEMPERING_LAYOUT_ID, COUNT(TEMPERING_FEED_SEQUENCE) AS COUNT
                             FROM BIG_STORAGE_CAGE_DETAILS
                             WHERE STATE in (100, 101, 102)
                             WHERE STATE in (100)
                             GROUP BY ENGINEER_ID, TEMPERING_LAYOUT_ID) T3 ON T2.ENGINEER_ID = T3.ENGINEER_ID
            AND T2.TEMPERING_LAYOUT_ID = T3.TEMPERING_LAYOUT_ID
            AND T2.COUNT = T3.COUNT LIMIT 1
            AND T2.COUNT = T3.COUNT
                 INNER JOIN ENGINEERING T4 ON T2.ENGINEER_ID = T4.ENGINEER_ID
        ORDER BY T4.ID, T2.TEMPERING_LAYOUT_ID
    </select>
    <select id="queryTemperingOccupySlot" resultMap="temperingLayoutDTO">
        SELECT TEMPERING_LAYOUT_ID,
        SELECT ENGINEER_ID,
               TEMPERING_LAYOUT_ID,
               COUNT(DISTINCT SLOT) as SLOT_COUNT
        FROM BIG_STORAGE_CAGE_DETAILS
        WHERE STATE = 100
        GROUP BY ENGINEER_ID,
                 TEMPERING_LAYOUT_ID
        HAVING SLOT_COUNT &gt;= #{count} LIMIT 1
        HAVING SLOT_COUNT &gt;= #{count}
        ORDER BY SLOT_COUNT DESC
    </select>
    <select id="queryGlassMaxAndMin" resultMap="slotSequenceDTO">
        SELECT T.*,
@@ -59,6 +127,7 @@
                 SELECT ENGINEER_ID,
                        TEMPERING_LAYOUT_ID,
                        SLOT,
                        count(*)                     as glass_count,
                        MAX(TEMPERING_FEED_SEQUENCE) AS MAX_SEQUENCE,
                        MIN(TEMPERING_FEED_SEQUENCE) AS MIN_SEQUENCE
                 FROM BIG_STORAGE_CAGE_DETAILS
@@ -71,4 +140,294 @@
                 INNER JOIN BIG_STORAGE_CAGE T1 ON T.SLOT = T1.SLOT
        ORDER BY T.MAX_SEQUENCE DESC
    </select>
    <update id="updateBySlot">
        update big_storage_cage_details
        <set>
            state = #{state}
        </set>
        <where>
            (glass_id,slot) in (
            <foreach collection="list" item="item" separator=",">
                (#{item.glassId}, #{item.targetSlot})
            </foreach>
            )
            and state !=101
        </where>
    </update>
    <update id="updateDeviceIdBySlot">
        update big_storage_cage_details t inner join big_storage_cage t1 on t.slot = t1.slot
        set t.device_id = t1.device_id
        where t.slot in (
        <foreach collection="list" item="item" separator=",">
            #{item}
        </foreach>
        )
    </update>
    <select id="selectTemperingGlassCount" resultMap="temperingGlassCount">
        with glass_info_temp as (
        select t.engineer_id,t1.engineer_name, t.tempering_layout_id, count(*) as total_count
        from glass_info t inner join engineering t1 on t.engineer_id=t1.engineer_id
        group by t.engineer_id, t.tempering_layout_id
        ),
        big_details_temp as (
        select engineer_id, tempering_layout_id, count(*) as real_count, films_id, thickness
        from big_storage_cage_details
        where state = 100
        <if test="isTempering == 0">
            and tempering_layout_id = 0
        </if>
        <if test="isTempering == 1">
            and tempering_layout_id != 0
        </if>
        group by engineer_id, tempering_layout_id, films_id, thickness
        ),
        damage_temp as (
        select engineer_id, tempering_layout_id, count(*) as damage_count
        from damage
        where type in(8,9) and STATUS = 1
        group by engineer_id, tempering_layout_id
        ),
        result as (
        select t.engineer_id,
        t1.engineer_name,
        t.tempering_layout_id,
        t.films_id,
        t.thickness,
        total_count,
        real_count,
        ifnull(damage_count, 0) as damage_count,
        case when total_count - real_count - ifnull(damage_count, 0) &lt; 0 then 0 else
        total_count - real_count - ifnull(damage_count, 0) end as lack_count
        from big_details_temp t
        inner join glass_info_temp t1 on t.engineer_id = t1.engineer_id and
        t.tempering_layout_id = t1.tempering_layout_id
        left join damage_temp t2
        on t.engineer_id = t2.engineer_id and t.tempering_layout_id = t2.tempering_layout_id
        )
        select *
        from result
        order by engineer_id,tempering_layout_id
    </select>
    <select id="queryIsAllNeedDispatchVirtualSlot" resultMap="virtualSlotSequenceDTO">
        with relation_temp as (
        select engineer_id, tempering_layout_id, virtual_slot, count(1) as slot_count
        from big_storage_glass_relation_info
        group by engineer_id, tempering_layout_id, virtual_slot
        ),
        details_temp as (
        select t.engineer_id, t.tempering_layout_id, t.virtual_slot, count(1) as slot_count
        from big_storage_glass_relation_info t
        left join big_storage_cage_details t1 on
        t.engineer_id = t1.engineer_id and t.tempering_layout_id = t1.tempering_layout_id and
        t.tempering_feed_sequence = t1.tempering_feed_sequence
        where t1.state = 100
        AND T1.DEVICE_ID IN
        <foreach collection="deviceIdList" item="item" open='(' close=')' separator=','>
            #{item}
        </foreach>
        group by t.engineer_id, t.tempering_layout_id, t.virtual_slot
        ),
        result_one as (
        select t.*, t1.slot_count as tslot_count
        from relation_temp t
        INNER JOIN details_temp t1 on t.engineer_id = t1.engineer_id and
        t.tempering_layout_id = t1.tempering_layout_id and
        t.virtual_slot = t1.virtual_slot
        where t.slot_count = t1.slot_count
        )
        select engineer_id, tempering_layout_id, virtual_slot
        from result_one
        order by engineer_id, tempering_layout_id
    </select>
    <select id="queryNeedDispatchSlot" resultMap="baseSlotSequenceDTO">
        with glass_id_temp as (
            select engineer_id, tempering_layout_id, tempering_feed_sequence
            from big_storage_glass_relation_info
            where (engineer_id, tempering_layout_id, virtual_slot) =
                  (#{engineerId}, #{temperingLayoutId}, #{virtualSlot})
        )
        select t.slot, max(t1.tempering_feed_sequence) as max_sequence, min(t1.tempering_feed_sequence) as min_sequence
        from big_storage_cage_details t
                 inner join big_storage_glass_relation_info t1
                            on t.engineer_id = t1.engineer_id and t.tempering_layout_id = t1.tempering_layout_id and
                               t.tempering_feed_sequence = t1.tempering_feed_sequence
        where (t.engineer_id, t.tempering_layout_id, t.tempering_feed_sequence) in
              (select engineer_id, tempering_layout_id, tempering_feed_sequence from glass_id_temp)
          and t.state = 100
        group by t.slot
        order by max_sequence desc
    </select>
    <select id="queryLackGlassInfo" resultMap="glassInfoLackDTO">
        WITH glass_info_temp AS (SELECT *
                                 FROM glass_info
                                 WHERE engineer_id = #{engineerId}
                                   AND tempering_layout_id = #{temperingLayoutId}),
             big_details_temp AS (SELECT *
                                  FROM big_storage_cage_details
                                  WHERE state = 100
                                    AND engineer_id = #{engineerId}
                                    AND tempering_layout_id = #{temperingLayoutId}),
             damage_temp AS (SELECT *
                             FROM damage
                             WHERE type IN (8, 9)
                               AND engineer_id = #{engineerId}
                               AND tempering_layout_id = #{temperingLayoutId}),
             result_lack AS (SELECT t.*
                             FROM glass_info_temp t
                                      LEFT JOIN big_details_temp t1 ON t.glass_id = t1.glass_id
                             WHERE t1.glass_id IS NULL),
             result AS (
                 SELECT t.*,
                        CASE
                            WHEN t1.glass_id is null THEN
                                0
                            ELSE 1
                            END AS is_damage
                 FROM result_lack t
                          LEFT JOIN damage_temp t1 ON t.glass_id = t1.glass_id
             )
        SELECT *
        FROM result
    </select>
    <select id="querybigStorageCageDetail" resultType="com.mes.base.entity.vo.BigStorageVO">
        select bsc.device_id, bsc.slot, count(bscd.glass_id) as count
        from big_storage_cage bsc
            left join big_storage_cage_details bscd
        on bsc.slot = bscd.slot and bscd.state in (100, 102, 103, 104)
        group by bsc.device_id, bsc.slot
        order by bsc.device_id, bsc.slot
    </select>
    <select id="queryNeedDispatch" resultType="com.mes.bigstorage.entity.BigStorageCageDetails">
        SELECT *
        FROM big_storage_cage_details
        WHERE STATE = 100
          AND SLOT =
              (SELECT SLOT FROM big_storage_cage_details WHERE STATE = 100 AND sequence = 1 order by slot desc LIMIT 1)
        ORDER BY tempering_feed_sequence
    </select>
    <select id="queryNeedDispatchSlotBySequence" resultType="com.mes.bigstorage.entity.dto.BigStorageSlotDTO">
        with glass_temp as (
            select t.*, t1.virtual_slot, t1.slot_sequence
            from big_storage_cage_details t
                     inner join
                 big_storage_glass_relation_info t1 on t.engineer_id = t1.engineer_id
                     and t.tempering_layout_id = t1.tempering_layout_id
                     and t.tempering_feed_sequence = t1.tempering_feed_sequence
            where t.state = 100
        )
           , slot_max_temp as (
            select ROW_NUMBER() over(PARTITION by engineer_id, tempering_layout_id, virtual_slot order by slot_sequence desc)
        as rn,t.*
            from glass_temp t
            where t.device_id in (5, 6)
        )
           , slot_max_message as (select * from slot_max_temp where rn = 1)
           , slot_min_temp as (
            select ROW_NUMBER() over(PARTITION by engineer_id, tempering_layout_id, virtual_slot order by slot_sequence) as
        rn,t.*
            from glass_temp t
            where t.device_id in (5, 6)
        )
           , slot_min_message as (select * from slot_min_temp where rn = 1)
           , result as (
            select t.slot as target_slot, t1.slot as start_slot
            from slot_max_message t
                     inner join slot_min_message t1 on
                    t.engineer_id = t1.engineer_id and t.tempering_layout_id = t1.tempering_layout_id and
                    t.virtual_slot =
                    t1.virtual_slot and t.tempering_layout_id = t1.tempering_layout_id and t.tempering_feed_sequence =
                                                                                           t1.tempering_feed_sequence - 1
        )
        select *
        from result limit 1
    </select>
    <select id="queryTemperingGlassCountSummary" resultMap="temperingGlassCount">
        with glass_info_temp as (
        select engineer_id, tempering_layout_id, count(*) as total_count
        from glass_info
        group by engineer_id, tempering_layout_id
        ),
        big_details_temp as (
        select engineer_id, tempering_layout_id, count(*) as real_count, films_id, thickness
        from big_storage_cage_details
        where state = 100
        <if test="isTempering == 0">
            and tempering_layout_id = 0
        </if>
        <if test="isTempering == 1">
            and tempering_layout_id != 0
        </if>
        group by engineer_id, tempering_layout_id, films_id, thickness
        ),
        damage_temp as (
        select engineer_id, tempering_layout_id, count(*) as damage_count
        from damage
        where type in(8,9) and STATUS = 1
        group by engineer_id, tempering_layout_id
        ),
        result as (
        select t.engineer_id,
        t.tempering_layout_id,
        t.films_id,
        t.thickness,
        total_count,
        real_count,
        ifnull(damage_count, 0) as damage_count,
        case when total_count - real_count - ifnull(damage_count, 0) &lt; 0 then 0 else
        total_count - real_count - ifnull(damage_count, 0) end as lack_count
        from big_details_temp t
        inner join glass_info_temp t1 on t.engineer_id = t1.engineer_id and
        t.tempering_layout_id = t1.tempering_layout_id
        left join damage_temp t2
        on t.engineer_id = t2.engineer_id and t.tempering_layout_id = t2.tempering_layout_id
        ),
        -- 二次汇总层
        secondary_summary as (
        select
        engineer_id,
        films_id,
        thickness,
        count(distinct tempering_layout_id) as total_count, -- 计算totalCount的累计数(去重计数)
        sum(total_count) as real_count -- 计算realCount的总和
        from result
        group by engineer_id, films_id, thickness
        )
        select *
        from secondary_summary
        order by engineer_id, films_id, thickness
    </select>
    <select id="queryVerticalSheetCageDetailsList"
            resultType="com.mes.bigstorage.entity.vo.BigCageDetailsVO">
        SELECT t.id,t.device_id,t.slot,t.remain_width ,t.enable_state,t1.engineer_id,
        t1.id as detail_id,t1.device_id as detail_device_id ,t1.slot as
        detail_slot,t1.engineer_id,t1.glass_id,t1.tempering_layout_id,t1.tempering_feed_sequence,
        t1.flow_card_id,t1.layer,t1.width,t1.height,t1.thickness,t1.films_id
        FROM big_storage_cage t
        left join big_storage_cage_details t1 on t.slot = t1.slot
        and t1.state in (100, 102, 103, 104)
        <if test="filmsId != null and filmsId != ''">
            and t1.films_id like CONCAT('%', #{filmsId}, '%')
        </if>
        <if test="flowCardId != null and flowCardId != ''">
            and t1.flow_card_id like CONCAT('%', #{flowCardId}, '%')
        </if>
        <if test="engineerId != null and engineerId != ''">
            and t1.engineer_id like CONCAT('%', #{engineerId}, '%')
        </if>
        <if test="glassId != null and glassId != ''">
            and t1.glass_id like CONCAT('%', #{glassId}, '%')
        </if>
        <if test="thickness != -1">
            and t1.thickness = #{thickness}
        </if>
        order by t.slot
    </select>
</mapper>