From 83e2fd8d61d116ce9bf2034e8d05346910f96260 Mon Sep 17 00:00:00 2001
From: zainali5120 <512061637@qq.com>
Date: Sun, 29 Nov 2020 13:23:15 +0800
Subject: [PATCH] 卖出额度限制

---
 src/main/java/com/xcong/excoin/modules/coin/service/impl/OrderCoinServiceImpl.java |  119 +++++++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 79 insertions(+), 40 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/coin/service/impl/OrderCoinServiceImpl.java b/src/main/java/com/xcong/excoin/modules/coin/service/impl/OrderCoinServiceImpl.java
index b59e970..545f350 100644
--- a/src/main/java/com/xcong/excoin/modules/coin/service/impl/OrderCoinServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/coin/service/impl/OrderCoinServiceImpl.java
@@ -1,6 +1,7 @@
 package com.xcong.excoin.modules.coin.service.impl;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -11,6 +12,7 @@
 import com.alibaba.fastjson.JSONObject;
 import com.xcong.excoin.common.contants.AppContants;
 import com.xcong.excoin.common.enumerates.CoinTypeEnum;
+import com.xcong.excoin.modules.blackchain.service.DateUtil;
 import com.xcong.excoin.modules.blackchain.service.RocService;
 import com.xcong.excoin.modules.coin.mapper.OrderCoinsDealMapper;
 import com.xcong.excoin.modules.coin.service.CoinService;
@@ -101,6 +103,13 @@
 
     @Resource
     private CoinService coinService;
+
+    private static BigDecimal PERSENT = new BigDecimal("100");
+
+    /**
+     *  每日卖出限制 日期 20201128 会员ID
+     */
+    String LIMIT_SELL_PERSENT_KEY ="SELL:PERSENT:%s:%s";
 
 
     @Override
@@ -357,31 +366,28 @@
         String phone = memberEntity.getPhone();
         if (!"13632989240".equals(phone) && !"15158130575".equals(phone)) {
             if (OrderCoinsEntity.ORDERTYPE_BUY.equals(type)) {
-                // 不能超过800个
+                // 禁止挂卖
+                String string = redisUtils.getString("BUY_LIMIT_KEY_PHONE");
+                if (StringUtils.isNotBlank(string) && StringUtils.isNotBlank(phone) && string.contains(phone)) {
+                    return Result.fail("");
+                }
 
-//                if (amount != null && amount.compareTo(new BigDecimal("800")) > 0) {
-//                    return Result.fail("买入额度受限");
-//                }
-//                BigDecimal bigDecimal = orderCoinDealDao.sumTodayBuyAmount(memberId, symbol);
-//                if (bigDecimal == null) {
-//                    bigDecimal = BigDecimal.ZERO;
-//                }
-//                amount = amount == null ? BigDecimal.ZERO : amount;
-//                bigDecimal = bigDecimal.add(amount);
-//                if (bigDecimal != null && bigDecimal.compareTo(new BigDecimal("800")) > 0) {
-//                    return Result.fail("买入额度受限");
-//                }
-//                // 挂单不能超过800
-//                BigDecimal bigDecimal1 = orderCoinDealDao.sumTodayEntrustCntBuyAmount(memberId, symbol);
-//                if (bigDecimal1 == null) {
-//                    bigDecimal1 = BigDecimal.ZERO;
-//                }
-//                bigDecimal1 = bigDecimal1.add(amount);
-//                if (bigDecimal1 != null && bigDecimal1.compareTo(new BigDecimal("800")) > 0) {
-//                    return Result.fail("买入额度受限");
-//                }
+                if (StringUtils.isNotBlank(string) && StringUtils.isNotBlank(memberEntity.getEmail()) && string.contains(memberEntity.getEmail())) {
+                    return Result.fail("");
+                }
+                // 不能超过800个
             } else {
-               return Result.fail("卖出受限");
+                // 判断redis开关
+                //String string = redisUtils.getString("SELL_LIMIT_KEY");
+                String string = redisUtils.getString("SELL_LIMIT_KEY_PHONE");
+                if (StringUtils.isNotBlank(string) && StringUtils.isNotBlank(phone) && string.contains(phone)) {
+                    return Result.fail("");
+                }
+
+                if (StringUtils.isNotBlank(string) && StringUtils.isNotBlank(memberEntity.getEmail()) && string.contains(memberEntity.getEmail())) {
+                    return Result.fail("");
+                }
+
             }
         }
 
@@ -419,18 +425,15 @@
             totalPayPrice = price.multiply(amount).add(closingPrice);
             entrustAmount = price.multiply(amount);
             // 限价买不能高于当前10%
