| | |
| | | package com.nq.service.impl; |
| | | |
| | | import cn.hutool.core.convert.Convert; |
| | | import cn.hutool.core.date.DateUtil; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.nq.dao.*; |
| | |
| | | import com.google.common.collect.Lists; |
| | | import com.nq.common.ServerResponse; |
| | | import com.nq.utils.*; |
| | | import com.nq.utils.redis.RedisKeyUtil; |
| | | import com.nq.utils.stock.BuyAndSellUtils; |
| | | import com.nq.utils.stock.GeneratePosition; |
| | | import com.nq.utils.stock.GetStayDays; |
| | |
| | | |
| | | |
| | | @Transactional |
| | | public ServerResponse sell(String positionSn, int doType, HttpServletRequest request) { |
| | | public ServerResponse sell(String positionSn, int doType, Integer number,HttpServletRequest request) { |
| | | UserPosition userPosition = this.userPositionMapper.findPositionBySn(positionSn); |
| | | if(number <= 0 || number > userPosition.getOrderNum()){ |
| | | return ServerResponse.createByErrorMsg("请输入正确的平仓数", request); |
| | | } |
| | | // 手续费率 |
| | | BigDecimal siitteBuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.SELL_HANDLING_CHARGE.getCode()).getCValue()) ; |
| | | BigDecimal siitteBuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.SELL_HANDLING_CHARGE.getCode()).getCValue()); |
| | | |
| | | UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<UserAssets>() |
| | | .eq(UserAssets::getUserId, userPosition.getUserId()) |
| | |
| | | ); |
| | | if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ |
| | | return ServerResponse.createByErrorMsg("请先缴清待补资金", request); |
| | | } |
| | | StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new LambdaQueryWrapper<StockSubscribe>() |
| | | .eq(StockSubscribe::getCode, userPosition.getStockCode())); |
| | | if (null != stockSubscribe && DateUtil.date().before(stockSubscribe.getListDate())) { |
| | | return ServerResponse.createByErrorMsg("股票未上市,不能平仓", request); |
| | | } |
| | | Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code", userPosition.getStockCode())); |
| | | if(null == stock){ |
| | | return ServerResponse.createByErrorMsg("股票不存在,平仓失败", request); |
| | | } |
| | | Boolean b = tradingHourService.timeCheck(userPosition.getStockCode()); |
| | | if (!b) { |
| | |
| | | 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); |
| | | } |
| | |
| | | if (nowPrice.compareTo(new BigDecimal("0")) != 1) { |
| | | return ServerResponse.createByErrorMsg("报价0,平仓失败,请稍后再试", request); |
| | | } |
| | | |
| | | //部分平仓 |
| | | if(number < userPosition.getOrderNum()){ |
| | | //拆分订单 |
| | | UserPosition position = ConverterUtil.convert(userPosition,UserPosition.class); |
| | | position.setId(null); |
| | | position.setPositionSn(KeyUtils.getUniqueKey()); |
| | | position.setOrderNum(number); |
| | | position.setOrderTotalPrice(position.getBuyOrderPrice().multiply(new BigDecimal(number))); |
| | | position.setBuyOrderId(GeneratePosition.getPositionId()); |
| | | //修改拆分订单手续费 |
| | | BigDecimal BuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.BUY_HANDLING_CHARGE.getCode()).getCValue()); |
| | | BigDecimal buyPrice = position.getBuyOrderPrice().multiply(new BigDecimal(position.getOrderNum())); |
| | | BigDecimal xsPrice = buyPrice.multiply(BuyFee); |
| | | position.setOrderFee(xsPrice); |
| | | |
| | | //修改原订单 |
| | | userPosition.setOrderNum(userPosition.getOrderNum()-number); |
| | | userPosition.setOrderTotalPrice(userPosition.getBuyOrderPrice().multiply(new BigDecimal(userPosition.getOrderNum()))); |
| | | userPosition.setOrderFee(userPosition.getOrderFee().subtract(position.getOrderFee())); |
| | | userPositionMapper.insert(position); |
| | | userPositionMapper.updateById(userPosition); |
| | | |
| | | return getObjectServerResponse(request, position, nowPrice, siitteBuyFee, stock); |
| | | } |
| | | return getObjectServerResponse(request, userPosition, nowPrice, siitteBuyFee, stock); |
| | | } |
| | | |
| | | private ServerResponse<Object> getObjectServerResponse(HttpServletRequest request, UserPosition userPosition, BigDecimal nowPrice, BigDecimal siitteBuyFee, Stock stock) { |
| | | userPosition.setSellOrderId(GeneratePosition.getPositionId()); |
| | | userPosition.setSellOrderPrice(nowPrice); |
| | | userPosition.setSellOrderTime(new Date()); |
| | | |
| | | BigDecimal sellOrderTotel = nowPrice.multiply(new BigDecimal(userPosition.getOrderNum())); |
| | | BigDecimal xsPrice = sellOrderTotel.multiply(siitteBuyFee); |
| | | userPosition.setOrderFee(userPosition.getOrderFee().add(xsPrice)); |
| | | userPositionMapper.updateById(userPosition); |
| | | userAssetsServices.availablebalanceChange(stock.getStockType(), |
| | | userPosition.getUserId(), |
| | |
| | | Integer state, HttpServletRequest request, |
| | | int pageNum, int pageSize, String stockType) { |
| | | User user = this.iUserService.getCurrentUser(request); |
| | | |
| | | PageHelper.startPage(pageNum, pageSize); |
| | | List<UserPosition> userPositions; |
| | | |
| | |
| | | List<UserPositionVO> userPositionVOS = Lists.newArrayList(); |
| | | if (userPositions.size() > 0) { |
| | | for (UserPosition position : userPositions) { |
| | | UserPositionVO userPositionVO = UserPointUtil.assembleUserPositionVO(position, priceServices.getNowPrice(position.getStockCode())); |
| | | Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code",position.getStockCode())); |
| | | BigDecimal nowPrice = BigDecimal.ZERO; |
| | | if(null != stock){ |
| | | StockRealTimeBean stockRealTimeBean = RedisKeyUtil.getCacheRealTimeStock(stock); |
| | | nowPrice = new BigDecimal(stockRealTimeBean.getLast()); |
| | | } |
| | | // if(state == 1){ |
| | | // nowPrice = position.getSellOrderPrice(); |
| | | // }else{ |
| | | // nowPrice = priceServices.getNowPrice(position.getStockCode()); |
| | | // } |
| | | UserPositionVO userPositionVO = UserPointUtil.assembleUserPositionVO(position,nowPrice); |
| | | userPositionVO.setOrderTotalPrice(userPositionVO.getOrderTotalPrice().multiply(new BigDecimal(userPositionVO.getOrderLever()))); |
| | | userPositionVO.setProfitAndLose(userPositionVO.getProfitAndLose().multiply(new BigDecimal(userPositionVO.getOrderLever()))); |
| | | |
| | | StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new LambdaQueryWrapper<StockSubscribe>() |
| | | .eq(StockSubscribe::getCode, userPositionVO.getStockCode())); |
| | | if(position.getSellOrderId() == null){ |
| | | if (null != stockSubscribe && DateUtil.date().before(stockSubscribe.getListDate())) { |
| | | userPositionVO.setProfitAndLose(BigDecimal.ZERO); |
| | | userPositionVO.setProfitAndLoseParent("0%"); |
| | | userPositionVO.setIsListed(false); |
| | | }else{ |
| | | userPositionVO.setIsListed(true); |
| | | userPositionVO.setProfitAndLose(userPositionVO.getProfitAndLose().multiply(new BigDecimal(userPositionVO.getOrderLever()))); |
| | | } |
| | | }else{ |
| | | userPositionVO.setProfitAndLose(userPositionVO.getProfitAndLose().multiply(new BigDecimal(userPositionVO.getOrderLever()))); |
| | | } |
| | | userPositionVOS.add(userPositionVO); |
| | | } |
| | | } |
| | |
| | | * @Date: 2022/10/26 |
| | | */ |
| | | @Override |
| | | public ServerResponse newStockToPosition(Integer id) { |
| | | public ServerResponse newStockToPosition(Integer id,BigDecimal amountToBeCovered) { |
| | | UserStockSubscribe userStockSubscribe = userStockSubscribeMapper.load(id); |
| | | if (userStockSubscribe == null) { |
| | | return ServerResponse.createByErrorMsg("无该申购记录"); |
| | |
| | | if (userStockSubscribe == null) { |
| | | return ServerResponse.createByErrorMsg("该新股不存在"); |
| | | } |
| | | if (userStockSubscribe.getStatus() == 4 || userStockSubscribe.getStatus() == 3 && stockSubscribe.getType() == 2) { |
| | | 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()); |
| | | |
| | | Stock stock = stockMapper.selectOne(new LambdaQueryWrapper<Stock>().eq(Stock::getStockCode, userStockSubscribe.getNewCode())); |
| | | |
| | | UserPosition userPosition = new UserPosition(); |
| | | |
| | | if(null == stock){ |
| | | userPosition.setStockCode(stockSubscribe.getCode()); |
| | | userPosition.setStockSpell(stockSubscribe.getName()); |
| | | }else{ |
| | | userPosition.setStockCode(stock.getStockCode()); |
| | | userPosition.setStockSpell(stock.getStockSpell()); |
| | | userPosition.setStockName(userStockSubscribe.getNewName()); |
| | | 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.setOrderDirection("买涨"); |
| | | } |
| | | |
| | | userPosition.setOrderNum(userStockSubscribe.getApplyNumber()); |
| | | userPosition.setPositionType(1); |
| | | userPosition.setPositionSn(KeyUtils.getUniqueKey()); |
| | | userPosition.setUserId(userStockSubscribe.getUserId()); |
| | | userPosition.setNickName(userStockSubscribe.getRealName()); |
| | | userPosition.setAgentId(userStockSubscribe.getAgentId()); |
| | | |
| | | userPosition.setStockName(userStockSubscribe.getNewName()); |
| | | 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.setOrderDirection("买涨"); |
| | | |
| | | userPosition.setOrderNum(userStockSubscribe.getApplyNumber()); |
| | | |
| | | |
| | | userPosition.setIsLock(Integer.valueOf(0)); |
| | | userPosition.setIsLock(Integer.valueOf(0)); |
| | | |
| | | |
| | | userPosition.setOrderLever(1); |
| | | userPosition.setOrderLever(1); |
| | | |
| | | |
| | | //递延费特殊处理 |
| | | // BigDecimal stayFee = userPosition.getOrderTotalPrice().multiply(siteSetting.getStayFee()); |
| | | BigDecimal stayFee = new BigDecimal(0); |
| | | BigDecimal allStayFee = stayFee.multiply(new BigDecimal(1)); |
| | | userPosition.setOrderStayFee(allStayFee); |
| | | userPosition.setOrderStayDays(1); |
| | | userPosition.setOrderTotalPrice(userStockSubscribe.getBond()); |
| | | //递延费特殊处理 |
| | | // BigDecimal stayFee = userPosition.getOrderTotalPrice().multiply(siteSetting.getStayFee()); |
| | | BigDecimal stayFee = new BigDecimal(0); |
| | | BigDecimal allStayFee = stayFee.multiply(new BigDecimal(1)); |
| | | userPosition.setOrderStayFee(allStayFee); |
| | | userPosition.setOrderStayDays(1); |
| | | userPosition.setOrderTotalPrice(userStockSubscribe.getBond()); |
| | | |
| | | // BigDecimal buy_fee_amt = buy_amt.multiply(siteSetting.getBuyFee()).setScale(2, 4); |
| | | BigDecimal buy_fee_amt = new BigDecimal(0); |
| | | log.info("用户购买手续费(配资后总资金 * 百分比) = {}", buy_fee_amt); |
| | | userPosition.setOrderFee(buy_fee_amt); |
| | | // BigDecimal buy_fee_amt = buy_amt.multiply(siteSetting.getBuyFee()).setScale(2, 4); |
| | | // 手续费率 |
| | | BigDecimal siteSettingBuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.BUY_HANDLING_CHARGE.getCode()).getCValue()) ; |
| | | BigDecimal buy_fee_amt = siteSettingBuyFee.multiply(userStockSubscribe.getBond()); |
| | | log.info("用户购买手续费(配资后总资金 * 百分比) = {}", buy_fee_amt); |
| | | userPosition.setOrderFee(buy_fee_amt); |
| | | |
| | | |
| | | // BigDecimal buy_yhs_amt = buy_amt.multiply(siteSetting.getDutyFee()).setScale(2, 4); |
| | | BigDecimal buy_yhs_amt = new BigDecimal(0); |
| | | log.info("用户购买印花税(配资后总资金 * 百分比) = {}", buy_yhs_amt); |
| | | userPosition.setOrderSpread(buy_yhs_amt); |
| | | // BigDecimal buy_yhs_amt = buy_amt.multiply(siteSetting.getDutyFee()).setScale(2, 4); |
| | | BigDecimal buy_yhs_amt = new BigDecimal(0); |
| | | log.info("用户购买印花税(配资后总资金 * 百分比) = {}", buy_yhs_amt); |
| | | userPosition.setOrderSpread(buy_yhs_amt); |
| | | |
| | | BigDecimal spread_rate_amt = new BigDecimal(0); |
| | | userPosition.setSpreadRatePrice(spread_rate_amt); |
| | | BigDecimal spread_rate_amt = new BigDecimal(0); |
| | | userPosition.setSpreadRatePrice(spread_rate_amt); |
| | | |
| | | |
| | | BigDecimal profit_and_lose = new BigDecimal("0"); |
| | | userPosition.setProfitAndLose(profit_and_lose); |
| | | 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); |
| | | 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.setOrderStayDays(Integer.valueOf(0)); |
| | | userPosition.setOrderStayFee(new BigDecimal("0")); |
| | | |
| | | int ret = 0; |
| | | ret = this.userPositionMapper.insert(userPosition); |
| | | UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(stock.getStockType(), userPosition.getUserId()); |
| | | if(null == userAssets){ |
| | | return ServerResponse.createByErrorMsg("新股转持仓失败"); |
| | | userPosition.setOrderStayDays(Integer.valueOf(0)); |
| | | userPosition.setOrderStayFee(new BigDecimal("0")); |
| | | userPosition.setAmountToBeCovered(amountToBeCovered); |
| | | userPosition.setNewId(stockSubscribe.getNewlistId()); |
| | | int ret = 0; |
| | | ret = this.userPositionMapper.insert(userPosition); |
| | | UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN", userPosition.getUserId()); |
| | | if(null == userAssets){ |
| | | return ServerResponse.createByErrorMsg("新股转持仓失败"); |
| | | } |
| | | userAssetsMapper.updateById(userAssets); |
| | | iUserAssetsServices.availablebalanceChange("IN", userAssets.getUserId(), EUserAssets.HANDLING_CHARGE, buy_fee_amt, "", ""); |
| | | if (ret > 0) { |
| | | userStockSubscribe.setStatus(5); |
| | | userStockSubscribeMapper.update1(userStockSubscribe); |
| | | if (userStockSubscribe.getType() == 1 || userStockSubscribe.getType() == 2) { |
| | | User user = userMapper.selectById(userStockSubscribe.getUserId()); |
| | | ret = userMapper.updateById(user); |
| | | } |
| | | 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.updateById(user); |
| | | } |
| | | if (ret > 0) { |
| | | return ServerResponse.createBySuccessMsg("新股转持仓成功"); |
| | | } else { |
| | | return ServerResponse.createByErrorMsg("新股转持仓失败"); |
| | | } |
| | | return ServerResponse.createBySuccessMsg("新股转持仓成功"); |
| | | } else { |
| | | return ServerResponse.createByErrorMsg("新股转持仓失败"); |
| | | } |
| | | } else { |
| | | return ServerResponse.createByErrorMsg("新股转持仓失败"); |
| | | } |
| | | return ServerResponse.createByErrorMsg("新股转持仓失败"); |
| | | } |
| | | |
| | | /** |
| | |
| | | // 创建UserPosition对象 |
| | | UserPosition userPosition = getUserPosition(dzId,num, user, stockDz, nowPrice, stock, buyAmt); |
| | | userPositionMapper.insert(userPosition); |
| | | BigDecimal siteSettingBuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.BUY_HANDLING_CHARGE.getCode()).getCValue()) ; |
| | | BigDecimal buy_fee_amt = siteSettingBuyFee.multiply(buyAmt); |
| | | userAssetsServices.availablebalanceChange(EStockType.IN.getCode(), user.getId(), EUserAssets.BUY, buyAmt.negate(),"",""); |
| | | iUserAssetsServices.availablebalanceChange("IN", userAssets.getUserId(), EUserAssets.HANDLING_CHARGE, buy_fee_amt, "", ""); |
| | | return ServerResponse.createBySuccess("购买成功", request); |
| | | } |
| | | |