package com.nq.utils.task.stock; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.nq.common.ServerResponse; import com.nq.dao.StockSubscribeMapper; import com.nq.dao.UserAssetsMapper; import com.nq.dao.UserMapper; import com.nq.dao.UserStockSubscribeMapper; import com.nq.pojo.StockSubscribe; import com.nq.pojo.User; import com.nq.pojo.UserAssets; import com.nq.pojo.UserStockSubscribe; import com.nq.service.IUserAssetsServices; import com.nq.service.IUserPositionService; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Collectors; /** * @program: dabao * @description: * @create: 2024-04-01 17:32 **/ @Component @Slf4j public class CarryPositionTask { @Autowired UserStockSubscribeMapper userStockSubscribeMapper; @Autowired IUserPositionService iUserPositionService; @Autowired StockSubscribeMapper stockSubscribeMapper; @Autowired UserMapper userMapper; @Autowired IUserAssetsServices userAssetsServices; private final Lock ballotLock = new ReentrantLock(); private final Lock subscriptionLock = new ReentrantLock(); private final AtomicBoolean ballot = new AtomicBoolean(false); @Scheduled(cron = "0 0/1 * * * ?") public void ballot() { if (ballot.get()) { // 判断任务是否在处理中 return; } if (ballotLock.tryLock()) { try { ballot.set(true); // 设置处理中标识为true // log.info("新股上市转持仓定时任务--------->开始"); log.info("新股上市定时任务--------->开始"); List stockSubscribes = stockSubscribeMapper.selectList(new LambdaQueryWrapper() .lt(StockSubscribe::getListDate, DateUtil.date())); if (CollectionUtils.isNotEmpty(stockSubscribes)) { List codeList = stockSubscribes.stream().map(StockSubscribe::getCode).collect(Collectors.toList()); List userStockSubscribes = userStockSubscribeMapper.selectList(new LambdaQueryWrapper() .eq(UserStockSubscribe::getStatus, 5).in(UserStockSubscribe::getNewCode, codeList)); //订单转持仓 userStockSubscribes.forEach(f -> { // ServerResponse serverResponse = iUserPositionService.newStockToPosition(f.getId(),BigDecimal.ZERO);//转持仓 // if(serverResponse.isSuccess()){ f.setStatus(6); userStockSubscribeMapper.updateById(f); // }else{ // log.info("新股上市定时任务失败申购订单id:"+f.getId()+",失败原因:"+serverResponse.getMsg()); // } }); } log.info("新股上市定时任务--------->结束"); } catch (Exception e) { log.error("新股上市定时任务发生异常", e); } finally { ballotLock.unlock(); ballot.set(false); // 设置处理中标识为false } } else { log.info("新股上市定时任务--------->上次任务还未执行完成,本次任务忽略"); } } private final AtomicBoolean subscription = new AtomicBoolean(false); // @Scheduled(cron = "0 0/1 * * * ?") public void subscription() { if (subscription.get()) { // 判断任务是否在处理中 return; } if (subscriptionLock.tryLock()) { try { subscription.set(true); // 设置处理中标识为true log.info("自动转已认缴--------->开始"); List userStockSubscribes = userStockSubscribeMapper.selectList(new LambdaQueryWrapper() .eq(UserStockSubscribe::getStatus, 3)); userStockSubscribes.forEach(f->{ UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("US",f.getUserId()); if(null != userAssets && userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) == 0){ f.setStatus(4); userStockSubscribeMapper.updateById(f); } }); log.info("自动转已认缴--------->结束"); } catch (Exception e) { log.error("自动转已认缴定时任务发生异常", e); } finally { subscriptionLock.unlock(); subscription.set(false); // 设置处理中标识为false } } else { log.info("自动转已认缴定时任务--------->上次任务还未执行完成,本次任务忽略"); } } }