From 80af929b6760c8916a2b5f1d78e38a6e7e45b3c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=AD=E5=87=AF=E5=87=AF?= Date: Tue, 14 Jan 2025 10:18:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8C=89=E4=BA=A4=E6=98=93?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=8F=B7=E7=BB=9F=E8=AE=A1=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orders/controller/OrdersController.java | 8 ++ .../sqx/modules/orders/dto/SummaryDTO.java | 24 ++++++ .../modules/orders/service/OrdersService.java | 3 + .../service/impl/OrdersServiceImpl.java | 84 +++++++++++++++++++ .../com/sqx/modules/pay/entity/CashOut.java | 11 +++ 5 files changed, 130 insertions(+) create mode 100644 src/main/java/com/sqx/modules/orders/dto/SummaryDTO.java diff --git a/src/main/java/com/sqx/modules/orders/controller/OrdersController.java b/src/main/java/com/sqx/modules/orders/controller/OrdersController.java index c64f9eab..5a09c684 100644 --- a/src/main/java/com/sqx/modules/orders/controller/OrdersController.java +++ b/src/main/java/com/sqx/modules/orders/controller/OrdersController.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.NumberUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.sqx.common.utils.DateUtils; import com.sqx.common.utils.Result; +import com.sqx.modules.orders.dto.SummaryDTO; import com.sqx.modules.orders.service.OrdersService; import com.sqx.modules.pay.dao.CashOutDao; import com.sqx.modules.pay.entity.CashOut; @@ -207,4 +208,11 @@ public class OrdersController extends AbstractController { result.put("year", year); return Result.success().put("data", result); } + + @GetMapping("/queryByTradeNo") + @ApiOperation("按交易订单号统计相关数据") + public Result queryByTradeNo(String outTradeNo) { + SummaryDTO data = ordersService.queryByTradeNo(outTradeNo); + return Result.success().put("data", data); + } } diff --git a/src/main/java/com/sqx/modules/orders/dto/SummaryDTO.java b/src/main/java/com/sqx/modules/orders/dto/SummaryDTO.java new file mode 100644 index 00000000..5962899b --- /dev/null +++ b/src/main/java/com/sqx/modules/orders/dto/SummaryDTO.java @@ -0,0 +1,24 @@ +package com.sqx.modules.orders.dto; + +import com.sqx.modules.app.entity.UserEntity; +import com.sqx.modules.app.entity.UserInfo; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * @author tankaikai + * @since 2025-01-13 19:13 + */ +@Data +public class SummaryDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private UserEntity userInfo; + private UserInfo authInfo; + + private Map withdrawTotal; + private Map payTotal; + +} diff --git a/src/main/java/com/sqx/modules/orders/service/OrdersService.java b/src/main/java/com/sqx/modules/orders/service/OrdersService.java index 28544e80..90063555 100644 --- a/src/main/java/com/sqx/modules/orders/service/OrdersService.java +++ b/src/main/java/com/sqx/modules/orders/service/OrdersService.java @@ -2,6 +2,7 @@ package com.sqx.modules.orders.service; import com.baomidou.mybatisplus.extension.service.IService; import com.sqx.common.utils.Result; +import com.sqx.modules.orders.dto.SummaryDTO; import com.sqx.modules.orders.entity.Orders; public interface OrdersService extends IService { @@ -70,4 +71,6 @@ public interface OrdersService extends IService { * @param orders */ void fillSysUserId(Orders orders); + + SummaryDTO queryByTradeNo(String outTradeNo); } diff --git a/src/main/java/com/sqx/modules/orders/service/impl/OrdersServiceImpl.java b/src/main/java/com/sqx/modules/orders/service/impl/OrdersServiceImpl.java index 706b147a..95a742ec 100644 --- a/src/main/java/com/sqx/modules/orders/service/impl/OrdersServiceImpl.java +++ b/src/main/java/com/sqx/modules/orders/service/impl/OrdersServiceImpl.java @@ -1,6 +1,9 @@ package com.sqx.modules.orders.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; @@ -12,6 +15,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.sqx.common.exception.SqxException; import com.sqx.common.utils.DateUtils; import com.sqx.common.utils.PageUtils; import com.sqx.common.utils.Result; @@ -29,9 +33,14 @@ import com.sqx.modules.course.service.CourseUserService; import com.sqx.modules.invite.service.InviteMoneyService; import com.sqx.modules.invite.service.InviteService; import com.sqx.modules.orders.dao.OrdersDao; +import com.sqx.modules.orders.dto.SummaryDTO; import com.sqx.modules.orders.entity.Orders; import com.sqx.modules.orders.service.OrdersService; import com.sqx.modules.pay.controller.app.AliPayController; +import com.sqx.modules.pay.dao.CashOutDao; +import com.sqx.modules.pay.dao.PayDetailsDao; +import com.sqx.modules.pay.entity.CashOut; +import com.sqx.modules.pay.entity.PayDetails; import com.sqx.modules.pay.service.DyService; import com.sqx.modules.pay.service.WxService; import com.sqx.modules.sys.dao.SysUserDao; @@ -89,6 +98,13 @@ public class OrdersServiceImpl extends ServiceImpl implements @Autowired private SysUserDao sysUserDao; + @Autowired + private UserInfoService userInfoService; + @Autowired + private CashOutDao cashOutDao; + + @Autowired + private PayDetailsDao payDetailsDao; private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true); @@ -805,4 +821,72 @@ public class OrdersServiceImpl extends ServiceImpl implements } orders.setSysUserId(sysUserEntity.getUserId()); } + + @Override + public SummaryDTO queryByTradeNo(String outTradeNo) { + String tradeNo = null; + Long userId = null; + try { + // 提现回调单号 + if (outTradeNo.contains("-") && outTradeNo.contains(":")){ + tradeNo = outTradeNo.split("-")[0]; + userId = Convert.toLong(outTradeNo.split("-")[1].split(":")[0]); + } + // 支付回调单号 + else if(outTradeNo.contains("-")){ + tradeNo = outTradeNo.split("-")[0]; + userId = Convert.toLong(outTradeNo.split("-")[1]); + } + }catch (Exception e){ + throw new SqxException("交易订单号不合法"); + } + if(StrUtil.isEmpty(tradeNo) || userId == null){ + throw new SqxException("交易订单号不合法"); + } + SummaryDTO data = new SummaryDTO(); + UserEntity user = userService.selectUserById(userId); + data.setUserInfo(user); + UserInfo realNameAuth = userInfoService.getByUserId(userId); + data.setAuthInfo(realNameAuth); + + Map withdrawTotal = new HashMap<>(); + withdrawTotal.put("success", MapUtil.builder().put("total", BigDecimal.ZERO).put("count", 0).build()); + withdrawTotal.put("fail", MapUtil.builder().put("total", BigDecimal.ZERO).put("count", 0).build()); + withdrawTotal.put("auditing", MapUtil.builder().put("total", BigDecimal.ZERO).put("count", 0).build()); + withdrawTotal.put("other", MapUtil.builder().put("total", BigDecimal.ZERO).put("count", 0).build()); + data.setWithdrawTotal(withdrawTotal); + Map payTotal = new HashMap<>(); + payTotal.put("success", MapUtil.builder().put("total", BigDecimal.ZERO).put("count", 0).build()); + payTotal.put("fail", MapUtil.builder().put("total", BigDecimal.ZERO).put("count", 0).build()); + payTotal.put("unpaid", MapUtil.builder().put("total", BigDecimal.ZERO).put("count", 0).build()); + data.setPayTotal(payTotal); + List cashOutList = cashOutDao.selectList(Wrappers.lambdaQuery().eq(CashOut::getUserId, userId)); + if (CollUtil.isNotEmpty(cashOutList)) { + Map cashOut = cashOutList.stream().collect(Collectors.groupingBy(CashOut::getState, Collectors.reducing(BigDecimal.ZERO, CashOut::getConvertMoney, BigDecimal::add))); + Map cashOutCount = cashOutList.stream().collect(Collectors.groupingBy(CashOut::getState, Collectors.counting())); + withdrawTotal.put("success", MapUtil.builder().put("total", cashOut.containsKey(1) ? cashOut.get(1) : BigDecimal.ZERO).put("count", cashOutCount.containsKey(1) ? cashOutCount.get(1) : 0).build()); + withdrawTotal.put("fail", MapUtil.builder().put("total", cashOut.containsKey(2) ? cashOut.get(2) : BigDecimal.ZERO).put("count", cashOutCount.containsKey(2) ? cashOutCount.get(2) : 0).build()); + withdrawTotal.put("auditing", MapUtil.builder().put("total", cashOut.containsKey(3) ? cashOut.get(3) : BigDecimal.ZERO).put("count", cashOutCount.containsKey(3) ? cashOutCount.get(3) : 0).build()); + Integer[] states = {1, 2, 3}; + BigDecimal otherMoney = cashOutList.stream().filter(obj -> !ArrayUtil.contains(states, obj.getState())).collect(Collectors.reducing(BigDecimal.ZERO, CashOut::getConvertMoney, BigDecimal::add)); + Long otherCount = cashOutList.stream().filter(obj -> !ArrayUtil.contains(states, obj.getState())).collect(Collectors.counting()); + withdrawTotal.put("other", MapUtil.builder().put("total", NumberUtil.null2Zero(otherMoney)).put("count", otherCount == null ? 0 : otherCount.longValue()).build()); + data.setWithdrawTotal(withdrawTotal); + } + + + List payDetailsList = payDetailsDao.selectList(Wrappers.lambdaQuery().eq(PayDetails::getUserId, userId)); + if (CollUtil.isNotEmpty(payDetailsList)) { + Map payDetail = payDetailsList.stream().collect(Collectors.groupingBy(PayDetails::getState, Collectors.summingDouble(PayDetails::getMoney))); + Map payDetailCount = payDetailsList.stream().collect(Collectors.groupingBy(PayDetails::getState, Collectors.counting())); + + payTotal.put("success", MapUtil.builder().put("total", payDetail.containsKey(1) ? payDetail.get(1) : 0d).put("count", payDetailCount.containsKey(1) ? payDetailCount.get(1) : 0).build()); + payTotal.put("fail", MapUtil.builder().put("total", payDetail.containsKey(2) ? payDetail.get(2) : 0d).put("count", payDetailCount.containsKey(2) ? payDetailCount.get(2) : 0).build()); + payTotal.put("unpaid", MapUtil.builder().put("total", payDetail.containsKey(0) ? payDetail.get(0) : 0d).put("count", payDetailCount.containsKey(0) ? payDetailCount.get(0) : 0).build()); + data.setPayTotal(payTotal); + } + + return data; + } + } diff --git a/src/main/java/com/sqx/modules/pay/entity/CashOut.java b/src/main/java/com/sqx/modules/pay/entity/CashOut.java index 789ba7cc..28da45a0 100644 --- a/src/main/java/com/sqx/modules/pay/entity/CashOut.java +++ b/src/main/java/com/sqx/modules/pay/entity/CashOut.java @@ -1,5 +1,6 @@ package com.sqx.modules.pay.entity; +import cn.hutool.core.convert.Convert; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; @@ -151,6 +152,16 @@ public class CashOut implements Serializable { private Integer withdrawType; + /** + * 提现金币 + */ + @TableField(exist = false) + private BigDecimal convertMoney; + + public BigDecimal getConvertMoney() { + return Convert.toBigDecimal(money,BigDecimal.ZERO); + } + public void setZhifubao(String zhifubao) { this.zhifubao = zhifubao; }