This commit is contained in:
dute7liang
2024-01-21 16:06:37 +08:00
parent a6302d5125
commit 75dd05f7ec
9 changed files with 339 additions and 6 deletions

View File

@@ -0,0 +1,96 @@
package com.ruoyi.cai.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.cai.domain.PayTotal;
import com.ruoyi.cai.dto.admin.vo.PayTotalAdminVo;
import com.ruoyi.cai.service.PayTotalService;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.annotation.RepeatSubmit;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.enums.BusinessType;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Arrays;
/**
* 支付统计
*
* @author 77
* @date 2024-01-21
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/cai/payTotal")
public class PayTotalController extends BaseController {
private final PayTotalService payTotalService;
/**
* 查询支付统计列表
*/
@SaCheckPermission("cai:payTotal:list")
@GetMapping("/list")
public TableDataInfo<PayTotalAdminVo> list(PayTotal bo, PageQuery pageQuery) {
Page<PayTotalAdminVo> page = payTotalService.pageAdmin(pageQuery, bo);
return TableDataInfo.build(page);
}
/**
* 获取支付统计详细信息
*
* @param id 主键
*/
@SaCheckPermission("cai:payTotal:query")
@GetMapping("/{id}")
public R<PayTotal> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(payTotalService.getById(id));
}
/**
* 新增支付统计
*/
@SaCheckPermission("cai:payTotal:add")
@Log(title = "支付统计", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody PayTotal bo) {
return toAjax(payTotalService.save(bo));
}
/**
* 修改支付统计
*/
@SaCheckPermission("cai:payTotal:edit")
@Log(title = "支付统计", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody PayTotal bo) {
return toAjax(payTotalService.updateById(bo));
}
/**
* 删除支付统计
*
* @param ids 主键串
*/
@SaCheckPermission("cai:payTotal:remove")
@Log(title = "支付统计", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(payTotalService.removeBatchByIds(Arrays.asList(ids)));
}
}

View File

@@ -0,0 +1,51 @@
package com.ruoyi.cai.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.constant.DateConstant;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* 支付统计对象 cai_pay_total
*
* @author 77
* @date 2024-01-21
*/
@Data
@TableName("cai_pay_total")
public class PayTotal implements Serializable {
private static final long serialVersionUID=1L;
/**
*
*/
@TableId(value = "id",type = IdType.AUTO)
private Long id;
/**
* 支付ID
*/
private String payId;
/**
* 支付平台
*/
private Integer payType;
/**
* 时间
*/
@DateTimeFormat(pattern = DateConstant.PATTERN_DATE)
@JsonFormat(pattern = DateConstant.PATTERN_DATE)
private LocalDate date;
/**
*
*/
private BigDecimal money;
}

View File

@@ -0,0 +1,9 @@
package com.ruoyi.cai.dto.admin.vo;
import com.ruoyi.cai.domain.PayTotal;
import lombok.Data;
@Data
public class PayTotalAdminVo extends PayTotal {
private String name;
}

View File

@@ -0,0 +1,19 @@
package com.ruoyi.cai.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.cai.domain.PayTotal;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
/**
* 支付统计Mapper接口
*
* @author 77
* @date 2024-01-21
*/
public interface PayTotalMapper extends BaseMapper<PayTotal> {
void incsPrice(@Param("id") Long id, @Param("price") BigDecimal price);
}

View File

@@ -1,6 +1,5 @@
package com.ruoyi.cai.pay;
import com.alipay.api.domain.AppItemDataDiffVO;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ijpay.alipay.AliPayApiConfig;
import com.ijpay.alipay.AliPayApiConfigKit;
@@ -12,14 +11,14 @@ import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component
@Slf4j
public class PayConfigManager {
private static final Map<Long,PayConfig> PAY_CONFIGS_MAP = new HashMap<>();
private static final Map<Long,PayConfig> PAY_CONFIGS_MAP = new ConcurrentHashMap<>();
@Autowired
private PayConfigService payConfigService;
@@ -31,6 +30,10 @@ public class PayConfigManager {
}
}
public Collection<PayConfig> getAllPayConfig(){
return PAY_CONFIGS_MAP.values();
}
// 1支付宝2微信
public void addPayConfig(PayConfig payConfig) {
PAY_CONFIGS_MAP.put(payConfig.getId(),payConfig);
@@ -96,11 +99,22 @@ public class PayConfigManager {
}
public PayConfig getAliConfigByAppId(String appId) {
this.getWxConfigByMchId(appId);
Collection<PayConfig> values = PAY_CONFIGS_MAP.values();
for (PayConfig value : values) {
if(value.getAppid() != null && value.getAppid().equals(appId)){
return value;
}
}
return null;
}
public PayConfig getWxConfigByMchId(String mchId) {
Collection<PayConfig> values = PAY_CONFIGS_MAP.values();
for (PayConfig value : values) {
if(value.getWxMcid() != null && value.getWxMcid().equals(mchId)){
return value;
}
}
return null;
}
}

View File

