peng
4 天以前 a749712eeb682285a402b563f26f7b916015b6dc
Merge remote-tracking branch 'origin/dev' into dev
10个文件已修改
3个文件已添加
430 ■■■■■ 已修改文件
framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsExportDTO.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/goods/service/GoodsService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/GoodsTagService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/impl/GoodsTagServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/order/order/entity/dto/CouponExportDetailDTO.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/promotion/mapper/MemberCouponMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/promotion/service/MemberCouponService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberCouponServiceImpl.java 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager-api/src/main/java/cn/lili/controller/goods/GoodsManagerController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager-api/src/main/java/cn/lili/controller/lmk/GoodsTagController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager-api/src/main/java/cn/lili/controller/promotion/CouponManagerController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/goods/entity/dto/GoodsExportDTO.java
New file
@@ -0,0 +1,36 @@
package cn.lili.modules.goods.entity.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * lmk-shop-java
 *
 * @author : zxl
 * @date : 2025-08-08 10:23
 **/
@Data
public class GoodsExportDTO {
    @ApiModelProperty(value = "商品名称")
    private String goodsName;
    @ApiModelProperty(value = "商品编号")
    private String id;
    @ApiModelProperty(value = "价格")
    private Double price;
    @ApiModelProperty(value = "销售模式")
    private String salesModel;
    @ApiModelProperty(value = "商品类型")
    private String goodsType;
    @ApiModelProperty(value = "上架状态")
    private String marketEnable;
    @ApiModelProperty(value = "审核状态")
    private String authFlag;
    @ApiModelProperty(value = "卖家名字")
    private String storeName;
}
framework/src/main/java/cn/lili/modules/goods/service/GoodsService.java
@@ -13,6 +13,7 @@
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.bind.annotation.RequestBody;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.List;
@@ -199,4 +200,6 @@
    void addGoodsCommentNum(Integer commentNum, String goodsId);
    void queryExportGoods(HttpServletResponse response, GoodsSearchParams searchParams);
}
framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java
@@ -15,10 +15,7 @@
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.modules.goods.entity.dos.*;
import cn.lili.modules.goods.entity.dto.GoodsOperationDTO;
import cn.lili.modules.goods.entity.dto.GoodsParamsDTO;
import cn.lili.modules.goods.entity.dto.GoodsSearchParams;
import cn.lili.modules.goods.entity.dto.GoodsSortDTO;
import cn.lili.modules.goods.entity.dto.*;
import cn.lili.modules.goods.entity.enums.GoodsAuthEnum;
import cn.lili.modules.goods.entity.enums.GoodsStatusEnum;
import cn.lili.modules.goods.entity.vos.GoodsSkuVO;
@@ -50,6 +47,10 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -57,6 +58,9 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.*;
import java.util.stream.Collectors;
@@ -314,9 +318,91 @@
        return this.page(PageUtil.initPage(goodsSearchParams), goodsSearchParams.queryWrapper());
    }
    @Override
    public void queryExportGoods(HttpServletResponse response, GoodsSearchParams searchParams) {
        List<Goods> list = this.list(searchParams.queryWrapper());
        XSSFWorkbook workbook = initGoodsExportData(list);
        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 XSSFWorkbook initGoodsExportData(List<Goods> list) {
        List<GoodsExportDTO> goodsExportDTOs = new ArrayList<>();
        for (Goods goods : list) {
            GoodsExportDTO goodsExportDTO = new GoodsExportDTO();
            BeanUtils.copyProperties(goods, goodsExportDTO);
            goodsExportDTOs.add(goodsExportDTO);
        }
        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]);
        }
        for (int i = 0; i < goodsExportDTOs.size(); i++) {
            GoodsExportDTO goodsExportDTO = goodsExportDTOs.get(i);
            Row row = sheet.createRow(i + 1);
            row.createCell(0).setCellValue(goodsExportDTO.getGoodsName());
            row.createCell(1).setCellValue(goodsExportDTO.getId());
            row.createCell(2).setCellValue(goodsExportDTO.getPrice());
            if ("RETAIL".equals(goodsExportDTO.getSalesModel())) {
                row.createCell(3).setCellValue("零售");
            } else if ("WHOLESALE".equals(goodsExportDTO.getSalesModel())) {
                row.createCell(3).setCellValue("批发");
            } else if ("PRESALE".equals(goodsExportDTO.getSalesModel())) {
                row.createCell(3).setCellValue("预售");
            } else {
                row.createCell(3).setCellValue("其他类型");
            }
            if ("PHYSICAL_GOODS".equals(goodsExportDTO.getGoodsType())) {
                row.createCell(4).setCellValue("实物商品");
            } else if ("VIRTUAL_GOODS".equals(goodsExportDTO.getGoodsType())) {
                row.createCell(4).setCellValue("虚拟商品");
            } else {
                row.createCell(4).setCellValue("电子卡券");
            }
            if ("DOWN".equals(goodsExportDTO.getMarketEnable())) {
                row.createCell(5).setCellValue("下架");
            } else if ("UPPER".equals(goodsExportDTO.getMarketEnable())) {
                row.createCell(5).setCellValue("上架");
            }
            if ("TOBEAUDITED".equals(goodsExportDTO.getAuthFlag())) {
                row.createCell(6).setCellValue("待审核");
            } else if ("PASS".equals(goodsExportDTO.getAuthFlag())) {
                row.createCell(6).setCellValue("通过");
            } else if ("REFUSE".equals(goodsExportDTO.getAuthFlag())) {
                row.createCell(6).setCellValue("拒绝");
            }
            row.createCell(7).setCellValue(goodsExportDTO.getStoreName());
        }
        return workbook;
    }
    /**
     * 商品查询
     *
     *g
     * @param goodsSearchParams 查询参数
     * @return 商品信息
     */
