1
zj
2025-09-20 02d6a517f7d4dac2d5271cefe421a628d838414b
1
15 files modified
1 files added
196 ■■■■ changed files
ruoyi-admin/src/main/java/com/ruoyi/im/config/AppAuthConfig.java 2 ●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/MedicalInsuranceAccountServiceImpl.java 6 ●●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/UserPolicyServiceImpl.java 4 ●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/InsurancePositionController.java 22 ●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/InsuranceProductController.java 27 ●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/MedicalInsuranceAccountController.java 10 ●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserKycController.java 53 ●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserPolicyController.java 19 ●●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/resources/application-druid.yml 6 ●●●● patch | view | raw | blame | history
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java 5 ●●●●● patch | view | raw | blame | history
ruoyi-system/src/main/java/com/ruoyi/system/domain/InsuranceProduct.java 2 ●●●●● patch | view | raw | blame | history
ruoyi-system/src/main/java/com/ruoyi/system/domain/UserAccount.java 3 ●●●●● patch | view | raw | blame | history
ruoyi-system/src/main/java/com/ruoyi/system/domain/UserKyc.java 3 ●●●●● patch | view | raw | blame | history
ruoyi-system/src/main/java/com/ruoyi/system/domain/UserPolicy.java 2 ●●● patch | view | raw | blame | history
ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsuranceProductUpdateDTO.java 5 ●●●● patch | view | raw | blame | history
ruoyi-system/src/main/java/com/ruoyi/system/domain/out/UserKycOut.java 27 ●●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/im/config/AppAuthConfig.java
@@ -5,7 +5,7 @@
    /**
     * 应用认证配置
     */
    DEFAULT_CONFIG("d3aa2010cbfcd1f5021367928b60987c", "42647c75bde9");
    DEFAULT_CONFIG("cd693c66bb6992a7cc2b13379e981d48", "720c0b98f7a3");
    private final String appKey;
    private final String appSecret;
ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/MedicalInsuranceAccountServiceImpl.java
@@ -11,6 +11,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import javax.xml.crypto.Data;
import java.math.BigDecimal;
@@ -50,7 +51,7 @@
                }
                // 检查账户状态
                if (!"ACTIVE".equals(account.getAccountStatus())) {
                if (!"ACTIVE".equals(account.getAccountStatus().name())) {
                    return Result.error("保单已失效");
                }
@@ -108,6 +109,7 @@
                return Result.success("领取成功");
            }catch (Exception e){
                e.printStackTrace();
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                log.error("领取保险金出错:"+e.getMessage());
            }finally {
                accountLock.unlock();
@@ -126,7 +128,7 @@
            return Result.success(false);
        }
        // 检查账户状态
        if (!"ACTIVE".equals(account.getAccountStatus())) {
        if (!"ACTIVE".equals(account.getAccountStatus().name())) {
            return Result.success(false);
        }
        // 检查账户有效期
ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/UserPolicyServiceImpl.java
@@ -36,6 +36,10 @@
        if(ObjectUtil.isEmpty(userAccount)){
            return Result.error("请重新登录,未查询到你的信息!");
        }
        if(userAccount.getKycStatus() == 0){
            return Result.error("请先实名认证");
        }
        // 验证手机号
        boolean isPhoneValid = ValidatorUtil.isValidPhone(dto.getPhone());
        if(!isPhoneValid){
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/InsurancePositionController.java
@@ -26,18 +26,19 @@
     * 新增保险职位
     */
    @PostMapping("/add")
    public AjaxResult add(@Valid @RequestBody InsurancePositionDto dto) {
    public AjaxResult add(InsurancePositionDto dto) {
        try {
            InsurancePosition insurancePosition = new InsurancePosition();
            insurancePosition.setPosition(dto.getPosition());
            insurancePosition.setNumberPeople(dto.getNumberPeople());
            insurancePosition.setRank(dto.getRank());
            insurancePosition.setSalary(dto.getSalary());
            insurancePosition.setCreatedAt(new Date());
            insurancePosition.setUpdatedAt(new Date());
            service.save(insurancePosition);
            return AjaxResult.success("添加成功");
        }catch (Exception e){
            e.getMessage();
            e.printStackTrace();
            return AjaxResult.error("添加失败!");
        }
    }
@@ -45,13 +46,13 @@
    /**
     * 删除产品
     * 删除保险职位
     */
    @DeleteMapping("/{id}")
    public AjaxResult delete(@PathVariable Integer id) {
    @GetMapping("/delete")
    public AjaxResult delete(@RequestParam(value = "id") Integer id) {
        InsurancePosition position = service.getById(id);
        if (position == null) {
            return AjaxResult.error("产品不存在");
            return AjaxResult.error("职位不存在");
        }
        boolean success = service.removeById(id);
@@ -59,7 +60,7 @@
    }
    /**
     * 产品信息列表
     * 职位列表
     */
    @GetMapping("/list")
    public TableDataInfo list() {
@@ -72,10 +73,10 @@
    }
    /**
     * 新增保险职位
     * 修改保险职位
     */
    @PostMapping("/update")
    public AjaxResult update(@Valid @RequestBody InsurancePositionDto dto) {
    public AjaxResult update(InsurancePositionDto dto) {
        try {
            InsurancePosition position = service.getById(dto.getId());
            if(position == null){
@@ -84,11 +85,12 @@
            position.setPosition(dto.getPosition());
            position.setNumberPeople(dto.getNumberPeople());
            position.setRank(dto.getRank());
            position.setSalary(dto.getSalary());
            position.setUpdatedAt(new Date());
            service.updateById(position);
            return AjaxResult.success("修改成功");
        }catch (Exception e){
            e.getMessage();
            e.printStackTrace();
            return AjaxResult.error("修改失败!");
        }
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/InsuranceProductController.java
@@ -43,7 +43,7 @@
     */
    @PostMapping("/update")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult update(@Valid @RequestBody InsuranceProductUpdateDTO dto) {
    public AjaxResult update(InsuranceProductUpdateDTO dto) {
        // 1. 查询产品是否存在
        InsuranceProduct insuranceProduct = insuranceProductService.getById(dto.getId());
        if (insuranceProduct == null) {
@@ -52,7 +52,6 @@
        // 2. 更新产品基本信息
        insuranceProduct.setProductName(dto.getProductName());
        insuranceProduct.setProductCode(dto.getProductCode());
        insuranceProduct.setDescription(dto.getDescription());
        insuranceProduct.setCoverageAmount(dto.getCoverageAmount());
        insuranceProduct.setPremium(dto.getPremium());
@@ -118,7 +117,7 @@
            deleteByProductId(insuranceProduct.getId());
        }
        return AjaxResult.success("保存成功!");
        return AjaxResult.success("修改成功!");
    }
    public void deleteByProductId(Integer productId) {
@@ -140,24 +139,26 @@
     * 产品信息列表
     */
    @GetMapping("/list")
    public TableDataInfo list(InsuranceProductUpdateDTO dto) {
    public TableDataInfo list(@RequestParam(value = "productName",required = false) String productName,
                              @RequestParam(value = "productCode",required = false) String productCode,
                              @RequestParam(value = "status",required = false) String status) {
        startPage();
        LambdaQueryWrapper<InsuranceProduct> wrapper = new LambdaQueryWrapper<>();
        // 产品名称模糊查询
        if (StringUtils.isNotBlank(dto.getProductName())) {
            wrapper.like(InsuranceProduct::getProductName, dto.getProductName());
        if (StringUtils.isNotBlank(productName)) {
            wrapper.like(InsuranceProduct::getProductName, productName);
        }
        // 产品代码模糊查询
        if (StringUtils.isNotBlank(dto.getProductCode())) {
            wrapper.like(InsuranceProduct::getProductCode, dto.getProductCode());
        if (StringUtils.isNotBlank(productCode)) {
            wrapper.like(InsuranceProduct::getProductCode, productCode);
        }
        // 产品状态精确查询
        if (dto.getStatus() != null) {
            wrapper.eq(InsuranceProduct::getStatus, dto.getStatus());
        if (StringUtils.isNotBlank(status)) {
            wrapper.eq(InsuranceProduct::getStatus, status);
        }
        // 按创建时间倒序排列
@@ -172,7 +173,7 @@
     */
    @PostMapping("/create")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult create(@Valid @RequestBody InsuranceProductUpdateDTO dto) {
    public AjaxResult create(InsuranceProductUpdateDTO dto) {
        // 1. 检查产品代码是否已存在
        long count = insuranceProductService.count(new LambdaQueryWrapper<InsuranceProduct>().eq(InsuranceProduct::getProductCode, dto.getProductCode()));
        if (count > 0) {
@@ -254,8 +255,8 @@
    /**
     * 删除产品
     */
    @DeleteMapping("/{id}")
    public AjaxResult delete(@PathVariable Integer id) {
    @GetMapping("/delete")
    public AjaxResult delete(@RequestParam(value = "id") Integer id) {
        InsuranceProduct product = insuranceProductService.getById(id);
        if (product == null) {
            return AjaxResult.error("产品不存在");
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/MedicalInsuranceAccountController.java
@@ -23,24 +23,24 @@
     * 领取保险金
     */
    @GetMapping("/getInsuranceBenefit")
    public Result getInsuranceBenefit(@RequestParam(value = "id") Integer id) {
    public Result getInsuranceBenefit(@RequestParam(value = "userId") Integer userId) {
        try {
            return medicalInsuranceAccountService.getInsuranceBenefit(id);
            return medicalInsuranceAccountService.getInsuranceBenefit(userId);
        }catch (Exception e){
            e.getMessage();
            e.printStackTrace();
            return Result.error("购买失败!");
        }
    }
    /**
     * 领取保险金
     * 查询领取状态
     */
    @GetMapping("/getReceiveStatus")
    public Result getReceiveStatus(@RequestParam(value = "userId") Integer userId) {
        try {
            return medicalInsuranceAccountService.getReceiveStatus(userId);
        }catch (Exception e){
            e.getMessage();
            e.printStackTrace();
            return Result.error("购买失败!");
        }
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserKycController.java
@@ -1,11 +1,15 @@
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.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.InsurancePosition;
import com.ruoyi.system.domain.UserAccount;
import com.ruoyi.system.domain.UserKyc;
import com.ruoyi.system.domain.UserPolicy;
@@ -14,14 +18,17 @@
import com.ruoyi.system.mapper.UserKycMapper;
import com.ruoyi.system.service.UserAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.Date;
import java.util.List;
@RestController
@RequestMapping("/kyc")
public class UserKycController {
public class UserKycController extends BaseController {
    @Autowired
    UserKycService userKycService;
@@ -30,10 +37,11 @@
    UserAccountService userAccountService;
    /**
     * 保险购买申请
     * 实名认证申请
     */
    @PostMapping("/kycApply")
    public Result kycApply(@Valid @RequestBody UserKycDto dto) {
    @Transactional
    public Result kycApply(UserKycDto dto) {
        try {
            UserAccount userAccount = userAccountService.getById(dto.getUserId());
            if(ObjectUtil.isEmpty(userAccount)){
@@ -41,23 +49,31 @@
            }
            UserKyc userKyc = new UserKyc();
            userKyc.setUserId(userAccount.getId());
            userKyc.setAccount(userAccount.getAccount());
            userKyc.setState(0);
            userKyc.setHeadPortraitImg(dto.getHeadPortraitImg());
            userKyc.setNationalEmblemImg(dto.getNationalEmblemImg());
            userKyc.setHandImg(dto.getHandImg());
            userKycService.save(userKyc);
            userAccount.setKycStatus(0);
            userAccountService.updateById(userAccount);
            return Result.success("提交成功,请等待审核!");
        }catch (Exception e){
            e.getMessage();
            return Result.error("购买失败");
            e.printStackTrace();
            // 手动设置回滚
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            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) {
    @GetMapping("/examine")
    @Transactional
    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)){
@@ -72,11 +88,32 @@
            userKyc.setState(approvalStatus);
            userKyc.setMessage(message);
            userKyc.setUpdatedAt(new Date());
            UserAccount userAccount = userAccountService.getById(userKyc.getUserId());
            userAccount.setKycStatus(approvalStatus);
            userAccountService.updateById(userAccount);
            return AjaxResult.success("审批成功");
        }catch (Exception e){
            e.getMessage();
            e.printStackTrace();
            // 手动设置回滚
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return AjaxResult.error("审批失败!");
        }
    }
    /**
     * 什么认证列表
     */
    @GetMapping("/list")
    public TableDataInfo list(@RequestParam(value = "account",required = false) String account) {
        startPage();
        LambdaQueryWrapper<UserKyc> wrapper = new LambdaQueryWrapper<>();
        if(StringUtils.isNotEmpty(account)){
            wrapper.eq(UserKyc::getAccount,account);
        }
        // 按创建时间倒序排列
        wrapper.orderByDesc(UserKyc::getCreatedAt);
        List<UserKyc> list = userKycService.list(wrapper);
        return getDataTable(list);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserPolicyController.java
@@ -13,6 +13,7 @@
import com.ruoyi.im.service.UserPolicyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@@ -37,11 +38,11 @@
     * 保险购买申请
     */
    @PostMapping("/purchaseApplication")
    public Result purchaseApplication(@Valid @RequestBody UserPolicyDto dto) {
    public Result purchaseApplication(UserPolicyDto dto) {
        try {
            return userPolicyService.purchaseApplication(dto);
        }catch (Exception e){
            e.getMessage();
            e.printStackTrace();
            return Result.error("购买失败");
        }
    }
@@ -55,17 +56,19 @@
            List<UserPolicy> list = userPolicyService.list(new LambdaQueryWrapper<UserPolicy>().eq(UserPolicy::getUserId, id));
            return Result.success(list);
        }catch (Exception e){
            e.getMessage();
            return Result.error("购买失败");
            e.printStackTrace();
            return Result.error("查询失败");
        }
    }
    /**
     * 保单审批
     */
    @PostMapping("/examine")
    @GetMapping("/examine")
    @Transactional
    public AjaxResult examine(@RequestParam(value = "id") Integer id, @RequestParam(value = "approvalStatus") Integer approvalStatus, @RequestParam(value = "message",required = false) String message) {
    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)){
@@ -106,7 +109,9 @@
            medicalInsuranceAccountService.save(medicalInsuranceAccount);
            return AjaxResult.success("审批成功");
        }catch (Exception e){
            e.getMessage();
            e.printStackTrace();
            // 手动设置回滚
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return AjaxResult.error("审批失败!");
        }
    }
ruoyi-admin/src/main/resources/application-druid.yml
@@ -6,9 +6,9 @@
        druid:
            # 主库数据源
            master:
                url: jdbc:mysql://localhost:3306/ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                username: root
                password: 123456
                url: jdbc:mysql://156.240.108.70:3306/ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                username: ruoyi
                password: M6MhYJi6zACSR7nf
            # 从库数据源
            slave:
                # 从数据源开关/默认关闭
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -119,6 +119,11 @@
                    .antMatchers("/im/user/**").permitAll()
                    .antMatchers("/im/group/**").permitAll()
                    .antMatchers("/system/basic/**").permitAll()
                    .antMatchers("/product/**").permitAll()
                    .antMatchers("/insurancePosition/**").permitAll()
                    .antMatchers("/MedicalInsuranceAccount/**").permitAll()
                    .antMatchers("/kyc/**").permitAll()
                    .antMatchers("/userPolicy/**").permitAll()
                    // 除上面外的所有请求全部需要鉴权认证
                    .anyRequest().authenticated();
            })
ruoyi-system/src/main/java/com/ruoyi/system/domain/InsuranceProduct.java
@@ -1,6 +1,7 @@
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;
@@ -60,6 +61,7 @@
    private String obligationDisclose;
    // 产品特色
    @TableField(exist = false)
    private List<InsuranceFeature> productFeature;
    // 投保须知
ruoyi-system/src/main/java/com/ruoyi/system/domain/UserAccount.java
@@ -85,4 +85,7 @@
    private Date updateTime;
    private Boolean deleted = true;
    //实名状态:0 认证中  1 已认证   2 未实名
    private Integer kycStatus = 2;
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/UserKyc.java
@@ -19,6 +19,9 @@
    // 系统生成的用户ID
    private Integer userId;
    //用户账号
    private String account;
    //头像图片
    private String headPortraitImg;
ruoyi-system/src/main/java/com/ruoyi/system/domain/UserPolicy.java
@@ -80,7 +80,7 @@
    //驳回信息
    private String message;
    // 性别枚举
    // 性别枚举 M:男  F:女  OTHER:其他
    public enum Gender {
        M, F, OTHER
    }
ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/InsuranceProductUpdateDTO.java
@@ -31,7 +31,7 @@
    // 保险期限
    private Integer term;
    // 产品状态
    // 产品状态产品状态(ACTIVE  上架,INACTIVE  下架)
    private String status;
    // 医院数量
@@ -45,9 +45,6 @@
    // 告知义务
    private String obligationDisclose;
    // 产品特色
    private String productFeature;
    // 投保须知
    private String liabilityExemption;
ruoyi-system/src/main/java/com/ruoyi/system/domain/out/UserKycOut.java
New file
@@ -0,0 +1,27 @@
package com.ruoyi.system.domain.out;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
@Data
public class UserKycOut {
    private Integer id;
    // 用户id
    private Integer userId;
    //用户账号
    private String account;
    //头像图片
    private String headPortraitImg;
    //国徽图片
    private String nationalEmblemImg;
    //手持照片
    private String handImg;
}