CreatorServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. package com.zx.dataservice.service.impl;
  2. import com.zx.dataservice.mapper2.StockMapper;
  3. import com.zx.dataservice.mapper3.CreatorMapper;
  4. import com.zx.dataservice.pojo.HistoryPojo;
  5. import com.zx.dataservice.pojo.StockHistPojo;
  6. import com.zx.dataservice.pojo.StockPojo;
  7. import com.zx.dataservice.pojo.StockRestPojo;
  8. import com.zx.dataservice.service.CreatorService;
  9. import com.zx.dataservice.utils.TimeUtil;
  10. import org.apache.commons.lang3.StringUtils;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Service;
  13. import java.math.BigDecimal;
  14. import java.text.ParseException;
  15. import java.text.SimpleDateFormat;
  16. import java.util.Calendar;
  17. import java.util.Date;
  18. @Service
  19. public class CreatorServiceImpl implements CreatorService {
  20. @Autowired
  21. private CreatorMapper creatorMapper;
  22. @Autowired
  23. private StockMapper stockMapper;
  24. private static String initNow = null;
  25. @Override
  26. public void creatorUvxy() {
  27. // 1.先去临时表查找第一条数据
  28. String tableName = "data_hist_869735_sh_temp";
  29. String code = "869735.SH";
  30. String gid = "sh869735";
  31. Integer stockCount = stockMapper.selectStockByStockCode(code);
  32. if(0 == stockCount || null == stockCount){
  33. StockPojo stockPojo = new StockPojo();
  34. stockPojo.setStockName("华融发债");
  35. stockPojo.setStockCode(code);
  36. stockPojo.setStockSpell("hrfz");
  37. stockPojo.setStockType("sh");
  38. stockPojo.setStockGid(gid);
  39. stockPojo.setStockPlate("普通");
  40. stockPojo.setIsLock(0);
  41. stockPojo.setIsShow(0);
  42. stockPojo.setBuyLimit(1);
  43. stockPojo.setStockOrBond(1);
  44. stockMapper.insertStock(stockPojo);
  45. }
  46. HistoryPojo historyPojo = creatorMapper.selectHistory(tableName);
  47. // 2.第一次的数据不用实际数据 设置初始值为100
  48. toCreatorUvxy(historyPojo);
  49. }
  50. @Override
  51. public void creatorUvxyHist() {
  52. // 1.首先删除掉temp表中的第一条
  53. String histTempTableName = "data_hist_869735_sh_temp";
  54. HistoryPojo historyPojo = creatorMapper.selectHistory(histTempTableName);
  55. creatorMapper.deleteHistoryTemp(histTempTableName);
  56. // 2.用实时表中的数据构造一条历史记录
  57. String restTableName = "data_rt_869735_sh";
  58. StockRestPojo stockRestPojo = creatorMapper.selectRtAll(restTableName);
  59. StockHistPojo stockHistPojo = new StockHistPojo();
  60. stockHistPojo.setOpen(stockRestPojo.getOpen());
  61. stockHistPojo.setClose(stockRestPojo.getOpen());
  62. stockHistPojo.setHigh(stockRestPojo.getHigh());
  63. stockHistPojo.setLow(stockRestPojo.getLow());
  64. stockHistPojo.setAverage("0");
  65. stockHistPojo.setVolume(stockRestPojo.getVolume());
  66. stockHistPojo.setHighlimit("0");
  67. stockHistPojo.setAmount("0");
  68. stockHistPojo.setTnum("0");
  69. stockHistPojo.setTradestatus("0");
  70. stockHistPojo.setLowlimit("0");
  71. stockHistPojo.setAmplitude("0");
  72. stockHistPojo.setTnum("0");
  73. stockHistPojo.setTafactor("0");
  74. stockHistPojo.setFronttafactor("0");
  75. stockHistPojo.setIsststock("0");
  76. stockHistPojo.setIsxststock("0");
  77. stockHistPojo.setPreclose(stockRestPojo.getClose());
  78. stockHistPojo.setChange(String.valueOf(new BigDecimal(stockRestPojo.getClose()).subtract(new BigDecimal(stockRestPojo.getPreclose())).setScale(2, BigDecimal.ROUND_HALF_UP)));
  79. stockHistPojo.setPctchange(String.valueOf(historyPojo.getPctChange()));
  80. try {
  81. SimpleDateFormat formatter = new SimpleDateFormat("yyyy");
  82. Date date = new Date(stockRestPojo.getDate());
  83. String dateStr = formatter.format(date);
  84. date = formatter.parse(dateStr);
  85. String yearDatTime = String.valueOf(date.getTime());
  86. formatter = new SimpleDateFormat("yyyyMM");
  87. date = new Date(stockRestPojo.getDate());
  88. dateStr = formatter.format(date);
  89. date = formatter.parse(dateStr);
  90. String monthDatTime = String.valueOf(date.getTime());
  91. Calendar cld = Calendar.getInstance();
  92. cld.setTime(new Date(stockRestPojo.getDate()));
  93. int firstDay = cld.get(Calendar.DAY_OF_WEEK);
  94. cld.add(Calendar.DATE, -firstDay);
  95. String weekDatTime = String.valueOf(cld.getTime().getTime());
  96. formatter = new SimpleDateFormat("yyyyMMdd");
  97. date = new Date(stockRestPojo.getDate());
  98. dateStr = formatter.format(date);
  99. date = formatter.parse(dateStr);
  100. String dayDatTime = String.valueOf(date.getTime());
  101. stockHistPojo.setDateYear(yearDatTime);
  102. stockHistPojo.setDateMonth(monthDatTime);
  103. stockHistPojo.setDateWeek(weekDatTime);
  104. stockHistPojo.setDateDay(dayDatTime);
  105. stockHistPojo.setRealTime(dayDatTime);
  106. } catch (ParseException e) {
  107. e.printStackTrace();
  108. }
  109. String histTableName = "data_hist_869735_sh";
  110. creatorMapper.insertHistory(stockHistPojo, histTableName);
  111. }
  112. private void toCreatorUvxy(HistoryPojo historyPojo){
  113. String code = "869735.SH";
  114. String tableName = "data_rt_869735_sh";
  115. Date d = new Date();
  116. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  117. SimpleDateFormat sdf1 = new SimpleDateFormat("HHmmss");
  118. String dateNowStr = sdf.format(d);
  119. String dateNowStr1 = sdf1.format(d);
  120. StockRestPojo entry;
  121. String now ;
  122. StockRestPojo stockRestPojo = new StockRestPojo();
  123. stockRestPojo.setDate(dateNowStr);
  124. stockRestPojo.setTime(dateNowStr1);
  125. entry = creatorMapper.selectRtLimitOne(tableName);
  126. if(null == entry){
  127. initNow = "100";
  128. now = "100";
  129. entry = new StockRestPojo();
  130. entry.setCode(code);
  131. entry.setNow(now);
  132. entry.setHigh(now);
  133. entry.setLow(now);
  134. entry.setOpen(now);
  135. entry.setPreclose(now);
  136. entry.setRoundlot("0");
  137. entry.setChange("0");
  138. entry.setPctchange("0");
  139. entry.setVolume("0");
  140. entry.setAmount("0");
  141. entry.setBuyprice1(now);
  142. entry.setBuyprice2(now);
  143. entry.setBuyprice3(now);
  144. entry.setBuyprice4(now);
  145. entry.setBuyprice5(now);
  146. entry.setBuyvolume1("0");
  147. entry.setBuyvolume2("0");
  148. entry.setBuyvolume3("0");
  149. entry.setBuyvolume4("0");
  150. entry.setBuyvolume5("0");
  151. entry.setSellprice1(now);
  152. entry.setSellprice2(now);
  153. entry.setSellprice3(now);
  154. entry.setSellprice4(now);
  155. entry.setSellprice5(now);
  156. entry.setSellvolume1("0");
  157. entry.setSellvolume2("0");
  158. entry.setSellvolume3("0");
  159. entry.setSellvolume4("0");
  160. entry.setSellvolume5("0");
  161. stockRestPojo.setNow(now);
  162. }else{
  163. now = entry.getNow();
  164. if(null == initNow){
  165. initNow = entry.getPreclose();
  166. }
  167. // 如果当前时间等于15点整, 则入库价格就是今天的昨收
  168. String timeStr = "14:59";
  169. Date time = new Date();
  170. SimpleDateFormat f = new SimpleDateFormat("HH:mm");
  171. if(f.format(time).equals(timeStr)){
  172. stockRestPojo.setNow(String.valueOf(Double.valueOf(initNow) + historyPojo.getPctChange()));
  173. }else{
  174. stockRestPojo.setNow(String.valueOf(random(historyPojo, initNow, now)));
  175. }
  176. //设置最高
  177. if(Double.valueOf(stockRestPojo.getNow()) > Double.valueOf(entry.getHigh())){
  178. stockRestPojo.setHigh(stockRestPojo.getNow());
  179. }else{
  180. stockRestPojo.setHigh(entry.getHigh());
  181. }
  182. //设置最低
  183. if(Double.valueOf(stockRestPojo.getNow()) < Double.valueOf(entry.getLow())){
  184. stockRestPojo.setLow(stockRestPojo.getNow());
  185. }else{
  186. stockRestPojo.setLow(entry.getLow());
  187. }
  188. stockRestPojo.setOpen(entry.getOpen());
  189. /*System.out.println("最高:"+stockRestPojo.getHigh());
  190. System.out.println("最低:"+stockRestPojo.getLow());*/
  191. }
  192. stockRestPojo.setHigh(stockRestPojo.getHigh());
  193. stockRestPojo.setLow(stockRestPojo.getLow());
  194. stockRestPojo.setOpen(stockRestPojo.getOpen());
  195. stockRestPojo.setPreclose(initNow);
  196. stockRestPojo.setRoundlot(String.valueOf(new BigDecimal(entry.getRoundlot()).add(random(historyPojo, initNow, now))));
  197. stockRestPojo.setChange(String.valueOf(new BigDecimal(stockRestPojo.getNow()).subtract(new BigDecimal(initNow))));
  198. stockRestPojo.setPctchange(String.valueOf((new BigDecimal(stockRestPojo.getNow()).subtract(new BigDecimal(initNow))).divide(new BigDecimal(initNow),2 ,4)));
  199. stockRestPojo.setVolume(String.valueOf(new BigDecimal(entry.getVolume()).add(new BigDecimal(randomInt()))));
  200. stockRestPojo.setAmount(String.valueOf(new BigDecimal(entry.getNow()).multiply(new BigDecimal(stockRestPojo.getVolume()))));
  201. stockRestPojo.setVolumeratio("");
  202. stockRestPojo.setCommissionratio("");
  203. stockRestPojo.setCommissiondiff("");
  204. stockRestPojo.setTradestatus("");
  205. stockRestPojo.setOutvolume("");
  206. stockRestPojo.setInvolume("");
  207. stockRestPojo.setHighlimit("");
  208. stockRestPojo.setLowlimit("");
  209. stockRestPojo.setSpeed("");
  210. stockRestPojo.setAverageprice("");
  211. stockRestPojo.setBuyprice1(randomBuySell(stockRestPojo.getNow(),0));
  212. stockRestPojo.setBuyprice2(randomBuySell(stockRestPojo.getBuyprice1(),0));
  213. stockRestPojo.setBuyprice3(randomBuySell(stockRestPojo.getBuyprice2(),0));
  214. stockRestPojo.setBuyprice4(randomBuySell(stockRestPojo.getBuyprice3(),0));
  215. stockRestPojo.setBuyprice5(randomBuySell(stockRestPojo.getBuyprice4(),0));
  216. stockRestPojo.setBuyvolume1(String.valueOf(new BigDecimal(randomInt())));
  217. stockRestPojo.setBuyvolume2(String.valueOf(new BigDecimal(randomInt())));
  218. stockRestPojo.setBuyvolume3(String.valueOf(new BigDecimal(randomInt())));
  219. stockRestPojo.setBuyvolume4(String.valueOf(new BigDecimal(randomInt())));
  220. stockRestPojo.setBuyvolume5(String.valueOf(new BigDecimal(randomInt())));
  221. stockRestPojo.setSellprice1(randomBuySell(stockRestPojo.getNow(),1));
  222. stockRestPojo.setSellprice2(randomBuySell(stockRestPojo.getSellprice1(),0));
  223. stockRestPojo.setSellprice3(randomBuySell(stockRestPojo.getSellprice2(),0));
  224. stockRestPojo.setSellprice4(randomBuySell(stockRestPojo.getSellprice3(),0));
  225. stockRestPojo.setSellprice5(randomBuySell(stockRestPojo.getSellprice4(),0));
  226. stockRestPojo.setSellvolume1(String.valueOf(new BigDecimal(randomInt())));
  227. stockRestPojo.setSellvolume2(String.valueOf(new BigDecimal(randomInt())));
  228. stockRestPojo.setSellvolume3(String.valueOf(new BigDecimal(randomInt())));
  229. stockRestPojo.setSellvolume4(String.valueOf(new BigDecimal(randomInt())));
  230. stockRestPojo.setSellvolume5(String.valueOf(new BigDecimal(randomInt())));
  231. stockRestPojo.setClosedtime("");
  232. stockRestPojo.setClosedvolume("");
  233. stockRestPojo.setClosedamount("");
  234. StringBuffer dateStr = new StringBuffer(stockRestPojo.getDate());
  235. if (StringUtils.isEmpty(stockRestPojo.getTime())) {
  236. dateStr = dateStr.append(000000);
  237. } else {
  238. if (5 == stockRestPojo.getTime().length()) {
  239. // 长度为5表示 小时前面需要补0
  240. dateStr = dateStr.append(0).append(stockRestPojo.getTime());
  241. } else {
  242. dateStr = dateStr.append(stockRestPojo.getTime());
  243. }
  244. }
  245. Date date = TimeUtil.strToDate(dateStr.toString());
  246. // 毫秒转成秒
  247. stockRestPojo.setRealTime(date.getTime() / 1000);
  248. Calendar calendar = Calendar.getInstance();
  249. calendar.setTime(date);
  250. int min = calendar.get(Calendar.MINUTE); // 获取分钟
  251. int sec = calendar.get(Calendar.SECOND); // 获取秒数
  252. // 1分钟数据
  253. if (sec != 0) {
  254. stockRestPojo.setDateOne(stockRestPojo.getRealTime() + 60 - sec);
  255. } else {
  256. stockRestPojo.setDateOne(stockRestPojo.getRealTime());
  257. }
  258. // 5分钟数据
  259. if (sec != 0 || min % 5 != 0) {
  260. stockRestPojo.setDateFive(stockRestPojo.getRealTime() + (5 * 60) - sec - (min % 5 * 60));
  261. } else {
  262. stockRestPojo.setDateFive(stockRestPojo.getRealTime());
  263. }
  264. // 15分钟数据
  265. if (sec != 0 || min % 15 != 0) {
  266. stockRestPojo.setDateFifteen(stockRestPojo.getRealTime() + (15 * 60) - sec - (min % 15 * 60));
  267. } else {
  268. stockRestPojo.setDateFifteen(stockRestPojo.getRealTime());
  269. }
  270. // 30分钟数据
  271. if (sec != 0 || min % 30 != 0) {
  272. stockRestPojo.setDateThirty(stockRestPojo.getRealTime() + (30 * 60) - sec - (min % 30 * 60));
  273. } else {
  274. stockRestPojo.setDateThirty(stockRestPojo.getRealTime());
  275. }
  276. // 60分钟数据
  277. if (sec != 0 || min % 60 != 0) {
  278. stockRestPojo.setDateSixty(stockRestPojo.getRealTime() + (60 * 60) - sec - (min % 60 * 60));
  279. } else {
  280. stockRestPojo.setDateSixty(stockRestPojo.getRealTime());
  281. }
  282. stockRestPojo.setCode(code);
  283. creatorMapper.insertRt(stockRestPojo, tableName);
  284. }
  285. private BigDecimal random(HistoryPojo historyPojo, String initNow, String now){
  286. // 昨收 + 涨跌幅
  287. double max;
  288. double min;
  289. if(historyPojo.getPctChange() > 0) {
  290. max = Double.valueOf(initNow) + historyPojo.getPctChange();
  291. min = Double.valueOf(initNow) - 2;
  292. }else{
  293. max = Double.valueOf(initNow) + 2;
  294. min = Double.valueOf(initNow) - Math.abs(historyPojo.getPctChange());
  295. }
  296. double randomMin = Double.valueOf(now) - 2;
  297. double randomMax = Double.valueOf(now) + 2;
  298. if(randomMin < min){
  299. randomMin = min;
  300. }
  301. if(randomMax > max){
  302. randomMax = max;
  303. }
  304. return new BigDecimal(Math.random() * (randomMax - randomMin) + randomMin).setScale(2, BigDecimal.ROUND_HALF_UP);
  305. }
  306. private String randomBuySell(String now, int type){
  307. // 买
  308. if(0 == type){
  309. return new BigDecimal(now).subtract(new BigDecimal(0.01)).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
  310. }else{
  311. return new BigDecimal(now).add(new BigDecimal(0.01)).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
  312. }
  313. }
  314. private int randomInt(){
  315. int max = 10000;
  316. int min = 5000;
  317. int ran = (int) (Math.random() * (max - min) + min);
  318. return ran;
  319. }
  320. }