From 44aacaabb89a128d1a47593cf8db5f908fa03fab Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期五, 19 九月 2025 14:17:59 +0800
Subject: [PATCH] 会员列表导出

---
 framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java |  150 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 139 insertions(+), 11 deletions(-)

diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java
index 48fa339..455df7b 100644
--- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java
@@ -4,7 +4,6 @@
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.text.CharSequenceUtil;
 import cn.hutool.crypto.SecureUtil;
-import cn.hutool.crypto.digest.MD5;
 import cn.lili.base.Result;
 import cn.lili.cache.Cache;
 import cn.lili.cache.CachePrefix;
@@ -28,6 +27,10 @@
 import cn.lili.modules.lmk.domain.entity.VideoAccount;
 import cn.lili.modules.lmk.domain.form.MemberNickNameForm;
 import cn.lili.modules.lmk.domain.form.MemberTagForm;
+import cn.lili.modules.lmk.domain.vo.PrizeRecordVO;
+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.lmk.service.MemberTagService;
 import cn.lili.modules.lmk.service.VideoAccountService;
 import cn.lili.modules.member.aop.annotation.PointLogPoint;
@@ -35,14 +38,12 @@
 import cn.lili.modules.member.entity.dto.*;
 import cn.lili.modules.member.entity.enums.PointTypeEnum;
 import cn.lili.modules.member.entity.enums.QRCodeLoginSessionStatusEnum;
-import cn.lili.modules.member.entity.vo.MemberSearchVO;
-import cn.lili.modules.member.entity.vo.MemberVO;
-import cn.lili.modules.member.entity.vo.QRCodeLoginSessionVo;
-import cn.lili.modules.member.entity.vo.QRLoginResultVo;
+import cn.lili.modules.member.entity.vo.*;
 import cn.lili.modules.member.mapper.MemberMapper;
 import cn.lili.modules.member.service.MemberService;
 import cn.lili.modules.member.token.MemberTokenGenerate;
 import cn.lili.modules.member.token.StoreTokenGenerate;
+import cn.lili.modules.order.order.entity.dto.PrizeRecordExportDetailDTO;
 import cn.lili.modules.store.entity.dos.Store;
 import cn.lili.modules.store.entity.enums.StoreStatusEnum;
 import cn.lili.modules.store.service.StoreService;
@@ -57,19 +58,25 @@
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.apache.catalina.security.SecurityUtil;
+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;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * 浼氬憳鎺ュ彛涓氬姟灞傚疄鐜�
@@ -578,7 +585,129 @@
         queryWrapper.eq(CharSequenceUtil.isNotBlank(memberSearchVO.getDisabled()), "disabled",
                 memberSearchVO.getDisabled().equals(SwitchEnum.OPEN.name()) ? 1 : 0);
         queryWrapper.orderByDesc("create_time");
+
         return this.baseMapper.pageByMemberVO(PageUtil.initPage(page), queryWrapper);
