package com.nq.service.impl; import com.nq.dao.*; import com.nq.pojo.*; import com.nq.service.*; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.google.common.collect.Lists; import com.nq.common.ServerResponse; import com.nq.utils.timeutil.DateTimeUtil; import com.nq.utils.KeyUtils; import com.nq.utils.stock.BuyAndSellUtils; import com.nq.vo.agent.AgentIncomeVO; import com.nq.vo.futuresposition.AdminFuturesPositionVO; import com.nq.vo.futuresposition.AgentFuturesPositionVO; import com.nq.vo.futuresposition.FuturesPositionProfitVO; import com.nq.vo.futuresposition.FuturesPositionVO; import com.nq.vo.futuresposition.UserFuturesPositionVO; import com.nq.vo.stockfutures.FuturesVO; import java.math.BigDecimal; import java.sql.Timestamp; import java.util.Date; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service("iUserFuturesPositionService") public class UserFuturesPositionServiceImpl implements IUserFuturesPositionService { private static final Logger log = LoggerFactory.getLogger(UserFuturesPositionServiceImpl.class); @Resource UserFuturesPositionMapper userFuturesPositionMapper; @Autowired IUserService iUserService; @Autowired IStockFuturesService iStockFuturesService; @Autowired IAgentUserService iAgentUserService; @Resource AgentUserMapper agentUserMapper; @Autowired IStockCoinService iStockCoinService; @Resource UserMapper userMapper; @Resource UserCashDetailMapper userCashDetailMapper; @Autowired ISiteFuturesSettingService iSiteFuturesSettingService; @Resource StockFuturesMapper stockFuturesMapper; @Autowired ISiteProductService iSiteProductService; @Transactional(rollbackFor = Exception.class) public ServerResponse buyFutures(Integer futuresId, Integer buyNum, Integer buyType, Integer lever, HttpServletRequest request) throws Exception { return ServerResponse.createBySuccess("Order successful"); } @Override public ServerResponse del(Integer positionId) { if (positionId == null) { return ServerResponse.createByErrorMsg("id不能为空"); } UserFuturesPosition position = this.userFuturesPositionMapper.selectByPrimaryKey(positionId); if (position == null) { ServerResponse.createByErrorMsg("该持仓不存在"); } int updateCount = this.userFuturesPositionMapper.deleteByPrimaryKey(positionId); if (updateCount > 0) { return ServerResponse.createBySuccessMsg("删除成功"); } return ServerResponse.createByErrorMsg("删除失败"); } public ServerResponse sellFutures(String positionSn, int doType) throws Exception { return ServerResponse.createBySuccessMsg("Closed position successfully!"); } public ServerResponse listByAdmin(Integer agentId, Integer positionType, Integer state, Integer userId, String positionSn, String beginTime, String endTime, int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); Timestamp begin_time = null; if (StringUtils.isNotBlank(beginTime)) { begin_time = DateTimeUtil.searchStrToTimestamp(beginTime); } Timestamp end_time = null; if (StringUtils.isNotBlank(endTime)) { end_time = DateTimeUtil.searchStrToTimestamp(endTime); } List userFuturesPositions = this.userFuturesPositionMapper.listByAdmin(positionType, state, userId, agentId, positionSn, begin_time, end_time); List adminFuturesPositionVOS = Lists.newArrayList(); for (UserFuturesPosition userFuturesPosition : userFuturesPositions) { AdminFuturesPositionVO adminFuturesPositionVO = assembleAdminFuturesPositionVO(userFuturesPosition); adminFuturesPositionVOS.add(adminFuturesPositionVO); } PageInfo pageInfo = new PageInfo(userFuturesPositions); pageInfo.setList(adminFuturesPositionVOS); return ServerResponse.createBySuccess(pageInfo); } public ServerResponse lock(Integer positionId, Integer state, String lockMsg) { if (positionId == null || state == null) { return ServerResponse.createByErrorMsg("参数不能为空"); } UserFuturesPosition position = this.userFuturesPositionMapper.selectByPrimaryKey(positionId); if (position == null) { return ServerResponse.createByErrorMsg("持仓不存在"); } if (position.getSellOrderPrice() != null) { return ServerResponse.createByErrorMsg("平仓单不能锁仓"); } if (state.intValue() == 1 && StringUtils.isBlank(lockMsg)) { return ServerResponse.createByErrorMsg("锁仓提示信息必填"); } if (state.intValue() == 1) { position.setIsLock(Integer.valueOf(1)); position.setLockMsg(lockMsg); } else { position.setIsLock(Integer.valueOf(0)); } int updateCount = this.userFuturesPositionMapper.updateByPrimaryKeySelective(position); if (updateCount > 0) { return ServerResponse.createBySuccessMsg("操作成功"); } return ServerResponse.createByErrorMsg("操作失败"); } public ServerResponse findMyFuturesPositionByNameAndCode(String fuName, String fuCode, Integer state, HttpServletRequest request, int pageNum, int pageSize) { User user = this.iUserService.getCurrentUser(request); PageHelper.startPage(pageNum, pageSize); List userFuturesPositions = this.userFuturesPositionMapper.findMyFuturesPositionByNameAndCode(user.getId(), fuName, fuCode, state); List userFuturesPositionVOS = Lists.newArrayList(); if (userFuturesPositions.size() > 0) { for (UserFuturesPosition userFuturesPosition : userFuturesPositions) { UserFuturesPositionVO userFuturesPositionVO = assembleUserFuturesPositionVO(userFuturesPosition); userFuturesPositionVOS.add(userFuturesPositionVO); } } PageInfo pageInfo = new PageInfo(userFuturesPositions); pageInfo.setList(userFuturesPositionVOS); return ServerResponse.createBySuccess(pageInfo); } /*根据期货代码查询用户最早入仓股票*/ public ServerResponse findUserFuturesPositionByCode(HttpServletRequest request, String futuresGid) { User user = this.iUserService.getCurrentRefreshUser(request); UserFuturesPosition position = this.userFuturesPositionMapper.findUserFuturesPositionByCode(user.getId(), futuresGid); List userPositionVOS = Lists.newArrayList(); UserFuturesPositionVO userPositionVO = null; if(position != null){ userPositionVO = assembleUserFuturesPositionVO(position); } userPositionVOS.add(userPositionVO); PageInfo pageInfo = new PageInfo(); pageInfo.setList(userPositionVOS); return ServerResponse.createBySuccess(pageInfo); } public ServerResponse listByAgent(Integer positionType, Integer state, Integer userId, Integer agentId, String positionSn, String beginTime, String endTime, HttpServletRequest request, int pageNum, int pageSize) { AgentUser currentAgent = this.iAgentUserService.getCurrentAgent(request); if (agentId != null) { AgentUser agentUser = this.agentUserMapper.selectByPrimaryKey(agentId); if (agentUser.getParentId() != currentAgent.getId()) { return ServerResponse.createByErrorMsg("不能查询非下级代理用户持仓"); } } Integer searchId = null; if (agentId == null) { searchId = currentAgent.getId(); } else { searchId = agentId; } Timestamp begin_time = null; if (StringUtils.isNotBlank(beginTime)) { begin_time = DateTimeUtil.searchStrToTimestamp(beginTime); } Timestamp end_time = null; if (StringUtils.isNotBlank(endTime)) { end_time = DateTimeUtil.searchStrToTimestamp(endTime); } PageHelper.startPage(pageNum, pageSize); List userFuturesPositions = this.userFuturesPositionMapper.listByAgent(positionType, state, userId, searchId, positionSn, begin_time, end_time); List agentFuturesPositionVOS = Lists.newArrayList(); for (UserFuturesPosition userFuturesPosition : userFuturesPositions) { AgentFuturesPositionVO agentFuturesPositionVO = assembleAgentFuturesPositionVO(userFuturesPosition); agentFuturesPositionVOS.add(agentFuturesPositionVO); } PageInfo pageInfo = new PageInfo(userFuturesPositions); pageInfo.setList(agentFuturesPositionVOS); return ServerResponse.createBySuccess(pageInfo); } public List findPositionByFuturesCodeAndTimes(int minuteTimes, String futuresCode, Integer userId) { Date paramTimes = null; paramTimes = DateTimeUtil.parseToDateByMinute(minuteTimes); return this.userFuturesPositionMapper.findPositionByFuturesCodeAndTimes(paramTimes, futuresCode, userId); } public Integer findPositionNumByTimes(int minuteTimes, Integer userId) { Date beginDate = DateTimeUtil.parseToDateByMinute(minuteTimes); Integer transNum = this.userFuturesPositionMapper.findPositionNumByTimes(beginDate, userId); log.info("用户 {} 在 {} 分钟之内 交易手数 {}", new Object[]{userId, Integer.valueOf(minuteTimes), transNum}); return transNum; } public List findDistinctUserIdList() { return this.userFuturesPositionMapper.findDistinctUserIdList(); } public List findFuturesPositionByUserIdAndSellPriceIsNull(Integer userId) { return this.userFuturesPositionMapper.findFuturesPositionByUserIdAndSellPriceIsNull(userId); } public FuturesPositionVO findUserFuturesPositionAllProfitAndLose(Integer userId) { List userFuturesPositions = this.userFuturesPositionMapper.findFuturesPositionByUserIdAndSellPriceIsNull(userId); BigDecimal allProfitAndLose = new BigDecimal("0"); BigDecimal allDepositAmt = new BigDecimal("0"); for (UserFuturesPosition userFuturesPosition : userFuturesPositions) { FuturesVO futuresVO = this.iStockFuturesService.querySingleMarket(userFuturesPosition.getFuturesGid()); BigDecimal nowPrice = new BigDecimal(futuresVO.getNowPrice()); if (nowPrice.compareTo(new BigDecimal("0")) != 0) { FuturesPositionProfitVO futuresPositionProfitVO = getFuturesPositionProfitVO(userFuturesPosition); allDepositAmt = allDepositAmt.add(userFuturesPosition.getAllDepositAmt()); BigDecimal usd_profit = futuresPositionProfitVO.getAllProfitAndLose(); ServerResponse serverResponse = this.iStockFuturesService.getExchangeRate(userFuturesPosition.getCoinCode()); BigDecimal coinRate = new BigDecimal("0"); if (serverResponse.isSuccess()) { coinRate = (BigDecimal) serverResponse.getData(); } usd_profit = usd_profit.multiply(coinRate); allProfitAndLose = allProfitAndLose.add(usd_profit); continue; } log.info("查询所有持仓单的总盈亏,现价返回0,当前为集合竞价"); } FuturesPositionVO futuresPositionVO = new FuturesPositionVO(); futuresPositionVO.setAllFuturesProfitAndLose(allProfitAndLose); futuresPositionVO.setAllFuturesDepositAmt(allDepositAmt); return futuresPositionVO; } public ServerResponse getFuturesIncome(Integer agentId, Integer positionType, String beginTime, String endTime) { if (StringUtils.isBlank(beginTime) || StringUtils.isBlank(endTime)) { return ServerResponse.createByErrorMsg("时间不能为空"); } Timestamp begin_time = null; if (StringUtils.isNotBlank(beginTime)) { begin_time = DateTimeUtil.searchStrToTimestamp(beginTime); } Timestamp end_time = null; if (StringUtils.isNotBlank(endTime)) { end_time = DateTimeUtil.searchStrToTimestamp(endTime); } List userFuturesPositions = this.userFuturesPositionMapper.listByAdmin(positionType, Integer.valueOf(1), null, agentId, null, begin_time, end_time); log.info("查询到反佣周期内 futures 订单数:{}", Integer.valueOf(userFuturesPositions.size())); BigDecimal order_fee_amt = new BigDecimal("0"); BigDecimal order_profit_and_lose = new BigDecimal("0"); BigDecimal order_profit_and_lose_all = new BigDecimal("0"); for (UserFuturesPosition userFuturesPosition : userFuturesPositions) { order_fee_amt = order_fee_amt.add(userFuturesPosition.getOrderFee()); order_profit_and_lose = order_profit_and_lose.add(userFuturesPosition.getProfitAndLose()); order_profit_and_lose_all = order_profit_and_lose_all.add(userFuturesPosition.getAllProfitAndLose()); } AgentIncomeVO agentIncomeVO = new AgentIncomeVO(); agentIncomeVO.setOrderSize(Integer.valueOf(userFuturesPositions.size())); agentIncomeVO.setOrderFeeAmt(order_fee_amt); agentIncomeVO.setOrderProfitAndLose(order_profit_and_lose); agentIncomeVO.setOrderAllAmt(order_profit_and_lose_all); return ServerResponse.createBySuccess(agentIncomeVO); } private UserFuturesPositionVO assembleUserFuturesPositionVO(UserFuturesPosition userFuturesPosition) { UserFuturesPositionVO userFuturesPositionVO = new UserFuturesPositionVO(); BigDecimal eachPoint = new BigDecimal("1"); StockFutures stockFutures = stockFuturesMapper.selectFuturesByCode(userFuturesPosition.getFuturesCode()); if(stockFutures != null){ eachPoint = stockFutures.getEachPoint(); } userFuturesPositionVO.setId(userFuturesPosition.getId()); userFuturesPositionVO.setPositionType(userFuturesPosition.getPositionType()); userFuturesPositionVO.setPositionSn(userFuturesPosition.getPositionSn()); userFuturesPositionVO.setUserId(userFuturesPosition.getUserId()); userFuturesPositionVO.setRealName(userFuturesPosition.getRealName()); userFuturesPositionVO.setAgentId(userFuturesPosition.getAgentId()); userFuturesPositionVO.setFuturesName(userFuturesPosition.getFuturesName()); userFuturesPositionVO.setFuturesCode(userFuturesPosition.getFuturesCode()); userFuturesPositionVO.setFuturesGid(userFuturesPosition.getFuturesGid()); userFuturesPositionVO.setBuyOrderTime(userFuturesPosition.getBuyOrderTime()); userFuturesPositionVO.setBuyOrderPrice(userFuturesPosition.getBuyOrderPrice()); userFuturesPositionVO.setSellOrderTime(userFuturesPosition.getSellOrderTime()); userFuturesPositionVO.setSellOrderPrice(userFuturesPosition.getSellOrderPrice()); userFuturesPositionVO.setOrderDirection(userFuturesPosition.getOrderDirection()); userFuturesPositionVO.setOrderNum(userFuturesPosition.getOrderNum()); userFuturesPositionVO.setFuturesStandard(userFuturesPosition.getFuturesStandard()); userFuturesPositionVO.setFuturesUnit(userFuturesPosition.getFuturesUnit()); userFuturesPositionVO.setAllDepositAmt(userFuturesPosition.getAllDepositAmt()); userFuturesPositionVO.setOrderFee(userFuturesPosition.getOrderFee()); userFuturesPositionVO.setLockMsg(userFuturesPosition.getLockMsg()); userFuturesPositionVO.setIsLock(userFuturesPosition.getIsLock()); userFuturesPositionVO.setCoinCode(userFuturesPosition.getCoinCode()); userFuturesPositionVO.setBuyRate(userFuturesPosition.getBuyRate()); userFuturesPositionVO.setSellRate(userFuturesPosition.getSellRate()); FuturesPositionProfitVO futuresPositionProfitVO = getFuturesPositionProfitVO(userFuturesPosition); userFuturesPositionVO.setAllProfitAndLose(futuresPositionProfitVO.getAllProfitAndLose()); userFuturesPositionVO.setProfitAndLose(futuresPositionProfitVO.getProfitAndLose()); userFuturesPositionVO.setNowPrice(futuresPositionProfitVO.getNowPrice()); userFuturesPositionVO.setCoinRate(futuresPositionProfitVO.getCoinRate()); userFuturesPositionVO.setEachPoint(eachPoint); return userFuturesPositionVO; } private AgentFuturesPositionVO assembleAgentFuturesPositionVO(UserFuturesPosition userFuturesPosition) { AgentFuturesPositionVO agentFuturesPositionVO = new AgentFuturesPositionVO(); agentFuturesPositionVO.setId(userFuturesPosition.getId()); agentFuturesPositionVO.setPositionType(userFuturesPosition.getPositionType()); agentFuturesPositionVO.setPositionSn(userFuturesPosition.getPositionSn()); agentFuturesPositionVO.setUserId(userFuturesPosition.getUserId()); agentFuturesPositionVO.setRealName(userFuturesPosition.getRealName()); agentFuturesPositionVO.setAgentId(userFuturesPosition.getAgentId()); agentFuturesPositionVO.setFuturesName(userFuturesPosition.getFuturesName()); agentFuturesPositionVO.setFuturesCode(userFuturesPosition.getFuturesCode()); agentFuturesPositionVO.setFuturesGid(userFuturesPosition.getFuturesGid()); agentFuturesPositionVO.setBuyOrderTime(userFuturesPosition.getBuyOrderTime()); agentFuturesPositionVO.setBuyOrderPrice(userFuturesPosition.getBuyOrderPrice()); agentFuturesPositionVO.setSellOrderTime(userFuturesPosition.getSellOrderTime()); agentFuturesPositionVO.setSellOrderPrice(userFuturesPosition.getSellOrderPrice()); agentFuturesPositionVO.setOrderDirection(userFuturesPosition.getOrderDirection()); agentFuturesPositionVO.setOrderNum(userFuturesPosition.getOrderNum()); agentFuturesPositionVO.setFuturesStandard(userFuturesPosition.getFuturesStandard()); agentFuturesPositionVO.setFuturesUnit(userFuturesPosition.getFuturesUnit()); agentFuturesPositionVO.setAllDepositAmt(userFuturesPosition.getAllDepositAmt()); agentFuturesPositionVO.setOrderFee(userFuturesPosition.getOrderFee()); agentFuturesPositionVO.setLockMsg(userFuturesPosition.getLockMsg()); agentFuturesPositionVO.setIsLock(userFuturesPosition.getIsLock()); agentFuturesPositionVO.setCoinCode(userFuturesPosition.getCoinCode()); agentFuturesPositionVO.setBuyRate(userFuturesPosition.getBuyRate()); agentFuturesPositionVO.setSellRate(userFuturesPosition.getSellRate()); FuturesPositionProfitVO futuresPositionProfitVO = getFuturesPositionProfitVO(userFuturesPosition); agentFuturesPositionVO.setAllProfitAndLose(futuresPositionProfitVO.getAllProfitAndLose()); agentFuturesPositionVO.setProfitAndLose(futuresPositionProfitVO.getProfitAndLose()); agentFuturesPositionVO.setNowPrice(futuresPositionProfitVO.getNowPrice()); agentFuturesPositionVO.setCoinRate(futuresPositionProfitVO.getCoinRate()); return agentFuturesPositionVO; } private AdminFuturesPositionVO assembleAdminFuturesPositionVO(UserFuturesPosition userFuturesPosition) { AdminFuturesPositionVO adminFuturesPositionVO = new AdminFuturesPositionVO(); adminFuturesPositionVO.setId(userFuturesPosition.getId()); adminFuturesPositionVO.setPositionType(userFuturesPosition.getPositionType()); adminFuturesPositionVO.setPositionSn(userFuturesPosition.getPositionSn()); adminFuturesPositionVO.setUserId(userFuturesPosition.getUserId()); adminFuturesPositionVO.setRealName(userFuturesPosition.getRealName()); adminFuturesPositionVO.setAgentId(userFuturesPosition.getAgentId()); adminFuturesPositionVO.setFuturesName(userFuturesPosition.getFuturesName()); adminFuturesPositionVO.setFuturesCode(userFuturesPosition.getFuturesCode()); adminFuturesPositionVO.setFuturesGid(userFuturesPosition.getFuturesGid()); adminFuturesPositionVO.setBuyOrderTime(userFuturesPosition.getBuyOrderTime()); adminFuturesPositionVO.setBuyOrderPrice(userFuturesPosition.getBuyOrderPrice()); adminFuturesPositionVO.setSellOrderTime(userFuturesPosition.getSellOrderTime()); adminFuturesPositionVO.setSellOrderPrice(userFuturesPosition.getSellOrderPrice()); adminFuturesPositionVO.setOrderDirection(userFuturesPosition.getOrderDirection()); adminFuturesPositionVO.setOrderNum(userFuturesPosition.getOrderNum()); adminFuturesPositionVO.setFuturesStandard(userFuturesPosition.getFuturesStandard()); adminFuturesPositionVO.setFuturesUnit(userFuturesPosition.getFuturesUnit()); adminFuturesPositionVO.setAllDepositAmt(userFuturesPosition.getAllDepositAmt()); adminFuturesPositionVO.setOrderFee(userFuturesPosition.getOrderFee()); adminFuturesPositionVO.setLockMsg(userFuturesPosition.getLockMsg()); adminFuturesPositionVO.setIsLock(userFuturesPosition.getIsLock()); adminFuturesPositionVO.setCoinCode(userFuturesPosition.getCoinCode()); adminFuturesPositionVO.setBuyRate(userFuturesPosition.getBuyRate()); adminFuturesPositionVO.setSellRate(userFuturesPosition.getSellRate()); FuturesPositionProfitVO futuresPositionProfitVO = getFuturesPositionProfitVO(userFuturesPosition); adminFuturesPositionVO.setAllProfitAndLose(futuresPositionProfitVO.getAllProfitAndLose()); adminFuturesPositionVO.setProfitAndLose(futuresPositionProfitVO.getProfitAndLose()); adminFuturesPositionVO.setNowPrice(futuresPositionProfitVO.getNowPrice()); adminFuturesPositionVO.setCoinRate(futuresPositionProfitVO.getCoinRate()); return adminFuturesPositionVO; } private FuturesPositionProfitVO getFuturesPositionProfitVO(UserFuturesPosition userFuturesPosition) { BigDecimal profitAndLose = new BigDecimal("0"); BigDecimal allProfitAndLose = new BigDecimal("0"); String nowPrice = ""; BigDecimal coinRate = new BigDecimal("0"); //每手浮动价格 StockFutures stockFutures = stockFuturesMapper.selectFuturesByCode(userFuturesPosition.getFuturesCode()); BigDecimal eachPoint = new BigDecimal("1"); if(stockFutures!=null && stockFutures.getEachPoint() != null){ eachPoint = stockFutures.getEachPoint(); } if (userFuturesPosition.getSellOrderPrice() != null) { BigDecimal subPrice = userFuturesPosition.getSellOrderPrice().subtract(userFuturesPosition.getBuyOrderPrice()); profitAndLose = subPrice.multiply(eachPoint).multiply(new BigDecimal(userFuturesPosition.getOrderNum().intValue())); if ("买跌".equals(userFuturesPosition.getOrderDirection())) { profitAndLose = profitAndLose.negate(); } allProfitAndLose = profitAndLose.subtract(userFuturesPosition.getOrderFee()); coinRate = userFuturesPosition.getSellRate(); } else { FuturesVO futuresVO = this.iStockFuturesService.querySingleMarket(userFuturesPosition.getFuturesGid()); nowPrice = futuresVO.getNowPrice(); BigDecimal subPrice = (new BigDecimal(nowPrice)).subtract(userFuturesPosition.getBuyOrderPrice()); profitAndLose = subPrice.multiply(eachPoint).multiply(new BigDecimal(userFuturesPosition.getOrderNum().intValue())); if ("买跌".equals(userFuturesPosition.getOrderDirection())) { profitAndLose = profitAndLose.negate(); } allProfitAndLose = profitAndLose.subtract(userFuturesPosition.getOrderFee()); ServerResponse serverResponse = this.iStockFuturesService.getExchangeRate(userFuturesPosition.getCoinCode()); if (serverResponse.isSuccess()) { coinRate = (BigDecimal) serverResponse.getData(); } } FuturesPositionProfitVO futuresPositionProfitVO = new FuturesPositionProfitVO(); futuresPositionProfitVO.setProfitAndLose(profitAndLose); futuresPositionProfitVO.setAllProfitAndLose(allProfitAndLose); futuresPositionProfitVO.setNowPrice(nowPrice); futuresPositionProfitVO.setCoinRate(coinRate); return futuresPositionProfitVO; } }