zxl
昨天 f842d7d4d08ab84137ad6e701d790b75797ea5c4
店铺绑优惠劵领取记录
7个文件已修改
1个文件已添加
550 ■■■■■ 已修改文件
framework/src/main/java/cn/lili/modules/lmk/domain/query/StoreCouponClaimRecordQuery.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/vo/StoreCouponClaimRecordVO.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/mapper/StoreCouponClaimRecordMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponClaimRecordService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/order/order/entity/dto/StoreCouponClaimRecordDTO.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/resources/mapper/lmk/StoreCouponClaimRecordMapper.xml 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager-api/src/main/java/cn/lili/controller/lmk/StoreCouponController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/query/StoreCouponClaimRecordQuery.java
@@ -18,5 +18,21 @@
@Data
@ApiModel(value = "StoreCouponClaimRecord查询参数", description = "店铺优惠卷领取记录查询参数")
public class StoreCouponClaimRecordQuery extends AbsQuery {
    private String sort;
    private String order;
    private String getType;
    private Long startTime;
    private Long endTime;
    private String memberCouponStatus;
    private String memberName;
    private String couponName;
}
framework/src/main/java/cn/lili/modules/lmk/domain/vo/StoreCouponClaimRecordVO.java
@@ -2,12 +2,15 @@
import cn.lili.base.AbsVo;
import cn.lili.modules.lmk.domain.entity.StoreCouponClaimRecord;
import java.util.List;
import org.springframework.lang.NonNull;
import org.springframework.beans.BeanUtils;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.lang.NonNull;
import org.springframework.beans.BeanUtils;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -34,11 +37,68 @@
    /** 店铺id */
    @ApiModelProperty("店铺id")
    private Long storeId;
    private String storeId;
    /** 用户id */
    @ApiModelProperty("用户id")
    private Long userId;
    private String userId;
    @ApiModelProperty("店铺优惠券关联ID")
    private String storeCouponId;
    @ApiModelProperty("创建者")
    private String createBy;
    @ApiModelProperty("创建时间")
    private Date createTime;
    @ApiModelProperty("修改者")
    private String updateBy;
    @ApiModelProperty("更新时间")
    private Date updateTime;
    @ApiModelProperty("删除标志")
    private Boolean deleteFlag;
    // 补充会员优惠券表关联字段
    @ApiModelProperty("会员ID")
    private String memberId;
    @ApiModelProperty("会员名称")
    private String memberName;
    @ApiModelProperty("优惠券面额")
    private BigDecimal price;
    @ApiModelProperty("使用起始时间")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date startTime;
    @ApiModelProperty("使用截止时间")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date endTime;
    @ApiModelProperty("会员优惠券状态")
    private String memberCouponStatus;
    @ApiModelProperty("商品使用限制次数")
    private Integer goodsUseLimitNum;
    @ApiModelProperty("是否是平台优惠券")
    private Boolean platformFlag;
    @ApiModelProperty("优惠券类型")
    private String getType;
    @ApiModelProperty("折扣")
    private BigDecimal discount;
    @ApiModelProperty("活动类型")
    private String couponType;
    public static StoreCouponClaimRecordVO getVoByEntity(@NonNull StoreCouponClaimRecord entity, StoreCouponClaimRecordVO vo) {
        if(vo == null) {
@@ -48,4 +108,4 @@
        return vo;
    }
}
}
framework/src/main/java/cn/lili/modules/lmk/mapper/StoreCouponClaimRecordMapper.java
@@ -30,5 +30,5 @@
    *  分页
    */
    IPage getPage(IPage page, @Param("query") StoreCouponClaimRecordQuery query);
    List<StoreCouponClaimRecordVO> getExportData(@Param("query") StoreCouponClaimRecordQuery query);
}
framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponClaimRecordService.java
@@ -1,12 +1,14 @@
package cn.lili.modules.lmk.service;
import cn.lili.modules.lmk.domain.entity.StoreCouponClaimRecord;
import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams;
import com.baomidou.mybatisplus.extension.service.IService;
import cn.lili.base.Result;
import cn.lili.modules.lmk.domain.form.StoreCouponClaimRecordForm;
import cn.lili.modules.lmk.domain.query.StoreCouponClaimRecordQuery;
import org.springframework.web.bind.annotation.PathVariable;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
@@ -66,4 +68,6 @@
    Result all();
    Result claimCoupon(String id);
    void queryExportCoupon(HttpServletResponse response, StoreCouponClaimRecordQuery query);
}
framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java
@@ -1,5 +1,7 @@
package cn.lili.modules.lmk.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
@@ -9,8 +11,12 @@
import cn.lili.modules.lmk.enums.general.StoreCouponStausEnum;
import cn.lili.modules.lmk.service.StoreCouponService;
import cn.lili.modules.lmk.service.StoreCouponSingleService;
import cn.lili.modules.order.order.entity.dto.CouponExportDetailDTO;
import cn.lili.modules.order.order.entity.dto.StoreCouponClaimRecordDTO;
import cn.lili.modules.order.order.entity.enums.ClaimStatusEnum;
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams;
import cn.lili.modules.promotion.entity.vos.MemberCouponVO;
import cn.lili.modules.promotion.service.MemberCouponService;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import com.alibaba.fastjson.JSON;
@@ -26,6 +32,10 @@
import cn.lili.modules.lmk.domain.form.StoreCouponClaimRecordForm;
import cn.lili.modules.lmk.domain.vo.StoreCouponClaimRecordVO;
import cn.lili.modules.lmk.domain.query.StoreCouponClaimRecordQuery;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;
@@ -37,7 +47,12 @@
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.util.Assert;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
@@ -232,6 +247,155 @@
        }
    }
    private XSSFWorkbook initCouponExportData(List<StoreCouponClaimRecordVO> list) {
        // 转换VO为DTO(如果DTO与VO字段一致,可直接使用VO简化代码)
        List<StoreCouponClaimRecordDTO> dtos = new ArrayList<>();
        for (StoreCouponClaimRecordVO vo : list) {
            StoreCouponClaimRecordDTO dto = new StoreCouponClaimRecordDTO();
            BeanUtil.copyProperties(vo, dto);
            dtos.add(dto);
        }
        System.out.println("-----------------------");
        System.out.println(dtos);
        XSSFWorkbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("优惠券领取记录");
        // 创建表头
        Row header = sheet.createRow(0);
        String[] headers = {
                "会员名称", "优惠券名称", "发布店铺", "面额/折扣",
                 "获取方式", "会员优惠券状态", "优惠券类型",
                 "使用起始时间", "截止时间"
        };
        for (int i = 0; i < headers.length; i++) {
            Cell cell = header.createCell(i);
            cell.setCellValue(headers[i]);
        }
        // 填充数据(增加空值处理,避免NPE)
        for (int i = 0; i < dtos.size(); i++) {
            StoreCouponClaimRecordDTO dto = dtos.get(i);
            Row row = sheet.createRow(i + 1);
            // 1. 会员名称(可能为null)
            row.createCell(0).setCellValue(Objects.nonNull(dto.getMemberName()) ? dto.getMemberName() : "");
            // 2. 优惠券名称(可能为null)
            row.createCell(1).setCellValue(Objects.nonNull(dto.getCouponName()) ? dto.getCouponName() : "");
            // 3. 发布店铺(处理platform特殊值,默认空字符串)
            String storeName = dto.getStoreName();
            if ("platform".equals(storeName)) {
                row.createCell(2).setCellValue("平台");
            } else {
                row.createCell(2).setCellValue(Objects.nonNull(storeName) ? storeName : "");
            }
            // 4. 面额/折扣(优先显示折扣,其次显示面额,避免覆盖)
            Cell amountCell = row.createCell(3);
            if (Objects.nonNull(dto.getDiscount())) {
                amountCell.setCellValue(dto.getDiscount() + "折");
            } else if (Objects.nonNull(dto.getPrice())) {
                amountCell.setCellValue(dto.getPrice() + "元"); // 统一用"元"更规范
            } else {
                amountCell.setCellValue(""); // 均为空时显示空
            }
            // 4. 获取方式(补充默认未知状态,覆盖所有枚举值)
            String getType = dto.getGetType();
            String getTypeDesc;
            switch (getType) {
                case "FREE":
                    getTypeDesc = "免费获取";
                    break;
                case "ACTIVITY":
                    getTypeDesc = "活动获取";
                    break;
                case "INSIDE": // 注意:原代码lime是颜色,实际枚举应为INSIDE
                    getTypeDesc = "内购";
                    break;
                default:
                    getTypeDesc = "未知";
            }
            row.createCell(4).setCellValue(getTypeDesc);
            // 5. 会员优惠券状态(覆盖所有可能状态)
            String status = dto.getMemberCouponStatus();
            String statusDesc;
            switch (status) {
                case "NEW":
                    statusDesc = "已领取";
                    break;
                case "USED":
                    statusDesc = "已使用";
                    break;
                case "EXPIRE":
                    statusDesc = "已过期";
                    break;
                case "CLOSED":
                    statusDesc = "已作废";
                    break;
                default:
                    statusDesc = "未知状态";
            }
            row.createCell(5).setCellValue(statusDesc);
            // 6. 优惠券类型(补充默认处理)
            String couponType = dto.getCouponType();
            String couponTypeDesc;
            if ("DISCOUNT".equals(couponType)) {
                couponTypeDesc = "打折";
            } else if ("PRICE".equals(couponType)) {
                couponTypeDesc = "减免现金";
            } else {
                couponTypeDesc = "未知类型";
            }
            row.createCell(6).setCellValue(couponTypeDesc);
            // 10. 使用起始时间(处理null,格式化时间)
            Cell startTimeCell = row.createCell(7);
            if (Objects.nonNull(dto.getStartTime())) {
                startTimeCell.setCellValue(DateUtil.formatDateTime(dto.getStartTime()));
            } else {
                startTimeCell.setCellValue("");
            }
            // 11. 截止时间(同上)
            Cell endTimeCell = row.createCell(8);
            if (Objects.nonNull(dto.getEndTime())) {
                endTimeCell.setCellValue(DateUtil.formatDateTime(dto.getEndTime()));
            } else {
                endTimeCell.setCellValue("");
            }
        }
        return workbook;
    }
    @Override
    public void queryExportCoupon(HttpServletResponse response, StoreCouponClaimRecordQuery query) {
        List<StoreCouponClaimRecordVO> exportData = baseMapper.getExportData(query);
        XSSFWorkbook workbook = initCouponExportData(exportData);
        try {
            // 设置响应头
            String fileName = URLEncoder.encode("优惠券领取记录", "UTF-8");
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
            ServletOutputStream out = response.getOutputStream();
            workbook.write(out);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                workbook.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    private static StoreCouponClaimRecord getStoreCouponClaimRecord(StoreCouponSingle storeCouponSingle, String userId) {
        StoreCouponClaimRecord storeCouponClaimRecord = new StoreCouponClaimRecord();
framework/src/main/java/cn/lili/modules/order/order/entity/dto/StoreCouponClaimRecordDTO.java
New file
@@ -0,0 +1,96 @@
package cn.lili.modules.order.order.entity.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
/**
 * lmk-shop-java
 *
 * @author : zxl
 * @date : 2025-09-27 21:40
 **/
@Data
public class StoreCouponClaimRecordDTO {
    /** 店铺名称 */
    @ApiModelProperty("店铺名称")
    private String storeName;
    /** 优惠卷id */
    @ApiModelProperty("优惠卷id")
    private Long couponId;
    /** 优惠卷名称 */
    @ApiModelProperty("优惠卷名称")
    private String couponName;
    /** 店铺id */
    @ApiModelProperty("店铺id")
    private String storeId;
    /** 用户id */
    @ApiModelProperty("用户id")
    private String userId;
    @ApiModelProperty("店铺优惠券关联ID")
    private String storeCouponId;
    @ApiModelProperty("创建者")
    private String createBy;
    @ApiModelProperty("创建时间")
    private Date createTime;
    @ApiModelProperty("修改者")
    private String updateBy;
    @ApiModelProperty("更新时间")
    private Date updateTime;
    @ApiModelProperty("删除标志")
    private Boolean deleteFlag;
    // 补充会员优惠券表关联字段
    @ApiModelProperty("会员ID")
    private String memberId;
    @ApiModelProperty("会员名称")
    private String memberName;
    @ApiModelProperty("优惠券面额")
    private BigDecimal price;
    @ApiModelProperty("使用起始时间")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date startTime;
    @ApiModelProperty("使用截止时间")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date endTime;
    @ApiModelProperty("会员优惠券状态")
    private String memberCouponStatus;
    @ApiModelProperty("商品使用限制次数")
    private Integer goodsUseLimitNum;
    @ApiModelProperty("是否是平台优惠券")
    private Boolean platformFlag;
    @ApiModelProperty("优惠券类型")
    private String getType;
    @ApiModelProperty("折扣")
    private BigDecimal discount;
    @ApiModelProperty("活动类型")
    private String couponType;
}
framework/src/main/resources/mapper/lmk/StoreCouponClaimRecordMapper.xml
@@ -31,20 +31,177 @@
        WHERE
            LSCCR.id = #{id} AND LSCCR.delete_flag = 0
    </select>
    <resultMap id="BaseResultMapByManager" type="cn.lili.modules.lmk.domain.vo.StoreCouponClaimRecordVO">
        <!-- 会员优惠券表(li_member_coupon)字段映射 -->
        <result column="member_id" property="memberId"/>
        <result column="member_name" property="memberName"/>
        <result column="price" property="price"/>
        <result column="start_time" property="startTime"/>
        <result column="end_time" property="endTime"/>
        <result column="member_coupon_status" property="memberCouponStatus"/>
        <result column="goods_use_limit_num" property="goodsUseLimitNum"/>
        <result column="platform_flag" property="platformFlag"/>
        <result column="get_type" property="getType"/>
        <result column="discount" property="discount"/>
        <result column="coupon_type" property="couponType"/>
        <result column="coupon_id" property="couponId" />
        <!-- 店铺优惠券领取记录表(lmk_store_coupon_claim_record)字段映射 -->
        <result column="id" property="id"/>
        <result column="store_name" property="storeName"/>
        <result column="store_coupon_id" property="storeCouponId"/>
        <result column="store_id" property="storeId"/>
        <result column="user_id" property="userId"/>
        <result column="coupon_name" property="couponName"/>
    </resultMap>
    <select id="getPage" resultMap="BaseResultMap">
    <select id="getPage" resultMap="BaseResultMapByManager">
        SELECT
            LSCCR.store_name,
            LSCCR.coupon_id,
            LSCCR.coupon_name,
            LSCCR.store_id,
            LSCCR.user_id,
            LSCCR.id
        lmc.member_id,
        lmc.member_name,
        lmc.price,
        lmc.start_time,
        lmc.end_time,
        lmc.member_coupon_status,
        lmc.goods_use_limit_num,
        lmc.platform_flag,
        lmc.get_type,
        lmc.discount,
        lmc.coupon_type,
        lsccr.id,
        lsccr.store_name,
        lsccr.store_coupon_id,
        lsccr.store_id,
        lsccr.user_id,
        lsccr.coupon_name,
        lsccr.create_time,
        lsccr.coupon_id
        FROM
            lmk_store_coupon_claim_record LSCCR
        lmk_store_coupon_claim_record lsccr
        INNER JOIN
        li_member_coupon lmc ON lmc.coupon_id = lsccr.coupon_id
        WHERE
            LSCCR.delete_flag = 0
        lmc.delete_flag = 0
        AND lsccr.delete_flag = 0
        <!-- 1. 会员名称模糊查询(关联li_member_coupon表) -->
        <if test="query.memberName != null and query.memberName != ''">
            AND lmc.member_name LIKE CONCAT('%', #{query.memberName}, '%')
        </if>
        <!-- 2. 优惠券名称模糊查询(关联lmk_store_coupon_claim_record表) -->
        <if test="query.couponName != null and query.couponName != ''">
            AND lsccr.coupon_name LIKE CONCAT('%', #{query.couponName}, '%')
        </if>
        <!-- 3. 优惠券获取方式(精确匹配,关联li_member_coupon表) -->
        <if test="query.getType != null and query.getType != ''">
            AND lmc.get_type = #{query.getType}
        </if>
        <!-- 4. 会员优惠券状态(精确匹配,关联li_member_coupon表) -->
        <if test="query.memberCouponStatus != null and query.memberCouponStatus != ''">
            AND lmc.member_coupon_status = #{query.memberCouponStatus}
        </if>
        <!-- 5. 时间范围筛选:用BETWEEN匹配start_time和end_time(需同时传入开始和结束时间) -->
        <if test="query.startTime != null and query.endTime != null">
            AND lmc.start_time BETWEEN FROM_UNIXTIME(#{query.startTime}/1000)
            AND FROM_UNIXTIME(#{query.endTime}/1000)
        </if>
        <!-- 6. 排序逻辑(根据前端传入的sort字段和order排序方向) -->
        <if test="query.sort != null and query.sort != '' and query.order != null and query.order != ''">
            ORDER BY
            <choose>
                <!-- li_member_coupon表字段 -->
                <when test="query.sort == 'memberName'">lmc.member_name #{query.order},</when>
                <when test="query.sort == 'price'">lmc.price #{query.order},</when>
                <when test="query.sort == 'startTime'">lmc.start_time #{query.order},</when>
                <when test="query.sort == 'endTime'">lmc.end_time #{query.order},</when>
                <when test="query.sort == 'memberCouponStatus'">lmc.member_coupon_status #{query.order},</when>
                <when test="query.sort == 'getType'">lmc.get_type #{query.order},</when>
                <when test="query.sort == 'couponName'">lsccr.coupon_name #{query.order},</when>
                <when test="query.sort == 'storeName'">lsccr.store_name #{query.order},</when>
                <when test="query.sort == 'createTime'">lsccr.create_time #{query.order},</when>
                <!-- 默认排序 -->
                <otherwise>lsccr.create_time DESC,</otherwise>
            </choose>
            lsccr.create_time DESC  <!-- 兜底排序,避免语法错误 -->
        </if>
        <!-- 未传排序参数时,默认按领取时间倒序 -->
        <if test="(query.sort == null or query.sort == '') or (query.order == null or query.order == '')">
            ORDER BY lsccr.create_time DESC
        </if>
    </select>
    <select id="getExportData" resultMap="BaseResultMapByManager">
        SELECT
        lmc.member_id,
        lmc.member_name,
        lmc.price,
        lmc.start_time,
        lmc.end_time,
        lmc.member_coupon_status,
        lmc.goods_use_limit_num,
        lmc.platform_flag,
        lmc.get_type,
        lmc.discount,
        lmc.coupon_type,
        lsccr.id,
        lsccr.store_name,
        lsccr.store_coupon_id,
        lsccr.store_id,
        lsccr.user_id,
        lsccr.coupon_name,
        lsccr.create_time,
        lsccr.coupon_id
        FROM
        lmk_store_coupon_claim_record lsccr
        INNER JOIN
        li_member_coupon lmc ON lmc.coupon_id = lsccr.coupon_id
        WHERE
        lmc.delete_flag = 0
        AND lsccr.delete_flag = 0
        <!-- 1. 会员名称模糊查询(关联li_member_coupon表) -->
        <if test="query.memberName != null and query.memberName != ''">
            AND lmc.member_name LIKE CONCAT('%', #{query.memberName}, '%')
        </if>
        <!-- 2. 优惠券名称模糊查询(关联lmk_store_coupon_claim_record表) -->
        <if test="query.couponName != null and query.couponName != ''">
            AND lsccr.coupon_name LIKE CONCAT('%', #{query.couponName}, '%')
        </if>
        <!-- 3. 优惠券获取方式(精确匹配,关联li_member_coupon表) -->
        <if test="query.getType != null and query.getType != ''">
            AND lmc.get_type = #{query.getType}
        </if>
        <!-- 4. 会员优惠券状态(精确匹配,关联li_member_coupon表) -->
        <if test="query.memberCouponStatus != null and query.memberCouponStatus != ''">
            AND lmc.member_coupon_status = #{query.memberCouponStatus}
        </if>
        <!-- 5. 时间范围筛选:用BETWEEN匹配start_time和end_time(需同时传入开始和结束时间) -->
        <if test="query.startTime != null and query.endTime != null">
            AND lmc.start_time BETWEEN FROM_UNIXTIME(#{query.startTime}/1000)
            AND FROM_UNIXTIME(#{query.endTime}/1000)
        </if>
        <!-- 6. 排序逻辑(根据前端传入的sort字段和order排序方向) -->
        <if test="query.sort != null and query.sort != '' and query.order != null and query.order != ''">
            ORDER BY
            <choose>
                <!-- li_member_coupon表字段 -->
                <when test="query.sort == 'memberName'">lmc.member_name #{query.order},</when>
                <when test="query.sort == 'price'">lmc.price #{query.order},</when>
                <when test="query.sort == 'startTime'">lmc.start_time #{query.order},</when>
                <when test="query.sort == 'endTime'">lmc.end_time #{query.order},</when>
                <when test="query.sort == 'memberCouponStatus'">lmc.member_coupon_status #{query.order},</when>
                <when test="query.sort == 'getType'">lmc.get_type #{query.order},</when>
                <when test="query.sort == 'couponName'">lsccr.coupon_name #{query.order},</when>
                <when test="query.sort == 'storeName'">lsccr.store_name #{query.order},</when>
                <when test="query.sort == 'createTime'">lsccr.create_time #{query.order},</when>
                <!-- 默认排序 -->
                <otherwise>lsccr.create_time DESC,</otherwise>
            </choose>
            lsccr.create_time DESC  <!-- 兜底排序,避免语法错误 -->
        </if>
        <!-- 未传排序参数时,默认按领取时间倒序 -->
        <if test="(query.sort == null or query.sort == '') or (query.order == null or query.order == '')">
            ORDER BY lsccr.create_time DESC
        </if>
    </select>
</mapper>
manager-api/src/main/java/cn/lili/controller/lmk/StoreCouponController.java
@@ -1,13 +1,20 @@
package cn.lili.controller.lmk;
import cn.lili.base.Result;
import cn.lili.common.context.ThreadContextHolder;
import cn.lili.modules.lmk.domain.form.StoreCouponForm;
import cn.lili.modules.lmk.domain.query.StoreCouponClaimRecordQuery;
import cn.lili.modules.lmk.domain.query.StoreCouponQuery;
import cn.lili.modules.lmk.domain.query.StoreCouponSingleQuery;
import cn.lili.modules.lmk.service.StoreCouponClaimRecordService;
import cn.lili.modules.lmk.service.StoreCouponService;
import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
/**
 * 商家端生成店铺优惠卷信息
@@ -22,6 +29,7 @@
    private final StoreCouponService storeCouponService;
    private final StoreCouponClaimRecordService storeCouponClaimRecordService;
    /**
     * 创建店铺与优惠卷关联关系
     * @param storeCoupon
@@ -65,4 +73,15 @@
    public Result getPageByStoreCoupon(StoreCouponSingleQuery query){
        return storeCouponService.getPageByStoreCoupon(query);
    }
    @GetMapping("/getPageByStoreCouponClaimRecord")
    public Result getPageByStoreCouponClaimRecord(StoreCouponClaimRecordQuery query){
        return storeCouponClaimRecordService.page(query);
    }
    @ApiOperation(value = "查询优惠卷导出列表")
    @GetMapping("/queryExportCoupon")
    public void queryExportCoupon(StoreCouponClaimRecordQuery query) {
        HttpServletResponse response = ThreadContextHolder.getHttpResponse();
        storeCouponClaimRecordService.queryExportCoupon(response,query);}
}