Browse Source

12.3 冲刺计划累计充值逻辑修改

huangqizheng/feature-20251203174217-冲刺计划
huangqizhen 1 month ago
parent
commit
72d63cbc16
  1. 23
      src/main/java/com/example/demo/config/RedTimeRuleConfig.java
  2. 6
      src/main/java/com/example/demo/mapper/Temporary/RedMapper.java
  3. 1
      src/main/java/com/example/demo/service/Temporary/RedService.java
  4. 70
      src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java
  5. 24
      src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java
  6. 15
      src/main/resources/mapper/RedMapper.xml

23
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");
}

6
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);
}

1
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);
}

70
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 + " 后操作");
}
}
}
}

24
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_", "");

15
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">
<mapper namespace="com.example.demo.mapper.Temporary.RedMapper">
<insert id="upsertAndAdd" parameterType="map">
INSERT INTO red_account (jwcode, type, sum)
VALUES (
#{jwcode},
#{type},
#{sum},
)
ON DUPLICATE KEY UPDATE
sum = sum + #{sum}
</insert>
<select id="selectSum" resultType="java.math.BigDecimal">
select sum from red where jwcode=#{jwcode} and type=#{type}
</select>
<select id="selectJwcode" resultType="boolean">
SELECT EXISTS(
SELECT 1 FROM red WHERE jwcode = #{jwcode}
)
</select>
</mapper>
Loading…
Cancel
Save