新增按交易订单号统计相关数据接口
This commit is contained in:
@@ -6,6 +6,7 @@ import cn.hutool.core.util.NumberUtil;
|
|||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.sqx.common.utils.DateUtils;
|
import com.sqx.common.utils.DateUtils;
|
||||||
import com.sqx.common.utils.Result;
|
import com.sqx.common.utils.Result;
|
||||||
|
import com.sqx.modules.orders.dto.SummaryDTO;
|
||||||
import com.sqx.modules.orders.service.OrdersService;
|
import com.sqx.modules.orders.service.OrdersService;
|
||||||
import com.sqx.modules.pay.dao.CashOutDao;
|
import com.sqx.modules.pay.dao.CashOutDao;
|
||||||
import com.sqx.modules.pay.entity.CashOut;
|
import com.sqx.modules.pay.entity.CashOut;
|
||||||
@@ -207,4 +208,11 @@ public class OrdersController extends AbstractController {
|
|||||||
result.put("year", year);
|
result.put("year", year);
|
||||||
return Result.success().put("data", result);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
24
src/main/java/com/sqx/modules/orders/dto/SummaryDTO.java
Normal file
24
src/main/java/com/sqx/modules/orders/dto/SummaryDTO.java
Normal file
@@ -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<String,Object> withdrawTotal;
|
||||||
|
private Map<String,Object> payTotal;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ package com.sqx.modules.orders.service;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import com.sqx.common.utils.Result;
|
import com.sqx.common.utils.Result;
|
||||||
|
import com.sqx.modules.orders.dto.SummaryDTO;
|
||||||
import com.sqx.modules.orders.entity.Orders;
|
import com.sqx.modules.orders.entity.Orders;
|
||||||
|
|
||||||
public interface OrdersService extends IService<Orders> {
|
public interface OrdersService extends IService<Orders> {
|
||||||
@@ -70,4 +71,6 @@ public interface OrdersService extends IService<Orders> {
|
|||||||
* @param orders
|
* @param orders
|
||||||
*/
|
*/
|
||||||
void fillSysUserId(Orders orders);
|
void fillSysUserId(Orders orders);
|
||||||
|
|
||||||
|
SummaryDTO queryByTradeNo(String outTradeNo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
package com.sqx.modules.orders.service.impl;
|
package com.sqx.modules.orders.service.impl;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
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.NumberUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.hutool.json.JSONUtil;
|
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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageHelper;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
|
import com.sqx.common.exception.SqxException;
|
||||||
import com.sqx.common.utils.DateUtils;
|
import com.sqx.common.utils.DateUtils;
|
||||||
import com.sqx.common.utils.PageUtils;
|
import com.sqx.common.utils.PageUtils;
|
||||||
import com.sqx.common.utils.Result;
|
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.InviteMoneyService;
|
||||||
import com.sqx.modules.invite.service.InviteService;
|
import com.sqx.modules.invite.service.InviteService;
|
||||||
import com.sqx.modules.orders.dao.OrdersDao;
|
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.entity.Orders;
|
||||||
import com.sqx.modules.orders.service.OrdersService;
|
import com.sqx.modules.orders.service.OrdersService;
|
||||||
import com.sqx.modules.pay.controller.app.AliPayController;
|
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.DyService;
|
||||||
import com.sqx.modules.pay.service.WxService;
|
import com.sqx.modules.pay.service.WxService;
|
||||||
import com.sqx.modules.sys.dao.SysUserDao;
|
import com.sqx.modules.sys.dao.SysUserDao;
|
||||||
@@ -89,6 +98,13 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersDao, Orders> implements
|
|||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private SysUserDao sysUserDao;
|
private SysUserDao sysUserDao;
|
||||||
|
@Autowired
|
||||||
|
private UserInfoService userInfoService;
|
||||||
|
@Autowired
|
||||||
|
private CashOutDao cashOutDao;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private PayDetailsDao payDetailsDao;
|
||||||
|
|
||||||
private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true);
|
private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true);
|
||||||
|
|
||||||
@@ -805,4 +821,72 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersDao, Orders> implements
|
|||||||
}
|
}
|
||||||
orders.setSysUserId(sysUserEntity.getUserId());
|
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<String, Object> 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<String, Object> 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<CashOut> cashOutList = cashOutDao.selectList(Wrappers.<CashOut>lambdaQuery().eq(CashOut::getUserId, userId));
|
||||||
|
if (CollUtil.isNotEmpty(cashOutList)) {
|
||||||
|
Map<Integer, BigDecimal> cashOut = cashOutList.stream().collect(Collectors.groupingBy(CashOut::getState, Collectors.reducing(BigDecimal.ZERO, CashOut::getConvertMoney, BigDecimal::add)));
|
||||||
|
Map<Integer, Long> 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<PayDetails> payDetailsList = payDetailsDao.selectList(Wrappers.<PayDetails>lambdaQuery().eq(PayDetails::getUserId, userId));
|
||||||
|
if (CollUtil.isNotEmpty(payDetailsList)) {
|
||||||
|
Map<Integer, Double> payDetail = payDetailsList.stream().collect(Collectors.groupingBy(PayDetails::getState, Collectors.summingDouble(PayDetails::getMoney)));
|
||||||
|
Map<Integer, Long> 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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.sqx.modules.pay.entity;
|
package com.sqx.modules.pay.entity;
|
||||||
|
|
||||||
|
import cn.hutool.core.convert.Convert;
|
||||||
import com.baomidou.mybatisplus.annotation.IdType;
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
import com.baomidou.mybatisplus.annotation.TableField;
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
@@ -151,6 +152,16 @@ public class CashOut implements Serializable {
|
|||||||
|
|
||||||
private Integer withdrawType;
|
private Integer withdrawType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 提现金币
|
||||||
|
*/
|
||||||
|
@TableField(exist = false)
|
||||||
|
private BigDecimal convertMoney;
|
||||||
|
|
||||||
|
public BigDecimal getConvertMoney() {
|
||||||
|
return Convert.toBigDecimal(money,BigDecimal.ZERO);
|
||||||
|
}
|
||||||
|
|
||||||
public void setZhifubao(String zhifubao) {
|
public void setZhifubao(String zhifubao) {
|
||||||
this.zhifubao = zhifubao;
|
this.zhifubao = zhifubao;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user