package cn.iocoder.yudao.module.trade.dal.mysql.brokerage; import cn.hutool.core.bean.BeanUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordPageReqVO; import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByPriceRespVO; import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO; import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryRespBO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.yulichang.toolkit.MPJWrappers; 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.Collection; import java.util.List; import java.util.Map; /** * 佣金记录 Mapper * * @author owen */ @Mapper public interface BrokerageRecordMapper extends BaseMapperX { default PageResult selectPage(BrokerageRecordPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(BrokerageRecordDO::getUserId, reqVO.getUserId()) .eqIfPresent(BrokerageRecordDO::getBizType, reqVO.getBizType()) .eqIfPresent(BrokerageRecordDO::getStatus, reqVO.getStatus()) .eqIfPresent(BrokerageRecordDO::getSourceUserLevel, reqVO.getSourceUserLevel()) .betweenIfPresent(BrokerageRecordDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(BrokerageRecordDO::getId)); } default List selectListByStatusAndUnfreezeTimeLt(Integer status, LocalDateTime unfreezeTime) { return selectList(new LambdaQueryWrapper() .eq(BrokerageRecordDO::getStatus, status) .lt(BrokerageRecordDO::getUnfreezeTime, unfreezeTime)); } default int updateByIdAndStatus(Long id, Integer status, BrokerageRecordDO updateObj) { return update(updateObj, new LambdaQueryWrapper() .eq(BrokerageRecordDO::getId, id) .eq(BrokerageRecordDO::getStatus, status)); } default List selectListByBizTypeAndBizId(Integer bizType, String bizId) { return selectList(BrokerageRecordDO::getBizType, bizType, BrokerageRecordDO::getBizId, bizId); } default List selectCountAndSumPriceByUserIdInAndBizTypeAndStatus(Collection userIds, Integer bizType, Integer status) { List> list = selectMaps(MPJWrappers.lambdaJoin(BrokerageRecordDO.class) .select(BrokerageRecordDO::getUserId) .selectCount(BrokerageRecordDO::getId, UserBrokerageSummaryRespBO::getCount) .selectSum(BrokerageRecordDO::getPrice) .in(BrokerageRecordDO::getUserId, userIds) .eq(BrokerageRecordDO::getBizType, bizType) .eq(BrokerageRecordDO::getStatus, status) .groupBy(BrokerageRecordDO::getUserId)); // 按照 userId 聚合 return BeanUtil.copyToList(list, UserBrokerageSummaryRespBO.class); // selectJoinList有BUG,会与租户插件冲突:解析SQL时,发生异常 https://gitee.com/best_handsome/mybatis-plus-join/issues/I84GYW // return selectJoinList(UserBrokerageSummaryBO.class, MPJWrappers.lambdaJoin(BrokerageRecordDO.class) // .select(BrokerageRecordDO::getUserId) // .selectCount(BrokerageRecordDO::getId, UserBrokerageSummaryBO::getCount) // .selectSum(BrokerageRecordDO::getPrice) // .in(BrokerageRecordDO::getUserId, userIds) // .eq(BrokerageRecordDO::getBizType, bizType) // .eq(BrokerageRecordDO::getStatus, status) // .groupBy(BrokerageRecordDO::getUserId)); } @Select("SELECT SUM(price) FROM trade_brokerage_record " + "WHERE user_id = #{userId} AND biz_type = #{bizType} AND status = #{status} " + "AND unfreeze_time BETWEEN #{beginTime} AND #{endTime} AND deleted = FALSE") Integer selectSummaryPriceByUserIdAndBizTypeAndCreateTimeBetween(@Param("userId") Long userId, @Param("bizType") Integer bizType, @Param("status") Integer status, @Param("beginTime") LocalDateTime beginTime, @Param("endTime") LocalDateTime endTime); // TODO @芋艿:收敛掉 @Select 注解操作,统一成 MyBatis-Plus 的方式,或者 xml @Select("SELECT user_id AS id, SUM(price) AS brokeragePrice FROM trade_brokerage_record " + "WHERE biz_type = #{bizType} AND status = #{status} AND deleted = FALSE " + "AND unfreeze_time BETWEEN #{beginTime} AND #{endTime} " + "GROUP BY user_id " + "ORDER BY brokeragePrice DESC") IPage selectSummaryPricePageGroupByUserId(IPage page, @Param("bizType") Integer bizType, @Param("status") Integer status, @Param("beginTime") LocalDateTime beginTime, @Param("endTime") LocalDateTime endTime); @Select("SELECT COUNT(1) FROM trade_brokerage_record " + "WHERE biz_type = #{bizType} AND status = #{status} AND deleted = FALSE " + "AND unfreeze_time BETWEEN #{beginTime} AND #{endTime} " + "GROUP BY user_id HAVING SUM(price) > #{brokeragePrice}") Integer selectCountByPriceGt(@Param("brokeragePrice") Integer brokeragePrice, @Param("bizType") Integer bizType, @Param("status") Integer status, @Param("beginTime") LocalDateTime beginTime, @Param("endTime") LocalDateTime endTime); }