he2802 2 år sedan
förälder
incheckning
ed1ebb9f39
74 ändrade filer med 1038 tillägg och 215 borttagningar
  1. 1 1
      Dockerfile
  2. 2 2
      run-prod.sh
  3. 13 23
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/activity/ActivityRecommendController.java
  4. 38 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/bank/QuestionController.java
  5. 11 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  6. 10 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java
  7. 67 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/monitor/SysOperlogController.java
  8. 26 4
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java
  9. 1 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysLoginController.java
  10. 3 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysMenuController.java
  11. 5 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysProfileController.java
  12. 14 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysUserController.java
  13. 47 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/SmsController.java
  14. 16 27
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserController.java
  15. 1 0
      zhongzheng-admin/src/main/resources/application-trial.yml
  16. 1 1
      zhongzheng-admin/src/main/resources/application.yml
  17. BIN
      zhongzheng-admin/src/main/resources/config/1640084970/apiclient_cert.p12
  18. 0 3
      zhongzheng-api/src/main/java/com/zhongzheng/controller/base/LockController.java
  19. 41 6
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonController.java
  20. 9 2
      zhongzheng-api/src/main/java/com/zhongzheng/controller/order/OrderController.java
  21. 41 1
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserController.java
  22. 1 0
      zhongzheng-api/src/main/resources/application-trial.yml
  23. 1 1
      zhongzheng-api/src/main/resources/application.yml
  24. BIN
      zhongzheng-api/src/main/resources/config/1640084970/apiclient_cert.p12
  25. 1 1
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/SysUser.java
  26. 5 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/model/LoginBody.java
  27. 2 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/aspectj/LogAspect.java
  28. 3 2
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineHandler.java
  29. 26 2
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysLoginService.java
  30. 38 18
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java
  31. 32 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java
  32. 4 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/domain/ActivityOrder.java
  33. 3 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/impl/ActivityRecommendServiceImpl.java
  34. 4 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/IQuestionService.java
  35. 133 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java
  36. 25 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionImportContentV3.java
  37. 54 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionImportV3.java
  38. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseService.java
  39. 10 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseProjectTypeServiceImpl.java
  40. 20 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java
  41. 6 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/data/bo/DataWxTpClickAddBo.java
  42. 10 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/data/domain/DataWxTpClick.java
  43. 22 15
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java
  44. 2 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsVo.java
  45. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeUserQueryBo.java
  46. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeUserMapper.java
  47. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeUserService.java
  48. 14 14
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java
  49. 17 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java
  50. 4 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassPeriodSectionVo.java
  51. 16 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassPeriodStudentVo.java
  52. 2 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderAddBo.java
  53. 1 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderService.java
  54. 127 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  55. 5 8
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/IScheduleService.java
  56. 16 37
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java
  57. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/domain/SysLogininfor.java
  58. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/domain/SysOperLog.java
  59. 2 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysOperLogServiceImpl.java
  60. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysUserServiceImpl.java
  61. 5 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysWebServiceImpl.java
  62. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserAddBo.java
  63. 2 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserAppRegisterBo.java
  64. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserEditBo.java
  65. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/User.java
  66. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserVo.java
  67. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/bo/WxLoginBody.java
  68. 6 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/impl/WxPayServiceImpl.java
  69. 2 2
      zhongzheng-system/src/main/resources/mapper/modules/course/CourseChapterSectionMapper.xml
  70. 3 1
      zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeMapper.xml
  71. 37 0
      zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeUserMapper.xml
  72. 0 1
      zhongzheng-system/src/main/resources/mapper/modules/grade/UserPeriodStatusMapper.xml
  73. 1 0
      zhongzheng-system/src/main/resources/mapper/modules/system/SysUserMapper.xml
  74. 1 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserMapper.xml

+ 1 - 1
Dockerfile

@@ -5,7 +5,7 @@ ADD zhongzheng-api.jar /app.jar
 # 声明服务运行在8080端口
 EXPOSE 5055
 # 指定docker容器启动时运行jar包
-ENTRYPOINT ["java", "-jar","/app.jar"]
+ENTRYPOINT ["java", "-jar","-Xms2048m", "-Xmx2048m","/app.jar"]
 # 指定维护者的名字
 MAINTAINER zhongZheng
 

+ 2 - 2
run-prod.sh

@@ -21,8 +21,8 @@ docker run -p 5055:5055 --name ${app_name} \
 --restart=always \
 -e 'spring.profiles.active'=${profile_active} \
 -e TZ="Asia/Shanghai" \
--m 10G \
---cpus=4 \
+-m 10240m \
+--cpus=3 \
 -v /etc/localtime:/etc/localtime \
 -v /usr/share/fonts:/usr/share/fonts \
 -v /data/logs/prod_api:/logs \

+ 13 - 23
zhongzheng-admin/src/main/java/com/zhongzheng/controller/activity/ActivityRecommendController.java

@@ -1,35 +1,25 @@
 package com.zhongzheng.controller.activity;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Arrays;
-
+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.modules.activity.bo.ActivityRecommendAddBo;
 import com.zhongzheng.modules.activity.bo.ActivityRecommendEditBo;
-import com.zhongzheng.modules.activity.bo.ActivityRecommendGoodsEditBo;
 import com.zhongzheng.modules.activity.bo.ActivityRecommendQueryBo;
-import com.zhongzheng.modules.activity.service.IActivityRecommendGoodsService;
 import com.zhongzheng.modules.activity.service.IActivityRecommendService;
 import com.zhongzheng.modules.activity.vo.ActivityRecommendVo;
-import lombok.RequiredArgsConstructor;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.zhongzheng.common.annotation.Log;
-import com.zhongzheng.common.core.controller.BaseController;
-import com.zhongzheng.common.core.domain.AjaxResult;
-import com.zhongzheng.common.enums.BusinessType;
-import com.zhongzheng.common.utils.poi.ExcelUtil;
-import com.zhongzheng.common.core.page.TableDataInfo;
 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.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * 商品推荐Controller

+ 38 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/bank/QuestionController.java

@@ -222,6 +222,44 @@ public class QuestionController extends BaseController {
         return AjaxResult.success(rs);
     }
 
+    @Log(title = "题目管理", businessType = BusinessType.IMPORT)
+    @ApiOperation("导入旧系统题目模板返回数组")
+    @PreAuthorize("@ss.hasPermi('system:question:import')")
+    @PostMapping("/importDataBackFromOldList")
+    public AjaxResult<Map<String, Object>> importDataBackFromOldList(MultipartFile file) throws Exception
+    {
+        List<QuestionImportV3> questionList2 =EasyPoiUtil.importExcel(file,0,1,QuestionImportV3.class);
+
+        ExcelUtil<QuestionImportV3> util = new ExcelUtil<QuestionImportV3>(QuestionImportV3.class);
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String operName = loginUser.getUsername();
+        //只返回数据不插入数据库
+        Map<String, Object> rs = iQuestionService.importExcelQuestionV3NotInBankFromOld(questionList2, false, operName);
+        List<QuestionImportV3> errorList = (List<QuestionImportV3>)rs.get("errorList");
+        List<QuestionAddBo> nqList = (List<QuestionAddBo>)rs.get("questionList");
+        if(Validator.isNotEmpty(errorList)&&errorList.size()>0){
+            List<QuestionImportV3> errorListExport = new ArrayList<>();
+            for(QuestionImportV3 qi : errorList){
+                QuestionImportV3 item = BeanUtil.toBean(qi, QuestionImportV3.class);
+                errorListExport.add(item);
+            }
+            ExcelUtil<QuestionImportV3> util1 = new ExcelUtil<QuestionImportV3>(QuestionImportV3.class);
+            String timeStr= LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+            rs.put("errorExcel",util.exportEasyExcel(util1.exportEasyData(errorListExport), "导出错误数据"+timeStr));
+            rs.remove("errorList");
+        }
+        if(errorList.size()>0&&nqList.size()>0){
+            rs.put("fullStatus","部分成功");
+        }
+        else if(errorList.size()==0){
+            rs.put("fullStatus","全部成功");
+        }
+        else{
+            rs.put("fullStatus","失败");
+        }
+        return AjaxResult.success(rs);
+    }
+
     @Log(title = "导入题目Word模板", businessType = BusinessType.IMPORT)
     @ApiOperation("导入题目Word模板")
     @PreAuthorize("@ss.hasPermi('system:question:import')")

+ 11 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -31,6 +31,7 @@ import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.order.service.IOrderService;
 import com.zhongzheng.modules.system.bo.SysTenantAdminBo;
 import com.zhongzheng.modules.system.domain.SysTenant;
+import com.zhongzheng.modules.system.service.ISysConfigService;
 import com.zhongzheng.modules.system.service.ISysTenantService;
 import com.zhongzheng.modules.system.service.ISysWebService;
 import com.zhongzheng.modules.system.vo.SysTenantVo;
@@ -96,6 +97,8 @@ public class CommonController
     private  ITopSysTenantRegisterService iTopSysTenantRegisterService;
     @Autowired
     private  ISysWebService webService;
+    @Autowired
+    private ISysConfigService configService;
     /**
      * 通用下载请求
      *
@@ -298,7 +301,7 @@ public class CommonController
     public AjaxResult<Void> testGrade()
     {
      //   iClassGradeService.checkEjjjPeopleNumLimit(195L,984L);
-        iUserService.batchUpdateTelId();
+     //   iUserService.batchUpdateTelId();
         return AjaxResult.success();
     }
 
@@ -369,4 +372,11 @@ public class CommonController
         iTopSysTenantRegisterService.test(new TopSysTenantRegisterAddBo());
         return AjaxResult.success();
     }*/
+
+    @ApiOperation("登录双重验证")
+    @GetMapping("common/free/dual_auth")
+    public AjaxResult<String> dual_auth() {
+        String dualAuth = configService.selectConfigByKey("login.dual.auth");
+        return AjaxResult.success("成功",dualAuth);
+    }
 }

+ 10 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java

@@ -233,6 +233,16 @@ public class ClassGradeController extends BaseController {
         return getDataTable(list);
     }
 
+
+    @ApiOperation("查询学员视频学习记录列表")
+    @PreAuthorize("@ss.hasPermi('grade:user:list')")
+    @GetMapping("/listUserVideoRecord")
+    public TableDataInfo<ClassPeriodStudentVo> listUserVideoRecord(ClassGradeUserQueryBo bo) {
+        startPage();
+        List<ClassPeriodStudentVo> list = iClassGradeUserService.listUserVideoRecord(bo);
+        return getDataTable(list);
+    }
+
     /**
      * 查询学时学员记录列表
      */

+ 67 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/monitor/SysOperlogController.java

@@ -0,0 +1,67 @@
+package com.zhongzheng.controller.monitor;
+
+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.system.domain.SysOperLog;
+import com.zhongzheng.modules.system.service.ISysOperLogService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 操作日志记录
+ *
+ * @author zhongzheng
+ */
+@Api(tags ="操作日志记录")
+@RestController
+@RequestMapping("/monitor/operlog")
+public class SysOperlogController extends BaseController
+{
+    @Autowired
+    private ISysOperLogService operLogService;
+
+    @ApiOperation("操作日志分页列表")
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysOperLog operLog)
+    {
+        startPage();
+        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
+        return getDataTable(list);
+    }
+
+    @Log(title = "操作日志", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:export')")
+    @GetMapping("/export")
+    public AjaxResult export(SysOperLog operLog)
+    {
+        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
+        ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class);
+        return util.exportExcel(list, "操作日志");
+    }
+
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
+    @DeleteMapping("/{operIds}")
+    public AjaxResult remove(@PathVariable Long[] operIds)
+    {
+        return toAjax(operLogService.deleteOperLogByIds(operIds));
+    }
+
+    @Log(title = "操作日志", businessType = BusinessType.CLEAN)
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
+    @DeleteMapping("/clean")
+    public AjaxResult clean()
+    {
+        operLogService.cleanOperLog();
+        return AjaxResult.success();
+    }
+}

+ 26 - 4
zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java

@@ -5,21 +5,22 @@ import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.framework.web.service.AsyncService;
 import com.zhongzheng.framework.web.service.WxLoginService;
 import com.zhongzheng.modules.exam.bo.ExamApplyQueryBo;
