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<UserPolicy> list = userPolicyService.list(new LambdaQueryWrapper<UserPolicy>()
|
.eq(UserPolicy::getPolicyStatus, UserPolicy.PolicyStatus.ACTIVE)
|
);
|
List<Integer> ids = new ArrayList<>();
|
list.forEach(f->{
|
if(isExpired(f.getEndDate())){
|
f.setPolicyStatus(UserPolicy.PolicyStatus.EXPIRED);
|
ids.add(f.getId());
|
}
|
});
|
userPolicyService.updateBatchById(list);
|
List<MedicalInsuranceAccount> insuranceAccountList = medicalInsuranceAccountService.list(new LambdaQueryWrapper<MedicalInsuranceAccount>()
|
.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);
|
}
|
}
|