src/main/java/com/nq/controller/echo/EChoController.java
@@ -50,6 +50,9 @@ @PostMapping("buyEcho.do") @ResponseBody public ServerResponse buyEcho(@RequestParam("eId") String eid, @RequestParam("money") BigDecimal money, HttpServletRequest request) { if(null == money || money.compareTo(BigDecimal.ZERO) <= 0){ return ServerResponse.createByErrorMsg("金额不能小于0",request); } EChoBean eChoBean = eChoMapper.selectById(Integer.parseInt(eid)); if (eChoBean == null) { return ServerResponse.createByErrorMsg("基金产品不存在",request); @@ -60,6 +63,9 @@ } User user = this.iUserService.getCurrentRefreshUser(request); UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("IN", user.getId()); if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ return ServerResponse.createByErrorMsg("请先缴清待补资金", request); } if(userAssets.getAvailableBalance().compareTo(money) < 0){ return ServerResponse.createByErrorMsg("配资不足",request); } src/main/java/com/nq/service/impl/EchoServices.java
@@ -114,21 +114,38 @@ // 本金*收益率*周期/365=收益金额 BigDecimal incomeAmount = money.multiply(rate); BigDecimal aml = incomeAmount.add(money); if (aml.compareTo(BigDecimal.ZERO) > 0) { UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<UserAssets>() .eq(UserAssets::getUserId, orderEchoBean.getUserId()) .eq(UserAssets::getAccectType, "IN") ); userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(aml)); userAssetsMapper.updateById(userAssets); orderEchoBean.setState("2"); orderEchoBean.setEarnings(incomeAmount.toString()); orderEchoMapper.updateById(orderEchoBean); UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<UserAssets>() .eq(UserAssets::getUserId, orderEchoBean.getUserId()) .eq(UserAssets::getAccectType, "IN") ); if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ continue; } BigDecimal subtract = aml.subtract(userAssets.getAmountToBeCovered()); if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ if(subtract.compareTo(BigDecimal.ZERO) > 0){ userAssets.setAmountToBeCovered(BigDecimal.ZERO); userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(subtract)); }else{ userAssets.setAmountToBeCovered(subtract.negate()); } }else{ userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(aml)); } userAssetsMapper.updateById(userAssets); orderEchoBean.setState("2"); orderEchoBean.setEarnings(incomeAmount.toString()); orderEchoMapper.updateById(orderEchoBean); } } public static void main(String[] args) { BigDecimal a = new BigDecimal("20"); BigDecimal b = new BigDecimal("-100"); System.out.println(a.add(b)); } @Override public int insertEcho(EChoBean eChoBean) { return eChoMapper.insert(eChoBean); src/main/java/com/nq/service/impl/SiteNewsServiceImpl.java
@@ -153,7 +153,7 @@ siteNews.setSourceName(""); siteNews.setTitle(jsonObject.getString("title")); Long showTime = jsonObject.getLong("time"); siteNews.setShowTime(new Date(showTime)); siteNews.setShowTime(new Date(showTime * 1000)); if(jsonObject.has("img")){ convertBase64ToImage(jsonObject.getString("img"),PropertiesUtil.getProperty("ftp.address")+newsId+".jpg"); siteNews.setImgurl(PropertiesUtil.getProperty("ftp.server.http.prefix")+newsId+".jpg"); src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
@@ -117,6 +117,9 @@ @Autowired IStockConfigServices iStockConfigServices; @Autowired private UserAssetsMapper userAssetsMapper; @Transactional public ServerResponse buy(Integer stockId, Integer buyNum, Integer buyType, Integer lever, BigDecimal profitTarget, BigDecimal stopTarget, HttpServletRequest request) { @@ -150,15 +153,14 @@ return ServerResponse.createByErrorMsg("最低购买数量"+mainBuyConfig.getCValue(), request); } UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(stock.getStockType(), user.getId()); StockConfig maxBuyConfig = iStockConfigServices.queryByKey(EConfigKey.MAX_BUY.getCode()); if(buyNum<Integer.parseInt(mainBuyConfig.getCValue())){ return ServerResponse.createByErrorMsg("最高购买数量"+maxBuyConfig.getCValue(), request); } // if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ return ServerResponse.createByErrorMsg("请先缴清待补资金", request); } if (stock.getIsLock() != 0) { return ServerResponse.createByErrorMsg("订单失败,股票被锁定", request); } @@ -177,7 +179,6 @@ BigDecimal buyAmt = nowPrice.multiply(new BigDecimal(buyNum)).divide(new BigDecimal(lever)); BigDecimal orderFree = siteSettingBuyFee.multiply(buyAmt); UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(stock.getStockType(), user.getId()); BigDecimal fundratio = new BigDecimal(user.getFundRatio()).divide(new BigDecimal(100)); BigDecimal availableBalance = fundratio.multiply(userAssets.getAvailableBalance()); if (availableBalance.compareTo(buyAmt.add(orderFree)) < 0) { @@ -322,6 +323,13 @@ // 手续费率 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, "IN") ); if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ return ServerResponse.createByErrorMsg("请先缴清待补资金", request); } Boolean b = tradingHourService.timeCheck(userPosition.getStockCode()); if (!b) { return ServerResponse.createByErrorMsg("订单失败,不在交易时间之内", request); @@ -1532,6 +1540,10 @@ if (siteProduct.getRealNameDisplay() && user.getIsLock().intValue() == 1) { return ServerResponse.createByErrorMsg("Order failed, account has been locked"); } UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("IN", user.getId()); if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ return ServerResponse.createByErrorMsg("请先缴清待补资金", request); } StockDz stockDz = this.stockDzMapper.selectOne(new QueryWrapper<StockDz>().eq("stock_code", stockCode)); if (!Objects.equals(stockDz.getPassword(), password)) { return ServerResponse.createByErrorMsg("密码错误", request); @@ -1554,7 +1566,6 @@ return ServerResponse.createByErrorMsg("最小购买数据" + stockDz.getStockNum(), request); } BigDecimal buyAmt = nowPrice.multiply(new BigDecimal(num.intValue())); UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(stock.getStockType(), user.getId()); BigDecimal fundratio = new BigDecimal(user.getFundRatio()).divide(new BigDecimal(100)); BigDecimal availableBalance = fundratio.multiply(userAssets.getAvailableBalance()); if (buyAmt.compareTo(availableBalance) > 0) { @@ -1610,17 +1621,23 @@ @Transactional public void stockConstraint(List<UserPosition> list) { SiteSetting siteSetting = iSiteSettingService.getSiteSetting(); BigDecimal siteBuyFee = siteSetting.getBuyFee(); for (UserPosition position : list) { UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<UserAssets>() .eq(UserAssets::getUserId, position.getUserId()) .eq(UserAssets::getAccectType, "IN") ); if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ continue; } //平仓检查 Result result = getResult(position); if (result == null) continue; boolean liquidation = false; Integer liquidation = 0; liquidation = isLiquidation(position, result.signum, result.profit, liquidation); if(liquidation){ extracted(position, result.nowPrice, result.stock); if(liquidation != 0){ extracted(position, result.nowPrice, result.stock,liquidation); } } } @@ -1690,7 +1707,8 @@ } //判断平仓 private boolean isLiquidation(UserPosition position, int signum, BigDecimal profit, boolean liquidation) { 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("买涨")){ @@ -1701,17 +1719,17 @@ //止损 if(null != position.getStopTargetPrice() && nowPrice.compareTo(position.getStopTargetPrice()) <= 0){ //强制平仓 return liquidation = true; return liquidation = 1; } if (negate.compareTo(position.getOrderTotalPrice()) >= 0){//亏平强平 //强制平仓 return liquidation = true; return liquidation = -1; } }else{ //止盈 if(null != position.getProfitTargetPrice() && nowPrice.compareTo(position.getProfitTargetPrice()) >= 0){ //强制平仓 return liquidation = true; return liquidation = 2; } } }else{ @@ -1720,18 +1738,18 @@ //止损 if(null != position.getStopTargetPrice() && nowPrice.compareTo(position.getStopTargetPrice()) >= 0){ //强制平仓 return liquidation = true; return liquidation = 1; } //判断亏损金额是否达到保证金金额 if (profit.compareTo(position.getOrderTotalPrice()) >= 0){//亏平强平 //强制平仓 return liquidation = true; return liquidation = -1; } }else{ //止盈 if(null != position.getProfitTargetPrice() && nowPrice.compareTo(position.getProfitTargetPrice()) <= 0){ //强制平仓 return liquidation = true; return liquidation = 2; } } } @@ -1739,21 +1757,32 @@ } //平仓 private void extracted(UserPosition position, BigDecimal nowPrice, Stock stock) { 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(), "", ""); } // 计算手续费等 BigDecimal handlingFee = BigDecimal.ZERO; //更新用户资产 userAssetsServices.availablebalanceChange(stock.getStockType(), position.getUserId(), EUserAssets.CONSTRAINT_CLOSE_POSITION, position.getOrderTotalPrice(), "", ""); log.info("强制平仓成功,订单id: {}", position.getId()); } src/main/java/com/nq/service/impl/UserServiceImpl.java
@@ -556,6 +556,8 @@ rUserAssets.setHandlingChargeUSD(handlingChargeUSD.setScale(s,BigDecimal.ROUND_UP).toString()); rUserAssets.setProfitAndLossUSD(profitAndLossUSD.setScale(s,BigDecimal.ROUND_UP).toString()); rUserAssets.setProfitAndLoss(getProfitAndLose(userId).toString()); BigDecimal decimal = new BigDecimal(rUserAssets.getTotalMoney()).add(new BigDecimal(rUserAssets.getProfitAndLoss())); rUserAssets.setTotalMoney(decimal.toString()); AllProfitAndLose = AllProfitAndLose.add(profitAndLossUSD); allTotalAssets = allTotalAssets.add(totleMoneyUSD); allAmt = allAmt.add(availableBalanceUSD); src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java
@@ -82,82 +82,83 @@ if (model == null) { return ServerResponse.createByErrorMsg("参数错误",request); } User user = iUserService.getCurrentRefreshUser(request); if (model.getNewCode() != null) { StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper<StockSubscribe>() .eq("code", model.getNewCode()).eq("type",model.getType())); //实名认证开关 SiteProduct siteProduct = iSiteProductService.getProductSetting(); if (siteProduct.getRealNameDisplay() && user.getIsActive() != 2) { return ServerResponse.createByErrorMsg("订单失败,请先实名认证",request); } User user = iUserService.getCurrentRefreshUser(request); UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN",user.getId()); if (model.getNewCode() != null) { StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper<StockSubscribe>() .eq("code", model.getNewCode()).eq("type",model.getType())); //实名认证开关 SiteProduct siteProduct = iSiteProductService.getProductSetting(); if (siteProduct.getRealNameDisplay() && user.getIsActive() != 2) { return ServerResponse.createByErrorMsg("订单失败,请先实名认证",request); } if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ return ServerResponse.createByErrorMsg("请先缴清待补资金", request); } if(new Date().before(stockSubscribe.getSubscribeTime()) && new Date().after(stockSubscribe.getSubscribeTime()) ){ return ServerResponse.createByErrorMsg("不在认缴或配售时间之内",request); } if(new Date().before(stockSubscribe.getSubscribeTime()) && new Date().after(stockSubscribe.getSubscribeTime()) ){ return ServerResponse.createByErrorMsg("不在认缴或配售时间之内",request); //重复申购限制 UserStockSubscribe userStockSubscribe = userStockSubscribeMapper.selectOne(new QueryWrapper<UserStockSubscribe>().eq( "new_code", model.getNewCode()).eq("user_id", user.getId()).eq("type",model.getType())); if (userStockSubscribe != null) { return ServerResponse.createByErrorMsg("请勿重复申请",request); } if (siteProduct.getRealNameDisplay() && user.getIsLock().intValue() == 1) { return ServerResponse.createByErrorMsg("订单失败,帐户已被锁定",request); } if (stockSubscribe == null) { return ServerResponse.createByErrorMsg("新的股票代码不存在",request); } if (model.getApplyNums() == null || model.getApplyNums() > stockSubscribe.getOrderNumber()|| model.getApplyNums() < 500) { return ServerResponse.createByErrorMsg("最小起订量是500,最大值" + stockSubscribe.getOrderNumber(),request); } if(stockSubscribe.getType() == 1){ model.setUserId(user.getId()); model.setNewName(stockSubscribe.getName()); model.setAgentId(user.getAgentId()); model.setAgentName(user.getAgentName()); model.setPhone(user.getPhone()); model.setBuyPrice(stockSubscribe.getPrice()); model.setBond(new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getPrice())); model.setRealName(Objects.equals(user.getRealName(), "")||user.getRealName()==null ?"模拟用户无实名":user.getRealName()); model.setAddTime(new Date()); model.setOrderNo(KeyUtils.getUniqueKey()); model.setType(stockSubscribe.getType()); ret = userStockSubscribeMapper.insert(model); if (ret > 0) { return ServerResponse.createBySuccessMsg("申购成功",request); } else { return ServerResponse.createByErrorMsg("申购失败",request); } //重复申购限制 UserStockSubscribe userStockSubscribe = userStockSubscribeMapper.selectOne(new QueryWrapper<UserStockSubscribe>().eq( "new_code", model.getNewCode()).eq("user_id", user.getId()).eq("type",model.getType())); if (userStockSubscribe != null) { return ServerResponse.createByErrorMsg("请勿重复申请",request); }else{ BigDecimal bound = new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getPrice()); BigDecimal useEnaAmount = iUserAssetsServices.getAvailableBalance(EStockType.IN.getCode(), user.getId()); if(useEnaAmount.compareTo(bound)<0){ return ServerResponse.createByErrorMsg("余额不足,配售失败",request); } model.setUserId(user.getId()); model.setNewName(stockSubscribe.getName()); model.setAgentId(user.getAgentId()); model.setAgentName(user.getAgentName()); model.setPhone(user.getPhone()); model.setBuyPrice(stockSubscribe.getPrice()); model.setBond(new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getPrice())); model.setRealName(Objects.equals(user.getRealName(), "")||user.getRealName()==null ?"模拟用户无实名":user.getRealName()); model.setAddTime(new Date()); model.setOrderNo(KeyUtils.getUniqueKey()); model.setType(stockSubscribe.getType()); model.setDbMoney(BigDecimal.ZERO); ret = userStockSubscribeMapper.insert(model); iUserAssetsServices.availablebalanceChange(EStockType.IN.getCode(), user.getId(),EUserAssets.BUY,bound.negate(),"",""); if (ret > 0) { return ServerResponse.createBySuccessMsg("配售成功",request); } else { return ServerResponse.createByErrorMsg("配售失败",request); } if (siteProduct.getRealNameDisplay() && user.getIsLock().intValue() == 1) { return ServerResponse.createByErrorMsg("订单失败,帐户已被锁定",request); } if (stockSubscribe == null) { return ServerResponse.createByErrorMsg("新的股票代码不存在",request); } if (model.getApplyNums() == null || model.getApplyNums() > stockSubscribe.getOrderNumber()|| model.getApplyNums() < 500) { return ServerResponse.createByErrorMsg("最小起订量是500,最大值" + stockSubscribe.getOrderNumber(),request); } if(stockSubscribe.getType() == 1){ model.setUserId(user.getId()); model.setNewName(stockSubscribe.getName()); model.setAgentId(user.getAgentId()); model.setAgentName(user.getAgentName()); model.setPhone(user.getPhone()); model.setBuyPrice(stockSubscribe.getPrice()); model.setBond(new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getPrice())); model.setRealName(Objects.equals(user.getRealName(), "")||user.getRealName()==null ?"模拟用户无实名":user.getRealName()); model.setAddTime(new Date()); model.setOrderNo(KeyUtils.getUniqueKey()); model.setType(stockSubscribe.getType()); ret = userStockSubscribeMapper.insert(model); if (ret > 0) { return ServerResponse.createBySuccessMsg("申购成功",request); } else { return ServerResponse.createByErrorMsg("申购失败",request); } }else{ BigDecimal bound = new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getPrice()); BigDecimal useEnaAmount = iUserAssetsServices.getAvailableBalance(EStockType.IN.getCode(), user.getId()); if(useEnaAmount.compareTo(bound)<0){ return ServerResponse.createByErrorMsg("余额不足,配售失败",request); } model.setUserId(user.getId()); model.setNewName(stockSubscribe.getName()); model.setAgentId(user.getAgentId()); model.setAgentName(user.getAgentName()); model.setPhone(user.getPhone()); model.setBuyPrice(stockSubscribe.getPrice()); model.setBond(new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getPrice())); model.setRealName(Objects.equals(user.getRealName(), "")||user.getRealName()==null ?"模拟用户无实名":user.getRealName()); model.setAddTime(new Date()); model.setOrderNo(KeyUtils.getUniqueKey()); model.setType(stockSubscribe.getType()); model.setDbMoney(BigDecimal.ZERO); ret = userStockSubscribeMapper.insert(model); iUserAssetsServices.availablebalanceChange(EStockType.IN.getCode(), user.getId(),EUserAssets.BUY,bound.negate(),"",""); if (ret > 0) { return ServerResponse.createBySuccessMsg("配售成功",request); } else { return ServerResponse.createByErrorMsg("配售失败",request); } } } } return ServerResponse.createByErrorMsg("申购失败",request); } @@ -182,6 +183,9 @@ if (userStockSubscribe.getStatus() == 5) { return ServerResponse.createByErrorMsg("It's been converted"); } if(userStockSubscribe.getStatus() == 3){ return ServerResponse.createByErrorMsg("不能更改申购状态"); } StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper<>(new StockSubscribe()) .eq("code", userStockSubscribe.getNewCode()).eq("type",userStockSubscribe.getType())); if((model.getStatus() == 3 && model.getApplyNumber() == null) || (model.getStatus() == 3 && model.getApplyNumber() == 0) ){