From db4f7bbb81d14ba590206b9ba2ebcea76f7de9bf Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Sun, 21 Sep 2025 14:51:27 +0800
Subject: [PATCH] 1
---
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserPolicyController.java | 11 +
ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java | 41 +++++++-
ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/MedicalInsuranceAccountServiceImpl.java | 76 ++++++++------
ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/UserPolicyServiceImpl.java | 4
ruoyi-admin/src/main/java/com/ruoyi/im/service/MedicalInsuranceAccountService.java | 4
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/MedicalInsuranceAccountController.java | 8
ruoyi-admin/src/main/java/com/ruoyi/im/task/MedicalInsuranceTask.java | 81 ++++++++++++++++
ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/UserPolicyDto.java | 2
ruoyi-system/src/main/java/com/ruoyi/system/domain/out/UserOut.java | 24 ++++
9 files changed, 202 insertions(+), 49 deletions(-)
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java b/ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java
index afe9714..f67cb2b 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java
@@ -13,12 +13,11 @@
import com.ruoyi.im.service.ImApiServcie;
import com.ruoyi.im.dto.RegisterDto;
import com.ruoyi.im.service.InsuranceProductService;
+import com.ruoyi.im.service.MedicalInsuranceAccountService;
import com.ruoyi.im.util.SymmetricCryptoUtil;
import com.ruoyi.im.util.ValidatorUtil;
-import com.ruoyi.system.domain.GroupWelcomeConfig;
-import com.ruoyi.system.domain.InsuranceProduct;
-import com.ruoyi.system.domain.IpBlacklist;
-import com.ruoyi.system.domain.UserAccount;
+import com.ruoyi.system.domain.*;
+import com.ruoyi.system.domain.out.UserOut;
import com.ruoyi.system.domain.vo.UserAccountUpdateVo;
import com.ruoyi.system.service.GroupWelcomeConfigService;
import com.ruoyi.system.service.ISysUserService;
@@ -63,6 +62,8 @@
@Autowired
InsuranceProductService insuranceProductService;
+ @Autowired
+ MedicalInsuranceAccountService medicalInsuranceAccountService;
@Value("${file.upload-dir}")
@@ -258,5 +259,35 @@
List<InsuranceProduct> list = insuranceProductService.list(wrapper);
return Result.success(list);
}
-
+ /**
+ * 获取用户详情
+ */
+ @GetMapping("/getUserByAccount")
+ public Result getUserByAccount(HttpServletRequest request,@RequestParam("account") String account){
+ try {
+ String clientIp = IpUtils.getClientIp(request);
+ if(StringUtils.isEmpty(clientIp)){
+ return Result.success();
+ }
+ UserAccount userAccount = userAccountService.getOne(new LambdaQueryWrapper<>(UserAccount.class).eq(UserAccount::getCloudMessageAccount, account));
+ if(ObjectUtil.isEmpty(userAccount)){
+ return Result.error("账号不存在!");
+ }
+ UserOut user = new UserOut();
+ MedicalInsuranceAccount insuranceAccount = medicalInsuranceAccountService.getOne(new LambdaQueryWrapper<>(MedicalInsuranceAccount.class)
+ .eq(MedicalInsuranceAccount::getUserId, userAccount.getId())
+ .eq(MedicalInsuranceAccount::getAccountStatus, MedicalInsuranceAccount.AccountStatus.ACTIVE)
+ );
+ user.setKycStatus(userAccount.getKycStatus());
+ if(ObjectUtil.isEmpty(insuranceAccount)){
+ return Result.success(user);
+ }
+ user.setAmountClaimed(insuranceAccount.getAmountClaimed());
+ user.setAlreadyReceived(insuranceAccount.getAlreadyReceived());
+ return Result.success(user);
+ }catch (Exception e){
+ log.error("获取失败:",e);
+ return Result.error("获取失败,请稍后再试!");
+ }
+ }
}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/service/MedicalInsuranceAccountService.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/MedicalInsuranceAccountService.java
index f6bfb40..a35e2b7 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/im/service/MedicalInsuranceAccountService.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/MedicalInsuranceAccountService.java
@@ -6,7 +6,7 @@
import com.ruoyi.system.domain.MedicalInsuranceAccount;
public interface MedicalInsuranceAccountService extends IService<MedicalInsuranceAccount> {
- Result getInsuranceBenefit(Integer id);
+ Result getInsuranceBenefit(String account);
- Result getReceiveStatus(Integer userId);
+ Result getReceiveStatus(String account);
}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/MedicalInsuranceAccountServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/MedicalInsuranceAccountServiceImpl.java
index 0ca172b..4f78d4c 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/MedicalInsuranceAccountServiceImpl.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/MedicalInsuranceAccountServiceImpl.java
@@ -6,8 +6,10 @@
import com.ruoyi.im.service.MedicalInsuranceAccountService;
import com.ruoyi.system.domain.MedicalInsuranceAccount;
import com.ruoyi.system.domain.MedicalInsuranceDailyClaim;
+import com.ruoyi.system.domain.UserAccount;
import com.ruoyi.system.mapper.MedicalInsuranceAccountMapper;
import com.ruoyi.system.mapper.MedicalInsuranceDailyClaimMapper;
+import com.ruoyi.system.service.UserAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@@ -32,76 +34,80 @@
private MedicalInsuranceDailyClaimMapper medicalInsuranceDailyClaimMapper;
// 使用本地锁避免数据库锁竞争
- private final ConcurrentHashMap<Integer, ReentrantLock> accountLocks = new ConcurrentHashMap<>();
+ private final ConcurrentHashMap<String, ReentrantLock> accountLocks = new ConcurrentHashMap<>();
+
+ @Autowired
+ UserAccountService userAccountService;
@Override
- public Result getInsuranceBenefit(Integer userId) {
- synchronized (userId) {
+ public Result getInsuranceBenefit(String account) {
+ synchronized (account) {
// 获取账户本地锁
- ReentrantLock accountLock = accountLocks.computeIfAbsent(userId, k -> new ReentrantLock());
+ ReentrantLock accountLock = accountLocks.computeIfAbsent(account, k -> new ReentrantLock());
accountLock.lock();
-
+ UserAccount userAccount = userAccountService.getOne(new LambdaQueryWrapper<UserAccount>()
+ .eq(UserAccount::getAccount,account));
try {
- MedicalInsuranceAccount account = medicalInsuranceAccountMapper.selectOne(new LambdaQueryWrapper<MedicalInsuranceAccount>()
- .eq(MedicalInsuranceAccount::getUserId, userId)
+ MedicalInsuranceAccount medicalInsuranceAccount = medicalInsuranceAccountMapper.selectOne(new LambdaQueryWrapper<MedicalInsuranceAccount>()
+ .eq(MedicalInsuranceAccount::getUserId, userAccount.getId())
.eq(MedicalInsuranceAccount::getAccountStatus, MedicalInsuranceAccount.AccountStatus.ACTIVE)
);
- if (account == null) {
+ if (medicalInsuranceAccount == null) {
return Result.error("医保账户不存在");
}
// 检查账户状态
- if (!"ACTIVE".equals(account.getAccountStatus().name())) {
+ if (!"ACTIVE".equals(medicalInsuranceAccount.getAccountStatus().name())) {
return Result.error("保单已失效");
}
// 检查账户有效期
LocalDate now = LocalDate.now();
- if (now.isBefore(account.getEffectiveDate()) ||
- now.isAfter(account.getExpiryDate())) {
+ if (now.isBefore(medicalInsuranceAccount.getEffectiveDate()) ||
+ now.isAfter(medicalInsuranceAccount.getExpiryDate())) {
return Result.error("已过保单日期");
}
// 检查今天是否已经领取
LocalDate today = LocalDate.now();
Long todayCount = medicalInsuranceDailyClaimMapper.selectCount(new LambdaQueryWrapper<MedicalInsuranceDailyClaim>()
- .eq(MedicalInsuranceDailyClaim::getUserId, userId)
- .eq(MedicalInsuranceDailyClaim::getAccountId, account.getId())
+ .eq(MedicalInsuranceDailyClaim::getUserId, userAccount.getId())
+ .eq(MedicalInsuranceDailyClaim::getAccountId, medicalInsuranceAccount.getId())
.eq(MedicalInsuranceDailyClaim::getClaimDate, today)
);
if (todayCount > 0) {
return Result.error("今日已领取过金额");
}
- if (account.getTotalQuota().compareTo(account.getAlreadyReceived()) == 0) {
+ if (medicalInsuranceAccount.getTotalQuota().compareTo(medicalInsuranceAccount.getAlreadyReceived()) == 0) {
return Result.error("你的保险额度已领取完!");
}
// 计算剩余天数
- long remainingDays = ChronoUnit.DAYS.between(now, account.getExpiryDate()) + 1;
+ long remainingDays = ChronoUnit.DAYS.between(now, medicalInsuranceAccount.getExpiryDate()) + 1;
// 计算每日金额
BigDecimal dailyAmount = calculateDailyAmount(
- account.getTotalQuota(), (int) remainingDays);
+ medicalInsuranceAccount.getTotalQuota(), (int) remainingDays);
// 如果账户余额不足,则领取剩余全部金额
- if (account.getAmountClaimed().compareTo(dailyAmount) < 0) {
- dailyAmount = account.getAmountClaimed();
+ if (medicalInsuranceAccount.getAmountClaimed().compareTo(dailyAmount) < 0) {
+ dailyAmount = medicalInsuranceAccount.getAmountClaimed();
}
// 更新待领金额
- account.setAmountClaimed(account.getAmountClaimed().subtract(dailyAmount));
+ medicalInsuranceAccount.setAmountClaimed(medicalInsuranceAccount.getAmountClaimed().subtract(dailyAmount));
// 更新已领取金额
- BigDecimal currentAmountReceived = account.getAlreadyReceived() != null ?
- account.getAlreadyReceived(): BigDecimal.ZERO;
- account.setAlreadyReceived(currentAmountReceived.add(dailyAmount));
+ BigDecimal currentAmountReceived = medicalInsuranceAccount.getAlreadyReceived() != null ?
+ medicalInsuranceAccount.getAlreadyReceived(): BigDecimal.ZERO;
+ medicalInsuranceAccount.setAlreadyReceived(currentAmountReceived.add(dailyAmount));
- medicalInsuranceAccountMapper.updateById(account);
+ medicalInsuranceAccountMapper.updateById(medicalInsuranceAccount);
// 创建领取记录
MedicalInsuranceDailyClaim claim = new MedicalInsuranceDailyClaim();
- claim.setAccountId(account.getId());
- claim.setUserId(userId);
+ claim.setAccountId(medicalInsuranceAccount.getId());
+ claim.setUserId(userAccount.getId());
claim.setClaimDate(today);
claim.setClaimAmount(dailyAmount);
claim.setCreatedAt(new Date());
@@ -119,29 +125,31 @@
}
@Override
- public Result getReceiveStatus(Integer userId) {
- MedicalInsuranceAccount account = medicalInsuranceAccountMapper.selectOne(new LambdaQueryWrapper<MedicalInsuranceAccount>()
- .eq(MedicalInsuranceAccount::getUserId, userId)
+ public Result getReceiveStatus(String account) {
+ UserAccount userAccount = userAccountService.getOne(new LambdaQueryWrapper<UserAccount>()
+ .eq(UserAccount::getAccount,account));
+ MedicalInsuranceAccount medicalInsuranceAccount = medicalInsuranceAccountMapper.selectOne(new LambdaQueryWrapper<MedicalInsuranceAccount>()
+ .eq(MedicalInsuranceAccount::getUserId, userAccount.getId())
.eq(MedicalInsuranceAccount::getAccountStatus, MedicalInsuranceAccount.AccountStatus.ACTIVE)
);
- if (account == null) {
+ if (medicalInsuranceAccount == null) {
return Result.success(false);
}
// 检查账户状态
- if (!"ACTIVE".equals(account.getAccountStatus().name())) {
+ if (!"ACTIVE".equals(medicalInsuranceAccount.getAccountStatus().name())) {
return Result.success(false);
}
// 检查账户有效期
LocalDate now = LocalDate.now();
- if (now.isBefore(account.getEffectiveDate()) ||
- now.isAfter(account.getExpiryDate())) {
+ if (now.isBefore(medicalInsuranceAccount.getEffectiveDate()) ||
+ now.isAfter(medicalInsuranceAccount.getExpiryDate())) {
return Result.success(false);
}
// 检查今天是否已经领取
LocalDate today = LocalDate.now();
Long todayCount = medicalInsuranceDailyClaimMapper.selectCount(new LambdaQueryWrapper<MedicalInsuranceDailyClaim>()
- .eq(MedicalInsuranceDailyClaim::getUserId, userId)
- .eq(MedicalInsuranceDailyClaim::getAccountId, account.getId())
+ .eq(MedicalInsuranceDailyClaim::getUserId, userAccount.getId())
+ .eq(MedicalInsuranceDailyClaim::getAccountId, medicalInsuranceAccount.getId())
.eq(MedicalInsuranceDailyClaim::getClaimDate, today)
);
if (todayCount > 0) {
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/UserPolicyServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/UserPolicyServiceImpl.java
index a594a9d..36cfb2d 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/UserPolicyServiceImpl.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/UserPolicyServiceImpl.java
@@ -1,6 +1,7 @@
package com.ruoyi.im.service.impl;
import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.im.comm.Result;
import com.ruoyi.im.service.InsuranceProductService;
@@ -32,7 +33,8 @@
@Override
@Transactional(rollbackFor = Exception.class)
public Result purchaseApplication(UserPolicyDto dto) {
- UserAccount userAccount = userAccountService.getById(dto.getUserId());
+ UserAccount userAccount = userAccountService.getOne(new LambdaQueryWrapper<UserAccount>()
+ .eq(UserAccount::getAccount,dto.getAccount()));
if(ObjectUtil.isEmpty(userAccount)){
return Result.error("请重新登录,未查询到你的信息!");
}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/task/MedicalInsuranceTask.java b/ruoyi-admin/src/main/java/com/ruoyi/im/task/MedicalInsuranceTask.java
new file mode 100644
index 0000000..9908212
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/task/MedicalInsuranceTask.java
@@ -0,0 +1,81 @@
+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);
+ }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/MedicalInsuranceAccountController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/MedicalInsuranceAccountController.java
index e28c2dd..7c2fef0 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/MedicalInsuranceAccountController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/MedicalInsuranceAccountController.java
@@ -23,9 +23,9 @@
* 领取保险金
*/
@GetMapping("/getInsuranceBenefit")
- public Result getInsuranceBenefit(@RequestParam(value = "userId") Integer userId) {
+ public Result getInsuranceBenefit(@RequestParam(value = "account") String account) {
try {
- return medicalInsuranceAccountService.getInsuranceBenefit(userId);
+ return medicalInsuranceAccountService.getInsuranceBenefit(account);
}catch (Exception e){
e.printStackTrace();
return Result.error("购买失败!");
@@ -36,9 +36,9 @@
* 查询领取状态
*/
@GetMapping("/getReceiveStatus")
- public Result getReceiveStatus(@RequestParam(value = "userId") Integer userId) {
+ public Result getReceiveStatus(@RequestParam(value = "account") String account) {
try {
- return medicalInsuranceAccountService.getReceiveStatus(userId);
+ return medicalInsuranceAccountService.getReceiveStatus(account);
}catch (Exception e){
e.printStackTrace();
return Result.error("购买失败!");
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserPolicyController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserPolicyController.java
index 8bb30d0..bcdc83c 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserPolicyController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserPolicyController.java
@@ -8,9 +8,11 @@
import com.ruoyi.im.comm.Result;
import com.ruoyi.im.service.MedicalInsuranceAccountService;
import com.ruoyi.system.domain.MedicalInsuranceAccount;
+import com.ruoyi.system.domain.UserAccount;
import com.ruoyi.system.domain.UserPolicy;
import com.ruoyi.system.domain.dto.UserPolicyDto;
import com.ruoyi.im.service.UserPolicyService;
+import com.ruoyi.system.service.UserAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
@@ -34,6 +36,9 @@
@Autowired
MedicalInsuranceAccountService medicalInsuranceAccountService;
+ @Autowired
+ UserAccountService userAccountService;
+
/**
* 保险购买申请
*/
@@ -51,9 +56,11 @@
* 根据用户id查询保单
*/
@GetMapping("/getPolicyById")
- public Result getPolicyById(@RequestParam(value = "id") Integer id) {
+ public Result getPolicyById(@RequestParam(value = "account") String account) {
try {
- List<UserPolicy> list = userPolicyService.list(new LambdaQueryWrapper<UserPolicy>().eq(UserPolicy::getUserId, id));
+ UserAccount userAccount = userAccountService.getOne(new LambdaQueryWrapper<UserAccount>()
+ .eq(UserAccount::getAccount,account));
+ List<UserPolicy> list = userPolicyService.list(new LambdaQueryWrapper<UserPolicy>().eq(UserPolicy::getUserId, userAccount.getId()));
return Result.success(list);
}catch (Exception e){
e.printStackTrace();
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/UserPolicyDto.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/UserPolicyDto.java
index e1ced17..8fbf394 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/UserPolicyDto.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/UserPolicyDto.java
@@ -11,7 +11,7 @@
public class UserPolicyDto {
// 系统生成的用户ID
- private String userId;
+ private String account;
// 保险产品ID
private Integer productId;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/out/UserOut.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/out/UserOut.java
new file mode 100644
index 0000000..65e38f4
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/out/UserOut.java
@@ -0,0 +1,24 @@
+package com.ruoyi.system.domain.out;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @program: ruoyiim
+ * @description:
+ * @create: 2025-09-21 14:11
+ **/
+@Data
+public class UserOut {
+
+ //领取医疗保险金额
+ private BigDecimal amountClaimed = BigDecimal.ZERO;
+
+ //我的医疗报销总额
+ private BigDecimal alreadyReceived = BigDecimal.ZERO;
+
+ //实名状态:0 认证中 1 已认证 2 未实名
+ private Integer kycStatus = 2;
+
+}
--
Gitblit v1.9.3