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> { }