package com.nq.service.impl; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.nq.common.ServerResponse; import com.nq.dao.*; import com.nq.pojo.*; import com.nq.service.*; import com.nq.utils.timeutil.DateTimeUtil; import com.nq.utils.PropertiesUtil; import com.nq.utils.redis.JsonUtil; import com.nq.utils.redis.RedisShardedPoolUtils; import com.nq.utils.stock.sina.StockApi; import com.nq.vo.foreigncurrency.ExchangeVO; import com.nq.vo.position.UserPendingorderVO; import com.nq.vo.stock.MarketVO; import com.nq.vo.stock.StockListVO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; /** * @author Administrator * @description 针对表【user_pendingorder】的数据库操作Service实现 * @createDate 2022-11-10 06:10:40 */ @Service @Slf4j public class UserPendingorderServiceImpl extends ServiceImpl implements UserPendingorderService { @Autowired private UserPendingorderMapper userPendingorderMapper; @Autowired private StockMapper stockMapper; @Autowired private IUserService iUserService; @Autowired private IUserPositionService iUserPositionService; @Autowired private SiteTaskLogMapper siteTaskLogMapper; @Autowired private UserMapper userMapper; @Autowired private StockIndexMapper stockIndexMapper; @Autowired private IStockIndexService iStockIndexService; @Autowired private IUserIndexPositionService iUserIndexPositionService; @Autowired private IStockFuturesService iStockFuturesService; @Autowired private ISiteSettingService iSiteSettingService; @Override public ServerResponse addOrder(String stockId, Integer buyNum, Integer buyType, Integer lever, BigDecimal profitTarget, BigDecimal stopTarget, BigDecimal targetPrice, HttpServletRequest request) { User user = this.iUserService.getCurrentRefreshUser(request); if (user == null) { return ServerResponse.createByErrorMsg("Please log in first"); } SiteSetting siteSetting = this.iSiteSettingService.getSiteSetting(); if (buyNum.intValue() < siteSetting.getBuyMinNum().intValue()) { return ServerResponse.createByErrorMsg("The pending order failed, and the purchased quantity was less than" + siteSetting .getBuyMinNum() + "stocks"); } if (buyNum.intValue() > siteSetting.getBuyMaxNum().intValue()) { return ServerResponse.createByErrorMsg("The pending order failed because the purchased quantity was greater than" + siteSetting .getBuyMaxNum() + "stocks"); } UserPendingorder userPendingorder = userPendingorderMapper.selectOne(new QueryWrapper().eq("user_id", user.getId()).eq("stock_id", stockId).eq("status", 0)); if (userPendingorder != null) { return ServerResponse.createByErrorMsg("Please do not repeat the order"); } userPendingorder = new UserPendingorder(); userPendingorder.setUserId(user.getId()); userPendingorder.setStockId(stockId); userPendingorder.setBuyNum(buyNum); userPendingorder.setBuyType(buyType); userPendingorder.setLever(lever); userPendingorder.setProfitTarget(profitTarget); userPendingorder.setStopTarget(stopTarget); userPendingorder.setNowPrice(new BigDecimal(0)); userPendingorder.setTargetPrice(targetPrice); userPendingorder.setAddTime(new Date()); userPendingorder.setStatus(0); int ret = userPendingorderMapper.insert(userPendingorder); if (ret > 0) { return ServerResponse.createBySuccessMsg("If the pending order is successfully added, the order will be automatically placed if the order conditions are met"); } return ServerResponse.createByErrorMsg("Add failure"); } @Override public ServerResponse orderList(HttpServletRequest request) { String property = PropertiesUtil.getProperty("user.cookie.name"); String header = request.getHeader(property); // log.info("header:{}",header); if (header != null) { String userJson = RedisShardedPoolUtils.get(header); User user = (User) JsonUtil.string2Obj(userJson, User.class); // log.info("user:{}",user); if (user != null) { List userPendingorders = userPendingorderMapper.selectList(new QueryWrapper().eq("user_id", user.getId())); List UserPendingorderList = new ArrayList(); for (UserPendingorder userPendingorder : userPendingorders) { UserPendingorderVO userPendingorderVO = new UserPendingorderVO(); //挂单-指数 //挂单-股票 Stock stock = stockMapper.findStockByCode(userPendingorder.getStockId()); StockListVO stockListVO = new StockListVO(); stockListVO = StockApi.getStockRealTime( stock); String nowPrice = stockListVO.getNowPrice(); if (nowPrice == null) { nowPrice = String.valueOf(0); } userPendingorderVO.setNowPrice(new BigDecimal(nowPrice)); userPendingorderVO.setStockName(stock.getStockName()); userPendingorderVO.setStockId(stock.getStockCode()); userPendingorderVO.setBuyNum(userPendingorder.getBuyNum()); userPendingorderVO.setBuyType(userPendingorder.getBuyType()); userPendingorderVO.setLever(userPendingorder.getLever()); userPendingorderVO.setProfitTarget(userPendingorder.getProfitTarget()); userPendingorderVO.setStopTarget(userPendingorder.getStopTarget()); userPendingorderVO.setTargetPrice(userPendingorder.getTargetPrice()); userPendingorderVO.setAddTime(userPendingorder.getAddTime()); userPendingorderVO.setStatus(userPendingorder.getStatus()); userPendingorderVO.setId(userPendingorder.getId()); UserPendingorderList.add(userPendingorderVO); } return ServerResponse.createBySuccess(UserPendingorderList); } } return ServerResponse.createByErrorMsg("数据异常"); } @Override public void orderTask() { List userPendingorders = userPendingorderMapper.selectList(new QueryWrapper().eq("status", 0)); log.info("当前有挂单的用户数量 为 {}", Integer.valueOf(userPendingorders.size())); for (int i = 0; i < userPendingorders.size(); i++) { Integer userId = (Integer) userPendingorders.get(i).getUserId(); User user = this.userMapper.selectById(userId); if (user == null) { continue; } List userPendingorderList = userPendingorderMapper.selectList(new QueryWrapper().eq("user_id", userId).eq("status", 0)); if (userPendingorderList == null) { continue; } log.info("用户id = {} 姓名 = {} 已挂单数: {}", new Object[]{userId, user.getRealName(), Integer.valueOf(userPendingorders.size())}); BigDecimal all_freez_amt = new BigDecimal("0"); String nowPrice = ""; String code = ""; Integer indexId = null; StockListVO stockListVO = new StockListVO(); StockCoin stockCoin = new StockCoin(); for (UserPendingorder userPendingorder : userPendingorderList) { //指数 if (userPendingorder.getStockId().contains("sh") || userPendingorder.getStockId().contains("sz") || userPendingorder.getStockId().contains("hk") || userPendingorder.getStockId().contains("us")) { StockIndex model = stockIndexMapper.selectIndexByCode(userPendingorder.getStockId().replace("sh", "").replace("sz", "").replace("hk", "").replace("us", "")); all_freez_amt = (new BigDecimal(model.getDepositAmt().intValue())).multiply(new BigDecimal(userPendingorder.getBuyNum())).divide(new BigDecimal(userPendingorder.getLever())).setScale(4, 2); // if (){ // // }else { MarketVO marketVO = this.iStockIndexService.querySingleIndex(model.getIndexGid()); nowPrice = marketVO.getNowPrice(); // } indexId = model.getId(); } else { //股票 Stock stock = stockMapper.findStockByCode(userPendingorder.getStockId()); if ("hk".equals(stock.getStockType())) { String hk = RedisShardedPoolUtils.get(stock.getStockGid(), 1); stockListVO = StockApi.otherStockListVO(hk); // stockCoin = iStockCoinService.selectCoinByCode("HKD"); ExchangeVO exchangeVO = this.iStockFuturesService.queryExchangeVO("HKD").getData(); nowPrice = String.valueOf(new BigDecimal(stockListVO.getNowPrice()).multiply(new BigDecimal(exchangeVO.getNowPrice()))); } else if ("us".equals(stock.getStockType())) { String us = RedisShardedPoolUtils.get(stock.getStockGid(), 2); stockListVO = StockApi.otherStockListVO(us); // stockCoin = iStockCoinService.selectCoinByCode("USD"); ExchangeVO exchangeVO = this.iStockFuturesService.queryExchangeVO("USD").getData(); nowPrice = String.valueOf(new BigDecimal(stockListVO.getNowPrice()).multiply(new BigDecimal(exchangeVO.getNowPrice()))); } else { stockListVO = StockApi.getStockRealTime(stock); nowPrice = stockListVO.getNowPrice(); } all_freez_amt = new BigDecimal(nowPrice).multiply(new BigDecimal(userPendingorder.getBuyNum())).divide(new BigDecimal(userPendingorder.getLever()), 2, 4); code = stock.getStockCode(); } if (nowPrice == null) { nowPrice = String.valueOf(0); } if (userPendingorder.getUserId() != null && userPendingorder.getStockId() != null && userPendingorder.getBuyNum() != null && userPendingorder.getBuyType() != null && userPendingorder.getLever() != null && userPendingorder.getTargetPrice() != null) { int ret = userPendingorder.getBuyType().intValue() == 0 ? userPendingorder.getTargetPrice().compareTo(new BigDecimal(nowPrice)) : new BigDecimal(nowPrice).compareTo(userPendingorder.getTargetPrice()); //当前时间String String buyTime = DateTimeUtil.dateToStr(new Date()); if (ret <= 0) { if (code != null && !"".equals(code)) { try { this.iUserPositionService.create(userPendingorder.getUserId(), code, nowPrice, buyTime, userPendingorder.getBuyNum(), userPendingorder.getBuyType(), userPendingorder.getLever(), userPendingorder.getProfitTarget(), userPendingorder.getStopTarget()); userPendingorder.setStatus(1); this.userPendingorderMapper.updateById(userPendingorder); SiteTaskLog siteTaskLog = new SiteTaskLog(); siteTaskLog.setTaskType("股票挂单转持仓"); String accountType = (user.getAccountType() == 0) ? "正式用户" : "模拟用户"; String tasktarget = "此次挂单买入id:" + userPendingorder.getId(); siteTaskLog.setTaskTarget(tasktarget); siteTaskLog.setAddTime(new Date()); siteTaskLog.setIsSuccess(0); siteTaskLog.setErrorMsg(""); int insertTaskCount = this.siteTaskLogMapper.insert(siteTaskLog); if (insertTaskCount > 0) { log.info("挂单task任务成功"); } else { log.info("挂单task任务失败"); } } catch (Exception e) { log.error("股票挂单任务失败..."); userPendingorder.setStatus(2); this.userPendingorderMapper.updateById(userPendingorder); } } else if (indexId != null) { try { this.iUserIndexPositionService.buyIndexOrder(indexId, userPendingorder.getBuyNum(), userPendingorder.getBuyType(), userPendingorder.getLever(), userPendingorder.getProfitTarget(), userPendingorder.getStopTarget(), userPendingorder.getUserId()); userPendingorder.setStatus(1); this.userPendingorderMapper.updateById(userPendingorder); SiteTaskLog siteTaskLog = new SiteTaskLog(); siteTaskLog.setTaskType("指数挂单转持仓"); String accountType = (user.getAccountType() == 0) ? "正式用户" : "模拟用户"; String tasktarget = "此次挂单买入id:" + userPendingorder.getId(); siteTaskLog.setTaskTarget(tasktarget); siteTaskLog.setAddTime(new Date()); siteTaskLog.setIsSuccess(0); siteTaskLog.setErrorMsg(""); int insertTaskCount = this.siteTaskLogMapper.insert(siteTaskLog); if (insertTaskCount > 0) { log.info("挂单task任务成功"); userPendingorder.setStatus(1); } else { log.info("挂单task任务失败"); } } catch (Exception e) { log.error("指数挂单任务失败..."); userPendingorder.setStatus(2); this.userPendingorderMapper.updateById(userPendingorder); } } } } } } log.info("===========挂单结束=========="); } //删除 @Override public ServerResponse delOrder(Integer id, HttpServletRequest request) { String property = PropertiesUtil.getProperty("user.cookie.name"); String header = request.getHeader(property); if (header != null) { String userJson = RedisShardedPoolUtils.get(header); User user = (User) JsonUtil.string2Obj(userJson, User.class); UserPendingorder userPendingorder = this.userPendingorderMapper.selectById(id); if (userPendingorder == null) { return ServerResponse.createByErrorMsg("The pending order does not exist"); } if (user.getId().intValue() != userPendingorder.getUserId().intValue()) { return ServerResponse.createByErrorMsg("The pending order does not belong to you"); } int delCount = this.userPendingorderMapper.deleteById(id); if (delCount > 0) { return ServerResponse.createByErrorMsg("Successfully deleted"); } return ServerResponse.createByErrorMsg("Deletion failure"); } return ServerResponse.createByErrorMsg("Please log in"); } @Override public ServerResponse orderListByAdmin(int pageNum, int pageSize, String keywords, String status, HttpServletRequest request) { PageHelper.startPage(pageNum, pageSize); QueryWrapper queryWrapper = new QueryWrapper(); if (keywords != null && !keywords.equals("")) { queryWrapper.like("stock_id", keywords).or().like("user_id", keywords); } if (status != null && !status.equals("")) { queryWrapper.eq("status", status); } queryWrapper.orderByDesc("id"); List stockSubscribeList = this.userPendingorderMapper.selectList(queryWrapper); List UserPendingorderList = new ArrayList(); for (UserPendingorder userPendingorder : stockSubscribeList) { UserPendingorderVO userPendingorderVO = new UserPendingorderVO(); //挂单-指数 if (userPendingorder.getStockId().contains("sh") || userPendingorder.getStockId().contains("sz") || userPendingorder.getStockId().contains("hk") || userPendingorder.getStockId().contains("us")) { StockIndex model = stockIndexMapper.selectIndexByCode(userPendingorder.getStockId().replace("sh", "").replace("sz", "").replace("hk", "").replace("us", "")); MarketVO marketVO = this.iStockIndexService.querySingleIndex(model.getIndexGid()); userPendingorderVO.setNowPrice(new BigDecimal(marketVO.getNowPrice())); userPendingorderVO.setStockName(model.getIndexName()); userPendingorderVO.setStockId(model.getIndexGid()); } else { //挂单-股票 Stock stock = stockMapper.findStockByCode(userPendingorder.getStockId()); StockListVO stockListVO = new StockListVO(); if (stock.getStockType().equals("hk")) { String hk = RedisShardedPoolUtils.get(stock.getStockGid(), 1); stockListVO = StockApi.otherStockListVO(hk); } else if (stock.getStockType().equals("us")) { String us = RedisShardedPoolUtils.get(stock.getStockGid(), 2); stockListVO = StockApi.otherStockListVO(us); } else { stockListVO = StockApi.getStockRealTime( stock); } String nowPrice = stockListVO.getNowPrice(); if (nowPrice == null) { nowPrice = String.valueOf(0); } userPendingorderVO.setNowPrice(new BigDecimal(nowPrice)); userPendingorderVO.setStockName(stock.getStockName()); userPendingorderVO.setStockId(stock.getStockCode()); } userPendingorderVO.setBuyNum(userPendingorder.getBuyNum()); userPendingorderVO.setBuyType(userPendingorder.getBuyType()); userPendingorderVO.setLever(userPendingorder.getLever()); userPendingorderVO.setProfitTarget(userPendingorder.getProfitTarget()); userPendingorderVO.setStopTarget(userPendingorder.getStopTarget()); userPendingorderVO.setTargetPrice(userPendingorder.getTargetPrice()); userPendingorderVO.setAddTime(userPendingorder.getAddTime()); userPendingorderVO.setStatus(userPendingorder.getStatus()); userPendingorderVO.setId(userPendingorder.getId()); UserPendingorderList.add(userPendingorderVO); } PageInfo pageInfo = new PageInfo(stockSubscribeList); pageInfo.setList(UserPendingorderList); return ServerResponse.createBySuccess(pageInfo); } @Override public ServerResponse updateOrderByAdmin(UserPendingorder userPendingorder) { if (userPendingorder.getId() == null) { return ServerResponse.createByErrorMsg("id不能为空"); } int updateCount = this.userPendingorderMapper.updateById(userPendingorder); if (updateCount > 0) { return ServerResponse.createBySuccessMsg("修改成功"); } return ServerResponse.createByErrorMsg("修改失败"); } @Override public ServerResponse addOrderByAdmin(String phone, String buyNum, String code, String buyType, String lever, String targetPrice, HttpServletRequest request) { if (StringUtils.isBlank(phone) || StringUtils.isBlank(buyNum) || StringUtils.isBlank(buyType) || StringUtils.isBlank(lever) || StringUtils.isBlank(targetPrice)) { return ServerResponse.createByErrorMsg("参数不能为空"); } User user = this.userMapper.selectOne(new QueryWrapper().eq("phone", phone)); if (user == null) { return ServerResponse.createByErrorMsg("用户不存在"); } Stock stock = stockMapper.findStockByCode(code); if (stock == null) { return ServerResponse.createByErrorMsg("股票不存在"); } UserPendingorder userPendingorder = new UserPendingorder(); userPendingorder.setUserId(user.getId()); userPendingorder.setStockId(code); userPendingorder.setBuyNum(Integer.valueOf(buyNum)); userPendingorder.setBuyType(Integer.valueOf(buyType)); userPendingorder.setLever(Integer.valueOf(lever)); userPendingorder.setTargetPrice(new BigDecimal(targetPrice)); userPendingorder.setAddTime(new Date()); userPendingorder.setStatus(0); userPendingorder.setNowPrice(new BigDecimal(0)); int insert = this.userPendingorderMapper.insert(userPendingorder); if (insert > 0) { return ServerResponse.createBySuccessMsg("添加成功"); } return ServerResponse.createByErrorMsg("添加失败"); } @Override public ServerResponse delOrderByAdmin(Integer id) { if (id == null) { return ServerResponse.createByErrorMsg("id不能为空"); } int delete = this.userPendingorderMapper.deleteById(id); if (delete > 0) { return ServerResponse.createBySuccessMsg("删除成功"); } return ServerResponse.createByErrorMsg("删除失败"); } }