package com.talentcard.server.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.talentcard.server.entity.TransportCarWashCredential; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.time.LocalDateTime; import java.util.List; import java.util.Map; @Mapper public interface TransportCarWashCredentialMapper extends BaseMapper { @Select(""" select c.*, m.merchant_name as merchantName, u.name as talentName, u.mobile as talentMobile, tc.card_no as cardNo, tc.card_type as cardType, pc.card_no as primaryCardNo from transport_car_wash_credential c join merchant m on m.id = c.merchant_id and m.deleted = 0 join talent_user u on u.id = c.talent_id and u.deleted = 0 join talent_card tc on tc.id = c.card_id and tc.deleted = 0 join talent_card pc on pc.id = c.primary_card_id and pc.deleted = 0 where c.id = #{id} and c.deleted = 0 limit 1 """) Map selectDetail(@Param("id") Long id); @Select(""" """) List> selectPage(@Param("merchantId") Long merchantId, @Param("status") Integer status, @Param("keyword") String keyword, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime, @Param("size") int size, @Param("offset") int offset); @Select(""" """) Long countPage(@Param("merchantId") Long merchantId, @Param("status") Integer status, @Param("keyword") String keyword, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime); @Select(""" select c.id as cardId, c.talent_id as talentId, c.card_no as cardNo, c.card_type as cardType, c.card_level as cardLevel, u.name as talentName, u.mobile as talentMobile from talent_card c join talent_user u on u.id = c.talent_id and u.deleted = 0 where c.id = #{cardId} and c.talent_id = #{talentId} and c.deleted = 0 and c.status = 1 and (c.valid_start is null or c.valid_start <= current_date) and (c.valid_end is null or c.valid_end >= current_date) and (c.expire_time is null or c.expire_time > now()) limit 1 """) Map selectActiveCard(@Param("talentId") Long talentId, @Param("cardId") Long cardId); @Select(""" select a.talent_id as primaryTalentId, pc.id as primaryCardId, pc.card_no as primaryCardNo, pc.card_level as cardLevel from family_card_application a join talent_card pc on pc.talent_id = a.talent_id and pc.card_type = 'PERSONAL' and pc.deleted = 0 and pc.status = 1 where a.family_card_id = #{familyCardId} and a.deleted = 0 order by a.id desc, pc.id desc limit 1 """) Map selectPrimaryCard(@Param("familyCardId") Long familyCardId); @Select("select count(*) from merchant where id = #{merchantId} and merchant_type_code = 'carWash' and deleted = 0 and status = 1") Long countActiveMerchant(@Param("merchantId") Long merchantId); @Select(""" select coalesce(sum(verify_amount), 0) from verify_record where card_id = #{primaryCardId} and verify_type = 'CAR_WASH' and status = 1 and verify_time >= #{windowStart} """) Long countUsedQuota(@Param("primaryCardId") Long primaryCardId, @Param("windowStart") LocalDateTime windowStart); @Select("select * from transport_car_wash_credential where id = #{id} and deleted = 0 limit 1 for update") TransportCarWashCredential selectByIdForUpdate(@Param("id") Long id); }