package cn.lili.modules.lmk.service.impl; import cn.lili.common.security.context.UserContext; import cn.lili.common.utils.StringUtils; 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; import cn.lili.modules.lmk.service.PrizeRecordService; import cn.lili.base.Result; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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 */ @Service @RequiredArgsConstructor public class PrizeRecordServiceImpl extends ServiceImpl implements PrizeRecordService { private final PrizeRecordMapper prizeRecordMapper; private final COSUtil cosUtil; @Override public void queryExportStock(HttpServletResponse response, PrizeRecordQuery query){ List 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 list){ List 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 * @return */ @Override public Result add(PrizeRecordForm form) { PrizeRecord entity = PrizeRecordForm.getEntityByForm(form, null); baseMapper.insert(entity); return Result.ok("添加成功"); } /** * 修改 * @param form * @return */ @Override public Result update(PrizeRecordForm form) { PrizeRecord entity = baseMapper.selectById(form.getId()); // 为空抛IllegalArgumentException,做全局异常处理 Assert.notNull(entity, "记录不存在"); BeanUtils.copyProperties(form, entity); baseMapper.updateById(entity); return Result.ok("修改成功"); } /** * 批量删除 * @param ids * @return */ @Override public Result remove(List ids) { baseMapper.deleteBatchIds(ids); return Result.ok("删除成功"); } /** * id删除 * @param id * @return */ @Override public Result removeById(String id) { baseMapper.deleteById(id); return Result.ok("删除成功"); } /** * 分页查询 * @param query * @return */ @Override public Result page(PrizeRecordQuery query) { IPage 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()); } @Override public Result pageByUserId(PrizeRecordQuery query) { String userId = UserContext.getCurrentUser().getId(); IPage page = PageUtil.getPage(query, PrizeRecordVO.class); if (StringUtils.isNotBlank(userId)){ baseMapper.getByUserIdPage(page, query, userId); 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()); } /** * 根据id查找 * @param id * @return */ @Override public Result detail(String id) { PrizeRecordVO vo = baseMapper.getById(id); Assert.notNull(vo, "记录不存在"); return Result.ok().data(vo); } /** * 列表 * @return */ @Override public Result all() { List entities = baseMapper.selectList(null); List vos = entities.stream() .map(entity -> PrizeRecordVO.getVoByEntity(entity, null)) .collect(Collectors.toList()); return Result.ok().data(vos); } @Override public List getPrizeRecordListByTime(PrizeRecordTimeQuery query) { return baseMapper.getPrizeRecordListByTime(query); } }