package com.tourguide.modules.finance.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.tourguide.modules.finance.entity.GuideWithdrawal; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import java.time.LocalDateTime; import java.util.List; public interface GuideWithdrawalMapper extends BaseMapper { @Select("SELECT * FROM guide_withdrawal WHERE id = #{id} AND deleted = 0 FOR UPDATE") GuideWithdrawal selectForUpdate(@Param("id") Long id); @Select("SELECT * FROM guide_withdrawal WHERE deleted = 0 " + "AND (cash_req_seq_id = #{requestSequence} OR withdrawal_no = #{requestSequence}) " + "LIMIT 1 FOR UPDATE") GuideWithdrawal selectByPayoutSequenceForUpdate(@Param("requestSequence") String requestSequence); @Select("SELECT id FROM guide_withdrawal WHERE deleted = 0 " + "AND status IN ('TRANSFERRING', 'TRANSFERRED', 'PROCESSING') " + "AND updated_at <= #{beforeTime} ORDER BY updated_at, id LIMIT #{limit}") List selectPendingPayoutIds(@Param("beforeTime") LocalDateTime beforeTime, @Param("limit") int limit); @Update("UPDATE guide_withdrawal SET status = 'TRANSFERRED', " + "cash_req_seq_id = NULL, cash_req_date = NULL, cash_hf_seq_id = NULL, " + "payout_message = #{message}, processed_at = #{processedAt}, updated_at = #{updatedAt} " + "WHERE id = #{id} AND deleted = 0 AND status IN ('PROCESSING', 'TRANSFERRED')") int resetCashForRetry(@Param("id") Long id, @Param("message") String message, @Param("processedAt") LocalDateTime processedAt, @Param("updatedAt") LocalDateTime updatedAt); }