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

---
 framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java              |   25 ++++++++
 framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderItemServiceImpl.java          |    1 
 framework/src/main/java/cn/lili/modules/statistics/serviceimpl/StoreFlowStatisticsServiceImpl.java |    3 
 manager-api/src/main/java/cn/lili/controller/passport/MemberManagerController.java                 |    6 ++
 framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java                  |  118 ++++++++++++++++++++++++++++++++++++--
 framework/src/main/java/cn/lili/modules/member/mapper/MemberMapper.java                            |    3 +
 framework/src/main/java/cn/lili/modules/member/service/MemberService.java                          |    2 
 7 files changed, 148 insertions(+), 10 deletions(-)

diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/MemberMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/MemberMapper.java
index 771aa09..ed82d84 100644
--- a/framework/src/main/java/cn/lili/modules/member/mapper/MemberMapper.java
+++ b/framework/src/main/java/cn/lili/modules/member/mapper/MemberMapper.java
@@ -30,5 +30,8 @@
     @Select("select * from li_member ${ew.customSqlSegment}")
     IPage<MemberVO> pageByMemberVO(IPage<MemberVO> page, @Param(Constants.WRAPPER) Wrapper<Member> queryWrapper);
 
+    @Select("select * from li_member ${ew.customSqlSegment}")
+    List<MemberVO> exportMember(@Param(Constants.WRAPPER) Wrapper<Member> queryWrapper);
+
     MemberVO getVoById(@Param("id") String id);
 }
\ No newline at end of file
diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberService.java
index e7d5f73..4539594 100644
--- a/framework/src/main/java/cn/lili/modules/member/service/MemberService.java
+++ b/framework/src/main/java/cn/lili/modules/member/service/MemberService.java
@@ -243,6 +243,8 @@
 
     IPage<MemberVO> getMemberPageAndTag(MemberSearchVO memberSearchVO, PageVO page);
 
