Kaynağa Gözat

1.指数风控
——by qlm

qlm 4 yıl önce
ebeveyn
işleme
1d5b8dd9dd

Dosya farkı çok büyük olduğundan ihmal edildi
+ 90 - 0
src/main/java/com/zx/dataservice/config/ActiveConfig.java


Dosya farkı çok büyük olduğundan ihmal edildi
+ 6 - 47
src/main/java/com/zx/dataservice/config/JfinalActiveRecordConfig.java


+ 46 - 3
src/main/java/com/zx/dataservice/controller/CallBackController.java

@@ -2,10 +2,13 @@ package com.zx.dataservice.controller;
 
 import com.jfinal.plugin.activerecord.Db;
 import com.jfinal.plugin.activerecord.Record;
+import com.zx.dataservice.config.ActiveConfig;
 import com.zx.dataservice.options.WSOptions;
 import com.zx.dataservice.options.ZXOptions;
+import com.zx.dataservice.service.ChoiceHisService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -19,6 +22,9 @@ public class CallBackController {
 
     private static Logger LOG = LoggerFactory.getLogger(CallBackController.class);
 
+    @Autowired
+    private ChoiceHisService choiceHisService;
+
     @GetMapping("/t1")
     @ResponseBody
     public String quantCallBack(String code){
@@ -84,12 +90,40 @@ public class CallBackController {
                 ZXOptions.set(record.getStr("config_key"),record.getStr("config_value"));
             }
 
-            List<Record> recordws = Db.use("gp").find("select key,value from ws_config ");
+            List<Record> recordws = Db.use("gp").find("select wskey,wsvalue,wsname from ws_config ");
             for (Record record:recordws) {
-                WSOptions.set(record.getStr("key"),record.getStr("value"));
+                WSOptions.set(record.getStr("wskey"),record.getStr("wsname")+"_"+record.getStr("wsvalue"));
             }
+        } catch (Exception e) {
+            if(e.toString().length()>500){                LOG.error(e.toString().substring(0,450));            }else {                LOG.error(e.toString());            }
+        }
+        return true;
+    }
 
