From df30c88c2c76da0cb607bcf129446f43c9a521da Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Thu, 09 Oct 2025 02:51:02 +0800
Subject: [PATCH] 1

---
 ruoyi-admin/src/main/java/com/ruoyi/im/comm/PayProduct.java                                  |   29 +
 ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/MedicalInsuranceAccountServiceImpl.java  |   32 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/UserAccount.java                          |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/UserPolicyDto.java                    |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/UserAccountUpdateVo.java               |   11 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserKycController.java            |   33 +
 ruoyi-system/src/main/java/com/ruoyi/system/domain/GroupWelcomeConfig.java                   |   11 
 ruoyi-admin/src/main/java/com/ruoyi/im/util/PayService.java                                  |  152 +++++++
 ruoyi-system/src/main/java/com/ruoyi/system/domain/UserKyc.java                              |   12 
 ruoyi-admin/src/main/java/com/ruoyi/im/comm/PayStatus.java                                   |   31 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserPolicyController.java         |   76 +++
 ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java                                  |   28 
 ruoyi-admin/src/main/java/com/ruoyi/im/util/HttpUtil.java                                    |   48 ++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/InvitationBlacklistController.java |   80 +++
 ruoyi-system/src/main/java/com/ruoyi/system/service/InvitationBlacklistService.java          |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/InvitationBlacklist.java                  |   30 +
 ruoyi-admin/src/main/java/com/ruoyi/im/util/SimplePayUtil.java                               |  175 ++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/domain/MedicalInsuranceAccount.java              |    2 
 ruoyi-admin/src/main/java/com/ruoyi/im/util/PaySignUtil.java                                 |   89 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/domain/out/UserOut.java                          |   15 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/BasicSetupController.java          |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/InvitationBlacklistMapper.java            |   10 
 ruoyi-admin/src/main/resources/application.yml                                               |    8 
 ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/ImApiServcieImpl.java                    |   80 ++-
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/user/UserController.java                  |   26 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/UserPolicy.java                           |   11 
 ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/UserPolicyServiceImpl.java               |  162 ++++++-
 ruoyi-admin/src/main/java/com/ruoyi/im/dto/RegisterDto.java                                  |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/UserKycDto.java                       |    8 
 ruoyi-admin/src/main/java/com/ruoyi/im/service/UserPolicyService.java                        |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/InvitationBlacklistServiceImpl.java |   14 
 31 files changed, 1,091 insertions(+), 114 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 00a9973..e2a80dd 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java
@@ -3,10 +3,6 @@
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.core.domain.R;
-import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.im.comm.Result;
 import com.ruoyi.im.config.IpUtils;
@@ -14,7 +10,8 @@
 import com.ruoyi.im.service.*;
 import com.ruoyi.im.dto.RegisterDto;
 import com.ruoyi.im.service.impl.InsurancePositionServiceImpl;
-import com.ruoyi.im.util.SymmetricCryptoUtil;
+import com.ruoyi.im.util.PayService;
+import com.ruoyi.im.util.SimplePayUtil;
 import com.ruoyi.im.util.UserPolicyUtils;
 import com.ruoyi.im.util.ValidatorUtil;
 import com.ruoyi.system.domain.*;
@@ -23,15 +20,11 @@
 import com.ruoyi.system.domain.out.UserTeamAndPositionOut;
 import com.ruoyi.system.domain.vo.UserAccountUpdateVo;
 import com.ruoyi.system.service.GroupWelcomeConfigService;
-import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.service.IpBlacklistService;
 import com.ruoyi.system.service.UserAccountService;
-import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
 import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -89,6 +82,8 @@
     private String prefix;
 
 
+
+
     /**
      * 注册
      */
