package com.nq.service.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.nq.dao.EChoMapper;
|
import com.nq.dao.OrderEchoMapper;
|
import com.nq.dao.UserAssetsMapper;
|
import com.nq.dao.UserPositionMapper;
|
import com.nq.enums.EStockType;
|
import com.nq.enums.EUserAssets;
|
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 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 UserAssetsServices serAssetsServices;
|
|
@Autowired
|
private UserAssetsMapper userAssetsMapper;
|
|
@Autowired
|
private UserPositionMapper userPositionMapper;
|
|
@Override
|
public List<EChoBean> queryList() {
|
return eChoMapper.selectList(new LambdaQueryWrapper<EChoBean>());
|
}
|
|
@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<UserAssets>()
|
.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<OrderEchoOut> queryOrderEcho(HttpServletRequest request) {
|
User user = this.iUserService.getCurrentRefreshUser(request);
|
if (user == null) {
|
return new ArrayList<>();
|
}
|
return orderEchoMapper.queryByUserId(user.getId());
|
}
|
|
@Override
|
public List<OrderEChoReponse> queryALLOrderEcho() {
|
return orderEchoMapper.queryAll();
|
}
|
|
@Override
|
public void sendMoney() {
|
// 创建固定大小的线程池,根据需求调整线程数量
|
ExecutorService executor = Executors.newFixedThreadPool(2);
|
try {
|
executor.submit(() -> sendMoney(EStockType.US.getCode()));
|
executor.submit(() -> sendMoney(EStockType.MX.getCode()));
|
} finally {
|
// 关闭线程池
|
executor.shutdown();
|
}
|
}
|
|
private void sendMoney(String stockType) {
|
try {
|
QueryWrapper<OrderEchoBean> queryWrapper = new QueryWrapper<>();
|
queryWrapper.eq("state", 1);
|
queryWrapper.lt("end_time", System.currentTimeMillis());
|
List<OrderEchoBean> 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<UserAssets>()
|
.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<UserPosition>().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);
|
}
|
}
|