+    }
+    @Override
+    public IPage<MemberVO> getMemberPageAndTag(MemberSearchVO memberSearchVO, PageVO page) {
+        QueryWrapper<Member> queryWrapper = Wrappers.query();
+        //鐢ㄦ埛鍚嶆煡璇�
+        queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getUsername()), "username", memberSearchVO.getUsername());
+        //鐢ㄦ埛鍚嶆煡璇�
+        queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getNickName()), "nick_name", memberSearchVO.getNickName());
+        //鎸夌収鐢佃瘽鍙风爜鏌ヨ
+        queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getMobile()), "mobile", memberSearchVO.getMobile());
+        //鎸夌収浼氬憳鐘舵�佹煡璇�
+        queryWrapper.eq(CharSequenceUtil.isNotBlank(memberSearchVO.getDisabled()), "disabled",
+                memberSearchVO.getDisabled().equals(SwitchEnum.OPEN.name()) ? 1 : 0);
+        queryWrapper.orderByDesc("create_time");
+        if (CollectionUtils.isNotEmpty(memberSearchVO.getTagIds())) {
+            // 浣跨敤inSql鏂规硶杩涜瀹夊叏鐨勫瓙鏌ヨ
+            String tagIdsStr = memberSearchVO.getTagIds().stream()
+                    .map(String::valueOf)
+                    .collect(Collectors.joining(","));
+            queryWrapper.inSql("id",
+                    "SELECT DISTINCT member_id FROM lmk_member_tag WHERE tag_id IN (" +
+                            tagIdsStr + ")");
+
+            return this.baseMapper.pageByMemberVO(PageUtil.initPage(page), queryWrapper);
+        }
+        return this.baseMapper.pageByMemberVO(PageUtil.initPage(page),queryWrapper);
+    }
+
+    @Override
+    public void exportMember(MemberSearchVO memberSearchVO) {
+        HttpServletResponse response = ThreadContextHolder.getHttpResponse();
+        QueryWrapper<Member> queryWrapper = Wrappers.query();
+        //鐢ㄦ埛鍚嶆煡璇�
+        queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getUsername()), "username", memberSearchVO.getUsername());
+        //鐢ㄦ埛鍚嶆煡璇�
+        queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getNickName()), "nick_name", memberSearchVO.getNickName());
+        //鎸夌収鐢佃瘽鍙风爜鏌ヨ
+        queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getMobile()), "mobile", memberSearchVO.getMobile());
+        //鎸夌収浼氬憳鐘舵�佹煡璇�
+        queryWrapper.eq(CharSequenceUtil.isNotBlank(memberSearchVO.getDisabled()), "disabled",
+                memberSearchVO.getDisabled().equals(SwitchEnum.OPEN.name()) ? 1 : 0);
+        queryWrapper.orderByDesc("create_time");
+        if (CollectionUtils.isNotEmpty(memberSearchVO.getTagIds())) {
+            // 浣跨敤inSql鏂规硶杩涜瀹夊叏鐨勫瓙鏌ヨ
+            String tagIdsStr = memberSearchVO.getTagIds().stream()
+                    .map(String::valueOf)
+                    .collect(Collectors.joining(","));
+            queryWrapper.inSql("id",
+                    "SELECT DISTINCT member_id FROM lmk_member_tag WHERE tag_id IN (" +
+                            tagIdsStr + ")");
+        }
+        List<MemberVO> memberVOS = this.baseMapper.exportMember(queryWrapper);
+        XSSFWorkbook workbook = initExportMember(memberVOS);
+        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 initExportMember(List<MemberVO> list){
+        List<MemberExportVO> exportDetailDTOS = new ArrayList<>();
+        for (MemberVO vo : list){
+            MemberExportVO detailDtO = new MemberExportVO();
+            BeanUtils.copyProperties(vo,detailDtO);
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            // 灏咲ate绫诲瀷杞崲涓烘寚瀹氭牸寮忕殑瀛楃涓�
+            Date createTime = vo.getCreateTime();
+            if (createTime != null) {
+                String createTimeStr = sdf.format(createTime);
+                detailDtO.setCreateTime(createTimeStr);
+            }else {
+                detailDtO.setCreateTime("");
+            }
+            Date lastLoginDate1 = vo.getLastLoginDate();
+            if (lastLoginDate1 != null) {
+                String lastLoginDate = sdf.format(lastLoginDate1);
+                detailDtO.setLastLoginDate(lastLoginDate);
+            }else {
+                detailDtO.setLastLoginDate("");
+            }
+            // 璁剧疆鍒癉TO涓�
+            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++){
+            MemberExportVO dto = exportDetailDTOS.get(i);
+            Row row = sheet.createRow(i+1);
+            row.createCell(0).setCellValue(dto.getUsername());
+            row.createCell(1).setCellValue(dto.getNickName());
+            row.createCell(2).setCellValue(dto.getMobile());
+            row.createCell(3).setCellValue(dto.getCreateTime());
+            row.createCell(4).setCellValue(dto.getLastLoginDate());
+        }
+
+        return workbook;
+
     }
 
     @Override
@@ -832,7 +961,6 @@
             if(StringUtils.isNotBlank(member.getFace()) && !member.getFace().contains("https")){
                 member.setFace(cosUtil.getPreviewUrl(member.getFace()));
             }
-
         }
         return member;
     }

--
Gitblit v1.8.0