package com.nq.service.impl; import cn.hutool.core.lang.Assert; 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.SiteMessageMapper; import com.nq.dao.StockSubscribeMapper; import com.nq.dao.UserMapper; import com.nq.dao.UserStockSubscribeMapper; import com.nq.pojo.*; import com.nq.service.*; import com.nq.utils.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 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; @Autowired UserMapper userMapper; @Autowired ISiteMessageService iSiteMessageService; @Autowired SiteMessageMapper siteMessageMapper; @Autowired StockSubscribeMapper stockSubscribeMapper; @Autowired IUserPositionService iUserPositionService; @Autowired ISiteProductService iSiteProductService; @Autowired IUserService iUserService; @Autowired ISiteSettingService iSiteSettingService; /** * 用户新股申购 * * @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) { String userJson = RedisShardedPoolUtils.get(header); User user = this.iUserService.getCurrentRefreshUser(request); if (user == null) { return ServerResponse.createBySuccessMsg("請先登錄"); } if (user.getIsLock() == 1) { return ServerResponse.createByErrorMsg("账户已被锁定"); } if (model.getNewCode() != null) { StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper().eq("code", model.getNewCode())); //实名认证开关 SiteProduct siteProduct = iSiteProductService.getProductSetting(); if (siteProduct.getRealNameDisplay() && (StringUtils.isBlank(user.getRealName()) || StringUtils.isBlank(user.getIdCard()))) { return ServerResponse.createByErrorMsg("Order failed, please first real name authentication"); } //判断休息日不能买入 if (siteProduct.getHolidayDisplay()) { return ServerResponse.createByErrorMsg("No trading on weekends or holidays!"); } //重复申购限制 // UserStockSubscribe userStockSubscribe = userStockSubscribeMapper.selectOne(new QueryWrapper().eq("new_code", model.getNewCode()).eq("user_id", user.getId())); // if (userStockSubscribe != null) { // return ServerResponse.createByErrorMsg("请勿重复申购"); // } 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"); } //时间判定当前时间是否是申购时间 SiteSetting siteSetting = this.iSiteSettingService.getSiteSetting(); if (siteSetting == null) { log.error("下单出错,网站设置表不存在"); return ServerResponse.createByErrorMsg("Order failed, system setting error"); } 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("Application failed, not in the trading session"); } //时间判定当前时间是否是申购时间 if (stockSubscribe.getSubscribeTime().getTime() < System.currentTimeMillis()) { return ServerResponse.createByErrorMsg("The application time has passed"); } */ if (model.getApplyNums() == null || model.getApplyNums() > stockSubscribe.getOrderNumber() || model.getApplyNums() < stockSubscribe.getOrderMinNumber()) { return ServerResponse.createByErrorMsg("The minimum purchase quantity is " + stockSubscribe.getOrderMinNumber() + ", the maximum is large" + stockSubscribe.getOrderNumber()); } BigDecimal multiply = user.getEnableAmt().multiply(new BigDecimal(user.getLeverageRatio() != null ? user.getLeverageRatio() : 1)); if ((user.getFundsReplenished() == null || user.getFundsReplenished().compareTo(BigDecimal.ZERO) > 0) && multiply.compareTo(new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getPrice())) < 0) { return ServerResponse.createByErrorMsg("The user's available balance is insufficient, and the application conditions are not "); } BigDecimal subscriptionAmount = new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getPrice());//申购金额 Integer leverageRatio = stockSubscribe.getLever().toBigInteger().intValue(); BigDecimal leveragedFunds = BigDecimal.ZERO; leveragedFunds = user.getEnableAmt().multiply(BigDecimal.valueOf(leverageRatio)); // 金额不够 if (leveragedFunds.compareTo(subscriptionAmount) < 0) { return ServerResponse.createByErrorMsg("There is not enough money available"); } // 金额够的情况 分位2种情况 // 1 种是可用金额可用购买 //判断实际可用资金是否够申购金额 if (user.getEnableAmt().compareTo(subscriptionAmount) < 0) { user.setFundsReplenished((subscriptionAmount.subtract(user.getEnableAmt())));//待补资金 user.setEnableAmt(new BigDecimal(0)); model.setBond(subscriptionAmount); model.setDepositPaid(user.getEnableAmt()); // user.setIsLock(1); } else { user.setFundsReplenished(BigDecimal.ZERO);//待补资金 user.setEnableAmt(user.getEnableAmt().subtract(subscriptionAmount)); model.setBond(subscriptionAmount); model.setDepositPaid(subscriptionAmount); } user.setDjzj(user.getDjzj().add(subscriptionAmount)); int u = userMapper.updateById(user); if (u <= 0) { return ServerResponse.createByErrorMsg("Application failed due to unknown reasons"); } 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.setRealName(Objects.equals(user.getRealName(), "") || user.getRealName() == null ? "模拟用户无实名" : user.getRealName()); model.setAddTime(new Date()); model.setOrderNo(KeyUtils.getUniqueKey()); model.setType(stockSubscribe.getType()); model.setPushTime(stockSubscribe.getPushTime()); } ret = userStockSubscribeMapper.insert(model); if (ret > 0) { return ServerResponse.createBySuccessMsg("Successful application"); } else { return ServerResponse.createByErrorMsg("Application failure"); } } 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) { Integer applyNum = model.getApplyLastNumber(); if (applyNum == null || applyNum < 0) { return ServerResponse.createByErrorMsg("中签数不能小于0"); } int ret = 0; // log.info("model"+model); if (model.getId() != null) { // if (model.getStatus() == 3||model.getStatus() == 2) { model.setEndTime(DateTimeUtil.getCurrentDate()); // } UserStockSubscribe userStockSubscribe = userStockSubscribeMapper.load(model.getId()); //todo model.getApplyNumber() > 0 && if (userStockSubscribe.getApplyNumber() != null && userStockSubscribe.getApplyNumber() .equals(applyNum)) { return ServerResponse.createByErrorMsg("当前申购已中签,不能修改中签数量"); } //todo model.getApplyNumber() > 0 && if (applyNum != null) { ret = userStockSubscribeMapper.update1(model); } } if (ret > 0) return ServerResponse.createBySuccessMsg("Successful operation"); return ServerResponse.createByErrorMsg("Operation failure"); } public void edit(UserStockSubscribe model, StockSubscribe stockSubscribe, User user) { Integer number = model.getApplyLastNumber(); model.setApplyLastNumber(null); Assert.isFalse(stockSubscribe.getOrderNumber() < number, "The number of successful applications exceeds the maximum number of applications"); Assert.isFalse(number > model.getApplyNums(), "The number of successful applications cannot exceed the number of applications"); model.setBond(stockSubscribe.getPrice().multiply(BigDecimal.valueOf(number))); //给用户推送消息 SiteMessage siteMessage = new SiteMessage(); siteMessage.setUserId(model.getUserId()); siteMessage.setUserName(model.getRealName()); siteMessage.setTypeName("New share subscription"); siteMessage.setStatus(1); siteMessage.setAddTime(DateTimeUtil.getCurrentDate()); BigDecimal rgTotleMoney = new BigDecimal(model.getApplyNums()).multiply(model.getBuyPrice()); BigDecimal zqTotleMoney = new BigDecimal(number).multiply(model.getBuyPrice()); user.setDjzj(user.getDjzj().subtract(rgTotleMoney).add(zqTotleMoney)); //修改可用资金和待补充资金 int num = model.getApplyNums() - number; BigDecimal returnQuantity = new BigDecimal(num);//返还数量 BigDecimal rebatePrice = returnQuantity.multiply(model.getBuyPrice());//返还保证金金额 BigDecimal fundsReplenished = BigDecimal.ZERO; if (user.getFundsReplenished() != null) { fundsReplenished = user.getFundsReplenished(); } if (rebatePrice.compareTo(fundsReplenished) >= 0) { fundsReplenished = BigDecimal.ZERO; user.setEnableAmt(user.getEnableAmt().add(rebatePrice.subtract(user.getFundsReplenished()))); user.setFundsReplenished(fundsReplenished); } else { user.setFundsReplenished(fundsReplenished.subtract(rebatePrice)); } userMapper.updateById(user); if (model.getDepositPaid() != null) { model.setDepositPaid(model.getDepositPaid().subtract(rebatePrice)); } model.setApplyNumber(number); if (rebatePrice.compareTo(BigDecimal.ZERO) > 0) { siteMessage.setContent("【新股申购中签】恭喜您,新股申购中签成功,申购金额:" + model.getBond() + "退还" + rebatePrice + ",请及时关注哦。"); } else { siteMessage.setContent("【新股申购中签】恭喜您,新股申购中签成功,申购金额:" + model.getBond() + ",请及时关注哦。"); } model.setStatus(3); userStockSubscribeMapper.updateById(model); siteMessageMapper.insert(siteMessage); } /** * 发送站内信 */ @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; k < users.size(); k++) { User user = users.get(k); SiteMessage siteMessage = new SiteMessage(); siteMessage.setUserId(user.getId()); siteMessage.setUserName(user.getRealName()); siteMessage.setTypeName("站内消息"); siteMessage.setStatus(1); siteMessage.setContent("【站内消息】" + model.getRemarks()); siteMessage.setAddTime(DateTimeUtil.getCurrentDate()); ret = iSiteMessageService.insert(siteMessage); } } else { //指定用户发站内信 User user = userMapper.selectByPrimaryKey(model.getUserId()); SiteMessage siteMessage = new SiteMessage(); siteMessage.setUserId(user.getId()); siteMessage.setUserName(user.getRealName()); siteMessage.setTypeName("站内消息"); siteMessage.setStatus(1); siteMessage.setContent("【站内消息】" + model.getRemarks()); siteMessage.setAddTime(DateTimeUtil.getCurrentDate()); ret = iSiteMessageService.insert(siteMessage); } } if (ret > 0) { 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) { 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); } } // PageInfo pageInfo = new PageInfo(); // pageInfo.setList(userStockSubscribe); // GoogleTranslateUtil transan = new GoogleTranslateUtil(); // //list转String // String json = JsonUtil.obj2String(list); // String translate; // try { // translate = transan.translate("zh", "en", json); // } catch (Exception e) { // throw new RuntimeException(e); // } // //String转list // List list1 = JsonUtil.string2Obj(translate, List.class, UserStockSubscribe.class); 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 (stockSubscribe.getSubscriptionTime().getTime() < System.currentTimeMillis()) { return ServerResponse.createByErrorMsg("The subscription time has passed"); } if (userStockSubscribe.getStatus() == 3) { userStockSubscribe.setSubmitTime(DateTimeUtil.getCurrentDate()); userStockSubscribe.setStatus(4); User user1 = userMapper.selectByPrimaryKey(userStockSubscribe.getUserId()); // log.info("user" + user1); if (user1.getEnableAmt().compareTo(userStockSubscribe.getBond()) < 0) { return ServerResponse.createByErrorMsg("Insufficient balance"); } // log.info("原可用资金"+user1.getEnableAmt()); BigDecimal enableAmt = user1.getEnableAmt().subtract(userStockSubscribe.getBond()); // log.info("enableAmt" + enableAmt); user1.setEnableAmt(enableAmt); // log.info("可用资金" + user1.getEnableAmt()+"保证金"+userStockSubscribe.getBond()+"原djzj"+user1.getDjzj()); if (user1.getDjzj() != null) { user1.setDjzj(user1.getDjzj().add(userStockSubscribe.getBond())); } else { user1.setDjzj(userStockSubscribe.getBond()); } // ret = userMapper.updateByPrimaryKeySelective(user1); } else { return ServerResponse.createByErrorMsg("There is no fee for unsuccessful applicants"); } } else { return ServerResponse.createByErrorMsg("New share subscription order does not exist!"); } ret = userStockSubscribeMapper.update1(userStockSubscribe); if (ret > 0) { return ServerResponse.createBySuccessMsg("Successful operation"); } else { return ServerResponse.createByErrorMsg("Operation 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"); } }