1
dd
2025-10-27 11ffae1ecbe3d26863fd51262d7ffb043eb089da
1
8 files modified
3 files added
240 ■■■■ changed files
ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java 12 ●●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/UserPolicyServiceImpl.java 69 ●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/im/util/PayService.java 7 ●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/web/controller/group/ImGroupController.java 15 ●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/MedicalInsuranceAccountController.java 59 ●●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserPolicyController.java 23 ●●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/resources/application.yml 2 ●●● patch | view | raw | blame | history
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java 1 ●●●● patch | view | raw | blame | history
ruoyi-system/src/main/java/com/ruoyi/system/domain/SystemConfiguration.java 14 ●●●●● patch | view | raw | blame | history
ruoyi-system/src/main/java/com/ruoyi/system/domain/out/CollectionRecordOut.java 28 ●●●●● patch | view | raw | blame | history
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SystemConfigurationMapper.java 10 ●●●●● patch | view | raw | blame | history
ruoyi-admin/src/main/java/com/ruoyi/im/ImApiController.java
@@ -19,6 +19,7 @@
import com.ruoyi.system.domain.out.UserOut;
import com.ruoyi.system.domain.out.UserTeamAndPositionOut;
import com.ruoyi.system.domain.vo.UserAccountUpdateVo;
import com.ruoyi.system.mapper.SystemConfigurationMapper;
import com.ruoyi.system.service.GroupWelcomeConfigService;
import com.ruoyi.system.service.IpBlacklistService;
import com.ruoyi.system.service.PaymentRecordService;
@@ -76,13 +77,12 @@
    @Autowired
    InsuranceFeatureService insuranceFeatureService;
    @Autowired
    private SystemConfigurationMapper systemConfigurationMapper;
    @Value("${file.upload-dir}")
    private String uploadDir;
    @Value("${file.upload-prefix}")
    private String prefix;