@@ -604,6 +690,7 @@
        this.baseMapper.addGoodsCommentNum(commentNum, goodsId);
    }
    /**
     * 更新商品状态
     *
framework/src/main/java/cn/lili/modules/lmk/service/GoodsTagService.java
@@ -48,4 +48,6 @@
     * @return
     */
    Result getByGoodsId(String goodsId);
    Result addOrUpdateTag(GoodsTagForm form);
}
framework/src/main/java/cn/lili/modules/lmk/service/impl/GoodsTagServiceImpl.java
@@ -12,11 +12,13 @@
import cn.lili.utils.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.stream.Collectors;
@@ -62,9 +64,21 @@
    public Result getByGoodsId(String goodsId) {
        LambdaQueryWrapper<GoodsTag> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(GoodsTag::getGoodsId, goodsId);
        queryWrapper.eq(GoodsTag::getDeleteFlag,Boolean.FALSE);
        return Result.ok().data(baseMapper.selectList(queryWrapper));
    }
    @Override
    public Result addOrUpdateTag(GoodsTagForm form) {
        //已有标签
        //删除已有的标签插入最新的标签
        baseMapper.delete(new LambdaQueryWrapper<GoodsTag>().eq(GoodsTag::getGoodsId, form.getGoodsId()));
        if (!CollectionUtils.isEmpty(form.getTagIds())){
            this.addGoodsTag(form);
        }
        return Result.ok("编辑成功");
    }
    @Override
    public Result addGoodsTag(GoodsTagForm form) {
framework/src/main/java/cn/lili/modules/order/order/entity/dto/CouponExportDetailDTO.java
New file
@@ -0,0 +1,77 @@
package cn.lili.modules.order.order.entity.dto;
import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.util.Date;
/**
 * lmk-shop-java
 *
 * @author : zxl
 * @date : 2025-08-07 17:42
 **/
@Data
public class CouponExportDetailDTO {
    @ApiModelProperty(value = "会员名称")
    private String memberName;
    @ApiModelProperty(value = "优惠券名称")
    private String couponName;
    @ApiModelProperty(value = "商家名称,如果是平台,这个值为 platform")
    private String storeName;
    @ApiModelProperty(value = "面额")
    private Double price;
    @ApiModelProperty(value = "折扣")
    private Double discount;
    @ApiModelProperty(value = "消费门槛")
    private Double consumeThreshold;
    /**
     * @see cn.lili.modules.promotion.entity.enums.CouponGetEnum
     */
    @ApiModelProperty(value = "优惠券类型,分为免费领取和活动赠送")
    private String getType;
    /**
     * @see MemberCouponStatusEnum
     */
    @ApiModelProperty(value = "会员优惠券状态")
    private String memberCouponStatus;
    /**
     * POINT("打折"), PRICE("减免现金");
     *
     * @see cn.lili.modules.promotion.entity.enums.CouponTypeEnum
     */
    @ApiModelProperty(value = "优惠卷类型")
    private String couponType;
    /**
     * @see PromotionsScopeTypeEnum
     */
    @ApiModelProperty(value = "关联范围类型")
    private String scopeType;
    @ApiModelProperty(value = "使用起始时间")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis")
    private Date startTime;
    @ApiModelProperty(value = "使用截止时间")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis")
    private Date endTime;
}
framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
@@ -183,8 +183,6 @@
    private COSUtil cosUtil;
    @Autowired
    private AdminUserService adminUserService;
    @Autowired
    private RoleService roleService;
    @Override
framework/src/main/java/cn/lili/modules/promotion/mapper/MemberCouponMapper.java
@@ -9,6 +9,8 @@
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
 * 会员优惠券数据处理层
 *
@@ -20,4 +22,7 @@
    @Select("SELECT mc.*,c.coupon_name FROM li_member_coupon mc LEFT JOIN li_coupon c ON mc.coupon_id = c.id ${ew.customSqlSegment}")
    Page<MemberCouponVO> getMemberCoupons(Page<MemberCoupon> page, @Param(Constants.WRAPPER) Wrapper<MemberCouponVO> queryWrapper);
    @Select("SELECT mc.*,c.coupon_name FROM li_member_coupon mc LEFT JOIN li_coupon c ON mc.coupon_id = c.id ${ew.customSqlSegment}")
    List<MemberCouponVO> getMemberCouponsExport( @Param(Constants.WRAPPER) Wrapper<MemberCouponVO> queryWrapper);
}
framework/src/main/java/cn/lili/modules/promotion/service/MemberCouponService.java
@@ -8,6 +8,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
@@ -165,6 +166,8 @@
     */
    Page<MemberCouponVO> getMemberCouponsPage(Page<MemberCoupon> page, MemberCouponSearchParams param);
    void queryExportCoupon(HttpServletResponse response, MemberCouponSearchParams searchParams);
    /**
     * 获取会员领取过的优惠券数量
     */
framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberCouponServiceImpl.java
@@ -1,5 +1,7 @@
package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.cache.Cache;
import cn.lili.common.enums.ResultCode;
@@ -7,6 +9,11 @@
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.lmk.enums.general.AdminRoleEnum;
import cn.lili.modules.order.order.entity.dto.CouponExportDetailDTO;
import cn.lili.modules.order.order.entity.dto.OrderExportDTO;
import cn.lili.modules.order.order.entity.dto.OrderExportDetailDTO;
import cn.lili.modules.permission.service.AdminUserService;
import cn.lili.modules.promotion.entity.dos.Coupon;
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams;
@@ -20,6 +27,7 @@
import cn.lili.modules.promotion.service.MemberCouponService;
import cn.lili.modules.promotion.tools.PromotionTools;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.utils.CommonUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -27,6 +35,10 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
@@ -34,6 +46,9 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.*;
/**
@@ -52,6 +67,8 @@
    @Autowired
    private CouponService couponService;
    @Autowired
    private AdminUserService adminUserService;
    /**
     * 缓存
     */
@@ -306,6 +323,26 @@
        this.update(updateWrapper);
    }
    public List<MemberCouponVO> getMemberCouponsPageExport(MemberCouponSearchParams param){
        QueryWrapper<MemberCouponVO> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getMemberId()), "mc.member_id", param.getMemberId());
        queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getStoreId()), "c.store_id", param.getStoreId());
        queryWrapper.like(CharSequenceUtil.isNotEmpty(param.getMemberName()), "mc.member_name", param.getMemberName());
        queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getCouponId()), "mc.coupon_id", param.getCouponId());
        queryWrapper.like(CharSequenceUtil.isNotEmpty(param.getCouponName()), "c.coupon_name", param.getCouponName());
        queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getGetType()), "mc.get_type", param.getGetType());
        queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getScopeType()), "mc.scope_type", param.getPromotionStatus());
        queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getCouponType()), "mc.coupon_type", param.getCouponType());
        queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getMemberCouponStatus()), "mc.member_coupon_status", param.getMemberCouponStatus());
        if (param.getStartTime() != null) {
            queryWrapper.ge("mc.start_time", new Date(param.getStartTime()));
        }
        if (param.getEndTime() != null) {
            queryWrapper.le("mc.end_time", new Date(param.getEndTime()));
        }
        return this.baseMapper.getMemberCouponsExport(queryWrapper);
    }
    @Override
    public Page<MemberCouponVO> getMemberCouponsPage(Page<MemberCoupon> page, MemberCouponSearchParams param) {
        QueryWrapper<MemberCouponVO> queryWrapper = new QueryWrapper<>();
@@ -326,7 +363,107 @@
        }
        return this.baseMapper.getMemberCoupons(page, queryWrapper);
    }
    @Override
    public void queryExportCoupon(HttpServletResponse response, MemberCouponSearchParams searchParams) {
        List<MemberCouponVO> records = this.getMemberCouponsPageExport(searchParams);
        XSSFWorkbook workbook = initCouponExportData(records);
        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 XSSFWorkbook initCouponExportData(List<MemberCouponVO> list){
        List<CouponExportDetailDTO> couponExportDetailDTOS = new ArrayList<>();
        for (MemberCoupon memberCoupon : list){
            CouponExportDetailDTO dto = new CouponExportDetailDTO();
            BeanUtil.copyProperties(memberCoupon, dto);
            couponExportDetailDTOS.add(dto);
        }
        System.out.println("-----------------------");
        System.out.println(couponExportDetailDTOS);
        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]);
        }
        //填充数据
        for (int i =0 ;i< couponExportDetailDTOS.size();i++){
            CouponExportDetailDTO dto = couponExportDetailDTOS.get(i);
            Row row = sheet.createRow(i+1);
            row.createCell(0).setCellValue(dto.getMemberName());
            row.createCell(1).setCellValue(dto.getCouponName());
            if ("platform".equals(dto.getStoreName())){
                row.createCell(2).setCellValue("平台");
            }else {
                row.createCell(2).setCellValue(dto.getStoreName());
            }
            if (dto.getDiscount() != null){
                row.createCell(3).setCellValue(dto.getDiscount()+"折");
            }
            if (dto.getPrice()!=null){
                row.createCell(3).setCellValue(dto.getPrice()+"¥");
            }
            row.createCell(4).setCellValue(dto.getConsumeThreshold());
            if("FREE".equals(dto.getGetType())){
                row.createCell(5).setCellValue("免费获取");
            }else if("ACTIVITY".equals(dto.getGetType())){
                row.createCell(5).setCellValue("活动获取");
            }else if("lime".equals(dto.getGetType())){
                row.createCell(5).setCellValue("内购");
            }else if("purple".equals(dto.getGetType())){
                row.createCell(5).setCellValue("未知");
            }
            if("NEW".equals(dto.getMemberCouponStatus())){
                row.createCell(6).setCellValue("已领取");
            }else if("USED".equals(dto.getMemberCouponStatus())){
                row.createCell(6).setCellValue("已使用");
            }else if("EXPIRE".equals(dto.getMemberCouponStatus())){
                row.createCell(6).setCellValue("已过期");
            }else if("CLOSED".equals(dto.getMemberCouponStatus())){
                row.createCell(6).setCellValue("已作废");
            }
            if("DISCOUNT".equals(dto.getCouponType())){
                row.createCell(7).setCellValue("打折");
            }else if("PRICE".equals(dto.getCouponType())){
                row.createCell(7).setCellValue("减免现金");
            }else{
                row.createCell(7).setCellValue("未知");
            }
            if ("ALL".equals(dto.getScopeType())) {
                row.createCell(8).setCellValue("全品类");
            }else if ("PORTION_GOODS_CATEGORY".equals(dto.getScopeType())) {
                row.createCell(8).setCellValue("商品分类");
            } else if ("PORTION_SHOP_CATEGORY".equals(dto.getScopeType())) {
                row.createCell(8).setCellValue("店铺分类");
            } else if ("PORTION_GOODS".equals(dto.getScopeType())) {
                row.createCell(8).setCellValue("指定商品");
            }
            row.createCell(9).setCellValue(DateUtil.formatDateTime(dto.getStartTime()));
            row.createCell(10).setCellValue(DateUtil.formatDateTime(dto.getEndTime()));
        }
        return workbook;
    }
    @Override
    public long getMemberCouponNum(String memberId, String couponId) {
        LambdaQueryWrapper<MemberCoupon> queryWrapper = new LambdaQueryWrapper<>();
@@ -335,6 +472,8 @@
        return this.count(queryWrapper);
    }
    /**
     * 清除无效的会员优惠券
     *
manager-api/src/main/java/cn/lili/controller/goods/GoodsManagerController.java
@@ -2,6 +2,7 @@
import cn.lili.common.aop.annotation.DemoSite;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.context.ThreadContextHolder;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
@@ -17,6 +18,7 @@
import cn.lili.modules.goods.entity.vos.GoodsVO;
import cn.lili.modules.goods.service.GoodsService;
import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams;
import cn.lili.utils.COSUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
@@ -26,6 +28,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import java.util.Arrays;
@@ -69,6 +72,12 @@
        return ResultUtil.data(goodsService.queryByParams(goodsSearchParams));
    }
    @ApiOperation(value = "查询商品清单导出导出列表")
    @GetMapping("/queryExportGoods")
    public void queryExportGoods(GoodsSearchParams searchParams) {
        HttpServletResponse response = ThreadContextHolder.getHttpResponse();
        goodsService.queryExportGoods(response,searchParams);}
    @ApiOperation(value = "分页获取商品列表")
    @GetMapping(value = "/sku/list")
    public ResultMessage<IPage<GoodsSku>> getSkuByPage(GoodsSearchParams goodsSearchParams) {
manager-api/src/main/java/cn/lili/controller/lmk/GoodsTagController.java
New file
@@ -0,0 +1,35 @@
package cn.lili.controller.lmk;
import cn.lili.base.Result;
import cn.lili.modules.lmk.domain.form.GoodsTagForm;
import cn.lili.modules.lmk.service.GoodsTagService;
import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
 * lmk-shop-java
 *
 * @author : zxl
 * @date : 2025-08-08 15:04
 **/
