提交 135a2392 authored 作者: hzh's avatar hzh

商城模块集成

上级 b4b1b71d
package org.dromara.mall.mapper.member;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.domain.member.MemberAddressDO;
import java.util.List;
/**
* 用户收件地址Mapper接口
*
* @author hzh
* @date 2025-01-21
*/
public interface MemberAddressMapper extends BaseMapperPlus<MemberAddressDO, MemberAddressDO> {
default MemberAddressDO selectByIdAndUserId(Long id, Long userId) {
return selectOne(MemberAddressDO::getId, id, MemberAddressDO::getUserId, userId);
}
default List<MemberAddressDO> selectListByUserIdAndDefaulted(Long userId, Boolean defaulted) {
return selectList(new LambdaQueryWrapperX<MemberAddressDO>().eq(MemberAddressDO::getUserId, userId)
.eqIfPresent(MemberAddressDO::getDefaultStatus, defaulted));
}
}
package org.dromara.mall.mapper.member;
import org.dromara.mall.domain.member.MemberConfigDO;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 会员配置Mapper接口
*
* @author hzh
* @date 2025-01-21
*/
public interface MemberConfigMapper extends BaseMapperPlus<MemberConfigDO, MemberConfigDO> {
}
package org.dromara.mall.mapper.member;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageParam;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.member.admin.level.vo.experience.MemberExperienceRecordPageReqVO;
import org.dromara.mall.domain.member.MemberExperienceRecordDO;
/**
* 会员经验记录Mapper接口
*
* @author hzh
* @date 2025-01-21
*/
public interface MemberExperienceRecordMapper extends BaseMapperPlusPlus<MemberExperienceRecordDO, MemberExperienceRecordDO> {
default PageResult<MemberExperienceRecordDO> selectPage(MemberExperienceRecordPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<MemberExperienceRecordDO>()
.eqIfPresent(MemberExperienceRecordDO::getUserId, reqVO.getUserId())
.eqIfPresent(MemberExperienceRecordDO::getBizId, reqVO.getBizId())
.eqIfPresent(MemberExperienceRecordDO::getBizType, reqVO.getBizType())
.eqIfPresent(MemberExperienceRecordDO::getTitle, reqVO.getTitle())
.betweenIfPresent(MemberExperienceRecordDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(MemberExperienceRecordDO::getId));
}
default PageResult<MemberExperienceRecordDO> selectPage(Long userId, PageParam pageParam) {
return selectPagePlus(pageParam, new LambdaQueryWrapper<MemberExperienceRecordDO>()
.eq(MemberExperienceRecordDO::getUserId, userId)
.orderByDesc(MemberExperienceRecordDO::getId));
}
}
package org.dromara.mall.mapper.member;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.member.admin.group.vo.MemberGroupPageReqVO;
import org.dromara.mall.domain.member.MemberGroupDO;
import java.util.List;
/**
* 用户分组Mapper接口
*
* @author hzh
* @date 2025-01-21
*/
public interface MemberGroupMapper extends BaseMapperPlusPlus<MemberGroupDO, MemberGroupDO> {
default PageResult<MemberGroupDO> selectPage(MemberGroupPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<MemberGroupDO>()
.likeIfPresent(MemberGroupDO::getName, reqVO.getName())
.eqIfPresent(MemberGroupDO::getStatus, reqVO.getStatus())
.betweenIfPresent(MemberGroupDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(MemberGroupDO::getId));
}
default List<MemberGroupDO> selectListByStatus(Integer status) {
return selectList(MemberGroupDO::getStatus, status);
}
}
package org.dromara.mall.mapper.member;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.member.admin.level.vo.level.MemberLevelListReqVO;
import org.dromara.mall.domain.member.MemberLevelDO;
import java.util.List;
/**
* 会员等级Mapper接口
*
* @author hzh
* @date 2025-01-21
*/
public interface MemberLevelMapper extends BaseMapperPlus<MemberLevelDO, MemberLevelDO> {
default List<MemberLevelDO> selectList(MemberLevelListReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<MemberLevelDO>()
.likeIfPresent(MemberLevelDO::getName, reqVO.getName())
.eqIfPresent(MemberLevelDO::getStatus, reqVO.getStatus())
.orderByAsc(MemberLevelDO::getLevel));
}
default List<MemberLevelDO> selectListByStatus(Integer status) {
return selectList(new LambdaQueryWrapperX<MemberLevelDO>()
.eq(MemberLevelDO::getStatus, status)
.orderByAsc(MemberLevelDO::getLevel));
}
}
package org.dromara.mall.mapper.member;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.member.admin.level.vo.record.MemberLevelRecordPageReqVO;
import org.dromara.mall.domain.member.MemberLevelRecordDO;
/**
* 会员等级记录Mapper接口
*
* @author hzh
* @date 2025-01-21
*/
public interface MemberLevelRecordMapper extends BaseMapperPlusPlus<MemberLevelRecordDO, MemberLevelRecordDO> {
default PageResult<MemberLevelRecordDO> selectPage(MemberLevelRecordPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<MemberLevelRecordDO>()
.eqIfPresent(MemberLevelRecordDO::getUserId, reqVO.getUserId())
.eqIfPresent(MemberLevelRecordDO::getLevelId, reqVO.getLevelId())
.betweenIfPresent(MemberLevelRecordDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(MemberLevelRecordDO::getId));
}
}
package org.dromara.mall.mapper.member;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.member.admin.point.vo.recrod.MemberPointRecordPageReqVO;
import org.dromara.mall.controller.member.app.point.vo.AppMemberPointRecordPageReqVO;
import org.dromara.mall.domain.member.MemberPointRecordDO;
import java.util.Set;
/**
* 用户积分记录Mapper接口
*
* @author hzh
* @date 2025-01-21
*/
public interface MemberPointRecordMapper extends BaseMapperPlusPlus<MemberPointRecordDO, MemberPointRecordDO> {
default PageResult<MemberPointRecordDO> selectPage(MemberPointRecordPageReqVO reqVO, Set<Long> userIds) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<MemberPointRecordDO>()
.inIfPresent(MemberPointRecordDO::getUserId, userIds)
.eqIfPresent(MemberPointRecordDO::getUserId, reqVO.getUserId())
.eqIfPresent(MemberPointRecordDO::getBizType, reqVO.getBizType())
.likeIfPresent(MemberPointRecordDO::getTitle, reqVO.getTitle())
.orderByDesc(MemberPointRecordDO::getId));
}
default PageResult<MemberPointRecordDO> selectPage(Long userId, AppMemberPointRecordPageReqVO pageReqVO) {
return selectPagePlus(pageReqVO, new LambdaQueryWrapperX<MemberPointRecordDO>()
.eq(MemberPointRecordDO::getUserId, userId)
.betweenIfPresent(MemberPointRecordDO::getCreateTime, pageReqVO.getCreateTime())
.gt(Boolean.TRUE.equals(pageReqVO.getAddStatus()),
MemberPointRecordDO::getPoint, 0)
.lt(Boolean.FALSE.equals(pageReqVO.getAddStatus()),
MemberPointRecordDO::getPoint, 0)
.orderByDesc(MemberPointRecordDO::getId));
}
}
package org.dromara.mall.mapper.member;
import org.dromara.mall.domain.member.MemberSignInConfigDO;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import java.util.List;
/**
* 签到规则Mapper接口
*
* @author hzh
* @date 2025-01-21
*/
public interface MemberSignInConfigMapper extends BaseMapperPlus<MemberSignInConfigDO, MemberSignInConfigDO> {
default MemberSignInConfigDO selectByDay(Integer day) {
return selectOne(MemberSignInConfigDO::getDay, day);
}
default List<MemberSignInConfigDO> selectListByStatus(Integer status) {
return selectList(MemberSignInConfigDO::getStatus, status);
}
}
package org.dromara.mall.mapper.member;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageParam;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.member.admin.signin.vo.record.MemberSignInRecordPageReqVO;
import org.dromara.mall.domain.member.MemberSignInRecordDO;
import java.util.List;
import java.util.Set;
/**
* 签到记录Mapper接口
*
* @author hzh
* @date 2025-01-21
*/
public interface MemberSignInRecordMapper extends BaseMapperPlusPlus<MemberSignInRecordDO, MemberSignInRecordDO> {
default PageResult<MemberSignInRecordDO> selectPage(MemberSignInRecordPageReqVO reqVO, Set<Long> userIds) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<MemberSignInRecordDO>()
.inIfPresent(MemberSignInRecordDO::getUserId, userIds)
.eqIfPresent(MemberSignInRecordDO::getUserId, reqVO.getUserId())
.eqIfPresent(MemberSignInRecordDO::getDay, reqVO.getDay())
.betweenIfPresent(MemberSignInRecordDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(MemberSignInRecordDO::getId));
}
default PageResult<MemberSignInRecordDO> selectPage(Long userId, PageParam pageParam) {
return selectPagePlus(pageParam, new LambdaQueryWrapperX<MemberSignInRecordDO>()
.eq(MemberSignInRecordDO::getUserId, userId)
.orderByDesc(MemberSignInRecordDO::getId));
}
/**
* 获取用户最近的签到记录信息,根据签到时间倒序
*
* @param userId 用户编号
* @return 签到记录列表
*/
default MemberSignInRecordDO selectLastRecordByUserId(Long userId) {
return selectOne(new QueryWrapper<MemberSignInRecordDO>()
.eq("user_id", userId)
.orderByDesc("create_time")
.last("limit 1"));
}
default Long selectCountByUserId(Long userId) {
return selectCount(MemberSignInRecordDO::getUserId, userId);
}
/**
* 获取用户的签到记录列表信息
*
* @param userId 用户编号
* @return 签到记录信息
*/
default List<MemberSignInRecordDO> selectListByUserId(Long userId) {
return selectList(MemberSignInRecordDO::getUserId, userId);
}
}
package org.dromara.mall.mapper.member;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.member.admin.tag.vo.MemberTagPageReqVO;
import org.dromara.mall.domain.member.MemberTagDO;
/**
* 会员标签Mapper接口
*
* @author hzh
* @date 2025-01-21
*/
public interface MemberTagMapper extends BaseMapperPlusPlus<MemberTagDO, MemberTagDO> {
default PageResult<MemberTagDO> selectPage(MemberTagPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<MemberTagDO>()
.likeIfPresent(MemberTagDO::getName, reqVO.getName())
.betweenIfPresent(MemberTagDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(MemberTagDO::getId));
}
default MemberTagDO selelctByName(String name) {
return selectOne(MemberTagDO::getName, name);
}
}
package org.dromara.mall.mapper.member;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.member.admin.user.vo.MemberUserPageReqVO;
import org.dromara.mall.domain.member.MemberUserDO;
import java.util.List;
import java.util.stream.Collectors;
/**
* 会员用户Mapper接口
*
* @author hzh
* @date 2025-01-21
*/
public interface MemberUserMapper extends BaseMapperPlusPlus<MemberUserDO, MemberUserDO> {
default MemberUserDO selectByMobile(String mobile) {
return selectOne(MemberUserDO::getMobile, mobile);
}
default MemberUserDO selectByThirdUserId(Long thirdUserId) {
return selectOne(MemberUserDO::getThirdUserId, thirdUserId);
}
default List<MemberUserDO> selectListByNicknameLike(String nickname) {
return selectList(new LambdaQueryWrapperX<MemberUserDO>()
.likeIfPresent(MemberUserDO::getNickname, nickname));
}
default PageResult<MemberUserDO> selectPage(MemberUserPageReqVO reqVO) {
// 处理 tagIds 过滤条件
String tagIdSql = "";
if (CollUtil.isNotEmpty(reqVO.getTagIds())) {
tagIdSql = reqVO.getTagIds().stream()
.map(tagId -> "FIND_IN_SET(" + tagId + ", tag_ids)")
.collect(Collectors.joining(" OR "));
}
// 分页查询
return selectPagePlus(reqVO, new LambdaQueryWrapperX<MemberUserDO>()
.likeIfPresent(MemberUserDO::getMobile, reqVO.getMobile())
.betweenIfPresent(MemberUserDO::getLoginDate, reqVO.getLoginDate())
.likeIfPresent(MemberUserDO::getNickname, reqVO.getNickname())
.betweenIfPresent(MemberUserDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(MemberUserDO::getLevelId, reqVO.getLevelId())
.eqIfPresent(MemberUserDO::getGroupId, reqVO.getGroupId())
.apply(StrUtil.isNotEmpty(tagIdSql), tagIdSql)
.orderByDesc(MemberUserDO::getId));
}
default Long selectCountByGroupId(Long groupId) {
return selectCount(MemberUserDO::getGroupId, groupId);
}
default Long selectCountByLevelId(Long levelId) {
return selectCount(MemberUserDO::getLevelId, levelId);
}
default Long selectCountByTagId(Long tagId) {
return selectCount(new LambdaQueryWrapperX<MemberUserDO>()
.apply("FIND_IN_SET({0}, tag_ids)", tagId));
}
/**
* 更新用户积分(增加)
*
* @param id 用户编号
* @param incrCount 增加积分(正数)
*/
default void updatePointIncr(Long id, Integer incrCount) {
Assert.isTrue(incrCount > 0);
LambdaUpdateWrapper<MemberUserDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<MemberUserDO>()
.setSql(" point = point + " + incrCount)
.eq(MemberUserDO::getId, id);
update(null, lambdaUpdateWrapper);
}
/**
* 更新用户积分(减少)
*
* @param id 用户编号
* @param incrCount 增加积分(负数)
* @return 更新行数
*/
default int updatePointDecr(Long id, Integer incrCount) {
Assert.isTrue(incrCount < 0);
LambdaUpdateWrapper<MemberUserDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<MemberUserDO>()
.setSql(" point = point + " + incrCount) // 负数,所以使用 + 号
.eq(MemberUserDO::getId, id);
return update(null, lambdaUpdateWrapper);
}
}
package org.dromara.mall.mapper.pay;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.pay.admin.app.vo.PayAppPageReqVO;
import org.dromara.mall.domain.pay.PayAppDO;
/**
* 支付应用信息Mapper接口
*
* @author hzh
* @date 2025-01-22
*/
public interface PayAppMapper extends BaseMapperPlusPlus<PayAppDO, PayAppDO> {
default PageResult<PayAppDO> selectPage(PayAppPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<PayAppDO>()
.likeIfPresent(PayAppDO::getName, reqVO.getName())
.likeIfPresent(PayAppDO::getAppKey, reqVO.getAppKey())
.eqIfPresent(PayAppDO::getStatus, reqVO.getStatus())
.betweenIfPresent(PayAppDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(PayAppDO::getId));
}
default PayAppDO selectByAppKey(String appKey) {
return selectOne(PayAppDO::getAppKey, appKey);
}
}
package org.dromara.mall.mapper.pay;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.domain.pay.PayChannelDO;
import java.util.Collection;
import java.util.List;
/**
* 支付渠道
Mapper接口
*
* @author hzh
* @date 2025-01-22
*/
public interface PayChannelMapper extends BaseMapperPlus<PayChannelDO, PayChannelDO> {
default PayChannelDO selectByAppIdAndCode(Long appId, String code) {
return selectOne(PayChannelDO::getAppId, appId, PayChannelDO::getCode, code);
}
default List<PayChannelDO> selectListByAppIds(Collection<Long> appIds){
return selectList(PayChannelDO::getAppId, appIds);
}
default List<PayChannelDO> selectListByAppId(Long appId, Integer status) {
return selectList(new LambdaQueryWrapperX<PayChannelDO>()
.eq(PayChannelDO::getAppId, appId)
.eq(PayChannelDO::getStatus, status));
}
}
package org.dromara.mall.mapper.pay;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageParam;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.domain.pay.PayDemoOrderDO;
/**
* 示例订单
Mapper接口
*
* @author hzh
* @date 2025-01-22
*/
public interface PayDemoOrderMapper extends BaseMapperPlusPlus<PayDemoOrderDO, PayDemoOrderDO> {
default PageResult<PayDemoOrderDO> selectPage(PageParam reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<PayDemoOrderDO>()
.orderByDesc(PayDemoOrderDO::getId));
}
default int updateByIdAndPayed(Long id, boolean wherePayed, PayDemoOrderDO updateObj) {
return update(updateObj, new LambdaQueryWrapperX<PayDemoOrderDO>()
.eq(PayDemoOrderDO::getId, id).eq(PayDemoOrderDO::getPayStatus, wherePayed));
}
}
package org.dromara.mall.mapper.pay;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageParam;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.domain.pay.PayDemoTransferDO;
/**
* 示例业务转账订单Mapper接口
*
* @author hzh
* @date 2025-01-22
*/
public interface PayDemoTransferMapper extends BaseMapperPlusPlus<PayDemoTransferDO, PayDemoTransferDO> {
default PageResult<PayDemoTransferDO> selectPage(PageParam pageParam){
return selectPagePlus(pageParam, new LambdaQueryWrapperX<PayDemoTransferDO>()
.orderByDesc(PayDemoTransferDO::getId));
}
}
package org.dromara.mall.mapper.pay;
import org.dromara.mall.domain.pay.PayNotifyLogDO;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import java.util.List;
/**
* 支付通知 App 的日志Mapper接口
*
* @author hzh
* @date 2025-01-22
*/
public interface PayNotifyLogMapper extends BaseMapperPlus<PayNotifyLogDO, PayNotifyLogDO> {
default List<PayNotifyLogDO> selectListByTaskId(Long taskId) {
return selectList(PayNotifyLogDO::getTaskId, taskId);
}
}
package org.dromara.mall.mapper.pay;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.pay.admin.notify.vo.PayNotifyTaskPageReqVO;
import org.dromara.mall.domain.pay.PayNotifyTaskDO;
import org.dromara.mall.enums.pay.notify.PayNotifyStatusEnum;
import java.time.LocalDateTime;
import java.util.List;
/**
* 商户支付、退款等的通知
Mapper接口
*
* @author hzh
* @date 2025-01-22
*/
public interface PayNotifyTaskMapper extends BaseMapperPlusPlus<PayNotifyTaskDO, PayNotifyTaskDO> {
/**
* 获得需要通知的 PayNotifyTaskDO 记录。需要满足如下条件:
*
* 1. status 非成功
* 2. nextNotifyTime 小于当前时间
*
* @return PayTransactionNotifyTaskDO 数组
*/
default List<PayNotifyTaskDO> selectListByNotify() {
return selectList(new LambdaQueryWrapper<PayNotifyTaskDO>()
.in(PayNotifyTaskDO::getStatus, PayNotifyStatusEnum.WAITING.getStatus(),
PayNotifyStatusEnum.REQUEST_SUCCESS.getStatus(), PayNotifyStatusEnum.REQUEST_FAILURE.getStatus())
.le(PayNotifyTaskDO::getNextNotifyTime, LocalDateTime.now()));
}
default PageResult<PayNotifyTaskDO> selectPage(PayNotifyTaskPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<PayNotifyTaskDO>()
.eqIfPresent(PayNotifyTaskDO::getAppId, reqVO.getAppId())
.eqIfPresent(PayNotifyTaskDO::getType, reqVO.getType())
.eqIfPresent(PayNotifyTaskDO::getDataId, reqVO.getDataId())
.eqIfPresent(PayNotifyTaskDO::getStatus, reqVO.getStatus())
.eqIfPresent(PayNotifyTaskDO::getMerchantOrderId, reqVO.getMerchantOrderId())
.betweenIfPresent(PayNotifyTaskDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(PayNotifyTaskDO::getId));
}
}
package org.dromara.mall.mapper.pay;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.dromara.mall.domain.pay.PayOrderExtensionDO;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import java.time.LocalDateTime;
import java.util.List;
/**
* 支付订单
Mapper接口
*
* @author hzh
* @date 2025-01-22
*/
public interface PayOrderExtensionMapper extends BaseMapperPlus<PayOrderExtensionDO, PayOrderExtensionDO> {
default PayOrderExtensionDO selectByNo(String no) {
return selectOne(PayOrderExtensionDO::getNo, no);
}
default int updateByIdAndStatus(Long id, Integer status, PayOrderExtensionDO update) {
return update(update, new LambdaQueryWrapper<PayOrderExtensionDO>()
.eq(PayOrderExtensionDO::getId, id).eq(PayOrderExtensionDO::getStatus, status));
}
default List<PayOrderExtensionDO> selectListByOrderId(Long orderId) {
return selectList(PayOrderExtensionDO::getOrderId, orderId);
}
default List<PayOrderExtensionDO> selectListByOrderIdAndStatus(Long orderId, Integer status) {
return selectList(PayOrderExtensionDO::getOrderId, orderId,
PayOrderExtensionDO::getStatus, status);
}
default List<PayOrderExtensionDO> selectListByStatusAndCreateTimeGe(Integer status, LocalDateTime minCreateTime) {
return selectList(new LambdaQueryWrapper<PayOrderExtensionDO>()
.eq(PayOrderExtensionDO::getStatus, status)
.ge(PayOrderExtensionDO::getCreateTime, minCreateTime));
}
}
package org.dromara.mall.mapper.pay;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.pay.admin.order.vo.PayOrderExportReqVO;
import org.dromara.mall.controller.pay.admin.order.vo.PayOrderPageReqVO;
import org.dromara.mall.domain.pay.PayOrderDO;
import java.time.LocalDateTime;
import java.util.List;
/**
* 支付订单
Mapper接口
*
* @author hzh
* @date 2025-01-22
*/
public interface PayOrderMapper extends BaseMapperPlusPlus<PayOrderDO, PayOrderDO> {
default PageResult<PayOrderDO> selectPage(PayOrderPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<PayOrderDO>()
.eqIfPresent(PayOrderDO::getAppId, reqVO.getAppId())
.eqIfPresent(PayOrderDO::getChannelCode, reqVO.getChannelCode())
.likeIfPresent(PayOrderDO::getMerchantOrderId, reqVO.getMerchantOrderId())
.likeIfPresent(PayOrderDO::getChannelOrderNo, reqVO.getChannelOrderNo())
.likeIfPresent(PayOrderDO::getNo, reqVO.getNo())
.eqIfPresent(PayOrderDO::getStatus, reqVO.getStatus())
.betweenIfPresent(PayOrderDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(PayOrderDO::getId));
}
default List<PayOrderDO> selectList(PayOrderExportReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<PayOrderDO>()
.eqIfPresent(PayOrderDO::getAppId, reqVO.getAppId())
.eqIfPresent(PayOrderDO::getChannelCode, reqVO.getChannelCode())
.likeIfPresent(PayOrderDO::getMerchantOrderId, reqVO.getMerchantOrderId())
.likeIfPresent(PayOrderDO::getChannelOrderNo, reqVO.getChannelOrderNo())
.likeIfPresent(PayOrderDO::getNo, reqVO.getNo())
.eqIfPresent(PayOrderDO::getStatus, reqVO.getStatus())
.betweenIfPresent(PayOrderDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(PayOrderDO::getId));
}
default Long selectCountByAppId(Long appId) {
return selectCount(PayOrderDO::getAppId, appId);
}
default PayOrderDO selectByAppIdAndMerchantOrderId(Long appId, String merchantOrderId) {
return selectOne(PayOrderDO::getAppId, appId,
PayOrderDO::getMerchantOrderId, merchantOrderId);
}
default int updateByIdAndStatus(Long id, Integer status, PayOrderDO update) {
return update(update, new LambdaQueryWrapper<PayOrderDO>()
.eq(PayOrderDO::getId, id).eq(PayOrderDO::getStatus, status));
}
default List<PayOrderDO> selectListByStatusAndExpireTimeLt(Integer status, LocalDateTime expireTime) {
return selectList(new LambdaQueryWrapper<PayOrderDO>()
.eq(PayOrderDO::getStatus, status)
.lt(PayOrderDO::getExpireTime, expireTime));
}
}
package org.dromara.mall.mapper.pay;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.pay.admin.refund.vo.PayRefundExportReqVO;
import org.dromara.mall.controller.pay.admin.refund.vo.PayRefundPageReqVO;
import org.dromara.mall.domain.pay.PayRefundDO;
import java.util.List;
/**
* 退款订单Mapper接口
*
* @author hzh
* @date 2025-01-22
*/
public interface PayRefundMapper extends BaseMapperPlusPlus<PayRefundDO, PayRefundDO> {
default Long selectCountByAppId(Long appId) {
return selectCount(PayRefundDO::getAppId, appId);
}
default PayRefundDO selectByAppIdAndMerchantRefundId(Long appId, String merchantRefundId) {
return selectOne(new LambdaQueryWrapperX<PayRefundDO>()
.eq(PayRefundDO::getAppId, appId)
.eq(PayRefundDO::getMerchantRefundId, merchantRefundId));
}
default Long selectCountByAppIdAndOrderId(Long appId, Long orderId, Integer status) {
return selectCount(new LambdaQueryWrapperX<PayRefundDO>()
.eq(PayRefundDO::getAppId, appId)
.eq(PayRefundDO::getOrderId, orderId)
.eq(PayRefundDO::getStatus, status));
}
default PayRefundDO selectByAppIdAndNo(Long appId, String no) {
return selectOne(new LambdaQueryWrapperX<PayRefundDO>()
.eq(PayRefundDO::getAppId, appId)
.eq(PayRefundDO::getNo, no));
}
default PayRefundDO selectByNo(String no) {
return selectOne(PayRefundDO::getNo, no);
}
default int updateByIdAndStatus(Long id, Integer status, PayRefundDO update) {
return update(update, new LambdaQueryWrapper<PayRefundDO>()
.eq(PayRefundDO::getId, id).eq(PayRefundDO::getStatus, status));
}
default PageResult<PayRefundDO> selectPage(PayRefundPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<PayRefundDO>()
.eqIfPresent(PayRefundDO::getAppId, reqVO.getAppId())
.eqIfPresent(PayRefundDO::getChannelCode, reqVO.getChannelCode())
.likeIfPresent(PayRefundDO::getMerchantOrderId, reqVO.getMerchantOrderId())
.likeIfPresent(PayRefundDO::getMerchantRefundId, reqVO.getMerchantRefundId())
.likeIfPresent(PayRefundDO::getChannelOrderNo, reqVO.getChannelOrderNo())
.likeIfPresent(PayRefundDO::getChannelRefundNo, reqVO.getChannelRefundNo())
.eqIfPresent(PayRefundDO::getStatus, reqVO.getStatus())
.betweenIfPresent(PayRefundDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(PayRefundDO::getId));
}
default List<PayRefundDO> selectList(PayRefundExportReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<PayRefundDO>()
.eqIfPresent(PayRefundDO::getAppId, reqVO.getAppId())
.eqIfPresent(PayRefundDO::getChannelCode, reqVO.getChannelCode())
.likeIfPresent(PayRefundDO::getMerchantOrderId, reqVO.getMerchantOrderId())
.likeIfPresent(PayRefundDO::getMerchantRefundId, reqVO.getMerchantRefundId())
.likeIfPresent(PayRefundDO::getChannelOrderNo, reqVO.getChannelOrderNo())
.likeIfPresent(PayRefundDO::getChannelRefundNo, reqVO.getChannelRefundNo())
.eqIfPresent(PayRefundDO::getStatus, reqVO.getStatus())
.betweenIfPresent(PayRefundDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(PayRefundDO::getId));
}
default List<PayRefundDO> selectListByStatus(Integer status) {
return selectList(PayRefundDO::getStatus, status);
}
}
package org.dromara.mall.mapper.pay;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.pay.admin.transfer.vo.PayTransferPageReqVO;
import org.dromara.mall.domain.pay.PayTransferDO;
import java.util.List;
/**
* 转账单Mapper接口
*
* @author hzh
* @date 2025-01-22
*/
public interface PayTransferMapper extends BaseMapperPlusPlus<PayTransferDO, PayTransferDO> {
default int updateByIdAndStatus(Long id, List<Integer> status, PayTransferDO updateObj) {
return update(updateObj, new LambdaQueryWrapper<PayTransferDO>()
.eq(PayTransferDO::getId, id).in(PayTransferDO::getStatus, status));
}
default PayTransferDO selectByAppIdAndMerchantTransferId(Long appId, String merchantTransferId){
return selectOne(PayTransferDO::getAppId, appId,
PayTransferDO::getMerchantTransferId, merchantTransferId);
}
default PageResult<PayTransferDO> selectPage(PayTransferPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<PayTransferDO>()
.eqIfPresent(PayTransferDO::getNo, reqVO.getNo())
.eqIfPresent(PayTransferDO::getAppId, reqVO.getAppId())
.eqIfPresent(PayTransferDO::getChannelCode, reqVO.getChannelCode())
.eqIfPresent(PayTransferDO::getMerchantTransferId, reqVO.getMerchantTransferId())
.eqIfPresent(PayTransferDO::getType, reqVO.getType())
.eqIfPresent(PayTransferDO::getStatus, reqVO.getStatus())
.likeIfPresent(PayTransferDO::getUserName, reqVO.getUserName())
.eqIfPresent(PayTransferDO::getChannelTransferNo, reqVO.getChannelTransferNo())
.betweenIfPresent(PayTransferDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(PayTransferDO::getId));
}
default List<PayTransferDO> selectListByStatus(Integer status) {
return selectList(PayTransferDO::getStatus, status);
}
default PayTransferDO selectByAppIdAndNo(Long appId, String no) {
return selectOne(PayTransferDO::getAppId, appId,
PayTransferDO::getNo, no);
}
}
package org.dromara.mall.mapper.pay;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.pay.admin.wallet.vo.wallet.PayWalletPageReqVO;
import org.dromara.mall.domain.pay.PayWalletDO;
/**
* 会员钱包Mapper接口
*
* @author hzh
* @date 2025-01-22
*/
public interface PayWalletMapper extends BaseMapperPlusPlus<PayWalletDO, PayWalletDO> {
default PayWalletDO selectByUserIdAndType(Long userId, Integer userType) {
return selectOne(PayWalletDO::getUserId, userId,
PayWalletDO::getUserType, userType);
}
default PageResult<PayWalletDO> selectPage(PayWalletPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<PayWalletDO>()
.eqIfPresent(PayWalletDO::getUserId, reqVO.getUserId())
.eqIfPresent(PayWalletDO::getUserType, reqVO.getUserType())
.betweenIfPresent(PayWalletDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(PayWalletDO::getId));
}
/**
* 当消费退款时候, 更新钱包
*
* @param id 钱包 id
* @param price 消费金额
*/
default int updateWhenConsumptionRefund(Long id, Integer price) {
LambdaUpdateWrapper<PayWalletDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<PayWalletDO>()
.setSql(" balance = balance + " + price
+ ", total_expense = total_expense - " + price)
.eq(PayWalletDO::getId, id);
return update(null, lambdaUpdateWrapper);
}
/**
* 当消费时候, 更新钱包
*
* @param price 消费金额
* @param id 钱包 id
*/
default int updateWhenConsumption(Long id, Integer price){
LambdaUpdateWrapper<PayWalletDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<PayWalletDO>()
.setSql(" balance = balance - " + price
+ ", total_expense = total_expense + " + price)
.eq(PayWalletDO::getId, id)
.ge(PayWalletDO::getBalance, price); // cas 逻辑
return update(null, lambdaUpdateWrapper);
}
/**
* 当充值的时候,更新钱包
*
* @param id 钱包 id
* @param price 钱包金额
*/
default int updateWhenRecharge(Long id, Integer price){
LambdaUpdateWrapper<PayWalletDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<PayWalletDO>()
.setSql(" balance = balance + " + price
+ ", total_recharge = total_recharge + " + price)
.eq(PayWalletDO::getId, id);
return update(null, lambdaUpdateWrapper);
}
/**
* 增加余额的时候,更新钱包
*
* @param id 钱包 id
* @param price 钱包金额
*/
default void updateWhenAdd(Long id, Integer price) {
LambdaUpdateWrapper<PayWalletDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<PayWalletDO>()
.setSql(" balance = balance + " + price)
.eq(PayWalletDO::getId, id);
update(null, lambdaUpdateWrapper);
}
/**
* 冻结钱包部分余额
*
* @param id 钱包 id
* @param price 冻结金额
*/
default int freezePrice(Long id, Integer price){
LambdaUpdateWrapper<PayWalletDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<PayWalletDO>()
.setSql(" balance = balance - " + price
+ ", freeze_price = freeze_price + " + price)
.eq(PayWalletDO::getId, id)
.ge(PayWalletDO::getBalance, price); // cas 逻辑
return update(null, lambdaUpdateWrapper);
}
/**
* 解冻钱包余额
*
* @param id 钱包 id
* @param price 解冻金额
*/
default int unFreezePrice(Long id, Integer price){
LambdaUpdateWrapper<PayWalletDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<PayWalletDO>()
.setSql(" balance = balance + " + price
+ ", freeze_price = freeze_price - " + price)
.eq(PayWalletDO::getId, id)
.ge(PayWalletDO::getFreezePrice, price); // cas 逻辑
return update(null, lambdaUpdateWrapper);
}
/**
* 当充值退款时, 更新钱包
*
* @param id 钱包 id
* @param price 退款金额
*/
default int updateWhenRechargeRefund(Long id, Integer price){
LambdaUpdateWrapper<PayWalletDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<PayWalletDO>()
.setSql(" freeze_price = freeze_price - " + price
+ ", total_recharge = total_recharge - " + price)
.eq(PayWalletDO::getId, id)
.ge(PayWalletDO::getFreezePrice, price)
.ge(PayWalletDO::getTotalRecharge, price);// cas 逻辑
return update(null, lambdaUpdateWrapper);
}
}
package org.dromara.mall.mapper.pay;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageParam;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.domain.pay.PayWalletRechargeDO;
/**
* 会员钱包充值Mapper接口
*
* @author hzh
* @date 2025-01-22
*/
public interface PayWalletRechargeMapper extends BaseMapperPlusPlus<PayWalletRechargeDO, PayWalletRechargeDO> {
default int updateByIdAndPaid(Long id, boolean wherePayStatus, PayWalletRechargeDO updateObj) {
return update(updateObj, new LambdaQueryWrapperX<PayWalletRechargeDO>()
.eq(PayWalletRechargeDO::getId, id).eq(PayWalletRechargeDO::getPayStatus, wherePayStatus));
}
default int updateByIdAndRefunded(Long id, Integer whereRefundStatus, PayWalletRechargeDO updateObj) {
return update(updateObj, new LambdaQueryWrapperX<PayWalletRechargeDO>()
.eq(PayWalletRechargeDO::getId, id).eq(PayWalletRechargeDO::getRefundStatus, whereRefundStatus));
}
default PageResult<PayWalletRechargeDO> selectPage(PageParam pageReqVO, Long walletId, Boolean payStatus) {
return selectPagePlus(pageReqVO, new LambdaQueryWrapperX<PayWalletRechargeDO>()
.eq(PayWalletRechargeDO::getWalletId, walletId)
.eq(PayWalletRechargeDO::getPayStatus, payStatus)
.orderByDesc(PayWalletRechargeDO::getId));
}
}
package org.dromara.mall.mapper.pay;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.pay.admin.wallet.vo.rechargepackage.WalletRechargePackagePageReqVO;
import org.dromara.mall.domain.pay.PayWalletRechargePackageDO;
import java.util.List;
/**
* 充值套餐Mapper接口
*
* @author hzh
* @date 2025-01-22
*/
public interface PayWalletRechargePackageMapper extends BaseMapperPlusPlus<PayWalletRechargePackageDO, PayWalletRechargePackageDO> {
default PageResult<PayWalletRechargePackageDO> selectPage(WalletRechargePackagePageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<PayWalletRechargePackageDO>()
.likeIfPresent(PayWalletRechargePackageDO::getName, reqVO.getName())
.eqIfPresent(PayWalletRechargePackageDO::getStatus, reqVO.getStatus())
.betweenIfPresent(PayWalletRechargePackageDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(PayWalletRechargePackageDO::getPayPrice));
}
default PayWalletRechargePackageDO selectByName(String name) {
return selectOne(PayWalletRechargePackageDO::getName, name);
}
default List<PayWalletRechargePackageDO> selectListByStatus(Integer status) {
return selectList(PayWalletRechargePackageDO::getStatus, status);
}
}
package org.dromara.mall.mapper.pay;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageParam;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.common.mybatis.core.query.QueryWrapperX;
import org.dromara.mall.domain.pay.PayWalletTransactionDO;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import static org.dromara.mall.controller.pay.app.wallet.vo.transaction.AppPayWalletTransactionPageReqVO.TYPE_EXPENSE;
import static org.dromara.mall.controller.pay.app.wallet.vo.transaction.AppPayWalletTransactionPageReqVO.TYPE_INCOME;
/**
* 会员钱包流水Mapper接口
*
* @author hzh
* @date 2025-01-22
*/
public interface PayWalletTransactionMapper extends BaseMapperPlusPlus<PayWalletTransactionDO, PayWalletTransactionDO> {
default PageResult<PayWalletTransactionDO> selectPage(Long walletId, Integer type,
PageParam pageParam, LocalDateTime[] createTime) {
LambdaQueryWrapperX<PayWalletTransactionDO> query = new LambdaQueryWrapperX<PayWalletTransactionDO>()
.eqIfPresent(PayWalletTransactionDO::getWalletId, walletId);
if (Objects.equals(type, TYPE_INCOME)) {
query.gt(PayWalletTransactionDO::getPrice, 0);
} else if (Objects.equals(type, TYPE_EXPENSE)) {
query.lt(PayWalletTransactionDO::getPrice, 0);
}
query.betweenIfPresent(PayWalletTransactionDO::getCreateTime, createTime);
query.orderByDesc(PayWalletTransactionDO::getId);
return selectPagePlus(pageParam, query);
}
default Integer selectPriceSum(Long walletId, Integer type, LocalDateTime[] createTime) {
// SQL sum 查询
List<Map<String, Object>> result = selectMaps(new QueryWrapperX<PayWalletTransactionDO>()
.select("SUM(price) AS priceSum")
.gt(Objects.equals(type, TYPE_INCOME), "price", 0) // 收入
.lt(Objects.equals(type, TYPE_EXPENSE), "price", 0) // 支出
.eq("wallet_id", walletId)
.between("create_time", createTime[0], createTime[1]));
// 获得 sum 结果
Map<String, Object> first = CollUtil.getFirst(result);
return MapUtil.getInt(first, "priceSum", 0);
}
default PayWalletTransactionDO selectByNo(String no) {
return selectOne(PayWalletTransactionDO::getNo, no);
}
default PayWalletTransactionDO selectByBiz(String bizId, Integer bizType) {
return selectOne(PayWalletTransactionDO::getBizId, bizId,
PayWalletTransactionDO::getBizType, bizType);
}
}
package org.dromara.mall.mapper.product;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.mall.domain.product.ProductBrandDO;
/**
* 商品品牌Mapper接口
*
* @author hzh
* @date 2025-01-20
*/
public interface ProductBrandMapper extends BaseMapperPlusPlus<ProductBrandDO, ProductBrandDO> {
}
package org.dromara.mall.mapper.product;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.domain.product.ProductBrowseHistoryDO;
/**
* 商品浏览记录Mapper接口
*
* @author hzh
* @date 2025-01-20
*/
public interface ProductBrowseHistoryMapper extends BaseMapperPlusPlus<ProductBrowseHistoryDO, ProductBrowseHistoryDO> {
default Page<ProductBrowseHistoryDO> selectPageByUserIdOrderByCreateTimeAsc(Long userId, Integer pageNo, Integer pageSize) {
Page<ProductBrowseHistoryDO> page = Page.of(pageNo, pageSize);
return selectPage(page, new LambdaQueryWrapperX<ProductBrowseHistoryDO>()
.eqIfPresent(ProductBrowseHistoryDO::getUserId, userId)
.orderByAsc(ProductBrowseHistoryDO::getCreateTime));
}
}
package org.dromara.mall.mapper.product;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.mall.domain.product.ProductCategoryDO;
/**
* 商品分类Mapper接口
*
* @author hzh
* @date 2025-01-20
*/
public interface ProductCategoryMapper extends BaseMapperPlus<ProductCategoryDO, ProductCategoryDO> {
}
package org.dromara.mall.mapper.product;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.mall.domain.product.ProductCommentDO;
/**
* 商品评论Mapper接口
*
* @author hzh
* @date 2025-01-20
*/
public interface ProductCommentMapper extends BaseMapperPlusPlus<ProductCommentDO, ProductCommentDO> {
}
package org.dromara.mall.mapper.product;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.mall.domain.product.ProductFavoriteDO;
/**
* 商品收藏Mapper接口
*
* @author hzh
* @date 2025-01-20
*/
public interface ProductFavoriteMapper extends BaseMapperPlusPlus<ProductFavoriteDO, ProductFavoriteDO> {
}
package org.dromara.mall.mapper.product;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.mall.domain.product.ProductPropertyDO;
/**
* 商品属性项Mapper接口
*
* @author hzh
* @date 2025-01-20
*/
public interface ProductPropertyMapper extends BaseMapperPlusPlus<ProductPropertyDO, ProductPropertyDO> {
}
package org.dromara.mall.mapper.product;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.mall.domain.product.ProductPropertyValueDO;
/**
* 商品属性值Mapper接口
*
* @author hzh
* @date 2025-01-20
*/
public interface ProductPropertyValueMapper extends BaseMapperPlusPlus<ProductPropertyValueDO, ProductPropertyValueDO> {
}
package org.dromara.mall.mapper.product;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.domain.product.ProductSkuDO;
import java.util.Collection;
import java.util.List;
/**
* 商品skuMapper接口
*
* @author hzh
* @date 2025-01-20
*/
public interface ProductSkuMapper extends BaseMapperPlus<ProductSkuDO, ProductSkuDO> {
default List<ProductSkuDO> selectListBySpuId(Long spuId) {
return selectList(ProductSkuDO::getSpuId, spuId);
}
default List<ProductSkuDO> selectListBySpuId(Collection<Long> spuIds) {
return selectList(ProductSkuDO::getSpuId, spuIds);
}
default void deleteBySpuId(Long spuId) {
delete(new LambdaQueryWrapperX<ProductSkuDO>().eq(ProductSkuDO::getSpuId, spuId));
}
/**
* 更新 SKU 库存(增加)、销量(减少)
*
* @param id 编号
* @param incrCount 增加库存(正数)
*/
default void updateStockIncr(Long id, Integer incrCount) {
Assert.isTrue(incrCount > 0);
LambdaUpdateWrapper<ProductSkuDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<ProductSkuDO>()
.setSql(" stock = stock + " + incrCount
+ ", sales_count = sales_count - " + incrCount)
.eq(ProductSkuDO::getId, id);
update(null, lambdaUpdateWrapper);
}
/**
* 更新 SKU 库存(减少)、销量(增加)
*
* @param id 编号
* @param incrCount 减少库存(负数)
* @return 更新条数
*/
default int updateStockDecr(Long id, Integer incrCount) {
Assert.isTrue(incrCount < 0);
incrCount = -incrCount; // 取正
LambdaUpdateWrapper<ProductSkuDO> updateWrapper = new LambdaUpdateWrapper<ProductSkuDO>()
.setSql(" stock = stock - " + incrCount
+ ", sales_count = sales_count + " + incrCount)
.eq(ProductSkuDO::getId, id)
.ge(ProductSkuDO::getStock, incrCount);
return update(null, updateWrapper);
}
}
package org.dromara.mall.mapper.product;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.product.admin.spu.vo.ProductSpuPageReqVO;
import org.dromara.mall.controller.product.app.spu.vo.AppProductSpuPageReqVO;
import org.dromara.mall.domain.product.ProductSpuDO;
import org.dromara.mall.enums.product.ProductConstants;
import org.dromara.mall.enums.product.spu.ProductSpuStatusEnum;
import java.util.Objects;
import java.util.Set;
/**
* 商品spuMapper接口
*
* @author hzh
* @date 2025-01-20
*/
public interface ProductSpuMapper extends BaseMapperPlusPlus<ProductSpuDO, ProductSpuDO> {
/**
* 获取商品 SPU 分页列表数据
*
* @param reqVO 分页请求参数
* @return 商品 SPU 分页列表数据
*/
default PageResult<ProductSpuDO> selectPage(ProductSpuPageReqVO reqVO) {
Integer tabType = reqVO.getTabType();
LambdaQueryWrapperX<ProductSpuDO> queryWrapper = new LambdaQueryWrapperX<ProductSpuDO>()
.likeIfPresent(ProductSpuDO::getName, reqVO.getName())
.eqIfPresent(ProductSpuDO::getCategoryId, reqVO.getCategoryId())
.betweenIfPresent(ProductSpuDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ProductSpuDO::getSort)
.orderByDesc(ProductSpuDO::getId);
appendTabQuery(tabType, queryWrapper);
return selectPagePlus(reqVO, queryWrapper);
}
/**
* 查询触发警戒库存的 SPU 数量
*
* @return 触发警戒库存的 SPU 数量
*/
@Override
default Long selectCount() {
LambdaQueryWrapperX<ProductSpuDO> queryWrapper = new LambdaQueryWrapperX<>();
// 库存小于等于警戒库存
queryWrapper.le(ProductSpuDO::getStock, ProductConstants.ALERT_STOCK)
// 如果库存触发警戒库存且状态为回收站的话则不计入触发警戒库存的个数
.notIn(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus());
return selectCount(queryWrapper);
}
/**
* 获得商品 SPU 分页,提供给用户 App 使用
*/
default PageResult<ProductSpuDO> selectPage(AppProductSpuPageReqVO pageReqVO, Set<Long> categoryIds) {
LambdaQueryWrapperX<ProductSpuDO> query = new LambdaQueryWrapperX<ProductSpuDO>()
// 关键字匹配,目前只匹配商品名
.likeIfPresent(ProductSpuDO::getName, pageReqVO.getKeyword())
// 分类
.inIfPresent(ProductSpuDO::getCategoryId, categoryIds);
// 上架状态 且有库存
query.eq(ProductSpuDO::getStatus, ProductSpuStatusEnum.ENABLE.getStatus());
// 排序逻辑
if (Objects.equals(pageReqVO.getSortField(), AppProductSpuPageReqVO.SORT_FIELD_SALES_COUNT)) {
query.last(String.format(" ORDER BY (sales_count + virtual_sales_count) %s, sort DESC, id DESC",
pageReqVO.getSortAsc() ? "ASC" : "DESC"));
} else if (Objects.equals(pageReqVO.getSortField(), AppProductSpuPageReqVO.SORT_FIELD_PRICE)) {
query.orderBy(true, pageReqVO.getSortAsc(), ProductSpuDO::getPrice)
.orderByDesc(ProductSpuDO::getSort).orderByDesc(ProductSpuDO::getId);
} else if (Objects.equals(pageReqVO.getSortField(), AppProductSpuPageReqVO.SORT_FIELD_CREATE_TIME)) {
query.orderBy(true, pageReqVO.getSortAsc(), ProductSpuDO::getCreateTime)
.orderByDesc(ProductSpuDO::getSort).orderByDesc(ProductSpuDO::getId);
} else {
query.orderByDesc(ProductSpuDO::getSort).orderByDesc(ProductSpuDO::getId);
}
return selectPagePlus(pageReqVO, query);
}
/**
* 更新商品 SPU 库存
*
* @param id 商品 SPU 编号
* @param incrCount 增加的库存数量
*/
default void updateStock(Long id, Integer incrCount) {
// 拼接 SQL
if (incrCount == 0) {
return;
}
String sql;
if (incrCount > 0) {
sql = " stock = stock + " + incrCount + ", sales_count = sales_count - " + incrCount;
} else {
sql = " stock = stock - " + Math.abs(incrCount) + ", sales_count = sales_count + " + Math.abs(incrCount);
}
// 执行更新
LambdaUpdateWrapper<ProductSpuDO> updateWrapper = new LambdaUpdateWrapper<ProductSpuDO>()
.setSql(sql)
.eq(ProductSpuDO::getId, id);
update(null, updateWrapper);
}
/**
* 添加后台 Tab 选项的查询条件
*
* @param tabType 标签类型
* @param query 查询条件
*/
static void appendTabQuery(Integer tabType, LambdaQueryWrapperX<ProductSpuDO> query) {
// 出售中商品
if (ObjectUtil.equals(ProductSpuPageReqVO.FOR_SALE, tabType)) {
query.eqIfPresent(ProductSpuDO::getStatus, ProductSpuStatusEnum.ENABLE.getStatus());
}
// 仓储中商品
if (ObjectUtil.equals(ProductSpuPageReqVO.IN_WAREHOUSE, tabType)) {
query.eqIfPresent(ProductSpuDO::getStatus, ProductSpuStatusEnum.DISABLE.getStatus());
}
// 已售空商品
if (ObjectUtil.equals(ProductSpuPageReqVO.SOLD_OUT, tabType)) {
query.eqIfPresent(ProductSpuDO::getStock, 0);
}
// 警戒库存
if (ObjectUtil.equals(ProductSpuPageReqVO.ALERT_STOCK, tabType)) {
query.le(ProductSpuDO::getStock, ProductConstants.ALERT_STOCK)
// 如果库存触发警戒库存且状态为回收站的话则不在警戒库存列表展示
.notIn(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus());
}
// 回收站
if (ObjectUtil.equals(ProductSpuPageReqVO.RECYCLE_BIN, tabType)) {
query.eqIfPresent(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus());
}
}
/**
* 更新商品 SPU 浏览量
*
* @param id 商品 SPU 编号
* @param incrCount 增加的数量
*/
default void updateBrowseCount(Long id, int incrCount) {
LambdaUpdateWrapper<ProductSpuDO> updateWrapper = new LambdaUpdateWrapper<ProductSpuDO>()
.setSql(" browse_count = browse_count +" + incrCount)
.eq(ProductSpuDO::getId, id);
update(null, updateWrapper);
}
}
package org.dromara.mall.mapper.promotion;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.article.vo.category.ArticleCategoryPageReqVO;
import org.dromara.mall.domain.promotion.ArticleCategoryDO;
import java.util.List;
/**
* 文章分类Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface ArticleCategoryMapper extends BaseMapperPlusPlus<ArticleCategoryDO, ArticleCategoryDO> {
default PageResult<ArticleCategoryDO> selectPage(ArticleCategoryPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<ArticleCategoryDO>()
.likeIfPresent(ArticleCategoryDO::getName, reqVO.getName())
.eqIfPresent(ArticleCategoryDO::getStatus, reqVO.getStatus())
.betweenIfPresent(ArticleCategoryDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ArticleCategoryDO::getSort));
}
default List<ArticleCategoryDO> selectListByStatus(Integer status) {
return selectList(ArticleCategoryDO::getStatus, status);
}
}
package org.dromara.mall.mapper.promotion;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.article.vo.article.ArticlePageReqVO;
import org.dromara.mall.controller.promotion.app.article.vo.article.AppArticlePageReqVO;
import org.dromara.mall.domain.promotion.ArticleDO;
import java.util.List;
/**
* 文章管理Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface ArticleMapper extends BaseMapperPlusPlus<ArticleDO, ArticleDO> {
default PageResult<ArticleDO> selectPage(ArticlePageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<ArticleDO>()
.eqIfPresent(ArticleDO::getCategoryId, reqVO.getCategoryId())
.eqIfPresent(ArticleDO::getTitle, reqVO.getTitle())
.eqIfPresent(ArticleDO::getAuthor, reqVO.getAuthor())
.eqIfPresent(ArticleDO::getStatus, reqVO.getStatus())
.eqIfPresent(ArticleDO::getSpuId, reqVO.getSpuId())
.eqIfPresent(ArticleDO::getRecommendHot, reqVO.getRecommendHot())
.eqIfPresent(ArticleDO::getRecommendBanner, reqVO.getRecommendBanner())
.betweenIfPresent(ArticleDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ArticleDO::getId));
}
default List<ArticleDO> selectList(Boolean recommendHot, Boolean recommendBanner) {
return selectList(new LambdaQueryWrapperX<ArticleDO>()
.eqIfPresent(ArticleDO::getRecommendHot, recommendHot)
.eqIfPresent(ArticleDO::getRecommendBanner, recommendBanner));
}
default List<ArticleDO> selectListByTitle(String title) {
return selectList(ArticleDO::getTitle, title);
}
default PageResult<ArticleDO> selectPage(AppArticlePageReqVO pageReqVO) {
return selectPagePlus(pageReqVO, new LambdaQueryWrapperX<ArticleDO>()
.eqIfPresent(ArticleDO::getCategoryId, pageReqVO.getCategoryId()));
}
default void updateBrowseCount(Long id) {
update(null, new LambdaUpdateWrapper<ArticleDO>()
.eq(ArticleDO::getId, id)
.setSql("browse_count = browse_count + 1"));
}
}
package org.dromara.mall.mapper.promotion;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.banner.vo.BannerPageReqVO;
import org.dromara.mall.domain.promotion.BannerDO;
import java.util.List;
/**
* Banner 广告位Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface BannerMapper extends BaseMapperPlusPlus<BannerDO, BannerDO> {
default PageResult<BannerDO> selectPage(BannerPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<BannerDO>()
.likeIfPresent(BannerDO::getTitle, reqVO.getTitle())
.eqIfPresent(BannerDO::getStatus, reqVO.getStatus())
.betweenIfPresent(BannerDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(BannerDO::getSort));
}
default void updateBrowseCount(Long id) {
update(null, new LambdaUpdateWrapper<BannerDO>()
.eq(BannerDO::getId, id)
.setSql("browse_count = browse_count + 1"));
}
default List<BannerDO> selectBannerListByPosition(Integer position) {
return selectList(new LambdaQueryWrapperX<BannerDO>().eq(BannerDO::getPosition, position));
}
}
package org.dromara.mall.mapper.promotion;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageParam;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.bargain.vo.activity.BargainActivityPageReqVO;
import org.dromara.mall.domain.promotion.BargainActivityDO;
import java.time.LocalDateTime;
import java.util.List;
/**
* 砍价活动Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface BargainActivityMapper extends BaseMapperPlusPlus<BargainActivityDO, BargainActivityDO> {
default PageResult<BargainActivityDO> selectPage(BargainActivityPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<BargainActivityDO>()
.likeIfPresent(BargainActivityDO::getName, reqVO.getName())
.eqIfPresent(BargainActivityDO::getStatus, reqVO.getStatus())
.orderByDesc(BargainActivityDO::getId));
}
default List<BargainActivityDO> selectListByStatus(Integer status) {
return selectList(BargainActivityDO::getStatus, status);
}
/**
* 更新活动库存
*
* @param id 活动编号
* @param count 扣减的库存数量
* @return 影响的行数
*/
default int updateStock(Long id, int count) {
// 情况一:增加库存
if (count > 0) {
return update(null, new LambdaUpdateWrapper<BargainActivityDO>()
.eq(BargainActivityDO::getId, id)
.setSql("stock = stock + " + count));
}
// 情况二:扣减库存
count = -count; // 取正
return update(null, new LambdaUpdateWrapper<BargainActivityDO>()
.eq(BargainActivityDO::getId, id)
.ge(BargainActivityDO::getStock, count)
.setSql("stock = stock - " + count));
}
/**
* 查询处在 now 日期时间且是 status 状态的活动分页
*
* @param pageReqVO 分页参数
* @param status 状态
* @param now 当前日期时间
* @return 活动分页
*/
default PageResult<BargainActivityDO> selectPage(PageParam pageReqVO, Integer status, LocalDateTime now) {
return selectPagePlus(pageReqVO, new LambdaQueryWrapperX<BargainActivityDO>()
.eq(BargainActivityDO::getStatus, status)
.le(BargainActivityDO::getStartTime, now)
.ge(BargainActivityDO::getEndTime, now));
}
/**
* 查询处在 now 日期时间且是 status 状态的活动分页
*
* @param status 状态
* @param now 当前日期时间
* @return 活动分页
*/
default List<BargainActivityDO> selectList(Integer count, Integer status, LocalDateTime now) {
return selectList(new LambdaQueryWrapperX<BargainActivityDO>()
.eq(BargainActivityDO::getStatus, status)
.le(BargainActivityDO::getStartTime, now)
.ge(BargainActivityDO::getEndTime, now)
.last("LIMIT " + count));
}
default BargainActivityDO selectBySpuIdAndStatusAndNow(Long spuId, Integer status) {
LocalDateTime now = LocalDateTime.now();
return selectOne(new LambdaQueryWrapperX<BargainActivityDO>()
.eq(BargainActivityDO::getSpuId, spuId)
.eq(BargainActivityDO::getStatus, status)
.lt(BargainActivityDO::getStartTime, now)
.gt(BargainActivityDO::getEndTime, now)); // 开始时间 < now < 结束时间,也就是说获取指定时间段的活动
}
}
package org.dromara.mall.mapper.promotion;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.dromara.common.mall.util.collection.CollectionUtils;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.bargain.vo.help.BargainHelpPageReqVO;
import org.dromara.mall.domain.promotion.BargainHelpDO;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* 砍价助力Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface BargainHelpMapper extends BaseMapperPlusPlus<BargainHelpDO, BargainHelpDO> {
default Long selectCountByUserIdAndActivityId(Long userId, Long activityId) {
return selectCount(new LambdaQueryWrapper<>(BargainHelpDO.class)
.eq(BargainHelpDO::getUserId, userId)
.eq(BargainHelpDO::getActivityId, activityId));
}
default Long selectUserCountMapByRecordId(Long recordId) {
return selectCount(BargainHelpDO::getRecordId, recordId);
}
default BargainHelpDO selectByUserIdAndRecordId(Long userId, Long recordId) {
return selectOne(new LambdaQueryWrapper<>(BargainHelpDO.class)
.eq(BargainHelpDO::getUserId, userId)
.eq(BargainHelpDO::getRecordId, recordId));
}
default Map<Long, Integer> selectUserCountMapByActivityId(Collection<Long> activityIds) {
// SQL count 查询
List<Map<String, Object>> result = selectMaps(new QueryWrapper<BargainHelpDO>()
.select("COUNT(DISTINCT(user_id)) AS userCount, activity_id AS activityId")
.in("activity_id", activityIds)
.groupBy("activity_id"));
if (CollUtil.isEmpty(result)) {
return Collections.emptyMap();
}
// 转换数据
return CollectionUtils.convertMap(result,
record -> MapUtil.getLong(record, "activityId"),
record -> MapUtil.getInt(record, "userCount" ));
}
default Map<Long, Integer> selectUserCountMapByRecordId(Collection<Long> recordIds) {
// SQL count 查询
List<Map<String, Object>> result = selectMaps(new QueryWrapper<BargainHelpDO>()
.select("COUNT(1) AS userCount, record_id AS recordId")
.in("record_id", recordIds)
.groupBy("record_id"));
if (CollUtil.isEmpty(result)) {
return Collections.emptyMap();
}
// 转换数据
return CollectionUtils.convertMap(result,
record -> MapUtil.getLong(record, "recordId"),
record -> MapUtil.getInt(record, "userCount" ));
}
default PageResult<BargainHelpDO> selectPage(BargainHelpPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<BargainHelpDO>()
.eqIfPresent(BargainHelpDO::getRecordId, reqVO.getRecordId())
.orderByDesc(BargainHelpDO::getId));
}
default List<BargainHelpDO> selectListByRecordId(Long recordId) {
return selectList(new LambdaQueryWrapperX<BargainHelpDO>()
.eq(BargainHelpDO::getRecordId, recordId));
}
}
package org.dromara.mall.mapper.promotion;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.dromara.common.mall.util.collection.CollectionUtils;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageParam;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.bargain.vo.recrod.BargainRecordPageReqVO;
import org.dromara.mall.domain.promotion.BargainRecordDO;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* 砍价记录Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface BargainRecordMapper extends BaseMapperPlusPlus<BargainRecordDO, BargainRecordDO> {
default BargainRecordDO selectByIdAndUserId(Long id, Long userId) {
return selectOne(BargainRecordDO::getId, id,
BargainRecordDO::getUserId, userId);
}
default List<BargainRecordDO> selectListByUserIdAndActivityIdAndStatus(
Long userId, Long activityId, Integer status) {
return selectList(new LambdaQueryWrapper<>(BargainRecordDO.class)
.eq(BargainRecordDO::getUserId, userId)
.eq(BargainRecordDO::getActivityId, activityId)
.eq(BargainRecordDO::getStatus, status));
}
default BargainRecordDO selectLastByUserIdAndActivityId(Long userId, Long activityId) {
return selectOne(new LambdaQueryWrapper<>(BargainRecordDO.class)
.eq(BargainRecordDO::getUserId, userId)
.eq(BargainRecordDO::getActivityId, activityId)
.orderByDesc(BargainRecordDO::getId)
.last("LIMIT 1"));
}
default Long selectCountByUserIdAndActivityIdAndStatus(
Long userId, Long activityId, Integer status) {
return selectCount(new LambdaQueryWrapper<>(BargainRecordDO.class)
.eq(BargainRecordDO::getUserId, userId)
.eq(BargainRecordDO::getActivityId, activityId)
.eq(BargainRecordDO::getStatus, status));
}
default int updateByIdAndBargainPrice(Long id, Integer whereBargainPrice, BargainRecordDO updateObj) {
return update(updateObj, new LambdaQueryWrapper<>(BargainRecordDO.class)
.eq(BargainRecordDO::getId, id)
.eq(BargainRecordDO::getBargainPrice, whereBargainPrice));
}
default Map<Long, Integer> selectUserCountByActivityIdsAndStatus(Collection<Long> activityIds, Integer status) {
// SQL count 查询
List<Map<String, Object>> result = selectMaps(new QueryWrapper<BargainRecordDO>()
.select("COUNT(DISTINCT(user_id)) AS userCount, activity_id AS activityId")
.in("activity_id", activityIds)
.eq(status != null, "status", status)
.groupBy("activity_id"));
if (CollUtil.isEmpty(result)) {
return Collections.emptyMap();
}
// 转换数据
return CollectionUtils.convertMap(result,
record -> MapUtil.getLong(record, "activityId"),
record -> MapUtil.getInt(record, "userCount" ));
}
@Select("SELECT COUNT(DISTINCT(user_id)) FROM promotion_bargain_record " +
"WHERE status = #{status}")
Integer selectUserCountByStatus(@Param("status") Integer status);
@Select("SELECT COUNT(DISTINCT(user_id)) FROM promotion_bargain_record " +
"WHERE activity_id = #{activityId} " +
"AND status = #{status}")
Integer selectUserCountByActivityIdAndStatus(@Param("activityId") Long activityId,
@Param("status") Integer status);
default PageResult<BargainRecordDO> selectPage(BargainRecordPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<BargainRecordDO>()
.eqIfPresent(BargainRecordDO::getStatus, reqVO.getStatus())
.betweenIfPresent(BargainRecordDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(BargainRecordDO::getId));
}
default PageResult<BargainRecordDO> selectBargainRecordPage(Long userId, PageParam pageParam) {
return selectPagePlus(pageParam, new LambdaQueryWrapperX<BargainRecordDO>()
.eq(BargainRecordDO::getUserId, userId)
.orderByDesc(BargainRecordDO::getId));
}
default List<BargainRecordDO> selectListByStatusAndCount(Integer status, Integer count) {
return selectList(new LambdaQueryWrapper<>(BargainRecordDO.class)
.eq(BargainRecordDO::getStatus, status)
.last("LIMIT " + count));
}
/**
* 更新砍价的订单编号,前提是 orderId 原本是空的
*
* @param id 砍价记录编号
* @param orderId 订单编号
* @return 更新数量
*/
default int updateOrderIdById(Long id, Long orderId) {
return update(new BargainRecordDO().setOrderId(orderId).setEndTime(LocalDateTime.now()),
new LambdaQueryWrapper<>(BargainRecordDO.class)
.eq(BargainRecordDO::getId, id)
.isNull(BargainRecordDO::getOrderId));
}
}
package org.dromara.mall.mapper.promotion;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageParam;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.combination.vo.activity.CombinationActivityPageReqVO;
import org.dromara.mall.domain.promotion.CombinationActivityDO;
import java.time.LocalDateTime;
import java.util.List;
/**
* 拼团活动Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface CombinationActivityMapper extends BaseMapperPlusPlus<CombinationActivityDO, CombinationActivityDO> {
default PageResult<CombinationActivityDO> selectPage(CombinationActivityPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<CombinationActivityDO>()
.likeIfPresent(CombinationActivityDO::getName, reqVO.getName())
.eqIfPresent(CombinationActivityDO::getStatus, reqVO.getStatus())
.orderByDesc(CombinationActivityDO::getId));
}
default List<CombinationActivityDO> selectListByStatus(Integer status) {
return selectList(CombinationActivityDO::getStatus, status);
}
default PageResult<CombinationActivityDO> selectPage(PageParam pageParam, Integer status) {
return selectPagePlus(pageParam, new LambdaQueryWrapperX<CombinationActivityDO>()
.eq(CombinationActivityDO::getStatus, status));
}
default CombinationActivityDO selectBySpuIdAndStatusAndNow(Long spuId, Integer status) {
LocalDateTime now = LocalDateTime.now();
return selectOne(new LambdaQueryWrapperX<CombinationActivityDO>()
.eq(CombinationActivityDO::getSpuId, spuId)
.eq(CombinationActivityDO::getStatus, status)
.lt(CombinationActivityDO::getStartTime, now)
.gt(CombinationActivityDO::getEndTime, now)); // 开始时间 < now < 结束时间,也就是说获取指定时间段的活动
}
}
package org.dromara.mall.mapper.promotion;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.combination.vo.product.CombinationProductPageReqVO;
import org.dromara.mall.domain.promotion.CombinationProductDO;
import java.util.Collection;
import java.util.List;
/**
* 拼团商品Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface CombinationProductMapper extends BaseMapperPlusPlus<CombinationProductDO, CombinationProductDO> {
default PageResult<CombinationProductDO> selectPage(CombinationProductPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<CombinationProductDO>()
.eqIfPresent(CombinationProductDO::getActivityId, reqVO.getActivityId())
.eqIfPresent(CombinationProductDO::getSpuId, reqVO.getSpuId())
.eqIfPresent(CombinationProductDO::getSkuId, reqVO.getSkuId())
.eqIfPresent(CombinationProductDO::getActivityStatus, reqVO.getActivityStatus())
.betweenIfPresent(CombinationProductDO::getActivityStartTime, reqVO.getActivityStartTime())
.betweenIfPresent(CombinationProductDO::getActivityEndTime, reqVO.getActivityEndTime())
.eqIfPresent(CombinationProductDO::getCombinationPrice, reqVO.getActivePrice())
.betweenIfPresent(CombinationProductDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(CombinationProductDO::getId));
}
default List<CombinationProductDO> selectListByActivityIds(Collection<Long> ids) {
return selectList(CombinationProductDO::getActivityId, ids);
}
}
package org.dromara.mall.mapper.promotion;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.dromara.common.mall.util.collection.CollectionUtils;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.combination.vo.recrod.CombinationRecordReqPageVO;
import org.dromara.mall.controller.promotion.app.combination.vo.record.AppCombinationRecordPageReqVO;
import org.dromara.mall.domain.promotion.CombinationRecordDO;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* 拼团记录Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface CombinationRecordMapper extends BaseMapperPlusPlus<CombinationRecordDO, CombinationRecordDO> {
default CombinationRecordDO selectByUserIdAndOrderId(Long userId, Long orderId) {
return selectOne(CombinationRecordDO::getUserId, userId,
CombinationRecordDO::getOrderId, orderId);
}
/**
* 查询拼团记录
*
* @param headId 团长编号
* @return 拼团记录
*/
default CombinationRecordDO selectByHeadId(Long headId, Integer status) {
return selectOne(new LambdaQueryWrapperX<CombinationRecordDO>()
.eq(CombinationRecordDO::getId, headId)
.eq(CombinationRecordDO::getStatus, status));
}
/**
* 查询拼团记录
*
* @param userId 用户 id
* @param activityId 活动 id
* @return 拼团记录
*/
default List<CombinationRecordDO> selectListByUserIdAndActivityId(Long userId, Long activityId) {
return selectList(new LambdaQueryWrapperX<CombinationRecordDO>()
.eq(CombinationRecordDO::getUserId, userId)
.eq(CombinationRecordDO::getActivityId, activityId));
}
/**
* 获取最近的 count 条数据
*
* @param count 数量
* @return 拼团记录列表
*/
default List<CombinationRecordDO> selectLatestList(int count) {
return selectList(new LambdaQueryWrapperX<CombinationRecordDO>()
.orderByDesc(CombinationRecordDO::getId)
.last("LIMIT " + count));
}
default List<CombinationRecordDO> selectListByActivityIdAndStatusAndHeadId(Long activityId, Integer status,
Long headId, Integer count) {
return selectList(new LambdaQueryWrapperX<CombinationRecordDO>()
.eqIfPresent(CombinationRecordDO::getActivityId, activityId)
.eqIfPresent(CombinationRecordDO::getStatus, status)
.eq(CombinationRecordDO::getHeadId, headId)
.orderByDesc(CombinationRecordDO::getId)
.last("LIMIT " + count));
}
default Map<Long, Integer> selectCombinationRecordCountMapByActivityIdAndStatusAndHeadId(Collection<Long> activityIds,
Integer status, Long headId) {
// SQL count 查询
List<Map<String, Object>> result = selectMaps(new QueryWrapper<CombinationRecordDO>()
.select("COUNT(DISTINCT(user_id)) AS recordCount, activity_id AS activityId")
.in("activity_id", activityIds)
.eq(status != null, "status", status)
.eq(headId != null, "head_id", headId)
.groupBy("activity_id"));
if (CollUtil.isEmpty(result)) {
return Collections.emptyMap();
}
// 转换数据
return CollectionUtils.convertMap(result,
record -> MapUtil.getLong(record, "activityId"),
record -> MapUtil.getInt(record, "recordCount"));
}
default PageResult<CombinationRecordDO> selectPage(CombinationRecordReqPageVO pageVO) {
LambdaQueryWrapperX<CombinationRecordDO> queryWrapper = new LambdaQueryWrapperX<CombinationRecordDO>()
.eqIfPresent(CombinationRecordDO::getStatus, pageVO.getStatus())
.betweenIfPresent(CombinationRecordDO::getCreateTime, pageVO.getCreateTime());
// 如果 headId 非空,说明查询指定团的团长 + 团员的拼团记录
if (pageVO.getHeadId() != null) {
queryWrapper.eq(CombinationRecordDO::getId, pageVO.getHeadId()) // 团长
.or().eq(CombinationRecordDO::getHeadId, pageVO.getHeadId()); // 团员
}
return selectPagePlus(pageVO, queryWrapper);
}
/**
* 查询指定条件的记录数
*
* @param status 状态,可为 null
* @param virtualGroup 是否虚拟成团,可为 null
* @param headId 团长编号,可为 null
* @return 记录数
*/
default Long selectCountByHeadAndStatusAndVirtualGroup(Integer status, Boolean virtualGroup, Long headId) {
return selectCount(new LambdaQueryWrapperX<CombinationRecordDO>()
.eqIfPresent(CombinationRecordDO::getStatus, status)
.eqIfPresent(CombinationRecordDO::getVirtualGroup, virtualGroup)
.eqIfPresent(CombinationRecordDO::getHeadId, headId));
}
/**
* 查询用户拼团记录(DISTINCT 去重),也就是说查询会员表中的用户有多少人参与过拼团活动每个人只统计一次
*
* @return 参加过拼团的用户数
*/
default Long selectUserCount() {
return selectCount(new QueryWrapper<CombinationRecordDO>()
.select("DISTINCT (user_id)"));
}
default List<CombinationRecordDO> selectListByHeadIdAndStatusAndExpireTimeLt(Long headId, Integer status, LocalDateTime dateTime) {
return selectList(new LambdaQueryWrapperX<CombinationRecordDO>()
.eq(CombinationRecordDO::getHeadId, headId)
.eq(CombinationRecordDO::getStatus, status)
.lt(CombinationRecordDO::getExpireTime, dateTime));
}
default List<CombinationRecordDO> selectListByHeadId(Long headId) {
return selectList(CombinationRecordDO::getHeadId, headId);
}
default PageResult<CombinationRecordDO> selectPage(Long userId, AppCombinationRecordPageReqVO pageReqVO) {
LambdaQueryWrapperX<CombinationRecordDO> queryWrapper = new LambdaQueryWrapperX<CombinationRecordDO>()
.eq(CombinationRecordDO::getUserId, userId)
.eqIfPresent(CombinationRecordDO::getStatus, pageReqVO.getStatus());
return selectPagePlus(pageReqVO, queryWrapper);
}
}
package org.dromara.mall.mapper.promotion;
import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.github.yulichang.toolkit.MPJWrappers;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.coupon.vo.coupon.CouponPageReqVO;
import org.dromara.mall.domain.promotion.CouponDO;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import static org.dromara.common.mall.util.collection.CollectionUtils.convertMap;
/**
* 优惠劵Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface CouponMapper extends BaseMapperPlusPlus<CouponDO, CouponDO> {
default PageResult<CouponDO> selectPage(CouponPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<CouponDO>()
.eqIfPresent(CouponDO::getTemplateId, reqVO.getTemplateId())
.eqIfPresent(CouponDO::getStatus, reqVO.getStatus())
.inIfPresent(CouponDO::getUserId, reqVO.getUserIds())
.betweenIfPresent(CouponDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(CouponDO::getId));
}
default List<CouponDO> selectListByUserIdAndStatus(Long userId, Integer status) {
return selectList(new LambdaQueryWrapperX<CouponDO>()
.eq(CouponDO::getUserId, userId).eq(CouponDO::getStatus, status));
}
default CouponDO selectByIdAndUserId(Long id, Long userId) {
return selectOne(new LambdaQueryWrapperX<CouponDO>()
.eq(CouponDO::getId, id).eq(CouponDO::getUserId, userId));
}
default int delete(Long id, Collection<Integer> whereStatuses) {
return update(null, new LambdaUpdateWrapper<CouponDO>()
.eq(CouponDO::getId, id).in(CouponDO::getStatus, whereStatuses)
.set(CouponDO::getDelFlag, 2));
}
default int updateByIdAndStatus(Long id, Integer status, CouponDO updateObj) {
return update(updateObj, new LambdaUpdateWrapper<CouponDO>()
.eq(CouponDO::getId, id).eq(CouponDO::getStatus, status));
}
default Long selectCountByUserIdAndStatus(Long userId, Integer status) {
return selectCount(new LambdaQueryWrapperX<CouponDO>()
.eq(CouponDO::getUserId, userId)
.eq(CouponDO::getStatus, status));
}
default List<CouponDO> selectListByTemplateIdAndUserId(Long templateId, Collection<Long> userIds) {
return selectList(new LambdaQueryWrapperX<CouponDO>()
.eq(CouponDO::getTemplateId, templateId)
.in(CouponDO::getUserId, userIds)
);
}
default Map<Long, Integer> selectCountByUserIdAndTemplateIdIn(Long userId, Collection<Long> templateIds) {
String templateIdAlias = "templateId";
String countAlias = "count";
List<Map<String, Object>> list = selectMaps(MPJWrappers.lambdaJoin(CouponDO.class)
.selectAs(CouponDO::getTemplateId, templateIdAlias)
.selectCount(CouponDO::getId, countAlias)
.eq(CouponDO::getUserId, userId)
.in(CouponDO::getTemplateId, templateIds)
.groupBy(CouponDO::getTemplateId));
return convertMap(list, map -> MapUtil.getLong(map, templateIdAlias), map -> MapUtil.getInt(map, countAlias));
}
default List<CouponDO> selectListByStatusAndValidEndTimeLe(Integer status, LocalDateTime validEndTime) {
return selectList(new LambdaQueryWrapperX<CouponDO>()
.eq(CouponDO::getStatus, status)
.le(CouponDO::getValidEndTime, validEndTime)
);
}
}
package org.dromara.mall.mapper.promotion;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.dromara.common.mall.enums.CommonStatusEnum;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.coupon.vo.template.CouponTemplatePageReqVO;
import org.dromara.mall.domain.promotion.CouponTemplateDO;
import org.dromara.mall.enums.promotion.coupon.CouponTemplateValidityTypeEnum;
import java.time.LocalDateTime;
import java.util.List;
import java.util.function.Consumer;
/**
* 优惠劵模板Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface CouponTemplateMapper extends BaseMapperPlusPlus<CouponTemplateDO, CouponTemplateDO> {
default PageResult<CouponTemplateDO> selectPage(CouponTemplatePageReqVO reqVO) {
// 构建可领取的查询条件
Consumer<LambdaQueryWrapper<CouponTemplateDO>> canTakeConsumer = buildCanTakeQueryConsumer(reqVO.getCanTakeTypes());
// 执行分页查询
return selectPagePlus(reqVO, new LambdaQueryWrapperX<CouponTemplateDO>()
.likeIfPresent(CouponTemplateDO::getName, reqVO.getName())
.eqIfPresent(CouponTemplateDO::getStatus, reqVO.getStatus())
.eqIfPresent(CouponTemplateDO::getDiscountType, reqVO.getDiscountType())
.betweenIfPresent(CouponTemplateDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(CouponTemplateDO::getProductScope, reqVO.getProductScope())
.and(reqVO.getProductScopeValue() != null, w -> w.apply("FIND_IN_SET({0}, product_scope_values)",
reqVO.getProductScopeValue()))
.and(canTakeConsumer != null, canTakeConsumer)
.orderByDesc(CouponTemplateDO::getId));
}
default void updateTakeCount(Long id, Integer incrCount) {
update(null, new LambdaUpdateWrapper<CouponTemplateDO>()
.eq(CouponTemplateDO::getId, id)
.setSql("take_count = take_count + " + incrCount));
}
default List<CouponTemplateDO> selectListByTakeType(Integer takeType) {
return selectList(CouponTemplateDO::getTakeType, takeType);
}
default List<CouponTemplateDO> selectList(List<Integer> canTakeTypes, Integer productScope, Long productScopeValue, Integer count) {
// 构建可领取的查询条件
Consumer<LambdaQueryWrapper<CouponTemplateDO>> canTakeConsumer = buildCanTakeQueryConsumer(canTakeTypes);
return selectList(new LambdaQueryWrapperX<CouponTemplateDO>()
.eqIfPresent(CouponTemplateDO::getProductScope, productScope)
.and(productScopeValue != null, w -> w.apply("FIND_IN_SET({0}, product_scope_values)",
productScopeValue))
.and(canTakeConsumer != null, canTakeConsumer)
.last(" LIMIT " + count)
.orderByDesc(CouponTemplateDO::getId));
}
static Consumer<LambdaQueryWrapper<CouponTemplateDO>> buildCanTakeQueryConsumer(List<Integer> canTakeTypes) {
Consumer<LambdaQueryWrapper<CouponTemplateDO>> canTakeConsumer = null;
if (CollUtil.isNotEmpty(canTakeTypes)) {
canTakeConsumer = w ->
w.eq(CouponTemplateDO::getStatus, CommonStatusEnum.ENABLE.getStatus()) // 1. 状态为可用的
.in(CouponTemplateDO::getTakeType, canTakeTypes) // 2. 领取方式一致
.and(ww -> ww.gt(CouponTemplateDO::getValidEndTime, LocalDateTime.now()) // 3.1 未过期
.or().eq(CouponTemplateDO::getValidityType, CouponTemplateValidityTypeEnum.TERM.getType())) // 3.2 领取之后
.apply(" (take_count < total_count OR total_count = -1)"); // 4. 剩余数量大于 0,或者无限领取
}
return canTakeConsumer;
}
}
package org.dromara.mall.mapper.promotion;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.discount.vo.DiscountActivityPageReqVO;
import org.dromara.mall.domain.promotion.DiscountActivityDO;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
/**
* 限时折扣活动Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface DiscountActivityMapper extends BaseMapperPlusPlus<DiscountActivityDO, DiscountActivityDO> {
default PageResult<DiscountActivityDO> selectPage(DiscountActivityPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<DiscountActivityDO>()
.likeIfPresent(DiscountActivityDO::getName, reqVO.getName())
.eqIfPresent(DiscountActivityDO::getStatus, reqVO.getStatus())
.betweenIfPresent(DiscountActivityDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(DiscountActivityDO::getId));
}
/**
* 获取指定活动编号的活动列表且
* 开始时间和结束时间小于给定时间 dateTime 的活动列表
*
* @param ids 活动编号
* @param dateTime 指定日期
* @return 活动列表
*/
default List<DiscountActivityDO> selectListByIdsAndDateTimeLt(Collection<Long> ids, LocalDateTime dateTime) {
return selectList(new LambdaQueryWrapperX<DiscountActivityDO>()
.in(DiscountActivityDO::getId, ids)
.lt(DiscountActivityDO::getStartTime, dateTime)
.gt(DiscountActivityDO::getEndTime, dateTime)// 开始时间 < 指定时间 < 结束时间,也就是说获取指定时间段的活动
.orderByDesc(DiscountActivityDO::getCreateTime));
}
}
package org.dromara.mall.mapper.promotion;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.domain.promotion.DiscountProductDO;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
/**
* 限时折扣商品
Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface DiscountProductMapper extends BaseMapperPlusPlus<DiscountProductDO, DiscountProductDO> {
default List<DiscountProductDO> selectListByActivityId(Long activityId) {
return selectList(DiscountProductDO::getActivityId, activityId);
}
default List<DiscountProductDO> selectListByActivityId(Collection<Long> activityIds) {
return selectList(DiscountProductDO::getActivityId, activityIds);
}
default void updateByActivityId(DiscountProductDO discountProductDO) {
update(discountProductDO, new LambdaUpdateWrapper<DiscountProductDO>()
.eq(DiscountProductDO::getActivityId, discountProductDO.getActivityId()));
}
default void deleteByActivityId(Long activityId) {
delete(DiscountProductDO::getActivityId, activityId);
}
default List<DiscountProductDO> selectListBySkuIdsAndStatusAndNow(Collection<Long> skuIds, Integer status) {
LocalDateTime now = LocalDateTime.now();
return selectList(new LambdaQueryWrapperX<DiscountProductDO>()
.in(DiscountProductDO::getSkuId, skuIds)
.eq(DiscountProductDO::getActivityStatus,status)
.lt(DiscountProductDO::getActivityStartTime, now)
.gt(DiscountProductDO::getActivityEndTime, now));
}
}
package org.dromara.mall.mapper.promotion;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.diy.vo.page.DiyPagePageReqVO;
import org.dromara.mall.domain.promotion.DiyPageDO;
import java.util.List;
/**
* 装修页面Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface DiyPageMapper extends BaseMapperPlusPlus<DiyPageDO, DiyPageDO> {
default PageResult<DiyPageDO> selectPage(DiyPagePageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<DiyPageDO>()
.likeIfPresent(DiyPageDO::getName, reqVO.getName())
.betweenIfPresent(DiyPageDO::getCreateTime, reqVO.getCreateTime())
// 模板下面的页面,在模板中管理
.isNull(DiyPageDO::getTemplateId)
.orderByDesc(DiyPageDO::getId));
}
default List<DiyPageDO> selectListByTemplateId(Long templateId) {
return selectList(DiyPageDO::getTemplateId, templateId);
}
default DiyPageDO selectByNameAndTemplateIdIsNull(String name) {
return selectOne(new LambdaQueryWrapperX<DiyPageDO>()
.eq(DiyPageDO::getName, name)
.isNull(DiyPageDO::getTemplateId));
}
}
package org.dromara.mall.mapper.promotion;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.diy.vo.template.DiyTemplatePageReqVO;
import org.dromara.mall.domain.promotion.DiyTemplateDO;
/**
* 装修模板Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface DiyTemplateMapper extends BaseMapperPlusPlus<DiyTemplateDO, DiyTemplateDO> {
default PageResult<DiyTemplateDO> selectPage(DiyTemplatePageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<DiyTemplateDO>()
.likeIfPresent(DiyTemplateDO::getName, reqVO.getName())
.eqIfPresent(DiyTemplateDO::getUsed, reqVO.getUsed())
.betweenIfPresent(DiyTemplateDO::getUsedTime, reqVO.getUsedTime())
.betweenIfPresent(DiyTemplateDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(DiyTemplateDO::getUsed) // 排序规则1:已使用的排到最前面
.orderByDesc(DiyTemplateDO::getId)); // 排序规则2:新创建的排到前面
}
default DiyTemplateDO selectByUsed(boolean used) {
return selectOne(DiyTemplateDO::getUsed, used);
}
default DiyTemplateDO selectByName(String name) {
return selectOne(DiyTemplateDO::getName, name);
}
}
package org.dromara.mall.mapper.promotion;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.domain.promotion.KefuConversationDO;
import java.util.List;
/**
* 客服会话Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface KefuConversationMapper extends BaseMapperPlusPlus<KefuConversationDO, KefuConversationDO> {
default List<KefuConversationDO> selectConversationList() {
return selectList(new LambdaQueryWrapperX<KefuConversationDO>()
.eq(KefuConversationDO::getAdminDeleted, Boolean.FALSE)
.orderByDesc(KefuConversationDO::getCreateTime));
}
default void updateAdminUnreadMessageCountIncrement(Long id) {
update(new LambdaUpdateWrapper<KefuConversationDO>()
.eq(KefuConversationDO::getId, id)
.setSql("admin_unread_message_count = admin_unread_message_count + 1"));
}
default KefuConversationDO selectByUserId(Long userId) {
return selectOne(KefuConversationDO::getUserId, userId);
}
}
package org.dromara.mall.mapper.promotion;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.query.QueryWrapperX;
import org.dromara.mall.controller.promotion.admin.kefu.vo.message.KeFuMessageListReqVO;
import org.dromara.mall.domain.promotion.KefuMessageDO;
import java.util.Collection;
import java.util.List;
/**
* 客服消息Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface KefuMessageMapper extends BaseMapperPlusPlus<KefuMessageDO, KefuMessageDO> {
/**
* 获得消息列表
* 1. 第一次查询时,不带时间,默认查询最新的十条消息
* 2. 第二次查询时,带时间,查询历史消息
*
* @param reqVO 列表请求
* @return 消息列表
*/
default List<KefuMessageDO> selectList(KeFuMessageListReqVO reqVO) {
return selectList(new QueryWrapperX<KefuMessageDO>()
.eqIfPresent("conversation_id", reqVO.getConversationId())
.ltIfPresent("create_time", reqVO.getCreateTime())
.orderByDesc("create_time")
.limitN(reqVO.getLimit()));
}
default List<KefuMessageDO> selectListByConversationIdAndUserTypeAndReadStatus(Long conversationId, Integer userType,
Boolean readStatus) {
return selectList(new LambdaQueryWrapper<KefuMessageDO>()
.eq(KefuMessageDO::getConversationId, conversationId)
.ne(KefuMessageDO::getSenderType, userType) // 管理员:查询出未读的会员消息,会员:查询出未读的客服消息
.eq(KefuMessageDO::getReadStatus, readStatus));
}
default void updateReadStatusBatchByIds(Collection<Long> ids, KefuMessageDO KefuMessageDO) {
update(KefuMessageDO, new UpdateWrapper<KefuMessageDO>()
.in("id", ids));
}
}
package org.dromara.mall.mapper.promotion;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.point.vo.activity.PointActivityPageReqVO;
import org.dromara.mall.domain.promotion.PointActivityDO;
/**
* 积分商城活动Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface PointActivityMapper extends BaseMapperPlusPlus<PointActivityDO, PointActivityDO> {
default PageResult<PointActivityDO> selectPage(PointActivityPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<PointActivityDO>()
.eqIfPresent(PointActivityDO::getStatus, reqVO.getStatus())
.orderByDesc(PointActivityDO::getSort));
}
/**
* 更新活动库存(减少)
*
* @param id 活动编号
* @param count 扣减的库存数量(正数)
* @return 影响的行数
*/
default int updateStockDecr(Long id, int count) {
Assert.isTrue(count > 0);
return update(null, new LambdaUpdateWrapper<PointActivityDO>()
.eq(PointActivityDO::getId, id)
.ge(PointActivityDO::getStock, count)
.setSql("stock = stock - " + count));
}
/**
* 更新活动库存(增加)
*
* @param id 活动编号
* @param count 增加的库存数量(正数)
* @return 影响的行数
*/
default int updateStockIncr(Long id, int count) {
Assert.isTrue(count > 0);
return update(null, new LambdaUpdateWrapper<PointActivityDO>()
.eq(PointActivityDO::getId, id)
.setSql("stock = stock + " + count));
}
}
package org.dromara.mall.mapper.promotion;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.mall.domain.promotion.PointProductDO;
import java.util.Collection;
import java.util.List;
/**
* 积分商城商品Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface PointProductMapper extends BaseMapperPlusPlus<PointProductDO, PointProductDO> {
default List<PointProductDO> selectListByActivityId(Collection<Long> activityIds) {
return selectList(PointProductDO::getActivityId, activityIds);
}
default List<PointProductDO> selectListByActivityId(Long activityId) {
return selectList(PointProductDO::getActivityId, activityId);
}
default void updateByActivityId(PointProductDO pointProductDO) {
update(pointProductDO, new LambdaUpdateWrapper<PointProductDO>()
.eq(PointProductDO::getActivityId, pointProductDO.getActivityId()));
}
default PointProductDO selectListByActivityIdAndSkuId(Long activityId, Long skuId) {
return selectOne(PointProductDO::getActivityId, activityId,
PointProductDO::getSkuId, skuId);
}
/**
* 更新活动库存(减少)
*
* @param id 活动编号
* @param count 扣减的库存数量(减少库存)
* @return 影响的行数
*/
default int updateStockDecr(Long id, int count) {
Assert.isTrue(count > 0);
return update(null, new LambdaUpdateWrapper<PointProductDO>()
.eq(PointProductDO::getId, id)
.ge(PointProductDO::getStock, count)
.setSql("stock = stock - " + count));
}
/**
* 更新活动库存(增加)
*
* @param id 活动编号
* @param count 需要增加的库存(增加库存)
* @return 影响的行数
*/
default int updateStockIncr(Long id, int count) {
Assert.isTrue(count > 0);
return update(null, new LambdaUpdateWrapper<PointProductDO>()
.eq(PointProductDO::getId, id)
.setSql("stock = stock + " + count));
}
}
package org.dromara.mall.mapper.promotion;
import cn.hutool.core.util.StrUtil;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.reward.vo.RewardActivityPageReqVO;
import org.dromara.mall.domain.promotion.RewardActivityDO;
import org.dromara.mall.enums.promotion.common.PromotionProductScopeEnum;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 满减送活动Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface RewardActivityMapper extends BaseMapperPlusPlus<RewardActivityDO, RewardActivityDO> {
default PageResult<RewardActivityDO> selectPage(RewardActivityPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<RewardActivityDO>()
.likeIfPresent(RewardActivityDO::getName, reqVO.getName())
.eqIfPresent(RewardActivityDO::getStatus, reqVO.getStatus())
.orderByDesc(RewardActivityDO::getId));
}
default List<RewardActivityDO> selectListBySpuIdAndStatusAndNow(Collection<Long> spuIds,
Collection<Long> categoryIds,
Integer status) {
LocalDateTime now = LocalDateTime.now();
Function<Collection<Long>, String> productScopeValuesFindInSetFunc = ids -> ids.stream()
.map(id -> StrUtil.format("FIND_IN_SET({}, product_scope_values) ", id))
.collect(Collectors.joining(" OR "));
return selectList(new LambdaQueryWrapperX<RewardActivityDO>()
.eq(RewardActivityDO::getStatus, status)
.lt(RewardActivityDO::getStartTime, now)
.gt(RewardActivityDO::getEndTime, now)
.and(i -> i.eq(RewardActivityDO::getProductScope, PromotionProductScopeEnum.SPU.getScope())
.and(i1 -> i1.apply(productScopeValuesFindInSetFunc.apply(spuIds)))
.or(i1 -> i1.eq(RewardActivityDO::getProductScope, PromotionProductScopeEnum.ALL.getScope()))
.or(i1 -> i1.eq(RewardActivityDO::getProductScope, PromotionProductScopeEnum.CATEGORY.getScope())
.and(i2 -> i2.apply(productScopeValuesFindInSetFunc.apply(categoryIds)))))
.orderByDesc(RewardActivityDO::getId)
);
}
}
package org.dromara.mall.mapper.promotion;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.seckill.vo.activity.SeckillActivityPageReqVO;
import org.dromara.mall.controller.promotion.app.seckill.vo.activity.AppSeckillActivityPageReqVO;
import org.dromara.mall.domain.promotion.SeckillActivityDO;
import java.time.LocalDateTime;
import java.util.List;
/**
* 秒杀活动Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface SeckillActivityMapper extends BaseMapperPlusPlus<SeckillActivityDO, SeckillActivityDO> {
default PageResult<SeckillActivityDO> selectPage(SeckillActivityPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<SeckillActivityDO>()
.likeIfPresent(SeckillActivityDO::getName, reqVO.getName())
.eqIfPresent(SeckillActivityDO::getStatus, reqVO.getStatus())
.betweenIfPresent(SeckillActivityDO::getCreateTime, reqVO.getCreateTime())
.apply(ObjectUtil.isNotNull(reqVO.getConfigId()), "FIND_IN_SET(" + reqVO.getConfigId() + ", config_ids) > 0")
.orderByDesc(SeckillActivityDO::getId));
}
default List<SeckillActivityDO> selectListBySpuIdAndStatus(Long spuId, Integer status) {
return selectList(SeckillActivityDO::getSpuId, spuId,
SeckillActivityDO::getStatus, status);
}
/**
* 更新活动库存(减少)
*
* @param id 活动编号
* @param count 扣减的库存数量(正数)
* @return 影响的行数
*/
default int updateStockDecr(Long id, int count) {
Assert.isTrue(count > 0);
return update(null, new LambdaUpdateWrapper<SeckillActivityDO>()
.eq(SeckillActivityDO::getId, id)
.ge(SeckillActivityDO::getStock, count)
.setSql("stock = stock - " + count));
}
/**
* 更新活动库存(增加)
*
* @param id 活动编号
* @param count 增加的库存数量(正数)
* @return 影响的行数
*/
default int updateStockIncr(Long id, int count) {
Assert.isTrue(count > 0);
return update(null, new LambdaUpdateWrapper<SeckillActivityDO>()
.eq(SeckillActivityDO::getId, id)
.setSql("stock = stock + " + count));
}
default PageResult<SeckillActivityDO> selectPage(AppSeckillActivityPageReqVO pageReqVO, Integer status, LocalDateTime dateTime) {
return selectPagePlus(pageReqVO, new LambdaQueryWrapperX<SeckillActivityDO>()
.eqIfPresent(SeckillActivityDO::getStatus, status)
.lt(SeckillActivityDO::getStartTime, dateTime)
.gt(SeckillActivityDO::getEndTime, dateTime)// 开始时间 < 指定时间 < 结束时间,也就是说获取指定时间段的活动
.apply(ObjectUtil.isNotNull(pageReqVO.getConfigId()), "FIND_IN_SET(" + pageReqVO.getConfigId() + ",config_ids) > 0"));
}
default SeckillActivityDO selectBySpuIdAndStatusAndNow(Long spuId, Integer status) {
LocalDateTime now = LocalDateTime.now();
return selectOne(new LambdaQueryWrapperX<SeckillActivityDO>()
.eq(SeckillActivityDO::getSpuId, spuId)
.eq(SeckillActivityDO::getStatus, status)
.lt(SeckillActivityDO::getStartTime, now)
.gt(SeckillActivityDO::getEndTime, now)); // 开始时间 < now < 结束时间,也就是说获取指定时间段的活动
}
}
package org.dromara.mall.mapper.promotion;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.promotion.admin.seckill.vo.config.SeckillConfigPageReqVO;
import org.dromara.mall.domain.promotion.SeckillConfigDO;
import java.util.List;
/**
* 秒杀时段Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface SeckillConfigMapper extends BaseMapperPlusPlus<SeckillConfigDO, SeckillConfigDO> {
default PageResult<SeckillConfigDO> selectPage(SeckillConfigPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<SeckillConfigDO>()
.likeIfPresent(SeckillConfigDO::getName, reqVO.getName())
.eqIfPresent(SeckillConfigDO::getStatus, reqVO.getStatus())
.orderByAsc(SeckillConfigDO::getStartTime));
}
default List<SeckillConfigDO> selectListByStatus(Integer status) {
return selectList(SeckillConfigDO::getStatus, status);
}
}
package org.dromara.mall.mapper.promotion;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.mall.domain.promotion.SeckillProductDO;
import java.util.Collection;
import java.util.List;
/**
* 秒杀参与商品Mapper接口
*
* @author hzh
* @date 2025-01-24
*/
public interface SeckillProductMapper extends BaseMapperPlusPlus<SeckillProductDO, SeckillProductDO> {
default List<SeckillProductDO> selectListByActivityId(Long activityId) {
return selectList(SeckillProductDO::getActivityId, activityId);
}
default SeckillProductDO selectByActivityIdAndSkuId(Long activityId, Long skuId) {
return selectOne(SeckillProductDO::getActivityId, activityId,
SeckillProductDO::getSkuId, skuId);
}
default List<SeckillProductDO> selectListByActivityId(Collection<Long> ids) {
return selectList(SeckillProductDO::getActivityId, ids);
}
/**
* 更新活动库存(减少)
*
* @param id 活动编号
* @param count 扣减的库存数量(减少库存)
* @return 影响的行数
*/
default int updateStockDecr(Long id, int count) {
Assert.isTrue(count > 0);
return update(null, new LambdaUpdateWrapper<SeckillProductDO>()
.eq(SeckillProductDO::getId, id)
.ge(SeckillProductDO::getStock, count)
.setSql("stock = stock - " + count));
}
/**
* 更新活动库存(增加)
*
* @param id 活动编号
* @param count 需要增加的库存(增加库存)
* @return 影响的行数
*/
default int updateStockIncr(Long id, int count) {
Assert.isTrue(count > 0);
return update(null, new LambdaUpdateWrapper<SeckillProductDO>()
.eq(SeckillProductDO::getId, id)
.setSql("stock = stock + " + count));
}
}
package org.dromara.mall.mapper.statistics.member;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.dromara.mall.controller.statistics.admin.member.vo.MemberRegisterCountRespVO;
import org.dromara.mall.controller.statistics.admin.member.vo.MemberSexStatisticsRespVO;
import org.dromara.mall.controller.statistics.admin.member.vo.MemberTerminalStatisticsRespVO;
import org.dromara.mall.service.statistics.member.bo.MemberAreaStatisticsRespBO;
import java.time.LocalDateTime;
import java.util.List;
/**
* 会员信息的统计 Mapper
*
* @author owen
*/
@Mapper
@SuppressWarnings("rawtypes")
public interface MemberStatisticsMapper extends BaseMapper {
List<MemberAreaStatisticsRespBO> selectSummaryListByAreaId();
List<MemberSexStatisticsRespVO> selectSummaryListBySex();
List<MemberTerminalStatisticsRespVO> selectSummaryListByRegisterTerminal();
Integer selectUserCount(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
/**
* 获得用户的每天注册数量列表
*
* @param beginTime 开始时间
* @param endTime 结束时间
* @return 每天注册数量列表
*/
List<MemberRegisterCountRespVO> selectListByCreateTimeBetween(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
}
package org.dromara.mall.mapper.statistics.pay;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.dromara.mall.service.statistics.pay.bo.RechargeSummaryRespBO;
import org.dromara.mall.service.statistics.trade.bo.WalletSummaryRespBO;
import java.time.LocalDateTime;
/**
* 支付钱包的统计 Mapper
*
* @author owen
*/
@Mapper
@SuppressWarnings("rawtypes")
public interface PayWalletStatisticsMapper extends BaseMapper {
WalletSummaryRespBO selectRechargeSummaryByPayTimeBetween(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime,
@Param("payStatus") Boolean payStatus);
WalletSummaryRespBO selectRechargeSummaryByRefundTimeBetween(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime,
@Param("refundStatus") Integer refundStatus);
Integer selectPriceSummaryByBizTypeAndCreateTimeBetween(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime,
@Param("bizType") Integer bizType);
RechargeSummaryRespBO selectRechargeSummaryGroupByWalletId(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime,
@Param("payStatus") Boolean payStatus);
Integer selectRechargePriceSummary(@Param("payStatus") Boolean payStatus);
}
package org.dromara.mall.mapper.statistics.product;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.page.SortablePageParam;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.common.mybatis.core.query.MPJLambdaWrapperX;
import org.dromara.mall.controller.statistics.admin.product.vo.ProductStatisticsReqVO;
import org.dromara.mall.controller.statistics.admin.product.vo.ProductStatisticsRespVO;
import org.dromara.mall.domain.statistics.ProductStatisticsDO;
import java.time.LocalDateTime;
import java.util.List;
/**
* 商品统计Mapper接口
*
* @author hzh
* @date 2025-01-20
*/
public interface ProductStatisticsMapper extends BaseMapperPlusPlus<ProductStatisticsDO, ProductStatisticsDO> {
default PageResult<ProductStatisticsDO> selectPageGroupBySpuId(ProductStatisticsReqVO reqVO, SortablePageParam pageParam) {
return selectPagePlus(pageParam, buildWrapper(reqVO)
.groupBy(ProductStatisticsDO::getSpuId)
.select(ProductStatisticsDO::getSpuId)
);
}
default List<ProductStatisticsDO> selectListByTimeBetween(ProductStatisticsReqVO reqVO) {
return selectList(buildWrapper(reqVO)
.groupBy(ProductStatisticsDO::getTime)
.select(ProductStatisticsDO::getTime));
}
default ProductStatisticsRespVO selectVoByTimeBetween(ProductStatisticsReqVO reqVO) {
return selectJoinOne(ProductStatisticsRespVO.class, buildWrapper(reqVO));
}
/**
* 构建 LambdaWrapper
*
* @param reqVO 查询参数
* @return LambdaWrapper
*/
private static MPJLambdaWrapperX<ProductStatisticsDO> buildWrapper(ProductStatisticsReqVO reqVO) {
return new MPJLambdaWrapperX<ProductStatisticsDO>()
.betweenIfPresent(ProductStatisticsDO::getTime, reqVO.getTimes())
.selectSum(ProductStatisticsDO::getBrowseCount)
.selectSum(ProductStatisticsDO::getBrowseUserCount)
.selectSum(ProductStatisticsDO::getFavoriteCount)
.selectSum(ProductStatisticsDO::getCartCount)
.selectSum(ProductStatisticsDO::getOrderCount)
.selectSum(ProductStatisticsDO::getOrderPayCount)
.selectSum(ProductStatisticsDO::getOrderPayPrice)
.selectSum(ProductStatisticsDO::getAfterSaleCount)
.selectSum(ProductStatisticsDO::getAfterSaleRefundPrice)
.selectAvg(ProductStatisticsDO::getBrowseConvertPercent);
}
/**
* 根据时间范围统计商品信息
*
* @param page 分页参数
* @param beginTime 起始时间
* @param endTime 截止时间
* @return 统计
*/
IPage<ProductStatisticsDO> selectStatisticsResultPageByTimeBetween(IPage<ProductStatisticsDO> page,
@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
default Long selectCountByTimeBetween(LocalDateTime beginTime, LocalDateTime endTime) {
return selectCount(new LambdaQueryWrapperX<ProductStatisticsDO>().between(ProductStatisticsDO::getTime, beginTime, endTime));
}
}
package org.dromara.mall.mapper.statistics.trade;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.dromara.mall.service.statistics.trade.bo.AfterSaleSummaryRespBO;
import java.time.LocalDateTime;
/**
* 售后订单的统计 Mapper
*
* @author owen
*/
@Mapper
public interface AfterSaleStatisticsMapper extends BaseMapper {
AfterSaleSummaryRespBO selectSummaryByRefundTimeBetween(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
Long selectCountByStatus(@Param("status") Integer status);
}
package org.dromara.mall.mapper.statistics.trade;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
/**
* 订单分销的统计 Mapper
*
* @author owen
*/
@Mapper
public interface BrokerageStatisticsMapper extends BaseMapper {
Integer selectSummaryPriceByStatusAndUnfreezeTimeBetween(@Param("bizType") Integer bizType,
@Param("status") Integer status,
@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
Long selectWithdrawCountByStatus(@Param("status") Integer status);
}
package org.dromara.mall.mapper.statistics.trade;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.mall.controller.statistics.admin.trade.vo.TradeOrderSummaryRespVO;
import org.dromara.mall.controller.statistics.admin.trade.vo.TradeOrderTrendRespVO;
import org.dromara.mall.domain.statistics.TradeStatisticsDO;
import org.dromara.mall.service.statistics.member.bo.MemberAreaStatisticsRespBO;
import java.time.LocalDateTime;
import java.util.List;
/**
* 交易订单的统计 Mapper
*
* @author owen
*/
@Mapper
public interface TradeOrderStatisticsMapper extends BaseMapperPlus<TradeStatisticsDO, TradeStatisticsDO> {
List<MemberAreaStatisticsRespBO> selectSummaryListByAreaId();
Integer selectCountByCreateTimeBetween(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
Integer selectCountByPayTimeBetween(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
Integer selectSummaryPriceByPayTimeBetween(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
Integer selectUserCountByCreateTimeBetween(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
Integer selectUserCountByPayTimeBetween(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
/**
* 按照支付时间统计订单(按天分组)
*
* @param beginTime 支付起始时间
* @param endTime 支付截止时间
* @return 订单统计列表
*/
List<TradeOrderTrendRespVO> selectListByPayTimeBetweenAndGroupByDay(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
/**
* 按照支付时间统计订单(按月分组)
*
* @param beginTime 支付起始时间
* @param endTime 支付截止时间
* @return 订单统计列表
*/
List<TradeOrderTrendRespVO> selectListByPayTimeBetweenAndGroupByMonth(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
Long selectCountByStatusAndDeliveryType(@Param("status") Integer status, @Param("deliveryType") Integer deliveryType);
TradeOrderSummaryRespVO selectPaySummaryByPayStatusAndPayTimeBetween(@Param("payStatus") Boolean payStatus,
@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
}
package org.dromara.mall.mapper.statistics.trade;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.statistics.admin.trade.vo.TradeTrendSummaryRespVO;
import org.dromara.mall.domain.statistics.TradeStatisticsDO;
import org.dromara.mall.service.statistics.trade.bo.TradeSummaryRespBO;
import java.time.LocalDateTime;
import java.util.List;
/**
* 交易统计Mapper接口
*
* @author hzh
* @date 2025-02-06
*/
public interface TradeStatisticsMapper extends BaseMapperPlus<TradeStatisticsDO, TradeStatisticsDO> {
TradeSummaryRespBO selectOrderCreateCountSumAndOrderPayPriceSumByTimeBetween(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
TradeTrendSummaryRespVO selectVoByTimeBetween(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
default List<TradeStatisticsDO> selectListByTimeBetween(LocalDateTime beginTime, LocalDateTime endTime) {
return selectList(new LambdaQueryWrapperX<TradeStatisticsDO>()
.between(TradeStatisticsDO::getTime, beginTime, endTime));
}
Integer selectExpensePriceByTimeBetween(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
default TradeStatisticsDO selectByTimeBetween(LocalDateTime beginTime, LocalDateTime endTime) {
return selectOne(new LambdaQueryWrapperX<TradeStatisticsDO>()
.between(TradeStatisticsDO::getTime, beginTime, endTime));
}
}
package org.dromara.mall.mapper.trade;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.mall.domain.trade.AfterSaleLogDO;
import java.util.List;
/**
* 售后订单日志Mapper接口
*
* @author hzh
* @date 2025-02-06
*/
public interface AfterSaleLogMapper extends BaseMapperPlus<AfterSaleLogDO, AfterSaleLogDO> {
default List<AfterSaleLogDO> selectListByAfterSaleId(Long afterSaleId) {
return selectList(new LambdaQueryWrapper<AfterSaleLogDO>()
.eq(AfterSaleLogDO::getAfterSaleId, afterSaleId)
.orderByDesc(AfterSaleLogDO::getCreateTime));
}
}
package org.dromara.mall.mapper.trade;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageParam;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.trade.admin.aftersale.vo.AfterSalePageReqVO;
import org.dromara.mall.domain.trade.AfterSaleDO;
import java.util.Collection;
/**
* 售后订单Mapper接口
*
* @author hzh
* @date 2025-02-06
*/
public interface AfterSaleMapper extends BaseMapperPlusPlus<AfterSaleDO, AfterSaleDO> {
default PageResult<AfterSaleDO> selectPagePlus(AfterSalePageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<AfterSaleDO>()
.eqIfPresent(AfterSaleDO::getUserId, reqVO.getUserId())
.likeIfPresent(AfterSaleDO::getNo, reqVO.getNo())
.eqIfPresent(AfterSaleDO::getStatus, reqVO.getStatus())
.eqIfPresent(AfterSaleDO::getType, reqVO.getType())
.eqIfPresent(AfterSaleDO::getWay, reqVO.getWay())
.likeIfPresent(AfterSaleDO::getOrderNo, reqVO.getOrderNo())
.likeIfPresent(AfterSaleDO::getSpuName, reqVO.getSpuName())
.betweenIfPresent(AfterSaleDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(AfterSaleDO::getId));
}
default PageResult<AfterSaleDO> selectPagePlus(Long userId, PageParam pageParam) {
return selectPagePlus(pageParam, new LambdaQueryWrapperX<AfterSaleDO>()
.eqIfPresent(AfterSaleDO::getUserId, userId)
.orderByDesc(AfterSaleDO::getId));
}
default int updateByIdAndStatus(Long id, Integer status, AfterSaleDO update) {
return update(update, new LambdaUpdateWrapper<AfterSaleDO>()
.eq(AfterSaleDO::getId, id).eq(AfterSaleDO::getStatus, status));
}
default AfterSaleDO selectByIdAndUserId(Long id, Long userId) {
return selectOne(AfterSaleDO::getId, id,
AfterSaleDO::getUserId, userId);
}
default Long selectCountByUserIdAndStatus(Long userId, Collection<Integer> statuses) {
return selectCount(new LambdaQueryWrapperX<AfterSaleDO>()
.eq(AfterSaleDO::getUserId, userId)
.in(AfterSaleDO::getStatus, statuses));
}
}
package org.dromara.mall.mapper.trade;
import cn.hutool.core.bean.BeanUtil;
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.Param;
import org.apache.ibatis.annotations.Select;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.trade.admin.brokerage.vo.record.BrokerageRecordPageReqVO;
import org.dromara.mall.controller.trade.app.brokerage.vo.user.AppBrokerageUserRankByPriceRespVO;
import org.dromara.mall.domain.trade.BrokerageRecordDO;
import org.dromara.mall.service.trade.brokerage.bo.UserBrokerageSummaryRespBO;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 佣金记录Mapper接口
*
* @author hzh
* @date 2025-02-06
*/
public interface BrokerageRecordMapper extends BaseMapperPlusPlus<BrokerageRecordDO, BrokerageRecordDO> {
default PageResult<BrokerageRecordDO> selectPage(BrokerageRecordPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<BrokerageRecordDO>()
.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<BrokerageRecordDO> selectListByStatusAndUnfreezeTimeLt(Integer status, LocalDateTime unfreezeTime) {
return selectList(new LambdaQueryWrapper<BrokerageRecordDO>()
.eq(BrokerageRecordDO::getStatus, status)
.lt(BrokerageRecordDO::getUnfreezeTime, unfreezeTime));
}
default int updateByIdAndStatus(Long id, Integer status, BrokerageRecordDO updateObj) {
return update(updateObj, new LambdaQueryWrapper<BrokerageRecordDO>()
.eq(BrokerageRecordDO::getId, id)
.eq(BrokerageRecordDO::getStatus, status));
}
default List<BrokerageRecordDO> selectListByBizTypeAndBizId(Integer bizType, String bizId) {
return selectList(BrokerageRecordDO::getBizType, bizType,
BrokerageRecordDO::getBizId, bizId);
}
default List<UserBrokerageSummaryRespBO> selectCountAndSumPriceByUserIdInAndBizTypeAndStatus(Collection<Long> userIds,
Integer bizType,
Integer status) {
List<Map<String, Object>> 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<AppBrokerageUserRankByPriceRespVO> 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);
}
package org.dromara.mall.mapper.trade;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.page.SortingField;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.trade.admin.brokerage.vo.user.BrokerageUserPageReqVO;
import org.dromara.mall.controller.trade.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO;
import org.dromara.mall.controller.trade.app.brokerage.vo.user.AppBrokerageUserRankByUserCountRespVO;
import org.dromara.mall.domain.trade.BrokerageUserDO;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* 分销用户Mapper接口
*
* @author hzh
* @date 2025-02-06
*/
public interface BrokerageUserMapper extends BaseMapperPlusPlus<BrokerageUserDO, BrokerageUserDO> {
default PageResult<BrokerageUserDO> selectPage(BrokerageUserPageReqVO reqVO, List<Long> ids) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<BrokerageUserDO>()
.inIfPresent(BrokerageUserDO::getId, ids)
.eqIfPresent(BrokerageUserDO::getBrokerageEnabled, reqVO.getBrokerageEnabled())
.betweenIfPresent(BrokerageUserDO::getCreateTime, reqVO.getCreateTime())
.betweenIfPresent(BrokerageUserDO::getBindUserTime, reqVO.getBindUserTime())
.orderByDesc(BrokerageUserDO::getId));
}
/**
* 更新用户可用佣金(增加)
*
* @param id 用户编号
* @param incrCount 增加佣金(正数)
*/
default void updatePriceIncr(Long id, Integer incrCount) {
Assert.isTrue(incrCount > 0);
LambdaUpdateWrapper<BrokerageUserDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<BrokerageUserDO>()
.setSql(" brokerage_price = brokerage_price + " + incrCount)
.eq(BrokerageUserDO::getId, id);
update(null, lambdaUpdateWrapper);
}
/**
* 更新用户可用佣金(减少)
* 注意:理论上佣金可能已经提现,这时会扣出负数,确保平台不会造成损失
*
* @param id 用户编号
* @param incrCount 增加佣金(负数)
* @return 更新行数
*/
default int updatePriceDecr(Long id, Integer incrCount) {
Assert.isTrue(incrCount < 0);
LambdaUpdateWrapper<BrokerageUserDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<BrokerageUserDO>()
.setSql(" brokerage_price = brokerage_price + " + incrCount) // 负数,所以使用 + 号
.eq(BrokerageUserDO::getId, id);
return update(null, lambdaUpdateWrapper);
}
/**
* 更新用户冻结佣金(增加)
*
* @param id 用户编号
* @param incrCount 增加冻结佣金(正数)
*/
default void updateFrozenPriceIncr(Long id, Integer incrCount) {
Assert.isTrue(incrCount > 0);
LambdaUpdateWrapper<BrokerageUserDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<BrokerageUserDO>()
.setSql(" frozen_price = frozen_price + " + incrCount)
.eq(BrokerageUserDO::getId, id);
update(null, lambdaUpdateWrapper);
}
/**
* 更新用户冻结佣金(减少)
* 注意:理论上冻结佣金可能已经解冻,这时会扣出负数,确保平台不会造成损失
*
* @param id 用户编号
* @param incrCount 减少冻结佣金(负数)
*/
default void updateFrozenPriceDecr(Long id, Integer incrCount) {
Assert.isTrue(incrCount < 0);
LambdaUpdateWrapper<BrokerageUserDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<BrokerageUserDO>()
.setSql(" frozen_price = frozen_price + " + incrCount) // 负数,所以使用 + 号
.eq(BrokerageUserDO::getId, id);
update(null, lambdaUpdateWrapper);
}
/**
* 更新用户冻结佣金(减少), 更新用户佣金(增加)
*
* @param id 用户编号
* @param incrCount 减少冻结佣金(负数)
* @return 更新条数
*/
default int updateFrozenPriceDecrAndPriceIncr(Long id, Integer incrCount) {
Assert.isTrue(incrCount < 0);
LambdaUpdateWrapper<BrokerageUserDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<BrokerageUserDO>()
.setSql(" frozen_price = frozen_price + " + incrCount + // 负数,所以使用 + 号
", brokerage_price = brokerage_price + " + -incrCount) // 负数,所以使用 - 号
.eq(BrokerageUserDO::getId, id)
.ge(BrokerageUserDO::getFrozenPrice, -incrCount); // cas 逻辑
return update(null, lambdaUpdateWrapper);
}
default void updateBindUserIdAndBindUserTimeToNull(Long id) {
update(null, new LambdaUpdateWrapper<BrokerageUserDO>()
.eq(BrokerageUserDO::getId, id)
.set(BrokerageUserDO::getBindUserId, null).set(BrokerageUserDO::getBindUserTime, null));
}
default void updateEnabledFalseAndBrokerageTimeToNull(Long id) {
update(null, new LambdaUpdateWrapper<BrokerageUserDO>()
.eq(BrokerageUserDO::getId, id)
.set(BrokerageUserDO::getBrokerageEnabled, false).set(BrokerageUserDO::getBrokerageTime, null));
}
@Select("SELECT bind_user_id AS id, COUNT(1) AS brokerageUserCount FROM trade_brokerage_user " +
"WHERE bind_user_id IS NOT NULL AND deleted = FALSE " +
"AND bind_user_time BETWEEN #{beginTime} AND #{endTime} " +
"GROUP BY bind_user_id " +
"ORDER BY brokerageUserCount DESC")
IPage<AppBrokerageUserRankByUserCountRespVO> selectCountPageGroupByBindUserId(Page<?> page,
@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
/**
* 下级分销统计(分页)
*
* @param bizType 业务类型
* @param status 状态
* @param ids 用户编号列表
* @param sortingField 排序字段
* @return 下级分销统计分页列表
*/
IPage<AppBrokerageUserChildSummaryRespVO> selectSummaryPageByUserId(Page<?> page,
@Param("bizType") Integer bizType,
@Param("status") Integer status,
@Param("ids") Collection<Long> ids,
@Param("sortingField") SortingField sortingField);
/**
* 获得被 bindUserIds 推广的用户编号数组
*
* @param bindUserIds 推广员编号数组
* @return 用户编号数组
*/
default List<Long> selectIdListByBindUserIdIn(Collection<Long> bindUserIds) {
return Convert.toList(Long.class,
selectObjs(new LambdaQueryWrapperX<BrokerageUserDO>()
.select(Collections.singletonList(BrokerageUserDO::getId)) // 只查询 id 字段,加速返回速度
.in(BrokerageUserDO::getBindUserId, bindUserIds)));
}
}
package org.dromara.mall.mapper.trade;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.trade.admin.brokerage.vo.withdraw.BrokerageWithdrawPageReqVO;
import org.dromara.mall.domain.trade.BrokerageWithdrawDO;
import org.dromara.mall.service.trade.brokerage.bo.BrokerageWithdrawSummaryRespBO;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 佣金提现Mapper接口
*
* @author hzh
* @date 2025-02-06
*/
public interface BrokerageWithdrawMapper extends BaseMapperPlusPlus<BrokerageWithdrawDO, BrokerageWithdrawDO> {
default PageResult<BrokerageWithdrawDO> selectPage(BrokerageWithdrawPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<BrokerageWithdrawDO>()
.eqIfPresent(BrokerageWithdrawDO::getUserId, reqVO.getUserId())
.eqIfPresent(BrokerageWithdrawDO::getType, reqVO.getType())
.likeIfPresent(BrokerageWithdrawDO::getName, reqVO.getName())
.eqIfPresent(BrokerageWithdrawDO::getAccountNo, reqVO.getAccountNo())
.likeIfPresent(BrokerageWithdrawDO::getBankName, reqVO.getBankName())
.eqIfPresent(BrokerageWithdrawDO::getStatus, reqVO.getStatus())
.betweenIfPresent(BrokerageWithdrawDO::getCreateTime, reqVO.getCreateTime())
.orderByAsc(BrokerageWithdrawDO::getStatus).orderByDesc(BrokerageWithdrawDO::getId));
}
default int updateByIdAndStatus(Long id, Integer status, BrokerageWithdrawDO updateObj) {
return update(updateObj, new LambdaUpdateWrapper<BrokerageWithdrawDO>()
.eq(BrokerageWithdrawDO::getId, id)
.eq(BrokerageWithdrawDO::getStatus, status));
}
default List<BrokerageWithdrawSummaryRespBO> selectCountAndSumPriceByUserIdAndStatus(Collection<Long> userIds, Integer status) {
List<Map<String, Object>> list = selectMaps(new MPJLambdaWrapper<BrokerageWithdrawDO>()
.select(BrokerageWithdrawDO::getUserId)
.selectCount(BrokerageWithdrawDO::getId, BrokerageWithdrawSummaryRespBO::getCount)
.selectSum(BrokerageWithdrawDO::getPrice)
.in(BrokerageWithdrawDO::getUserId, userIds)
.eq(BrokerageWithdrawDO::getStatus, status)
.groupBy(BrokerageWithdrawDO::getUserId));
return BeanUtil.copyToList(list, BrokerageWithdrawSummaryRespBO.class);
// selectJoinList有BUG,会与租户插件冲突:解析SQL时,发生异常 https://gitee.com/best_handsome/mybatis-plus-join/issues/I84GYW
// return selectJoinList(UserWithdrawSummaryBO.class, new MPJLambdaWrapper<BrokerageWithdrawDO>()
// .select(BrokerageWithdrawDO::getUserId)
// .selectCount(BrokerageWithdrawDO::getId, UserWithdrawSummaryBO::getCount)
// .selectSum(BrokerageWithdrawDO::getPrice)
// .in(BrokerageWithdrawDO::getUserId, userIds)
// .eq(BrokerageWithdrawDO::getStatus, status)
// .groupBy(BrokerageWithdrawDO::getUserId));
}
}
package org.dromara.mall.mapper.trade;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.dromara.mall.domain.trade.CartDO;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 购物车的商品信息Mapper接口
*
* @author hzh
* @date 2025-02-06
*/
public interface CartMapper extends BaseMapperPlus<CartDO, CartDO> {
default CartDO selectByUserIdAndSkuId(Long userId, Long skuId) {
return selectOne(CartDO::getUserId, userId,
CartDO::getSkuId, skuId);
}
default Integer selectSumByUserId(Long userId) {
// SQL sum 查询
List<Map<String, Object>> result = selectMaps(new QueryWrapper<CartDO>()
.select("SUM(count) AS sumCount")
.eq("user_id", userId)
.eq("selected", true)); // 只计算选中的
// 获得数量
return CollUtil.getFirst(result) != null ? MapUtil.getInt(result.get(0), "sumCount") : 0;
}
default CartDO selectById(Long id, Long userId) {
return selectOne(CartDO::getId, id,
CartDO::getUserId, userId);
}
default List<CartDO> selectListByIds(Collection<Long> ids, Long userId) {
return selectList(new LambdaQueryWrapper<CartDO>()
.in(CartDO::getId, ids)
.eq(CartDO::getUserId, userId));
}
default List<CartDO> selectListByUserId(Long userId) {
return selectList(new LambdaQueryWrapper<CartDO>()
.eq(CartDO::getUserId, userId));
}
default List<CartDO> selectListByUserId(Long userId, Set<Long> ids) {
return selectList(new LambdaQueryWrapper<CartDO>()
.eq(CartDO::getUserId, userId)
.in(CartDO::getId, ids));
}
default void updateByIds(Collection<Long> ids, Long userId, CartDO updateObj) {
update(updateObj, new LambdaQueryWrapper<CartDO>()
.in(CartDO::getId, ids)
.eq(CartDO::getUserId, userId));
}
}
package org.dromara.mall.mapper.trade;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.trade.admin.delivery.vo.express.DeliveryExpressExportReqVO;
import org.dromara.mall.controller.trade.admin.delivery.vo.express.DeliveryExpressPageReqVO;
import org.dromara.mall.domain.trade.DeliveryExpressDO;
import java.util.List;
/**
* 快递公司Mapper接口
*
* @author hzh
* @date 2025-02-06
*/
public interface DeliveryExpressMapper extends BaseMapperPlusPlus<DeliveryExpressDO, DeliveryExpressDO> {
default PageResult<DeliveryExpressDO> selectPage(DeliveryExpressPageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<DeliveryExpressDO>()
.likeIfPresent(DeliveryExpressDO::getCode, reqVO.getCode())
.likeIfPresent(DeliveryExpressDO::getName, reqVO.getName())
.eqIfPresent(DeliveryExpressDO::getStatus, reqVO.getStatus())
.betweenIfPresent(DeliveryExpressDO::getCreateTime, reqVO.getCreateTime())
.orderByAsc(DeliveryExpressDO::getSort));
}
default List<DeliveryExpressDO> selectList(DeliveryExpressExportReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<DeliveryExpressDO>()
.likeIfPresent(DeliveryExpressDO::getCode, reqVO.getCode())
.likeIfPresent(DeliveryExpressDO::getName, reqVO.getName())
.eqIfPresent(DeliveryExpressDO::getStatus, reqVO.getStatus())
.betweenIfPresent(DeliveryExpressDO::getCreateTime, reqVO.getCreateTime())
.orderByAsc(DeliveryExpressDO::getSort));
}
default DeliveryExpressDO selectByCode(String code) {
return selectOne(new LambdaQueryWrapper<DeliveryExpressDO>()
.eq(DeliveryExpressDO::getCode, code));
}
default List<DeliveryExpressDO> selectListByStatus(Integer status) {
return selectList(DeliveryExpressDO::getStatus, status);
}
}
package org.dromara.mall.mapper.trade;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.dromara.mall.domain.trade.DeliveryExpressTemplateChargeDO;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import java.util.Collection;
import java.util.List;
/**
* 快递运费模板计费配置Mapper接口
*
* @author hzh
* @date 2025-02-06
*/
public interface DeliveryExpressTemplateChargeMapper extends BaseMapperPlus<DeliveryExpressTemplateChargeDO, DeliveryExpressTemplateChargeDO> {
default List<DeliveryExpressTemplateChargeDO> selectListByTemplateId(Long templateId){
return selectList(new LambdaQueryWrapper<DeliveryExpressTemplateChargeDO>()
.eq(DeliveryExpressTemplateChargeDO::getTemplateId, templateId));
}
default int deleteByTemplateId(Long templateId){
return delete(new LambdaQueryWrapper<DeliveryExpressTemplateChargeDO>()
.eq(DeliveryExpressTemplateChargeDO::getTemplateId, templateId));
}
default List<DeliveryExpressTemplateChargeDO> selectByTemplateIds(Collection<Long> templateIds) {
return selectList(DeliveryExpressTemplateChargeDO::getTemplateId, templateIds);
}
}
package org.dromara.mall.mapper.trade;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.dromara.mall.domain.trade.DeliveryExpressTemplateFreeDO;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import java.util.Collection;
import java.util.List;
/**
* 快递运费模板包邮配置Mapper接口
*
* @author hzh
* @date 2025-02-06
*/
public interface DeliveryExpressTemplateFreeMapper extends BaseMapperPlus<DeliveryExpressTemplateFreeDO, DeliveryExpressTemplateFreeDO> {
default List<DeliveryExpressTemplateFreeDO> selectListByTemplateId(Long templateId) {
return selectList(new LambdaQueryWrapper<DeliveryExpressTemplateFreeDO>()
.eq(DeliveryExpressTemplateFreeDO::getTemplateId, templateId));
}
default int deleteByTemplateId(Long templateId) {
return delete(new LambdaQueryWrapper<DeliveryExpressTemplateFreeDO>()
.eq(DeliveryExpressTemplateFreeDO::getTemplateId, templateId));
}
default List<DeliveryExpressTemplateFreeDO> selectListByTemplateIds(Collection<Long> templateIds) {
return selectList(DeliveryExpressTemplateFreeDO::getTemplateId, templateIds);
}
}
package org.dromara.mall.mapper.trade;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.trade.admin.delivery.vo.expresstemplate.DeliveryExpressTemplatePageReqVO;
import org.dromara.mall.domain.trade.DeliveryExpressTemplateDO;
/**
* 快递运费模板Mapper接口
*
* @author hzh
* @date 2025-02-06
*/
public interface DeliveryExpressTemplateMapper extends BaseMapperPlusPlus<DeliveryExpressTemplateDO, DeliveryExpressTemplateDO> {
default PageResult<DeliveryExpressTemplateDO> selectPage(DeliveryExpressTemplatePageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<DeliveryExpressTemplateDO>()
.likeIfPresent(DeliveryExpressTemplateDO::getName, reqVO.getName())
.eqIfPresent(DeliveryExpressTemplateDO::getChargeMode, reqVO.getChargeMode())
.betweenIfPresent(DeliveryExpressTemplateDO::getCreateTime, reqVO.getCreateTime())
.orderByAsc(DeliveryExpressTemplateDO::getSort));
}
default DeliveryExpressTemplateDO selectByName(String name) {
return selectOne(DeliveryExpressTemplateDO::getName,name);
}
}
package org.dromara.mall.mapper.trade;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.controller.trade.admin.delivery.vo.pickup.DeliveryPickUpStorePageReqVO;
import org.dromara.mall.domain.trade.DeliveryPickUpStoreDO;
import java.util.List;
/**
* 自提门店Mapper接口
*
* @author hzh
* @date 2025-02-06
*/
public interface DeliveryPickUpStoreMapper extends BaseMapperPlusPlus<DeliveryPickUpStoreDO, DeliveryPickUpStoreDO> {
default PageResult<DeliveryPickUpStoreDO> selectPage(DeliveryPickUpStorePageReqVO reqVO) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<DeliveryPickUpStoreDO>()
.likeIfPresent(DeliveryPickUpStoreDO::getName, reqVO.getName())
.eqIfPresent(DeliveryPickUpStoreDO::getPhone, reqVO.getPhone())
.eqIfPresent(DeliveryPickUpStoreDO::getAreaId, reqVO.getAreaId())
.eqIfPresent(DeliveryPickUpStoreDO::getStatus, reqVO.getStatus())
.betweenIfPresent(DeliveryPickUpStoreDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(DeliveryPickUpStoreDO::getId));
}
default List<DeliveryPickUpStoreDO> selectListByStatus(Integer status) {
return selectList(DeliveryPickUpStoreDO::getStatus, status);
}
}
package org.dromara.mall.mapper.trade;
import org.dromara.mall.domain.trade.TradeConfigDO;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 交易中心配置Mapper接口
*
* @author hzh
* @date 2025-02-06
*/
public interface TradeConfigMapper extends BaseMapperPlus<TradeConfigDO, TradeConfigDO> {
}
package org.dromara.mall.mapper.trade;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.mall.domain.trade.TradeOrderItemDO;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 交易订单明细Mapper接口
*
* @author hzh
* @date 2025-02-06
*/
public interface TradeOrderItemMapper extends BaseMapperPlusPlus<TradeOrderItemDO, TradeOrderItemDO> {
default int updateAfterSaleStatus(Long id, Integer oldAfterSaleStatus, Integer newAfterSaleStatus,
Long afterSaleId) {
return update(new TradeOrderItemDO().setAfterSaleStatus(newAfterSaleStatus).setAfterSaleId(afterSaleId),
new LambdaUpdateWrapper<>(new TradeOrderItemDO().setId(id).setAfterSaleStatus(oldAfterSaleStatus)));
}
default List<TradeOrderItemDO> selectListByOrderId(Long orderId) {
return selectList(TradeOrderItemDO::getOrderId, orderId);
}
default List<TradeOrderItemDO> selectListByOrderId(Collection<Long> orderIds) {
return selectList(TradeOrderItemDO::getOrderId, orderIds);
}
default TradeOrderItemDO selectByIdAndUserId(Long orderItemId, Long loginUserId) {
return selectOne(new LambdaQueryWrapperX<TradeOrderItemDO>()
.eq(TradeOrderItemDO::getId, orderItemId)
.eq(TradeOrderItemDO::getUserId, loginUserId));
}
default List<TradeOrderItemDO> selectListByOrderIdAndCommentStatus(Long orderId, Boolean commentStatus) {
return selectList(new LambdaQueryWrapperX<TradeOrderItemDO>()
.eq(TradeOrderItemDO::getOrderId, orderId)
.eq(TradeOrderItemDO::getCommentStatus, commentStatus));
}
default int selectProductSumByOrderId(@Param("orderIds") Set<Long> orderIds) {
// SQL sum 查询
List<Map<String, Object>> result = selectMaps(new QueryWrapper<TradeOrderItemDO>()
.select("SUM(count) AS sumCount")
.in("order_id", orderIds)); // 只计算选中的
// 获得数量
return CollUtil.getFirst(result) != null ? MapUtil.getInt(result.get(0), "sumCount") : 0;
}
}
package org.dromara.mall.mapper.trade;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.dromara.mall.domain.trade.TradeOrderLogDO;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import java.util.List;
/**
* 交易订单日志Mapper接口
*
* @author hzh
* @date 2025-02-06
*/
public interface TradeOrderLogMapper extends BaseMapperPlus<TradeOrderLogDO, TradeOrderLogDO> {
default List<TradeOrderLogDO> selectListByOrderId(Long orderId) {
return selectList(new LambdaQueryWrapper<TradeOrderLogDO>()
.eq(TradeOrderLogDO::getOrderId, orderId)
.orderByDesc(TradeOrderLogDO::getCreateTime));
}
}
package org.dromara.mall.mapper.trade;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.common.mybatis.core.query.MPJLambdaWrapperX;
import org.dromara.mall.controller.trade.admin.order.vo.TradeOrderPageReqVO;
import org.dromara.mall.controller.trade.app.order.vo.AppTradeOrderPageReqVO;
import org.dromara.mall.domain.trade.TradeOrderDO;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 交易订单Mapper接口
*
* @author hzh
* @date 2025-02-06
*/
public interface TradeOrderMapper extends BaseMapperPlusPlus<TradeOrderDO, TradeOrderDO> {
default int updateByIdAndStatus(Long id, Integer status, TradeOrderDO update) {
return update(update, new LambdaUpdateWrapper<TradeOrderDO>()
.eq(TradeOrderDO::getId, id).eq(TradeOrderDO::getStatus, status));
}
default TradeOrderDO selectByIdAndUserId(Long id, Long userId) {
return selectOne(TradeOrderDO::getId, id, TradeOrderDO::getUserId, userId);
}
default PageResult<TradeOrderDO> selectPage(TradeOrderPageReqVO reqVO, Set<Long> userIds) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<TradeOrderDO>()
.likeIfPresent(TradeOrderDO::getNo, reqVO.getNo())
.eqIfPresent(TradeOrderDO::getUserId, reqVO.getUserId())
.eqIfPresent(TradeOrderDO::getDeliveryType, reqVO.getDeliveryType())
.inIfPresent(TradeOrderDO::getUserId, userIds)
.eqIfPresent(TradeOrderDO::getType, reqVO.getType())
.eqIfPresent(TradeOrderDO::getStatus, reqVO.getStatus())
.eqIfPresent(TradeOrderDO::getPayChannelCode, reqVO.getPayChannelCode())
.eqIfPresent(TradeOrderDO::getTerminal, reqVO.getTerminal())
.eqIfPresent(TradeOrderDO::getLogisticsId, reqVO.getLogisticsId())
.inIfPresent(TradeOrderDO::getPickUpStoreId, reqVO.getPickUpStoreIds())
.likeIfPresent(TradeOrderDO::getPickUpVerifyCode, reqVO.getPickUpVerifyCode())
.betweenIfPresent(TradeOrderDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(TradeOrderDO::getId));
}
// TODO @疯狂:如果用 map 返回,要不这里直接用 TradeOrderSummaryRespVO 返回?也算合理,就当 sql 查询出这么个玩意~~
default List<Map<String, Object>> selectOrderSummaryGroupByRefundStatus(TradeOrderPageReqVO reqVO, Set<Long> userIds) {
return selectMaps(new MPJLambdaWrapperX<TradeOrderDO>()
.selectAs(TradeOrderDO::getRefundStatus, TradeOrderDO::getRefundStatus) // 售后状态
.selectCount(TradeOrderDO::getId, "count") // 售后状态对应的数量
.selectSum(TradeOrderDO::getPayPrice, "price") // 售后状态对应的支付金额
.likeIfPresent(TradeOrderDO::getNo, reqVO.getNo())
.eqIfPresent(TradeOrderDO::getUserId, reqVO.getUserId())
.eqIfPresent(TradeOrderDO::getDeliveryType, reqVO.getDeliveryType())
.inIfPresent(TradeOrderDO::getUserId, userIds)
.eqIfPresent(TradeOrderDO::getType, reqVO.getType())
.eqIfPresent(TradeOrderDO::getStatus, reqVO.getStatus())
.eqIfPresent(TradeOrderDO::getPayChannelCode, reqVO.getPayChannelCode())
.eqIfPresent(TradeOrderDO::getTerminal, reqVO.getTerminal())
.eqIfPresent(TradeOrderDO::getLogisticsId, reqVO.getLogisticsId())
.inIfPresent(TradeOrderDO::getPickUpStoreId, reqVO.getPickUpStoreIds())
.likeIfPresent(TradeOrderDO::getPickUpVerifyCode, reqVO.getPickUpVerifyCode())
.betweenIfPresent(TradeOrderDO::getCreateTime, reqVO.getCreateTime())
.groupBy(TradeOrderDO::getRefundStatus)); // 按售后状态分组
}
default PageResult<TradeOrderDO> selectPage(AppTradeOrderPageReqVO reqVO, Long userId) {
return selectPagePlus(reqVO, new LambdaQueryWrapperX<TradeOrderDO>()
.eq(TradeOrderDO::getUserId, userId)
.eqIfPresent(TradeOrderDO::getStatus, reqVO.getStatus())
.eqIfPresent(TradeOrderDO::getCommentStatus, reqVO.getCommentStatus())
.orderByDesc(TradeOrderDO::getId)); // TODO 芋艿:未来不同的 status,不同的排序
}
default Long selectCountByUserIdAndStatus(Long userId, Integer status, Boolean commentStatus) {
return selectCount(new LambdaQueryWrapperX<TradeOrderDO>()
.eq(TradeOrderDO::getUserId, userId)
.eqIfPresent(TradeOrderDO::getStatus, status)
.eqIfPresent(TradeOrderDO::getCommentStatus, commentStatus));
}
default TradeOrderDO selectOrderByIdAndUserId(Long orderId, Long loginUserId) {
return selectOne(new LambdaQueryWrapperX<TradeOrderDO>()
.eq(TradeOrderDO::getId, orderId)
.eq(TradeOrderDO::getUserId, loginUserId));
}
default List<TradeOrderDO> selectListByStatusAndCreateTimeLt(Integer status, LocalDateTime createTime) {
return selectList(new LambdaUpdateWrapper<TradeOrderDO>()
.eq(TradeOrderDO::getStatus, status)
.lt(TradeOrderDO::getCreateTime, createTime));
}
default List<TradeOrderDO> selectListByStatusAndDeliveryTimeLt(Integer status, LocalDateTime deliveryTime) {
return selectList(new LambdaUpdateWrapper<TradeOrderDO>()
.eq(TradeOrderDO::getStatus, status)
.lt(TradeOrderDO::getDeliveryTime, deliveryTime));
}
default List<TradeOrderDO> selectListByStatusAndReceiveTimeLt(Integer status, LocalDateTime receive,
Boolean commentStatus) {
return selectList(new LambdaUpdateWrapper<TradeOrderDO>()
.eq(TradeOrderDO::getStatus, status)
.lt(TradeOrderDO::getReceiveTime, receive)
.eq(TradeOrderDO::getCommentStatus, commentStatus));
}
default List<TradeOrderDO> selectListByUserIdAndSeckillActivityId(Long userId, Long seckillActivityId) {
return selectList(new LambdaUpdateWrapper<>(TradeOrderDO.class)
.eq(TradeOrderDO::getUserId, userId)
.eq(TradeOrderDO::getSeckillActivityId, seckillActivityId));
}
default TradeOrderDO selectOneByPickUpVerifyCode(String pickUpVerifyCode) {
return selectOne(TradeOrderDO::getPickUpVerifyCode, pickUpVerifyCode);
}
default TradeOrderDO selectByUserIdAndCombinationActivityIdAndStatus(Long userId, Long combinationActivityId, Integer status) {
return selectOne(new LambdaQueryWrapperX<TradeOrderDO>()
.eq(TradeOrderDO::getUserId, userId)
.eq(TradeOrderDO::getStatus, status)
.eq(TradeOrderDO::getCombinationActivityId, combinationActivityId)
);
}
}
package org.dromara.mall.service.member;
import jakarta.validation.Valid;
import org.dromara.mall.controller.member.app.address.vo.AppAddressCreateReqVO;
import org.dromara.mall.controller.member.app.address.vo.AppAddressUpdateReqVO;
import org.dromara.mall.domain.member.MemberAddressDO;
import java.util.List;
/**
* 用户收件地址 Service 接口
*
* @author 芋道源码
*/
public interface AddressService {
/**
* 创建用户收件地址
*
*
* @param userId 用户编号
* @param createReqVO 创建信息
* @return 编号
*/
Long createAddress(Long userId, @Valid AppAddressCreateReqVO createReqVO);
/**
* 更新用户收件地址
*
* @param userId 用户编号
* @param updateReqVO 更新信息
*/
void updateAddress(Long userId, @Valid AppAddressUpdateReqVO updateReqVO);
/**
* 删除用户收件地址
*
* @param userId 用户编号
* @param id 编号
*/
void deleteAddress(Long userId, Long id);
/**
* 获得用户收件地址
*
* @param id 编号
* @return 用户收件地址
*/
MemberAddressDO getAddress(Long userId, Long id);
/**
* 获得用户收件地址列表
*
* @param userId 用户编号
* @return 用户收件地址列表
*/
List<MemberAddressDO> getAddressList(Long userId);
/**
* 获得用户默认的收件地址
*
* @param userId 用户编号
* @return 用户收件地址
*/
MemberAddressDO getDefaultUserAddress(Long userId);
}
package org.dromara.mall.service.member;
import jakarta.validation.Valid;
import org.dromara.mall.controller.member.admin.config.vo.MemberConfigSaveReqVO;
import org.dromara.mall.domain.member.MemberConfigDO;
/**
* 会员配置 Service 接口
*
* @author QingX
*/
public interface MemberConfigService {
/**
* 保存会员配置
*
* @param saveReqVO 更新信息
*/
void saveConfig(@Valid MemberConfigSaveReqVO saveReqVO);
/**
* 获得会员配置
*
* @return 积分配置
*/
MemberConfigDO getConfig();
}
package org.dromara.mall.service.member;
import org.dromara.common.mybatis.core.page.PageParam;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.mall.controller.member.admin.level.vo.experience.MemberExperienceRecordPageReqVO;
import org.dromara.mall.domain.member.MemberExperienceRecordDO;
import org.dromara.mall.enums.member.experience.MemberExperienceBizTypeEnum;
/**
* 会员经验记录 Service 接口
*
* @author owen
*/
public interface MemberExperienceRecordService {
/**
* 获得会员经验记录
*
* @param id 编号
* @return 会员经验记录
*/
MemberExperienceRecordDO getExperienceRecord(Long id);
/**
* 【管理员】获得会员经验记录分页
*
* @param pageReqVO 分页查询
* @return 会员经验记录分页
*/
PageResult<MemberExperienceRecordDO> getExperienceRecordPage(MemberExperienceRecordPageReqVO pageReqVO);
/**
* 【会员】获得会员经验记录分页
*
* @param userId 用户编号
* @param pageParam 分页查询
* @return 会员经验记录分页
*/
PageResult<MemberExperienceRecordDO> getExperienceRecordPage(Long userId, PageParam pageParam);
/**
* 根据业务类型, 创建 经验变动记录
*
* @param userId 会员编号
* @param experience 变动经验值
* @param totalExperience 会员当前的经验
* @param bizType 业务类型
* @param bizId 业务ID
*/
void createExperienceRecord(Long userId, Integer experience, Integer totalExperience,
MemberExperienceBizTypeEnum bizType, String bizId);
}
package org.dromara.mall.service.member;
import jakarta.validation.Valid;
import org.dromara.common.mall.enums.CommonStatusEnum;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.mall.controller.member.admin.group.vo.MemberGroupCreateReqVO;
import org.dromara.mall.controller.member.admin.group.vo.MemberGroupPageReqVO;
import org.dromara.mall.controller.member.admin.group.vo.MemberGroupUpdateReqVO;
import org.dromara.mall.domain.member.MemberGroupDO;
import java.util.Collection;
import java.util.List;
/**
* 用户分组 Service 接口
*
* @author owen
*/
public interface MemberGroupService {
/**
* 创建用户分组
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createGroup(@Valid MemberGroupCreateReqVO createReqVO);
/**
* 更新用户分组
*
* @param updateReqVO 更新信息
*/
void updateGroup(@Valid MemberGroupUpdateReqVO updateReqVO);
/**
* 删除用户分组
*
* @param id 编号
*/
void deleteGroup(Long id);
/**
* 获得用户分组
*
* @param id 编号
* @return 用户分组
*/
MemberGroupDO getGroup(Long id);
/**
* 获得用户分组列表
*
* @param ids 编号
* @return 用户分组列表
*/
List<MemberGroupDO> getGroupList(Collection<Long> ids);
/**
* 获得用户分组分页
*
* @param pageReqVO 分页查询
* @return 用户分组分页
*/
PageResult<MemberGroupDO> getGroupPage(MemberGroupPageReqVO pageReqVO);
/**
* 获得指定状态的用户分组列表
*
* @param status 状态
* @return 用户分组列表
*/
List<MemberGroupDO> getGroupListByStatus(Integer status);
/**
* 获得开启状态的用户分组列表
*
* @return 用户分组列表
*/
default List<MemberGroupDO> getEnableGroupList() {
return getGroupListByStatus(CommonStatusEnum.ENABLE.getStatus());
}
}
package org.dromara.mall.service.member;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.mall.controller.member.admin.level.vo.record.MemberLevelRecordPageReqVO;
import org.dromara.mall.domain.member.MemberLevelRecordDO;
/**
* 会员等级记录 Service 接口
*
* @author owen
*/
public interface MemberLevelRecordService {
/**
* 获得会员等级记录
*
* @param id 编号
* @return 会员等级记录
*/
MemberLevelRecordDO getLevelRecord(Long id);
/**
* 获得会员等级记录分页
*
* @param pageReqVO 分页查询
* @return 会员等级记录分页
*/
PageResult<MemberLevelRecordDO> getLevelRecordPage(MemberLevelRecordPageReqVO pageReqVO);
/**
* 创建会员等级记录
*
* @param levelRecord 会员等级记录
*/
void createLevelRecord(MemberLevelRecordDO levelRecord);
}
package org.dromara.mall.service.member;
import jakarta.validation.Valid;
import org.dromara.common.mall.enums.CommonStatusEnum;
import org.dromara.mall.controller.member.admin.level.vo.level.MemberLevelCreateReqVO;
import org.dromara.mall.controller.member.admin.level.vo.level.MemberLevelListReqVO;
import org.dromara.mall.controller.member.admin.level.vo.level.MemberLevelUpdateReqVO;
import org.dromara.mall.controller.member.admin.user.vo.MemberUserUpdateLevelReqVO;
import org.dromara.mall.domain.member.MemberLevelDO;
import org.dromara.mall.enums.member.experience.MemberExperienceBizTypeEnum;
import java.util.Collection;
import java.util.List;
/**
* 会员等级 Service 接口
*
* @author owen
*/
public interface MemberLevelService {
/**
* 创建会员等级
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createLevel(@Valid MemberLevelCreateReqVO createReqVO);
/**
* 更新会员等级
*
* @param updateReqVO 更新信息
*/
void updateLevel(@Valid MemberLevelUpdateReqVO updateReqVO);
/**
* 删除会员等级
*
* @param id 编号
*/
void deleteLevel(Long id);
/**
* 获得会员等级
*
* @param id 编号
* @return 会员等级
*/
MemberLevelDO getLevel(Long id);
/**
* 获得会员等级列表
*
* @param ids 编号
* @return 会员等级列表
*/
List<MemberLevelDO> getLevelList(Collection<Long> ids);
/**
* 获得会员等级列表
*
* @param listReqVO 查询参数
* @return 会员等级列表
*/
List<MemberLevelDO> getLevelList(MemberLevelListReqVO listReqVO);
/**
* 获得指定状态的会员等级列表
*
* @param status 状态
* @return 会员等级列表
*/
List<MemberLevelDO> getLevelListByStatus(Integer status);
/**
* 获得开启状态的会员等级列表
*
* @return 会员等级列表
*/
default List<MemberLevelDO> getEnableLevelList() {
return getLevelListByStatus(CommonStatusEnum.ENABLE.getStatus());
}
/**
* 修改会员的等级
*
* @param updateReqVO 修改参数
*/
void updateUserLevel(MemberUserUpdateLevelReqVO updateReqVO);
/**
* 增加会员经验
*
* @param userId 会员ID
* @param experience 经验
* @param bizType 业务类型
* @param bizId 业务编号
*/
void addExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId);
}
package org.dromara.mall.service.member;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.mall.controller.member.admin.point.vo.recrod.MemberPointRecordPageReqVO;
import org.dromara.mall.controller.member.app.point.vo.AppMemberPointRecordPageReqVO;
import org.dromara.mall.domain.member.MemberPointRecordDO;
import org.dromara.mall.enums.member.point.MemberPointBizTypeEnum;
/**
* 用户积分记录 Service 接口
*
* @author QingX
*/
public interface MemberPointRecordService {
/**
* 【管理员】获得积分记录分页
*
* @param pageReqVO 分页查询
* @return 签到记录分页
*/
PageResult<MemberPointRecordDO> getPointRecordPage(MemberPointRecordPageReqVO pageReqVO);
/**
* 【会员】获得积分记录分页
*
* @param userId 用户编号
* @param pageReqVO 分页查询
* @return 签到记录分页
*/
PageResult<MemberPointRecordDO> getPointRecordPage(Long userId, AppMemberPointRecordPageReqVO pageReqVO);
/**
* 创建用户积分记录
*
* @param userId 用户ID
* @param point 变动积分
* @param bizType 业务类型
* @param bizId 业务编号
*/
void createPointRecord(Long userId, Integer point, MemberPointBizTypeEnum bizType, String bizId);
}
package org.dromara.mall.service.member;
import jakarta.validation.Valid;
import org.dromara.mall.controller.member.admin.signin.vo.config.MemberSignInConfigCreateReqVO;
import org.dromara.mall.controller.member.admin.signin.vo.config.MemberSignInConfigUpdateReqVO;
import org.dromara.mall.domain.member.MemberSignInConfigDO;
import java.util.List;
/**
* 签到规则 Service 接口
*
* @author QingX
*/
public interface MemberSignInConfigService {
/**
* 创建签到规则
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createSignInConfig(@Valid MemberSignInConfigCreateReqVO createReqVO);
/**
* 更新签到规则
*
* @param updateReqVO 更新信息
*/
void updateSignInConfig(@Valid MemberSignInConfigUpdateReqVO updateReqVO);
/**
* 删除签到规则
*
* @param id 编号
*/
void deleteSignInConfig(Long id);
/**
* 获得签到规则
*
* @param id 编号
* @return 签到规则
*/
MemberSignInConfigDO getSignInConfig(Long id);
/**
* 获得签到规则列表
*
* @return 签到规则分页
*/
List<MemberSignInConfigDO> getSignInConfigList();
/**
* 获得签到规则列表
*
* @param status 状态
* @return 签到规则分页
*/
List<MemberSignInConfigDO> getSignInConfigList(Integer status);
}
package org.dromara.mall.service.member;
import org.dromara.common.mybatis.core.page.PageParam;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.mall.controller.member.admin.signin.vo.record.MemberSignInRecordPageReqVO;
import org.dromara.mall.controller.member.app.signin.vo.record.AppMemberSignInRecordSummaryRespVO;
import org.dromara.mall.domain.member.MemberSignInRecordDO;
/**
* 签到记录 Service 接口
*
* @author 芋道源码
*/
public interface MemberSignInRecordService {
/**
* 【管理员】获得签到记录分页
*
* @param pageReqVO 分页查询
* @return 签到记录分页
*/
PageResult<MemberSignInRecordDO> getSignInRecordPage(MemberSignInRecordPageReqVO pageReqVO);
/**
* 【会员】获得签到记录分页
*
* @param userId 用户编号
* @param pageParam 分页查询
* @return 签到记录分页
*/
PageResult<MemberSignInRecordDO> getSignRecordPage(Long userId, PageParam pageParam);
/**
* 创建签到记录
*
* @param userId 用户编号
* @return 签到记录
*/
MemberSignInRecordDO createSignRecord(Long userId);
/**
* 根据用户编号,获得个人签到统计信息
*
* @param userId 用户编号
* @return 个人签到统计信息
*/
AppMemberSignInRecordSummaryRespVO getSignInRecordSummary(Long userId);
}
package org.dromara.mall.service.member;
import jakarta.validation.Valid;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.mall.controller.member.admin.tag.vo.MemberTagCreateReqVO;
import org.dromara.mall.controller.member.admin.tag.vo.MemberTagPageReqVO;
import org.dromara.mall.controller.member.admin.tag.vo.MemberTagUpdateReqVO;
import org.dromara.mall.domain.member.MemberTagDO;
import java.util.Collection;
import java.util.List;
/**
* 会员标签 Service 接口
*
* @author 芋道源码
*/
public interface MemberTagService {
/**
* 创建会员标签
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createTag(@Valid MemberTagCreateReqVO createReqVO);
/**
* 更新会员标签
*
* @param updateReqVO 更新信息
*/
void updateTag(@Valid MemberTagUpdateReqVO updateReqVO);
/**
* 删除会员标签
*
* @param id 编号
*/
void deleteTag(Long id);
/**
* 获得会员标签
*
* @param id 编号
* @return 会员标签
*/
MemberTagDO getTag(Long id);
/**
* 获得会员标签列表
*
* @param ids 编号
* @return 会员标签列表
*/
List<MemberTagDO> getTagList(Collection<Long> ids);
/**
* 获得会员标签分页
*
* @param pageReqVO 分页查询
* @return 会员标签分页
*/
PageResult<MemberTagDO> getTagPage(MemberTagPageReqVO pageReqVO);
/**
* 获取标签列表
*
* @return 标签列表
*/
List<MemberTagDO> getTagList();
}
package org.dromara.mall.service.member;
import jakarta.validation.Valid;
import org.dromara.common.mall.validation.Mobile;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.mall.controller.member.admin.user.vo.MemberUserPageReqVO;
import org.dromara.mall.controller.member.admin.user.vo.MemberUserUpdateReqVO;
import org.dromara.mall.controller.member.app.user.vo.*;
import org.dromara.mall.domain.member.MemberUserDO;
import java.util.Collection;
import java.util.List;
/**
* 会员用户 Service 接口
*
* @author 芋道源码
*/
public interface MemberUserService {
/**
* 通过手机查询用户
*
* @param mobile 手机
* @return 用户对象
*/
MemberUserDO getUserByMobile(String mobile);
/**
* 通过第三方用户ID查询用户
*
* @param thirdUserId 第三方用户ID
* @return 用户对象
*/
MemberUserDO getUserByThirdUserId(Long thirdUserId);
/**
* 基于用户昵称,模糊匹配用户列表
*
* @param nickname 用户昵称,模糊匹配
* @return 用户信息的列表
*/
List<MemberUserDO> getUserListByNickname(String nickname);
/**
* 基于手机号创建用户。
* 如果用户已经存在,则直接进行返回
*
* @param mobile 手机号
* @param registerIp 注册 IP
* @param terminal 终端 {@link org.dromara.common.mall.enums.TerminalEnum}
* @return 用户对象
*/
MemberUserDO createUserIfAbsent(@Mobile String mobile, String registerIp, Integer terminal);
/**
* 基于手机号创建用户。
* 如果用户已经存在,则直接进行返回
*
* @param thirdUserId 第三方用户地
* @param mobile 手机号
* @param registerIp 注册 IP
* @param terminal 终端 {@link org.dromara.common.mall.enums.TerminalEnum}
* @return 用户对象
*/
MemberUserDO createUserIfAbsent(Long thirdUserId, @Mobile String mobile, String registerIp, Integer terminal);
/**
* 创建用户
* 目的:三方登录时,如果未绑定用户时,自动创建对应用户
*
* @param nickname 昵称
* @param avtar 头像
* @param registerIp 注册 IP
* @param terminal 终端 {@link org.dromara.common.mall.enums.TerminalEnum}
* @return 用户对象
*/
MemberUserDO createUser(String nickname, String avtar, String registerIp, Integer terminal);
/**
* 更新用户的最后登陆信息
*
* @param id 用户编号
* @param loginIp 登陆 IP
*/
void updateUserLogin(Long id, String loginIp);
/**
* 通过用户 ID 查询用户
*
* @param id 用户ID
* @return 用户对象信息
*/
MemberUserDO getUser(Long id);
/**
* 通过用户 ID 查询用户们
*
* @param ids 用户 ID
* @return 用户对象信息数组
*/
List<MemberUserDO> getUserList(Collection<Long> ids);
/**
* 【会员】修改基本信息
*
* @param userId 用户编号
* @param reqVO 基本信息
*/
void updateUser(Long userId, AppMemberUserUpdateReqVO reqVO);
/**
* 【会员】修改手机,基于手机验证码
*
* @param userId 用户编号
* @param reqVO 请求信息
*/
void updateUserMobile(Long userId, AppMemberUserUpdateMobileReqVO reqVO);
/**
* 【会员】修改手机,基于微信小程序的授权码
*
* @param userId 用户编号
* @param reqVO 请求信息
*/
void updateUserMobileByWeixin(Long userId, AppMemberUserUpdateMobileByWeixinReqVO reqVO);
/**
* 【会员】修改密码
*
* @param userId 用户编号
* @param reqVO 请求信息
*/
void updateUserPassword(Long userId, AppMemberUserUpdatePasswordReqVO reqVO);
/**
* 【会员】忘记密码
*
* @param reqVO 请求信息
*/
void resetUserPassword(AppMemberUserResetPasswordReqVO reqVO);
/**
* 判断密码是否匹配
*
* @param rawPassword 未加密的密码
* @param encodedPassword 加密后的密码
* @return 是否匹配
*/
boolean isPasswordMatch(String rawPassword, String encodedPassword);
/**
* 【管理员】更新会员用户
*
* @param updateReqVO 更新信息
*/
void updateUser(@Valid MemberUserUpdateReqVO updateReqVO);
/**
* 【管理员】获得会员用户分页
*
* @param pageReqVO 分页查询
* @return 会员用户分页
*/
PageResult<MemberUserDO> getUserPage(MemberUserPageReqVO pageReqVO);
/**
* 更新用户的等级和经验
*
* @param id 用户编号
* @param levelId 用户等级
* @param experience 用户经验
*/
void updateUserLevel(Long id, Long levelId, Integer experience);
/**
* 获得指定用户分组下的用户数量
*
* @param groupId 用户分组编号
* @return 用户数量
*/
Long getUserCountByGroupId(Long groupId);
/**
* 获得指定用户等级下的用户数量
*
* @param levelId 用户等级编号
* @return 用户数量
*/
Long getUserCountByLevelId(Long levelId);
/**
* 获得指定会员标签下的用户数量
*
* @param tagId 用户标签编号
* @return 用户数量
*/
Long getUserCountByTagId(Long tagId);
/**
* 更新用户的积分
*
* @param userId 用户编号
* @param point 积分数量
* @return 更新结果
*/
boolean updateUserPoint(Long userId, Integer point);
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论