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 lombok.extern.slf4j.Slf4j; 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; import java.util.Queue; /** * 计息定时任务 */ @Component("BearingTask") //@Slf4j @Transactional public class BearingTask { private static final Logger lg = LoggerFactory.getLogger("taskFile"); @Autowired private ISwxLoanRecordService swxLoanRecordService; @Autowired private ISwxUserService swxUserService; @Autowired private ISwxMoneyLogService swxMoneyLogService; @Autowired private ISwxSmartOrderService swxSmartOrderService; /**利润补偿,防止分润时出现错误。以至于数据状态停滞*/ public void profitCompensate() { List profitCompensateList = swxSmartOrderService.getProfitCompensateList(); updateProfit(profitCompensateList, null); 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 loanQuery = new QueryWrapper<>(); loanQuery.lambda().eq(SwxLoanRecord::getStatus, SwxConstons.SWX_EXAMINE_STATUS_YES); loanQuery.lambda().eq(SwxLoanRecord::getNextInterstTime,dateM); List 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 smartQuery = new QueryWrapper<>(); smartQuery.lambda().eq(SwxSmartOrder::getStatus, 0); smartQuery.lambda().eq(SwxSmartOrder::getNextProfitTime,dateM); List smartList = swxSmartOrderService.list(smartQuery); updateProfit(smartList, dateFormat); } public int compareDates(Date date1, Date date2) { if(date1.before(date2)) { return -1; } else if(date1.after(date2)) { return 1; } else { return 0; } } /**更新智能交易订单收益*/ public void updateProfit(List smartList, SimpleDateFormat dateFormat){ if (CollectionUtils.isEmpty(smartList)) return; if (dateFormat == null) { 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)); item.setCurrentDay(item.getCurrentDay()+1); SwxUser swxUser = swxUserService.getById(item.getUserId()); if(swxUser != null){ if (item.getProfitType()!=null && item.getProfitType()==1){ updateProfitDay(swxUser, item, dateFormat, profit); }else { updateProfitCycle(swxUser, item, dateFormat); } }else{ //如果没找到对应用户,则终止该交易 item.setStatus(1); } lg.info("智能交易订单分润,用户:{},本次收益={},余额={},总利润={}",item.getUserId(), profit, item.getAmount(), item.getAllProfit()); swxSmartOrderService.updateById(item); } } /**周期*/ private void updateProfitCycle(SwxUser swxUser, SwxSmartOrder smartOrder, SimpleDateFormat dateFormat){ //判断当前收益天数是否已满 if(smartOrder.getAllDay() <= smartOrder.getCurrentDay()){ //收益满的话,就将钱返回给用户,并重置状态 smartOrder.setStatus(1); SwxMoneyLog moneyLog = new SwxMoneyLog(); moneyLog.setInfo("用户购买产品"+smartOrder.getId()+"收益完成,本金为:"+smartOrder.getAmount()+"利润为:"+smartOrder.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(smartOrder.getAmount()).add(smartOrder.getAllProfit())); swxUser.setProfit(swxUser.getProfit().add(smartOrder.getAllProfit())); moneyLog.setNowAmount(swxUser.getAmount()); moneyLog.setUserId(swxUser.getId()); moneyLog.setBusiId(smartOrder.getId()); moneyLog.setMoney(smartOrder.getAmount()); swxMoneyLogService.save(moneyLog); }else{ Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.add(Calendar.DAY_OF_MONTH, 1); smartOrder.setNextProfitTime(dateFormat.format(calendar.getTime())); } swxUserService.updateById(swxUser); } /**每日*/ private void updateProfitDay(SwxUser swxUser, SwxSmartOrder smartOrder, SimpleDateFormat dateFormat, BigDecimal profit){ SwxMoneyLog moneyLog = new SwxMoneyLog(); moneyLog.setStatus(SwxConstons.SWX_EXAMINE_STATUS_YES); moneyLog.setSymbol(SwxConstons.SWX_MONEY_TYPE_INCOME); moneyLog.setTitle("智能交易日收益"); moneyLog.setOldAmount(swxUser.getAmount()); swxUser.setProfit(swxUser.getProfit().add(profit)); moneyLog.setNowAmount(swxUser.getAmount()); moneyLog.setUserId(swxUser.getId()); moneyLog.setBusiId(smartOrder.getId()); moneyLog.setMoney(smartOrder.getAmount()); //判断当前收益天数是否已满 if(smartOrder.getAllDay() <= smartOrder.getCurrentDay()){ //收益满的话,就将钱返回给用户,并重置状态 smartOrder.setStatus(1); moneyLog.setType(SwxConstons.SWX_MONEY_LOG_TYPE_SMART_PROFIT); moneyLog.setInfo("用户购买产品"+smartOrder.getId()+"收益完成,本金为:"+smartOrder.getAmount()+"收到每日收益:"+profit+"总利润为:"+smartOrder.getAllProfit()); swxUser.setAmount(swxUser.getAmount().add(smartOrder.getAmount()).add(profit)); }else{ moneyLog.setType(SwxConstons.SWX_MONEY_LOG_TYPE_SMART_DAY_PROFIT); moneyLog.setInfo("用户购买产品"+smartOrder.getId()+"收到每日收益:"+profit); swxUser.setAmount(swxUser.getAmount().add(profit)); Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.add(Calendar.DAY_OF_MONTH, 1); smartOrder.setNextProfitTime(dateFormat.format(calendar.getTime())); } swxMoneyLogService.save(moneyLog); swxUserService.updateById(swxUser); } }