From 75dd05f7ec2cb761f2c3f2cd8f281f7b8aca0c13 Mon Sep 17 00:00:00 2001 From: dute7liang <383200134@qq.com> Date: Sun, 21 Jan 2024 16:06:37 +0800 Subject: [PATCH] init --- .../cai/controller/PayTotalController.java | 96 +++++++++++++++++++ .../java/com/ruoyi/cai/domain/PayTotal.java | 51 ++++++++++ .../cai/dto/admin/vo/PayTotalAdminVo.java | 9 ++ .../com/ruoyi/cai/mapper/PayTotalMapper.java | 19 ++++ .../com/ruoyi/cai/pay/PayConfigManager.java | 22 ++++- .../java/com/ruoyi/cai/pay/PayManager.java | 11 ++- .../ruoyi/cai/service/PayTotalService.java | 23 +++++ .../cai/service/impl/PayTotalServiceImpl.java | 94 ++++++++++++++++++ .../resources/mapper/cai/PayTotalMapper.xml | 20 ++++ 9 files changed, 339 insertions(+), 6 deletions(-) create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/controller/PayTotalController.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/domain/PayTotal.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/PayTotalAdminVo.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/PayTotalMapper.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/service/PayTotalService.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/PayTotalServiceImpl.java create mode 100644 ruoyi-cai/src/main/resources/mapper/cai/PayTotalMapper.xml diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/PayTotalController.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/PayTotalController.java new file mode 100644 index 00000000..40067b76 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/PayTotalController.java @@ -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 list(PayTotal bo, PageQuery pageQuery) { + Page page = payTotalService.pageAdmin(pageQuery, bo); + return TableDataInfo.build(page); + } + + /** + * 获取支付统计详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("cai:payTotal:query") + @GetMapping("/{id}") + public R 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 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 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 remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(payTotalService.removeBatchByIds(Arrays.asList(ids))); + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/PayTotal.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/PayTotal.java new file mode 100644 index 00000000..2e64175b --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/PayTotal.java @@ -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; + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/PayTotalAdminVo.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/PayTotalAdminVo.java new file mode 100644 index 00000000..68d8c4ac --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/PayTotalAdminVo.java @@ -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; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/PayTotalMapper.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/PayTotalMapper.java new file mode 100644 index 00000000..98f92989 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/PayTotalMapper.java @@ -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 { + + void incsPrice(@Param("id") Long id, @Param("price") BigDecimal price); + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayConfigManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayConfigManager.java index 6e3421f2..08236eb3 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayConfigManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayConfigManager.java @@ -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 PAY_CONFIGS_MAP = new HashMap<>(); + private static final Map PAY_CONFIGS_MAP = new ConcurrentHashMap<>(); @Autowired private PayConfigService payConfigService; @@ -31,6 +30,10 @@ public class PayConfigManager { } } + public Collection 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 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 values = PAY_CONFIGS_MAP.values(); + for (PayConfig value : values) { + if(value.getWxMcid() != null && value.getWxMcid().equals(mchId)){ + return value; + } + } return null; } } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayManager.java index c49e158e..b8449e71 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/pay/PayManager.java @@ -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: diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/PayTotalService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/PayTotalService.java new file mode 100644 index 00000000..196d8f33 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/PayTotalService.java @@ -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 { + + void incsPrice(PayTypeEnum payTypeEnum, String appId, BigDecimal price); + + Page pageAdmin(PageQuery pageQuery, PayTotal bo); +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/PayTotalServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/PayTotalServiceImpl.java new file mode 100644 index 00000000..707cb214 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/PayTotalServiceImpl.java @@ -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 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 pageAdmin(PageQuery pageQuery, PayTotal bo) { + Page page = this.page(pageQuery.build(), Wrappers.lambdaQuery(bo) + .orderByDesc(PayTotal::getDate)); + List records = page.getRecords(); + List vos = BeanConvertUtil.convertListTo(records, PayTotalAdminVo::new); + for (PayTotalAdminVo vo : vos) { + Collection 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 resp = new Page<>(); + resp.setRecords(vos); + resp.setTotal(page.getTotal()); + resp.setSize(page.getSize()); + resp.setCurrent(page.getCurrent()); + return resp; + } + +} + diff --git a/ruoyi-cai/src/main/resources/mapper/cai/PayTotalMapper.xml b/ruoyi-cai/src/main/resources/mapper/cai/PayTotalMapper.xml new file mode 100644 index 00000000..de837142 --- /dev/null +++ b/ruoyi-cai/src/main/resources/mapper/cai/PayTotalMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + update cai_pay_total + set money = money + #{price} + where id = #{id} + + +