ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/OrderDetailVO.java
@@ -89,4 +89,7 @@ @ApiModelProperty(value = "预约单id") private String technicianSubscribeId; @ApiModelProperty("核销码BASE64") private String writeOffCode; } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/ShopClientFallbackFactory.java
@@ -7,7 +7,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; import java.math.BigDecimal; import java.util.List; import java.util.Map; import java.util.Set; @Slf4j @@ -54,6 +56,11 @@ public R<List<Shop>> getAllShop() { return R.fail("获取所有门店失败:" + cause.getMessage()); } @Override public R<Map<String, BigDecimal>> getShopStatistics() { return R.fail(); } }; } } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/ShopClient.java
@@ -12,7 +12,9 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.math.BigDecimal; import java.util.List; import java.util.Map; import java.util.Set; /** @@ -65,4 +67,8 @@ */ @PostMapping("/shop/getAllShop") R<List<Shop>> getAllShop(); @GetMapping("/shop/getShopStatistics") public R<Map<String, BigDecimal>> getShopStatistics(); } ruoyi-common/pom.xml
@@ -31,6 +31,17 @@ <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.4.1</version> </dependency> </dependencies> </project> ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/QRCodeGenerator.java
New file @@ -0,0 +1,44 @@ package com.ruoyi.common.core.utils.uuid; import com.google.zxing.BarcodeFormat; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Base64; public class QRCodeGenerator { /** * 生成二维码图片的base64编码 * @param text * @param width * @param height * @return * @throws WriterException * @throws IOException */ public static String generateQRCodeBase64(String text, int width, int height) throws WriterException, IOException { QRCodeWriter qrCodeWriter = new QRCodeWriter(); BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height); ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream(); MatrixToImageWriter.writeToStream(bitMatrix, "PNG", pngOutputStream); byte[] pngData = pngOutputStream.toByteArray(); return Base64.getEncoder().encodeToString(pngData); } public static void main(String[] args) { try { String text = "Hello, World!"; String base64QRCode = generateQRCodeBase64(text, 200, 200); System.out.println("Base64 QR Code: " + base64QRCode); } catch (WriterException | IOException e) { e.printStackTrace(); } } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java
@@ -137,6 +137,8 @@ @PostMapping("/editAppUserById") public R<Void> editAppUserById(@RequestBody AppUser appUser) { appUserService.updateById(appUser); appUserService.update(new LambdaUpdateWrapper<AppUser>().eq(AppUser::getId, appUser.getId()) .set(AppUser::getLastShopTime, appUser.getLastShopTime())); return R.ok(); } @@ -744,108 +746,6 @@ @GetMapping("/commissionDetail") @ApiOperation(value = "分佣统计", tags = "管理后台-首页统计") public R<CommissionDetail> commissionDetail(CommissionDetail cd) { Long userid = tokenService.getLoginUser().getUserid(); SysUser sysUser = sysUserClient.getSysUser(userid).getData(); LambdaQueryWrapper<AppUser> queryWrapper = new LambdaQueryWrapper<AppUser>().eq(AppUser::getDelFlag, 0); if(sysUser.getRoleType() == 2){ queryWrapper.eq(AppUser::getShopId, sysUser.getObjectId()); } LocalDateTime startTime = cd.getStartTime(); LocalDateTime endTime = cd.getEndTime(); queryWrapper.ge(null != startTime, AppUser::getCreateTime, startTime); queryWrapper.le(null != endTime, AppUser::getCreateTime, endTime); queryWrapper.orderByAsc(AppUser::getCreateTime); List<AppUser> appUserList = appUserService.list(queryWrapper); if (appUserList.isEmpty()) { return R.ok(new CommissionDetail()); } BigDecimal totalCommission = BigDecimal.ZERO; BigDecimal totalServiceFee = BigDecimal.ZERO; BigDecimal totalUserCommission = BigDecimal.ZERO; Map<Integer, BigDecimal> vipCommissions = new HashMap<>(); Map<String, Map<Integer, BigDecimal>> dailyVipCommissions = new TreeMap<>(); for (AppUser appUser : appUserList) { BigDecimal distributionAmount = Optional.ofNullable(appUser.getTotalDistributionAmount()).orElse(BigDecimal.ZERO); totalCommission = totalCommission.add(distributionAmount); Integer vipId = appUser.getVipId(); if (vipId != null && vipId >= 1 && vipId <= 7) { vipCommissions.merge(vipId, distributionAmount, BigDecimal::add); String dateKey = appUser.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); dailyVipCommissions.computeIfAbsent(dateKey, k -> new HashMap<>()) .merge(vipId, distributionAmount, BigDecimal::add); } } List<Shop> data = shopClient.getAllShop().getData(); if(sysUser.getRoleType() == 2){ data = Arrays.asList(shopClient.getShopById(sysUser.getObjectId()).getData()); } for (Shop shop : data) { totalServiceFee = totalServiceFee.add(shop.getServerGiveawayMoney()); totalUserCommission = totalUserCommission.add(shop.getGiveawayMoney()); } R<List<ShopBalanceStatement>> r = shopBalanceStatementClient.getShopBalanceStatementList(Arrays.asList(1, 2, 3), null); List<ShopBalanceStatement> data1 = r.getData(); if (!CollectionUtils.isEmpty(data1)){ for (ShopBalanceStatement shopBalanceStatement : data1) { String dateKey = shopBalanceStatement.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); Integer type = shopBalanceStatement.getType(); if (type == 1){ type = 8; }else if (type == 2){ type = 9; }else { type = 10; } dailyVipCommissions.computeIfAbsent(dateKey, k -> new HashMap<>()) .merge(type, shopBalanceStatement.getVariableAmount(), BigDecimal::add); } } CommissionDetail commissionDetail = new CommissionDetail(); commissionDetail.setTotalCommission(totalCommission); commissionDetail.setTotalServiceFee(totalServiceFee); commissionDetail.setTotalUserCommission(totalUserCommission); commissionDetail.setTotalNormalCommission(vipCommissions.getOrDefault(1, BigDecimal.ZERO)); commissionDetail.setTotalGoldCommission(vipCommissions.getOrDefault(2, BigDecimal.ZERO)); commissionDetail.setTotalDiamondCommission(vipCommissions.getOrDefault(3, BigDecimal.ZERO)); commissionDetail.setTotalAgentCommission(vipCommissions.getOrDefault(4, BigDecimal.ZERO)); commissionDetail.setTotalSuperAgentCommission(vipCommissions.getOrDefault(5, BigDecimal.ZERO)); commissionDetail.setTotalTopAgentCommission(vipCommissions.getOrDefault(6, BigDecimal.ZERO)); commissionDetail.setTotalPartnerCommission(vipCommissions.getOrDefault(7, BigDecimal.ZERO)); List<CommissionDate> commissionDateList = dailyVipCommissions.entrySet().stream() .map(entry -> { CommissionDate commissionDate = new CommissionDate(); commissionDate.setDate(entry.getKey()); Map<Integer, BigDecimal> dailyCommissions = entry.getValue(); commissionDate.setNormalCommission(dailyCommissions.getOrDefault(1, BigDecimal.ZERO)); commissionDate.setGoldCommission(dailyCommissions.getOrDefault(2, BigDecimal.ZERO)); commissionDate.setDiamondCommission(dailyCommissions.getOrDefault(3, BigDecimal.ZERO)); commissionDate.setAgentCommission(dailyCommissions.getOrDefault(4, BigDecimal.ZERO)); commissionDate.setSuperAgentCommission(dailyCommissions.getOrDefault(5, BigDecimal.ZERO)); commissionDate.setTopAgentCommission(dailyCommissions.getOrDefault(6, BigDecimal.ZERO)); commissionDate.setPartnerCommission(dailyCommissions.getOrDefault(7, BigDecimal.ZERO)); BigDecimal add = commissionDate.getNormalCommission().add(commissionDate.getGoldCommission()).add(commissionDate.getDiamondCommission()).add(commissionDate.getAgentCommission()) .add(commissionDate.getSuperAgentCommission()).add(commissionDate.getTopAgentCommission()).add(commissionDate.getPartnerCommission()); commissionDate.setTotalCommission(add); commissionDate.setServiceChargeCommission(dailyCommissions.getOrDefault(10, BigDecimal.ZERO)); commissionDate.setAssociatedUserCommission(dailyCommissions.getOrDefault(8, BigDecimal.ZERO)); commissionDate.setBindLowerLevelStoresCommission(dailyCommissions.getOrDefault(9, BigDecimal.ZERO)); return commissionDate; }) .collect(Collectors.toList()); commissionDetail.setCommissionDateList(commissionDateList); return R.ok(commissionDetail); } public R<CommissionDetail> commissionDetail2(CommissionDetail cd) { if (cd.getStartTime() == null || cd.getEndTime() == null) { return R.fail("请选择时间"); } @@ -858,7 +758,7 @@ getDatesBetween(cd.getStartTime(), cd.getEndTime()).forEach(date -> { for (int i = 1; i < 8; i++){ List<BalanceChangeRecord> list = balanceChangeRecordService.list(new LambdaQueryWrapper<BalanceChangeRecord>() .eq(BalanceChangeRecord::getCreateTime, date) .between(BalanceChangeRecord::getCreateTime, date, date.plusDays(1)) .eq(BalanceChangeRecord::getChangeType,4) .eq(BalanceChangeRecord::getVipId, i)); BigDecimal reduce = list.stream().map(BalanceChangeRecord::getChangeAmount).reduce(BigDecimal.ZERO, BigDecimal::add); @@ -886,7 +786,99 @@ } } }); return null; BigDecimal totalCommission = BigDecimal.ZERO; BigDecimal totalNormalCommission = BigDecimal.ZERO; BigDecimal totalGoldCommission = BigDecimal.ZERO; BigDecimal totalDiamondCommission = BigDecimal.ZERO; BigDecimal totalAgentCommission = BigDecimal.ZERO; BigDecimal totalSuperAgentCommission = BigDecimal.ZERO; BigDecimal totalTopAgentCommission = BigDecimal.ZERO; BigDecimal totalPartnerCommission = BigDecimal.ZERO; List<AppUser> allAppUserList = appUserService.list(); for (AppUser appUser : allAppUserList) { BigDecimal totalDistributionAmount = appUser.getTotalDistributionAmount(); totalCommission = totalCommission.add(totalDistributionAmount); if (appUser.getVipId() == 1){ totalNormalCommission = totalNormalCommission.add(totalDistributionAmount); } if (appUser.getVipId() == 2){ totalGoldCommission = totalGoldCommission.add(totalDistributionAmount); } if (appUser.getVipId() == 3){ totalDiamondCommission = totalDiamondCommission.add(totalDistributionAmount); } if (appUser.getVipId() == 4){ totalAgentCommission = totalAgentCommission.add(totalDistributionAmount); } if (appUser.getVipId() == 5){ totalSuperAgentCommission = totalSuperAgentCommission.add(totalDistributionAmount); } if (appUser.getVipId() == 6){ totalTopAgentCommission = totalTopAgentCommission.add(totalDistributionAmount); } if (appUser.getVipId() == 7){ totalPartnerCommission = totalPartnerCommission.add(totalDistributionAmount); } } R<Map<String, BigDecimal>> shopStatistics = shopClient.getShopStatistics(); Map<String, BigDecimal> data = shopStatistics.getData(); BigDecimal totalServiceFee = BigDecimal.ZERO; BigDecimal totalUserCommission = BigDecimal.ZERO; if (data != null){ totalServiceFee = data.get("serverGiveawayMoney"); totalUserCommission = data.get("lowerLevelGiveawayMoney"); } CommissionDetail commissionDetail = new CommissionDetail(); commissionDetail.setTotalCommission(totalCommission); commissionDetail.setTotalServiceFee(totalServiceFee); commissionDetail.setTotalUserCommission(totalUserCommission); commissionDetail.setTotalNormalCommission(totalNormalCommission); commissionDetail.setTotalGoldCommission(totalGoldCommission); commissionDetail.setTotalDiamondCommission(totalDiamondCommission); commissionDetail.setTotalAgentCommission(totalAgentCommission); commissionDetail.setTotalSuperAgentCommission(totalSuperAgentCommission); commissionDetail.setTotalTopAgentCommission(totalTopAgentCommission); commissionDetail.setTotalPartnerCommission(totalPartnerCommission); List<CommissionDate> commissionDateList = dailyVipCommissions.entrySet().stream() .map(entry -> { CommissionDate commissionDate = new CommissionDate(); commissionDate.setDate(entry.getKey()); Map<Integer, BigDecimal> dailyCommissions = entry.getValue(); commissionDate.setNormalCommission(dailyCommissions.getOrDefault(1, BigDecimal.ZERO)); commissionDate.setGoldCommission(dailyCommissions.getOrDefault(2, BigDecimal.ZERO)); commissionDate.setDiamondCommission(dailyCommissions.getOrDefault(3, BigDecimal.ZERO)); commissionDate.setAgentCommission(dailyCommissions.getOrDefault(4, BigDecimal.ZERO)); commissionDate.setSuperAgentCommission(dailyCommissions.getOrDefault(5, BigDecimal.ZERO)); commissionDate.setTopAgentCommission(dailyCommissions.getOrDefault(6, BigDecimal.ZERO)); commissionDate.setPartnerCommission(dailyCommissions.getOrDefault(7, BigDecimal.ZERO)); BigDecimal add = commissionDate.getNormalCommission().add(commissionDate.getGoldCommission()).add(commissionDate.getDiamondCommission()).add(commissionDate.getAgentCommission()) .add(commissionDate.getSuperAgentCommission()).add(commissionDate.getTopAgentCommission()).add(commissionDate.getPartnerCommission()); commissionDate.setTotalCommission(add); commissionDate.setServiceChargeCommission(dailyCommissions.getOrDefault(10, BigDecimal.ZERO)); commissionDate.setAssociatedUserCommission(dailyCommissions.getOrDefault(8, BigDecimal.ZERO)); commissionDate.setBindLowerLevelStoresCommission(dailyCommissions.getOrDefault(9, BigDecimal.ZERO)); return commissionDate; }) .collect(Collectors.toList()); commissionDetail.setCommissionDateList(commissionDateList); return R.ok(commissionDetail); } @@ -906,7 +898,8 @@ .limit(daysBetween + 1) .collect(Collectors.toList()); } /** * 上传图片 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java
@@ -134,7 +134,11 @@ @GetMapping("/user/list") @ApiOperation(value = "积分管理-用户积分明细(必传用户id)", tags = "后台") public R<Page<UserPoint>> userlist(UserPoint userPoint) { Page<UserPoint> page = userPointService.lambdaQuery().eq(UserPoint::getAppUserId, userPoint.getAppUserId()).orderByDesc(UserPoint::getCreateTime).page(Page.of(userPoint.getPageNum(), userPoint.getPageSize())); Page<UserPoint> page = userPointService.lambdaQuery() .eq(UserPoint::getType, userPoint.getType()) .eq(UserPoint::getAppUserId, userPoint.getAppUserId()) .orderByDesc(UserPoint::getCreateTime) .page(Page.of(userPoint.getPageNum(), userPoint.getPageSize())); for (UserPoint record : page.getRecords()) { int i = record.getHistoricalPoint() - record.getBalance(); if (i>0){ ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/WithQuery.java
@@ -8,7 +8,7 @@ @Data public class WithQuery { @ApiModelProperty("用户名称") private String name; private String userName; @ApiModelProperty("电话") private String phone; ruoyi-service/ruoyi-account/src/main/resources/mapper/account/BalanceChangeRecordMapper.xml
@@ -30,8 +30,8 @@ tbcr.change_type, tbcr.create_time, tbcr.change_amount, tbcr.beforeAmount, tbcr.afterAmount tbcr.before_amount, tbcr.after_amount FROM t_balance_change_record tbcr LEFT JOIN t_app_user tau ON tbcr.app_user_id = tau.id ruoyi-service/ruoyi-account/src/main/resources/mapper/account/WithdrawalRequestsMapper.xml
@@ -26,8 +26,8 @@ <if test="withQuery.phone != null and withQuery.phone != ''"> AND t2.phone LIKE concat('%',#{withQuery.phone},'%') </if> <if test="withQuery.name != null and withQuery.name != ''"> AND t2.phone LIKE concat('%',#{withQuery.name},'%') <if test="withQuery.userName != null and withQuery.userName != ''"> AND t2.name LIKE concat('%',#{withQuery.userName},'%') </if> order by t1.create_time desc </select> ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -14,6 +14,7 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.uuid.QRCodeGenerator; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.enums.OrderStatus; @@ -41,6 +42,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; @@ -215,6 +217,14 @@ Long id = data.get(0).getId(); orderDetailVO.setTechnicianSubscribeId(id.toString()); } } // 生成核销码BASE64 try { String base64 = QRCodeGenerator.generateQRCodeBase64(order.getOrderNumber(), 124, 124); orderDetailVO.setWriteOffCode(base64); } catch (Exception e) { e.printStackTrace(); throw new ServiceException("生成核销码失败"); } return orderDetailVO; } @@ -439,11 +449,12 @@ appUser.setBalance(balance.add(paymentAmount).setScale(2, RoundingMode.HALF_EVEN)); appUser.setShopAmount(appUser.getShopAmount().subtract(paymentAmount).setScale(2, RoundingMode.HALF_EVEN)); //查询最后一次的消费订单 Order order1 = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getAppUserId, order.getAppUserId()).eq(Order::getPayStatus, 2).eq(Order::getDelFlag, 0).in(Order::getOrderStatus, Arrays.asList(2, 3, 4, 8)).ne(Order::getId, order.getId()).last(" order by create_time desc limit 0, 1")); Order order1 = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getAppUserId, order.getAppUserId()).eq(Order::getPayStatus, 2) .eq(Order::getDelFlag, 0).in(Order::getOrderStatus, Arrays.asList(1, 2, 3, 4, 8)).ne(Order::getId, order.getId()).last(" order by create_time desc limit 0, 1")); if(null != order1){ appUser.setLastShopTime(order1.getCreateTime()); }else{ appUser.setLastShopTime(LocalDateTime.MIN); appUser.setLastShopTime(null); } //构建账户余额流水明细 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderInfoVo.java
@@ -71,5 +71,7 @@ private String afterSaleTime; @ApiModelProperty("活动名称") private String activityName; @ApiModelProperty("核销码BASE64") private String writeOffCode; } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsEvaluateController.java
@@ -158,6 +158,7 @@ if (StringUtils.isNotEmpty(goodsEvaluate.getPhone())&&StringUtils.isNotEmpty(goodsEvaluate.getUserName())){ // 取交集 usersNameList.retainAll(usersPhoneList); if (usersNameList.isEmpty())usersNameList.add(-1L); }else{ usersNameList.addAll(usersPhoneList); } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/OrderActivityInfoController.java
@@ -200,6 +200,7 @@ .gt(orderActivityInfo.getStatus() != null && orderActivityInfo.getStatus() == 0, OrderActivityInfo::getStartTime, LocalDateTime.now()) .ge(orderActivityInfo.getStatus() != null && orderActivityInfo.getStatus() == 1, OrderActivityInfo::getEndTime, LocalDateTime.now()) .lt(orderActivityInfo.getStatus() != null && orderActivityInfo.getStatus() == 1, OrderActivityInfo::getStartTime, LocalDateTime.now()) .lt(orderActivityInfo.getStatus() != null && orderActivityInfo.getStatus() == 2, OrderActivityInfo::getEndTime, LocalDateTime.now()) .eq(orderActivityInfo.getIsShelf() != null, OrderActivityInfo::getIsShelf, orderActivityInfo.getIsShelf()).orderByDesc(OrderActivityInfo::getCreateTime) .orderByDesc(OrderActivityInfo::getCreateTime)) ; ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopBalanceStatementController.java
@@ -26,6 +26,7 @@ import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.Collection; import java.util.List; import java.util.List; @@ -178,7 +179,7 @@ @RequestParam(value = "date") LocalDateTime date){ List<ShopBalanceStatement> list = shopBalanceStatementService.list(new LambdaQueryWrapper<ShopBalanceStatement>() .eq(ShopBalanceStatement::getType, type) .in(ShopBalanceStatement::getCreateTime, date)); .between(ShopBalanceStatement::getCreateTime, date.with(LocalTime.MIN), date.with(LocalTime.MAX))); return R.ok(list); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopController.java
@@ -709,5 +709,21 @@ return R.ok(list); } @GetMapping("/getShopStatistics") public R<Map<String, BigDecimal> > getShopStatistics(){ List<Shop> shopList = shopService.list(); BigDecimal serverGiveawayMoney = BigDecimal.ZERO; BigDecimal lowerLevelGiveawayMoney = BigDecimal.ZERO; for (Shop shop : shopList) { serverGiveawayMoney = serverGiveawayMoney.add(shop.getServerGiveawayMoney()); lowerLevelGiveawayMoney = lowerLevelGiveawayMoney.add(shop.getLowerLevelGiveawayMoney()); } Map<String, BigDecimal> map = new HashMap<>(); map.put("serverGiveawayMoney", serverGiveawayMoney); map.put("lowerLevelGiveawayMoney", lowerLevelGiveawayMoney); return R.ok(map); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TechnicianController.java
@@ -111,7 +111,9 @@ }else { Technician byId = technicianService.getById(technician.getId()); if (byId.getPhone()!=technician.getPhone()){ List<Technician> list = technicianService.lambdaQuery().eq(Technician::getPhone, technician.getPhone()).eq(Technician::getShopId, sysUser.getObjectId()).list(); List<Technician> list = technicianService.lambdaQuery() .eq(Technician::getPhone, technician.getPhone()) .ne(Technician::getId, byId.getId()).list(); if (!list.isEmpty()) { return R.fail("当前号码已经添加"); }