-import com.zhongzheng.modules.polyv.bo.PolyvLiveQueryBo;
 import com.zhongzheng.modules.polyv.service.IPolyvLiveService;
 import com.zhongzheng.modules.schedule.service.IScheduleService;
 import com.zhongzheng.modules.user.bo.UserQueryBo;
 import com.zhongzheng.modules.user.bo.UserWxFollowQueryBo;
-import com.zhongzheng.modules.user.service.IUserWxFollowService;
 import com.zhongzheng.modules.wx.bo.WxLoginBody;
 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 org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import java.text.ParseException;
+import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -395,4 +396,25 @@ public class ScheduleController extends BaseController {
         return AjaxResult.success();
     }
 
+    @ApiOperation("同步机构商品")
+    @GetMapping("/synchronization/goods")
+    public AjaxResult synchronizationGoods(){
+        //湛江云学堂 972001468256950403
+        //茂名市建设培训学校 680980002459417532
+        //肇庆市建筑业协会 480813706424615769
+//        List<String> tenantIds = Arrays.asList("972001468256950403", "680980002459417532", "480813706424615769");
+        List<String> tenantIds = Arrays.asList("393436084591672437");
+        tenantIds.forEach(tenantId -> {
+            iScheduleService.synchronizationGoodsByTenantId(tenantId);
+        });
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("处理商品关联")
+    @GetMapping("/goods/dispose")
+    public AjaxResult goodsDispose(){
+        iScheduleService.goodsDispose();
+        return AjaxResult.success();
+    }
+
 }

+ 1 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysLoginController.java

@@ -84,7 +84,7 @@ public class SysLoginController
         AjaxResult ajax = AjaxResult.success();
         // 生成令牌
         String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
-                loginBody.getUuid());
+                loginBody.getUuid(),loginBody.getSmsCode(),loginBody.getPhonenumber());
         ajax.put(Constants.TOKEN, token);
         return ajax;
     }

+ 3 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysMenuController.java