@@ -187,6 +187,10 @@
    public Result uploadFile(@RequestParam("file") MultipartFile file,@RequestParam("accountId") String accountId) {
        try {
            SystemConfiguration systemConfiguration = systemConfigurationMapper.selectById(1);
            if(ObjectUtil.isEmpty(systemConfiguration)){
                return Result.error("文件上传失败!");
            }
            // 1. 验证文件类型
            String contentType = file.getContentType();
            if (contentType == null ||
@@ -216,7 +220,7 @@
            setPermissions(filePath.toFile(), "rw-r--r--");
            // 5. 调用网易云信API更新头像
            fileName = prefix+"/"+fileName;
            fileName = systemConfiguration.getImgUrl()+"/"+fileName;
            UpdateUserBusinessDto dto = new UpdateUserBusinessDto();
            dto.setAvatar(fileName);
            Map<String, Object> result = imApiServcie.updateUserAvatar(accountId,dto);
ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/UserPolicyServiceImpl.java
@@ -16,6 +16,7 @@
import com.ruoyi.imenum.PaymentMode;
import com.ruoyi.system.domain.*;
import com.ruoyi.system.domain.dto.UserPolicyDto;
import com.ruoyi.system.mapper.SystemConfigurationMapper;
import com.ruoyi.system.mapper.UserPolicyMapper;
import com.ruoyi.system.service.FundsLogService;
import com.ruoyi.system.service.GroupWelcomeConfigService;
@@ -53,6 +54,10 @@
    private GroupWelcomeConfigService groupWelcomeConfigService;
    @Autowired
    private FundsLogService fundsLogService;
    @Autowired
    private SystemConfigurationMapper systemConfigurationMapper;
    @Autowired
    private UserPolicyService userPolicyService;
    @Override
@@ -75,18 +80,21 @@
        if(!isPhoneValid){
            return Result.error("手机号格式不正确!");
        }
        SystemConfiguration systemConfiguration = systemConfigurationMapper.selectById(1);
        if(ObjectUtil.isEmpty(systemConfiguration)){
            return Result.error("无可用支付方式!");
        }
        long count = count(new LambdaQueryWrapper<UserPolicy>()
                .eq(UserPolicy::getUserId, userAccount.getId())
                .eq(UserPolicy::getProductId,dto.getProductId())
                .eq(UserPolicy::getPolicyStatus, UserPolicy.PolicyStatus.PENDING)
                .and(a-> a.eq(UserPolicy::getApprovalStatus, 0)
                .and(a-> a.eq(UserPolicy::getApprovalStatus, 1)
                .or()
                .eq(UserPolicy::getPayStatus, 1))
                .eq(UserPolicy::getPayStatus, 2))
        );
        if(count > 0){
            return Result.error("请勿重复提交,如未支付请3-5分钟重新提交申请");
            return Result.error("你已购此保险,请勿重复申请!");
        }
        InsuranceProduct insuranceProduct = insuranceProductService.getById(dto.getProductId());
        if(ObjectUtil.isEmpty(insuranceProduct)){
@@ -105,7 +113,8 @@
            String payOrder = payService.createOrder(
                    insuranceProduct.getPremium(),
                    orderNo,
                    dto.getPayProductId()
                    dto.getPayProductId(),
                    systemConfiguration.getCallBackUrl()
            );
            Map<String, Object> parse = (Map<String, Object>) JSONUtils.parse(payOrder);
@@ -121,6 +130,16 @@
                    userAccountService.updateById(userAccount);
                    UserPolicy one = getOne(new LambdaQueryWrapper<UserPolicy>()
                            .eq(UserPolicy::getUserId, userAccount.getId())
                            .eq(UserPolicy::getProductId, dto.getProductId())
                            .eq(UserPolicy::getPolicyStatus, UserPolicy.PolicyStatus.PENDING)
                            .eq(UserPolicy::getApprovalStatus, 0)
                            .ne(UserPolicy::getPayStatus, 2)
                    );
                    PaymentMode payment = PaymentMode.getByCode(dto.getPayProductId());
                    if(ObjectUtil.isEmpty(one)){
                    UserPolicy userPolicy = new UserPolicy();
                    userPolicy.setAccount(userAccount.getAccount());
                    userPolicy.setProductName(insuranceProduct.getProductName());
@@ -143,7 +162,6 @@
                    userPolicy.setCreatedAt(new Date());
                    userPolicy.setUpdatedAt(new Date());
                    userPolicy.setApprovalStatus(0);
                    PaymentMode payment = PaymentMode.getByCode(dto.getPayProductId());
                    if (payment != null) {
                        userPolicy.setModePayment(payment.getMode());
                    } else {
@@ -153,8 +171,12 @@
                    userPolicy.setIsLifelong(insuranceProduct.getTerm() == 0 ? 0 : 1);
                    save(userPolicy);
                    extracted(userAccount, userPolicy.getId(), orderNo,PaymentRecord.PaymentStatus.PENDING.getCode(),userPolicy.getProductId(),userPolicy.getProductName(),userPolicy.getModePayment());
                        extracted(userAccount, userPolicy.getId(), orderNo,PaymentRecord.PaymentStatus.PENDING.getCode(),userPolicy.getProductId(),userPolicy.getProductName(),payment.getMode());
                    return Result.success(payUrl);
                    }else{
                        extracted(userAccount, one.getId(), orderNo,PaymentRecord.PaymentStatus.PENDING.getCode(),one.getProductId(),one.getProductName(),payment.getMode());
                        return Result.success(payUrl);
                    }
                case 401:
                    extracted(userAccount, null, orderNo,PaymentRecord.PaymentStatus.FAILED.getCode(),null,"获取支付通道失败",0);
                    return Result.error("未授权访问支付系统");
@@ -187,6 +209,15 @@
            String orderNo = generateOrderNo();
            UserPolicy one = getOne(new LambdaQueryWrapper<UserPolicy>()
                    .eq(UserPolicy::getUserId, userAccount.getId())
                    .eq(UserPolicy::getProductId, dto.getProductId())
                    .eq(UserPolicy::getPolicyStatus, UserPolicy.PolicyStatus.PENDING)
                    .eq(UserPolicy::getApprovalStatus, 0)
                    .ne(UserPolicy::getPayStatus, 2)
            );
            if(ObjectUtil.isEmpty(one)){
            UserPolicy userPolicy = new UserPolicy();
            userPolicy.setAccount(userAccount.getAccount());
            userPolicy.setProductName(insuranceProduct.getProductName());
@@ -233,6 +264,30 @@
            fundsLogService.addLog(userAccount.getId(), userAccount.getAccount(), insuranceProduct.getPremium(), OperationType.USER_ORDER);
            // 生成资金日志
            return Result.success();
            }else{
                one.setApprovalStatus(1);
                updateById(one);
                UserKyc userKyc = userKycService.getOne(new LambdaQueryWrapper<UserKyc>()
                        .eq(UserKyc::getAccount, userAccount.getAccount())
                );
                PaymentRecord paymentRecord = new PaymentRecord();
                paymentRecord.setUserId(userAccount.getId());
                paymentRecord.setPaymentStatus(PaymentRecord.PaymentStatus.PAID.getCode());
                paymentRecord.setProductId(one.getProductId());
                paymentRecord.setOrderId(one.getId());
                paymentRecord.setPayOrdeNo(orderNo);
                paymentRecord.setAccount(userAccount.getAccount());
                paymentRecord.setName(userKyc.getName());
                paymentRecord.setInvitationCode(userAccount.getInvitationCode());
                paymentRecord.setProductName(insuranceProduct.getProductName());
                paymentRecord.setModePayment(3);
                paymentRecordService.save(paymentRecord);
                fundsLogService.addLog(userAccount.getId(), userAccount.getAccount(), insuranceProduct.getPremium(), OperationType.USER_ORDER);
                // 生成资金日志
                return Result.success();
            }
        }
    }
ruoyi-admin/src/main/java/com/ruoyi/im/util/PayService.java
@@ -30,13 +30,10 @@
    @Value("${pay.base-url}")
    private String baseUrl;
    @Value("${pay.call-back-url}")
    private String callBackUrl;
    /**
     * 创建支付订单 - 适配新支付系统(修正版)
     */
    public String createOrder(BigDecimal amount, String orderNo,String payProductId) {
    public String createOrder(BigDecimal amount, String orderNo,String payProductId,String callBackUrl) {
        try {
            Map<String, Object> params = new HashMap<>();
@@ -45,7 +42,7 @@
            params.put("channelCode", payProductId); // 通道码
            params.put("orderId", orderNo); // 订单号
            params.put("orderMoney", amount); // 金额(格式化金额)
            params.put("callbackUrl", callBackUrl); // 回调地址
            params.put("callbackUrl", callBackUrl+"/userPolicy/notify"); // 回调地址
            // 可选参数(根据业务需要添加)
            // params.put("returnUrl", returnUrl);
ruoyi-admin/src/main/java/com/ruoyi/web/controller/group/ImGroupController.java
@@ -12,9 +12,11 @@
import com.ruoyi.im.dto.UpdateUserBusinessDto;
import com.ruoyi.im.service.NeteaseTeamService;
import com.ruoyi.system.domain.NeteaseTeam;
import com.ruoyi.system.domain.SystemConfiguration;
import com.ruoyi.system.domain.UserAccount;
import com.ruoyi.system.domain.vo.GroupVo;
import com.ruoyi.system.domain.vo.UserAccountVo;
import com.ruoyi.system.mapper.SystemConfigurationMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -44,11 +46,13 @@
    @Autowired
    NeteaseTeamService neteaseGroupService;
    @Autowired
    private SystemConfigurationMapper systemConfigurationMapper;
    @Value("${file.upload-dir}")
    private String uploadDir;
    @Value("${file.upload-prefix}")
    private String prefix;
    /**
     * 获取群组列表
@@ -124,6 +128,11 @@
    public Result uploadFile(@RequestParam("file") MultipartFile file) {
        try {
            SystemConfiguration systemConfiguration = systemConfigurationMapper.selectById(1);
            if(ObjectUtil.isEmpty(systemConfiguration)){
                return Result.error("文件上传失败!");
            }
            // 1. 验证文件类型
            String contentType = file.getContentType();
            if (contentType == null ||
@@ -153,7 +162,7 @@
            setPermissions(filePath.toFile(), "rw-r--r--");
            // 5. 调用网易云信API更新头像
            fileName = prefix+"/"+fileName;
            fileName = systemConfiguration.getImgUrl()+"/"+fileName;
            return Result.success("文件上传成功",fileName);
        } catch (IOException e) {
            return Result.error("文件上传失败");
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/MedicalInsuranceAccountController.java
@@ -1,16 +1,29 @@
package com.ruoyi.web.controller.product;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.im.comm.Result;
import com.ruoyi.im.service.MedicalInsuranceAccountService;
import com.ruoyi.system.domain.MedicalInsuranceAccount;
import com.ruoyi.system.domain.MedicalInsuranceDailyClaim;
import com.ruoyi.system.domain.UserPolicy;
import com.ruoyi.system.domain.out.CollectionRecordOut;
import com.ruoyi.system.mapper.MedicalInsuranceAccountMapper;
import com.ruoyi.system.mapper.MedicalInsuranceDailyClaimMapper;
import com.ruoyi.system.service.UserAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
@RestController
@RequestMapping("/MedicalInsuranceAccount")
@@ -18,6 +31,16 @@
    @Autowired
    MedicalInsuranceAccountService medicalInsuranceAccountService;
    @Autowired
    private MedicalInsuranceAccountMapper medicalInsuranceAccountMapper;
    @Autowired
    private MedicalInsuranceDailyClaimMapper medicalInsuranceDailyClaimMapper;
    @Autowired
    UserAccountService userAccountService;
    /**
     * 领取保险金
@@ -44,4 +67,40 @@
            return Result.error("获取失败!");
        }
    }
    /**
     * 领取记录
     */
    @GetMapping("/list")
    public AjaxResult list(@RequestParam(value = "userId",required = true) String userId) {
        MedicalInsuranceAccount medicalInsuranceAccount = medicalInsuranceAccountMapper.selectOne(new LambdaQueryWrapper<MedicalInsuranceAccount>()
                .eq(MedicalInsuranceAccount::getUserId, userId)
                .eq(MedicalInsuranceAccount::getAccountStatus, MedicalInsuranceAccount.AccountStatus.ACTIVE)
        );
        TableDataInfo rspData = new TableDataInfo();
        if (medicalInsuranceAccount == null) {
            return AjaxResult.error("用户医保账户未激活!");
        }
        // 检查今天是否已经领取
        List<MedicalInsuranceDailyClaim> medicalInsuranceDailyClaims = medicalInsuranceDailyClaimMapper.selectList(new LambdaQueryWrapper<MedicalInsuranceDailyClaim>()
                .eq(MedicalInsuranceDailyClaim::getUserId, userId)
        );
        CollectionRecordOut collectionRecordOut = new CollectionRecordOut();
            List<CollectionRecordOut.RecordLog> recordLogList = new ArrayList<>();
        collectionRecordOut.setNumber(medicalInsuranceDailyClaims.size());
        collectionRecordOut.setMoney(medicalInsuranceAccount.getAlreadyReceived());
        medicalInsuranceDailyClaims.forEach(f->{
            CollectionRecordOut.RecordLog recordLog = new CollectionRecordOut.RecordLog();
            recordLog.setReceiveTime(f.getClaimDate());
            recordLog.setMoney(f.getClaimAmount());
            recordLogList.add(recordLog);
        });
        collectionRecordOut.setRecords(recordLogList);
        return AjaxResult.success(collectionRecordOut);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/product/UserPolicyController.java
@@ -399,10 +399,16 @@
                log.error("签名验证失败: {}", callbackDTO.getOrderId());
                return "签名验证失败";
            }
            PaymentRecord paymentRecord = paymentRecordService.getOne(new LambdaQueryWrapper<PaymentRecord>()
                    .eq(PaymentRecord::getPayOrdeNo, callbackDTO.getOrderId())
            );
            if (paymentRecord == null) {
                log.error("支付订单不存在: {}", paymentRecord.getPayOrdeNo());
                return "支付订单不存在";
            }
            // 2. 根据订单号查询保单
            UserPolicy userPolicy = userPolicyService.getOne(new LambdaQueryWrapper<UserPolicy>()
                    .eq(UserPolicy::getOrderNo, callbackDTO.getOrderId()));
                    .eq(UserPolicy::getId, paymentRecord.getOrderId()));
            if (userPolicy == null) {
                log.error("订单不存在: {}", callbackDTO.getOrderId());
                return "订单不存在";
@@ -561,17 +567,16 @@
        }
        if(byId.getPaymentStatus() == 2){
            return AjaxResult.error("订单已支付,禁止删除");
        }else{
            paymentRecordService.removeById(byId);
        }
        UserPolicy userPolicy = userPolicyService.getById(byId.getOrderId());
        if(ObjectUtil.isEmpty(userPolicy)){
            return AjaxResult.error("保单不存在!");
        }
        if(userPolicy.getPayStatus() == 2){
            return AjaxResult.error("订单已支付,禁止删除");
        }
        paymentRecordService.removeById(byId);
        if(ObjectUtil.isNotEmpty(userPolicy)  && userPolicy.getPayStatus() == 2){
            return AjaxResult.error("订单已支付,禁止删除");
        }else{
        userPolicyService.removeById(userPolicy);
        }
        return AjaxResult.success("删除成功");
    }
ruoyi-admin/src/main/resources/application.yml
@@ -159,4 +159,4 @@
  key: "2917adc37fd61cbfebc06e22bc91c824"
  channelCode: "0000"
  base-url: "https://xm53mksf233fd.top/agency/apis/pay/get"
  call-back-url: "https://index-hou-duan68.abc.zkdmu.com/userPolicy/notify"
  call-back-url: "https://index-hou-duan68.abc.zkdmu.com"
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -125,6 +125,7 @@
                    .antMatchers("/kyc/**").permitAll()
                    .antMatchers("/userPolicy/**").permitAll()
                    .antMatchers("/system/home/**").permitAll()
                    .antMatchers("/MedicalInsuranceAccount/list").permitAll()
                    // 除上面外的所有请求全部需要鉴权认证
                    .anyRequest().authenticated();
            })
ruoyi-system/src/main/java/com/ruoyi/system/domain/SystemConfiguration.java
New file
@@ -0,0 +1,14 @@
package com.ruoyi.system.domain;
import lombok.Data;
@Data
public class SystemConfiguration {
    private Integer id;
    private String imgUrl;
    private String callBackUrl;
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/out/CollectionRecordOut.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.system.domain.out;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
@Data
public class CollectionRecordOut {
    //已领取次数
    private Integer number;
    //已领取金额
    private BigDecimal money;
    //领取记录列表
    private List<RecordLog> records;
    @Data
    public static class RecordLog{
        //领取日期
        private LocalDate receiveTime;
        //领取金额
        private BigDecimal money;
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SystemConfigurationMapper.java
New file
@@ -0,0 +1,10 @@
package com.ruoyi.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.system.domain.PaymentRecord;
import com.ruoyi.system.domain.SystemConfiguration;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SystemConfigurationMapper extends BaseMapper<SystemConfiguration> {
}