+    void exportMember(MemberSearchVO memberSearchVO);
+
     /**
      * 浼氬憳绉垎鍙樺姩
      *
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 ed570fb..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
@@ -27,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;
@@ -34,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;
@@ -56,17 +58,23 @@
 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.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;
 
@@ -607,6 +615,100 @@
         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
     @PointLogPoint
diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderItemServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderItemServiceImpl.java
index 1504b59..60cb3c9 100644
--- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderItemServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderItemServiceImpl.java
@@ -9,6 +9,7 @@
 import cn.lili.modules.order.order.entity.enums.CommentStatusEnum;
 import cn.lili.modules.order.order.entity.enums.OrderComplaintStatusEnum;
 import cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum;
+import cn.lili.modules.order.order.entity.enums.RefundStatusEnum;
 import cn.lili.modules.order.order.mapper.OrderItemMapper;
 import cn.lili.modules.order.order.service.OrderItemService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
index b775eca..d458917 100644
--- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
@@ -25,11 +25,14 @@
 import cn.lili.common.utils.StringUtils;
 import cn.lili.common.vo.ResultMessage;
 import cn.lili.modules.goods.entity.dos.Goods;
+import cn.lili.modules.goods.entity.dos.GoodsSku;
 import cn.lili.modules.goods.entity.dto.GoodsCompleteMessage;
 import cn.lili.modules.goods.service.GoodsService;
+import cn.lili.modules.goods.service.GoodsSkuService;
 import cn.lili.modules.lmk.domain.entity.CouponVirtual;
 import cn.lili.modules.lmk.domain.vo.OrderCountVO;
 import cn.lili.modules.lmk.enums.general.AdminRoleEnum;
+import cn.lili.modules.lmk.enums.general.VirtualGoodsTypeEnum;
 import cn.lili.modules.lmk.service.CouponVirtualService;
 import cn.lili.modules.member.entity.dos.Member;
 import cn.lili.modules.member.entity.dto.MemberAddressDTO;
@@ -213,6 +216,8 @@
     @Autowired
     private RedissonClient redissonClient;
 
+    @Autowired
+    private GoodsSkuService goodsSkuService;
     private final static  String LOCK_ORDER_NO_MQ="lock_order_no_mq:";
     private final static  String LOCK_EDIT_ORDER_ADDRESS="lock_edit_order_address:";
     private final static  String LOCK_COUPON_CARD="lock_coupon_card:";
@@ -251,7 +256,21 @@
 //                        item.getPriceDetailDTO().setPlatFormCommissionPoint(Double.valueOf(goods.getCommission().toString()));
 //                        e.setPriceDetailDTO(item.getPriceDetailDTO());
 //                        orderItems.add(e);
-                        orderItems.add(new OrderItem(sku, item, tradeDTO));
+                        //鐗规畩澶勭悊绾夸笂绀煎搧鍗¢棶棰�
+                        String skuId = sku.getGoodsSku().getId();
+                        GoodsSku skuInfo = goodsSkuService.getById(skuId);
+                        OrderItem orderItem = new OrderItem(sku, item, tradeDTO);
+                        if (skuInfo != null) {
+                            String goodsId = skuInfo.getGoodsId();
+                            Goods goodsInfo = goodsService.getById(goodsId);
+                            if (goodsInfo != null&& VirtualGoodsTypeEnum.COUPON.name().equals(goodsInfo.getVirtualGoodsType())) {
+                                String couponId = skuInfo.getCouponId();
+                                String couponName = skuInfo.getCouponName();
+                                orderItem.setCouponId(couponId);
+                                orderItem.setCouponName(couponName);
+                            }
+                        }
+                        orderItems.add(orderItem);
                         currentOrderItems.add(new OrderItem(sku, item, tradeDTO));
                     }
             );
@@ -801,12 +820,14 @@
     @OrderLogPoint(description = "'璁㈠崟['+#orderSn+']鏍搁攢锛屾牳閿�鐮乕'+#verificationCode+']'", orderSn = "#orderSn")
     @Transactional(rollbackFor = Exception.class)
     public Order take(String orderSn, String verificationCode) {
+        log.info("璁㈠崟鏍搁攢璁㈠崟鍙蜂负锛歿}锛屾牳閿�鐮佷负{}",orderSn,verificationCode);
         Order order;
         RLock lock = redissonClient.getLock(LOCK_COUPON_CARD + orderSn);
         try {
              lock.lock();
             //鑾峰彇璁㈠崟淇℃伅
             order = this.getBySn(orderSn);
+            log.info("鑾峰彇鍒扮殑璁㈠崟淇℃伅涓簕}",JSON.toJSONString(order));
             //璁㈠崟骞傜瓑闂
             if (OrderStatusEnum.COMPLETED.name().equals(order.getOrderStatus())) {
                 throw new ServiceException("褰撳墠璁㈠崟宸插畬鎴愭棤娉曞啀娆℃牳楠�");
@@ -820,6 +841,7 @@
             List<OrderItem> orderItems = orderItemService.getByOrderSn(orderSn);
             List<CouponVirtual> couponVirtuals = new  ArrayList<>();
             for (OrderItem orderItem : orderItems) {
+                log.info("鑾峰彇鍒扮殑瀛愯鍗曚俊鎭负{}",JSON.toJSONString(orderItem));
                 String couponId = orderItem.getCouponId();
                 if (StringUtils.isBlank(couponId)) {
                     continue;
@@ -842,6 +864,7 @@
                 }
             }
             if (!couponVirtuals.isEmpty()) {
+                log.info("鐢熸垚鐨勫厬鎹㈠崱涓簕}",JSON.toJSONString(couponVirtuals));
                 order.setCouponFlag(CouPonFlagEnum.COUPON.name());
                 couponVirtualService.saveBatch(couponVirtuals);
                 //鏇存柊鐘舵�佺敤浜庡悗缁皬绋嬪簭鍒ゆ柇寮瑰嚭鍗峰垪琛�
diff --git a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/StoreFlowStatisticsServiceImpl.java b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/StoreFlowStatisticsServiceImpl.java
index 591f7ae..a79ad64 100644
--- a/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/StoreFlowStatisticsServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/statistics/serviceimpl/StoreFlowStatisticsServiceImpl.java
@@ -153,7 +153,8 @@
         if (StringUtils.isNotEmpty(statisticsQueryParam.getStoreId())) {
             queryWrapper.eq("store_id", statisticsQueryParam.getStoreId());
         }
-        queryWrapper.select("SUM(final_price) AS price , COUNT(0) AS num");
+//        queryWrapper.select("SUM(final_price) AS price , COUNT(0) AS num");
+        queryWrapper.select("SUM(final_price) AS price , COUNT(DISTINCT order_sn) AS num");
         queryWrapper.eq("flow_type", FlowTypeEnum.PAY.name());
         Map payment = this.getMap(queryWrapper);
 
diff --git a/manager-api/src/main/java/cn/lili/controller/passport/MemberManagerController.java b/manager-api/src/main/java/cn/lili/controller/passport/MemberManagerController.java
index 08800e0..5f9fb11 100644
--- a/manager-api/src/main/java/cn/lili/controller/passport/MemberManagerController.java
+++ b/manager-api/src/main/java/cn/lili/controller/passport/MemberManagerController.java
@@ -42,6 +42,12 @@
         return ResultUtil.data(memberService.getMemberPageAndTag(memberSearchVO, page));
     }
 
+    @ApiOperation(value = "瀵煎嚭excel")
+    @GetMapping("/export")
+    public void exportMember(MemberSearchVO memberSearchVO) {
+        memberService.exportMember(memberSearchVO);
+    }
+
 
     @ApiOperation(value = "閫氳繃ID鑾峰彇浼氬憳淇℃伅")
     @ApiImplicitParam(name = "id", value = "浼氬憳ID", required = true, dataType = "String", paramType = "path")

--
Gitblit v1.8.0