From f842d7d4d08ab84137ad6e701d790b75797ea5c4 Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期日, 28 九月 2025 09:19:33 +0800
Subject: [PATCH] 店铺绑优惠劵领取记录

---
 framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java |  164 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 164 insertions(+), 0 deletions(-)

diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java
index 3b40116..08971a4 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java
+++ b/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涓篋TO锛堝鏋淒TO涓嶸O瀛楁涓�鑷达紝鍙洿鎺ヤ娇鐢╒O绠�鍖栦唬鐮侊級
+        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. 浼樻儬鍒稿悕绉帮紙鍙兘涓簄ull锛�
+            row.createCell(1).setCellValue(Objects.nonNull(dto.getCouponName()) ? dto.getCouponName() : "");
+
+            // 3. 鍙戝竷搴楅摵锛堝鐞唒latform鐗规畩鍊硷紝榛樿绌哄瓧绗︿覆锛�
+            String storeName = dto.getStoreName();
+            if ("platform".equals(storeName)) {
+                row.createCell(2).setCellValue("骞冲彴");
+            } else {
+                row.createCell(2).setCellValue(Objects.nonNull(storeName) ? storeName : "");
+            }
+
+            // 4. 闈㈤/鎶樻墸锛堜紭鍏堟樉绀烘姌鎵o紝鍏舵鏄剧ず闈㈤锛岄伩鍏嶈鐩栵級
+            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": // 娉ㄦ剰锛氬師浠g爜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. 浣跨敤璧峰鏃堕棿锛堝鐞唍ull锛屾牸寮忓寲鏃堕棿锛�
+            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();

--
Gitblit v1.8.0