xuhy
2025-12-31 bf1b072b6af7de878fb5750bc14db7a2e2258f0c
Merge remote-tracking branch 'origin/master'
11个文件已修改
85 ■■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TOtherConfigController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/CourseController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/InsuranceController.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/resources/application-test.yml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/BuyInsuranceDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCourseOrderMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TInsuranceOrder.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TCourseOrderService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCourseOrderServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/UserInsuranceVo.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TCourseOrderMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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));
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("请先缴纳保险费");
        }
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("无权限操作");
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
      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
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;
}
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);
}
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;
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);
}
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);
    }
}
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;
}
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>