package com.nq.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.nq.common.ServerResponse; import com.nq.dao.StockSubscribeMapper; import com.nq.dao.UserAssetsMapper; import com.nq.dao.UserMapper; import com.nq.dao.UserStockSubscribeMapper; import com.nq.enums.EStockType; import com.nq.enums.EUserAssets; import com.nq.pojo.*; import com.nq.service.*; import com.nq.utils.timeutil.DateTimeUtil; import com.nq.utils.KeyUtils; import com.nq.utils.PropertiesUtil; import com.nq.utils.redis.JsonUtil; import com.nq.utils.redis.RedisShardedPoolUtils; import com.nq.utils.stock.BuyAndSellUtils; import com.sun.org.apache.bcel.internal.generic.RETURN; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; /** * 新股申购 * @author lr * @date 2020/07/24 */ @Service("IUserStockSubscribeService") @Slf4j public class UserStockSubscribeServiceImpl implements IUserStockSubscribeService { @Resource private UserStockSubscribeMapper userStockSubscribeMapper; @Resource UserMapper userMapper; @Autowired ISiteMessageService iSiteMessageService; @Resource StockSubscribeMapper stockSubscribeMapper; @Autowired IUserPositionService iUserPositionService; @Autowired ISiteProductService iSiteProductService; @Autowired IUserService iUserService; @Autowired ISiteSettingService iSiteSettingService; @Autowired TradingHourServiceImpl tradingHourService; @Resource IUserAssetsServices iUserAssetsServices; @Autowired UserAssetsMapper userAssetsMapper; /** * 用户新股申购 * @param model * @return */ @Override @Transactional public ServerResponse insert(UserStockSubscribe model, HttpServletRequest request) throws Exception { int ret = 0; if (model == null) { 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() .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); } //重复申购限制 UserStockSubscribe userStockSubscribe = userStockSubscribeMapper.selectOne(new QueryWrapper().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); } }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); } @Override public int update(UserStockSubscribe model) { int ret = userStockSubscribeMapper.update1(model); return ret>0 ? ret: 0; } /** * admin 新股申购-添加和修改 */ @Override @Transactional public ServerResponse save(UserStockSubscribe model, HttpServletRequest request) { int ret = 0; if( model.getId() != null ){ if (model.getStatus() == 3||model.getStatus() == 2) { model.setEndTime(DateTimeUtil.getCurrentDate()); } UserStockSubscribe userStockSubscribe = userStockSubscribeMapper.load(model.getId()); 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) ){ return ServerResponse.createByErrorMsg("中签数量不能小于0"); } if (model.getStatus() == 3 && model.getApplyNumber() != null){ if(stockSubscribe.getType() == 1){ model.setBond(stockSubscribe.getPrice().multiply(BigDecimal.valueOf(model.getApplyNumber()))); model.setDbMoney(model.getDbMoney()); //客户中签直接扣除客户账户可用资金 UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN", userStockSubscribe.getUserId()); if(null == userAssets){ return ServerResponse.createByErrorMsg("客户资金账户不存在"); } BigDecimal decimal = userStockSubscribe.getBuyPrice().multiply(new BigDecimal(model.getApplyNumber()));//中签总价 BigDecimal availableBalance = userAssets.getAvailableBalance().subtract(decimal);//剩余可用余额 if(decimal.compareTo(userAssets.getAvailableBalance()) <= 0){ userAssets.setAvailableBalance(availableBalance); }else{ BigDecimal amountToBeCovered = decimal.subtract(userAssets.getAvailableBalance());//待补金额 userAssets.setAvailableBalance(BigDecimal.ZERO); userAssets.setAmountToBeCovered(userAssets.getAmountToBeCovered().add(amountToBeCovered)); } userAssetsMapper.updateById(userAssets); ret = userStockSubscribeMapper.update1(model); }else{ if(model.getApplyNumber()>model.getApplyNums()){ return ServerResponse.createByErrorMsg("配置中签数量不能超过申请数量",request); } BigDecimal cCount = new BigDecimal(model.getApplyNums()-model.getApplyNumber()); BigDecimal tMoney = stockSubscribe.getPrice().multiply(cCount); iUserAssetsServices.availablebalanceChange(EStockType.IN.getCode(),userStockSubscribe.getUserId(), EUserAssets.TOP_UP,tMoney,"",""); model.setBond(stockSubscribe.getPrice().multiply(BigDecimal.valueOf(model.getApplyNumber()))); model.setDbMoney(BigDecimal.ZERO); model.setStatus(4); ret = userStockSubscribeMapper.update1(model); } }else if (model.getStatus() == 2){ ret = userStockSubscribeMapper.update1(model); }else if (model.getStatus() == 5){ return iUserPositionService.newStockToPosition(model.getId()); } if(ret>0 && model.getStatus() == 3 ){ //给用户推送消息 SiteMessage siteMessage = new SiteMessage(); siteMessage.setUserId(userStockSubscribe.getUserId()); siteMessage.setUserName(userStockSubscribe.getRealName()); siteMessage.setTypeName("New share subscription"); siteMessage.setStatus(1); siteMessage.setAddTime(DateTimeUtil.getCurrentDate()); if (stockSubscribe.getType() == 2){ siteMessage.setContent("【新股申购中签】恭喜您,新股申购中签成功,申购金额:"+ userStockSubscribe.getBond() +"请及时关注哦。"); }else { siteMessage.setContent("【新股申购中签】恭喜您,新股申购中签成功,申购金额:" + userStockSubscribe.getBond() + ",请及时关注哦。"); } iSiteMessageService.insert(siteMessage); }else if(ret>0 && model.getStatus() == 2) { //给达到消息强平提醒用户推送消息 if (stockSubscribe.getType() != 2) { SiteMessage siteMessage = new SiteMessage(); siteMessage.setUserId(userStockSubscribe.getUserId()); siteMessage.setUserName(userStockSubscribe.getRealName()); siteMessage.setTypeName("新股申购"); siteMessage.setStatus(1); siteMessage.setContent("【新股申购未中签】很遗憾,您的新股申购本次未中签,申购金额:" + userStockSubscribe.getBond() + "。"); siteMessage.setAddTime(DateTimeUtil.getCurrentDate()); iSiteMessageService.insert(siteMessage); }else { User user = userMapper.selectById(userStockSubscribe.getUserId()); userMapper.updateByPrimaryKey(user); SiteMessage siteMessage = new SiteMessage(); siteMessage.setUserId(userStockSubscribe.getUserId()); siteMessage.setUserName(userStockSubscribe.getRealName()); siteMessage.setTypeName("新股申购"); siteMessage.setStatus(1); siteMessage.setContent("【新股申购未中签】很遗憾,您的新股申购本次未中签,申购金额:" + userStockSubscribe.getBond() + "已退还。"); siteMessage.setAddTime(DateTimeUtil.getCurrentDate()); iSiteMessageService.insert(siteMessage); } } } else{ if(model.getPhone() != null&&model.getId()==null) { User user = userMapper.findByPhone(model.getPhone()); if (user == null) { return ServerResponse.createByErrorMsg("User does not exist"); } model.setRealName(user.getRealName()); model.setUserId(user.getId()); model.setAgentId(user.getAgentId()); model.setAgentName(user.getAgentName()); StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper<>(new StockSubscribe()) .eq("code", model.getNewCode())); if (stockSubscribe == null) { return ServerResponse.createByErrorMsg("Failed. Ipo information does not exist"); } model.setNewName(stockSubscribe.getName()); model.setBuyPrice(stockSubscribe.getPrice()); if (model.getApplyNums() > stockSubscribe.getOrderNumber() || model.getApplyNumber() > stockSubscribe.getOrderNumber()) { return ServerResponse.createByErrorMsg("The number of applications or the number of wins is the maximum" + stockSubscribe.getOrderNumber()); } model.setBond(model.getBuyPrice().multiply(BigDecimal.valueOf(model.getApplyNumber()))); model.setAddTime(DateTimeUtil.getCurrentDate()); model.setOrderNo(KeyUtils.getUniqueKey()); model.setType(stockSubscribe.getType()); ret = userStockSubscribeMapper.insert(model); } } if(ret>0){ return ServerResponse.createBySuccessMsg("Successful operation"); } return ServerResponse.createByErrorMsg("Operation failure"); } /** * 发送站内信 */ @Override public ServerResponse sendMsg(UserStockSubscribe model, HttpServletRequest request) { int ret = 0; if(model!=null){ //所有人发站内信 if(model.getUserId() == 0){ List users = this.userMapper.listByAdmin(null, null, null, null); for(int k=0;k0){ return ServerResponse.createBySuccessMsg("Successful operation"); } return ServerResponse.createByErrorMsg("Operation failure"); } /*新股申购-查询列表*/ @Override public ServerResponse getList(int pageNum, int pageSize, String keyword, HttpServletRequest request){ PageHelper.startPage(pageNum, pageSize); List listData = this.userStockSubscribeMapper.pageList(pageNum, pageSize, keyword); PageInfo pageInfo = new PageInfo(listData); pageInfo.setList(listData); return ServerResponse.createBySuccess(pageInfo); } /*新股申购-查询详情*/ @Override public ServerResponse getDetail(int id) { return ServerResponse.createBySuccess(this.userStockSubscribeMapper.load(id)); } /*新股申购-查询用户最新新股申购数据*/ @Override public ServerResponse getOneSubscribeByUserId(String type,HttpServletRequest request) { String property = PropertiesUtil.getProperty("user.cookie.name"); String header = request.getHeader(property); if (header != null) { User user = iUserService.getCurrentRefreshUser(request); List userStockSubscribe = null; if (type==null||type.equals("")){ userStockSubscribe = this.userStockSubscribeMapper.selectList(new QueryWrapper<>(new UserStockSubscribe()).eq("user_id", user.getId()).orderByDesc("add_time")); }else{ userStockSubscribe = this.userStockSubscribeMapper.selectList(new QueryWrapper<>(new UserStockSubscribe()).eq("user_id", user.getId()).eq("type", type).orderByDesc("add_time")); } List list = new ArrayList<>(); for (UserStockSubscribe userStockSubscribe1 : userStockSubscribe) { StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper<>(new StockSubscribe()) .eq("code", userStockSubscribe1.getNewCode()) .eq("type",userStockSubscribe1.getType())); if (stockSubscribe != null) { list.add(userStockSubscribe1); } } return ServerResponse.createBySuccess(list); } return ServerResponse.createByErrorMsg("请先登录",request); } /** * 新股申购-用户提交金额 */ @Override @Transactional public ServerResponse userSubmit(Integer id,HttpServletRequest request) { int ret = 0; String property = PropertiesUtil.getProperty("user.cookie.name"); String header = request.getHeader(property); if (header != null) { User user = iUserService.getCurrentRefreshUser(request); if(id == null){ return ServerResponse.createByErrorMsg("参数错误",request); } UserStockSubscribe userStockSubscribe = userStockSubscribeMapper.load(id); if (userStockSubscribe != null && userStockSubscribe.getUserId().equals(user.getId())) { StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper<>(new StockSubscribe()) .eq("code", userStockSubscribe.getNewCode())); if(userStockSubscribe.getType()== 2 ){ return ServerResponse.createByErrorMsg("未中签,无需支付",request); } if (userStockSubscribe.getStatus() == 3) { userStockSubscribe.setSubmitTime(DateTimeUtil.getCurrentDate()); userStockSubscribe.setStatus(4); BigDecimal bigDecimal = iUserAssetsServices. getAvailableBalance(EStockType.IN.getCode(), userStockSubscribe.getUserId()); BigDecimal multiply = userStockSubscribe.getBuyPrice().multiply(new BigDecimal(userStockSubscribe.getApplyNumber())); if(bigDecimal.compareTo(multiply) <= 0){ return ServerResponse.createByErrorMsg("余额不足",request); } iUserAssetsServices.availablebalanceChange(EStockType.IN.getCode(),userStockSubscribe.getUserId(), EUserAssets.BUY,multiply.negate(),"",""); userStockSubscribe.setDbMoney(BigDecimal.ZERO); userStockSubscribeMapper.update1(userStockSubscribe); return ServerResponse.createBySuccess(); } else { return ServerResponse.createByErrorMsg("不成功的申请者不收取任何费用",request); } } else { return ServerResponse.createByErrorMsg("新股认购订单不存在!",request); } } return ServerResponse.createByErrorMsg("请先登录",request); } /** * 新股申购-删除 * * @param id * @param request * @return */ @Override public ServerResponse del(int id, HttpServletRequest request) { int ret = 0; if(id>0){ ret = userStockSubscribeMapper.delete1(id); } if(ret>0){ return ServerResponse.createBySuccessMsg("Successful operation"); } return ServerResponse.createByErrorMsg("Operation failure"); } }