Administrator
2025-05-13 21fee5d76f3af3da1c379599ed3f68c534b869e6
feat(mall): 新增我的推广相关功能

- 添加 ApiSaleController 控制器,实现我的推广相关接口
- 新增 ApiSaleService 接口及其实现类,提供我的推广业务逻辑
- 创建相关 VO 和 DTO 类,用于数据传输和返回
- 在 MallMemberMapper 中添加新的 SQL 查询方法,支持团队列表和分销订单查询
- 更新 XML 配置文件,添加新的 SQL 语句
- 修改 MallMemberVo 中的代理等级字段名称
- 更新 VipCommonServiceImpl 中的余额相关逻辑,改为佣金
10 files added
4 files modified
530 ■■■■■ changed files
src/main/java/cc/mrbird/febs/mall/controller/member/ApiSaleController.java 77 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/sale/ApiSaleListInfoDto.java 30 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/sale/ApiTeamListInfoDto.java 29 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/ApiSaleService.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiSaleServiceImpl.java 148 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/sale/ApiSaleHeaderInfoVo.java 18 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/sale/ApiSaleInfoVo.java 52 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/sale/ApiSaleListInfoVo.java 27 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/sale/ApiTeamHeaderInfoVo.java 18 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/sale/ApiTeamListInfoVo.java 28 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/vip/service/impl/VipCommonServiceImpl.java 4 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMemberMapper.xml 69 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/member/ApiSaleController.java
New file
@@ -0,0 +1,77 @@
package cc.mrbird.febs.mall.controller.member;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.mall.dto.sale.ApiSaleListInfoDto;
import cc.mrbird.febs.mall.dto.sale.ApiTeamListInfoDto;
import cc.mrbird.febs.mall.service.ApiSaleService;
import cc.mrbird.febs.mall.vo.MallMemberVo;
import cc.mrbird.febs.mall.vo.sale.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
@Validated
@RequestMapping(value = "/api/sale")
@RequiredArgsConstructor
@Api(value = "ApiSaleController", tags = "365我的推广")
public class ApiSaleController {
    private final ApiSaleService apiSaleService;
    @ApiOperation(value = "我的推广", notes = "我的推广")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = ApiSaleInfoVo.class)
    })
    @GetMapping(value = "/saleInfo")
    public FebsResponse saleInfo() {
        return apiSaleService.saleInfo();
    }
    @ApiOperation(value = "我的团队(头部)", notes = "我的团队(头部)")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = ApiTeamHeaderInfoVo.class)
    })
    @GetMapping(value = "/teamHeader")
    public FebsResponse teamHeader() {
        return apiSaleService.teamHeader();
    }
    @ApiOperation(value = "我的团队(团队明细)", notes = "我的团队(团队明细)")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = ApiTeamListInfoVo.class)
    })
    @PostMapping(value = "/teamList")
    public FebsResponse teamList(@RequestBody @Validated ApiTeamListInfoDto dto) {
        return apiSaleService.teamList(dto);
    }
    @ApiOperation(value = "分销订单(头部)", notes = "分销订单(头部)")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = ApiSaleHeaderInfoVo.class)
    })
    @GetMapping(value = "/saleHeader")
    public FebsResponse saleHeader() {
        return apiSaleService.saleHeader();
    }
    @ApiOperation(value = "分销订单(分销明细)", notes = "分销订单(分销明细)")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = ApiSaleListInfoVo.class)
    })
    @PostMapping(value = "/saleList")
    public FebsResponse saleList(@RequestBody @Validated ApiSaleListInfoDto dto) {
        return apiSaleService.saleList(dto);
    }
}
src/main/java/cc/mrbird/febs/mall/dto/sale/ApiSaleListInfoDto.java
New file
@@ -0,0 +1,30 @@
package cc.mrbird.febs.mall.dto.sale;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
@ApiModel(value = "ApiSaleListInfoDto", description = "参数")
public class ApiSaleListInfoDto {
    @NotNull(message = "页码不能为空")
    @ApiModelProperty(value = "页码", example = "1")
    private Integer pageNow;
    @NotNull(message = "每页数量不能为空")
    @ApiModelProperty(value = "每页数量", example = "10")
    private Integer pageSize;
    @ApiModelProperty(value = "开始时间", example = "123")
    private String startTime;
    @ApiModelProperty(value = "结束时间", example = "123")
    private String endTime;
    @ApiModelProperty(hidden = true)
    private Long memberId;
}
src/main/java/cc/mrbird/febs/mall/dto/sale/ApiTeamListInfoDto.java
New file
@@ -0,0 +1,29 @@
package cc.mrbird.febs.mall.dto.sale;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
@ApiModel(value = "ApiTeamListInfoDto", description = "参数")
public class ApiTeamListInfoDto {
    @NotNull(message = "页码不能为空")
    @ApiModelProperty(value = "页码", example = "1")
    private Integer pageNow;
    @NotNull(message = "每页数量不能为空")
    @ApiModelProperty(value = "每页数量", example = "10")
    private Integer pageSize;
    @ApiModelProperty(value = "开始时间", example = "123")
    private String startTime;
    @ApiModelProperty(value = "结束时间", example = "123")
    private String endTime;
    @ApiModelProperty(hidden = true)
    private String inviteId;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
@@ -3,9 +3,13 @@
import cc.mrbird.febs.mall.dto.AgentDto;
import cc.mrbird.febs.mall.dto.AgentLevelDto;
import cc.mrbird.febs.mall.dto.RankAwardDto;
import cc.mrbird.febs.mall.dto.sale.ApiSaleListInfoDto;
import cc.mrbird.febs.mall.dto.sale.ApiTeamListInfoDto;
import cc.mrbird.febs.mall.entity.AppVersion;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.vo.*;
import cc.mrbird.febs.mall.vo.sale.ApiSaleListInfoVo;
import cc.mrbird.febs.mall.vo.sale.ApiTeamListInfoVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -94,4 +98,8 @@
    void updateReferrerId(@Param("id")Long id);
    void updateLastLoginTime(@Param("id")Long id,@Param("lastLoginTime") Date lastLoginTime);
    IPage<ApiTeamListInfoVo> selectTeamPage(Page<ApiTeamListInfoVo> page, @Param("record")ApiTeamListInfoDto dto);
    Page<ApiSaleListInfoVo> selectSalePage(Page<ApiSaleListInfoVo> objectPage, @Param("record")ApiSaleListInfoDto dto);
}
src/main/java/cc/mrbird/febs/mall/service/ApiSaleService.java
New file
@@ -0,0 +1,20 @@
package cc.mrbird.febs.mall.service;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.mall.dto.sale.ApiSaleListInfoDto;
import cc.mrbird.febs.mall.dto.sale.ApiTeamListInfoDto;
import cc.mrbird.febs.mall.entity.MallMember;
import com.baomidou.mybatisplus.extension.service.IService;
public interface ApiSaleService extends IService<MallMember> {
    FebsResponse saleInfo();
    FebsResponse teamHeader();
    FebsResponse teamList(ApiTeamListInfoDto dto);
    FebsResponse saleHeader();
    FebsResponse saleList(ApiSaleListInfoDto dto);
}
src/main/java/cc/mrbird/febs/mall/service/impl/ApiSaleServiceImpl.java
New file
@@ -0,0 +1,148 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
import cc.mrbird.febs.common.enumerates.ScoreFlowTypeEnum;
import cc.mrbird.febs.common.utils.LoginUserUtil;
import cc.mrbird.febs.mall.dto.sale.ApiSaleListInfoDto;
import cc.mrbird.febs.mall.dto.sale.ApiTeamListInfoDto;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
import cc.mrbird.febs.mall.service.ApiSaleService;
import cc.mrbird.febs.mall.vo.sale.*;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@Slf4j
@Service
@RequiredArgsConstructor
public class ApiSaleServiceImpl extends ServiceImpl<MallMemberMapper, MallMember> implements ApiSaleService {
    private final HappySaleLevelMapper happySaleLevelMapper;
    private final MallMoneyFlowMapper mallMoneyFlowMapper;
    private final MallOrderInfoMapper mallOrderInfoMapper;
    private final MallAchieveRecordMapper mallAchieveRecordMapper;
    @Override
    public FebsResponse saleInfo() {
        ApiSaleInfoVo apiSaleInfoVo = new ApiSaleInfoVo();
        Long id = LoginUserUtil.getLoginUser().getId();
        MallMember mallMember = this.baseMapper.selectById(id);
        apiSaleInfoVo.setId(mallMember.getId());
        apiSaleInfoVo.setName(mallMember.getName());
        apiSaleInfoVo.setAvatar(mallMember.getAvatar());
        apiSaleInfoVo.setInviteId(mallMember.getInviteId());
        HappySaleLevel happySaleLevel = happySaleLevelMapper.selectOne(
                new LambdaQueryWrapper<HappySaleLevel>()
                        .eq(HappySaleLevel::getCode, mallMember.getStoreMaster())
                        .last("limit 1")
        );
        if (happySaleLevel != null) {
            apiSaleInfoVo.setStoreMasterName(happySaleLevel.getName());
            apiSaleInfoVo.setStoreMasterPng(happySaleLevel.getIconPng());
        }
        List<MallMember> mallMembers = this.baseMapper.selectAllChildAgentListByInviteId(mallMember.getInviteId());
        apiSaleInfoVo.setTotalCnt(CollUtil.isNotEmpty(mallMembers) ? mallMembers.size() : 0);
        List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectList(
                new LambdaQueryWrapper<MallMoneyFlow>()
                        .eq(MallMoneyFlow::getMemberId, id)
                        .eq(MallMoneyFlow::getType, ScoreFlowTypeEnum.SALE_RECOMMEND.getValue())
        );
        apiSaleInfoVo.setTotalSaleAmount(
                CollUtil.isNotEmpty(mallMoneyFlows)
                        ? mallMoneyFlows.stream().map(MallMoneyFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add)
                        : BigDecimal.ZERO);
        apiSaleInfoVo.setOrderCnt(CollUtil.isNotEmpty(mallMoneyFlows) ? mallMoneyFlows.size() : 0);
        // todo 提现部分暂无
        return new FebsResponse().success().data(apiSaleInfoVo);
    }
    @Override
    public FebsResponse teamHeader() {
        ApiTeamHeaderInfoVo apiTeamHeaderInfoVo = new ApiTeamHeaderInfoVo();
        Long id = LoginUserUtil.getLoginUser().getId();
        MallMember mallMember = this.baseMapper.selectById(id);
        List<MallMember> mallMembers = this.baseMapper.selectAllChildAgentListByInviteId(mallMember.getInviteId());
        if(CollUtil.isEmpty(mallMembers)){
            apiTeamHeaderInfoVo.setTotalCnt(0);
            apiTeamHeaderInfoVo.setTotalAmount(BigDecimal.ZERO);
        }else{
            apiTeamHeaderInfoVo.setTotalCnt(mallMembers.size());
            //stream流获取mallMembers的全部id的set集合
            Set<Long> memberIds = mallMembers.stream().map(MallMember::getId).collect(Collectors.toSet());
            List<MallOrderInfo> mallOrderInfos = mallOrderInfoMapper.selectList(
                    new LambdaQueryWrapper<MallOrderInfo>()
                            .select(MallOrderInfo::getAmount)
                            .in(MallOrderInfo::getMemberId, memberIds)
                            .eq(MallOrderInfo::getStatus, OrderStatusEnum.FINISH.getValue())
            );
            if(CollUtil.isEmpty(mallOrderInfos)){
                apiTeamHeaderInfoVo.setTotalAmount(BigDecimal.ZERO);
            }else{
                apiTeamHeaderInfoVo.setTotalAmount(
                        mallOrderInfos.stream().map(MallOrderInfo::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add)
                );
            }
        }
        return new FebsResponse().success().data(apiTeamHeaderInfoVo);
    }
    @Override
    public FebsResponse teamList(ApiTeamListInfoDto dto) {
        Long id = LoginUserUtil.getLoginUser().getId();
        MallMember mallMember = this.baseMapper.selectById(id);
        dto.setInviteId(mallMember.getInviteId());
        Page<ApiTeamListInfoVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
        IPage<ApiTeamListInfoVo> apiTeamListInfoVoIPage = this.baseMapper.selectTeamPage(page, dto);
        return new FebsResponse().success().data(apiTeamListInfoVoIPage);
    }
    @Override
    public FebsResponse saleHeader() {
        ApiSaleHeaderInfoVo apiSaleHeaderInfoVo = new ApiSaleHeaderInfoVo();
        Long id = LoginUserUtil.getLoginUser().getId();
        List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectList(
                new LambdaQueryWrapper<MallMoneyFlow>()
                        .eq(MallMoneyFlow::getMemberId, id)
                        .eq(MallMoneyFlow::getType, ScoreFlowTypeEnum.SALE_RECOMMEND.getValue())
        );
        apiSaleHeaderInfoVo.setTotalSaleAmount(
                CollUtil.isNotEmpty(mallMoneyFlows)
                        ? mallMoneyFlows.stream().map(MallMoneyFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add)
                        : BigDecimal.ZERO);
        apiSaleHeaderInfoVo.setOrderCnt(CollUtil.isNotEmpty(mallMoneyFlows) ? mallMoneyFlows.size() : 0);
        return new FebsResponse().success().data(apiSaleHeaderInfoVo);
    }
    @Override
    public FebsResponse saleList(ApiSaleListInfoDto dto) {
        Long id = LoginUserUtil.getLoginUser().getId();
        Page<ApiSaleListInfoVo> objectPage = new Page<>(dto.getPageNow(), dto.getPageSize());
        dto.setMemberId(id);
        Page<ApiSaleListInfoVo> mallAchieveRecordPage = this.baseMapper.selectSalePage(objectPage, dto);
        return new FebsResponse().success().data(mallAchieveRecordPage);
    }
}
src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
@@ -37,7 +37,7 @@
    @ApiModelProperty(value = "余额")
    private BigDecimal balance;
    @ApiModelProperty(value = "代理等级")
    @ApiModelProperty(value = "会员等级")
    private String levelName;
    @ApiModelProperty(value = "推荐人昵称")
