From 72d63cbc167e46b2985f4ea6eca0349a54471f45 Mon Sep 17 00:00:00 2001 From: huangqizhen <15552608129@163.com> Date: Wed, 3 Dec 2025 20:43:54 +0800 Subject: [PATCH] =?UTF-8?q?12.3=20=E5=86=B2=E5=88=BA=E8=AE=A1=E5=88=92?= =?UTF-8?q?=E7=B4=AF=E8=AE=A1=E5=85=85=E5=80=BC=E9=80=BB=E8=BE=91=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/config/RedTimeRuleConfig.java | 23 +++++++ .../example/demo/mapper/Temporary/RedMapper.java | 6 ++ .../example/demo/service/Temporary/RedService.java | 1 + .../demo/serviceImpl/Temporary/RedServiceImpl.java | 70 ++++++++++++++++++++++ .../demo/serviceImpl/coin/AuditServiceImpl.java | 24 +++++++- src/main/resources/mapper/RedMapper.xml | 15 +++++ 6 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/example/demo/config/RedTimeRuleConfig.java diff --git a/src/main/java/com/example/demo/config/RedTimeRuleConfig.java b/src/main/java/com/example/demo/config/RedTimeRuleConfig.java new file mode 100644 index 0000000..4396b0b --- /dev/null +++ b/src/main/java/com/example/demo/config/RedTimeRuleConfig.java @@ -0,0 +1,23 @@ +package com.example.demo.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.time.ZoneId; + +// 可放入 application.yml(推荐),或写死在代码(演示用) +@ConfigurationProperties(prefix = "business.rules.red") +@Data +@Component +public class RedTimeRuleConfig { + // 充值开放时间:2025-12-04 20:00:00(北京时间) + private LocalDateTime rechargeStartTime = LocalDateTime.of(2025, 12, 4, 20, 0, 0); + + // 消费开放时间:2025-12-06 10:00:00(北京时间) + private LocalDateTime consumeStartTime = LocalDateTime.of(2025, 12, 6, 10, 0, 0); + + // 时区:中国标准时间 + private ZoneId zoneId = ZoneId.of("Asia/Shanghai"); +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/mapper/Temporary/RedMapper.java b/src/main/java/com/example/demo/mapper/Temporary/RedMapper.java index 347cf55..9dd1af7 100644 --- a/src/main/java/com/example/demo/mapper/Temporary/RedMapper.java +++ b/src/main/java/com/example/demo/mapper/Temporary/RedMapper.java @@ -16,4 +16,10 @@ import java.math.BigDecimal; @Mapper public interface RedMapper { BigDecimal selectSum(@Param("jwcode") Integer jwcode, @Param("type") Integer type); + //查询是否有该精网号 + boolean selectJwcode(@Param("jwcode") Integer jwcode); + + int upsertAndAdd(@Param("jwcode") Integer jwcode, + @Param("type") Integer type, + @Param("sum") BigDecimal sum); } diff --git a/src/main/java/com/example/demo/service/Temporary/RedService.java b/src/main/java/com/example/demo/service/Temporary/RedService.java index 3a8de81..97672bb 100644 --- a/src/main/java/com/example/demo/service/Temporary/RedService.java +++ b/src/main/java/com/example/demo/service/Temporary/RedService.java @@ -14,4 +14,5 @@ import java.math.BigDecimal; **/ public interface RedService { BigDecimal selectSum(Integer jwcode, Integer type); + void addAmount(Integer jwcode,BigDecimal sum, Integer type); } diff --git a/src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java index 7971507..d4beee3 100644 --- a/src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java @@ -1,14 +1,18 @@ package com.example.demo.serviceImpl.Temporary; import com.example.demo.Util.BusinessException; +import com.example.demo.config.RedTimeRuleConfig; import com.example.demo.domain.vo.Red; import com.example.demo.exception.SystemException; import com.example.demo.mapper.Temporary.RedMapper; import com.example.demo.service.Temporary.RedService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; /** * @program: GOLD @@ -22,14 +26,80 @@ import java.math.BigDecimal; public class RedServiceImpl implements RedService { @Autowired private RedMapper redMapper; + @Autowired + private RedTimeRuleConfig timeRuleConfig; @Override public BigDecimal selectSum(Integer jwcode,Integer type) { if (jwcode == null){ throw new BusinessException("未接受到精网号"); } + if (redMapper.selectJwcode(jwcode)==false){ + throw new BusinessException("未找到该精网号"); + } + if(redMapper.selectJwcode(jwcode)) if (type == null){ throw new BusinessException("未接受到类型"); } + if (type !=1 && type != 2){ + throw new BusinessException("类型错误"); + } return redMapper.selectSum(jwcode,type); } + + @Override + @Transactional(rollbackFor = Exception.class) + public void addAmount(Integer jwcode, BigDecimal sum, Integer type) { + // 1. 基础参数校验 + validateParams(jwcode, type, sum); + + // 2. ⭐⭐⭐ 时间窗口校验(关键!) + validateTimeWindow(type, sum); + + // 3. 执行原子累加 + int affected = redMapper.upsertAndAdd(jwcode, type, sum); + if (affected == 0) { + throw new BusinessException("操作失败,请重试"); + } + } + + // --- 校验方法 --- + private void validateParams(Integer jwcode, Integer type, BigDecimal delta) { + if (jwcode == null || jwcode <= 0) { + throw new BusinessException("精网号无效"); + } + if (type == null || (type != 1 && type != 2)) { + throw new BusinessException("类型必须为 1(充值)或 2(消费)"); + } + if (delta == null || delta.compareTo(BigDecimal.ZERO) == 0) { + throw new BusinessException("变动金额不能为0"); + } + } + + private void validateTimeWindow(Integer type, BigDecimal delta) { + LocalDateTime now = LocalDateTime.now(timeRuleConfig.getZoneId()); + + if (type == 1) { + // 充值:必须 delta > 0,且当前时间 >= rechargeStartTime + if (delta.compareTo(BigDecimal.ZERO) < 0) { + throw new BusinessException("充值金额不能为负数"); + } + if (now.isBefore(timeRuleConfig.getRechargeStartTime())) { + String openTime = timeRuleConfig.getRechargeStartTime() + .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")); + throw new BusinessException("红包充值通道暂未开放,请于 " + openTime + " 后操作"); + } + } + else if (type == 2) { + // 消费:必须 delta < 0(或你设计为正数+方向,此处按负数扣款) + if (delta.compareTo(BigDecimal.ZERO) > 0) { + throw new BusinessException("消费金额应为负数(表示扣款)"); + } + if (now.isBefore(timeRuleConfig.getConsumeStartTime())) { + String openTime = timeRuleConfig.getConsumeStartTime() + .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")); + throw new BusinessException("红包消费通道暂未开放,请于 " + openTime + " 后操作"); + } + } + } } + diff --git a/src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java index c704f61..846706d 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java @@ -10,16 +10,19 @@ import com.example.demo.domain.vo.coin.RefundAudit; import com.example.demo.mapper.coin.AuditMapper; import com.example.demo.mapper.coin.MarketMapper; import com.example.demo.mapper.coin.UserMapper; +import com.example.demo.service.Temporary.RedService; import com.example.demo.service.coin.AdminService; import com.example.demo.service.coin.AuditService; import com.example.demo.service.coin.GeneralService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; @@ -35,6 +38,7 @@ import java.util.List; **/ @Service +@Slf4j public class AuditServiceImpl implements AuditService { @Autowired private AuditMapper auditMapper; @@ -46,6 +50,8 @@ public class AuditServiceImpl implements AuditService { private GeneralService generalService; @Autowired private MarketMapper marketMapper; + @Autowired + private RedService redService; /* 审核订单并修改用户余额等 */ @@ -111,15 +117,29 @@ public class AuditServiceImpl implements AuditService { auditMapper.updateFirstRecharge(order.getJwcode());//设置首充时间为当前时间 } auditMapper.updateUserGold(update); + + + //累充 + try { + BigDecimal sum = BigDecimal.valueOf( + order.getPermanentGold() + order.getFreeJune() + order.getFreeDecember() + ).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + + redService.addAmount(order.getJwcode(), sum, 1); // ← 直接调你写好的方法! + } catch (Exception e) { + log.warn("红包累加失败,主流程继续 | jwcode={}", order.getJwcode(), e); + } + + //erp增加充值数据 - // if(update.getJwcode().equals(94226013)){ + GoldTistV2.addCoinNew(order.getJwcode().toString(), 64, //充值永久金币 (double) (order.getPermanentGold() ) /100, order.getRemark(),(double) (order.getPermanentGold() ) /100, auditName, "金币充值"); GoldTistV2.addCoinNew(order.getJwcode().toString(), 63, //充值免费 (double) (order.getFreeDecember()+order.getFreeJune() ) /100, order.getRemark(),0, auditName, "金币充值"); - // } + }else if (order.getType()==2) { //退款 //2.获取对应的订单(退款订单号去掉开头"TK"即为对应原始订单) String oldOrderCode = order.getOrderCode().replaceFirst("TK_", ""); diff --git a/src/main/resources/mapper/RedMapper.xml b/src/main/resources/mapper/RedMapper.xml index 51046ad..56d6479 100644 --- a/src/main/resources/mapper/RedMapper.xml +++ b/src/main/resources/mapper/RedMapper.xml @@ -3,7 +3,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + INSERT INTO red_account (jwcode, type, sum) + VALUES ( + #{jwcode}, + #{type}, + #{sum}, + ) + ON DUPLICATE KEY UPDATE + sum = sum + #{sum} + + \ No newline at end of file