@@ -3,6 +3,7 @@ package com.ruoyi.cai.pay;
import com.ruoyi.cai.dto.ConsumeResp;
import com.ruoyi.cai.manager.AwardManager;
import com.ruoyi.cai.manager.ConsumerManager;
import com.ruoyi.cai.service.PayTotalService;
import com.ruoyi.cai.service.VipOrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -20,6 +21,8 @@ public class PayManager {
private ConsumerManager consumerManager;
@Autowired
private AwardManager awardManager;
@Autowired
private PayTotalService payTotalService;
public void callBack(String orderNo){
callBack(orderNo,null,null,null,null);
@@ -35,14 +38,18 @@ public class PayManager {
case VIP_ORDER_SUB:
ConsumeResp vipResp = vipOrderService.orderSuccess(orderNo,params,appId,payTypeEnum);
if(vipResp.isSuccess()){
// 记录数据 TODO
if(appId != null){
payTotalService.incsPrice(payTypeEnum,appId,vipResp.getPrice());
}
}
break;
case RECHARGE_ORDER_SUB:
ConsumeResp resp = consumerManager.rechargeOrderSuccess(orderNo,params,appId,payTypeEnum);
if(resp.isSuccess()){
awardManager.giveFastPayAsync(resp.getUserId(), resp.getTraceId());
// 记录数据 TODO
if(appId != null){
payTotalService.incsPrice(payTypeEnum,appId,resp.getPrice());
}
}
break;
default:

View File

@@ -0,0 +1,23 @@
package com.ruoyi.cai.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.cai.domain.PayTotal;
import com.ruoyi.cai.dto.admin.vo.PayTotalAdminVo;
import com.ruoyi.cai.pay.PayTypeEnum;
import com.ruoyi.common.core.domain.PageQuery;
import java.math.BigDecimal;
/**
* 支付统计Service接口
*
* @author 77
* @date 2024-01-21
*/
public interface PayTotalService extends IService<PayTotal> {
void incsPrice(PayTypeEnum payTypeEnum, String appId, BigDecimal price);
Page<PayTotalAdminVo> pageAdmin(PageQuery pageQuery, PayTotal bo);
}

View File

@@ -0,0 +1,94 @@
package com.ruoyi.cai.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.cai.domain.PayConfig;
import com.ruoyi.cai.domain.PayTotal;
import com.ruoyi.cai.dto.admin.vo.PayTotalAdminVo;
import com.ruoyi.cai.mapper.PayTotalMapper;
import com.ruoyi.cai.pay.PayConfigManager;
import com.ruoyi.cai.pay.PayTypeEnum;
import com.ruoyi.cai.service.PayTotalService;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.BeanConvertUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
/**
* 支付统计Service业务层处理
*
* @author 77
* @date 2024-01-21
*/
@Service
public class PayTotalServiceImpl extends ServiceImpl<PayTotalMapper,PayTotal> implements PayTotalService {
@Override
public void incsPrice(PayTypeEnum payTypeEnum, String appId, BigDecimal price) {
PayTotal one = this.getOne(Wrappers.lambdaQuery(PayTotal.class)
.eq(PayTotal::getPayId, appId)
.eq(PayTotal::getDate, LocalDate.now())
.last("limit 1"));
if(one == null){
ReentrantLock lock = new ReentrantLock();
try {
lock.lock();
one = this.getOne(Wrappers.lambdaQuery(PayTotal.class)
.eq(PayTotal::getPayId, appId)
.eq(PayTotal::getDate, LocalDate.now())
.last("limit 1"));
if(one == null){
one = new PayTotal();
one.setPayId(appId);
one.setDate(LocalDate.now());
one.setPayType(payTypeEnum.getCode());
one.setMoney(BigDecimal.ZERO);
this.save(one);
}
}finally {
lock.unlock();
}
}
baseMapper.incsPrice(one.getId(),price);
}
@Autowired
private PayConfigManager payConfigManager;
@Override
public Page<PayTotalAdminVo> pageAdmin(PageQuery pageQuery, PayTotal bo) {
Page<PayTotal> page = this.page(pageQuery.build(), Wrappers.lambdaQuery(bo)
.orderByDesc(PayTotal::getDate));
List<PayTotal> records = page.getRecords();
List<PayTotalAdminVo> vos = BeanConvertUtil.convertListTo(records, PayTotalAdminVo::new);
for (PayTotalAdminVo vo : vos) {
Collection<PayConfig> config = payConfigManager.getAllPayConfig();
for (PayConfig payConfig : config) {
if(PayTypeEnum.ALI.getCode().equals(vo.getPayType())){ // 阿里
if(vo.getPayId().equals(payConfig.getAppid())){
vo.setName(payConfig.getName());
}
}else if(PayTypeEnum.WX.getCode().equals(vo.getPayType())){ // wx
if(vo.getPayId().equals(payConfig.getWxMcid())){
vo.setName(payConfig.getName());
}
}
}
}
Page<PayTotalAdminVo> resp = new Page<>();
resp.setRecords(vos);
resp.setTotal(page.getTotal());
resp.setSize(page.getSize());
resp.setCurrent(page.getCurrent());
return resp;
}
}

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.cai.mapper.PayTotalMapper">
<resultMap type="com.ruoyi.cai.domain.PayTotal" id="PayTotalResult">
<result property="id" column="id"/>
<result property="payId" column="pay_id"/>
<result property="payType" column="pay_type"/>
<result property="date" column="date"/>
<result property="money" column="money"/>
</resultMap>
<update id="incsPrice">
update cai_pay_total
set money = money + #{price}
where id = #{id}
</update>
</mapper>