src/main/java/cc/mrbird/febs/mall/vo/sale/ApiSaleHeaderInfoVo.java
New file
@@ -0,0 +1,18 @@
package cc.mrbird.febs.mall.vo.sale;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "ApiSaleHeaderInfoVo", description = "")
public class ApiSaleHeaderInfoVo {
    @ApiModelProperty(value = "累计佣金")
    private BigDecimal totalSaleAmount;
    @ApiModelProperty(value = "分销订单")
    private int orderCnt;
}
src/main/java/cc/mrbird/febs/mall/vo/sale/ApiSaleInfoVo.java
New file
@@ -0,0 +1,52 @@
package cc.mrbird.febs.mall.vo.sale;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "ApiSaleInfoVo", description = "我的推广")
public class ApiSaleInfoVo {
    @ApiModelProperty(value = "id")
    private Long id;
    @ApiModelProperty(value = "昵称")
    private String name;
    @ApiModelProperty(value = "头像")
    private String avatar;
    @ApiModelProperty(value = "邀请码")
    private String inviteId;
    @ApiModelProperty(value = "分销等级")
    private String storeMasterName;
    @ApiModelProperty(value = "分销等级图片")
    private String storeMasterPng;
    @ApiModelProperty(value = "累计佣金")
    private BigDecimal totalSaleAmount;
    @ApiModelProperty(value = "总推广人(我的团队)")
    private int totalCnt;
    @ApiModelProperty(value = "分销订单")
    private int orderCnt;
    @ApiModelProperty(value = "佣金排行")
    private int sortCnt;
    @ApiModelProperty(value = "可提现")
    private BigDecimal avaAmount;
    @ApiModelProperty(value = "提现中")
    private BigDecimal avaAmountIng;
    @ApiModelProperty(value = "已提现")
    private BigDecimal avaAmountDone;
}
src/main/java/cc/mrbird/febs/mall/vo/sale/ApiSaleListInfoVo.java
New file
@@ -0,0 +1,27 @@
package cc.mrbird.febs.mall.vo.sale;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
@ApiModel(value = "ApiTeamListInfoVo", description = "")
public class ApiSaleListInfoVo {
    @ApiModelProperty(value = "订单编号")
    private String orderNo;
    @ApiModelProperty(value = "返佣时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date createdTime;
    @ApiModelProperty(value = "返佣金额")
    private BigDecimal costAmount;
    @ApiModelProperty(value = "订单金额")
    private BigDecimal amount;
}
src/main/java/cc/mrbird/febs/mall/vo/sale/ApiTeamHeaderInfoVo.java
New file
@@ -0,0 +1,18 @@
package cc.mrbird.febs.mall.vo.sale;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "ApiTeamHeaderInfoVo", description = "我的推广")
public class ApiTeamHeaderInfoVo {
    @ApiModelProperty(value = "总推广人")
    private int totalCnt;
    @ApiModelProperty(value = "累计订单金额")
    private BigDecimal totalAmount;
}
src/main/java/cc/mrbird/febs/mall/vo/sale/ApiTeamListInfoVo.java
New file
@@ -0,0 +1,28 @@
package cc.mrbird.febs.mall.vo.sale;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
@ApiModel(value = "ApiTeamListInfoVo", description = "我的推广")
public class ApiTeamListInfoVo {
    @ApiModelProperty(value = "用户")
    private String memberName;
    @ApiModelProperty(value = "注册时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date createdTime;
    @ApiModelProperty(value = "下单数量")
    private int orderCnt;
    @ApiModelProperty(value = "订单金额")
    private BigDecimal totalAmount;
}
src/main/java/cc/mrbird/febs/vip/service/impl/VipCommonServiceImpl.java
@@ -291,12 +291,12 @@
                multiply,
                ScoreFlowTypeEnum.SALE_RECOMMEND.getValue(),
                mallOrderInfo.getOrderNo(),
                FlowTypeEnum.BALANCE.getValue(),
                FlowTypeEnum.COMMISSION.getValue(),
                StrUtil.format(ScoreFlowTypeEnum.SALE_RECOMMEND.getDesc(),multiply),
                2
        );
        // 更新会员钱包中的余额
        mallMemberWalletService.add(multiply, storeMasterMember.getId(), "balance");
        mallMemberWalletService.add(multiply, storeMasterMember.getId(), "commission");
        MallAchieveRecord mallAchieveRecord = new MallAchieveRecord();
        mallAchieveRecord.setMemberId(mallOrderInfo.getMemberId());
