You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

367 lines
19 KiB

8 months ago
7 months ago
3 months ago
8 months ago
8 months ago
8 months ago
8 months ago
2 months ago
8 months ago
8 months ago
8 months ago
8 months ago
6 months ago
6 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
7 months ago
8 months ago
3 months ago
3 months ago
3 months ago
  1. package com.example.demo.serviceImpl.coin;
  2. import com.example.demo.Util.GoldTistV2;
  3. import com.example.demo.Util.SimpleIdGenerator;
  4. import com.example.demo.domain.entity.User;
  5. import com.example.demo.domain.entity.UserGoldRecord;
  6. import com.example.demo.domain.vo.coin.*;
  7. import com.example.demo.exception.SystemException;
  8. import com.example.demo.mapper.coin.ConsumeMapper;
  9. import com.example.demo.mapper.coin.MarketMapper;
  10. import com.example.demo.mapper.coin.UserMapper;
  11. import com.example.demo.service.Temporary.RedService;
  12. import com.example.demo.service.coin.ConsumeService;
  13. import com.example.demo.service.coin.MarketService;
  14. import com.github.pagehelper.PageHelper;
  15. import com.github.pagehelper.PageInfo;
  16. import lombok.extern.slf4j.Slf4j;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.transaction.annotation.Transactional;
  20. import java.math.BigDecimal;
  21. import java.math.RoundingMode;
  22. import java.time.LocalDate;
  23. import java.time.LocalDateTime;
  24. import java.time.format.DateTimeFormatter;
  25. import java.util.*;
  26. import java.util.function.Function;
  27. import java.util.stream.Collectors;
  28. /**
  29. * @program: gold-java
  30. * @ClassName ConsumeServiceImpl
  31. * @description: 消费模块
  32. * @author: Double
  33. * @create: 202506-23 13:58
  34. * @Version 1.0
  35. **/
  36. @Slf4j
  37. @Service
  38. public class ConsumeServiceImpl implements ConsumeService {
  39. @Autowired
  40. private ConsumeMapper consumeMapper;
  41. @Autowired
  42. private UserMapper userMapper;
  43. @Autowired
  44. private MarketMapper marketMapper;
  45. @Autowired
  46. private RedService redService;
  47. //消耗明细
  48. @Override
  49. public PageInfo<ConsumeUser> selectAll(Integer pageNum, Integer pageSize, ConsumeUser consumeUser){
  50. //获取市场id
  51. List<String> markets = marketMapper.getMarketIds(consumeUser.getMarkets());
  52. consumeUser.setMarkets(markets);
  53. PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
  54. List<ConsumeUser> consumeUsers = consumeMapper.selectAll(consumeUser);
  55. return new PageInfo<>(consumeUsers);
  56. }
  57. //消耗金币统计
  58. @Override
  59. public Gold statsGold(ConsumeUser consumeUser) {
  60. //获取市场id
  61. List<String> markets = marketMapper.getMarketIds(consumeUser.getMarkets());
  62. if (markets.contains("9") || markets.contains("9999")){
  63. markets=null;
  64. }
  65. consumeUser.setMarkets(markets);
  66. Gold gold = consumeMapper.sumGold(consumeUser);
  67. return gold;
  68. }
  69. //消耗明细筛选
  70. @Override
  71. public PageInfo<ConsumeUser> selectBy(Integer pageNum, Integer pageSize, ConsumeUser consumeUser) {
  72. //获取市场id
  73. List<String> markets = marketMapper.getMarketIds(consumeUser.getMarkets());
  74. if (markets.contains("9") || markets.contains("9999")){
  75. markets=null;
  76. }
  77. consumeUser.setMarkets(markets);
  78. PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
  79. List<ConsumeUser> list = consumeMapper.selectBy(consumeUser);
  80. // 构造退款订单号
  81. List<String> refundOrderCodes = list.stream()
  82. .filter(v -> v.getIsRefund() != null && v.getIsRefund() == 1)
  83. .map(v -> "TK_" + v.getOrderCode())
  84. .collect(Collectors.toList());
  85. // 查询退款订单
  86. List<ConsumeUser> refundList = consumeMapper.selectRefund(refundOrderCodes);
  87. // 退款订单转 Map(order_code → refund)
  88. Map<String, ConsumeUser> refundMap = refundList.stream()
  89. .collect(Collectors.toMap(
  90. ConsumeUser::getOrderCode,
  91. Function.identity(),
  92. (a, b) -> a
  93. ));
  94. // 组装退款信息
  95. for (ConsumeUser vo : list) {
  96. ConsumeUser refund = refundMap.get("TK_" + vo.getOrderCode());
  97. if (refund != null) {
  98. vo.setRefundSumGold(refund.getSumGold());
  99. vo.setRefundPermanentGold(refund.getPermanentGold());
  100. BigDecimal refundFree =
  101. (refund.getFreeGold() == null ? BigDecimal.ZERO : refund.getFreeGold());
  102. vo.setRefundFreeGold(refundFree);
  103. vo.setRefundTaskGold(refund.getTaskGold());
  104. vo.setRefundModel(refund.getRefundModel());
  105. } else {
  106. // 当没有退款数据时,设置默认值为0
  107. vo.setRefundSumGold(BigDecimal.ZERO);
  108. vo.setRefundPermanentGold(BigDecimal.ZERO);
  109. vo.setRefundFreeGold(BigDecimal.ZERO);
  110. vo.setRefundTaskGold(BigDecimal.ZERO);
  111. vo.setRefundModel(null);
  112. }
  113. }
  114. return new PageInfo<>(list);
  115. }
  116. //新增消耗
  117. @Transactional(rollbackFor = Exception.class)
  118. @Override
  119. public Result add(ConsumeUser consumeUser) {
  120. if (consumeUser.getTaskGold() == null || consumeUser.getFreeGold() == null || consumeUser.getPermanentGold() == null) {
  121. return Result.error("金币数量不能为空");
  122. }
  123. if (consumeUser.getTaskGold().compareTo(BigDecimal.ZERO) < 0 || consumeUser.getFreeGold().compareTo(BigDecimal.ZERO) < 0 || consumeUser.getPermanentGold().compareTo(BigDecimal.ZERO) < 0) {
  124. return Result.error("金币不能为负数");
  125. }
  126. if (consumeUser.getJwcode() < 10000000 || consumeUser.getJwcode() > 99999999) {
  127. return Result.error("精网号位数小于8位或大于8位");
  128. }
  129. if (consumeUser.getAdminName() == null) {
  130. return Result.error("管理员不能为空");
  131. }
  132. GoldUser goldUser = userMapper.selectUser(consumeUser.getJwcode().toString());
  133. if (goldUser == null) {
  134. return Result.error("用户不存在");
  135. }
  136. UserGoldRecord userGoldRecord = new UserGoldRecord();
  137. String orderNumber = UUID.randomUUID().toString().replaceAll("-", "");
  138. //订单号生成
  139. userGoldRecord.setOrderCode("XF_" + orderNumber);
  140. userGoldRecord.setJwcode(consumeUser.getJwcode());
  141. userGoldRecord.setGoodsName(consumeUser.getGoodsName());
  142. userGoldRecord.setSumGold(-consumeUser.getSumGold().intValue());
  143. userGoldRecord.setPermanentGold(-consumeUser.getPermanentGold().intValue());
  144. // 获取当前月份(1-12)
  145. int currentMonth = LocalDate.now().getMonthValue();
  146. GoldUser gold = userMapper.selectGold(consumeUser.getJwcode().toString());
  147. if (consumeUser.getFreeGold().compareTo(gold.getNowFreeDecember().add(gold.getNowFreeJune())) > 0
  148. || consumeUser.getPermanentGold().compareTo(gold.getNowPermanentGold()) > 0
  149. || consumeUser.getTaskGold().compareTo(gold.getNowTaskGold()) > 0) {
  150. return Result.error("金币数量不足");
  151. }
  152. // 根据当前月份设置对应字段
  153. if (currentMonth >= 1 && currentMonth <= 6) {
  154. // 1-6月:设置6月额度,12月保持默认值
  155. if (consumeUser.getFreeGold().compareTo(gold.getNowFreeJune()) > 0) {
  156. userGoldRecord.setFreeJune(-gold.getNowFreeJune().intValue());
  157. userGoldRecord.setFreeDecember(-(consumeUser.getFreeGold().subtract(gold.getNowFreeJune())).intValue());
  158. } else {
  159. userGoldRecord.setFreeJune(-consumeUser.getFreeGold().intValue());
  160. userGoldRecord.setFreeDecember(0);
  161. }
  162. } else {
  163. // 7-12月:设置12月额度,6月保持默认值
  164. if (consumeUser.getFreeGold().compareTo(gold.getNowFreeDecember()) > 0) {
  165. userGoldRecord.setFreeDecember(-gold.getNowFreeDecember().intValue());
  166. userGoldRecord.setFreeJune(-(consumeUser.getFreeGold().subtract(gold.getNowFreeDecember())).intValue());
  167. } else {
  168. userGoldRecord.setFreeDecember(-consumeUser.getFreeGold().intValue());
  169. userGoldRecord.setFreeJune(0);
  170. }
  171. }
  172. //信息输入
  173. userGoldRecord.setTaskGold(-consumeUser.getTaskGold().intValue());
  174. userGoldRecord.setRemark(consumeUser.getRemark());
  175. userGoldRecord.setType((byte) 1);
  176. userGoldRecord.setIsRefund((byte) 0);
  177. userGoldRecord.setPayPlatform("金币系统");
  178. userGoldRecord.setAdminId(consumeUser.getAdminId());
  179. userGoldRecord.setAuditStatus(1);
  180. userGoldRecord.setCreateTime(new Date());
  181. userGoldRecord.setPrice( consumeUser.getPrice());
  182. userGoldRecord.setPayTime(new Date());
  183. userGoldRecord.setLinkId(SimpleIdGenerator.generateId());
  184. if (consumeUser.getPermanentGold().compareTo(BigDecimal.ZERO)!=0||consumeUser.getFreeGold().compareTo(BigDecimal.ZERO)!=0||consumeUser.getTaskGold().compareTo(BigDecimal.ZERO)!=0){
  185. // if(consumeUser.getJwcode().equals(94226013)){
  186. String result = GoldTistV2.addCoinNew(userGoldRecord.getJwcode().toString(), 65,
  187. (double) (userGoldRecord.getPermanentGold() + userGoldRecord.getFreeDecember() + userGoldRecord.getFreeJune() + userGoldRecord.getTaskGold()) / 100,
  188. userGoldRecord.getLinkId(), userGoldRecord.getRemark(),0, consumeUser.getAdminName(), userGoldRecord.getGoodsName());
  189. // System.out.println("9"+result+"9");
  190. result = result.replaceAll("[\r\n]", "");
  191. //返回状态1加成功2减成功其他失败 -5 金币不足 -6 类型错误 -7签名错误
  192. if (!result.equals("2")) {
  193. result = GoldTistV2.addCoinNew(userGoldRecord.getJwcode().toString(), 65,
  194. (double) (userGoldRecord.getPermanentGold() + userGoldRecord.getFreeDecember() + userGoldRecord.getFreeJune() + userGoldRecord.getTaskGold()) / 100,
  195. userGoldRecord.getLinkId(), userGoldRecord.getRemark(), 0, consumeUser.getAdminName(), userGoldRecord.getGoodsName());
  196. //返回状态1加成功2减成功其他失败 -5 金币不足 -6 类型错误 -7签名错误
  197. if (!result.equals("2")) {
  198. String errorMsg = "减金币失败,数据未进erp,返回状态:" + result;
  199. log.error(errorMsg); // 保留日志记录,便于问题排查
  200. throw new SystemException(errorMsg); // 抛出系统异常,中断流程并传递错误信息
  201. }
  202. }
  203. }
  204. //0金币消耗,往erp传一条金币为空的记录
  205. else if (consumeUser.getPermanentGold().compareTo(BigDecimal.ZERO)==0&&consumeUser.getFreeGold().compareTo(BigDecimal.ZERO)==0&&consumeUser.getTaskGold().compareTo(BigDecimal.ZERO)==0){
  206. GoldTistV2.addCoinRecordNew(String.valueOf(consumeUser.getJwcode()), consumeUser.getRemark(),consumeUser.getAdminName(),consumeUser.getGoodsName());
  207. }
  208. consumeMapper.add(userGoldRecord);
  209. consumeMapper.updateUserGold(userGoldRecord);
  210. User user = new User();
  211. user.setJwcode(userGoldRecord.getJwcode());
  212. user.setCurrentPermanentGold(BigDecimal.valueOf(gold.getNowPermanentGold().intValue() - consumeUser.getPermanentGold().intValue()));
  213. user.setCurrentFreeJune(BigDecimal.valueOf(gold.getNowFreeJune().intValue() + userGoldRecord.getFreeJune()));
  214. user.setCurrentFreeDecember(BigDecimal.valueOf(gold.getNowFreeDecember().intValue() + userGoldRecord.getFreeDecember()));
  215. user.setCurrentTaskGold(BigDecimal.valueOf(gold.getNowTaskGold().intValue() - consumeUser.getTaskGold().intValue()));
  216. user.setConsumeNum(gold.getConsumeNum().intValue() + 1);
  217. user.setSumConsumePermanent(BigDecimal.valueOf(-consumeUser.getPermanentGold().intValue()));
  218. user.setSumConsumeFree(BigDecimal.valueOf(-consumeUser.getFreeGold().intValue()));
  219. user.setSumConsumeTask(BigDecimal.valueOf(-consumeUser.getTaskGold().intValue()));
  220. userMapper.updateGold(user);
  221. //累消
  222. try {
  223. BigDecimal sum = (consumeUser.getPrice()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP );
  224. redService.addAmount(consumeUser.getJwcode(),sum, 2);
  225. }catch (Exception e){
  226. log.warn("消耗累加失败,主流程继续 | jwcode={}", consumeUser.getJwcode(), e);
  227. }
  228. redService.sendConsumeJwcode(consumeUser.getJwcode(),consumeUser.getRedIds(),userGoldRecord.getLinkId());
  229. // }
  230. //data返回订单号和创建时间
  231. OrderResultVO resultVO = OrderResultVO.build("XF_" + orderNumber,userGoldRecord.getCreateTime());
  232. return Result.success(resultVO);
  233. }
  234. @Override
  235. public Result addDC(ConsumeUser consumeUser) {
  236. if (consumeUser.getJwcode()==null||consumeUser.getJwcode()<10000000||consumeUser.getJwcode()>99999999){
  237. throw new SystemException("精网号位数小于8位或大于8位");
  238. }
  239. if (consumeUser.getSumGold()==null||consumeUser.getSumGold().compareTo(BigDecimal.ZERO)<0){
  240. throw new SystemException("消费金币不能小于0");
  241. }
  242. String result = GoldTistV2.addDCCoinNew(consumeUser.getJwcode().toString(),68,-consumeUser.getSumGold().doubleValue(),"","DC金币消耗",0,"DC","DC金币消耗");
  243. String cleanResult = result.replaceAll("\\s+", "");
  244. if ("2".equals(cleanResult)) {
  245. return Result.success();
  246. } else {
  247. throw new SystemException(String.format("金币发放失败:类型错误(%S),jwcode=%s", result,consumeUser.getJwcode()));
  248. }
  249. }
  250. //
  251. // @Transactional
  252. // @Override
  253. // public Result addRefund(ConsumeUser consumeUser) {
  254. // if (consumeUser.getTaskGold() == null || consumeUser.getFreeGold() == null || consumeUser.getPermanentGold() == null) {
  255. // return Result.error("金币数量不能为空");
  256. // }
  257. // if (consumeUser.getTaskGold().compareTo(BigDecimal.ZERO) < 0 || consumeUser.getFreeGold().compareTo(BigDecimal.ZERO) < 0 || consumeUser.getPermanentGold().compareTo(BigDecimal.ZERO) < 0) {
  258. // return Result.error("金币不能为负数");
  259. // }
  260. // if(consumeUser.getJwcode()<10000000||consumeUser.getJwcode()>99999999)
  261. // {
  262. // return Result.error("精网号位数小于8位或大于8位");
  263. // }
  264. // if(consumeUser.getAdminName()==null){
  265. // return Result.error("管理员不能为空");
  266. // }
  267. // GoldUser goldUser = userMapper.selectUser(consumeUser.getJwcode().toString());
  268. // if (goldUser == null) {
  269. // return Result.error("用户不存在");
  270. // }
  271. // UserGoldRecord userGoldRecord = new UserGoldRecord();
  272. //
  273. // String orderNumber = UUID.randomUUID().toString().replaceAll("-", "");
  274. // //订单号生成
  275. // userGoldRecord.setOrderCode("TKCZ_" + orderNumber);
  276. // userGoldRecord.setJwcode(consumeUser.getJwcode());
  277. // userGoldRecord.setGoodsName(consumeUser.getGoodsName());
  278. // userGoldRecord.setSumGold(-consumeUser.getSumGold().intValue());
  279. // userGoldRecord.setPermanentGold(-consumeUser.getPermanentGold().intValue());
  280. // // 获取当前月份(1-12)
  281. // int currentMonth = LocalDate.now().getMonthValue();
  282. // GoldUser gold = userMapper.selectGold(consumeUser.getJwcode().toString());
  283. // if (consumeUser.getFreeGold().compareTo(gold.getNowFreeDecember().add(gold.getNowFreeJune())) > 0
  284. // || consumeUser.getPermanentGold().compareTo(gold.getNowPermanentGold()) > 0
  285. // || consumeUser.getTaskGold().compareTo(gold.getNowTaskGold()) > 0) {
  286. // return Result.error("金币数量不足");
  287. // }
  288. // // 根据当前月份设置对应字段
  289. // if (currentMonth >= 1 && currentMonth <= 6) {
  290. // // 1-6月:设置6月额度,12月保持默认值
  291. // if (consumeUser.getFreeGold().compareTo(gold.getNowFreeJune()) > 0) {
  292. // userGoldRecord.setFreeJune(-gold.getNowFreeJune().intValue());
  293. // userGoldRecord.setFreeDecember(-(consumeUser.getFreeGold().subtract(gold.getNowFreeJune())).intValue());
  294. // } else {
  295. // userGoldRecord.setFreeJune(-consumeUser.getFreeGold().intValue());
  296. // userGoldRecord.setFreeDecember(0);
  297. // }
  298. // } else {
  299. // // 7-12月:设置12月额度,6月保持默认值
  300. // if (consumeUser.getFreeGold().compareTo(gold.getNowFreeDecember()) > 0) {
  301. // userGoldRecord.setFreeDecember(-gold.getNowFreeDecember().intValue());
  302. // userGoldRecord.setFreeJune(-(consumeUser.getFreeGold().subtract(gold.getNowFreeDecember())).intValue());
  303. // } else {
  304. // userGoldRecord.setFreeDecember(-consumeUser.getFreeGold().intValue());
  305. // userGoldRecord.setFreeJune(0);
  306. // }
  307. // }
  308. // //信息输入
  309. // userGoldRecord.setTaskGold(-consumeUser.getTaskGold().intValue());
  310. // userGoldRecord.setRemark(consumeUser.getRemark());
  311. // userGoldRecord.setType((byte) 2);
  312. // userGoldRecord.setAuditStatus(0);
  313. // userGoldRecord.setPayPlatform("金币系统");
  314. // userGoldRecord.setRefundType("金币退款");
  315. // userGoldRecord.setGoodsName("金币退款");
  316. // userGoldRecord.setRefundModel((byte) 0);
  317. // userGoldRecord.setAdminId(consumeUser.getAdminId());
  318. // userGoldRecord.setCreateTime(new Date());
  319. // userGoldRecord.setPayTime(new Date());
  320. // consumeMapper.addRefund(userGoldRecord);
  321. // consumeMapper.updateUserGold(userGoldRecord);
  322. // User user = new User();
  323. // user.setJwcode(userGoldRecord.getJwcode());
  324. // user.setCurrentPermanentGold(BigDecimal.valueOf(gold.getNowPermanentGold().intValue() - consumeUser.getPermanentGold().intValue()));
  325. // user.setCurrentFreeJune(BigDecimal.valueOf(gold.getNowFreeJune().intValue() + userGoldRecord.getFreeJune()));
  326. // user.setCurrentFreeDecember(BigDecimal.valueOf(gold.getNowFreeDecember().intValue() + userGoldRecord.getFreeDecember()));
  327. // user.setCurrentTaskGold(BigDecimal.valueOf(gold.getNowTaskGold().intValue() - consumeUser.getTaskGold().intValue()));
  328. // user.setConsumeNum(gold.getConsumeNum().intValue() + 1);
  329. // user.setSumConsumePermanent(BigDecimal.valueOf(-consumeUser.getPermanentGold().intValue()));
  330. // user.setSumConsumeFree(BigDecimal.valueOf(-consumeUser.getFreeGold().intValue()));
  331. // user.setSumConsumeTask(BigDecimal.valueOf(-consumeUser.getTaskGold().intValue()));
  332. // userMapper.updateGold(user);
  333. // // if(consumeUser.getJwcode().equals(94226013)){
  334. // GoldTistV2.addCoinNew(userGoldRecord.getJwcode().toString(), 65,
  335. // (double) (userGoldRecord.getPermanentGold() + userGoldRecord.getFreeDecember() + userGoldRecord.getFreeJune() + userGoldRecord.getTaskGold()) / 100,
  336. // userGoldRecord.getRemark(), ((double) userGoldRecord.getPermanentGold() / 100), consumeUser.getAdminName(), userGoldRecord.getGoodsName());
  337. // // }
  338. // return Result.success();
  339. // }
  340. }