| | |
| | | package com.nq.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.nq.dao.*; |
| | | import com.nq.enums.EConfigKey; |
| | | import com.nq.enums.EStockType; |
| | | import com.nq.enums.EUserAssets; |
| | | import com.nq.pojo.*; |
| | | import com.nq.service.*; |
| | |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.sql.Timestamp; |
| | | import java.time.LocalDateTime; |
| | | import java.time.ZoneId; |
| | | import java.time.temporal.ChronoUnit; |
| | | import java.util.*; |
| | | import java.util.concurrent.atomic.AtomicBoolean; |
| | | import java.util.concurrent.locks.Lock; |
| | | import java.util.concurrent.locks.ReentrantLock; |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | |
| | |
| | | |
| | | @Autowired |
| | | IUserAssetsServices userAssetsServices; |
| | | |
| | | @Autowired |
| | | UserAssetsMapper userAssetsMapper; |
| | | |
| | | @Autowired |
| | | ISiteSettingService iSiteSettingService; |
| | |
| | | IUserAssetsServices iUserAssetsServices; |
| | | |
| | | @Autowired |
| | | TradingHourServiceImpl tradingHourService; |
| | | ITradingHourService tradingHourService; |
| | | |
| | | @Autowired |
| | | IPriceServices priceServices; |
| | | |
| | | @Autowired |
| | | IStockConfigServices iStockConfigServices; |
| | | |
| | | |
| | | |
| | | |
| | | @Transactional |
| | | public ServerResponse buy(Integer stockId, Integer buyNum, Integer buyType, Integer lever, BigDecimal profitTarget, BigDecimal stopTarget, HttpServletRequest request) throws Exception { |
| | | public ServerResponse buy(Integer stockId, Integer buyNum, Integer buyType, Integer lever, BigDecimal profitTarget, BigDecimal stopTarget, HttpServletRequest request) { |
| | | |
| | | SiteProduct siteProduct = iSiteProductService.getProductSetting(); |
| | | |
| | | User user = this.iUserService.getCurrentRefreshUser(request); |
| | | if (siteProduct.getRealNameDisplay() && (StringUtils.isBlank(user.getRealName()) || StringUtils.isBlank(user.getIdCard()))) { |
| | | return ServerResponse.createByErrorMsg("Order failed, please first real name authentication"); |
| | | } |
| | | |
| | | // if (siteProduct.getRealNameDisplay() && user.getIsActive() != 2) { |
| | | // return ServerResponse.createByErrorMsg("订单失败,请先实名认证", request); |
| | | // } |
| | | // 手续费率 |
| | | BigDecimal siteSettingBuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.BUY_HANDLING_CHARGE.getCode()).getCValue()) ; |
| | | |
| | | if (siteProduct.getRealNameDisplay() && user.getIsLock().intValue() == 1) { |
| | | return ServerResponse.createByErrorMsg("Order failed, account has been locked"); |
| | | } |
| | | |
| | | SiteSetting siteSetting = this.iSiteSettingService.getSiteSetting(); |
| | | if (siteSetting == null) { |
| | | log.error("下单出错,网站设置表不存在"); |
| | | return ServerResponse.createByErrorMsg("Order failed, system setting error"); |
| | | return ServerResponse.createByErrorMsg("订单失败,帐户已被锁定", request); |
| | | } |
| | | |
| | | Stock stock = stockMapper.selectByPrimaryKey(stockId); |
| | | if (stock == null) { |
| | | return ServerResponse.createByErrorMsg("Order failed, stock code error"); |
| | | return ServerResponse.createByErrorMsg("订单失败,股票代码不存在", request); |
| | | } |
| | | //判断股票是否在可交易时间段 |
| | | Boolean b = tradingHourService.timeCheck(); |
| | | Boolean b = tradingHourService.timeCheck(stock.getStockCode()); |
| | | if (!b) { |
| | | return ServerResponse.createByErrorMsg("Order failed, not in the stock trading session"); |
| | | String lang = request.getHeader("lang"); |
| | | if(lang.equals("ja")){ |
| | | String msg = "注文失敗、取引時間外です。"; |
| | | return ServerResponse.createByErrorMsg(msg); |
| | | }else{ |
| | | return ServerResponse.createByErrorMsg("订单失败,不在交易时间之内", request); |
| | | } |
| | | } |
| | | |
| | | SiteSetting siteSetting = iSiteSettingService.getSiteSetting(); |
| | | if(buyNum<siteSetting.getBuyMinNum()){ |
| | | return ServerResponse.createByErrorMsg("最低购买数量"+siteSetting.getBuyMinNum(), request); |
| | | } |
| | | UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(stock.getStockType(), user.getId()); |
| | | |
| | | if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ |
| | | return ServerResponse.createByErrorMsg("请先缴清待补资金", request); |
| | | } |
| | | if (stock.getIsLock() != 0) { |
| | | return ServerResponse.createByErrorMsg("Order failed, shares cannot be traded at present"); |
| | | return ServerResponse.createByErrorMsg("订单失败,股票被锁定", request); |
| | | } |
| | | |
| | | BigDecimal now_price; |
| | | if (!priceServices.isLimitUpBuy(stock.getStockCode())) { |
| | | return ServerResponse.createByErrorMsg("暂无配额", request); |
| | | } |
| | | |
| | | //股票类型 现价 数据源的处理 |
| | | StockListVO stockListVO = StockApi.getStockRealTime(stock); |
| | | now_price = new BigDecimal(stockListVO.getNowPrice()); |
| | | BigDecimal nowPrice = priceServices.getNowPrice(stock.getStockCode()); |
| | | |
| | | if (now_price.compareTo(new BigDecimal("0")) == 0) { |
| | | return ServerResponse.createByErrorMsg("Quote 0, please try again later"); |
| | | if (nowPrice.compareTo(new BigDecimal("0")) == 0) { |
| | | return ServerResponse.createByErrorMsg("报价0,请稍后再试", request); |
| | | } |
| | | |
| | | BigDecimal buy_amt = now_price.multiply(new BigDecimal(buyNum)); |
| | | BigDecimal buyAmt = nowPrice.multiply(new BigDecimal(buyNum)).divide(new BigDecimal(lever)); |
| | | BigDecimal orderFree = siteSettingBuyFee.multiply(buyAmt); |
| | | |
| | | UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(stock.getStockType(),user.getId()); |
| | | if(userAssets.getAvailableBalance().compareTo(buy_amt)<0){ |
| | | return ServerResponse.createByErrorMsg("Order failed,Insufficient balance"); |
| | | |
| | | if (userAssets.getAvailableBalance().compareTo(buyAmt.add(orderFree)) < 0) { |
| | | return ServerResponse.createByErrorMsg("订单失败,余额不足", request); |
| | | } |
| | | |
| | | |
| | | UserPosition userPosition = new UserPosition(); |
| | | |
| | | if (profitTarget != null && profitTarget.compareTo(new BigDecimal("0")) > 0) { |
| | | userPosition.setProfitTargetPrice(profitTarget); |
| | | } |
| | | if (stopTarget != null && stopTarget.compareTo(new BigDecimal("0")) > 0) { |
| | | userPosition.setStopTargetPrice(stopTarget); |
| | | } |
| | | |
| | | |
| | | userPosition.setPositionType(user.getAccountType()); |
| | | userPosition.setPositionSn(KeyUtils.getUniqueKey()); |
| | | userPosition.setUserId(user.getId()); |
| | |
| | | userPosition.setStockSpell(stock.getStockSpell()); |
| | | userPosition.setBuyOrderId(GeneratePosition.getPositionId()); |
| | | userPosition.setBuyOrderTime(new Date()); |
| | | userPosition.setBuyOrderPrice(now_price); |
| | | userPosition.setBuyOrderPrice(nowPrice); |
| | | userPosition.setOrderDirection((buyType.intValue() == 0) ? "买涨" : "买跌"); |
| | | userPosition.setOrderNum(buyNum); |
| | | if (stock.getStockPlate() != null) { |
| | |
| | | } |
| | | userPosition.setIsLock(Integer.valueOf(0)); |
| | | userPosition.setOrderLever(lever); |
| | | userPosition.setOrderTotalPrice(buy_amt); |
| | | BigDecimal allStayFee = BigDecimal.valueOf(0); |
| | | userPosition.setOrderStayFee(allStayFee); |
| | | userPosition.setOrderStayDays(1); |
| | | userPosition.setOrderTotalPrice(buyAmt); |
| | | // 手续费 |
| | | |
| | | BigDecimal buy_fee_amt = BigDecimal.valueOf(0); |
| | | log.info("用户购买手续费(配资后总资金 * 百分比) = {}", buy_fee_amt); |
| | | userPosition.setOrderFee(buy_fee_amt); |
| | | |
| | | BigDecimal buy_yhs_amt = BigDecimal.valueOf(0); |
| | | log.info("用户购买印花税(配资后总资金 * 百分比) = {}", buy_yhs_amt); |
| | | userPosition.setOrderSpread(buy_yhs_amt); |
| | | |
| | | BigDecimal spread_rate_amt = new BigDecimal("0"); |
| | | |
| | | userPosition.setSpreadRatePrice(spread_rate_amt); |
| | | userPosition.setOrderFee(orderFree); |
| | | userPosition.setOrderSpread(BigDecimal.ZERO); |
| | | userPosition.setSpreadRatePrice(BigDecimal.ZERO); |
| | | BigDecimal profit_and_lose = new BigDecimal("0"); |
| | | userPosition.setProfitAndLose(profit_and_lose); |
| | | BigDecimal all_profit_and_lose = profit_and_lose.subtract(buy_fee_amt).subtract(buy_yhs_amt).subtract(spread_rate_amt); |
| | | userPosition.setAllProfitAndLose(all_profit_and_lose); |
| | | userPosition.setAllProfitAndLose(profit_and_lose.add(orderFree)); |
| | | userPosition.setOrderStayDays(Integer.valueOf(0)); |
| | | userPosition.setOrderStayFee(new BigDecimal("0")); |
| | | this.userPositionMapper.insert(userPosition); |
| | | iUserAssetsServices.availablebalanceChange(stock.getStockType(),user.getId(), EUserAssets.BUY,buy_amt.negate(),"",""); |
| | | return ServerResponse.createBySuccessMsg("Order successful"); |
| | | userPosition.setOrderStayFee(BigDecimal.ZERO); |
| | | userPositionMapper.insert(userPosition); |
| | | iUserAssetsServices.availablebalanceChange(stock.getStockType(), user.getId(), EUserAssets.BUY, buyAmt.negate(), "", ""); |
| | | iUserAssetsServices.availablebalanceChange(stock.getStockType(), user.getId(), EUserAssets.HANDLING_CHARGE, orderFree, "", ""); |
| | | return ServerResponse.createBySuccessMsg("下单成功", request); |
| | | } |
| | | |
| | | |
| | |
| | | if (positionSn.contains("index")) { |
| | | UserIndexPosition userIndexPosition = userIndexPositionMapper.selectIndexPositionBySn(positionSn.replace("index", "")); |
| | | if (userIndexPosition == null) { |
| | | return ServerResponse.createByErrorMsg("指数持仓单不存在"); |
| | | return ServerResponse.createByErrorMsg("指数持仓单不存在", request); |
| | | } |
| | | if (profitTarget != null && profitTarget > 0) { |
| | | userIndexPosition.setProfitTargetPrice(BigDecimal.valueOf(profitTarget)); |
| | |
| | | if (stopTarget != null && stopTarget > 0) { |
| | | userIndexPosition.setStopTargetPrice(BigDecimal.valueOf(stopTarget)); |
| | | } |
| | | log.info("指数止盈线" + profitTarget + "-------指数止损线" + stopTarget); |
| | | update = this.userIndexPositionMapper.updateByPrimaryKeySelective(userIndexPosition); |
| | | } else { |
| | | UserPosition userPosition = this.userPositionMapper.findPositionBySn(positionSn); |
| | | |
| | | if (userPosition == null) { |
| | | return ServerResponse.createByErrorMsg("持仓记录不存在"); |
| | | return ServerResponse.createByErrorMsg("持仓记录不存在", request); |
| | | } |
| | | if (profitTarget != null && profitTarget > 0) { |
| | | userPosition.setProfitTargetPrice(BigDecimal.valueOf(profitTarget)); |
| | |
| | | update = this.userPositionMapper.updateByPrimaryKeySelective(userPosition); |
| | | } |
| | | if (update > 0) { |
| | | return ServerResponse.createBySuccessMsg("修改成功"); |
| | | return ServerResponse.createBySuccessMsg("修改成功", request); |
| | | } else { |
| | | return ServerResponse.createByErrorMsg("修改失败"); |
| | | return ServerResponse.createByErrorMsg("修改失败", request); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | @Transactional |
| | | public ServerResponse sell(String positionSn, int doType) throws Exception { |
| | | SiteSetting siteSetting = this.iSiteSettingService.getSiteSetting(); |
| | | if (siteSetting == null) { |
| | | log.error("平仓出错,网站设置表不存在"); |
| | | return ServerResponse.createByErrorMsg("Order failed, system setting error"); |
| | | } |
| | | SiteProduct siteProduct = iSiteProductService.getProductSetting(); |
| | | public ServerResponse sell(String positionSn, int doType) { |
| | | UserPosition userPosition = this.userPositionMapper.findPositionBySn(positionSn); |
| | | if (doType != 0) { |
| | | // if (userPosition.getStockGid().contains(EStockType.US.getCode())) { |
| | | // String am_begin = siteSetting.getTransAmBeginUs(); |
| | | // String am_end = siteSetting.getTransAmEndUs(); |
| | | // String pm_begin = siteSetting.getTransPmBeginUs(); |
| | | // String pm_end = siteSetting.getTransPmEndUs(); |
| | | // boolean am_flag = BuyAndSellUtils.isTransTime(am_begin, am_end); |
| | | // boolean pm_flag = BuyAndSellUtils.isTransTime(pm_begin, pm_end); |
| | | // if (!am_flag && !pm_flag) { |
| | | // return ServerResponse.createByErrorMsg("平仓失败,不在交易时段内"); |
| | | // } |
| | | // } else { |
| | | // String am_begin = siteSetting.getTransAmBegin(); |
| | | // String am_end = siteSetting.getTransAmEnd(); |
| | | // String pm_begin = siteSetting.getTransPmBegin(); |
| | | // String pm_end = siteSetting.getTransPmEnd(); |
| | | // boolean am_flag = BuyAndSellUtils.isTransTime(am_begin, am_end); |
| | | // boolean pm_flag = BuyAndSellUtils.isTransTime(pm_begin, pm_end); |
| | | // if (!am_flag && !pm_flag) { |
| | | // return ServerResponse.createByErrorMsg("Order failed,Out of trading hours"); |
| | | // } |
| | | // } |
| | | // if (siteProduct.getHolidayDisplay()) { |
| | | // return ServerResponse.createByErrorMsg("No trading on weekends or holidays!"); |
| | | // } |
| | | //判断股票是否在可交易时间段 |
| | | Boolean b = tradingHourService.timeCheck(); |
| | | if (!b) { |
| | | return ServerResponse.createByErrorMsg("Order failed, not in the stock trading session"); |
| | | } |
| | | |
| | | BigDecimal siitteBuyFee = iSiteSettingService.getSiteSetting().getBuyFee(); |
| | | Boolean b = tradingHourService.timeCheck(userPosition.getStockCode()); |
| | | if (!b) { |
| | | return ServerResponse.createByErrorMsg("订单失败,不在交易时间之内"); |
| | | } |
| | | |
| | | |
| | | if (userPosition == null) { |
| | | return ServerResponse.createByErrorMsg("Closing failed, order does not exist"); |
| | | return ServerResponse.createByErrorMsg("平仓失败,订单不存在"); |
| | | } |
| | | |
| | | User user = this.userMapper.selectById(userPosition.getUserId()); |
| | | if (user == null) { |
| | | return ServerResponse.createByErrorMsg("Closed position failed, user does not exist"); |
| | | return ServerResponse.createByErrorMsg("平仓失败,用户不存在"); |
| | | } |
| | | |
| | | /*实名认证开关开启*/ |
| | | if (siteProduct.getRealNameDisplay() && user.getIsLock().intValue() == 1) { |
| | | |
| | | return ServerResponse.createByErrorMsg("Closing failed, user is locked"); |
| | | |
| | | } |
| | | |
| | | |
| | | if (userPosition.getSellOrderId() != null) { |
| | | return ServerResponse.createByErrorMsg("Closing failed, this order is closed"); |
| | | return ServerResponse.createByErrorMsg("平仓失败, 订单已平仓"); |
| | | } |
| | | |
| | | if (1 == userPosition.getIsLock().intValue()) { |
| | | return ServerResponse.createByErrorMsg("this order is closed " + userPosition.getLockMsg()); |
| | | } |
| | | BigDecimal now_price; |
| | | Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code", userPosition.getStockCode())); |
| | | //股票卖出的 价格 数据源 |
| | | |
| | | StockListVO stockListVO = StockApi.getStockRealTime(stock); |
| | | now_price = new BigDecimal(stockListVO.getNowPrice()); |
| | | if (stockListVO.getNowPrice() == null) { |
| | | return ServerResponse.createByErrorMsg("Failed to close position, failed to obtain stock information"); |
| | | BigDecimal nowPrice = priceServices.getNowPrice(userPosition.getStockCode()); |
| | | if (nowPrice.compareTo(new BigDecimal("0")) != 1) { |
| | | return ServerResponse.createByErrorMsg("报价0,平仓失败,请稍后再试"); |
| | | } |
| | | if (now_price.compareTo(new BigDecimal("0")) != 1) { |
| | | log.error("股票 = {} 收到报价 = {}", userPosition.getStockName(), now_price); |
| | | return ServerResponse.createByErrorMsg("Quote 0, closing failed, please try again later"); |
| | | } |
| | | |
| | | userPosition.setSellOrderId(GeneratePosition.getPositionId()); |
| | | userPosition.setSellOrderPrice(now_price); |
| | | userPosition.setSellOrderPrice(nowPrice); |
| | | userPosition.setSellOrderTime(new Date()); |
| | | |
| | | BigDecimal sellOrderTotel = nowPrice.multiply(new BigDecimal(userPosition.getOrderNum())); |
| | | BigDecimal xsPrice = sellOrderTotel.multiply(siitteBuyFee); |
| | | userPositionMapper.updateById(userPosition); |
| | | userAssetsServices.availablebalanceChange(stock.getStockType(),userPosition.getUserId(),EUserAssets.CLOSE_POSITION_RETURN_SECURITY_DEPOSIT, |
| | | userPosition.getOrderTotalPrice(),"",""); |
| | | userAssetsServices.availablebalanceChange(stock.getStockType(),userPosition.getUserId(),EUserAssets.CLOSE_POSITION, |
| | | userPosition.getProfitAndLose() ,"",""); |
| | | return ServerResponse.createBySuccessMsg("Closed position successfully!"); |
| | | userAssetsServices.availablebalanceChange(stock.getStockType(), |
| | | userPosition.getUserId(), EUserAssets.CLOSE_POSITION_RETURN_SECURITY_DEPOSIT, |
| | | userPosition.getOrderTotalPrice(), "", ""); |
| | | userAssetsServices.availablebalanceChange(stock.getStockType(), |
| | | userPosition.getUserId(), EUserAssets.HANDLING_CHARGE, |
| | | xsPrice, "", ""); |
| | | |
| | | PositionProfitVO profitVO = UserPointUtil.getPositionProfitVO(userPosition, priceServices.getNowPrice(userPosition.getStockCode())); |
| | | userAssetsServices.availablebalanceChange(stock.getStockType(), userPosition.getUserId(), EUserAssets.CLOSE_POSITION, |
| | | profitVO.getAllProfitAndLose(), "", ""); |
| | | return ServerResponse.createBySuccessMsg("平仓成功!"); |
| | | } |
| | | |
| | | |
| | | @Transactional |
| | | public ServerResponse sell(String positionSn, int doType, HttpServletRequest request) { |
| | | UserPosition userPosition = this.userPositionMapper.findPositionBySn(positionSn); |
| | | // 手续费率 |
| | | BigDecimal siitteBuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.SELL_HANDLING_CHARGE.getCode()).getCValue()) ; |
| | | |
| | | UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<UserAssets>() |
| | | .eq(UserAssets::getUserId, userPosition.getUserId()) |
| | | .eq(UserAssets::getAccectType, "JP") |
| | | ); |
| | | if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ |
| | | return ServerResponse.createByErrorMsg("请先缴清待补资金", request); |
| | | } |
| | | Boolean b = tradingHourService.timeCheck(userPosition.getStockCode()); |
| | | if (!b) { |
| | | return ServerResponse.createByErrorMsg("订单失败,不在交易时间之内", request); |
| | | } |
| | | if(userPosition.getPositionType() == 3){ |
| | | StockDz stockDz = stockDzMapper.selectOne(new LambdaQueryWrapper<StockDz>().eq(StockDz::getStockCode, userPosition.getStockCode())); |
| | | LocalDateTime buyOrderLocalDateTime = LocalDateTime.ofInstant(userPosition.getBuyOrderTime().toInstant(), ZoneId.systemDefault()); |
| | | // 计算天数差 |
| | | long daysBetween = ChronoUnit.DAYS.between(buyOrderLocalDateTime, LocalDateTime.now()); |
| | | if(daysBetween < stockDz.getPeriod()){ |
| | | return ServerResponse.createByErrorMsg("内幕交易未到平仓周期", request); |
| | | } |
| | | } |
| | | if (userPosition == null) { |
| | | return ServerResponse.createByErrorMsg("平仓失败,订单不存在", request); |
| | | } |
| | | User user = this.userMapper.selectById(userPosition.getUserId()); |
| | | if (user == null) { |
| | | return ServerResponse.createByErrorMsg("平仓失败,用户不存在", request); |
| | | } |
| | | if (userPosition.getSellOrderId() != null) { |
| | | return ServerResponse.createByErrorMsg("平仓失败, 订单已平仓", request); |
| | | } |
| | | if (1 == userPosition.getIsLock().intValue()) { |
| | | return ServerResponse.createByErrorMsg("this order is closed " + userPosition.getLockMsg()); |
| | | } |
| | | Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code", userPosition.getStockCode())); |
| | | if (!priceServices.isLimitDownSell(stock.getStockCode())) { |
| | | return ServerResponse.createByErrorMsg("股票跌停,无法平仓", request); |
| | | } |
| | | BigDecimal nowPrice = priceServices.getNowPrice(userPosition.getStockCode()); |
| | | if (nowPrice.compareTo(new BigDecimal("0")) != 1) { |
| | | return ServerResponse.createByErrorMsg("报价0,平仓失败,请稍后再试", request); |
| | | } |
| | | userPosition.setSellOrderId(GeneratePosition.getPositionId()); |
| | | userPosition.setSellOrderPrice(nowPrice); |
| | | userPosition.setSellOrderTime(new Date()); |
| | | |
| | | BigDecimal sellOrderTotel = nowPrice.multiply(new BigDecimal(userPosition.getOrderNum())); |
| | | BigDecimal xsPrice = sellOrderTotel.multiply(siitteBuyFee); |
| | | userPositionMapper.updateById(userPosition); |
| | | userAssetsServices.availablebalanceChange(stock.getStockType(), |
| | | userPosition.getUserId(), |
| | | EUserAssets.CLOSE_POSITION_RETURN_SECURITY_DEPOSIT, |
| | | userPosition.getOrderTotalPrice(), "", ""); |
| | | userAssetsServices.availablebalanceChange(stock.getStockType(), |
| | | userPosition.getUserId(), EUserAssets.HANDLING_CHARGE, |
| | | xsPrice, "", ""); |
| | | |
| | | PositionProfitVO profitVO = UserPointUtil.getPositionProfitVO(userPosition, |
| | | priceServices.getNowPrice(userPosition.getStockCode())); |
| | | |
| | | userAssetsServices.availablebalanceChange(stock.getStockType(), |
| | | userPosition.getUserId(), EUserAssets.CLOSE_POSITION, |
| | | profitVO.getAllProfitAndLose(), "", ""); |
| | | return ServerResponse.createBySuccessMsg("平仓成功!", request); |
| | | } |
| | | |
| | | @Transactional |
| | | @Override |
| | | public ServerResponse allSell(HttpServletRequest request,String stockType) throws Exception{ |
| | | public ServerResponse allSell(HttpServletRequest request, String stockType) throws Exception { |
| | | //判断股票是否在可交易时间段 |
| | | Boolean b = tradingHourService.timeCheck(); |
| | | if (!b) { |
| | | return ServerResponse.createByErrorMsg("Order failed, not in the stock trading session"); |
| | | } |
| | | User user = iUserService.getCurrentUser(request); |
| | | if(user == null){ |
| | | return ServerResponse.createByErrorMsg("Please login"); |
| | | } |
| | | User user = iUserService.getCurrentUser(request); |
| | | QueryWrapper<UserPosition> queryWrapper = new QueryWrapper<>(); |
| | | queryWrapper.eq("user_id",user.getId()); |
| | | queryWrapper.eq("stock_gid",stockType); |
| | | queryWrapper.eq("user_id", user.getId()); |
| | | queryWrapper.isNull("sell_order_id"); |
| | | |
| | | List<UserPosition> userPositionList = userPositionMapper.selectList(queryWrapper); |
| | | for (int i = 0; i < userPositionList.size(); i++) { |
| | | sell(userPositionList.get(i).getPositionSn(),0); |
| | | sell(userPositionList.get(i).getPositionSn(), 0); |
| | | } |
| | | return ServerResponse.createBySuccessMsg("Closed position successfully!"); |
| | | return ServerResponse.createBySuccessMsg("平仓成功!"); |
| | | } |
| | | |
| | | //用户追加保证金操作 |
| | |
| | | return ServerResponse.createByErrorMsg("删除失败"); |
| | | } |
| | | |
| | | @Override |
| | | public UserPositionVO findByPostionSn(String positionSn) { |
| | | UserPosition userPosition = userPositionMapper.selectOne(new QueryWrapper<UserPosition>().eq("position_sn", positionSn)); |
| | | if (userPosition == null) { |
| | | return null; |
| | | } |
| | | |
| | | return UserPointUtil.assembleUserPositionVO(userPosition, priceServices.getNowPrice(userPosition.getStockCode())); |
| | | } |
| | | |
| | | public ServerResponse findMyPositionByCodeAndSpell(String stockCode, String stockSpell, |
| | | Integer state, HttpServletRequest request, |
| | | int pageNum, int pageSize, String stockType) { |
| | | User user = this.iUserService.getCurrentUser(request); |
| | | |
| | | PageHelper.startPage(pageNum, pageSize); |
| | | List<UserPosition> userPositions; |
| | | |
| | | |
| | | List<UserPosition> userPositions = this.userPositionMapper. |
| | | |
| | | userPositions = userPositionMapper. |
| | | findMyPositionByCodeAndSpell(user.getId(), |
| | | stockCode, stockSpell, |
| | | state, stockType); |
| | | |
| | | |
| | | List<UserPositionVO> userPositionVOS = Lists.newArrayList(); |
| | | if (userPositions.size() > 0) { |
| | | for (UserPosition position : userPositions) { |
| | | UserPositionVO userPositionVO = assembleUserPositionVO(position); |
| | | UserPositionVO userPositionVO = UserPointUtil.assembleUserPositionVO(position, priceServices.getNowPrice(position.getStockCode())); |
| | | userPositionVO.setOrderTotalPrice(userPositionVO.getOrderTotalPrice().multiply(new BigDecimal(userPositionVO.getOrderLever()))); |
| | | userPositionVO.setProfitAndLose(userPositionVO.getProfitAndLose().multiply(new BigDecimal(userPositionVO.getOrderLever()))); |
| | | userPositionVOS.add(userPositionVO); |
| | | } |
| | | } |
| | |
| | | BigDecimal allProfitAndLose = new BigDecimal("0"); |
| | | BigDecimal allFreezAmt = new BigDecimal("0"); |
| | | for (UserPosition position : userPositions) { |
| | | Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code", position.getStockCode())); |
| | | StockListVO stockListVO = StockApi.getStockRealTime( |
| | | stock); |
| | | if (stockListVO.getNowPrice() == null) { |
| | | stockListVO.setNowPrice("0"); |
| | | } |
| | | BigDecimal nowPrice = new BigDecimal(stockListVO.getNowPrice()); |
| | | if (nowPrice.compareTo(new BigDecimal("0")) != 0) { |
| | | BigDecimal buyPrice = position.getBuyOrderPrice(); |
| | | BigDecimal subPrice = nowPrice.subtract(buyPrice); |
| | | BigDecimal profit_and_lose = subPrice.multiply(new BigDecimal(position.getOrderNum().intValue())); |
| | | if ("买跌".equals(position.getOrderDirection())) { |
| | | profit_and_lose = profit_and_lose.negate(); |
| | | } |
| | | BigDecimal total_fee = position.getOrderFee().add(position.getOrderSpread()).add(position.getOrderStayFee()); |
| | | BigDecimal position_profit = profit_and_lose.subtract(total_fee); |
| | | allProfitAndLose = allProfitAndLose.add(position_profit); |
| | | BigDecimal position_freez = position.getOrderTotalPrice().divide(new BigDecimal(position.getOrderLever().intValue()), 2, 4); |
| | | allFreezAmt = allFreezAmt.add(position_freez).add(position.getMarginAdd()); |
| | | continue; |
| | | } |
| | | log.info("查询所有持仓单的总盈亏,现价返回0,当前为集合竞价"); |
| | | } |
| | | //加上分仓交易保证金 |
| | | List<FundsApply> fundsApplyList = fundsApplyMapper.getUserMarginList(userId); |
| | | for (FundsApply fundsApply : fundsApplyList) { |
| | | allFreezAmt = allFreezAmt.add(fundsApply.getMargin()); |
| | | BigDecimal nowPrice = priceServices.getNowPrice(position.getStockCode()); |
| | | PositionProfitVO positionProfitVO = UserPointUtil.getPositionProfitVO(position, nowPrice); |
| | | allProfitAndLose.add(positionProfitVO.getAllProfitAndLose()); |
| | | allFreezAmt.add(positionProfitVO.getProfitAndLose()); |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | @Override |
| | | public PositionVO findUserPositionAllProfitAndLose(Integer userId, String stockType) { |
| | | List<UserPosition> userPositions = this.userPositionMapper.findPositionByUserIdAndSellId(userId, stockType); |
| | | |
| | | List<UserPosition> userPositions = userPositionMapper.findPositionByUserIdAndSellId(userId, stockType); |
| | | BigDecimal allProfitAndLose = new BigDecimal("0"); |
| | | BigDecimal allFreezAmt = new BigDecimal("0"); |
| | | for (UserPosition position : userPositions) { |
| | | Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code", position.getStockCode())); |
| | | StockListVO stockListVO = StockApi.getStockRealTime( |
| | | stock); |
| | | if (stockListVO.getNowPrice() == null) { |
| | | stockListVO.setNowPrice("0"); |
| | | } |
| | | BigDecimal nowPrice = new BigDecimal(stockListVO.getNowPrice()); |
| | | if (nowPrice.compareTo(new BigDecimal("0")) != 0) { |
| | | BigDecimal buyPrice = position.getBuyOrderPrice(); |
| | | BigDecimal subPrice = nowPrice.subtract(buyPrice); |
| | | BigDecimal profit_and_lose = subPrice.multiply(new BigDecimal(position.getOrderNum().intValue())); |
| | | if ("买跌".equals(position.getOrderDirection())) { |
| | | profit_and_lose = profit_and_lose.negate(); |
| | | } |
| | | BigDecimal total_fee = position.getOrderFee().add(position.getOrderSpread()).add(position.getOrderStayFee()); |
| | | BigDecimal position_profit = profit_and_lose.subtract(total_fee); |
| | | allProfitAndLose = allProfitAndLose.add(position_profit); |
| | | BigDecimal position_freez = position.getOrderTotalPrice().divide(new BigDecimal(position.getOrderLever().intValue()), 2, 4); |
| | | allFreezAmt = allFreezAmt.add(position_freez).add(position.getMarginAdd()); |
| | | continue; |
| | | } |
| | | log.info("查询所有持仓单的总盈亏,现价返回0,当前为集合竞价"); |
| | | BigDecimal nowPrice = priceServices.getNowPrice(position.getStockCode()); |
| | | PositionProfitVO positionProfitVO = UserPointUtil.getPositionProfitVO(position, nowPrice); |
| | | allProfitAndLose.add(positionProfitVO.getAllProfitAndLose()); |
| | | allFreezAmt.add(positionProfitVO.getProfitAndLose()); |
| | | } |
| | | //加上分仓交易保证金 |
| | | List<FundsApply> fundsApplyList = fundsApplyMapper.getUserMarginList(userId); |
| | | for (FundsApply fundsApply : fundsApplyList) { |
| | | allFreezAmt = allFreezAmt.add(fundsApply.getMargin()); |
| | | } |
| | | |
| | | |
| | | PositionVO positionVO = new PositionVO(); |
| | | positionVO.setAllProfitAndLose(allProfitAndLose); |
| | | positionVO.setAllFreezAmt(allFreezAmt); |
| | |
| | | return transNum; |
| | | } |
| | | |
| | | public ServerResponse listByAgent(Integer positionType, Integer state, Integer userId, Integer agentId, String positionSn, String beginTime, String endTime, HttpServletRequest request, int pageNum, int pageSize) { |
| | | 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); |
| | | |
| | | |
| | |
| | | PageHelper.startPage(pageNum, pageSize); |
| | | |
| | | |
| | | List<UserPosition> userPositions = this.userPositionMapper.listByAgent(positionType, state, userId, searchId, positionSn, begin_time, end_time); |
| | | List<UserPosition> userPositions = this.userPositionMapper.listByAgent(positionType, state, |
| | | userId, searchId, positionSn, begin_time, end_time,null); |
| | | |
| | | List<AgentPositionVO> agentPositionVOS = Lists.newArrayList(); |
| | | for (UserPosition position : userPositions) { |
| | |
| | | } |
| | | |
| | | |
| | | List<UserPosition> userPositions = this.userPositionMapper.listByAgent(positionType, Integer.valueOf(1), null, agentId, null, begin_time, end_time); |
| | | List<UserPosition> userPositions = this.userPositionMapper.listByAgent(positionType, Integer.valueOf(1), |
| | | null, agentId, null, begin_time, end_time,null); |
| | | |
| | | |
| | | BigDecimal order_fee_amt = new BigDecimal("0"); |
| | |
| | | return ServerResponse.createBySuccess(agentIncomeVO); |
| | | } |
| | | |
| | | public ServerResponse listByAdmin(Integer agentId, Integer positionType, Integer state, Integer userId, String positionSn, String beginTime, String endTime, int pageNum, int pageSize) { |
| | | public ServerResponse listByAdmin(Integer agentId, Integer positionType, Integer state, Integer userId, String positionSn, String beginTime, String endTime, int pageNum, int pageSize,String phone) { |
| | | PageHelper.startPage(pageNum, pageSize); |
| | | |
| | | |
| | |
| | | if (StringUtils.isNotBlank(endTime)) { |
| | | end_time = DateTimeUtil.searchStrToTimestamp(endTime); |
| | | } |
| | | List<UserPosition> userPositions = this.userPositionMapper.listByAgent(positionType, state, userId, agentId, positionSn, begin_time, end_time); |
| | | List<UserPosition> userPositions = this.userPositionMapper.listByAgent(positionType, state, userId, agentId, positionSn, begin_time, end_time,phone); |
| | | List<AdminPositionVO> adminPositionVOS = Lists.newArrayList(); |
| | | for (UserPosition position : userPositions) { |
| | | AdminPositionVO adminPositionVO = assembleAdminPositionVO(position); |
| | |
| | | log.error("下单出错,网站设置表不存在"); |
| | | return ServerResponse.createByErrorMsg("下单失败,系统设置错误"); |
| | | } |
| | | |
| | | |
| | | |
| | | BigDecimal buy_amt = (new BigDecimal(buyPrice)).multiply(new BigDecimal(buyNum.intValue())); |
| | |
| | | |
| | | adminPositionVO.setStockPlate(position.getStockPlate()); |
| | | |
| | | PositionProfitVO positionProfitVO = getPositionProfitVO(position); |
| | | PositionProfitVO positionProfitVO = UserPointUtil.getPositionProfitVO(position, priceServices.getNowPrice(position.getStockCode())); |
| | | adminPositionVO.setProfitAndLose(positionProfitVO.getProfitAndLose()); |
| | | adminPositionVO.setAllProfitAndLose(positionProfitVO.getAllProfitAndLose()); |
| | | adminPositionVO.setNow_price(positionProfitVO.getNowPrice()); |
| | |
| | | |
| | | agentPositionVO.setStockPlate(position.getStockPlate()); |
| | | |
| | | PositionProfitVO positionProfitVO = getPositionProfitVO(position); |
| | | PositionProfitVO positionProfitVO = UserPointUtil.getPositionProfitVO(position, priceServices.getNowPrice(position.getStockCode())); |
| | | agentPositionVO.setProfitAndLose(positionProfitVO.getProfitAndLose()); |
| | | agentPositionVO.setAllProfitAndLose(positionProfitVO.getAllProfitAndLose()); |
| | | agentPositionVO.setNow_price(positionProfitVO.getNowPrice()); |
| | | |
| | | |
| | | return agentPositionVO; |
| | | } |
| | | |
| | | private UserPositionVO assembleUserPositionVO(UserPosition position) { |
| | | UserPositionVO userPositionVO = new UserPositionVO(); |
| | | |
| | | userPositionVO.setId(position.getId()); |
| | | userPositionVO.setPositionType(position.getPositionType()); |
| | | userPositionVO.setPositionSn(position.getPositionSn()); |
| | | userPositionVO.setUserId(position.getUserId()); |
| | | userPositionVO.setNickName(position.getNickName()); |
| | | userPositionVO.setAgentId(position.getAgentId()); |
| | | userPositionVO.setStockName(position.getStockName()); |
| | | userPositionVO.setStockCode(position.getStockCode()); |
| | | userPositionVO.setStockGid(position.getStockGid()); |
| | | userPositionVO.setStockSpell(position.getStockSpell()); |
| | | userPositionVO.setBuyOrderId(position.getBuyOrderId()); |
| | | userPositionVO.setBuyOrderTime(position.getBuyOrderTime()); |
| | | userPositionVO.setBuyOrderPrice(position.getBuyOrderPrice()); |
| | | userPositionVO.setSellOrderId(position.getSellOrderId()); |
| | | userPositionVO.setSellOrderTime(position.getSellOrderTime()); |
| | | userPositionVO.setSellOrderPrice(position.getSellOrderPrice()); |
| | | userPositionVO.setProfitTargetPrice(position.getProfitTargetPrice()); |
| | | userPositionVO.setStopTargetPrice(position.getStopTargetPrice()); |
| | | userPositionVO.setOrderDirection(position.getOrderDirection()); |
| | | userPositionVO.setOrderNum(position.getOrderNum()); |
| | | userPositionVO.setOrderLever(position.getOrderLever()); |
| | | userPositionVO.setOrderTotalPrice(position.getOrderTotalPrice()); |
| | | userPositionVO.setOrderFee(position.getOrderFee()); |
| | | userPositionVO.setOrderSpread(position.getOrderSpread()); |
| | | userPositionVO.setOrderStayFee(position.getOrderStayFee()); |
| | | userPositionVO.setOrderStayDays(position.getOrderStayDays()); |
| | | userPositionVO.setMarginAdd(position.getMarginAdd()); |
| | | |
| | | userPositionVO.setStockPlate(position.getStockPlate()); |
| | | userPositionVO.setSpreadRatePrice(position.getSpreadRatePrice()); |
| | | |
| | | PositionProfitVO positionProfitVO = getPositionProfitVO(position); |
| | | userPositionVO.setProfitAndLose(positionProfitVO.getProfitAndLose()); |
| | | userPositionVO.setAllProfitAndLose(positionProfitVO.getAllProfitAndLose()); |
| | | userPositionVO.setNow_price(positionProfitVO.getNowPrice()); |
| | | return userPositionVO; |
| | | } |
| | | |
| | | public PositionProfitVO getPositionProfitVO(UserPosition position) { |
| | | BigDecimal profitAndLose = new BigDecimal("0"); |
| | | BigDecimal allProfitAndLose = new BigDecimal("0"); |
| | | String nowPrice = ""; |
| | | |
| | | if (position.getSellOrderId() != null) { |
| | | |
| | | BigDecimal subPrice = position.getSellOrderPrice().subtract(position.getBuyOrderPrice()); |
| | | profitAndLose = subPrice.multiply(new BigDecimal(position.getOrderNum().intValue())); |
| | | if ("买跌".equals(position.getOrderDirection())) { |
| | | profitAndLose = profitAndLose.negate(); |
| | | } |
| | | allProfitAndLose = profitAndLose.subtract(position.getOrderFee()).subtract(position.getOrderSpread()).subtract(position.getOrderStayFee()).subtract(position.getSpreadRatePrice()); |
| | | } else { |
| | | StockListVO stockListVO = new StockListVO(); |
| | | StockCoin stockCoin = new StockCoin(); |
| | | Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code", position.getStockCode())); |
| | | stockListVO = StockApi.getStockRealTime(stock); |
| | | nowPrice = stockListVO.getNowPrice(); |
| | | if (nowPrice == null) { |
| | | nowPrice = String.valueOf(0); |
| | | } |
| | | BigDecimal subPrice = (new BigDecimal(nowPrice)).subtract(position.getBuyOrderPrice()); |
| | | profitAndLose = subPrice.multiply(new BigDecimal(position.getOrderNum().intValue())); |
| | | if ("买跌".equals(position.getOrderDirection())) { |
| | | profitAndLose = profitAndLose.negate(); |
| | | } |
| | | //总盈亏= 浮动盈亏 – 手续费 – 印花税 – 留仓费 – 点差费 |
| | | allProfitAndLose = profitAndLose.subtract(position.getOrderFee()).subtract(position.getOrderSpread()).subtract(position.getOrderStayFee()).subtract(position.getSpreadRatePrice()); |
| | | } |
| | | PositionProfitVO positionProfitVO = new PositionProfitVO(); |
| | | positionProfitVO.setProfitAndLose(profitAndLose); |
| | | positionProfitVO.setAllProfitAndLose(allProfitAndLose); |
| | | positionProfitVO.setNowPrice(nowPrice); |
| | | return positionProfitVO; |
| | | } |
| | | |
| | | |
| | |
| | | List<UserPositionVO> userPositionVOS = Lists.newArrayList(); |
| | | if (userPositions.size() > 0) { |
| | | for (UserPosition position : userPositions) { |
| | | UserPositionVO userPositionVO = assembleUserPositionVO(position); |
| | | UserPositionVO userPositionVO = UserPointUtil.assembleUserPositionVO(position, priceServices.getNowPrice(position.getStockCode())); |
| | | userPositionVOS.add(userPositionVO); |
| | | } |
| | | } |
| | |
| | | List<UserPositionVO> userPositionVOS = Lists.newArrayList(); |
| | | UserPositionVO userPositionVO = null; |
| | | if (position != null) { |
| | | userPositionVO = assembleUserPositionVO(position); |
| | | userPositionVO = UserPointUtil.assembleUserPositionVO(position, priceServices.getNowPrice(position.getStockCode())); |
| | | } |
| | | userPositionVOS.add(userPositionVO); |
| | | |
| | |
| | | if (userStockSubscribe == null) { |
| | | return ServerResponse.createByErrorMsg("无该申购记录"); |
| | | } |
| | | StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper<StockSubscribe>().eq("code", userStockSubscribe.getNewCode())); |
| | | StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper<StockSubscribe>().eq("code", userStockSubscribe.getNewCode()).eq("type",userStockSubscribe.getType())); |
| | | if (userStockSubscribe == null) { |
| | | return ServerResponse.createByErrorMsg("该新股不存在"); |
| | | } |
| | | if (userStockSubscribe.getStatus() == 4 || userStockSubscribe.getStatus() == 3 && stockSubscribe.getType() == 2) { |
| | | |
| | | // String sinaStock = SinaStockApi.getSinaStock(stockSubscribe.getStockType()+userStockSubscribe.getNewCode()); |
| | | // String[] arrayOfString = sinaStock.split(","); |
| | | // if (arrayOfString.length < 10){ |
| | | // return ServerResponse.createByErrorMsg("数据源无该新股数据,转持仓失败"); |
| | | // } |
| | | Stock stock = stockMapper.selectOne(new LambdaQueryWrapper<Stock>().eq(Stock::getStockCode, userStockSubscribe.getNewCode())); |
| | | if(null == stock){ |
| | | return ServerResponse.createByErrorMsg("该新股不存在"); |
| | | } |
| | | UserPosition userPosition = new UserPosition(); |
| | | userPosition.setPositionType(1); |
| | | userPosition.setPositionSn(KeyUtils.getUniqueKey()); |
| | | userPosition.setUserId(userStockSubscribe.getUserId()); |
| | | userPosition.setNickName(userStockSubscribe.getRealName()); |
| | | userPosition.setAgentId(userStockSubscribe.getAgentId()); |
| | | userPosition.setStockCode(userStockSubscribe.getNewCode()); |
| | | userPosition.setStockCode(stock.getStockCode()); |
| | | userPosition.setStockSpell(stock.getStockSpell()); |
| | | userPosition.setStockName(userStockSubscribe.getNewName()); |
| | | userPosition.setStockGid(stockSubscribe.getStockType() + userStockSubscribe.getNewCode()); |
| | | |
| | | StringBuffer gid = new StringBuffer(); |
| | | gid.append(stockSubscribe.getStockType()!=null?stockSubscribe.getStockType():""); |
| | | gid.append(userStockSubscribe.getNewCode()!=null?userStockSubscribe.getNewCode():"stock code invaild"); |
| | | userPosition.setStockGid(gid.toString()); |
| | | userPosition.setBuyOrderId(GeneratePosition.getPositionId()); |
| | | userPosition.setBuyOrderTime(new Date()); |
| | | userPosition.setBuyOrderPrice(userStockSubscribe.getBuyPrice()); |
| | |
| | | userPosition.setIsLock(Integer.valueOf(0)); |
| | | |
| | | |
| | | userPosition.setOrderLever(10); |
| | | userPosition.setOrderLever(1); |
| | | |
| | | |
| | | //递延费特殊处理 |
| | |
| | | log.info("用户购买印花税(配资后总资金 * 百分比) = {}", buy_yhs_amt); |
| | | userPosition.setOrderSpread(buy_yhs_amt); |
| | | |
| | | // SiteSpread siteSpread = iSiteSpreadService.findSpreadRateOne(new BigDecimal(stock_crease), buy_amt, stock.getStockCode(), now_price); |
| | | // BigDecimal spread_rate_amt = new BigDecimal("0"); |
| | | // if(siteSpread != null){ |
| | | // spread_rate_amt = buy_amt.multiply(siteSpread.getSpreadRate()).setScale(2, 4); |
| | | // log.info("用户购买点差费(配资后总资金 * 百分比{}) = {}", siteSpread.getSpreadRate(), spread_rate_amt); |
| | | // } else{ |
| | | // log.info("用户购买点差费(配资后总资金 * 百分比{}) = {}", "设置异常", spread_rate_amt); |
| | | // } |
| | | BigDecimal spread_rate_amt = new BigDecimal(0); |
| | | userPosition.setSpreadRatePrice(spread_rate_amt); |
| | | |
| | |
| | | |
| | | int ret = 0; |
| | | ret = this.userPositionMapper.insert(userPosition); |
| | | |
| | | UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(stock.getStockType(), userPosition.getUserId()); |
| | | if(null == userAssets){ |
| | | return ServerResponse.createByErrorMsg("新股转持仓失败"); |
| | | } |
| | | userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(userPosition.getOrderTotalPrice())); |
| | | userAssets.setFreezeMoney(userAssets.getFreezeMoney()!=null?userAssets.getFreezeMoney().setScale(2,BigDecimal.ROUND_UP):null); |
| | | userAssetsMapper.updateById(userAssets); |
| | | if (ret > 0) { |
| | | userStockSubscribe.setStatus(5); |
| | | userStockSubscribeMapper.update1(userStockSubscribe); |
| | | if (userStockSubscribe.getType() == 1 || userStockSubscribe.getType() == 2) { |
| | | User user = userMapper.selectById(userStockSubscribe.getUserId()); |
| | | ret = userMapper.updateByPrimaryKey(user); |
| | | ret = userMapper.updateById(user); |
| | | } |
| | | if (ret > 0) { |
| | | return ServerResponse.createBySuccessMsg("新股转持仓成功"); |
| | |
| | | |
| | | BigDecimal ztRate = chaPrice.multiply(new BigDecimal("100")).divide(zsPrice, 2, 4); |
| | | |
| | | log.info("当前涨跌幅 = {} % , 涨停幅度 = {} %", Double.valueOf(stock_crease), ztRate); |
| | | // if ((new BigDecimal(String.valueOf(stock_crease))).compareTo(ztRate) == 0 && buyType |
| | | // .intValue() == 0) { |
| | | // return ServerResponse.createByErrorMsg("当前股票已涨停不能买涨"); |
| | | // } |
| | | |
| | | |
| | | // if (stock.getStockPlate() == null || StringUtils.isEmpty(stock.getStockPlate())) { |
| | | // |
| | | // int maxcrease = siteSetting.getCreaseMaxPercent().intValue(); |
| | | // if (stock_crease > 0.0D && |
| | | // stock_crease >= maxcrease) { |
| | | // return ServerResponse.createByErrorMsg("下单失败,股票当前涨幅:" + stock_crease + ",大于最大涨幅:" + maxcrease); |
| | | // } |
| | | // |
| | | // |
| | | // if (stock_crease < 0.0D && |
| | | // -stock_crease > maxcrease) { |
| | | // return ServerResponse.createByErrorMsg("下单失败,股票当前跌幅:" + stock_crease + ",大于最大跌幅:" + maxcrease); |
| | | // |
| | | // } |
| | | // |
| | | // } else if ("创业".equals(stock.getStockPlate())) { |
| | | // |
| | | // int maxcrease = siteSetting.getCyCreaseMaxPercent().intValue(); |
| | | // if (stock_crease > 0.0D && |
| | | // stock_crease >= maxcrease) { |
| | | // return ServerResponse.createByErrorMsg("下单失败,创业股当前涨幅:" + stock_crease + ",大于最大涨幅:" + maxcrease); |
| | | // } |
| | | // |
| | | // |
| | | // if (stock_crease < 0.0D && |
| | | // -stock_crease > maxcrease) { |
| | | // return ServerResponse.createByErrorMsg("下单失败,创业股当前跌幅:" + stock_crease + ",大于最大跌幅:" + maxcrease); |
| | | // } |
| | | // } else { |
| | | // |
| | | // int maxcrease = siteSetting.getKcCreaseMaxPercent().intValue(); |
| | | // if (stock_crease > 0.0D && |
| | | // stock_crease >= maxcrease) { |
| | | // return ServerResponse.createByErrorMsg("下单失败,科创股当前涨幅:" + stock_crease + ",大于最大涨幅:" + maxcrease); |
| | | // } |
| | | // |
| | | // |
| | | // if (stock_crease < 0.0D && |
| | | // -stock_crease > maxcrease) { |
| | | // return ServerResponse.createByErrorMsg("下单失败,科创股当前跌幅:" + stock_crease + ",大于最大跌幅:" + maxcrease); |
| | | // } |
| | | // } |
| | | |
| | | |
| | | ServerResponse serverResponse = this.iStockService.selectRateByDaysAndStockCode(stock |
| | | .getStockCode(), siteSetting.getStockDays().intValue()); |
| | |
| | | } |
| | | |
| | | |
| | | //BigDecimal buy_amt = now_price.multiply(new BigDecimal(buyNum.intValue())).divide(new BigDecimal(lever.intValue())).setScale(2, 4); |
| | | BigDecimal buy_amt = now_price.multiply(new BigDecimal(buyNum.intValue())); |
| | | |
| | | |
| | | //BigDecimal buy_amt_autual = now_price.multiply(new BigDecimal(buyNum.intValue())).divide(new BigDecimal(lever.intValue()), 2, 4); |
| | | BigDecimal buy_amt_autual = buy_amt.divide(new BigDecimal(lever.intValue()), 2, 4); |
| | | |
| | | |
| | |
| | | */ |
| | | @Transactional |
| | | public ServerResponse buyDz(String stockCode, String password, Integer num, HttpServletRequest request) throws Exception { |
| | | |
| | | /*实名认证开关开启*/ |
| | | SiteProduct siteProduct = iSiteProductService.getProductSetting(); |
| | | User user = this.iUserService.getCurrentRefreshUser(request); |
| | | if (siteProduct.getRealNameDisplay() && (StringUtils.isBlank(user.getRealName()) || StringUtils.isBlank(user.getIdCard()))) { |
| | | |
| | | if (siteProduct.getRealNameDisplay() && user.getIsActive() != 2) { |
| | | return ServerResponse.createByErrorMsg("Order failed, please first real name authentication"); |
| | | } |
| | | log.info("用户 {} 下单,股票code = {} ,数量 = {}", new Object[]{user |
| | | .getId(), stockCode, num}); |
| | | if (siteProduct.getRealNameDisplay() && user.getIsLock().intValue() == 1) { |
| | | return ServerResponse.createByErrorMsg("Order failed, account has been locked"); |
| | | } |
| | | |
| | | SiteSetting siteSetting = this.iSiteSettingService.getSiteSetting(); |
| | | if (siteSetting == null) { |
| | | log.error("下单出错,网站设置表不存在"); |
| | | return ServerResponse.createByErrorMsg("下Order failed, system setting error"); |
| | | UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("JP", user.getId()); |
| | | if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ |
| | | return ServerResponse.createByErrorMsg("请先缴清待补资金", request); |
| | | } |
| | | StockDz stockDz = null; |
| | | stockDz = this.stockDzMapper.selectOne(new QueryWrapper<StockDz>().eq("stock_code", stockCode)); |
| | | String am_begin = siteSetting.getTransAmBegin(); |
| | | String am_end = siteSetting.getTransAmEnd(); |
| | | String pm_begin = siteSetting.getTransPmBegin(); |
| | | String pm_end = siteSetting.getTransPmEnd(); |
| | | boolean am_flag = BuyAndSellUtils.isTransTime(am_begin, am_end); |
| | | boolean pm_flag = BuyAndSellUtils.isTransTime(pm_begin, pm_end); |
| | | log.info("是否在上午交易时间 = {} 是否在下午交易时间 = {}", Boolean.valueOf(am_flag), Boolean.valueOf(pm_flag)); |
| | | |
| | | if (!am_flag && !pm_flag) { |
| | | return ServerResponse.createByErrorMsg("Order failed, out of trading hours"); |
| | | } |
| | | if (siteProduct.getHolidayDisplay()) { |
| | | return ServerResponse.createByErrorMsg("No trading on weekends or holidays!"); |
| | | } |
| | | |
| | | StockDz stockDz = this.stockDzMapper.selectOne(new QueryWrapper<StockDz>().eq("stock_code", stockCode)); |
| | | if (!Objects.equals(stockDz.getPassword(), password)) { |
| | | return ServerResponse.createByErrorMsg("Order failed, key error"); |
| | | return ServerResponse.createByErrorMsg("密码错误", request); |
| | | } |
| | | |
| | | if (stockDz.getIsLock().intValue() != 0) { |
| | | return ServerResponse.createByErrorMsg("Order failed, shares cannot be traded at present"); |
| | | if (stockDz.getIsLock() != 0) { |
| | | return ServerResponse.createByErrorMsg("股票被锁定,不能购买", request); |
| | | } |
| | | |
| | | List dbPosition = findPositionByStockCodeAndTimes(siteSetting.getBuySameTimes().intValue(), stockDz.getStockCode(), user.getId()); |
| | | if (dbPosition.size() >= siteSetting.getBuySameNums().intValue()) { |
| | | return ServerResponse.createByErrorMsg("Frequent trading," + siteSetting.getBuySameTimes() + "Hold no more than one stock within a minute" + siteSetting |
| | | .getBuySameNums() + "article"); |
| | | } |
| | | |
| | | Integer transNum = findPositionNumByTimes(siteSetting.getBuyNumTimes().intValue(), user.getId()); |
| | | if (transNum.intValue() / 100 >= siteSetting.getBuyNumLots().intValue()) { |
| | | return ServerResponse.createByErrorMsg("Frequent trading," + siteSetting |
| | | .getBuyNumTimes() + "No more than a minute" + siteSetting.getBuyNumLots() + "hand"); |
| | | } |
| | | |
| | | if (num < stockDz.getStockNum().intValue()) { |
| | | return ServerResponse.createByErrorMsg("Order failed, the minimum quantity purchased is" + stockDz.getStockNum() + "stocks"); |
| | | } |
| | | if (num > siteSetting.getBuyMaxNum()) { |
| | | return ServerResponse.createByErrorMsg("Order failed, purchase quantity is greater than" + siteSetting.getBuyMaxNum() + "stocks"); |
| | | } |
| | | BigDecimal now_price; |
| | | StockListVO stockListVO = new StockListVO(); |
| | | //价格处理 |
| | | Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code", stockDz.getStockCode())); |
| | | stockListVO = StockApi.getStockRealTime(stock); |
| | | now_price = new BigDecimal(stockListVO.getNowPrice()).multiply(stockDz.getDiscount()); |
| | | |
| | | if (now_price.compareTo(new BigDecimal("0")) == 0) { |
| | | return ServerResponse.createByErrorMsg("Quote 0, please try again later"); |
| | | if(stockDz.getStartTime().getTime() > new Date().getTime() || stockDz.getEndTime().getTime() < new Date().getTime()){ |
| | | return ServerResponse.createByErrorMsg("不在内幕交易时间之内", request); |
| | | } |
| | | BigDecimal nowPrice = priceServices.getNowPrice(stockCode).multiply(stockDz.getDiscount()); |
| | | |
| | | |
| | | double stock_crease = stockListVO.getHcrate().doubleValue(); |
| | | |
| | | |
| | | BigDecimal maxRisePercent = new BigDecimal("0"); |
| | | if (stockDz.getStockPlate() != null) { |
| | | maxRisePercent = new BigDecimal("0.2"); |
| | | log.info("【科创股票】"); |
| | | } else { |
| | | maxRisePercent = new BigDecimal("0.1"); |
| | | log.info("【普通A股】"); |
| | | if (nowPrice.compareTo(new BigDecimal("0")) == 0) { |
| | | return ServerResponse.createByErrorMsg("股票价格0,请重试", request); |
| | | } |
| | | |
| | | |
| | | BigDecimal zsPrice = new BigDecimal(stockListVO.getPreclose_px()); |
| | | |
| | | BigDecimal ztPrice = zsPrice.multiply(maxRisePercent).add(zsPrice); |
| | | ztPrice = ztPrice.setScale(2, 4); |
| | | BigDecimal chaPrice = ztPrice.subtract(zsPrice); |
| | | |
| | | BigDecimal ztRate = chaPrice.multiply(new BigDecimal("100")).divide(zsPrice, 2, 4); |
| | | |
| | | log.info("当前涨跌幅 = {} % , 涨停幅度 = {} %", Double.valueOf(stock_crease), ztRate); |
| | | |
| | | |
| | | ServerResponse serverResponse = this.iStockService.selectRateByDaysAndStockCode(stockDz.getStockCode(), siteSetting.getStockDays().intValue()); |
| | | if (!serverResponse.isSuccess()) { |
| | | return serverResponse; |
| | | if (stockDz.getStockNum() > num) { |
| | | return ServerResponse.createByErrorMsg("最小购买数据" + stockDz.getStockNum(), request); |
| | | } |
| | | BigDecimal daysRate = (BigDecimal) serverResponse.getData(); |
| | | log.info("股票 {} , {} 天内 涨幅 {} , 设置的涨幅 = {}", new Object[]{stockDz.getStockCode(), siteSetting |
| | | .getStockDays(), daysRate, siteSetting.getStockRate()}); |
| | | BigDecimal buyAmt = nowPrice.multiply(new BigDecimal(num.intValue())); |
| | | // BigDecimal fundratio = new BigDecimal(user.getFundRatio()).divide(new BigDecimal(100)); |
| | | // BigDecimal availableBalance = fundratio.multiply(userAssets.getAvailableBalance()); |
| | | // if (buyAmt.compareTo(availableBalance) > 0) { |
| | | // return ServerResponse.createByErrorMsg("订单失败,配资不足", request); |
| | | // } |
| | | |
| | | BigDecimal buy_amt = now_price.multiply(new BigDecimal(num.intValue())); |
| | | |
| | | BigDecimal buy_amt_autual = buy_amt.divide(new BigDecimal(1), 2, 4); |
| | | |
| | | |
| | | int compareInt = buy_amt_autual.compareTo(new BigDecimal(siteSetting.getBuyMinAmt().intValue())); |
| | | if (compareInt == -1) { |
| | | return ServerResponse.createByErrorMsg("Order failed, purchase amount is less than" + siteSetting |
| | | .getBuyMinAmt()); |
| | | } |
| | | |
| | | |
| | | // 创建UserPosition对象 |
| | | UserPosition userPosition = new UserPosition(); |
| | | userPosition.setPositionType(3); |
| | | userPosition.setPositionSn(KeyUtils.getUniqueKey()); |
| | |
| | | userPosition.setStockCode(stockDz.getStockCode()); |
| | | userPosition.setStockName(stockDz.getStockName()); |
| | | userPosition.setStockGid(stockDz.getStockGid()); |
| | | userPosition.setStockSpell(GetPyByChinese.converterToFirstSpell(stockDz.getStockName())); |
| | | userPosition.setBuyOrderId(GeneratePosition.getPositionId()); |
| | | userPosition.setBuyOrderTime(new Date()); |
| | | userPosition.setBuyOrderPrice(now_price); |
| | | userPosition.setBuyOrderPrice(nowPrice); |
| | | userPosition.setOrderDirection("买涨"); |
| | | userPosition.setOrderNum(num); |
| | | if (stockDz.getStockPlate() != null) { |
| | | userPosition.setStockPlate(stockDz.getStockPlate()); |
| | | } |
| | | userPosition.setStockSpell(stock.getStockSpell()); |
| | | userPosition.setIsLock(Integer.valueOf(0)); |
| | | userPosition.setOrderLever(1); |
| | | userPosition.setOrderTotalPrice(buy_amt); |
| | | |
| | | //递延费特殊处理 |
| | | BigDecimal stayFee = userPosition.getOrderTotalPrice().multiply(siteSetting.getStayFee()); |
| | | BigDecimal allStayFee = stayFee.multiply(new BigDecimal(1)); |
| | | userPosition.setOrderStayFee(allStayFee); |
| | | userPosition.setOrderStayDays(1); |
| | | |
| | | |
| | | BigDecimal buy_fee_amt = buy_amt.multiply(siteSetting.getBuyFee()).setScale(2, 4); |
| | | log.info("用户购买手续费(配资后总资金 * 百分比) = {}", buy_fee_amt); |
| | | userPosition.setOrderFee(buy_fee_amt); |
| | | |
| | | |
| | | BigDecimal buy_yhs_amt = buy_amt.multiply(siteSetting.getDutyFee()).setScale(2, 4); |
| | | log.info("用户购买印花税(配资后总资金 * 百分比) = {}", buy_yhs_amt); |
| | | userPosition.setOrderSpread(buy_yhs_amt); |
| | | |
| | | SiteSpread siteSpread = iSiteSpreadService.findSpreadRateOne(new BigDecimal(stock_crease), buy_amt, stockDz.getStockCode(), now_price); |
| | | BigDecimal spread_rate_amt = new BigDecimal("0"); |
| | | if (siteSpread != null) { |
| | | spread_rate_amt = buy_amt.multiply(siteSpread.getSpreadRate()).setScale(2, 4); |
| | | log.info("用户购买点差费(配资后总资金 * 百分比{}) = {}", siteSpread.getSpreadRate(), spread_rate_amt); |
| | | } else { |
| | | log.info("用户购买点差费(配资后总资金 * 百分比{}) = {}", "设置异常", spread_rate_amt); |
| | | } |
| | | |
| | | userPosition.setSpreadRatePrice(spread_rate_amt); |
| | | |
| | | |
| | | userPosition.setOrderTotalPrice(buyAmt); |
| | | userPosition.setSpreadRatePrice(BigDecimal.ZERO); |
| | | BigDecimal profit_and_lose = new BigDecimal("0"); |
| | | userPosition.setProfitAndLose(profit_and_lose); |
| | | |
| | | |
| | | BigDecimal all_profit_and_lose = profit_and_lose.subtract(buy_fee_amt).subtract(buy_yhs_amt).subtract(spread_rate_amt); |
| | | BigDecimal siteSettingBuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.BUY_HANDLING_CHARGE.getCode()).getCValue()) ; |
| | | BigDecimal orderFree = siteSettingBuyFee.multiply(buyAmt); |
| | | userPosition.setOrderFee(orderFree); |
| | | userPosition.setProfitAndLose(profit_and_lose.add(orderFree)); |
| | | BigDecimal all_profit_and_lose = profit_and_lose.subtract(BigDecimal.ZERO).subtract(BigDecimal.ZERO).subtract(BigDecimal.ZERO); |
| | | userPosition.setAllProfitAndLose(all_profit_and_lose); |
| | | |
| | | |
| | | userPosition.setOrderStayDays(Integer.valueOf(0)); |
| | | userPosition.setOrderStayFee(new BigDecimal("0")); |
| | | |
| | | int insertPositionCount = 0; |
| | | this.userPositionMapper.insert(userPosition); |
| | | insertPositionCount = userPosition.getId(); |
| | | if (insertPositionCount > 0) { |
| | | //修改用户可用余额= 当前余额-下单金额-买入手续费-印花税-点差费 |
| | | //BigDecimal reckon_enable = user_enable_amt.subtract(buy_amt_autual).subtract(buy_fee_amt).subtract(buy_yhs_amt).subtract(spread_rate_amt); |
| | | //修改用户可用余额= 当前余额-下单总金额 |
| | | int updateUserCount = this.userMapper.updateById(user); |
| | | if (updateUserCount > 0) { |
| | | log.info("【用户交易下单】修改用户金额成功"); |
| | | } else { |
| | | log.error("用户交易下单】修改用户金额出错"); |
| | | throw new Exception("用户交易下单】修改用户金额出错"); |
| | | } |
| | | //核算代理收入-入仓手续费 |
| | | iAgentAgencyFeeService.AgencyFeeIncome(1, userPosition.getPositionSn()); |
| | | log.info("【用户交易下单】保存持仓记录成功"); |
| | | } else { |
| | | log.error("用户交易下单】保存持仓记录出错"); |
| | | throw new Exception("用户交易下单】保存持仓记录出错"); |
| | | } |
| | | |
| | | return ServerResponse.createBySuccess("Order successful"); |
| | | userPosition.setOrderSpread(BigDecimal.ZERO); |
| | | userPositionMapper.insert(userPosition); |
| | | userAssetsServices.availablebalanceChange(EStockType.JP.getCode(), user.getId(), EUserAssets.BUY, buyAmt.negate(),"",""); |
| | | return ServerResponse.createBySuccess("购买成功", request); |
| | | } |
| | | |
| | | @Override |
| | |
| | | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional |
| | | public void stockConstraint(List<UserPosition> list) { |
| | | try { |
| | | SiteSetting siteSetting = iSiteSettingService.getSiteSetting(); |
| | | |
| | | for (UserPosition position : list) { |
| | | UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<UserAssets>() |
| | | .eq(UserAssets::getUserId, position.getUserId()) |
| | | .eq(UserAssets::getAccectType, "JP") |
| | | ); |
| | | if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ |
| | | continue; |
| | | } |
| | | //平仓检查 |
| | | Result result = getResult(position); |
| | | if (result == null) continue; |
| | | |
| | | Integer liquidation = 0; |
| | | liquidation = isLiquidation(position, result.signum, result.profit, liquidation); |
| | | if(liquidation != 0){ |
| | | extracted(position, result.nowPrice, result.stock,liquidation); |
| | | } |
| | | } |
| | | }catch (Exception e){ |
| | | log.error("强制平仓--->错误",e); |
| | | } |
| | | } |
| | | |
| | | private Result getResult(UserPosition position) { |
| | | // 检查订单是否存在 |
| | | if (position == null) { |
| | | log.info("订单不存在,订单id: {}", position.getId()); |
| | | return null; |
| | | } |
| | | |
| | | // 检查用户是否存在 |
| | | User user = this.userMapper.selectById(position.getUserId()); |
| | | if (user == null) { |
| | | log.info("用户不存在,订单id: {}", position.getId()); |
| | | return null; |
| | | } |
| | | |
| | | // 检查是否在交易时间内 |
| | | // if (!tradingHourService.timeCheck(position.getStockCode())) { |
| | | // log.info("不在交易时间之内,订单id: {}", position.getId()); |
| | | // return null; |
| | | // } |
| | | |
| | | //判断订单 |
| | | if (1 == position.getIsLock().intValue()) { |
| | | log.info("订单已终止,订单id: {}", position.getId()); |
| | | return null; |
| | | } |
| | | |
| | | // 检查股票是否垫停 |
| | | Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code", position.getStockCode())); |
| | | // if (!priceServices.isLimitDownSell(stock.getStockCode())) { |
| | | // log.info("股票跌停,无法平仓,订单id: {}", position.getId()); |
| | | // return null; |
| | | // } |
| | | |
| | | //最新报价 |
| | | BigDecimal nowPrice = priceServices.getNowPrice(position.getStockCode()); |
| | | // if (nowPrice.compareTo(BigDecimal.ZERO) <= 0) { |
| | | // log.info("报价0,平仓失败,订单id: {}", position.getId()); |
| | | // return null; |
| | | // } |
| | | |
| | | //判断订单是否已到强制平仓价格 |
| | | BigDecimal purchaseAmount = position.getBuyOrderPrice().multiply(new BigDecimal(position.getOrderNum()));// 买入价总额 |
| | | BigDecimal nowPriceAmount = nowPrice.multiply(new BigDecimal(position.getOrderNum())); // 现价总额 |
| | | |
| | | BigDecimal profit = nowPriceAmount.subtract(purchaseAmount);//利润 |
| | | int signum = profit.signum(); // -1, 0, 1,分别表示 负数、零、正数 |
| | | Result result = new Result(stock, nowPrice, profit, signum); |
| | | return result; |
| | | } |
| | | |
| | | private static class Result { |
| | | public final Stock stock;//股票 |
| | | public final BigDecimal nowPrice;//现价 |
| | | public final BigDecimal profit;//利润 |
| | | public final int signum;// -1, 0, 1,分别表示 负数、零、正数 |
| | | |
| | | public Result(Stock stock, BigDecimal nowPrice, BigDecimal profit, int signum) { |
| | | this.stock = stock; |
| | | this.nowPrice = nowPrice; |
| | | this.profit = profit; |
| | | this.signum = signum; |
| | | } |
| | | } |
| | | |
| | | //判断平仓 |
| | | private Integer isLiquidation(UserPosition position, int signum, BigDecimal profit, Integer liquidation) { |
| | | //-1强平 0未触发 1止损强平 2止盈强平 |
| | | //最新报价 |
| | | BigDecimal nowPrice = priceServices.getNowPrice(position.getStockCode()); |
| | | if(position.getOrderDirection().equals("买涨")){ |
| | | //判断亏损金额是否达到保证金金额 |
| | | BigDecimal negate = profit.negate(); |
| | | //如果买涨 signum 为-1则表示亏损 |
| | | if(signum == -1){ |
| | | //止损 |
| | | if(null != position.getStopTargetPrice() && nowPrice.compareTo(position.getStopTargetPrice()) <= 0){ |
| | | //强制平仓 |
| | | return liquidation = 1; |
| | | } |
| | | if (negate.compareTo(position.getOrderTotalPrice()) >= 0){//亏平强平 |
| | | //强制平仓 |
| | | return liquidation = -1; |
| | | } |
| | | }else{ |
| | | //止盈 |
| | | if(null != position.getProfitTargetPrice() && nowPrice.compareTo(position.getProfitTargetPrice()) >= 0){ |
| | | //强制平仓 |
| | | return liquidation = 2; |
| | | } |
| | | } |
| | | }else{ |
| | | //买跌 signum |
| | | if(signum == 1){ |
| | | //止损 |
| | | if(null != position.getStopTargetPrice() && nowPrice.compareTo(position.getStopTargetPrice()) >= 0){ |
| | | //强制平仓 |
| | | return liquidation = 1; |
| | | } |
| | | //判断亏损金额是否达到保证金金额 |
| | | if (profit.compareTo(position.getOrderTotalPrice()) >= 0){//亏平强平 |
| | | //强制平仓 |
| | | return liquidation = -1; |
| | | } |
| | | }else{ |
| | | //止盈 |
| | | if(null != position.getProfitTargetPrice() && nowPrice.compareTo(position.getProfitTargetPrice()) <= 0){ |
| | | //强制平仓 |
| | | return liquidation = 2; |
| | | } |
| | | } |
| | | } |
| | | return liquidation; |
| | | } |
| | | |
| | | //平仓 |
| | | private void extracted(UserPosition position, BigDecimal nowPrice, Stock stock,Integer liquidation) { |
| | | //-1强平 0未触发 1止损强平 2止盈强平 |
| | | BigDecimal siitteBuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.SELL_HANDLING_CHARGE.getCode()).getCValue()) ; |
| | | BigDecimal sellOrderTotel = nowPrice.multiply(new BigDecimal(position.getOrderNum())); |
| | | BigDecimal xsPrice = sellOrderTotel.multiply(siitteBuyFee);//手续费 |
| | | // 更新订单信息 |
| | | position.setSellOrderId(GeneratePosition.getPositionId()); |
| | | position.setSellOrderPrice(nowPrice); |
| | | position.setSellOrderTime(new Date()); |
| | | userPositionMapper.updateById(position); |
| | | if(liquidation == -1){ |
| | | userAssetsServices.availablebalanceChange(stock.getStockType(), |
| | | position.getUserId(), |
| | | EUserAssets.CONSTRAINT_CLOSE_POSITION, |
| | | position.getOrderTotalPrice(), "", ""); |
| | | }else if(liquidation == 1 || liquidation == 2){ |
| | | userAssetsServices.availablebalanceChange(stock.getStockType(), |
| | | position.getUserId(), EUserAssets.HANDLING_CHARGE, |
| | | xsPrice, "", ""); |
| | | PositionProfitVO profitVO = UserPointUtil.getPositionProfitVO(position, priceServices.getNowPrice(position.getStockCode())); |
| | | userAssetsServices.availablebalanceChange(stock.getStockType(), position.getUserId(), EUserAssets.CLOSE_POSITION, |
| | | profitVO.getAllProfitAndLose(), "", ""); |
| | | } |
| | | |
| | | |
| | | |
| | | log.info("强制平仓成功,订单id: {}", position.getId()); |
| | | } |
| | | |
| | | } |
| | | |
| | | |