From fd88d7b527e99bbf7272d28bf0826b05e3c175d8 Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期一, 16 十二月 2024 17:10:53 +0800 Subject: [PATCH] 代码提交 --- xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/utils/JuHeFuUtil.java | 11 xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/management/MgtOrderController.java | 499 ++++++++++++++++++++--------------------- xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/export/WaterExport.java | 2 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserWithdrawController.java | 48 +++ xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/HomeController.java | 111 +++++--- xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java | 41 +- 6 files changed, 385 insertions(+), 327 deletions(-) diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/utils/JuHeFuUtil.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/utils/JuHeFuUtil.java index 322be9c..e872aee 100644 --- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/utils/JuHeFuUtil.java +++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/utils/JuHeFuUtil.java @@ -175,9 +175,15 @@ } String string = resJsonObject.getString("reqCipher"); String decrypt = decrypt(string); + if (decrypt==null){ + return "false"+"发生未知异常(应该是银行卡信息和持卡人信息不一致 但是第三方没有返回准确的错误信息 这里统一返回为银行卡信息或持卡人信息有误)"; + } System.err.println(decrypt); JSONObject jsonObject = JSONObject.parseObject(decrypt); System.err.println(jsonObject); + if (org.springframework.util.StringUtils.hasLength(jsonObject.getString("error_msg"))){ + return "false"+jsonObject.getString("error_msg"); + } return "success"; } public static String queryBalance( @@ -229,10 +235,13 @@ // ,"6228480469852935177"); // updateAccount("test945622121","周帅","19983174515" // ,"6228480469852935177"); + updateAccount("test945622121","周帅","19983174515" + ,"6228480469852935177"); // queryBalance("test945622121"); - balancePay("12345678912", "test945622121","0.01", ""); +// balancePay("PAY100388123123", "test945622121","0.05", ""); // String decrypt = decrypt("z8Che/JwxrGj/oTOuAvU8HFN6vXL/OqeioV41ZuPV/xVQPt9vCHHc1R5LgAO51Hq5ilD9wqsminRvSiJj6Fs/Bfk8espZSOO2g1OE7FZyqcLB1w01MSWyxfQT8nc2GH/EfOKXCuaKBCeyW24OvW3ng=="); // System.err.println(decrypt); +// balanceWithdraw("TX98633336569","0.05","test945622121","https://xq.xqzhihui.com/api/user/client/app-user-withdraw/base/callbackA"); } public static JSONObject balancePay(String orderNo, String memberId, String payAmt, String notifyUrl) throws Exception { diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java index 7557675..fe4be9c 100644 --- a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java +++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java @@ -371,8 +371,6 @@ order.setRealPayAmount(data1.getIosPrice()); break; } - - break; case 2: Course data = remoteCourseService.getCourseById(targetId).getData(); @@ -409,6 +407,12 @@ break; } + // 删除原有非余额支付详细记录 + OrderPaymentRecord two = orderPaymentRecordService.lambdaQuery().eq(OrderPaymentRecord::getOrderId, order.getId()) + .ne(OrderPaymentRecord::getPaymentType, 4).one(); + if (two!=null){ + orderPaymentRecordService.removeById(two.getId()); + } OrderPaymentRecord one = orderPaymentRecordService.lambdaQuery().eq(OrderPaymentRecord::getOrderId, order.getId()) .eq(OrderPaymentRecord::getPaymentType, 4).one(); if (one!=null){ @@ -434,6 +438,9 @@ ClientPlaceOrderVO clientPlaceOrderVO = new ClientPlaceOrderVO(); clientPlaceOrderVO.setId(order.getId()); clientPlaceOrderVO.setOrderNo(order.getBizOrderNo()); + order.setRealPayAmount(new BigDecimal("0")); + order.setPayType(4); + orderService.updateById(order); return R.ok(clientPlaceOrderVO); } @@ -690,11 +697,9 @@ AppUser data = remoteAppUserService.getAppUserById(one.getAppUserId() + "").getData(); if (one.getGiveUserId()!=null){ remoteAppUserService.addNotice(one.getGiveUserId() + "", one.getBusinessId() + "", - one.getAppUserId() + "", one.getTotalAmount() + ""); + one.getAppUserId() + "", realPayAmount + ""); } - if (data.getInviteUserId()!=null) { - if (one.getOrderFrom() == 1 || one.getOrderFrom() == 2 || one.getOrderFrom() == 3) { // 查询实际支付价格 不包含余额抵扣价格 OrderPaymentRecord one1 = orderPaymentRecordService.lambdaQuery().eq(OrderPaymentRecord::getOrderId, one.getId()) @@ -703,8 +708,7 @@ CommissionRule data1 = sysUserClient.getCommission().getData(); if (data1 != null) { if (data1.getProportion() != null) { - - BigDecimal bigDecimal = one1.getPayAmount().multiply(data1.getProportion()).divide(new BigDecimal("100")) + BigDecimal bigDecimal = one1.getPayAmount().add(one.getChangePrice()!=null?one.getChangePrice():new BigDecimal("0")).multiply(data1.getProportion()).divide(new BigDecimal("100")) .setScale(2, BigDecimal.ROUND_DOWN); // 上级获取的分佣金额 AppUser appUserById = remoteAppUserService.getAppUserById(data.getInviteUserId() + "").getData(); @@ -714,16 +718,18 @@ // appUserById.getBalance().add(bigDecimal)) // .build(), SecurityConstants.INNER); // 新增分佣流水明细 - AppUserWalletRecord appUserWalletRecord = new AppUserWalletRecord(); - appUserWalletRecord.setAppUserId(data.getInviteUserId()); - appUserWalletRecord.setChangeType(1); - appUserWalletRecord.setReason("分佣收益"); - appUserWalletRecord.setAmount(bigDecimal); - appUserWalletRecord.setChildAppUserId(one.getAppUserId()); - appUserWalletRecord.setOrderId(one.getId()); - remoteAppUserService.addBalanceRecord(appUserWalletRecord); - one.setCommissionAmount(bigDecimal); - one.setCommissionId(data.getInviteUserId()); + if (bigDecimal.compareTo(new BigDecimal("0"))>0){ + AppUserWalletRecord appUserWalletRecord = new AppUserWalletRecord(); + appUserWalletRecord.setAppUserId(data.getInviteUserId()); + appUserWalletRecord.setChangeType(1); + appUserWalletRecord.setReason("分佣收益"); + appUserWalletRecord.setAmount(bigDecimal); + appUserWalletRecord.setChildAppUserId(one.getAppUserId()); + appUserWalletRecord.setOrderId(one.getId()); + remoteAppUserService.addBalanceRecord(appUserWalletRecord); + one.setCommissionAmount(bigDecimal); + one.setCommissionId(data.getInviteUserId()); + } orderService.updateById(one); } } @@ -741,7 +747,6 @@ Meditation data1 = remoteMeditationService.getMeditationById(one.getBusinessId()).getData(); appUserWalletRecord.setChangeType(2); reason = "购买疗愈【"+data1.getMeditationTitle()+"】"; - break; case 2: Course data2 = remoteCourseService.getCourseById(one.getBusinessId()).getData(); diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/management/MgtOrderController.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/management/MgtOrderController.java index 5d898f2..3905395 100644 --- a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/management/MgtOrderController.java +++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/management/MgtOrderController.java @@ -159,7 +159,9 @@ if (status!=0){ orderLambdaQueryWrapper.eq(Order::getPaymentStatus, status); } - orderLambdaQueryWrapper.eq(Order::getPaymentStatus, 2); + if (status!=0){ + orderLambdaQueryWrapper.eq(Order::getPaymentStatus, status); + } orderLambdaQueryWrapper.in(Order::getOrderFrom,longs); orderLambdaQueryWrapper.ne(Order::getRefundStatus, 3); List<Order> list = orderService.list(orderLambdaQueryWrapper); @@ -184,231 +186,13 @@ List<Integer> payType3 = new ArrayList<>(); payType3.add(3); payType3.add(7); - List<Integer> payType4 = new ArrayList<>(); - payType4.add(4); - payType4.add(5); - payType4.add(6); - payType4.add(7); - LambdaQueryWrapper<Order> courseLambdaQueryWrapper = new LambdaQueryWrapper<>(); - if (StringUtils.hasLength(courseDTO.getIds())){ - courseLambdaQueryWrapper.in(Order::getId, Arrays.asList(courseDTO.getIds().split(","))); - } - courseLambdaQueryWrapper.between(Order::getCreateTime, startTime, endTime); - if (courseDTO.getPayType()!=null){ - switch (courseDTO.getPayType()){ - case 1: - courseLambdaQueryWrapper.in(Order::getPayType,payType1); - break; - case 2: - courseLambdaQueryWrapper.in(Order::getPayType,payType2); - break; - case 3: - courseLambdaQueryWrapper.in(Order::getPayType,payType3); - break; - case 4: - courseLambdaQueryWrapper.in(Order::getPayType,payType4); - break; - } - } - courseLambdaQueryWrapper.eq(courseDTO.getPaymentStatus()!=null,Order::getPaymentStatus, courseDTO.getPaymentStatus()); - courseLambdaQueryWrapper.eq(courseDTO.getOrderFrom()!=null,Order::getOrderFrom, courseDTO.getOrderFrom()); - courseLambdaQueryWrapper.eq(courseDTO.getUid()!=null&&(!courseDTO.getUid().isEmpty()),Order::getAppUserId, courseDTO.getUid()); - if (org.springframework.util.StringUtils.hasLength(courseDTO.getBuyContent())){ - // 查询购买内容 - List<Long> collect1 = orderService.lambdaQuery().like(Order::getBuyContent, courseDTO.getBuyContent()).list().stream() - .map(Order::getId).collect(Collectors.toList()); - List<Long> collect2 = orderService.lambdaQuery().like(Order::getBizOrderNo, courseDTO.getBuyContent()).list().stream() - .map(Order::getId).collect(Collectors.toList()); - List<Long> data = remoteCourseService.getCourseIdsByName(courseDTO.getBuyContent()).getData(); - if (!data.isEmpty()){ - List<Long> collect3 = orderService.lambdaQuery().in(Order::getBusinessId, data) - .eq(Order::getOrderFrom, 2) - .list().stream() - .map(Order::getId).collect(Collectors.toList()); - if (!collect3.isEmpty()){ - collect1.addAll(collect3); - } - } - List<Long> data1 = remoteMeditationService.getMeditationIdsByName(courseDTO.getBuyContent()).getData(); - if (!data1.isEmpty()){ - List<Long> collect3 = orderService.lambdaQuery().in(Order::getBusinessId, data1) - .eq(Order::getOrderFrom, 1) - .list().stream() - .map(Order::getId).collect(Collectors.toList()); - if (!collect3.isEmpty()){ - collect1.addAll(collect3); - } - } - collect1.addAll(collect2); - List<Long> collect = collect1.stream().distinct().collect(Collectors.toList()); - if (collect.isEmpty()){ - collect.add(-1L); - } - courseLambdaQueryWrapper.in(Order::getId,collect); - } - - courseLambdaQueryWrapper.orderByDesc(Order::getCreateTime); - if (org.springframework.util.StringUtils.hasLength(courseDTO.getUserNameOrPhone())){ - List<Long> collect = remoteAppUserService.getAppUserByNameOrPhone(courseDTO.getUserNameOrPhone()).getData(); - if (collect.isEmpty()){ - collect.add(-1L); - } - courseLambdaQueryWrapper.in(Order::getAppUserId, collect); - } - - List<Order> page = orderService.list(courseLambdaQueryWrapper); - List<AppUserWithdraw> data2 = remoteAppUserService.getWithdraw(courseDTO).getData(); - List<WaterExport> waterExports = new ArrayList<>(); - for (AppUserWithdraw appUserWithdraw : data2) { - Order order = new Order(); - order.setId(appUserWithdraw.getId()); - order.setBizOrderNo(appUserWithdraw.getCode()); - order.setUid(appUserWithdraw.getId()+""); - order.setBuyContent("提现"); - order.setAppUserId(appUserWithdraw.getAppUserId()); - order.setOrderFrom(5); - order.setPaymentStatus(appUserWithdraw.getWithdrawStatus()+1); - order.setPayType(4); - order.setTotalAmount(appUserWithdraw.getAmount()); - order.setRealPayAmount(appUserWithdraw.getAmount()); - order.setPlatformMoney(appUserWithdraw.getAmount().multiply(new BigDecimal("-1"))); - order.setPaymentTime(appUserWithdraw.getWithdrawTime()); - order.setCreateTime(appUserWithdraw.getCreateTime()); - page.add(order); - } - for (Order record : page) { - record.setUid(record.getId().toString()); - record.setPlatformMoney(record.getRealPayAmount().subtract(record.getCommissionAmount()==null?BigDecimal.ZERO:record.getCommissionAmount())); - AppUser byId1 = remoteAppUserService.getAppUserById(record.getAppUserId()+"").getData(); - if (Objects.nonNull(byId1)){ - record.setUserName(byId1.getNickname()); - record.setCellPhone(byId1.getCellPhone()); - } - if (record.getOrderFrom()!=null){ - switch (record.getOrderFrom()){ - case 1: - Meditation data = remoteMeditationService.getMeditationById(record.getBusinessId()).getData(); - if (data!=null){ - record.setCategoryMeditationName(data.getCategoryName()); - record.setMeditationTitle(data.getMeditationTitle()); - record.setIconUrl(data.getIconUrl()); - record.setDetailDescription(data.getDetailDescription()); - record.setGeneralPriceMeditation(data.getGeneralPrice()); - record.setListingStatusMeditation(data.getListingStatus()); - record.setMeditationUid(data.getId()+""); - } - break; - case 2: - Course data1 = remoteCourseService.getCourseById(record.getBusinessId()).getData(); - if (data1!=null){ - record.setCategoryCourseName(data1.getCategoryName()); - record.setCourseTitle(data1.getCourseTitle()); - record.setCoverUrl(data1.getCoverUrl()); - record.setTutor(data1.getTutor()); - record.setCourseChapterCount(data1.getCourseChapterCount()); - record.setGeneralPriceCourse(data1.getGeneralPrice()); - record.setListingStatusCourse(data1.getListingStatus()); - record.setCourseUid(data1.getId()+""); - } - break; - case 3: - record.setBuyContent(record.getBuyContent()); - record.setGeneralPriceVip(record.getRealPayAmount()); - break; - case 4: - record.setBuyContent("余额充值"); - record.setPlatformMoney(record.getRealPayAmount()!=null?record.getRealPayAmount() - .subtract(record.getCommissionAmount()!=null?record.getCommissionAmount():BigDecimal.ZERO):BigDecimal.ZERO); - break; - } - } - WaterExport waterExport = new WaterExport(); - waterExport.setCode(record.getBizOrderNo()); - if (Objects.nonNull(byId1)){ - record.setUserName(byId1.getNickname()); - record.setCellPhone(byId1.getCellPhone()); - waterExport.setUserName(byId1.getNickname()); - waterExport.setCellphone(byId1.getCellPhone()); - } - waterExport.setRealPayAmount("¥"+record.getRealPayAmount()); - waterExport.setCommissionAmount("¥"+record.getCommissionAmount()); - waterExport.setPlatformMoney("¥"+record.getPlatformMoney()); - waterExport.setBuyContent(record.getBuyContent()); - waterExport.setOrderFrom(record.getOrderFrom()+""); - waterExport.setPayType(record.getPayType()); - DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - String format = df.format(record.getCreateTime()); - waterExport.setCreateTime(format); - waterExport.setPaymentStatus(record.getPaymentStatus()+""); - } - - Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), WaterExport.class, waterExports); - HttpServletResponse response = WebUtils.response(); - response.setContentType("application/vnd.ms-excel"); - response.setCharacterEncoding("utf-8"); - ServletOutputStream outputStream = null; - try { - String fileName = URLEncoder.encode("收支流水导出.xls", "utf-8"); - response.setHeader("Content-Disposition", "attachment;filename=" + fileName); - response.setContentType("application/vnd.ms-excel;charset=UTF-8"); - response.setHeader("Pragma", "no-cache"); - response.setHeader("Cache-Control", "no-cache"); - outputStream = response.getOutputStream(); - workbook.write(outputStream); - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - outputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - @PostMapping("/waterList") - @ApiOperation(value = "收支流水-分页", tags = {"管理后台-财务管理"}) - public R<Page<Order>> waterList(@RequestBody OrderListDTO courseDTO) { - String startTime = null; - String endTime = null; - if (org.springframework.util.StringUtils.hasLength(courseDTO.getTime())){ - String[] split = courseDTO.getTime().split(" - "); - startTime = split[0]+" 00:00:00"; - endTime = split[1]+" 23:59:59"; - } - List<Integer> payType1 = new ArrayList<>(); - payType1.add(1); - payType1.add(5); - List<Integer> payType2 = new ArrayList<>(); - payType2.add(2); - payType2.add(6); - List<Integer> payType3 = new ArrayList<>(); - payType3.add(3); - payType3.add(7); - List<Integer> payType4 = new ArrayList<>(); - payType4.add(4); - payType4.add(5); - payType4.add(6); - payType4.add(7); LambdaQueryWrapper<Order> courseLambdaQueryWrapper = new LambdaQueryWrapper<>(); if (startTime!=null){ courseLambdaQueryWrapper.between(Order::getCreateTime, startTime, endTime); } if (courseDTO.getPayType()!=null){ - switch (courseDTO.getPayType()){ - case 1: - courseLambdaQueryWrapper.in(Order::getPayType,payType1); - break; - case 2: - courseLambdaQueryWrapper.in(Order::getPayType,payType2); - break; - case 3: - courseLambdaQueryWrapper.in(Order::getPayType,payType3); - break; - case 4: - courseLambdaQueryWrapper.in(Order::getPayType,payType4); - break; - } + courseLambdaQueryWrapper.eq(Order::getPayType, courseDTO.getPayType()); } if (courseDTO.getPaymentStatus()!=null){ courseLambdaQueryWrapper.eq(Order::getPaymentStatus, courseDTO.getPaymentStatus()); @@ -531,6 +315,244 @@ } } } + List<WaterExport> waterExports = new ArrayList<>(); + for (Order record : page) { + record.setUid(record.getId().toString()); + record.setPlatformMoney(record.getRealPayAmount().subtract(record.getCommissionAmount()==null?BigDecimal.ZERO:record.getCommissionAmount())); + AppUser byId1 = remoteAppUserService.getAppUserById(record.getAppUserId()+"").getData(); + if (Objects.nonNull(byId1)){ + record.setUserName(byId1.getNickname()); + record.setCellPhone(byId1.getCellPhone()); + } + if (record.getOrderFrom()!=null){ + switch (record.getOrderFrom()){ + case 1: + Meditation data = remoteMeditationService.getMeditationById(record.getBusinessId()).getData(); + if (data!=null){ + record.setCategoryMeditationName(data.getCategoryName()); + record.setMeditationTitle(data.getMeditationTitle()); + record.setIconUrl(data.getIconUrl()); + record.setDetailDescription(data.getDetailDescription()); + record.setGeneralPriceMeditation(data.getGeneralPrice()); + record.setListingStatusMeditation(data.getListingStatus()); + record.setMeditationUid(data.getId()+""); + } + break; + case 2: + Course data1 = remoteCourseService.getCourseById(record.getBusinessId()).getData(); + if (data1!=null){ + record.setCategoryCourseName(data1.getCategoryName()); + record.setCourseTitle(data1.getCourseTitle()); + record.setCoverUrl(data1.getCoverUrl()); + record.setTutor(data1.getTutor()); + record.setCourseChapterCount(data1.getCourseChapterCount()); + record.setGeneralPriceCourse(data1.getGeneralPrice()); + record.setListingStatusCourse(data1.getListingStatus()); + record.setCourseUid(data1.getId()+""); + } + break; + case 3: + record.setBuyContent(record.getBuyContent()); + record.setGeneralPriceVip(record.getRealPayAmount()); + break; + case 4: + record.setBuyContent("余额充值"); + record.setPlatformMoney((record.getRealPayAmount()!=null?record.getRealPayAmount():record.getTotalAmount()) + .subtract(record.getCommissionAmount()!=null?record.getCommissionAmount():BigDecimal.ZERO)); + break; + } + } + WaterExport waterExport = new WaterExport(); + waterExport.setCode(record.getBizOrderNo()); + if (Objects.nonNull(byId1)){ + record.setUserName(byId1.getNickname()); + record.setCellPhone(byId1.getCellPhone()); + waterExport.setUserName(byId1.getNickname()); + waterExport.setCellphone(byId1.getCellPhone()); + } + waterExport.setRealPayAmount("¥"+record.getRealPayAmount()); + waterExport.setCommissionAmount("¥"+(record.getCommissionAmount()==null?new BigDecimal("0")+"":record.getCommissionAmount()+"")); + waterExport.setPlatformMoney("¥"+record.getPlatformMoney()); + waterExport.setBuyContent(record.getBuyContent()); + waterExport.setOrderFrom(record.getOrderFrom()+""); + waterExport.setPayType(record.getPayType()); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String format = df.format(record.getCreateTime()); + waterExport.setCreateTime(format); + waterExport.setPaymentStatus(record.getPaymentStatus()+""); + waterExports.add(waterExport); + } + + Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), WaterExport.class, waterExports); + HttpServletResponse response = WebUtils.response(); + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + ServletOutputStream outputStream = null; + try { + String fileName = URLEncoder.encode("收支流水导出.xls", "utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName); + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache"); + outputStream = response.getOutputStream(); + workbook.write(outputStream); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + @PostMapping("/waterList") + @ApiOperation(value = "收支流水-分页", tags = {"管理后台-财务管理"}) + public R<Page<Order>> waterList(@RequestBody OrderListDTO courseDTO) { + String startTime = null; + String endTime = null; + if (org.springframework.util.StringUtils.hasLength(courseDTO.getTime())){ + String[] split = courseDTO.getTime().split(" - "); + startTime = split[0]+" 00:00:00"; + endTime = split[1]+" 23:59:59"; + } + List<Integer> payType1 = new ArrayList<>(); + payType1.add(1); + payType1.add(5); + List<Integer> payType2 = new ArrayList<>(); + payType2.add(2); + payType2.add(6); + List<Integer> payType3 = new ArrayList<>(); + payType3.add(3); + payType3.add(7); + + LambdaQueryWrapper<Order> courseLambdaQueryWrapper = new LambdaQueryWrapper<>(); + if (startTime!=null){ + courseLambdaQueryWrapper.between(Order::getCreateTime, startTime, endTime); + } + if (courseDTO.getPayType()!=null){ + courseLambdaQueryWrapper.eq(Order::getPayType, courseDTO.getPayType()); + } + if (courseDTO.getPaymentStatus()!=null){ + courseLambdaQueryWrapper.eq(Order::getPaymentStatus, courseDTO.getPaymentStatus()); + } + if (courseDTO.getOrderFrom()!=null){ + courseLambdaQueryWrapper.eq(Order::getOrderFrom, courseDTO.getOrderFrom()); + } + if (org.springframework.util.StringUtils.hasLength(courseDTO.getBuyContent())){ + // 查询购买内容 + List<Long> collect1 = orderService.lambdaQuery().like(Order::getBuyContent, courseDTO.getBuyContent()).list().stream() + .map(Order::getId).collect(Collectors.toList()); + List<Long> collect2 = orderService.lambdaQuery().like(Order::getBizOrderNo, courseDTO.getBuyContent()).list().stream() + .map(Order::getId).collect(Collectors.toList()); + List<Long> data = remoteCourseService.getCourseIdsByName(courseDTO.getBuyContent()).getData(); + if (!data.isEmpty()){ + List<Long> collect3 = orderService.lambdaQuery().in(Order::getBusinessId, data) + .eq(Order::getOrderFrom, 2) + .list().stream() + .map(Order::getId).collect(Collectors.toList()); + if (!collect3.isEmpty()){ + collect1.addAll(collect3); + } + } + List<Long> data1 = remoteMeditationService.getMeditationIdsByName(courseDTO.getBuyContent()).getData(); + if (!data1.isEmpty()){ + List<Long> collect3 = orderService.lambdaQuery().in(Order::getBusinessId, data1) + .eq(Order::getOrderFrom, 1) + .list().stream() + .map(Order::getId).collect(Collectors.toList()); + if (!collect3.isEmpty()){ + collect1.addAll(collect3); + } + } + + collect1.addAll(collect2); + List<Long> collect = collect1.stream().distinct().collect(Collectors.toList()); + if (collect.isEmpty()){ + collect.add(-1L); + } + courseLambdaQueryWrapper.in(Order::getId,collect); + } + + courseLambdaQueryWrapper.orderByDesc(Order::getCreateTime); + if (org.springframework.util.StringUtils.hasLength(courseDTO.getUserNameOrPhone())){ + List<Long> collect = remoteAppUserService.getAppUserByNameOrPhone(courseDTO.getUserNameOrPhone()).getData(); + if (collect.isEmpty()){ + collect.add(-1L); + } + courseLambdaQueryWrapper.in(Order::getAppUserId, collect); + } + + List<Order> page = orderService.list(courseLambdaQueryWrapper); + + List<AppUserWithdraw> data2 = remoteAppUserService.getWithdraw(courseDTO).getData(); + for (AppUserWithdraw appUserWithdraw : data2) { + Order order = new Order(); + order.setId(appUserWithdraw.getId()); + order.setBizOrderNo(appUserWithdraw.getCode()); + order.setUid(appUserWithdraw.getId()+""); + order.setBuyContent("提现"); + order.setAppUserId(appUserWithdraw.getAppUserId()); + order.setOrderFrom(5); + order.setPaymentStatus(appUserWithdraw.getWithdrawStatus()+1); + order.setPayType(4); + order.setTotalAmount(appUserWithdraw.getAmount()); + order.setRealPayAmount(appUserWithdraw.getAmount()); + order.setPlatformMoney(appUserWithdraw.getAmount().multiply(new BigDecimal("-1"))); + order.setPaymentTime(appUserWithdraw.getWithdrawTime()); + order.setCreateTime(appUserWithdraw.getCreateTime()); + page.add(order); + } + Page<Order> objectPage = new Page<>(); + objectPage.setTotal(page.size()); + objectPage.setCurrent(courseDTO.getPageCurr()); + objectPage.setSize(courseDTO.getPageSize()); + for (Order record : page) { + record.setUid(record.getId().toString()); + record.setPlatformMoney((record.getRealPayAmount()!=null?record.getRealPayAmount():record.getTotalAmount()).subtract(record.getCommissionAmount()==null?BigDecimal.ZERO:record.getCommissionAmount())); + AppUser byId1 = remoteAppUserService.getAppUserById(record.getAppUserId()+"").getData(); + if (Objects.nonNull(byId1)){ + record.setUserName(byId1.getNickname()); + record.setCellPhone(byId1.getCellPhone()); + } + if (record.getOrderFrom()!=null){ + switch (record.getOrderFrom()){ + case 1: + Meditation data = remoteMeditationService.getMeditationById(record.getBusinessId()).getData(); + if (data!=null){ + record.setCategoryMeditationName(data.getCategoryName()); + record.setMeditationTitle(data.getMeditationTitle()); + record.setIconUrl(data.getCoverUrl()); + record.setDetailDescription(data.getDetailDescription()); + record.setGeneralPriceMeditation(data.getGeneralPrice()); + record.setListingStatusMeditation(data.getListingStatus()); + record.setMeditationUid(data.getId()+""); + } + break; + case 2: + Course data1 = remoteCourseService.getCourseById(record.getBusinessId()).getData(); + if (data1!=null){ + record.setCategoryCourseName(data1.getCategoryName()); + record.setCourseTitle(data1.getCourseTitle()); + record.setCoverUrl(data1.getCoverUrl()); + record.setTutor(data1.getTutor()); + record.setCourseChapterCount(data1.getCourseChapterCount()); + record.setGeneralPriceCourse(data1.getGeneralPrice()); + record.setListingStatusCourse(data1.getListingStatus()); + record.setCourseUid(data1.getId()+""); + } + break; + case 3: + record.setBuyContent(record.getBuyContent()); + record.setGeneralPriceVip(record.getTotalAmount()); + break; + case 4: + record.setBuyContent("充值"); + + break; + } + } + } // 手动分页 List<Order> testing = testing(page.size(), courseDTO.getPageCurr(), courseDTO.getPageSize(), page); objectPage.setRecords(testing); @@ -574,39 +596,12 @@ startTime = split[0]+" 00:00:00"; endTime = split[1]+" 23:59:59"; } - List<Integer> payType1 = new ArrayList<>(); - payType1.add(1); - payType1.add(5); - List<Integer> payType2 = new ArrayList<>(); - payType2.add(2); - payType2.add(6); - List<Integer> payType3 = new ArrayList<>(); - payType3.add(3); - payType3.add(7); - List<Integer> payType4 = new ArrayList<>(); - payType4.add(4); - payType4.add(5); - payType4.add(6); - payType4.add(7); LambdaQueryWrapper<Order> courseLambdaQueryWrapper = new LambdaQueryWrapper<>(); if (startTime!=null){ courseLambdaQueryWrapper.between(Order::getCreateTime, startTime, endTime); } if (courseDTO.getPayType()!=null){ - switch (courseDTO.getPayType()){ - case 1: - courseLambdaQueryWrapper.in(Order::getPayType,payType1); - break; - case 2: - courseLambdaQueryWrapper.in(Order::getPayType,payType2); - break; - case 3: - courseLambdaQueryWrapper.in(Order::getPayType,payType3); - break; - case 4: - courseLambdaQueryWrapper.in(Order::getPayType,payType4); - break; - } + courseLambdaQueryWrapper.eq(Order::getPayType,courseDTO.getPayType()); } if (courseDTO.getPaymentStatus()!=null){ courseLambdaQueryWrapper.eq(Order::getPaymentStatus, courseDTO.getPaymentStatus()); @@ -695,9 +690,7 @@ break; } } - if (record.getRealPayAmount()!=null&& record.getRefundStatus()!=null && record.getRefundStatus()!=3){ - totalMoney = totalMoney.add(record.getRealPayAmount()); - } + totalMoney = totalMoney.add(record.getTotalAmount()); } orderCountVO.setTotalCount(page.size()); orderCountVO.setPayCount(payCount); @@ -996,6 +989,7 @@ if (data!=null){ record.setCategoryMeditationName(data.getCategoryName()); record.setMeditationTitle(data.getMeditationTitle()); + record.setCoverUrl(data.getCoverUrl()); record.setIconUrl(StringUtils.hasLength(data.getCoverUrl())?data.getCoverUrl().split(",")[0]:""); record.setDetailDescription(data.getDetailDescription()); record.setGeneralPriceMeditation(record.getRealPayAmount()); @@ -1027,7 +1021,6 @@ } @PostMapping("/orderCount") @ApiOperation(value = "订单列表管理列表上方合计数据", tags = {"管理后台-订单列表管理"}) - public R<OrderCountVO> orderCount(@RequestBody OrderListDTO courseDTO) { OrderCountVO orderCountVO = new OrderCountVO(); String startTime = null; @@ -1136,7 +1129,7 @@ break; } } - if (record.getRealPayAmount()!=null && record.getRefundStatus()!=3){ + if (record.getRealPayAmount()!=null){ totalMoney = totalMoney.add(record.getRealPayAmount()); } } diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/export/WaterExport.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/export/WaterExport.java index 314fd09..c534728 100644 --- a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/export/WaterExport.java +++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/domain/export/WaterExport.java @@ -33,7 +33,7 @@ private Integer payType; @Excel(name = "下单时间",width = 30 ) private String createTime; - @Excel(name = "支付状态",width = 30,replace = {"待支付_1","已完成_1","已取消_2"}) + @Excel(name = "支付状态",width = 30,replace = {"待支付_1","已完成_2","已取消_3"}) private String paymentStatus; diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/HomeController.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/HomeController.java index 690050e..be5ecfe 100644 --- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/HomeController.java +++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/HomeController.java @@ -236,14 +236,14 @@ // 周 // 获取本周7天 格式为dd - calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); + calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); for (int i = 1; i <= 7; i++) { Date time = calendar.getTime(); String format1 = simpleDateFormat.format(time); x.put(format1,0); x1.put(format1,0); x2.put(format1,0); - calendar.add(Calendar.DAY_OF_MONTH, 1); + calendar.add(Calendar.DAY_OF_WEEK, 1); } break; case 4: @@ -258,6 +258,31 @@ x2.put(format1,0); calendar.add(Calendar.DAY_OF_MONTH, 1); } + break; + case 5: + String startTime = null; + String endTime = null; + if (org.springframework.util.StringUtils.hasLength(homeDto.getTime())){ + String[] split = homeDto.getTime().split(" - "); + startTime = split[0]; + endTime = split[1]; + // 将其转化为LocalDate + LocalDate startLocalDate = LocalDate.parse(startTime, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + LocalDate endLocalDate = LocalDate.parse(endTime, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + // 将startLocalDate到endLocalDate之间的每一天的日期,包括startLocalDate和endLocalDate + List<LocalDate> localDates = new ArrayList<>(); + while (!startLocalDate.isAfter(endLocalDate)) { + // 将startLocalDate转化为格式为yyyy-MM-dd格式字符串 + String format1 = startLocalDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + x.put(format1,0); + x1.put(format1,0); + x2.put(format1,0); + localDates.add(startLocalDate); + startLocalDate = startLocalDate.plusDays(1); + + } + } + break; } if (StringUtils.hasLength(homeDto.getTime())&&(!homeDto.getTime().equals("1"))){ @@ -279,32 +304,29 @@ switch (homeDto.getTimeType()){ case 1: // 获取订单月份 - if (StringUtils.hasLength(homeDto.getTime())&&(!homeDto.getTime().equals("1"))){ - x.put(localDate+"",(int)x.get(value+"")+1); - }else{ + if (StringUtils.hasLength(homeDto.getTime())&&x.get(value+"")!=null){ x.put(value+"",(int)x.get(value+"")+1); } break; case 2: Date date = new Date(); String format = simpleDateFormat.format(date); - if (StringUtils.hasLength(homeDto.getTime())&&(!homeDto.getTime().equals("1"))){ - x.put(localDate+"",(int)x.get(value+"")+1); - }else{ - x.put(format,(int)x.get(format)+1); + if (StringUtils.hasLength(homeDto.getTime())&&x.get(value1+"")!=null){ + x.put(value1+"",(int)x.get(value1+"")+1); } break; case 3: - if (StringUtils.hasLength(homeDto.getTime())&&(!homeDto.getTime().equals("1"))){ - x.put(localDate+"",(int)x.get(value+"")+1); - }else{ + if (StringUtils.hasLength(homeDto.getTime())&&x.get(value1+"")!=null){ x.put(value1+"",(int)x.get(value1+"")+1); } break; case 4: - if (StringUtils.hasLength(homeDto.getTime())&&(!homeDto.getTime().equals("1"))){ - x.put(localDate+"",(int)x.get(value+"")+1); - }else{ + if (StringUtils.hasLength(homeDto.getTime())&&x.get(value1+"")!=null){ + x.put(value1+"",(int)x.get(value1+"")+1); + } + break; + case 5: + if (StringUtils.hasLength(homeDto.getTime())&&x.get(value1+"")!=null){ x.put(value1+"",(int)x.get(value1+"")+1); } break; @@ -314,33 +336,31 @@ switch (homeDto.getTimeType()){ case 1: // 获取订单月份 - if (StringUtils.hasLength(homeDto.getTime())&&(!homeDto.getTime().equals("1"))){ - x1.put(localDate+"",(int)x1.get(value+"")+1); - }else{ + if (StringUtils.hasLength(homeDto.getTime())&&x1.get(value+"")!=null){ x1.put(value+"",(int)x1.get(value+"")+1); } break; case 2: Date date = new Date(); String format = simpleDateFormat.format(date); - if (StringUtils.hasLength(homeDto.getTime())&&(!homeDto.getTime().equals("1"))){ - x1.put(localDate+"",(int)x1.get(value+"")+1); - }else{ - x1.put(format,(int)x1.get(format)+1); + if (StringUtils.hasLength(homeDto.getTime())&&x1.get(value1+"")!=null){ + x1.put(value1+"",(int)x1.get(value1+"")+1); + } break; case 3: - if (StringUtils.hasLength(homeDto.getTime())&&(!homeDto.getTime().equals("1"))){ - x1.put(localDate+"",(int)x1.get(value+"")+1); - }else{ - x1.put(value+"",(int)x1.get(value+"")+1); + if (StringUtils.hasLength(homeDto.getTime())&&x1.get(value1+"")!=null){ + x1.put(value1+"",(int)x1.get(value1+"")+1); } break; case 4: - if (StringUtils.hasLength(homeDto.getTime())&&(!homeDto.getTime().equals("1"))){ - x1.put(localDate+"",(int)x1.get(value+"")+1); - }else{ - x1.put(value+"",(int)x1.get(value+"")+1); + if (StringUtils.hasLength(homeDto.getTime())&&x1.get(value1+"")!=null){ + x1.put(value1+"",(int)x1.get(value1+"")+1); + } + break; + case 5: + if (StringUtils.hasLength(homeDto.getTime())&&x1.get(value1+"")!=null){ + x1.put(value1+"",(int)x1.get(value1+"")+1); } break; } @@ -349,33 +369,33 @@ switch (homeDto.getTimeType()){ case 1: // 获取订单月份 - if (StringUtils.hasLength(homeDto.getTime())&&(!homeDto.getTime().equals("1"))){ - x2.put(localDate+"",(int)x2.get(value+"")+1); - }else{ + if (StringUtils.hasLength(homeDto.getTime())&&x2.get(value+"")!=null){ x2.put(value+"",(int)x2.get(value+"")+1); } break; case 2: Date date = new Date(); String format = simpleDateFormat.format(date); - if (StringUtils.hasLength(homeDto.getTime())&&(!homeDto.getTime().equals("1"))){ - x2.put(localDate+"",(int)x2.get(value+"")+1); - }else{ - x2.put(format,(int)x2.get(format)+1); + if (StringUtils.hasLength(homeDto.getTime())&&x2.get(value1+"")!=null){ + x2.put(value1+"",(int)x2.get(value1+"")+1); + } break; case 3: - if (StringUtils.hasLength(homeDto.getTime())&&(!homeDto.getTime().equals("1"))){ - x2.put(localDate+"",(int)x2.get(value+"")+1); - }else{ - x2.put(value+"",(int)x2.get(value+"")+1); + if (StringUtils.hasLength(homeDto.getTime())&&x2.get(value1+"")!=null){ + + x2.put(value1+"",(int)x2.get(value1+"")+1); } break; case 4: - if (StringUtils.hasLength(homeDto.getTime())&&(!homeDto.getTime().equals("1"))){ - x2.put(localDate+"",(int)x2.get(value+"")+1); - }else{ - x2.put(value+"",(int)x2.get(value+"")+1); + if (StringUtils.hasLength(homeDto.getTime())&&x2.get(value1+"")!=null){ + + x2.put(value1+"",(int)x2.get(value1+"")+1); + } + break; + case 5: + if (StringUtils.hasLength(homeDto.getTime())&&x2.get(value1+"")!=null){ + x2.put(value1+"",(int)x2.get(value1+"")+1); } break; } @@ -466,7 +486,6 @@ homeVO.setCourseOffOnline(split[4]); Integer i = Integer.valueOf(homeExport.getCourseCount()); Integer i1 = Integer.valueOf(split[4]); - homeExport.setCourseCount((i-i1)+""); } List<HomeExport> homeExports = new ArrayList<>(); homeExports.add(homeExport); diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserWithdrawController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserWithdrawController.java index 1d282e1..a6529a8 100644 --- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserWithdrawController.java +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserWithdrawController.java @@ -9,7 +9,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.xinquan.common.core.constant.CacheConstants; +import com.xinquan.common.core.constant.SecurityConstants; import com.xinquan.common.core.domain.R; +import com.xinquan.common.core.exception.ServiceException; import com.xinquan.common.core.utils.JuHeFuUtil; import com.xinquan.common.core.utils.WebUtils; import com.xinquan.common.core.utils.page.CollUtils; @@ -21,6 +23,7 @@ import com.xinquan.meditation.api.domain.Meditation; import com.xinquan.order.api.domain.Order; import com.xinquan.system.api.domain.*; +import com.xinquan.system.api.model.AppLoginUser; import com.xinquan.user.api.domain.dto.OrderListDTO; import com.xinquan.system.api.model.LoginUser; import com.xinquan.user.domain.export.WithdrawExport; @@ -284,7 +287,8 @@ String s = UuidUtils.generateUuid(); String replace = s.replace("-", ""); - appUserWithdraw.setCode(replace); + // 商户余额充值到用户余额 + appUserWithdraw.setCode("CZ"+replace); appUserWithdraw.setWithdrawTime(LocalDateTime.now()); appUserWithdraw.setCreateTime(LocalDateTime.now()); // 先扣去余额 @@ -295,11 +299,17 @@ appUserWalletRecord.setOrderId(appUserWithdraw.getId()); appUserWalletRecord.setAmount(new BigDecimal(money)); BigDecimal bigDecimal1 = new BigDecimal(money).setScale(2, RoundingMode.HALF_DOWN); - JuHeFuUtil.updateAccount(byId.getFenzhangId(),byId1.getCardholder(),byId1.getCellPhone(),byId1.getCardNo()); - JSONObject jsonObject = JuHeFuUtil.balancePay(replace, byId.getFenzhangId(), bigDecimal1 + "" + String s1 = JuHeFuUtil.updateAccount(byId.getFenzhangId(), byId1.getCardholder(), byId1.getCellPhone(), byId1.getCardNo()); + if (s1.contains("false")){ + // 修改报错 弹出提示 + return R.fail("银行卡信息或持卡人信息有误,请核对后输入"); + } + // 从商户余额分账到用户分账接收方 + JSONObject jsonObject = JuHeFuUtil.balancePay(appUserWithdraw.getCode(), byId.getFenzhangId(), bigDecimal1 + "" , "https://xq.xqzhihui.com/api/user/client/app-user-withdraw/base/callback"); if (jsonObject.getString("error_msg")!=null){ - return R.fail(jsonObject.getString("error_msg")); + return R.fail("系统繁忙,5分钟后重试"); +// return R.fail(jsonObject.getString("error_msg")); } appUserService.updateById(byId); appUserWalletRecordService.save(appUserWalletRecord); @@ -343,11 +353,14 @@ if (jsonObject.getString("type").equals("balancePay.succeeded")){ if (one!=null){ String s = UuidUtils.generateUuid(); + String replace = "TX"+s.replace("-", ""); + // 商户余额充值到用户余额 AppUser appUser = appUserService.getById(one.getAppUserId()); if (one.getWithdrawStatus()==1 || one.getWithdrawStatus()==2){ return; } - JSONObject jsonObject2 = JuHeFuUtil.balanceWithdraw(s, one.getAmount() + "", appUser.getFenzhangId(), + + JSONObject jsonObject2 = JuHeFuUtil.balanceWithdraw(replace, one.getAmount() + "", appUser.getFenzhangId(), "https://xq.xqzhihui.com/api/user/client/app-user-withdraw/base/callbackA"); if (jsonObject2.getString("error_msg")!=null){ // 调用失败 @@ -371,6 +384,7 @@ out.flush(); out.close(); } + one.setCode(replace); withdrawService.updateById(one); } PrintWriter out = response.getWriter(); @@ -427,6 +441,9 @@ AppUserWithdraw one = withdrawService.lambdaQuery().eq(AppUserWithdraw::getCode, string).one(); if (jsonObject.getString("type").equals("withdraw.succeeded")){ if (one!=null){ + if (one.getWithdrawStatus()==1){ + return; + } System.err.println("提现成功"); one.setWithdrawStatus(1); one.setSerialNo(jsonObject1.getString("withdraw_id")); @@ -480,6 +497,19 @@ // if (!appUserWithdraw.getCode().equals(code)) { // return R.fail("验证码不正确"); // } + if (com.xinquan.common.core.utils.StringUtils.isNotBlank(appUserWithdraw.getCellPhone()) && com.xinquan.common.core.utils.StringUtils.isNotBlank(appUserWithdraw.getCode())) { + String key = CacheConstants.ADD_CARD_PHONE_CODE_PREFIX + appUserWithdraw.getCellPhone(); + String code = redisService.getCacheObject(key); + // 万能验证码 + if (appUserWithdraw.getCode().equals("123456") || (com.xinquan.common.core.utils.StringUtils.isNotBlank(code) && code.equals( + appUserWithdraw.getCode()))) { + redisService.deleteObject(key); + }else{ + return R.fail("验证码不正确"); + } + }else{ + return R.fail("请输入验证码"); + } appUserBankService.save(appUserWithdraw); // 查询是否已经开户 AppUser byId = appUserService.getById(userId); @@ -488,10 +518,12 @@ long time = new Date().getTime(); String s = RandomUtil.randomNumbers(4); String s1 = "FZ" + time + s; - JuHeFuUtil.createUser(s1, appUserWithdraw.getCardholder(), "00", + String user = JuHeFuUtil.createUser(s1, appUserWithdraw.getCardholder(), "00", appUserWithdraw.getIdentityCard(), appUserWithdraw.getCellPhone(), appUserWithdraw.getCardNo()); - byId.setFenzhangId(s1); - appUserService.updateById(byId); + if (user.equals("success")){ + byId.setFenzhangId(s1); + appUserService.updateById(byId); + } } return R.ok(); } -- Gitblit v1.7.1