package com.nq.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.pojo.*; import com.nq.service.*; import com.nq.utils.ConverterUtil; 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.nq.vo.stock.UserStockSubscribeVo; 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.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; /** * 新股申购 * @author lr * @date 2020/07/24 */ @Service @Slf4j public class UserStockSubscribeServiceImpl implements IUserStockSubscribeService { @Resource private UserStockSubscribeMapper userStockSubscribeMapper; @Autowired UserMapper userMapper; @Autowired ISiteMessageService iSiteMessageService; @Autowired StockSubscribeMapper stockSubscribeMapper; @Autowired IUserPositionService iUserPositionService; @Autowired ISiteProductService iSiteProductService; @Autowired IUserService iUserService; @Autowired ISiteSettingService iSiteSettingService; @Autowired TradingHourServiceImpl tradingHourService; @Autowired UserAssetsServices userAssetsServices; @Autowired UserAssetsMapper userAssetsMapper; /** * 用户新股申购 * @param model * @return */ @Override public ServerResponse insert(UserStockSubscribe model, HttpServletRequest request) throws Exception { int ret = 0; if (model == null) { return ServerResponse.createByErrorMsg("Parameter error"); } String property = PropertiesUtil.getProperty("user.cookie.name"); String header = request.getHeader(property); if (header != null) { User user = this.iUserService.getCurrentRefreshUser(request); if (user == null){ return ServerResponse.createBySuccessMsg("請先登錄"); } if (model.getNewCode() != null) { StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper().eq("code", model.getNewCode())); //实名认证开关 SiteProduct siteProduct = iSiteProductService.getProductSetting(); if (user.getIsActive() != 2) { return ServerResponse.createByErrorMsg("Order failed, please first real name authentication"); } if (siteProduct.getRealNameDisplay() && user.getIsLock().intValue() == 1) { return ServerResponse.createByErrorMsg("Order failed, account has been locked"); } if (stockSubscribe == null) { return ServerResponse.createByErrorMsg("The new stock code does not exist"); } if(System.currentTimeMillis() < stockSubscribe.getSubscribeTime().getTime()){ return ServerResponse.createByErrorMsg("It is not time to apply for purchase"); } if(System.currentTimeMillis() > stockSubscribe.getSubscribeEndTime().getTime()){ return ServerResponse.createByErrorMsg("The application time has passed"); } if(model.getApplyNums() < stockSubscribe.getOrderMinNumber()){ return ServerResponse.createByErrorMsg("The number of configurations cannot be less than"+stockSubscribe.getOrderMinNumber()); } UserAssets userAssets = userAssetsServices.selectByUserId(user.getId(), EStockType.IN.getCode()); if(stockSubscribe.getType() == 2){ BigDecimal multiply = stockSubscribe.getPrice().multiply(new BigDecimal(model.getApplyNums())); if(userAssets.getAvailableBalance().compareTo(multiply) < 0){ return ServerResponse.createByErrorMsg("not sufficient funds"); } } BigDecimal price = new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getPrice()); 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(price); model.setRealName(Objects.equals(user.getRealName(), "")||user.getRealName()==null ?"模拟用户无实名":user.getRealName()); model.setAddTime(new Date()); model.setOrderNo(KeyUtils.getUniqueKey()); model.setType(stockSubscribe.getType()); //如果是配售 if (stockSubscribe.getType() == 2) { //直接转已认缴 model.setStatus(4); model.setApplyNumber(model.getApplyNums()); userAssets.setAvailableBalance(userAssets.getAvailableBalance().subtract(price)); } userStockSubscribeMapper.insert(model); userAssetsMapper.updateById(userAssets); return ServerResponse.createBySuccessMsg("Successful application"); } } return ServerResponse.createByErrorMsg("Not logged in"); } @Override public int update(UserStockSubscribe model) { int ret = userStockSubscribeMapper.update1(model); return ret>0 ? ret: 0; } /** * admin 新股申购-添加和修改 */ @Override public ServerResponse save(UserStockSubscribe model, HttpServletRequest request) { int ret = 0; if( model.getId() != null ){ UserStockSubscribe userStockSubscribe = userStockSubscribeMapper.load(model.getId()); if (userStockSubscribe.getStatus() == 5) { return ServerResponse.createByErrorMsg("It's been converted"); } StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper<>(new StockSubscribe()).eq("code", userStockSubscribe.getNewCode())); if (model.getStatus() == 3 && model.getApplyNumber() != null){ if(stockSubscribe.getOrderNumber()< model.getApplyNumber()){ return ServerResponse.createByErrorMsg("The number of successful applications exceeds the maximum number of applications"); } model.setBond(stockSubscribe.getPrice().multiply(BigDecimal.valueOf(model.getApplyNumber()))); ret = userStockSubscribeMapper.updateById(model); }else if (model.getStatus() == 2){ ret = userStockSubscribeMapper.updateById(model); }else if (model.getStatus() == 4){ 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()); siteMessage.setContent("【新股申购中签】恭喜您,新股申购中签成功,申购金额:" + userStockSubscribe.getBond() + ",请及时关注哦。"); iSiteMessageService.insert(siteMessage); }else if(ret>0 && model.getStatus() == 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); } } 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, Integer type,HttpServletRequest request){ PageHelper.startPage(pageNum, pageSize); List listData = this.userStockSubscribeMapper.pageList(pageNum, pageSize, keyword,type); // 收集所有的userId List userIds = listData.stream().map(UserStockSubscribe::getUserId).collect(Collectors.toList()); // 一次性查询所有的用户信息 List userList = userMapper.selectBatchIds(userIds); List subscribeVoList = new ArrayList<>(); // 遍历listData,将查询到的用户信息填充到UserStockSubscribeVo中 listData.forEach(f -> { User user = userList.stream().filter(u -> u.getId().equals(f.getUserId())).findFirst().orElse(null); UserAssets userAssets = userAssetsServices.selectByUserId(user.getId(), EStockType.IN.getCode()); if (user != null) { UserStockSubscribeVo userStockSubscribeVo = ConverterUtil.convert(f, UserStockSubscribeVo.class); BigDecimal divide = userAssets.getAvailableBalance().divide(userStockSubscribeVo.getBuyPrice(), 0, RoundingMode.HALF_UP); userStockSubscribeVo.setMaxSubscribeNum(divide.intValue()); subscribeVoList.add(userStockSubscribeVo); } }); PageInfo pageInfo = new PageInfo(subscribeVoList); pageInfo.setList(subscribeVoList); 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) { String userJson = RedisShardedPoolUtils.get(header); User user = (User) JsonUtil.string2Obj(userJson, User.class); if (user == null) { return ServerResponse.createByErrorMsg("User not logged in"); } 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())); if (stockSubscribe != null) { list.add(userStockSubscribe1); } } return ServerResponse.createBySuccess(list); } return ServerResponse.createByErrorMsg("Please log in first"); } /** * 新股申购-用户提交金额 */ @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) { String userJson = RedisShardedPoolUtils.get(header); User user = (User) JsonUtil.string2Obj(userJson, User.class); if (user == null) { return ServerResponse.createByErrorMsg("User not logged in"); } if (id == null) { return ServerResponse.createByErrorMsg("Parameter error"); } UserStockSubscribe userStockSubscribe = userStockSubscribeMapper.load(id); log.info("userStockSubscribe:{}", userStockSubscribe); 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("No payment is required for offline placement"); } //判断是否到了认缴时间 if (System.currentTimeMillis() < stockSubscribe.getSubscriptionTime().getTime()) { return ServerResponse.createByErrorMsg("The subscription time is not up"); } //判断是否已过认缴时间 if (stockSubscribe.getSubscriptionEndTime().getTime() < System.currentTimeMillis()) { return ServerResponse.createByErrorMsg("The subscription time has passed"); } if (userStockSubscribe.getStatus() == 3) { userStockSubscribe.setSubmitTime(DateTimeUtil.getCurrentDate()); userStockSubscribe.setStatus(4); UserAssets userAssets = userAssetsServices.selectByUserId(userStockSubscribe.getUserId(), EStockType.IN.getCode()); if (userAssets.getAvailableBalance().compareTo(userStockSubscribe.getBond()) < 0) { return ServerResponse.createByErrorMsg("Insufficient balance"); } BigDecimal enableAmt = userAssets.getAvailableBalance().subtract(userStockSubscribe.getBond()); userAssets.setAvailableBalance(enableAmt); ret = userAssetsMapper.updateById(userAssets); } else { return ServerResponse.createByErrorMsg("There is no fee for unsuccessful applicants"); } } else { return ServerResponse.createByErrorMsg("New share subscription order does not exist!"); } if (ret > 0) { ret = userStockSubscribeMapper.update1(userStockSubscribe); if (ret > 0) { return ServerResponse.createBySuccessMsg("Successful operation"); } else { return ServerResponse.createByErrorMsg("Operation failure"); } } else { return ServerResponse.createByErrorMsg("Deduction failure"); } } return ServerResponse.createByErrorMsg("Please log in first"); } /** * 新股申购-删除 * * @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"); } @Override public ServerResponse backgroundPurchase(Integer id) { int ret = 0; if (id == null) { return ServerResponse.createByErrorMsg("Parameter error"); } UserStockSubscribe userStockSubscribe = userStockSubscribeMapper.load(id); User user = userMapper.selectById(userStockSubscribe.getUserId()); log.info("userStockSubscribe:{}", userStockSubscribe); 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("No payment is required for offline placement"); } //判断是否到了认缴时间 if (System.currentTimeMillis() < stockSubscribe.getSubscriptionTime().getTime()) { return ServerResponse.createByErrorMsg("The subscription time is not up"); } //判断是否已过认缴时间 if (stockSubscribe.getSubscriptionEndTime().getTime() < System.currentTimeMillis()) { return ServerResponse.createByErrorMsg("The subscription time has passed"); } if (userStockSubscribe.getStatus() == 3) { userStockSubscribe.setSubmitTime(DateTimeUtil.getCurrentDate()); userStockSubscribe.setStatus(4); UserAssets userAssets = userAssetsServices.selectByUserId(userStockSubscribe.getUserId(), EStockType.IN.getCode()); if (userAssets.getAvailableBalance().compareTo(userStockSubscribe.getBond()) < 0) { return ServerResponse.createByErrorMsg("Insufficient balance"); } BigDecimal enableAmt = userAssets.getAvailableBalance().subtract(userStockSubscribe.getBond()); userAssets.setAvailableBalance(enableAmt); ret = userAssetsMapper.updateById(userAssets); } else { return ServerResponse.createByErrorMsg("There is no fee for unsuccessful applicants"); } } else { return ServerResponse.createByErrorMsg("New share subscription order does not exist!"); } if (ret > 0) { ret = userStockSubscribeMapper.update1(userStockSubscribe); if (ret > 0) { return ServerResponse.createBySuccessMsg("Successful operation"); } else { return ServerResponse.createByErrorMsg("Operation failure"); } } else { return ServerResponse.createByErrorMsg("Deduction failure"); } } }