-            if (OrderCoinsEntity.ORDERTYPE_BUY == type) {
-                BigDecimal multiply = nowPrice.multiply(new BigDecimal("1.2"));
-                if(price.compareTo(multiply)>0){
-                    return Result.fail("不能高于当前价的120%");
-                }
-            }else{
-                // 卖不能小于当前90
-                BigDecimal multiply = nowPrice.multiply(new BigDecimal("0.8"));
-                if(price.compareTo(multiply)<0){
-                    return Result.fail("不能低于当前价的80%");
-                }
+            BigDecimal multiply = nowPrice.multiply(new BigDecimal("1.2"));
+            if (price.compareTo(multiply) > 0) {
+                return Result.fail("不能高于当前价的120%");
             }
+            multiply=  nowPrice.multiply(new BigDecimal("0.8"));
+            if (price.compareTo(multiply) < 0) {
+                return Result.fail("不能低于当前价的80%");
+            }
+
         } else {
             // 市价
             if (OrderCoinsEntity.ORDERTYPE_BUY == type) {
@@ -451,6 +454,26 @@
             BigDecimal availableBalance = walletCoin.getAvailableBalance();
             if (amount.compareTo(availableBalance) > 0) {
                 return Result.fail(MessageSourceUtils.getString("order_service_0010"));
+            }
+            // 控制这个用户每日的挂卖额度 TODO
+            // 每天3% 第一次的为基数
+            BigDecimal spread = memberEntity.getSpread();
+            if(spread!=null && spread.compareTo(BigDecimal.ZERO)>0 && spread.compareTo(PERSENT)<0){
+                // 获取当日的额度
+                String yyyyMMdd = DateUtil.dateToString(new Date(), "yyyyMMdd");
+                String persentKey = String.format(LIMIT_SELL_PERSENT_KEY,yyyyMMdd,memberId.toString());
+                BigDecimal aviSell  =BigDecimal.ZERO;
+                if(StringUtils.isBlank(persentKey)){
+                    // 当日可以卖的数量
+                     aviSell = spread.divide(PERSENT,4, RoundingMode.HALF_UP).multiply(availableBalance);
+                }
+                if(aviSell.compareTo(amount)<0){
+                    return Result.fail("卖出超过上限"+spread+"%");
+                }
+                aviSell = aviSell.subtract(amount);
+                // 设置
+                redisUtils.set(persentKey,aviSell.toPlainString());
+                //redisUtils.getString()
             }
         }
 
@@ -657,6 +680,12 @@
         OrderCoinsEntity coinsEntityCancel = trader.cancelOrder(orderCoinsEntity);
         if (coinsEntityCancel == null) {
             // 此时说明撮合系统已经没这个单了 不需要继续处理
+            // 直接更新状态先
+            OrderCoinsEntity update = new OrderCoinsEntity();
+            update.setId(Long.valueOf(orderId));
+            update.setOrderStatus(OrderCoinsEntity.ORDERSTATUS_CANCEL);
+            //orderCoinsEntity.setOrderStatus(OrderCoinsEntity.ORDERSTATUS_CANCEL);
+            orderCoinsDao.updateById(update);
             return null;
         }
 
@@ -725,11 +754,21 @@
                     return Result.ok(MessageSourceUtils.getString("order_service_0013"));
                 }
             } else {
+
                 //如果是限价卖出,撤单将对应的钱包冻结金额返回
                 MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, symbol);
                 if (ObjectUtil.isNotEmpty(walletCoin)) {
                     // 卖出按卖出的数量计算手续费
                     BigDecimal returnBalance = orderCoinsEntity.getEntrustCnt().subtract(coinsEntityCancel.getDealCnt());
+                    // 取消订单 则退回额度
+                    String yyyyMMdd = DateUtil.dateToString(new Date(), "yyyyMMdd");
+                    String persentKey = String.format(LIMIT_SELL_PERSENT_KEY,yyyyMMdd,memberId.toString());
+                    String aviSell = redisUtils.getString(persentKey);
+                    // TODO
+                    if(StringUtils.isNotBlank(aviSell)){
+                        BigDecimal needSub = new BigDecimal(aviSell).add(returnBalance);
+                        redisUtils.set(persentKey,needSub.toPlainString());
+                    }
                     walletCoin.setAvailableBalance(walletCoin.getAvailableBalance().add(returnBalance));
                     walletCoin.setFrozenBalance(walletCoin.getFrozenBalance().subtract(returnBalance));
                     //memberWalletCoinDao.updateById(walletCoin);
@@ -1095,19 +1134,19 @@
         if (CollectionUtils.isNotEmpty(trades)) {
             for (OrderCoinsEntity trade : trades) {
                 if (trade != null) {
-                    if (trade.getOrderType()==2 && trade.getEntrustCnt().compareTo(trade.getDealCnt())!=0){
-                        System.out.println("问题卖单:"+ JSON.toJSONString(trade));
+                    if (trade.getOrderType() == 2 && trade.getEntrustCnt().compareTo(trade.getDealCnt()) != 0) {
+                        System.out.println("问题卖单:" + JSON.toJSONString(trade));
                     }
                     //orderCoinsDao.updateStatus(trade.getId(),OrderCoinsEntity.ORDERSTATUS_DONE);
                     ids.add(trade.getId());
                     // 买单 实际成交金额小于委托的 这一部分从冻结扣除
-                    if(OrderCoinsEntity.ORDERTYPE_BUY==trade.getOrderType()){
-                        if(trade.getEntrustAmount().compareTo(trade.getDealAmount())>0){
+                    if (OrderCoinsEntity.ORDERTYPE_BUY == trade.getOrderType()) {
+                        if (trade.getEntrustAmount().compareTo(trade.getDealAmount()) > 0) {
                             // 此时退回这部分的差额
                             BigDecimal subtract = trade.getEntrustAmount().subtract(trade.getDealAmount());
                             MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(trade.getMemberId(), CoinTypeEnum.USDT.name());
-                            if(memberWalletCoinEntity!=null){
-                                coinService.updateWalletBalance(memberWalletCoinEntity.getId(),subtract,null,subtract.negate());
+                            if (memberWalletCoinEntity != null) {
+                                coinService.updateWalletBalance(memberWalletCoinEntity.getId(), subtract, null, subtract.negate());
                             }
                         }
                     }

--
Gitblit v1.9.1