TradeAuctionOrderService.java 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. package com.izouma.nineth.service;
  2. import com.izouma.nineth.annotations.RedisLock;
  3. import com.izouma.nineth.config.RedisKeys;
  4. import com.izouma.nineth.domain.*;
  5. import com.izouma.nineth.dto.PageQuery;
  6. import com.izouma.nineth.enums.*;
  7. import com.izouma.nineth.exception.BusinessException;
  8. import com.izouma.nineth.repo.*;
  9. import com.izouma.nineth.utils.JpaUtils;
  10. import lombok.AllArgsConstructor;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.springframework.data.domain.Page;
  14. import org.springframework.data.redis.core.BoundValueOperations;
  15. import org.springframework.data.redis.core.RedisTemplate;
  16. import org.springframework.scheduling.annotation.Scheduled;
  17. import org.springframework.stereotype.Service;
  18. import javax.management.Query;
  19. import javax.transaction.Transactional;
  20. import java.math.BigDecimal;
  21. import java.math.RoundingMode;
  22. import java.time.LocalDate;
  23. import java.time.LocalDateTime;
  24. import java.util.*;
  25. import java.util.concurrent.TimeUnit;
  26. @Service
  27. @AllArgsConstructor
  28. @Slf4j
  29. public class TradeAuctionOrderService {
  30. private TradeAuctionOrderRepo tradeAuctionOrderRepo;
  31. private TradeAuctionService tradeAuctionService;
  32. private TradeAuctionRepo tradeAuctionRepo;
  33. private UserRepo userRepo;
  34. private UserBalanceService userBalanceService;
  35. private SysConfigService sysConfigService;
  36. private CommissionRecordRepo commissionRecordRepo;
  37. private RedisTemplate<String, Object> redisTemplate;
  38. private AssetService assetService;
  39. private AssetRepo assetRepo;
  40. private AirDropService airDropService;
  41. private static int orderCancelInterval = 210;
  42. public Page<TradeAuctionOrder> all(PageQuery pageQuery) {
  43. return tradeAuctionOrderRepo.findAll(JpaUtils.toSpecification(pageQuery, TradeAuctionOrder.class), JpaUtils
  44. .toPageRequest(pageQuery));
  45. }
  46. @RedisLock(value = "'createAuctionOrder::'+#auctionId", expire = 210, message = "当前拍卖活动已有订单,请等待订单取消或下一轮次")
  47. public TradeAuctionOrder create(Long auctionId, Long userId, BigDecimal price, AuctionPaymentType auctionPaymentType) {
  48. // if (tradeAuctionService.getStock(auctionId) < 1) {
  49. // throw new BusinessException("库存不足");
  50. // }
  51. TradeAuction tradeAuction = tradeAuctionRepo.findById(auctionId).orElseThrow(new BusinessException("未找到易拍活动"));
  52. User user = userRepo.findById(userId).orElseThrow(new BusinessException("暂无用户"));
  53. if (tradeAuction.getStock() < 1) {
  54. throw new BusinessException("库存不足");
  55. }
  56. if (tradeAuction.getCurrentOwnerId() != null & tradeAuction.getStatus() != TradeAuctionStatus.PURCHASED) {
  57. if (tradeAuction.getCurrentOwnerId().equals(userId)) {
  58. throw new BusinessException("不可竞价持有的易拍产品");
  59. }
  60. }
  61. if (LocalDateTime.now().compareTo(tradeAuction.getCurrentStartTime()) < 0) {
  62. throw new BusinessException("未到竞价时间");
  63. }
  64. if (!tradeAuction.getStatus().equals(TradeAuctionStatus.ONGOING) & !tradeAuction.getStatus()
  65. .equals(TradeAuctionStatus.PURCHASED)) {
  66. throw new BusinessException("易拍产品未处在竞价状态");
  67. }
  68. if (auctionPaymentType.equals(AuctionPaymentType.DEPOSIT)) {
  69. if (price.compareTo(tradeAuction.getNextPrice()) != 0) {
  70. throw new BusinessException("购买资格已经没有");
  71. }
  72. if (tradeAuction.getSale() >= 30) {
  73. throw new BusinessException("已无购买资格");
  74. }
  75. }
  76. if (auctionPaymentType.equals(AuctionPaymentType.FIXED_PRICE)) {
  77. if (tradeAuction.getRecommendPrice().compareTo(price) != 0) {
  78. throw new BusinessException("提交价格与一口价价格不一致。");
  79. }
  80. }
  81. tradeAuctionService.decreaseStock(auctionId, 1);
  82. BigDecimal serviceCharge = (BigDecimal.valueOf(3).multiply(tradeAuction.getNextPrice())
  83. .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP))
  84. .add(tradeAuction.getCurrentPrice().subtract(tradeAuction.getPrice()));
  85. if (auctionPaymentType.equals(AuctionPaymentType.PURCHASE_PRICE)) {
  86. price = tradeAuction.getPurchasedPrice().subtract(tradeAuction.getLastCommission());
  87. }
  88. TradeAuctionOrder tradeAuctionOrder = TradeAuctionOrder.builder()
  89. .tradeAuctionId(tradeAuction.getId())
  90. .earnedPrice(price.subtract(tradeAuction.getPrice()))
  91. .serviceCharge(serviceCharge)
  92. .name(tradeAuction.getName())
  93. .nickname(user.getNickname())
  94. .paymentType(auctionPaymentType)
  95. .userId(user.getId())
  96. .originPrice(tradeAuction.getPrice())
  97. .currentPrice(tradeAuction.getCurrentPrice())
  98. .price(price)
  99. .paybackStatus(PaybackStatus.NOPASSED)
  100. .pic(tradeAuction.getPic())
  101. .source(AuctionSource.OFFICIAL)
  102. .status(AuctionOrderStatus.NOT_PAID)
  103. .purchasedPrice(tradeAuction.getCurrentPrice())
  104. .build();
  105. if (user.getInviteType() != null) {
  106. if (user.getInviteType().equals(InviteType.AUCTION)) {
  107. tradeAuctionOrder.setInvitorPhone(user.getInvitorPhone());
  108. }
  109. User parentUser = userRepo.findByPhoneAndDelFalse(user.getInvitorPhone()).orElse(null);
  110. if (parentUser != null) {
  111. if (parentUser.getInviteType() != null) {
  112. if (parentUser.getInviteType().equals(InviteType.AUCTION)) {
  113. tradeAuctionOrder.setInvitorParentPhone(parentUser.getInvitorPhone());
  114. }
  115. }
  116. }
  117. }
  118. tradeAuctionOrder = tradeAuctionOrderRepo.save(tradeAuctionOrder);
  119. //下订单减库存
  120. return tradeAuctionOrder;
  121. }
  122. // public boolean getOrderLock(Long orderId) {
  123. // BoundValueOperations<String, Object> ops = redisTemplate.boundValueOps(RedisKeys.AUCTION_ORDER_LOCK + orderId);
  124. // Boolean flag = ops.setIfAbsent(1, 1, TimeUnit.DAYS);
  125. // return Boolean.TRUE.equals(flag);
  126. // }
  127. //
  128. // public void releaseOrderLock(Long orderId) {
  129. // redisTemplate.delete(RedisKeys.AUCTION_ORDER_LOCK + orderId);
  130. // }
  131. @Transactional
  132. public void notify(Long orderId, String transactionId, PayMethod payMethod) {
  133. TradeAuctionOrder tradeAuctionOrder = tradeAuctionOrderRepo.findById(orderId)
  134. .orElseThrow(new BusinessException("未找到订单"));
  135. if (!tradeAuctionOrder.getStatus().equals(AuctionOrderStatus.NOT_PAID)) {
  136. throw new BusinessException("订单已经处理");
  137. }
  138. tradeAuctionOrder.setPayTime(LocalDateTime.now());
  139. tradeAuctionOrder.setPayMethod(payMethod);
  140. tradeAuctionOrder.setTransactionId(transactionId);
  141. tradeAuctionOrder.setStatus(AuctionOrderStatus.FINISH);
  142. TradeAuction tradeAuction = tradeAuctionRepo.findById(tradeAuctionOrder.getTradeAuctionId())
  143. .orElseThrow(new BusinessException("未找到该易拍活动"));
  144. if (tradeAuction.getCurrentOrderId() != null & !tradeAuctionOrder.getPaymentType()
  145. .equals(AuctionPaymentType.PURCHASE_PRICE)) {
  146. //将上次订单设为待补偿状态
  147. TradeAuctionOrder lastOrder = tradeAuctionOrderRepo.findById(tradeAuction.getCurrentOrderId())
  148. .orElseThrow(new BusinessException("暂无订单"));
  149. lastOrder.setPaybackStatus(PaybackStatus.PASSED);
  150. tradeAuctionOrderRepo.save(lastOrder);
  151. }
  152. tradeAuction.setCurrentOrderId(orderId);
  153. if (tradeAuctionOrder.getPaymentType().equals(AuctionPaymentType.FIXED_PRICE)) {
  154. tradeAuction.setCurrentPrice(tradeAuctionOrder.getCurrentPrice());
  155. tradeAuction.setCurrentOwner(tradeAuctionOrder.getNickname());
  156. tradeAuction.setCurrentOwnerId(tradeAuctionOrder.getUserId());
  157. tradeAuction.setStatus(TradeAuctionStatus.FIXED_PRICE_PURCHASED);
  158. tradeAuctionOrder.setStatus(AuctionOrderStatus.AIR_DROP);
  159. } else if (tradeAuctionOrder.getPaymentType().equals(AuctionPaymentType.DEPOSIT)) {
  160. if (tradeAuction.getSale() == 29) {
  161. tradeAuction.setSale(30L);
  162. tradeAuction.setCurrentPrice(tradeAuctionOrder.getPrice());
  163. tradeAuction.setCurrentOwner(tradeAuctionOrder.getNickname());
  164. tradeAuction.setCurrentOwnerId(tradeAuctionOrder.getUserId());
  165. tradeAuction.setLastCommission(tradeAuctionOrder.getServiceCharge());
  166. tradeAuction.setPurchasedPrice(tradeAuctionOrder.getPurchasedPrice());
  167. tradeAuctionService.purchase(tradeAuction);
  168. return;
  169. } else {
  170. BigDecimal result = tradeAuctionOrder.getPrice()
  171. .multiply(BigDecimal.valueOf(tradeAuction.getIncreasePer()))
  172. .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
  173. tradeAuction.setNextPrice(result.add(tradeAuctionOrder.getPrice()));
  174. tradeAuction.setEarning(tradeAuction.getNextPrice().subtract(tradeAuction.getPrice()));
  175. BigDecimal serviceCharge = (BigDecimal.valueOf(0.03).multiply(tradeAuction.getNextPrice()))
  176. .add(tradeAuctionOrder.getPrice().subtract(tradeAuction.getPrice()));
  177. tradeAuction.setCommission(serviceCharge);
  178. tradeAuction.setCurrentPrice(tradeAuctionOrder.getPrice());
  179. tradeAuction.setCurrentOwner(tradeAuctionOrder.getNickname());
  180. tradeAuction.setCurrentOwnerId(tradeAuctionOrder.getUserId());
  181. LocalDateTime now = LocalDateTime.now();
  182. LocalDateTime eightToday = LocalDate.now().atTime(20, 0);
  183. LocalDateTime elevenToday = LocalDate.now().atTime(11, 0);
  184. if (now.compareTo(elevenToday) < 0) {
  185. tradeAuction.setCurrentStartTime(elevenToday);
  186. } else {
  187. if (now.compareTo(eightToday) < 0) {
  188. tradeAuction
  189. .setCurrentStartTime(eightToday);
  190. } else {
  191. tradeAuction
  192. .setCurrentStartTime(elevenToday.plusDays(1));
  193. }
  194. }
  195. tradeAuction
  196. .setCurrentEndTime(tradeAuction.getCurrentStartTime().plusDays(1));
  197. tradeAuction.setFixedPrice(tradeAuctionOrder.getPrice().multiply(BigDecimal.valueOf(150))
  198. .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
  199. tradeAuction.setStatus(TradeAuctionStatus.WAITING);
  200. }
  201. } else {
  202. tradeAuction.setCurrentPrice(tradeAuctionOrder.getCurrentPrice());
  203. tradeAuction.setCurrentOwner(tradeAuctionOrder.getNickname());
  204. tradeAuction.setCurrentOwnerId(tradeAuctionOrder.getUserId());
  205. tradeAuction.setStatus(TradeAuctionStatus.FINISH);
  206. finishLastOrder(tradeAuction.getCurrentOrderId());
  207. tradeAuctionOrder.setStatus(AuctionOrderStatus.AIR_DROP);
  208. }
  209. tradeAuction.setLastCommission(tradeAuctionOrder.getServiceCharge());
  210. tradeAuctionOrder.setCurrentEndTime(tradeAuction.getCurrentEndTime());
  211. tradeAuctionOrder.setCurrentPrice(tradeAuctionOrder.getPrice());
  212. tradeAuction.setStock(0L);
  213. tradeAuction.setSale(tradeAuction.getSale() + 1);
  214. tradeAuctionOrder.setTradeAuctionStatus(tradeAuction.getStatus());
  215. tradeAuctionOrderRepo.save(tradeAuctionOrder);
  216. tradeAuctionRepo.save(tradeAuction);
  217. tradeAuctionService.increaseSale(tradeAuction.getId(), 1);
  218. LocalDate now = LocalDate.now();
  219. LocalDate start = LocalDate.of(2023, 1, 19);
  220. LocalDate end = LocalDate.of(2023, 1, 29);
  221. if (now.isBefore(end) & now.isAfter(start)) {
  222. checkHasAirdrop(tradeAuctionOrder.getUserId());
  223. }
  224. }
  225. public void checkHasAirdrop(Long userId) {
  226. Long collectionId = Long.valueOf(sysConfigService.getString("tradeAcution_collectionId"));
  227. if (collectionId != null) {
  228. Asset asset = assetRepo
  229. .findFirstByCollectionIdAndUserIdAndSource(collectionId, userId, AssetSource.OFFICIAL);
  230. if (asset == null) {
  231. User user = userRepo.findById(userId).orElseThrow(new BusinessException("暂无该用户"));
  232. airDropService.create(AirDrop.builder()
  233. .name("春节参与易拍空投福卡")
  234. .remark("tradeAuction:" + userId)
  235. .type(AirDropType.asset)
  236. .userIds(Collections.singletonList(userId))
  237. .collectionId(collectionId)
  238. .targets(Collections
  239. .singletonList(new DropTarget(user.getId(), user.getPhone(), user
  240. .getNickname(), 1)))
  241. .auto(true)
  242. .companyId(1L)
  243. .build());
  244. }
  245. }
  246. }
  247. public void finishLastOrder(Long lastOrderId) {
  248. TradeAuctionOrder tradeAuctionOrder = tradeAuctionOrderRepo.findById(lastOrderId)
  249. .orElseThrow(new BusinessException("暂无订单"));
  250. tradeAuctionOrder.setStatus(AuctionOrderStatus.PAID);
  251. tradeAuctionOrder.setPaybackStatus(PaybackStatus.PAYED);
  252. tradeAuctionOrderRepo.save(tradeAuctionOrder);
  253. }
  254. @Scheduled(fixedRate = 6000)
  255. public void batchCancelledAuctionOrder() {
  256. List<TradeAuctionOrder> orders = tradeAuctionOrderRepo
  257. .findByStatusAndCreatedAtBeforeAndDelFalse(AuctionOrderStatus.NOT_PAID,
  258. LocalDateTime.now().minusSeconds(orderCancelInterval));
  259. orders.parallelStream().forEach(o -> {
  260. try {
  261. TradeAuctionOrder order = tradeAuctionOrderRepo.findById(o.getId())
  262. .orElseThrow(new BusinessException("订单不存在"));
  263. if (order.getStatus() == AuctionOrderStatus.NOT_PAID) {
  264. cancel(order);
  265. }
  266. } catch (Exception e) {
  267. log.error("取消易拍订单错误 " + o.getId(), e);
  268. }
  269. });
  270. }
  271. public void cancel(TradeAuctionOrder order) {
  272. // if (!getOrderLock(order.getId())) {
  273. // log.error("订单取消失败 {}, redis锁了", order.getId());
  274. // return;
  275. // }
  276. if (order.getStatus() != AuctionOrderStatus.NOT_PAID) {
  277. throw new BusinessException("当前订单状态无法取消[" + order.getStatus().name() + "]");
  278. }
  279. order.setStatus(AuctionOrderStatus.CANCELLED);
  280. order.setCancelTime(LocalDateTime.now());
  281. tradeAuctionService.increaseStock(order.getTradeAuctionId(), 1);
  282. tradeAuctionOrderRepo.save(order);
  283. // releaseOrderLock(order.getId());
  284. }
  285. // @Scheduled(fixedRate = 30000)
  286. // public void batchAirdrop() {
  287. // List<TradeAuctionOrder> tradeAuctionOrders = tradeAuctionOrderRepo
  288. // .findByStatusAndDelFalse(AuctionOrderStatus.AIR_DROP);
  289. // tradeAuctionOrders.parallelStream().forEach(o -> {
  290. // try {
  291. // TradeAuctionOrder order = tradeAuctionOrderRepo.findById(o.getId())
  292. // .orElseThrow(new BusinessException("订单不存在"));
  293. // TradeAuction tradeAuction = tradeAuctionRepo.findById(order.getTradeAuctionId())
  294. // .orElseThrow(new BusinessException("未找到易拍活动"));
  295. // User owner = userRepo.findById(order.getUserId())
  296. // .orElseThrow(new BusinessException("暂无用户"));
  297. // assetService.createAsset(tradeAuction, owner, order.getId(), tradeAuction
  298. // .getCurrentPrice(), "空投", 1, false);
  299. // order.setStatus(AuctionOrderStatus.FINISH);
  300. // tradeAuctionOrderRepo.save(order);
  301. // } catch (Exception e) {
  302. // log.error("取消易拍订单错误 " + o.getId(), e);
  303. // }
  304. // });
  305. // }
  306. @Scheduled(fixedRate = 30000)
  307. public void batchPayEarning() {
  308. List<TradeAuctionOrder> tradeAuctionOrders = tradeAuctionOrderRepo.findByPaybackStatus(PaybackStatus.PASSED);
  309. tradeAuctionOrders.parallelStream().forEach(o -> {
  310. try {
  311. TradeAuctionOrder order = tradeAuctionOrderRepo.findById(o.getId())
  312. .orElseThrow(new BusinessException("订单不存在"));
  313. if (order.getPaybackStatus() == PaybackStatus.PASSED) {
  314. payEarning(order);
  315. }
  316. } catch (Exception e) {
  317. log.error("取消易拍订单错误 " + o.getId(), e);
  318. }
  319. });
  320. }
  321. private void payEarning(TradeAuctionOrder order) {
  322. if (!order.getPaymentType().equals(AuctionPaymentType.PURCHASE_PRICE)) {
  323. userBalanceService.addBalance(order.getUserId(), order.getEarnedPrice(), order.getId(), BalanceType.BONUS);
  324. order.setPaybackStatus(PaybackStatus.PAYED);
  325. tradeAuctionOrderRepo.save(order);
  326. }
  327. }
  328. public void commission(TradeAuctionOrder order, BigDecimal price) {
  329. List<String> officialPhones = Arrays.asList(sysConfigService.getString("ta_phone").split(","));
  330. if (order.getInvitorPhone() != null) {
  331. if (officialPhones.contains(order.getInvitorPhone())) {
  332. userRepo.findByPhoneAndDelFalse(order.getInvitorPhone()).ifPresent(user -> {
  333. BigDecimal shareRatio = sysConfigService.getBigDecimal("auction_commission_rate");
  334. if (StringUtils.isNotBlank(user.getSettleAccountId()) &&
  335. shareRatio != null && shareRatio.compareTo(BigDecimal.ZERO) > 0) {
  336. commissionRecordRepo.save(CommissionRecord.builder()
  337. .orderId(order.getId())
  338. .collectionId(order.getTradeAuctionId())
  339. .name(order.getName())
  340. .totalPrice(price)
  341. .nickname(user.getNickname())
  342. .userId(user.getId())
  343. .shareRatio(user.getShareRatio())
  344. .phone(user.getPhone())
  345. .shareAmount(price.multiply(shareRatio)
  346. .divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP))
  347. .type(InviteType.AUCTION)
  348. .build());
  349. userBalanceService.addBalance(user.getId(), price.multiply(shareRatio)
  350. .divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP), order
  351. .getId(), BalanceType.COMMISSION);
  352. }
  353. });
  354. }
  355. }
  356. if (order.getInvitorParentPhone() != null) {
  357. if (officialPhones.contains(order.getInvitorParentPhone())) {
  358. userRepo.findByPhoneAndDelFalse(order.getInvitorParentPhone()).ifPresent(user -> {
  359. BigDecimal shareRatio = sysConfigService.getBigDecimal("auction_commission_step");
  360. if (StringUtils.isNotBlank(user.getSettleAccountId()) &&
  361. shareRatio != null && shareRatio.compareTo(BigDecimal.ZERO) > 0) {
  362. commissionRecordRepo.save(CommissionRecord.builder()
  363. .orderId(order.getId())
  364. .collectionId(order.getTradeAuctionId())
  365. .name(order.getName())
  366. .totalPrice(price)
  367. .nickname(user.getNickname())
  368. .userId(user.getId())
  369. .shareRatio(user.getShareRatio())
  370. .phone(user.getPhone())
  371. .shareAmount(price.multiply(shareRatio)
  372. .divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP))
  373. .type(InviteType.AUCTION)
  374. .build());
  375. userBalanceService.addBalance(user.getId(), price.multiply(shareRatio)
  376. .divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP), order
  377. .getId(), BalanceType.COMMISSION);
  378. }
  379. });
  380. }
  381. }
  382. }
  383. public Map<String, Object> statistic(Long tradeAuctionId) {
  384. Map<String, Object> result = new HashMap<>();
  385. if (tradeAuctionId == null) {
  386. //总流水
  387. BigDecimal deposit = tradeAuctionOrderRepo.sumDepositAmount();
  388. BigDecimal purchased = tradeAuctionOrderRepo.sumPurchasedAmount();
  389. BigDecimal fixed = tradeAuctionOrderRepo.sumFixedAmount();
  390. BigDecimal comi = tradeAuctionOrderRepo.sumComi();
  391. BigDecimal commi = (BigDecimal.valueOf(3).multiply(comi)
  392. .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
  393. if (fixed == null) {
  394. fixed = BigDecimal.ZERO;
  395. }
  396. BigDecimal payed = deposit.add(purchased).add(fixed);
  397. result.put("payed", payed.setScale(1, RoundingMode.DOWN));
  398. //总手续费
  399. result.put("comi", commi.setScale(1, RoundingMode.DOWN));
  400. //用户收益
  401. BigDecimal earning = tradeAuctionOrderRepo.earningPrice();
  402. BigDecimal serviceCharge = tradeAuctionOrderRepo.serviceCharge();
  403. BigDecimal userEarning = earning.subtract(serviceCharge);
  404. result.put("userEarning", userEarning.setScale(1, RoundingMode.DOWN));
  405. //平台收益
  406. BigDecimal platEarning = payed.subtract(earning);
  407. result.put("platEarning", platEarning.setScale(1, RoundingMode.DOWN));
  408. } else {
  409. //总流水
  410. BigDecimal deposit = tradeAuctionOrderRepo.sumDepositAmountById(tradeAuctionId);
  411. if (deposit == null) {
  412. deposit = BigDecimal.ZERO;
  413. }
  414. BigDecimal purchased = tradeAuctionOrderRepo.sumPurchasedAmountById(tradeAuctionId);
  415. if (purchased == null) {
  416. purchased = BigDecimal.ZERO;
  417. }
  418. BigDecimal fixed = tradeAuctionOrderRepo.sumFixedAmountById(tradeAuctionId);
  419. if (fixed == null) {
  420. fixed = BigDecimal.ZERO;
  421. }
  422. BigDecimal comi = tradeAuctionOrderRepo.sumComiById(tradeAuctionId);
  423. BigDecimal commi = BigDecimal.ZERO;
  424. if (comi != null) {
  425. commi = (BigDecimal.valueOf(3).multiply(comi)
  426. .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
  427. }
  428. BigDecimal payed = deposit.add(purchased).add(fixed);
  429. result.put("payed", payed.setScale(1, RoundingMode.DOWN));
  430. //总手续费
  431. result.put("comi", commi);
  432. //用户收益
  433. BigDecimal earning = tradeAuctionOrderRepo.earningPriceById(tradeAuctionId);
  434. if (earning == null) {
  435. earning = BigDecimal.ZERO;
  436. }
  437. BigDecimal serviceCharge = tradeAuctionOrderRepo.serviceChargeById(tradeAuctionId);
  438. if (serviceCharge == null) {
  439. serviceCharge = BigDecimal.ZERO;
  440. }
  441. BigDecimal userEarning = earning.subtract(serviceCharge);
  442. result.put("userEarning", userEarning.setScale(1, RoundingMode.DOWN));
  443. //平台收益
  444. BigDecimal platEarning = payed.subtract(earning);
  445. result.put("platEarning", platEarning.setScale(1, RoundingMode.DOWN));
  446. }
  447. return result;
  448. }
  449. }