From 2ec5c14a87bce4cb6ccba7a1bd87708bcce055a9 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Fri, 21 Nov 2025 23:45:06 +0800
Subject: [PATCH] 1

---
 ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/MedicalInsuranceAccountServiceImpl.java |   96 ++++++++++++++++++++++++++----------------------
 1 files changed, 52 insertions(+), 44 deletions(-)

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..1fbb716 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,78 +34,82 @@
     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;
-
-                // 计算每日金额
-                BigDecimal dailyAmount = calculateDailyAmount(
-                        account.getTotalQuota(), (int) remainingDays);
-
-                // 如果账户余额不足,则领取剩余全部金额
-                if (account.getAmountClaimed().compareTo(dailyAmount) < 0) {
-                    dailyAmount = account.getAmountClaimed();
-                }
-
-                // 更新待领金额
-                account.setAmountClaimed(account.getAmountClaimed().subtract(dailyAmount));
+//                // 计算剩余天数
+//                long remainingDays = ChronoUnit.DAYS.between(now, medicalInsuranceAccount.getExpiryDate()) + 1;
+//
+//                // 计算每日金额
+//                BigDecimal dailyAmount = calculateDailyAmount(
+//                        medicalInsuranceAccount.getTotalQuota(), (int) remainingDays);
+//
+//                // 如果账户余额不足,则领取剩余全部金额
+//                if (medicalInsuranceAccount.getAmountClaimed().compareTo(dailyAmount) < 0) {
+//                    dailyAmount = medicalInsuranceAccount.getAmountClaimed();
+//                }
+//
+//                // 更新待领金额
+//                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(medicalInsuranceAccount.getAmountClaimed()));
 
-                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.setClaimAmount(medicalInsuranceAccount.getAmountClaimed());
                 claim.setCreatedAt(new Date());
                 medicalInsuranceDailyClaimMapper.insert(claim);
                 return Result.success("领取成功");
@@ -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) {

--
Gitblit v1.9.3