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

---
 framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java |  230 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 212 insertions(+), 18 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 3cfd13a..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
@@ -3,6 +3,8 @@
 
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.crypto.SecureUtil;
+import cn.lili.base.Result;
 import cn.lili.cache.Cache;
 import cn.lili.cache.CachePrefix;
 import cn.lili.common.aop.annotation.DemoSite;
@@ -23,45 +25,58 @@
 import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
 import cn.lili.modules.connect.service.ConnectService;
 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;
 import cn.lili.modules.member.entity.dos.Member;
 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;
 import cn.lili.mybatis.util.PageUtil;
 import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
 import cn.lili.rocketmq.tags.MemberTagsEnum;
+import cn.lili.utils.COSUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import lombok.RequiredArgsConstructor;
+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;
 
 /**
  * 浼氬憳鎺ュ彛涓氬姟灞傚疄鐜�
@@ -111,6 +126,12 @@
 
     @Autowired
     private VideoAccountService videoAccountService;
+
+    @Autowired
+    private MemberTagService memberTagService;
+
+    @Autowired
+    private COSUtil cosUtil;
 
     @Override
     public Member findByUsername(String userName) {
@@ -199,6 +220,7 @@
             throw new ServiceException(ResultCode.USER_NOT_EXIST);
         }
         //鍒ゆ柇瀵嗙爜鏄惁杈撳叆姝g‘
+
         if (!new BCryptPasswordEncoder().matches(password, member.getPassword())) {
             throw new ServiceException(ResultCode.USER_PASSWORD_ERROR);
         }
@@ -244,19 +266,24 @@
 
     @Override
     @Transactional
-    public Member autoRegister(ConnectAuthUser authUser) {
+    public Member autoRegister(ConnectAuthUser authUser,Boolean encryptTwice) {
 
         if (CharSequenceUtil.isEmpty(authUser.getNickname())) {
             authUser.setNickname(CommonUtil.getSpecialStr("鐢ㄦ埛"));
         }
         if (CharSequenceUtil.isEmpty(authUser.getAvatar())) {
-            authUser.setAvatar("https://i.loli.net/2020/11/19/LyN6JF7zZRskdIe.png");
+            authUser.setAvatar("");
         }
         try {
 //            String username = UuidUtils.getUUID();
             Member member = new Member(authUser.getUsername(), UuidUtils.getUUID(), authUser.getAvatar(), authUser.getNickname(),
                     authUser.getGender() != null ? Convert.toInt(authUser.getGender().getCode()) : 0, authUser.getPhone());
-            member.setPassword(DEFAULT_PASSWORD);
+            if(encryptTwice){
+                member.setPassword( new BCryptPasswordEncoder().encode(SecureUtil.md5(DEFAULT_PASSWORD)));
+            }else {
+                member.setPassword( new BCryptPasswordEncoder().encode(DEFAULT_PASSWORD));
+            }
+            member.setUuId(authUser.getUuid());
             // 鍙戦�佷細鍛樻敞鍐屼俊鎭�
             registerHandler(member);
 
@@ -312,6 +339,7 @@
      * @param member
      */
     @Transactional
+    @Override
     public void registerHandler(Member member) {
         member.setId(SnowFlake.getIdStr());
         //淇濆瓨浼氬憳
@@ -485,6 +513,7 @@
     }
 
     @Override
+    @Transactional
     public Member updateMember(ManagerMemberEditDTO managerMemberEditDTO) {
         //杩囨护浼氬憳鏄电О鏁忔劅璇�
         if (CharSequenceUtil.isNotBlank(managerMemberEditDTO.getNickName())) {
@@ -499,18 +528,44 @@
         //浼犻�掍慨鏀逛細鍛樹俊鎭�
         BeanUtil.copyProperties(managerMemberEditDTO, member);
         this.updateById(member);
+        if (managerMemberEditDTO.getTags() != null && !CollectionUtils.isEmpty(managerMemberEditDTO.getTags())) {
+            MemberTagForm memberTagForm = new MemberTagForm();
+            memberTagForm.setMemberId(member.getId());
+            memberTagForm.setTagIds(managerMemberEditDTO.getTags());
+            memberTagForm.setCreateType("MANAGER");
+            memberTagService.addMemberTag(memberTagForm);
+        }
         return member;
+    }
+
+    @Override
+    public Result updateMemberNickName(MemberNickNameForm form) {
+        Member member = baseMapper.selectById(form.getMemberId());
+        boolean update = false;
+        if ("寰俊鐢ㄦ埛".equals(member.getNickName()) || StringUtils.isBlank(member.getNickName())) {
+            member.setNickName(form.getNickName());
+            update = true;
+        }
+        if (update){
+            baseMapper.updateById(member);
+        }
+        return Result.ok().data(member.getNickName());
+    }
+
+    @Override
+    public Result resetPassword(String id) {
+        String password = "111111";
+        Member member = this.getById(id);
+        member.setPassword(new BCryptPasswordEncoder().encode(SecureUtil.md5(password)));
+        this.updateById(member);
+        return Result.ok("閲嶇疆鎴愬姛");
     }
 
 
     @Override
-    public Member updateMemberPartProperties(String id,String password,String mobile) {
+    public Member updateMemberPartProperties(String id, String password, String mobile) {
         //鏌ヨ浼氬憳淇℃伅
         Member member = this.getById(id);
-        //濡傛灉瀵嗙爜涓嶄负绌哄垯鍔犲瘑瀵嗙爜
-        if (CharSequenceUtil.isNotBlank(password)) {
-            member.setPassword(new BCryptPasswordEncoder().encode(password));
-        }
         member.setMobile(mobile);
         member.setUsername(mobile);
         this.updateById(member);
@@ -530,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
@@ -779,7 +956,13 @@
 
     @Override
     public MemberVO getMember(String id) {
-        return new MemberVO(this.getById(id));
+        MemberVO member = baseMapper.getVoById(id);
+        if (Objects.nonNull(member)) {
+            if(StringUtils.isNotBlank(member.getFace()) && !member.getFace().contains("https")){
+                member.setFace(cosUtil.getPreviewUrl(member.getFace()));
+            }
+        }
+        return member;
     }
 
     @Override
@@ -857,6 +1040,13 @@
         return result;
     }
 
+    @Override
+    public Member findByUUID(String uuid) {
+        QueryWrapper<Member> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("uu_id", uuid);
+        return this.baseMapper.selectOne(queryWrapper);
+    }
+
     /**
      * 妫�娴嬩細鍛�
      *
@@ -870,4 +1060,8 @@
         }
     }
 
+    public static void main(String[] args) {
+        System.err.println(SecureUtil.md5("111111"));
+    }
+
 }

--
Gitblit v1.8.0