@Validated
@RequiredArgsConstructor
@Api(value = "商品标签", tags = "商品标签")
@RestController
@RequestMapping("/manager/lmk/goodsTag")
public class GoodsTagController {
    private final GoodsTagService goodsTagService;
    @PostMapping("addOrUpdate")
    public Result addOrUpDateTag(@RequestBody GoodsTagForm form){
        return goodsTagService.addOrUpdateTag(form);
    }
    @GetMapping("/getGoods/{id}")
    public Result getGoodSTagById(@PathVariable("id") String goodsId){
        return goodsTagService.getByGoodsId(goodsId);
    }
}
manager-api/src/main/java/cn/lili/controller/promotion/CouponManagerController.java
@@ -1,5 +1,6 @@
package cn.lili.controller.promotion;
import cn.lili.common.context.ThreadContextHolder;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
@@ -24,6 +25,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@@ -121,6 +123,12 @@
        return ResultUtil.data(result);
    }
    @ApiOperation(value = "查询优惠卷导出列表")
    @GetMapping("/queryExportCoupon")
    public void queryExportCoupon(MemberCouponSearchParams searchParams) {
        HttpServletResponse response = ThreadContextHolder.getHttpResponse();
        memberCouponService.queryExportCoupon(response,searchParams);}
    private void setStoreInfo(CouponVO couponVO) {
        AuthUser currentUser = UserContext.getCurrentUser();
        if (currentUser == null) {