| | |
| | | import cn.hutool.json.JSONUtil; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.fasterxml.jackson.core.JsonProcessingException; |
| | | import com.fasterxml.jackson.databind.ObjectMapper; |
| | | import com.github.pagehelper.PageHelper; |
| | | import com.github.pagehelper.PageInfo; |
| | | import com.google.common.collect.Lists; |
| | |
| | | import com.nq.enums.EStockType; |
| | | import com.nq.pojo.*; |
| | | import com.nq.pojo.reponse.RPageInfo; |
| | | import com.nq.pojo.reponse.kResponse; |
| | | import com.nq.service.*; |
| | | import com.nq.utils.http.HttpClientRequest; |
| | | import com.nq.utils.PropertiesUtil; |
| | | import com.nq.utils.redis.RedisKeyConstant; |
| | | import com.nq.utils.redis.RedisKeyUtil; |
| | | import com.nq.utils.redis.RedisShardedPoolUtils; |
| | | import com.nq.utils.stock.pinyin.GetPyByChinese; |
| | |
| | | import java.net.HttpURLConnection; |
| | | import java.net.URL; |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.Instant; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.ZoneOffset; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.*; |
| | | import java.util.concurrent.CompletableFuture; |
| | | import java.util.stream.Collectors; |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
| | |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.web.client.RestTemplate; |
| | | |
| | | import static com.nq.utils.timeutil.DateTimeUtil.getWeekDay; |
| | | import static net.sf.jsqlparser.util.validation.metadata.NamedObject.user; |
| | | |
| | | @Service("iStockService") |
| | | public class StockServiceImpl implements IStockService { |
| | |
| | | if (stockList.size() > 0){ |
| | | stockListVOS.addAll(Objects.requireNonNull(StockApi.getStockReailTimes(stockList))); |
| | | } |
| | | RPageInfo pageInfo = new RPageInfo(); |
| | | RPageInfo<StockListVO> pageInfo = new RPageInfo<StockListVO>(); |
| | | |
| | | |
| | | if(null != orderBy && orderBy.equals("asc")){ |
| | | stockListVOS = stockListVOS.stream().sorted(Comparator.comparing(StockListVO::getHcrate)).collect(Collectors.toList()); |
| | | } |
| | | |
| | | if(null != orderBy && orderBy.equals("desc")){ |
| | | stockListVOS = stockListVOS.stream() |
| | | .sorted(Comparator.comparing(StockListVO::getHcrate).reversed()) |
| | | .collect(Collectors.toList()); |
| | | } |
| | | pageInfo.setList(stockListVOS); |
| | | pageInfo.setStockType(stockType); |
| | | return ServerResponse.createBySuccess(pageInfo); |
| | |
| | | } |
| | | |
| | | |
| | | public ServerResponse getSingleStock(String code, HttpServletRequest request) { |
| | | if (StringUtils.isBlank(code)) |
| | | return ServerResponse.createByErrorMsg(""); |
| | | Stock stock = stockMapper.findStockByCode(code); |
| | | DataStockBean cacheBaseStock = RedisKeyUtil.getCacheBaseStock(stock); |
| | | Integer depositAmt = 0; |
| | | String introduction = null; |
| | | StockVO stockVO = StockApi.assembleInStockVO(stock); |
| | | stockVO.setDepositAmt(depositAmt); |
| | | stockVO.setNowPrice(iPriceServices.getNowPrice(stock.getStockCode()).toString()); |
| | | stockVO.setType(stock.getStockType()); |
| | | stockVO.setId(stock.getId().intValue()); |
| | | stockVO.setCode(stock.getStockCode()); |
| | | stockVO.setName(stock.getStockName()); |
| | | stockVO.setSpell(stock.getStockSpell()); |
| | | stockVO.setGid(stock.getStockGid().toUpperCase()); |
| | | Map<String, Object> newStock = iPriceServices.getNewStock(stock.getStockCode()); |
| | | stockVO.setHcrate(newStock.get("ChgPct").toString().replaceAll("%", "")); |
| | | stockVO.setToday_max(newStock.get("High").toString()); |
| | | stockVO.setToday_min(newStock.get("Low").toString()); |
| | | if(null != cacheBaseStock){ |
| | | stockVO.setOpen_px(cacheBaseStock.getOpen()); |
| | | stockVO.setPreclose_px(cacheBaseStock.getPrevClose()); |
| | | public ServerResponse getSingleStock(String code, HttpServletRequest request) throws JsonProcessingException { |
| | | |
| | | if(code.equals("XAUUSD")){ |
| | | String price = RedisShardedPoolUtils.get(RedisKeyConstant.XAUUSD); |
| | | getKData(null, "1", code);//只是为了得到下面redis的值 |
| | | StockVO stockVO = new StockVO(); |
| | | stockVO.setNowPrice(price); |
| | | stockVO.setName(code); |
| | | stockVO.setHcrate(RedisShardedPoolUtils.get(code+"_H")); |
| | | Map map = Maps.newHashMap(); |
| | | map.put("stock", stockVO); |
| | | return ServerResponse.createBySuccess(map); |
| | | }else if(code.equals("USOIL")){ |
| | | String price = RedisShardedPoolUtils.get(RedisKeyConstant.USOIL); |
| | | StockVO stockVO = new StockVO(); |
| | | stockVO.setNowPrice(price); |
| | | stockVO.setName(code); |
| | | stockVO.setHcrate(RedisShardedPoolUtils.get(code+"_H")); |
| | | Map map = Maps.newHashMap(); |
| | | map.put("stock", stockVO); |
| | | return ServerResponse.createBySuccess(map); |
| | | }else{ |
| | | if (StringUtils.isBlank(code)) |
| | | return ServerResponse.createByErrorMsg(""); |
| | | Stock stock = stockMapper.findStockByCode(code); |
| | | DataStockBean cacheBaseStock = RedisKeyUtil.getCacheBaseStock(stock); |
| | | Integer depositAmt = 0; |
| | | String introduction = null; |
| | | StockVO stockVO = StockApi.assembleInStockVO(stock); |
| | | stockVO.setDepositAmt(depositAmt); |
| | | stockVO.setNowPrice(iPriceServices.getNowPrice(stock.getStockCode()).toString()); |
| | | stockVO.setType(stock.getStockType()); |
| | | stockVO.setId(stock.getId().intValue()); |
| | | stockVO.setCode(stock.getStockCode()); |
| | | stockVO.setName(stock.getStockName()); |
| | | stockVO.setSpell(stock.getStockSpell()); |
| | | stockVO.setGid(stock.getStockGid().toUpperCase()); |
| | | Map<String, Object> newStock = iPriceServices.getNewStock(stock.getStockCode()); |
| | | stockVO.setHcrate(newStock.get("ChgPct").toString().replaceAll("%", "")); |
| | | stockVO.setToday_max(newStock.get("High").toString()); |
| | | stockVO.setToday_min(newStock.get("Low").toString()); |
| | | if(null != cacheBaseStock){ |
| | | stockVO.setOpen_px(cacheBaseStock.getOpen()); |
| | | stockVO.setPreclose_px(cacheBaseStock.getPrevClose()); |
| | | } |
| | | Map map = Maps.newHashMap(); |
| | | map.put("introduction", introduction); |
| | | map.put("stock", stockVO); |
| | | return ServerResponse.createBySuccess(map); |
| | | } |
| | | Map map = Maps.newHashMap(); |
| | | map.put("introduction", introduction); |
| | | map.put("stock", stockVO); |
| | | return ServerResponse.createBySuccess(map); |
| | | } |
| | | |
| | | public Map getSingleStock(String code) { |
| | |
| | | |
| | | /*股票日线-K线*/ |
| | | @Override |
| | | public Object getKData(String pid, String interval, String stockType) { |
| | | EStockType eStockType = EStockType.getEStockTypeByCode(stockType); |
| | | Object object = HttpUtil.get(eStockType.stockUrl + "kline?pid=" + pid + "&interval=" + interval + "&key=" + eStockType.stockKey); |
| | | Gson gson = new Gson(); |
| | | List<kData> dataList = gson.fromJson(object.toString(), new TypeToken<List<kData>>(){}.getType()); |
| | | public Object getKData(String pid, String interval, String stockType) throws JsonProcessingException { |
| | | if(stockType.equals("XAUUSD")){ |
| | | // 使用RestTemplate发起HTTP请求 |
| | | String response = RedisShardedPoolUtils.get("k_gold_"+interval.toLowerCase()); |
| | | return parseData(interval,response, stockType); |
| | | }else if(stockType.equals("USOIL")){ |
| | | // 使用RestTemplate发起HTTP请求 |
| | | String response = RedisShardedPoolUtils.get("k_crude_oil_"+interval.toLowerCase()); |
| | | return parseData(interval,response, stockType); |
| | | }else{ |
| | | EStockType eStockType = EStockType.getEStockTypeByCode(stockType); |
| | | Object object = HttpUtil.get(eStockType.stockUrl + "kline?pid=" + pid + "&interval=" + interval + "&key=" + eStockType.stockKey); |
| | | Gson gson = new Gson(); |
| | | List<kData> dataList = gson.fromJson(object.toString(), new TypeToken<List<kData>>(){}.getType()); |
| | | |
| | | Stock stock = stockMapper.selectOne(new LambdaQueryWrapper<Stock>().eq(Stock::getStockCode, pid).eq(Stock::getStockType, EStockType.ST.getCode())); |
| | | BigDecimal nowPrice = iPriceServices.getNowPrice(stock.getStockCode()); |
| | | Map singleStock = getSingleStock(stock.getStockCode()); |
| | | StockVO stockVO = (StockVO)singleStock.get("stock"); |
| | | // 修改 List 中的最后一条数据 |
| | | kData lastData = dataList.get(dataList.size() - 1); |
| | | lastData.setC(nowPrice.toString()); |
| | | lastData.setO(stockVO.getOpen_px()); |
| | | lastData.setH(stockVO.getToday_max()); |
| | | lastData.setL(stockVO.getToday_min()); |
| | | return gson.toJson(dataList); |
| | | Stock stock = stockMapper.selectOne(new LambdaQueryWrapper<Stock>().eq(Stock::getStockCode, pid).eq(Stock::getStockType, EStockType.ST.getCode())); |
| | | BigDecimal nowPrice = iPriceServices.getNowPrice(stock.getStockCode()); |
| | | Map singleStock = getSingleStock(stock.getStockCode()); |
| | | StockVO stockVO = (StockVO)singleStock.get("stock"); |
| | | // 修改 List 中的最后一条数据 |
| | | kData lastData = dataList.get(dataList.size() - 1); |
| | | lastData.setC(nowPrice.toString()); |
| | | lastData.setO(stockVO.getOpen_px()); |
| | | lastData.setH(stockVO.getToday_max()); |
| | | lastData.setL(stockVO.getToday_min()); |
| | | return gson.toJson(dataList); |
| | | } |
| | | } |
| | | |
| | | public List<kData> parseData(String interval,String data,String key) throws JsonProcessingException { |
| | | String price = null; |
| | | if(key.equals("XAUUSD")){ |
| | | price = RedisShardedPoolUtils.get(RedisKeyConstant.XAUUSD); |
| | | }else if(key.equals("USOIL")){ |
| | | price = RedisShardedPoolUtils.get(RedisKeyConstant.USOIL); |
| | | } |
| | | List<kData> kDataList = new ArrayList<>(); |
| | | // 使用 Gson 解析 JSON 字符串 |
| | | Gson gson = new Gson(); |
| | | kResponse kResponse = gson.fromJson(data, kResponse.class); |
| | | |
| | | // 打印 kline_list 的内容 |
| | | for (kResponse.KlineData item : kResponse.getData().getKlineList()) { |
| | | kData kData = new kData(); |
| | | kData.setT(item.getTimestamp()); |
| | | kData.setC(item.getClose_price()); |
| | | kData.setO(item.getOpen_price()); |
| | | kData.setH(item.getHigh_price()); |
| | | kData.setL(item.getLow_price()); |
| | | kData.setV(item.getVolume()); |
| | | kData.setVo(item.getTurnover()); |
| | | kDataList.add(kData); |
| | | } |
| | | kDataList.get(kDataList.size() - 1).setC(price); |
| | | return kDataList; |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public ServerResponse getOptionStock(HttpServletRequest request) { |
| | | User user = iUserService.getCurrentRefreshUser(request); |