From 1ff642981afabeea08cdf2ffc6607dafd6979b97 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Fri, 19 Sep 2025 02:53:26 +0800
Subject: [PATCH] 1

---
 ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/MedicalInsuranceAccountServiceImpl.java       |  159 ++++++
 ruoyi-system/src/main/java/com/ruoyi/system/domain/InsurancePosition.java                         |   31 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/InsuranceProductController.java        |   23 
 ruoyi-admin/src/main/java/com/ruoyi/im/service/MedicalInsuranceAccountService.java                |    6 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/MedicalInsuranceAccountController.java |   47 ++
 ruoyi-admin/src/main/java/com/ruoyi/im/service/MedicalInsuranceDailyClaimService.java             |    9 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/UserPolicyDto.java                         |   37 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserKycController.java                 |   82 +++
 ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/InsuranceFeatureServiceImpl.java              |   11 
 ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/UserKycServiceImpl.java                       |   14 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/MedicalInsuranceDailyClaimMapper.java          |   17 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/UserKyc.java                                   |   42 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/InsurancePositionController.java       |   95 ++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserPolicyController.java              |  140 ++++++
 ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java                                       |    6 
 ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/RealNameAuthServviceImpl.java                 |    6 
 ruoyi-admin/src/main/java/com/ruoyi/im/service/InsuranceFeatureService.java                       |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/InsurancePositiontMapper.java                  |   10 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/MedicalInsuranceAccountMapper.java             |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/MedicalInsuranceDailyClaim.java                |   32 +
 ruoyi-system/src/main/java/com/ruoyi/system/domain/MedicalInsuranceAccount.java                   |   27 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/InsuranceProduct.java                          |   11 
 ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/MedicalInsuranceDailyClaimServiceImpl.java    |   11 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/AccountLock.java                               |   18 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsurancePositionDto.java                  |   19 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserKycMapper.java                             |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/InsuranceFeature.java                          |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/RealNameAuth.java                              |    6 
 /dev/null                                                                                         |   14 
 ruoyi-admin/src/main/java/com/ruoyi/im/service/RealNameAuthService.java                           |    2 
 ruoyi-admin/src/main/java/com/ruoyi/im/service/UserKycService.java                                |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/UserPolicy.java                                |   20 
 ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/InsuranceProductServiceImpl.java              |   11 
 ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/InsurancePositionServiceImpl.java             |   14 
 ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/UserPolicyServiceImpl.java                    |  105 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/UserKycDto.java                            |   29 +
 ruoyi-admin/src/main/java/com/ruoyi/im/util/ValidatorUtil.java                                    |  216 +++++++++
 ruoyi-admin/src/main/java/com/ruoyi/im/service/InsuranceProductService.java                       |    2 
 ruoyi-admin/src/main/java/com/ruoyi/im/service/UserPolicyService.java                             |   11 
 ruoyi-admin/src/main/java/com/ruoyi/im/service/InsurancePositionService.java                      |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsuranceProductUpdateDTO.java             |    4 
 41 files changed, 1,263 insertions(+), 60 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 40eb0b2..b9c5693 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java
@@ -12,6 +12,7 @@
 import com.ruoyi.im.service.ImApiServcie;
 import com.ruoyi.im.dto.RegisterDto;
 import com.ruoyi.im.util.SymmetricCryptoUtil;
+import com.ruoyi.im.util.ValidatorUtil;
 import com.ruoyi.system.domain.GroupWelcomeConfig;
 import com.ruoyi.system.domain.IpBlacklist;
 import com.ruoyi.system.domain.UserAccount;