src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -492,4 +492,73 @@
        where id = #{id}
    </update>
    <select id="selectTeamPage" resultType="cc.mrbird.febs.mall.vo.sale.ApiTeamListInfoVo">
        SELECT
                a.name memberName,
                a.CREATED_TIME createdTime,
                (
                    SELECT
                    count(c.id)
                    FROM
                    mall_order_info c
                    where a.id = c.member_id
                    AND c.STATUS = 4
                ) orderCnt,
                ifnull(
                    (
                        SELECT
                            sum(b.amount)
                        FROM
                            mall_order_info b
                        where a.id = b.member_id
                        AND b.STATUS = 4
                    ),
                0) amount
        FROM mall_member a
        <where>
            and find_in_set(#{record.inviteId}, a.referrer_ids)
            <if test="record != null" >
                <if test="record.startTime != null and record.startTime != ''">
                    and a.CREATED_TIME &gt;= #{record.startTime}
                </if>
                <if test="record.endTime != null and record.endTime != ''">
                    and a.CREATED_TIME &lt;= #{record.endTime}
                </if>
            </if>
        </where>
        order by a.CREATED_TIME desc
    </select>
    <select id="selectSalePage" resultType="cc.mrbird.febs.mall.vo.sale.ApiSaleListInfoVo">
        SELECT
            (
                SELECT
                c.order_no
                FROM
                mall_order_info c
                where a.order_id = c.id
            ) orderNo,
            a.CREATED_TIME createdTime,
            a.cost_amount costAmount,
            a.amount amount
        FROM mall_achieve_record a
        <where>
            and a.member_id = #{record.memberId}
            <if test="record != null" >
                <if test="record.startTime != null and record.startTime != ''">
                    and a.CREATED_TIME &gt;= #{record.startTime}
                </if>
                <if test="record.endTime != null and record.endTime != ''">
                    and a.CREATED_TIME &lt;= #{record.endTime}
                </if>
            </if>
        </where>
        order by a.CREATED_TIME desc
    </select>
</mapper>