package com.ruoyi.web.controller.product; import cn.hutool.core.date.DateUtil; 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.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.service.MedicalInsuranceAccountService; import com.ruoyi.system.domain.InsuranceProduct; import com.ruoyi.system.domain.MedicalInsuranceAccount; import com.ruoyi.system.domain.UserAccount; import com.ruoyi.system.domain.UserPolicy; import com.ruoyi.system.domain.dto.UserPolicyDto; import com.ruoyi.im.service.UserPolicyService; 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.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Calendar; import java.util.Date; import java.util.List; @RestController @RequestMapping("/userPolicy") public class UserPolicyController extends BaseController { @Autowired UserPolicyService userPolicyService; @Autowired MedicalInsuranceAccountService medicalInsuranceAccountService; @Autowired UserAccountService userAccountService; /** * 保险购买申请 */ @PostMapping("/purchaseApplication") public Result purchaseApplication(UserPolicyDto dto) { try { return userPolicyService.purchaseApplication(dto); }catch (Exception e){ e.printStackTrace(); return Result.error("购买失败"); } } /** * 根据用户id查询保单 */ @GetMapping("/getPolicyById") public Result getPolicyById(@RequestParam(value = "account") String account) { try { UserAccount userAccount = userAccountService.getOne(new LambdaQueryWrapper() .eq(UserAccount::getAccount,account)); List list = userPolicyService.list(new LambdaQueryWrapper().eq(UserPolicy::getUserId, userAccount.getId())); return Result.success(list); }catch (Exception e){ e.printStackTrace(); return Result.error("查询失败"); } } /** * 保单列表 */ @GetMapping("/list") public TableDataInfo list(@RequestParam(value = "account",required = false) String account, @RequestParam(value = "approvalStatus",required = false) Integer approvalStatus, @RequestParam(value = "productName",required = false) String productName) { startPage(); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); // 产品名称模糊查询 if (org.apache.commons.lang3.StringUtils.isNotBlank(account)) { wrapper.like(UserPolicy::getUserId, account); } // 产品代码模糊查询 if (org.apache.commons.lang3.StringUtils.isNotBlank(productName)) { wrapper.like(UserPolicy::getProductName, productName); } // 产品状态精确查询 if (approvalStatus != null) { wrapper.eq(UserPolicy::getApprovalStatus, approvalStatus); } // 按创建时间倒序排列 wrapper.orderByDesc(UserPolicy::getCreatedAt); List list = userPolicyService.list(wrapper); return getDataTable(list); } /** * 保单审批 */ @GetMapping("/examine") @Transactional public AjaxResult examine(@RequestParam(value = "id") Integer id, @RequestParam(value = "approvalStatus") Integer approvalStatus, @RequestParam(value = "message",required = false) String message) { try { UserPolicy userPolicy = userPolicyService.getById(id); if(ObjectUtil.isEmpty(userPolicy)){ return AjaxResult.error("订单不存在"); } if(userPolicy.getApprovalStatus() != 0){ return AjaxResult.error("订单已审批!"); } if(approvalStatus == 2 && StringUtils.isEmpty(message)){ return AjaxResult.error("驳回理由不能为空!"); } //计算到期时间 LocalDate expirationTime = calculateInsuranceEndDate(LocalDate.now(), userPolicy.getTerm()); userPolicy.setApprovalStatus(approvalStatus); userPolicy.setMessage(message); userPolicy.setStartDate(LocalDate.now()); userPolicy.setEndDate(expirationTime); userPolicy.setPolicyStatus(UserPolicy.PolicyStatus.ACTIVE); userPolicy.setUpdatedAt(new Date()); userPolicyService.updateById(userPolicy); MedicalInsuranceAccount medicalInsuranceAccount = new MedicalInsuranceAccount(); medicalInsuranceAccount.setUserId(userPolicy.getUserId()); medicalInsuranceAccount.setPolicyId(userPolicy.getId()); medicalInsuranceAccount.setProductId(userPolicy.getProductId()); medicalInsuranceAccount.setTotalQuota(userPolicy.getCoverageAmount()); medicalInsuranceAccount.setRemainingBalance(BigDecimal.ZERO); medicalInsuranceAccount.setAmountClaimed(userPolicy.getCoverageAmount()); medicalInsuranceAccount.setAlreadyReceived(BigDecimal.ZERO); medicalInsuranceAccount.setAmountAlreadyUsed(BigDecimal.ZERO); medicalInsuranceAccount.setEffectiveDate(userPolicy.getStartDate()); medicalInsuranceAccount.setExpiryDate(userPolicy.getEndDate()); medicalInsuranceAccount.setAccountStatus(MedicalInsuranceAccount.AccountStatus.ACTIVE); medicalInsuranceAccount.setCreatedAt(new Date()); medicalInsuranceAccount.setUpdatedAt(new Date()); medicalInsuranceAccountService.save(medicalInsuranceAccount); return AjaxResult.success("审批成功"); }catch (Exception e){ e.printStackTrace(); // 手动设置回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return AjaxResult.error("审批失败!"); } } /** * 计算保险到期日 * @param startDate 保险开始日期 * @param termYears 保险年限 * @return 保险到期日期 */ public static LocalDate calculateInsuranceEndDate(LocalDate startDate, int termYears) { return calculateDateAfterYears(startDate, termYears); } /** * 根据基准日期和年限推算日期 */ public static LocalDate calculateDateAfterYears(LocalDate baseDate, int years) { validateBaseDate(baseDate); return baseDate.plusYears(years); } /** * 验证基准日期 */ private static void validateBaseDate(LocalDate baseDate) { if (baseDate == null) { throw new IllegalArgumentException("基准日期不能为null"); } } }