@@ -133,7 +128,7 @@
     @PostMapping("/updateUser")
     public Result updateUser(UserAccountUpdateVo vo){
         try {
-            UserAccount userAccount = userAccountService.getOne(new LambdaQueryWrapper<UserAccount>().eq(UserAccount::getAccount,vo.getAccountId()));
+            UserAccount userAccount = userAccountService.getOne(new LambdaQueryWrapper<UserAccount>().eq(UserAccount::getAccount,vo.getAccount()));
 
             if (StringUtils.isNotBlank(vo.getNickname())) {
                 userAccount.setNickname(vo.getNickname());
@@ -289,7 +284,17 @@
             if(ObjectUtil.isEmpty(userAccount)){
                 return Result.error("账号不存在!");
             }
+
+            GroupWelcomeConfig groupWelcomeConfig = groupWelcomeConfigService.getOne(new LambdaQueryWrapper<>(GroupWelcomeConfig.class)
+                    .eq(GroupWelcomeConfig::getConfigurationName, "IM-BASICS").last(" limit 1"));
+
             UserOut user = new UserOut();
+            if(ObjectUtil.isNotEmpty(groupWelcomeConfig)){
+                user.setCustomerServiceUrl(groupWelcomeConfig.getCustomerServiceUrl());
+                user.setAboutUs(groupWelcomeConfig.getAboutUs());
+            }
+            user.setBalance(userAccount.getBalance());
+
             MedicalInsuranceAccount insuranceAccount = medicalInsuranceAccountService.getOne(new LambdaQueryWrapper<>(MedicalInsuranceAccount.class)
                     .eq(MedicalInsuranceAccount::getUserId, userAccount.getId())
                     .eq(MedicalInsuranceAccount::getAccountStatus, MedicalInsuranceAccount.AccountStatus.ACTIVE)
@@ -298,9 +303,10 @@
             if(ObjectUtil.isEmpty(insuranceAccount)){
                 return Result.success(user);
             }
-            user.setBalance(userAccount.getBalance());
             user.setAmountClaimed(insuranceAccount.getAmountClaimed());
             user.setAlreadyReceived(insuranceAccount.getAlreadyReceived());
+            user.setGroupPermissions(userAccount.getGroupPermissions());
+            user.setAddFriend(userAccount.getAddFriend());
             return Result.success(user);
         }catch (Exception e){
             log.error("获取失败:",e);
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/comm/PayProduct.java b/ruoyi-admin/src/main/java/com/ruoyi/im/comm/PayProduct.java
new file mode 100644
index 0000000..85e7440
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/comm/PayProduct.java
@@ -0,0 +1,29 @@
+package com.ruoyi.im.comm;
+
+/**
+ * 支付产品枚举
+ */
+public enum PayProduct {
+    ALIPAY(8000, "支付宝"),
+    WECHAT(8001, "微信");
+
+    private final int code;
+    private final String name;
+
+    PayProduct(int code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public int getCode() { return code; }
+    public String getName() { return name; }
+
+    public static PayProduct getByCode(int code) {
+        for (PayProduct product : values()) {
+            if (product.code == code) {
+                return product;
+            }
+        }
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/comm/PayStatus.java b/ruoyi-admin/src/main/java/com/ruoyi/im/comm/PayStatus.java
new file mode 100644
index 0000000..da82686
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/comm/PayStatus.java
@@ -0,0 +1,31 @@
+package com.ruoyi.im.comm;
+
+/**
+ * 支付状态枚举
+ */
+public enum PayStatus {
+    INIT(0, "订单生成"),
+    PAYING(1, "支付中"),
+    SUCCESS(2, "支付成功"),
+    COMPLETED(3, "业务处理完成");
+
+    private final int code;
+    private final String desc;
+
+    PayStatus(int code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public int getCode() { return code; }
+    public String getDesc() { return desc; }
+
+    public static PayStatus getByCode(int code) {
+        for (PayStatus status : values()) {
+            if (status.code == code) {
+                return status;
+            }
+        }
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/dto/RegisterDto.java b/ruoyi-admin/src/main/java/com/ruoyi/im/dto/RegisterDto.java
index 7e70c2e..40e37e8 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/im/dto/RegisterDto.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/dto/RegisterDto.java
@@ -15,7 +15,7 @@
 
     private String confirmPassword; // 再次确认密码
 
-    private String nickname; // 昵称
+    private String nikeName; // 昵称
 
     private Integer type;//类型 1 批量  2 单一
 
@@ -27,6 +27,4 @@
     private Integer accountType = 0;
 //    @NotNull(message = "验证码不能为空")
 //    private Integer verificationCode; // 验证码
-
-
 }
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
index e2cace1..5cbbf73 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/im/service/UserPolicyService.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/UserPolicyService.java
@@ -7,7 +7,9 @@
 import com.ruoyi.system.domain.dto.UserPolicyDto;
 
 import java.text.ParseException;
+import java.util.Map;
 
 public interface UserPolicyService extends IService<UserPolicy> {
     Result purchaseApplication(UserPolicyDto dto) throws ParseException;
+
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/ImApiServcieImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/ImApiServcieImpl.java
index 8dc2ec6..97d5b16 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/ImApiServcieImpl.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/ImApiServcieImpl.java
@@ -23,6 +23,7 @@
 import com.ruoyi.im.service.NeteaseTeamService;
 import com.ruoyi.imenum.ErrorCodeEnum;
 import com.ruoyi.system.domain.GroupWelcomeConfig;
+import com.ruoyi.system.domain.InvitationBlacklist;
 import com.ruoyi.system.domain.NeteaseTeam;
 import com.ruoyi.system.domain.UserAccount;
 import com.ruoyi.im.service.ImApiServcie;
@@ -32,6 +33,7 @@
 import com.ruoyi.system.service.GroupWelcomeConfigService;
 import com.ruoyi.system.service.UserAccountService;
 import com.ruoyi.im.util.SymmetricCryptoUtil;
+import com.ruoyi.system.service.impl.InvitationBlacklistServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.http.HttpResponse;
@@ -77,6 +79,9 @@
     private JdbcTemplate jdbcTemplate;
     @Autowired
     private NeteaseTeamMapper neteaseTeamMapper;
+
+    @Autowired
+    InvitationBlacklistServiceImpl invitationBlacklistService;
 
     @Resource
     private final YunxinApiHttpClient yunxinClient;
@@ -125,6 +130,13 @@
             return Result.error("邀请码不能为空!");
         }
 
+        long count = invitationBlacklistService.count(new LambdaQueryWrapper<InvitationBlacklist>()
+                .eq(InvitationBlacklist::getInvitationCode, dto.getInvitationCode())
+        );
+        if(count > 0){
+            return Result.error("邀请码已被限制邀请!");
+        }
+
         String invitationCode = getInvitationCode();
         UserAccount user = new UserAccount();
         if(dto.getAccountType() == 0 && StringUtils.isNotEmpty(dto.getInvitationCode()) &&  !dto.getInvitationCode().equals("00000000")){
@@ -142,7 +154,7 @@
         userAccount.setCloudMessageAccount(dto.getAccount());
         userAccount.setPassword(SymmetricCryptoUtil.encryptPassword(dto.getPassword()));
         userAccount.setCreateTime(new Date());
-        userAccount.setNickname(dto.getNickname());
+        userAccount.setNickname(dto.getNikeName());
         userAccount.setCreateTime(new Date());
         userAccount.setUpdateTime(new Date());
         userAccount.setInvitationCode(invitationCode);
@@ -151,13 +163,12 @@
         if (!userAccountService.save(userAccount)) {
             throw new RuntimeException("保存用户账户失败");
         }
-
         try {
             // 注册云信账号(远程调用)
             Map<String, String> paramMap = new HashMap<>();
             paramMap.put("accid", dto.getAccount());
-            if(StringUtils.isNotEmpty(dto.getNickname())){
-                paramMap.put("name", dto.getNickname());
+            if(StringUtils.isNotEmpty(dto.getNikeName())){
+                paramMap.put("name", dto.getNikeName());
             }
             paramMap.put("token", dto.getPassword());
 
@@ -175,6 +186,10 @@
                 }
                 log.error("-----------注册账号异常:"+ErrorCodeEnum.getByCode(code).getComment()+"----im信息:"+ErrorCodeEnum.getByCode(code).getDesc());
                 throw new RuntimeException(errorMsg);
+            }
+            //默认添加邀请人为好友
+            if(ObjectUtil.isNotEmpty(user)){
+                addFriends(userAccount.getAccount(),user.getAccount());
             }
 
             // 注册成功后的其他操作
@@ -371,31 +386,33 @@
     @Override
     public AjaxResult updateUserAccount(UserAccountUpdateVo vo) {
         //更新用户名片
-        UpdateUserBusinessDto dto = new UpdateUserBusinessDto();
-        if(StringUtils.isNotEmpty(vo.getPhoneNumber())){
-            dto.setMobile(vo.getPhoneNumber());
-        }
-        if(StringUtils.isNotEmpty(vo.getNickname())){
-            dto.setName(vo.getNickname());
-        }
-        if(StringUtils.isNotEmpty(vo.getSignature())){
-            dto.setSign(vo.getSignature());
-        }
-        if(ObjectUtil.isNotEmpty(vo.getGender())){
-            dto.setGender(vo.getGender());
-        }
-        Map<String, Object> map = updateUserAvatar(vo.getAccountId(), dto);
+//        UpdateUserBusinessDto dto = new UpdateUserBusinessDto();
+//        if(StringUtils.isNotEmpty(vo.getPhoneNumber())){
+//            dto.setMobile(vo.getPhoneNumber());
+//        }
+//        if(StringUtils.isNotEmpty(vo.getNickname())){
+//            dto.setName(vo.getNickname());
+//        }
+//        if(StringUtils.isNotEmpty(vo.getSignature())){
+//            dto.setSign(vo.getSignature());
+//        }
+//        if(ObjectUtil.isNotEmpty(vo.getGender())){
+//            dto.setGender(vo.getGender());
+//        }
+//        Map<String, Object> map = updateUserAvatar(vo.getAccountId(), dto);
         //更新用户属性 状态 密码
-        if ((Boolean) map.get("success")) {
-            AjaxResult ajaxResult = updateAccountProperties(vo.getAccountId(), vo);
+//        if ((Boolean) map.get("success")) {
+            AjaxResult ajaxResult = updateAccountProperties(vo.getAccount(), vo);
             if(ajaxResult.isSuccess()){
-                UserAccount userAccount = userAccountService.getById(vo.getId());
+                UserAccount userAccount = userAccountService.getOne(new LambdaQueryWrapper<UserAccount>()
+                        .eq(UserAccount::getAccount,vo.getAccount())
+                );
                 if (StringUtils.isNotBlank(vo.getPhoneNumber())) {
                     userAccount.setPhoneNumber(vo.getPhoneNumber());
                 }
 
-                if (StringUtils.isNotBlank(vo.getAccountId())) {
-                    userAccount.setAccount(vo.getAccountId());
+                if (StringUtils.isNotBlank(vo.getAccount())) {
+                    userAccount.setAccount(vo.getAccount());
                 }
 
                 if (StringUtils.isNotBlank(vo.getNickname())) {
@@ -409,15 +426,17 @@
                 if (StringUtils.isNotBlank(vo.getSignature())) {
                     userAccount.setSignature(vo.getSignature());
                 }
+                userAccount.setGroupPermissions(vo.getGroupPermissions());
+                userAccount.setAddFriend(vo.getAddFriend());
                 userAccount.setStatus(vo.getStatus());
                 userAccount.setUpdateTime(new Date());
                 userAccountService.updateById(userAccount);
             }else{
                 return AjaxResult.error("更新用户属性失败!");
             }
-        } else {
-            return AjaxResult.error("更新用户名片失败!");
-        }
+//        } else {
+//            return AjaxResult.error("更新用户名片失败!");
+//        }
         return AjaxResult.success("更新成功!");
     }
 
@@ -468,17 +487,14 @@
             NeteaseResponse neteaseResponse = objectMapper.readValue(responseString, NeteaseResponse.class);
 
             if (neteaseResponse.isSuccess()) {
-                AjaxResult.success("账号属性更新成功");
+                return AjaxResult.success("账号属性更新成功");
             } else {
-                AjaxResult.error("账号属性更新失败");
+                return AjaxResult.error("账号属性更新失败");
             }
-
         } catch (Exception e) {
             e.printStackTrace();
-            AjaxResult.error("请求网易云信API失败");
+            return AjaxResult.error("请求网易云信API失败");
         }
-
-        return AjaxResult.success();
     }
 
 
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 4f78d4c..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
@@ -82,25 +82,25 @@
                     return Result.error("你的保险额度已领取完!");
                 }
 
-                // 计算剩余天数
-                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));
+//                // 计算剩余天数
+//                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 = medicalInsuranceAccount.getAlreadyReceived() != null ?
                         medicalInsuranceAccount.getAlreadyReceived(): BigDecimal.ZERO;
-                medicalInsuranceAccount.setAlreadyReceived(currentAmountReceived.add(dailyAmount));
+                medicalInsuranceAccount.setAlreadyReceived(currentAmountReceived.add(medicalInsuranceAccount.getAmountClaimed()));
 
                 medicalInsuranceAccountMapper.updateById(medicalInsuranceAccount);
 
@@ -109,7 +109,7 @@
                 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("领取成功");
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 aef921a..73903bf 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,12 +1,16 @@
 package com.ruoyi.im.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSON;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.druid.support.json.JSONUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.im.comm.Result;
 import com.ruoyi.im.service.InsuranceProductService;
 import com.ruoyi.im.service.UserPolicyService;
+import com.ruoyi.im.util.PayService;
 import com.ruoyi.im.util.ValidatorUtil;
 import com.ruoyi.system.domain.InsuranceProduct;
 import com.ruoyi.system.domain.UserAccount;
@@ -14,15 +18,18 @@
 import com.ruoyi.system.domain.dto.UserPolicyDto;
 import com.ruoyi.system.mapper.UserPolicyMapper;
 import com.ruoyi.system.service.UserAccountService;
+import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.text.ParseException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Date;
+import java.util.Map;
 import java.util.Random;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -33,6 +40,8 @@
     InsuranceProductService insuranceProductService;
     @Autowired
     UserAccountService userAccountService;
+    @Autowired
+    private PayService payService;
 
 
     @Override
@@ -59,7 +68,7 @@
         long count = count(new LambdaQueryWrapper<UserPolicy>()
                 .eq(UserPolicy::getUserId, userAccount.getId())
                 .eq(UserPolicy::getProductId,dto.getProductId())
-                .eq(UserPolicy::getPolicyStatus, UserPolicy.PolicyStatus.ACTIVE)
+                .eq(UserPolicy::getPolicyStatus, UserPolicy.PolicyStatus.PENDING)
                 .and(a-> a.eq(UserPolicy::getApprovalStatus, 0)
                 .or()
                 .eq(UserPolicy::getApprovalStatus, 1))
@@ -73,45 +82,132 @@
             return Result.error("该产品停止购买或已下架!");
         }
         if(userAccount.getBalance().compareTo(insuranceProduct.getPremium()) < 0){
-            return Result.error("余额不足!");
+            String orderNo = generateOrderNo();
+            String payOrder = payService.createOrder(insuranceProduct.getPremium().multiply(new BigDecimal("100")), orderNo,dto.getPayProductId());
+            Map<String, Object> parse = (Map<String, Object>) JSONUtils.parse(payOrder);
+            if("0014".equals(parse.get("errCode"))){
+                return Result.error("当前支付不可用,请更换其他支付方式!");
+            }
+            if("FAIL".equals(parse.get("retCode"))){
+                return Result.error("获取支付通道失败!");
+            }
+
+            userAccountService.updateById(userAccount);
+
+            UserPolicy userPolicy = new UserPolicy();
+            userPolicy.setAccount(userAccount.getAccount());
+            userPolicy.setProductName(insuranceProduct.getProductName());
+            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.setPayStatus(0);
+            userPolicy.setOrderNo(orderNo);
+            userPolicy.setBirthDate(LocalDate.parse(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);
+            // 获取 payUrl
+            Object payParamsObj = parse.get("payParams");
+            if (payParamsObj instanceof Map) {
+                Map<?, ?> payParamsMap = (Map<?, ?>) payParamsObj;
+                String payUrl = (String) payParamsMap.get("payUrl");
+
+                if (payUrl != null && !payUrl.trim().isEmpty()) {
+                    return Result.success(payUrl);
+                }
+            }
+
+            return Result.error("支付链接获取失败,请联系客服!");
+        }else{
+            userAccount.setBalance(userAccount.getBalance().subtract(insuranceProduct.getPremium()));
+
+            userAccountService.updateById(userAccount);
+
+            String orderNo = generateOrderNo();
+
+            UserPolicy userPolicy = new UserPolicy();
+            userPolicy.setAccount(userAccount.getAccount());
+            userPolicy.setProductName(insuranceProduct.getProductName());
+            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.setPayStatus(2);
+            userPolicy.setOrderNo(orderNo);
+            userPolicy.setBirthDate(LocalDate.parse(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();
         }
+    }
 
-        userAccount.setBalance(userAccount.getBalance().subtract(insuranceProduct.getPremium()));
-
-        userAccountService.updateById(userAccount);
-
-        UserPolicy userPolicy = new UserPolicy();
-        userPolicy.setAccount(userAccount.getAccount());
-        userPolicy.setProductName(insuranceProduct.getProductName());
-        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(LocalDate.parse(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);
+    private final Random random = new Random();
+    /**
+     * 生成随机订单号 (格式: 时间戳 + 6位随机数)
+     */
+    public String generateOrderNo() {
+        long timestamp = System.currentTimeMillis();
+        int randomNum = random.nextInt(900000) + 100000; // 6位随机数
+        return "ORDER" + timestamp + randomNum;
+    }
 
 
-        return Result.success("购买成功,注意查看资料审核状态!");
+    /**
+     * 处理支付结果 - 这里您自己实现业务逻辑
+     */
+    private void verifySign(String orderNo, String status, String amount, Map<String, String> params) {
+        // TODO: 在这里实现您的具体业务逻辑
+
+        if ("2".equals(status)) {
+            // 支付成功
+            System.out.println("=== 支付成功 ===");
+            System.out.println("订单号: " + orderNo);
+            System.out.println("金额: " + amount);
+            System.out.println("=================");
+
+            // 示例业务逻辑:
+            // 1. 更新订单状态为已支付
+            // 2. 记录支付时间
+            // 3. 发放商品或服务
+            // 4. 发送通知等
+
+        } else if ("3".equals(status)) {
+            // 业务处理完成
+            System.out.println("订单 " + orderNo + " 业务处理完成");
+
+        } else {
+            System.out.println("订单 " + orderNo + " 状态: " + status);
+        }
     }
 
     // 使用原子长整型确保线程安全
     private static final AtomicLong lastTimestamp = new AtomicLong(0);
-    private static final Random random = new Random();
     private static final String PREFIX = "POL";
 
     /**
@@ -119,7 +215,7 @@
      * 格式: POL + 时间戳 + 随机数
      * 示例: POL16973512345671234
      */
-    public static String generatePolicyNumber() {
+    public String generatePolicyNumber() {
         long currentTimestamp = System.currentTimeMillis();
         long lastTime = lastTimestamp.get();
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/util/HttpUtil.java b/ruoyi-admin/src/main/java/com/ruoyi/im/util/HttpUtil.java
new file mode 100644
index 0000000..090367d
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/util/HttpUtil.java
@@ -0,0 +1,48 @@
+package com.ruoyi.im.util;
+
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.Map;
+
+/**
+ * HTTP请求工具类
+ */
+public class HttpUtil {
+
+    /**
+     * 发送POST请求(表单格式)
+     */
+    public static String postForm(String urlStr, Map<String, Object> params) throws IOException {
+        // 构建参数字符串
+        StringBuilder postData = new StringBuilder();
+        for (Map.Entry<String, Object> param : params.entrySet()) {
+            if (postData.length() != 0) postData.append('&');
+            postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
+            postData.append('=');
+            postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
+        }
+
+        byte[] postDataBytes = postData.toString().getBytes("UTF-8");
+
+        URL url = new URL(urlStr);
+        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+        conn.setRequestMethod("POST");
+        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+        conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
+        conn.setDoOutput(true);
+        conn.getOutputStream().write(postDataBytes);
+
+        // 读取响应
+        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
+        StringBuilder response = new StringBuilder();
+        String line;
+        while ((line = reader.readLine()) != null) {
+            response.append(line);
+        }
+        reader.close();
+
+        return response.toString();
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/util/PayService.java b/ruoyi-admin/src/main/java/com/ruoyi/im/util/PayService.java
new file mode 100644
index 0000000..787e861
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/util/PayService.java
@@ -0,0 +1,152 @@
+package com.ruoyi.im.util;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.security.MessageDigest;
+import java.util.*;
+
+@Component
+public class PayService {
+
+    @Value("${pay.mch-id}")
+    private String mchId;
+
+    @Value("${pay.key}")
+    private String key;
+
+    @Value("${pay.base-url}")
+    private String baseUrl;
+
+    @Value("${pay.call-back-url}")
+    private String callBackUrl;
+
+    /**
+     * 创建支付订单
+     */
+    public String createOrder(BigDecimal amount,String orderNo,String payProductId ) {
+        try {
+            Map<String, Object> params = new HashMap<>();
+            params.put("mchId", mchId);
+            params.put("productId", payProductId);
+            params.put("mchOrderNo",orderNo );
+            params.put("amount", amount.intValue());
+            params.put("notifyUrl", callBackUrl);
+
+            String sign = generateSign(params);
+            params.put("sign", sign);
+
+            String url = baseUrl + "/api/pay/create_order";
+            return sendPost(url, params);
+
+        } catch (Exception e) {
+            return "{\"retCode\":\"FAIL\",\"retMsg\":\"" + e.getMessage() + "\"}";
+        }
+    }
+
+
+    /**
+     * 查询订单
+     */
+    public String queryOrder(String orderNo) {
+        try {
+            Map<String, Object> params = new HashMap<>();
+            params.put("mchId", mchId);
+            params.put("mchOrderNo", orderNo);
+
+            String sign = generateSign(params);
+            params.put("sign", sign);
+
+            String url = baseUrl + "/api/pay/query_order";
+            return sendPost(url, params);
+
+        } catch (Exception e) {
+            return "{\"retCode\":\"FAIL\",\"retMsg\":\"" + e.getMessage() + "\"}";
+        }
+    }
+
+    /**
+     * 验证回调签名
+     */
+    public boolean verifySign(Map<String, String> params) {
+        try {
+            String receivedSign = params.get("sign");
+            Map<String, Object> signParams = new HashMap<>(params);
+            String calculatedSign = generateSign(signParams);
+            return calculatedSign.equals(receivedSign);
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    /**
+     * 生成签名
+     */
+    private String generateSign(Map<String, Object> params) throws Exception {
+        // 移除sign参数
+        Map<String, Object> signParams = new HashMap<>(params);
+        signParams.remove("sign");
+
+        // 过滤空值并排序
+        List<String> keys = new ArrayList<>();
+        for (Map.Entry<String, Object> entry : signParams.entrySet()) {
+            if (entry.getValue() != null && !entry.getValue().toString().trim().isEmpty()) {
+                keys.add(entry.getKey());
+            }
+        }
+        Collections.sort(keys);
+
+        // 拼接字符串
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            String value = signParams.get(key).toString();
+            if (i > 0) sb.append("&");
+            sb.append(key).append("=").append(value);
+        }
+
+        // MD5加密
+        String stringSignTemp = sb.toString() + "&key=" + key;
+        MessageDigest md = MessageDigest.getInstance("MD5");
+        byte[] array = md.digest(stringSignTemp.getBytes("UTF-8"));
+        StringBuilder result = new StringBuilder();
+        for (byte item : array) {
+            result.append(String.format("%02x", item));
+        }
+        return result.toString().toUpperCase();
+    }
+
+    /**
+     * 发送POST请求
+     */
+    private String sendPost(String urlStr, Map<String, Object> params) throws Exception {
+        // 构建参数字符串
+        StringBuilder postData = new StringBuilder();
+        for (Map.Entry<String, Object> param : params.entrySet()) {
+            if (postData.length() != 0) postData.append('&');
+            postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
+            postData.append('=');
+            postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
+        }
+
+        byte[] postDataBytes = postData.toString().getBytes("UTF-8");
+
+        URL url = new URL(urlStr);
+        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+        conn.setRequestMethod("POST");
+        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+        conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
+        conn.setDoOutput(true);
+        conn.getOutputStream().write(postDataBytes);
+
+        // 读取响应
+        Scanner scanner = new Scanner(conn.getInputStream(), "UTF-8");
+        String response = scanner.useDelimiter("\\A").next();
+        scanner.close();
+        return response;
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/util/PaySignUtil.java b/ruoyi-admin/src/main/java/com/ruoyi/im/util/PaySignUtil.java
new file mode 100644
index 0000000..8e639d8
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/util/PaySignUtil.java
@@ -0,0 +1,89 @@
+package com.ruoyi.im.util;
+
+import java.security.MessageDigest;
+import java.util.*;
+
+/**
+ * 支付签名工具类
+ */
+public class PaySignUtil {
+
+    /**
+     * 生成签名
+     * @param params 参数Map
+     * @param key 商户密钥
+     * @return 签名值
+     */
+    public static String generateSign(Map<String, Object> params, String key) {
+        try {
+            // 第一步:参数按ASCII码排序
+            String stringA = createSignString(params);
+
+            // 第二步:拼接key
+            String stringSignTemp = stringA + "&key=" + key;
+
+            // 第三步:MD5加密并转为大写
+            return md5(stringSignTemp).toUpperCase();
+        } catch (Exception e) {
+            throw new RuntimeException("生成签名失败", e);
+        }
+    }
+
+    /**
+     * 验证签名
+     * @param params 参数Map
+     * @param key 商户密钥
+     * @param sign 待验证签名
+     * @return 验证结果
+     */
+    public static boolean verifySign(Map<String, Object> params, String key, String sign) {
+        String generatedSign = generateSign(params, key);
+        return generatedSign.equals(sign);
+    }
+
+    /**
+     * 创建待签名字符串
+     */
+    private static String createSignString(Map<String, Object> params) {
+        // 移除sign参数
+        Map<String, Object> signParams = new HashMap<>(params);
+        signParams.remove("sign");
+
+        // 过滤空值并排序
+        List<String> keys = new ArrayList<>();
+        for (Map.Entry<String, Object> entry : signParams.entrySet()) {
+            if (entry.getValue() != null && !entry.getValue().toString().trim().isEmpty()) {
+                keys.add(entry.getKey());
+            }
+        }
+
+        // ASCII码排序
+        Collections.sort(keys);
+
+        // 拼接字符串
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            String value = signParams.get(key).toString();
+            if (i > 0) {
+                sb.append("&");
+            }
+            sb.append(key).append("=").append(value);
+        }
+
+        return sb.toString();
+    }
+
+    /**
+     * MD5加密
+     */
+    private static String md5(String data) throws Exception {
+        MessageDigest md = MessageDigest.getInstance("MD5");
+        byte[] array = md.digest(data.getBytes("UTF-8"));
+        StringBuilder sb = new StringBuilder();
+        for (byte item : array) {
+            sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
+        }
+        return sb.toString();
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/util/SimplePayUtil.java b/ruoyi-admin/src/main/java/com/ruoyi/im/util/SimplePayUtil.java
new file mode 100644
index 0000000..ef3a2c0
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/util/SimplePayUtil.java
@@ -0,0 +1,175 @@
+package com.ruoyi.im.util;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.security.MessageDigest;
+import java.util.*;
+
+/**
+ * 简化版支付工具类
+ */
+public class SimplePayUtil {
+
+    private String mchId;        // 商户ID
+    private String key;          // 商户密钥
+    private String baseUrl;      // 支付系统基础URL
+
+    public SimplePayUtil(String mchId, String key, String baseUrl) {
+        this.mchId = mchId;
+        this.key = key;
+        this.baseUrl = baseUrl;
+    }
+
+    /**
+     * 统一下单 - 最简单版本
+     */
+    public String createOrder(String productId, String orderNo, int amount, String notifyUrl) {
+        try {
+            // 构建参数
+            Map<String, Object> params = new HashMap<>();
+            params.put("mchId", mchId);
+            params.put("productId", productId);
+            params.put("mchOrderNo", orderNo);
+            params.put("amount", amount);
+            params.put("notifyUrl", notifyUrl);
+
+            // 生成签名
+            String sign = generateSign(params);
+            params.put("sign", sign);
+
+            // 发送请求
+            String url = baseUrl + "/api/pay/create_order";
+            String result = sendPost(url, params);
+
+            return result;
+
+        } catch (Exception e) {
+            return "{\"retCode\":\"FAIL\",\"retMsg\":\"" + e.getMessage() + "\"}";
+        }
+    }
+
+    /**
+     * 查询订单 - 最简单版本
+     */
+    public String queryOrder(String orderNo) {
+        try {
+            // 构建参数
+            Map<String, Object> params = new HashMap<>();
+            params.put("mchId", mchId);
+            params.put("mchOrderNo", orderNo);
+
+            // 生成签名
+            String sign = generateSign(params);
+            params.put("sign", sign);
+
+            // 发送请求
+            String url = baseUrl + "/api/pay/query_order";
+            String result = sendPost(url, params);
+
+            return result;
+
+        } catch (Exception e) {
+            return "{\"retCode\":\"FAIL\",\"retMsg\":\"" + e.getMessage() + "\"}";
+        }
+    }
+
+    /**
+     * 生成签名
+     */
+    private String generateSign(Map<String, Object> params) throws Exception {
+        // 移除sign参数
+        Map<String, Object> signParams = new HashMap<>(params);
+        signParams.remove("sign");
+
+        // 过滤空值并排序
+        List<String> keys = new ArrayList<>();
+        for (Map.Entry<String, Object> entry : signParams.entrySet()) {
+            if (entry.getValue() != null && !entry.getValue().toString().trim().isEmpty()) {
+                keys.add(entry.getKey());
+            }
+        }
+
+        // ASCII码排序
+        Collections.sort(keys);
+
+        // 拼接字符串
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            String value = signParams.get(key).toString();
+            if (i > 0) {
+                sb.append("&");
+            }
+            sb.append(key).append("=").append(value);
+        }
+
+        // 拼接key并MD5加密
+        String stringSignTemp = sb.toString() + "&key=" + key;
+        MessageDigest md = MessageDigest.getInstance("MD5");
+        byte[] array = md.digest(stringSignTemp.getBytes("UTF-8"));
+        StringBuilder result = new StringBuilder();
+        for (byte item : array) {
+            result.append(String.format("%02x", item));
+        }
+
+        return result.toString().toUpperCase();
+    }
+
+    /**
+     * 发送POST请求
+     */
+    private String sendPost(String urlStr, Map<String, Object> params) throws Exception {
+        // 构建参数字符串
+        StringBuilder postData = new StringBuilder();
+        for (Map.Entry<String, Object> param : params.entrySet()) {
+            if (postData.length() != 0) postData.append('&');
+            postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
+            postData.append('=');
+            postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
+        }
+
+        byte[] postDataBytes = postData.toString().getBytes("UTF-8");
+
+        URL url = new URL(urlStr);
+        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+        conn.setRequestMethod("POST");
+        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+        conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
+        conn.setDoOutput(true);
+
+        // 发送数据
+        OutputStream os = conn.getOutputStream();
+        os.write(postDataBytes);
+        os.flush();
+        os.close();
+
+        // 读取响应
+        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
+        StringBuilder response = new StringBuilder();
+        String line;
+        while ((line = reader.readLine()) != null) {
+            response.append(line);
+        }
+        reader.close();
+
+        return response.toString();
+    }
+
+    /**
+     * 验证回调签名
+     */
+    public boolean verifyNotifySign(Map<String, String> params) {
+        try {
+            String receivedSign = params.get("sign");
+            Map<String, Object> signParams = new HashMap<>(params);
+            String calculatedSign = generateSign(signParams);
+            return calculatedSign.equals(receivedSign);
+        } catch (Exception e) {
+            return false;
+        }
+    }
+}
\ No newline at end of file
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
index 31db165..82ba300 100644
--- 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
@@ -17,6 +17,7 @@
 import com.ruoyi.system.domain.dto.UserPolicyDto;
 import com.ruoyi.system.mapper.UserKycMapper;
 import com.ruoyi.system.service.UserAccountService;
+import org.apache.catalina.User;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
@@ -25,6 +26,7 @@
 import javax.validation.Valid;
 import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 
 @RestController
 @RequestMapping("/kyc")
@@ -60,6 +62,8 @@
                 userKyc.setHeadPortraitImg(dto.getHeadPortraitImg());
                 userKyc.setNationalEmblemImg(dto.getNationalEmblemImg());
                 userKyc.setHandImg(dto.getHandImg());
+                userKyc.setName(dto.getName());
+                userKyc.setIdCard(dto.getIdCard());
                 userKycService.save(userKyc);
             }else{
                 if(userKyc.getState() == 0){
@@ -69,6 +73,8 @@
                 userKyc.setHeadPortraitImg(dto.getHeadPortraitImg());
                 userKyc.setNationalEmblemImg(dto.getNationalEmblemImg());
                 userKyc.setHandImg(dto.getHandImg());
+                userKyc.setName(dto.getName());
+                userKyc.setIdCard(dto.getIdCard());
                 userKycService.updateById(userKyc);
             }
             userAccount.setKycStatus(0);
@@ -140,4 +146,31 @@
         List<UserKyc> list = userKycService.list(wrapper);
         return getDataTable(list);
     }
+
+
+    /**
+     * 根据账户查询实名认证信息
+     */
+    @GetMapping("/getByAccount")
+    public Result getByAccount(@RequestParam(value = "account") String account) {
+        LambdaQueryWrapper<UserKyc> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(UserKyc::getAccount,account);
+        // 按创建时间倒序排列
+        wrapper.orderByDesc(UserKyc::getCreatedAt);
+
+        // 查询用户KYC信息
+        UserKyc userKyc = userKycService.getOne(new LambdaQueryWrapper<UserKyc>()
+                .eq(UserKyc::getAccount, account));
+        // 如果KYC信息存在,补充昵称信息
+        UserAccount userAccount = userAccountService.getOne(new LambdaQueryWrapper<UserAccount>()
+                .eq(UserAccount::getAccount, account));
+        // 如果KYC信息不存在,创建空实体
+        if (ObjectUtil.isEmpty(userKyc)) {
+            userKyc = new UserKyc();
+        }
+        if (StringUtils.isNotEmpty(userAccount.getNickname())) {
+            userKyc.setNickName(userAccount.getNickname());
+        }
+        return Result.success(userKyc);
+    }
 }
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 4e471e8..0133143 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
@@ -12,6 +12,7 @@
 import com.ruoyi.im.service.InsuranceProductService;
 import com.ruoyi.im.service.MedicalInsuranceAccountService;
 import com.ruoyi.im.service.impl.InsurancePositionServiceImpl;
+import com.ruoyi.im.util.PayService;
 import com.ruoyi.im.util.RedisDistributedLock;
 import com.ruoyi.im.util.UserPolicyUtils;
 import com.ruoyi.system.domain.*;
@@ -26,12 +27,10 @@
 
 import javax.validation.Valid;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.UUID;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @RestController
@@ -55,6 +54,8 @@
 
     @Autowired
     InsuranceProductService insuranceProductService;
+    @Autowired
+    private PayService payService;
 
     /**
      * 保险购买申请
@@ -97,7 +98,10 @@
         try {
             UserAccount userAccount = userAccountService.getOne(new LambdaQueryWrapper<UserAccount>()
                     .eq(UserAccount::getAccount,account));
-            List<UserPolicy> list = userPolicyService.list(new LambdaQueryWrapper<UserPolicy>().eq(UserPolicy::getUserId, userAccount.getId()));
+            List<UserPolicy> list = userPolicyService.list(new LambdaQueryWrapper<UserPolicy>()
+                    .eq(UserPolicy::getUserId, userAccount.getId())
+                    .eq(UserPolicy::getPayStatus,2)
+            );
             return Result.success(list);
         }catch (Exception e){
             e.printStackTrace();
@@ -131,6 +135,9 @@
             wrapper.ne(UserPolicy::getApprovalStatus, 0);
         }else{
             wrapper.eq(UserPolicy::getApprovalStatus, 0);
+            wrapper.eq(UserPolicy::getPayStatus,3)
+                    .or()
+                    .eq(UserPolicy::getPayStatus,2);
         }
 
         // 按创建时间倒序排列
@@ -160,6 +167,9 @@
             if(approvalStatus == 2 && StringUtils.isEmpty(message)){
                 return AjaxResult.error("驳回理由不能为空!");
             }
+            if(userPolicy.getPayStatus() != 3 && userPolicy.getPayStatus() != 2){
+                return AjaxResult.error("保单未支付完成,不能进行审批!");
+            }
             UserAccount userAccount = userAccountService.getById(userPolicy.getUserId());
             if(approvalStatus == 2){
                 userPolicy.setApprovalStatus(approvalStatus);
@@ -183,13 +193,18 @@
             userPolicy.setUpdatedAt(new Date());
             userPolicyService.updateById(userPolicy);
 
+
+            //每天可领
+            BigDecimal amountClaimed = userPolicy.getCoverageAmount()
+                    .divide(new BigDecimal(userPolicy.getTerm()), 4, RoundingMode.HALF_UP);
+
             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.setAmountClaimed(amountClaimed);
             medicalInsuranceAccount.setAlreadyReceived(BigDecimal.ZERO);
             medicalInsuranceAccount.setAmountAlreadyUsed(BigDecimal.ZERO);
             medicalInsuranceAccount.setEffectiveDate(userPolicy.getStartDate());
@@ -297,4 +312,53 @@
             throw new IllegalArgumentException("基准日期不能为null");
         }
     }
+
+
+
+    /**
+     * 支付回调接口 - 支付平台会调用这个接口
+     */
+    @PostMapping("/notify")
+    public String payNotify(@RequestParam Map<String, String> params) {
+        System.out.println("收到支付回调: " + params);
+
+        // 验证签名
+        if (!payService.verifySign(params)) {
+            System.out.println("签名验证失败");
+            return "fail";
+        }
+
+        // 获取关键参数
+        String orderNo = params.get("mchOrderNo");
+        String status = params.get("status");
+        String amount = params.get("amount");
+
+        System.out.println("订单号: " + orderNo + ", 状态: " + status + ", 金额: " + amount);
+
+        // 这里调用您的业务处理逻辑
+        handlePayResult(orderNo, Integer.valueOf(status), params);
+
+        return "success";
+    }
+
+
+    /**
+     * 处理支付结果 - 这里您自己实现业务逻辑
+     */
+    private void handlePayResult(String orderNo, Integer status, Map<String, String> params) {
+        UserPolicy userPolicy = userPolicyService.getOne(new LambdaQueryWrapper<UserPolicy>()
+                .eq(UserPolicy::getOrderNo,orderNo)
+        );
+        if(ObjectUtil.isNotEmpty(userPolicy)){
+            if ("2".equals(status)) {
+                userPolicy.setPayStatus(status);
+            } else if ("3".equals(status)) {
+                userPolicy.setPayStatus(status);
+            } else if ("0010".equals(status)) {
+                userPolicy.setPayMsg("系统超时或异常");
+            } else if ("0014".equals(status)) {
+            userPolicy.setPayMsg("mchId是系统分配的商户号,不能自己生成");
+        }
+        }
+    }
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/BasicSetupController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/BasicSetupController.java
index 4e8a938..741901c 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/BasicSetupController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/BasicSetupController.java
@@ -52,6 +52,8 @@
         configServiceById.setLegalInstitution(vo.getLegalInstitution());
         configServiceById.setCopyrightInfo(vo.getCopyrightInfo());
         configServiceById.setCodeUrl(vo.getCodeUrl());
+        configServiceById.setCustomerServiceUrl(vo.getCustomerServiceUrl());
+        configServiceById.setAboutUs(vo.getAboutUs());
         groupWelcomeConfigService.updateById(configServiceById);
         return AjaxResult.success("保存成功!");
     }
@@ -71,14 +73,14 @@
      */
 //    @PreAuthorize("@ss.hasPermi('im:group:list')")
     @GetMapping("/list")
-    public TableDataInfo list(@RequestParam(value = "keyword", required = false) String keyword)
+    public TableDataInfo list(@RequestParam(value = "keywords", required = false) String keywords)
     {
         // 创建查询条件包装器
         LambdaQueryWrapper<IpBlacklist> queryWrapper = new LambdaQueryWrapper<>();
 
         // 只有当 keyword 不为空时才添加 OR 条件
-        if (ObjectUtil.isNotEmpty(keyword)) {
-            queryWrapper.and(wrapper -> wrapper.eq(IpBlacklist::getIpAddress,keyword)
+        if (ObjectUtil.isNotEmpty(keywords)) {
+            queryWrapper.and(wrapper -> wrapper.eq(IpBlacklist::getIpAddress,keywords)
             );
         }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/InvitationBlacklistController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/InvitationBlacklistController.java
new file mode 100644
index 0000000..67b6015
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/InvitationBlacklistController.java
@@ -0,0 +1,80 @@
+package com.ruoyi.web.controller.system;
+
+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.system.domain.InvitationBlacklist;
+import com.ruoyi.system.domain.IpBlacklist;
+import com.ruoyi.system.service.impl.InvitationBlacklistServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+@RestController
+@RequestMapping("/system/Invitation")
+public class InvitationBlacklistController extends BaseController {
+
+    @Autowired
+    InvitationBlacklistServiceImpl service;
+
+    /**
+     * 邀请码黑名单列表
+     */
+//    @PreAuthorize("@ss.hasPermi('im:group:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(@RequestParam(value = "keywords", required = false) String keywords)
+    {
+        // 创建查询条件包装器
+        LambdaQueryWrapper<InvitationBlacklist> queryWrapper = new LambdaQueryWrapper<>();
+
+        // 只有当 keyword 不为空时才添加 OR 条件
+        if (ObjectUtil.isNotEmpty(keywords)) {
+            queryWrapper.and(wrapper -> wrapper.eq(InvitationBlacklist::getInvitationCode,keywords)
+            );
+        }
+
+        // 默认按创建时间倒序
+        queryWrapper.orderByDesc(InvitationBlacklist::getCreateTime);
+        startPage();
+        List<InvitationBlacklist> list = service.list(queryWrapper);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 新增邀请码黑名单
+     */
+    @PostMapping("/addCode")
+    public AjaxResult addIp(@RequestParam("code") String code) {
+
+        long count = service.count(new LambdaQueryWrapper<>(InvitationBlacklist.class).eq(InvitationBlacklist::getInvitationCode, code));
+        if(count > 0){
+            return AjaxResult.error("邀请码已存在!");
+        }
+        InvitationBlacklist invitationBlacklist = new InvitationBlacklist();
+        invitationBlacklist.setInvitationCode(code);
+        invitationBlacklist.setCreateTime(new Date());
+        service.save(invitationBlacklist);
+        return AjaxResult.success("添加成功");
+    }
+
+    /**
+     * 删除邀请码黑名单
+     */
+    @PostMapping("/deleteCode")
+    public AjaxResult deleteCode(@RequestParam("id") Integer id) {
+
+        InvitationBlacklist invitationBlacklist  = service.getById(id);
+        if(ObjectUtil.isEmpty(invitationBlacklist)){
+            return AjaxResult.error("邀请码不存在!");
+        }
+        service.removeById(id);
+        return AjaxResult.success("删除成功");
+    }
+
+
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/user/UserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/user/UserController.java
index d64eae3..165e02c 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/user/UserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/user/UserController.java
@@ -15,6 +15,7 @@
 import com.ruoyi.im.service.ImApiServcie;
 import com.ruoyi.im.util.ConverterUtil;
 import com.ruoyi.im.util.PhoneNumberValidatorUtil;
+import com.ruoyi.im.util.SymmetricCryptoUtil;
 import com.ruoyi.system.domain.UserAccount;
 import com.ruoyi.system.domain.vo.UserAccountUpdateVo;
 import com.ruoyi.system.domain.vo.UserAccountVo;
@@ -243,15 +244,28 @@
     public AjaxResult updateUserAccount(UserAccountUpdateVo vo) {
 
         try {
-            UserAccount userAccount = userAccountService.getById(vo.getId());
+            UserAccount userAccount = userAccountService.getOne(new LambdaQueryWrapper<UserAccount>()
+                    .eq(UserAccount::getAccount,vo.getAccount())
+            );
             if(ObjectUtil.isEmpty(userAccount)){
                 return AjaxResult.error("会员不存在!");
             }
-            PhoneNumberValidatorUtil.ValidationResult result = PhoneNumberValidatorUtil.validatePhoneNumber(vo.getPhoneNumber());
-            if(!result.isValid()){
-                return AjaxResult.error("手机号格式不正确!");
+            if(StringUtils.isNotEmpty(vo.getPhoneNumber())){
+                PhoneNumberValidatorUtil.ValidationResult result = PhoneNumberValidatorUtil.validatePhoneNumber(vo.getPhoneNumber());
+                if(!result.isValid()){
+                    return AjaxResult.error("手机号格式不正确!");
+                }
             }
-            vo.setAccountId(userAccount.getCloudMessageAccount());
+            if(StringUtils.isNotEmpty(vo.getPassword()) && StringUtils.isEmpty(vo.getOldPassword())){
+                return AjaxResult.error("旧密码不能为空!");
+            }
+            if(StringUtils.isNotEmpty(vo.getPassword())){
+                String s = SymmetricCryptoUtil.decryptPassword(userAccount.getPassword());
+                if(!vo.getOldPassword().equals(s)){
+                    return AjaxResult.error("旧密码不正确!");
+                }
+            }
+            vo.setAccount(userAccount.getCloudMessageAccount());
             return imApiServcie.updateUserAccount(vo);
         }catch (Exception e){
             e.printStackTrace();
@@ -275,7 +289,7 @@
                 if(StringUtils.isEmpty(dto.getPassword())){
                     return Result.error("密码不能为空");
                 }
-                if(StringUtils.isEmpty(dto.getNickname())){
+                if(StringUtils.isEmpty(dto.getNikeName())){
                     return Result.error("昵称不能为空");
                 }
             }else if (dto.getType() == 1){
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 247322b..adc633c 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -152,4 +152,10 @@
 # 网易云信配置
 netease:
   im:
-    api-head-portrait-url: https://open.yunxinapi.com
\ No newline at end of file
+    api-head-portrait-url: https://open.yunxinapi.com
+
+pay:
+  mch-id: "10761"
+  key: "UHI4O7SDWRP8CTRDSGHN9KW3MIAT7GWWJ8QGL6GGZIKVLHZT3XIYEVFXDLBBWYPNXGHFN9MNN1JCCQKZFQQOVMZEH8PVTUVW2ECYDGAFOQU6GREKZOF4AOHSIRF2SY8E"
+  base-url: "http://pay.hwpal.xyz"
+  call-back-url: "http://localhost:8080/userPolicy/notify"
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/GroupWelcomeConfig.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/GroupWelcomeConfig.java
index a7fcc35..816b2ac 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/GroupWelcomeConfig.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/GroupWelcomeConfig.java
@@ -47,6 +47,17 @@
     private String welcomeMessage;
 
     /**
+     * 客服连接
+     */
+    private String customerServiceUrl;
+
+
+    /**
+     * 关于我们
+     */
+    private String  aboutUs;
+
+    /**
      * 法律机构
      */
     private String legalInstitution;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/InvitationBlacklist.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/InvitationBlacklist.java
new file mode 100644
index 0000000..04898d6
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/InvitationBlacklist.java
@@ -0,0 +1,30 @@
+package com.ruoyi.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class InvitationBlacklist {
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 邀请码
+     */
+    private String invitationCode;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+
+}
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 806c063..a79b99d 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
@@ -34,7 +34,7 @@
     // 账户余额(用户申请使用才扣)
     private BigDecimal remainingBalance ;
 
-    //待领金额
+    //待领金额(现在改成了每天可领多少了)
     private BigDecimal amountClaimed;
 
     //已领取金额
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/UserAccount.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/UserAccount.java
index 1db947f..a8288a0 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/UserAccount.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/UserAccount.java
@@ -94,4 +94,11 @@
 
     //达成时间
     private LocalDate agreedTime;
+
+    //创建群开关 0 开启 1关闭
+    private Integer groupPermissions = 1;
+
+    //添加好友 0 开启 1 关闭
+    private Integer addFriend = 1;
+
 }
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
index 602d4b2..e7a891a 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/UserKyc.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/UserKyc.java
@@ -1,9 +1,11 @@
 package com.ruoyi.system.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import lombok.Data;
 
+import javax.validation.constraints.NotEmpty;
 import java.util.Date;
 
 /**
@@ -42,4 +44,14 @@
 
     // 更新时间
     private Date updatedAt;
+
+    //手持照片
+    private String name;
+
+    //手持照片
+    private String idCard;
+
+    //昵称
+    @TableField(exist = false)
+    private String nickName;
 }
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 898c50e..a9b8b3f 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
@@ -38,7 +38,7 @@
     // 保费
     private BigDecimal premium;
 
-    // 保险期限(如:1年/终身)
+    // 保险期限(如:1天/终身)
     private Integer term;
 
     // 姓名
@@ -86,6 +86,15 @@
     //驳回信息
     private String message;
 
+    //支付状态,0-订单生成,1-支付中,2-支付成功,3-业务处理完成
+    private Integer payStatus;
+
+    //支付订单号
+    private String orderNo;
+
+    //支付失败原因
+    private String payMsg;
+
     // 性别枚举 M:男  F:女  OTHER:其他
     public enum Gender {
         M, F, OTHER
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
index d167a63..326cd68 100644
--- 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
@@ -26,4 +26,12 @@
     @NotEmpty(message = "手持照片不能为空")
     private String handImg;
 
+    //手持照片
+    @NotEmpty(message = "姓名不能为空")
+    private String name;
+
+    //手持照片
+    @NotEmpty(message = "身份证不能为空")
+    private String idCard;
+
 }
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 a396ec9..4407c94 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
@@ -34,4 +34,7 @@
     // 手机号码
     private String phone;
 
+    //支付产品id
+    private String payProductId;
+
 }
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
index eacf498..53a6091 100644
--- 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
@@ -24,4 +24,19 @@
     //实名状态:0 认证中  1 已认证   2 未实名
     private Integer kycStatus = 2;
 
+    /**
+     * 客服连接
+     */
+    private String customerServiceUrl;
+
+    /**
+     * 关于我们
+     */
+    private String  aboutUs;
+
+    //创建群开关 0 开启 1关闭
+    private Integer groupPermissions = 1;
+
+    //添加好友 0 开启 1 关闭
+    private Integer addFriend = 1;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/UserAccountUpdateVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/UserAccountUpdateVo.java
index dd7e7dc..c84ca30 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/UserAccountUpdateVo.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/UserAccountUpdateVo.java
@@ -23,13 +23,16 @@
     private Integer id;
 
     // 云信账号
-    private String accountId;
+    private String account;
 
     // 手机号(唯一)
     private String phoneNumber;
 
     // 密码
     private String password;
+
+    // 旧密码
+    private String oldPassword;
 
     // 账号类型: 0:真实 1:虚拟
     private Integer accountType;
@@ -45,6 +48,12 @@
     // 用户性别,0-未知,1-男,2-女。
     private Integer gender;
 
+
+    //创建群开关 0 开启 1关闭
+    private Integer groupPermissions = 1;
+
+    //添加好友 0 开启 1 关闭
+    private Integer addFriend = 1;
 //    // 是否支持昵称搜索
 //    private Boolean supportNicknameSearch = true;
 //
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/InvitationBlacklistMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/InvitationBlacklistMapper.java
new file mode 100644
index 0000000..49fe856
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/InvitationBlacklistMapper.java
@@ -0,0 +1,10 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.domain.InvitationBlacklist;
+import com.ruoyi.system.domain.IpBlacklist;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface InvitationBlacklistMapper extends BaseMapper<InvitationBlacklist> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/InvitationBlacklistService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/InvitationBlacklistService.java
new file mode 100644
index 0000000..608a8d7
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/InvitationBlacklistService.java
@@ -0,0 +1,8 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.domain.InvitationBlacklist;
+import com.ruoyi.system.domain.IpBlacklist;
+
+public interface InvitationBlacklistService extends IService<InvitationBlacklist> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/InvitationBlacklistServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/InvitationBlacklistServiceImpl.java
new file mode 100644
index 0000000..e0e135c
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/InvitationBlacklistServiceImpl.java
@@ -0,0 +1,14 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.domain.InvitationBlacklist;
+import com.ruoyi.system.domain.IpBlacklist;
+import com.ruoyi.system.mapper.InvitationBlacklistMapper;
+import com.ruoyi.system.mapper.IpBlacklistMapper;
+import com.ruoyi.system.service.InvitationBlacklistService;
+import com.ruoyi.system.service.IpBlacklistService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class InvitationBlacklistServiceImpl extends ServiceImpl<InvitationBlacklistMapper, InvitationBlacklist> implements InvitationBlacklistService {
+}

--
Gitblit v1.9.3