package com.ruoyi.im.task; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.im.service.MedicalInsuranceAccountService; import com.ruoyi.im.service.UserPolicyService; import com.ruoyi.system.domain.MedicalInsuranceAccount; import com.ruoyi.system.domain.UserPolicy; import io.swagger.models.auth.In; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @program: ruoyiim * @description: * @create: 2025-09-21 14:21 **/ @Component public class MedicalInsuranceTask { @Autowired UserPolicyService userPolicyService; private final AtomicBoolean syncINStockData = new AtomicBoolean(false); private final Lock syncINStockDataLock = new ReentrantLock(); @Autowired MedicalInsuranceAccountService medicalInsuranceAccountService; /** * 定时筛选用户保单状态 */ @Scheduled(cron = "0 0 0 * * ?") public void insuranceExpires() { if (syncINStockData.get()) { // 判断任务是否在处理中 return; } if (syncINStockDataLock.tryLock()) { try { syncINStockData.set(true); // 设置处理中标识为true expires(); } finally { syncINStockDataLock.unlock(); syncINStockData.set(false); // 设置处理中标识为false } } } private void expires() { List list = userPolicyService.list(new LambdaQueryWrapper() .eq(UserPolicy::getPolicyStatus, UserPolicy.PolicyStatus.ACTIVE) ); List ids = new ArrayList<>(); list.forEach(f->{ if(isExpired(f.getEndDate())){ f.setPolicyStatus(UserPolicy.PolicyStatus.EXPIRED); ids.add(f.getId()); } }); userPolicyService.updateBatchById(list); List insuranceAccountList = medicalInsuranceAccountService.list(new LambdaQueryWrapper() .in(MedicalInsuranceAccount::getPolicyId, ids) ); insuranceAccountList.forEach(f->{ f.setAccountStatus(MedicalInsuranceAccount.AccountStatus.SUSPENDED); }); medicalInsuranceAccountService.updateBatchById(insuranceAccountList); } public boolean isExpired(LocalDate endDate) { return LocalDate.now().isAfter(endDate); } }