package com.zx.dataservice.service.impl; import com.zx.dataservice.mapper2.StockMapper; import com.zx.dataservice.mapper3.CreatorMapper; import com.zx.dataservice.pojo.HistoryPojo; import com.zx.dataservice.pojo.StockHistPojo; import com.zx.dataservice.pojo.StockPojo; import com.zx.dataservice.pojo.StockRestPojo; import com.zx.dataservice.service.CreatorService; import com.zx.dataservice.utils.TimeUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; @Service public class CreatorServiceImpl implements CreatorService { @Autowired private CreatorMapper creatorMapper; @Autowired private StockMapper stockMapper; private static String initNow = null; @Override public void creatorUvxy() { // 1.先去临时表查找第一条数据 String tableName = "data_hist_869735_sh_temp"; String code = "869735.SH"; String gid = "sh869735"; Integer stockCount = stockMapper.selectStockByStockCode(code); if(0 == stockCount || null == stockCount){ StockPojo stockPojo = new StockPojo(); stockPojo.setStockName("华融发债"); stockPojo.setStockCode(code); stockPojo.setStockSpell("hrfz"); stockPojo.setStockType("sh"); stockPojo.setStockGid(gid); stockPojo.setStockPlate("普通"); stockPojo.setIsLock(0); stockPojo.setIsShow(0); stockPojo.setBuyLimit(1); stockPojo.setStockOrBond(1); stockMapper.insertStock(stockPojo); } HistoryPojo historyPojo = creatorMapper.selectHistory(tableName); // 2.第一次的数据不用实际数据 设置初始值为100 toCreatorUvxy(historyPojo); } @Override public void creatorUvxyHist() { // 1.首先删除掉temp表中的第一条 String histTempTableName = "data_hist_869735_sh_temp"; HistoryPojo historyPojo = creatorMapper.selectHistory(histTempTableName); creatorMapper.deleteHistoryTemp(histTempTableName); // 2.用实时表中的数据构造一条历史记录 String restTableName = "data_rt_869735_sh"; StockRestPojo stockRestPojo = creatorMapper.selectRtAll(restTableName); StockHistPojo stockHistPojo = new StockHistPojo(); stockHistPojo.setOpen(stockRestPojo.getOpen()); stockHistPojo.setClose(stockRestPojo.getOpen()); stockHistPojo.setHigh(stockRestPojo.getHigh()); stockHistPojo.setLow(stockRestPojo.getLow()); stockHistPojo.setAverage("0"); stockHistPojo.setVolume(stockRestPojo.getVolume()); stockHistPojo.setHighlimit("0"); stockHistPojo.setAmount("0"); stockHistPojo.setTnum("0"); stockHistPojo.setTradestatus("0"); stockHistPojo.setLowlimit("0"); stockHistPojo.setAmplitude("0"); stockHistPojo.setTnum("0"); stockHistPojo.setTafactor("0"); stockHistPojo.setFronttafactor("0"); stockHistPojo.setIsststock("0"); stockHistPojo.setIsxststock("0"); stockHistPojo.setPreclose(stockRestPojo.getClose()); stockHistPojo.setChange(String.valueOf(new BigDecimal(stockRestPojo.getClose()).subtract(new BigDecimal(stockRestPojo.getPreclose())).setScale(2, BigDecimal.ROUND_HALF_UP))); stockHistPojo.setPctchange(String.valueOf(historyPojo.getPctChange())); try { SimpleDateFormat formatter = new SimpleDateFormat("yyyy"); Date date = new Date(stockRestPojo.getDate()); String dateStr = formatter.format(date); date = formatter.parse(dateStr); String yearDatTime = String.valueOf(date.getTime()); formatter = new SimpleDateFormat("yyyyMM"); date = new Date(stockRestPojo.getDate()); dateStr = formatter.format(date); date = formatter.parse(dateStr); String monthDatTime = String.valueOf(date.getTime()); Calendar cld = Calendar.getInstance(); cld.setTime(new Date(stockRestPojo.getDate())); int firstDay = cld.get(Calendar.DAY_OF_WEEK); cld.add(Calendar.DATE, -firstDay); String weekDatTime = String.valueOf(cld.getTime().getTime()); formatter = new SimpleDateFormat("yyyyMMdd"); date = new Date(stockRestPojo.getDate()); dateStr = formatter.format(date); date = formatter.parse(dateStr); String dayDatTime = String.valueOf(date.getTime()); stockHistPojo.setDateYear(yearDatTime); stockHistPojo.setDateMonth(monthDatTime); stockHistPojo.setDateWeek(weekDatTime); stockHistPojo.setDateDay(dayDatTime); stockHistPojo.setRealTime(dayDatTime); } catch (ParseException e) { e.printStackTrace(); } String histTableName = "data_hist_869735_sh"; creatorMapper.insertHistory(stockHistPojo, histTableName); } private void toCreatorUvxy(HistoryPojo historyPojo){ String code = "869735.SH"; String tableName = "data_rt_869735_sh"; Date d = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); SimpleDateFormat sdf1 = new SimpleDateFormat("HHmmss"); String dateNowStr = sdf.format(d); String dateNowStr1 = sdf1.format(d); StockRestPojo entry; String now ; StockRestPojo stockRestPojo = new StockRestPojo(); stockRestPojo.setDate(dateNowStr); stockRestPojo.setTime(dateNowStr1); entry = creatorMapper.selectRtLimitOne(tableName); if(null == entry){ initNow = "100"; now = "100"; entry = new StockRestPojo(); entry.setCode(code); entry.setNow(now); entry.setHigh(now); entry.setLow(now); entry.setOpen(now); entry.setPreclose(now); entry.setRoundlot("0"); entry.setChange("0"); entry.setPctchange("0"); entry.setVolume("0"); entry.setAmount("0"); entry.setBuyprice1(now); entry.setBuyprice2(now); entry.setBuyprice3(now); entry.setBuyprice4(now); entry.setBuyprice5(now); entry.setBuyvolume1("0"); entry.setBuyvolume2("0"); entry.setBuyvolume3("0"); entry.setBuyvolume4("0"); entry.setBuyvolume5("0"); entry.setSellprice1(now); entry.setSellprice2(now); entry.setSellprice3(now); entry.setSellprice4(now); entry.setSellprice5(now); entry.setSellvolume1("0"); entry.setSellvolume2("0"); entry.setSellvolume3("0"); entry.setSellvolume4("0"); entry.setSellvolume5("0"); stockRestPojo.setNow(now); }else{ now = entry.getNow(); if(null == initNow){ initNow = entry.getPreclose(); } // 如果当前时间等于15点整, 则入库价格就是今天的昨收 String timeStr = "14:59"; Date time = new Date(); SimpleDateFormat f = new SimpleDateFormat("HH:mm"); if(f.format(time).equals(timeStr)){ stockRestPojo.setNow(String.valueOf(Double.valueOf(initNow) + historyPojo.getPctChange())); }else{ stockRestPojo.setNow(String.valueOf(random(historyPojo, initNow, now))); } //设置最高 if(Double.valueOf(stockRestPojo.getNow()) > Double.valueOf(entry.getHigh())){ stockRestPojo.setHigh(stockRestPojo.getNow()); }else{ stockRestPojo.setHigh(entry.getHigh()); } //设置最低 if(Double.valueOf(stockRestPojo.getNow()) < Double.valueOf(entry.getLow())){ stockRestPojo.setLow(stockRestPojo.getNow()); }else{ stockRestPojo.setLow(entry.getLow()); } stockRestPojo.setOpen(entry.getOpen()); /*System.out.println("最高:"+stockRestPojo.getHigh()); System.out.println("最低:"+stockRestPojo.getLow());*/ } stockRestPojo.setHigh(stockRestPojo.getHigh()); stockRestPojo.setLow(stockRestPojo.getLow()); stockRestPojo.setOpen(stockRestPojo.getOpen()); stockRestPojo.setPreclose(initNow); stockRestPojo.setRoundlot(String.valueOf(new BigDecimal(entry.getRoundlot()).add(random(historyPojo, initNow, now)))); stockRestPojo.setChange(String.valueOf(new BigDecimal(stockRestPojo.getNow()).subtract(new BigDecimal(initNow)))); stockRestPojo.setPctchange(String.valueOf((new BigDecimal(stockRestPojo.getNow()).subtract(new BigDecimal(initNow))).divide(new BigDecimal(initNow),2 ,4))); stockRestPojo.setVolume(String.valueOf(new BigDecimal(entry.getVolume()).add(new BigDecimal(randomInt())))); stockRestPojo.setAmount(String.valueOf(new BigDecimal(entry.getNow()).multiply(new BigDecimal(stockRestPojo.getVolume())))); stockRestPojo.setVolumeratio(""); stockRestPojo.setCommissionratio(""); stockRestPojo.setCommissiondiff(""); stockRestPojo.setTradestatus(""); stockRestPojo.setOutvolume(""); stockRestPojo.setInvolume(""); stockRestPojo.setHighlimit(""); stockRestPojo.setLowlimit(""); stockRestPojo.setSpeed(""); stockRestPojo.setAverageprice(""); stockRestPojo.setBuyprice1(randomBuySell(stockRestPojo.getNow(),0)); stockRestPojo.setBuyprice2(randomBuySell(stockRestPojo.getBuyprice1(),0)); stockRestPojo.setBuyprice3(randomBuySell(stockRestPojo.getBuyprice2(),0)); stockRestPojo.setBuyprice4(randomBuySell(stockRestPojo.getBuyprice3(),0)); stockRestPojo.setBuyprice5(randomBuySell(stockRestPojo.getBuyprice4(),0)); stockRestPojo.setBuyvolume1(String.valueOf(new BigDecimal(randomInt()))); stockRestPojo.setBuyvolume2(String.valueOf(new BigDecimal(randomInt()))); stockRestPojo.setBuyvolume3(String.valueOf(new BigDecimal(randomInt()))); stockRestPojo.setBuyvolume4(String.valueOf(new BigDecimal(randomInt()))); stockRestPojo.setBuyvolume5(String.valueOf(new BigDecimal(randomInt()))); stockRestPojo.setSellprice1(randomBuySell(stockRestPojo.getNow(),1)); stockRestPojo.setSellprice2(randomBuySell(stockRestPojo.getSellprice1(),0)); stockRestPojo.setSellprice3(randomBuySell(stockRestPojo.getSellprice2(),0)); stockRestPojo.setSellprice4(randomBuySell(stockRestPojo.getSellprice3(),0)); stockRestPojo.setSellprice5(randomBuySell(stockRestPojo.getSellprice4(),0)); stockRestPojo.setSellvolume1(String.valueOf(new BigDecimal(randomInt()))); stockRestPojo.setSellvolume2(String.valueOf(new BigDecimal(randomInt()))); stockRestPojo.setSellvolume3(String.valueOf(new BigDecimal(randomInt()))); stockRestPojo.setSellvolume4(String.valueOf(new BigDecimal(randomInt()))); stockRestPojo.setSellvolume5(String.valueOf(new BigDecimal(randomInt()))); stockRestPojo.setClosedtime(""); stockRestPojo.setClosedvolume(""); stockRestPojo.setClosedamount(""); StringBuffer dateStr = new StringBuffer(stockRestPojo.getDate()); if (StringUtils.isEmpty(stockRestPojo.getTime())) { dateStr = dateStr.append(000000); } else { if (5 == stockRestPojo.getTime().length()) { // 长度为5表示 小时前面需要补0 dateStr = dateStr.append(0).append(stockRestPojo.getTime()); } else { dateStr = dateStr.append(stockRestPojo.getTime()); } } Date date = TimeUtil.strToDate(dateStr.toString()); // 毫秒转成秒 stockRestPojo.setRealTime(date.getTime() / 1000); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int min = calendar.get(Calendar.MINUTE); // 获取分钟 int sec = calendar.get(Calendar.SECOND); // 获取秒数 // 1分钟数据 if (sec != 0) { stockRestPojo.setDateOne(stockRestPojo.getRealTime() + 60 - sec); } else { stockRestPojo.setDateOne(stockRestPojo.getRealTime()); } // 5分钟数据 if (sec != 0 || min % 5 != 0) { stockRestPojo.setDateFive(stockRestPojo.getRealTime() + (5 * 60) - sec - (min % 5 * 60)); } else { stockRestPojo.setDateFive(stockRestPojo.getRealTime()); } // 15分钟数据 if (sec != 0 || min % 15 != 0) { stockRestPojo.setDateFifteen(stockRestPojo.getRealTime() + (15 * 60) - sec - (min % 15 * 60)); } else { stockRestPojo.setDateFifteen(stockRestPojo.getRealTime()); } // 30分钟数据 if (sec != 0 || min % 30 != 0) { stockRestPojo.setDateThirty(stockRestPojo.getRealTime() + (30 * 60) - sec - (min % 30 * 60)); } else { stockRestPojo.setDateThirty(stockRestPojo.getRealTime()); } // 60分钟数据 if (sec != 0 || min % 60 != 0) { stockRestPojo.setDateSixty(stockRestPojo.getRealTime() + (60 * 60) - sec - (min % 60 * 60)); } else { stockRestPojo.setDateSixty(stockRestPojo.getRealTime()); } stockRestPojo.setCode(code); creatorMapper.insertRt(stockRestPojo, tableName); } private BigDecimal random(HistoryPojo historyPojo, String initNow, String now){ // 昨收 + 涨跌幅 double max; double min; if(historyPojo.getPctChange() > 0) { max = Double.valueOf(initNow) + historyPojo.getPctChange(); min = Double.valueOf(initNow) - 2; }else{ max = Double.valueOf(initNow) + 2; min = Double.valueOf(initNow) - Math.abs(historyPojo.getPctChange()); } double randomMin = Double.valueOf(now) - 2; double randomMax = Double.valueOf(now) + 2; if(randomMin < min){ randomMin = min; } if(randomMax > max){ randomMax = max; } return new BigDecimal(Math.random() * (randomMax - randomMin) + randomMin).setScale(2, BigDecimal.ROUND_HALF_UP); } private String randomBuySell(String now, int type){ // 买 if(0 == type){ return new BigDecimal(now).subtract(new BigDecimal(0.01)).setScale(2, BigDecimal.ROUND_HALF_UP).toString(); }else{ return new BigDecimal(now).add(new BigDecimal(0.01)).setScale(2, BigDecimal.ROUND_HALF_UP).toString(); } } private int randomInt(){ int max = 10000; int min = 5000; int ran = (int) (Math.random() * (max - min) + min); return ran; } }