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