he2802 3 vuotta sitten
vanhempi
commit
c11d5168ed
42 muutettua tiedostoa jossa 1024 lisäystä ja 102 poistoa
  1. 101 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/exam/ExamActivityController.java
  2. 36 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java
  3. 15 19
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java
  4. 36 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamActivityAddBo.java
  5. 48 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamActivityApplyBo.java
  6. 36 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamActivityApplyVo.java
  7. 23 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamActivityQueryBo.java
  8. 42 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamActivityUpdateBo.java
  9. 51 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamActivityUserVo.java
  10. 6 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyAddBo.java
  11. 5 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyEditBo.java
  12. 49 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamActivity.java
  13. 53 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamActivityUser.java
  14. 2 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamApply.java
  15. 26 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/mapper/ExamActivityMapper.java
  16. 15 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/mapper/ExamActivityUserMapper.java
  17. 79 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/IExamActivityService.java
  18. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/IExamActivityUserService.java
  19. 92 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamActivityServiceImpl.java
  20. 18 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamActivityUserServiceImpl.java
  21. 51 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamActivityVo.java
  22. 9 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockApplyAddBo.java
  23. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockApplyEditBo.java
  24. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockMajorSubjectTimeAddBo.java
  25. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockMajorSubjectTimeEditBo.java
  26. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/domain/MockApply.java
  27. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/domain/MockMajorSubjectTime.java
  28. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  29. 2 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserMockSubscribeAddBo.java
  30. 0 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeSignReportBo.java
  31. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserSubscribe.java
  32. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserMockSubscribeMapper.java
  33. 9 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserMockSubscribeService.java
  34. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserSubscribeService.java
  35. 61 20
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserMockSubscribeServiceImpl.java
  36. 2 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java
  37. 61 6
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSubscribeServiceImpl.java
  38. 3 39
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/IWxLoginService.java
  39. 5 5
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/impl/WxPayServiceImpl.java
  40. 22 0
      zhongzheng-system/src/main/resources/mapper/modules/exam/ExamActivityMapper.xml
  41. 1 1
      zhongzheng-system/src/main/resources/mapper/modules/mock/MockApplyMapper.xml
  42. 12 1
      zhongzheng-system/src/main/resources/mapper/modules/user/UserMockSubscribeMapper.xml

+ 101 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/exam/ExamActivityController.java