@@ -71,6 +72,11 @@
     @PostMapping("/register")
     public Result register(@Validated RegisterDto dto){
         try {
+            // 验证手机号
+            boolean isPhoneValid = ValidatorUtil.isValidPhone(dto.getAccount());
+            if(!isPhoneValid){
+                return Result.error("手机号格式不正确");
+            }
             return imApiServcie.register(dto);
         } catch (RuntimeException e) {
             // 从异常消息中解析Result对象
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/InsuranceFeatureService.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/InsuranceFeatureService.java
similarity index 87%
rename from ruoyi-system/src/main/java/com/ruoyi/system/service/InsuranceFeatureService.java
rename to ruoyi-admin/src/main/java/com/ruoyi/im/service/InsuranceFeatureService.java
index 5925452..d1f3f4b 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/InsuranceFeatureService.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/InsuranceFeatureService.java
@@ -1,4 +1,4 @@
-package com.ruoyi.system.service;
+package com.ruoyi.im.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.system.domain.GroupWelcomeConfig;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/service/InsurancePositionService.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/InsurancePositionService.java
new file mode 100644
index 0000000..ad39f5a
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/InsurancePositionService.java
@@ -0,0 +1,8 @@
+package com.ruoyi.im.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.domain.InsuranceFeature;
+import com.ruoyi.system.domain.InsurancePosition;
+
+public interface InsurancePositionService extends IService<InsurancePosition> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/InsuranceProductService.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/InsuranceProductService.java
similarity index 87%
rename from ruoyi-system/src/main/java/com/ruoyi/system/service/InsuranceProductService.java
rename to ruoyi-admin/src/main/java/com/ruoyi/im/service/InsuranceProductService.java
index 93c83f0..723120e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/InsuranceProductService.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/InsuranceProductService.java
@@ -1,4 +1,4 @@
-package com.ruoyi.system.service;
+package com.ruoyi.im.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.system.domain.InsuranceFeature;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/MedicalInsuranceAccountService.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/MedicalInsuranceAccountService.java
similarity index 63%
rename from ruoyi-system/src/main/java/com/ruoyi/system/service/MedicalInsuranceAccountService.java
rename to ruoyi-admin/src/main/java/com/ruoyi/im/service/MedicalInsuranceAccountService.java
index f6b7c37..f6bfb40 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/MedicalInsuranceAccountService.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/MedicalInsuranceAccountService.java
@@ -1,8 +1,12 @@
-package com.ruoyi.system.service;
+package com.ruoyi.im.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.im.comm.Result;
 import com.ruoyi.system.domain.InsuranceProduct;
 import com.ruoyi.system.domain.MedicalInsuranceAccount;
 
 public interface MedicalInsuranceAccountService  extends IService<MedicalInsuranceAccount> {
+    Result getInsuranceBenefit(Integer id);
+
+    Result getReceiveStatus(Integer userId);
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/service/MedicalInsuranceDailyClaimService.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/MedicalInsuranceDailyClaimService.java
new file mode 100644
index 0000000..65cb6ff
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/MedicalInsuranceDailyClaimService.java
@@ -0,0 +1,9 @@
+package com.ruoyi.im.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.domain.MedicalInsuranceDailyClaim;
+import com.ruoyi.system.domain.UserAccount;
+import org.springframework.stereotype.Service;
+
+public interface MedicalInsuranceDailyClaimService extends IService<MedicalInsuranceDailyClaim> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/RealNameAuthService.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/RealNameAuthService.java
similarity index 87%
rename from ruoyi-system/src/main/java/com/ruoyi/system/service/RealNameAuthService.java
rename to ruoyi-admin/src/main/java/com/ruoyi/im/service/RealNameAuthService.java
index 9cba7c5..3da0661 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/RealNameAuthService.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/RealNameAuthService.java
@@ -1,4 +1,4 @@
-package com.ruoyi.system.service;
+package com.ruoyi.im.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.system.domain.MedicalInsuranceAccount;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/service/UserKycService.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/UserKycService.java
new file mode 100644
index 0000000..f475350
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/UserKycService.java
@@ -0,0 +1,8 @@
+package com.ruoyi.im.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.domain.UserKyc;
+import com.ruoyi.system.domain.UserPolicy;
+
+public interface UserKycService extends IService<UserKyc> {
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/service/UserPolicyService.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/UserPolicyService.java
new file mode 100644
index 0000000..2784e56
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/UserPolicyService.java
@@ -0,0 +1,11 @@
+package com.ruoyi.im.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.im.comm.Result;
+import com.ruoyi.system.domain.RealNameAuth;
+import com.ruoyi.system.domain.UserPolicy;
+import com.ruoyi.system.domain.dto.UserPolicyDto;
+
+public interface UserPolicyService extends IService<UserPolicy> {
+    Result purchaseApplication(UserPolicyDto dto);
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/InsuranceFeatureServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/InsuranceFeatureServiceImpl.java
new file mode 100644
index 0000000..895c130
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/InsuranceFeatureServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.im.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.im.service.InsuranceFeatureService;
+import com.ruoyi.system.domain.InsuranceFeature;
+import com.ruoyi.system.mapper.InsuranceFeatureMapper;
+import org.springframework.stereotype.Service;
+
+@Service
+public class InsuranceFeatureServiceImpl extends ServiceImpl<InsuranceFeatureMapper, InsuranceFeature> implements InsuranceFeatureService {
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/InsurancePositionServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/InsurancePositionServiceImpl.java
new file mode 100644
index 0000000..8faa16c
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/InsurancePositionServiceImpl.java
@@ -0,0 +1,14 @@
+package com.ruoyi.im.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.im.service.InsurancePositionService;
+import com.ruoyi.im.service.InsuranceProductService;
+import com.ruoyi.system.domain.InsurancePosition;
+import com.ruoyi.system.domain.InsuranceProduct;
+import com.ruoyi.system.mapper.InsurancePositiontMapper;
+import com.ruoyi.system.mapper.InsuranceProductMapper;
+import org.springframework.stereotype.Service;
+
+@Service
+public class InsurancePositionServiceImpl extends ServiceImpl<InsurancePositiontMapper, InsurancePosition> implements InsurancePositionService {
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/InsuranceProductServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/InsuranceProductServiceImpl.java
new file mode 100644
index 0000000..d9ae0a5
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/InsuranceProductServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.im.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.im.service.InsuranceProductService;
+import com.ruoyi.system.domain.InsuranceProduct;
+import com.ruoyi.system.mapper.InsuranceProductMapper;
+import org.springframework.stereotype.Service;
+
+@Service
+public class InsuranceProductServiceImpl extends ServiceImpl<InsuranceProductMapper, InsuranceProduct> implements InsuranceProductService {
+}
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
new file mode 100644
index 0000000..575ec0e
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/MedicalInsuranceAccountServiceImpl.java
@@ -0,0 +1,159 @@
+package com.ruoyi.im.service.impl;
+
+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.MedicalInsuranceAccountService;
+import com.ruoyi.system.domain.MedicalInsuranceAccount;
+import com.ruoyi.system.domain.MedicalInsuranceDailyClaim;
+import com.ruoyi.system.mapper.MedicalInsuranceAccountMapper;
+import com.ruoyi.system.mapper.MedicalInsuranceDailyClaimMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import javax.xml.crypto.Data;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.temporal.ChronoUnit;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReentrantLock;
+
+@Service
+public class MedicalInsuranceAccountServiceImpl extends ServiceImpl<MedicalInsuranceAccountMapper, MedicalInsuranceAccount> implements MedicalInsuranceAccountService {
+
+    @Autowired
+    private MedicalInsuranceAccountMapper medicalInsuranceAccountMapper;
+
+    @Autowired
+    private MedicalInsuranceDailyClaimMapper medicalInsuranceDailyClaimMapper;
+
+    // 使用本地锁避免数据库锁竞争
+    private final ConcurrentHashMap<Integer, ReentrantLock> accountLocks = new ConcurrentHashMap<>();
+
+    @Override
+    public Result getInsuranceBenefit(Integer userId) {
+        synchronized (userId) {
+            // 获取账户本地锁
+            ReentrantLock accountLock = accountLocks.computeIfAbsent(userId, k -> new ReentrantLock());
+            accountLock.lock();
+
+            try {
+                MedicalInsuranceAccount account = medicalInsuranceAccountMapper.selectOne(new LambdaQueryWrapper<MedicalInsuranceAccount>()
+                        .eq(MedicalInsuranceAccount::getUserId, userId)
+                        .eq(MedicalInsuranceAccount::getAccountStatus, MedicalInsuranceAccount.AccountStatus.ACTIVE)
+                );
+                if (account == null) {
+                    return Result.error("医保账户不存在");
+                }
+
+                // 检查账户状态
+                if (!"ACTIVE".equals(account.getAccountStatus())) {
+                    return Result.error("保单已失效");
+                }
+
+                // 检查账户有效期
+                LocalDate now = LocalDate.now();
+                if (now.isBefore(account.getEffectiveDate()) ||
+                        now.isAfter(account.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::getClaimDate, today)
+                );
+                if (todayCount > 0) {
+                    return Result.error("今日已领取过金额");
+                }
+
+                if (account.getTotalQuota().compareTo(account.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));
+
+                // 更新已领取金额
+                BigDecimal currentAmountReceived = account.getAlreadyReceived() != null ?
+                        account.getAlreadyReceived(): BigDecimal.ZERO;
+                account.setAlreadyReceived(currentAmountReceived.add(dailyAmount));
+
+                medicalInsuranceAccountMapper.updateById(account);
+
+                // 创建领取记录
+                MedicalInsuranceDailyClaim claim = new MedicalInsuranceDailyClaim();
+                claim.setAccountId(account.getId());
+                claim.setUserId(userId);
+                claim.setClaimDate(today);
+                claim.setClaimAmount(dailyAmount);
+                claim.setCreatedAt(new Date());
+                medicalInsuranceDailyClaimMapper.insert(claim);
+                return Result.success("领取成功");
+            }catch (Exception e){
+                e.printStackTrace();
+                log.error("领取保险金出错:"+e.getMessage());
+            }finally {
+                accountLock.unlock();
+            }
+        }
+        return Result.error("领取失败!");
+    }
+
+    @Override
+    public Result getReceiveStatus(Integer userId) {
+        MedicalInsuranceAccount account = medicalInsuranceAccountMapper.selectOne(new LambdaQueryWrapper<MedicalInsuranceAccount>()
+                .eq(MedicalInsuranceAccount::getUserId, userId)
+                .eq(MedicalInsuranceAccount::getAccountStatus, MedicalInsuranceAccount.AccountStatus.ACTIVE)
+        );
+        if (account == null) {
+            return Result.success(false);
+        }
+        // 检查账户状态
+        if (!"ACTIVE".equals(account.getAccountStatus())) {
+            return Result.success(false);
+        }
+        // 检查账户有效期
+        LocalDate now = LocalDate.now();
+        if (now.isBefore(account.getEffectiveDate()) ||
+                now.isAfter(account.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::getClaimDate, today)
+        );
+        if (todayCount > 0) {
+            return Result.success(false);
+        }
+        return Result.success(true);
+    }
+
+
+    private BigDecimal calculateDailyAmount(BigDecimal totalAmount, int totalDays) {
+        if (totalDays <= 0) {
+            return BigDecimal.ZERO;
+        }
+        // 使用四舍五入到分位
+        return totalAmount.divide(new BigDecimal(totalDays), 2, BigDecimal.ROUND_DOWN);
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/MedicalInsuranceDailyClaimServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/MedicalInsuranceDailyClaimServiceImpl.java
new file mode 100644
index 0000000..ac3a246
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/MedicalInsuranceDailyClaimServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.im.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.domain.MedicalInsuranceDailyClaim;
+import com.ruoyi.im.service.MedicalInsuranceDailyClaimService;
+import com.ruoyi.system.mapper.MedicalInsuranceDailyClaimMapper;
+import org.springframework.stereotype.Service;
+
+@Service
+public class MedicalInsuranceDailyClaimServiceImpl extends ServiceImpl<MedicalInsuranceDailyClaimMapper, MedicalInsuranceDailyClaim> implements MedicalInsuranceDailyClaimService {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RealNameAuthServviceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/RealNameAuthServviceImpl.java
similarity index 62%
rename from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RealNameAuthServviceImpl.java
rename to ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/RealNameAuthServviceImpl.java
index c2e5f30..3af0714 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RealNameAuthServviceImpl.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/RealNameAuthServviceImpl.java
@@ -1,11 +1,9 @@
-package com.ruoyi.system.service.impl;
+package com.ruoyi.im.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.system.domain.MedicalInsuranceAccount;
+import com.ruoyi.im.service.RealNameAuthService;
 import com.ruoyi.system.domain.RealNameAuth;
-import com.ruoyi.system.mapper.MedicalInsuranceAccountMapper;
 import com.ruoyi.system.mapper.RealNameAuthMapper;
-import com.ruoyi.system.service.RealNameAuthService;
 import org.springframework.stereotype.Service;
 
 @Service
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/UserKycServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/UserKycServiceImpl.java
new file mode 100644
index 0000000..cdb9e86
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/UserKycServiceImpl.java
@@ -0,0 +1,14 @@
+package com.ruoyi.im.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.im.service.RealNameAuthService;
+import com.ruoyi.im.service.UserKycService;
+import com.ruoyi.system.domain.RealNameAuth;
+import com.ruoyi.system.domain.UserKyc;
+import com.ruoyi.system.mapper.RealNameAuthMapper;
+import com.ruoyi.system.mapper.UserKycMapper;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserKycServiceImpl extends ServiceImpl<UserKycMapper, UserKyc> implements UserKycService {
+}
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
new file mode 100644
index 0000000..10c667e
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/UserPolicyServiceImpl.java
@@ -0,0 +1,105 @@
+package com.ruoyi.im.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.im.comm.Result;
+import com.ruoyi.im.service.InsuranceProductService;
+import com.ruoyi.im.service.UserPolicyService;
+import com.ruoyi.im.util.ValidatorUtil;
+import com.ruoyi.system.domain.InsuranceProduct;
+import com.ruoyi.system.domain.UserAccount;
+import com.ruoyi.system.domain.UserPolicy;
+import com.ruoyi.system.domain.dto.UserPolicyDto;
+import com.ruoyi.system.mapper.UserPolicyMapper;
+import com.ruoyi.system.service.UserAccountService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.Random;
+import java.util.concurrent.atomic.AtomicLong;
+
+@Service
+public class UserPolicyServiceImpl extends ServiceImpl<UserPolicyMapper, UserPolicy> implements UserPolicyService {
+
+    @Autowired
+    InsuranceProductService insuranceProductService;
+    @Autowired
+    UserAccountService userAccountService;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result purchaseApplication(UserPolicyDto dto) {
+        UserAccount userAccount = userAccountService.getById(dto.getUserId());
+        if(ObjectUtil.isEmpty(userAccount)){
+            return Result.error("请重新登录,未查询到你的信息!");
+        }
+        // 验证手机号
+        boolean isPhoneValid = ValidatorUtil.isValidPhone(dto.getPhone());
+        if(!isPhoneValid){
+            return Result.error("手机号格式不正确!");
+        }
+        // 验证身份证
+        boolean isIdCardValid = ValidatorUtil.isValidIdCard(dto.getIdCard());
+        if(!isIdCardValid){
+            return Result.error("身份证格式不正确!");
+        }
+        InsuranceProduct insuranceProduct = insuranceProductService.getById(dto.getProductId());
+        if(ObjectUtil.isEmpty(insuranceProduct)){
+            return Result.error("该产品停止购买或已下架!");
+        }
+        UserPolicy userPolicy = new UserPolicy();
+        userPolicy.setUserId(userAccount.getId());
+        userPolicy.setProductId(insuranceProduct.getId());
+        userPolicy.setCoverageAmount(insuranceProduct.getCoverageAmount());
+        userPolicy.setPremium(insuranceProduct.getPremium());
+        userPolicy.setTerm(insuranceProduct.getTerm());
+        userPolicy.setName(dto.getName());
+        userPolicy.setGender(dto.getGender());
+        userPolicy.setBirthDate(dto.getBirthDate());
+        userPolicy.setOccupation(dto.getOccupation());
+        userPolicy.setIdCard(dto.getIdCard());
+        userPolicy.setPhone(dto.getPhone());
+        userPolicy.setPolicyNumber(generatePolicyNumber());
+        userPolicy.setPolicyStatus(UserPolicy.PolicyStatus.PENDING);
+        userPolicy.setCreatedAt(new Date());
+        userPolicy.setUpdatedAt(new Date());
+        userPolicy.setApprovalStatus(0);
+        userPolicy.setIsLifelong(insuranceProduct.getTerm() == 0 ? 0 : 1);
+
+        save(userPolicy);
+        return Result.success("购买成功,注意查看资料审核状态!");
+    }
+
+    // 使用原子长整型确保线程安全
+    private static final AtomicLong lastTimestamp = new AtomicLong(0);
+    private static final Random random = new Random();
+    private static final String PREFIX = "POL";
+
+    /**
+     * 基于时间毫秒生成唯一保单号
+     * 格式: POL + 时间戳 + 随机数
+     * 示例: POL16973512345671234
+     */
+    public static String generatePolicyNumber() {
+        long currentTimestamp = System.currentTimeMillis();
+        long lastTime = lastTimestamp.get();
+
+        // 如果时间戳相同,增加序列号
+        if (currentTimestamp == lastTime) {
+            // 等待下一毫秒
+            while (currentTimestamp <= lastTime) {
+                currentTimestamp = System.currentTimeMillis();
+            }
+        }
+        lastTimestamp.set(currentTimestamp);
+
+        // 生成4位随机数
+        int randomNum = random.nextInt(10000);
+        String randomStr = String.format("%04d", randomNum);
+
+        return PREFIX + currentTimestamp + randomStr;
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/util/ValidatorUtil.java b/ruoyi-admin/src/main/java/com/ruoyi/im/util/ValidatorUtil.java
new file mode 100644
index 0000000..8bd4378
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/util/ValidatorUtil.java
@@ -0,0 +1,216 @@
+package com.ruoyi.im.util;
+
+import java.util.regex.Pattern;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ValidatorUtil {
+
+    // 手机号正则表达式(匹配中国大陆手机号)
+    private static final String PHONE_REGEX = "^1[3-9]\\d{9}$";
+
+    // 身份证号正则表达式(18位)
+    private static final String ID_CARD_REGEX = "^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
+
+    // 省份代码映射
+    private static final Map<String, String> PROVINCE_CODES = new HashMap<>();
+
+    static {
+        // 初始化省份代码
+        PROVINCE_CODES.put("11", "北京");
+        PROVINCE_CODES.put("12", "天津");
+        PROVINCE_CODES.put("13", "河北");
+        PROVINCE_CODES.put("14", "山西");
+        PROVINCE_CODES.put("15", "内蒙古");
+        PROVINCE_CODES.put("21", "辽宁");
+        PROVINCE_CODES.put("22", "吉林");
+        PROVINCE_CODES.put("23", "黑龙江");
+        PROVINCE_CODES.put("31", "上海");
+        PROVINCE_CODES.put("32", "江苏");
+        PROVINCE_CODES.put("33", "浙江");
+        PROVINCE_CODES.put("34", "安徽");
+        PROVINCE_CODES.put("35", "福建");
+        PROVINCE_CODES.put("36", "江西");
+        PROVINCE_CODES.put("37", "山东");
+        PROVINCE_CODES.put("41", "河南");
+        PROVINCE_CODES.put("42", "湖北");
+        PROVINCE_CODES.put("43", "湖南");
+        PROVINCE_CODES.put("44", "广东");
+        PROVINCE_CODES.put("45", "广西");
+        PROVINCE_CODES.put("46", "海南");
+        PROVINCE_CODES.put("50", "重庆");
+        PROVINCE_CODES.put("51", "四川");
+        PROVINCE_CODES.put("52", "贵州");
+        PROVINCE_CODES.put("53", "云南");
+        PROVINCE_CODES.put("54", "西藏");
+        PROVINCE_CODES.put("61", "陕西");
+        PROVINCE_CODES.put("62", "甘肃");
+        PROVINCE_CODES.put("63", "青海");
+        PROVINCE_CODES.put("64", "宁夏");
+        PROVINCE_CODES.put("65", "新疆");
+        PROVINCE_CODES.put("71", "台湾");
+        PROVINCE_CODES.put("81", "香港");
+        PROVINCE_CODES.put("82", "澳门");
+    }
+
+    // 身份证校验码权重
+    private static final int[] ID_CARD_WEIGHT = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
+
+    // 身份证校验码对应值
+    private static final char[] ID_CARD_CHECK_CODE = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
+
+    /**
+     * 验证手机号格式
+     * @param phone 手机号码
+     * @return 是否有效
+     */
+    public static boolean isValidPhone(String phone) {
+        if (phone == null || phone.trim().isEmpty()) {
+            return false;
+        }
+
+        // 移除可能的分隔符(如空格、短横线等)
+        String cleanedPhone = phone.replaceAll("[\\s-]+", "");
+
+        return Pattern.matches(PHONE_REGEX, cleanedPhone);
+    }
+
+    /**
+     * 验证身份证号格式
+     * @param idCard 身份证号码
+     * @return 是否有效
+     */
+    public static boolean isValidIdCard(String idCard) {
+        if (idCard == null || idCard.trim().isEmpty()) {
+            return false;
+        }
+
+        // 转换为大写以便统一处理
+        String cleanedIdCard = idCard.trim().toUpperCase();
+
+        // 基本格式校验
+        if (!Pattern.matches(ID_CARD_REGEX, cleanedIdCard)) {
+            return false;
+        }
+
+        // 校验省份代码
+        String provinceCode = cleanedIdCard.substring(0, 2);
+        if (!PROVINCE_CODES.containsKey(provinceCode)) {
+            return false;
+        }
+
+        // 校验生日日期
+        if (!isValidBirthday(cleanedIdCard.substring(6, 14))) {
+            return false;
+        }
+
+        // 校验校验码
+        return isValidCheckCode(cleanedIdCard);
+    }
+
+    /**
+     * 验证身份证中的生日日期是否有效
+     * @param birthdayStr 生日字符串(YYYYMMDD格式)
+     * @return 是否有效
+     */
+    private static boolean isValidBirthday(String birthdayStr) {
+        try {
+            int year = Integer.parseInt(birthdayStr.substring(0, 4));
+            int month = Integer.parseInt(birthdayStr.substring(4, 6));
+            int day = Integer.parseInt(birthdayStr.substring(6, 8));
+
+            // 检查年份范围(假设身份证持有者年龄在0-150岁之间)
+            int currentYear = Calendar.getInstance().get(Calendar.YEAR);
+            if (year < currentYear - 150 || year > currentYear) {
+                return false;
+            }
+
+            // 检查月份
+            if (month < 1 || month > 12) {
+                return false;
+            }
+
+            // 检查日期
+            if (day < 1 || day > 31) {
+                return false;
+            }
+
+            // 检查特定月份的天数
+            if ((month == 4 || month == 6 || month == 9 || month == 11) && day > 30) {
+                return false;
+            }
+
+            // 检查闰年二月
+            if (month == 2) {
+                boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
+                if (isLeapYear && day > 29) {
+                    return false;
+                }
+                if (!isLeapYear && day > 28) {
+                    return false;
+                }
+            }
+
+            return true;
+        } catch (NumberFormatException e) {
+            return false;
+        }
+    }
+
+    /**
+     * 验证身份证校验码
+     * @param idCard 身份证号码
+     * @return 校验码是否正确
+     */
+    private static boolean isValidCheckCode(String idCard) {
+        try {
+            int sum = 0;
+            for (int i = 0; i < 17; i++) {
+                int digit = Character.getNumericValue(idCard.charAt(i));
+                sum += digit * ID_CARD_WEIGHT[i];
+            }
+
+            int mod = sum % 11;
+            char checkCode = ID_CARD_CHECK_CODE[mod];
+
+            return checkCode == idCard.charAt(17);
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    /**
+     * 测试方法
+     */
+    public static void main(String[] args) {
+        // 测试手机号验证
+        String[] testPhones = {
+                "13800138000",
+                "12345678901",
+                "1861234567",
+                "19612345678",
+                " 138-0013-8000 ",
+                "123abc45678"
+        };
+
+        System.out.println("手机号验证测试:");
+        for (String phone : testPhones) {
+            System.out.println(phone + " : " + isValidPhone(phone));
+        }
+
+        System.out.println("\n身份证验证测试:");
+        // 测试身份证验证
+        String[] testIdCards = {
+                "11010519491231002X", // 有效身份证
+                "123456789012345678", // 无效身份证
+                "110105194902300021", // 无效日期(非闰年2月30日)
+                "110105194913310022", // 无效月份
+                "999999200001010000"  // 无效省份代码
+        };
+
+        for (String idCard : testIdCards) {
+            System.out.println(idCard + " : " + isValidIdCard(idCard));
+        }
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/InsurancePositionController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/InsurancePositionController.java
new file mode 100644
index 0000000..08440bb
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/InsurancePositionController.java
@@ -0,0 +1,95 @@
+package com.ruoyi.web.controller.product;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.im.service.impl.InsurancePositionServiceImpl;
+import com.ruoyi.system.domain.InsurancePosition;
+import com.ruoyi.system.domain.dto.InsurancePositionDto;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.Date;
+import java.util.List;
+
+@RestController
+@RequestMapping("/insurancePosition")
+public class InsurancePositionController extends BaseController {
+
+    @Autowired
+    InsurancePositionServiceImpl service;
+
+    /**
+     * 新增保险职位
+     */
+    @PostMapping("/add")
+    public AjaxResult add(@Valid @RequestBody InsurancePositionDto dto) {
+        try {
+            InsurancePosition insurancePosition = new InsurancePosition();
+            insurancePosition.setPosition(dto.getPosition());
+            insurancePosition.setNumberPeople(dto.getNumberPeople());
+            insurancePosition.setRank(dto.getRank());
+            insurancePosition.setCreatedAt(new Date());
+            insurancePosition.setUpdatedAt(new Date());
+            service.save(insurancePosition);
+            return AjaxResult.success("添加成功");
+        }catch (Exception e){
+            e.getMessage();
+            return AjaxResult.error("添加失败!");
+        }
+    }
+
+
+
+    /**
+     * 删除产品
+     */
+    @DeleteMapping("/{id}")
+    public AjaxResult delete(@PathVariable Integer id) {
+        InsurancePosition position = service.getById(id);
+        if (position == null) {
+            return AjaxResult.error("产品不存在");
+        }
+
+        boolean success = service.removeById(id);
+        return success ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
+    }
+
+    /**
+     * 产品信息列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list() {
+        startPage();
+        LambdaQueryWrapper<InsurancePosition> wrapper = new LambdaQueryWrapper<>();
+        // 按创建时间倒序排列
+        wrapper.orderByDesc(InsurancePosition::getCreatedAt);
+        List<InsurancePosition> list = service.list(wrapper);
+        return getDataTable(list);
+    }
+
+    /**
+     * 新增保险职位
+     */
+    @PostMapping("/update")
+    public AjaxResult update(@Valid @RequestBody InsurancePositionDto dto) {
+        try {
+            InsurancePosition position = service.getById(dto.getId());
+            if(position == null){
+                return AjaxResult.error("数据不存在!");
+            }
+            position.setPosition(dto.getPosition());
+            position.setNumberPeople(dto.getNumberPeople());
+            position.setRank(dto.getRank());
+            position.setUpdatedAt(new Date());
+            service.updateById(position);
+            return AjaxResult.success("修改成功");
+        }catch (Exception e){
+            e.getMessage();
+            return AjaxResult.error("修改失败!");
+        }
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/InsuranceProductController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/InsuranceProductController.java
index dc8f09d..7912fae 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/InsuranceProductController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/InsuranceProductController.java
@@ -1,24 +1,21 @@
 package com.ruoyi.web.controller.product;
 
-import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.page.TableDataInfo;
-import com.ruoyi.im.util.ConverterUtil;
-import com.ruoyi.system.domain.GroupWelcomeConfig;
 import com.ruoyi.system.domain.InsuranceFeature;
 import com.ruoyi.system.domain.InsuranceProduct;
-import com.ruoyi.system.domain.IpBlacklist;
 import com.ruoyi.system.domain.dto.InsuranceProductUpdateDTO;
-import com.ruoyi.system.service.InsuranceFeatureService;
-import com.ruoyi.system.service.InsuranceProductService;
+import com.ruoyi.im.service.InsuranceFeatureService;
+import com.ruoyi.im.service.InsuranceProductService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
@@ -76,7 +73,6 @@
         insuranceProduct.setGuaranteeExplanation(dto.getGuaranteeExplanation());
         insuranceProduct.setInsureAge(dto.getInsureAge());
         insuranceProduct.setObligationDisclose(dto.getObligationDisclose());
-        insuranceProduct.setProductFeature(dto.getProductFeature());
         insuranceProduct.setLiabilityExemption(dto.getLiabilityExemption());
         insuranceProduct.setImg1(dto.getImg1());
         insuranceProduct.setImg2(dto.getImg2());
@@ -101,8 +97,8 @@
                             insuranceFeature.setProductId(insuranceProduct.getId());
                             insuranceFeature.setTitle(f.getTitle());
                             insuranceFeature.setDetail(f.getDetail());
-                            insuranceFeature.setCreatedAt(LocalDateTime.now());
-                            insuranceFeature.setUpdatedAt(LocalDateTime.now());
+                            insuranceFeature.setCreatedAt(new Date());
+                            insuranceFeature.setUpdatedAt(new Date());
                             return insuranceFeature;
                         })
                         .collect(Collectors.toList());
@@ -209,14 +205,13 @@
         product.setGuaranteeExplanation(dto.getGuaranteeExplanation());
         product.setInsureAge(dto.getInsureAge());
         product.setObligationDisclose(dto.getObligationDisclose());
-        product.setProductFeature(dto.getProductFeature());
         product.setLiabilityExemption(dto.getLiabilityExemption());
         product.setImg1(dto.getImg1());
         product.setImg2(dto.getImg2());
 
         // 设置创建时间和更新时间
-        product.setCreatedAt(LocalDateTime.now());
-        product.setUpdatedAt(LocalDateTime.now());
+        product.setCreatedAt(new Date());
+        product.setUpdatedAt(new Date());
 
         // 3. 保存产品信息
         boolean productSuccess = insuranceProductService.save(product);
@@ -235,8 +230,8 @@
                             insuranceFeature.setProductId(product.getId());
                             insuranceFeature.setTitle(f.getTitle());
                             insuranceFeature.setDetail(f.getDetail());
-                            insuranceFeature.setCreatedAt(LocalDateTime.now());
-                            insuranceFeature.setUpdatedAt(LocalDateTime.now());
+                            insuranceFeature.setCreatedAt(new Date());
+                            insuranceFeature.setUpdatedAt(new Date());
                             return insuranceFeature;
                         })
                         .collect(Collectors.toList());
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
new file mode 100644
index 0000000..617a077
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/MedicalInsuranceAccountController.java
@@ -0,0 +1,47 @@
+package com.ruoyi.web.controller.product;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.im.comm.Result;
+import com.ruoyi.im.service.MedicalInsuranceAccountService;
+import com.ruoyi.system.domain.UserPolicy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/MedicalInsuranceAccount")
+public class MedicalInsuranceAccountController {
+
+    @Autowired
+    MedicalInsuranceAccountService medicalInsuranceAccountService;
+
+    /**
+     * 领取保险金
+     */
+    @GetMapping("/getInsuranceBenefit")
+    public Result getInsuranceBenefit(@RequestParam(value = "id") Integer id) {
+        try {
+            return medicalInsuranceAccountService.getInsuranceBenefit(id);
+        }catch (Exception e){
+            e.getMessage();
+            return Result.error("购买失败!");
+        }
+    }
+
+    /**
+     * 领取保险金
+     */
+    @GetMapping("/getReceiveStatus")
+    public Result getReceiveStatus(@RequestParam(value = "userId") Integer userId) {
+        try {
+            return medicalInsuranceAccountService.getReceiveStatus(userId);
+        }catch (Exception e){
+            e.getMessage();
+            return Result.error("购买失败!");
+        }
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserKycController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserKycController.java
new file mode 100644
index 0000000..ac14b1c
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserKycController.java
@@ -0,0 +1,82 @@
+package com.ruoyi.web.controller.product;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.im.comm.Result;
+import com.ruoyi.im.service.UserKycService;
+import com.ruoyi.im.service.impl.UserKycServiceImpl;
+import com.ruoyi.system.domain.UserAccount;
+import com.ruoyi.system.domain.UserKyc;
+import com.ruoyi.system.domain.UserPolicy;
+import com.ruoyi.system.domain.dto.UserKycDto;
+import com.ruoyi.system.domain.dto.UserPolicyDto;
+import com.ruoyi.system.mapper.UserKycMapper;
+import com.ruoyi.system.service.UserAccountService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.Date;
+
+@RestController
+@RequestMapping("/kyc")
+public class UserKycController {
+
+    @Autowired
+    UserKycService userKycService;
+
+    @Autowired
+    UserAccountService userAccountService;
+
+    /**
+     * 保险购买申请
+     */
+    @PostMapping("/kycApply")
+    public Result kycApply(@Valid @RequestBody UserKycDto dto) {
+        try {
+            UserAccount userAccount = userAccountService.getById(dto.getUserId());
+            if(ObjectUtil.isEmpty(userAccount)){
+                return Result.error("请重新登录,未查询到你的信息!");
+            }
+            UserKyc userKyc = new UserKyc();
+            userKyc.setUserId(userAccount.getId());
+            userKyc.setState(0);
+            userKyc.setHeadPortraitImg(dto.getHeadPortraitImg());
+            userKyc.setNationalEmblemImg(dto.getNationalEmblemImg());
+            userKyc.setHandImg(dto.getHandImg());
+            userKycService.save(userKyc);
+            return Result.success("提交成功,请等待审核!");
+        }catch (Exception e){
+            e.getMessage();
+            return Result.error("购买失败");
+        }
+    }
+
+    /**
+     * 实名认证审批
+     */
+    @PostMapping("/examine")
+    public AjaxResult examine(@RequestParam(value = "id") Integer id, @RequestParam(value = "approvalStatus") Integer approvalStatus, @RequestParam(value = "message",required = false) String message) {
+        try {
+            UserKyc userKyc = userKycService.getById(id);
+            if(ObjectUtil.isEmpty(userKyc)){
+                return AjaxResult.error("实名认证数据不存在");
+            }
+            if(userKyc.getState() != 0){
+                return AjaxResult.error("订单已审批!");
+            }
+            if(approvalStatus == 2 && StringUtils.isEmpty(message)){
+                return AjaxResult.error("驳回理由不能为空!");
+            }
+            userKyc.setState(approvalStatus);
+            userKyc.setMessage(message);
+            userKyc.setUpdatedAt(new Date());
+            return AjaxResult.success("审批成功");
+        }catch (Exception e){
+            e.getMessage();
+            return AjaxResult.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
new file mode 100644
index 0000000..299b4bb
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserPolicyController.java
@@ -0,0 +1,140 @@
+package com.ruoyi.web.controller.product;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.im.comm.Result;
+import com.ruoyi.im.service.MedicalInsuranceAccountService;
+import com.ruoyi.system.domain.MedicalInsuranceAccount;
+import com.ruoyi.system.domain.UserPolicy;
+import com.ruoyi.system.domain.dto.UserPolicyDto;
+import com.ruoyi.im.service.UserPolicyService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+@RestController
+@RequestMapping("/userPolicy")
+public class UserPolicyController {
+
+    @Autowired
+    UserPolicyService userPolicyService;
+
+    @Autowired
+    MedicalInsuranceAccountService medicalInsuranceAccountService;
+
+    /**
+     * 保险购买申请
+     */
+    @PostMapping("/purchaseApplication")
+    public Result purchaseApplication(@Valid @RequestBody UserPolicyDto dto) {
+        try {
+            return userPolicyService.purchaseApplication(dto);
+        }catch (Exception e){
+            e.getMessage();
+            return Result.error("购买失败");
+        }
+    }
+
+    /**
+     * 根据用户id查询保单
+     */
+    @GetMapping("/getPolicyById")
+    public Result getPolicyById(@RequestParam(value = "id") Integer id) {
+        try {
+            List<UserPolicy> list = userPolicyService.list(new LambdaQueryWrapper<UserPolicy>().eq(UserPolicy::getUserId, id));
+            return Result.success(list);
+        }catch (Exception e){
+            e.getMessage();
+            return Result.error("购买失败");
+        }
+    }
+
+    /**
+     * 保单审批
+     */
+    @PostMapping("/examine")
+    @Transactional
+    public AjaxResult examine(@RequestParam(value = "id") Integer id, @RequestParam(value = "approvalStatus") Integer approvalStatus, @RequestParam(value = "message",required = false) String message) {
+        try {
+            UserPolicy userPolicy = userPolicyService.getById(id);
+            if(ObjectUtil.isEmpty(userPolicy)){
+                return AjaxResult.error("订单不存在");
+            }
+            if(userPolicy.getApprovalStatus() != 0){
+                return AjaxResult.error("订单已审批!");
+            }
+            if(approvalStatus == 2 && StringUtils.isEmpty(message)){
+                return AjaxResult.error("驳回理由不能为空!");
+            }
+
+            //计算到期时间
+            LocalDate expirationTime = calculateInsuranceEndDate(LocalDate.now(), userPolicy.getTerm());
+
+            userPolicy.setApprovalStatus(approvalStatus);
+            userPolicy.setMessage(message);
+            userPolicy.setStartDate(LocalDate.now());
+            userPolicy.setEndDate(expirationTime);
+            userPolicy.setPolicyStatus(UserPolicy.PolicyStatus.ACTIVE);
+            userPolicy.setUpdatedAt(new Date());
+            userPolicyService.updateById(userPolicy);
+
+            MedicalInsuranceAccount medicalInsuranceAccount = new MedicalInsuranceAccount();
+            medicalInsuranceAccount.setUserId(userPolicy.getUserId());
+            medicalInsuranceAccount.setPolicyId(userPolicy.getId());
+            medicalInsuranceAccount.setProductId(userPolicy.getProductId());
+            medicalInsuranceAccount.setTotalQuota(userPolicy.getCoverageAmount());
+            medicalInsuranceAccount.setRemainingBalance(BigDecimal.ZERO);
+            medicalInsuranceAccount.setAmountClaimed(userPolicy.getCoverageAmount());
+            medicalInsuranceAccount.setAlreadyReceived(BigDecimal.ZERO);
+            medicalInsuranceAccount.setAmountAlreadyUsed(BigDecimal.ZERO);
+            medicalInsuranceAccount.setEffectiveDate(userPolicy.getStartDate());
+            medicalInsuranceAccount.setExpiryDate(userPolicy.getEndDate());
+            medicalInsuranceAccount.setAccountStatus(MedicalInsuranceAccount.AccountStatus.ACTIVE);
+            medicalInsuranceAccount.setCreatedAt(new Date());
+            medicalInsuranceAccount.setUpdatedAt(new Date());
+            medicalInsuranceAccountService.save(medicalInsuranceAccount);
+            return AjaxResult.success("审批成功");
+        }catch (Exception e){
+            e.getMessage();
+            return AjaxResult.error("审批失败!");
+        }
+    }
+
+    /**
+     * 计算保险到期日
+     * @param startDate 保险开始日期
+     * @param termYears 保险年限
+     * @return 保险到期日期
+     */
+    public static LocalDate calculateInsuranceEndDate(LocalDate startDate, int termYears) {
+        return calculateDateAfterYears(startDate, termYears);
+    }
+
+    /**
+     * 根据基准日期和年限推算日期
+     */
+    public static LocalDate calculateDateAfterYears(LocalDate baseDate, int years) {
+        validateBaseDate(baseDate);
+        return baseDate.plusYears(years);
+    }
+
+    /**
+     * 验证基准日期
+     */
+    private static void validateBaseDate(LocalDate baseDate) {
+        if (baseDate == null) {
+            throw new IllegalArgumentException("基准日期不能为null");
+        }
+    }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/AccountLock.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/AccountLock.java
new file mode 100644
index 0000000..81cdd28
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/AccountLock.java
@@ -0,0 +1,18 @@
+package com.ruoyi.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import org.springframework.data.annotation.Id;
+
+import java.time.LocalDateTime;
+
+@Data
+public class AccountLock {
+    @TableId(type = IdType.AUTO)
+    private Long accountId; // 账户ID
+
+    private Integer lockVersion = 0; // 锁版本号
+
+    private LocalDateTime lockedAt; // 锁定时间
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/InsuranceFeature.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/InsuranceFeature.java
index 4f3be85..0abdc63 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/InsuranceFeature.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/InsuranceFeature.java
@@ -5,6 +5,7 @@
 import lombok.Data;
 
 import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
  * 保险产品特色实体类
@@ -25,8 +26,8 @@
     private String detail;
 
     // 创建时间
-    private LocalDateTime createdAt;
+    private Date createdAt;
 
     // 更新时间
-    private LocalDateTime updatedAt;
+    private Date updatedAt;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/InsurancePosition.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/InsurancePosition.java
new file mode 100644
index 0000000..d4740a8
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/InsurancePosition.java
@@ -0,0 +1,31 @@
+package com.ruoyi.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 保险职位
+ */
+@Data
+public class InsurancePosition {
+
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+    //职位
+    private String position;
+    //人数
+    private Integer numberPeople;
+    //级别
+    private String rank;
+    //工资
+    private BigDecimal salary;
+    //创建时间
+    private Date createdAt;
+    //更新时间
+    private Date updatedAt;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/InsuranceProduct.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/InsuranceProduct.java
index 922d668..4029566 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/InsuranceProduct.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/InsuranceProduct.java
@@ -5,7 +5,10 @@
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
 
 /**
  * 保险产品实体类
@@ -33,16 +36,16 @@
     private BigDecimal premium;
 
     // 保险期限(如:1年/终身)
-    private String term;
+    private Integer term;
 
     // 产品状态
     private ProductStatus status;
 
     // 创建时间
-    private LocalDateTime createdAt;
+    private Date createdAt;
 
     // 更新时间
-    private LocalDateTime updatedAt;
+    private Date updatedAt;
 
     // 医院数量
     private Integer hospitalNumber;
@@ -57,7 +60,7 @@
     private String obligationDisclose;
 
     // 产品特色
-    private String productFeature;
+    private List<InsuranceFeature> productFeature;
 
     // 投保须知
     private String liabilityExemption;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/MedicalInsuranceAccount.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/MedicalInsuranceAccount.java
index 9c5ac3e..806c063 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/MedicalInsuranceAccount.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/MedicalInsuranceAccount.java
@@ -7,6 +7,7 @@
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
  * 医疗保险账户实体类
@@ -19,22 +20,28 @@
     private Integer id;
 
     // 用户ID
-    private String userId;
+    private Integer userId;
 
     // 保单ID
-    private Long policyId;
+    private Integer policyId;
 
     // 保险产品ID
     private Integer productId;
 
-    // 账户余额
-    private BigDecimal accountBalance;
+    // 保险总额度
+    private BigDecimal totalQuota;
 
-    // 年度限额
-    private BigDecimal annualLimit;
+    // 账户余额(用户申请使用才扣)
+    private BigDecimal remainingBalance ;
 
-    // 已使用金额
-    private BigDecimal usedAmount;
+    //待领金额
+    private BigDecimal amountClaimed;
+
+    //已领取金额
+    private BigDecimal alreadyReceived;
+
+    // 已使用金额(用户申请使用才增加)
+    private BigDecimal amountAlreadyUsed;
 
     // 账户生效日期
     private LocalDate effectiveDate;
@@ -46,10 +53,10 @@
     private AccountStatus accountStatus;
 
     // 创建时间
-    private LocalDateTime createdAt;
+    private Date createdAt;
 
     // 更新时间
-    private LocalDateTime updatedAt;
+    private Date updatedAt;
 
     // 账户状态枚举
     public enum AccountStatus {
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/MedicalInsuranceDailyClaim.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/MedicalInsuranceDailyClaim.java
new file mode 100644
index 0000000..9655dc7
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/MedicalInsuranceDailyClaim.java
@@ -0,0 +1,32 @@
+package com.ruoyi.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import org.springframework.data.annotation.Id;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/*
+   保险领取记录
+ */
+@Data
+public class MedicalInsuranceDailyClaim {
+
+    @TableId(type = IdType.AUTO)
+    private Integer id; // 主键ID
+
+    private Integer accountId; // 医疗保险账户ID
+
+    private Integer userId; // 用户ID
+
+    private LocalDate claimDate; // 领取日期
+
+    private BigDecimal claimAmount; // 领取金额
+
+    private Date createdAt; // 创建时间
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/RealNameAuth.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/RealNameAuth.java
index 3bbcb41..7febb48 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/RealNameAuth.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/RealNameAuth.java
@@ -5,6 +5,7 @@
 import lombok.Data;
 
 import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
  * 用户实名认证信息实体类
@@ -32,7 +33,10 @@
     private AuthStatus authStatus;
 
     // 提交时间
-    private LocalDateTime createdAt;
+    private Date createdAt;
+
+    // 更新时间
+    private Date updatedAt;
 
     // 认证状态枚举
     public enum AuthStatus {
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/UserKyc.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/UserKyc.java
new file mode 100644
index 0000000..ca7f7db
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/UserKyc.java
@@ -0,0 +1,42 @@
+package com.ruoyi.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 实名认证
+ */
+@Data
+public class UserKyc {
+
+    // 唯一ID
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    // 系统生成的用户ID
+    private Integer userId;
+
+    //头像图片
+    private String headPortraitImg;
+
+    //头像图片
+    private String nationalEmblemImg;
+
+    //手持
+    private String handImg;
+
+    //审批状态  0:待审批  1:通过 2:驳回
+    private Integer state;
+
+    //驳回信息
+    private String message;
+
+    // 创建时间
+    private Date createdAt;
+
+    // 更新时间
+    private Date updatedAt;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/UserPolicy.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/UserPolicy.java
index 86c8d76..daaf380 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/UserPolicy.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/UserPolicy.java
@@ -8,6 +8,7 @@
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
  * 用户保单实体类
@@ -20,7 +21,7 @@
     private Integer id;
 
     // 系统生成的用户ID
-    private String userId;
+    private Integer userId;
 
     // 保险产品ID
     private Integer productId;
@@ -32,7 +33,7 @@
     private BigDecimal premium;
 
     // 保险期限(如:1年/终身)
-    private String term;
+    private Integer term;
 
     // 姓名
     private String name;
@@ -41,7 +42,7 @@
     private Gender gender;
 
     // 出生日期
-    private LocalDate birthDate;
+    private Date birthDate;
 
     // 职业
     private String occupation;
@@ -64,11 +65,20 @@
     // 保险结束日期
     private LocalDate endDate;
 
+    // 是否终身保险 0:是  1:否
+    private Integer isLifelong ;
+
     // 创建时间
-    private LocalDateTime createdAt;
+    private Date createdAt;
 
     // 更新时间
-    private LocalDateTime updatedAt;
+    private Date updatedAt;
+
+    //审批状态  0:待审批  1:通过 2:驳回
+    private Integer approvalStatus;
+
+    //驳回信息
+    private String message;
 
     // 性别枚举
     public enum Gender {
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsurancePositionDto.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsurancePositionDto.java
new file mode 100644
index 0000000..aa621f3
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsurancePositionDto.java
@@ -0,0 +1,19 @@
+package com.ruoyi.system.domain.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class InsurancePositionDto {
+
+    private Integer id;
+    //职位
+    private String position;
+    //人数
+    private Integer numberPeople;
+    //级别
+    private String rank;
+    //工资
+    private BigDecimal salary;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsuranceProductUpdateDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsuranceProductUpdateDTO.java
index 65a7fbd..9771e10 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsuranceProductUpdateDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsuranceProductUpdateDTO.java
@@ -29,7 +29,7 @@
     private BigDecimal premium;
 
     // 保险期限
-    private String term;
+    private Integer term;
 
     // 产品状态
     private String status;
@@ -53,7 +53,7 @@
     private String liabilityExemption;
 
     //产品特色
-    List<InsuranceFeatureDto> featureDtoList;
+    private List<InsuranceFeatureDto> featureDtoList;
 
     // 图片1
     private String img1;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/UserKycDto.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/UserKycDto.java
new file mode 100644
index 0000000..37d4de9
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/UserKycDto.java
@@ -0,0 +1,29 @@
+package com.ruoyi.system.domain.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.Date;
+
+@Data
+public class UserKycDto {
+
+    // 系统生成的用户ID
+    @NotEmpty(message = "用户id不能为空")
+    private Integer userId;
+
+    //头像图片
+    @NotEmpty(message = "头像图片不能为空")
+    private String headPortraitImg;
+
+    //国徽图片
+    @NotEmpty(message = "国徽图片不能为空")
+    private String nationalEmblemImg;
+
+    //手持照片
+    @NotEmpty(message = "手持照片不能为空")
+    private String handImg;
+
+}
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
new file mode 100644
index 0000000..e1ced17
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/UserPolicyDto.java
@@ -0,0 +1,37 @@
+package com.ruoyi.system.domain.dto;
+
+import com.ruoyi.system.domain.UserPolicy;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Date;
+
+@Data
+public class UserPolicyDto {
+
+    // 系统生成的用户ID
+    private String userId;
+
+    // 保险产品ID
+    private Integer productId;
+
+    // 姓名
+    private String name;
+
+    // 性别
+    private UserPolicy.Gender gender;
+
+    // 出生日期
+    private Date birthDate;
+
+    // 职业
+    private String occupation;
+
+    // 身份证号码
+    private String idCard;
+
+    // 手机号码
+    private String phone;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/InsurancePositiontMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/InsurancePositiontMapper.java
new file mode 100644
index 0000000..1457b8a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/InsurancePositiontMapper.java
@@ -0,0 +1,10 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.domain.InsurancePosition;
+import com.ruoyi.system.domain.InsuranceProduct;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface InsurancePositiontMapper extends BaseMapper<InsurancePosition> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/MedicalInsuranceAccountMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/MedicalInsuranceAccountMapper.java
index 8a5f2b7..bc78bff 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/MedicalInsuranceAccountMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/MedicalInsuranceAccountMapper.java
@@ -4,6 +4,11 @@
 import com.ruoyi.system.domain.InsuranceProduct;
 import com.ruoyi.system.domain.MedicalInsuranceAccount;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
 
 @Mapper
 public interface MedicalInsuranceAccountMapper extends BaseMapper<MedicalInsuranceAccount> {
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/MedicalInsuranceDailyClaimMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/MedicalInsuranceDailyClaimMapper.java
new file mode 100644
index 0000000..81eba76
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/MedicalInsuranceDailyClaimMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.domain.MedicalInsuranceAccount;
+import com.ruoyi.system.domain.MedicalInsuranceDailyClaim;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.time.LocalDate;
+import java.util.List;
+
+@Mapper
+public interface MedicalInsuranceDailyClaimMapper extends BaseMapper<MedicalInsuranceDailyClaim> {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserKycMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserKycMapper.java
new file mode 100644
index 0000000..8fa60ca
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserKycMapper.java
@@ -0,0 +1,8 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.domain.IpBlacklist;
+import com.ruoyi.system.domain.UserKyc;
+
+public interface UserKycMapper extends BaseMapper<UserKyc> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/UserPolicyService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/UserPolicyService.java
deleted file mode 100644
index 27ba729..0000000
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/UserPolicyService.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.ruoyi.system.service;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.system.domain.RealNameAuth;
-import com.ruoyi.system.domain.UserPolicy;
-
-public interface UserPolicyService extends IService<UserPolicy> {
-}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/InsuranceFeatureServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/InsuranceFeatureServiceImpl.java
deleted file mode 100644
index 4fe780c..0000000
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/InsuranceFeatureServiceImpl.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.ruoyi.system.service.impl;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.system.domain.GroupWelcomeConfig;
-import com.ruoyi.system.domain.InsuranceFeature;
-import com.ruoyi.system.mapper.GroupWelcomeConfigMapper;
-import com.ruoyi.system.mapper.InsuranceFeatureMapper;
-import com.ruoyi.system.service.GroupWelcomeConfigService;
-import com.ruoyi.system.service.InsuranceFeatureService;
-import org.springframework.stereotype.Service;
-
-@Service
-public class InsuranceFeatureServiceImpl extends ServiceImpl<InsuranceFeatureMapper, InsuranceFeature> implements InsuranceFeatureService {
-}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/InsuranceProductServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/InsuranceProductServiceImpl.java
deleted file mode 100644
index 3a02ab6..0000000
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/InsuranceProductServiceImpl.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.ruoyi.system.service.impl;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.system.domain.InsuranceFeature;
-import com.ruoyi.system.domain.InsuranceProduct;
-import com.ruoyi.system.mapper.InsuranceFeatureMapper;
-import com.ruoyi.system.mapper.InsuranceProductMapper;
-import com.ruoyi.system.service.InsuranceFeatureService;
-import com.ruoyi.system.service.InsuranceProductService;
-import org.springframework.stereotype.Service;
-
-@Service
-public class InsuranceProductServiceImpl extends ServiceImpl<InsuranceProductMapper, InsuranceProduct> implements InsuranceProductService {
-}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MedicalInsuranceAccountServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MedicalInsuranceAccountServiceImpl.java
deleted file mode 100644
index 1936bc6..0000000
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MedicalInsuranceAccountServiceImpl.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.ruoyi.system.service.impl;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.system.domain.InsuranceProduct;
-import com.ruoyi.system.domain.MedicalInsuranceAccount;
-import com.ruoyi.system.mapper.InsuranceProductMapper;
-import com.ruoyi.system.mapper.MedicalInsuranceAccountMapper;
-import com.ruoyi.system.service.InsuranceProductService;
-import com.ruoyi.system.service.MedicalInsuranceAccountService;
-import org.springframework.stereotype.Service;
-
-@Service
-public class MedicalInsuranceAccountServiceImpl extends ServiceImpl<MedicalInsuranceAccountMapper, MedicalInsuranceAccount> implements MedicalInsuranceAccountService {
-}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserPolicyServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserPolicyServiceImpl.java
deleted file mode 100644
index 8666117..0000000
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserPolicyServiceImpl.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.ruoyi.system.service.impl;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.system.domain.RealNameAuth;
-import com.ruoyi.system.domain.UserPolicy;
-import com.ruoyi.system.mapper.RealNameAuthMapper;
-import com.ruoyi.system.mapper.UserPolicyMapper;
-import com.ruoyi.system.service.RealNameAuthService;
-import com.ruoyi.system.service.UserPolicyService;
-import org.springframework.stereotype.Service;
-
-@Service
-public class UserPolicyServiceImpl extends ServiceImpl<UserPolicyMapper, UserPolicy> implements UserPolicyService {
-}

--
Gitblit v1.9.3