package com.yami.trading.admin.task;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.yami.trading.bean.ipo.ApplyNewSharesOrder;
|
import com.yami.trading.bean.ipo.UserPromiseRecord;
|
import com.yami.trading.bean.model.MoneyLog;
|
import com.yami.trading.bean.model.Wallet;
|
import com.yami.trading.common.constants.Constants;
|
import com.yami.trading.service.MoneyLogService;
|
import com.yami.trading.service.WalletService;
|
import com.yami.trading.service.ipo.ApplyNewSharesOrderService;
|
import com.yami.trading.service.ipo.UserPromiseRecordService;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.boot.CommandLineRunner;
|
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.stereotype.Component;
|
|
import java.math.BigDecimal;
|
import java.util.*;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.locks.Lock;
|
import java.util.concurrent.locks.ReentrantLock;
|
|
|
@Component
|
public class NewSharesTask implements CommandLineRunner {
|
private static final Logger log = LoggerFactory.getLogger(NewSharesTask.class);
|
|
private final AtomicBoolean syncINStockData = new AtomicBoolean(false);
|
|
private final Lock syncINStockDataLock = new ReentrantLock();
|
|
@Autowired
|
WalletService walletService;
|
|
@Autowired
|
UserPromiseRecordService userPromiseRecordService;
|
|
@Autowired
|
ApplyNewSharesOrderService applyNewSharesOrderService;
|
|
@Autowired
|
MoneyLogService moneyLogService;
|
|
/**
|
* 待补自动扣费
|
*/
|
@Scheduled(cron = "0 0/5 * * * ?")
|
public void syncINStockData() {
|
|
if (syncINStockData.get()) { // 判断任务是否在处理中
|
return;
|
}
|
if (syncINStockDataLock.tryLock()) {
|
try {
|
syncINStockData.set(true);
|
/*LambdaQueryWrapper<Wallet> queryWrapper = new LambdaQueryWrapper<>();
|
queryWrapper.gt(Wallet::getMoney, BigDecimal.ZERO);
|
queryWrapper.gt(Wallet::getAmountToBeCovered, BigDecimal.ZERO);
|
List<Wallet> walletList = walletService.list(queryWrapper);
|
if (!walletList.isEmpty()) {
|
log.info("==================进入待补自动扣费================");
|
walletList.forEach((wallet) -> {
|
BigDecimal money = wallet.getMoney();
|
BigDecimal amountToBeCovered = wallet.getAmountToBeCovered();
|
if (money.compareTo(amountToBeCovered) >= 0) {
|
wallet.setMoney(money.subtract(amountToBeCovered));
|
wallet.setAmountToBeCovered(BigDecimal.ZERO);
|
log.info("用户id{}已补完待补", wallet.getUserId());
|
|
LambdaQueryWrapper<UserPromiseRecord> queryWrapper2 = new LambdaQueryWrapper<>();
|
queryWrapper2.eq(UserPromiseRecord::getUserId, wallet.getUserId());
|
queryWrapper2.eq(UserPromiseRecord::getStatus, 1);
|
List<UserPromiseRecord> userPromiseRecords = userPromiseRecordService.list(queryWrapper2);
|
if (!userPromiseRecords.isEmpty()) {
|
userPromiseRecords.forEach((userPromiseRecord) -> {
|
userPromiseRecord.setStatus(2);
|
log.info("订单{}已确认认缴", userPromiseRecord.getOrderNo());
|
});
|
userPromiseRecordService.updateBatchById(userPromiseRecords);
|
}
|
} else {
|
//资金不足
|
BigDecimal newAmountToBeCovered = amountToBeCovered.subtract(money);
|
wallet.setMoney(BigDecimal.ZERO);
|
wallet.setAmountToBeCovered(newAmountToBeCovered);
|
log.info("用户id{}补待补{}", wallet.getUserId(), money.toString());
|
}
|
walletService.updateById(wallet);
|
});
|
}*/
|
LambdaQueryWrapper<ApplyNewSharesOrder> queryWrapper = new LambdaQueryWrapper<>();
|
queryWrapper.eq(ApplyNewSharesOrder::getSell, 0);
|
//queryWrapper.gt(ApplyNewSharesOrder::getSubscribedAmount, BigDecimal.ZERO);
|
queryWrapper.gt(ApplyNewSharesOrder::getRequiredNumber, BigDecimal.ZERO);
|
queryWrapper.apply("subscribed_amount < required_number");
|
List<ApplyNewSharesOrder> orders = applyNewSharesOrderService.list(queryWrapper);
|
if (!orders.isEmpty()) {
|
log.info("==================进入待补自动扣费================");
|
orders.forEach((order) -> {
|
//待补多少
|
BigDecimal amt = order.getRequiredNumber().subtract(order.getSubscribedAmount());
|
Wallet wallet =walletService.findByUserId(order.getUserId());
|
BigDecimal amountBefore = wallet.getMoney();
|
if (wallet.getMoney().compareTo(BigDecimal.ZERO) > 0) { //有钱扣款
|
Boolean isDb = false;
|
if (wallet.getMoney().compareTo(amt) >= 0) {
|
wallet.setMoney(wallet.getMoney().subtract(amt));
|
order.setSubscribedAmount(order.getSubscribedAmount().add(amt));
|
|
log.info("订单{}已补完待补", order.getOrderNo());
|
} else {
|
isDb = true;
|
amt = wallet.getMoney();
|
order.setSubscribedAmount(order.getSubscribedAmount().add(amt));
|
log.info("订单{}补待补{}", order.getOrderNo(), amt);
|
//资金不足 进入待补
|
wallet.setMoney(BigDecimal.ZERO);
|
}
|
applyNewSharesOrderService.updateById(order);
|
walletService.updateById(wallet);
|
|
MoneyLog moneyLog = new MoneyLog();
|
moneyLog.setCategory(Constants.MONEYLOG_CATEGORY_IPO);
|
moneyLog.setAmountBefore(amountBefore);
|
moneyLog.setAmount(amt.negate());
|
moneyLog.setAmountAfter(amountBefore.subtract(amt).compareTo(BigDecimal.ZERO) <= 0 ?
|
BigDecimal.ZERO : amountBefore.subtract(amt));
|
moneyLog.setLog(order.getSymbolCode() + "新股认缴补缴" + order.getOrderNo());
|
moneyLog.setUserId(order.getUserId());
|
moneyLog.setWalletType(Constants.WALLET);
|
moneyLog.setContentType(Constants.MONEYLOG_CATEGORY_IPO);
|
moneyLogService.save(moneyLog);
|
|
LambdaQueryWrapper<UserPromiseRecord> queryWrapper2 = new LambdaQueryWrapper<>();
|
queryWrapper2.eq(UserPromiseRecord::getUserId, wallet.getUserId());
|
queryWrapper2.eq(UserPromiseRecord::getStatus, 1);
|
queryWrapper2.eq(UserPromiseRecord::getOrderNo, order.getOrderNo());
|
UserPromiseRecord userPromiseRecord = userPromiseRecordService.getOne(queryWrapper2);
|
if (userPromiseRecord != null) {
|
userPromiseRecord.setDeductUsdt(order.getSubscribedAmount());
|
if (!isDb) { //已经缴完 确认状态
|
userPromiseRecord.setStatus(2);
|
log.info("订单{}已确认认缴", userPromiseRecord.getOrderNo());
|
}
|
userPromiseRecordService.updateById(userPromiseRecord);
|
}
|
}
|
});
|
}
|
|
} catch (Exception e) {
|
log.error("待补自动扣费出错", e);
|
} finally {
|
syncINStockDataLock.unlock();
|
syncINStockData.set(false);
|
}
|
}
|
}
|
|
|
|
|
@Override
|
public void run(String... args) throws Exception {
|
}
|
}
|