package com.gear.swx.task;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.gear.common.constant.SwxConstons;
|
import com.gear.swx.domain.SwxLoanRecord;
|
import com.gear.swx.domain.SwxMoneyLog;
|
import com.gear.swx.domain.SwxSmartOrder;
|
import com.gear.swx.domain.SwxUser;
|
import com.gear.swx.service.ISwxLoanRecordService;
|
import com.gear.swx.service.ISwxMoneyLogService;
|
import com.gear.swx.service.ISwxSmartOrderService;
|
import com.gear.swx.service.ISwxUserService;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.util.CollectionUtils;
|
|
import java.math.BigDecimal;
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.List;
|
|
/**
|
* 计息定时任务
|
*/
|
@Component("BearingTask")
|
//@Slf4j
|
@Transactional
|
public class BearingTask20240514 {
|
private static final Logger lg = LoggerFactory.getLogger("taskFile");
|
private static final Logger logger = LoggerFactory.getLogger(BearingTask20240514.class);
|
@Autowired
|
private ISwxLoanRecordService swxLoanRecordService;
|
|
@Autowired
|
private ISwxUserService swxUserService;
|
|
@Autowired
|
private ISwxMoneyLogService swxMoneyLogService;
|
|
@Autowired
|
private ISwxSmartOrderService swxSmartOrderService;
|
|
/**利润补偿,防止分润时出现错误。以至于数据状态停滞*/
|
public void profitCompensate() throws Exception{
|
List<SwxSmartOrder> profitCompensateList = swxSmartOrderService.getProfitCompensateList();
|
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:00");
|
for (SwxSmartOrder item : profitCompensateList) {
|
//计算本期利润
|
BigDecimal rateAll = item.getRate().add(item.getAddRate());
|
BigDecimal profit = item.getAmount().multiply(rateAll).divide(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP);
|
item.setAllProfit(item.getAllProfit().add(profit));
|
//240406 当期利息 改为整个周期利息的意思。订单创建时直接计算
|
// item.setCurrentProfit(profit);
|
item.setCurrentDay(item.getCurrentDay()+1);
|
SwxUser swxUser = swxUserService.getById(item.getUserId());
|
if(swxUser != null){
|
// swxUser.setProfit(swxUser.getProfit().add(profit));
|
//判断当前收益天数是否已满
|
if(item.getAllDay() <= item.getCurrentDay()){
|
//收益满的话,就将钱返回给用户,并重置状态
|
item.setStatus(1);
|
SwxMoneyLog moneyLog = new SwxMoneyLog();
|
moneyLog.setInfo("用户购买产品"+item.getId()+"收益完成,本金为:"+item.getAmount()+"利润为:"+item.getAllProfit());
|
moneyLog.setStatus(SwxConstons.SWX_EXAMINE_STATUS_YES);
|
moneyLog.setType(SwxConstons.SWX_MONEY_LOG_TYPE_SMART_PROFIT);
|
moneyLog.setSymbol(SwxConstons.SWX_MONEY_TYPE_INCOME);
|
moneyLog.setTitle("智能交易收益");
|
moneyLog.setOldAmount(swxUser.getAmount());
|
//修改用户资金
|
swxUser.setAmount(swxUser.getAmount().add(item.getAmount()).add(item.getAllProfit()));
|
swxUser.setProfit(swxUser.getProfit().add(item.getAllProfit()));
|
moneyLog.setNowAmount(swxUser.getAmount());
|
moneyLog.setUserId(swxUser.getId());
|
moneyLog.setBusiId(item.getId());
|
moneyLog.setMoney(item.getAmount());
|
swxMoneyLogService.save(moneyLog);
|
}else{
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(dateFormat.parse(item.getNextProfitTime()));
|
calendar.add(Calendar.DAY_OF_MONTH, 1);
|
item.setNextProfitTime(dateFormat.format(calendar.getTime()));
|
}
|
// swxUserService.updateById(swxUser);
|
swxUserService.updateMoney(swxUser.getId(), swxUser.getAmount(), swxUser.getProfit());
|
}else{
|
//如果没找到对应用户,则终止该交易
|
item.setStatus(1);
|
}
|
// swxSmartOrderService.updateById(item);
|
swxSmartOrderService.updateSmartById(item);
|
lg.info("利润补偿,id为:{}", item.getId());
|
}
|
lg.info("利润补偿,补偿{}条", profitCompensateList.size());
|
}
|
|
/**分润和贷款*/
|
public void BearingTask() throws ParseException {
|
Date date = new Date();
|
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:00");
|
String dateM = dateFormat.format(date);
|
System.out.println("当前时间:"+dateM);
|
QueryWrapper<SwxLoanRecord> loanQuery = new QueryWrapper<>();
|
loanQuery.lambda().eq(SwxLoanRecord::getStatus, SwxConstons.SWX_EXAMINE_STATUS_YES);
|
loanQuery.lambda().eq(SwxLoanRecord::getNextInterstTime,dateM);
|
List<SwxLoanRecord> loanList = swxLoanRecordService.list(loanQuery);
|
if (!CollectionUtils.isEmpty(loanList)){
|
for (SwxLoanRecord item : loanList){
|
//本次利息
|
BigDecimal interest = item.getAmount().multiply(item.getRete()).divide(new BigDecimal(100));
|
//计算当前总利息
|
item.setCurrentInterest(item.getCurrentInterest().add(interest));
|
//如果当前时间大于等于还款日期,那么进行还款,并将状态改为已完成
|
if (compareDates(date,dateFormat.parse(item.getMaturityDate())) >= 0){
|
item.setStatus(SwxConstons.SWX_EXAMINE_STATUS_NO);
|
SwxUser swxUser = swxUserService.getById(item.getUserId());
|
if(swxUser != null){
|
//插入资金日志
|
SwxMoneyLog moneyLog = new SwxMoneyLog();
|
moneyLog.setInfo("用户贷款编号"+item.getId()+"进行还款,本金为:"+item.getAmount()+"利息为:"+item.getInterest());
|
moneyLog.setStatus(SwxConstons.SWX_EXAMINE_STATUS_YES);
|
moneyLog.setType(SwxConstons.SWX_MONEY_LOG_TYPE_LOAN_REPAY);
|
moneyLog.setSymbol(SwxConstons.SWX_MONEY_TYPE_PAY);
|
moneyLog.setTitle("贷款还款");
|
moneyLog.setOldAmount(swxUser.getAmount());
|
//修改用户资金
|
swxUser.setAmount(swxUser.getAmount().subtract(item.getAmount()).subtract(item.getInterest()));
|
//到期之后清除用户贷款金额
|
swxUser.setLoanAmount(swxUser.getLoanAmount().subtract(item.getAmount()));
|
swxUserService.updateById(swxUser);
|
moneyLog.setNowAmount(swxUser.getAmount());
|
moneyLog.setUserId(swxUser.getId());
|
moneyLog.setBusiId(item.getId());
|
moneyLog.setMoney(item.getAmount());
|
swxMoneyLogService.save(moneyLog);
|
}
|
}else{
|
//更新下次计息时间
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(date);
|
calendar.add(Calendar.DAY_OF_MONTH, 1);
|
item.setNextInterstTime(dateFormat.format(calendar.getTime()));
|
}
|
swxLoanRecordService.updateById(item);
|
}
|
}
|
//获取下次返利时间为此时的智能交易对象
|
QueryWrapper<SwxSmartOrder> smartQuery = new QueryWrapper<>();
|
smartQuery.lambda().eq(SwxSmartOrder::getStatus, 0);
|
smartQuery.lambda().eq(SwxSmartOrder::getNextProfitTime,dateM);
|
List<SwxSmartOrder> smartList = swxSmartOrderService.list(smartQuery);
|
if(!CollectionUtils.isEmpty(smartList)){
|
for (SwxSmartOrder item : smartList){
|
//计算本期利润
|
BigDecimal rateAll = item.getRate().add(item.getAddRate());
|
BigDecimal profit = item.getAmount().multiply(rateAll).divide(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP);
|
item.setAllProfit(item.getAllProfit().add(profit));
|
//240406 当期利息 改为整个周期利息的意思。订单创建时直接计算
|
// item.setCurrentProfit(profit);
|
item.setCurrentDay(item.getCurrentDay()+1);
|
SwxUser swxUser = swxUserService.getById(item.getUserId());
|
if(swxUser != null){
|
//yzq 20240509删除,会造成余额和利润不匹配。 疑似多加了一次
|
// swxUser.setProfit(swxUser.getProfit().add(profit));
|
//判断当前收益天数是否已满
|
if(item.getAllDay() <= item.getCurrentDay()){
|
//收益满的话,就将钱返回给用户,并重置状态
|
item.setStatus(1);
|
SwxMoneyLog moneyLog = new SwxMoneyLog();
|
moneyLog.setInfo("用户购买产品"+item.getId()+"收益完成,本金为:"+item.getAmount()+"利润为:"+item.getAllProfit());
|
moneyLog.setStatus(SwxConstons.SWX_EXAMINE_STATUS_YES);
|
moneyLog.setType(SwxConstons.SWX_MONEY_LOG_TYPE_SMART_PROFIT);
|
moneyLog.setSymbol(SwxConstons.SWX_MONEY_TYPE_INCOME);
|
moneyLog.setTitle("智能交易收益");
|
moneyLog.setOldAmount(swxUser.getAmount());
|
//修改用户资金
|
swxUser.setAmount(swxUser.getAmount().add(item.getAmount()).add(item.getAllProfit()));
|
swxUser.setProfit(swxUser.getProfit().add(item.getAllProfit()));
|
moneyLog.setNowAmount(swxUser.getAmount());
|
moneyLog.setUserId(swxUser.getId());
|
moneyLog.setBusiId(item.getId());
|
moneyLog.setMoney(item.getAmount());
|
swxMoneyLogService.save(moneyLog);
|
}else{
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(date);
|
calendar.add(Calendar.DAY_OF_MONTH, 1);
|
item.setNextProfitTime(dateFormat.format(calendar.getTime()));
|
}
|
swxUserService.updateById(swxUser);
|
// swxUserService.updateMoney(swxUser.getId(), swxUser.getAmount(), swxUser.getProfit());
|
}else{
|
//如果没找到对应用户,则终止该交易
|
item.setStatus(1);
|
}
|
lg.info("智能交易订单分润,用户:{},本次收益={},余额={},总利润={}",item.getUserId(), profit, item.getAmount(), item.getAllProfit());
|
swxSmartOrderService.updateById(item);
|
// swxSmartOrderService.updateSmartById(item);
|
}
|
}
|
|
}
|
|
|
public int compareDates(Date date1, Date date2) {
|
if(date1.before(date2)) {
|
return -1;
|
} else if(date1.after(date2)) {
|
return 1;
|
} else {
|
return 0;
|
}
|
}
|
|
/**更新收益*/
|
public int updateProfit(List<SwxSmartOrder> smartList){
|
if (CollectionUtils.isEmpty(smartList)) return 0;
|
|
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:00");
|
|
for (SwxSmartOrder item : smartList){
|
//计算本期利润
|
BigDecimal rateAll = item.getRate().add(item.getAddRate());
|
BigDecimal profit = item.getAmount().multiply(rateAll).divide(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP);
|
item.setAllProfit(item.getAllProfit().add(profit));
|
//240406 当期利息 改为整个周期利息的意思。订单创建时直接计算
|
// item.setCurrentProfit(profit);
|
item.setCurrentDay(item.getCurrentDay()+1);
|
SwxUser swxUser = swxUserService.getById(item.getUserId());
|
if(swxUser != null){
|
//yzq 20240509删除,会造成余额和利润不匹配。 疑似多加了一次
|
// swxUser.setProfit(swxUser.getProfit().add(profit));
|
//判断当前收益天数是否已满
|
if(item.getAllDay() <= item.getCurrentDay()){
|
//收益满的话,就将钱返回给用户,并重置状态
|
item.setStatus(1);
|
SwxMoneyLog moneyLog = new SwxMoneyLog();
|
moneyLog.setInfo("用户购买产品"+item.getId()+"收益完成,本金为:"+item.getAmount()+"利润为:"+item.getAllProfit());
|
moneyLog.setStatus(SwxConstons.SWX_EXAMINE_STATUS_YES);
|
moneyLog.setType(SwxConstons.SWX_MONEY_LOG_TYPE_SMART_PROFIT);
|
moneyLog.setSymbol(SwxConstons.SWX_MONEY_TYPE_INCOME);
|
moneyLog.setTitle("智能交易收益");
|
moneyLog.setOldAmount(swxUser.getAmount());
|
//修改用户资金
|
swxUser.setAmount(swxUser.getAmount().add(item.getAmount()).add(item.getAllProfit()));
|
swxUser.setProfit(swxUser.getProfit().add(item.getAllProfit()));
|
moneyLog.setNowAmount(swxUser.getAmount());
|
moneyLog.setUserId(swxUser.getId());
|
moneyLog.setBusiId(item.getId());
|
moneyLog.setMoney(item.getAmount());
|
swxMoneyLogService.save(moneyLog);
|
}else{
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(new Date());
|
calendar.add(Calendar.DAY_OF_MONTH, 1);
|
item.setNextProfitTime(dateFormat.format(calendar.getTime()));
|
}
|
swxUserService.updateById(swxUser);
|
// swxUserService.updateMoney(swxUser.getId(), swxUser.getAmount(), swxUser.getProfit());
|
}else{
|
//如果没找到对应用户,则终止该交易
|
item.setStatus(1);
|
}
|
lg.info("智能交易订单分润,用户:{},本次收益={},余额={},总利润={}",item.getUserId(), profit, item.getAmount(), item.getAllProfit());
|
swxSmartOrderService.updateById(item);
|
// swxSmartOrderService.updateSmartById(item);
|
}
|
return smartList.size();
|
}
|
}
|