@@ -0,0 +1,101 @@
+package com.zhongzheng.controller.exam;
+
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.modules.exam.bo.*;
+import com.zhongzheng.modules.exam.service.*;
+import com.zhongzheng.modules.exam.vo.*;
+import com.zhongzheng.modules.goods.vo.ExportLiveGoodsVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 考试活动Controller
+ *
+ * @author ruoyi
+ * @date 2021-12-07
+ */
+@Api(value = "考试活动控制器", tags = {"考试活动管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/exam/activity")
+public class ExamActivityController extends BaseController {
+
+    private final IExamActivityService iExamActivityService;
+
+    /**
+     * 新增活动
+     */
+    @ApiOperation("新增新增活动")
+    @PostMapping("/add")
+    public AjaxResult<Void> add(@RequestBody ExamActivityAddBo bo) {
+        return toAjax(iExamActivityService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 获取活动列表
+     */
+    @ApiOperation("获取活动列表")
+    @GetMapping("/list")
+    public TableDataInfo<ExamActivityVo> getActivityList(ExamActivityQueryBo bo) {
+        startPage();
+        List<ExamActivityVo> list = iExamActivityService.getActivityList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 修改活动
+     */
+    @ApiOperation("修改活动")
+    @PostMapping("/update")
+    public AjaxResult<Void> update(@RequestBody ExamActivityUpdateBo bo) {
+        return toAjax(iExamActivityService.updateByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 获取活动用户列表
+     */
+    @ApiOperation("获取活动用户列表")
+    @GetMapping("/user/list/{activityId}")
+    public TableDataInfo<ExamActivityUserVo> getActivityUserList(@PathVariable("activityId" ) Long activityId) {
+        startPage();
+        List<ExamActivityUserVo> list = iExamActivityService.getActivityUserList(activityId);
+        return getDataTable(list);
+    }
+
+    /**
+     * 获取活动报名二维码
+     */
+    @ApiOperation("获取活动报名二维码")
+    @GetMapping("/apply/code/{activityId}")
+    public AjaxResult<String> getActivityApplyCode(@PathVariable("activityId" ) Long activityId) {
+        String result = iExamActivityService.getActivityApplyCode(activityId);
+        return AjaxResult.success("成功",result);
+    }
+
+    /**
+     * 导出活动用户
+     */
+    @ApiOperation("导出活动用户")
+    @GetMapping("/export/{activityId}")
+    public AjaxResult<ExamActivityUserVo> exportActivityUserList(@PathVariable("activityId" ) Long activityId) {
+        List<ExamActivityUserVo> list = iExamActivityService.getActivityUserList(activityId);
+        list.forEach(item -> {
+            item.setUserSexStr(ObjectUtils.isNotNull(item.getUserSex()) && item.getUserSex() == 2?"女":"男");
+        });
+        ExcelUtil<ExamActivityUserVo> util = new ExcelUtil<>(ExamActivityUserVo.class);
+        return util.exportExcel(list,"模考活动用户");
+    }
+
+}

+ 36 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/exam/ExamApplyController.java

@@ -8,6 +8,7 @@ import com.zhongzheng.common.enums.BusinessType;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.framework.web.service.WxTokenService;
 import com.zhongzheng.modules.exam.bo.*;
+import com.zhongzheng.modules.exam.service.IExamActivityService;
 import com.zhongzheng.modules.exam.service.IExamApplyGoodsService;
 import com.zhongzheng.modules.exam.service.IExamApplyService;
 import com.zhongzheng.modules.exam.service.IExamApplySiteService;
@@ -49,6 +50,8 @@ public class ExamApplyController extends BaseController {
 
     private final IUserSubscribeService iUserSubscribeService;
 
+    private final IExamActivityService iExamActivityService;
+
     /**
      * 获取考试安排详细信息
      */
@@ -110,6 +113,19 @@ public class ExamApplyController extends BaseController {
         return AjaxResult.success(iUserSubscribeService.insertByAddBo(bo));
     }
 
+    /**
+     * 新增用户预约考试
+     */
+    @ApiOperation("新增用户预约考试")
+    @Log(title = "用户预约考试", businessType = BusinessType.INSERT)
+    @PostMapping("save")
+    public AjaxResult<Long> add(MultipartFile image, UserSubscribeAddBo bo) throws ParseException {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iUserSubscribeService.saveByAddBo(bo,image));
+    }
+
+
     /**
      * 查询用户预约考试列表
      */
@@ -146,4 +162,24 @@ public class ExamApplyController extends BaseController {
     public AjaxResult<Void> edit(@RequestBody UserAppSubscribeEditBo bo) {
         return toAjax(iUserSubscribeService.updateByEditSingleBo(bo) ? 1 : 0);
     }
+
+    /**
+     * 获取活动信息
+     */
+    @ApiOperation("获取活动信息")
+    @GetMapping("/detail/{activityId}")
+    public AjaxResult<ExamActivityVo> getDetail(@PathVariable("activityId" ) Long activityId) {
+        ExamActivityVo vo = iExamActivityService.getDetail(activityId);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 考试活动报名
+     */
+    @ApiOperation("考试活动报名")
+    @PostMapping("/launch")
+    public AjaxResult<ExamActivityApplyVo> applyActivity(@RequestBody ExamActivityApplyBo bo) {
+        ExamActivityApplyVo vo = iExamActivityService.applyActivity(bo);
+        return AjaxResult.success(vo);
+    }
 }

+ 15 - 19
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java

@@ -2,14 +2,12 @@ package com.zhongzheng.framework.web.service;
 
 
 import cn.hutool.core.lang.Validator;
-import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.zxing.BarcodeFormat;
-import com.google.zxing.WriterException;
 import com.google.zxing.client.j2se.MatrixToImageWriter;
 import com.google.zxing.common.BitMatrix;
 import com.google.zxing.qrcode.QRCodeWriter;
@@ -22,28 +20,16 @@ import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.common.utils.ip.IpUtils;
 import com.zhongzheng.modules.alisms.service.IAliSmsService;
 import com.zhongzheng.modules.course.bo.SectionWatchPerBo;
-import com.zhongzheng.modules.course.domain.CourseMenu;
-import com.zhongzheng.modules.course.domain.CourseSectionWatchPer;
-import com.zhongzheng.modules.course.mapper.CourseSectionMapper;
-import com.zhongzheng.modules.user.bo.UserAddBo;
 import com.zhongzheng.modules.user.bo.UserWxFollowAddBo;
 import com.zhongzheng.modules.user.domain.User;
-import com.zhongzheng.modules.user.domain.UserBankRecord;
-import com.zhongzheng.modules.user.domain.UserSchoolInfo;
-import com.zhongzheng.modules.user.domain.UserWxFollow;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.modules.user.mapper.UserMapper;
-import com.zhongzheng.modules.user.mapper.UserSchoolInfoMapper;
-import com.zhongzheng.modules.user.mapper.UserWxFollowMapper;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.service.IUserWxFollowService;
-import com.zhongzheng.modules.user.vo.UserVo;
 import com.zhongzheng.modules.wx.bo.TemplatData;
 import com.zhongzheng.modules.wx.bo.WxLoginBody;
 import com.zhongzheng.modules.wx.service.IWxLoginService;
-import net.polyv.common.v1.base.HttpClientUtil;
 import org.apache.commons.codec.binary.Base64;
-import org.apache.http.entity.StringEntity;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -51,14 +37,11 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.annotation.Resource;
 import java.io.ByteArrayOutputStream;
-import java.io.IOException;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -852,8 +835,7 @@ public class WxLoginService implements IWxLoginService {
         obj.put("touser", openId);
         paramMap.put("access_token", accessToken);
         mp_template_msg.put("appid", gzh_appid);
-        mp_template_msg.put("template_id", signatureTpId
-        );
+        mp_template_msg.put("template_id", signatureTpId);
         mp_template_msg.put("url", "http://weixin.qq.com/download");  //公众号模板消息所要跳转的url
         miniprogram.put("appid", appid); //公众号模板消息所要跳转的小程序appid,小程序的必须与公众号具有绑定关系
         miniprogram.put("pagepath", paramMap.get("pagepath")); //公众号模板消息所要跳转的小程序页面
@@ -887,6 +869,20 @@ public class WxLoginService implements IWxLoginService {
         return result;
     }
 
+
+    @Override
+    public String getActivityApplyCode(Long activityId) {
+        String wxGzhAccessToken = getWxSmallAccessToken();
+        String param = String.format(small_wxEnCodeParam, wxGzhAccessToken);
+        String url = small_wxEnCodeUrl + "?" + param;
+        JSONObject obj = new JSONObject();
+        obj.put("page", "pages5/mockExam/examApply");
+        obj.put("scene",String.format("tid=%s",activityId));
+        obj.put("env_version",enCodeVersion);
+        String result = HttpUtils.sendPost(url, obj);
+        return result;
+    }
+
     public Boolean subGzh(String openId) {
         String unionId = getWxGzhUserCgiInfo(openId);
         if (Validator.isNotEmpty(unionId)) {

+ 36 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamActivityAddBo.java

@@ -0,0 +1,36 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 考试活动对象 exam_activity
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+@Data
+@ApiModel("考试活动添加对象")
+public class ExamActivityAddBo implements Serializable {
+
+    /**活动名称 */
+    @ApiModelProperty("活动名称")
+    private String name;
+
+    /** 科目(多个用逗号隔开) */
+    @ApiModelProperty("科目(多个用逗号隔开)")
+    private String majors;
+
+    /** 活动开始时间 */
+    @ApiModelProperty("活动开始时间")
+    private Long startTime;
+
+    /** 活动结束时间 */
+    @ApiModelProperty("活动结束时间")
+    private Long endTime;
+
+
+}

+ 48 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamActivityApplyBo.java

@@ -0,0 +1,48 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 考试活动报名用户对象 exam_activity
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+@Data
+@ApiModel("考试活动报名用户对象")
+public class ExamActivityApplyBo implements Serializable {
+
+    /**活动ID */
+    @ApiModelProperty("活动ID")
+    private Long activityId;
+
+    /** 用户名称 */
+    @ApiModelProperty("用户名称")
+    private String userName;
+
+    /** 用户性别:1男,2女 */
+    @ApiModelProperty("用户性别:1男,2女 ")
+    private Integer userSex;
+
+    /** 企业名称 */
+    @ApiModelProperty("企业名称")
+    private String companyName;
+
+    /** 用户身份证号码 */
+    @ApiModelProperty("用户身份证号码")
+    private String userIdCard;
+
+    /** 用户手机号码 */
+    @ApiModelProperty("用户手机号码")
+    private String userPhone;
+
+    /** 报考科目(多个用逗号隔开) */
+    @ApiModelProperty("报考科目(多个用逗号隔开)")
+    private String userMajors;
+
+
+}

+ 36 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamActivityApplyVo.java

@@ -0,0 +1,36 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 考试活动对象 exam_activity
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+@Data
+@ApiModel("考试活动添加对象")
+public class ExamActivityApplyVo implements Serializable {
+
+    /**活动ID */
+    @ApiModelProperty("活动ID")
+    private Long activityId;
+
+    /**活动名称 */
+    @ApiModelProperty("活动名称")
+    private String name;
+
+    /** 活动开始时间 */
+    @ApiModelProperty("活动开始时间")
+    private Long startTime;
+
+    /** 活动结束时间 */
+    @ApiModelProperty("活动结束时间")
+    private Long endTime;
+
+
+}

+ 23 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamActivityQueryBo.java

@@ -0,0 +1,23 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 考试活动查询对象 exam_activity
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+@Data
+@ApiModel("考试活动添加对象")
+public class ExamActivityQueryBo implements Serializable {
+
+    /**活动名称 */
+    @ApiModelProperty("活动名称")
+    private String name;
+
+}

+ 42 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamActivityUpdateBo.java

@@ -0,0 +1,42 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 考试活动对象 exam_activity
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+@Data
+@ApiModel("考试活动修改对象")
+public class ExamActivityUpdateBo implements Serializable {
+
+    /**活动ID */
+    @ApiModelProperty("活动ID")
+    private Long activityId;
+
+    /**活动名称 */
+    @ApiModelProperty("活动名称")
+    private String name;
+
+    /** 科目(多个用逗号隔开) */
+    @ApiModelProperty("科目(多个用逗号隔开)")
+    private String majors;
+
+    /** 活动开始时间 */
+    @ApiModelProperty("活动开始时间")
+    private Long startTime;
+
+    /** 活动结束时间 */
+    @ApiModelProperty("活动结束时间")
+    private Long endTime;
+
+    /** 1有效 0无效 */
+    @ApiModelProperty("1有效 0无效")
+    private Integer status;
+}

+ 51 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamActivityUserVo.java

@@ -0,0 +1,51 @@
+package com.zhongzheng.modules.exam.bo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 考试活动对象 exam_activity
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+@Data
+@ApiModel("考试活动添加对象")
+public class ExamActivityUserVo implements Serializable {
+
+    /** 活动ID */
+    @ApiModelProperty("活动ID")
+    private Long activityId;
+    /** 用户名称 */
+    @ApiModelProperty("用户名称")
+    @Excel(name = "用户名称")
+    private String userName;
+    /** 用户性别:1男,2女 */
+    @ApiModelProperty("用户性别:1男,2女")
+    private Integer userSex;
+    @Excel(name = "用户性别")
+    private String userSexStr;
+    /** 企业名称 */
+    @ApiModelProperty("企业名称")
+    @Excel(name = "企业名称")
+    private String companyName;
+    /** 用户身份证号码 */
+    @ApiModelProperty("用户身份证号码")
+    @Excel(name = "用户身份证号码")
+    private String userIdCard;
+    /** 用户手机号码 */
+    @ApiModelProperty("用户手机号码")
+    @Excel(name = "用户手机号码")
+    private String userPhone;
+    /** 报考科目(多个用逗号隔开) */
+    @ApiModelProperty("报考科目(多个用逗号隔开)")
+    @Excel(name = "报考科目(多个用逗号隔开)")
+    private String userMajors;
+
+}

+ 6 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyAddBo.java

@@ -63,6 +63,11 @@ public class ExamApplyAddBo {
     /** 编码 */
     @ApiModelProperty("编码")
     private String code;
-    @ApiModelProperty("是否需要签署承诺书 1是,0否")
+
+
+    /** 是否需要签署承诺书 1是,0否 */
+    @ApiModelProperty("编码")
     private Integer reportStatus;
+
+
 }

+ 5 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyEditBo.java

@@ -69,6 +69,10 @@ public class ExamApplyEditBo {
     /** 项目ID */
     @ApiModelProperty("项目ID")
     private Long projectId;
-    @ApiModelProperty("是否需要签署承诺书 1是,0否")
+
+    /** 是否需要签署承诺书 1是,0否 */
+    @ApiModelProperty("编码")
     private Integer reportStatus;
+
+
 }

+ 49 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamActivity.java

@@ -0,0 +1,49 @@
+package com.zhongzheng.modules.exam.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 考试活动对象 exam_activity
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("exam_activity")
+public class ExamActivity implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "activity_id")
+    private Long activityId;
+    /** 活动名称 */
+    private String name;
+    /** 科目(多个用逗号隔开) */
+    private String majors;
+    /** 活动开始时间 */
+    private Long startTime;
+    /** 活动结束时间 */
+    private Long endTime;
+    /** 创建人ID */
+    private Long creatorId;
+    /** 1有效 0无效 */
+    private Integer status;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+
+}

+ 53 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamActivityUser.java

@@ -0,0 +1,53 @@
+package com.zhongzheng.modules.exam.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 考试活动用户对象 exam_activity
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("exam_activity_user")
+public class ExamActivityUser implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "id")
+    private Long id;
+    /** 活动ID */
+    private Long activityId;
+    /** 用户名称 */
+    private String userName;
+    /** 用户性别:1男,2女 */
+    private Integer userSex;
+    /** 企业名称 */
+    private String companyName;
+    /** 用户身份证号码 */
+    private String userIdCard;
+    /** 用户手机号码 */
+    private String userPhone;
+    /** 报考科目(多个用逗号隔开) */
+    private String userMajors;
+    /** 1有效 0无效 */
+    private Integer status;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+
+}

+ 2 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/domain/ExamApply.java

@@ -62,6 +62,7 @@ private static final long serialVersionUID=1L;
 
     /** 编码 */
     private String code;
-
+    
+    /** 是否需要签署承诺书 1是,0否 */
     private Integer reportStatus;
 }

+ 26 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/mapper/ExamActivityMapper.java

@@ -0,0 +1,26 @@
+package com.zhongzheng.modules.exam.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.exam.bo.ExamActivityQueryBo;
+import com.zhongzheng.modules.exam.bo.ExamActivityUserVo;
+import com.zhongzheng.modules.exam.bo.ExamApplyQueryBo;
+import com.zhongzheng.modules.exam.bo.ExamNumberGoodsQueryBo;
+import com.zhongzheng.modules.exam.domain.ExamActivity;
+import com.zhongzheng.modules.exam.domain.ExamApply;
+import com.zhongzheng.modules.exam.vo.*;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 考试活动Mapper接口
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+public interface ExamActivityMapper extends BaseMapper<ExamActivity> {
+
+    List<ExamActivityVo> getActivityList(ExamActivityQueryBo bo);
+
+    List<ExamActivityUserVo> getActivityUserList(@Param("activityId") Long activityId);
+}

+ 15 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/mapper/ExamActivityUserMapper.java

@@ -0,0 +1,15 @@
+package com.zhongzheng.modules.exam.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.exam.domain.ExamActivity;
+import com.zhongzheng.modules.exam.domain.ExamActivityUser;
+
+/**
+ * 考试活动用户Mapper接口
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+public interface ExamActivityUserMapper extends BaseMapper<ExamActivityUser> {
+
+}

+ 79 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/IExamActivityService.java

@@ -0,0 +1,79 @@
+package com.zhongzheng.modules.exam.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.exam.bo.*;
+import com.zhongzheng.modules.exam.domain.ExamActivity;
+import com.zhongzheng.modules.exam.vo.ExamActivityVo;
+
+import java.util.List;
+
+/**
+ * 考试活动Service接口
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+public interface IExamActivityService extends IService<ExamActivity> {
+    /**
+     * 新增活动
+     * @author change
+     * @date 2022/8/30 9:45
+     * @param bo
+     * @return boolean
+     */
+    boolean insertByAddBo(ExamActivityAddBo bo);
+
+    /**
+     * 活动列表
+     * @author change
+     * @date 2022/8/30 10:15
+     * @param bo
+     * @return java.util.List<com.zhongzheng.modules.exam.vo.ExamActivityVo>
+     */
+    List<ExamActivityVo> getActivityList(ExamActivityQueryBo bo);
+
+    /**
+     * 修改活动
+     * @author change
+     * @date 2022/8/30 10:29
+     * @param bo
+     * @return boolean
+     */
+    boolean updateByAddBo(ExamActivityUpdateBo bo);
+
+    /**
+     * 考试活动报名
+     * @author change
+     * @date 2022/8/30 10:55
+     * @param bo
+     * @return com.zhongzheng.modules.exam.bo.ExamActivityApplyVo
+     */
+    ExamActivityApplyVo applyActivity(ExamActivityApplyBo bo);
+
+    /**
+     * 获取活动详情
+     * @author change
+     * @date 2022/8/30 11:02
+     * @param activityId
+     * @return com.zhongzheng.modules.exam.vo.ExamActivityVo
+     */
+    ExamActivityVo getDetail(Long activityId);
+
+    /**
+     * 获取活动用户列表
+     * @author change
+     * @date 2022/8/30 11:08
+     * @param activityId
+     * @return java.util.List<com.zhongzheng.modules.exam.bo.ExamActivityUserVo>
+     */
+    List<ExamActivityUserVo> getActivityUserList(Long activityId);
+
+    /**
+     * 获取活动报名二维码
+     * @author change
+     * @date 2022/8/30 16:52
+     * @param activityId
+     * @return java.lang.String
+     */
+    String getActivityApplyCode(Long activityId);
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/IExamActivityUserService.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.exam.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.exam.domain.ExamActivity;
+import com.zhongzheng.modules.exam.domain.ExamActivityUser;
+
+/**
+ * 考试活动用户Service接口
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+public interface IExamActivityUserService extends IService<ExamActivityUser> {
+}

+ 92 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamActivityServiceImpl.java

@@ -0,0 +1,92 @@
+package com.zhongzheng.modules.exam.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.common.core.domain.model.LoginUser;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.modules.exam.bo.*;
+import com.zhongzheng.modules.exam.domain.ExamActivity;
+import com.zhongzheng.modules.exam.domain.ExamActivityUser;
+import com.zhongzheng.modules.exam.mapper.ExamActivityMapper;
+import com.zhongzheng.modules.exam.service.IExamActivityService;
+import com.zhongzheng.modules.exam.service.IExamActivityUserService;
+import com.zhongzheng.modules.exam.vo.ExamActivityVo;
+import com.zhongzheng.modules.wx.service.IWxLoginService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 考试活动Service业务层处理
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+@Service
+public class ExamActivityServiceImpl extends ServiceImpl<ExamActivityMapper, ExamActivity> implements IExamActivityService {
+
+    @Autowired
+    private IExamActivityUserService iExamActivityUserService;
+    @Autowired
+    private IWxLoginService wxLoginService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertByAddBo(ExamActivityAddBo bo) {
+        ExamActivity examActivity = new ExamActivity();
+        BeanUtils.copyProperties(bo, examActivity);
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        examActivity.setCreatorId(loginUser.getUser().getUserId());
+        examActivity.setCreateTime(DateUtils.getNowTime());
+        examActivity.setUpdateTime(DateUtils.getNowTime());
+        return this.save(examActivity);
+    }
+
+    @Override
+    public List<ExamActivityVo> getActivityList(ExamActivityQueryBo bo) {
+        return baseMapper.getActivityList(bo);
+    }
+
+    @Override
+    public boolean updateByAddBo(ExamActivityUpdateBo bo) {
+        ExamActivity examActivity = new ExamActivity();
+        BeanUtils.copyProperties(bo, examActivity);
+        examActivity.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(examActivity);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public ExamActivityApplyVo applyActivity(ExamActivityApplyBo bo) {
+        ExamActivityUser examActivityUser = new ExamActivityUser();
+        BeanUtils.copyProperties(bo, examActivityUser);
+        examActivityUser.setCreateTime(DateUtils.getNowTime());
+        examActivityUser.setUpdateTime(DateUtils.getNowTime());
+        iExamActivityUserService.save(examActivityUser);
+        ExamActivity activity = getById(bo.getActivityId());
+        ExamActivityApplyVo vo = new ExamActivityApplyVo();
+        BeanUtils.copyProperties(activity,vo);
+        return vo;
+    }
+
+    @Override
+    public ExamActivityVo getDetail(Long activityId) {
+        ExamActivity activity = getById(activityId);
+        ExamActivityVo vo = new ExamActivityVo();
+        BeanUtils.copyProperties(activity,vo);
+        return vo;
+    }
+
+    @Override
+    public List<ExamActivityUserVo> getActivityUserList(Long activityId) {
+        return baseMapper.getActivityUserList(activityId);
+    }
+
+    @Override
+    public String getActivityApplyCode(Long activityId) {
+        return wxLoginService.getActivityApplyCode(activityId);
+    }
+}

+ 18 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/service/impl/ExamActivityUserServiceImpl.java

@@ -0,0 +1,18 @@
+package com.zhongzheng.modules.exam.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.modules.exam.domain.ExamActivityUser;
+import com.zhongzheng.modules.exam.mapper.ExamActivityUserMapper;
+import com.zhongzheng.modules.exam.service.IExamActivityUserService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 考试活动用户Service业务层处理
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+@Service
+public class ExamActivityUserServiceImpl extends ServiceImpl<ExamActivityUserMapper, ExamActivityUser> implements IExamActivityUserService {
+
+}

+ 51 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamActivityVo.java

@@ -0,0 +1,51 @@
+package com.zhongzheng.modules.exam.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 考试活动对象 exam_activity
+ *
+ * @author yangdamao
+ * @date 2021-12-07
+ */
+@Data
+@ApiModel("考试活动添加对象")
+public class ExamActivityVo implements Serializable {
+
+    /**活动ID */
+    @ApiModelProperty("活动ID")
+    private Long activityId;
+
+    /**活动名称 */
+    @ApiModelProperty("活动名称")
+    private String name;
+
+    /** 科目(多个用逗号隔开) */
+    @ApiModelProperty("科目(多个用逗号隔开)")
+    private String majors;
+
+    /** 活动开始时间 */
+    @ApiModelProperty("活动开始时间")
+    private Long startTime;
+
+    /** 活动结束时间 */
+    @ApiModelProperty("活动结束时间")
+    private Long endTime;
+
+    /** 创建人 */
+    @ApiModelProperty("创建人")
+    private String creatorName;
+
+    /** 创建时间 */
+    @ApiModelProperty("创建时间")
+    private Long createTime;
+
+    /** 1有效 0无效 */
+    @ApiModelProperty("1有效 0无效")
+    private Integer status;
+
+}

+ 9 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockApplyAddBo.java

@@ -61,7 +61,15 @@ public class MockApplyAddBo {
     /** 模考通知状态 0未通知 1已通知 */
     @ApiModelProperty("模考通知状态 0未通知 1已通知")
     private Integer mockRemind;
-
+    /** 是否活动模考 0否 1是 */
+    @ApiModelProperty("是否活动模考 0否 1是")
+    private Integer mockActivity;
+    /** 活动开始时间 */
+    @ApiModelProperty("活动开始时间")
+    private Long activityStartTime;
+    /** 活动结束时间 */
+    @ApiModelProperty("活动结束时间")
+    private Long activityEndTime;
     /** 关联专业列表 */
     @ApiModelProperty("关联专业列表")
     private List<MockMajorAddBo> mockMajorList;

+ 10 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockApplyEditBo.java

@@ -76,6 +76,16 @@ public class MockApplyEditBo {
     @ApiModelProperty("模考通知状态 0未通知 1已通知")
     private Integer mockRemind;
 
+    /** 是否活动模考 0否 1是 */
+    @ApiModelProperty("是否活动模考 0否 1是")
+    private Integer mockActivity;
+    /** 活动开始时间 */
+    @ApiModelProperty("活动开始时间")
+    private Long activityStartTime;
+    /** 活动结束时间 */
+    @ApiModelProperty("活动结束时间")
+    private Long activityEndTime;
+
     /** 关联专业列表 */
     @ApiModelProperty("关联专业列表")
     private List<MockMajorEditBo> mockMajorList;

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockMajorSubjectTimeAddBo.java

@@ -36,4 +36,7 @@ public class MockMajorSubjectTimeAddBo {
     /** 修改时间 */
     @ApiModelProperty("修改时间")
     private Long updateTime;
+    /** 考试时长(分钟) */
+    @ApiModelProperty("考试时长(分钟)")
+    private Integer duration;
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/bo/MockMajorSubjectTimeEditBo.java

@@ -41,5 +41,9 @@ public class MockMajorSubjectTimeEditBo {
     @ApiModelProperty("修改时间")
     private Long updateTime;
 
+    /** 考试时长(分钟) */
+    @ApiModelProperty("考试时长(分钟)")
+    private Integer duration;
+
 
 }

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/domain/MockApply.java

@@ -57,4 +57,10 @@ private static final long serialVersionUID=1L;
     private String timeLimit;
     /** 模考通知状态 0未通知 1已通知 */
     private Integer mockRemind;
+    /** 是否活动模考 0否 1是 */
+    private Integer mockActivity;
+    /** 活动开始时间 */
+    private Long activityStartTime;
+    /** 活动结束时间 */
+    private Long activityEndTime;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/mock/domain/MockMajorSubjectTime.java

@@ -37,6 +37,8 @@ private static final long serialVersionUID=1L;
     private String startTime;
     /** 结束时间 */
     private String endTime;
+    /** 考试时长(分钟) */
+    private Integer duration;
     /** 修改时间 */
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private Long updateTime;

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java

@@ -52,6 +52,7 @@ import com.zhongzheng.modules.order.vo.*;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.domain.UserExamGoods;
 import com.zhongzheng.modules.user.service.IUserExamGoodsService;
+import com.zhongzheng.modules.user.service.IUserMockSubscribeService;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.vo.UserVo;
 import com.zhongzheng.modules.wx.service.IWxPayService;
@@ -136,6 +137,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     @Autowired
     private RedisCache redisCache;
 
+    @Autowired
+    private IUserMockSubscribeService iUserMockSubscribeService;
+
 
     @Override
     public OrderVo queryById(Long orderId) {
@@ -715,6 +719,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         //给用户增加商品考试次数前培次数
         iWxPayService.updateUserExamGoods(orderGoods, order);
         iWxPayService.joinLockGrade(order.getOrderSn(), orderGoods.getGoodsId(), orderGoods.getOrderGoodsId());
+        //商品是否有活动模考
+        iUserMockSubscribeService.addActivityMock(orderGoods.getGoodsId(),order.getUserId());
     }
 
     @Override

+ 2 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserMockSubscribeAddBo.java

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
 
@@ -17,7 +18,7 @@ import java.util.Date;
  */
 @Data
 @ApiModel("用户预约模考添加对象")
-public class UserMockSubscribeAddBo {
+public class UserMockSubscribeAddBo implements Serializable {
 
     /** 学员ID */
     @ApiModelProperty("学员ID")

+ 0 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserSubscribeSignReportBo.java

@@ -32,7 +32,4 @@ public class UserSubscribeSignReportBo implements Serializable {
     @ApiModelProperty("专业")
     private String major;
 
-    @ApiModelProperty("座位号")
-    private String seatNumber;
-
 }

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserSubscribe.java

@@ -115,5 +115,5 @@ private static final long serialVersionUID=1L;
     private Long signaturePushTime;
     /** 签署承诺书时间 */
     private Long reportFileTime;
-    
+
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserMockSubscribeMapper.java

@@ -1,6 +1,7 @@
 package com.zhongzheng.modules.user.mapper;
 
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
+import com.zhongzheng.modules.user.bo.UserMockSubscribeAddBo;
 import com.zhongzheng.modules.user.bo.UserMockSubscribeQueryBo;
 import com.zhongzheng.modules.user.domain.UserMockSubscribe;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -28,4 +29,6 @@ public interface UserMockSubscribeMapper extends BaseMapper<UserMockSubscribe> {
     List<UserMockSubscribeVo> listLiveSubscribe();
 
     UserMockSubscribeVo listSubscribeInfo(Long subscribeId);
+
+    List<UserMockSubscribeAddBo> getMockByGooId(Long goodsId);
 }

+ 9 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserMockSubscribeService.java

@@ -61,4 +61,13 @@ public interface IUserMockSubscribeService extends IService<UserMockSubscribe> {
     List<UserMockSubscribeVo> listLiveSubscribe();
 
 	UserMockSubscribeVo listSubscribeInfo(Long subscribeId);
+
+	/**
+	 * 活动模考数据生成
+	 * @author change
+	 * @date 2022/8/31 16:28
+	 * @param goodId
+	 * @return java.lang.Boolean
+	 */
+	Boolean addActivityMock(Long goodId,Long userId);
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserSubscribeService.java

@@ -92,9 +92,13 @@ public interface IUserSubscribeService extends IService<UserSubscribe> {
      */
 	Boolean signReport(MultipartFile image, UserSubscribeSignReportBo bo);
 
+
 	List<UserSubscribeVo> signTimeSend();
 
 	List<UserSubscribeStudentExportVo> listUserExport(UserSubscribeQueryBo bo);
 
 	List<UserSubscribeSignExportVo> listSignExport(UserSubscribeQueryBo bo);
+
+	Long saveByAddBo(UserSubscribeAddBo bo, MultipartFile image) throws ParseException;
+
 }

+ 61 - 20
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserMockSubscribeServiceImpl.java

@@ -3,6 +3,8 @@ package com.zhongzheng.modules.user.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
@@ -22,6 +24,7 @@ import com.zhongzheng.modules.user.domain.UserMockRecord;
 import com.zhongzheng.modules.user.service.IUserMockRecordService;
 import com.zhongzheng.modules.user.service.IUserService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -247,7 +250,11 @@ public class UserMockSubscribeServiceImpl extends ServiceImpl<UserMockSubscribeM
             if (Validator.isNotEmpty(bo.getMockStatus()) && bo.getMockStatus() == 0) {
                 userMockSubscribeVoList.stream().forEach(userMockSubscribeVo -> {
                     try {
-                        if (System.currentTimeMillis()/1000 < formatTime(userMockSubscribeVo.getApplySiteExamTime(), userMockSubscribeVo.getApplySiteEndTime())) {
+                        if (ObjectUtils.isNotNull(userMockSubscribeVo.getApplySiteExamTime()) && ObjectUtils.isNotNull(userMockSubscribeVo.getApplySiteEndTime())){
+                            if (System.currentTimeMillis()/1000 < formatTime(userMockSubscribeVo.getApplySiteExamTime(), userMockSubscribeVo.getApplySiteEndTime())) {
+                                userMockSubscribeVos.add(userMockSubscribeVo);
+                            }
+                        }else {
                             userMockSubscribeVos.add(userMockSubscribeVo);
                         }
                     } catch (ParseException e) {
@@ -261,8 +268,10 @@ public class UserMockSubscribeServiceImpl extends ServiceImpl<UserMockSubscribeM
                 List<MockMajorSubjectTimeVo> mockMajorSubjectTimeList2 = new ArrayList<>();
                 mockMajorSubjectTimeList.forEach(mockMajorSubjectTime -> {
                     try {
-                        if (System.currentTimeMillis()/1000 > formatTime(mockMajorSubjectTime.getExamTime(), mockMajorSubjectTime.getEndTime())) {
-                            mockMajorSubjectTimeList2.add(mockMajorSubjectTime);
+                        if (ObjectUtils.isNotNull(mockMajorSubjectTime.getExamTime()) && ObjectUtils.isNotNull(mockMajorSubjectTime.getEndTime())){
+                            if (System.currentTimeMillis()/1000 > formatTime(mockMajorSubjectTime.getExamTime(), mockMajorSubjectTime.getEndTime())) {
+                                mockMajorSubjectTimeList2.add(mockMajorSubjectTime);
+                            }
                         }
                     } catch (ParseException e) {
                         e.printStackTrace();
@@ -274,8 +283,10 @@ public class UserMockSubscribeServiceImpl extends ServiceImpl<UserMockSubscribeM
                 List<UserMockSubscribeVo> userMockSubscribeList2 = new ArrayList<>();
                 userMockSubscribeList.forEach(userMockSubscribe -> {
                     try {
-                        if (System.currentTimeMillis()/1000 > formatTime(userMockSubscribe.getApplySiteExamTime(), userMockSubscribe.getApplySiteEndTime())) {
-                            userMockSubscribeList2.add(userMockSubscribe);
+                        if (ObjectUtils.isNotNull(userMockSubscribe.getApplySiteExamTime()) && ObjectUtils.isNotNull(userMockSubscribe.getApplySiteEndTime())){
+                            if (System.currentTimeMillis()/1000 > formatTime(userMockSubscribe.getApplySiteExamTime(), userMockSubscribe.getApplySiteEndTime())) {
+                                userMockSubscribeList2.add(userMockSubscribe);
+                            }
                         }
                     } catch (ParseException e) {
                         e.printStackTrace();
@@ -300,12 +311,14 @@ public class UserMockSubscribeServiceImpl extends ServiceImpl<UserMockSubscribeM
                     MockMajorSubjectTime mockMajorSubjectTime = iMockMajorSubjectTimeService.getOne(lqw);
                     try {
                         if (Validator.isEmpty(userMockSubscribeVo.getHandStatus()) || userMockSubscribeVo.getHandStatus() == 0) {
-                            if (System.currentTimeMillis()/1000 < formatTime(mockMajorSubjectTime.getExamTime(), mockMajorSubjectTime.getStartTime())) {
-                                userMockSubscribeVo.setReSubscribe(1);
+                            if (ObjectUtils.isNotNull(mockMajorSubjectTime.getExamTime()) && ObjectUtils.isNotNull(mockMajorSubjectTime.getStartTime())){
+                                if (System.currentTimeMillis()/1000 < formatTime(mockMajorSubjectTime.getExamTime(), mockMajorSubjectTime.getStartTime())) {
+                                    userMockSubscribeVo.setReSubscribe(1);
+                                }
+                            }
+                            if (System.currentTimeMillis()/1000 < formatTime(mockMajorSubjectTime.getExamTime(), mockMajorSubjectTime.getEndTime())) {
+                                userMockSubscribeVo.setCanDo(0);
                             }
-                        }
-                        if (System.currentTimeMillis()/1000 < formatTime(mockMajorSubjectTime.getExamTime(), mockMajorSubjectTime.getEndTime())) {
-                            userMockSubscribeVo.setCanDo(0);
                         }
                     } catch (ParseException e) {
                         e.printStackTrace();
@@ -357,17 +370,17 @@ public class UserMockSubscribeServiceImpl extends ServiceImpl<UserMockSubscribeM
         });
 
 
-        Collections.sort(userMockSubscribeVos, new Comparator<UserMockSubscribeVo>() {
-            @Override
-            public int compare(UserMockSubscribeVo o1, UserMockSubscribeVo o2) {
-                //升序排列
-                //return o1.getApplySiteExamTime().compareTo(o2.getApplySiteExamTime());
-                //降序排列
-                return o2.getApplySiteExamTime().compareTo(o1.getApplySiteExamTime());
-            }
-        });
+//        Collections.sort(userMockSubscribeVos, new Comparator<UserMockSubscribeVo>() {
+//            @Override
+//            public int compare(UserMockSubscribeVo o1, UserMockSubscribeVo o2) {
+//                //升序排列
+//                //return o1.getApplySiteExamTime().compareTo(o2.getApplySiteExamTime());
+//                //降序排列
+//                return o2.getApplySiteExamTime().compareTo(o1.getApplySiteExamTime());
+//            }
+//        });
 
-        return userMockSubscribeVos;
+        return userMockSubscribeVos.stream().sorted(Comparator.comparing(UserMockSubscribeVo::getApplySiteExamTime, Comparator.nullsFirst(Long::compareTo))).collect(Collectors.toList());
     }
 
     @Override
@@ -392,4 +405,32 @@ public class UserMockSubscribeServiceImpl extends ServiceImpl<UserMockSubscribeM
 
         return userMockSubscribeVo;
     }
+
+    @Override
+    public Boolean addActivityMock(Long goodsId,Long userId) {
+        //获取商品绑定的活动模考数据
+        List<UserMockSubscribeAddBo> addBos = baseMapper.getMockByGooId(goodsId);
+        if (CollectionUtils.isEmpty(addBos)){
+            return true;
+        }
+        List<UserMockSubscribe> list = addBos.stream().map(item -> {
+            UserMockSubscribe entity = new UserMockSubscribe();
+            entity.setUserId(userId);
+//            entity.setEachExamId();
+            entity.setSubscribeStatus(1);
+            entity.setBeforeStatus(0);
+            entity.setExamStatus(0);
+            entity.setHandStatus(0);
+            entity.setApplyId(item.getApplyId());
+            entity.setMockMajorSubjectId(item.getMockMajorSubjectId());
+            entity.setCreateTime(DateUtils.getNowTime());
+            entity.setUpdateTime(DateUtils.getNowTime());
+            entity.setMockRemind(0);
+            entity.setLiveSubscribe(0);
+            entity.setHasLiveSubscribe(0);
+            entity.setHasMockRemind(0);
+            return entity;
+        }).collect(Collectors.toList());
+        return saveBatch(list);
+    }
 }

+ 2 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java

@@ -657,7 +657,7 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
     }
 
     @Override
-    public List<CourseStatementVo> getCourseStatement(CourseStatementBo bo) {
+    public List<CourseStatementVo>  getCourseStatement(CourseStatementBo bo) {
         List<CourseStatementVo> voList = baseMapper.getCourseStatement(bo);
         if (CollectionUtils.isEmpty(voList)){
             return new ArrayList<>();
@@ -689,7 +689,7 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
                         Map<Long, List<UserStudyRecord>> collect = records.stream().filter(x -> ObjectUtils.isNotNull(x.getUserId())).collect(Collectors.groupingBy(UserStudyRecord::getUserId));
                         List<Long> unBuyCourseUserIds = new ArrayList<>();
                         for (Long id : collect.keySet()) {
-                            if (CollectionUtils.isNotEmpty(buyCourseUserIds) && !buyCourseUserIds.contains(id)){
+                            if (CollectionUtils.isEmpty(buyCourseUserIds) || !buyCourseUserIds.contains(id)){
                                 unBuyCourseUserIds.add(id);
                             }
                         }

+ 61 - 6
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserSubscribeServiceImpl.java

@@ -1754,7 +1754,6 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         bo.setMajor(major.getCategoryName());
         String applyDate = DateUtils.timestampToDateFormat(Long.valueOf(userSubscribe.getApplySiteExamTime()), "yyyy-MM-dd");
         bo.setApplySiteStartTime(String.format("%s %s",applyDate,userSubscribe.getApplySiteStartTime()));
-        bo.setSeatNumber(userSubscribe.getSeatNumber());
         //获取承诺书模板
         String reportUrl = drawReport(image, bo);
         userSubscribe.setReportStatus(1);//已签署
@@ -1801,6 +1800,63 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
         return list1;
     }
 
+    @Override
+    public Long saveByAddBo(UserSubscribeAddBo bo, MultipartFile image) throws ParseException{
+        UserSubscribe add = BeanUtil.toBean(bo, UserSubscribe.class);
+        if(Validator.isEmpty(add.getOrderGoodsId())){
+            throw new CustomException("缺失订单商品ID");
+        }
+        //判断当前时间是否超过了选择时间
+        Date date = new Date();
+        Long times = add.getApplySiteExamTime()*1000;//时间戳
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+        String dateString = formatter.format(times);
+        String dateForma =null;
+        dateForma = dateString+" "+add.getApplySiteStartTime().replace("-", ":");
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        Long time = sdf.parse(dateForma).getTime() / 1000;
+        if (System.currentTimeMillis()/1000 > time){
+            throw new CustomException("当前选择的考试时间已过期,请重新预约,选择未过期考试时间");
+        }
+        //要求非必填考点
+        if(Validator.isNotEmpty(bo.getApplySiteAddress())){
+            ExamApplyQueryBo queryTimeBo = new ExamApplyQueryBo();
+            queryTimeBo.setApplyId(bo.getApplyId());
+            queryTimeBo.setStartTime(bo.getApplySiteStartTime().replace("-", ":"));
+            queryTimeBo.setEndTime(bo.getApplySiteEndTime().replace("-", ":"));
+            queryTimeBo.setExamTime(bo.getApplySiteExamTime());
+            queryTimeBo.setApplySiteAddress(bo.getApplySiteAddress());
+            //考点已申报人数
+            Long sitePeopleNum = examApplyMapper.sitePeopleNum(queryTimeBo);
+            String siteTimeJson = examApplyMapper.siteTimeJson(queryTimeBo);
+            if (Validator.isEmpty(siteTimeJson)) {
+                throw new CustomException("考点数据错误");
+            }
+            int num = findPeopleNum(queryTimeBo,siteTimeJson);
+            if(num==-1||num<=sitePeopleNum){
+                throw new CustomException("考点人数已满");
+            }
+        }
+        validEntityBeforeSave(add);
+        add.setSubscribeStatus(1);
+        add.setExamStatus(0);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        add.setExamineeCode(ServletUtils.getEncoded("ZS"+add.getUserId()));
+        this.save(add);
+        //签署疫情防控书
+        UserSubscribeSignReportBo reportBo = new UserSubscribeSignReportBo();
+        reportBo.setSubscribeId(add.getSubscribeId());
+        User user = iUserService.getById(bo.getUserId());
+        reportBo.setUserId(bo.getUserId());
+        reportBo.setPhone(user.getTelphone());
+        reportBo.setIdCard(user.getIdCard());
+        this.signReport(image,reportBo);
+        //发送预约考试消息
+        sendExamSucceed(bo);
+        return add.getSubscribeId();
+    }
+
     private String drawReport(MultipartFile image, UserSubscribeSignReportBo bo){
         Font font = new Font("宋体", Font.BOLD, 48);// 添加字体的属性设置 微软雅黑
         String imgName = null;
@@ -1818,10 +1874,9 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
 
             g.drawString(bo.getApplySiteStartTime(), 668, 3341);
             g.drawString(bo.getMajor(), 673, 3464);
-            g.drawString(bo.getSeatNumber(), 615, 3603);
-            g.drawString(bo.getIdCard(), 730, 3732);
-            g.drawString(bo.getPhone(), 678, 3864);
-            g.drawString(DateUtils.getDate(), 682, 3988);
+            g.drawString(bo.getIdCard(), 729, 3593);
+            g.drawString(bo.getPhone(), 681, 3725);
+            g.drawString(DateUtils.getDate(), 673, 3860);
 
             //用户签名
             ByteArrayInputStream inputStream = new ByteArrayInputStream(image.getBytes());
@@ -1829,7 +1884,7 @@ public class UserSubscribeServiceImpl extends ServiceImpl<UserSubscribeMapper, U
             Image scaledInstance = qrImage.getScaledInstance(304, 251, Image.SCALE_AREA_AVERAGING);
 //
             // 在模板上添加用户签名图片(地址,左边距,上边距,图片宽度,图片高度,未知)
-            g.drawImage(scaledInstance, 636, 4169, 304, 251, null);
+            g.drawImage(scaledInstance, 636, 4046, 304, 251, null);
             // 完成模板修改
             g.dispose();
             //上传OSS

+ 3 - 39
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/IWxLoginService.java

@@ -1,47 +1,9 @@
 package com.zhongzheng.modules.wx.service;
 
 
-import cn.hutool.core.lang.Validator;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.google.zxing.BarcodeFormat;
-import com.google.zxing.client.j2se.MatrixToImageWriter;
-import com.google.zxing.common.BitMatrix;
-import com.google.zxing.qrcode.QRCodeWriter;
-import com.zhongzheng.common.constant.Constants;
-import com.zhongzheng.common.core.redis.RedisCache;
-import com.zhongzheng.common.exception.CustomException;
-import com.zhongzheng.common.utils.*;
-import com.zhongzheng.common.utils.http.HttpUtils;
-import com.zhongzheng.common.utils.ip.IpUtils;
-import com.zhongzheng.modules.alisms.service.IAliSmsService;
 import com.zhongzheng.modules.course.bo.SectionWatchPerBo;
-import com.zhongzheng.modules.course.domain.CourseSectionWatchPer;
-import com.zhongzheng.modules.user.bo.UserWxFollowAddBo;
-import com.zhongzheng.modules.user.domain.User;
-import com.zhongzheng.modules.user.entity.ClientLoginUser;
-import com.zhongzheng.modules.user.mapper.UserMapper;
-import com.zhongzheng.modules.user.service.IUserService;
-import com.zhongzheng.modules.user.service.IUserWxFollowService;
-import com.zhongzheng.modules.wx.bo.TemplatData;
-import com.zhongzheng.modules.wx.bo.WxLoginBody;
-import org.apache.commons.codec.binary.Base64;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
 
-import java.io.ByteArrayOutputStream;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
 import java.util.Map;
-import java.util.concurrent.TimeUnit;
 
 
 public interface IWxLoginService
@@ -62,5 +24,7 @@ public interface IWxLoginService
 
     String sendQdyExamStatusTpMsg(String openId,Map<String,String> paramMap);
 
-    String sendSignatureTpMsg(String openId,Map<String,String> paramMap);
+    String sendSignatureTpMsg(String openId, Map<String,String> paramMap);
+
+    String getActivityApplyCode(Long activityId);
 }

+ 5 - 5
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/impl/WxPayServiceImpl.java

@@ -67,10 +67,7 @@ import com.zhongzheng.modules.user.bo.UserExamGoodsQueryBo;
 import com.zhongzheng.modules.user.bo.UserExamGoodsSupplementAddBo;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.domain.UserExamGoods;
-import com.zhongzheng.modules.user.service.IOrderPossessUserService;
-import com.zhongzheng.modules.user.service.IUserExamGoodsService;
-import com.zhongzheng.modules.user.service.IUserExamGoodsSupplementService;
-import com.zhongzheng.modules.user.service.IUserService;
+import com.zhongzheng.modules.user.service.*;
 import com.zhongzheng.modules.user.vo.UserExamGoodsVo;
 import com.zhongzheng.modules.wx.service.IWxPayService;
 import com.zhongzheng.modules.wx.vo.WxPayVo;
@@ -167,6 +164,8 @@ public class WxPayServiceImpl implements IWxPayService {
     @Autowired
     private IOrderPayService iOrderPayService;
 
+    @Autowired
+    private IUserMockSubscribeService iUserMockSubscribeService;
 
     private String gzh_tokenUrl = "https://api.weixin.qq.com/cgi-bin/token";
 
@@ -404,7 +403,8 @@ public class WxPayServiceImpl implements IWxPayService {
                     joinLockGrade(order.getOrderSn(), g.getGoodsId(), g.getOrderGoodsId());
                     //给用户增加商品考试次数前培次数
                     updateUserExamGoods(g, order);
-
+                    //商品是否绑定活动模考
+                    iUserMockSubscribeService.addActivityMock(g.getGoodsId(),order.getUserId());
                 }
             }
 

+ 22 - 0
zhongzheng-system/src/main/resources/mapper/modules/exam/ExamActivityMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zhongzheng.modules.exam.mapper.ExamActivityMapper">
+
+    <select id="getActivityList" parameterType="com.zhongzheng.modules.exam.bo.ExamActivityQueryBo"
+            resultType="com.zhongzheng.modules.exam.vo.ExamActivityVo">
+        SELECT ea.*,
+               (SELECT su.user_name FROM sys_user su WHERE su.user_id = ea.creator_id) as creatorName
+        FROM exam_activity ea
+        WHERE ea.`status` = 1
+        <if test="name != null and name != ''">
+            AND (ea.name like concat('%', #{name}, '%'))
+        </if>
+    </select>
+
+    <select id="getActivityUserList" parameterType="java.lang.Long"
+            resultType="com.zhongzheng.modules.exam.bo.ExamActivityUserVo">
+        SELECT * FROM exam_activity_user WHERE activity_id = #{activityId}
+    </select>
+</mapper>

+ 1 - 1
zhongzheng-system/src/main/resources/mapper/modules/mock/MockApplyMapper.xml

@@ -189,7 +189,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LEFT JOIN mock_major_subject mms ON mm.mock_major_id = mms.mock_major_id
         LEFT JOIN mock_major_subject_time mmst ON mms.mock_major_subject_id = mmst.id
         LEFT JOIN course_education_type cet ON ma.education_type_id = cet.id
-        WHERE 1=1
+        WHERE 1=1 and ma.mock_activity = 0
         <if test="startTime != null and startTime != ''">
             and mmst.exam_time &gt; #{startTime}
         </if>

+ 12 - 1
zhongzheng-system/src/main/resources/mapper/modules/user/UserMockSubscribeMapper.xml

@@ -228,6 +228,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         WHERE
         ums.subscribe_id =#{subscribeId}
     </select>
-
+    <select id="getMockByGooId" parameterType="java.lang.Long" resultType="com.zhongzheng.modules.user.bo.UserMockSubscribeAddBo">
+        SELECT
+            ma.apply_id as applyId,
+            mms.mock_major_subject_id as mockMajorSubjectId
+        FROM
+            `mock_major_subject_goods` mmg
+                LEFT JOIN mock_major_subject mms ON mmg.mock_major_subject_id = mms.mock_major_subject_id
+                LEFT JOIN mock_major mm ON mms.mock_major_id = mm.mock_major_id
+                LEFT JOIN mock_apply ma ON mm.apply_id = ma.apply_id
+        WHERE
+            mmg.goods_id = #{goodsId} AND ma.mock_activity = 1
+    </select>
 
 </mapper>