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.

309 lines
15 KiB

7 months ago
7 months ago
7 months ago
7 months ago
  1. package com.example.demo.serviceImpl.coin;
  2. import com.example.demo.Util.GoldTistV2;
  3. import com.example.demo.domain.entity.User;
  4. import com.example.demo.domain.entity.UserGoldRecord;
  5. import com.example.demo.domain.vo.coin.Gold;
  6. import com.example.demo.domain.vo.coin.GoldUser;
  7. import com.example.demo.domain.vo.coin.RechargeAudit;
  8. import com.example.demo.domain.vo.coin.RefundAudit;
  9. import com.example.demo.mapper.coin.AuditMapper;
  10. import com.example.demo.mapper.coin.MarketMapper;
  11. import com.example.demo.mapper.coin.UserMapper;
  12. import com.example.demo.service.Temporary.RedService;
  13. import com.example.demo.service.coin.AdminService;
  14. import com.example.demo.service.coin.AuditService;
  15. import com.example.demo.service.coin.GeneralService;
  16. import com.github.pagehelper.PageHelper;
  17. import com.github.pagehelper.PageInfo;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.stereotype.Service;
  21. import org.springframework.transaction.annotation.Transactional;
  22. import java.math.BigDecimal;
  23. import java.math.RoundingMode;
  24. import java.util.Calendar;
  25. import java.util.Date;
  26. import java.util.GregorianCalendar;
  27. import java.util.List;
  28. /**
  29. * @program: gold-java
  30. * @ClassName AuditServiceImpl
  31. * @description: 审核模块
  32. * @author: Ethan
  33. * @create: 202506-19 17:38
  34. * @Version 1.0
  35. **/
  36. @Service
  37. @Slf4j
  38. public class AuditServiceImpl implements AuditService {
  39. @Autowired
  40. private AuditMapper auditMapper;
  41. @Autowired
  42. private UserMapper userMapper;
  43. @Autowired
  44. private AdminService adminService;
  45. @Autowired
  46. private GeneralService generalService;
  47. @Autowired
  48. private MarketMapper marketMapper;
  49. @Autowired
  50. private RedService redService;
  51. /*
  52. 审核订单并修改用户余额等
  53. */
  54. @Transactional
  55. @Override
  56. public boolean auditOrder(String token, String orderCode, Integer auditId, Integer action,String rejectReason) {
  57. UserGoldRecord order=auditMapper.selectOrderByOrderCode(orderCode);
  58. Date date =new Date();
  59. if (order == null || order.getAuditStatus() != 0) {
  60. throw new IllegalArgumentException("订单不存在或已被审核");
  61. }
  62. //更新订单的审核状态和审核人
  63. UserGoldRecord updateOrder = new UserGoldRecord();
  64. updateOrder.setOrderCode(orderCode);
  65. updateOrder.setAuditId(auditId);
  66. String auditName = auditMapper.getName(auditId);
  67. //判断是通过还是驳回
  68. if (action==2){ //驳回
  69. if (order.getType()==2) { //退款
  70. //2.获取对应的订单(退款订单号去掉开头"TK"即为对应原始订单)
  71. String oldOrderCode = order.getOrderCode().replaceFirst("TK_", "");
  72. //3.更新消费订单是否已退款状态为0
  73. UserGoldRecord oldOrder = auditMapper.selectAllOrderByOrderCode(oldOrderCode);
  74. if (oldOrderCode != null&&(oldOrder.getType()==1||oldOrder.getType()==0)){ //确保是消费或充值订单
  75. auditMapper.updateOrderRefund(oldOrderCode,(byte)0);
  76. }else {
  77. throw new IllegalArgumentException("找不到对应的订单或不是有效订单");
  78. } }
  79. updateOrder.setAuditStatus(2);
  80. updateOrder.setRejectReason(rejectReason);
  81. updateOrder.setAuditTime(new Date());
  82. // 执行审核更新
  83. auditMapper.updateOrder(updateOrder);
  84. }else if (action==1) { //通过
  85. //判断是充值还是退款
  86. if (order.getType()==0){ //充值
  87. //更新用户余额
  88. User update = new User();
  89. Date oldFirstRecharge = userMapper.getFirstRecharge(order.getJwcode().toString());
  90. update.setJwcode(order.getJwcode()); //精网号
  91. update.setSumPermanentGold(BigDecimal.valueOf(order.getPermanentGold())); //历史永久金币
  92. update.setSumFreeJune(BigDecimal.valueOf(order.getFreeJune())); //历史六月免费金币
  93. update.setSumFreeDecember(BigDecimal.valueOf(order.getFreeDecember())); //历史十二月免费金币
  94. update.setSumTaskGold(BigDecimal.valueOf(order.getTaskGold())); //历史任务金币
  95. update.setCurrentPermanentGold(BigDecimal.valueOf(order.getPermanentGold())); //当前永久金币
  96. update.setCurrentFreeJune(BigDecimal.valueOf(order.getFreeJune())); //当前六月免费金币
  97. update.setCurrentFreeDecember(BigDecimal.valueOf(order.getFreeDecember())); //当前十二月免费金币
  98. update.setCurrentTaskGold(BigDecimal.valueOf(order.getTaskGold())); //当前任务金币
  99. update.setRechargeNum(1); //充值次数加一
  100. /*
  101. 判断是否更新首充时间
  102. 1.用户当前首充时间为空
  103. 2.用户当前首充时间小于当前时间
  104. 3.用户当前首充时间等于2020-01-01 00:00:00
  105. */
  106. // 构造 2020-01-01 00:00:00
  107. Date placeholder = new GregorianCalendar(2020, Calendar.JANUARY, 1, 0, 0).getTime();
  108. if(oldFirstRecharge== null||oldFirstRecharge.after(date)||placeholder.equals(oldFirstRecharge)){
  109. auditMapper.updateFirstRecharge(order.getJwcode());//设置首充时间为当前时间
  110. }
  111. auditMapper.updateUserGold(update);
  112. //累充
  113. try {
  114. BigDecimal sum = BigDecimal.valueOf(
  115. order.getPermanentGold())
  116. .divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
  117. redService.addAmount(order.getJwcode(), sum, 1); // ← 直接调你写好的方法!
  118. } catch (Exception e) {
  119. log.warn("红包累加失败,主流程继续 | jwcode={}", order.getJwcode(), e);
  120. }
  121. try {
  122. redService.sendJwcode(order.getJwcode());
  123. log.info("精网号发送成功 | jwcode={}", order.getJwcode());
  124. }catch (Exception e){
  125. log.warn("精网号发送失败,主流程继续 | jwcode={}", order.getJwcode(), e);
  126. }
  127. //erp增加充值数据
  128. GoldTistV2.addCoinNew(order.getJwcode().toString(), 64, //充值永久金币
  129. (double) (order.getPermanentGold() ) /100,
  130. order.getRemark(),(double) (order.getPermanentGold() ) /100, auditName, "金币充值");
  131. GoldTistV2.addCoinNew(order.getJwcode().toString(), 63, //充值免费
  132. (double) (order.getFreeDecember()+order.getFreeJune() ) /100,
  133. order.getRemark(),0, auditName, "金币充值");
  134. }else if (order.getType()==2) { //退款
  135. //2.获取对应的订单(退款订单号去掉开头"TK"即为对应原始订单)
  136. String oldOrderCode = order.getOrderCode().replaceFirst("TK_", "");
  137. UserGoldRecord oldOrder = auditMapper.selectAllOrderByOrderCode(oldOrderCode);
  138. //更新用户余额
  139. User update = new User();
  140. update.setJwcode(order.getJwcode());
  141. update.setCurrentPermanentGold(BigDecimal.valueOf(order.getPermanentGold())); //当前永久金币
  142. update.setCurrentFreeJune(BigDecimal.valueOf(order.getFreeJune())); //当前六月免费金币
  143. update.setCurrentFreeDecember(BigDecimal.valueOf(order.getFreeDecember())); //当前十二月免费金币
  144. update.setCurrentTaskGold(BigDecimal.valueOf(order.getTaskGold())); //当前任务金币
  145. auditMapper.updateUserGold(update);
  146. //erp增加退款数据
  147. if(oldOrder.getType()==1){ //消费
  148. GoldTistV2.addCoinNew(order.getJwcode().toString(), 55, //退款免费-商品
  149. (double) (order.getFreeDecember()+order.getFreeJune()) /100,
  150. order.getRemark(),0, auditName, "退款商品"+order.getGoodsName());
  151. GoldTistV2.addCoinNew(order.getJwcode().toString(), 56, //退款永久-商品
  152. (double) (order.getPermanentGold()) /100,
  153. order.getRemark(),order.getPermanentGold(), auditName, "退款商品"+order.getGoodsName());
  154. GoldTistV2.addCoinNew(order.getJwcode().toString(), 57, //退款任务-商品
  155. (double) (order.getTaskGold() ) /100,
  156. order.getRemark(),0, auditName, "退款商品"+order.getGoodsName());
  157. } else if (oldOrder.getType()==0){//充值金币
  158. if(order.getTaskGold()==0){ //无任务金币统一走免费+永久
  159. GoldTistV2.addCoinNew(order.getJwcode().toString(), 58, //退款免费+永久金币-充值
  160. (double) (order.getFreeDecember()+order.getFreeJune()+order.getPermanentGold() ) /100,
  161. order.getRemark(),(double) order.getPermanentGold() / 100, auditName, "退款金币充值");}
  162. if (order.getTaskGold()!=0)
  163. GoldTistV2.addCoinNew(order.getJwcode().toString(), 59, //退款任务+永久金币-充值
  164. (double) (order.getTaskGold()+order.getPermanentGold() ) /100,
  165. order.getRemark(),(double) order.getPermanentGold() / 100, auditName, "退款金币充值");
  166. }
  167. }
  168. updateOrder.setAuditStatus(1);
  169. updateOrder.setAuditTime(new Date());
  170. // 执行审核更新
  171. auditMapper.updateOrder(updateOrder);
  172. }
  173. return true;
  174. }
  175. /*
  176. * 多条件查询充值订单列表
  177. */
  178. @Override
  179. public PageInfo<RechargeAudit> selectRechargeBy(Integer pageNum, Integer pageSize, RechargeAudit rechargeAudit) {
  180. List<String> markets = marketMapper.getMarketIds(rechargeAudit.getMarkets());
  181. if (markets.contains("9") || markets.contains("9999")){
  182. markets=null;
  183. }
  184. rechargeAudit.setMarkets(markets);
  185. PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
  186. List<RechargeAudit> rechargeAudits = auditMapper.selectRechargeBy(pageNum, pageSize, rechargeAudit);
  187. // rechargeAudit.setFreeGold(rechargeAudit.getFreeJune()+rechargeAudit.getFreeDecember());
  188. return new PageInfo<>(rechargeAudits);
  189. }
  190. /*
  191. 多条件查询退款订单
  192. */
  193. @Override
  194. public PageInfo<RefundAudit> selectRefundBy(Integer pageNum, Integer pageSize, RefundAudit refundAudit) {
  195. List<String> markets = marketMapper.getMarketIds(refundAudit.getMarkets());
  196. if (markets.contains("9") || markets.contains("9999")){
  197. markets=null;
  198. }
  199. refundAudit.setMarkets(markets);
  200. PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
  201. List<RefundAudit> refundAudits = auditMapper.selectRefundBy(pageNum, pageSize, refundAudit);
  202. //refundAudit.setFreeGold(refundAudit.getFreeJune()+refundAudit.getFreeDecember());
  203. return new PageInfo<>(refundAudits);
  204. }
  205. /*
  206. 充值审核金币合计数
  207. */
  208. @Override
  209. public Gold sumRechargeGold(Integer pageNum, Integer pageSize, RechargeAudit rechargeAudit) {
  210. Gold gold = new Gold();
  211. //获取充值审核订单列表
  212. List<String> markets = marketMapper.getMarketIds(rechargeAudit.getMarkets());
  213. if (markets.contains("9") || markets.contains("9999")){
  214. markets=null;
  215. }
  216. rechargeAudit.setMarkets(markets);
  217. List<RechargeAudit> rechargeAudits = auditMapper.selectRechargeBy(1, 500000, rechargeAudit);
  218. // 初始化累加器
  219. int totalNum=0;
  220. int permanentGoldSum = 0;
  221. int freeGoldSum = 0;
  222. // 遍历消费记录并累加金币
  223. for (RechargeAudit recharge : rechargeAudits) {
  224. // 累加永久金币
  225. if (recharge.getPermanentGold() != null) {
  226. permanentGoldSum += recharge.getPermanentGold();
  227. }
  228. // 累加免费金币
  229. if (recharge.getFreeJune() != null||recharge.getFreeDecember() != null) {
  230. freeGoldSum = freeGoldSum+recharge.getFreeJune()+recharge.getFreeDecember();
  231. }
  232. // 每遍历一条记录,总条数加1
  233. totalNum++;
  234. }
  235. // 将累加结果设置到Gold对象
  236. gold.setPermanentGolds(BigDecimal.valueOf(permanentGoldSum));
  237. gold.setFreeGolds(BigDecimal.valueOf(freeGoldSum));
  238. gold.setTotalNum(totalNum);
  239. return gold;
  240. }
  241. /*
  242. 退款审核合计数
  243. */
  244. @Override
  245. public Gold sumRefundGold(Integer pageNum, Integer pageSize, RefundAudit refundAudit) {
  246. Gold gold = new Gold();
  247. //获取充值审核订单列表
  248. List<String> markets = marketMapper.getMarketIds(refundAudit.getMarkets());
  249. if (markets.contains("9") || markets.contains("9999")){
  250. markets=null;
  251. }
  252. refundAudit.setMarkets(markets);
  253. List<RefundAudit> refundAudits = auditMapper.selectRefundBy(1, 500000, refundAudit);
  254. // 初始化累加器
  255. int totalNum=0;
  256. int permanentGoldSum = 0;
  257. int freeGoldSum = 0;
  258. int taskGoldSum = 0;
  259. // 遍历消费记录并累加金币
  260. for (RefundAudit refund : refundAudits) {
  261. // 累加永久金币
  262. if (refund.getPermanentGold() != null) {
  263. permanentGoldSum += refund.getPermanentGold();
  264. }
  265. // 累加免费金币
  266. if (refund.getFreeJune() != null||refund.getFreeDecember()!=null) {
  267. freeGoldSum += refund.getFreeJune()+refund.getFreeDecember();
  268. }
  269. //累加任务金币
  270. if(refund.getTaskGold()!=null)
  271. taskGoldSum+=refund.getTaskGold();
  272. // 每遍历一条记录,总条数加1
  273. totalNum++;
  274. }
  275. // 将累加结果设置到Gold对象
  276. gold.setPermanentGolds(BigDecimal.valueOf(permanentGoldSum));
  277. gold.setFreeGolds(BigDecimal.valueOf(freeGoldSum));
  278. gold.setTotalNum(totalNum);
  279. gold.setTaskGolds(BigDecimal.valueOf(taskGoldSum));
  280. return gold;
  281. }
  282. }