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 9dd1af7..909da10 100644 --- a/src/main/java/com/example/demo/mapper/Temporary/RedMapper.java +++ b/src/main/java/com/example/demo/mapper/Temporary/RedMapper.java @@ -22,4 +22,7 @@ public interface RedMapper { int upsertAndAdd(@Param("jwcode") Integer jwcode, @Param("type") Integer type, @Param("sum") BigDecimal sum); + int update(@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 462886a..98a3d88 100644 --- a/src/main/java/com/example/demo/service/Temporary/RedService.java +++ b/src/main/java/com/example/demo/service/Temporary/RedService.java @@ -2,6 +2,8 @@ package com.example.demo.service.Temporary; import com.example.demo.domain.vo.Red; import com.example.demo.domain.vo.RedList; +import com.example.demo.domain.vo.coin.ConsumeUser; +import com.example.demo.domain.vo.coin.Result; import java.math.BigDecimal; import java.util.List; @@ -29,4 +31,6 @@ public interface RedService { String checkRed(BigDecimal price,String linkId) throws Exception; //修改订单状态 void updateOrderStatus(String linkId) throws Exception; + //红包不足抵扣金额 + Result updateRed(ConsumeUser consumeUser) throws Exception; } 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 2229cb5..7c68626 100644 --- a/src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java @@ -3,34 +3,31 @@ package com.example.demo.serviceImpl.Temporary; import com.alibaba.fastjson.JSON; import com.example.demo.Util.BaseDES3; import com.example.demo.Util.BusinessException; +import com.example.demo.Util.GoldTistV2; import com.example.demo.config.RedTimeRuleConfig; -import com.example.demo.domain.vo.Red; +import com.example.demo.domain.entity.User; +import com.example.demo.domain.entity.UserGoldRecord; import com.example.demo.domain.vo.RedList; +import com.example.demo.domain.vo.coin.ConsumeUser; +import com.example.demo.domain.vo.coin.GoldUser; +import com.example.demo.domain.vo.coin.Result; import com.example.demo.exception.SystemException; import com.example.demo.mapper.Temporary.RedMapper; +import com.example.demo.mapper.coin.ConsumeMapper; +import com.example.demo.mapper.coin.UserMapper; import com.example.demo.service.Temporary.RedService; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.http.*; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; import java.io.IOException; import java.math.BigDecimal; -import java.net.ConnectException; -import java.net.SocketTimeoutException; import java.net.URI; import java.net.URLEncoder; import java.net.http.HttpClient; @@ -38,12 +35,10 @@ import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; import java.time.Duration; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeoutException; +import java.util.*; /** * @program: GOLD @@ -77,6 +72,10 @@ public class RedServiceImpl implements RedService { private RedMapper redMapper; @Autowired private RedTimeRuleConfig timeRuleConfig; + @Autowired + private ConsumeMapper consumeMapper; + @Autowired + private UserMapper userMapper; @Override public BigDecimal selectSum(Integer jwcode,Integer type) { if (jwcode == null){ @@ -294,6 +293,110 @@ public class RedServiceImpl implements RedService { throw new Exception("系统异常"); } } + @Transactional(rollbackFor = Exception.class) + @Override + public Result updateRed(ConsumeUser consumeUser) throws Exception { + if (consumeUser.getTaskGold() == null || consumeUser.getFreeGold() == null || consumeUser.getPermanentGold() == null) { + return Result.error("金币数量不能为空"); + } + if (consumeUser.getTaskGold().compareTo(BigDecimal.ZERO) < 0 || consumeUser.getFreeGold().compareTo(BigDecimal.ZERO) < 0 || consumeUser.getPermanentGold().compareTo(BigDecimal.ZERO) < 0) { + return Result.error("金币不能为负数"); + } + if (consumeUser.getJwcode() < 10000000 || consumeUser.getJwcode() > 99999999) { + return Result.error("精网号位数小于8位或大于8位"); + } + if (consumeUser.getAdminName() == null) { + return Result.error("管理员不能为空"); + } + GoldUser goldUser = userMapper.selectUser(consumeUser.getJwcode().toString()); + if (goldUser == null) { + return Result.error("用户不存在"); + } + UserGoldRecord userGoldRecord = new UserGoldRecord(); + + String orderNumber = UUID.randomUUID().toString().replaceAll("-", ""); + //订单号生成 + userGoldRecord.setOrderCode("XF_" + orderNumber); + userGoldRecord.setJwcode(consumeUser.getJwcode()); + userGoldRecord.setGoodsName("红包不足金币抵扣"); + userGoldRecord.setSumGold(-consumeUser.getSumGold().intValue()); + userGoldRecord.setPermanentGold(-consumeUser.getPermanentGold().intValue()); + // 获取当前月份(1-12) + int currentMonth = LocalDate.now().getMonthValue(); + GoldUser gold = userMapper.selectGold(consumeUser.getJwcode().toString()); + if (consumeUser.getFreeGold().compareTo(gold.getNowFreeDecember().add(gold.getNowFreeJune())) > 0 + || consumeUser.getPermanentGold().compareTo(gold.getNowPermanentGold()) > 0 + || consumeUser.getTaskGold().compareTo(gold.getNowTaskGold()) > 0) { + return Result.error("金币数量不足"); + } + // 根据当前月份设置对应字段 + if (currentMonth >= 1 && currentMonth <= 6) { + // 1-6月:设置6月额度,12月保持默认值 + if (consumeUser.getFreeGold().compareTo(gold.getNowFreeJune()) > 0) { + userGoldRecord.setFreeJune(-gold.getNowFreeJune().intValue()); + userGoldRecord.setFreeDecember(-(consumeUser.getFreeGold().subtract(gold.getNowFreeJune())).intValue()); + } else { + userGoldRecord.setFreeJune(-consumeUser.getFreeGold().intValue()); + userGoldRecord.setFreeDecember(0); + } + } else { + // 7-12月:设置12月额度,6月保持默认值 + if (consumeUser.getFreeGold().compareTo(gold.getNowFreeDecember()) > 0) { + userGoldRecord.setFreeDecember(-gold.getNowFreeDecember().intValue()); + userGoldRecord.setFreeJune(-(consumeUser.getFreeGold().subtract(gold.getNowFreeDecember())).intValue()); + } else { + userGoldRecord.setFreeDecember(-consumeUser.getFreeGold().intValue()); + userGoldRecord.setFreeJune(0); + } + } + //信息输入 + userGoldRecord.setTaskGold(-consumeUser.getTaskGold().intValue()); + userGoldRecord.setRemark(consumeUser.getRemark()); + userGoldRecord.setType((byte) 1); + userGoldRecord.setIsRefund((byte) 1); + userGoldRecord.setPayPlatform("金币系统"); + userGoldRecord.setAdminId(consumeUser.getAdminId()); + userGoldRecord.setAuditStatus(1); + userGoldRecord.setCreateTime(new Date()); + userGoldRecord.setPrice(consumeUser.getPrice()); + userGoldRecord.setPayTime(new Date()); + if (consumeUser.getPermanentGold().compareTo(BigDecimal.ZERO)!=0||consumeUser.getFreeGold().compareTo(BigDecimal.ZERO)!=0||consumeUser.getTaskGold().compareTo(BigDecimal.ZERO)!=0){ + // if(consumeUser.getJwcode().equals(94226013)){ + String result = GoldTistV2.addCoinNew(userGoldRecord.getJwcode().toString(), 65, + (double) (userGoldRecord.getPermanentGold() + userGoldRecord.getFreeDecember() + userGoldRecord.getFreeJune() + userGoldRecord.getTaskGold()) / 100, + userGoldRecord.getRemark(), 0, consumeUser.getAdminName(), userGoldRecord.getGoodsName()); +// System.out.println("9"+result+"9"); + result = result.replaceAll("[\r\n]", ""); + + //返回状态1加成功2减成功其他失败 -5 金币不足 -6 类型错误 -7签名错误 + if (!result.equals("2")) { + result = GoldTistV2.addCoinNew(userGoldRecord.getJwcode().toString(), 65, + (double) (userGoldRecord.getPermanentGold() + userGoldRecord.getFreeDecember() + userGoldRecord.getFreeJune() + userGoldRecord.getTaskGold()) / 100, + userGoldRecord.getRemark(), 0, consumeUser.getAdminName(), userGoldRecord.getGoodsName()); + //返回状态1加成功2减成功其他失败 -5 金币不足 -6 类型错误 -7签名错误 + if (!result.equals("2")) { + String errorMsg = "减金币失败,数据未进erp,返回状态:" + result; + log.error(errorMsg); // 保留日志记录,便于问题排查 + throw new SystemException(errorMsg); // 抛出系统异常,中断流程并传递错误信息 + } + } + } + consumeMapper.add(userGoldRecord); + consumeMapper.updateUserGold(userGoldRecord); + User user = new User(); + user.setJwcode(userGoldRecord.getJwcode()); + user.setCurrentPermanentGold(BigDecimal.valueOf(gold.getNowPermanentGold().intValue() - consumeUser.getPermanentGold().intValue())); + user.setCurrentFreeJune(BigDecimal.valueOf(gold.getNowFreeJune().intValue() + userGoldRecord.getFreeJune())); + user.setCurrentFreeDecember(BigDecimal.valueOf(gold.getNowFreeDecember().intValue() + userGoldRecord.getFreeDecember())); + user.setCurrentTaskGold(BigDecimal.valueOf(gold.getNowTaskGold().intValue() - consumeUser.getTaskGold().intValue())); + user.setConsumeNum(gold.getConsumeNum().intValue()); + user.setSumConsumePermanent(BigDecimal.valueOf(consumeUser.getPermanentGold().intValue())); + user.setSumConsumeFree(BigDecimal.valueOf(consumeUser.getFreeGold().intValue())); + user.setSumConsumeTask(BigDecimal.valueOf(consumeUser.getTaskGold().intValue())); + userMapper.updateGold(user); + redMapper.update(userGoldRecord.getJwcode(),consumeUser.getFlag(),userGoldRecord.getPrice()); + return Result.success(); + } @Override public BigDecimal selectRedSum(Integer jwcode) { diff --git a/src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java index 944af60..2456bff 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java @@ -94,7 +94,7 @@ public class ConsumeServiceImpl implements ConsumeService { } //新增消耗 - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public Result add(ConsumeUser consumeUser) { if (consumeUser.getTaskGold() == null || consumeUser.getFreeGold() == null || consumeUser.getPermanentGold() == null) { diff --git a/src/main/resources/mapper/RedMapper.xml b/src/main/resources/mapper/RedMapper.xml index 82d355c..160dd3e 100644 --- a/src/main/resources/mapper/RedMapper.xml +++ b/src/main/resources/mapper/RedMapper.xml @@ -13,6 +13,9 @@ ON DUPLICATE KEY UPDATE sum = sum + #{sum} + + update red set sum = sum - #{sum} where jwcode = #{jwcode} and type = #{type} +