-            System.out.println(ZXOptions.get("ws.key"));
+    /*
+    修改  风控后需要调此方法
+     */
+    @GetMapping("/updateRisk")
+    @ResponseBody
+    public boolean updateRisk(String code){
+        try {
+            ActiveConfig.activeRisk();
+        } catch (Exception e) {
+            if(e.toString().length()>500){                LOG.error(e.toString().substring(0,450));            }else {                LOG.error(e.toString());            }
+        }
+        return true;
+    }
+
+    /**
+     * 历史风控数据维护
+     * @param code
+     * @return
+     */
+    @GetMapping("/updateHis")
+    @ResponseBody
+    public boolean updateHis(String code){
+        try {
+            choiceHisService.toAnalysisHistData();
         } catch (Exception e) {
             if(e.toString().length()>500){                LOG.error(e.toString().substring(0,450));            }else {                LOG.error(e.toString());            }
         }
@@ -109,6 +143,10 @@ public class CallBackController {
     }
 
 
+
+
+
+
     @GetMapping("/remMap")
     @ResponseBody
     public boolean remMap2(String key){
@@ -132,6 +170,8 @@ public class CallBackController {
         return true;
     }
 
+
+
     @GetMapping("/testis")
     @ResponseBody
     public boolean testis(String key){
@@ -147,4 +187,7 @@ public class CallBackController {
     }
 
 
+
+
+
 }

+ 32 - 2
src/main/java/com/zx/dataservice/controller/WebSocketController.java

@@ -4,8 +4,10 @@ package com.zx.dataservice.controller;
  * Created by qlm on 2020-12-14.
  */
 
+import com.alibaba.fastjson.JSON;
 import com.zx.dataservice.options.WSOptions;
 import com.zx.dataservice.utils.DateUtils;
+import com.zx.dataservice.vo.StockRestRedisVO;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
@@ -16,6 +18,7 @@ import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
@@ -182,12 +185,39 @@ public class WebSocketController {
     /**
      *根据订阅发送消息
      */
-    public static void sendSysMsgType(String type ,String  xMessage){
+    public static void sendSysMsgType(String type ,Map<String,List<StockRestRedisVO>>mapws ){
         try{
             for(String key:map.keySet()){
                 Session session = map.get(key);
                 if(session!=null&&session.isOpen()&& StringUtils.isNotBlank(WSOptions.get(key))){
-                    if(WSOptions.get(key).toLowerCase().equals("ALL".toLowerCase())||WSOptions.get(key).toLowerCase().equals(type.toLowerCase())){ // 推送所有
+                    if(WSOptions.get(key).split("_")[1].toLowerCase().equals("ALL".toLowerCase())||WSOptions.get(key).split("_")[1].toLowerCase().equals(type.toLowerCase())){ // 推送所有
+                        // 推送对应的 风控 记录
+                        synchronized(session){
+                            if(session.isOpen()){
+                                List<StockRestRedisVO> stockRestRedisVOS = mapws.get("stockRestRedisVO_" + WSOptions.get(key).split("_")[0]);
+                                session.getBasicRemote().sendText(JSON.toJSONString(stockRestRedisVOS));
+                            }
+                        }
+                    }
+                }else { // 如果对方不是自己人 就删除
+                    map.remove(key);
+                }
+            }
+        }catch(IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     *根据订阅发送消息
+     */
+    public static void sendSysMsgType(String type ,String  xMessage ){
+        try{
+            for(String key:map.keySet()){
+                Session session = map.get(key);
+                if(session!=null&&session.isOpen()&& StringUtils.isNotBlank(WSOptions.get(key))){
+                    if(WSOptions.get(key).split("_")[1].toLowerCase().equals("ALL".toLowerCase())||WSOptions.get(key).split("_")[1].toLowerCase().equals(type.toLowerCase())){ // 推送所有
+                        // 推送对应的 风控 记录
                         synchronized(session){
                             if(session.isOpen()){
                                 session.getBasicRemote().sendText(xMessage);

+ 12 - 0
src/main/java/com/zx/dataservice/options/DataOptions.java

@@ -60,6 +60,10 @@ public class DataOptions {
         public ConcurrentHashMap.KeySetView<String, String> keySet() {
             return cache.keySet();
         }
+
+        public void init() {
+            cache.clear();
+        }
     };
 
 
@@ -150,6 +154,12 @@ public class DataOptions {
         public void onChanged(String key, String newValue, String oldValue);
     }
 
+    public static void remove(String key) {
+        store.remove(key);
+    }
+   public static void init() {
+        store.init();
+    }
 
     private static void doFinishedChanged(String key, String value, String oldValue) {
 
@@ -178,6 +188,8 @@ public class DataOptions {
 
         public void remove(String key);
 
+        public void init();
+
         public ConcurrentHashMap.KeySetView<String, String> keySet();
 
     }

+ 191 - 0
src/main/java/com/zx/dataservice/options/RiskOptions.java

@@ -0,0 +1,191 @@
+/**
+ * Copyright (c) 2016-2019, Michael Yang 杨福海 (fuhai999@gmail.com).
+ * <p>
+ * Licensed under the GNU Lesser General Public License (LGPL) ,Version 3.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.gnu.org/licenses/lgpl-3.0.txt
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.zx.dataservice.options;
+
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 风控 一些常量 配置
+ * 风控_config 表
+ * 2020-12-27
+ *  by qlm
+ */
+public class RiskOptions {
+
+    private static Logger LOG = LoggerFactory.getLogger(RiskOptions.class);
+
+    private static OptionStore store = new OptionStore() {
+        private final ConcurrentHashMap<String, String> cache = new ConcurrentHashMap<>();
+
+        @Override
+        public String get(String key) {
+            return cache.get(key);
+        }
+
+        @Override
+        public void put(String key, String value) {
+            if (StringUtils.isBlank(value)) {
+                remove(key);
+            } else {
+                cache.put(key, value);
+            }
+        }
+
+        @Override
+        public void remove(String key) {
+            cache.remove(key);
+        }
+
+        public ConcurrentHashMap.KeySetView<String, String> keySet() {
+            return cache.keySet();
+        }
+    };
+
+
+    private static List<OptionChangeListener> LISTENERS = new ArrayList<>();
+
+    public static void set(String key, String value) {
+        if (StringUtils.isBlank(key)) {
+            return;
+        }
+        String oldValue = store.get(key);
+        if (Objects.equals(value, oldValue)) {
+            return;
+        }
+        store.put(key, value);
+        for (OptionChangeListener listener : LISTENERS) {
+            try {
+                listener.onChanged(key, value, oldValue);
+            } catch (Throwable ex) {
+                LOG.error(ex.toString(), ex);
+            }
+        }
+        doFinishedChanged(key, value, oldValue);
+    }
+
+    public static String get(String key) {
+        return store.get(key);
+    }
+
+
+    public static void remove(String key) {
+         store.remove(key);
+    }
+
+
+
+
+    public static String get(String key, String defaultvalue) {
+        String v = get(key);
+        return StringUtils.isBlank(v) ? defaultvalue : v;
+    }
+
+    public static  ConcurrentHashMap.KeySetView<String, String> keySet() {
+        return store.keySet();
+    }
+
+    public static boolean getAsBool(String key) {
+        return Boolean.parseBoolean(store.get(key));
+    }
+
+
+
+    public static boolean isTrueOrNull(String key) {
+        String data = get(key);
+        return data == null || "true".equals(data);
+    }
+
+    public static int getAsInt(String key, int defaultValue) {
+        String value = get(key);
+        if (StringUtils.isBlank(value)) {
+            return defaultValue;
+        }
+        try {
+            return Integer.parseInt(value);
+        } catch (Exception ex) {
+            LOG.warn(ex.toString(), ex);
+            return defaultValue;
+        }
+    }
+
+    public static float getAsFloat(String key, float defaultValue) {
+        String value = get(key);
+        if (StringUtils.isBlank(value)) {
+            return defaultValue;
+        }
+        try {
+            return Float.parseFloat(value);
+        } catch (Exception ex) {
+            LOG.warn(ex.toString(), ex);
+            return defaultValue;
+        }
+    }
+
+    public static void addListener(OptionChangeListener listener) {
+        LISTENERS.add(listener);
+    }
+
+    public static void removeListener(OptionChangeListener listener) {
+        LISTENERS.remove(listener);
+    }
+
+
+    public static interface OptionChangeListener {
+        public void onChanged(String key, String newValue, String oldValue);
+    }
+
+
+    private static void doFinishedChanged(String key, String value, String oldValue) {
+
+
+    }
+
+
+
+    private static boolean fakeStaticEnable = false;
+    private static String fakeStaticSuffix = "";
+
+    public static String getAppUrlSuffix() {
+        return fakeStaticEnable
+                ? (StringUtils.isBlank(fakeStaticSuffix) ? "" : fakeStaticSuffix)
+                : "";
+    }
+
+    public static OptionStore getStore() {
+        return store;
+    }
+
+
+    public static interface OptionStore {
+
+        public String get(String key);
+
+        public void put(String key, String value);
+
+        public void remove(String key);
+
+        public ConcurrentHashMap.KeySetView<String, String> keySet();
+
+    }
+}

+ 13 - 0
src/main/java/com/zx/dataservice/options/WSOptions.java

@@ -56,10 +56,21 @@ public class WSOptions {
         public void remove(String key) {
             cache.remove(key);
         }
+
+        public ConcurrentHashMap.KeySetView<String, String> keySet() {
+            return cache.keySet();
+        }
     };
 
     private static List<OptionChangeListener> LISTENERS = new ArrayList<>();
 
+    public static void remove(String key) {
+        store.remove(key);
+    }
+    public static  ConcurrentHashMap.KeySetView<String, String> keySet() {
+        return store.keySet();
+    }
+
     public static void set(String key, String value) {
         if (StringUtils.isBlank(key)) {
             return;
@@ -166,5 +177,7 @@ public class WSOptions {
 
         public void remove(String key);
 
+        public ConcurrentHashMap.KeySetView<String, String> keySet();
+
     }
 }

+ 15 - 1
src/main/java/com/zx/dataservice/options/ZXOptions.java

@@ -57,10 +57,20 @@ public class ZXOptions {
         public void remove(String key) {
             cache.remove(key);
         }
+
+        public ConcurrentHashMap.KeySetView<String, String> keySet() {
+            return cache.keySet();
+        }
+
     };
 
+
     private static List<OptionChangeListener> LISTENERS = new ArrayList<>();
 
+    public static void remove(String key) {
+        store.remove(key);
+    }
+
     public static void set(String key, String value) {
         if (StringUtils.isBlank(key)) {
             return;
@@ -138,7 +148,9 @@ public class ZXOptions {
     public static interface OptionChangeListener {
         public void onChanged(String key, String newValue, String oldValue);
     }
-
+    public static  ConcurrentHashMap.KeySetView<String, String> keySet() {
+        return store.keySet();
+    }
 
     private static void doFinishedChanged(String key, String value, String oldValue) {
 
@@ -167,5 +179,7 @@ public class ZXOptions {
 
         public void remove(String key);
 
+        public ConcurrentHashMap.KeySetView<String, String> keySet();
+
     }
 }

+ 2 - 0
src/main/java/com/zx/dataservice/service/ChoiceHisService.java

@@ -3,4 +3,6 @@ package com.zx.dataservice.service;
 public interface ChoiceHisService {
 
     void analysisHistData();
+
+    void toAnalysisHistData();
 }

+ 176 - 12
src/main/java/com/zx/dataservice/service/impl/ChoiceHisServiceImpl.java

@@ -2,12 +2,19 @@ package com.zx.dataservice.service.impl;
 
 import com.jfinal.plugin.activerecord.Db;
 import com.jfinal.plugin.activerecord.Record;
+import com.zx.dataservice.options.DataOptions;
+import com.zx.dataservice.options.WSOptions;
+import com.zx.dataservice.pojo.StockRestPojo;
 import com.zx.dataservice.service.ChoiceHisService;
+import com.zx.dataservice.utils.BigdecimalUtil;
 import com.zx.dataservice.utils.DateUtils;
 import com.zx.dataservice.utils.WorkingDayUtil;
+import com.zx.dataservice.vo.StockRestRedisVO;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -18,32 +25,189 @@ public class ChoiceHisServiceImpl implements ChoiceHisService {
     @Override
     public void analysisHistData() {
         List<Record> records = Db.use("gp").find("select id, code, name from t_stock_base_info where is_rest_add = 0 order by id asc ");
-        for (Record record:records) {
+        for (Record record : records) {
             String str = Db.use("gp").queryStr("select  dates  from  " +
                     " data_hist_" + record.getStr("code").replace(".", "_").toLowerCase() +
                     " order by realtime+0 desc  limit 1 ");
-            if(StringUtils.isNotBlank(str)){
-                String newTime = new WorkingDayUtil().getNewTime(str, "yyyy/MM/dd",5);
-                if(DateUtils.dateTime("yyyy/MM/dd",newTime).before(new Date())){  // 五天内还是 无数据
-                    System.out.println("五天内无数据股票****"+record.getStr("code")+"***"+newTime);
-                        Db.use("gp").update(" update t_stock_base_info set is_rest_add = 2  where id = ? ",record.get("id")+"");
+            if (StringUtils.isNotBlank(str)) {
+                String newTime = new WorkingDayUtil().getNewTime(str, "yyyy/MM/dd", 5);
+                if (DateUtils.dateTime("yyyy/MM/dd", newTime).before(new Date())) {  // 五天内还是 无数据
+                    System.out.println("五天内无数据股票****" + record.getStr("code") + "***" + newTime);
+                    Db.use("gp").update(" update t_stock_base_info set is_rest_add = 2  where id = ? ", record.get("id") + "");
                 }
             }
         }
 
         List<Record> record2s = Db.use("zq").find("select id, code, name from t_stock_base_info where is_rest_add = 0 order by id asc ");
-        for (Record record:record2s) {
+        for (Record record : record2s) {
             String str = Db.use("zq").queryStr("select  dates  from  " +
                     " data_hist_" + record.getStr("code").replace(".", "_").toLowerCase() +
                     " order by realtime+0 desc  limit 1 ");
-            if(StringUtils.isNotBlank(str)){
-                String newTime = new WorkingDayUtil().getNewTime(str, "yyyy/MM/dd",5);
-                if(DateUtils.dateTime("yyyy/MM/dd",newTime).before(new Date())){  // 五天内还是 无数据
-                    System.out.println("五天内无数据股票****"+record.getStr("code")+"***"+newTime);
-                        Db.use("zq").update(" update t_stock_base_info set is_rest_add = 2  where id = ? ",record.get("id")+"");
+            if (StringUtils.isNotBlank(str)) {
+                String newTime = new WorkingDayUtil().getNewTime(str, "yyyy/MM/dd", 5);
+                if (DateUtils.dateTime("yyyy/MM/dd", newTime).before(new Date())) {  // 五天内还是 无数据
+                    System.out.println("五天内无数据股票****" + record.getStr("code") + "***" + newTime);
+                    Db.use("zq").update(" update t_stock_base_info set is_rest_add = 2  where id = ? ", record.get("id") + "");
                 }
             }
         }
 
     }
+
+    @Override
+    public void toAnalysisHistData() {
+        //一共3种情况 ,1.历史数据不需要风控 2.历史数据需要风控且没有风控记录且没有实时数据  3.历史数据存在风控并且存在实时数据
+        //1.循环需要风控的记录
+        for (String key : DataOptions.keySet()) {
+            try {
+                //2. 查询备份表 最后一条记录 ,在 正常表里查询是否 为最后一条
+                String keyArr[] = key.split("_"); // hy_BTC_LTC
+                String code = keyArr[1];
+                String tocode = keyArr[2];
+                String oldTabeName = "data_hist_" + code.replace(".", "_").toLowerCase();
+                String toTabeName = "data_hist_" + tocode.replace(".", "_").toLowerCase() + "_" + keyArr[0].replace(".", "_").toLowerCase();
+                String tortTabeName = "data_rt_" + tocode.replace(".", "_").toLowerCase() + "_" + keyArr[0].replace(".", "_").toLowerCase();
+                Record todRec = Db.use("gp").findFirst(" select id,dates from  " + toTabeName + "  order by dates desc  limit 1 ");
+                String riskTableName = "risk_control_formula_history" + keyArr[0];
+                List<Record> recordsnew = new ArrayList<>();
+                if (todRec != null) { // 不为Null 那么查询 正常表内 此时间后的所有 记录
+                    List<Record> oldRecordList = Db.use("gp").find(" select * from  " + oldTabeName + " where dates > '" + todRec.get("dates") + "' order by dates asc ");
+                    for (Record record : oldRecordList) {
+                        Record record1 = new Record();
+                        record1.setColumns(record);
+                        // 查询当天的数据 开盘价
+                        Record ropen = Db.use("gp").findFirst("select id,now from " + tortTabeName + "  where  " +
+                                "date = '" + record.getStr("dates").replace("-", "").replace("/", "") + "' " +
+                                " and  high <> '0' and low <> '0' and open <> '0'  order by time+0 asc LIMIT 1    ");
+                        if(ropen!=null){  // 存在当天的数据就直接取 当天的数据
+                            //开盘价
+                            String openn = ropen.get("now")+"";
+                            // 昨收
+                            String preclosen = ropen.get("preclose")+"";
+                            //收盘价
+                            Record rclose = Db.use("gp").findFirst("select id,now from " + tortTabeName + "  where  " +
+                                    "date = '" + record.getStr("dates").replace("-", "").replace("/", "") + "' " +
+                                    " and  high <> '0' and low <> '0' and open <> '0'  order by time+0 desc LIMIT 1    ");
+                            String closen = ropen.get("now")+"";
+                            //最高,最低
+                            Record rmaxmin = Db.use("gp").findFirst("select min(now) min ,max(now) max from " + tortTabeName + "  where  " +
+                                    "date = '" + record.getStr("dates").replace("-", "").replace("/", "") + "'  ");
+                            String minn = ropen.get("min")+"";
+                            String maxn = ropen.get("max")+"";
+                            BigDecimal bbb = new BigDecimal(minn).add(new BigDecimal(maxn));
+                            // 平均
+                            String AVERAGE =  bbb.divide(new BigDecimal(2), 4, 2)+"";
+                            // change 涨跌
+                            String changen = BigdecimalUtil.getNew(rclose+ "", preclosen, "-", 4, 2);
+                            // 涨跌幅 pctchange
+                            String pctchangen = BigdecimalUtil.getNew(changen, preclosen, "/", 4, 2);
+                            record1.set("open",openn);
+                            record1.set("preclose",preclosen);
+                            record1.set("close",closen);
+                            record1.set("low",minn);
+                            record1.set("high",maxn);
+                            record1.set("average",AVERAGE);
+                            record1.set("change",changen);
+                            record1.set("pctchange",pctchangen);
+                            recordsnew.add(record1);
+                        }else {  // 没有今天的实时数据
+                            // 判断此天是否 存在风控  开盘价
+                            // 当天存在风控
+                            Record recordtoday = Db.use("gp").findFirst(" select id ,code,minimumFluctuation as mini,riskControl as risk,multiples," +
+                                    "tocode,startTime,endTime" +
+                                    " from " + riskTableName + "  where   code = '" + code + "' and tocode = '" + tocode + "' " +
+                                    " and (endTime is null or " +
+                                    " ( startTime >  " + DateUtils.timeInMillis(DateUtils.stampToDate(record.get("realTime") + "000", "yyyy-MM-dd") + " 00:00:00") + " " +
+                                    " AND endTime < " + DateUtils.timeInMillis(DateUtils.stampToDate(record.get("realTime") + "000", "yyyy-MM-dd") + " 59:59:59") + " )" +
+                                    " ) limit 1 ");
+                            if(recordtoday!=null){
+                                String mini = recordtoday.get("mini");// 最小波动
+                                String multiples = recordtoday.get("multiples");// 倍数
+                                String risk1 = recordtoday.getStr("risk").substring(0, 1); // 风险  +-*/110
+                                String risk2 = BigdecimalUtil.getNew(mini,
+                                        recordtoday.getStr("risk").substring(1, recordtoday.getStr("risk").length()), "*", 4, 2);
+
+                                // 如果 在 id 天 0点之前开了 风控 ,  startTime < DateUtils.timeInMillis(DateUtils.stampToDate(id + "000", "yyyy-MM-dd")+" 00:00:00")
+                                //     (endTime is null  or  endTime > DateUtils.timeInMillis(DateUtils.stampToDate(id + "000", "yyyy-MM-dd")+" 00:00:00"))  // open
+                                String nhigh = BigdecimalUtil.getNew(record.get("high") + "", risk2, risk1, 4, 2, multiples);
+                                String nlow = BigdecimalUtil.getNew(record.get("low") + "", risk2, risk1, 4, 2, multiples);
+                                String openn = BigdecimalUtil.getNew(record.get("open") + "", risk2, risk1, 4, 2,multiples) ;
+                                String closen = BigdecimalUtil.getNew(record.get("close") + "", risk2, risk1, 4, 2,multiples) ;
+                                String preclose = BigdecimalUtil.getNew(record.get("preclose")+ "", risk2, risk1, 4, 2, multiples);
+                                BigDecimal bbb = new BigDecimal(nhigh).add(new BigDecimal(nlow));
+                                String AVERAGE =  bbb.divide(new BigDecimal(2), 4, 2)+"";
+                                String CHANGE  =  BigdecimalUtil.getNew(closen, preclose, "-", 4, 2);
+                                String pctchange =  BigdecimalUtil.getNew(CHANGE, preclose, "/", 4, 2);
+                                record1.set("open",openn);
+                                record1.set("preclose",preclose);
+                                record1.set("close",closen);
+                                record1.set("low",nlow);
+                                record1.set("high",nhigh);
+                                record1.set("average",AVERAGE);
+                                record1.set("change",CHANGE);
+                                record1.set("pctchange",pctchange);
+                                recordsnew.add(record1);
+                            }else {
+                                recordsnew.add(record1);
+                            }
+                        }
+                    }
+
+                } else {
+                    String v = DataOptions.get(key);
+                    String valueArr [] = v.split("&");
+                    String mini = valueArr[1];// 最小波动
+                    String risk1 = valueArr[2].substring(0, 1); // 风险  +-*/110
+                    String multiples = valueArr[3]; //倍数
+                    String risk2 = BigdecimalUtil.getNew(mini,valueArr[2].substring(1, valueArr[2].length()),"*",4,2) ; // 风险  +-*/110
+
+                    List<Record> oldRecordList = Db.use("gp").find(" select * from  " + oldTabeName + "   order by dates asc ");
+                    for (Record record : oldRecordList) {
+                        Record record1 = new Record();
+                        record1.setColumns(record);
+                        // 如果是倍数风控
+                        if(!"1".equals(multiples)){
+                            //是倍数风控 则表示初始数据需要倍数化
+                            String nhigh = BigdecimalUtil.getNew(record.get("high") + "", risk2, risk1, 4, 2, multiples);
+                            String nlow = BigdecimalUtil.getNew(record.get("low") + "", risk2, risk1, 4, 2, multiples);
+                            String openn = BigdecimalUtil.getNew(record.get("open") + "", risk2, risk1, 4, 2,multiples) ;
+                            String closen = BigdecimalUtil.getNew(record.get("close") + "", risk2, risk1, 4, 2,multiples) ;
+                            String preclose = BigdecimalUtil.getNew(record.get("preclose")+ "", risk2, risk1, 4, 2, multiples);
+                            BigDecimal bbb = new BigDecimal(nhigh).add(new BigDecimal(nlow));
+                            String AVERAGE =  bbb.divide(new BigDecimal(2), 4, 2)+"";
+                            String CHANGE  =  BigdecimalUtil.getNew(closen, preclose, "-", 4, 2);
+                            String pctchange =  BigdecimalUtil.getNew(CHANGE, preclose, "/", 4, 2);
+                            record1.set("open",openn);
+                            record1.set("preclose",preclose);
+                            record1.set("close",closen);
+                            record1.set("low",nlow);
+                            record1.set("high",nhigh);
+                            record1.set("average",AVERAGE);
+                            record1.set("change",CHANGE);
+                            record1.set("pctchange",pctchange);
+                            recordsnew.add(record1);
+                        }else {
+                            recordsnew.add(record1);
+                        }
+                    }
+                }
+                if (recordsnew.size() > 0) {
+                    int size = recordsnew.size();
+                    if (500 >= size) {
+                        Db.use("gp").batchSave(toTabeName, recordsnew, recordsnew.size());
+                    } else {
+                        int serial = size / 500;
+                        for (int ii = 0; ii < serial; ii++) {
+                            Db.use("gp").batchSave(toTabeName, recordsnew.subList(ii * 500, ii * 500 + 500), 500);
+                        }
+                        int remain = size - serial * 500;
+                        Db.use("gp").batchSave(toTabeName, recordsnew.subList(serial * 500, size), remain);
+                    }
+                }
+
+            } catch (Exception e) {
+
+            }
+        }
+    }
 }

+ 121 - 93
src/main/java/com/zx/dataservice/service/impl/ChoiceTempIndexServiceImpl.java

@@ -1,9 +1,12 @@
 package com.zx.dataservice.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.jfinal.plugin.activerecord.Db;
 import com.zx.dataservice.controller.WebSocketController;
 import com.zx.dataservice.mapper1.ChoiceStockMapper;
 import com.zx.dataservice.options.DataOptions;
+import com.zx.dataservice.options.RiskOptions;
+import com.zx.dataservice.options.WSOptions;
 import com.zx.dataservice.pojo.StockRestPojo;
 import com.zx.dataservice.service.ChoiceTempIndexService;
 import com.zx.dataservice.utils.*;
@@ -48,12 +51,11 @@ public class ChoiceTempIndexServiceImpl implements ChoiceTempIndexService {
             return;
         }
         List<StockRestPojo> stockRestPojoList = new ArrayList<>();
-        List<StockRestVO> stockRestVOList = new ArrayList<>();
         List<StockRestRedisVO> stockRestRedisVOList = new ArrayList<>();
         Map<String,List<StockRestRedisVO>>mapws = new HashMap<>();
-        mapws.put("stockRestRedisVO",new ArrayList<>());  // 无风控数据
-        for(String key: DataOptions.keySet()){  // 所有的需要风控的 客户
-            mapws.put("stockRestRedisVO_"+key,new ArrayList<>());
+//        mapws.put("stockRestRedisVO",new ArrayList<>());  // 无风控数据
+        for(String key: WSOptions.keySet()){  // 所有的需要推送的 客户
+            mapws.put("stockRestRedisVO_"+ WSOptions.get(key).split("_")[0],new ArrayList<>());
         }
         StockRestPojo stockRestPojo;
         StockRestVO stockRestVO;
@@ -185,7 +187,6 @@ public class ChoiceTempIndexServiceImpl implements ChoiceTempIndexService {
                         stockRestPojoList.add(stockRestPojo);
                         stockRestVO = new StockRestVO();
                         BeanUtils.copyProperties(stockRestPojo, stockRestVO);
-                        stockRestVOList.add(stockRestVO);
                         stockRestRedisVO = new StockRestRedisVO();
                         stockRestRedisVO.setCode(entry.getKey().toUpperCase());
                         stockRestRedisVO.setNowPrice(stockRestPojo.getNow());
@@ -194,24 +195,29 @@ public class ChoiceTempIndexServiceImpl implements ChoiceTempIndexService {
                         stockRestRedisVO.setHighlimit(stockRestPojo.getHighlimit());
                         stockRestRedisVO.setLowlimit(stockRestPojo.getLowlimit());
 //                        stockRestRedisVOList.add(stockRestRedisVO);// old
-                        mapws.get("stockRestRedisVO").add(stockRestRedisVO);
-                        if(DataOptions.keySet().contains(entry.getKey())){// 存在该股票的风控
-                            for(String key: DataOptions.keySet()){  // 所有的需要风控的 客户  BTC_hy  LTC_hy  000001.SZ_hy
-                                // 风控 逻辑
-                                StockRestPojo stockRestPojoRisk = getRiskNow(stockRestPojo,key,DataOptions.get(key)); // 风控后的数据
-                                stockRestPojoList.add(stockRestPojoRisk);
-                                stockRestRedisVO = new StockRestRedisVO();
-                                stockRestRedisVO.setCode(entry.getKey().toUpperCase());
-                                stockRestRedisVO.setNowPrice(stockRestPojoRisk.getNow());
-                                stockRestRedisVO.setChange(stockRestPojoRisk.getChange());
-                                stockRestRedisVO.setHcrate(stockRestPojoRisk.getPctchange());
-                                stockRestRedisVO.setHighlimit(stockRestPojoRisk.getHighlimit());
-                                stockRestRedisVO.setLowlimit(stockRestPojoRisk.getLowlimit());
-                                mapws.get("stockRestRedisVO_"+key).add(stockRestRedisVO);
+
+                        for (String key2 : WSOptions.keySet()){  // 所有的需要推送的客户
+                            // 如果该股票需要风控
+                            if(DataOptions.get("keyall").contains((WSOptions.get(key2).split("_")[0]+"_"+entry.getKey().toUpperCase()))){  // 存在该用户的该股票的风控 记录
+                                for (String key : DataOptions.keySet()) {  // 所有的需要风控的 客户  BTC_BTC_hy  LTC_hy  000001.SZ_hy  LTC_test  test_BTC_BTC
+                                    // 风控 逻辑
+                                    if (key.contains(entry.getKey())) {// 存在该股票的风控  LTC_hy . contains (LTC)
+                                        StockRestPojo stockRestPojoRisk = getRiskNow(stockRestPojo, key, DataOptions.get(key)); // 风控后的数据 //tocode & mini & risk & multiples & status
+                                        stockRestPojoList.add(stockRestPojoRisk);
+                                        stockRestRedisVO = new StockRestRedisVO();
+                                        stockRestRedisVO.setCode(entry.getKey().toUpperCase());
+                                        stockRestRedisVO.setNowPrice(stockRestPojoRisk.getNow());
+                                        stockRestRedisVO.setChange(stockRestPojoRisk.getChange());
+                                        stockRestRedisVO.setHcrate(stockRestPojoRisk.getPctchange());
+                                        stockRestRedisVO.setHighlimit(stockRestPojoRisk.getHighlimit());
+                                        stockRestRedisVO.setLowlimit(stockRestPojoRisk.getLowlimit());
+                                        mapws.get("stockRestRedisVO_" + WSOptions.get(key2).split("_")[0]).add(stockRestRedisVO);   //  stockRestRedisVO_hy
+                                    }
+                                }
+                            }else {
+                                mapws.get("stockRestRedisVO_"+ WSOptions.get(key2).split("_")[0]).add(stockRestRedisVO);
                             }
                         }
-
-
                     }
                 }catch (Exception e){
                     log.error("错误数据导致失败" + e);
@@ -220,7 +226,7 @@ public class ChoiceTempIndexServiceImpl implements ChoiceTempIndexService {
             map = null;
         }
         // 5.入库
-        insertList(stockRestPojoList, stockRestVOList, mapws,type);
+        insertList(stockRestPojoList,  mapws,type);
         stockRestPojoList = null;
     }
 
@@ -236,6 +242,11 @@ public class ChoiceTempIndexServiceImpl implements ChoiceTempIndexService {
         List<StockRestPojo> stockRestPojoList = new ArrayList<>();
         List<StockRestVO> stockRestVOList = new ArrayList<>();
         List<StockRestRedisVO> stockRestRedisVOList = new ArrayList<>();
+        Map<String,List<StockRestRedisVO>>mapws = new HashMap<>();
+//        mapws.put("stockRestRedisVO",new ArrayList<>());  // 无风控数据
+        for(String key: WSOptions.keySet()){  // 所有的需要推送的 客户
+            mapws.put("stockRestRedisVO_"+ WSOptions.get(key).split("_")[0],new ArrayList<>());
+        }
         StockRestPojo stockRestPojo;
         StockRestVO stockRestVO;
         StockRestRedisVO stockRestRedisVO;
@@ -373,7 +384,31 @@ public class ChoiceTempIndexServiceImpl implements ChoiceTempIndexService {
                         stockRestRedisVO.setHcrate(stockRestPojo.getPctchange());
                         stockRestRedisVO.setHighlimit(stockRestPojo.getHighlimit());
                         stockRestRedisVO.setLowlimit(stockRestPojo.getLowlimit());
-                        stockRestRedisVOList.add(stockRestRedisVO);
+//                        stockRestRedisVOList.add(stockRestRedisVO);
+
+                        for (String key2 : WSOptions.keySet()){  // 所有的需要推送的客户
+                            // 如果该股票需要风控
+                            if(DataOptions.get("keyall").contains((WSOptions.get(key2).split("_")[0]+entry.getKey().toUpperCase()))){  // 存在该用户的该股票的风控 记录
+                                for (String key : DataOptions.keySet()) {  // 所有的需要风控的 客户  BTC_BTC_hy  LTC_hy  000001.SZ_hy  LTC_test  test_BTC_BTC
+                                    // 风控 逻辑
+                                    if (key.contains(entry.getKey())) {// 存在该股票的风控  LTC_hy . contains (LTC)
+                                        StockRestPojo stockRestPojoRisk = getRiskNow(stockRestPojo, key, DataOptions.get(key)); // 风控后的数据 //tocode & mini & risk & multiples & status
+                                        stockRestPojoList.add(stockRestPojoRisk);
+                                        stockRestRedisVO = new StockRestRedisVO();
+                                        stockRestRedisVO.setCode(entry.getKey().toUpperCase());
+                                        stockRestRedisVO.setNowPrice(stockRestPojoRisk.getNow());
+                                        stockRestRedisVO.setChange(stockRestPojoRisk.getChange());
+                                        stockRestRedisVO.setHcrate(stockRestPojoRisk.getPctchange());
+                                        stockRestRedisVO.setHighlimit(stockRestPojoRisk.getHighlimit());
+                                        stockRestRedisVO.setLowlimit(stockRestPojoRisk.getLowlimit());
+                                        mapws.get("stockRestRedisVO_" + WSOptions.get(key2).split("_")[0]).add(stockRestRedisVO);   //  stockRestRedisVO_hy
+                                    }
+                                }
+                            }else {
+                                mapws.get("stockRestRedisVO_"+ WSOptions.get(key2).split("_")[0]).add(stockRestRedisVO);
+                            }
+                        }
+
                     }
                 }catch (Exception e){
                     log.error("错误数据导致失败" + e);
@@ -382,60 +417,42 @@ public class ChoiceTempIndexServiceImpl implements ChoiceTempIndexService {
             map = null;
         }
         // 5.入库
-        insertListAfter(stockRestPojoList, stockRestVOList, stockRestRedisVOList,type);
+        insertListAfter(stockRestPojoList, stockRestVOList, mapws,type);
         stockRestPojoList = null;
     }
 
-    private void insertListAfter(List<StockRestPojo> list, List<StockRestVO> stockRestVOList, List<StockRestRedisVO> stockRestRedisVOList,String type) {
+    private void insertListAfter(List<StockRestPojo> list, List<StockRestVO> stockRestVOList, Map<String,List<StockRestRedisVO>>mapws ,String type) {
         int insertLength = list.size();
         int i = 0;
         int insertSize = 500;
         while (insertLength > insertSize) {
                 choiceStockMapper.insertBatchByAfter(list.subList(i, i + insertSize));
-            List<StockRestVO> subList = stockRestVOList.subList(i, i + insertSize);
-            List<StockRestRedisVO> subRedisList = stockRestRedisVOList.subList(i, i + insertSize);
             i = i + insertSize;
             insertLength = insertLength - insertSize;
-            Thread thread=new Thread(new Runnable() {
-                @Override
-                public void run() {
-//                    HttpRequest.httpPostWithjson(url, JSON.toJSONString(subList));
-//                    if(BuyAndSellUtils.isTransState()){
-                    try {
-                        new WebSocketController().sendSysMsgType("ZS",JSON.toJSONString(subRedisList));
-//                            HttpRequest.httpPostWithjson(urlRedis, JSON.toJSONString(subRedisList));
-                    }catch (Exception e){
-                        log.error("插入redis错误" + e);
-                    }
-//                    }
-                }
-            });
-            thread.start();
+
         }
         if (insertLength > 0) {
-
             choiceStockMapper.insertBatchByAfter(list.subList(i, i + insertLength));
-            List<StockRestVO> subList = stockRestVOList.subList(i, i + insertLength);
-            List<StockRestRedisVO> subRedisList = stockRestRedisVOList.subList(i, i + insertLength);
-            Thread thread=new Thread(new Runnable() {
-                @Override
-                public void run() {
+        }
+
+        Thread thread=new Thread(new Runnable() {
+            @Override
+            public void run() {
 //                    HttpRequest.httpPostWithjson(url, JSON.toJSONString(subList));
 //                    if(BuyAndSellUtils.isTransState()){
-                    try {
-                        new WebSocketController().sendSysMsgType("ZS",JSON.toJSONString(subRedisList));
+                try {
+                    new WebSocketController().sendSysMsgType("ZS",mapws);
 //                            HttpRequest.httpPostWithjson(urlRedis, JSON.toJSONString(subRedisList));
-                    }catch (Exception e){
-                        log.error("插入redis错误" + e);
-                    }
-//                    }
+                }catch (Exception e){
+                    log.error("插入redis错误" + e);
                 }
-            });
-            thread.start();
-        }
+//                    }
+            }
+        });
+        thread.start();
     }
 
-    private void insertList(List<StockRestPojo> list, List<StockRestVO> stockRestVOList,Map<String,List<StockRestRedisVO>>mapws ,String type) { // List<StockRestRedisVO> stockRestRedisVOList
+    private void insertList(List<StockRestPojo> list,Map<String,List<StockRestRedisVO>>mapws ,String type) { // List<StockRestRedisVO> stockRestRedisVOList
         int insertLength = list.size();
         int i = 0;
         int insertSize = 500;
@@ -445,25 +462,8 @@ public class ChoiceTempIndexServiceImpl implements ChoiceTempIndexService {
             }else {
                 choiceStockMapper.insertBatchByAfter(list.subList(i, i + insertSize));
             }
-            List<StockRestVO> subList = stockRestVOList.subList(i, i + insertSize);
-            List<StockRestRedisVO> subRedisList = stockRestRedisVOList.subList(i, i + insertSize);
             i = i + insertSize;
             insertLength = insertLength - insertSize;
-            Thread thread=new Thread(new Runnable() {
-                @Override
-                public void run() {
-//                    HttpRequest.httpPostWithjson(url, JSON.toJSONString(subList));
-//                    if(BuyAndSellUtils.isTransState()){
-                    try {
-                        new WebSocketController().sendSysMsgType("ZS",JSON.toJSONString(subRedisList));
-//                            HttpRequest.httpPostWithjson(urlRedis, JSON.toJSONString(subRedisList));
-                    }catch (Exception e){
-                        log.error("插入redis错误" + e);
-                    }
-//                    }
-                }
-            });
-            thread.start();
         }
         if (insertLength > 0) {
             if("now".equals(type)){
@@ -471,38 +471,66 @@ public class ChoiceTempIndexServiceImpl implements ChoiceTempIndexService {
             }else {
                 choiceStockMapper.insertBatchByAfter(list.subList(i, i + insertLength));
             }
-            List<StockRestVO> subList = stockRestVOList.subList(i, i + insertLength);
-            List<StockRestRedisVO> subRedisList = stockRestRedisVOList.subList(i, i + insertLength);
-            Thread thread=new Thread(new Runnable() {
-                @Override
-                public void run() {
+        }
+        Thread thread=new Thread(new Runnable() {
+            @Override
+            public void run() {
 //                    HttpRequest.httpPostWithjson(url, JSON.toJSONString(subList));
 //                    if(BuyAndSellUtils.isTransState()){
-                    try {
-                        new WebSocketController().sendSysMsgType("ZS",JSON.toJSONString(subRedisList));
+                try {
+                    new WebSocketController().sendSysMsgType("ZS",mapws);
 //                            HttpRequest.httpPostWithjson(urlRedis, JSON.toJSONString(subRedisList));
-                    }catch (Exception e){
-                        log.error("插入redis错误" + e);
-                    }
-//                    }
+                }catch (Exception e){
+                    log.error("插入redis错误" + e);
                 }
-            });
-            thread.start();
-        }
+//                    }
+            }
+        });
+        thread.start();
     }
 
 
     public StockRestPojo getRiskNow (StockRestPojo stockRestPojo,String key,String value){
-        // KEY =  code _ hy // BTC_hy
+        // KEY =  code _ hy // BTC_BTC_hy
         String [] valueArr = value.split("&");  //tocode & mini & risk & multiples & status
+        String [] keyArr = key.split("_");  //code _ hy // BTC_BTC_hy  CODE  to  tocode
+        StringBuffer tableName = new StringBuffer("data_rt_");
+        tableName.append(valueArr[0].replace(".", "_").toLowerCase());
+        tableName.append("_"+keyArr[0]);
         if("1".equals(valueArr[4])){ // 如果此时没有开启风控 那么不变化
-            StringBuffer tableName = new StringBuffer("data_rt_");
-            tableName.append(valueArr[0].replace(".", "_").toLowerCase());
-
             stockRestPojo.setTableName(tableName.toString());
             return stockRestPojo;
         }else {
+            String tocode = valueArr[0];  // 新币
+            String mini = valueArr[1];// 最小波动
+            String risk1 = valueArr[2].substring(0, 1); // 风险  +-*/110
+            String multiples = valueArr[3]; //倍数
+            String risk2 = BigdecimalUtil.getNew(mini,valueArr[2].substring(1, valueArr[2].length()),"*",4,2) ; // 风险  +-*/110
             StockRestPojo stockRestPojoNew = new StockRestPojo();
+            BeanUtils.copyProperties(stockRestPojo,stockRestPojoNew,StockRestPojo.class);
+            String nnow = BigdecimalUtil.getNew(stockRestPojo.getNow() + "", risk2, risk1, 4, 2, multiples);
+            stockRestPojoNew.setTableName(tableName.toString()); // 表
+            stockRestPojoNew.setNow(nnow); // 现价
+            // 高
+            stockRestPojoNew.setHigh(BigdecimalUtil.getNew(stockRestPojo.getHigh() + "", risk2, risk1, 4, 2, multiples));
+            // 低
+            stockRestPojoNew.setLow(BigdecimalUtil.getNew(stockRestPojo.getLow() + "", risk2, risk1, 4, 2, multiples));
+            //开 取当天第一条 存缓存
+            if(StringUtils.isBlank(RiskOptions.get("open_"+key))){  // 为空就存 当前的now价为开盘价
+                RiskOptions.set("open_"+key,stockRestPojoNew.getNow()+"");
+            }
+            stockRestPojoNew.setOpen(RiskOptions.get("open_"+key));
+            //前收
+            if(StringUtils.isBlank(RiskOptions.get("preclose_"+key))){  // 为空就存 当前的计算当前的 收盘价 为收盘价 因为 除非是系统上线 不然不会在这出现为空的情况
+                String preclose = (BigdecimalUtil.getNew(stockRestPojo.getPreclose() + "", risk2, risk1, 4, 2, multiples)) ;
+                RiskOptions.set("preclose_"+key,preclose);
+            }
+            stockRestPojoNew.setPreclose(RiskOptions.get("preclose_"+key));
+
+            stockRestPojoNew.setChange((new BigDecimal(stockRestPojoNew.getNow() + "").
+                    subtract(new BigDecimal(stockRestPojoNew.getPreclose() + ""))).setScale(4, 2)+"");
+            stockRestPojoNew.setPctchange(((!"0".equals(stockRestPojoNew.getPreclose())) ?
+                    ((new BigDecimal(stockRestPojoNew.getChange() + "").divide(new BigDecimal(stockRestPojoNew.getPreclose() + ""), 4, 2))) : 0)+"");
 
 
             return stockRestPojoNew;

+ 9 - 0
src/main/java/com/zx/dataservice/task/AnalysisHisDataTask.java

@@ -9,6 +9,7 @@ import org.springframework.stereotype.Component;
 
 /**
  * 凌晨去掉退盘数据
+ * 更新指数的 风控数据
  */
 @Component
 public class AnalysisHisDataTask {
@@ -24,4 +25,12 @@ public class AnalysisHisDataTask {
         this.choiceHisService.analysisHistData();
     }
 
+    /**
+     * 凌晨6点处理指数风控
+     */
+    @Scheduled(cron = "0 30 6 * * ? ")
+    public void toAnalysisHistData() {
+        this.choiceHisService.toAnalysisHistData();
+    }
+
 }

Dosya farkı çok büyük olduğundan ihmal edildi
+ 83 - 0
src/main/java/com/zx/dataservice/task/AnalysisRiskDataTask.java


+ 1 - 1
src/main/java/com/zx/dataservice/task/AnalysisTempIndexRestDataTask.java

@@ -20,7 +20,7 @@ public class AnalysisTempIndexRestDataTask {
     private ChoiceTempIndexService choiceTempIndexService;
 
     @Async("executorTempIndex")
-    @Scheduled(fixedRate=10)
+//    @Scheduled(fixedRate=10)
     public void toAnalysisRestData() {
         doTask("now");
     }

+ 93 - 0
src/main/java/com/zx/dataservice/utils/BigdecimalUtil.java

@@ -0,0 +1,93 @@
+package com.zx.dataservice.utils;
+
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.math.BigDecimal;
+
+/**
+ * bigdcimal工具类
+ *2020-12-16
+ * @author qlm
+ */
+public class BigdecimalUtil {
+
+
+    /**
+     * 提供2个字符串的加减乘除
+     * @param str  1
+     * @param str2 2
+     * @param type +-
+     * @param i 精度
+     * @param ii 几位
+     * @return
+     */
+    public static String getNew(String str,String str2,String type,int i,int ii) {
+        BigDecimal bigDecimal  = new BigDecimal(0);
+        if("*".equals(type)){
+            bigDecimal = new BigDecimal(str).multiply(new BigDecimal(str2)).setScale(i, ii);
+        }else if("/".equals(type)){
+            if(!"0".equals(str2)){
+                bigDecimal = new BigDecimal(str).divide(new BigDecimal(str2),i,ii);
+            }
+        }else if("+".equals(type)){
+            bigDecimal = new BigDecimal(str).add(new BigDecimal(str2)).setScale(i, ii);
+        }else if("-".equals(type)){
+            bigDecimal = new BigDecimal(str).subtract(new BigDecimal(str2)).setScale(i, ii);
+        }
+        return bigDecimal.toString();
+    }
+
+    public static String getNew(String str,String str2,String type,int i,int ii,String mul) {
+        BigDecimal bigDecimal  = new BigDecimal(0);
+        if(StringUtils.isBlank(mul)){
+            if("*".equals(type)){
+                bigDecimal = new BigDecimal(str).multiply(new BigDecimal(str2)).setScale(i, ii);
+            }else if("/".equals(type)){
+                if(!"0".equals(str2)){
+                    bigDecimal = new BigDecimal(str).divide(new BigDecimal(str2),i,ii);
+                }
+            }else if("+".equals(type)){
+                bigDecimal = new BigDecimal(str).add(new BigDecimal(str2)).setScale(i, ii);
+            }else if("-".equals(type)){
+                bigDecimal = new BigDecimal(str).subtract(new BigDecimal(str2)).setScale(i, ii);
+            }
+        }else {
+            if("*".equals(type)){
+                bigDecimal = (new BigDecimal(str).multiply(new BigDecimal(mul))).multiply(new BigDecimal(str2)).setScale(i, ii);
+            }else if("/".equals(type)){
+                if(!"0".equals(str2)){
+                    bigDecimal = (new BigDecimal(str).multiply(new BigDecimal(mul))).divide(new BigDecimal(str2),i,ii);
+                }
+            }else if("+".equals(type)){
+                bigDecimal = (new BigDecimal(str).multiply(new BigDecimal(mul))).add(new BigDecimal(str2)).setScale(i, ii);
+            }else if("-".equals(type)){
+                bigDecimal = (new BigDecimal(str).multiply(new BigDecimal(mul))).subtract(new BigDecimal(str2)).setScale(i, ii);
+            }
+        }
+
+        return bigDecimal.toString();
+    }
+
+    /**
+     * 比较2个数字的大小
+     * 大于或等于 返回 true
+     */
+    public static boolean compare(String str,String str2) {
+        BigDecimal a = new BigDecimal (str);
+        BigDecimal b = new BigDecimal (str2);
+        boolean f = false ;
+        if(a.compareTo(b) == -1){
+            f =  false;
+        }
+        if(a.compareTo(b) == 0){
+            f =  true;
+        }
+        if(a.compareTo(b) == 1){
+            f =  true;
+        }
+        return f;
+
+    }
+
+}

+ 25 - 3
src/main/java/com/zx/dataservice/utils/DateUtils.java

@@ -209,9 +209,31 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
         }
     }
 
-    /**
-     * 获取服务器启动时间
-     */
+    public static void main(String[] args) {
+        System.out.println(getUSDate(getCurrentTime()));
+    }
+
+
+    public static String getUSDate(String originDate) {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date date = null;
+        if (originDate != null && !"".equals(originDate)) {
+            try {
+                date = simpleDateFormat.parse(originDate);
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+        } else {
+            date = new Date();
+        }
+        simpleDateFormat.setTimeZone(TimeZone.getTimeZone("America/New_York"));
+        return simpleDateFormat.format(date);
+
+    }
+
+        /**
+         * 获取服务器启动时间
+         */
     public static Date getServerStartDate() {
         long time = ManagementFactory.getRuntimeMXBean().getStartTime();
         return new Date(time);