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.ResponseCode; import com.nq.common.ServerResponse; import com.nq.dao.EChoMapper; import com.nq.dao.OrderEchoMapper; import com.nq.dao.UserAssetsMapper; import com.nq.dao.UserPositionMapper; import com.nq.enums.EStockAIStatus; import com.nq.enums.EStockType; import com.nq.pojo.*; import com.nq.pojo.reponse.OrderEChoReponse; import com.nq.service.IEchoServices; import com.nq.service.IUserService; import com.nq.utils.PropertiesUtil; import com.nq.vo.subscribe.UserStockSubscribeVo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @Slf4j @Service public class EchoServices implements IEchoServices { @Autowired EChoMapper eChoMapper; @Autowired OrderEchoMapper orderEchoMapper; @Autowired IUserService iUserService; @Autowired private UserAssetsMapper userAssetsMapper; @Autowired private UserPositionMapper userPositionMapper; @Override public List queryList() { return eChoMapper.selectList(new LambdaQueryWrapper()); } @Override public ServerResponse queryListPage(int pageNum, int pageSize) { try { PageHelper.startPage(pageNum, pageSize); List eChoBeans = eChoMapper.selectList(null); PageInfo pageInfo = new PageInfo<>(eChoBeans); return ServerResponse.createBySuccess(pageInfo); } catch (Exception ex) { log.error("echoService queryListPage error", ex); } return ServerResponse.createByError(); } @Override public boolean buyECho(String eId, BigDecimal money, String accectType, HttpServletRequest request) { User user = this.iUserService.getCurrentRefreshUser(request); if (user == null) { return false; } EChoBean eChoBean = eChoMapper.selectById(Integer.parseInt(eId)); if (eChoBean == null) { return false; } else { OrderEchoBean orderEchoBean = new OrderEchoBean(); orderEchoBean.setEid(eChoBean.getId().toString()); orderEchoBean.setReturnOfRate(eChoBean.getReturnOfRate()); orderEchoBean.setUserId(user.getId() + ""); Long buyTime = System.currentTimeMillis(); orderEchoBean.setBuyTime(buyTime); Long sTime = Long.parseLong(eChoBean.getReturnTime())*86400000; Long endTime = buyTime +sTime; orderEchoBean.setEndTime(endTime);; orderEchoBean.setMoney(money.toString()); orderEchoBean.setState("1"); UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper() .eq(UserAssets::getUserId, orderEchoBean.getUserId()) .eq(UserAssets::getAccectType, accectType) ); userAssets.setAvailableBalance(userAssets.getAvailableBalance().subtract(money)); userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(money)); userAssetsMapper.updateById(userAssets); return orderEchoMapper.insert(orderEchoBean) >= 1; } } @Override public List queryOrderEcho(HttpServletRequest request) { User user = this.iUserService.getCurrentRefreshUser(request); if (user == null) { return new ArrayList<>(); } return orderEchoMapper.queryByUserId(user.getId()); } @Override public ServerResponse queryOrderEchoPage(int pageNum, int pageSize, HttpServletRequest request) { try { User user = iUserService.getCurrentRefreshUser(request); if (user == null) { return ServerResponse.createByErrorCodeMsg(ResponseCode.NEED_LOGIN.getCode(),"请先登录"); } PageHelper.startPage(pageNum, pageSize); List orderEchoOutList = orderEchoMapper.queryByUserId(user.getId()); PageInfo pageInfo = new PageInfo<>(orderEchoOutList); return ServerResponse.createBySuccess(pageInfo); } catch (Exception ex) { log.error("echoService queryOrderEchoPage error", ex); } return ServerResponse.createByError(); } @Override public List queryALLOrderEcho() { return orderEchoMapper.queryAll(); } @Override public void sendMoney() { // 创建固定大小的线程池,根据需求调整线程数量 ExecutorService executor = Executors.newFixedThreadPool(2); try { executor.submit(() -> sendMoney(EStockType.getDefault().getCode())); } finally { // 关闭线程池 executor.shutdown(); } } private void sendMoney(String stockType) { try { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("state", 1); queryWrapper.lt("end_time", System.currentTimeMillis()); List list = orderEchoMapper.selectList(queryWrapper); log.info("基金定时任务执行数量:{}", list.size()); for (OrderEchoBean orderEchoBean : list) { try { BigDecimal money = new BigDecimal(orderEchoBean.getMoney()); // 本金 BigDecimal rate = new BigDecimal(orderEchoBean.getReturnOfRate()); // 收益率 // 将rate除以100,并向上取整 rate = rate.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP); // 本金*收益率*周期/365=收益金额 BigDecimal incomeAmount = money.multiply(rate); BigDecimal aml = incomeAmount.add(money); UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper() .eq(UserAssets::getUserId, orderEchoBean.getUserId()) .eq(UserAssets::getAccectType, stockType) ); 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)); } /*UserPosition userPosition = userPositionMapper.selectOne(new LambdaQueryWrapper().gt(UserPosition::getAmountToBeCovered, BigDecimal.ZERO).eq(UserPosition::getUserId,userAssets.getUserId())); if(null != userPosition){ userPosition.setAmountToBeCovered(userAssets.getAmountToBeCovered()); userPositionMapper.updateById(userPosition); }*/ userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(money)); userAssetsMapper.updateById(userAssets); orderEchoBean.setState("2"); orderEchoBean.setEarnings(incomeAmount.toString()); orderEchoMapper.updateById(orderEchoBean); } catch (Exception e) { log.error("基金定时任务---失败: " + orderEchoBean.getId(), e); } } } catch (Exception ex) { log.error("基金定时任务---失败: ", ex); } } @Override public int insertEcho(EChoBean eChoBean) { return eChoMapper.insert(eChoBean); } @Override public int updateEcho(EChoBean eChoBean) { return eChoMapper.updateById(eChoBean); } @Override public int deletet(Integer id) { return eChoMapper.deleteById(id); } }