package com.ruoyi.web.controller.api; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.BaseModel; import com.ruoyi.common.core.domain.BasePage; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.OrderNos; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.dto.BuyInsuranceDto; import com.ruoyi.system.model.*; import com.ruoyi.system.query.GetCourseListQuery; import com.ruoyi.system.service.TAppUserService; import com.ruoyi.system.service.TBannerService; import com.ruoyi.system.service.TInsuranceOrderService; import com.ruoyi.system.service.TInsuranceService; import com.ruoyi.system.vo.UserInsuranceVo; import com.ruoyi.system.wxPay.utils.WxRefundUtil; import com.ruoyi.system.wxPay.utils.WxV3Pay; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.Date; import java.util.Map; import java.util.Objects; @Slf4j @RestController @RequestMapping("/insurance") @Api(tags = "保险模块") public class InsuranceController { private final TInsuranceOrderService tInsuranceOrderService; private final TokenService tokenService; private final TInsuranceService tInsuranceService; private final WxV3Pay wxV3Pay; private final TAppUserService tAppUserService; public InsuranceController(TInsuranceOrderService tInsuranceOrderService, TokenService tokenService, TInsuranceService tInsuranceService, WxV3Pay wxV3Pay, TAppUserService tAppUserService) { this.tInsuranceOrderService = tInsuranceOrderService; this.tokenService = tokenService; this.tInsuranceService = tInsuranceService; this.wxV3Pay = wxV3Pay; this.tAppUserService = tAppUserService; } /** * 获取是否支付了保险费 是否到期 */ @GetMapping("/getInsurance") @ApiOperation(value = "保险模块--获取用户是否有保险",response = TBanner.class) public R getCourseList(int type) { String userId = tokenService.getLoginUserApplet().getUserId(); UserInsuranceVo insuranceVo = new UserInsuranceVo(); TInsuranceOrder one = tInsuranceOrderService.getOne(Wrappers.lambdaQuery().eq(TInsuranceOrder::getType,type).eq(TInsuranceOrder::getAppUserId, userId).eq(TInsuranceOrder::getStatus, 2).orderByDesc(BaseModel::getCreateTime).last("LIMIT 1")); if(one!=null){ insuranceVo.setUserId(userId); insuranceVo.setPayTime(one.getPayTime()); insuranceVo.setEndTime(one.getEndTime()); } return R.ok(insuranceVo); } @PostMapping("/buyInsurance") @ApiOperation(value = "保险模块--购买保险") public R buyInsurance(@RequestBody BuyInsuranceDto dto) throws ParseException { String userId = tokenService.getLoginUserApplet().getUserId(); TAppUser appUser = tAppUserService.getById(userId); // 查询保险订单 TInsuranceOrder one = tInsuranceOrderService.getOne(Wrappers.lambdaQuery().eq(TInsuranceOrder::getType,dto.getCourseType()).eq(TInsuranceOrder::getAppUserId, userId).eq(TInsuranceOrder::getStatus, 2).orderByDesc(BaseModel::getCreateTime).last("LIMIT 1")); if(one!=null){ if(one.getEndTime().after(new Date())){ return R.fail("您已购买保险"); } } TInsuranceOrder insuranceOrder = new TInsuranceOrder(); insuranceOrder.setAppUserId(userId); insuranceOrder.setName(dto.getName()); insuranceOrder.setPhone(dto.getPhone()); insuranceOrder.setIdCard(dto.getIdCard()); insuranceOrder.setImg(dto.getImg()); insuranceOrder.setPayType(dto.getType()); insuranceOrder.setType(dto.getCourseType()); TInsurance insurance = tInsuranceService.getOne(new LambdaQueryWrapper().eq(TInsurance::getStatus, 1)); if(insurance==null){ return R.fail("保险已关闭"); } insuranceOrder.setInsuranceId(insurance.getId()); insuranceOrder.setPayMoney(BigDecimal.valueOf(insurance.getInsuranceMoney()).setScale(2, RoundingMode.HALF_UP)); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date date = simpleDateFormat.parse(insurance.getValidityTime()); insuranceOrder.setEndTime(date); String payNo = OrderNos.getDid(); insuranceOrder.setPayNo(payNo); boolean save = tInsuranceOrderService.save(insuranceOrder); Map result = wxV3Pay.jsApiInsurance(payNo, insuranceOrder.getPayMoney().multiply(BigDecimal.valueOf(100)).longValue(), appUser.getOpenId(),"购买保险",""); return R.ok(result); } @ApiOperation(value = "保险模块--缴费记录") @PostMapping("/getInsuranceOrderList") public R getInsuranceOrderList(@RequestBody BasePage query) { String userId = tokenService.getLoginUserApplet().getUserId(); Page page = tInsuranceOrderService.page(new Page<>(query.getPageNum(), query.getPageSize()), Wrappers.lambdaQuery().eq(TInsuranceOrder::getAppUserId, userId).ne(TInsuranceOrder::getStatus,0).orderByDesc(BaseModel::getCreateTime)); return R.ok(page); } @PostMapping("/refundOrder") @ApiOperation(value = "保险模块--退款") public R refundOrder(@RequestBody TInsuranceOrder order) { String userId = tokenService.getLoginUserApplet().getUserId(); TInsuranceOrder order1 = tInsuranceOrderService.getById(order.getId()); order1.setRefundReason(order.getRefundReason()); order1.setRefundReasonPictures(order.getRefundReasonPictures()); order1.setRequestRefundTime(new Date()); order1.setRefundMoney(order1.getPayMoney().doubleValue()); if(!userId.equals(order1.getAppUserId())){ return R.fail("无权限操作"); } if(order1.getStatus()!=2){ return R.fail("状态不允许退款"); } order1.setStatus(4); LocalDateTime payTime = order1.getPayTime(); if(payTime==null){ return R.fail("状态不允许退款"); } if(payTime.plusDays(2).isBefore(LocalDateTime.now()) || order.getPayType()==2){ order1.setBankCardNumber(order.getBankCardNumber()); order1.setCardholderName(order.getCardholderName()); order1.setRefundStatus(1); tInsuranceOrderService.updateById(order1); }else { String outRefundNo = OrderNos.getDid(); order1.setRefundNumber(outRefundNo); tInsuranceOrderService.updateById(order1); // tInsuranceOrderService refundModel = new WxPaymentRefundModel(); //// refundModel.setSub_mchid(weixinPayProperties.getMchId()); //// refundModel.setSp_appid(weixinPayProperties.getAppId()); //// refundModel.setTransaction_id(courseOrder1.getTransactionId()); // refundModel.setOut_trade_no(courseOrder1.getOrderNumber()); // refundModel.setOut_refund_no(OrderNos.getDid()); // refundModel.setReason(courseOrder1.getRefundReason()); // refundModel.setGoods_detail(new ArrayList<>()); // refundModel.setAmount(new WxPaymentRefundModel.RefundAmount(courseOrder1.getPayMoney().multiply(BigDecimal.valueOf(100)).intValue(), "CNY", courseOrder1.getPayMoney().multiply(BigDecimal.valueOf(100)).intValue())); // Map refund = wxV3Pay.refund(refundModel); // System.out.println(refund); String result = wxRefundUtil.refund(order1.getPayMoney().multiply(BigDecimal.valueOf(100)).intValue(), order1.getPayNo(),outRefundNo); if(result!=null){ return R.fail(result); } } return R.ok(); } @Autowired private WxRefundUtil wxRefundUtil; }