diff --git a/src/main/java/com/example/demo/config/RedTimeRuleConfig.java b/src/main/java/com/example/demo/config/RedTimeRuleConfig.java index 4396b0b..c3ab6cc 100644 --- a/src/main/java/com/example/demo/config/RedTimeRuleConfig.java +++ b/src/main/java/com/example/demo/config/RedTimeRuleConfig.java @@ -13,7 +13,7 @@ import java.time.ZoneId; @Component public class RedTimeRuleConfig { // 充值开放时间:2025-12-04 20:00:00(北京时间) - private LocalDateTime rechargeStartTime = LocalDateTime.of(2025, 12, 4, 20, 0, 0); + private LocalDateTime rechargeStartTime = LocalDateTime.of(2025, 12, 4, 16, 0, 0); // 消费开放时间:2025-12-06 10:00:00(北京时间) private LocalDateTime consumeStartTime = LocalDateTime.of(2025, 12, 6, 10, 0, 0); diff --git a/src/main/java/com/example/demo/controller/coin/ConsumeController.java b/src/main/java/com/example/demo/controller/coin/ConsumeController.java index 4c99aa4..63a42ab 100644 --- a/src/main/java/com/example/demo/controller/coin/ConsumeController.java +++ b/src/main/java/com/example/demo/controller/coin/ConsumeController.java @@ -190,8 +190,7 @@ public class ConsumeController { // } catch (Exception e) { e.printStackTrace(); - String translatedErrorMsg = languageTranslationUtil.translate("请查看后端报错信息", lang); - return Result.error(translatedErrorMsg); + return Result.error(e.getMessage()); } } diff --git a/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java b/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java index e5f33cc..39764b4 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java +++ b/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java @@ -81,4 +81,6 @@ public class ConsumeUser implements Serializable { private List markets; // 地区列表 @ExcelIgnore private Integer flag; //是否为员工号 + @ExcelProperty("折扣金币") + private BigDecimal price; // 折扣金币 } diff --git a/src/main/java/com/example/demo/domain/vo/coin/GoldUser.java b/src/main/java/com/example/demo/domain/vo/coin/GoldUser.java index 515f82d..bb84ffc 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/GoldUser.java +++ b/src/main/java/com/example/demo/domain/vo/coin/GoldUser.java @@ -59,4 +59,6 @@ public class GoldUser { private Date firstRecharge; // 首充日期 @ExcelIgnore private List markets; // 地区列表 + @ExcelIgnore + private BigDecimal red; } 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 c34495e..8d7f250 100644 --- a/src/main/java/com/example/demo/service/Temporary/RedService.java +++ b/src/main/java/com/example/demo/service/Temporary/RedService.java @@ -14,6 +14,10 @@ import java.math.BigDecimal; **/ public interface RedService { BigDecimal selectSum(Integer jwcode, Integer type); - void addAmount(Integer jwcode,BigDecimal sum, Integer type); + + void addAmount(Integer jwcode,BigDecimal sum, Integer type); String sendJwcode(Integer jwcode); + + BigDecimal selectRedSum(Integer jwcode); + String sendConsumeJwcode(Integer jwcode, BigDecimal price); } 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 91041e7..35f9c42 100644 --- a/src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java @@ -7,9 +7,13 @@ 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 com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; 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 java.io.IOException; @@ -33,10 +37,13 @@ import java.time.format.DateTimeFormatter; @Slf4j @Service public class RedServiceImpl implements RedService { - private static final String BASE_URLProd = "http://39.101.133.168:8828/scms"; + @Value("${red.url}") + private String BASE_URLProd ; private static final String BASE_URLDev = "http://gf977328.natappfree.cc"; private static final String PATH = "/api/coupon/IssueRechargeRedPacket"; + private static final String PATHRED = "/api/coupon/getTotalDiscount"; + private static final String CONSUME_PATH = "/api/coupon/updateCostRedPacket"; private static final HttpClient CLIENT = HttpClient.newHttpClient(); @Autowired @@ -49,9 +56,9 @@ public class RedServiceImpl implements RedService { throw new BusinessException("未接受到精网号"); } if (redMapper.selectJwcode(jwcode)==false){ - throw new BusinessException("未找到该精网号"); + return BigDecimal.valueOf(0); } - if(redMapper.selectJwcode(jwcode)) + if (type == null){ throw new BusinessException("未接受到类型"); } @@ -62,7 +69,8 @@ public class RedServiceImpl implements RedService { } @Override - @Transactional(rollbackFor = Exception.class) + // @Transactional(rollbackFor = Exception.class) + @Transactional(propagation = Propagation.REQUIRES_NEW) public void addAmount(Integer jwcode, BigDecimal sum, Integer type) { // 1. 基础参数校验 validateParams(jwcode, type, sum); @@ -88,7 +96,7 @@ public class RedServiceImpl implements RedService { String body = JSON.toJSONString(java.util.Map.of("jwcode", jwcode)); HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(BASE_URLDev + PATH)) //URL记得换 + .uri(URI.create(BASE_URLProd + PATH)) //URL记得换 .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(body)) .build(); @@ -104,6 +112,61 @@ public class RedServiceImpl implements RedService { return "{\"success\":false,\"msg\":\"网络异常\"}"; } } + @Override + public String sendConsumeJwcode(Integer jwcode, BigDecimal price) { + try { + String body = JSON.toJSONString(java.util.Map.of("jwcode", jwcode,"discount",price)); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(BASE_URLProd + CONSUME_PATH)) //URL记得换 + .header("Content-Type", "application/json") + .POST(HttpRequest.BodyPublishers.ofString(body)) + .build(); + + HttpResponse resp = CLIENT.send(request, HttpResponse.BodyHandlers.ofString()); + + if (resp.statusCode() != 200) { + log.warn("红包接口异常,status:{},body:{}", resp.statusCode(), resp.body()); + } + return resp.body(); + } catch (IOException | InterruptedException e) { + log.error("调用红包接口失败,jwcode:{}", jwcode, e); + return "{\"success\":false,\"msg\":\"网络异常\"}"; + } + } + + @Override + public BigDecimal selectRedSum(Integer jwcode) { + try { + String body = JSON.toJSONString(java.util.Map.of("jwcode", jwcode)); + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create("http://sb29dfa2.natappfree.cc" + PATHRED)) //URL记得换 + .header("Content-Type", "application/json") + .POST(HttpRequest.BodyPublishers.ofString(body)) + .build(); + + HttpResponse resp = CLIENT.send(request, HttpResponse.BodyHandlers.ofString()); + // 解析 JSON + ObjectMapper mapper = new ObjectMapper(); + JsonNode rootNode = mapper.readTree(resp.body()); + +// 提取 data 字段 + if (rootNode.has("data")) { + JsonNode dataNode = rootNode.get("data"); + System.out.println("Data: " + dataNode); + return dataNode.decimalValue(); + } + + + if (resp.statusCode() != 200) { + log.warn("网络异常", resp.statusCode(), resp.body()); + } + return BigDecimal.valueOf(0); + } catch (IOException | InterruptedException e) { + log.error("网络异常", jwcode, e); + return BigDecimal.valueOf(0); + } + } // --- 校验方法 --- @@ -135,9 +198,6 @@ public class RedServiceImpl implements RedService { } 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")); diff --git a/src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java index 14df521..4b0ba19 100644 --- a/src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java @@ -373,7 +373,7 @@ public User getNameAndMarket(Integer jwcode) { case 3: cashRecord.setPayType("IOS内购"); cashRecord.setBankCode(gOrder.getIosTransactionId()); - cashRecord.setReceivedMarket("3"); + cashRecord.setReceivedMarket("4"); cashRecord.setPayload("IOS"); break; case 5: 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 4c5772d..d54eed7 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java @@ -120,16 +120,21 @@ public class AuditServiceImpl implements AuditService { //累充 - /* try { + try { BigDecimal sum = BigDecimal.valueOf( order.getPermanentGold()) - .divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + .divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP) ; redService.addAmount(order.getJwcode(), sum, 1); // ← 直接调你写好的方法! } catch (Exception e) { log.warn("红包累加失败,主流程继续 | jwcode={}", order.getJwcode(), e); - }*/ - redService.sendJwcode(order.getJwcode()); + } + try { + redService.sendJwcode(order.getJwcode()); + log.info("精网号发送成功 | jwcode={}", order.getJwcode()); + }catch (Exception e){ + log.warn("精网号发送失败,主流程继续 | jwcode={}", order.getJwcode(), e); + } //erp增加充值数据 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 9dc5362..e7f5cb5 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java @@ -11,6 +11,7 @@ import com.example.demo.exception.SystemException; import com.example.demo.mapper.coin.ConsumeMapper; 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.ConsumeService; import com.example.demo.service.coin.MarketService; import com.github.pagehelper.PageHelper; @@ -21,6 +22,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -50,6 +52,9 @@ public class ConsumeServiceImpl implements ConsumeService { @Autowired private MarketMapper marketMapper; + @Autowired + private RedService redService; + //消耗明细 @Override public PageInfo selectAll(Integer pageNum, Integer pageSize, ConsumeUser consumeUser){ @@ -191,7 +196,17 @@ public class ConsumeServiceImpl implements ConsumeService { user.setSumConsumeTask(BigDecimal.valueOf(-consumeUser.getTaskGold().intValue())); userMapper.updateGold(user); + //累消 + try { + BigDecimal sum = (consumeUser.getPrice()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP ); + + redService.addAmount(consumeUser.getJwcode(),sum, 2); + }catch (Exception e){ + log.warn("消耗累加失败,主流程继续 | jwcode={}", consumeUser.getJwcode(), e); + } + + redService.sendConsumeJwcode(consumeUser.getJwcode(),(consumeUser.getPrice().subtract(consumeUser.getSumGold())).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP)); // } return Result.success(); } diff --git a/src/main/java/com/example/demo/serviceImpl/coin/UserServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/UserServiceImpl.java index 50fa851..cda2169 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/UserServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/UserServiceImpl.java @@ -8,6 +8,7 @@ import com.example.demo.domain.vo.coin.GoldUser; import com.example.demo.domain.vo.coin.Result; 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.UserService; import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; @@ -15,6 +16,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +import java.math.BigDecimal; import java.util.Arrays; import java.util.Date; import java.util.List; @@ -37,6 +39,8 @@ public class UserServiceImpl implements UserService { @Autowired private MarketMapper marketMapper; + @Autowired + private RedService redService; //查找用户部分信息 @Override @@ -52,7 +56,11 @@ public class UserServiceImpl implements UserService { if (markets.contains("9") || markets.contains("9999")){ markets=null; } + BigDecimal redSum = redService.selectRedSum(Integer.parseInt(jwcode)); + GoldUser user = userMapper.selectUserCard(jwcode,markets); + user.setRed(redSum); + return Result.success(user); } else{ diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index cbc148b..9e9dc79 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -100,5 +100,7 @@ bean: url: http://39.101.133.168:8828/hljwgo/api/wallet/recharge consume: url: http://39.101.133.168:8828/hljwgo/api/wallet/pay +red: + url: http://39.101.133.168:8828/scms server: port: 10704 \ No newline at end of file diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index db96594..fc5e050 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -103,6 +103,7 @@ bean: url: http://api.homilychart.com/hljwgo/api/wallet/recharge consume: url: http://api.homilychart.com/hljwgo/api/wallet/pay - +red: + url: https://api.homilychart.com/scms server: port: 10705 diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index deec043..591474d 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -100,6 +100,9 @@ bean: url: http://39.101.133.168:8828/hljwgo/api/wallet/recharge consume: url: http://39.101.133.168:8828/hljwgo/api/wallet/pay + +red: + url: http://39.101.133.168:8828/scms server: port: 8081 diff --git a/src/main/resources/mapper/RedMapper.xml b/src/main/resources/mapper/RedMapper.xml index 56d6479..82d355c 100644 --- a/src/main/resources/mapper/RedMapper.xml +++ b/src/main/resources/mapper/RedMapper.xml @@ -4,11 +4,11 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - INSERT INTO red_account (jwcode, type, sum) + INSERT INTO red (jwcode, type, sum) VALUES ( #{jwcode}, #{type}, - #{sum}, + #{sum} ) ON DUPLICATE KEY UPDATE sum = sum + #{sum}