framework/src/main/java/cn/lili/modules/lmk/domain/query/PrizeGrantRecordQuery.java
@@ -18,5 +18,12 @@ @Data @ApiModel(value = "PrizeGrantRecord查询参数", description = "奖品发放记录查询参数") public class PrizeGrantRecordQuery extends AbsQuery { //用户昵称 private String nickName; //活动名 private String activityName; //中奖状态 private String grantStatus; } framework/src/main/java/cn/lili/modules/lmk/domain/query/PrizeRecordQuery.java
@@ -18,5 +18,13 @@ @Data @ApiModel(value = "PrizeRecord查询参数", description = "用户抽奖记录表查询参数") public class PrizeRecordQuery extends AbsQuery { //用户昵称 private String nickName; //活动名 private String activityName; //中奖状态 private String prizeStatus; private String distributeStatus; } framework/src/main/java/cn/lili/modules/lmk/domain/vo/PrizeRecordVO.java
@@ -64,6 +64,10 @@ @ApiModelProperty("活动奖品关联表id") private Long activityPrizeRefId; private String prizeActivityCoverUrl; private String prizeImgUrl; /** 奖品发放状态 */ private String distributeStatus; framework/src/main/java/cn/lili/modules/lmk/mapper/PrizeGrantRecordMapper.java
@@ -31,4 +31,5 @@ */ IPage getPage(IPage page, @Param("query") PrizeGrantRecordQuery query); List<PrizeGrantRecordVO> getExportData(@Param("query") PrizeGrantRecordQuery query); } framework/src/main/java/cn/lili/modules/lmk/mapper/PrizeRecordMapper.java
@@ -1,6 +1,7 @@ package cn.lili.modules.lmk.mapper; import cn.lili.modules.lmk.domain.entity.PrizeRecord; import cn.lili.modules.lmk.domain.query.PrizeGrantRecordQuery; import cn.lili.modules.lmk.domain.query.PrizeRecordTimeQuery; import cn.lili.modules.lmk.domain.vo.PrizeRecordTimeVO; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -34,4 +35,6 @@ IPage getPage(IPage page, @Param("query") PrizeRecordQuery query); List<PrizeRecordTimeVO> getPrizeRecordListByTime(@Param("query") PrizeRecordTimeQuery query); List<PrizeRecordVO> getExportData(@Param("query")PrizeRecordQuery query); } framework/src/main/java/cn/lili/modules/lmk/service/PrizeGrantRecordService.java
@@ -5,6 +5,8 @@ import cn.lili.base.Result; import cn.lili.modules.lmk.domain.form.PrizeGrantRecordForm; import cn.lili.modules.lmk.domain.query.PrizeGrantRecordQuery; import javax.servlet.http.HttpServletResponse; import java.util.List; /** @@ -15,6 +17,8 @@ */ public interface PrizeGrantRecordService extends IService<PrizeGrantRecord> { void queryExportStock(HttpServletResponse response, PrizeGrantRecordQuery query); /** * 添加 * @param form framework/src/main/java/cn/lili/modules/lmk/service/PrizeRecordService.java
@@ -1,12 +1,15 @@ package cn.lili.modules.lmk.service; import cn.lili.modules.lmk.domain.entity.PrizeRecord; import cn.lili.modules.lmk.domain.query.PrizeGrantRecordQuery; import cn.lili.modules.lmk.domain.query.PrizeRecordTimeQuery; import cn.lili.modules.lmk.domain.vo.PrizeRecordTimeVO; import com.baomidou.mybatisplus.extension.service.IService; import cn.lili.base.Result; import cn.lili.modules.lmk.domain.form.PrizeRecordForm; import cn.lili.modules.lmk.domain.query.PrizeRecordQuery; import javax.servlet.http.HttpServletResponse; import java.util.List; /** @@ -17,6 +20,8 @@ */ public interface PrizeRecordService extends IService<PrizeRecord> { void queryExportStock(HttpServletResponse response, PrizeRecordQuery query); /** * 添加 * @param form framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeGrantRecordServiceImpl.java
@@ -1,5 +1,7 @@ package cn.lili.modules.lmk.service.impl; import cn.lili.modules.lmk.enums.general.PrizeGrantStatusEnums; import cn.lili.modules.order.order.entity.dto.PrizeGrantRecordExportDetailDtO; import com.baomidou.mybatisplus.core.metadata.IPage; import cn.lili.modules.lmk.domain.entity.PrizeGrantRecord; import cn.lili.modules.lmk.mapper.PrizeGrantRecordMapper; @@ -9,12 +11,20 @@ import cn.lili.modules.lmk.domain.form.PrizeGrantRecordForm; import cn.lili.modules.lmk.domain.vo.PrizeGrantRecordVO; import cn.lili.modules.lmk.domain.query.PrizeGrantRecordQuery; 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.stereotype.Service; import lombok.RequiredArgsConstructor; import cn.lili.utils.PageUtil; import org.springframework.beans.BeanUtils; 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.stream.Collectors; @@ -30,6 +40,70 @@ private final PrizeGrantRecordMapper prizeGrantRecordMapper; @Override public void queryExportStock(HttpServletResponse response, PrizeGrantRecordQuery query){ List<PrizeGrantRecordVO> list = baseMapper.getExportData(query); XSSFWorkbook workbook = initExportData(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 initExportData(List<PrizeGrantRecordVO> list){ List<PrizeGrantRecordExportDetailDtO> exportDetailDtOS = new ArrayList<>(); for (PrizeGrantRecordVO vo : list){ PrizeGrantRecordExportDetailDtO detailDtO = new PrizeGrantRecordExportDetailDtO(); BeanUtils.copyProperties(vo,detailDtO); exportDetailDtOS.add(detailDtO); } 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< exportDetailDtOS.size();i++){ PrizeGrantRecordExportDetailDtO dto = exportDetailDtOS.get(i); Row row = sheet.createRow(i+1); row.createCell(0).setCellValue(dto.getNickName()); row.createCell(1).setCellValue(dto.getActivityName()); row.createCell(2).setCellValue(dto.getPrizeName()); row.createCell(3).setCellValue(dto.getPrizeContent()); if (PrizeGrantStatusEnums.SUCCESS.name().equals(dto.getGrantStatus())){ row.createCell(4).setCellValue(PrizeGrantStatusEnums.SUCCESS.getDescription()); }else { row.createCell(4).setCellValue(PrizeGrantStatusEnums.FAILED.getDescription()); } row.createCell(5).setCellValue(dto.getDes()); } return workbook; } /** * 添加 * @param form framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeRecordServiceImpl.java
@@ -1,7 +1,14 @@ package cn.lili.modules.lmk.service.impl; import cn.lili.common.utils.StringUtils; import cn.lili.modules.lmk.domain.query.PrizeGrantRecordQuery; import cn.lili.modules.lmk.domain.query.PrizeRecordTimeQuery; import cn.lili.modules.lmk.domain.vo.PrizeRecordTimeVO; import cn.lili.modules.lmk.enums.general.PrizeDistributeStatusEnum; import cn.lili.modules.lmk.enums.general.PrizeGrantStatusEnums; import cn.lili.modules.lmk.enums.general.PrizeStatusEnum; import cn.lili.modules.order.order.entity.dto.PrizeRecordExportDetailDTO; import cn.lili.utils.COSUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import cn.lili.modules.lmk.domain.entity.PrizeRecord; import cn.lili.modules.lmk.mapper.PrizeRecordMapper; @@ -11,17 +18,25 @@ import cn.lili.modules.lmk.domain.form.PrizeRecordForm; import cn.lili.modules.lmk.domain.vo.PrizeRecordVO; import cn.lili.modules.lmk.domain.query.PrizeRecordQuery; 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.stereotype.Service; import lombok.RequiredArgsConstructor; import cn.lili.utils.PageUtil; import org.springframework.beans.BeanUtils; 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.stream.Collectors; /** * 用户抽奖记录表 服务实现类 * 用户抽奖记录 服务实现类 * * @author peng * @since 2025-08-14 @@ -32,6 +47,78 @@ private final PrizeRecordMapper prizeRecordMapper; private final COSUtil cosUtil; @Override public void queryExportStock(HttpServletResponse response, PrizeRecordQuery query){ List<PrizeRecordVO> list = baseMapper.getExportData(query); XSSFWorkbook workbook = initExportData(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(); } } } public XSSFWorkbook initExportData(List<PrizeRecordVO> list){ List<PrizeRecordExportDetailDTO> exportDetailDTOS = new ArrayList<>(); for (PrizeRecordVO vo : list){ PrizeRecordExportDetailDTO detailDtO = new PrizeRecordExportDetailDTO(); BeanUtils.copyProperties(vo,detailDtO); exportDetailDTOS.add(detailDtO); } 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< exportDetailDTOS.size();i++){ PrizeRecordExportDetailDTO dto = exportDetailDTOS.get(i); Row row = sheet.createRow(i+1); row.createCell(0).setCellValue(dto.getNickName()); row.createCell(1).setCellValue(dto.getPrizeActivityName()); if (PrizeStatusEnum.WIN.name().equals(dto.getPrizeStatus())){ row.createCell(2).setCellValue(PrizeStatusEnum.WIN.getDescription()); }else{ row.createCell(2).setCellValue(PrizeStatusEnum.NOT_WIN.getDescription()); } row.createCell(3).setCellValue(dto.getPrizeContent()); if (PrizeDistributeStatusEnum.SUCCESS.name().equals(dto.getDistributeStatus())){ row.createCell(4).setCellValue(PrizeGrantStatusEnums.SUCCESS.getDescription()); }else if(PrizeDistributeStatusEnum.FAILED.name().equals(dto.getDistributeStatus())){ row.createCell(4).setCellValue(PrizeDistributeStatusEnum.FAILED.getDescription()); }else if(PrizeDistributeStatusEnum.NOT_WAIT.name().equals(dto.getDistributeStatus())){ row.createCell(4).setCellValue(PrizeDistributeStatusEnum.NOT_WAIT.getDescription()); }else { row.createCell(4).setCellValue(PrizeDistributeStatusEnum.WAIT.getDescription()); } } return workbook; } /** * 添加 * @param form @@ -91,6 +178,14 @@ public Result page(PrizeRecordQuery query) { IPage<PrizeRecordVO> page = PageUtil.getPage(query, PrizeRecordVO.class); baseMapper.getPage(page, query); for (PrizeRecordVO vo :page.getRecords()){ if (StringUtils.isNotBlank(vo.getPrizeActivityCover())){ vo.setPrizeActivityCoverUrl(cosUtil.getPreviewUrl(vo.getPrizeActivityCover())); } if (StringUtils.isNotBlank(vo.getPrizeImg())){ vo.setPrizeImgUrl(cosUtil.getPreviewUrl(vo.getPrizeImg())); } } return Result.ok().data(page.getRecords()).total(page.getTotal()); } framework/src/main/java/cn/lili/modules/order/order/entity/dto/PrizeGrantRecordExportDetailDtO.java
New file @@ -0,0 +1,33 @@ package cn.lili.modules.order.order.entity.dto; import lombok.Data; /** * lmk-shop-java * * @author : zxl * @date : 2025-08-26 18:07 **/ @Data public class PrizeGrantRecordExportDetailDtO { //用户昵称 private String nickName; //活动名 private String activityName; //商品名 private String prizeName; //商品内容 private String prizeContent; //发放状态 private String grantStatus; //描述 private String des; } framework/src/main/java/cn/lili/modules/order/order/entity/dto/PrizeRecordExportDetailDTO.java
New file @@ -0,0 +1,40 @@ package cn.lili.modules.order.order.entity.dto; import cn.lili.modules.lmk.enums.general.PrizeDistributeStatusEnum; import cn.lili.modules.lmk.enums.general.PrizeStatusEnum; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * lmk-shop-java * * @author : zxl * @date : 2025-08-26 18:11 **/ @Data public class PrizeRecordExportDetailDTO { /** 用户昵称 */ private String nickName; /** 活动名称 */ private String prizeActivityName; /** 中奖状态 * @see PrizeStatusEnum * */ private String prizeStatus; /** 中奖内容 */ private String prizeContent; /** 奖品名称 */ public String prizeName; /** 奖品发放状态 * @see PrizeDistributeStatusEnum * */ private String distributeStatus; } framework/src/main/resources/mapper/lmk/PrizeGrantRecordMapper.xml
@@ -60,6 +60,41 @@ lmk_prize_grant_record LPGR WHERE LPGR.delete_flag = 0 <if test="query.nickName != null and query.nickName !=''"> AND LPGR.nick_name like CONCAT('%',#{query.nickName},'%') </if> <if test="query.activityName != null and query.activityName !=''"> AND LPGR.activity_name like CONCAT('%',#{query.activityName},'%') </if> <if test="query.grantStatus != null and query.grantStatus !=''"> AND LPGR.grant_status = #{query.grantStatus} </if> </select> <select id="getExportData" resultMap="BaseResultMap"> SELECT LPGR.user_id, LPGR.nick_name, LPGR.activity_id, LPGR.activity_name, LPGR.prize_id, LPGR.prize_name, LPGR.prize_content, LPGR.grant_status, LPGR.prize_num_id, LPGR.des, LPGR.id FROM lmk_prize_grant_record LPGR WHERE LPGR.delete_flag = 0 <if test="query.nickName != null and query.nickName !=''"> AND LPGR.nick_name like CONCAT('%',#{query.nickName},'%') </if> <if test="query.activityName != null and query.activityName !=''"> AND LPGR.activity_name like CONCAT('%',#{query.activityName},'%') </if> <if test="query.grantStatus != null and query.grantStatus !=''"> AND LPGR.grant_status = #{query.grantStatus} </if> </select> </mapper> framework/src/main/resources/mapper/lmk/PrizeRecordMapper.xml
@@ -17,6 +17,7 @@ <result column="prize_num_id" property="prizeNumId" /> <result column="activity_prize_ref_id" property="activityPrizeRefId" /> <result column="distribute_status" property="distributeStatus" /> <result column="distribute_status" property="distributeStatus"/> </resultMap> @@ -60,11 +61,56 @@ LPR.prize_img, LPR.prize_num_id, LPR.activity_prize_ref_id, LPR.distribute_status, LPR.id FROM lmk_prize_record LPR WHERE LPR.delete_flag = 0 <if test="query.nickName != null and query.nickName !=''"> AND LPR.nick_name like CONCAT('%',#{query.nickName},'%') </if> <if test="query.activityName != null and query.activityName !=''"> AND LPR.prize_activity_name like CONCAT('%',#{query.activityName},'%') </if> <if test="query.prizeStatus != null and query.prizeStatus !=''"> AND LPR.prize_status = #{query.prizeStatus} </if> <if test="query.distributeStatus != null and query.distributeStatus !=''"> AND LPR.distribute_status = #{query.distributeStatus} </if> </select> <select id="getExportData" resultMap="BaseResultMap"> SELECT LPR.user_id, LPR.nick_name, LPR.prize_activity_id, LPR.prize_activity_name, LPR.prize_activity_cover, LPR.prize_status, LPR.prize_content, LPR.prize_id, LPR.prize_img, LPR.prize_num_id, LPR.activity_prize_ref_id, LPR.distribute_status, LPR.id FROM lmk_prize_record LPR WHERE LPR.delete_flag = 0 <if test="query.nickName != null and query.nickName !=''"> AND LPR.nick_name like CONCAT('%',#{query.nickName},'%') </if> <if test="query.activityName != null and query.activityName !=''"> AND LPR.prize_activity_name like CONCAT('%',#{query.activityName},'%') </if> <if test="query.prizeStatus != null and query.prizeStatus !=''"> AND LPR.prize_status = #{query.prizeStatus} </if> <if test="query.distributeStatus != null and query.distributeStatus !=''"> AND LPR.distribute_status = #{query.distributeStatus} </if> </select> <resultMap id="getPrizeRecordListByTimeMap" type="cn.lili.modules.lmk.domain.vo.PrizeRecordTimeVO"> <result property="prizeId" column="prize_id"/> manager-api/src/main/java/cn/lili/controller/lmk/PrizeGrantRecordController.java
New file @@ -0,0 +1,39 @@ package cn.lili.controller.lmk; import cn.lili.base.Result; import cn.lili.common.context.ThreadContextHolder; import cn.lili.modules.lmk.domain.query.PrizeGrantRecordQuery; import cn.lili.modules.lmk.domain.query.PrizeRecordQuery; import cn.lili.modules.lmk.service.PrizeGrantRecordService; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; /** * lmk-shop-java * 奖品发放记录 * * @author : zxl * @date : 2025-08-25 16:45 **/ @RestController @AllArgsConstructor @RequestMapping("/manager/lmk/prizeGrantRecord") public class PrizeGrantRecordController { private final PrizeGrantRecordService prizeGrantRecordService; @GetMapping public Result getPage(PrizeGrantRecordQuery query){ return prizeGrantRecordService.page(query); } @ApiOperation(value = "导出") @GetMapping("/queryExport") public void queryExport(PrizeGrantRecordQuery searchParams) { HttpServletResponse response = ThreadContextHolder.getHttpResponse(); prizeGrantRecordService.queryExportStock(response,searchParams);} } manager-api/src/main/java/cn/lili/controller/lmk/PrizeRecordController.java
New file @@ -0,0 +1,40 @@ package cn.lili.controller.lmk; import cn.lili.base.Result; import cn.lili.common.context.ThreadContextHolder; import cn.lili.modules.goods.entity.dto.GoodsSearchParams; import cn.lili.modules.lmk.domain.query.PrizeRecordQuery; import cn.lili.modules.lmk.service.PrizeRecordService; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; /** * lmk-shop-java * 用户抽奖记录 * @author : zxl * @date : 2025-08-25 16:52 **/ @AllArgsConstructor @RestController @RequestMapping("/manager/lmk/prizeRecord") public class PrizeRecordController { private final PrizeRecordService prizeRecordService; @GetMapping public Result getPage(PrizeRecordQuery query){ return prizeRecordService.page(query); } @ApiOperation(value = "导出") @GetMapping("/queryExport") public void queryExport(PrizeRecordQuery searchParams) { HttpServletResponse response = ThreadContextHolder.getHttpResponse(); prizeRecordService.queryExportStock(response,searchParams);} }