@@ -61,7 +61,9 @@ public class SysMenuController extends BaseController
     @GetMapping(value = "/{menuId}")
     public AjaxResult getInfo(@PathVariable Long menuId)
     {
-        return AjaxResult.success(menuService.selectMenuById(menuId));
+        SysMenu sysMenu = menuService.selectMenuById(menuId);
+        sysMenu.setTenantId(null);
+        return AjaxResult.success(sysMenu);
     }
 
     /**

+ 5 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysProfileController.java

@@ -9,8 +9,10 @@ import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.SecurityUtils;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.common.utils.file.FileUploadUtils;
 import com.zhongzheng.framework.web.service.TokenService;
 import com.zhongzheng.modules.system.service.ISysUserService;
@@ -94,6 +96,9 @@ public class SysProfileController extends BaseController
         {
             return AjaxResult.error("修改密码失败,旧密码错误");
         }
+        if(!ToolsUtils.verifPwd(newPassword)){
+            throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
+        }
         if (SecurityUtils.matchesPassword(newPassword, password))
         {
             return AjaxResult.error("新密码不能与旧密码相同");

+ 14 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysUserController.java

@@ -291,4 +291,18 @@ public class SysUserController extends BaseController
         List<SysUser> list = userService.queryBusinessPeopleList(bo);
         return getDataTable(list);
     }
+
+    @ApiOperation("检查密码修改时间")
+    @PreAuthorize("@ss.hasPermi('system:user:list')")
+    @GetMapping("/checkPwdTime")
+    public AjaxResult<Boolean> checkPwdTime()
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        SysUser user = userService.selectUserById(loginUser.getUser().getUserId());
+        boolean needUpdate = false;
+        if(Validator.isNotEmpty(user.getPwdTime())&&(DateUtils.getNowTime().longValue()-user.getPwdTime().longValue())>90*24*3600){
+            needUpdate = true;
+        }
+        return AjaxResult.success(needUpdate);
+    }
 }

+ 47 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/SmsController.java

@@ -0,0 +1,47 @@
+package com.zhongzheng.controller.user;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.modules.alisms.bo.SmsAddBo;
+import com.zhongzheng.modules.alisms.service.IAliSmsService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 客户端用户Controller
+ *
+ * @author hjl
+ * @date 2021-06-08
+ */
+@Api(value = "短信控制器", tags = {"短信控制器"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/app/common/sms")
+public class SmsController extends BaseController {
+
+    private final IAliSmsService iSmsService;
+
+
+    @ApiOperation("获取注册短信")
+    @PostMapping("/register")
+    public AjaxResult register(@RequestBody SmsAddBo bo) {
+        iSmsService.sendRegisterSms(bo.getTel());
+        return AjaxResult.success();
+    }
+
+
+    @ApiOperation("获取登录短信")
+    @PostMapping("/login")
+    public AjaxResult login(@RequestBody SmsAddBo bo) {
+        iSmsService.sendLoginSms(bo.getTel());
+        return AjaxResult.success();
+    }
+
+
+}

+ 16 - 27
zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserController.java

@@ -1,43 +1,32 @@
 package com.zhongzheng.controller.user;
 
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.*;
-
 import cn.afterturn.easypoi.excel.entity.ExportParams;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
-import com.zhongzheng.common.core.domain.entity.SysUser;
-import com.zhongzheng.common.core.domain.model.LoginUser;
-import com.zhongzheng.common.utils.ServletUtils;
-import com.zhongzheng.modules.alisms.service.IAliSmsService;
-import com.zhongzheng.modules.course.vo.CourseSectionImport;
-import com.zhongzheng.modules.grade.vo.ClassPeriodStudentExportVo;
-import com.zhongzheng.modules.user.bo.*;
-import com.zhongzheng.modules.user.service.IUserService;
-import com.zhongzheng.modules.user.vo.*;
-import io.netty.util.internal.ObjectUtil;
-import lombok.RequiredArgsConstructor;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
 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.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.alisms.service.IAliSmsService;
+import com.zhongzheng.modules.user.bo.*;
+import com.zhongzheng.modules.user.service.IUserService;
+import com.zhongzheng.modules.user.vo.UserIdCardBatchVo;
+import com.zhongzheng.modules.user.vo.UserStatstVo;
+import com.zhongzheng.modules.user.vo.UserStudyRecordVo;
+import com.zhongzheng.modules.user.vo.UserVo;
 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 org.springframework.web.multipart.MultipartFile;
 
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
 /**
  * 客户端用户Controller
  *

+ 1 - 0
zhongzheng-admin/src/main/resources/application-trial.yml

@@ -138,6 +138,7 @@ oldStudySys:
     shareCanclePath: https://www.xyyxt.net/witsystem/dataapi/ordercance
     searchGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCount
     pushGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCountAuto
+    educationalInspector: https://zs.gdzzkj.net/EduSystem/BusinessApi/NewYxtUserPrompt
     classUserListPath: https://www.xyyxt.net/System/BussinessApi/UserCourseCategoryListcno
     classOpenPath: https://www.xyyxt.net/System/BussinessApi/OpenClass
 

+ 1 - 1
zhongzheng-admin/src/main/resources/application.yml

@@ -261,7 +261,7 @@ tencent:
 
 aliyun:
   sms:
-    signName: 祥粤学校
+    signName: 中正科技
     registerTemplateCode: SMS_228670004
     loginTemplateCode: SMS_228670005
     forgetTemplateCode: SMS_228685033

BIN
zhongzheng-admin/src/main/resources/config/1640084970/apiclient_cert.p12


+ 0 - 3
zhongzheng-api/src/main/java/com/zhongzheng/controller/base/LockController.java

@@ -45,7 +45,6 @@ public class LockController extends BaseController {
      */
     @ApiOperation("锁定行为")
     @PreAuthorize("@ss.hasPermi('grade:grade:edit')")
-    @Log(title = "锁定行为", businessType = BusinessType.UPDATE)
     @PostMapping("/lockAction")
     public AjaxResult<Void> lockAction(@Validated @RequestBody ActionLockQueryBo bo) {
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
@@ -59,7 +58,6 @@ public class LockController extends BaseController {
      */
     @ApiOperation("查看行为锁定状态")
     @PreAuthorize("@ss.hasPermi('grade:grade:edit')")
-    @Log(title = "查看行为锁定状态", businessType = BusinessType.UPDATE)
     @PostMapping("/lockStatus")
     public AjaxResult<Void> lockStatus(@RequestBody ActionLockQueryBo bo) {
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
@@ -78,7 +76,6 @@ public class LockController extends BaseController {
      */
     @ApiOperation("删除锁定状态")
     @PreAuthorize("@ss.hasPermi('grade:grade:edit')")
-    @Log(title = "删除锁定状态", businessType = BusinessType.UPDATE)
     @PostMapping("/delLock")
     public AjaxResult delLock(@RequestBody ActionLockQueryBo bo) {
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());

+ 41 - 6
zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonController.java

@@ -1,11 +1,11 @@
 package com.zhongzheng.controller.cmmon;
 
 import cn.hutool.core.lang.Validator;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 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.core.redis.RedisCache;
+import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.framework.web.service.WxLoginService;
@@ -17,10 +17,8 @@ import com.zhongzheng.modules.course.service.ICourseTopicService;
 import com.zhongzheng.modules.course.vo.CourseTopicGoodsVo;
 import com.zhongzheng.modules.course.vo.CourseTopicVo;
 import com.zhongzheng.modules.course.vo.CourseUserVo;
-import com.zhongzheng.modules.exam.bo.ExamActivityApplyBo;
-import com.zhongzheng.modules.exam.bo.ExamActivityApplyVo;
-import com.zhongzheng.modules.exam.service.IExamActivityService;
-import com.zhongzheng.modules.exam.vo.ExamActivityVo;
+import com.zhongzheng.modules.data.domain.DataWxTpClick;
+import com.zhongzheng.modules.data.service.IDataWxTpClickService;
 import com.zhongzheng.modules.goods.service.IGoodsSpecTemplateService;
 import com.zhongzheng.modules.goods.vo.GoodsSpecTemplateVo;
 import com.zhongzheng.modules.goods.vo.GoodsUserVo;
@@ -29,7 +27,6 @@ import com.zhongzheng.modules.order.domain.Printer;
 import com.zhongzheng.modules.system.bo.SysTenantQueryBo;
 import com.zhongzheng.modules.system.service.ISysConfigService;
 import com.zhongzheng.modules.system.service.ISysTenantService;
-import com.zhongzheng.modules.system.service.ISysWebService;
 import com.zhongzheng.modules.wx.bo.WxInfoBo;
 import com.zhongzheng.modules.wx.bo.WxInfoQuery;
 import com.zhongzheng.modules.wx.bo.WxServerBody;
@@ -74,6 +71,8 @@ public class CommonController extends BaseController {
 
     private final ISysTenantService iSysTenantService;
 
+    private final IDataWxTpClickService iDataWxTpClickService;
+
     /**
      * 获取微信小程序信息(网页跳转小程序)
      */
@@ -175,6 +174,17 @@ public class CommonController extends BaseController {
         return AjaxResult.success(map);
     }
 
+    @ApiOperation("获取微信参数")
+    @GetMapping("/wx/config")
+    public AjaxResult<Map<String,Object>> wxConfig() {
+        Map<String,Object> map = new HashMap<>();
+        String smallAppId = configService.selectConfigByKey("wx.small.appid");
+        String gzhAppId = configService.selectConfigByKey("wx.gzh.appid");
+        map.put("smallAppId",smallAppId);
+        map.put("gzhAppId",gzhAppId);
+        return AjaxResult.success(map);
+    }
+
     @ApiOperation("登录双重验证")
     @GetMapping("/dual_auth")
     public AjaxResult<String> dual_auth() {
@@ -272,4 +282,29 @@ public class CommonController extends BaseController {
     }
 
 
+    /**
+     * 领取题库活动校验
+     */
+    @ApiOperation("领取题库活动校验")
+    @GetMapping("/check")
+    public AjaxResult<Void> checkTime() {
+        return toAjax(iCourseService.checkTime()? 1 : 0);
+    }
+
+    /**
+     * 领取题库活动记录
+     */
+    @ApiOperation("领取题库活动记录")
+    @GetMapping("/save/activity/record/{crowdType}")
+    public AjaxResult<Void> saveActivityRecord(@PathVariable("crowdType") Integer crowdType) {
+        DataWxTpClick dataWxTpClick = new DataWxTpClick();
+        dataWxTpClick.setCrowdType(crowdType);
+        dataWxTpClick.setCreateTime(DateUtils.getNowTime());
+        dataWxTpClick.setType(2);
+        dataWxTpClick.setStatus(1);
+        dataWxTpClick.setInformId(0L);
+        dataWxTpClick.setUpdateTime(DateUtils.getNowTime());
+        return toAjax(iDataWxTpClickService.save(dataWxTpClick)? 1 : 0);
+    }
+
 }

+ 9 - 2
zhongzheng-api/src/main/java/com/zhongzheng/controller/order/OrderController.java

@@ -5,7 +5,6 @@ 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.SecurityUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.framework.web.service.WxTokenService;
 import com.zhongzheng.modules.base.vo.BaseFilterVo;
@@ -16,7 +15,6 @@ import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.order.service.IOrderService;
 import com.zhongzheng.modules.order.vo.OrderGoodsVo;
 import com.zhongzheng.modules.order.vo.OrderListVo;
-import com.zhongzheng.modules.order.vo.OrderVo;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -110,6 +108,15 @@ public class OrderController extends BaseController {
         return AjaxResult.success(iOrderService.placeGzhOrder(bo));
     }
 
+    @ApiOperation("领取活动商品")
+    @PostMapping("/activity/goods")
+    public AjaxResult getActivityGoods(@RequestBody OrderAddBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iOrderService.getActivityGoods(bo));
+    }
+
+
     @ApiOperation("继续支付小程序订单")
     @PostMapping("/resumeSmallOrder")
     public AjaxResult resumeSmallOrder(@RequestBody OrderAddBo bo) {

+ 41 - 1
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserController.java

@@ -4,8 +4,12 @@ import cn.hutool.core.lang.Validator;
 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.domain.entity.SysUser;
+import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.WxLoginService;
 import com.zhongzheng.framework.web.service.WxTokenService;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.domain.UserWxFollow;
@@ -15,10 +19,12 @@ import com.zhongzheng.modules.user.service.IUserVisitLogService;
 import com.zhongzheng.modules.user.service.IUserWxFollowService;
 import com.zhongzheng.modules.user.vo.RanKingUser;
 import com.zhongzheng.modules.user.vo.UserVo;
+import com.zhongzheng.modules.wx.bo.WxLoginBody;
 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.HashMap;
@@ -44,7 +50,7 @@ public class UserController extends BaseController {
 
     private final IUserVisitLogService iUserVisitLogService;
 
-
+    private final WxLoginService wxLoginService;
     /**
      * 修改客户端用户
      */
@@ -139,4 +145,38 @@ public class UserController extends BaseController {
         bo.setUserId(loginUser.getUser().getUserId());
         return toAjax(iUserService.editShareActivityCode(bo) ? 1 : 0);
     }
+
+    @ApiOperation("检查密码修改时间")
+    @PreAuthorize("@ss.hasPermi('system:user:list')")
+    @GetMapping("/checkPwdTime")
+    public AjaxResult<Boolean> checkPwdTime()
+    {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        UserVo userVo = iUserService.queryById(loginUser.getUser().getUserId());
+        boolean needUpdate = false;
+        if(Validator.isNotEmpty(userVo.getPwdTime())&&(DateUtils.getNowTime().longValue()-userVo.getPwdTime().longValue())>90*24*3600){
+            needUpdate = true;
+        }
+        return AjaxResult.success(needUpdate);
+    }
+
+    @ApiOperation("购买前获取公众号openid")
+    @PostMapping("/gzh_bind")
+    public AjaxResult gzh_bind(@RequestBody WxLoginBody loginBody)
+    {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        loginBody.setUserId(loginUser.getUser().getUserId());
+        wxLoginService.bindWxGzhUnionIdUser(loginBody);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("检查是否绑定公众号")
+    @PreAuthorize("@ss.hasPermi('system:user:list')")
+    @GetMapping("/checkBindGzh")
+    public AjaxResult<String> checkBindGzh()
+    {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        UserVo userVo = iUserService.queryById(loginUser.getUser().getUserId());
+        return AjaxResult.success("成功",userVo.getGzhOpenId());
+    }
 }

+ 1 - 0
zhongzheng-api/src/main/resources/application-trial.yml

@@ -150,6 +150,7 @@ oldStudySys:
     shareCanclePath: https://www.xyyxt.net/witsystem/dataapi/ordercance
     searchGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCount
     pushGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCountAuto
+    educationalInspector: https://zs.gdzzkj.net/EduSystem/BusinessApi/NewYxtUserPrompt
     classUserListPath: https://www.xyyxt.net/System/BussinessApi/UserCourseCategoryListcno
     classOpenPath: https://www.xyyxt.net/System/BussinessApi/OpenClass
 

+ 1 - 1
zhongzheng-api/src/main/resources/application.yml

@@ -256,7 +256,7 @@ tencent:
 
 aliyun:
   sms:
-    signName: 祥粤学校
+    signName: 中正科技
     registerTemplateCode: SMS_228670004
     loginTemplateCode: SMS_228670005
     forgetTemplateCode: SMS_228685033

BIN
zhongzheng-api/src/main/resources/config/1640084970/apiclient_cert.p12


+ 1 - 1
zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/SysUser.java

@@ -165,10 +165,10 @@ public class SysUser implements Serializable
     private String preLoginIp;
     /** 上一次登录时间 */
     private Date preLoginDate;
-
     /** 密码最后修改时间 */
     private Long pwdTime;
 
+
     public SysUser(Long userId)
     {
         this.userId = userId;

+ 5 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/model/LoginBody.java

@@ -40,4 +40,9 @@ public class LoginBody
     @ApiModelProperty(value ="验证码uuid",required = true)
     private String uuid = "";
 
+    @ApiModelProperty(value ="短信验证码")
+    private String smsCode;
+
+    @ApiModelProperty(value ="手机号码")
+    private String phonenumber;
 }

+ 2 - 1
zhongzheng-framework/src/main/java/com/zhongzheng/framework/aspectj/LogAspect.java

@@ -118,6 +118,7 @@ public class LogAspect
                     {
                         username = loginUser.getUser().getUserAccount();
                     }
+                    return ;
                 }
             }else{
                 TopLoginUser topLoginUser = SpringUtils.getBean(TopTokenService.class).getLoginUser(ServletUtils.getRequest());
@@ -139,7 +140,6 @@ public class LogAspect
 
             operLog.setOperUrl(ServletUtils.getRequest().getRequestURI());
             operLog.setOperName(username);
-
             if (e != null)
             {
                 operLog.setStatus(BusinessStatus.FAIL.ordinal());
@@ -149,6 +149,7 @@ public class LogAspect
             String className = joinPoint.getTarget().getClass().getName();
             String methodName = joinPoint.getSignature().getName();
             operLog.setMethod(className + "." + methodName + "()");
+            operLog.setTenantId(Long.parseLong(ServletUtils.getRequest().getHeader("TenantId")));
             // 设置请求方式
             operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
             // 处理设置注解上的参数

+ 3 - 2
zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineHandler.java

@@ -1,5 +1,6 @@
 package com.zhongzheng.framework.mybatisplus;
 
+import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpStatus;
 import com.alibaba.fastjson.JSON;
@@ -55,10 +56,10 @@ public class CustomTenantLineHandler implements TenantLineHandler {
     @Override
     public Expression getTenantId() {
         String TenantId = ServletUtils.getRequest().getHeader("TenantId");
-        if(!StrUtil.isNotBlank(TenantId)||TenantId==null){
+        if(Validator.isEmpty(TenantId)){
             TenantId = ServletUtils.getResponse().getHeader("TenantId");
             if(enabledTenant){
-                if(!StrUtil.isNotBlank(TenantId)||TenantId==null){
+                if(Validator.isEmpty(TenantId)){
                     int code = HttpStatus.HTTP_UNAVAILABLE;
                     String msg = "企业非法访问";
                     ServletUtils.renderString( ServletUtils.getResponse(), JSON.toJSONString(AjaxResult.error(code, msg)));

+ 26 - 2
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysLoginService.java

@@ -8,10 +8,12 @@ import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.domain.model.LoginBody;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.framework.manager.factory.AsyncFactory;
+import com.zhongzheng.modules.system.service.ISysConfigService;
 import com.zhongzheng.modules.system.service.ISysUserService;
 import com.zhongzheng.common.utils.AES;
 import com.zhongzheng.framework.manager.factory.AsyncFactory;
 import com.zhongzheng.modules.user.bo.UserBusinessLoginBo;
+import com.zhongzheng.modules.user.service.IUserLoginErrorService;
 import org.apache.commons.compress.utils.IOUtils;
 import org.bouncycastle.jcajce.provider.asymmetric.rsa.RSAUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -53,8 +55,11 @@ public class SysLoginService
     @Autowired
     private ISysUserService iSysUserService;
 
+    @Autowired
+    private ISysConfigService configService;
 
-
+    @Autowired
+    private IUserLoginErrorService iUserLoginErrorService;
     /**
      * 登录验证
      *
@@ -64,7 +69,7 @@ public class SysLoginService
      * @param uuid 唯一标识
      * @return 结果
      */
-    public String login(String username, String password, String code, String uuid)
+    public String login(String username, String password, String code, String uuid,String smsCode,String tel)
     {
         String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
         String captcha = redisCache.getCacheObject(verifyKey);
@@ -79,6 +84,7 @@ public class SysLoginService
             AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
             throw new CaptchaException();
         }
+        iUserLoginErrorService.checkLimit(username);
         // 用户验证
         Authentication authentication = null;
         try
@@ -101,6 +107,7 @@ public class SysLoginService
         }
         catch (Exception e)
         {
+            iUserLoginErrorService.saveErrorLog(username);
             if (e instanceof BadCredentialsException)
             {
                 AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
@@ -115,6 +122,23 @@ public class SysLoginService
         AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
         LoginUser loginUser = (LoginUser) authentication.getPrincipal();
         SysUser user = iSysUserService.updateLoginTimeIp(loginUser.getUser().getUserId());
+        String dualAuth = configService.selectConfigByKey("login.dual.auth");
+        if(Validator.isNotEmpty(dualAuth)&&dualAuth.equals("1")){
+            if(Validator.isEmpty(tel)){
+                throw new CustomException("手机号码不能为空");
+            }
+            String key = Constants.LOGIN_SMS + tel;
+            String localSmsCode =  redisCache.getCacheObject(key);
+            if(smsCode==null){
+                throw new CustomException("验证码不能为空");
+            }
+            if(!localSmsCode.equals(smsCode)){
+                throw new CustomException("验证码错误");
+            }
+            if(!tel.equals(user.getPhonenumber())){
+                throw new CustomException("手机号码和登录账号不匹配");
+            }
+        }
         loginUser.setUser(user);
         // 生成token
         return tokenService.createToken(loginUser);

+ 38 - 18
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java

@@ -625,12 +625,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         if(bo.getTel().length()!=11){
             throw new CustomException("手机号格式错误");
         }
-        if(bo.getIdcard()==null){
-            throw new CustomException("身份证不能为空");
-        }
-        if(bo.getIdcard().length()!=18){
-            throw new CustomException("身份证格式错误");
-        }
+//        if(bo.getIdcard()==null){
+//            throw new CustomException("身份证不能为空");
+//        }
+//        if(bo.getIdcard().length()!=18){
+//            throw new CustomException("身份证格式错误");
+//        }
 //        if(bo.getRealname()==null){
 //            throw new CustomException("真实姓名不能为空");
 //        }
@@ -654,7 +654,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         SnowflakeIdUtils idWorker = new SnowflakeIdUtils(3, 1);
         inertData.setUserAccount(String.valueOf(idWorker.nextId()));
         inertData.setSex(1);
-        inertData.setIdCard(bo.getIdcard());
+        if (ObjectUtils.isNotNull(bo.getIdcard())){
+            inertData.setIdCard(bo.getIdcard());
+        }
         inertData.setRealname(bo.getRealname());
         inertData.setStatus(1);
         inertData.setRegisterPlat(bo.getRegisterPlat());
@@ -665,7 +667,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         inertData.setCreateTime(DateUtils.getNowTime());
         inertData.setUpdateTime(DateUtils.getNowTime());
 //        String pwd =  ToolsUtils.getSmsCode(); // 随机密码
-        String pwd =  bo.getIdcard().substring(bo.getIdcard().length() - 6);
+        String pwd = "";
+        if (ObjectUtils.isNotNull(bo.getIdcard())){
+            pwd =  bo.getIdcard().substring(bo.getIdcard().length() - 6);
+        }else {
+            pwd =  bo.getTel().substring(bo.getTel().length() - 6);
+        }
         inertData.setPassword(SecurityUtils.encryptPassword(pwd));
         if(!save(inertData)){
             throw new CustomException("注册失败");
@@ -676,7 +683,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
 
     @Override
     public Boolean registerUser(UserAppRegisterBo bo) {
-        if(StringUtils.isBlank(bo.getIdcard())){
+        if(StringUtils.isBlank(bo.getIdcard()) &&(ObjectUtils.isNull(bo.getIsActivity()) || bo.getIsActivity() == 0)){
             throw new CustomException("身份证不能为空");
         }
         if(bo.getTel()==null){
@@ -701,10 +708,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         if(Validator.isNotNull(user)){
             throw new CustomException("该手机号已注册");
         }
-        User userIdCard = getOne(new LambdaQueryWrapper<User>()
-                .eq(User::getIdCard,EncryptHandler.encrypt(bo.getIdcard())).last("limit 1"));
-        if(Validator.isNotNull(userIdCard)){
-            throw new CustomException("该身份证已注册");
+        if (ObjectUtils.isNull(bo.getIsActivity()) || bo.getIsActivity() == 0){
+            User userIdCard = getOne(new LambdaQueryWrapper<User>()
+                    .eq(User::getIdCard,EncryptHandler.encrypt(bo.getIdcard())).last("limit 1"));
+            if(Validator.isNotNull(userIdCard)){
+                throw new CustomException("该身份证已注册");
+            }
         }
         User inertData = new User();
         inertData.setTelphone(bo.getTel());
@@ -868,7 +877,11 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         {
             throw new BaseException("新密码格式错误");
         }
+        if(!ToolsUtils.verifPwd(bo.getNewPwd())){
+            throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
+        }
         user.setPassword(SecurityUtils.encryptPassword(bo.getNewPwd()));
+        user.setPwdTime(DateUtils.getNowTime());
         user.setUpdateTime(DateUtils.getNowTime());
         updateById(user);
         return true;
@@ -881,9 +894,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
             if(Validator.isEmpty(bo.getTelphone())){
                 throw new CustomException("用户手机号码缺失");
             }
-            if(Validator.isEmpty(bo.getIdCard())){
-                throw new CustomException("用户身份证号码缺失");
-            }
+//            if(Validator.isEmpty(bo.getIdCard())){
+//                throw new CustomException("用户身份证号码缺失");
+//            }
             User user1 = getOne(new LambdaQueryWrapper<User>()
                     .eq(User::getTelphone,EncryptHandler.encrypt(bo.getTelphone())).last("limit 1"));
             //手机号码存在
@@ -894,7 +907,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
                 }
                 if(Validator.isEmpty(user1.getIdCard())){
                     //更新身份证和姓名
-                    user1.setIdCard(bo.getIdCard());
+                    if (ObjectUtil.isNotNull(bo.getIdCard())){
+                        user1.setIdCard(bo.getIdCard());
+                    }
                     user1.setRealname(bo.getRealname());
                     updateById(user1);
                 }
@@ -931,6 +946,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         if (ObjectUtils.isNotNull(bo.getShareActivityCode())){
             return update(new LambdaUpdateWrapper<User>()
             .eq(User::getUserId,bo.getUserId())
+            .set(User::getUpdateTime,DateUtils.getNowTime())
             .set(User::getShareActivityCode,bo.getShareActivityCode()));
         }
         return false;
@@ -1004,7 +1020,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
                 queryBo.setTelphone(EncryptHandler.encrypt(item.getTelphone()));
             }
             if(isUpdate){
-           //     baseMapper.editUserInfo(queryBo);
+                baseMapper.editUserInfo(queryBo);
             }
         });
     }
@@ -1040,6 +1056,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         if(bo.getPwd()==null){
             throw new CustomException("密码不能为空");
         }
+        if(!ToolsUtils.verifPwd(bo.getPwd())){
+            throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
+        }
         String key = Constants.FORGET_SMS + bo.getTel();
         String code =  redisCache.getCacheObject(key);
         if(code==null){
@@ -1055,6 +1074,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
             throw new CustomException("该手机号未注册");
         }
         user.setPassword(SecurityUtils.encryptPassword(bo.getPwd()));
+        user.setPwdTime(DateUtils.getNowTime());
         user.setUpdateTime(DateUtils.getNowTime());
         return userService.updateById(user);
     }

+ 32 - 1
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java

@@ -27,6 +27,7 @@ import com.zhongzheng.modules.course.bo.SectionWatchPerBo;
 import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
+import com.zhongzheng.modules.order.domain.Order;
 import com.zhongzheng.modules.system.service.ISysConfigService;
 import com.zhongzheng.modules.user.bo.UserWxFollowAddBo;
 import com.zhongzheng.modules.user.domain.User;
@@ -1206,7 +1207,6 @@ public class WxLoginService implements IWxLoginService {
         initData();
         String param = String.format(gzh_wxAuthParam, gzh_appid, gzh_appsrcret, loginBody.getCode());
         String resultString = HttpUtils.sendGet(gzh_wxAuthUrl, param);
-        System.out.println(resultString);
         //解析json
         JSONObject jsonObject = (JSONObject) JSONObject.parse(resultString);
         String access_token = String.valueOf(jsonObject.get("access_token"));
@@ -1232,6 +1232,37 @@ public class WxLoginService implements IWxLoginService {
         return user;
     }
 
+    //公众号获取用户信息
+    public User bindWxGzhUnionIdUser(WxLoginBody loginBody) {
+        initData();
+        String param = String.format(gzh_wxAuthParam, gzh_appid, gzh_appsrcret, loginBody.getCode());
+        String resultString = HttpUtils.sendGet(gzh_wxAuthUrl, param);
+        //解析json
+        JSONObject jsonObject = (JSONObject) JSONObject.parse(resultString);
+        String access_token = String.valueOf(jsonObject.get("access_token"));
+        if(access_token.equals("null")){
+            throw new CustomException( String.valueOf(jsonObject.get("errmsg")));
+        }
+        String openId = String.valueOf(jsonObject.get("openid"));
+
+        String userInfoParam = String.format(gzh_wxUserInfoParam, access_token, openId);
+        String userInfoResultString = HttpUtils.sendGet(gzh_wxUserInfoUrl, userInfoParam);
+
+        //解析json
+        JSONObject jsonObject1 = (JSONObject) JSONObject.parse(userInfoResultString);
+        String unionId = String.valueOf(jsonObject1.get("unionid"));
+        User user = iUserService.getOne(new LambdaQueryWrapper<User>().eq(User::getUserId,loginBody.getUserId()));
+        if (user == null) {
+            throw new CustomException("您尚未注册,请前往小程序注册");
+        }
+        if (Validator.isEmpty(user.getGzhOpenId())) {
+            user.setGzhOpenId(openId);
+            user.setUnionId(unionId);
+            iUserService.updateById(user);
+        }
+        return user;
+    }
+
     public String obtainWxPhone(String iv, String encryptedData, String session_key) {
         String userInfo = null;
         JSONObject userInfoJSON = null;

+ 4 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/domain/ActivityOrder.java

@@ -1,7 +1,5 @@
 package com.zhongzheng.modules.activity.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;
@@ -30,6 +28,10 @@ private static final long serialVersionUID=1L;
     private Integer type;
     /** 订单编号 */
     private String orderSn;
+    /** 用户ID */
+    private Long userId;
+    /** 商品ID */
+    private Long goodsId;
     /** 备注 */
     private Integer status;
     /** 1有效 0无效 */

+ 3 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/impl/ActivityRecommendServiceImpl.java

@@ -3,13 +3,13 @@ package com.zhongzheng.modules.activity.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.Page;
 import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.modules.activity.bo.*;
 import com.zhongzheng.modules.activity.domain.ActivityRecommend;
@@ -24,16 +24,16 @@ import com.zhongzheng.modules.course.service.ICourseSubjectService;
 import com.zhongzheng.modules.course.vo.CourseSubjectVo;
 import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.domain.GoodsSpecAttributeRelation;
-import com.zhongzheng.modules.goods.domain.GoodsSpecTemplate;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.service.IGoodsSpecAttributeRelationService;
 import com.zhongzheng.modules.goods.service.IGoodsSpecTemplateService;
-import com.zhongzheng.modules.goods.vo.GoodsVo;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 

+ 4 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/IQuestionService.java

@@ -8,10 +8,7 @@ import com.zhongzheng.modules.bank.bo.QuestionBatchDelBo;
 import com.zhongzheng.modules.bank.bo.QuestionEditBo;
 import com.zhongzheng.modules.bank.bo.QuestionQueryBo;
 import com.zhongzheng.modules.bank.domain.Question;
-import com.zhongzheng.modules.bank.vo.ExamVo;
-import com.zhongzheng.modules.bank.vo.QuestionImport;
-import com.zhongzheng.modules.bank.vo.QuestionImportV2;
-import com.zhongzheng.modules.bank.vo.QuestionVo;
+import com.zhongzheng.modules.bank.vo.*;
 import com.zhongzheng.modules.goods.bo.*;
 import com.zhongzheng.modules.goods.vo.BankGoodsExamVo;
 import com.zhongzheng.modules.goods.vo.GoodsExamTimeVo;
@@ -79,6 +76,9 @@ public interface IQuestionService extends IService<Question> {
 
 	Map<String,Object> importExcelQuestionV2NotInBank(List<QuestionImportV2> questionList, Boolean isUpdateSupport, String operName);
 
+
+	Map<String,Object> importExcelQuestionV3NotInBankFromOld(List<QuestionImportV3> questionList, Boolean isUpdateSupport, String operName);
+
     List<GoodsUserQuestionVo> listGoodsUserQuestionVo(GoodsQueryBo bo);
 
     String importWordQuestion(MultipartFile file, Long eduId, Long projectId, Long businessId, Long subjectId);

+ 133 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java

@@ -29,10 +29,7 @@ import com.zhongzheng.modules.bank.service.IExamQuestionService;
 import com.zhongzheng.modules.bank.service.IExamService;
 import com.zhongzheng.modules.bank.service.IQuestionBusinessService;
 import com.zhongzheng.modules.bank.service.IQuestionService;
-import com.zhongzheng.modules.bank.vo.QuestionImport;
-import com.zhongzheng.modules.bank.vo.QuestionImportContent;
-import com.zhongzheng.modules.bank.vo.QuestionImportV2;
-import com.zhongzheng.modules.bank.vo.QuestionVo;
+import com.zhongzheng.modules.bank.vo.*;
 import com.zhongzheng.modules.course.domain.CourseBusiness;
 import com.zhongzheng.modules.course.domain.CourseEducationType;
 import com.zhongzheng.modules.course.domain.CourseProjectType;
@@ -855,6 +852,88 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         return map;
     }
 
+    @Override
+    public Map<String, Object> importExcelQuestionV3NotInBankFromOld(List<QuestionImportV3> questionList, Boolean isUpdateSupport, String operName) {
+        System.out.println(questionList);
+        Map<String, Object> map = new HashMap<>();
+        if (Validator.isNull(questionList) || questionList.size() == 0) {
+            throw new CustomException("导入数据不能为空!");
+        }
+        String errorLog = "";
+        String importNo = ServletUtils.getEncoded("IMPORT");
+        int i = 10;
+        Long nowTime = DateUtils.getNowTime();
+        List<QuestionImportV3> errorList = new ArrayList<>();
+        //案例附属题数组
+        List<QuestionAddBo> attList = new ArrayList<>();
+        List<QuestionAddBo> nqList = new ArrayList<>();
+        boolean isAnLi = false; // 是否案例题
+        Map<String,Object> idMap = new HashMap<>();
+        int startIndex = 0;
+        for (QuestionImportV3 question : questionList) {
+            boolean hasError = false;
+            QuestionAddBo bo = new QuestionAddBo();
+            Integer type = null; //题目类型
+            boolean isFirst = true;
+            type = findTypeV3(question.getType());
+            if(!idMap.containsKey(question.getId())){
+                idMap.put(question.getId(),question.getId());
+                //题目主体
+                bo.setType(type);
+                bo.setContent(question.getContent());
+                bo.setAnalysisContent(question.getAnalysisContent());
+                if(Validator.isEmpty(type)){
+                    question.setCause("题目类型错误");
+                    errorList.add(question);
+                    hasError = true;
+                    break;
+                }
+                if(type==1||type==2){ //单选或多选
+                    Map<String,Object> rs = getOptionsListV3(startIndex,questionList,type);
+                    bo.setOptionsList((List<QuestionChildAddBo>)rs.get("optionsList"));
+                    bo.setAnswerQuestion((String) rs.get("answerStr"));
+                }
+                if(type==3){ //判断题
+                    if(question.getOption().equals("正确")&&question.getAnswer().equals("是")){
+                        bo.setAnswerQuestion("1");
+                    }
+                    else if(question.getOption().equals("错误")&&question.getAnswer().equals("否")){
+                        bo.setAnswerQuestion("1");
+                    }
+                    else{
+                        bo.setAnswerQuestion("0");
+                    }
+                }
+                if(type==4){
+                    isAnLi = true;
+                }
+                if(hasError){
+                    continue;
+                }
+                if(isAnLi){
+                    bo.setJsonStr(JSON.toJSONString(attList));
+                }
+                bo.setStatus(1);
+                bo.setPrefixName(question.getPrefixName());
+                bo.setCreateBy(operName);
+                bo.setImportNo(importNo);
+                bo.setPublishStatus(1);
+                bo.setImportSort(nowTime + i); //导入时间从小到大排
+                bo.setCreateTime(nowTime); //从大到小排
+                nqList.add(bo);
+                attList.clear();
+                isFirst = true;
+                isAnLi = false;
+                i++;
+
+            }
+            startIndex++;
+        }
+        map.put("errorList",errorList);
+        map.put("questionList",nqList);
+        return map;
+    }
+
     private Map<String,Object> getOptionsList(int startIndex,List<QuestionImportContent> list,int type){
         Map<String,Object> map = new HashMap<>();
         String answerQuestion = "";
@@ -889,6 +968,41 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         return map;
     }
 
+    private Map<String,Object> getOptionsListV3(int startIndex,List<QuestionImportV3> list,int type){
+        Map<String,Object> map = new HashMap<>();
+        String answerQuestion = "";
+        List<QuestionChildAddBo> optionsList = new ArrayList<>(); //题目选项
+        List<Long> answerList = new ArrayList<>(); //答案选项
+        Long j = 1L;
+        String tempTxt = list.get(startIndex).getContent();
+        for(int i = startIndex;i<list.size();i++){
+            QuestionImportV3 entity = list.get(i);
+            if(Validator.isNotEmpty(entity.getContent())&&i>startIndex){
+                if(!tempTxt.equals(entity.getContent())){
+                    break;
+                }
+            }
+            if(Validator.isEmpty(entity.getOption())){
+                continue;
+            }
+            QuestionChildAddBo addBo = new QuestionChildAddBo();
+            addBo.setContent(entity.getOption());
+            addBo.setOptionsId(j);
+            optionsList.add(addBo);
+            if("是".equals(entity.getAnswer())){
+                answerList.add(j);
+                /*if(type==1){ //单选
+                    break;
+                }*/
+            }
+            j++;
+        }
+        map.put("optionsList",optionsList);
+        map.put("answerStr",ToolsUtils.join(",", answerList));
+        return map;
+    }
+
+
     @Override
     public List<GoodsUserQuestionVo> listGoodsUserQuestionVo(GoodsQueryBo bo) {
         return baseMapper.listGoodsUserQuestionVo(bo);
@@ -2239,6 +2353,21 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         return null;
     }
 
+    public Integer findTypeV3(String type) {
+        if ("单选题".equals(type)) {
+            return 1;
+        } else if ("多选题".equals(type)) {
+            return 2;
+        } else if ("判断题".equals(type)) {
+            return 3;
+        } else if ("问答题".equals(type)) {
+            return 5;
+        } else if ("案例题".equals(type)) {
+            return 4;
+        }
+        return null;
+    }
+
 
     private String dealImportAnswer(String Answer) {
         String[] itemArray = Answer.split("");

+ 25 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionImportContentV3.java

@@ -0,0 +1,25 @@
+package com.zhongzheng.modules.bank.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+
+/**
+ * 题库题目添加对象 question
+ *
+ * @author hjl
+ * @date 2021-10-22
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class QuestionImportContentV3 implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+
+}

+ 54 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionImportV3.java

@@ -0,0 +1,54 @@
+package com.zhongzheng.modules.bank.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
+import com.zhongzheng.modules.bank.bo.QuestionBusinessAddBo;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 题库题目添加对象 question
+ *
+ * @author hjl
+ * @date 2021-10-22
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class QuestionImportV3 implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 前缀名称 */
+    @Excel(name = "指标名称")
+    private String prefixName;
+
+    /** 题目正文 */
+    @Excel(name = "*题目内容")
+    private String content;
+
+    @Excel(name = "*题型")
+    private String type;
+
+    @Excel(name = "描述")
+    private String analysisContent;
+
+    @Excel(name = "*题目选项")
+    private String option;
+
+    @Excel(name = "*是否正确选项")
+    private String answer;
+
+    @Excel(name = "失败原因")
+    private String cause;
+
+    @Excel(name = "编号")
+    private String id;
+
+    private List<QuestionBusinessAddBo> businessList;
+}

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseService.java

@@ -87,4 +87,6 @@ public interface ICourseService extends IService<Course> {
 	List<GoodsUserVo> goodsProgressList(CourseQueryBo bo);
 
     Course getCourseByTenant(String code, Long newTenantId);
+
+	Boolean checkTime();
 }

+ 10 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseProjectTypeServiceImpl.java

@@ -2,6 +2,7 @@ package com.zhongzheng.modules.course.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.Page;
 import com.zhongzheng.common.utils.DateUtils;
@@ -112,10 +113,17 @@ public class CourseProjectTypeServiceImpl extends ServiceImpl<CourseProjectTypeM
         longs.add(1);
         longs.add(0);
         courseProjectTypeQueryBo.setStatus(longs);
-        Collection<CourseProjectTypeVo> courseProjectTypeVos = baseMapper.queryList(courseProjectTypeQueryBo);
-        if (!CollectionUtils.isEmpty(courseProjectTypeVos)){
+        Integer count = baseMapper.selectCount(new LambdaQueryWrapper<CourseProjectType>()
+                .eq(CourseProjectType::getProjectName, entity.getProjectName())
+                .eq(CourseProjectType::getEducationId, entity.getEducationId())
+                .in(CourseProjectType::getStatus, longs));
+        if (count > 0){
             throw new RuntimeException("项目重复");
         }
+//        Collection<CourseProjectTypeVo> courseProjectTypeVos = baseMapper.queryList(courseProjectTypeQueryBo);
+//        if (!CollectionUtils.isEmpty(courseProjectTypeVos)){
+//            throw new RuntimeException("项目重复");
+//        }
         //TODO 做一些数据校验,如唯一约束
     }
 

+ 20 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.dynamic.datasource.annotation.DS;
+
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -63,6 +64,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -580,6 +583,23 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
         return courseUserVos;
     }
 
+    @Override
+    public Boolean checkTime() {
+        try {
+            String startTime = "2023-3-16 00:00:00";
+            String endTime = "2023-4-01 00:00:00";
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            Long startDate = sdf.parse(startTime).getTime()/1000;
+            Long endDate = sdf.parse(endTime).getTime()/1000;
+            if (DateUtils.getNowTime() < startDate || DateUtils.getNowTime() > endDate){
+                throw new CustomException("活动已过期");
+            }
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return true;
+    }
+
     private List<UserStudyRecordPhotoVo> entity2PhotoVo(Collection<UserStudyRecordPhoto> collection) {
         List<UserStudyRecordPhotoVo> voList = collection.stream()
                 .map(any -> BeanUtil.toBean(any, UserStudyRecordPhotoVo.class))

+ 6 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/data/bo/DataWxTpClickAddBo.java

@@ -2,9 +2,7 @@ package com.zhongzheng.modules.data.bo;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
-import java.util.Date;
 
 
 
@@ -30,4 +28,10 @@ public class DataWxTpClickAddBo {
     /** 状态 1有效 0无效 */
     @ApiModelProperty("状态 1有效 0无效")
     private Integer status;
+    /** 类型:1其他,2真题免费领取活动记录 */
+    @ApiModelProperty("类型:1其他,2真题免费领取活动记录 ")
+    private Integer type;
+    /** 类型:1其他,2真题免费领取活动记录 */
+    @ApiModelProperty("类型:1其他,2真题免费领取活动记录 ")
+    private Integer crowdType;
 }

+ 10 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/data/domain/DataWxTpClick.java

@@ -1,13 +1,14 @@
 package com.zhongzheng.modules.data.domain;
 
-import com.baomidou.mybatisplus.annotation.*;
+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;
-import java.util.Date;
-import java.math.BigDecimal;
-import com.zhongzheng.common.annotation.Excel;
 
 /**
  * 微信模板消息点击数据对象 data_wx_tp_click
@@ -36,4 +37,9 @@ private static final long serialVersionUID=1L;
     private Long updateTime;
     /** 状态 1有效 0无效 */
     private Integer status;
+    /** 类型:1其他,2真题免费领取活动记录 */
+    private Integer type;
+    /** 人群类型 */
+    private Integer crowdType;
+
 }

+ 22 - 15
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java

@@ -28,10 +28,7 @@ import com.zhongzheng.modules.bank.mapper.QuestionMapper;
 import com.zhongzheng.modules.bank.service.*;
 import com.zhongzheng.modules.base.domain.*;
 import com.zhongzheng.modules.base.service.*;
-import com.zhongzheng.modules.course.bo.CourseMenuAddBo;
-import com.zhongzheng.modules.course.bo.CourseMenuListAddBo;
-import com.zhongzheng.modules.course.bo.CourseMenuQueryBo;
-import com.zhongzheng.modules.course.bo.CourseQueryBo;
+import com.zhongzheng.modules.course.bo.*;
 import com.zhongzheng.modules.course.domain.*;
 import com.zhongzheng.modules.course.mapper.CourseMapper;
 import com.zhongzheng.modules.course.service.*;
@@ -106,6 +103,8 @@ import static java.math.RoundingMode.HALF_UP;
 @DS("slave")
 public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements IGoodsService {
 
+    @Autowired
+    private ICourseBusinessService iCourseBusinessService;
 
     @Autowired
     private IGoodsCourseService iGoodsCourseService;
@@ -169,8 +168,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
     private ICourseSectionService iCourseSectionService;
     @Autowired
     private ICourseSectionBusinessService iCourseSectionBusinessService;
-    @Autowired
-    private ICourseBusinessService iCourseBusinessService;
+
 
     @Autowired
     private ICourseSubjectService iCourseSubjectService;
@@ -657,7 +655,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
             update(null, objectLambdaUpdateWrapper);
         }
         //试听列表
-        if (bo.getAuditionList() != null && bo.getAuditionList().size() > 0) {
+        if (bo.getAuditionList() != null) {
             update.setGoodsAuditionConfig(JSON.toJSONString(bo.getAuditionList()));
         }
         //播放设置
@@ -882,6 +880,15 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         if (Validator.isNotEmpty(classGradeVo)) {
             goodsVo.setGradeId(classGradeVo.getGradeId());
         }
+        CourseBusinessQueryBo queryBo = new CourseBusinessQueryBo();
+        queryBo.setId(goodsVo.getBusinessId());
+        String fullName = iCourseBusinessService.queryFullName(queryBo);
+        goodsVo.setErJianErZao(false);
+        if(Validator.isNotEmpty(fullName)){
+            if(fullName.equals("继续教育二级建造师")||fullName.equals("继续教育二级造价师")){
+                goodsVo.setErJianErZao(true);
+            }
+        }
         return goodsVo;
     }
 
@@ -1248,16 +1255,16 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
     public String getGoodsStudyUrl(GoodsStudyUrlBo bo) {
         String url = "";
         //中正学堂PC域名和H5域名 https://zzyxt.gdzzkj.net/  h.gdzzkj.net
-//        String domain = "http://192.168.1.222:6002/";
-//        String domainH5 = "https://h.xyyxt.net";
-        String domain = "https://zzyxt.gdzzkj.net/";
-        String domainH5 = "https://h.gdzzkj.net";
+        String domain = "http://192.168.1.222:6002/";
+        String domainH5 = "http://120.79.166.78:19006";
+//        String domain = "https://zzyxt.gdzzkj.net/";
+//        String domainH5 = "https://h.gdzzkj.net";
         Long tenantId = 867735392558919680L; //祥粤云
         if (ObjectUtils.isNotNull(bo.getTenantId()) && bo.getTenantId().equals(tenantId)){
-            domain = "https://web.xyyxt.net/";
-            domainH5 = "https://h.xyyxt.net";
-//            domain = "http://192.168.1.222:6002/";
+//            domain = "https://web.xyyxt.net/";
 //            domainH5 = "https://h.xyyxt.net";
+            domain = "http://192.168.1.222:6002/";
+            domainH5 = "http://120.79.166.78:19006";
         }
         Goods goods = baseMapper.queryGoodsByIdTenant(bo.getGoodsId(), bo.getTenantId());
         if (ObjectUtils.isNull(goods)) {
@@ -2423,7 +2430,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
                 GoodsSpec goodsSpec = BeanUtil.toBean(x, GoodsSpec.class);
                 goodsSpec.setSpecId(null);
                 goodsSpec.setTenantId(newTenantId);
-                goodsSpec.setOId(x.getOId());
+                goodsSpec.setOId(x.getSpecId());
                 return goodsSpec;
             }).collect(Collectors.toList());
             goodsSpecService.saveBatch(newGoodsSpecList);

+ 2 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsVo.java

@@ -359,5 +359,6 @@ public class GoodsVo {
 	@Excel(name = "提交官方审核备注说明")
 	@ApiModelProperty("提交官方审核备注说明")
 	private String commitPeriodRemark;
-
+	@ApiModelProperty("是否是二建二造")
+	private Boolean erJianErZao;
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeUserQueryBo.java

@@ -236,6 +236,7 @@ public class ClassGradeUserQueryBo extends BaseEntity {
 	@ApiModelProperty("学员身份证")
 	private String idCard;
 
+
 	/**
 	 * 学员身份证集合
 	 */

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/mapper/ClassGradeUserMapper.java

@@ -28,6 +28,8 @@ public interface ClassGradeUserMapper extends BaseMapper<ClassGradeUser> {
 
     List<ClassPeriodStudentVo> listUserPeriod(ClassGradeUserQueryBo bo);
 
+    List<ClassPeriodStudentVo> listUserVideoRecord(ClassGradeUserQueryBo bo);
+
     List<ClassPeriodStudentVo> listUserPeriodExport(ClassGradeUserQueryBo bo);
 
     List<ClassPeriodUserVo> listPeriod(ClassGradeUserQueryBo bo);

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeUserService.java

@@ -84,6 +84,8 @@ public interface IClassGradeUserService extends IService<ClassGradeUser> {
 
 	List<ClassPeriodStudentVo> listUserPeriodRecord(ClassGradeUserQueryBo bo);
 
+	List<ClassPeriodStudentVo> listUserVideoRecord(ClassGradeUserQueryBo bo);
+
 	List<UserPeriodExportVo> listUserStudyRecord(ClassGradeUserQueryBo bo);
 
 	List<UserPeriodExportV2Vo> listUserStudyRecordV2(ClassGradeUserQueryBo bo);

+ 14 - 14
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java

@@ -241,18 +241,18 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         SysOldOrg org = sysOldOrgService.list(new LambdaQueryWrapper<SysOldOrg>()
                 .eq(SysOldOrg::getTenantId, tenant)
                 .last("limit 1")).stream().findFirst().orElse(null);
-        //校验是否二建/二造商品创建班级
-        if (bo.getClassGradeGoodsAddBos() != null &&
-                (ObjectUtils.isNull(bo.getClassStatus()) || 1 == bo.getClassStatus()) && org.getShareClass() == 1) {
-            Long goodsId = bo.getClassGradeGoodsAddBos()[0];
-            Goods goods = iGoodsService.getById(goodsId);
-            CourseBusinessQueryBo businessQueryBo = new CourseBusinessQueryBo();
-            businessQueryBo.setId(goods.getBusinessId());
-            String fullName = iCourseBusinessService.queryFullName(businessQueryBo);
-            if (("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName))) {
-                throw new CustomException("二建/二造不允许直接创建开班班级!");
-            }
-        }
+//        //校验是否二建/二造商品创建班级
+//        if (bo.getClassGradeGoodsAddBos() != null &&
+//                (ObjectUtils.isNull(bo.getClassStatus()) || 1 == bo.getClassStatus()) && org.getShareClass() == 1) {
+//            Long goodsId = bo.getClassGradeGoodsAddBos()[0];
+//            Goods goods = iGoodsService.getById(goodsId);
+//            CourseBusinessQueryBo businessQueryBo = new CourseBusinessQueryBo();
+//            businessQueryBo.setId(goods.getBusinessId());
+//            String fullName = iCourseBusinessService.queryFullName(businessQueryBo);
+//            if (("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName))) {
+//                throw new CustomException("二建/二造不允许直接创建开班班级!");
+//            }
+//        }
 
         //是否创建官方班级编号
         if (bo.getClassGradeGoodsAddBos() != null &&
@@ -293,9 +293,9 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                         //获取当前机构商品下的班级
                         List<ClassGradeGoods> gradeGoods = iClassGradeGoodsService.getGradeGoodsList(goods.getGoodsId());
                         if (gradeGoods.size() < listGrade.size()) {
-                            ClassGrade grade = list.get(gradeGoods.size());
+                            ClassGrade grade = listGrade.get(gradeGoods.size());
                             if (checkEjjjPeopleNumLimit(business.getId(), grade.getGradeId())) {
-                                add.setOfficialName(list.get(gradeGoods.size()).getOfficialName());
+                                add.setOfficialName(listGrade.get(gradeGoods.size()).getOfficialName());
                                 add.setClassStatus(0);
                             } else {
                                 add.setOfficialName(ServletUtils.getEncoded("PIY"));

+ 17 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java

@@ -1219,6 +1219,21 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
         return classPeriodStudentVos;
     }
 
+    @Override
+    public List<ClassPeriodStudentVo> listUserVideoRecord(ClassGradeUserQueryBo bo) {
+        //查询班级学员信息
+        List<ClassPeriodStudentVo> classPeriodStudentVos = baseMapper.listUserVideoRecord(bo);
+        //查找学员学习记录
+        for (ClassPeriodStudentVo classPeriodStudentVo : classPeriodStudentVos) {
+            //取学时所有拍照最新的一张
+             String recentPhoto = userStudyRecordPhotoMapper.selectGradeRecentOnePhoto(classPeriodStudentVo.getUserId(), classPeriodStudentVo.getGradeId());
+           if (Validator.isNotEmpty(recentPhoto)) {
+                classPeriodStudentVo.setIdCardImg1(recentPhoto);
+            }
+        }
+        return classPeriodStudentVos;
+    }
+
     private Integer changePeriodStatus(Long gradePeriodStatus) {
         //當前班級學員審核狀態 -1不可审核 0待審  1未通过 2通过 3审核中
         //班级里的审核状态字段,保持一致 0 未通过 1通过 2待审核 -1 不可审核 3审核中
@@ -1689,7 +1704,7 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
                                     classPeriodSectionVo.setAuditTime(userPeriodStatusVo.getAuditTime());
                                     classPeriodSectionVo.setAuditUserName(userPeriodStatusVo.getAuditUserName());
                                     classPeriodSectionVo.setPeriodStatusId(userPeriodStatusVo.getId());
-                                    classPeriodChapterVo.setPerformance(Convert.toBigDecimal(userPeriodStatusVo.getPerformance()));
+                                    classPeriodSectionVo.setPerformance(Convert.toBigDecimal(userPeriodStatusVo.getPerformance()));
                                 }
                                 classPeriodSectionVo.setModuleId(classPeriodVo.getId());
                                 classPeriodSectionVo.setChapterId(classPeriodChapterVo.getId());
@@ -1797,6 +1812,7 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
                         classPeriodSectionVo.setPeriodStatusId(userPeriodStatusVo.getId());
                         classPeriodSectionVo.setAuditTime(userPeriodStatusVo.getAuditTime());
                         classPeriodSectionVo.setAuditUserName(userPeriodStatusVo.getAuditUserName());
+                        classPeriodSectionVo.setPerformance(Convert.toBigDecimal(userPeriodStatusVo.getPerformance()));
                         classPeriodVo.setPerformance(Convert.toBigDecimal(userPeriodStatusVo.getPerformance()));
                     }
                     classPeriodSectionVo.setModuleId(0L);

+ 4 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassPeriodSectionVo.java

@@ -167,7 +167,10 @@ public class ClassPeriodSectionVo implements Comparable<ClassPeriodSectionVo> {
 	private Integer sectionType;
 	@ApiModelProperty("录播地址")
 	private String recordingUrl;
-
+	/** 分数 */
+	@Excel(name = "分数")
+	@ApiModelProperty("分数")
+	private BigDecimal performance;
 	@Override
 	public int compareTo(ClassPeriodSectionVo o) {
 		return this.getSort() - o.getSort();

+ 16 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassPeriodStudentVo.java

@@ -205,4 +205,20 @@ public class ClassPeriodStudentVo {
 	@ApiModelProperty("学时通过时间")
 	private Long periodTime;
 
+	@Excel(name = "节名称")
+	@ApiModelProperty("节名称")
+	private String sectionName;
+	@Excel(name = "公司名称")
+	@ApiModelProperty("公司名称")
+	private String companyName;
+	@Excel(name = "节时长")
+	@ApiModelProperty("节时长")
+	private String durationTime;
+
+	@ApiModelProperty("学习开始时间")
+	private Long recordStartTime;
+	@ApiModelProperty("学习结束时间")
+	private Long recordEndTime;
+	@ApiModelProperty("最近在线时间")
+	private Long onLineTime;
 }

+ 2 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderAddBo.java

@@ -2,10 +2,7 @@ package com.zhongzheng.modules.order.bo;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
-import java.util.Date;
-
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -97,4 +94,6 @@ public class OrderAddBo {
     private Integer orderOrg;
     @ApiModelProperty("红包活动码")
     private String shareActivityCode;
+    @ApiModelProperty("业务员名称")
+    private String sellerName;
 }

+ 1 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderService.java

@@ -112,7 +112,5 @@ public interface IOrderService extends IService<Order> {
 
 	boolean arrangeGrade(String goodsName, Long goodsId, Long orderGoodsId, Long gradeId, Long userId, String orderSn, Long businessId);
 
-
-
-
+	Map<String, String> getActivityGoods(OrderAddBo bo);
 }

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

@@ -1820,6 +1820,133 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         return true;
     }
 
+    @Override
+    public Map<String, String> getActivityGoods(OrderAddBo bo) {
+        String key = "ORDER-" + "-" + bo.getUserId();
+        Long value = redisCache.getCacheObject(key);
+        if (Validator.isNotEmpty(value)) {
+            throw new CustomException("请勿频繁提交订单");
+        }
+        redisCache.setCacheObject(key, 1L, 5, TimeUnit.SECONDS);//5秒
+        List<OrderGoodsAddBo> goodsList = bo.getGoodsList();
+        if (goodsList == null || goodsList.size() < 1) {
+            throw new CustomException("商品列表为空");
+        }
+        Order add = BeanUtil.toBean(bo, Order.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+
+
+        //生成订单号
+        String out_trade_no = DateUtils.getDateOrderSn();
+        BigDecimal totalPrice = new BigDecimal(0);
+        BigDecimal payPrice = new BigDecimal(0);
+        List<OrderGoods> freeList = new ArrayList<>();
+        //生成订单
+        for (OrderGoodsAddBo g : goodsList) {
+            //订单商品
+            Goods goods = iGoodsService.getOne(new LambdaQueryWrapper<Goods>().eq(Goods::getGoodsId, g.getGoodsId()));
+            if (goods.getGoodsStatus() != 1) {
+                throw new CustomException(goods.getGoodsName() + "商品已下架,请重新选择商品下单");
+            }
+            OrderGoods orderGoods = BeanUtil.toBean(g, OrderGoods.class);
+            orderGoods.setOrderSn(out_trade_no);
+            if (g.getGoodsInputData() != null) {
+                orderGoods.setGoodsInputData(JSON.toJSONString(g.getGoodsInputData()));
+            }
+            //成交价
+            orderGoods.setStatus(1);
+            orderGoods.setGoodsRealPrice(goods.getStandPrice());
+            orderGoods.setGoodsPrice(goods.getStandPrice());
+            orderGoods.setCreateTime(DateUtils.getNowTime());
+            orderGoods.setUpdateTime(DateUtils.getNowTime());
+            //订单价格不计算优惠
+            totalPrice = totalPrice.add(goods.getStandPrice());
+            //暂不计算优惠券
+            payPrice = payPrice.add(goods.getStandPrice());
+            iOrderGoodsService.save(orderGoods);
+
+            boolean canRepeatBuy = false;
+            validUserBeforeBuy(goods, bo.getUserId());
+            //判断是否有购买过
+            Long oldOrderGoodsId = getHaveBuyGoods(g.getGoodsId(), bo.getUserId());
+            //视频商品安排班级
+            if (goods.getGoodsType() == 1) {
+                if (Validator.isNotEmpty(goods.getStudyCount())) {
+                    orderGoods.setStudyCount(goods.getStudyCount() - 1); //默认分班消耗一次学习机会
+                } else {
+                    orderGoods.setStudyCount(0L);//没配置则为0
+                }
+                Long gradeId = null;
+                //判断是否购买历史班级都过期
+                canRepeatBuy = this.canBuyRepeatGoods(g.getGoodsId(), bo.getUserId());
+                if (g.getGoodsInputData() != null) {
+                    gradeId = g.getGoodsInputData().getGradeId();
+                    if (Validator.isNotEmpty(oldOrderGoodsId)) {
+                        //有指定选班模板且视频商品班级已过期,记录复购状态
+                        orderGoods.setRebuyOrderGoodsId(oldOrderGoodsId);
+                    }
+                }
+                String requestId = IdUtil.simpleUUID();
+                RedisLockEntity redisLockEntity = new RedisLockEntity();
+                redisLockEntity.setLockKey(RedisLockEntity.KEY_LOCK_GRADE);
+                redisLockEntity.setRequestId(requestId);
+                if (redisCache.lock(redisLockEntity)) {
+                    arrangeGrade(goods.getGoodsName(), goods.getGoodsId(), orderGoods.getOrderGoodsId(), gradeId, add.getUserId(), out_trade_no, goods.getBusinessId());
+                    redisCache.unlockLua(redisLockEntity);
+                }
+                iOrderGoodsService.updateById(orderGoods);
+                newFreeBankGoods(goods.getGoodsId(), orderGoods.getOrderGoodsId());
+            }
+
+            if (!canRepeatBuy && goods.getGoodsType() != 3 && goods.getGoodsType() != 4) {
+                this.checkBuyGoods(g.getGoodsId(), bo.getUserId(), goods.getGoodsType());
+            }
+            if (goods.getGoodsType() == 6) {
+                //直播商品
+                if (Validator.isNotEmpty(oldOrderGoodsId) && oldOrderGoodsId.longValue() > 0) {
+                    throw new CustomException("直播商品不允许复购");
+                }
+            }
+            iShoppingCartService.deleteByGoodsId(g.getGoodsId(), bo.getUserId());
+            //商品0元加入免费商品列表
+            freeList.add(orderGoods);
+        }
+
+        add.setOrderSn(out_trade_no);
+        add.setOrderFrom(Order.FROM_SMALL);
+        add.setPayPrice(payPrice);
+        add.setPayType(Order.PAY_WECHAT);
+        add.setOrderPrice(totalPrice);
+        //订单0元
+        //完全收费
+        add.setOrderStatus(Order.ORDER_STATUS_PAY);
+        add.setPayStatus(Order.PAY_FREE);
+        add.setStatus(1);
+        this.save(add);
+        //处理免费商品
+        for (OrderGoods orderGoods : freeList) {
+            dealFreeGoods(orderGoods, add);
+        }
+
+        Map<String, String> payResult = new HashMap<>();
+        payResult.put("orderSn", out_trade_no);
+
+        //活动商品领取记录
+        ActivityOrder record = new ActivityOrder();
+        record.setOrderSn(out_trade_no);
+        record.setUserId(add.getUserId());
+        record.setGoodsId(goodsList.get(0).getGoodsId());
+        record.setStatus(1);
+        record.setRemark(String.format("业务员名称:%s",bo.getSellerName()));
+        record.setType(2);
+        record.setCreateTime(DateUtils.getNowTime());
+        record.setUpdateTime(DateUtils.getNowTime());
+        iActivityOrderService.save(record);
+        return payResult;
+    }
+
     private String createGradeCode(Long goodsId, CourseBusinessVo business) {
 
         Goods goods = iGoodsService.getById(goodsId);

+ 5 - 8
zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/IScheduleService.java

@@ -2,18 +2,10 @@ package com.zhongzheng.modules.schedule.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zhongzheng.modules.exam.bo.ExamApplyQueryBo;
-import com.zhongzheng.modules.polyv.bo.PolyvVideoAddBo;
-import com.zhongzheng.modules.polyv.bo.PolyvVideoEditBo;
-import com.zhongzheng.modules.polyv.bo.PolyvVideoQueryBo;
 import com.zhongzheng.modules.polyv.domain.PolyvVideo;
-import com.zhongzheng.modules.polyv.vo.PolyvVideoQuerVo;
-import com.zhongzheng.modules.polyv.vo.PolyvVideoVo;
-import com.zhongzheng.modules.polyv.vo.PolyvVo;
 import com.zhongzheng.modules.user.bo.UserQueryBo;
 
 import java.text.ParseException;
-import java.util.Collection;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -103,4 +95,9 @@ public interface IScheduleService extends IService<PolyvVideo> {
     void signTimeSend(UserQueryBo bo);
 
     void toDayExamNotRecordWarn();
+
+    void synchronizationGoodsByTenantId(String tenantId);
+
+    void goodsDispose();
+
 }

+ 16 - 37
zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java

@@ -3,36 +3,23 @@ package com.zhongzheng.modules.schedule.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.lang.Validator;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.http.HttpStatus;
 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.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.github.pagehelper.Page;
 import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
-import com.zhongzheng.common.utils.http.HttpUtils;
-import com.zhongzheng.common.utils.polyv.PolyvUtils;
 import com.zhongzheng.modules.alisms.vo.ResultBean;
-import com.zhongzheng.modules.bank.domain.Exam;
-import com.zhongzheng.modules.bank.domain.QuestionBusiness;
-import com.zhongzheng.modules.bank.mapper.QuestionMapper;
 import com.zhongzheng.modules.base.service.IProfileTpService;
 import com.zhongzheng.modules.base.vo.ProfileTpVo;
-import com.zhongzheng.modules.base.vo.UserProfileVo;
 import com.zhongzheng.modules.course.bo.CourseChapterSectionQueryBo;
 import com.zhongzheng.modules.course.bo.CourseMenuQueryBo;
 import com.zhongzheng.modules.course.bo.CourseModuleChapterQueryBo;
 import com.zhongzheng.modules.course.bo.CourseSectionQueryBo;
-import com.zhongzheng.modules.course.domain.CourseBusiness;
 import com.zhongzheng.modules.course.domain.CourseSection;
 import com.zhongzheng.modules.course.domain.CourseSubject;
 import com.zhongzheng.modules.course.service.*;
@@ -51,9 +38,8 @@ import com.zhongzheng.modules.exam.mapper.ExamBeforeMapper;
 import com.zhongzheng.modules.exam.mapper.ExamNumberMapper;
 import com.zhongzheng.modules.exam.vo.ExamApplyVo;
 import com.zhongzheng.modules.exam.vo.ExamBeforeVo;
-import com.zhongzheng.modules.exam.vo.ExamNumberVo;
 import com.zhongzheng.modules.exam.vo.ExamUserApplyVo;
-import com.zhongzheng.modules.goods.bo.GoodsCourseQueryBo;
+import com.zhongzheng.modules.goods.bo.GoodsBatchCopyTenantBo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
 import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.domain.GoodsExamTime;
@@ -67,11 +53,12 @@ import com.zhongzheng.modules.grade.bo.ClassGradeQueryBo;
 import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.domain.*;
 import com.zhongzheng.modules.grade.service.*;
-import com.zhongzheng.modules.grade.vo.*;
+import com.zhongzheng.modules.grade.vo.ClassGradeUserGoodsVo;
+import com.zhongzheng.modules.grade.vo.ClassGradeVo;
+import com.zhongzheng.modules.grade.vo.ClassPeriodVo;
 import com.zhongzheng.modules.inform.bo.InformQueryBo;
 import com.zhongzheng.modules.inform.bo.InformSysUserAddBo;
 import com.zhongzheng.modules.inform.bo.InformUserAddBo;
-import com.zhongzheng.modules.inform.domain.Inform;
 import com.zhongzheng.modules.inform.domain.InformUser;
 import com.zhongzheng.modules.inform.service.IInformRemindService;
 import com.zhongzheng.modules.inform.service.IInformService;
@@ -79,10 +66,8 @@ import com.zhongzheng.modules.inform.service.IInformSysUserService;
 import com.zhongzheng.modules.inform.service.IInformUserService;
 import com.zhongzheng.modules.inform.vo.InformRemindVo;
 import com.zhongzheng.modules.inform.vo.InformVo;
-import com.zhongzheng.modules.mock.bo.MockApplyEditBo;
 import com.zhongzheng.modules.mock.domain.MockApply;
 import com.zhongzheng.modules.mock.domain.MockMajorSubject;
-import com.zhongzheng.modules.mock.domain.MockMajorSubjectGoods;
 import com.zhongzheng.modules.mock.domain.MockMajorSubjectTime;
 import com.zhongzheng.modules.mock.service.IMockApplyService;
 import com.zhongzheng.modules.mock.service.IMockMajorSubjectGoodsService;
@@ -94,24 +79,14 @@ import com.zhongzheng.modules.order.domain.Order;
 import com.zhongzheng.modules.order.domain.OrderGoods;
 import com.zhongzheng.modules.order.mapper.OrderGoodsMapper;
 import com.zhongzheng.modules.order.mapper.OrderMapper;
-import com.zhongzheng.modules.order.service.IOrderBusinessService;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.order.service.IOrderService;
 import com.zhongzheng.modules.order.vo.OrderGoodsVo;
 import com.zhongzheng.modules.order.vo.OrderListVo;
-import com.zhongzheng.modules.order.vo.OrderVo;
 import com.zhongzheng.modules.polyv.bo.PolyvLiveQueryBo;
-import com.zhongzheng.modules.polyv.bo.PolyvVideoAddBo;
-import com.zhongzheng.modules.polyv.bo.PolyvVideoEditBo;
-import com.zhongzheng.modules.polyv.bo.PolyvVideoQueryBo;
-import com.zhongzheng.modules.polyv.domain.PolyvVideDo;
 import com.zhongzheng.modules.polyv.domain.PolyvVideo;
-import com.zhongzheng.modules.polyv.domain.TokenResponse;
 import com.zhongzheng.modules.polyv.mapper.PolyvVideoMapper;
 import com.zhongzheng.modules.polyv.service.IPolyvLiveService;
-import com.zhongzheng.modules.polyv.vo.PolyvVideoQuerVo;
-import com.zhongzheng.modules.polyv.vo.PolyvVideoVo;
-import com.zhongzheng.modules.polyv.vo.PolyvVo;
 import com.zhongzheng.modules.schedule.service.IScheduleService;
 import com.zhongzheng.modules.system.service.ISysUserService;
 import com.zhongzheng.modules.user.bo.*;
@@ -122,29 +97,21 @@ import com.zhongzheng.modules.user.service.*;
 import com.zhongzheng.modules.user.vo.*;
 import com.zhongzheng.modules.wisdom.service.IWisdomService;
 import com.zhongzheng.modules.wx.service.IWxLoginService;
-import com.zhongzheng.modules.wx.service.IWxPayService;
 import net.polyv.common.v1.util.StringUtils;
 import net.polyv.live.v1.entity.channel.playback.LiveChannelVideoListResponse;
-import net.polyv.live.v1.entity.channel.playback.LiveListChannelSessionInfoResponse;
 import net.polyv.live.v1.entity.channel.playback.LiveListChannelVideoLibraryResponse;
 import org.apache.commons.lang3.time.DateFormatUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
-import java.io.IOException;
 import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
-import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
-import static com.alibaba.fastjson.JSONPatch.OperationType.add;
-import static com.squareup.okhttp.internal.Util.md5Hex;
-
 /**
  * 定时任务
  *
@@ -1082,6 +1049,18 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
         }
     }
 
+    @Override
+    public void synchronizationGoodsByTenantId(String tenantId) {
+        GoodsBatchCopyTenantBo bo = new GoodsBatchCopyTenantBo();
+        bo.setTenantId(Long.valueOf(tenantId));
+        iGoodsService.goodsBatchCopyTenant(bo);
+    }
+
+    @Override
+    public void goodsDispose() {
+        iGoodsService.goodsBatchCopyDisposeTenant();
+    }
+
     @Override
     public void closeTimeOutOrder() {
         OrderQueryBo bo = new OrderQueryBo();

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/domain/SysLogininfor.java

@@ -77,6 +77,7 @@ public class SysLogininfor implements Serializable {
     @Excel(name = "提示消息")
     private String msg;
 
+
     /**
      * 访问时间
      */

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

@@ -151,7 +151,7 @@ public class SysOperLog implements Serializable {
     @TableField(exist = false)
     private Map<String, Object> params = new HashMap<>();
 
-
+    private Long tenantId;
     /**
      * 主键ID
      */

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

@@ -30,8 +30,8 @@ public class SysOperLogServiceImpl extends ServiceImpl<SysOperLogMapper, SysOper
      */
     @Override
     public void insertOperlog(SysOperLog operLog) {
-       /* operLog.setOperTime(new Date());
-        save(operLog);*/
+        operLog.setOperTime(new Date());
+        save(operLog);
     }
 
     /**

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysUserServiceImpl.java

@@ -340,6 +340,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return baseMapper.update(null,
                 new LambdaUpdateWrapper<SysUser>()
                         .set(SysUser::getPassword,password)
+                        .set(SysUser::getPwdTime,DateUtils.getNowTime())
                         .eq(SysUser::getUserName,userName));
     }
 

+ 5 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysWebServiceImpl.java

@@ -304,6 +304,9 @@ public class SysWebServiceImpl implements ISysWebService {
         jsonObject24.put("h5Logo","https://"+bo.getLogoH5Url());
         jsonObject24.put("smallLogo","https://"+bo.getLogoSmallUrl());
         jsonObject24.put("hostLive","https://"+bo.getHostLive());
+        jsonObject24.put("hostH5","https://"+bo.getHostH5());
+        jsonObject24.put("hostPc","https://"+bo.getHostPc());
+        jsonObject24.put("smallQrCodeShow",false);
         config24.setConfigKey("home.mobile");
         config24.setConfigValue(jsonObject24.toJSONString());
         config24.setConfigType("N");
@@ -415,8 +418,8 @@ public class SysWebServiceImpl implements ISysWebService {
                 "    }\n" +
                 "\n" +
                 "    #SSL配置\n" +
-                "    ssl_certificate      /mydata/nginx/ssl/gdzzkj.net.pem; # 配置证书\n" +
-                "    ssl_certificate_key  /mydata/nginx/ssl/gdzzkj.net.key; # 配置证书私钥\n" +
+                "    ssl_certificate      /mydata/nginx/ssl/zzyxt.net.pem; # 配置证书\n" +
+                "    ssl_certificate_key  /mydata/nginx/ssl/zzyxt.net.key; # 配置证书私钥\n" +
                 "    ssl_protocols        TLSv1 TLSv1.1 TLSv1.2; # 配置SSL协议版本 # 配置SSL加密算法\n" +
                 "    ssl_ciphers          ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;\n" +
                 "    ssl_prefer_server_ciphers  on; # 优先采取服务器算法\n" +

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserAddBo.java

@@ -155,4 +155,8 @@ public class UserAddBo {
     /** 分销邀请码 */
     @ApiModelProperty("分销邀请码")
     private String shareCode;
+
+    /** 密码最后修改时间 */
+    @ApiModelProperty("密码最后修改时间")
+    private Long pwdTime;
 }

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

@@ -1,6 +1,5 @@
 package com.zhongzheng.modules.user.bo;
 
-import com.zhongzheng.common.annotation.Excel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -27,5 +26,7 @@ public class UserAppRegisterBo {
     private String shareActivityCode;
     @ApiModelProperty("身份证")
     private String idcard;
+    @ApiModelProperty("是否活动:1是,0否")
+    private Integer isActivity;
 
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserEditBo.java

@@ -199,4 +199,8 @@ public class UserEditBo {
     /** 活动分销邀请码 */
     @ApiModelProperty("活动分销邀请码")
     private String shareActivityCode;
+
+    /** 密码最后修改时间 */
+    @ApiModelProperty("密码最后修改时间")
+    private Long pwdTime;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/User.java

@@ -220,4 +220,6 @@ private static final long serialVersionUID=1L;
     private String shareCode;
     /** 分销活动邀请码 */
     private String shareActivityCode;
+    /** 密码最后修改时间 */
+    private Long pwdTime;
 }

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserVo.java

@@ -289,6 +289,11 @@ public class UserVo {
 	@ApiModelProperty("活动分销邀请码")
 	private String shareActivityCode;
 
+	/** 密码最后修改时间 */
+	@Excel(name = "密码最后修改时间")
+	@ApiModelProperty("密码最后修改时间")
+	private Long pwdTime;
+
 	public void setNull(){
 		this.setOpenId(null);
 		this.setIdCardImg1(null);

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/bo/WxLoginBody.java

@@ -51,4 +51,7 @@ public class WxLoginBody {
     @ApiModelProperty("身份证号码")
     private String idcard;
 
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
 }

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

@@ -311,6 +311,7 @@ public class WxPayServiceImpl implements IWxPayService {
     public Map<String, String> paymentGzh(String out_trade_no, String openid, String body, BigDecimal price, String url) {
         initData();
         WxSmallConfig config = new WxSmallConfig(gzhAppid, mchid, key);
+        Map<String, String> resp = null;
         try {
             WXPay wxpay = new WXPay(config);
             BigDecimal unit = new BigDecimal(100);
@@ -327,7 +328,7 @@ public class WxPayServiceImpl implements IWxPayService {
             data.put("trade_type", "JSAPI");
             String TenantId = ServletUtils.getRequest().getHeader("TenantId");
             data.put("attach", TenantId);
-            Map<String, String> resp = wxpay.unifiedOrder(data);
+            resp = wxpay.unifiedOrder(data);
             Map<String, String> result = new HashMap<>();
             //         result.put("provider","wxpay");
             result.put("appId", gzhAppid);
@@ -340,7 +341,8 @@ public class WxPayServiceImpl implements IWxPayService {
             return result;
         } catch (Exception e) {
             e.printStackTrace();
-            throw new CustomException("错误" + e.getMessage());
+            log.error(JSON.toJSONString(resp));
+            throw new CustomException("支付错误" + e.getMessage());
         }
 
         //    return null;
@@ -532,6 +534,7 @@ public class WxPayServiceImpl implements IWxPayService {
     public boolean shareToOldSys(Order order,List<OrderGoods> goodsList) {
         if (Validator.isNotEmpty(order)) {
             UserVo user = iUserService.queryById(order.getUserId());
+            log.info(JSONObject.toJSONString(user));
                 OrderShareToOldVo vo  = new OrderShareToOldVo();
                 vo.setOrderId(order.getOrderId());
                 vo.setSharecode(user.getShareCode());
@@ -564,6 +567,7 @@ public class WxPayServiceImpl implements IWxPayService {
                     shareGoodsVoList.add(shareGoodsVo);
                 }
                 vo.setGoodsList(shareGoodsVoList);
+                log.info(JSONObject.toJSONString(vo));
                 //分销下单
                 Map<String, String> params = new HashMap<>();
                 Long nowTime = DateUtils.getNowTime();

+ 2 - 2
zhongzheng-system/src/main/resources/mapper/modules/course/CourseChapterSectionMapper.xml

@@ -228,7 +228,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           and up.chapter_id=#{chapterId}
           and up.section_id=#{typeId}
           and up.course_id=#{courseId}
-            <if test="examId != null ">
+            <if test="examId != null and examId > 0">
                 and up.exam_id=#{examId}
                 and up.`type` = 2
             </if>
@@ -250,7 +250,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           and up.chapter_id=#{chapterId}
           and up.course_id=#{courseId}
           and up.section_id=#{typeId}
-            <if test="examId != null ">
+            <if test="examId != null and examId > 0">
                 and up.exam_id=#{examId}
                 and up.`type` = 2
             </if>

+ 3 - 1
zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeMapper.xml

@@ -935,7 +935,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             u.id_card as idNum,
             u.telphone as mobile,
             u.company_name as companyName,
-            (SELECT og.create_time FROM order_goods og LEFT JOIN `order` o ON og.order_sn = o.order_sn WHERE og.goods_id = g.goods_id AND o.user_id = u.user_id) AS orderTimeLong,
+            (SELECT og.create_time FROM order_goods og LEFT JOIN `order` o ON og.order_sn = o.order_sn WHERE og.goods_id = g.goods_id AND o.user_id = u.user_id AND og.pay_status in (2, 3, 4)
+        AND og.refund_status !=2
+        ORDER BY og.create_time DESC LIMIT 1) AS orderTimeLong,
             cg.class_start_time as createTimeLong,
             cgu.official_status_time as doTimeLong,
             cgu.official_status as reportStatu,

+ 37 - 0
zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeUserMapper.xml

@@ -124,6 +124,12 @@
         <result property="serviceEndTime" column="service_end_time"/>
         <result property="oneInchPhotos" column="one_inch_photos"/>
         <result property="periodTime" column="period_time"/>
+        <result property="sectionName" column="section_name"/>
+        <result property="companyName" column="company_name"/>
+        <result property="durationTime" column="duration_time"/>
+        <result property="recordStartTime" column="record_start_time"/>
+        <result property="recordEndTime" column="record_end_time"/>
+        <result property="onLineTime" column="on_line_time"/>
     </resultMap>
 
     <resultMap type="com.zhongzheng.modules.grade.vo.ClassPeriodUserVo" id="ClassPeriodUserVo">
@@ -316,6 +322,37 @@
         order by u.create_time desc
     </select>
 
+    <select id="listUserVideoRecord" parameterType="com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo"
+            resultMap="ClassPeriodStudentVo">
+        SELECT
+            up.* ,cg.class_name,cs.duration_time,u.id_card,u.realname,u.one_inch_photos,u.company_name,cs.`name` as section_name,ups.record_start_time,ups.record_end_time,ups.update_time as on_line_time
+        FROM
+            user_period up
+                LEFT JOIN user_period_status ups ON up.id = ups.period_id
+                LEFT JOIN class_grade cg on up.grade_id = cg.grade_id
+                LEFT JOIN  goods g ON up.goods_id = g.goods_id
+                LEFT JOIN course_section cs ON up.section_id = cs.section_id
+                LEFT JOIN `user` u ON up.user_id = u.user_id
+        WHERE
+            up.grade_id > 0  and up.type = 1
+        <if test="businessId != null and businessId != ''">
+            AND g.business_id = #{businessId}
+        </if>
+        <if test="educationTypeId != null and educationTypeId != ''">
+            AND g.education_type_id = #{educationTypeId}
+        </if>
+        <if test="realname != null and realname != ''">
+            AND u.realname = #{realname}
+        </if>
+        <if test="idCard != null and idCard != ''">
+            AND u.id_card = #{idCard,typeHandler=com.zhongzheng.common.type.EncryptHandler}
+        </if>
+        <if test="companyName != null and companyName != ''">
+            AND u.company_name = #{companyName}
+        </if>
+        order by up.create_time desc
+    </select>
+
 
     <select id="listUserPeriod" parameterType="com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo"
             resultMap="ClassPeriodStudentVo">

+ 0 - 1
zhongzheng-system/src/main/resources/mapper/modules/grade/UserPeriodStatusMapper.xml

@@ -48,7 +48,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             ,(SELECT name FROM course_section cs where up.section_id= cs.section_id)  as type_name,
             (SELECT duration_time FROM course_section cs where up.section_id= cs.section_id)  as duration_time
         </if>
-
         FROM
         user_period_status ups
         LEFT JOIN user_period up ON up.id = ups.period_id

+ 1 - 0
zhongzheng-system/src/main/resources/mapper/modules/system/SysUserMapper.xml

@@ -78,6 +78,7 @@
                u.create_by,
                u.create_time,
                u.remark,
+               u.pwd_time,
                d.dept_id,
                d.parent_id,
                d.dept_name,

+ 1 - 0
zhongzheng-system/src/main/resources/mapper/modules/user/UserMapper.xml

@@ -59,6 +59,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="lastStudyTime" column="last_study_time"/>
         <result property="job" column="job"/>
         <result property="shareCode" column="share_code"/>
+        <result property="pwdTime" column="pwd_time"/>
     </resultMap>