From 9171d1f705c275ecd123e4d37ed8419845390040 Mon Sep 17 00:00:00 2001 From: kingschan Date: Thu, 28 Jun 2018 11:30:53 +0800 Subject: [PATCH 01/32] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E9=80=9F=E5=BA=A6=20=E4=BD=BF=E7=94=A8cdns=E5=8A=A0=E9=80=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/templates/index.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index b189124b..2409f3fd 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -4,12 +4,8 @@ 股票筛选 - - - - + - - - -
-
-
-
-
-
$
- + + + + + 股票筛选 + + + + + +
+
+ +
+
+
$
+ +
-
-
-
- +
+
+ +
-
-
-
-
PB
- +
+
+
PB
+ +
-
-
-
-
股息(动)
- +
+
+ +
-
- - +
+
+ +
+
+ + - - - + + + +
-
-
-
+
+
- - - - - - - + + + + + + + $("#search_btn").click(function () { + reloadStock(); + }); + $("#refresh_btn").click(function () { + $("#stockCode").val(""); + $("#stockType").val(""); + $("#stockPb").val(""); + $("#stockDy").val(""); + reloadStock(); + }); + $("#dy_btn").click(function () { + var ids = $("#jqGrid").jqGrid('getGridParam', 'selrow'); + if (null == ids) { + alert("请选择要查看的股票!"); + return; + } + var rowData = $("#jqGrid").jqGrid('getRowData', ids); + window.open("/stock/his_dy/" + rowData.code); + }); + $("#roe_btn").click(function () { + var ids = $("#jqGrid").jqGrid('getGridParam', 'selrow'); + if (null == ids) { + alert("请选择要查看的股票!"); + return; + } + var rowData = $("#jqGrid").jqGrid('getRowData', ids); + window.open("/stock/his_roe/" + rowData.code); + }); + $("#pe_btn").click(function () { + var ids = $("#jqGrid").jqGrid('getGridParam', 'selrow'); + if (null == ids) { + alert("请选择要查看的股票!"); + return; + } + var rowData = $("#jqGrid").jqGrid('getRowData', ids); + window.open("/stock/his_pe/" + rowData.code); + }); + $("#pb_btn").click(function () { + var ids = $("#jqGrid").jqGrid('getGridParam', 'selrow'); + if (null == ids) { + alert("请选择要查看的股票!"); + return; + } + var rowData = $("#jqGrid").jqGrid('getRowData', ids); + window.open("/stock/his_pb/" + rowData.code); + }); + \ No newline at end of file From 96f15a65ba5549e7d260e831451b44860a92437e Mon Sep 17 00:00:00 2001 From: kingschan Date: Tue, 3 Jul 2018 10:53:55 +0800 Subject: [PATCH 12/32] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme-res/stock-list.png | Bin 200863 -> 142743 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/readme-res/stock-list.png b/readme-res/stock-list.png index d3bd7723ea1412c7749067934d3ec89e429c4927..e9d3aea87cb0724dcaaa19a9fff54373a7f420fa 100644 GIT binary patch literal 142743 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 H4gbFYEwzs9 literal 200863 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 bIPjm{fLrw1sR`4LF#v(5tDnm{r-UW|7}<0x From 1bbc3823ec5c34af05ab7c44aefca9ae52307627 Mon Sep 17 00:00:00 2001 From: kingschan Date: Tue, 3 Jul 2018 11:19:50 +0800 Subject: [PATCH 13/32] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8A=E6=AC=A1?= =?UTF-8?q?=E5=88=86=E7=BA=A2=E6=95=B0=E6=8D=AE=E4=B8=8D=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/task/StockDividendTask.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java index e8d372ee..ae699bd3 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java @@ -60,9 +60,11 @@ public void stockDividendExecute() throws Exception { dividends=combineHisDy(stock.getCode()); if(null!=dividends&÷nds.size()>0){ for (int j = 0; j < dividends.size(); j++) { - if(dividends.getJSONObject(j).getDouble("percent")>0){ - percent=dividends.getJSONObject(j).getDoubleValue("percent"); - date=dividends.getJSONObject(j).getString("cxcqr"); + double tempPercent=dividends.getJSONObject(j).getDouble("percent"); + String temp_date=dividends.getJSONObject(j).getString("cxcqr"); + if(tempPercent>0&&!temp_date.equals("-")){ + percent=tempPercent; + date=temp_date; break; } } From 05cb5ef69541c5603e3b2a1c9a281e4057046919 Mon Sep 17 00:00:00 2001 From: kingschan Date: Tue, 3 Jul 2018 15:27:20 +0800 Subject: [PATCH 14/32] =?UTF-8?q?=E5=A2=9E=E5=8A=A0jisilu=20spilder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/util/stock/StockSpider.java | 26 ++++- .../util/stock/impl/DefaultSpiderImpl.java | 10 +- .../common/util/stock/impl/JisiluSpilder.java | 95 +++++++++++++++++++ 3 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/JisiluSpilder.java diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockSpider.java b/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockSpider.java index 0d6907c6..39ae7270 100644 --- a/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockSpider.java +++ b/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockSpider.java @@ -10,6 +10,7 @@ import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.cert.X509Certificate; +import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -69,6 +70,30 @@ static String findStrByRegx(String text,String regx){ } } + + /** + * 提取文本中匹配正则的字符串 + * @param text 源字符串 + * @param regx 正则 + * @return + */ + static List findStringByRegx(String text,String regx){ + List list = new ArrayList(); + try { + Pattern pattern = Pattern.compile(regx); + Matcher matcher = pattern.matcher(text); + while (matcher.find()) { + list.add(matcher.group()); + } + + return list; + } catch (Exception e) { + e.printStackTrace(); + return list; + } + + } + /** * 格式化数据,如果不是数字全部返回-1 * @@ -77,7 +102,6 @@ static String findStrByRegx(String text,String regx){ */ static Double mathFormat(String value) { String v =value.replaceAll("[^0-9|\\.|\\-]",""); - //value.replaceAll("\\%", "").replace("亿", ""); if (v.matches(regexNumber)) { return Double.valueOf(v); } diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java index 9021df13..7eb89d1e 100644 --- a/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java +++ b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java @@ -21,6 +21,8 @@ import java.io.File; import java.math.RoundingMode; import java.net.SocketTimeoutException; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; import java.text.NumberFormat; import java.util.*; @@ -91,7 +93,7 @@ public JSONArray getStockPrice(String[] stockCode) throws Exception { TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); json.put("code", data[0]);//代码 json.put("type", StockSpider.formatStockCode(data[0]).replaceAll("\\d", "")); - json.put("name", data[1].replaceAll("\\s",""));//名称 + json.put("name", data[1].replaceAll("\\s", ""));//名称 json.put("price", xj);//现价 json.put("todayMax", today_max);//今日最高价 json.put("todayMin", today_min);//今日最低价 @@ -151,9 +153,9 @@ public JSONArray getHistoryDividendRate(String code) throws Exception { JSONArray jsons = new JSONArray(); JSONObject json; for (int i = 1; i < rows.size(); i++) { - String rowtext=rows.get(i).select("td").text(); - String[] data =rowtext .split(" "); - if(data[6].equals("--")||data[9].equals("--")){ + String rowtext = rows.get(i).select("td").text(); + String[] data = rowtext.split(" "); + if (data[6].equals("--") || data[9].equals("--")) { continue; } log.debug("报告期:{},A股除权除息日:{},实施日期:{},分红方案说明:{},分红率:{}", data[0], data[6], data[3], data[4], data[9]); diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/JisiluSpilder.java b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/JisiluSpilder.java new file mode 100644 index 00000000..72c2fb7f --- /dev/null +++ b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/JisiluSpilder.java @@ -0,0 +1,95 @@ +package io.github.kingschan1204.istock.common.util.stock.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import io.github.kingschan1204.istock.common.util.stock.StockSpider; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * jisilu爬虫 + * + * @author chenguoxiang + * @create 2018-07-03 11:22 + **/ +@Component("JisiluSpilder") +public class JisiluSpilder extends DefaultSpiderImpl { + + private static Logger log = LoggerFactory.getLogger(JisiluSpilder.class); + + /** + * 得到ipo上市日期,最近公开报表,历史数据 + * + * @param code + * @return + */ + public JSONObject crawHisPbPePriceAndReports(String code) throws Exception { +// String useAgent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3346.9 Safari/537.36"; + String referrer = "https://www.jisilu.cn/data/stock/dividend_rate/#cn"; +// int timeout=8000; + JSONObject result = new JSONObject(); + String url = String.format("https://www.jisilu.cn/data/stock/%s", code); + log.info("craw jisilu page :{}", url); + StockSpider.enableSSLSocket(); + JSONArray jsons = new JSONArray(); + Document doc = null; + try { + doc = Jsoup.connect(url).userAgent(useAgent).referrer(referrer).timeout(timeout).get(); + // 得到ipo上市日期 + Elements spans = doc.getElementsByAttributeValue("style", "display: inline-block;width: 80px;color: #0088cb;font-size:12px;"); + spans.stream().forEach(span -> { + if (span.text().matches("\\d{4}\\-\\d{2}\\-\\d{2}")) { + result.put("ipoDate", span.html()); + } + }); + //拿定期公告 + Element table = doc.getElementById("tbl_periodicalreport"); + Elements tr = table.getElementsByTag("tr"); + JSONArray reportsJsons = new JSONArray(); + tr.stream().forEach(row -> { + Elements a = row.getElementsByTag("a"); + String releaseDay = row.getElementsByTag("td").get(1).text(); + String link = a.get(0).attr("href"); + String title = a.get(0).text(); + JSONObject temp = new JSONObject(); + temp.put("releaseDay", releaseDay); + temp.put("link", link); + temp.put("title", title); + reportsJsons.add(temp); + }); + result.put("reports", reportsJsons); + + //解析历史数据 + Elements js = doc.getElementsByTag("script").eq(21); + List list = StockSpider.findStringByRegx(js.html(), "\\[.*\\]"); + //依次顺序 0:日期 1:PRICE 2:PB 3:PE + String replaceRegex = "\'|\\[|\\]"; + String dates[] = list.get(0).replaceAll(replaceRegex, "").split(",");//日期 + String prices[] = list.get(1).replaceAll(replaceRegex, "").split(",");//价格 + String pbs[] = list.get(2).replaceAll(replaceRegex, "").split(",");//市净率 + String pes[] = list.get(3).replaceAll(replaceRegex, "").split(",");//市盈率 + JSONArray hisJson = new JSONArray(); + for (int i = 0; i < dates.length; i++) { + JSONObject temp = new JSONObject(); + temp.put("date", dates[i]); + temp.put("price", Double.parseDouble(prices[i])); + temp.put("pb", Double.parseDouble(pbs[i])); + temp.put("pe", Double.parseDouble(pes[i])); + hisJson.add(temp); + } + result.put("hisdata", hisJson); + + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + +} From c285d5354e0bcd364345a69aa00146f85c4e32ee Mon Sep 17 00:00:00 2001 From: kingschan Date: Tue, 3 Jul 2018 18:44:39 +0800 Subject: [PATCH 15/32] =?UTF-8?q?=E6=8D=A2=E7=A7=8D=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E5=8F=96=E5=8E=86=E5=8F=B2=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../maindata/ctrl/StockHisPageCtrl.java | 270 +++++++++++------- .../module/maindata/po/StockHisPbPe.java | 79 +++++ .../maindata/services/StockService.java | 70 +++++ src/main/resources/templates/index.html | 17 +- .../templates/stock/his/his_pbpe.html | 219 ++++++++++++++ 5 files changed, 537 insertions(+), 118 deletions(-) create mode 100644 src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisPbPe.java create mode 100644 src/main/resources/templates/stock/his/his_pbpe.html diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockHisPageCtrl.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockHisPageCtrl.java index a37bf136..fd078061 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockHisPageCtrl.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockHisPageCtrl.java @@ -1,20 +1,31 @@ package io.github.kingschan1204.istock.module.maindata.ctrl; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.mongodb.BasicDBObject; +import com.mongodb.DBCollection; +import com.mongodb.DBObject; +import io.github.kingschan1204.istock.common.util.stock.impl.JisiluSpilder; import io.github.kingschan1204.istock.module.maindata.po.*; import io.github.kingschan1204.istock.module.maindata.repository.StockRepository; import io.github.kingschan1204.istock.module.maindata.services.StockHisRoeService; import io.github.kingschan1204.istock.module.maindata.services.StockService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; +import java.util.ArrayList; import java.util.List; /** - *代码历史数据控制器 + * 代码历史数据控制器 + * * @author chenguoxiang * @create 2018-03-27 15:19 **/ @@ -27,156 +38,205 @@ public class StockHisPageCtrl { private StockService stockService; @Autowired private StockHisRoeService stockHisRoeService; - private final String template_path="/stock/his/"; - - @RequestMapping("/stock/his_dy/{code}") - public ModelAndView hisdata(@PathVariable String code, Model model){ - ModelAndView mav = new ModelAndView(template_path+"his_dy"); - mav.addObject("year","''"); - mav.addObject("percent","0"); - Stock stock =stockRepository.findOne(code); - if(null==stock){ - mav.addObject("msg",String.format("代码:%s %s",code,"不存在,或者非A股代码!")); - return mav; - } - mav.addObject("stock",stock); - //历年分红 - List list =stockService.getStockDividend(code); - if(null!=list&&list.size()>0){ - StringBuffer year = new StringBuffer(); - StringBuffer percent = new StringBuffer(); - list.stream().forEach(item ->{ - if(item.getPercent()>0){ - percent.append(item.getPercent()).append(","); - year.append("'").append(item.getTitle()).append("',"); - } - - }); - String data= String.format("%s|%s",year.toString().replaceAll("\\,$",""), - percent.toString().replaceAll("\\,$","") - ); - String item[]=data.split("\\|"); - if(item.length==2){ - mav.addObject("year",item[0]); - mav.addObject("percent",item[1]); - mav.addObject("rows",list); - } - }else{ - mav.addObject("msg","该股票没有分红信息!"); - } - return mav; - } + private final String template_path = "/stock/his/"; - @RequestMapping("/stock/his_roe/{code}") - public ModelAndView getStockHisRoe(@PathVariable String code) { - ModelAndView mav = new ModelAndView(template_path+"his_roe"); - mav.addObject("roe_year","''"); - mav.addObject("roe_percent","0"); - Stock stock =stockRepository.findOne(code); - if(null==stock){ - mav.addObject("msg",String.format("代码:%s %s",code,"不存在,或者非A股代码!")); - return mav; - } - mav.addObject("stock",stock); - List list=stockService.getStockHisRoe(code); - if(null==list||list.size()==0){ - try { - list= stockHisRoeService.addStockHisRoe(code); - } catch (Exception e) { - e.printStackTrace(); - } - } - mav.addObject("rows",list); + @RequestMapping("/stock/his_dy/{code}") + public ModelAndView hisdata(@PathVariable String code, Model model) { + ModelAndView mav = new ModelAndView(template_path + "his_dy"); + mav.addObject("year", "''"); + mav.addObject("percent", "0"); + Stock stock = stockRepository.findOne(code); + if (null == stock) { + mav.addObject("msg", String.format("代码:%s %s", code, "不存在,或者非A股代码!")); + return mav; + } + mav.addObject("stock", stock); + //历年分红 + List list = stockService.getStockDividend(code); + if (null != list && list.size() > 0) { StringBuffer year = new StringBuffer(); StringBuffer percent = new StringBuffer(); - list.stream().forEach(item ->{ - if(item.getRoe()>0){ - percent.append(item.getRoe()).append(","); - year.append("'").append(item.getYear()).append("',"); + list.stream().forEach(item -> { + if (item.getPercent() > 0) { + percent.append(item.getPercent()).append(","); + year.append("'").append(item.getTitle()).append("',"); } }); - String data= String.format("%s|%s",year.toString().replaceAll("\\,$",""), - percent.toString().replaceAll("\\,$","") + String data = String.format("%s|%s", year.toString().replaceAll("\\,$", ""), + percent.toString().replaceAll("\\,$", "") ); - String roeItem[]=data.split("\\|"); - mav.addObject("roe_year",roeItem[0]); - mav.addObject("roe_percent",roeItem[1]); + String item[] = data.split("\\|"); + if (item.length == 2) { + mav.addObject("year", item[0]); + mav.addObject("percent", item[1]); + mav.addObject("rows", list); + } + } else { + mav.addObject("msg", "该股票没有分红信息!"); + } + return mav; + } + + @RequestMapping("/stock/his_roe/{code}") + public ModelAndView getStockHisRoe(@PathVariable String code) { + ModelAndView mav = new ModelAndView(template_path + "his_roe"); + mav.addObject("roe_year", "''"); + mav.addObject("roe_percent", "0"); + Stock stock = stockRepository.findOne(code); + if (null == stock) { + mav.addObject("msg", String.format("代码:%s %s", code, "不存在,或者非A股代码!")); return mav; } + mav.addObject("stock", stock); + List list = stockService.getStockHisRoe(code); + if (null == list || list.size() == 0) { + try { + list = stockHisRoeService.addStockHisRoe(code); + } catch (Exception e) { + e.printStackTrace(); + } + } + mav.addObject("rows", list); + StringBuffer year = new StringBuffer(); + StringBuffer percent = new StringBuffer(); + list.stream().forEach(item -> { + if (item.getRoe() > 0) { + percent.append(item.getRoe()).append(","); + year.append("'").append(item.getYear()).append("',"); + } + + }); + String data = String.format("%s|%s", year.toString().replaceAll("\\,$", ""), + percent.toString().replaceAll("\\,$", "") + ); + String roeItem[] = data.split("\\|"); + mav.addObject("roe_year", roeItem[0]); + mav.addObject("roe_percent", roeItem[1]); + return mav; + } @RequestMapping("/stock/his_pe/{code}") public ModelAndView getStockHisPe(@PathVariable String code) { - ModelAndView mav = new ModelAndView(template_path+"his_pe"); - mav.addObject("pe_date","''"); - mav.addObject("pe_value","0"); - Stock stock =stockRepository.findOne(code); - if(null==stock){ - mav.addObject("msg",String.format("代码:%s %s",code,"不存在,或者非A股代码!")); + ModelAndView mav = new ModelAndView(template_path + "his_pe"); + mav.addObject("pe_date", "''"); + mav.addObject("pe_value", "0"); + Stock stock = stockRepository.findOne(code); + if (null == stock) { + mav.addObject("msg", String.format("代码:%s %s", code, "不存在,或者非A股代码!")); return mav; } - mav.addObject("stock",stock); - List list=stockService.getStockHisPe(code); - if(null==list||list.size()==0){ + mav.addObject("stock", stock); + List list = stockService.getStockHisPe(code); + if (null == list || list.size() == 0) { try { - list= stockService.addStockHisPe(code); + list = stockService.addStockHisPe(code); } catch (Exception e) { e.printStackTrace(); } } - mav.addObject("rows",list); + mav.addObject("rows", list); StringBuffer year = new StringBuffer(); StringBuffer pe = new StringBuffer(); - list.stream().forEach(item ->{ - if(item.getPe()>0){ + list.stream().forEach(item -> { + if (item.getPe() > 0) { pe.append(item.getPe()).append(","); year.append("'").append(item.getDate()).append("',"); } }); - String data= String.format("%s|%s",year.toString().replaceAll("\\,$",""), - pe.toString().replaceAll("\\,$","") + String data = String.format("%s|%s", year.toString().replaceAll("\\,$", ""), + pe.toString().replaceAll("\\,$", "") ); - String roeItem[]=data.split("\\|"); - mav.addObject("pe_date",roeItem[0]); - mav.addObject("pe_value",roeItem[1]); + String roeItem[] = data.split("\\|"); + mav.addObject("pe_date", roeItem[0]); + mav.addObject("pe_value", roeItem[1]); return mav; } @RequestMapping("/stock/his_pb/{code}") public ModelAndView getStockHisPb(@PathVariable String code) { - ModelAndView mav = new ModelAndView(template_path+"his_pb"); - mav.addObject("pb_date","''"); - mav.addObject("pb_value","0"); - Stock stock =stockRepository.findOne(code); - if(null==stock){ - mav.addObject("msg",String.format("代码:%s %s",code,"不存在,或者非A股代码!")); + ModelAndView mav = new ModelAndView(template_path + "his_pb"); + mav.addObject("pb_date", "''"); + mav.addObject("pb_value", "0"); + Stock stock = stockRepository.findOne(code); + if (null == stock) { + mav.addObject("msg", String.format("代码:%s %s", code, "不存在,或者非A股代码!")); return mav; } - mav.addObject("stock",stock); - List list=stockService.getStockHisPb(code); - if(null==list||list.size()==0){ + mav.addObject("stock", stock); + List list = stockService.getStockHisPb(code); + if (null == list || list.size() == 0) { try { - list= stockService.addStockHisPb(code); + list = stockService.addStockHisPb(code); } catch (Exception e) { e.printStackTrace(); } } - mav.addObject("rows",list); + mav.addObject("rows", list); StringBuffer year = new StringBuffer(); StringBuffer pe = new StringBuffer(); - list.stream().forEach(item ->{ - if(item.getPb()>0){ + list.stream().forEach(item -> { + if (item.getPb() > 0) { pe.append(item.getPb()).append(","); year.append("'").append(item.getDate()).append("',"); } }); - String data= String.format("%s|%s",year.toString().replaceAll("\\,$",""), - pe.toString().replaceAll("\\,$","") + String data = String.format("%s|%s", year.toString().replaceAll("\\,$", ""), + pe.toString().replaceAll("\\,$", "") ); - String roeItem[]=data.split("\\|"); - mav.addObject("pb_date",roeItem[0]); - mav.addObject("pb_value",roeItem[1]); + String roeItem[] = data.split("\\|"); + mav.addObject("pb_date", roeItem[0]); + mav.addObject("pb_value", roeItem[1]); + return mav; + } + + + @Autowired + private MongoTemplate template; + + @RequestMapping("/stock/info/{code}") + public ModelAndView getStockInfo(@PathVariable String code) throws Exception { + ModelAndView mav = new ModelAndView(template_path + "his_pbpe"); + StringBuilder date = new StringBuilder(); + StringBuilder pb = new StringBuilder(); + StringBuilder pe = new StringBuilder(); + StringBuilder price = new StringBuilder(); + + + Query query = new Query(); + query.addCriteria(Criteria.where("code").is(code)); + List lis = template.find(query, StockHisPbPe.class); + if (null == lis || lis.size() == 0) { + String data = stockService.crawAndSaveHisPbPe(code); + String[] array = data.split("|"); + //价格》日期》pb》pe + price.append(array[0]); + date.append(array[1]); + pb.append(array[2]); + pe.append(array[3]); + + } else { + for (int i = 0; i < lis.size(); i++) { + StockHisPbPe item = lis.get(i); + date.append("'").append(item.getDate()).append("'"); + pb.append(item.getPb()); + pe.append(item.getPe()); + price.append(item.getPrice()); + if (i != lis.size() - 1) { + date.append(","); + pb.append(","); + pe.append(","); + price.append(","); + } + + } + } + mav.addObject("pb", pb.toString()); + mav.addObject("pe", pe.toString()); + mav.addObject("date", date.toString()); + mav.addObject("price", price.toString()); + mav.addObject("code", code); return mav; } diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisPbPe.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisPbPe.java new file mode 100644 index 00000000..ffe2ad54 --- /dev/null +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisPbPe.java @@ -0,0 +1,79 @@ +package io.github.kingschan1204.istock.module.maindata.po; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +/** + * ${DESCRIPTION} + * + * @author chenguoxiang + * @create 2018-07-03 17:56 + **/ +@Document(collection = "stock_his_pe_pb") +public class StockHisPbPe { + /** + * "_id" : ObjectId("5b3b33799d35576680835a60"), + "code" : "601088", + "date" : "2007-10-09", + "pb" : 19.83924, + "pe" : 140.56197, + "price" : 45.3 + * */ + + @Id + private String id; + private String code; + private Double pb; + private Double pe; + private Double price; + private String date; + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public Double getPb() { + return pb; + } + + public void setPb(Double pb) { + this.pb = pb; + } + + public Double getPe() { + return pe; + } + + public void setPe(Double pe) { + this.pe = pe; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } +} diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java index 1723662a..0151d110 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java @@ -4,8 +4,10 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.mongodb.BasicDBObject; +import com.mongodb.DBCollection; import com.mongodb.DBObject; import io.github.kingschan1204.istock.common.util.stock.StockSpider; +import io.github.kingschan1204.istock.common.util.stock.impl.JisiluSpilder; import io.github.kingschan1204.istock.module.maindata.po.*; import io.github.kingschan1204.istock.module.maindata.repository.StockHisDividendRepository; import io.github.kingschan1204.istock.module.maindata.repository.StockHisPbRepository; @@ -44,6 +46,8 @@ public class StockService { private StockSpider spider; @Autowired private MongoTemplate template; + @Autowired + private JisiluSpilder jisiluSpilder; /** * add stock code @@ -282,4 +286,70 @@ public List getStockHisPe(String code){ return list; } + /** + * 抓取历史数据 + * @param code + * @return + * @throws Exception + */ + public String crawAndSaveHisPbPe(String code)throws Exception{ + + StringBuilder price = new StringBuilder(); + StringBuilder pe = new StringBuilder(); + StringBuilder pb = new StringBuilder(); + StringBuilder date = new StringBuilder(); + + JSONObject data= jisiluSpilder.crawHisPbPePriceAndReports(code); + List list = new ArrayList<>(); + DBCollection hisdata = template.getCollection("stock_his_pe_pb"); + DBCollection report = template.getCollection("stock_report"); + + JSONArray hisdataJsons=data.getJSONArray("hisdata"); + for (int i = 0; i (); + for (int i = 0; i 历史分红
  • 历史净资产收益率
  • -
  • 历史市盈率
  • -
  • 历史市净率
  • +
  • 历史pb/pe/股价
  • @@ -220,23 +219,15 @@ var rowData = $("#jqGrid").jqGrid('getRowData', ids); window.open("/stock/his_roe/" + rowData.code); }); - $("#pe_btn").click(function () { - var ids = $("#jqGrid").jqGrid('getGridParam', 'selrow'); - if (null == ids) { - alert("请选择要查看的股票!"); - return; - } - var rowData = $("#jqGrid").jqGrid('getRowData', ids); - window.open("/stock/his_pe/" + rowData.code); - }); - $("#pb_btn").click(function () { + + $("#his_btn").click(function () { var ids = $("#jqGrid").jqGrid('getGridParam', 'selrow'); if (null == ids) { alert("请选择要查看的股票!"); return; } var rowData = $("#jqGrid").jqGrid('getRowData', ids); - window.open("/stock/his_pb/" + rowData.code); + window.open("/stock/info/" + rowData.code); }); \ No newline at end of file diff --git a/src/main/resources/templates/stock/his/his_pbpe.html b/src/main/resources/templates/stock/his/his_pbpe.html new file mode 100644 index 00000000..02f26be6 --- /dev/null +++ b/src/main/resources/templates/stock/his/his_pbpe.html @@ -0,0 +1,219 @@ + + + + + ${code}历史数据 + + + + + + + +
    +
    +
    + + + + + + + + \ No newline at end of file From d2d007822c0f875eb1d23ff0eead66751a40ed3e Mon Sep 17 00:00:00 2001 From: kingschan Date: Tue, 3 Jul 2018 18:45:25 +0800 Subject: [PATCH 16/32] =?UTF-8?q?jisilu=20=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d1b6ea60..b0d32f1d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ io.github.kingschan1204 istock jar - 1.5.9 + 1.6.0 pritice Maven Webapp http://maven.apache.org From 3f0e12970cd003f8941f60a05f041d1e0fabf7c2 Mon Sep 17 00:00:00 2001 From: kingschan Date: Tue, 3 Jul 2018 19:05:02 +0800 Subject: [PATCH 17/32] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E6=AC=A1=E5=8A=A0=E8=BD=BD=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/maindata/ctrl/StockHisPageCtrl.java | 13 ++++++------- .../module/maindata/services/StockService.java | 11 ++++++++--- .../resources/templates/stock/his/his_pbpe.html | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockHisPageCtrl.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockHisPageCtrl.java index fd078061..a0f798ea 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockHisPageCtrl.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockHisPageCtrl.java @@ -208,13 +208,12 @@ public ModelAndView getStockInfo(@PathVariable String code) throws Exception { query.addCriteria(Criteria.where("code").is(code)); List lis = template.find(query, StockHisPbPe.class); if (null == lis || lis.size() == 0) { - String data = stockService.crawAndSaveHisPbPe(code); - String[] array = data.split("|"); + List data = stockService.crawAndSaveHisPbPe(code); //价格》日期》pb》pe - price.append(array[0]); - date.append(array[1]); - pb.append(array[2]); - pe.append(array[3]); + price.append(data.get(0)); + date.append(data.get(1)); + pb.append(data.get(2)); + pe.append(data.get(3)); } else { for (int i = 0; i < lis.size(); i++) { @@ -234,7 +233,7 @@ public ModelAndView getStockInfo(@PathVariable String code) throws Exception { } mav.addObject("pb", pb.toString()); mav.addObject("pe", pe.toString()); - mav.addObject("date", date.toString()); + mav.addObject("dates", date.toString()); mav.addObject("price", price.toString()); mav.addObject("code", code); return mav; diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java index 0151d110..a10dd081 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java @@ -292,7 +292,7 @@ public List getStockHisPe(String code){ * @return * @throws Exception */ - public String crawAndSaveHisPbPe(String code)throws Exception{ + public List crawAndSaveHisPbPe(String code)throws Exception{ StringBuilder price = new StringBuilder(); StringBuilder pe = new StringBuilder(); @@ -314,7 +314,7 @@ public String crawAndSaveHisPbPe(String code)throws Exception{ object.put("pe",row.getDouble("pe")); object.put("price",row.getDouble("price")); //顺便拼成字符串 - date.append(",").append(row.getString("date")).append("'"); + date.append("'").append(row.getString("date")).append("'"); price.append(row.getDouble("price")); pb.append(row.getDouble("pb")); pe.append(row.getDouble("pe")); @@ -349,7 +349,12 @@ public String crawAndSaveHisPbPe(String code)throws Exception{ } } //价格》日期》pb》pe - return String.format("%s|%s|%s|%s",price.toString(),date.toString(),pb.toString(),pe.toString()); + List result = new ArrayList<>(); + result.add(price.toString()); + result.add(date.toString()); + result.add(pb.toString()); + result.add(pe.toString()); + return result; } } diff --git a/src/main/resources/templates/stock/his/his_pbpe.html b/src/main/resources/templates/stock/his/his_pbpe.html index 02f26be6..865fba1e 100644 --- a/src/main/resources/templates/stock/his/his_pbpe.html +++ b/src/main/resources/templates/stock/his/his_pbpe.html @@ -19,7 +19,7 @@ \ No newline at end of file diff --git a/src/main/resources/templates/stock/his/report.html b/src/main/resources/templates/stock/his/report.html new file mode 100644 index 00000000..8289388c --- /dev/null +++ b/src/main/resources/templates/stock/his/report.html @@ -0,0 +1,26 @@ + + + + + 报表 + + + + + + + + + + + + + <#list reports as row> + + + + + +
    报告期披露日期
    ${row.title} ${row.releaseDay}
    + + \ No newline at end of file From bb909d421fa2dfd392debafce9ef804e7feec872 Mon Sep 17 00:00:00 2001 From: kingschan Date: Mon, 9 Jul 2018 09:24:31 +0800 Subject: [PATCH 19/32] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E6=97=A7=E7=89=88?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/util/stock/StockSpider.java | 86 +++++++++--------- .../util/stock/impl/DefaultSpiderImpl.java | 59 ------------ .../maindata/ctrl/StockHisPageCtrl.java | 74 --------------- .../module/maindata/po/StockHisPb.java | 63 ------------- .../module/maindata/po/StockHisPe.java | 61 ------------- .../repository/StockHisPbRepository.java | 17 ---- .../repository/StockHisPeRepository.java | 17 ---- .../maindata/services/StockService.java | 67 +------------- .../module/task/StockDividendTask.java | 2 +- .../resources/templates/stock/his/his_pb.html | 88 ------------------ .../resources/templates/stock/his/his_pe.html | 91 ------------------- .../resources/templates/stock/his/report.html | 26 +++--- .../istock/test/DefaultSpiderImplTest.java | 10 -- 13 files changed, 63 insertions(+), 598 deletions(-) delete mode 100644 src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisPb.java delete mode 100644 src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisPe.java delete mode 100644 src/main/java/io.github.kingschan1204.istock/module/maindata/repository/StockHisPbRepository.java delete mode 100644 src/main/java/io.github.kingschan1204.istock/module/maindata/repository/StockHisPeRepository.java delete mode 100644 src/main/resources/templates/stock/his/his_pb.html delete mode 100644 src/main/resources/templates/stock/his/his_pe.html diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockSpider.java b/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockSpider.java index 39ae7270..22bbcd5c 100644 --- a/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockSpider.java +++ b/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockSpider.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; + import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; @@ -17,29 +18,31 @@ /** * 爬虫接口定义 + * * @author chenguoxiang * @create 2018-01-30 18:00 **/ public interface StockSpider { - static final String regexNumber = "^[-+]?([0]{1}(\\.[0-9]+)?|[1-9]{1}\\d*(\\.[0-9]+)?)";//"^[-+]?[0-9]+(\\.[0-9]+)?$"; + static final String regexNumber = "^[-+]?([0]{1}(\\.[0-9]+)?|[1-9]{1}\\d*(\\.[0-9]+)?)";//"^[-+]?[0-9]+(\\.[0-9]+)?$"; /** * 将股票代码转换成新浪接口的格式http://hq.sinajs.cn/list= * sh 上海 sz 深圳 + * * @param code * @return */ - static String formatStockCode(String code) { - if(code.matches("^(sz|sh)\\d{6}$")){ - return code; - } + static String formatStockCode(String code) { + if (code.matches("^(sz|sh)\\d{6}$")) { + return code; + } //5开头,沪市基金或权证 60开头上证 - else if (code.matches("^60.*|^5.*")) { + else if (code.matches("^60.*|^5.*")) { return String.format("sh%s", code); } //1开头的,是深市基金 00开头是深圳 - else if(code.matches("^1.*|^00.*|^300...")){ + else if (code.matches("^1.*|^00.*|^300...")) { return String.format("sz%s", code); } return null; @@ -47,11 +50,12 @@ else if(code.matches("^1.*|^00.*|^300...")){ /** * 提取文本中匹配正则的字符串 + * * @param text * @param regx 正则 - * @return 多个结果已,分隔 + * @return 多个结果已, 分隔 */ - static String findStrByRegx(String text,String regx){ + static String findStrByRegx(String text, String regx) { StringBuffer bf = new StringBuffer(64); try { Pattern pattern = Pattern.compile(regx); @@ -73,12 +77,13 @@ static String findStrByRegx(String text,String regx){ /** * 提取文本中匹配正则的字符串 + * * @param text 源字符串 * @param regx 正则 * @return */ - static List findStringByRegx(String text,String regx){ - List list = new ArrayList(); + static List findStringByRegx(String text, String regx) { + List list = new ArrayList(); try { Pattern pattern = Pattern.compile(regx); Matcher matcher = pattern.matcher(text); @@ -100,8 +105,8 @@ static List findStringByRegx(String text,String regx){ * @param value * @return */ - static Double mathFormat(String value) { - String v =value.replaceAll("[^0-9|\\.|\\-]",""); + static Double mathFormat(String value) { + String v = value.replaceAll("[^0-9|\\.|\\-]", ""); if (v.matches(regexNumber)) { return Double.valueOf(v); } @@ -110,14 +115,21 @@ static Double mathFormat(String value) { /** * 启用ssl + * * @throws KeyManagementException * @throws NoSuchAlgorithmException */ - static void enableSSLSocket() throws KeyManagementException, NoSuchAlgorithmException { - TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager(){ - public X509Certificate[] getAcceptedIssuers(){return new X509Certificate[0];} - public void checkClientTrusted(X509Certificate[] certs, String authType){} - public void checkServerTrusted(X509Certificate[] certs, String authType){} + static void enableSSLSocket() throws KeyManagementException, NoSuchAlgorithmException { + TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + + public void checkClientTrusted(X509Certificate[] certs, String authType) { + } + + public void checkServerTrusted(X509Certificate[] certs, String authType) { + } }}; SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, trustAllCerts, new SecureRandom()); @@ -127,31 +139,35 @@ public void checkServerTrusted(X509Certificate[] certs, String authType){} /** * 得到指定代码的价格 + * * @param stockCode * @return */ - JSONArray getStockPrice(String[] stockCode)throws Exception; + JSONArray getStockPrice(String[] stockCode) throws Exception; /** * 得到指定代码的基本信息 + * * @param code * @return * @throws Exception */ - JSONObject getStockInfo(String code) throws Exception; + JSONObject getStockInfo(String code) throws Exception; /** * 得到指定代码历史分红 + * * @param code * @return * @throws Exception */ - JSONArray getHistoryDividendRate(String code) throws Exception; + JSONArray getHistoryDividendRate(String code) throws Exception; /** * 得到历史ROE + * * @param code * @return * @throws Exception @@ -159,42 +175,27 @@ public void checkServerTrusted(X509Certificate[] certs, String authType){} JSONArray getHistoryROE(String code) throws Exception; - /** - * 得到历史PE - * @param code - * @return - * @throws Exception - */ - JSONArray getHistoryPE(String code) throws Exception; - - - /** - * 得到历史pb - * @param code - * @return - * @throws Exception - */ - JSONArray getHistoryPB(String code) throws Exception; - - /** * 得到所有代码 + * * @return * @throws Exception */ - List getAllStockCode()throws Exception; + List getAllStockCode() throws Exception; /** * 得到股息 - * @param page 页码 + * + * @param page 页码 * @return * @throws Exception */ - JSONObject getDy(int page)throws Exception; + JSONObject getDy(int page) throws Exception; /** * 得到上海所有代码 + * * @return * @throws Exception */ @@ -203,6 +204,7 @@ public void checkServerTrusted(X509Certificate[] certs, String authType){} /** * 得到深圳所有代码 + * * @return * @throws Exception */ diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java index 7eb89d1e..abdfb997 100644 --- a/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java +++ b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java @@ -205,65 +205,6 @@ public JSONArray getHistoryROE(String code) throws Exception { return jsons; } - @Override - public JSONArray getHistoryPE(String code) throws Exception { - String url = String.format("https://androidinvest.com/Stock/History/%s", StockSpider.formatStockCode(code).toUpperCase()); - String regex = "\'|\\[|\\]"; - log.info("craw history pe :{}", url); - StockSpider.enableSSLSocket(); - JSONArray jsons = new JSONArray(); - Document doc = null; - try { - doc = Jsoup.connect(url).userAgent(useAgent).timeout(timeout).get(); - Element div = doc.getElementById("chart2"); - String data[] = div.text().split("@");//日期@市盈率@股价 - String date[] = data[0].replaceAll(regex, "").split(","); - String pe[] = data[1].replaceAll(regex, "").split(","); - String price[] = data[2].replaceAll(regex, "").split(","); - JSONObject json; - for (int i = 0; i < date.length; i++) { - json = new JSONObject(); - json.put("code", code.replaceAll("\\D", "")); - json.put("date", date[i].trim()); - json.put("pe", pe[i].trim()); - json.put("price", price[i].trim()); - jsons.add(json); - } - } catch (Exception e) { - e.printStackTrace(); - } - return jsons; - } - - @Override - public JSONArray getHistoryPB(String code) throws Exception { - String url = String.format("https://androidinvest.com/Stock/HistoryPB/%s", StockSpider.formatStockCode(code).toUpperCase()); - log.info("craw history pb :{}", url); - StockSpider.enableSSLSocket(); - JSONArray jsons = new JSONArray(); - Document doc = null; - try { - doc = Jsoup.connect(url).userAgent(useAgent).timeout(timeout).get(); - Element div = doc.getElementById("chart4"); - String data[] = div.text().split("@");//日期@市净率@股价 - String date[] = data[0].replaceAll("\'|\\[|\\]", "").split(","); - String pb[] = data[1].replaceAll("\'|\\[|\\]", "").split(","); - String price[] = data[2].replaceAll("\'|\\[|\\]", "").split(","); - JSONObject json; - for (int i = 0; i < date.length; i++) { - json = new JSONObject(); - json.put("code", code.replaceAll("\\D", "")); - json.put("date", date[i].trim()); - json.put("pb", pb[i].trim()); - json.put("price", price[i].trim()); - jsons.add(json); - } - - } catch (Exception e) { - e.printStackTrace(); - } - return jsons; - } @Override public List getAllStockCode() throws Exception { diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockHisPageCtrl.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockHisPageCtrl.java index 6b468d07..6e4c0872 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockHisPageCtrl.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockHisPageCtrl.java @@ -117,80 +117,6 @@ public ModelAndView getStockHisRoe(@PathVariable String code) { } - @RequestMapping("/stock/his_pe/{code}") - public ModelAndView getStockHisPe(@PathVariable String code) { - ModelAndView mav = new ModelAndView(template_path + "his_pe"); - mav.addObject("pe_date", "''"); - mav.addObject("pe_value", "0"); - Stock stock = stockRepository.findOne(code); - if (null == stock) { - mav.addObject("msg", String.format("代码:%s %s", code, "不存在,或者非A股代码!")); - return mav; - } - mav.addObject("stock", stock); - List list = stockService.getStockHisPe(code); - if (null == list || list.size() == 0) { - try { - list = stockService.addStockHisPe(code); - } catch (Exception e) { - e.printStackTrace(); - } - } - mav.addObject("rows", list); - StringBuffer year = new StringBuffer(); - StringBuffer pe = new StringBuffer(); - list.stream().forEach(item -> { - if (item.getPe() > 0) { - pe.append(item.getPe()).append(","); - year.append("'").append(item.getDate()).append("',"); - } - }); - String data = String.format("%s|%s", year.toString().replaceAll("\\,$", ""), - pe.toString().replaceAll("\\,$", "") - ); - String roeItem[] = data.split("\\|"); - mav.addObject("pe_date", roeItem[0]); - mav.addObject("pe_value", roeItem[1]); - return mav; - } - - @RequestMapping("/stock/his_pb/{code}") - public ModelAndView getStockHisPb(@PathVariable String code) { - ModelAndView mav = new ModelAndView(template_path + "his_pb"); - mav.addObject("pb_date", "''"); - mav.addObject("pb_value", "0"); - Stock stock = stockRepository.findOne(code); - if (null == stock) { - mav.addObject("msg", String.format("代码:%s %s", code, "不存在,或者非A股代码!")); - return mav; - } - mav.addObject("stock", stock); - List list = stockService.getStockHisPb(code); - if (null == list || list.size() == 0) { - try { - list = stockService.addStockHisPb(code); - } catch (Exception e) { - e.printStackTrace(); - } - } - mav.addObject("rows", list); - StringBuffer year = new StringBuffer(); - StringBuffer pe = new StringBuffer(); - list.stream().forEach(item -> { - if (item.getPb() > 0) { - pe.append(item.getPb()).append(","); - year.append("'").append(item.getDate()).append("',"); - } - }); - String data = String.format("%s|%s", year.toString().replaceAll("\\,$", ""), - pe.toString().replaceAll("\\,$", "") - ); - String roeItem[] = data.split("\\|"); - mav.addObject("pb_date", roeItem[0]); - mav.addObject("pb_value", roeItem[1]); - return mav; - } - @Autowired private MongoTemplate template; diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisPb.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisPb.java deleted file mode 100644 index 23406f42..00000000 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisPb.java +++ /dev/null @@ -1,63 +0,0 @@ -package io.github.kingschan1204.istock.module.maindata.po; - -import org.springframework.data.annotation.Id; -import org.springframework.data.mongodb.core.mapping.Document; - -import java.util.Date; - -/** - * stock maindata - * - * @author chenguoxiang - * @create 2018-03-27 10:15 - **/ -@Document(collection = "stock_his_pb") -public class StockHisPb { - - @Id - private String _id; - private String code; - private String date; - private Double pb; - private Double price; - - public String get_id() { - return _id; - } - - public void set_id(String _id) { - this._id = _id; - } - - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - - public String getDate() { - return date; - } - - public void setDate(String date) { - this.date = date; - } - - public Double getPb() { - return pb; - } - - public void setPb(Double pb) { - this.pb = pb; - } - - public Double getPrice() { - return price; - } - - public void setPrice(Double price) { - this.price = price; - } -} diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisPe.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisPe.java deleted file mode 100644 index ff312f51..00000000 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisPe.java +++ /dev/null @@ -1,61 +0,0 @@ -package io.github.kingschan1204.istock.module.maindata.po; - -import org.springframework.data.annotation.Id; -import org.springframework.data.mongodb.core.mapping.Document; - -/** - * stock maindata - * - * @author chenguoxiang - * @create 2018-03-27 10:15 - **/ -@Document(collection = "stock_his_pe") -public class StockHisPe { - - @Id - private String _id; - private String code; - private String date; - private Double pe; - private Double price; - - public String get_id() { - return _id; - } - - public void set_id(String _id) { - this._id = _id; - } - - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - - public String getDate() { - return date; - } - - public void setDate(String date) { - this.date = date; - } - - public Double getPe() { - return pe; - } - - public void setPe(Double pe) { - this.pe = pe; - } - - public Double getPrice() { - return price; - } - - public void setPrice(Double price) { - this.price = price; - } -} diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/repository/StockHisPbRepository.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/repository/StockHisPbRepository.java deleted file mode 100644 index d8ad98d7..00000000 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/repository/StockHisPbRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.github.kingschan1204.istock.module.maindata.repository; - -import io.github.kingschan1204.istock.module.maindata.po.StockHisPb; -import io.github.kingschan1204.istock.module.maindata.po.StockHisPe; -import org.springframework.data.mongodb.repository.MongoRepository; -import org.springframework.stereotype.Repository; - -/** - * - * - * @author chenguoxiang - * @create 2018-03-09 14:55 - **/ -@Repository -public interface StockHisPbRepository extends MongoRepository { - -} diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/repository/StockHisPeRepository.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/repository/StockHisPeRepository.java deleted file mode 100644 index 9a73326a..00000000 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/repository/StockHisPeRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.github.kingschan1204.istock.module.maindata.repository; - -import io.github.kingschan1204.istock.module.maindata.po.StockHisPe; -import io.github.kingschan1204.istock.module.maindata.po.StockHisRoe; -import org.springframework.data.mongodb.repository.MongoRepository; -import org.springframework.stereotype.Repository; - -/** - * - * - * @author chenguoxiang - * @create 2018-03-09 14:55 - **/ -@Repository -public interface StockHisPeRepository extends MongoRepository { - -} diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java index 9abcbe3c..0dc5705b 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java @@ -8,10 +8,11 @@ import com.mongodb.DBObject; import io.github.kingschan1204.istock.common.util.stock.StockSpider; import io.github.kingschan1204.istock.common.util.stock.impl.JisiluSpilder; -import io.github.kingschan1204.istock.module.maindata.po.*; +import io.github.kingschan1204.istock.module.maindata.po.Stock; +import io.github.kingschan1204.istock.module.maindata.po.StockDividend; +import io.github.kingschan1204.istock.module.maindata.po.StockHisDividend; +import io.github.kingschan1204.istock.module.maindata.po.StockHisRoe; import io.github.kingschan1204.istock.module.maindata.repository.StockHisDividendRepository; -import io.github.kingschan1204.istock.module.maindata.repository.StockHisPbRepository; -import io.github.kingschan1204.istock.module.maindata.repository.StockHisPeRepository; import io.github.kingschan1204.istock.module.maindata.repository.StockRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Sort; @@ -39,10 +40,6 @@ public class StockService { @Autowired private StockHisRoeService stockHisRoeService; @Autowired - private StockHisPbRepository stockHisPbRepository; - @Autowired - private StockHisPeRepository stockHisPeRepository; - @Autowired private StockSpider spider; @Autowired private MongoTemplate template; @@ -84,42 +81,12 @@ public void addStock(String... codes) throws Exception { json.putAll(info); // his roe stockHisRoeService.addStockHisRoe(scode); - //his pb - addStockHisPb(scode); - //his pe - addStockHisPe(scode); } List list = JSON.parseArray(jsons.toJSONString(), Stock.class); stockRepository.save(list); } - /** - * 增加历史pe - * @param code - * @throws Exception - */ - public List addStockHisPe(String code)throws Exception{ - JSONArray jsons=spider.getHistoryPE(StockSpider.formatStockCode(code)); - List lis = JSON.parseArray(jsons.toJSONString(),StockHisPe.class); - template.remove(new Query(Criteria.where("code").is(code)),StockHisPe.class); - stockHisPeRepository.save(lis); - return lis; - } - - /** - * 增加历史pb - * @param code - * @throws Exception - */ - public List addStockHisPb(String code)throws Exception{ - JSONArray jsons=spider.getHistoryPB(StockSpider.formatStockCode(code)); - List lis = JSON.parseArray(jsons.toJSONString(),StockHisPb.class); - template.remove(new Query(Criteria.where("code").is(code)),StockHisPb.class); - stockHisPbRepository.save(lis); - return lis; - - } public String queryStock(int pageindex, int pagesize, final String pcode,final String type,String pb,String dy, String orderfidld, String psort){ @@ -259,32 +226,6 @@ public List getStockHisRoe(String code){ } - public List getStockHisPb(String code){ - Query query = new Query(); - query.addCriteria(Criteria.where("code").is(code)); - //排序 - List orders = new ArrayList(); //排序 - orders.add(new Sort.Order(Sort.Direction.ASC,"date")); - Sort sort = new Sort(orders); - query.with(sort); - //code - List list =template.find(query,StockHisPb.class); - return list; - } - - - public List getStockHisPe(String code){ - Query query = new Query(); - query.addCriteria(Criteria.where("code").is(code)); - //排序 - List orders = new ArrayList(); //排序 - orders.add(new Sort.Order(Sort.Direction.ASC,"date")); - Sort sort = new Sort(orders); - query.with(sort); - //code - List list =template.find(query,StockHisPe.class); - return list; - } /** * 抓取历史数据 diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java index ae699bd3..1ed3eca6 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java @@ -62,7 +62,7 @@ public void stockDividendExecute() throws Exception { for (int j = 0; j < dividends.size(); j++) { double tempPercent=dividends.getJSONObject(j).getDouble("percent"); String temp_date=dividends.getJSONObject(j).getString("cxcqr"); - if(tempPercent>0&&!temp_date.equals("-")){ + if(tempPercent>=0&&!temp_date.equals("-")){ percent=tempPercent; date=temp_date; break; diff --git a/src/main/resources/templates/stock/his/his_pb.html b/src/main/resources/templates/stock/his/his_pb.html deleted file mode 100644 index 71669969..00000000 --- a/src/main/resources/templates/stock/his/his_pb.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - 量化分析- - <#if stock??>${stock.name} - <#else>${code!""} - </#if> - 市净率 - - - - - - - -<#if msg??> -

    ${msg}

    - - -
    - - - - \ No newline at end of file diff --git a/src/main/resources/templates/stock/his/his_pe.html b/src/main/resources/templates/stock/his/his_pe.html deleted file mode 100644 index b43a55bf..00000000 --- a/src/main/resources/templates/stock/his/his_pe.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - 量化分析- - <#if stock??>${stock.name} - <#else>${code!""} - </#if> - 市盈率 - - - - - - - -<#if msg??> -

    ${msg}

    - - -
    - - - - - - - \ No newline at end of file diff --git a/src/main/resources/templates/stock/his/report.html b/src/main/resources/templates/stock/his/report.html index 8289388c..fe48253b 100644 --- a/src/main/resources/templates/stock/his/report.html +++ b/src/main/resources/templates/stock/his/report.html @@ -9,18 +9,20 @@ - - - - +
    +
    报告期披露日期
    + + + - - <#list reports as row> - - - - - -
    报告期披露日期
    ${row.title} ${row.releaseDay}
    + + <#list reports as row> + + ${row.title} + ${row.releaseDay} + + + +
    \ No newline at end of file diff --git a/src/test/java/io/github/kingschan1204/istock/test/DefaultSpiderImplTest.java b/src/test/java/io/github/kingschan1204/istock/test/DefaultSpiderImplTest.java index d82228f7..9ae973c9 100644 --- a/src/test/java/io/github/kingschan1204/istock/test/DefaultSpiderImplTest.java +++ b/src/test/java/io/github/kingschan1204/istock/test/DefaultSpiderImplTest.java @@ -68,16 +68,6 @@ public void getHistoryROE() throws Exception { System.out.println(jsons.getJSONObject(0)); System.out.println(jsons); } - @Ignore - @Test - public void getHistoryPE() throws Exception { - System.out.println(spider.getHistoryPE(code).toJSONString()); - } - @Ignore - @Test - public void getHistoryPB() throws Exception { - System.out.println(spider.getHistoryPB(code).toJSONString()); - } @Ignore @Test From cf7b14caeb7165d4b67a013580ca67c1eca372a9 Mon Sep 17 00:00:00 2001 From: kingschan Date: Mon, 9 Jul 2018 17:34:17 +0800 Subject: [PATCH 20/32] =?UTF-8?q?=E4=B8=8D=E4=BF=9D=E5=AD=98=5Fclass?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/conf/MongoConfig.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/main/java/io.github.kingschan1204.istock/common/conf/MongoConfig.java diff --git a/src/main/java/io.github.kingschan1204.istock/common/conf/MongoConfig.java b/src/main/java/io.github.kingschan1204.istock/common/conf/MongoConfig.java new file mode 100644 index 00000000..78ea6cf7 --- /dev/null +++ b/src/main/java/io.github.kingschan1204.istock/common/conf/MongoConfig.java @@ -0,0 +1,35 @@ +package io.github.kingschan1204.istock.common.conf; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.mongodb.MongoDbFactory; +import org.springframework.data.mongodb.core.convert.*; +import org.springframework.data.mongodb.core.mapping.MongoMappingContext; + +/** + * 去掉mongo 保存_class字段 + * @author chenguoxiang + * @create 2018-07-09 16:54 + **/ +@Configuration +public class MongoConfig { + private static Logger log = LoggerFactory.getLogger(MongoConfig.class); + @Bean + public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context, BeanFactory beanFactory) { + DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory); + MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context); + try { + mappingConverter.setCustomConversions(beanFactory.getBean(CustomConversions.class)); + } catch (Exception ex) { + ex.printStackTrace(); + log.error("{}",ex); + } + + // Don't save _class to mongo + mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null)); + return mappingConverter; + } +} From 3f4b18295fb2c1a01c711636e4a7ac9a88330e56 Mon Sep 17 00:00:00 2001 From: kingschan Date: Mon, 9 Jul 2018 18:47:14 +0800 Subject: [PATCH 21/32] =?UTF-8?q?=E5=A2=9E=E5=8A=A0roe=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E6=8A=93=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../util/stock/impl/DefaultSpiderImpl.java | 2 + .../module/maindata/po/StockCode.java | 13 ++- .../maindata/services/StockCodeService.java | 36 ++++++--- .../module/task/ThsHisYearReportTask.java | 81 +++++++++++++++++++ 4 files changed, 118 insertions(+), 14 deletions(-) create mode 100644 src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java index abdfb997..e0a6f48f 100644 --- a/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java +++ b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java @@ -185,6 +185,8 @@ public JSONArray getHistoryROE(String code) throws Exception { if (!new File(path).exists()) { //下载 FileCommonOperactionTool.downloadFile(url, "./data/", null); + }else{ + log.info("文件存在,直接读取:{}",path); } //读取excel数据 List list = ExcelOperactionTool.readExcelData(String.format("./data/%s_main_year.xls", code)); diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockCode.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockCode.java index 188cd851..91e318cb 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockCode.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockCode.java @@ -13,9 +13,13 @@ public class StockCode { @Id private String code; + private Integer hrdud;//history report data update date 历史年度报表更新时间 public StockCode(){} - public StockCode(String code){this.code=code;} + public StockCode(String code){ + this.code=code; + this.hrdud=0; + } public String getCode() { @@ -26,4 +30,11 @@ public void setCode(String code) { this.code = code; } + public Integer getHrdud() { + return hrdud; + } + + public void setHrdud(Integer hrdud) { + this.hrdud = hrdud; + } } diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockCodeService.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockCodeService.java index a7557f75..192ecaf9 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockCodeService.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockCodeService.java @@ -6,9 +6,12 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Service; +import java.util.HashSet; import java.util.List; /** @@ -28,31 +31,38 @@ public class StockCodeService { /** * 保存所有代码 + * * @throws Exception */ public void saveAllStockCode() throws Exception { - List szCodes=stockSpider.getStockCodeBySZ(); - List shCodes=stockSpider.getStockCodeBySH(); - List allcodes= stockSpider.getAllStockCode(); - szCodes.stream().forEach(code-> - mongoTemplate.save(new StockCode(StockSpider.formatStockCode(code))) - ); - shCodes.stream().forEach(code-> - mongoTemplate.save(new StockCode(StockSpider.formatStockCode(code))) - ); - allcodes.stream().forEach(code-> - mongoTemplate.save(new StockCode(code)) + List szCodes = stockSpider.getStockCodeBySZ(); + List shCodes = stockSpider.getStockCodeBySH(); + List allcodes = stockSpider.getAllStockCode(); + HashSet codes = new HashSet(); + codes.addAll(szCodes); + codes.addAll(shCodes); + codes.addAll(allcodes); + + codes.stream().forEach(code -> { + mongoTemplate.upsert( + new Query(Criteria.where("_id").is(code)), + new Update().set("_id", code), + "stock_code" + ); + } ); + } /** * 返回所有代码 + * * @return */ - public List getAllStockCodes(){ - return mongoTemplate.find(new Query(),StockCode.class); + public List getAllStockCodes() { + return mongoTemplate.find(new Query(), StockCode.class); } diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java new file mode 100644 index 00000000..6599503f --- /dev/null +++ b/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java @@ -0,0 +1,81 @@ +package io.github.kingschan1204.istock.module.task; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import io.github.kingschan1204.istock.common.util.stock.StockDateUtil; +import io.github.kingschan1204.istock.common.util.stock.StockSpider; +import io.github.kingschan1204.istock.module.maindata.po.StockCode; +import io.github.kingschan1204.istock.module.maindata.po.StockHisRoe; +import io.github.kingschan1204.istock.module.maindata.repository.StockHisRoeRepository; +import io.github.kingschan1204.istock.module.maindata.services.StockHisRoeService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * ${DESCRIPTION} + * + * @author chenguoxiang + * @create 2018-07-09 17:28 + **/ +@Component +public class ThsHisYearReportTask { + private Logger log = LoggerFactory.getLogger(ThsHisYearReportTask.class); + + @Autowired + private StockSpider spider; + @Autowired + private MongoTemplate template; + @Autowired + private StockHisRoeRepository stockHisRoeRepository; + + @Scheduled(cron = "*/6 * * * * ?") + public void execute() throws Exception { + if (StockDateUtil.stockOpenTime()) { //开盘时间不处理 + return; + } + Integer dateNumber = StockDateUtil.getCurrentDateNumber(); + Criteria cr = new Criteria(); + Criteria c1 = Criteria.where("hrdud").lt(dateNumber-3); //3天更新一把 + Criteria c2 = Criteria.where("hrdud").exists(false); + Query query = new Query(cr.orOperator(c1,c2)); + List orders = new ArrayList(); //排序 + orders.add(new Sort.Order(Sort.Direction.ASC,"_id")); + Sort sort = new Sort(orders); + query.with(sort); + query.limit(2); + List list = template.find(query, StockCode.class); + if(null==list||list.size()==0){ + log.info("his year report data 当前已全部更新完!"); + return ; + } + list.stream().forEach(code ->{ + JSONArray jsons= null; + String codestr=code.getCode().replaceAll("\\D",""); + try { + jsons = spider.getHistoryROE(codestr); + List lis = JSON.parseArray(jsons.toJSONString(),StockHisRoe.class); + template.remove(new Query(Criteria.where("code").is(codestr)),StockHisRoe.class); + stockHisRoeRepository.save(lis); + template.upsert( + new Query(Criteria.where("_id").is(code.getCode())), + new Update().set("hrdud", dateNumber), + "stock_code" + ); + } catch (Exception e) { + e.printStackTrace(); + } + }); + + } +} From b086c220242ffcc3aff5a0d138c709a66fbf67b5 Mon Sep 17 00:00:00 2001 From: kingschan Date: Tue, 10 Jul 2018 09:56:33 +0800 Subject: [PATCH 22/32] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E9=87=8D=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/util/file/FileCommonOperactionTool.java | 1 + .../common/util/stock/impl/DefaultSpiderImpl.java | 9 ++++++--- .../module/maindata/services/StockCodeService.java | 1 - 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/file/FileCommonOperactionTool.java b/src/main/java/io.github.kingschan1204.istock/common/util/file/FileCommonOperactionTool.java index 2739ab60..70ca1223 100644 --- a/src/main/java/io.github.kingschan1204.istock/common/util/file/FileCommonOperactionTool.java +++ b/src/main/java/io.github.kingschan1204.istock/common/util/file/FileCommonOperactionTool.java @@ -43,6 +43,7 @@ public static String downloadFile(String url, String dir, String filename) throw out.write(resultResponse.bodyAsBytes()); }catch (Exception ex){ log.error("{}",ex); + log.error("文件下载错误:{}",url); ex.printStackTrace(); }finally { out.close(); diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java index e0a6f48f..8d18ed66 100644 --- a/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java +++ b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java @@ -28,7 +28,6 @@ /** * 默认爬虫 - * * @author chenguoxiang * @create 2018-01-31 14:02 **/ @@ -263,6 +262,7 @@ public JSONObject getDy(int page) throws Exception { @Override public List getStockCodeBySH() throws Exception { + List list = new ArrayList<>(); String url = "http://www.sse.com.cn/js/common/ssesuggestdata.js"; log.info("craw sh codes :{}", url); Document infoDoc = Jsoup.connect(url).userAgent(useAgent) @@ -271,7 +271,10 @@ public List getStockCodeBySH() throws Exception { .get(); String result = StockSpider.findStrByRegx(infoDoc.html(), "60\\d{4}"); String[] codes = result.split(","); - return Arrays.asList(codes); + Arrays.stream(codes).forEach(code ->{ + list.add(StockSpider.formatStockCode(code)); + }); + return list; } @Override @@ -289,7 +292,7 @@ public List getStockCodeBySZ() throws Exception { List list = ExcelOperactionTool.readExcelData(path); for (Object[] row : list) { if (row[0].toString().trim().matches("^00\\d{4}")) { - codes.add(row[0].toString().trim()); + codes.add(StockSpider.formatStockCode(row[0].toString().trim())); } } return codes; diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockCodeService.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockCodeService.java index 192ecaf9..a25dbc53 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockCodeService.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockCodeService.java @@ -42,7 +42,6 @@ public void saveAllStockCode() throws Exception { codes.addAll(szCodes); codes.addAll(shCodes); codes.addAll(allcodes); - codes.stream().forEach(code -> { mongoTemplate.upsert( new Query(Criteria.where("_id").is(code)), From 55aa13ca01e365e02aa11e9e805fa70df87fa20e Mon Sep 17 00:00:00 2001 From: kingschan Date: Tue, 10 Jul 2018 14:25:07 +0800 Subject: [PATCH 23/32] =?UTF-8?q?=E5=BC=BA=E5=8C=96=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/util/file/FileCommonOperactionTool.java | 11 +++++++++-- .../common/util/stock/impl/DefaultSpiderImpl.java | 9 +++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/file/FileCommonOperactionTool.java b/src/main/java/io.github.kingschan1204.istock/common/util/file/FileCommonOperactionTool.java index 70ca1223..9285e226 100644 --- a/src/main/java/io.github.kingschan1204.istock/common/util/file/FileCommonOperactionTool.java +++ b/src/main/java/io.github.kingschan1204.istock/common/util/file/FileCommonOperactionTool.java @@ -19,17 +19,23 @@ public class FileCommonOperactionTool { /** * 通过指定的文件下载URL以及下载目录下载文件 * @param url 下载url路径 + * @referrer 来源 * @param dir 存放目录 * @param filename 文件名 * @throws Exception */ - public static String downloadFile(String url, String dir, String filename) throws Exception { + public static String downloadFile(String url,String referrer, String dir, String filename) throws Exception { log.info("start download file :{}",url); //Open a URL Stream Connection.Response resultResponse = Jsoup.connect(url) .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3346.9 Safari/537.36") + .referrer(referrer) .ignoreContentType(true).execute(); String defaultFileName=""; + if(resultResponse.statusCode()!=200){ + log.error("文件下载失败:{}",url); + throw new Exception(String.format("文件下载失败:%s 返回码:%s",url,resultResponse.statusCode())); + } if(resultResponse.contentType().contains("name")){ String[] list =resultResponse.contentType().split(";"); defaultFileName = Arrays.stream(list) @@ -43,11 +49,12 @@ public static String downloadFile(String url, String dir, String filename) throw out.write(resultResponse.bodyAsBytes()); }catch (Exception ex){ log.error("{}",ex); - log.error("文件下载错误:{}",url); + log.error("文件下载失败:{}",url); ex.printStackTrace(); }finally { out.close(); } return path; } + } diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java index 8d18ed66..4ad1e2c9 100644 --- a/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java +++ b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java @@ -180,15 +180,16 @@ public JSONArray getHistoryDividendRate(String code) throws Exception { @Override public JSONArray getHistoryROE(String code) throws Exception { String url = String.format("http://basic.10jqka.com.cn/api/stock/export.php?export=main&type=year&code=%s", code); - String path = String.format("./data/%s_main_year.xls", code); + String path = null;//String.format("./data/%s_main_year.xls", code); + String referrer=String.format("http://stockpage.10jqka.com.cn/600725/finance/",code); if (!new File(path).exists()) { //下载 - FileCommonOperactionTool.downloadFile(url, "./data/", null); + path= FileCommonOperactionTool.downloadFile(url, referrer,"./data/", null); }else{ log.info("文件存在,直接读取:{}",path); } //读取excel数据 - List list = ExcelOperactionTool.readExcelData(String.format("./data/%s_main_year.xls", code)); + List list = ExcelOperactionTool.readExcelData(path); Object[] year = list.get(1); Object[] roe = list.get(10); Object[] roeTb = list.get(11); @@ -286,7 +287,7 @@ public List getStockCodeBySZ() throws Exception { String path = String.format("./data/%s", filename); if (!new File(path).exists()) { //下载 - FileCommonOperactionTool.downloadFile(url, "./data/", filename); + FileCommonOperactionTool.downloadFile(url, "","./data/", filename); } //读取excel数据 List list = ExcelOperactionTool.readExcelData(path); From 2a9bb5d6fe84c81fe5200506ddc136ccc8ef010e Mon Sep 17 00:00:00 2001 From: kingschan Date: Tue, 10 Jul 2018 16:23:46 +0800 Subject: [PATCH 24/32] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E6=9C=BA=E5=88=B6=EF=BC=8C=E4=B8=8D=E8=AE=A9=E7=88=AC=E8=99=AB?= =?UTF-8?q?=E4=B8=80=E7=9B=B4=E6=89=A7=E8=A1=8C=E9=94=99=E8=AF=AF=E7=9A=84?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E8=80=8C=E9=80=A0=E5=88=B0=E5=B0=81=E6=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 13 +++- .../Application.java | 2 + .../common/util/cache/EhcacheUtil.java | 54 +++++++++++++++ .../module/maindata/ctrl/StockCtrl.java | 2 +- .../module/task/ThsHisYearReportTask.java | 33 ++++++++-- .../module/task/XueQiuStockDyTask.java | 27 ++++++++ src/main/resources/application.properties | 12 ++-- src/main/resources/ehcache.xml | 66 +++++++++++++++++++ 8 files changed, 197 insertions(+), 12 deletions(-) create mode 100644 src/main/java/io.github.kingschan1204.istock/common/util/cache/EhcacheUtil.java create mode 100644 src/main/resources/ehcache.xml diff --git a/pom.xml b/pom.xml index b0d32f1d..2934f928 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ io.github.kingschan1204 istock jar - 1.6.0 + 1.6.1 pritice Maven Webapp http://maven.apache.org @@ -110,7 +110,16 @@ org.springframework.boot spring-boot-starter-data-mongodb - + + + org.springframework.boot + spring-boot-starter-cache + + + + net.sf.ehcache + ehcache + diff --git a/src/main/java/io.github.kingschan1204.istock/Application.java b/src/main/java/io.github.kingschan1204.istock/Application.java index e9291d5c..a07869a6 100644 --- a/src/main/java/io.github.kingschan1204.istock/Application.java +++ b/src/main/java/io.github.kingschan1204.istock/Application.java @@ -2,11 +2,13 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller +@EnableCaching @SpringBootApplication public class Application { diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/cache/EhcacheUtil.java b/src/main/java/io.github.kingschan1204.istock/common/util/cache/EhcacheUtil.java new file mode 100644 index 00000000..30f5ccf2 --- /dev/null +++ b/src/main/java/io.github.kingschan1204.istock/common/util/cache/EhcacheUtil.java @@ -0,0 +1,54 @@ +package io.github.kingschan1204.istock.common.util.cache; + +import net.sf.ehcache.Cache; +import net.sf.ehcache.Element; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.ehcache.EhCacheCacheManager; +import org.springframework.stereotype.Component; + +/** + * + * @author chenguoxiang + * @create 2018-07-10 15:02 + **/ +@Component +public class EhcacheUtil { + + @Autowired + EhCacheCacheManager ehCacheCacheManager; + + /** + * 得到一个缓存的值 + * @param cacheName 缓存名字 + * @param key + * @return + */ + public Object getKey(String cacheName,String key){ + Element em =ehCacheCacheManager.getCacheManager().getCache(cacheName).get(key); + return null==em?null:em.getObjectValue(); + } + + /** + * 向缓存中写入一个key + * @param cacheName + * @param key + * @param value + */ + public void addKey(String cacheName,String key,Object value){ + ehCacheCacheManager.getCacheManager().getCache(cacheName).put(new Element(key,value)); + } + + /** + * 得到一个缓存里key 的数量 + * @param cacheName + * @return + */ + public int getCacheTotalKeys(String cacheName){ + Cache cache=ehCacheCacheManager.getCacheManager().getCache(cacheName); + return null==cache?0:cache.getKeys().size(); + } + + + + +} diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockCtrl.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockCtrl.java index 2a190245..59ad9edc 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockCtrl.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockCtrl.java @@ -68,7 +68,7 @@ public String mapReduce() { query.addCriteria(Criteria.where("releaseDate").gte(startDate).lte(endDate)); MapReduceResults result = template.mapReduce(query, "stock_dividend", "classpath:dy5years_map.js", "classpath:dy5years_reduce.js", - new MapReduceOptions().outputCollection("stock_dy_statistics_demo"), BasicDBObject.class); + new MapReduceOptions().outputCollection("stock_dy_statistics"), BasicDBObject.class); Iterator iter = result.iterator(); while (iter.hasNext()) { BasicDBObject item = iter.next(); diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java index 6599503f..6ff7458a 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java @@ -2,12 +2,12 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; +import io.github.kingschan1204.istock.common.util.cache.EhcacheUtil; import io.github.kingschan1204.istock.common.util.stock.StockDateUtil; import io.github.kingschan1204.istock.common.util.stock.StockSpider; import io.github.kingschan1204.istock.module.maindata.po.StockCode; import io.github.kingschan1204.istock.module.maindata.po.StockHisRoe; import io.github.kingschan1204.istock.module.maindata.repository.StockHisRoeRepository; -import io.github.kingschan1204.istock.module.maindata.services.StockHisRoeService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -18,13 +18,11 @@ import org.springframework.data.mongodb.core.query.Update; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; - import java.util.ArrayList; import java.util.List; /** - * ${DESCRIPTION} - * + * 爬取历史roe * @author chenguoxiang * @create 2018-07-09 17:28 **/ @@ -38,12 +36,38 @@ public class ThsHisYearReportTask { private MongoTemplate template; @Autowired private StockHisRoeRepository stockHisRoeRepository; + @Autowired + EhcacheUtil ehcacheUtil; + final String cacheName="ThsHisYearReportTask"; + + /** + * 是否错误次数过多,停止任务 + * @return + */ + boolean stopTask(){ + return getErrorTotal()>3; + } + + /** + * 得到执行错误的记录 + * @return + */ + int getErrorTotal(){ + Object value =ehcacheUtil.getKey(cacheName,"error"); + int val=null==value?0:(int)value; + return val; + } + @Scheduled(cron = "*/6 * * * * ?") public void execute() throws Exception { if (StockDateUtil.stockOpenTime()) { //开盘时间不处理 return; } + if(stopTask()){ + log.info("错误次数过多,不执行任务!"); + return; + } Integer dateNumber = StockDateUtil.getCurrentDateNumber(); Criteria cr = new Criteria(); Criteria c1 = Criteria.where("hrdud").lt(dateNumber-3); //3天更新一把 @@ -74,6 +98,7 @@ public void execute() throws Exception { ); } catch (Exception e) { e.printStackTrace(); + ehcacheUtil.addKey(cacheName,"error",getErrorTotal()+1); } }); diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/XueQiuStockDyTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/XueQiuStockDyTask.java index 3b793206..5c399a5e 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/XueQiuStockDyTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/XueQiuStockDyTask.java @@ -3,6 +3,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.mongodb.WriteResult; +import io.github.kingschan1204.istock.common.util.cache.EhcacheUtil; import io.github.kingschan1204.istock.common.util.stock.StockDateUtil; import io.github.kingschan1204.istock.common.util.stock.StockSpider; import io.github.kingschan1204.istock.module.maindata.po.Stock; @@ -37,6 +38,27 @@ public class XueQiuStockDyTask { private MongoTemplate template; @Autowired private StockDyQueueRepository stockDyQueueRepository; + @Autowired + EhcacheUtil ehcacheUtil; + final String cacheName="XueQiuStockDyTask"; + + /** + * 是否错误次数过多,停止任务 + * @return + */ + boolean stopTask(){ + return getErrorTotal()>5; + } + + /** + * 得到执行错误的记录 + * @return + */ + int getErrorTotal(){ + Object value =ehcacheUtil.getKey(cacheName,"error"); + int val=null==value?0:(int)value; + return val; + } @Scheduled(cron = "0 0/1 * * * ?") public void stockDividendExecute() throws Exception { @@ -45,6 +67,10 @@ public void stockDividendExecute() throws Exception { log.debug("非交易时间不执行操作..."); return; } + if(stopTask()){ + log.info("错误次数过多,不执行任务!"); + return; + } Long start = System.currentTimeMillis(); List list = template.find( new Query(Criteria.where("date").is(StockDateUtil.getCurrentDateNumber())), StockDyQueue.class @@ -71,6 +97,7 @@ public void stockDividendExecute() throws Exception { template.save(stockDyQueue, "stock_dy_queue"); log.info("dy更新第{}页,共{}页 耗时:{} ms", pageindex, totalpage, (System.currentTimeMillis() - start)); } catch (Exception ex) { + ehcacheUtil.addKey(cacheName,"error",getErrorTotal()+1); log.error("dy 出错了:{}", ex); ex.printStackTrace(); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 4bfeaed4..040a655a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -16,20 +16,22 @@ spring.jackson.serialization.indent_output=true spring.mvc.favicon.enabled=false spring.data.mongodb.database=istock -#192.168.10.240 +#192.168.10.175 #127.0.0.1 -spring.data.mongodb.host=192.168.10.240 +spring.data.mongodb.host=127.0.0.1 spring.data.mongodb.port=27017 #spider spider.timeout=8000 spider.useagent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3346.9 Safari/537.36 ## token -xueqiu.token=229a3a53d49b5d0078125899e528279b0e54b5fe +xueqiu.token= eastmoney.token=70f12f2f4f091e459a279469fe49eca5 #security management.context-path=/admin management.security.enabled=false management.security.roles=SUPERUSER -security.user.name=kingschan -security.user.password=password \ No newline at end of file +security.user.name=root +security.user.password= +###ehcache +spring.cache.ehcache.config=classpath:ehcache.xml diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml new file mode 100644 index 00000000..2f0541b9 --- /dev/null +++ b/src/main/resources/ehcache.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + From 82702faf91bc19b0eb9ac2eb582b3c0ce62e7ef5 Mon Sep 17 00:00:00 2001 From: kingschan Date: Thu, 12 Jul 2018 14:26:46 +0800 Subject: [PATCH 25/32] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=88=AC=E5=8F=96=E4=B8=80=E4=B8=AA=E9=94=99=E8=AF=AF=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../common/util/stock/StockDateUtil.java | 11 ++++++++ .../util/stock/impl/DefaultSpiderImpl.java | 8 +++--- .../module/maindata/po/Stock.java | 12 ++++----- .../module/maindata/po/StockCode.java | 10 +++++++ .../maindata/services/StockCodeService.java | 2 +- .../maindata/services/StockService.java | 4 +-- .../module/task/ThsHisYearReportTask.java | 19 ++++++++----- .../module/task/ThsStockInfoTask.java | 2 +- src/main/resources/ehcache.xml | 27 ++++--------------- 10 files changed, 53 insertions(+), 44 deletions(-) diff --git a/pom.xml b/pom.xml index 2934f928..15306c60 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ io.github.kingschan1204 istock jar - 1.6.1 + 1.6.3 pritice Maven Webapp http://maven.apache.org diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockDateUtil.java b/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockDateUtil.java index 906527d9..54ea43c8 100644 --- a/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockDateUtil.java +++ b/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockDateUtil.java @@ -138,6 +138,16 @@ public static Integer getCurrentDateNumber() { return Integer.valueOf(date); } + /** + * 得到当前时间的Long数字 + * @return + */ + public static Long getCurrentDateTimeNumber() { + String date = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date(System + .currentTimeMillis())); + return Long.valueOf(date); + } + /** * 获取某年第一天日期 * @@ -178,4 +188,5 @@ public static int getCurrentYear() { return Integer.parseInt(year); } + } diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java index 4ad1e2c9..1f61d343 100644 --- a/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java +++ b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java @@ -97,7 +97,7 @@ public JSONArray getStockPrice(String[] stockCode) throws Exception { json.put("todayMax", today_max);//今日最高价 json.put("todayMin", today_min);//今日最低价 json.put("yesterdayPrice", zs);//昨收 - json.put("priceDate", new Date()); + json.put("priceDate", StockDateUtil.getCurrentDateTimeNumber()); rows.add(json); } return rows; @@ -180,11 +180,11 @@ public JSONArray getHistoryDividendRate(String code) throws Exception { @Override public JSONArray getHistoryROE(String code) throws Exception { String url = String.format("http://basic.10jqka.com.cn/api/stock/export.php?export=main&type=year&code=%s", code); - String path = null;//String.format("./data/%s_main_year.xls", code); - String referrer=String.format("http://stockpage.10jqka.com.cn/600725/finance/",code); + String path = String.format("./data/%s_main_year.xls", code); + String referrer=String.format("http://basic.10jqka.com.cn/%s/finance.html",code); if (!new File(path).exists()) { //下载 - path= FileCommonOperactionTool.downloadFile(url, referrer,"./data/", null); + path= FileCommonOperactionTool.downloadFile(url, referrer,"./data/", code+".xls"); }else{ log.info("文件存在,直接读取:{}",path); } diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/po/Stock.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/po/Stock.java index af201e74..e3427291 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/po/Stock.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/po/Stock.java @@ -3,8 +3,6 @@ import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; -import java.util.Date; - /** * stock maindata * @@ -23,7 +21,7 @@ public class Stock { private Double fluctuate; private Double todayMax; private Double todayMin; - private Date priceDate; + private Long priceDate; private String industry; private String mainBusiness; private Double totalValue; @@ -33,9 +31,9 @@ public class Stock { private Double pes; private Double ped; private Integer infoDate; - private String dividendDate; + private String dividendDate;//静态分红日期 private Double dividend; - private Integer dividendUpdateDay; + private Integer dividendUpdateDay;//静态分红更新时间 private Double dy;//实时股息率 private Integer dyDate;//实时股息更新时间 private Double fiveYearDy;//5年平均股息 @@ -105,11 +103,11 @@ public void setTodayMin(Double todayMin) { this.todayMin = todayMin; } - public Date getPriceDate() { + public Long getPriceDate() { return priceDate; } - public void setPriceDate(Date priceDate) { + public void setPriceDate(Long priceDate) { this.priceDate = priceDate; } diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockCode.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockCode.java index 91e318cb..6f35a346 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockCode.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockCode.java @@ -14,11 +14,13 @@ public class StockCode { @Id private String code; private Integer hrdud;//history report data update date 历史年度报表更新时间 + private Integer xlsError;//下载xls错误 public StockCode(){} public StockCode(String code){ this.code=code; this.hrdud=0; + this.xlsError=0; } @@ -37,4 +39,12 @@ public Integer getHrdud() { public void setHrdud(Integer hrdud) { this.hrdud = hrdud; } + + public Integer getXlsError() { + return xlsError; + } + + public void setXlsError(Integer xlsError) { + this.xlsError = xlsError; + } } diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockCodeService.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockCodeService.java index a25dbc53..65409e11 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockCodeService.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockCodeService.java @@ -45,7 +45,7 @@ public void saveAllStockCode() throws Exception { codes.stream().forEach(code -> { mongoTemplate.upsert( new Query(Criteria.where("_id").is(code)), - new Update().set("_id", code), + new Update().set("_id", code).set("hrdud",0).set("xlsError",0), "stock_code" ); } diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java index 0dc5705b..94f898ff 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java @@ -155,10 +155,10 @@ public String queryStock(int pageindex, int pagesize, final String pcode,final S if(temp.containsKey("totalValue")&&temp.getDouble("totalValue")!=-1){ temp.put("totalValue",temp.getString("totalValue")+"亿"); } - if(temp.containsKey("dividend")&&temp.getDouble("pb")==-1){ + if(temp.containsKey("pb")&&temp.getDouble("pb")==-1){ temp.put("pb","--"); } - if(temp.containsKey("dividend")&&temp.getDouble("pes")==-1){ + if(temp.containsKey("pes")&&temp.getDouble("pes")==-1){ temp.put("pes","--"); } if(temp.containsKey("ped")&&temp.getDouble("ped")==-1){ diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java index 6ff7458a..ce2b5c00 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java @@ -61,9 +61,10 @@ int getErrorTotal(){ @Scheduled(cron = "*/6 * * * * ?") public void execute() throws Exception { - if (StockDateUtil.stockOpenTime()) { //开盘时间不处理 + Long start = System.currentTimeMillis(); + /*if (StockDateUtil.stockOpenTime()) { //开盘时间不处理 return; - } + }*/ if(stopTask()){ log.info("错误次数过多,不执行任务!"); return; @@ -71,12 +72,12 @@ public void execute() throws Exception { Integer dateNumber = StockDateUtil.getCurrentDateNumber(); Criteria cr = new Criteria(); Criteria c1 = Criteria.where("hrdud").lt(dateNumber-3); //3天更新一把 - Criteria c2 = Criteria.where("hrdud").exists(false); - Query query = new Query(cr.orOperator(c1,c2)); - List orders = new ArrayList(); //排序 + Criteria c2 = Criteria.where("xlsError").is(0); + Query query = new Query(cr.andOperator(c1,c2)); + /*List orders = new ArrayList(); //排序 orders.add(new Sort.Order(Sort.Direction.ASC,"_id")); Sort sort = new Sort(orders); - query.with(sort); + query.with(sort);*/ query.limit(2); List list = template.find(query, StockCode.class); if(null==list||list.size()==0){ @@ -99,8 +100,14 @@ public void execute() throws Exception { } catch (Exception e) { e.printStackTrace(); ehcacheUtil.addKey(cacheName,"error",getErrorTotal()+1); + template.upsert( + new Query(Criteria.where("_id").is(code.getCode())),new Update().set("xlsError", 1), + "stock_code" + ); } }); + log.info(String.format("download xls and update data use :%s ms ", (System.currentTimeMillis() - start))); + //end } } diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/ThsStockInfoTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/ThsStockInfoTask.java index 916dbb3a..f920a15b 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/ThsStockInfoTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/ThsStockInfoTask.java @@ -82,7 +82,7 @@ public void stockInfoExecute() throws Exception { ; } } - log.info(String.format("info更新耗时:%s ms ,影响行: %s", (System.currentTimeMillis() - start),affected)); + log.info(String.format("craw stock info and update data use :%s ms ,affected rows : %s", (System.currentTimeMillis() - start),affected)); } } diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml index 2f0541b9..06f61fa3 100644 --- a/src/main/resources/ehcache.xml +++ b/src/main/resources/ehcache.xml @@ -37,30 +37,13 @@ timeToIdleSeconds=y:缓存创建以后,最后一次访问缓存的日期至 timeToIdleSeconds=120; timeToLiveSeconds=180; 表示此缓存最多可以存活3分钟,如果期间超过2分钟未访问 那么此缓存失效 - - - --> - +--> + + - + - + From 043ea946938df6688dd79c167de013910d065870 Mon Sep 17 00:00:00 2001 From: kingschan Date: Thu, 12 Jul 2018 17:37:08 +0800 Subject: [PATCH 26/32] =?UTF-8?q?=E5=8A=A0=E5=85=A55=E5=B9=B4=E5=B9=B3?= =?UTF-8?q?=E5=9D=87roe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/maindata/ctrl/StockCtrl.java | 36 +++++++++++++++++-- .../module/maindata/po/Stock.java | 10 ++++++ .../maindata/services/StockService.java | 3 ++ .../{ => mapreduce/5years_dy}/dy5years_map.js | 0 .../5years_dy}/dy5years_reduce.js | 0 .../resources/mapreduce/5years_roe/map.js | 3 ++ .../resources/mapreduce/5years_roe/reduce.js | 16 +++++++++ src/main/resources/templates/index.html | 5 +-- 8 files changed, 68 insertions(+), 5 deletions(-) rename src/main/resources/{ => mapreduce/5years_dy}/dy5years_map.js (100%) rename src/main/resources/{ => mapreduce/5years_dy}/dy5years_reduce.js (100%) create mode 100644 src/main/resources/mapreduce/5years_roe/map.js create mode 100644 src/main/resources/mapreduce/5years_roe/reduce.js diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockCtrl.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockCtrl.java index 59ad9edc..8b1a0760 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockCtrl.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/ctrl/StockCtrl.java @@ -58,8 +58,8 @@ public String initCode() { private MongoTemplate template; @ResponseBody - @RequestMapping(value = "/stock/mapReduce") - public String mapReduce() { + @RequestMapping(value = "/stock/mapReduce/5years_dy") + public String fiveYearsDy() { int year = StockDateUtil.getCurrentYear(); int fiveYearAgo = year - 5; String startDate = StockDateUtil.getCurrYearLastDay(fiveYearAgo).toString(); @@ -67,7 +67,7 @@ public String mapReduce() { Query query = new Query(); query.addCriteria(Criteria.where("releaseDate").gte(startDate).lte(endDate)); MapReduceResults result = template.mapReduce(query, "stock_dividend", - "classpath:dy5years_map.js", "classpath:dy5years_reduce.js", + "classpath:/mapreduce/5years_dy/dy5years_map.js", "classpath:/mapreduce/5years_dy/dy5years_reduce.js", new MapReduceOptions().outputCollection("stock_dy_statistics"), BasicDBObject.class); Iterator iter = result.iterator(); while (iter.hasNext()) { @@ -90,4 +90,34 @@ public String mapReduce() { } + @ResponseBody + @RequestMapping(value = "/stock/mapReduce/5years_roe") + public String fiveYearsRoe() { + int endYear = StockDateUtil.getCurrentYear(); + int startYear = endYear - 5; + Query query = new Query(); + query.addCriteria(Criteria.where("year").gte(startYear).lte(endYear)); + MapReduceResults result = template.mapReduce(query, "stock_his_roe", + "classpath:/mapreduce/5years_roe/map.js", "classpath:/mapreduce/5years_roe/reduce.js", + new MapReduceOptions().outputCollection("stock_hisroe_statistics"), BasicDBObject.class); + Iterator iter = result.iterator(); + while (iter.hasNext()) { + BasicDBObject item = iter.next(); + String code = item.getString("_id"); + BasicDBObject value = (BasicDBObject) item.get("value"); + if (value.containsKey("size") && value.getInt("size") > 4) { + double percent = Double.parseDouble(value.getString("percent")); + WriteResult wr = template.upsert( + new Query(Criteria.where("_id").is(code)), + new Update() + .set("_id", code) + .set("fiveYearRoe", percent), + "stock" + ); + } + + } + return String.format("success:%s - %s", startYear, endYear); + } + } diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/po/Stock.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/po/Stock.java index e3427291..5c34342a 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/po/Stock.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/po/Stock.java @@ -37,6 +37,7 @@ public class Stock { private Double dy;//实时股息率 private Integer dyDate;//实时股息更新时间 private Double fiveYearDy;//5年平均股息 + private Double fiveYearRoe;//5年平均Roe public String getCode() { @@ -215,6 +216,7 @@ public Integer getDyDate() { public void setDyDate(Integer dyDate) { this.dyDate = dyDate; } + public Integer getInfoDate() { return infoDate; } @@ -230,4 +232,12 @@ public Double getFiveYearDy() { public void setFiveYearDy(Double fiveYearDy) { this.fiveYearDy = fiveYearDy; } + + public Double getFiveYearRoe() { + return fiveYearRoe; + } + + public void setFiveYearRoe(Double fiveYearRoe) { + this.fiveYearRoe = fiveYearRoe; + } } diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java index 94f898ff..680a039a 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java @@ -180,6 +180,9 @@ public String queryStock(int pageindex, int pagesize, final String pcode,final S if(temp.containsKey("fiveYearDy")){ temp.put("fiveYearDy",temp.getString("fiveYearDy")+"%"); } + if(temp.containsKey("fiveYearRoe")){ + temp.put("fiveYearRoe",temp.getString("fiveYearRoe")+"%"); + } } diff --git a/src/main/resources/dy5years_map.js b/src/main/resources/mapreduce/5years_dy/dy5years_map.js similarity index 100% rename from src/main/resources/dy5years_map.js rename to src/main/resources/mapreduce/5years_dy/dy5years_map.js diff --git a/src/main/resources/dy5years_reduce.js b/src/main/resources/mapreduce/5years_dy/dy5years_reduce.js similarity index 100% rename from src/main/resources/dy5years_reduce.js rename to src/main/resources/mapreduce/5years_dy/dy5years_reduce.js diff --git a/src/main/resources/mapreduce/5years_roe/map.js b/src/main/resources/mapreduce/5years_roe/map.js new file mode 100644 index 00000000..2e9d5ecb --- /dev/null +++ b/src/main/resources/mapreduce/5years_roe/map.js @@ -0,0 +1,3 @@ +function () { + emit(this.code, {percent: this.roe, title: this.year}) +} \ No newline at end of file diff --git a/src/main/resources/mapreduce/5years_roe/reduce.js b/src/main/resources/mapreduce/5years_roe/reduce.js new file mode 100644 index 00000000..1e660bc8 --- /dev/null +++ b/src/main/resources/mapreduce/5years_roe/reduce.js @@ -0,0 +1,16 @@ +function(key, values) { + var total=0; + var index=0; + var years=""; + for (var i = 0; i < values.length; i++) { + var title =values[i].title; + total+=values[i].percent; + index++; + years+=title+","; + } + if(index<5){ + total=0; + } + var percent=(total/index).toFixed(2); + return {percent:parseFloat(percent),years:years,size:index}; +} \ No newline at end of file diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index 42483c5d..ce03de80 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -102,7 +102,7 @@ mtype: "GET", styleUI: 'Bootstrap', datatype: "json", - colNames: ['代码', '名称', '市场', '价格', '昨收', '涨幅', 'PE(动)', 'PE(静)', '市净率', '总市值', 'ROE', '每股净资产', '股息(动)', '股息(静)', '5年平均股息', '上次分红', '行业'], + colNames: ['代码', '名称', '市场', '价格', '昨收', '涨幅', 'PE(动)', 'PE(静)', '市净率', '总市值', '每股净资产', '股息(动)', '股息(静)', '5年平均股息','最新ROE','5年平均ROE', '上次分红', '行业'], colModel: [ {label: 'code', name: 'code', width: 100}, @@ -117,11 +117,12 @@ {label: 'pb', name: 'pb', width: 60, align: 'right'}, {label: 'totalValue', name: 'totalValue', width: 80, align: 'right'}, - {label: 'roe', name: 'roe', width: 65, align: 'right'}, {label: 'bvps', name: 'bvps', width: 90, align: 'right'}, {label: 'dy', name: 'dy', width: 70, align: 'right'}, {label: 'dividend', name: 'dividend', width: 70, align: 'right'}, {label: 'fiveYearDy', name: 'fiveYearDy', width: 90, align: 'right'}, + {label: 'roe', name: 'roe', width: 75, align: 'right'}, + {label: 'fiveYearRoe', name: 'fiveYearRoe', width: 96, align: 'right'}, {label: 'dividendDate', name: 'dividendDate', width: 90}, {label: 'industry', name: 'industry', width: 130} // {label: 'sVersion', name: 'sVersion', width: 650} From 62249e18adbaf630b0cb9966f9e29bff6df89c19 Mon Sep 17 00:00:00 2001 From: kingschan Date: Thu, 12 Jul 2018 18:28:37 +0800 Subject: [PATCH 27/32] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E9=98=BF=E9=87=8C?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=A3=80=E6=9F=A5=E6=8F=92=E4=BB=B6=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/util/stock/StockSpider.java | 9 ++-- .../util/stock/impl/DefaultSpiderImpl.java | 11 ++--- .../util/stock/impl/EastmoneySpider.java | 45 ++++++++++--------- .../module/maindata/po/StockHisDividend.java | 10 ++--- .../module/maindata/po/StockHisRoe.java | 10 ++--- .../maindata/services/StockService.java | 3 +- .../module/task/StockDividendTask.java | 6 +-- .../module/task/ThsHisYearReportTask.java | 7 --- .../module/task/ThsStockInfoTask.java | 2 +- 9 files changed, 49 insertions(+), 54 deletions(-) diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockSpider.java b/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockSpider.java index 22bbcd5c..ee0f0566 100644 --- a/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockSpider.java +++ b/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockSpider.java @@ -24,7 +24,7 @@ **/ public interface StockSpider { - static final String regexNumber = "^[-+]?([0]{1}(\\.[0-9]+)?|[1-9]{1}\\d*(\\.[0-9]+)?)";//"^[-+]?[0-9]+(\\.[0-9]+)?$"; + static final String REGEX_NUMBER = "^[-+]?([0]{1}(\\.[0-9]+)?|[1-9]{1}\\d*(\\.[0-9]+)?)";//"^[-+]?[0-9]+(\\.[0-9]+)?$"; /** * 将股票代码转换成新浪接口的格式http://hq.sinajs.cn/list= @@ -107,7 +107,7 @@ static List findStringByRegx(String text, String regx) { */ static Double mathFormat(String value) { String v = value.replaceAll("[^0-9|\\.|\\-]", ""); - if (v.matches(regexNumber)) { + if (v.matches(REGEX_NUMBER)) { return Double.valueOf(v); } return -1D; @@ -121,13 +121,14 @@ static Double mathFormat(String value) { */ static void enableSSLSocket() throws KeyManagementException, NoSuchAlgorithmException { TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { + @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } - + @Override public void checkClientTrusted(X509Certificate[] certs, String authType) { } - + @Override public void checkServerTrusted(X509Certificate[] certs, String authType) { } }}; diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java index 1f61d343..7bfe3485 100644 --- a/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java +++ b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/DefaultSpiderImpl.java @@ -76,8 +76,8 @@ public JSONArray getStockPrice(String[] stockCode) throws Exception { double xj = StockSpider.mathFormat(data[4]); double zs = StockSpider.mathFormat(data[3]); double zf = (xj - zs) / zs * 100; - double today_max = StockSpider.mathFormat(data[5]); - double today_min = StockSpider.mathFormat(data[6]); + double todayMax = StockSpider.mathFormat(data[5]); + double todayMin = StockSpider.mathFormat(data[6]); json = new JSONObject(); if (xj == 0) { //一般这种是停牌的 json.put("fluctuate", 0);//波动 @@ -94,8 +94,8 @@ public JSONArray getStockPrice(String[] stockCode) throws Exception { json.put("type", StockSpider.formatStockCode(data[0]).replaceAll("\\d", "")); json.put("name", data[1].replaceAll("\\s", ""));//名称 json.put("price", xj);//现价 - json.put("todayMax", today_max);//今日最高价 - json.put("todayMin", today_min);//今日最低价 + json.put("todayMax", todayMax);//今日最高价 + json.put("todayMin", todayMin);//今日最低价 json.put("yesterdayPrice", zs);//昨收 json.put("priceDate", StockDateUtil.getCurrentDateTimeNumber()); rows.add(json); @@ -154,7 +154,7 @@ public JSONArray getHistoryDividendRate(String code) throws Exception { for (int i = 1; i < rows.size(); i++) { String rowtext = rows.get(i).select("td").text(); String[] data = rowtext.split(" "); - if (data[6].equals("--") || data[9].equals("--")) { + if ("--".equals(data[6]) || "--".equals(data[9])) { continue; } log.debug("报告期:{},A股除权除息日:{},实施日期:{},分红方案说明:{},分红率:{}", data[0], data[6], data[3], data[4], data[9]); @@ -235,6 +235,7 @@ public List getAllStockCode() throws Exception { * @return * @throws Exception */ + @Override public JSONObject getDy(int page) throws Exception { String url = "https://xueqiu.com/stock/screener/screen.json?category=SH&exchange=&areacode=&indcode=&orderby=symbol&order=desc¤t=ALL&pct=ALL&page=%s&dy=0_19.31&size=100"; url = String.format(url, page); diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/EastmoneySpider.java b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/EastmoneySpider.java index 951ae771..2f95d160 100644 --- a/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/EastmoneySpider.java +++ b/src/main/java/io.github.kingschan1204.istock/common/util/stock/impl/EastmoneySpider.java @@ -23,7 +23,7 @@ public class EastmoneySpider extends DefaultSpiderImpl { private Logger log = LoggerFactory.getLogger(EastmoneySpider.class); @Value("${eastmoney.token}") - private String token ; + private String token; /** * ReportingPeriod:报告期 @@ -46,38 +46,39 @@ public JSONArray getHistoryDividendRate(String code) throws Exception { String regex = "T.*"; String apiUrl = String.format("http://dcfm.eastmoney.com/EM_MutiSvcExpandInterface/api/js/get?type=DCSOBS&token=%s&p=1&ps=50&sr=-1&st=ReportingPeriod&filter=&cmd=%s", token, code); String referer = String.format("http://data.eastmoney.com/yjfp/detail/%s.html", code); - Document doc=null; - try{ - doc = Jsoup.connect(apiUrl).userAgent(useAgent) + Document doc = null; + try { + doc = Jsoup.connect(apiUrl).userAgent(useAgent) .timeout(10000) .ignoreContentType(true) .referrer(referer).get(); - }catch (SocketTimeoutException e){ - log.error("抓取超时:{}",apiUrl); + } catch (SocketTimeoutException e) { + log.error("抓取超时:{}", apiUrl); return new JSONArray(); } JSONArray data = JSONArray.parseArray(doc.text()); - if(null==data)return new JSONArray(); - + if (null == data) { + return new JSONArray(); + } JSONArray jsons = new JSONArray(); JSONObject temp; for (int i = 0; i < data.size(); i++) { JSONObject item = data.getJSONObject(i); temp = new JSONObject(); temp.put("code", code); - String title=item.getString("ReportingPeriod").replaceAll(regex, ""); - if(title.matches("^\\d{4}\\-12-31$")){ - title=title.replaceAll("\\-.*","")+"年报"; + String title = item.getString("ReportingPeriod").replaceAll(regex, ""); + if (title.matches("^\\d{4}\\-12-31$")) { + title = title.replaceAll("\\-.*", "") + "年报"; } - if(title.matches("^\\d{4}\\-06-30$")){ - title=title.replaceAll("\\-.*","")+"中报"; + if (title.matches("^\\d{4}\\-06-30$")) { + title = title.replaceAll("\\-.*", "") + "中报"; } - temp.put("title",title);//报告期 + temp.put("title", title);//报告期 temp.put("releaseDate", item.getString("ResultsbyDate").replaceAll(regex, ""));//披露时间 temp.put("plan", item.getString("AllocationPlan"));//分配预案 temp.put("sgbl", intFormart(item.getString("SGBL")));//送股比例 temp.put("zgbl", intFormart(item.getString("ZGBL")));//转股比例 - temp.put("percent",doubleFormat(item.getString("GXL"),true));//股息率 + temp.put("percent", doubleFormat(item.getString("GXL"), true));//股息率 temp.put("gqdjr", item.getString("GQDJR").replaceAll(regex, ""));//股权登记日 temp.put("cxcqr", item.getString("CQCXR").replaceAll(regex, ""));//除息除权日 temp.put("progress", item.getString("ProjectProgress"));//进度 @@ -85,7 +86,7 @@ public JSONArray getHistoryDividendRate(String code) throws Exception { jsons.add(temp); } - log.info("{}:抓取成功!",code); + log.info("{}:抓取成功!", code); return jsons; } @@ -102,17 +103,17 @@ public int intFormart(String data) { * @param math * @return */ - public double doubleFormat(String math,boolean percent) { - String regex_number="^[-+]?([0]{1}(\\.[0-9]+)?|[1-9]{1}\\d*(\\.[0-9]+)?)"; - if(math.matches(regex_number)){ + public double doubleFormat(String math, boolean percent) { + String regexNumber = "^[-+]?([0]{1}(\\.[0-9]+)?|[1-9]{1}\\d*(\\.[0-9]+)?)"; + if (math.matches(regexNumber)) { Double d = Double.parseDouble(math); - if(percent){ - d=d*100; + if (percent) { + d = d * 100; } BigDecimal b = new BigDecimal(d); return b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } - return 0d; + return 0d; } diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisDividend.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisDividend.java index 7bc712e5..daa571cd 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisDividend.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisDividend.java @@ -14,19 +14,19 @@ public class StockHisDividend { //{"date":"2017-07-07","code":"600519","year":"2016年报","executeDate":"2017-07-01","remark":"10派67.87元(含税)","percent":1.44} @Id - private String _id; + private String id; private String code; private String title; private String executeDate; private String remark; private Double percent; - public String get_id() { - return _id; + public String getId() { + return id; } - public void set_id(String _id) { - this._id = _id; + public void setId(String id) { + this.id = id; } public String getCode() { diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisRoe.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisRoe.java index a619256b..3b1a9d4d 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisRoe.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/po/StockHisRoe.java @@ -16,19 +16,19 @@ public class StockHisRoe { @Id - private String _id; + private String id; private String code; private Integer year; private Double roe; private Double roetb; private Date date; - public String get_id() { - return _id; + public String getId() { + return id; } - public void set_id(String _id) { - this._id = _id; + public void setId(String id) { + this.id = id; } public String getCode() { diff --git a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java index 680a039a..58afaded 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java +++ b/src/main/java/io.github.kingschan1204.istock/module/maindata/services/StockService.java @@ -74,7 +74,6 @@ public void addStock(String... codes) throws Exception { //save dividend List stockHisDividendList = JSONArray.parseArray(dividends.toJSONString(),StockHisDividend.class); template.remove(new Query(Criteria.where("code").is(scode)),StockHisDividend.class); -// stockHisDividendRepository.save(stockHisDividendList); } json.put("dividend",percent); json.put("dividendDate",date); @@ -132,7 +131,7 @@ public String queryStock(int pageindex, int pagesize, final String pcode,final S //排序 List orders = new ArrayList(); //排序 orders.add(new Sort.Order( - psort.equalsIgnoreCase("asc")?Sort.Direction.ASC:Sort.Direction.DESC + "asc".equalsIgnoreCase(psort) ?Sort.Direction.ASC:Sort.Direction.DESC ,orderfidld)); Sort sort = new Sort(orders); query.with(sort); diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java index 1ed3eca6..811eb774 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java @@ -61,10 +61,10 @@ public void stockDividendExecute() throws Exception { if(null!=dividends&÷nds.size()>0){ for (int j = 0; j < dividends.size(); j++) { double tempPercent=dividends.getJSONObject(j).getDouble("percent"); - String temp_date=dividends.getJSONObject(j).getString("cxcqr"); - if(tempPercent>=0&&!temp_date.equals("-")){ + String tempDate=dividends.getJSONObject(j).getString("cxcqr"); + if(tempPercent>=0&&!"-".equals(tempDate)){ percent=tempPercent; - date=temp_date; + date=tempDate; break; } } diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java index ce2b5c00..6ad77e2b 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java @@ -62,9 +62,6 @@ int getErrorTotal(){ @Scheduled(cron = "*/6 * * * * ?") public void execute() throws Exception { Long start = System.currentTimeMillis(); - /*if (StockDateUtil.stockOpenTime()) { //开盘时间不处理 - return; - }*/ if(stopTask()){ log.info("错误次数过多,不执行任务!"); return; @@ -74,10 +71,6 @@ public void execute() throws Exception { Criteria c1 = Criteria.where("hrdud").lt(dateNumber-3); //3天更新一把 Criteria c2 = Criteria.where("xlsError").is(0); Query query = new Query(cr.andOperator(c1,c2)); - /*List orders = new ArrayList(); //排序 - orders.add(new Sort.Order(Sort.Direction.ASC,"_id")); - Sort sort = new Sort(orders); - query.with(sort);*/ query.limit(2); List list = template.find(query, StockCode.class); if(null==list||list.size()==0){ diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/ThsStockInfoTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/ThsStockInfoTask.java index f920a15b..f1f3cfe4 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/ThsStockInfoTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/ThsStockInfoTask.java @@ -59,7 +59,7 @@ public void stockInfoExecute() throws Exception { try { JSONObject info = spider.getStockInfo(stock.getCode()); item = info.toJavaObject(Stock.class); - if (null == item) return; + if (null == item) {return;} WriteResult wr = template.upsert( new Query(Criteria.where("_id").is(stock.getCode())), new Update() From 3e337ae0f7d5ae9372a5968d7354b6351aed67c2 Mon Sep 17 00:00:00 2001 From: kingschan Date: Fri, 13 Jul 2018 16:49:32 +0800 Subject: [PATCH 28/32] =?UTF-8?q?quartz=20=E5=8A=A8=E6=80=81=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1demo=20=E5=AE=9E?= =?UTF-8?q?=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 + .../Application.java | 7 + .../common/conf/ScheduleConfig.java | 29 ---- .../common/util/quartz/QuartzManager.java | 150 ++++++++++++++++++ .../module/task/SinaStockPriceTask.java | 2 +- .../module/task/StockCodeTask.java | 2 +- .../module/task/StockDividendTask.java | 15 +- .../module/task/ThsHisYearReportTask.java | 5 +- .../module/task/ThsStockInfoTask.java | 2 +- .../module/task/XueQiuStockDyTask.java | 2 +- 10 files changed, 183 insertions(+), 37 deletions(-) delete mode 100644 src/main/java/io.github.kingschan1204.istock/common/conf/ScheduleConfig.java create mode 100644 src/main/java/io.github.kingschan1204.istock/common/util/quartz/QuartzManager.java diff --git a/pom.xml b/pom.xml index 15306c60..6ce314d4 100644 --- a/pom.xml +++ b/pom.xml @@ -120,6 +120,12 @@ net.sf.ehcache ehcache + + + org.quartz-scheduler + quartz + 2.3.0 + diff --git a/src/main/java/io.github.kingschan1204.istock/Application.java b/src/main/java/io.github.kingschan1204.istock/Application.java index a07869a6..cdb5e6f8 100644 --- a/src/main/java/io.github.kingschan1204.istock/Application.java +++ b/src/main/java/io.github.kingschan1204.istock/Application.java @@ -1,8 +1,10 @@ package io.github.kingschan1204.istock; +import io.github.kingschan1204.istock.module.startup.InitQuartzTaskRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @@ -18,6 +20,11 @@ public String index() { return "index"; } + @Bean + public InitQuartzTaskRunner startupRunner() { + return new InitQuartzTaskRunner(); + } + public static void main(String[] args) { SpringApplication.run(Application.class, args); } diff --git a/src/main/java/io.github.kingschan1204.istock/common/conf/ScheduleConfig.java b/src/main/java/io.github.kingschan1204.istock/common/conf/ScheduleConfig.java deleted file mode 100644 index e6760e83..00000000 --- a/src/main/java/io.github.kingschan1204.istock/common/conf/ScheduleConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.github.kingschan1204.istock.common.conf; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.scheduling.annotation.SchedulingConfigurer; -import org.springframework.scheduling.config.ScheduledTaskRegistrar; - -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; - -/** - * 并行执行(多任务同时) - * @author chenguoxiang - * @create 2018-03-30 10:24 - **/ -@Configuration -@EnableScheduling -public class ScheduleConfig implements SchedulingConfigurer { - @Override - public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { - scheduledTaskRegistrar.setScheduler(taskExecutor()); - } - - @Bean(destroyMethod = "shutdown") - public Executor taskExecutor() { - return Executors.newScheduledThreadPool(100); - } -} diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/quartz/QuartzManager.java b/src/main/java/io.github.kingschan1204.istock/common/util/quartz/QuartzManager.java new file mode 100644 index 00000000..62f3e1f5 --- /dev/null +++ b/src/main/java/io.github.kingschan1204.istock/common/util/quartz/QuartzManager.java @@ -0,0 +1,150 @@ +package io.github.kingschan1204.istock.common.util.quartz; + +import org.quartz.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; +import org.springframework.stereotype.Component; + +/** + * quartz 任务管理工具类 + * @author chenguoxiang + * @create 2018-07-13 14:46 + **/ +@Component +public class QuartzManager { + private static Logger log = LoggerFactory.getLogger(QuartzManager.class); + @Autowired + SchedulerFactoryBean schedulerFactoryBean; + + /** + * @param jobName 任务名 + * @param jobGroupName 任务组名 + * @param triggerName 触发器名 + * @param triggerGroupName 触发器组名 + * @param jobClass 任务 + * @param cron 时间设置,参考quartz说明文档 + * @Description: 添加一个定时任务 + */ + public void addJob(String jobName, String jobGroupName, + String triggerName, String triggerGroupName, Class jobClass, String cron) { + try { + Scheduler sched = schedulerFactoryBean.getScheduler();//schedulerFactory.getScheduler(); + + // 任务名,任务组,任务执行类 + JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build(); + // 触发器 + TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger(); + // 触发器名,触发器组 + triggerBuilder.withIdentity(triggerName, triggerGroupName); + triggerBuilder.startNow(); + // 触发器时间设定 + triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron)); + // 创建Trigger对象 + CronTrigger trigger = (CronTrigger) triggerBuilder.build(); + // 调度容器设置JobDetail和Trigger + sched.scheduleJob(jobDetail, trigger); + // 启动 + if (!sched.isShutdown()) { + log.info("添加定时任务{} , class:{} 执行频率:{}",jobName,jobClass.getName(),cron); + sched.start(); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 修改一个任务的触发时间 + * @param jobName + * @param jobGroupName + * @param triggerName 触发器名 + * @param triggerGroupName 触发器组名 + * @param cron 时间设置,参考quartz说明文档 + * @Description: 修改一个任务的触发时间 + */ + public void modifyJobTime(String jobName, + String jobGroupName, String triggerName, String triggerGroupName, String cron) { + try { + Scheduler sched = schedulerFactoryBean.getScheduler(); + TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); + CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); + if (trigger == null) { + return; + } + + String oldTime = trigger.getCronExpression(); + if (!oldTime.equalsIgnoreCase(cron)) { + /** 方式一 :调用 rescheduleJob 开始 */ + // 触发器 + TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger(); + // 触发器名,触发器组 + triggerBuilder.withIdentity(triggerName, triggerGroupName); + triggerBuilder.startNow(); + // 触发器时间设定 + triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron)); + // 创建Trigger对象 + trigger = (CronTrigger) triggerBuilder.build(); + // 方式一 :修改一个任务的触发时间 + sched.rescheduleJob(triggerKey, trigger); + log.info("添加定时任务{} , 执行频率:{}",jobName,cron); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 删除一个job + * @param jobName + * @param jobGroupName + * @param triggerName + * @param triggerGroupName + * @Description: 移除一个任务 + */ + public void removeJob(String jobName, String jobGroupName, + String triggerName, String triggerGroupName) { + try { + Scheduler sched = schedulerFactoryBean.getScheduler(); + TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); + // 停止触发器 + sched.pauseTrigger(triggerKey); + // 移除触发器 + sched.unscheduleJob(triggerKey); + // 删除任务 + sched.deleteJob(JobKey.jobKey(jobName, jobGroupName)); + log.info("添加定时任务{}",jobName); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * @Description:启动所有定时任务 + */ + public void startJobs() { + try { + Scheduler sched = schedulerFactoryBean.getScheduler(); + sched.start(); + log.info("启动所有任务"); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * @Description:关闭所有定时任务 + */ + public void shutdownJobs() { + try { + Scheduler sched = schedulerFactoryBean.getScheduler(); + if (!sched.isShutdown()) { + sched.shutdown(); + log.info("关闭所有任务"); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/SinaStockPriceTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/SinaStockPriceTask.java index 7041fb84..057f0a76 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/SinaStockPriceTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/SinaStockPriceTask.java @@ -38,7 +38,7 @@ public class SinaStockPriceTask { @Autowired private StockCodeService stockCodeService; - @Scheduled(cron = "0 0/2 * * * ?") +// @Scheduled(cron = "0 0/2 * * * ?") public void stockPriceExecute() throws Exception { if (!StockDateUtil.stockOpenTime()) { return; diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/StockCodeTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/StockCodeTask.java index a22f102c..1be93b31 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/StockCodeTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/StockCodeTask.java @@ -24,7 +24,7 @@ public class StockCodeTask { @Autowired private StockCodeService stockCodeService; - @Scheduled(cron = "0 0 0 * * ?") +// @Scheduled(cron = "0 0 0 * * ?") public void stockCodeExecute()throws Exception{ Long start =System.currentTimeMillis(); stockCodeService.saveAllStockCode(); diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java index 811eb774..2075cb6e 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java @@ -8,6 +8,9 @@ import io.github.kingschan1204.istock.module.maindata.po.Stock; import io.github.kingschan1204.istock.module.maindata.po.StockDividend; import io.github.kingschan1204.istock.module.maindata.repository.StockHisDividendRepository; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -28,7 +31,7 @@ * @create 2018-03-29 14:50 **/ @Component -public class StockDividendTask { +public class StockDividendTask implements Job { private Logger log = LoggerFactory.getLogger(StockDividendTask.class); @@ -41,7 +44,7 @@ public class StockDividendTask { @Autowired private StockHisDividendRepository stockHisDividendRepository; - @Scheduled(cron = "*/6 * * * * ?") +// @Scheduled(cron = "*/6 * * * * ?") public void stockDividendExecute() throws Exception { Integer dateNumber = StockDateUtil.getCurrentDateNumber()-3; Criteria cr = new Criteria(); @@ -120,4 +123,12 @@ public JSONArray combineHisDy(String code)throws Exception{ return ret; } + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + try { + stockDividendExecute(); + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java index 6ad77e2b..b47a7475 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java @@ -59,7 +59,7 @@ int getErrorTotal(){ } - @Scheduled(cron = "*/6 * * * * ?") +// @Scheduled(cron = "*/6 * * * * ?") public void execute() throws Exception { Long start = System.currentTimeMillis(); if(stopTask()){ @@ -68,7 +68,8 @@ public void execute() throws Exception { } Integer dateNumber = StockDateUtil.getCurrentDateNumber(); Criteria cr = new Criteria(); - Criteria c1 = Criteria.where("hrdud").lt(dateNumber-3); //3天更新一把 + //3天更新一把 + Criteria c1 = Criteria.where("hrdud").lt(dateNumber-3); Criteria c2 = Criteria.where("xlsError").is(0); Query query = new Query(cr.andOperator(c1,c2)); query.limit(2); diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/ThsStockInfoTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/ThsStockInfoTask.java index f1f3cfe4..b2bd3ae4 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/ThsStockInfoTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/ThsStockInfoTask.java @@ -36,7 +36,7 @@ public class ThsStockInfoTask { @Autowired private StockHisDividendRepository stockHisDividendRepository; - @Scheduled(cron = "*/6 * * * * ?") +// @Scheduled(cron = "*/6 * * * * ?") public void stockInfoExecute() throws Exception { if (!StockDateUtil.stockOpenTime()) { return; diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/XueQiuStockDyTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/XueQiuStockDyTask.java index 5c399a5e..defd7522 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/XueQiuStockDyTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/XueQiuStockDyTask.java @@ -60,7 +60,7 @@ int getErrorTotal(){ return val; } - @Scheduled(cron = "0 0/1 * * * ?") +// @Scheduled(cron = "0 0/1 * * * ?") public void stockDividendExecute() throws Exception { int day = StockDateUtil.getCurrentWeekDay(); if (day == 6 || day == 0) { From 47e584c3991a6dffa4fcb0c85d115673100abddd Mon Sep 17 00:00:00 2001 From: kingschan Date: Fri, 13 Jul 2018 16:51:00 +0800 Subject: [PATCH 29/32] =?UTF-8?q?=E5=8A=A8=E6=80=81=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=AE=A1=E7=90=86demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/util/quartz/SchedulerConfig.java | 25 ++++++++++++++ .../common/util/quartz/SpringJobFactory.java | 32 +++++++++++++++++ .../module/startup/InitQuartzTaskRunner.java | 34 +++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 src/main/java/io.github.kingschan1204.istock/common/util/quartz/SchedulerConfig.java create mode 100644 src/main/java/io.github.kingschan1204.istock/common/util/quartz/SpringJobFactory.java create mode 100644 src/main/java/io.github.kingschan1204.istock/module/startup/InitQuartzTaskRunner.java diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/quartz/SchedulerConfig.java b/src/main/java/io.github.kingschan1204.istock/common/util/quartz/SchedulerConfig.java new file mode 100644 index 00000000..8bf1288a --- /dev/null +++ b/src/main/java/io.github.kingschan1204.istock/common/util/quartz/SchedulerConfig.java @@ -0,0 +1,25 @@ +package io.github.kingschan1204.istock.common.util.quartz; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +/** + * + * @author chenguoxiang + * @create 2018-07-13 15:42 + **/ +@Configuration +public class SchedulerConfig { + @Autowired + private SpringJobFactory springJobFactory; + + @Bean + public SchedulerFactoryBean schedulerFactoryBean() { + SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); + schedulerFactoryBean.setJobFactory(springJobFactory); + return schedulerFactoryBean; + } + +} \ No newline at end of file diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/quartz/SpringJobFactory.java b/src/main/java/io.github.kingschan1204.istock/common/util/quartz/SpringJobFactory.java new file mode 100644 index 00000000..4d033bd7 --- /dev/null +++ b/src/main/java/io.github.kingschan1204.istock/common/util/quartz/SpringJobFactory.java @@ -0,0 +1,32 @@ +package io.github.kingschan1204.istock.common.util.quartz; + +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.scheduling.quartz.SpringBeanJobFactory; +import org.springframework.stereotype.Component; + +/** + * + * @author chenguoxiang + * @create 2018-07-13 15:40 + **/ +@Component +public class SpringJobFactory extends SpringBeanJobFactory implements + ApplicationContextAware { + private transient AutowireCapableBeanFactory beanFactory; + @Override + public void setApplicationContext(final ApplicationContext context) { + beanFactory = context.getAutowireCapableBeanFactory(); + } + @Override + protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception { + final Object job = super.createJobInstance(bundle); + beanFactory.autowireBean(job); + return job; + } + + +} + diff --git a/src/main/java/io.github.kingschan1204.istock/module/startup/InitQuartzTaskRunner.java b/src/main/java/io.github.kingschan1204.istock/module/startup/InitQuartzTaskRunner.java new file mode 100644 index 00000000..74779764 --- /dev/null +++ b/src/main/java/io.github.kingschan1204.istock/module/startup/InitQuartzTaskRunner.java @@ -0,0 +1,34 @@ +package io.github.kingschan1204.istock.module.startup; + +import io.github.kingschan1204.istock.common.util.quartz.QuartzManager; +import io.github.kingschan1204.istock.module.task.StockDividendTask; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.core.Ordered; + +/** + * + * @author chenguoxiang + * @create 2018-07-13 15:12 + **/ +public class InitQuartzTaskRunner implements ApplicationRunner, Ordered { + + @Autowired + private QuartzManager quartzManager; + + @Override + public void run(ApplicationArguments applicationArguments) throws Exception { + quartzManager.addJob("dyTask", + "dyTask-group", + "dyTask-trigger", + "dyTask-trigger-group", + StockDividendTask.class, + "*/6 * * * * ?"); + } + + @Override + public int getOrder() { + return 1; + } +} From db057f2f1c1d0a154c4fbf457aa1622c1bdbf22c Mon Sep 17 00:00:00 2001 From: kingschan Date: Mon, 6 Aug 2018 17:40:32 +0800 Subject: [PATCH 30/32] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=94=B9=E7=94=A8quartz=20=E5=90=8E=E7=BB=AD=E6=83=B3=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/startup/InitQuartzTaskRunner.java | 46 +++++++- .../module/task/SinaStockPriceTask.java | 16 ++- .../module/task/StockCodeTask.java | 19 +++- .../module/task/StockDividendTask.java | 105 +++++++++--------- .../module/task/ThsHisYearReportTask.java | 12 +- .../module/task/ThsStockInfoTask.java | 13 ++- .../module/task/XueQiuStockDyTask.java | 52 +++++---- 7 files changed, 167 insertions(+), 96 deletions(-) diff --git a/src/main/java/io.github.kingschan1204.istock/module/startup/InitQuartzTaskRunner.java b/src/main/java/io.github.kingschan1204.istock/module/startup/InitQuartzTaskRunner.java index 74779764..0180195b 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/startup/InitQuartzTaskRunner.java +++ b/src/main/java/io.github.kingschan1204.istock/module/startup/InitQuartzTaskRunner.java @@ -1,7 +1,7 @@ package io.github.kingschan1204.istock.module.startup; import io.github.kingschan1204.istock.common.util.quartz.QuartzManager; -import io.github.kingschan1204.istock.module.task.StockDividendTask; +import io.github.kingschan1204.istock.module.task.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; @@ -19,12 +19,48 @@ public class InitQuartzTaskRunner implements ApplicationRunner, Ordered { @Override public void run(ApplicationArguments applicationArguments) throws Exception { - quartzManager.addJob("dyTask", - "dyTask-group", - "dyTask-trigger", - "dyTask-trigger-group", + quartzManager.addJob("sinaPriceTask", + "sinaPriceTask-group", + "sinaPriceTask-trigger", + "sinaPriceTask-trigger-group", + SinaStockPriceTask.class, + "0 0/2 * * * ?"); + + quartzManager.addJob("stockCodeTask", + "stockCodeTask-group", + "stockCodeTask-trigger", + "stockCodeTask-trigger-group", + StockCodeTask.class, + "0 0 0 * * ?"); + + quartzManager.addJob("stockDividendTask", + "stockDividendTask-group", + "stockDividendTask-trigger", + "stockDividendTask-trigger-group", StockDividendTask.class, "*/6 * * * * ?"); + + + quartzManager.addJob("hisRepoartTask", + "hisRepoartTask-group", + "hisRepoartTask-trigger", + "hisRepoartTask-trigger-group", + ThsHisYearReportTask.class, + "*/6 * * * * ?"); + + quartzManager.addJob("stockInfoTask", + "stockInfoTask-group", + "stockInfoTask-trigger", + "stockInfoTask-trigger-group", + ThsStockInfoTask.class, + "*/6 * * * * ?"); + + quartzManager.addJob("xueqiuDyTask", + "xueqiuDyTask-group", + "xueqiuDyTask-trigger", + "xueqiuDyTask-trigger-group", + XueQiuStockDyTask.class, + "0 0/1 * * * ?"); } @Override diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/SinaStockPriceTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/SinaStockPriceTask.java index 057f0a76..239663c7 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/SinaStockPriceTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/SinaStockPriceTask.java @@ -7,6 +7,9 @@ import io.github.kingschan1204.istock.module.maindata.po.Stock; import io.github.kingschan1204.istock.module.maindata.po.StockCode; import io.github.kingschan1204.istock.module.maindata.services.StockCodeService; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -27,7 +30,7 @@ * @create 2018-03-29 14:50 **/ @Component -public class SinaStockPriceTask { +public class SinaStockPriceTask implements Job { private Logger log = LoggerFactory.getLogger(SinaStockPriceTask.class); @@ -39,7 +42,11 @@ public class SinaStockPriceTask { private StockCodeService stockCodeService; // @Scheduled(cron = "0 0/2 * * * ?") - public void stockPriceExecute() throws Exception { + /* public void stockPriceExecute() throws Exception { + }*/ + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { if (!StockDateUtil.stockOpenTime()) { return; } @@ -61,11 +68,8 @@ public void stockPriceExecute() throws Exception { } } - - } - public void updateStockPrice(List codes) throws Exception { JSONArray jsons = spider.getStockPrice(codes.toArray(new String[]{})); List stocks = JSON.parseArray(jsons.toJSONString(), Stock.class); @@ -86,4 +90,6 @@ public void updateStockPrice(List codes) throws Exception { ); }); } + + } diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/StockCodeTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/StockCodeTask.java index 1be93b31..ee5d94e2 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/StockCodeTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/StockCodeTask.java @@ -2,6 +2,9 @@ import io.github.kingschan1204.istock.common.util.stock.StockSpider; import io.github.kingschan1204.istock.module.maindata.services.StockCodeService; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -13,7 +16,7 @@ * */ @Component -public class StockCodeTask { +public class StockCodeTask implements Job{ private Logger log = LoggerFactory.getLogger(StockCodeTask.class); @@ -24,10 +27,20 @@ public class StockCodeTask { @Autowired private StockCodeService stockCodeService; -// @Scheduled(cron = "0 0 0 * * ?") +/*// @Scheduled(cron = "0 0 0 * * ?") public void stockCodeExecute()throws Exception{ + + }*/ + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { Long start =System.currentTimeMillis(); - stockCodeService.saveAllStockCode(); + try { + stockCodeService.saveAllStockCode(); + } catch (Exception e) { + log.error("代码更新错误:{}",e); + e.printStackTrace(); + } log.info(String.format("更新代码共耗时:%s ms",(System.currentTimeMillis()-start))); } } diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java index 2075cb6e..f155a6cf 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/StockDividendTask.java @@ -45,56 +45,10 @@ public class StockDividendTask implements Job { private StockHisDividendRepository stockHisDividendRepository; // @Scheduled(cron = "*/6 * * * * ?") - public void stockDividendExecute() throws Exception { - Integer dateNumber = StockDateUtil.getCurrentDateNumber()-3; - Criteria cr = new Criteria(); - Criteria c1 = Criteria.where("dividendUpdateDay").lt(dateNumber);//小于 (3天更新一遍) - Criteria c2 = Criteria.where("dividendUpdateDay").exists(false); - Query query = new Query(cr.orOperator(c1, c2)); - query.limit(3); - List list = template.find(query, Stock.class); - for (Stock stock:list) { - Long start =System.currentTimeMillis();//记录开始时间 - int affected=0;//分红更新记录条数 - JSONArray dividends=new JSONArray(); - String date=""; - Double percent=0D; - try { - dividends=combineHisDy(stock.getCode()); - if(null!=dividends&÷nds.size()>0){ - for (int j = 0; j < dividends.size(); j++) { - double tempPercent=dividends.getJSONObject(j).getDouble("percent"); - String tempDate=dividends.getJSONObject(j).getString("cxcqr"); - if(tempPercent>=0&&!"-".equals(tempDate)){ - percent=tempPercent; - date=tempDate; - break; - } - } - //save dividend - List stockDividendList = JSONArray.parseArray(dividends.toJSONString(),StockDividend.class); - template.remove(new Query(Criteria.where("code").is(stock.getCode())),StockDividend.class); - stockHisDividendRepository.save(stockDividendList); - affected=stockDividendList.size(); - } - } catch (Exception e) { - log.error("error:{}",e); - e.printStackTrace(); - } - WriteResult wr =template.upsert( - new Query(Criteria.where("_id").is(stock.getCode())), - new Update() - .set("_id", stock.getCode()) - .set("dividendDate", date) - .set("dividend", percent) - .set("dividendUpdateDay", dateNumber), - "stock" - ); - affected+=wr.getN(); - log.info("{}分红抓取,耗时{},获得{}行数据",stock.getCode(),(System.currentTimeMillis()-start),affected); - } + /* public void stockDividendExecute() throws Exception { - } + + }*/ /** * 同花顺和东方财富的并集 @@ -125,10 +79,53 @@ public JSONArray combineHisDy(String code)throws Exception{ @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { - try { - stockDividendExecute(); - } catch (Exception e) { - e.printStackTrace(); - } + Integer dateNumber = StockDateUtil.getCurrentDateNumber()-3; + Criteria cr = new Criteria(); + Criteria c1 = Criteria.where("dividendUpdateDay").lt(dateNumber);//小于 (3天更新一遍) + Criteria c2 = Criteria.where("dividendUpdateDay").exists(false); + Query query = new Query(cr.orOperator(c1, c2)); + query.limit(3); + List list = template.find(query, Stock.class); + for (Stock stock:list) { + Long start =System.currentTimeMillis();//记录开始时间 + int affected=0;//分红更新记录条数 + JSONArray dividends=new JSONArray(); + String date=""; + Double percent=0D; + try { + dividends=combineHisDy(stock.getCode()); + if(null!=dividends&÷nds.size()>0){ + for (int j = 0; j < dividends.size(); j++) { + double tempPercent=dividends.getJSONObject(j).getDouble("percent"); + String tempDate=dividends.getJSONObject(j).getString("cxcqr"); + if(tempPercent>=0&&!"-".equals(tempDate)){ + percent=tempPercent; + date=tempDate; + break; + } + } + //save dividend + List stockDividendList = JSONArray.parseArray(dividends.toJSONString(),StockDividend.class); + template.remove(new Query(Criteria.where("code").is(stock.getCode())),StockDividend.class); + stockHisDividendRepository.save(stockDividendList); + affected=stockDividendList.size(); + } + } catch (Exception e) { + log.error("error:{}",e); + e.printStackTrace(); + } + WriteResult wr =template.upsert( + new Query(Criteria.where("_id").is(stock.getCode())), + new Update() + .set("_id", stock.getCode()) + .set("dividendDate", date) + .set("dividend", percent) + .set("dividendUpdateDay", dateNumber), + "stock" + ); + affected+=wr.getN(); + log.info("{}分红抓取,耗时{},获得{}行数据",stock.getCode(),(System.currentTimeMillis()-start),affected); + } + } } diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java index b47a7475..393bd131 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/ThsHisYearReportTask.java @@ -8,6 +8,9 @@ import io.github.kingschan1204.istock.module.maindata.po.StockCode; import io.github.kingschan1204.istock.module.maindata.po.StockHisRoe; import io.github.kingschan1204.istock.module.maindata.repository.StockHisRoeRepository; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -27,7 +30,7 @@ * @create 2018-07-09 17:28 **/ @Component -public class ThsHisYearReportTask { +public class ThsHisYearReportTask implements Job{ private Logger log = LoggerFactory.getLogger(ThsHisYearReportTask.class); @Autowired @@ -60,7 +63,11 @@ int getErrorTotal(){ // @Scheduled(cron = "*/6 * * * * ?") - public void execute() throws Exception { + /* public void execute() throws Exception { + }*/ + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { Long start = System.currentTimeMillis(); if(stopTask()){ log.info("错误次数过多,不执行任务!"); @@ -102,6 +109,5 @@ public void execute() throws Exception { }); log.info(String.format("download xls and update data use :%s ms ", (System.currentTimeMillis() - start))); //end - } } diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/ThsStockInfoTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/ThsStockInfoTask.java index b2bd3ae4..eb96ca37 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/ThsStockInfoTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/ThsStockInfoTask.java @@ -6,6 +6,9 @@ import io.github.kingschan1204.istock.common.util.stock.StockSpider; import io.github.kingschan1204.istock.module.maindata.po.Stock; import io.github.kingschan1204.istock.module.maindata.repository.StockHisDividendRepository; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -25,7 +28,7 @@ * @create 2018-03-29 14:50 **/ @Component -public class ThsStockInfoTask { +public class ThsStockInfoTask implements Job{ private Logger log = LoggerFactory.getLogger(ThsStockInfoTask.class); @@ -37,7 +40,12 @@ public class ThsStockInfoTask { private StockHisDividendRepository stockHisDividendRepository; // @Scheduled(cron = "*/6 * * * * ?") - public void stockInfoExecute() throws Exception { + /*public void stockInfoExecute() throws Exception { + + }*/ + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { if (!StockDateUtil.stockOpenTime()) { return; } @@ -84,5 +92,4 @@ public void stockInfoExecute() throws Exception { } log.info(String.format("craw stock info and update data use :%s ms ,affected rows : %s", (System.currentTimeMillis() - start),affected)); } - } diff --git a/src/main/java/io.github.kingschan1204.istock/module/task/XueQiuStockDyTask.java b/src/main/java/io.github.kingschan1204.istock/module/task/XueQiuStockDyTask.java index defd7522..a1997b6a 100644 --- a/src/main/java/io.github.kingschan1204.istock/module/task/XueQiuStockDyTask.java +++ b/src/main/java/io.github.kingschan1204.istock/module/task/XueQiuStockDyTask.java @@ -9,6 +9,9 @@ import io.github.kingschan1204.istock.module.maindata.po.Stock; import io.github.kingschan1204.istock.module.maindata.po.StockDyQueue; import io.github.kingschan1204.istock.module.maindata.repository.StockDyQueueRepository; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -28,7 +31,7 @@ * @create 2018-03-29 14:50 **/ @Component -public class XueQiuStockDyTask { +public class XueQiuStockDyTask implements Job{ private Logger log = LoggerFactory.getLogger(XueQiuStockDyTask.class); @@ -61,14 +64,37 @@ int getErrorTotal(){ } // @Scheduled(cron = "0 0/1 * * * ?") - public void stockDividendExecute() throws Exception { + /* public void stockDividendExecute() throws Exception { + }*/ + + public void uptateDy(JSONObject data) { + int affected = 0;//受影响行 + Integer dateNumber = StockDateUtil.getCurrentDateNumber(); + JSONArray rows = data.getJSONArray("list"); + List list = rows.toJavaList(Stock.class); + for (Stock stock : list) { + WriteResult wr = template.updateFirst( + new Query(Criteria.where("_id").is(stock.getCode())), + new Update() + .set("dy", stock.getDy()) + .set("dyDate", dateNumber), + "stock" + ); + affected += wr.getN(); + } + log.info("dy 批处理:共{}条,本次更新{}条", list.size(), affected); + + } + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { int day = StockDateUtil.getCurrentWeekDay(); if (day == 6 || day == 0) { log.debug("非交易时间不执行操作..."); return; } if(stopTask()){ - log.info("错误次数过多,不执行任务!"); + log.error("错误次数过多,不执行任务!"); return; } Long start = System.currentTimeMillis(); @@ -101,25 +127,5 @@ public void stockDividendExecute() throws Exception { log.error("dy 出错了:{}", ex); ex.printStackTrace(); } - - } - - public void uptateDy(JSONObject data) { - int affected = 0;//受影响行 - Integer dateNumber = StockDateUtil.getCurrentDateNumber(); - JSONArray rows = data.getJSONArray("list"); - List list = rows.toJavaList(Stock.class); - for (Stock stock : list) { - WriteResult wr = template.updateFirst( - new Query(Criteria.where("_id").is(stock.getCode())), - new Update() - .set("dy", stock.getDy()) - .set("dyDate", dateNumber), - "stock" - ); - affected += wr.getN(); - } - log.info("dy 批处理:共{}条,本次更新{}条", list.size(), affected); - } } From 689a77e563ef2cff48ed65070decb67c9b07ca35 Mon Sep 17 00:00:00 2001 From: kingschan Date: Tue, 7 Aug 2018 15:32:46 +0800 Subject: [PATCH 31/32] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=97=A5=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/util/stock/StockSpider.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockSpider.java b/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockSpider.java index ee0f0566..85e6067e 100644 --- a/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockSpider.java +++ b/src/main/java/io.github.kingschan1204.istock/common/util/stock/StockSpider.java @@ -1,12 +1,14 @@ package io.github.kingschan1204.istock.common.util.stock; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; - +import org.jsoup.Jsoup; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; +import java.io.IOException; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; @@ -75,6 +77,20 @@ static String findStrByRegx(String text, String regx) { } + /** + * 是否工作日 + * @param date + * @return + */ + static boolean isWorkDay(String date) throws IOException { + String api =String.format("http://api.goseek.cn/Tools/holiday?date=%s",date); + String result = Jsoup.connect(api).timeout(3000).ignoreContentType(true).get().text(); + //{"code":10001,"data":2} 工作日对应结果为 0, 休息日对应结果为 1, 节假日对应的结果为 2 + JSONObject json = JSON.parseObject(result); + return json.getIntValue("data")==0; + } + + /** * 提取文本中匹配正则的字符串 * @@ -211,4 +227,5 @@ public void checkServerTrusted(X509Certificate[] certs, String authType) { */ List getStockCodeBySZ() throws Exception; + } From 145c1f14d3e2a313e9235796fb6dd003e4df9f2f Mon Sep 17 00:00:00 2001 From: kingschan Date: Tue, 7 Aug 2018 15:55:51 +0800 Subject: [PATCH 32/32] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=85=A8=E9=83=A8?= =?UTF-8?q?=E6=9A=82=E5=81=9C=E3=80=81=E6=81=A2=E5=A4=8D=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/util/quartz/QuartzManager.java | 47 ++++++++++++++----- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/src/main/java/io.github.kingschan1204.istock/common/util/quartz/QuartzManager.java b/src/main/java/io.github.kingschan1204.istock/common/util/quartz/QuartzManager.java index 62f3e1f5..967b6588 100644 --- a/src/main/java/io.github.kingschan1204.istock/common/util/quartz/QuartzManager.java +++ b/src/main/java/io.github.kingschan1204.istock/common/util/quartz/QuartzManager.java @@ -9,6 +9,7 @@ /** * quartz 任务管理工具类 + * * @author chenguoxiang * @create 2018-07-13 14:46 **/ @@ -27,8 +28,8 @@ public class QuartzManager { * @param cron 时间设置,参考quartz说明文档 * @Description: 添加一个定时任务 */ - public void addJob(String jobName, String jobGroupName, - String triggerName, String triggerGroupName, Class jobClass, String cron) { + public void addJob(String jobName, String jobGroupName, + String triggerName, String triggerGroupName, Class jobClass, String cron) { try { Scheduler sched = schedulerFactoryBean.getScheduler();//schedulerFactory.getScheduler(); @@ -47,7 +48,7 @@ public void addJob(String jobName, String jobGroupName, sched.scheduleJob(jobDetail, trigger); // 启动 if (!sched.isShutdown()) { - log.info("添加定时任务{} , class:{} 执行频率:{}",jobName,jobClass.getName(),cron); + log.info("添加定时任务{} , class:{} 执行频率:{}", jobName, jobClass.getName(), cron); sched.start(); } } catch (Exception e) { @@ -57,6 +58,7 @@ public void addJob(String jobName, String jobGroupName, /** * 修改一个任务的触发时间 + * * @param jobName * @param jobGroupName * @param triggerName 触发器名 @@ -64,8 +66,8 @@ public void addJob(String jobName, String jobGroupName, * @param cron 时间设置,参考quartz说明文档 * @Description: 修改一个任务的触发时间 */ - public void modifyJobTime(String jobName, - String jobGroupName, String triggerName, String triggerGroupName, String cron) { + public void modifyJobTime(String jobName, + String jobGroupName, String triggerName, String triggerGroupName, String cron) { try { Scheduler sched = schedulerFactoryBean.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); @@ -88,7 +90,7 @@ public void modifyJobTime(String jobName, trigger = (CronTrigger) triggerBuilder.build(); // 方式一 :修改一个任务的触发时间 sched.rescheduleJob(triggerKey, trigger); - log.info("添加定时任务{} , 执行频率:{}",jobName,cron); + log.info("添加定时任务{} , 执行频率:{}", jobName, cron); } } catch (Exception e) { throw new RuntimeException(e); @@ -97,14 +99,15 @@ public void modifyJobTime(String jobName, /** * 删除一个job + * * @param jobName * @param jobGroupName * @param triggerName * @param triggerGroupName * @Description: 移除一个任务 */ - public void removeJob(String jobName, String jobGroupName, - String triggerName, String triggerGroupName) { + public void removeJob(String jobName, String jobGroupName, + String triggerName, String triggerGroupName) { try { Scheduler sched = schedulerFactoryBean.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); @@ -114,16 +117,17 @@ public void removeJob(String jobName, String jobGroupName, sched.unscheduleJob(triggerKey); // 删除任务 sched.deleteJob(JobKey.jobKey(jobName, jobGroupName)); - log.info("添加定时任务{}",jobName); + log.info("删除定时任务{}", jobName); } catch (Exception e) { throw new RuntimeException(e); } } + /** * @Description:启动所有定时任务 */ - public void startJobs() { + public void startJobs() { try { Scheduler sched = schedulerFactoryBean.getScheduler(); sched.start(); @@ -136,7 +140,7 @@ public void startJobs() { /** * @Description:关闭所有定时任务 */ - public void shutdownJobs() { + public void shutdownJobs() { try { Scheduler sched = schedulerFactoryBean.getScheduler(); if (!sched.isShutdown()) { @@ -147,4 +151,25 @@ public void shutdownJobs() { throw new RuntimeException(e); } } + + /** + * 暂停全部任务 + * + * @throws SchedulerException + */ + public void pauseAll() throws Exception { + schedulerFactoryBean.getScheduler().pauseAll(); + log.info("暂停所有任务"); + } + + + /** + * 恢复所有任务 + * + * @throws Exception + */ + public void resumeAll() throws Exception { + schedulerFactoryBean.getScheduler().resumeAll(); + log.info("恢复所有任务"); + } }