package com.baiyue.warehouse.mapper; import org.apache.ibatis.annotations.Mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baiyue.warehouse.entity.WarehouseResourceLockEntity; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; @Mapper public interface WarehouseResourceLockMapper extends BaseMapper { @Select(""" SELECT * FROM wh_resource_lock WHERE customer_id = #{customerId} AND reservation_key = #{reservationKey} LIMIT 1 """) WarehouseResourceLockEntity findByReservationKey(@Param("customerId") long customerId, @Param("reservationKey") String reservationKey); @Select("SELECT * FROM wh_resource_lock WHERE customer_id=#{customerId} AND id=#{id} LIMIT 1 FOR UPDATE") WarehouseResourceLockEntity lockById(@Param("customerId") long customerId, @Param("id") long id); @Select("SELECT * FROM wh_resource_lock WHERE id=#{id} LIMIT 1 FOR UPDATE") WarehouseResourceLockEntity lockAnyById(@Param("id") long id); @Select("SELECT * FROM wh_resource_lock WHERE customer_id=#{customerId} AND pallet_id=#{palletId} " + "AND status='ACTIVE' ORDER BY locked_at DESC LIMIT 1") WarehouseResourceLockEntity findActiveByPallet(@Param("customerId") long customerId, @Param("palletId") long palletId); @Select("SELECT * FROM wh_resource_lock WHERE pallet_id=#{palletId} AND status='ACTIVE' " + "ORDER BY locked_at DESC LIMIT 1") WarehouseResourceLockEntity findAnyActiveByPallet(@Param("palletId") long palletId); @Update(""" UPDATE wh_pallet SET status = 'OCCUPIED', location_id = #{locationId}, updated_at = CURRENT_TIMESTAMP(3), version = version + 1 WHERE id = #{palletId} AND customer_id = #{customerId} AND warehouse_id = #{warehouseId} AND status = 'IDLE' AND deleted = 0 """) int occupyPallet(@Param("customerId") long customerId, @Param("warehouseId") long warehouseId, @Param("palletId") long palletId, @Param("locationId") long locationId); @Update(""" UPDATE wh_location SET status = 'OCCUPIED', updated_at = CURRENT_TIMESTAMP(3), version = version + 1 WHERE id = #{locationId} AND customer_id = #{customerId} AND warehouse_id = #{warehouseId} AND status = 'IDLE' AND deleted = 0 """) int occupyLocation(@Param("customerId") long customerId, @Param("warehouseId") long warehouseId, @Param("locationId") long locationId); @Update(""" UPDATE wh_pallet SET status = 'IDLE', updated_at = CURRENT_TIMESTAMP(3), version = version + 1 WHERE id = #{palletId} AND customer_id = #{customerId} AND warehouse_id = #{warehouseId} AND location_id = #{locationId} AND status = 'OCCUPIED' AND deleted = 0 """) int releasePallet(@Param("customerId") long customerId, @Param("warehouseId") long warehouseId, @Param("palletId") long palletId, @Param("locationId") long locationId); @Update(""" UPDATE wh_pallet SET status = 'IDLE', updated_at = CURRENT_TIMESTAMP(3), version = version + 1 WHERE id = #{palletId} AND customer_id = #{customerId} AND warehouse_id = #{warehouseId} AND location_id = #{locationId} AND status = 'OCCUPIED' AND deleted = 0 """) int releasePalletAtVirtualLocation(@Param("customerId") long customerId, @Param("warehouseId") long warehouseId, @Param("palletId") long palletId, @Param("locationId") long locationId); @Update(""" UPDATE wh_location SET status = 'IDLE', updated_at = CURRENT_TIMESTAMP(3), version = version + 1 WHERE id = #{locationId} AND customer_id = #{customerId} AND warehouse_id = #{warehouseId} AND status = 'OCCUPIED' AND deleted = 0 """) int releaseLocation(@Param("customerId") long customerId, @Param("warehouseId") long warehouseId, @Param("locationId") long locationId); @Update(""" UPDATE wh_pallet SET status = 'SCRAPPED', location_id = NULL, updated_at = CURRENT_TIMESTAMP(3), version = version + 1 WHERE id = #{palletId} AND customer_id = #{customerId} AND warehouse_id = #{warehouseId} AND location_id = #{locationId} AND status = 'OCCUPIED' AND deleted = 0 """) int scrapPallet(@Param("customerId") long customerId, @Param("warehouseId") long warehouseId, @Param("palletId") long palletId, @Param("locationId") long locationId); @Update(""" UPDATE wh_pallet SET status = 'SCRAPPED', updated_at = CURRENT_TIMESTAMP(3), version = version + 1 WHERE id = #{palletId} AND customer_id = #{customerId} AND warehouse_id = #{warehouseId} AND location_id = #{locationId} AND status = 'OCCUPIED' AND deleted = 0 """) int scrapPalletAtVirtualLocation(@Param("customerId") long customerId, @Param("warehouseId") long warehouseId, @Param("palletId") long palletId, @Param("locationId") long locationId); @Update("UPDATE wh_pallet SET status='SCRAPPED',updated_at=CURRENT_TIMESTAMP(3),version=version+1 " + "WHERE customer_id=#{customerId} AND id=#{palletId} AND status='OCCUPIED' AND deleted=0") int scrapPalletWithoutLock(@Param("customerId") long customerId, @Param("palletId") long palletId); @Update(""" UPDATE wh_resource_lock SET status = #{status}, released_at = CASE WHEN #{status} IN ('RELEASED','SCRAPPED') THEN CURRENT_TIMESTAMP(3) ELSE released_at END, updated_at = CURRENT_TIMESTAMP(3) WHERE id = #{id} AND status = 'ACTIVE' """) int closeLock(@Param("id") long id, @Param("status") String status); }