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.domain.AjaxResult;
|
import com.ruoyi.common.core.domain.R;
|
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.im.comm.Result;
|
import com.ruoyi.im.service.MedicalInsuranceAccountService;
|
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 {
|
|
@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<UserAccount>()
|
.eq(UserAccount::getAccount,account));
|
List<UserPolicy> list = userPolicyService.list(new LambdaQueryWrapper<UserPolicy>().eq(UserPolicy::getUserId, userAccount.getId()));
|
return Result.success(list);
|
}catch (Exception e){
|
e.printStackTrace();
|
return Result.error("查询失败");
|
}
|
}
|
|
/**
|
* 保单审批
|
*/
|
@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");
|
}
|
}
|
}
|