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); } 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); /** * 会员积分变动 * 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"); // 将Date类型转换为指定格式的字符串 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(""); } // 设置到DTO中 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 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; 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); //更新状态用于后续小程序判断弹出卷列表 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); 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")