From bf1b072b6af7de878fb5750bc14db7a2e2258f0c Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期三, 31 十二月 2025 15:46:30 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TOtherConfigController.java    |    2 
 ruoyi-system/src/main/resources/mapper/system/TCourseOrderMapper.xml                  |    6 +++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCourseOrderServiceImpl.java |    5 ++
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/CourseController.java         |    7 ++-
 ruoyi-system/src/main/java/com/ruoyi/system/dto/BuyInsuranceDto.java                  |   11 +++++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCourseOrderMapper.java            |    2 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/UserInsuranceVo.java                   |    4 +-
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/InsuranceController.java      |   34 ++++++++++++-----
 ruoyi-system/src/main/java/com/ruoyi/system/model/TInsuranceOrder.java                |    4 ++
 ruoyi-applet/src/main/resources/application-test.yml                                  |    7 +++
 ruoyi-system/src/main/java/com/ruoyi/system/service/TCourseOrderService.java          |    3 +
 11 files changed, 69 insertions(+), 16 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TOtherConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TOtherConfigController.java
index ae72795..90a1735 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TOtherConfigController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TOtherConfigController.java
@@ -39,7 +39,7 @@
     @ApiOperation(value = "修改系统其他设置-通知阈值管理")
     @PostMapping(value = "/update")
     public R<Boolean> update(@Validated @RequestBody TOtherConfig dto) {
-        if(dto.getDays()>=365){
+        if(dto.getDays()!=null && dto.getDays()>=365){
             return R.fail("天数不能超过365天");
         }
         return R.ok(otherConfigService.updateById(dto));
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/CourseController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/CourseController.java
index f6dd62d..09cc1d1 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/CourseController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/CourseController.java
@@ -135,7 +135,8 @@
         TCourse course = courseService.getById(courseOrder.getCourseId());
         LocalDate endTime = course.getEndTime();
 
-        long count1 = insuranceOrderService.count(new LambdaQueryWrapper<TInsuranceOrder>().eq(TInsuranceOrder::getAppUserId, userId).eq(TInsuranceOrder::getStatus, 2));
+
+        long count1 = insuranceOrderService.count(new LambdaQueryWrapper<TInsuranceOrder>().eq(TInsuranceOrder::getType,course.getCourseType()).eq(TInsuranceOrder::getAppUserId, userId).eq(TInsuranceOrder::getStatus, 2));
         if(count1<=0){
             return R.fail("请先缴纳保险费");
         }
@@ -176,7 +177,9 @@
     @ApiOperation(value = "课程模块--支付订单")
     public R<Map<String, Object>> payOrder(@RequestBody TCourseOrder courseOrder) {
         String userId = tokenService.getLoginUserApplet().getUserId();
-        long count1 = insuranceOrderService.count(new LambdaQueryWrapper<TInsuranceOrder>().eq(TInsuranceOrder::getAppUserId, userId).eq(TInsuranceOrder::getStatus, 2));
+
+        TCourse course = courseService.getById(courseOrder.getCourseId());
+        long count1 = insuranceOrderService.count(new LambdaQueryWrapper<TInsuranceOrder>().eq(TInsuranceOrder::getType,course.getCourseType()).eq(TInsuranceOrder::getAppUserId, userId).eq(TInsuranceOrder::getStatus, 2));
         if(count1<=0){
             return R.fail("请先缴纳保险费");
         }
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/InsuranceController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/InsuranceController.java
index bb7604a..bac84d9 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/InsuranceController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/InsuranceController.java
@@ -11,10 +11,7 @@
 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.service.*;
 import com.ruoyi.system.vo.UserInsuranceVo;
 import com.ruoyi.system.wxPay.utils.WxRefundUtil;
 import com.ruoyi.system.wxPay.utils.WxV3Pay;
@@ -24,11 +21,13 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.Map;
 import java.util.Objects;
@@ -44,13 +43,16 @@
     private final TInsuranceService tInsuranceService;
     private final WxV3Pay wxV3Pay;
     private final TAppUserService  tAppUserService;
+    private final TCourseOrderService tCourseOrderService;
 
-    public InsuranceController(TInsuranceOrderService tInsuranceOrderService, TokenService tokenService, TInsuranceService tInsuranceService, WxV3Pay wxV3Pay, TAppUserService tAppUserService) {
+
+    public InsuranceController(TInsuranceOrderService tInsuranceOrderService, TokenService tokenService, TInsuranceService tInsuranceService, WxV3Pay wxV3Pay, TAppUserService tAppUserService, TCourseOrderService tCourseOrderService) {
         this.tInsuranceOrderService = tInsuranceOrderService;
         this.tokenService = tokenService;
         this.tInsuranceService = tInsuranceService;
         this.wxV3Pay = wxV3Pay;
         this.tAppUserService = tAppUserService;
+        this.tCourseOrderService = tCourseOrderService;
     }
 
 
@@ -59,10 +61,10 @@
      */
     @GetMapping("/getInsurance")
     @ApiOperation(value = "保险模块--获取用户是否有保险",response = TBanner.class)
-    public R<UserInsuranceVo> getCourseList() {
+    public R<UserInsuranceVo> getCourseList(int type) {
         String userId = tokenService.getLoginUserApplet().getUserId();
         UserInsuranceVo insuranceVo = new UserInsuranceVo();
-        TInsuranceOrder one = tInsuranceOrderService.getOne(Wrappers.<TInsuranceOrder>lambdaQuery().eq(TInsuranceOrder::getAppUserId, userId).eq(TInsuranceOrder::getStatus, 2).orderByDesc(BaseModel::getCreateTime).last("LIMIT 1"));
+        TInsuranceOrder one = tInsuranceOrderService.getOne(Wrappers.<TInsuranceOrder>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());
@@ -75,12 +77,12 @@
 
     @PostMapping("/buyInsurance")
     @ApiOperation(value = "保险模块--购买保险")
-    public R<?> buyInsurance(@RequestBody BuyInsuranceDto dto) throws ParseException {
+    public R<?> buyInsurance(@RequestBody @Valid BuyInsuranceDto dto) throws ParseException {
         String userId = tokenService.getLoginUserApplet().getUserId();
         TAppUser appUser = tAppUserService.getById(userId);
 
         // 查询保险订单
-        TInsuranceOrder one = tInsuranceOrderService.getOne(Wrappers.<TInsuranceOrder>lambdaQuery().eq(TInsuranceOrder::getAppUserId, userId).eq(TInsuranceOrder::getStatus, 2).orderByDesc(BaseModel::getCreateTime).last("LIMIT 1"));
+        TInsuranceOrder one = tInsuranceOrderService.getOne(Wrappers.<TInsuranceOrder>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("您已购买保险");
@@ -93,7 +95,8 @@
         insuranceOrder.setIdCard(dto.getIdCard());
         insuranceOrder.setImg(dto.getImg());
         insuranceOrder.setPayType(dto.getType());
-        TInsurance insurance = tInsuranceService.getOne(new LambdaQueryWrapper<TInsurance>().eq(TInsurance::getStatus, 1));
+        insuranceOrder.setType(dto.getCourseType());
+        TInsurance insurance = tInsuranceService.getOne(new LambdaQueryWrapper<TInsurance>().eq(TInsurance::getInsuranceType, dto.getCourseType()).eq(TInsurance::getStatus, 1));
         if(insurance==null){
             return R.fail("保险已关闭");
         }
@@ -106,6 +109,9 @@
         String payNo = OrderNos.getDid();
         insuranceOrder.setPayNo(payNo);
         boolean save = tInsuranceOrderService.save(insuranceOrder);
+        if(dto.getType()==2){
+            return R.ok();
+        }
         Map<String, Object> result = wxV3Pay.jsApiInsurance(payNo, insuranceOrder.getPayMoney().multiply(BigDecimal.valueOf(100)).longValue(), appUser.getOpenId(),"购买保险","");
         return R.ok(result);
     }
@@ -133,6 +139,14 @@
 
         order1.setRequestRefundTime(new Date());
         order1.setRefundMoney(order1.getPayMoney().doubleValue());
+        Integer type = order1.getType();
+
+
+        // 判断是否有当前的课程 待支付 和已完成
+        int count = tCourseOrderService.countOrderNum( userId, type);
+        if(count>0){
+            return R.fail("请先完成课程");
+        }
 
         if(!userId.equals(order1.getAppUserId())){
             return R.fail("无权限操作");
diff --git a/ruoyi-applet/src/main/resources/application-test.yml b/ruoyi-applet/src/main/resources/application-test.yml
index ebca5d4..e7df8ec 100644
--- a/ruoyi-applet/src/main/resources/application-test.yml
+++ b/ruoyi-applet/src/main/resources/application-test.yml
@@ -217,4 +217,9 @@
       # 支付成功回调地址
       notifyPayUrl: http://221.182.45.100:9100/wx/pay/notify
       # 支付退款回调地址
-      notifyRefundUrl: http://221.182.45.100:9100/wx/refund/notify
\ No newline at end of file
+      notifyRefundUrl: http://221.182.45.100:9100/wx/refund/notify
+
+      # 保险支付成功回调地址
+      insuranceNotifyPayUrl: http://221.182.45.100:9100/wx/pay/notifyInsurance
+      # 保险支付退款回调地址
+      notifyInsuranceRefundUrl: http://221.182.45.100:9100/wx/refund/notifyInsurance
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/BuyInsuranceDto.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/BuyInsuranceDto.java
index 1ec3d0f..66588b0 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/BuyInsuranceDto.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/BuyInsuranceDto.java
@@ -4,22 +4,33 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
 @Data
 @ApiModel("购买保险参数")
 public class BuyInsuranceDto {
 
     @ApiModelProperty("姓名")
+    @NotBlank(message = "姓名不能为空")
     private String name;
 
     @ApiModelProperty("手机号")
+    @NotBlank(message = "手机号不能为空")
     private String phone;
 
     @ApiModelProperty("身份证号")
+    @NotBlank(message = "身份证号不能为空")
     private String idCard;
 
     @ApiModelProperty("凭证")
     private String img;
 
     @ApiModelProperty("1线上2线下")
+    @NotNull(message = "支付方式不能为空")
     private Integer type;
+
+    @ApiModelProperty("1=社区大学课程 2=暑期青少年工艺培训班")
+    @NotNull(message = "保险类型不能为空")
+    private Integer courseType;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCourseOrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCourseOrderMapper.java
index 00ac199..deb769d 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCourseOrderMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCourseOrderMapper.java
@@ -42,4 +42,6 @@
      */
     List<TRefundOrderExport> exportRefundOrder(@Param("query")TCourseOrderQuery query);
 
+    int countOrderNum(@Param("userId") String userId, @Param("type") Integer type);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TInsuranceOrder.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TInsuranceOrder.java
index e5cf398..3174ef8 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TInsuranceOrder.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TInsuranceOrder.java
@@ -43,6 +43,10 @@
     @ApiModelProperty(value = "用户id")
     private String appUserId;
 
+    @TableField("type")
+    @ApiModelProperty(value = "1=社区大学课程 2=暑期青少年工艺培训班")
+    private Integer type;
+
     @TableField("name")
     @ApiModelProperty(value = "姓名")
     private String name;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TCourseOrderService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TCourseOrderService.java
index 4aaea1a..ebfa094 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TCourseOrderService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TCourseOrderService.java
@@ -45,4 +45,7 @@
      * @return
      */
     List<TRefundOrderExport> exportRefundOrder(TCourseOrderQuery query);
+
+    int countOrderNum(String userId, Integer type);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCourseOrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCourseOrderServiceImpl.java
index c42508d..263fd94 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCourseOrderServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCourseOrderServiceImpl.java
@@ -52,4 +52,9 @@
         List<TRefundOrderExport> list = this.baseMapper.exportRefundOrder(query);
         return list;
     }
+
+    @Override
+    public int countOrderNum(String userId, Integer type) {
+         return this.baseMapper.countOrderNum(userId,type);
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/UserInsuranceVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/UserInsuranceVo.java
index 3d54b64..833c92d 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/UserInsuranceVo.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/UserInsuranceVo.java
@@ -16,10 +16,10 @@
     private String userId;
 
     @ApiModelProperty("保险支付时间")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private LocalDateTime payTime;
 
     @ApiModelProperty("保险到期时间")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date endTime;
 }
diff --git a/ruoyi-system/src/main/resources/mapper/system/TCourseOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TCourseOrderMapper.xml
index ad77786..41527c6 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TCourseOrderMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TCourseOrderMapper.xml
@@ -157,5 +157,11 @@
         </where>
         ORDER BY tco.create_time DESC
     </select>
+    <select id="countOrderNum" resultType="java.lang.Integer">
+
+select count(1) from t_course_order tco left join t_course tc on tc.id = tco.course_id
+where tco.disabled = 0 and tco.app_user_id = #{userId}
+and tco.pay_status in (1,2) and tc.course_type = #{type}
+    </select>
 
 </mapper>

--
Gitblit v1.7.1