yangdamao 2 лет назад
Родитель
Сommit
26364badb2
100 измененных файлов с 3173 добавлено и 258 удалено
  1. 4 2
      run-pre.sh
  2. 2 9
      run-prod.sh
  3. 13 39
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/common/CommonController.java
  4. 4 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/financial/TopCostInstTpController.java
  5. 2 3
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/financial/TopDivideLogController.java
  6. 15 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/order/TopOldOrderController.java
  7. 4 2
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/order/TopOrderAcceptanceController.java
  8. 18 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/order/TopOrderStatisticsController.java
  9. 33 6
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/order/TopSharedCustomerController.java
  10. 1 1
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/settle/TopInstSettleController.java
  11. 1 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopInstCategoryController.java
  12. 1 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopInstitutionController.java
  13. 17 2
      zhongzheng-admin-saas/src/main/resources/application-dev.yml
  14. 6 9
      zhongzheng-admin-saas/src/main/resources/application-pre.yml
  15. 24 3
      zhongzheng-admin-saas/src/main/resources/application-prod.yml
  16. 2 2
      zhongzheng-admin-saas/src/main/resources/application.yml
  17. 85 8
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  18. 5 6
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java
  19. 45 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderController.java
  20. 89 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderHandleController.java
  21. 52 3
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderInvoiceController.java
  22. 10 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java
  23. 219 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/DangAnController.java
  24. 35 13
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserController.java
  25. 41 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/vod/VodVideoController.java
  26. 19 3
      zhongzheng-admin/src/main/resources/application-dev.yml
  27. 6 9
      zhongzheng-admin/src/main/resources/application-pre.yml
  28. 24 3
      zhongzheng-admin/src/main/resources/application-prod.yml
  29. 2 2
      zhongzheng-admin/src/main/resources/application-trial.yml
  30. 2 2
      zhongzheng-admin/src/main/resources/application.yml
  31. 3 0
      zhongzheng-api/src/main/java/com/zhongzheng/ZhongZhengApiApplication.java
  32. 22 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/course/CourseController.java
  33. 7 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/order/OrderController.java
  34. 155 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/order/OrderHandleController.java
  35. 107 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserHandleController.java
  36. 42 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/vod/VodVideoController.java
  37. 20 4
      zhongzheng-api/src/main/resources/application-dev.yml
  38. 6 9
      zhongzheng-api/src/main/resources/application-pre.yml
  39. 26 5
      zhongzheng-api/src/main/resources/application-prod.yml
  40. 5 5
      zhongzheng-api/src/main/resources/application-trial.yml
  41. 5 2
      zhongzheng-api/src/main/resources/application.yml
  42. 6 0
      zhongzheng-common/pom.xml
  43. 42 2
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java
  44. 2 2
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java
  45. 138 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/bank/DCCryptor.java
  46. 169 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/bank/DCHelper.java
  47. 61 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/bank/GENKey.java
  48. 1 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/http/HttpUtils.java
  49. 1 1
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/poi/EasyPoiUtil.java
  50. 2 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java
  51. 2 2
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineHandler.java
  52. 499 18
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java
  53. 16 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java
  54. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/impl/ActivityRecommendServiceImpl.java
  55. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/OssService.java
  56. 22 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/impl/OssServiceImpl.java
  57. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alisms/service/impl/AliSmsServiceImpl.java
  58. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/mapper/QuestionChapterExamMapper.java
  59. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/IQuestionChapterExamService.java
  60. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/IQuestionService.java
  61. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionChapterExamServiceImpl.java
  62. 623 16
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java
  63. 27 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/ExternalQuestionChildTopicVo.java
  64. 20 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/ExternalQuestionChildVo.java
  65. 28 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/ExternalQuestionDetailVo.java
  66. 25 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/ExternalQuestionVo.java
  67. 22 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionDetailVo.java
  68. 27 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionInfoVo.java
  69. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/ProfileTpAddBo.java
  70. 2 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/ProfileTpEditBo.java
  71. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/domain/ProfileTp.java
  72. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/ICertificateTpService.java
  73. 60 45
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/CertificateTpServiceImpl.java
  74. 37 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/UserProfileServiceImpl.java
  75. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/vo/ProfileTpVo.java
  76. 2 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseAddBo.java
  77. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseChapterAddBo.java
  78. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseChapterEditBo.java
  79. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseChapterQueryBo.java
  80. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseEditBo.java
  81. 2 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseModuleAddBo.java
  82. 2 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseModuleEditBo.java
  83. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseModuleQueryBo.java
  84. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseQueryBo.java
  85. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseSectionAddBo.java
  86. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseSectionEditBo.java
  87. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseSectionQueryBo.java
  88. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/Course.java
  89. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseChapter.java
  90. 2 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseModule.java
  91. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseSection.java
  92. 6 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseService.java
  93. 73 5
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java
  94. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseChapterSectionVo.java
  95. 2 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseChapterVo.java
  96. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseModuleChapterVo.java
  97. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseModuleVo.java
  98. 4 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseSectionImport.java
  99. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseSectionVo.java
  100. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseUserChapterSectionVo.java

+ 4 - 2
run-pre.sh

@@ -76,7 +76,6 @@ docker run \
 -d ${group_admin_name}/${app_admin_name}:${app_admin_version}
 echo '----start container admin----'
 
-
 echo "开始等待20秒..."
 # 1-10秒内随机
 sleep 5
@@ -117,4 +116,7 @@ docker run \
 -v /mydata/app/${app_admin_name}/logs:/var/logs \
 -v /data/nginx/conf.d:/data/nginx/conf.d \
 -d ${group_admin_name}/${app_admin_name}:${app_admin_version}
-echo '----start container admin top----'
+echo '----start container admin top----'
+
+
+

+ 2 - 9
run-prod.sh

@@ -1,10 +1,5 @@
 
 
-echo "开始等待20秒..."
-# 1-10秒内随机
-sleep 5
-echo "等待后继续"
-
 #!/usr/bin/env bash
 # 定义应用组名
 group_admin_name='zhongzheng'
@@ -40,7 +35,5 @@ docker run \
 -d ${group_admin_name}/${app_admin_name}:${app_admin_version}
 echo '----start container admin----'
 
-echo "开始等待20秒..."
-# 1-10秒内随机
-sleep 5
-echo "等待后继续"
+
+

+ 13 - 39
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -1,61 +1,25 @@
 package com.zhongzheng.controller.common;
 
-import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.zhongzheng.common.annotation.Log;
 import com.zhongzheng.common.config.RuoYiConfig;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
-import com.zhongzheng.common.core.domain.model.TopLoginUser;
 import com.zhongzheng.common.core.page.TableDataInfo;
-import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.enums.BusinessType;
 import com.zhongzheng.common.exception.CustomException;
-import com.zhongzheng.common.utils.DateUtils;
-import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.common.utils.file.FileUtils;
-import com.zhongzheng.framework.web.service.WxLoginService;
-import com.zhongzheng.modules.activity.vo.ActivityGoodsPriceVo;
-import com.zhongzheng.modules.base.bo.ConfigQueryBo;
-import com.zhongzheng.modules.course.bo.CourseQueryBo;
-import com.zhongzheng.modules.course.bo.CourseTopicGoodsQueryBo;
-import com.zhongzheng.modules.course.service.ICourseService;
-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.data.domain.DataWxTpClick;
-import com.zhongzheng.modules.data.service.IDataWxTpClickService;
-import com.zhongzheng.modules.distribution.bo.DistributionActivityGoodsQueryBo;
-import com.zhongzheng.modules.distribution.service.IDistributionActivityGoodsService;
-import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
-import com.zhongzheng.modules.distribution.vo.DistributionSellerVo;
-import com.zhongzheng.modules.goods.bo.DistributionGoodsBo;
-import com.zhongzheng.modules.goods.service.IGoodsSpecTemplateService;
-import com.zhongzheng.modules.goods.vo.GoodsSpecTemplateVo;
-import com.zhongzheng.modules.goods.vo.GoodsUserVo;
-import com.zhongzheng.modules.goods.vo.GoodsVo;
-import com.zhongzheng.modules.order.domain.Printer;
 import com.zhongzheng.modules.sdk.bo.TopNuoMplatformLogAddBo;
 import com.zhongzheng.modules.sdk.service.ITopNuoMplatformLogService;
-import com.zhongzheng.modules.sdk.service.NuonuoService;
-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.top.financial.bo.*;
 import com.zhongzheng.modules.top.financial.vo.TopOrderLogVo;
+import com.zhongzheng.modules.top.financial.vo.TopOrderOrgVo;
 import com.zhongzheng.modules.top.financial.vo.TopOrderRevocationVo;
 import com.zhongzheng.modules.top.financial.vo.TopSellerDiscountVo;
 import com.zhongzheng.modules.top.goods.bo.*;
 import com.zhongzheng.modules.top.goods.service.ITopOldOrderService;
 import com.zhongzheng.modules.top.order.bo.PayOrderCallBackBo;
-import com.zhongzheng.modules.wx.bo.WxInfoBo;
-import com.zhongzheng.modules.wx.bo.WxInfoQuery;
-import com.zhongzheng.modules.wx.bo.WxServerBody;
-import com.zhongzheng.modules.wx.domain.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -68,8 +32,6 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.text.ParseException;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -313,4 +275,16 @@ public class CommonController extends BaseController {
         List<TopOrderLogVo> list = iTopOldOrderService.logList(bo);
         return getDataTable(list);
     }
+
+    /**
+     * 获取订单商品信息
+     */
+    @ApiOperation("获取订单商品信息")
+    @PostMapping("/order/goods/list")
+    public AjaxResult<TopOrderOrgVo> getOrderGoodsList(@RequestBody TopOldOrderQueryBo bo) {
+        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+            throw new CustomException("签名错误");
+        }
+        return AjaxResult.success(iTopOldOrderService.getTopOrderGoodsList(bo));
+    }
 }

+ 4 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/financial/TopCostInstTpController.java

@@ -1,5 +1,6 @@
 package com.zhongzheng.controller.financial;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Arrays;
 
@@ -52,6 +53,9 @@ public class TopCostInstTpController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo<TopCostInstTpVo> list(TopCostInstTpQueryBo bo) {
         startPage();
+        List<Integer> statusList = new ArrayList<>();
+        statusList.add(1);
+        bo.setStatusList(statusList);
         List<TopCostInstTpVo> list = iTopCostInstTpService.selectList(bo);
         return getDataTable(list);
     }

+ 2 - 3
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/financial/TopDivideLogController.java

@@ -127,10 +127,9 @@ public class TopDivideLogController extends BaseController {
     @ApiOperation("查询月份订单列表")
     @PreAuthorize("@ss.hasPermi('system:log:list')")
     @GetMapping("/monthOrderList")
-    public TableDataInfo<TopDivideOrderVo> getMonthOrderList(TopDivideOrderQueryBo bo) {
-        startPage();
+    public AjaxResult<List<TopDivideOrderVo>> getMonthOrderList(TopDivideOrderQueryBo bo) {
         List<TopDivideOrderVo> list = iTopDivideOrderService.getMonthOrderList(bo);
-        return getDataTable(list);
+        return AjaxResult.success(list);
     }
 
     @ApiOperation("查询月份订单统计")

+ 15 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/order/TopOldOrderController.java

@@ -5,8 +5,10 @@ import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.core.domain.model.TopLoginUser;
 import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.poi.EasyPoiUtil;
 import com.zhongzheng.common.utils.poi.ExcelUtil;
 import com.zhongzheng.framework.web.service.TopTokenService;
+import com.zhongzheng.modules.bank.vo.QuestionImportV2;
 import com.zhongzheng.modules.top.financial.bo.OrderRefundPayBo;
 import com.zhongzheng.modules.top.financial.bo.TopDivideLogQueryBo;
 import com.zhongzheng.modules.top.financial.bo.TopDivideOrderQueryBo;
@@ -16,6 +18,7 @@ import com.zhongzheng.modules.top.financial.vo.TopOrderLogVo;
 import com.zhongzheng.modules.top.goods.bo.*;
 import com.zhongzheng.modules.top.goods.service.ITopOldOrderService;
 import com.zhongzheng.modules.top.goods.vo.*;
+import com.zhongzheng.modules.top.order.bo.TopOldOrderCustomerBo;
 import com.zhongzheng.modules.top.order.vo.TopOldOrderCommissionExportVo;
 import com.zhongzheng.modules.top.order.vo.TopOldOrderCompanyExportVo;
 import com.zhongzheng.modules.top.order.vo.TopOldOrderSellerExportVo;
@@ -25,6 +28,7 @@ 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.util.List;
 import java.util.Map;
@@ -332,4 +336,15 @@ public class TopOldOrderController extends BaseController {
         return AjaxResult.success(iTopOldOrderService.getOrderRefundPayDetail(orderSn));
     }
 
+    /**
+     * 订单导入
+     */
+    @ApiOperation("订单导入")
+    @PostMapping("/customer/import")
+    public AjaxResult importOldOrderCustomer(MultipartFile file) {
+        List<TopOldOrderCustomerBo> customerBos = EasyPoiUtil.importExcel(file,0,1,TopOldOrderCustomerBo.class);
+        iTopOldOrderService.importOldOrderCustomer(customerBos);
+        return AjaxResult.success();
+    }
+
 }

+ 4 - 2
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/order/TopOrderAcceptanceController.java

@@ -8,6 +8,7 @@ import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.core.domain.model.TopLoginUser;
 import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.poi.EasyPoiUtil;
 import com.zhongzheng.common.utils.poi.ExcelUtil;
@@ -121,11 +122,11 @@ public class TopOrderAcceptanceController extends BaseController {
 
     @ApiOperation("认款记录导入")
     @PostMapping("/importData")
-    public AjaxResult<Void> importData(MultipartFile file) {
+    public AjaxResult<Void> importData(MultipartFile files) {
         ExcelUtil<TopOrderAcceptanceExportBo> util = new ExcelUtil<TopOrderAcceptanceExportBo>(TopOrderAcceptanceExportBo.class);
         List<TopOrderAcceptanceExportBo> acceptanceExportBos;
         try {
-            acceptanceExportBos = util.importExcel(file.getInputStream());
+            acceptanceExportBos = util.importExcel(files.getInputStream());
         }catch (Exception e){
             e.printStackTrace();
             throw new IllegalArgumentException("模板格式不正确,请重新下载模板");
@@ -142,6 +143,7 @@ public class TopOrderAcceptanceController extends BaseController {
         List<TopOrderAcceptanceVo> list = iTopOrderAcceptanceService.queryAcceptanceList(bo);
         List<TopOrderAcceptanceExportBo> collect = list.stream().map(item -> {
             TopOrderAcceptanceExportBo exportBo = BeanUtil.toBean(item, TopOrderAcceptanceExportBo.class);
+            exportBo.setIncomeTimeStr(DateUtils.timestampToDateFormat(item.getIncomeTime(),"yyyy/MM/dd"));
             return exportBo;
         }).collect(Collectors.toList());
         ExcelUtil<TopOrderAcceptanceExportBo> util = new ExcelUtil<TopOrderAcceptanceExportBo>(TopOrderAcceptanceExportBo.class);

+ 18 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/order/TopOrderStatisticsController.java

@@ -146,4 +146,22 @@ public class TopOrderStatisticsController extends BaseController {
         List<TopOrderStatisticsDetailVo> list = iTopOldOrderService.getBusinessDetailList(bo);
         return getDataTable(list);
     }
+
+    @ApiOperation("机构走势图")
+    @GetMapping("/tenantView")
+    public AjaxResult<TopOrderStatisticsViewVo> getStatisticsTenantView(TopOrderStatisticsViewBo bo) {
+        return AjaxResult.success(iTopOldOrderService.getStatisticsTenantView(bo));
+    }
+
+    @ApiOperation("业务层次走势图")
+    @GetMapping("/businessView")
+    public AjaxResult<TopOrderStatisticsViewVo> getStatisticsBusinessView(TopOrderStatisticsViewBo bo) {
+        return AjaxResult.success(iTopOldOrderService.getStatisticsBusinessView(bo));
+    }
+
+    @ApiOperation("机构业务员列表")
+    @GetMapping("/tenantCreateList")
+    public AjaxResult<List<TopOrderStatisticsTwoVo>> getTenantCreateList(TopOrderStatisticsViewBo bo) {
+        return AjaxResult.success(iTopOldOrderService.getTenantCreateList(bo));
+    }
 }

+ 33 - 6
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/order/TopSharedCustomerController.java

@@ -64,8 +64,8 @@ public class TopSharedCustomerController extends BaseController {
      */
     @ApiOperation("城市转化排行")
     @GetMapping("/order/area")
-    public AjaxResult<TopOrderAreaVo> getOrderAreaData(TopOrderStatisticsBo bo) {
-        return AjaxResult.success(iTopOldOrderService.getOrderAreaData(bo));
+    public TableDataInfo<TopOrderAreaDataVo> getOrderAreaData(TopOrderStatisticsBo bo) {
+        return iTopOldOrderService.getOrderAreaData(bo);
     }
 
     /**
@@ -73,16 +73,43 @@ public class TopSharedCustomerController extends BaseController {
      */
     @ApiOperation("客户转化排名")
     @GetMapping("/conversion/rate")
-    public AjaxResult<TopConversionRateVo> getConversionRateData(TopOrderStatisticsBo bo) {
-        return AjaxResult.success(iTopOldOrderService.getConversionRateData(bo));
+    public TableDataInfo<TopConversionRateDataVo> getConversionRateData(TopOrderStatisticsBo bo) {
+        return iTopOldOrderService.getConversionRateData(bo);
     }
 
     /**
-     * 公海客户列表
+     * 公海客户走势图
      */
-    @ApiOperation("公海客户列表")
+    @ApiOperation("公海客户走势图")
     @GetMapping("/customer/list")
     public AjaxResult<List<TopConversionRateTrendVo>> getCustomerListData(TopOrderStatisticsBo bo) {
         return AjaxResult.success(iTopOldOrderService.getCustomerListData(bo));
     }
+
+    /**
+     * 公海客户详情
+     */
+    @ApiOperation("公海客户详情")
+    @GetMapping("/customer/order")
+    public TableDataInfo<TopConversionRateDataVo> getCustomerOrderData(TopOrderStatisticsBo bo) {
+        return iTopOldOrderService.getCustomerOrderData(bo);
+    }
+
+    /**
+     * 公海客户机构列表
+     */
+    @ApiOperation("公海客户机构列表")
+    @GetMapping("/tenant")
+    public AjaxResult<List<TopTenantDataVo>> getTenantListData() {
+        return AjaxResult.success(iTopOldOrderService.getTenantListData());
+    }
+
+    /**
+     * 公海客户业务员列表
+     */
+    @ApiOperation("公海客户业务员列表")
+    @GetMapping("/sale")
+    public AjaxResult<List<TopTenantDataVo>> getSaleListData(TopOrderStatisticsBo bo) {
+        return AjaxResult.success(iTopOldOrderService.getSaleListData(bo));
+    }
 }

+ 1 - 1
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/settle/TopInstSettleController.java

@@ -197,7 +197,7 @@ public class TopInstSettleController extends BaseController {
      */
     @ApiOperation("结算单总金额")
     @PostMapping("/total/money")
-    public AjaxResult<BigDecimal> getSettleTotalMoney(SettleQueryBo bo) {
+    public AjaxResult<TopOrderSettleVo> getSettleTotalMoney(SettleQueryBo bo) {
         TopLoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         bo.setLoginId(loginUser.getUser().getUserId());
         bo.setLoginName(loginUser.getUser().getUserName());

+ 1 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopInstCategoryController.java

@@ -52,6 +52,7 @@ public class TopInstCategoryController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo<TopInstCategoryVo> list(TopInstCategoryQueryBo bo) {
         startPage();
+        bo.setStatus(1);
         List<TopInstCategoryVo> list = iTopInstCategoryService.queryList(bo);
         return getDataTable(list);
     }

+ 1 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopInstitutionController.java

@@ -53,6 +53,7 @@ public class TopInstitutionController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo<TopInstitutionVo> list(TopInstitutionQueryBo bo) {
         startPage();
+        bo.setStatus(1);
         List<TopInstitutionVo> list = iTopInstitutionService.queryList(bo);
         return getDataTable(list);
     }

+ 17 - 2
zhongzheng-admin-saas/src/main/resources/application-dev.yml

@@ -71,8 +71,8 @@ spring:
 aliyun:
     oss:
         endpoint: https://file-dev.xyyxt.net # oss对外服务的访问域名
-        accessKeyId: LTAIgC8O2WUXvXuR  # 访问身份验证中用到用户标识
-        accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
+        accessKeyId: LTAI5tDbpYmpifZYNX8S3kt1  # 访问身份验证中用到用户标识
+        accessKeySecret: jCdSPAj58ZXOLsWpV8bCgNOYrEK0de # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
         bucketName: zhongzheng-test # oss的存储空间
         policy:
             expire: 30 # 签名有效期(S)
@@ -170,6 +170,9 @@ oldOrder:
 
 oldSys:
     host: http://gdxypx.xy.com
+    goods: http://gdxypx.xy.com/WitSystem/BussinessApi/NewYxtLogin
+    question: http://192.168.1.121:8057/WordData/GetMeasureList
+    questionDetail: http://192.168.1.121:8057/WordData/GetTopicList
 
 invoice:
     host: http://192.168.1.222:7077/sys/common/openMplatform/log
@@ -186,6 +189,8 @@ exam:
     subscribeSaveExam: http://192.168.1.7:9099/cd/subscribe/save/exam
     subscribeUpdateExam: http://192.168.1.7:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://192.168.1.7:9099/cd/subscribe/add/num
+    question: http://120.79.166.78:19013/common/question/getMeasureList
+    questionDetail: http://120.79.166.78:19013/common/question/getTopicList
 
 shared:
     statistics: http://gdxypx.xy.com/WitSystem/BussinessApi/HighSeasData
@@ -194,4 +199,14 @@ shared:
     orderArea: http://gdxypx.xy.com/WitSystem/BussinessApi/OrderAreaData
     rateData: http://gdxypx.xy.com//WitSystem/BussinessApi/CustomerConversionRateData
     rateTrend: http://gdxypx.xy.com/WitSystem/BussinessApi/CustomerConversionRateTrendData
+    customerOrder: http://gdxypx.xy.com/WitSystem/BussinessApi/CustomerOrderData
+    tenantData: http://gdxypx.xy.com/witsystem/bussinessapi/GetOrgList
+    saleData: http://gdxypx.xy.com/witsystem/bussinessapi/GetSaleListByOrgId
 
+ZsBank:
+    publickey: BNsIe9U0x8IeSe4h/dxUzVEz9pie0hDSfMRINRXc7s1UIXfkExnYECF4QqJ2SnHxLv3z/99gsfDQrQ6dzN5lZj0=
+    privatekey: NBtl7WnuUtA2v5FaebEkU0/Jj1IodLGT6lQqwkzmd2E=
+    sm4key: VuAzSWQhsoNqzn0K
+
+record:
+    downloadPath: http://192.168.1.7:9090/common/user/data/download

+ 6 - 9
zhongzheng-admin-saas/src/main/resources/application-pre.yml

@@ -71,8 +71,8 @@ spring:
 aliyun:
     oss:
         endpoint: https://file.xyyxt.net # oss对外服务的访问域名
-        accessKeyId: LTAIgC8O2WUXvXuR  # 访问身份验证中用到用户标识
-        accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
+        accessKeyId: LTAI5tDbpYmpifZYNX8S3kt1  # 访问身份验证中用到用户标识
+        accessKeySecret: jCdSPAj58ZXOLsWpV8bCgNOYrEK0de # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
         bucketName: zhongzheng-prod # oss的存储空间
         policy:
             expire: 30 # 签名有效期(S)
@@ -187,10 +187,7 @@ exam:
     subscribeUpdateExam: http://192.168.1.7:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://192.168.1.7:9099/cd/subscribe/add/num
 
-shared:
-    statistics: http://gdxypx.xy.com/WitSystem/BussinessApi/HighSeasData
-    customer: http://gdxypx.xy.com/WitSystem/BussinessApi/CustomerStatsData
-    cert: http://gdxypx.xy.com/WitSystem/BussinessApi/CertStatsData
-    orderArea: http://gdxypx.xy.com/WitSystem/BussinessApi/OrderAreaData
-    rateData: http://gdxypx.xy.com//WitSystem/BussinessApi/CustomerConversionRateData
-    rateTrend: http://gdxypx.xy.com/WitSystem/BussinessApi/CustomerConversionRateTrendData
+ZsBank:
+    publickey: BNsIe9U0x8IeSe4h/dxUzVEz9pie0hDSfMRINRXc7s1UIXfkExnYECF4QqJ2SnHxLv3z/99gsfDQrQ6dzN5lZj0=
+    privatekey: NBtl7WnuUtA2v5FaebEkU0/Jj1IodLGT6lQqwkzmd2E=
+    sm4key: VuAzSWQhsoNqzn0K

+ 24 - 3
zhongzheng-admin-saas/src/main/resources/application-prod.yml

@@ -71,8 +71,8 @@ spring:
 aliyun:
     oss:
         endpoint: https://file.xyyxt.net # oss对外服务的访问域名
-        accessKeyId: LTAIgC8O2WUXvXuR  # 访问身份验证中用到用户标识
-        accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
+        accessKeyId: LTAI5tDbpYmpifZYNX8S3kt1  # 访问身份验证中用到用户标识
+        accessKeySecret: jCdSPAj58ZXOLsWpV8bCgNOYrEK0de # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
         bucketName: zhongzheng-prod # oss的存储空间
         policy:
             expire: 30 # 签名有效期(S)
@@ -134,7 +134,7 @@ oldStudySys:
     classOpenPath: https://www.xyyxt.net/System/BussinessApi/OpenClass
     salePassword: http://www.xyyxt.net/WitSystem/BussinessApi/GetSaleInfo
     updateInvoicePath: http://www.xyyxt.net/system/BussinessApi/UpdateInvoiceData
-    createExamPath: http://gdxypx.xy.com/system/BussinessApi/CreateSameClass
+    createExamPath: http://www.xyyxt.net/system/BussinessApi/CreateSameClass
 
 officialPush:
     infoPath: https://jypt.gdcic.net/organjxjy/ShangBaoMingdan
@@ -170,6 +170,9 @@ oldOrder:
 
 oldSys:
     host: https://www.xyyxt.net
+    goods: http://www.xyyxt.net/system/BussinessApi/NewYxtLogin
+    question: http://192.168.1.121:8057/WordData/GetMeasureList
+    questionDetail: http://192.168.1.121:8057/WordData/GetTopicList
 
 invoice:
     host: https://ptapi.gdzzkj.net/sys/common/openMplatform/log
@@ -186,3 +189,21 @@ exam:
     subscribeSaveExam: http://39.108.7.155:9099/cd/subscribe/save/exam
     subscribeUpdateExam: http://39.108.7.155:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://39.108.7.155:9099/cd/subscribe/add/num
+    question: http://120.79.166.78:19013/common/question/getMeasureList
+    questionDetail: http://120.79.166.78:19013/common/question/getTopicList
+
+shared:
+    statistics: http://www.xyyxt.net/WitSystem/BussinessApi/HighSeasData
+    customer: http://www.xyyxt.net/WitSystem/BussinessApi/CustomerStatsData
+    cert: http://www.xyyxt.net/WitSystem/BussinessApi/CertStatsData
+    orderArea: http://www.xyyxt.net/WitSystem/BussinessApi/OrderAreaData
+    rateData: http://www.xyyxt.net//WitSystem/BussinessApi/CustomerConversionRateData
+    rateTrend: http://www.xyyxt.net/WitSystem/BussinessApi/CustomerConversionRateTrendData
+    customerOrder: http://www.xyyxt.net/WitSystem/BussinessApi/CustomerOrderData
+    tenantData: http://www.xyyxt.net/witsystem/bussinessapi/GetOrgList
+    saleData: http://www.xyyxt.net/witsystem/bussinessapi/GetSaleListByOrgId
+
+ZsBank:
+    publickey: BNsIe9U0x8IeSe4h/dxUzVEz9pie0hDSfMRINRXc7s1UIXfkExnYECF4QqJ2SnHxLv3z/99gsfDQrQ6dzN5lZj0=
+    privatekey: NBtl7WnuUtA2v5FaebEkU0/Jj1IodLGT6lQqwkzmd2E=
+    sm4key: VuAzSWQhsoNqzn0K

+ 2 - 2
zhongzheng-admin-saas/src/main/resources/application.yml

@@ -267,8 +267,8 @@ aliyun:
     forgetTemplateCode: SMS_228685033
     pwdTemplateCode: SMS_230220381
     bindNewTelCode: SMS_232178371
-    accessKeyId: LTAIgC8O2WUXvXuR
-    accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX
+    accessKeyId: LTAI5tDbpYmpifZYNX8S3kt1
+    accessKeySecret: jCdSPAj58ZXOLsWpV8bCgNOYrEK0de
     OpenTheGoodsCode: SMS_230970155     #商品开通提醒
     informationNotificationCode: SMS_230965149  #完善报名资料通知
     materialReviewCode: SMS_230980165         #报名资料审核通过通知

+ 85 - 8
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -16,6 +16,7 @@ import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.enums.BusinessType;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.type.EncryptHandler;
+import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.common.utils.file.FileUploadUtils;
@@ -35,6 +36,8 @@ import com.zhongzheng.modules.base.bo.ConfigQueryBo;
 import com.zhongzheng.modules.base.service.ICertificateTpService;
 import com.zhongzheng.modules.course.bo.ExternalQuestionBo;
 import com.zhongzheng.modules.course.bo.ReplenishExamBo;
+import com.zhongzheng.modules.course.domain.Major;
+import com.zhongzheng.modules.course.service.IMajorService;
 import com.zhongzheng.modules.course.vo.CourseChapterVo;
 import com.zhongzheng.modules.course.vo.ExternalQuestionVo;
 import com.zhongzheng.modules.course.vo.ReplenishExamVo;
@@ -54,9 +57,11 @@ import com.zhongzheng.modules.goods.bo.UserGoodsListBo;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.*;
 import com.zhongzheng.modules.grade.bo.*;
+import com.zhongzheng.modules.grade.mapper.ClassGradeUserMapper;
 import com.zhongzheng.modules.grade.service.IClassGradeService;
 import com.zhongzheng.modules.grade.service.IClassGradeUserService;
 import com.zhongzheng.modules.grade.service.IUserPeriodService;
+import com.zhongzheng.modules.grade.vo.ClassGradeUserVo;
 import com.zhongzheng.modules.grade.vo.ClassPeriodStudentVo;
 import com.zhongzheng.modules.grade.vo.SyncGoodsExport;
 import com.zhongzheng.modules.order.bo.TopOldOrderRefundBo;
@@ -66,6 +71,7 @@ import com.zhongzheng.modules.order.service.IOrderGoodsRefundService;
 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.sdk.service.IZsBankService;
 import com.zhongzheng.modules.system.bo.SysTenantAdminBo;
 import com.zhongzheng.modules.system.bo.SysTenantAdminOldBo;
 import com.zhongzheng.modules.system.bo.SysTenantQueryBo;
@@ -74,6 +80,7 @@ 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;
+import com.zhongzheng.modules.tencentcloud.service.IVodService;
 import com.zhongzheng.modules.top.user.bo.TopSysTenantRegisterAddBo;
 import com.zhongzheng.modules.top.user.service.ITopSysTenantRegisterService;
 import com.zhongzheng.modules.user.service.IUserService;
@@ -101,6 +108,8 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 /**
@@ -156,16 +165,21 @@ public class CommonController extends BaseController {
     private IUserSubscribeService iUserSubscribeService;
     @Autowired
     private IClassGradeUserService iClassGradeUserService;
+    @Autowired
+    private IQuestionService iQuestionService;
 
     @Autowired
-    private IExamService iExamService;
+    private ICertificateTpService iCertificateTpService;
 
     @Autowired
-    private IQuestionOtherService iQuestionOtherService;
+    private ClassGradeUserMapper classGradeUserMapper;
+
     @Autowired
-    private OssService ossService;
+    private IVodService iVodService;
+
     @Autowired
-    private ICertificateTpService iCertificateTpService;
+    private IMajorService iMajorService;
+    private IZsBankService iZsBankService;
     /**
      * 通用下载请求
      *
@@ -612,7 +626,7 @@ public class CommonController extends BaseController {
     @ApiOperation("decodeTel加密")
     @GetMapping("common/free/decodeTel")
     public AjaxResult<String> decodeTel(String key) {
-        return AjaxResult.success("成功", EncryptHandler.decrypt(key));
+        return AjaxResult.success("成功", EncryptHandler.encrypt(key));
     }
 
     @ApiOperation("分销打款结果回调")
@@ -780,14 +794,25 @@ public class CommonController extends BaseController {
         return AjaxResult.success(iClassGradeUserService.pushOfficialPeriodMore(list));
     }
 
-   
+
 
     @ApiOperation("测试获取山东题库")
     @PreAuthorize("@ss.hasPermi('system:withdrawal:add')")
     @Log(title = "测试获取山东题库", businessType = BusinessType.INSERT)
     @GetMapping("/common/free/getShanDongExam")
     public AjaxResult getShanDongExam(GoodsQueryBo bo) throws UnsupportedEncodingException {
-        System.out.println(bo.getBuyNote());
+   //     System.out.println(bo.getBuyNote());
+        iVodService.describeMediaInfos(null);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("测试网银")
+    @PreAuthorize("@ss.hasPermi('system:withdrawal:add')")
+    @Log(title = "测试网银", businessType = BusinessType.INSERT)
+    @GetMapping("/common/free/zsBank")
+    public AjaxResult zsBank() {
+        String date = DateUtils.dateTimeNow("yyyyMMdd");
+        System.out.println(iZsBankService.searchBreakPoint(null,"755915680210507",date,date));
         return AjaxResult.success();
     }
 
@@ -796,8 +821,60 @@ public class CommonController extends BaseController {
     @ApiOperation("旧系统post请求")
     @PostMapping("/common/free/clientPost")
     public AjaxResult<Void> clientPost(@RequestBody ClientPostAddBo bo) {
-        return AjaxResult.success(iClassGradeUserService.sendClientPost(bo));
+        ClassGradeUserQueryBo queryBo = new ClassGradeUserQueryBo();
+        queryBo.setUserId(434L);
+        queryBo.setGradeId(1738L);
+        queryBo.setOrderGoodsId(5252L);
+        ClassGradeUserVo userVo = classGradeUserMapper.selectUser(queryBo);
+        Major major = iMajorService.getOne(new LambdaQueryWrapper<Major>()
+                .eq(Major::getId, 38));
+        if("材料员".equals(major.getCategoryName())||"劳务员".equals(major.getCategoryName())||"资料员".equals(major.getCategoryName())){
+            if(userVo.getEduLevel().equals("小学")||userVo.getEduLevel().equals("中学")){
+                userVo.setEduLevel("高中");
+            }
+        }else{
+            if(userVo.getEduLevel().equals("小学")||userVo.getEduLevel().equals("中学")||userVo.getEduLevel().equals("职高")||userVo.getEduLevel().equals("高中")){
+                userVo.setEduLevel("专科");
+            }
+        }
+        System.out.println(userVo);
+        return AjaxResult.success();
     }
 
+    @ApiOperation("新考题库导入")
+    @GetMapping("/common/question/import")
+    public AjaxResult<Void> questionImport() {
+        iQuestionService.questionImport();
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("七大员推送权限结果回调")
+    @PreAuthorize("@ss.hasPermi('system:withdrawal:add')")
+    @PostMapping("/common/free/sevenPushAuthCallBack")
+    public AjaxResult sevenPushAuthCallBack(@RequestBody SevenPushAuthAddBo bo) {
+        ServletUtils.getRequestAttributes().getResponse().setHeader("TenantId", "867735392558919680");
+        if (!ToolsUtils.checkSignCwSnFromOldSys(bo.getGradeUserId().toString(), bo.getStamp().toString(), bo.getSign())) {
+            return AjaxResult.error("签名错误");
+        }
+        return AjaxResult.success("成功", iClassGradeUserService.sevenPushAuthCallBack(bo) ? 1 : 0);
+    }
 
+
+    @PostMapping("/common/question/getMeasureList")
+    public AjaxResult<String> getMeasureList() {
+        String aa = iQuestionService.getMeasureList();
+        return AjaxResult.success("操作成功",aa);
+    }
+
+    @PostMapping("/common/question/getTopicList")
+    public AjaxResult<String> getTopicList(@RequestBody String topParam) {
+        String aa = iQuestionService.getTopicList(topParam);
+        return AjaxResult.success("操作成功", aa);
+    }
+
+    @PostMapping("/common/free/makeBatchCertificatePhoto")
+    public AjaxResult makeBatchCertificatePhoto(@RequestBody ClassGradeUserQueryBo bo) {
+        iCertificateTpService.makeBatchCertificatePhoto(bo);
+        return AjaxResult.success();
+    }
 }

+ 5 - 6
zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java

@@ -196,12 +196,9 @@ public class ClassGradeController extends BaseController {
     @PreAuthorize("@ss.hasPermi('grade:grade:list')")
     @GetMapping("/listGrade")
     public TableDataInfo<ClassGradeStudentVo> listGrade(ClassGradeUserQueryBo bo) {
-        if (ObjectUtils.isNotNull(bo.getSevenCodeSign()) && bo.getSevenCodeSign() == 1
-                && ObjectUtils.isNotNull(bo.getGradeId())){
-            ClassGrade gradeGrade = iClassGradeService.getById(bo.getGradeId());
-            if (StringUtils.isNotBlank(gradeGrade.getSevenCode())){
-                bo.setSevenCode(gradeGrade.getSevenCode());
-            }
+        ClassGrade gradeGrade = iClassGradeService.getById(bo.getGradeId());
+        if (StringUtils.isNotBlank(gradeGrade.getSevenCode())){
+            bo.setSevenCode(gradeGrade.getSevenCode());
         }
         startPage();
         List<ClassGradeStudentVo> list = iClassGradeService.listGrade(bo);
@@ -774,4 +771,6 @@ public class ClassGradeController extends BaseController {
         return util.exportExcel(exportVos, goodsVo.getGoodsName());
     }
 
+
+
 }

+ 45 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderController.java

@@ -5,6 +5,7 @@ import java.time.format.DateTimeFormatter;
 import java.util.*;
 
 import cn.hutool.core.lang.Validator;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.zhongzheng.common.core.domain.model.LoginUser;
@@ -17,9 +18,14 @@ import com.zhongzheng.modules.goods.vo.QuestionOpenImportVo;
 import com.zhongzheng.modules.order.bo.*;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.order.service.IOrderService;
+import com.zhongzheng.modules.order.vo.MailOrderVo;
 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.system.bo.SysTenantEditBo;
+import com.zhongzheng.modules.system.domain.SysTenant;
+import com.zhongzheng.modules.system.service.ISysTenantService;
+import com.zhongzheng.modules.system.vo.SysTenantHandleAccountVo;
 import com.zhongzheng.modules.user.domain.UserSubscribe;
 import com.zhongzheng.modules.user.service.IUserSubscribeService;
 import lombok.RequiredArgsConstructor;
@@ -61,6 +67,8 @@ public class OrderController extends BaseController {
 
     private final TokenService tokenService;
 
+    private final ISysTenantService iSysTenantService;
+
     /**
      * 查询订单列表
      */
@@ -199,5 +207,42 @@ public class OrderController extends BaseController {
         return AjaxResult.success(iOrderService.questionGoodsOpenImport(importBoList,loginUser.getUser().getUserId(),SecurityUtils.getUsername()));
     }
 
+    @ApiOperation("获取经办订单收款信息")
+    @PreAuthorize("@ss.hasPermi('system:order:query')")
+    @GetMapping("/handleBank")
+    public AjaxResult<SysTenantHandleAccountVo> getHandleBank() {
+        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+        SysTenant tenant = iSysTenantService.getById(tenantId);
+        String information = tenant.getHandleBank();
+        SysTenantHandleAccountVo accountVo = JSONObject.parseObject(information, SysTenantHandleAccountVo.class);
+        return AjaxResult.success(accountVo);
+    }
+
+    @ApiOperation("修改经办订单收款信息")
+    @PreAuthorize("@ss.hasPermi('system:order:query')")
+    @PostMapping("/edit/handleBank")
+    public AjaxResult<Void> editHandleBank(@RequestBody SysTenantHandleAccountVo bo) {
+        String json = JSONObject.toJSONString(bo);
+        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+        SysTenantEditBo editBo = new SysTenantEditBo();
+        editBo.setTenantId(Long.parseLong(tenantId));
+        editBo.setHandleBank(json);
+        return toAjax(iSysTenantService.updateByEditBo(editBo)?1:0);
+    }
+
+
+    @ApiOperation("寄件订单列表")
+    @GetMapping("/mail/list")
+    public TableDataInfo<MailOrderVo> getMailList(MailOrderBo bo) {
+        startPage();
+        List<MailOrderVo> list = iOrderGoodsService.getMailList(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("寄件订单批量处理")
+    @PostMapping("/mail/handle")
+    public AjaxResult<Void> mailOrderHandle(@RequestBody MailOrderHandleBo bo) {
+        return toAjax(iOrderGoodsService.mailOrderHandle(bo)?1:0);
+    }
 
 }

+ 89 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderHandleController.java

@@ -0,0 +1,89 @@
+package com.zhongzheng.controller.order;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.order.bo.OrderHandleCheckBo;
+import com.zhongzheng.modules.order.bo.OrderHandleQueryBo;
+import com.zhongzheng.modules.order.service.IOrderHandleService;
+import com.zhongzheng.modules.order.service.IOrderService;
+import com.zhongzheng.modules.order.vo.OrderHandleGoodsVo;
+import com.zhongzheng.modules.order.vo.OrderHandleStatisticsVo;
+import com.zhongzheng.modules.order.vo.OrderHandleVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 经办录单Controller
+ *
+ * @author hjl
+ * @date 2024-01-19
+ */
+@Api(value = "经办录单控制器", tags = {"经办录单管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/order/handle")
+public class OrderHandleController extends BaseController {
+
+    private final IOrderHandleService iOrderHandleService;
+
+    private final IOrderService iOrderService;
+
+    /**
+     * 查询经办录单列表
+     */
+    @ApiOperation("查询经办录单列表")
+    @PreAuthorize("@ss.hasPermi('system:handle:list')")
+    @GetMapping("/list")
+    public TableDataInfo<OrderHandleVo> list(OrderHandleQueryBo bo) {
+        startPage();
+        List<OrderHandleVo> list = iOrderHandleService.selectList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询经办录单统计
+     */
+    @ApiOperation("查询经办录单统计")
+    @PreAuthorize("@ss.hasPermi('system:handle:list')")
+    @GetMapping("/statistics")
+    public AjaxResult<OrderHandleStatisticsVo> statistics(OrderHandleQueryBo bo) {
+        return AjaxResult.success(iOrderHandleService.statistics(bo));
+    }
+
+    @ApiOperation("查询经办录单详情")
+    @PreAuthorize("@ss.hasPermi('system:handle:list')")
+    @GetMapping("/detail")
+    public AjaxResult<OrderHandleVo> detail(OrderHandleQueryBo bo) {
+        List<OrderHandleVo> list = iOrderHandleService.selectList(bo);
+        return AjaxResult.success(list.get(0));
+    }
+
+
+    @ApiOperation("查询经办录单商品列表")
+    @PreAuthorize("@ss.hasPermi('system:handle:list')")
+    @GetMapping("/goodsList")
+    public TableDataInfo<OrderHandleGoodsVo> goodsList(OrderHandleQueryBo bo) {
+        startPage();
+        List<OrderHandleGoodsVo> list = iOrderHandleService.selectOrderGoodsList(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("经办录单审核")
+    @PostMapping("/check")
+    public AjaxResult<Void> checkOrderHandle(@RequestBody OrderHandleCheckBo bo) {
+        return toAjax(iOrderHandleService.checkOrderHandle(bo) ? 1 : 0);
+    }
+
+    @ApiOperation("经办录单退款审核")
+    @PostMapping("/refund/check")
+    public AjaxResult<Void> refundOrderHandle(@RequestBody OrderHandleCheckBo bo) {
+        return toAjax(iOrderHandleService.refundOrderHandle(bo) ? 1 : 0);
+    }
+}

+ 52 - 3
zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderInvoiceController.java

@@ -4,10 +4,10 @@ import java.util.List;
 import java.util.Map;
 
 import cn.hutool.core.lang.Validator;
-import com.zhongzheng.modules.order.bo.OrderInvoiceAddBo;
-import com.zhongzheng.modules.order.bo.OrderInvoiceEditBo;
-import com.zhongzheng.modules.order.bo.OrderInvoiceQueryBo;
+import com.zhongzheng.modules.order.bo.*;
 import com.zhongzheng.modules.order.service.IOrderInvoiceService;
+import com.zhongzheng.modules.order.vo.CompanyOrderInvoiceVo;
+import com.zhongzheng.modules.order.vo.CompanyStatisticsVo;
 import com.zhongzheng.modules.order.vo.OrderInvoiceVo;
 import com.zhongzheng.modules.tencentcloud.bo.InvoiceQueryBo;
 import com.zhongzheng.modules.tencentcloud.service.IFaceOcrService;
@@ -96,4 +96,53 @@ public class OrderInvoiceController extends BaseController {
         Map<String, String> rs = iFaceOcrService.VatInvoiceOCR(bo);
         return AjaxResult.success(rs);
     }
+
+    /**
+     * 查询企业订单发票列表
+     */
+    @ApiOperation("查询企业订单发票列表")
+    @GetMapping("/company/list")
+    public TableDataInfo<CompanyOrderInvoiceVo> listCompanyOrderInvoice(CompanyOrderInvoiceBo bo) {
+        startPage();
+        List<CompanyOrderInvoiceVo> list = iOrderInvoiceService.listCompanyOrderInvoice(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询企业订单发票统计
+     */
+    @ApiOperation("查询企业订单发票统计")
+    @GetMapping("/company/statistics")
+    public AjaxResult<CompanyStatisticsVo> listCompanyStatistics(CompanyOrderInvoiceBo bo) {
+        CompanyStatisticsVo vo = iOrderInvoiceService.listCompanyStatistics(bo);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 查询企业订单发票详情
+     */
+    @ApiOperation("查询企业订单发票详情")
+    @GetMapping("/company/detail/{invoiceId}")
+    public AjaxResult<OrderInvoiceVo> getCompanyInvoiceDetail(@PathVariable("invoiceId")Long invoiceId) {
+        OrderInvoiceVo vo = iOrderInvoiceService.getCompanyInvoiceDetail(invoiceId);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 企业订单发票审核
+     */
+    @ApiOperation("企业订单发票审核")
+    @PostMapping("/company/check")
+    public AjaxResult<Void> companyInvoiceCheck(@RequestBody CompanyInvoiceCheckBo bo) {
+        return toAjax(iOrderInvoiceService.companyInvoiceCheck(bo) ? 1 : 0);
+    }
+
+    /**
+     * 企业订单发票批量处理
+     */
+    @ApiOperation("企业订单发票批量处理")
+    @PostMapping("/company/batch/handle")
+    public AjaxResult<Void> companyBatchHandle(@RequestBody CompanyInvoiceBatchBo bo) {
+        return toAjax(iOrderInvoiceService.companyBatchHandle(bo) ? 1 : 0);
+    }
 }

+ 10 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java

@@ -5,6 +5,7 @@ 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.order.service.IOrderHandleService;
 import com.zhongzheng.modules.polyv.service.IPolyvLiveService;
 import com.zhongzheng.modules.schedule.service.IScheduleService;
 import com.zhongzheng.modules.user.bo.UserQueryBo;
@@ -43,6 +44,8 @@ public class ScheduleController extends BaseController {
 
     private final WxLoginService wxLoginService;
 
+    private final IOrderHandleService iOrderHandleService;
+
     /**
      * 商品购买发送消息
      * @return
@@ -458,4 +461,11 @@ public class ScheduleController extends BaseController {
         iScheduleService.usbUserDownload();
         return AjaxResult.success();
     }
+
+    @ApiOperation("经办订单超时关闭")
+    @GetMapping("/order/closeOverHandle")
+    public AjaxResult closeOverHandle(){
+        iOrderHandleService.overTimeCloseOrder();
+        return AjaxResult.success();
+    }
 }

+ 219 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/DangAnController.java

@@ -0,0 +1,219 @@
+package com.zhongzheng.controller.user;
+
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.domain.model.LoginUser;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.poi.EasyPoiUtil;
+import com.zhongzheng.framework.web.service.TokenService;
+import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
+import com.zhongzheng.modules.grade.service.IClassGradeUserService;
+import com.zhongzheng.modules.grade.vo.ClassPeriodStudentVo;
+import com.zhongzheng.modules.grade.vo.UserPeriodExportV2Vo;
+import com.zhongzheng.modules.order.bo.OrderQueryBo;
+import com.zhongzheng.modules.order.service.IOrderService;
+import com.zhongzheng.modules.order.vo.OrderListVo;
+import com.zhongzheng.modules.top.order.bo.TopOldOrderCustomerBo;
+import com.zhongzheng.modules.user.bo.*;
+import com.zhongzheng.modules.user.service.*;
+import com.zhongzheng.modules.user.vo.*;
+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.util.List;
+
+/**
+ * 用户档案Controller
+ *
+ * @author hjl
+ * @date 2022-08-17
+ */
+@Api(value = "用户档案控制器", tags = {"用户档案管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/user/dangAn")
+public class DangAnController extends BaseController {
+
+    private final IClassGradeUserService iClassGradeUserService;
+
+    private final IOrderService iOrderService;
+
+    private final IUserStudyRecordService iUserStudyRecordService;
+
+    private final IUserCertificateService iUserCertificateService;
+
+    private final IUserSubscribeService iUserSubscribeService;
+
+    private final IUserService iUserService;
+
+    private final TokenService tokenService;
+
+    @ApiOperation("查询档案网课列表")
+    @PreAuthorize("@ss.hasPermi('grade:user:list')")
+    @GetMapping("/listVideoUserPeriod")
+    public TableDataInfo<ClassPeriodStudentVo> listVideoUserPeriod(ClassGradeUserQueryBo bo) {
+        startPage();
+        List<ClassPeriodStudentVo> list = iClassGradeUserService.listVideoUserPeriod(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("查询档案订单列表")
+    @PreAuthorize("@ss.hasPermi('grade:user:list')")
+    @GetMapping("/listOrder")
+    public TableDataInfo<OrderListVo> listDangAnOrder(OrderQueryBo bo) {
+        startPage();
+        List<OrderListVo> list = iOrderService.selectDangAnOrderList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询学员商品题库学习记录
+     */
+    @ApiOperation("查询档案题库列表")
+    @PreAuthorize("@ss.hasPermi('grade:student:list')")
+    @GetMapping("/listUserExam")
+    public TableDataInfo<ExamStudyRecordVo> listUserExam(UserQueryBo bo) {
+        startPage();
+        List<ExamStudyRecordVo> list = iUserStudyRecordService.querDangAnExamStudy(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("学员约考记录")
+    @GetMapping("/listUserSubscribe")
+    public TableDataInfo<UserUsbRecordVo> getListUserSubscribe(UserUsbRecordBo bo) {
+        startPage();
+        List<UserUsbRecordVo> list = iClassGradeUserService.getListUserSubscribe(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("学员考试记录")
+    @GetMapping("/listUserApply")
+    public TableDataInfo<UserApplyRecordVo> listUserApply(UserApplyRecordBo bo) {
+        startPage();
+        List<UserApplyRecordVo> list = iUserSubscribeService.listUserApply(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("学员承诺书记录")
+    @GetMapping("/listPromise")
+    public TableDataInfo<UserPromiseRecordVo> listPromise(UserPromiseRecordBo bo) {
+        startPage();
+        List<UserPromiseRecordVo> list = iUserSubscribeService.listPromise(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("查询档案报名列表")
+    @PreAuthorize("@ss.hasPermi('grade:user:list')")
+    @GetMapping("/listBKUserPeriod")
+    public TableDataInfo<ClassPeriodStudentVo> listBKUserPeriod(ClassGradeUserQueryBo bo) {
+        startPage();
+        List<ClassPeriodStudentVo> list = iClassGradeUserService.listBKUserPeriod(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("查询档案直播列表")
+    @PreAuthorize("@ss.hasPermi('grade:student:list')")
+    @GetMapping("/listUserLive")
+    public TableDataInfo<ExamStudyRecordVo> listUserLive(UserQueryBo bo) {
+        startPage();
+        List<ExamStudyRecordVo> list = iUserStudyRecordService.querDangAnLiveStudy(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("查询档案资料列表")
+    @PreAuthorize("@ss.hasPermi('grade:student:list')")
+    @GetMapping("/listUserHandouts")
+    public TableDataInfo<ExamStudyRecordVo> listUserHandouts(UserQueryBo bo) {
+        startPage();
+        List<ExamStudyRecordVo> list = iUserStudyRecordService.querDangAnHandoutsStudy(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("查询档案证书列表")
+    @PreAuthorize("@ss.hasPermi('grade:student:list')")
+    @GetMapping("/listUserCertificate")
+    public TableDataInfo<UserCertificateVo> listUserCertificate(UserCertificateQueryBo bo) {
+        startPage();
+        List<UserCertificateVo> list = iUserCertificateService.selectList(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("获取证书详细信息")
+    @GetMapping("/certificateDetail")
+    public AjaxResult<UserCertificateVo> getInfo(UserCertificateQueryBo bo) {
+        return AjaxResult.success(iUserCertificateService.selectDetail(bo));
+    }
+
+    @ApiOperation("查询学员直播学习记录列表")
+    @PreAuthorize("@ss.hasPermi('grade:user:list')")
+    @GetMapping("/listUserStudyLiveRecord")
+    public TableDataInfo<UserPeriodExportV2Vo> listUserStudyRecordV2Week(ClassGradeUserQueryBo bo) {
+        startPage();
+        List<UserPeriodExportV2Vo> list = iClassGradeUserService.listUserStudyRecordV2Week(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("查询学员题库学习记录列表")
+    @PreAuthorize("@ss.hasPermi('grade:user:list')")
+    @GetMapping("/listUserStudyExamRecord")
+    public TableDataInfo<UserPeriodExportV2Vo> listUserStudyExamRecord(ClassGradeUserQueryBo bo) {
+        startPage();
+        List<UserPeriodExportV2Vo> list = iClassGradeUserService.listUserStudyQuestionRecordV2Week(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("学员资料导入更新")
+    @PostMapping("/userDataImportUp")
+    public AjaxResult userDataImportUp(MultipartFile file) {
+        List<UserDataImportBo> customerBos = EasyPoiUtil.importExcel(file,0,1,UserDataImportBo.class);
+        if (CollectionUtils.isEmpty(customerBos) || customerBos.stream().allMatch(x -> ObjectUtils.isNull(x.getUserCard()))){
+            throw new CustomException("导入文件格式不正确或文件为空,请检查文件!");
+        }
+        iUserService.userDataImportUp(customerBos);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("学员资料照片导入")
+    @PostMapping("/userDataImgImport")
+    public AjaxResult userDataImgImport(MultipartFile file) {
+        iUserService.userDataImgImport(file);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("学员资料批量下载")
+    @PostMapping("/data/download")
+    public AjaxResult userDataDownload(@RequestBody UserDownloadBo bo) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setCreateSysUserId(loginUser.getUser().getUserId());
+        iUserService.userDataDownload(bo);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("学员资料下载任务")
+    @GetMapping("/data/download/list")
+    public AjaxResult<List<UserDownloadVo>> userDataDownloadList() {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        List<UserDownloadVo> list = iUserService.userDataDownloadList(loginUser.getUser().getUserId());
+        return AjaxResult.success(list);
+    }
+
+    @ApiOperation("学员资料下载任务回调")
+    @PostMapping("/data/download/up")
+    public AjaxResult userDataDownloadUp(@RequestBody UserDataDownloadUpBo bo) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setCreateSysUserId(loginUser.getUser().getUserId());
+        iUserService.userDataDownloadUp(bo);
+        return AjaxResult.success();
+    }
+
+}

+ 35 - 13
zhongzheng-admin/src/main/java/com/zhongzheng/controller/user/UserController.java

@@ -164,21 +164,34 @@ public class UserController extends BaseController {
     @Log(title = "导入用户", businessType = BusinessType.IMPORT)
     @PreAuthorize("@ss.hasPermi('system:section:import')")
     @PostMapping("/importData")
-    public AjaxResult<Map<String,Object>> importData(MultipartFile file, String importNo) throws Exception
+    public AjaxResult<Map<String,Object>> importData(MultipartFile file, String importNo,Integer sign) throws Exception
     {
-        ExcelUtil<UserImportAddBo> util = new ExcelUtil<UserImportAddBo>(UserImportAddBo.class);
-        List<UserImportAddBo> userList = null;
-        try{
-            userList = util.importExcel(file.getInputStream());
-        }catch (Exception e){
-            e.printStackTrace();
-            throw new IllegalArgumentException("模板格式不正确,请重新下载模板");
+        Map<String, Object> rs = new HashMap<>();
+        if (ObjectUtils.isNotNull(sign) && sign == 1){
+            ExcelUtil<UserPeriodImportBo> util = new ExcelUtil<UserPeriodImportBo>(UserPeriodImportBo.class);
+            List<UserPeriodImportBo> userList = null;
+            try{
+                userList = util.importExcel(file.getInputStream());
+            }catch (Exception e){
+                e.printStackTrace();
+                throw new IllegalArgumentException("模板格式不正确,请重新下载模板");
+            }
+            rs = iUserService.importSevenUser(userList);
+        }else {
+            ExcelUtil<UserImportAddBo> util = new ExcelUtil<UserImportAddBo>(UserImportAddBo.class);
+            List<UserImportAddBo> userList = null;
+            try{
+                userList = util.importExcel(file.getInputStream());
+            }catch (Exception e){
+                e.printStackTrace();
+                throw new IllegalArgumentException("模板格式不正确,请重新下载模板");
+            }
+            Collections.reverse(userList);
+            if (userList.stream().allMatch(item -> ObjectUtils.isNull(item))){
+                throw new IllegalArgumentException("模板格式不正确,请重新下载模板");
+            }
+            rs = iUserService.importUser(userList,importNo);
         }
-        Collections.reverse(userList);
-        if (userList.stream().allMatch(item -> ObjectUtils.isNull(item))){
-            throw new IllegalArgumentException("模板格式不正确,请重新下载模板");
-        }
-        Map<String, Object> rs = iUserService.importUser(userList,importNo);
         return AjaxResult.success(rs);
     }
 
@@ -209,4 +222,13 @@ public class UserController extends BaseController {
     public AjaxResult<Void> updatePwd(@RequestBody UserAppUpdatePwdBo bo) {
         return toAjax(iUserService.updatePwdByClient(bo)? 1 : 0);
     }
+
+    @ApiOperation("查询档案列表")
+    @PreAuthorize("@ss.hasPermi('app:user:list')")
+    @GetMapping("/dangAnList")
+    public TableDataInfo<UserVo> dangAnList(UserQueryBo bo) {
+        startPage();
+        List<UserVo> list = iUserService.dangAnList(bo);
+        return getDataTable(list);
+    }
 }

+ 41 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/vod/VodVideoController.java

@@ -0,0 +1,41 @@
+package com.zhongzheng.controller.vod;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.modules.tencentcloud.service.IVodService;
+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.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+
+@Api(value = "腾讯视频信息控制器", tags = {"腾讯视频信息管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/vod/video")
+public class VodVideoController extends BaseController {
+
+    private final IVodService iVodService;
+
+    @ApiOperation("获取腾讯视频小程序播放凭证")
+    @GetMapping("/sign/{fileId}")
+    public AjaxResult getPlaySign(@PathVariable("fileId") String fileId){
+        Map<String,Object> map = iVodService.vodSignRequest(fileId);
+        return AjaxResult.success(map);
+    }
+
+    @ApiOperation("获取腾讯视频详情")
+    @GetMapping("/detail/{fileId}")
+    public AjaxResult getPlayDetail(@PathVariable("fileId") String fileId){
+        String[] fileIds = new String[]{fileId};
+        Map<String,Object> map = iVodService.describeMediaInfos(fileIds);
+        return AjaxResult.success(map);
+    }
+
+}

+ 19 - 3
zhongzheng-admin/src/main/resources/application-dev.yml

@@ -71,13 +71,13 @@ spring:
 aliyun:
     oss:
         endpoint: https://file-dev.xyyxt.net # oss对外服务的访问域名
-        accessKeyId: LTAIgC8O2WUXvXuR  # 访问身份验证中用到用户标识
-        accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
+        accessKeyId: LTAI5tDbpYmpifZYNX8S3kt1  # 访问身份验证中用到用户标识
+        accessKeySecret: jCdSPAj58ZXOLsWpV8bCgNOYrEK0de # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
         bucketName: zhongzheng-test # oss的存储空间
         policy:
             expire: 30 # 签名有效期(S)
         maxSize: 100 # 上传文件大小(M)
-        callback: http://120.79.166.78:19004/aliyun/oss/callback # 文件上传成功后的回调地址
+        callback: http://120.79.166.78:19013/aliyun/oss/callback # 文件上传成功后的回调地址
         dir:
             prefix: oss/images/ # 上传文件夹路径前缀 `
 
@@ -171,6 +171,9 @@ oldOrder:
 
 oldSys:
     host: http://gdxypx.xy.com
+    goods: http://gdxypx.xy.com/WitSystem/BussinessApi/NewYxtLogin
+    question: http://192.168.1.121:8057/WordData/GetMeasureList
+    questionDetail: http://192.168.1.121:8057/WordData/GetTopicList
 
 invoice:
     host: http://192.168.1.222:7077/sys/common/openMplatform/log
@@ -187,6 +190,8 @@ exam:
     subscribeSaveExam: http://192.168.1.7:9099/cd/subscribe/save/exam
     subscribeUpdateExam: http://192.168.1.7:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://192.168.1.7:9099/cd/subscribe/add/num
+    question: http://120.79.166.78:19013/common/question/getMeasureList
+    questionDetail: http://120.79.166.78:19013/common/question/getTopicList
 
 shared:
     statistics: http://gdxypx.xy.com/WitSystem/BussinessApi/HighSeasData
@@ -195,3 +200,14 @@ shared:
     orderArea: http://gdxypx.xy.com/WitSystem/BussinessApi/OrderAreaData
     rateData: http://gdxypx.xy.com//WitSystem/BussinessApi/CustomerConversionRateData
     rateTrend: http://gdxypx.xy.com/WitSystem/BussinessApi/CustomerConversionRateTrendData
+    customerOrder: http://gdxypx.xy.com/WitSystem/BussinessApi/CustomerOrderData
+    tenantData: http://gdxypx.xy.com/witsystem/bussinessapi/GetOrgList
+    saleData: http://gdxypx.xy.com/witsystem/bussinessapi/GetSaleListByOrgId
+
+ZsBank:
+    publickey: BNsIe9U0x8IeSe4h/dxUzVEz9pie0hDSfMRINRXc7s1UIXfkExnYECF4QqJ2SnHxLv3z/99gsfDQrQ6dzN5lZj0=
+    privatekey: NBtl7WnuUtA2v5FaebEkU0/Jj1IodLGT6lQqwkzmd2E=
+    sm4key: VuAzSWQhsoNqzn0K
+
+record:
+    downloadPath: http://192.168.1.7:9090/common/user/data/download

+ 6 - 9
zhongzheng-admin/src/main/resources/application-pre.yml

@@ -71,8 +71,8 @@ spring:
 aliyun:
     oss:
         endpoint: https://file.xyyxt.net # oss对外服务的访问域名
-        accessKeyId: LTAIgC8O2WUXvXuR  # 访问身份验证中用到用户标识
-        accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
+        accessKeyId: LTAI5tDbpYmpifZYNX8S3kt1  # 访问身份验证中用到用户标识
+        accessKeySecret: jCdSPAj58ZXOLsWpV8bCgNOYrEK0de # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
         bucketName: zhongzheng-prod # oss的存储空间
         policy:
             expire: 30 # 签名有效期(S)
@@ -187,10 +187,7 @@ exam:
     subscribeUpdateExam: http://192.168.1.7:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://192.168.1.7:9099/cd/subscribe/add/num
 
-shared:
-    statistics: http://gdxypx.xy.com/WitSystem/BussinessApi/HighSeasData
-    customer: http://gdxypx.xy.com/WitSystem/BussinessApi/CustomerStatsData
-    cert: http://gdxypx.xy.com/WitSystem/BussinessApi/CertStatsData
-    orderArea: http://gdxypx.xy.com/WitSystem/BussinessApi/OrderAreaData
-    rateData: http://gdxypx.xy.com//WitSystem/BussinessApi/CustomerConversionRateData
-    rateTrend: http://gdxypx.xy.com/WitSystem/BussinessApi/CustomerConversionRateTrendData
+ZsBank:
+    publickey: BNsIe9U0x8IeSe4h/dxUzVEz9pie0hDSfMRINRXc7s1UIXfkExnYECF4QqJ2SnHxLv3z/99gsfDQrQ6dzN5lZj0=
+    privatekey: NBtl7WnuUtA2v5FaebEkU0/Jj1IodLGT6lQqwkzmd2E=
+    sm4key: VuAzSWQhsoNqzn0K

+ 24 - 3
zhongzheng-admin/src/main/resources/application-prod.yml

@@ -71,8 +71,8 @@ spring:
 aliyun:
     oss:
         endpoint: https://file.xyyxt.net # oss对外服务的访问域名
-        accessKeyId: LTAIgC8O2WUXvXuR  # 访问身份验证中用到用户标识
-        accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
+        accessKeyId: LTAI5tDbpYmpifZYNX8S3kt1  # 访问身份验证中用到用户标识
+        accessKeySecret: jCdSPAj58ZXOLsWpV8bCgNOYrEK0de # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
         bucketName: zhongzheng-prod # oss的存储空间
         policy:
             expire: 30 # 签名有效期(S)
@@ -169,7 +169,10 @@ oldOrder:
     updateRemark: http://www.xyyxt.net/WitSystem/BussinessApi/UpdateOrderAuditRemark
 
 oldSys:
-    host: http://test.jqbao.net
+    host: http://www.xyyxt.net
+    goods: http://www.xyyxt.net/system/BussinessApi/NewYxtLogin
+    question: http://192.168.1.121:8057/WordData/GetMeasureList
+    questionDetail: http://192.168.1.121:8057/WordData/GetTopicList
 
 invoice:
     host: https://ptapi.gdzzkj.net/sys/common/openMplatform/log
@@ -186,3 +189,21 @@ exam:
     subscribeSaveExam: http://39.108.7.155:9099/cd/subscribe/save/exam
     subscribeUpdateExam: http://39.108.7.155:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://39.108.7.155:9099/cd/subscribe/add/num
+    question: http://120.79.166.78:19013/common/question/getMeasureList
+    questionDetail: http://120.79.166.78:19013/common/question/getTopicList
+
+shared:
+    statistics: http://www.xyyxt.net/WitSystem/BussinessApi/HighSeasData
+    customer: http://www.xyyxt.net/WitSystem/BussinessApi/CustomerStatsData
+    cert: http://www.xyyxt.net/WitSystem/BussinessApi/CertStatsData
+    orderArea: http://www.xyyxt.net/WitSystem/BussinessApi/OrderAreaData
+    rateData: http://www.xyyxt.net//WitSystem/BussinessApi/CustomerConversionRateData
+    rateTrend: http://www.xyyxt.net/WitSystem/BussinessApi/CustomerConversionRateTrendData
+    customerOrder: http://www.xyyxt.net/WitSystem/BussinessApi/CustomerOrderData
+    tenantData: http://www.xyyxt.net/witsystem/bussinessapi/GetOrgList
+    saleData: http://www.xyyxt.net/witsystem/bussinessapi/GetSaleListByOrgId
+
+ZsBank:
+    publickey: BNsIe9U0x8IeSe4h/dxUzVEz9pie0hDSfMRINRXc7s1UIXfkExnYECF4QqJ2SnHxLv3z/99gsfDQrQ6dzN5lZj0=
+    privatekey: NBtl7WnuUtA2v5FaebEkU0/Jj1IodLGT6lQqwkzmd2E=
+    sm4key: VuAzSWQhsoNqzn0K

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

@@ -80,8 +80,8 @@ spring:
 aliyun:
     oss:
         endpoint: https://file.xyyxt.net # oss对外服务的访问域名
-        accessKeyId: LTAIgC8O2WUXvXuR  # 访问身份验证中用到用户标识
-        accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
+        accessKeyId: LTAI5tDbpYmpifZYNX8S3kt1  # 访问身份验证中用到用户标识
+        accessKeySecret: jCdSPAj58ZXOLsWpV8bCgNOYrEK0de # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
         bucketName: zhongzheng-prod # oss的存储空间
         policy:
             expire: 30 # 签名有效期(S)

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

@@ -267,8 +267,8 @@ aliyun:
     forgetTemplateCode: SMS_228685033
     pwdTemplateCode: SMS_230220381
     bindNewTelCode: SMS_232178371
-    accessKeyId: LTAIgC8O2WUXvXuR
-    accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX
+    accessKeyId: LTAI5tDbpYmpifZYNX8S3kt1
+    accessKeySecret: jCdSPAj58ZXOLsWpV8bCgNOYrEK0de
     OpenTheGoodsCode: SMS_230970155     #商品开通提醒
     informationNotificationCode: SMS_230965149  #完善报名资料通知
     materialReviewCode: SMS_230980165         #报名资料审核通过通知

+ 3 - 0
zhongzheng-api/src/main/java/com/zhongzheng/ZhongZhengApiApplication.java

@@ -2,11 +2,14 @@ package com.zhongzheng;
 
 
 import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
+import com.zhongzheng.common.utils.DateUtils;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
+import java.util.Date;
+
 
 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
 @EnableScheduling

+ 22 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/course/CourseController.java

@@ -9,8 +9,10 @@ import com.zhongzheng.modules.course.bo.*;
 import com.zhongzheng.modules.course.service.*;
 import com.zhongzheng.modules.course.vo.*;
 import com.zhongzheng.modules.goods.vo.GoodsUserVo;
+import com.zhongzheng.modules.goods.vo.UserNewGoodsVo;
 import com.zhongzheng.modules.order.bo.SpecialQuestionBo;
 import com.zhongzheng.modules.order.vo.SpecialQuestionVo;
+import com.zhongzheng.modules.user.bo.UserAppTelphoneLoginBo;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -19,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 课程Controller
@@ -206,4 +209,23 @@ public class CourseController extends BaseController {
         return AjaxResult.success(vo);
     }
 
+    /**
+     * 旧系统学员商品信息
+     */
+    @ApiOperation("旧系统学员商品信息")
+    @GetMapping("/old/goods/list")
+    public AjaxResult<UserNewGoodsVo> getOldGoodsList() {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        return AjaxResult.success(iCourseService.getOldGoodsList(loginUser.getUser().getUserId()));
+    }
+
+
+    @ApiOperation("获取跳转用户Key")
+    @GetMapping("/skipPort")
+    public AjaxResult<Map<String,String>> getUserSkipPort() {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        Map<String,String> map = iCourseService.getUserSkipPort(loginUser.getUser().getUserId());
+        return AjaxResult.success(map);
+    }
+
 }

+ 7 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/order/OrderController.java

@@ -11,6 +11,7 @@ import com.zhongzheng.modules.base.vo.BaseFilterVo;
 import com.zhongzheng.modules.course.service.ICourseEducationTypeService;
 import com.zhongzheng.modules.course.vo.CourseEducationTypeVo;
 import com.zhongzheng.modules.goods.bo.GoodsFirstChoiceAddBo;
+import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.order.bo.*;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.order.service.IOrderService;
@@ -237,4 +238,10 @@ public class OrderController extends BaseController {
         bo.setUserId(loginUser.getUser().getUserId());
         return AjaxResult.success(iOrderGoodsService.firstChoiceGoods(bo));
     }
+
+    @ApiOperation("获取课程视频标签")
+    @GetMapping("/getViewSign/{orderGoodsId}")
+    public AjaxResult<GoodsVo> getCourseViewSign(@PathVariable("orderGoodsId") Long orderGoodsId) {
+        return AjaxResult.success(iOrderGoodsService.getCourseViewSign(orderGoodsId));
+    }
 }

+ 155 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/order/OrderHandleController.java

@@ -0,0 +1,155 @@
+package com.zhongzheng.controller.order;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Arrays;
+import java.util.Map;
+
+import cn.hutool.core.lang.Validator;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.zhongzheng.common.core.domain.model.LoginUser;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.WxTokenService;
+import com.zhongzheng.modules.order.bo.*;
+import com.zhongzheng.modules.order.domain.OrderHandle;
+import com.zhongzheng.modules.order.service.IOrderHandleService;
+import com.zhongzheng.modules.order.service.IOrderService;
+import com.zhongzheng.modules.order.vo.OrderHandleGoodsVo;
+import com.zhongzheng.modules.order.vo.OrderHandleVo;
+import com.zhongzheng.modules.user.entity.ClientLoginUser;
+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;
+
+/**
+ * 经办录单Controller
+ *
+ * @author hjl
+ * @date 2024-01-19
+ */
+@Api(value = "经办录单控制器", tags = {"经办录单管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/order/handle")
+public class OrderHandleController extends BaseController {
+
+    private final IOrderHandleService iOrderHandleService;
+
+    private final WxTokenService wxTokenService;
+
+    private final IOrderService iOrderService;
+
+    /**
+     * 查询经办录单列表
+     */
+    @ApiOperation("查询经办录单列表")
+    @PreAuthorize("@ss.hasPermi('system:handle:list')")
+    @GetMapping("/list")
+    public TableDataInfo<OrderHandleVo> list(OrderHandleQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setCreateUserId(loginUser.getUser().getUserId());
+        startPage();
+        List<OrderHandleVo> list = iOrderHandleService.selectList(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("查询经办录单详情")
+    @PreAuthorize("@ss.hasPermi('system:handle:list')")
+    @GetMapping("/detail")
+    public AjaxResult<OrderHandleVo> detail(OrderHandleQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setCreateUserId(loginUser.getUser().getUserId());
+        List<OrderHandleVo> list = iOrderHandleService.selectList(bo);
+        return AjaxResult.success(list.get(0));
+    }
+
+    /**
+     * 新增经办录单
+     */
+    @ApiOperation("新增经办录单")
+    @PreAuthorize("@ss.hasPermi('system:handle:add')")
+    @Log(title = "经办录单", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public AjaxResult<String> add(@RequestBody OrderHandleAddBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setCreateUserId(loginUser.getUser().getUserId());
+        String handleOrderSn = iOrderHandleService.createOrder(bo);
+        OrderHandle orderHandle = iOrderHandleService.queryBySn(handleOrderSn);
+        if (orderHandle.getPayPrice().compareTo(BigDecimal.ZERO) == 0) {
+            LambdaUpdateWrapper<OrderHandle> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+            objectLambdaUpdateWrapper.eq(OrderHandle::getId, orderHandle.getId());
+            objectLambdaUpdateWrapper.set(OrderHandle::getUpdateTime, DateUtils.getNowTime());
+            objectLambdaUpdateWrapper.set(OrderHandle::getPayTime, DateUtils.getNowTime());
+            objectLambdaUpdateWrapper.set(OrderHandle::getPayStatus, 1);
+            objectLambdaUpdateWrapper.set(OrderHandle::getPayType, 1);
+            iOrderHandleService.update(null, objectLambdaUpdateWrapper);
+        }
+        return AjaxResult.success("录单单号",handleOrderSn);
+    }
+
+    /**
+     * 修改经办录单
+     */
+    @ApiOperation("修改拒绝经办录单")
+    @PreAuthorize("@ss.hasPermi('system:handle:edit')")
+    @Log(title = "经办录单", businessType = BusinessType.UPDATE)
+    @PostMapping("/updateRefuseBo")
+    public AjaxResult<Void> edit(@RequestBody OrderHandleEditBo bo) {
+        return toAjax(iOrderHandleService.updateRefuseBo(bo) ? 1 : 0);
+    }
+
+    @ApiOperation("查询经办录单商品列表")
+    @PreAuthorize("@ss.hasPermi('system:handle:list')")
+    @GetMapping("/goodsList")
+    public TableDataInfo<OrderHandleGoodsVo> goodsList(OrderHandleQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setCreateUserId(loginUser.getUser().getUserId());
+        startPage();
+        List<OrderHandleGoodsVo> list = iOrderHandleService.selectOrderGoodsList(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("经办订单继续支付")
+    @PreAuthorize("@ss.hasPermi('system:handle:list')")
+    @PostMapping("/resumePay")
+    public AjaxResult<Map<String, String>> resumePay(@RequestBody OrderHandleAddBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setCreateUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success("支付结果",iOrderHandleService.resumePayOrder(bo));
+    }
+
+    @ApiOperation("经办订单关闭")
+    @PreAuthorize("@ss.hasPermi('system:handle:list')")
+    @PostMapping("/closeOrder")
+    public AjaxResult<Void> closeOrder(@RequestBody OrderHandleAddBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setCreateUserId(loginUser.getUser().getUserId());
+        return toAjax(iOrderHandleService.closeOrder(bo) ? 1 : 0);
+    }
+
+
+    @ApiOperation("经办订单退款申请")
+    @PostMapping("/refund/apply")
+    public AjaxResult<Void> refundApply(@RequestBody OrderHandleRefundBo bo) {
+        return toAjax(iOrderHandleService.refundApply(bo) ? 1 : 0);
+    }
+}

+ 107 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserHandleController.java

@@ -0,0 +1,107 @@
+package com.zhongzheng.controller.user;
+
+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.utils.ServletUtils;
+import com.zhongzheng.common.utils.poi.EasyPoiUtil;
+import com.zhongzheng.framework.web.service.WxTokenService;
+import com.zhongzheng.modules.user.bo.UserHandleBo;
+import com.zhongzheng.modules.user.bo.UserHandleImportBo;
+import com.zhongzheng.modules.user.bo.UserHandleQueryBo;
+import com.zhongzheng.modules.user.domain.UserHandle;
+import com.zhongzheng.modules.user.entity.ClientLoginUser;
+import com.zhongzheng.modules.user.service.IUserHandleService;
+import com.zhongzheng.modules.user.vo.UserHandleVo;
+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.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * 用户经办名单
+ *
+ * @author ruoyi
+ * @date 2021-06-24
+ */
+@Api(value = "用户经办名单控制器", tags = {"用户经办名单控制器"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/user/handle")
+public class UserHandleController extends BaseController {
+
+    private final IUserHandleService iUserHandleService;
+
+    private final WxTokenService wxTokenService;
+
+    /**
+     * 查询用户的做题历史列表
+     */
+    @ApiOperation("用户经办名单列表")
+    @GetMapping("/list")
+    public TableDataInfo<UserHandle> list(UserHandleQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
+        List<UserHandle> list = iUserHandleService.queryUserHandleList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 新增用户经办名单
+     */
+    @ApiOperation("新增用户经办名单")
+    @PostMapping("/save")
+    public AjaxResult<Void> save(@RequestBody List<UserHandleBo> bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.stream().forEach(item -> item.setUserId(loginUser.getUser().getUserId()));
+        return toAjax(iUserHandleService.saveUserHandle(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改用户经办名单
+     */
+    @ApiOperation("修改用户经办名单")
+    @PostMapping("/edit")
+    public AjaxResult<Void> edit(@RequestBody UserHandleBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return toAjax(iUserHandleService.editUserHandle(bo) ? 1 : 0);
+    }
+
+    /**
+     * 批量删除用户经办名单
+     */
+    @ApiOperation("批量删除用户经办名单")
+    @PostMapping("/delete")
+    public AjaxResult<Void> batchDel(@RequestBody List<Long> ids) {
+        return toAjax(iUserHandleService.batchDelUserHandle(ids) ? 1 : 0);
+    }
+
+    /**
+     * 经办名单导入
+     */
+    @ApiOperation("经办名单导入")
+    @PostMapping("/import")
+    public AjaxResult importUserHandle(MultipartFile file) {
+        List<UserHandleImportBo> userHandles = EasyPoiUtil.importExcel(file,0,1,UserHandleImportBo.class);
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        iUserHandleService.importUserHandle(userHandles,loginUser.getUser().getUserId());
+        return AjaxResult.success();
+    }
+
+    /**
+     * 经办名单解析
+     */
+    @ApiOperation("经办名单解析")
+    @PostMapping("/analysis")
+    public AjaxResult<List<UserHandleImportBo>> analysisUserHandle(MultipartFile file) {
+        List<UserHandleImportBo> userHandles = EasyPoiUtil.importExcel(file,0,1,UserHandleImportBo.class);
+        return AjaxResult.success(userHandles);
+    }
+
+}

+ 42 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/vod/VodVideoController.java

@@ -0,0 +1,42 @@
+package com.zhongzheng.controller.vod;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.WxTokenService;
+import com.zhongzheng.modules.polyv.bo.PolyvLiveQueryBo;
+import com.zhongzheng.modules.polyv.service.IPolyvVideoService;
+import com.zhongzheng.modules.tencentcloud.service.IVodService;
+import com.zhongzheng.modules.user.entity.ClientLoginUser;
+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.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Api(value = "腾讯视频信息控制器", tags = {"腾讯视频信息管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/vod/video")
+public class VodVideoController extends BaseController {
+
+    private final IVodService iVodService;
+
+
+
+    @ApiOperation("获取腾讯视频小程序播放凭证")
+    @GetMapping("/sign/{fileId}")
+    public AjaxResult getPlaySign(@PathVariable("fileId") String fileId){
+        Map<String,Object> map = iVodService.vodSignRequest(fileId);
+        return AjaxResult.success(map);
+    }
+
+}

+ 20 - 4
zhongzheng-api/src/main/resources/application-dev.yml

@@ -71,13 +71,13 @@ spring:
 aliyun:
     oss:
         endpoint: https://file-dev.xyyxt.net # oss对外服务的访问域名
-        accessKeyId: LTAIgC8O2WUXvXuR  # 访问身份验证中用到用户标识
-        accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
+        accessKeyId: LTAI5tDbpYmpifZYNX8S3kt1  # 访问身份验证中用到用户标识
+        accessKeySecret: jCdSPAj58ZXOLsWpV8bCgNOYrEK0de # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
         bucketName: zhongzheng-test # oss的存储空间
         policy:
             expire: 30 # 签名有效期(S)
         maxSize: 100 # 上传文件大小(M)
-        callback: http://120.79.166.78:19004/aliyun/oss/callback # 文件上传成功后的回调地址
+        callback: http://120.79.166.78:19012/aliyun/oss/callback # 文件上传成功后的回调地址
         dir:
             prefix: oss/images/ # 上传文件夹路径前缀 `
 poliv:
@@ -173,6 +173,9 @@ oldOrder:
 
 oldSys:
     host: http://gdxypx.xy.com
+    goods: http://gdxypx.xy.com/System/BussinessApi/NewYxtLogin
+    question: http://192.168.1.121:8057/WordData/GetMeasureList
+    questionDetail: http://192.168.1.121:8057/WordData/GetTopicList
 
 invoice:
     host: http://192.168.1.222:7077/sys/common/openMplatform/log
@@ -189,6 +192,8 @@ exam:
     subscribeSaveExam: http://192.168.1.7:9099/cd/subscribe/save/exam
     subscribeUpdateExam: http://192.168.1.7:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://192.168.1.7:9099/cd/subscribe/add/num
+    question: http://120.79.166.78:19013/common/question/getMeasureList
+    questionDetail: http://120.79.166.78:19013/common/question/getTopicList
 
 shared:
     statistics: http://gdxypx.xy.com/WitSystem/BussinessApi/HighSeasData
@@ -196,4 +201,15 @@ shared:
     cert: http://gdxypx.xy.com/WitSystem/BussinessApi/CertStatsData
     orderArea: http://gdxypx.xy.com/WitSystem/BussinessApi/OrderAreaData
     rateData: http://gdxypx.xy.com//WitSystem/BussinessApi/CustomerConversionRateData
-    rateTrend: http://gdxypx.xy.com/WitSystem/BussinessApi/CustomerConversionRateTrendData
+    rateTrend: http://gdxypx.xy.com/WitSystem/BussinessApi/CustomerConversionRateTrendData
+    customerOrder: http://gdxypx.xy.com/WitSystem/BussinessApi/CustomerOrderData
+    tenantData: http://gdxypx.xy.com/witsystem/bussinessapi/GetOrgList
+    saleData: http://gdxypx.xy.com/witsystem/bussinessapi/GetSaleListByOrgId
+
+ZsBank:
+    publickey: BNsIe9U0x8IeSe4h/dxUzVEz9pie0hDSfMRINRXc7s1UIXfkExnYECF4QqJ2SnHxLv3z/99gsfDQrQ6dzN5lZj0=
+    privatekey: NBtl7WnuUtA2v5FaebEkU0/Jj1IodLGT6lQqwkzmd2E=
+    sm4key: VuAzSWQhsoNqzn0K
+
+record:
+    downloadPath: http://192.168.1.7:9090/common/user/data/download

+ 6 - 9
zhongzheng-api/src/main/resources/application-pre.yml

@@ -71,8 +71,8 @@ spring:
 aliyun:
     oss:
         endpoint: https://file.xyyxt.net # oss对外服务的访问域名
-        accessKeyId: LTAIgC8O2WUXvXuR  # 访问身份验证中用到用户标识
-        accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
+        accessKeyId: LTAI5tDbpYmpifZYNX8S3kt1  # 访问身份验证中用到用户标识
+        accessKeySecret: jCdSPAj58ZXOLsWpV8bCgNOYrEK0de # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
         bucketName: zhongzheng-prod # oss的存储空间
         policy:
             expire: 30 # 签名有效期(S)
@@ -187,10 +187,7 @@ exam:
     subscribeUpdateExam: http://192.168.1.7:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://192.168.1.7:9099/cd/subscribe/add/num
 
-shared:
-    statistics: http://gdxypx.xy.com/WitSystem/BussinessApi/HighSeasData
-    customer: http://gdxypx.xy.com/WitSystem/BussinessApi/CustomerStatsData
-    cert: http://gdxypx.xy.com/WitSystem/BussinessApi/CertStatsData
-    orderArea: http://gdxypx.xy.com/WitSystem/BussinessApi/OrderAreaData
-    rateData: http://gdxypx.xy.com//WitSystem/BussinessApi/CustomerConversionRateData
-    rateTrend: http://gdxypx.xy.com/WitSystem/BussinessApi/CustomerConversionRateTrendData
+ZsBank:
+    publickey: BNsIe9U0x8IeSe4h/dxUzVEz9pie0hDSfMRINRXc7s1UIXfkExnYECF4QqJ2SnHxLv3z/99gsfDQrQ6dzN5lZj0=
+    privatekey: NBtl7WnuUtA2v5FaebEkU0/Jj1IodLGT6lQqwkzmd2E=
+    sm4key: VuAzSWQhsoNqzn0K

+ 26 - 5
zhongzheng-api/src/main/resources/application-prod.yml

@@ -71,8 +71,8 @@ spring:
 #aliyun:
 #    oss:
 #        endpoint: https://file.xyyxt.net # oss对外服务的访问域名
-#        accessKeyId: LTAIgC8O2WUXvXuR  # 访问身份验证中用到用户标识
-#        accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
+#        accessKeyId: LTAI5tDbpYmpifZYNX8S3kt1  # 访问身份验证中用到用户标识
+#        accessKeySecret: jCdSPAj58ZXOLsWpV8bCgNOYrEK0de # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
 #        bucketName: zhongzheng-prod # oss的存储空间
 #        policy:
 #            expire: 30 # 签名有效期(S)
@@ -83,8 +83,8 @@ spring:
 aliyun:
     oss:
         endpoint: https://file.xyyxt.net # oss对外服务的访问域名
-        accessKeyId: LTAIgC8O2WUXvXuR  # 访问身份验证中用到用户标识
-        accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
+        accessKeyId: LTAI5tDbpYmpifZYNX8S3kt1  # 访问身份验证中用到用户标识
+        accessKeySecret: jCdSPAj58ZXOLsWpV8bCgNOYrEK0de # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
         bucketName: zhongzheng-prod # oss的存储空间
         policy:
             expire: 30 # 签名有效期(S)
@@ -146,7 +146,7 @@ oldStudySys:
     classOpenPath: https://www.xyyxt.net/System/BussinessApi/OpenClass
     salePassword: http://www.xyyxt.net/WitSystem/BussinessApi/GetSaleInfo
     updateInvoicePath: http://www.xyyxt.net/system/BussinessApi/UpdateInvoiceData
-    createExamPath: http://gdxypx.xy.com/system/BussinessApi/CreateSameClass
+    createExamPath: http://www.xyyxt.net/system/BussinessApi/CreateSameClass
 
 officialPush:
     infoPath: https://jypt.gdcic.net/organjxjy/ShangBaoMingdan
@@ -182,6 +182,9 @@ oldOrder:
 
 oldSys:
     host: http://test.jqbao.net
+    goods: http://www.xyyxt.net/system/BussinessApi/NewYxtLogin
+    question: http://192.168.1.121:8057/WordData/GetMeasureList
+    questionDetail: http://192.168.1.121:8057/WordData/GetTopicList
 
 invoice:
     host: https://ptapi.gdzzkj.net/sys/common/openMplatform/log
@@ -199,3 +202,21 @@ exam:
     subscribeSaveExam: http://39.108.7.155:9099/cd/subscribe/save/exam
     subscribeUpdateExam: http://39.108.7.155:9099/cd/subscribe/update/exam
     subscribeAddExamNum: http://39.108.7.155:9099/cd/subscribe/add/num
+    question: http://120.79.166.78:19013/common/question/getMeasureList
+    questionDetail: http://120.79.166.78:19013/common/question/getTopicList
+
+shared:
+    statistics: http://www.xyyxt.net/WitSystem/BussinessApi/HighSeasData
+    customer: http://www.xyyxt.net/WitSystem/BussinessApi/CustomerStatsData
+    cert: http://www.xyyxt.net/WitSystem/BussinessApi/CertStatsData
+    orderArea: http://www.xyyxt.net/WitSystem/BussinessApi/OrderAreaData
+    rateData: http://www.xyyxt.net//WitSystem/BussinessApi/CustomerConversionRateData
+    rateTrend: http://www.xyyxt.net/WitSystem/BussinessApi/CustomerConversionRateTrendData
+    customerOrder: http://www.xyyxt.net/WitSystem/BussinessApi/CustomerOrderData
+    tenantData: http://www.xyyxt.net/witsystem/bussinessapi/GetOrgList
+    saleData: http://www.xyyxt.net/witsystem/bussinessapi/GetSaleListByOrgId
+
+ZsBank:
+    publickey: BNsIe9U0x8IeSe4h/dxUzVEz9pie0hDSfMRINRXc7s1UIXfkExnYECF4QqJ2SnHxLv3z/99gsfDQrQ6dzN5lZj0=
+    privatekey: NBtl7WnuUtA2v5FaebEkU0/Jj1IodLGT6lQqwkzmd2E=
+    sm4key: VuAzSWQhsoNqzn0K

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

@@ -80,8 +80,8 @@ spring:
 #aliyun:
 #    oss:
 #        endpoint: https://file.xyyxt.net  # oss对外服务的访问域名
-#        accessKeyId: LTAIgC8O2WUXvXuR  # 访问身份验证中用到用户标识
-#        accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
+#        accessKeyId: LTAI5tDbpYmpifZYNX8S3kt1  # 访问身份验证中用到用户标识
+#        accessKeySecret: jCdSPAj58ZXOLsWpV8bCgNOYrEK0de # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
 #        bucketName: zhongzheng-prod # oss的存储空间
 #        policy:
 #            expire: 30 # 签名有效期(S)
@@ -92,8 +92,8 @@ spring:
 aliyun:
     oss:
         endpoint: https://file.xyyxt.net # oss对外服务的访问域名
-        accessKeyId: LTAIgC8O2WUXvXuR  # 访问身份验证中用到用户标识
-        accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
+        accessKeyId: LTAI5tDbpYmpifZYNX8S3kt1  # 访问身份验证中用到用户标识
+        accessKeySecret: jCdSPAj58ZXOLsWpV8bCgNOYrEK0de # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
         bucketName: zhongzheng-prod # oss的存储空间
         policy:
             expire: 30 # 签名有效期(S)
@@ -163,4 +163,4 @@ officialPush:
 
 handouts:
     savePath: https://attach.xyyxt.net/course/handouts/save
-    updatePath: https://attach.xyyxt.net/course/handouts/edit
+    updatePath: https://attach.xyyxt.net/course/handouts/edit

+ 5 - 2
zhongzheng-api/src/main/resources/application.yml

@@ -61,6 +61,9 @@ logging:
 
 # Spring配置
 spring:
+  mvc:
+    async:
+      request-timeout: 20000
   main:
     allow-bean-definition-overriding: true
   # 资源信息
@@ -262,8 +265,8 @@ aliyun:
     forgetTemplateCode: SMS_228685033
     pwdTemplateCode: SMS_230220381
     bindNewTelCode: SMS_232178371
-    accessKeyId: LTAIgC8O2WUXvXuR
-    accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX
+    accessKeyId: LTAI5tDbpYmpifZYNX8S3kt1
+    accessKeySecret: jCdSPAj58ZXOLsWpV8bCgNOYrEK0de
     OpenTheGoodsCode: SMS_230970155     #商品开通提醒
     informationNotificationCode: SMS_230965149  #完善报名资料通知
     materialReviewCode: SMS_230980165         #报名资料审核通过通知

+ 6 - 0
zhongzheng-common/pom.xml

@@ -92,6 +92,12 @@
             <version>3.3.0</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.19.2</version>
+        </dependency>
+
         <!-- OSS SDK 相关依赖 -->
         <dependency>
             <groupId>com.aliyun.oss</groupId>

+ 42 - 2
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java

@@ -3,8 +3,10 @@ package com.zhongzheng.common.utils;
 import cn.hutool.core.lang.Validator;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.time.DateFormatUtils;
+import org.apache.http.util.Args;
 
 import java.lang.management.ManagementFactory;
+import java.lang.ref.SoftReference;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.*;
@@ -35,6 +37,43 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
             "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
             "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
 
+    static final class DateFormatHolder {
+        private static final ThreadLocal<SoftReference<Map<String, SimpleDateFormat>>> THREADLOCAL_FORMATS = new ThreadLocal<SoftReference<Map<String, SimpleDateFormat>>>();
+
+        DateFormatHolder() {
+        }
+
+        public static SimpleDateFormat formatFor(String pattern) {
+            SoftReference<Map<String, SimpleDateFormat>> ref = THREADLOCAL_FORMATS.get();
+            Map<String, SimpleDateFormat> formats = ref == null ? null : ref.get();
+            if (formats == null) {
+                formats = new HashMap<String, SimpleDateFormat>();
+                THREADLOCAL_FORMATS.set(new SoftReference(formats));
+            }
+
+            SimpleDateFormat format = formats.get(pattern);
+
+            if (format == null) {
+                format = new SimpleDateFormat(pattern);
+                format.setTimeZone(TimeZone.getTimeZone("GMT+8"));
+                ((Map) formats).put(pattern, format);
+            }
+
+            return format;
+        }
+
+        public static void clearThreadLocal() {
+            THREADLOCAL_FORMATS.remove();
+        }
+    }
+
+    public static String formatDateV3(Date date, String pattern) {
+        Args.notNull(date, "Date");
+        Args.notNull(pattern, "Pattern");
+        SimpleDateFormat formatFor = DateFormatHolder.formatFor(pattern);
+        return formatFor.format(date);
+    }
+
     /**
      * 获取当前Date型日期
      *
@@ -410,6 +449,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return "LD"+getDateOrderSn();
     }
 
+
     public static String getPayOrderSn()
     {
         return "P"+getDateOrderSn();
@@ -663,7 +703,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
 
 
     public static Map<Long,Long> getWeekTime(Long startTime,Long endTime){
-        Map<Long,Long> mapList = new HashMap<>();
+        Map<Long,Long> mapList = new LinkedHashMap<>();
         Long zeroTime = DateUtils.getScheduleTimeZeroTime(startTime);
         //一天的时间戳
         Long time = 86400L;
@@ -677,7 +717,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
     public static Map<Long,Long> getMonthTime(Long startTime,Long endTime){
         //一天的时间戳
         Long time = 86400L;
-        Map<Long,Long> map = new HashMap<>();
+        Map<Long,Long> map = new  LinkedHashMap<>();
         try{
             SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
             Date d1 = DateUtils.timeToDate(startTime);

+ 2 - 2
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java

@@ -428,9 +428,9 @@ public class ToolsUtils {
     }
 
     public static String getTenantId() {
-        String TenantId = ServletUtils.getRequest().getHeader("TenantId");
+        String TenantId =  ServletUtils.getResponse().getHeader("TenantId");
         if(!StrUtil.isNotBlank(TenantId)||TenantId==null){
-            TenantId = ServletUtils.getResponse().getHeader("TenantId");
+            TenantId = ServletUtils.getRequest().getHeader("TenantId");
         }
         if(Validator.isNotEmpty(TenantId)){
             if(TenantId.equals("undefined")){

+ 138 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/bank/DCCryptor.java

@@ -0,0 +1,138 @@
+package com.zhongzheng.common.utils.bank;
+
+import org.bouncycastle.asn1.*;
+import org.bouncycastle.crypto.params.ECDomainParameters;
+import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
+import org.bouncycastle.crypto.params.ECPublicKeyParameters;
+import org.bouncycastle.crypto.params.ParametersWithID;
+import org.bouncycastle.crypto.signers.SM2Signer;
+import org.bouncycastle.jce.ECNamedCurveTable;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.jce.spec.ECParameterSpec;
+import org.bouncycastle.math.ec.ECPoint;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.ByteArrayInputStream;
+import java.math.BigInteger;
+import java.security.Security;
+import java.util.Enumeration;
+
+/**
+ * 示例代码,仅供参考
+ */
+public class DCCryptor {
+
+    static {
+        Security.addProvider(new BouncyCastleProvider());
+    }
+
+    public static byte[] CMBSM4EncryptWithCBC(byte key[], byte iv[], byte input[]) throws Exception {
+        if (key == null || iv == null || input == null) {
+            throw new Exception("CMBSM4EncryptWithCBC 非法输入");
+        }
+        return CMBSM4Crypt(key, iv, input, 1);
+    }
+
+    public static byte[] CMBSM4DecryptWithCBC(byte key[], byte iv[], byte input[]) throws Exception {
+        if (key == null || iv == null || input == null) {
+            throw new Exception("CMBSM4DecryptWithCBC 非法输入");
+        }
+        return CMBSM4Crypt(key, iv, input, 2);
+    }
+
+    public static byte[] CMBSM2SignWithSM3(byte[] id, byte privkey[], byte msg[]) throws Exception {
+        if (privkey == null || msg == null) {
+            throw new Exception("CMBSM2SignWithSM3 input error");
+        }
+        ECPrivateKeyParameters privateKey = encodePrivateKey(privkey);
+        SM2Signer signer = new SM2Signer();
+        ParametersWithID parameters = new ParametersWithID(privateKey, id);
+        signer.init(true, parameters);
+        signer.update(msg, 0, msg.length);
+        return decodeDERSignature(signer.generateSignature());
+    }
+
+    public static boolean CMBSM2VerifyWithSM3(byte[] id, byte pubkey[], byte msg[], byte signature[]) throws Exception {
+
+        if (pubkey == null || msg == null || signature == null) {
+            throw new Exception("CMBSM2VerifyWithSM3 input error");
+        }
+        ECPublicKeyParameters publicKey = encodePublicKey(pubkey);
+        SM2Signer signer = new SM2Signer();
+        ParametersWithID parameters = new ParametersWithID(publicKey, id);
+        signer.init(false, parameters);
+        signer.update(msg, 0, msg.length);
+        return signer.verifySignature(encodeDERSignature(signature));
+    }
+
+    private static byte[] CMBSM4Crypt(byte key[], byte iv[], byte input[], int mode) throws Exception {
+        SecretKeySpec spec = new SecretKeySpec(key, "SM4");
+        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
+        Cipher cipher = Cipher.getInstance("SM4/CBC/PKCS7Padding", BouncyCastleProvider.PROVIDER_NAME);
+        cipher.init(mode, spec, ivParameterSpec);
+        return cipher.doFinal(input);
+    }
+
+    private static ECPrivateKeyParameters encodePrivateKey(byte[] value) {
+        BigInteger d = new BigInteger(1, value);
+        ECParameterSpec spec = ECNamedCurveTable.getParameterSpec("sm2p256v1");
+        ECDomainParameters ecParameters = new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN(), spec.getH(), spec.getSeed());
+        return new ECPrivateKeyParameters(d, ecParameters);
+    }
+
+    public static ECPublicKeyParameters encodePublicKey(byte[] value) {
+        byte[] x = new byte[32];
+        byte[] y = new byte[32];
+        System.arraycopy(value, 1, x, 0, 32);
+        System.arraycopy(value, 33, y, 0, 32);
+        BigInteger X = new BigInteger(1, x);
+        BigInteger Y = new BigInteger(1, y);
+        ECParameterSpec spec = ECNamedCurveTable.getParameterSpec("sm2p256v1");
+        ECPoint Q = spec.getCurve().createPoint(X, Y);
+        ECDomainParameters ecParameters = new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN(), spec.getH(), spec.getSeed());
+        return new ECPublicKeyParameters(Q, ecParameters);
+    }
+
+    @SuppressWarnings("unchecked")
+    private static byte[] decodeDERSignature(byte[] signature) throws Exception {
+        ASN1InputStream stream = new ASN1InputStream(new ByteArrayInputStream(signature));
+        ASN1Sequence primitive = (ASN1Sequence) stream.readObject();
+        Enumeration<ASN1Integer> enumeration = primitive.getObjects();
+        BigInteger R = enumeration.nextElement().getValue();
+        BigInteger S = enumeration.nextElement().getValue();
+        byte[] bytes = new byte[64];
+        byte[] r = format(R.toByteArray());
+        byte[] s = format(S.toByteArray());
+        System.arraycopy(r, 0, bytes, 0, 32);
+        System.arraycopy(s, 0, bytes, 32, 32);
+        return bytes;
+    }
+
+    private static byte[] encodeDERSignature(byte[] signature) throws Exception {
+        byte[] r = new byte[32];
+        byte[] s = new byte[32];
+        System.arraycopy(signature, 0, r, 0, 32);
+        System.arraycopy(signature, 32, s, 0, 32);
+        ASN1EncodableVector vector = new ASN1EncodableVector();
+        vector.add(new ASN1Integer(new BigInteger(1, r)));
+        vector.add(new ASN1Integer(new BigInteger(1, s)));
+        return (new DERSequence(vector)).getEncoded();
+    }
+
+    private static byte[] format(byte[] value) {
+        if (value.length == 32) {
+            return value;
+        } else {
+            byte[] bytes = new byte[32];
+            if (value.length > 32) {
+                System.arraycopy(value, value.length - 32, bytes, 0, 32);
+            } else {
+                System.arraycopy(value, 0, bytes, 32 - value.length, value.length);
+            }
+            return bytes;
+        }
+    }
+
+}

+ 169 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/bank/DCHelper.java

@@ -0,0 +1,169 @@
+package com.zhongzheng.common.utils.bank;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+
+import javax.net.ssl.*;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.KeyStore;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 示例代码,仅供参考
+ * 本示例中用到的(HttpUrlConnection)存在不遵循RFC协议的重试机制,请在启动参数中将sun.net.http.retryPost参数设置为false,禁用重发。
+ */
+public class DCHelper {
+
+    public static String serialJsonOrdered(JsonObject json) throws Exception {
+        StringBuilder appender = new StringBuilder();
+        appender.append("{");
+        Iterator<String> keys = new TreeSet<>(json.keySet()).iterator();
+        boolean isFirstEle = true;
+        while (keys.hasNext()) {
+            if (!isFirstEle) {
+                appender.append(",");
+            }
+            String key = keys.next();
+            Object val = json.get(key);
+            if (val instanceof JsonObject) {
+                appender.append("\"").append(key).append("\":");
+                appender.append(serialJsonOrdered((JsonObject) val));
+            } else if (val instanceof JsonArray) {
+                JsonArray jarray = (JsonArray) val;
+                appender.append("\"").append(key).append("\":[");
+                boolean isFirstArrEle = true;
+                for (int i = 0; i < jarray.size(); i++) {
+                    if (!isFirstArrEle) {
+                        appender.append(",");
+                    }
+                    Object obj = jarray.get(i);
+                    if (obj instanceof JsonObject) {
+                        appender.append(serialJsonOrdered((JsonObject) obj));
+                    } else {
+                        appender.append(obj.toString());
+                    }
+                    isFirstArrEle = false;
+                }
+                appender.append("]");
+            } else {
+                String value = val.toString();
+                appender.append("\"").append(key).append("\":").append(value);
+            }
+            isFirstEle = false;
+        }
+        appender.append("}");
+        return appender.toString();
+    }
+
+    public static String getTime() {
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+        return dateFormat.format(new Date());
+    }
+
+    public static String doPostForm(String httpUrl, Map<String, String> param) throws Exception {
+        HttpURLConnection connection = null;
+        InputStream is = null;
+        OutputStream os = null;
+        BufferedReader br = null;
+        String result = null;
+        try {
+            URL url = new URL(httpUrl);
+            SSLContext sslcontext;
+            sslcontext = SSLContext.getInstance("SSL");
+            TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+            tmf.init((KeyStore) null);
+            X509TrustManager defaultTm = null;
+            for (TrustManager tm : tmf.getTrustManagers()) {
+                if (tm instanceof X509TrustManager) {
+                    defaultTm = (X509TrustManager) tm;
+                    break;
+                }
+            }
+            sslcontext.init(null, new TrustManager[] { defaultTm }, new java.security.SecureRandom());
+            HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory());
+
+            connection = (HttpURLConnection) url.openConnection();
+            connection.setRequestMethod("POST");
+            connection.setConnectTimeout(15000);
+            connection.setReadTimeout(60000);
+            connection.setInstanceFollowRedirects(true);
+
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+
+            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+            os = connection.getOutputStream();
+            os.write(createLinkString(param).getBytes());
+            if (connection.getResponseCode() != 200) {
+                is = connection.getErrorStream();
+                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+                StringBuilder sbf = new StringBuilder();
+                String temp = null;
+                while ((temp = br.readLine()) != null) {
+                    sbf.append(temp);
+                    sbf.append("\r\n");
+                }
+                result = sbf.toString();
+            } else {
+                is = connection.getInputStream();
+                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+                StringBuilder sbf = new StringBuilder();
+                String temp = null;
+                boolean firstLine = true;
+                while ((temp = br.readLine()) != null) {
+                    if (!firstLine) {
+                        firstLine = false;
+                        sbf.append("\r\n");
+                    }
+                    sbf.append(temp);
+                }
+                result = sbf.toString();
+            }
+        } finally {
+            if (null != br) {
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != os) {
+                try {
+                    os.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != is) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            connection.disconnect();
+        }
+        return result;
+    }
+
+    private static String createLinkString(Map<String, String> params) throws Exception {
+        ArrayList<String> keys = new ArrayList<>(params.keySet());
+        Collections.sort(keys);
+
+        StringBuilder prestr = new StringBuilder();
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            String value = params.get(key);
+            if (i == keys.size() - 1) {
+                prestr.append(key).append("=").append(value);
+            } else {
+                prestr.append(key).append("=").append(value).append("&");
+            }
+        }
+        return prestr.toString();
+    }
+
+}

+ 61 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/bank/GENKey.java

@@ -0,0 +1,61 @@
+package com.zhongzheng.common.utils.bank;
+
+import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
+import org.bouncycastle.crypto.params.ECDomainParameters;
+import org.bouncycastle.crypto.params.ECKeyGenerationParameters;
+import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
+import org.bouncycastle.crypto.params.ECPublicKeyParameters;
+import org.bouncycastle.jce.ECNamedCurveTable;
+import org.bouncycastle.jce.spec.ECParameterSpec;
+import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
+
+import java.math.BigInteger;
+import java.security.SecureRandom;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+
+public class GENKey {
+
+    private static ECDomainParameters getECDomainParameters() {
+        ECParameterSpec spec = ECNamedCurveTable.getParameterSpec("sm2p256v1");
+        return new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN(), spec.getH(), spec.getSeed());
+    }
+
+
+    /**
+     * 生成国密密钥对
+     *
+     * @return
+     */
+    public static Map<String, byte[]> CMBSM2KeyGen() {
+        ECDomainParameters domainParameters = getECDomainParameters();
+        ECKeyPairGenerator generator = new ECKeyPairGenerator();
+        ECKeyGenerationParameters parameters = new ECKeyGenerationParameters(domainParameters, new SecureRandom());
+        generator.init(parameters);
+        AsymmetricCipherKeyPair keyPair = generator.generateKeyPair();
+        ECPublicKeyParameters publicKeyParameters = (ECPublicKeyParameters) keyPair.getPublic();
+        ECPrivateKeyParameters privateKeyParameters = (ECPrivateKeyParameters) keyPair.getPrivate();
+        Map<String, byte[]> map = new HashMap<>();
+        map.put("publickey", publicKeyParameters.getQ().getEncoded(false));
+        map.put("privatekey", format(privateKeyParameters.getD().toByteArray()));
+        return map;
+    }
+
+    private static byte[] format(byte[] value) {
+        if (value.length == 32) {
+            return value;
+        }
+        byte bytes[] = new byte[32];
+        if (value.length > 32) {
+            System.arraycopy(value, value.length - 32, bytes, 0, 32);
+        } else {
+            System.arraycopy(value, 0, bytes, 32 - value.length, value.length);
+        }
+        return bytes;
+    }
+
+}

+ 1 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/http/HttpUtils.java

@@ -1,6 +1,7 @@
 package com.zhongzheng.common.utils.http;
 
 import cn.hutool.core.lang.Validator;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import org.apache.http.*;
 import org.apache.http.client.HttpClient;

+ 1 - 1
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/poi/EasyPoiUtil.java

@@ -166,7 +166,7 @@ public class EasyPoiUtil {
         } catch (NoSuchElementException e) {
             throw new RuntimeException("excel文件不能为空");
         } catch (Exception e) {
-            throw new RuntimeException(e.getMessage());
+            throw new RuntimeException("导入的文件不正确,请重新导入!");
 
         }
         return list;

+ 2 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java

@@ -152,6 +152,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/common/create/tenant/admin").anonymous()
                 .antMatchers("/common/create/tenant/admin/old").anonymous()
                 .antMatchers("/common/update/role").anonymous()
+                .antMatchers("/common/question/import").anonymous()
+                .antMatchers("/common/question/*").anonymous()
                 .antMatchers("/common/free/**").anonymous()
                 .antMatchers("/common/download**").anonymous()
                 .antMatchers("/common/download/resource**").anonymous()

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

@@ -54,9 +54,9 @@ public class CustomTenantLineHandler implements TenantLineHandler {
     @SneakyThrows
     @Override
     public Expression getTenantId() {
-        String TenantId = ServletUtils.getRequest().getHeader("TenantId");
+        String TenantId = ServletUtils.getResponse().getHeader("TenantId");
         if(Validator.isEmpty(TenantId)){
-            TenantId = ServletUtils.getResponse().getHeader("TenantId");
+            TenantId = ServletUtils.getRequest().getHeader("TenantId");
             if(enabledTenant){
                 if(Validator.isEmpty(TenantId)){
                     int code = HttpStatus.HTTP_UNAVAILABLE;

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

@@ -6,6 +6,7 @@ import cn.hutool.core.convert.Convert;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -24,8 +25,14 @@ import com.zhongzheng.common.exception.BaseException;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.type.EncryptHandler;
 import com.zhongzheng.common.utils.*;
+import com.zhongzheng.common.utils.file.FileUtils;
+import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.common.utils.ip.IpUtils;
+import com.zhongzheng.modules.alioss.bo.OssRequest;
+import com.zhongzheng.modules.alioss.service.OssService;
 import com.zhongzheng.modules.alisms.service.IAliSmsService;
+import com.zhongzheng.modules.base.domain.UserProfile;
+import com.zhongzheng.modules.base.service.IUserProfileService;
 import com.zhongzheng.modules.collect.domain.CollectBank;
 import com.zhongzheng.modules.collect.domain.CollectCourse;
 import com.zhongzheng.modules.collect.domain.CollectNote;
@@ -35,38 +42,54 @@ import com.zhongzheng.modules.collect.mapper.CollectNoteMapper;
 import com.zhongzheng.modules.course.domain.Course;
 import com.zhongzheng.modules.course.domain.CourseSection;
 import com.zhongzheng.modules.course.domain.CourseSubject;
+import com.zhongzheng.modules.course.domain.Major;
 import com.zhongzheng.modules.course.service.ICourseSectionService;
 import com.zhongzheng.modules.course.service.ICourseService;
 import com.zhongzheng.modules.course.service.ICourseSubjectService;
+import com.zhongzheng.modules.course.service.IMajorService;
+import com.zhongzheng.modules.exam.service.IExamApplyService;
 import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.service.IGoodsService;
+import com.zhongzheng.modules.goods.vo.UserNewGoodsVo;
 import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.service.IClassGradeUserService;
+import com.zhongzheng.modules.grade.service.impl.ClassGradeServiceImpl;
 import com.zhongzheng.modules.grade.vo.ClassGradeUserGoodsVo;
+import com.zhongzheng.modules.system.domain.SysTask;
 import com.zhongzheng.modules.system.domain.SysTenant;
 import com.zhongzheng.modules.system.service.ISysConfigService;
+import com.zhongzheng.modules.system.service.ISysTaskService;
 import com.zhongzheng.modules.system.service.ISysTenantService;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.domain.User;
+import com.zhongzheng.modules.user.domain.UserCertificate;
 import com.zhongzheng.modules.user.domain.UserStudyLog;
 import com.zhongzheng.modules.user.domain.UserVisitLog;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.modules.user.mapper.UserMapper;
 import com.zhongzheng.modules.user.service.*;
 import com.zhongzheng.modules.user.vo.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
+import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
-
+import java.util.stream.Stream;
 
 
 /**
@@ -78,6 +101,8 @@ import java.util.stream.Collectors;
 @Service
 public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
 
+    private static Logger log = LoggerFactory.getLogger(UserServiceImpl.class);
+
     @Autowired
     private CollectCourseMapper collectCourseMapper;
 
@@ -110,19 +135,24 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
 
     @Autowired
     private RedisCache redisCache;
-
+    @Autowired
+    private ISysTaskService iSysTaskService;
     @Autowired
     private ICourseSubjectService iCourseSubjectService;
-
+    @Autowired
+    private IUserCertificateService iUserCertificateService;
     @Autowired
     private TokenService tokenService;
-
+    @Autowired
+    private IMajorService iMajorService;
     @Autowired
     private IUserVisitLogService iUserVisitLogService;
-
+    @Autowired
+    private IUserProfileService iUserProfileService;
     @Autowired
     private IUserStudyLogService iUserStudyLogService;
-
+    @Autowired
+    private IExamApplyService iExamApplyService;
     @Autowired
     private IUserLoginErrorService iUserLoginErrorService;
     @Autowired
@@ -131,13 +161,18 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
     private IGoodsService iGoodsService;
     @Autowired
     private ISysTenantService iSysTenantService;
-
+    @Autowired
+    private OssService ossService;
     @Autowired
     private ICourseService iCourseService;
     @Autowired
     private ICourseSectionService iCourseSectionService;
     @Value("${liveGotoURL}")
     private String liveGotoURL;
+    @Value("${oldSys.goods}")
+    private String OLD_GOODS;
+    @Value("${record.downloadPath}")
+    private String RECORD_DOWNLOAD;
 
 
     @Override
@@ -225,6 +260,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         return list;
     }
 
+    @Override
+    public List<UserVo> dangAnList(UserQueryBo bo) {
+        List<User> list = baseMapper.dangAnList(bo);
+        return entity2UserVo(list);
+    }
+
     @Override
     public List<UserStatstVo> statsList(UserQueryBo bo) {
         List<UserStatstVo> list = new ArrayList<>();
@@ -693,8 +734,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         if (ObjectUtils.isNotNull(bo.getEduLevel())){
             inertData.setEduLevel(bo.getEduLevel());
         }
-        if (ObjectUtils.isNotNull(bo.getSex())){
-            inertData.setSex(bo.getSex());
+        if (ObjectUtils.isNotNull(bo.getSexNum())){
+            inertData.setSex(bo.getSexNum());
         }
         if (ObjectUtils.isNotNull(bo.getIdcard())){
             inertData.setIdCard(bo.getIdcard());
@@ -719,7 +760,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         if(!save(inertData)){
             throw new CustomException("注册失败");
         }
-        iSmsService.sendPwdSms(bo.getTel(),pwd);
+//        iSmsService.sendPwdSms(bo.getTel(),pwd);
         return inertData.getUserId();
     }
 
@@ -897,7 +938,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
                 errorList.add(itemImport);
                 continue;
             }
-            iSmsService.sendPwdSms(itemImport.getTelphone(),pwd);
+//            iSmsService.sendPwdSms(itemImport.getTelphone(),pwd);
             itemImport.setUserId(inertData.getUserId());
             itemImport.setImportNo(importNo);
             itemImport.setStudentCode(inertData.getUserAccount());
@@ -910,6 +951,69 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         return resultMap;
     }
 
+    @Override
+    public Long importUser(UserImportAddBo itemImport, String importNo) {
+        if(Validator.isEmpty(itemImport.getTelphone())||itemImport.getTelphone().length()!=11){
+            throw new CustomException("手机号不能为空或者格式不对");
+        }
+        if(Validator.isEmpty(itemImport.getIdCard())){
+            throw new CustomException("身份证不能为空");
+        }
+        if(Validator.isEmpty(itemImport.getRealname())){
+            throw new CustomException("真实姓名不能为空");
+        }
+        User user = getOne(new LambdaQueryWrapper<User>()
+                .eq(User::getIdCard,EncryptHandler.encrypt(itemImport.getIdCard())).last("limit 1"));
+        if(Validator.isNotNull(user)){
+            return user.getUserId();
+        }else{
+            User user2 = getOne(new LambdaQueryWrapper<User>()
+                    .eq(User::getTelphone,EncryptHandler.encrypt(itemImport.getTelphone())).last("limit 1"));
+            if(Validator.isNotEmpty(user2)){
+                throw new CustomException(itemImport.getTelphone(),439);
+            }
+        }
+        User inertData = new User();
+        inertData.setTelphone(itemImport.getTelphone());
+        //隐藏手机号作为初始昵称
+        inertData.setNickname(TelPhoneUtils.hideTelPhone(itemImport.getTelphone()));
+        //雪花算法产生账号ID
+        SnowflakeIdUtils idWorker = new SnowflakeIdUtils(3, 1);
+        inertData.setUserAccount(String.valueOf(idWorker.nextId()));
+        inertData.setSex(1);
+        if(Validator.isNotEmpty(itemImport.getSex())){
+            inertData.setSex(itemImport.getSex().equals("女")?2:1);
+        }
+        if(Validator.isNotEmpty(itemImport.getEduLevel())){
+            inertData.setEduLevel(itemImport.getEduLevel());
+        }
+        inertData.setIdCard(itemImport.getIdCard());
+        inertData.setRealname(itemImport.getRealname());
+        if (StringUtils.isNotBlank(itemImport.getCompanyName())) {
+            inertData.setCompanyName(itemImport.getCompanyName());
+        }
+        inertData.setEduLevel(itemImport.getEduLevel());
+        inertData.setCompanyName(itemImport.getCompanyName());
+        inertData.setStatus(1);
+        inertData.setRegisterPlat("5");
+        inertData.setAvatar(Constants.DEFAULT_AVATAR);
+        inertData.setLastLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
+        inertData.setLastLoginTime(DateUtils.getNowTime());
+        inertData.setCreateTime(DateUtils.getNowTime());
+        inertData.setUpdateTime(DateUtils.getNowTime());
+//            String pwd =  ToolsUtils.getSmsCode(); // 随机密码
+//            inertData.setPassword(SecurityUtils.encryptPassword(pwd));
+        //初始密码(身份证后6位)
+        String idCard = itemImport.getIdCard();
+        String pwd =  idCard.substring(idCard.length() - 6); // 随机密码
+        inertData.setPassword(SecurityUtils.encryptPassword(pwd));
+        inertData.setImportNo(importNo); //设置导入编号 一个导入页面同时导入多次算一个编号
+        if(!save(inertData)){
+            throw new CustomException("注册失败");
+        }
+        return inertData.getUserId();
+    }
+
     @Override
     public Boolean updatePwd(UserAppUpdatePwdBo bo) {
         LambdaQueryWrapper<User> queryWrapper =new LambdaQueryWrapper<User>();
@@ -962,6 +1066,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
             if(Validator.isEmpty(bo.getTelphone())){
                 throw new CustomException("用户手机号码缺失");
             }
+            log.info("批量获取用户ID" + JSON.toJSONString(bo));
 //            if(Validator.isEmpty(bo.getIdCard())){
 //                throw new CustomException("用户身份证号码缺失");
 //            }
@@ -1008,18 +1113,21 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
                     }
                 }*/
                 UserSystemRegisterBo registerBo = BeanUtil.toBean(bo, UserSystemRegisterBo.class);
+                String tel = "";
                 if (Validator.isNotEmpty(user1)){
                     //手机号码存在,身份证不一致 (随机生成)
-                    registerBo.setTel(createTel());
+                    tel = createTel();
+                    registerBo.setTel(tel);
                 }else {
-                    registerBo.setTel(bo.getTelphone());
+                    tel = bo.getTelphone();
+                    registerBo.setTel(tel);
                 }
                 if(Validator.isNotEmpty(bo.getSex())){
                     if(bo.getSex().equals("男")){
-                        registerBo.setSex(1);
+                        registerBo.setSexNum(1);
                     }
                     else if(bo.getSex().equals("女")){
-                        registerBo.setSex(2);
+                        registerBo.setSexNum(2);
                     }
                 }
                 if(Validator.isNotEmpty(bo.getEducation())){
@@ -1031,6 +1139,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
                 if(userId.longValue()>0){
                     UserIdCardBatchVo user = BeanUtil.toBean(bo, UserIdCardBatchVo.class);
                     user.setUserId(userId);
+                    user.setTelphone(tel);
                     list1.add(user);
                     continue;
                 }
@@ -1611,6 +1720,305 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         return baseMapper.getByCardNoTenant(idCard);
     }
 
+    @Override
+    public Map<String, Object> importSevenUser(List<UserPeriodImportBo> userList) {
+        if (CollectionUtils.isEmpty(userList)) {
+            throw new IllegalArgumentException("请勿导入空表格");
+        }
+        List<UserPeriodImportBo> errorList = new ArrayList<>();
+        List<UserPeriodImportBo> successList = new ArrayList<>();
+        String importNo = ServletUtils.getEncoded("IMPORT");
+        for (UserPeriodImportBo itemImport : userList) {
+            if(Validator.isEmpty(itemImport.getUserPhone())||itemImport.getUserPhone().length()!=11){
+                itemImport.setCause("手机号不能为空或者格式不对");
+                errorList.add(itemImport);
+                continue;
+            }
+            if(Validator.isEmpty(itemImport.getUserCard())){
+                itemImport.setCause("身份证不能为空");
+                errorList.add(itemImport);
+                continue;
+            }
+            if(Validator.isEmpty(itemImport.getUserName())){
+                itemImport.setCause("真实姓名不能为空");
+                errorList.add(itemImport);
+                continue;
+            }
+            User user = getOne(new LambdaQueryWrapper<User>()
+                    .eq(User::getTelphone,EncryptHandler.encrypt(itemImport.getUserPhone())).last("limit 1"));
+            if(Validator.isNotNull(user)){
+                if(Validator.isNotEmpty(user.getIdCard())&&Validator.isNotEmpty(itemImport.getUserCard())&&!itemImport.getUserCard().equals(user.getIdCard())){
+                    throw new CustomException(itemImport.getUserCard()+"身份证号码不一致");
+                }
+                if(Validator.isEmpty(user.getIdCard())){
+                    //更新身份证和姓名
+                    user.setIdCard(itemImport.getUserCard());
+                    user.setRealname(itemImport.getUserName());
+                    updateById(user);
+                }
+                //手机号已存在
+                itemImport.setUserId(user.getUserId());
+                itemImport.setStudentCode(user.getUserAccount());
+                itemImport.setUserName(user.getRealname());
+                itemImport.setUserCard(user.getIdCard());
+                successList.add(itemImport);
+                continue;
+            }else{
+                User user2 = getOne(new LambdaQueryWrapper<User>()
+                        .eq(User::getIdCard,EncryptHandler.encrypt(itemImport.getUserCard())).last("limit 1"));
+                if(Validator.isNotEmpty(user2)){
+                    throw new CustomException(itemImport.getUserName()+"身份证号码已存在,创建失败");
+                }
+            }
+            User inertData = new User();
+            inertData.setTelphone(itemImport.getUserPhone());
+            //隐藏手机号作为初始昵称
+            inertData.setNickname(TelPhoneUtils.hideTelPhone(itemImport.getUserPhone()));
+            //雪花算法产生账号ID
+            SnowflakeIdUtils idWorker = new SnowflakeIdUtils(3, 1);
+            inertData.setUserAccount(String.valueOf(idWorker.nextId()));
+            inertData.setSex(1);
+            if(Validator.isNotEmpty(itemImport.getSex())){
+                inertData.setSex(itemImport.getSex().equals("女")?2:1);
+            }
+            if(Validator.isNotEmpty(itemImport.getEducation())){
+                inertData.setEduLevel(itemImport.getEducation());
+            }
+            inertData.setIdCard(itemImport.getUserCard());
+            inertData.setRealname(itemImport.getUserName());
+            inertData.setStatus(1);
+            inertData.setRegisterPlat("3");
+            inertData.setAvatar(Constants.DEFAULT_AVATAR);
+            inertData.setLastLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
+            inertData.setLastLoginTime(DateUtils.getNowTime());
+            inertData.setCreateTime(DateUtils.getNowTime());
+            inertData.setUpdateTime(DateUtils.getNowTime());
+            //初始密码(身份证后6位)
+            String idCard = itemImport.getUserCard();
+            String pwd =  idCard.substring(idCard.length() - 6); // 随机密码
+            inertData.setPassword(SecurityUtils.encryptPassword(pwd));
+            inertData.setImportNo(importNo); //设置导入编号 一个导入页面同时导入多次算一个编号
+            if(!save(inertData)){
+                itemImport.setCause("注册失败");
+                errorList.add(itemImport);
+                continue;
+            }
+            itemImport.setUserId(inertData.getUserId());
+            itemImport.setImportNo(importNo);
+            itemImport.setStudentCode(inertData.getUserAccount());
+            successList.add(itemImport);
+        }
+        return null;
+    }
+
+    @Override
+    public void userDataImportUp(List<UserDataImportBo> customerBos) {
+        if (CollectionUtils.isEmpty(customerBos)){
+            throw new CustomException("上传文件有误!请检查");
+        }
+        customerBos.forEach(item -> {
+            if (StringUtils.isBlank(item.getUserCard())){
+                throw new CustomException("身份证号码不能为空!");
+            }
+            User user = getOne(new LambdaQueryWrapper<User>()
+                    .eq(User::getIdCard, EncryptHandler.encrypt(item.getUserCard()))
+                    .eq(User::getStatus, 1));
+            if (Objects.isNull(user)){
+                throw new CustomException("用户获取失败,请检查身份证号码!");
+            }
+
+            //跟新用户资料
+            user.setRealname(item.getUserName());
+            if (ObjectUtils.isNotNull(item.getUserPhone())){
+                user.setTelphone(item.getUserPhone());
+            }
+            if (ObjectUtils.isNotNull(item.getSex())){
+                user.setSex(StringUtils.isNotBlank(item.getSex()) && item.getSex().equals("男") ? 1:2);
+            }
+            user.setEduLevel(item.getEducation());
+            user.setSchool(item.getSchool());
+            if (ObjectUtils.isNotNull(item.getGraduationTime())){
+                user.setGraduationTime(DateUtils.formatDate(item.getGraduationTime(),"yyyy-MM-dd"));
+            }
+            user.setMajor(item.getMajor());
+            user.setWorkYear(item.getWorkYear());
+            user.setCompanyName(item.getCompany());
+            user.setUnitContact(item.getCompanyContact());
+            user.setUnitTel(item.getCompanyPhone());
+            updateById(user);
+
+        });
+    }
+
+    @Override
+    public void userDataImgImport(MultipartFile file) {
+        String zhiyuan = System.getProperty("user.dir");
+        String path = zhiyuan+"/zhongzheng-admin/src/main/resources/xueyuanzhiliao";
+        try {
+            FileUtils.unzipWithStream(file.getInputStream(),path);
+        }catch (Exception e){
+            e.printStackTrace();
+            throw new CustomException("文件解压错误");
+        }
+        // 路径
+        try (Stream<Path> paths = Files.walk(Paths.get(path))){
+            List<Path> fileNames = paths
+                    .filter(Files::isRegularFile)
+                    .collect(Collectors.toList());
+            if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(fileNames)){
+                return;
+            }
+            for (Path fileName : fileNames) {
+                Path name = fileName.getFileName();
+                //身份证号码
+                List<String> sign = Arrays.stream(name.toString().split("&")).collect(Collectors.toList());
+                //身份证号
+                String idCard = sign.get(0);
+                User user = getOne(new LambdaQueryWrapper<User>()
+                        .eq(User::getIdCard, EncryptHandler.encrypt(idCard)));
+                if (ObjectUtils.isNull(user)){
+                    throw new CustomException("文件名称有误,请按命名规则修改文件名!");
+                }
+
+                //上传OSS
+                File userFile = new File(fileName.toString());
+                MultipartFile multipartFile = FileUtils.getMultipartFile(userFile);
+                OssRequest ossRequest = new OssRequest();
+                ossRequest.setUserId(user.getUserId());
+                ossRequest.setFile(multipartFile);
+                ossRequest.setImageStatus(0);
+                String upload = "";
+                try {
+                    upload = ossService.upload(ossRequest);
+                }catch (Exception e) {
+                    throw new CustomException(name+"上传oss失败");
+                }
+                if (name.toString().contains("证件照")){
+                    user.setOneInchPhotos(upload);
+                }
+                if (name.toString().contains("身份证正面")){
+                    user.setIdCardImg1(upload);
+                }
+                if (name.toString().contains("身份证反面")){
+                    user.setIdCardImg2(upload);
+                }
+                if (name.toString().contains("承诺书")){
+                    //专业
+                    String major = sign.get(sign.size() - 1);
+                    List<UserProfile> userProfiles = iExamApplyService.getUserProfiles(idCard, "考前培训施工现场专业人员", major);
+                    for (UserProfile userItem : userProfiles) {
+                        JSONObject jsonObject = JSONObject.parseObject(userItem.getKeyValue());
+                        Map<String, Object> userMap = new HashMap<>();
+                        for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
+                            userMap.put(entry.getKey(), entry.getValue());
+                        }
+                        String key = "commitment_electr_signature";
+                        String fieldName = "承诺书电子签";
+                        JSONObject recentJson = JSONObject.parseObject(userMap.get(key).toString());
+                        Map<String, Object> recentMap = new HashMap<>();
+                        for (Map.Entry<String, Object> entry : recentJson.entrySet()) {
+                            recentMap.put(entry.getKey(), entry.getValue());
+                        }
+                        if (ObjectUtils.isNotNull(recentMap)){
+                            recentMap.put("value",upload);
+                        }else {
+                            recentMap.put("fieldKey",key);
+                            recentMap.put("value",upload);
+                            recentMap.put("fieldName",fieldName);
+                            recentMap.put("status",0);
+                        }
+                        userMap.put(key,recentMap);
+                        String content = JSONObject.toJSONString(userMap);
+                        userItem.setKeyValue(content);
+                    }
+                    iUserProfileService.updateBatchById(userProfiles);
+                }
+                if (name.toString().contains("证书")){
+                    //专业
+                    String majorName = sign.get(sign.size() - 1);
+                    Major major = iMajorService.getOne(new LambdaQueryWrapper<Major>()
+                            .eq(Major::getCategoryName, majorName)
+                            .eq(Major::getStatus, 1)
+                            .last("limit 1"));
+                    if (ObjectUtil.isNotNull(major)){
+                        iUserCertificateService.update(new LambdaUpdateWrapper<UserCertificate>()
+                                .set(UserCertificate::getCertificatePath,upload)
+                                .eq(UserCertificate::getUserId,user.getUserId())
+                                .eq(UserCertificate::getMajorId,major.getId()));
+                    }
+                }
+                updateById(user);
+            }
+            //删除本地文件
+            FileUtils.deleteFilePackage(path);
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new CustomException("学员资料有误");
+        }
+    }
+
+    @Override
+    public void userDataDownload(UserDownloadBo bo) {
+        if (CollectionUtils.isEmpty(bo.getUserIds())){
+            return;
+        }
+        //创建学员资料下载
+        SysTask task = new SysTask();
+        task.setTaskName(String.format("学员资料下载:操作人ID(%s),时间:%s",bo.getCreateSysUserId(),DateUtils.getTime()));
+        String code = ServletUtils.getEncoded("DA");
+        bo.setTaskCode(code);
+        task.setTaskCode(code);
+        task.setTaskNum(1);
+        task.setFinishNum(0);
+        task.setTaskStatus(1);
+        task.setTaskType(2);
+        task.setTaskParam(JSONObject.toJSONString(bo));
+        task.setSysUserId(bo.getCreateSysUserId());
+        task.setStatus(1);
+        task.setCreateTime(DateUtils.getNowTime());
+        task.setUpdateTime(DateUtils.getNowTime());
+        iSysTaskService.save(task);
+        //发送下载请求
+        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+        HashMap<String, String> map = new HashMap<>();
+        map.put("TenantId", tenantId);
+        HttpUtils.sendPostJsonHeader(RECORD_DOWNLOAD, JSONObject.toJSONString(bo),map);
+    }
+
+    @Override
+    public List<UserDownloadVo> userDataDownloadList(Long userId) {
+        List<SysTask> list = iSysTaskService.list(new LambdaQueryWrapper<SysTask>()
+                .eq(SysTask::getSysUserId, userId)
+                .eq(SysTask::getStatus, 1)
+                .eq(SysTask::getTaskType, 2)
+                .orderByDesc(SysTask::getCreateTime));
+        if (CollectionUtils.isEmpty(list)){
+            return new ArrayList<>();
+        }
+        List<UserDownloadVo> collect = list.stream().map(item -> {
+            UserDownloadVo vo = new UserDownloadVo();
+            vo.setId(item.getId());
+            vo.setTaskCode(item.getTaskCode());
+            vo.setTaskStatus(item.getTaskStatus());
+            vo.setCreateSysUserId(item.getSysUserId());
+            vo.setTaskPath(item.getTaskPath());
+            vo.setTaskTime(item.getCreateTime());
+            return vo;
+        }).collect(Collectors.toList());
+        return collect;
+    }
+
+    @Override
+    public void userDataDownloadUp(UserDataDownloadUpBo bo) {
+        SysTask task = iSysTaskService.getOne(new LambdaQueryWrapper<SysTask>()
+                .eq(SysTask::getTaskCode, bo.getTaskCode())
+                .eq(SysTask::getSysUserId, bo.getCreateSysUserId()));
+        if (ObjectUtils.isNull(task)){
+            return;
+        }
+        task.setTaskStatus(4);//已下载
+        iSysTaskService.updateById(task);
+    }
 
     @Override
     public Map<String, Object> accountLogin(UserAppAccountLoginBo bo) {
@@ -1636,13 +2044,29 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
                 .or()
                 .eq(User::getIdCard,EncryptHandler.encrypt(bo.getAccount())));
         User user = getOne(queryWrapper);
+        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+        Integer share = 0;
+        if (StringUtils.isNotBlank(tenantId) && "867735392558919680".equals(tenantId)){
+            share = 1;
+        }
+
         if(Validator.isEmpty(user)){
             iUserLoginErrorService.saveErrorLog(bo.getAccount());
-            throw new CustomException("登录信息错误");
+            //判断旧系统是否有账号
+            if (share > 0){
+                oldAccountLogin(bo,1);
+            }else {
+                throw new CustomException("登录信息错误");
+            }
         }
         else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
         {
-            throw new BaseException("对不起,您的账号:已停用");
+            //判断旧系统是否有账号
+            if (share > 0){
+                oldAccountLogin(bo,1);
+            }else {
+                throw new CustomException("对不起,您的账号:已停用");
+            }
         }
         String password = null;
         if(bo.getPwd().length()>20){
@@ -1661,7 +2085,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         if (!SecurityUtils.matchesPassword(password,user.getPassword()))
         {
             iUserLoginErrorService.saveErrorLog(bo.getAccount());
-            throw new BaseException("登录信息错误");
+            //判断旧系统是否有账号
+            if (share > 0){
+                oldAccountLogin(bo,1);
+            }else {
+                throw new CustomException("登录信息错误");
+            }
         }
         //如果活动分销码变动
         if (StringUtils.isNotBlank(bo.getShareActivityCode())){
@@ -1677,6 +2106,58 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         return map;
     }
 
+    private void oldAccountLogin(UserAppAccountLoginBo bo,Integer type) {
+        String msg = type == 1?"登录信息错误":"对不起,您的账号:已停用";
+        Boolean codeFlag = true;
+        Map<String, String> params = new HashMap<>();
+        Long nowTime = DateUtils.getNowTime();
+        String sign = ToolsUtils.EncoderByMd5(bo.getAccount()+bo.getAccount()+nowTime + "pubilc2022");
+        params.put("stamp", nowTime.toString());
+        params.put("sign", sign);
+        params.put("idNum", bo.getAccount());
+        params.put("passwordSign", "1");
+        params.put("telphone",bo.getAccount());
+        String password = null;
+        if(bo.getPwd().length()>20){
+            String rsaPrivate = null;
+            try {
+                InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("config/pri.key");
+                rsaPrivate = AES.getStringByInputStream_1(certStream);
+                certStream.close();
+                password = AES.decrypt(bo.getPwd(),rsaPrivate);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }else{
+            password = bo.getPwd();
+        }
+        params.put("password", password);
+        String respone = "";
+        try {
+            respone = HttpUtils.postFormBody(OLD_GOODS, params);
+            if (!respone.contains("\"code\":200")) {
+                codeFlag = false;
+                throw new CustomException("登录信息错误");
+            }
+            JSONObject jsonObject = JSONObject.parseObject(respone);
+            Object data = jsonObject.get("data");
+            if (ObjectUtils.isNotNull(data)){
+                UserNewGoodsVo vo = JSONObject.parseObject(JSONObject.toJSONString(data), UserNewGoodsVo.class);
+                throw new CustomException(vo.getPcUrl());
+            }else {
+                codeFlag = false;
+                throw new CustomException(msg);
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+            if (codeFlag){
+                throw new CustomException(e.getMessage(),699);
+            }else {
+                throw new CustomException(e.getMessage());
+            }
+        }
+    }
+
     @Override
     public Boolean bindIdCard(UserAppBindIdBo bo) {
         if(Validator.isEmpty(bo.getIdCard())){

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

@@ -31,7 +31,9 @@ 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.grade.domain.ClassGradeUser;
+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.user.bo.UserWxFollowAddBo;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
@@ -164,6 +166,9 @@ public class WxLoginService implements IWxLoginService {
     @Autowired
     private IDistributionSellerService iDistributionSellerService;
 
+    @Autowired
+    private ISysTenantService iSysTenantService;
+
     private final String KEY_PREFIX = "GOODS_SHARE";
 
     public void initData(){
@@ -1216,8 +1221,18 @@ public class WxLoginService implements IWxLoginService {
             }
         }
         JSONObject jsonObject = JSONObject.parseObject(result);
+        if(jsonObject.containsKey("url_link")){
+            return jsonObject.get("url_link").toString();
+        }else{
+            String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+            SysTenant sysTenant = iSysTenantService.getOne(new LambdaQueryWrapper<SysTenant>()
+                    .eq(SysTenant::getTenantId,tenantId).last("limit 1"));
+            if(Validator.isNotEmpty(sysTenant)){
+                return "https://"+sysTenant.getHostH5();
+            }
+            return null;
+        }
 
-        return jsonObject.get("url_link").toString();
     }
 
     @Override

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

@@ -131,7 +131,7 @@ public class ActivityRecommendServiceImpl extends ServiceImpl<ActivityRecommendM
         for (ActivityRecommendVo recommendVo : activityRecommendVos) {
             if (CollectionUtils.isNotEmpty(recommendVo.getGoodsList())){
                 recommendVo.getGoodsList().forEach(item -> {
-                    if (ObjectUtils.isNull(item.getSpecTemplateId())){
+                    if (ObjectUtils.isNotNull(item.getSpecTemplateId())){
                         List<GoodsSpecAttributeRelation> list = goodsSpecAttributeRelationService.list(new LambdaQueryWrapper<GoodsSpecAttributeRelation>()
                                 .eq(GoodsSpecAttributeRelation::getGoodsId, item.getGoodsId())
                                 .orderByAsc(GoodsSpecAttributeRelation::getCreateTime)

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/OssService.java

@@ -45,4 +45,6 @@ public interface OssService {
 
     void processObject(String targetImage ,String sourceImage,String styleType) ;
 
+    void fileDownloadLocal(String key, String localPath);
+
 }

+ 22 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/service/impl/OssServiceImpl.java

@@ -35,6 +35,7 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.web.multipart.MultipartFile;
 import sun.misc.BASE64Decoder;
 
+import javax.imageio.ImageIO;
 import javax.servlet.http.HttpServletRequest;
 import javax.sql.rowset.serial.SerialBlob;
 import javax.sql.rowset.serial.SerialException;
@@ -229,6 +230,10 @@ public class OssServiceImpl implements OssService {
             case 11:
                 RandomFilename = "file/pdf/" +(sdf.format(new Date())) + "/" + now + ".pdf";
                 break;
+            case 12:
+                String filename = ossRequest.getFile().getOriginalFilename();
+                RandomFilename = "file/dangan/upload/"+ filename.substring(0, filename.lastIndexOf("."));
+                break;
         }
 
         return RandomFilename;
@@ -432,6 +437,23 @@ public class OssServiceImpl implements OssService {
         }
     }
 
+    @Override
+    public void fileDownloadLocal(String key, String localPath) {
+        OSSObject ossObject = ossClient.getObject(ALIYUN_OSS_BUCKET_NAME, key);
+        InputStream in = ossObject.getObjectContent();
+        try {
+            OutputStream out = new FileOutputStream(localPath);
+            int data;
+            while ((data=in.read())!=-1){
+                out.write(data);
+            }
+            out.close();
+            in.close();
+        }catch (Exception e){
+
+        }
+    }
+
     public void zipFile(List<String> fileList, ZipOutputStream zipOut,String dir) {
         if (CollectionUtils.isEmpty(fileList)) {
             return;

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/alisms/service/impl/AliSmsServiceImpl.java

@@ -92,7 +92,7 @@ public class AliSmsServiceImpl implements IAliSmsService {
         try{
             SendSmsResponse response = SmsUtils.sendSms(tel,SIGNNAME,code,param,ACCESSKEYID,ACCESSKEYSECRET);
             LOGGER.error("发送短信结果:"+JSON.toJSONString(response));
-            if(response.getBody().getMessage().equals("OK")){
+            if(response.getBody().getCode().equals("OK")){
                 SmsAddBo smsAddBo = new SmsAddBo();
                 smsAddBo.setCode(param);
                 smsAddBo.setTel(tel);

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/mapper/QuestionChapterExamMapper.java

@@ -24,4 +24,6 @@ public interface QuestionChapterExamMapper extends BaseMapper<QuestionChapterExa
 
     @InterceptorIgnore(tenantLine = "true")
     void deleteByIdAndTenant(@Param("newChapterExamId") Long newChapterExamId,@Param("newTenantId") String newTenantId);
+
+    List<ExamVo> getSimpleList(QuestionChapterExamQueryBo bo);
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/IQuestionChapterExamService.java

@@ -29,6 +29,8 @@ public interface IQuestionChapterExamService extends IService<QuestionChapterExa
 
 	List<ExamVo> getDoList(QuestionChapterExamQueryBo bo);
 
+	List<ExamVo> getSimpleList(QuestionChapterExamQueryBo bo);
+
 	/**
 	 * 查询列表
 	 */

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

@@ -108,4 +108,10 @@ public interface IQuestionService extends IService<Question> {
 	String insertByAddBoImport(QuestionAddBo bo, Integer no);
 
 	Long insertByAddBoImportBackId(QuestionAddBo bo, Integer no);
+
+    void questionImport();
+
+	String getMeasureList();
+
+	String getTopicList(String topParam);
 }

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionChapterExamServiceImpl.java

@@ -52,6 +52,11 @@ public class QuestionChapterExamServiceImpl extends ServiceImpl<QuestionChapterE
         return questionChapterExamMapper.getDoList(bo);
     }
 
+    @Override
+    public List<ExamVo> getSimpleList(QuestionChapterExamQueryBo bo) {
+        return this.baseMapper.getSimpleList(bo);
+    }
+
     @Override
     public List<QuestionChapterExamVo> queryList(QuestionChapterExamQueryBo bo) {
         LambdaQueryWrapper<QuestionChapterExam> lqw = Wrappers.lambdaQuery();

+ 623 - 16
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java

@@ -6,10 +6,13 @@ 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.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.Page;
@@ -17,37 +20,32 @@ import com.github.pagehelper.PageInfo;
 import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.type.EncryptHandler;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.SecurityUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
+import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.modules.alioss.service.OssService;
 import com.zhongzheng.modules.bank.bo.*;
-import com.zhongzheng.modules.bank.domain.Exam;
-import com.zhongzheng.modules.bank.domain.ExamQuestion;
-import com.zhongzheng.modules.bank.domain.Question;
-import com.zhongzheng.modules.bank.domain.QuestionBusiness;
+import com.zhongzheng.modules.bank.domain.*;
 import com.zhongzheng.modules.bank.mapper.QuestionMapper;
-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.service.*;
 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;
-import com.zhongzheng.modules.course.domain.CourseSubject;
-import com.zhongzheng.modules.course.service.ICourseBusinessService;
-import com.zhongzheng.modules.course.service.ICourseEducationTypeService;
-import com.zhongzheng.modules.course.service.ICourseProjectTypeService;
-import com.zhongzheng.modules.course.service.ICourseSubjectService;
+import com.zhongzheng.modules.course.domain.*;
+import com.zhongzheng.modules.course.service.*;
 import com.zhongzheng.modules.exam.bo.ExamKnowledgeAddBo;
 import com.zhongzheng.modules.exam.bo.ExamKnowledgeBusinessAddBo;
 import com.zhongzheng.modules.exam.domain.ExamKnowledge;
+import com.zhongzheng.modules.exam.domain.ExamPaper;
+import com.zhongzheng.modules.exam.service.IExamApplyService;
 import com.zhongzheng.modules.exam.service.IExamKnowledgeService;
+import com.zhongzheng.modules.exam.service.IExamPaperService;
 import com.zhongzheng.modules.goods.bo.*;
 import com.zhongzheng.modules.goods.domain.Goods;
+import com.zhongzheng.modules.goods.domain.GoodsAttached;
 import com.zhongzheng.modules.goods.domain.GoodsExamTime;
+import com.zhongzheng.modules.goods.service.IGoodsAttachedService;
 import com.zhongzheng.modules.goods.service.IGoodsExamTimeService;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.BankGoodsExamVo;
@@ -77,9 +75,12 @@ import org.w3c.dom.NodeList;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.math.BigDecimal;
 import java.text.NumberFormat;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 /**
@@ -109,6 +110,9 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
     @Autowired
     private ICourseSubjectService iCourseSubjectService;
 
+    @Autowired
+    private ICourseSubjectProjectService iCourseSubjectProjectService;
+
     @Autowired
     private IExamKnowledgeService iExamKnowledgeService;
 
@@ -127,12 +131,30 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
     @Autowired
     private IUserExamSubscriptionService iUserExamSubscriptionService;
 
+    @Autowired
+    private IQuestionModuleService iQuestionModuleService;
+
+    @Autowired
+    private IQuestionChapterService iQuestionChapterService;
+
+    @Autowired
+    private IQuestionChapterExamService iQuestionChapterExamService;
+
+    @Autowired
+    private IQuestionModuleChapterService iQuestionModuleChapterService;
+
+    @Autowired
+    private IGoodsAttachedService iGoodsAttachedService;
+
     @Autowired
     private IUserService iUserService;
 
     @Autowired
     private IExamService iExamService;
 
+    @Autowired
+    private IExamPaperService iExamPaperService;
+
     @Autowired
     private IGoodsService iGoodsService;
 
@@ -142,9 +164,30 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
     @Autowired
     private OssService ossService;
 
+    @Autowired
+    private IMajorService iMajorService;
+
+    @Autowired
+    private IMajorProjectService iMajorProjectService;
+
     @Value("${aliyun.oss.endpoint}")
     private String ossHost;
 
+    @Value("${oldSys.question}")
+    private String QUESTION;
+
+    @Value("${oldSys.questionDetail}")
+    private String QUESTION_DETAIL;
+
+    @Value("${exam.question}")
+    private String EXAM_QUESTION;
+
+    @Value("${exam.questionDetail}")
+    private String EXAM_QUESTION_DETAIL;
+
+    @Value("${aliyun.oss.endpoint}")
+    private String OSS_PREFIX;
+
 
     @Override
     public QuestionVo queryById(Long questionId) {
@@ -3089,6 +3132,570 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         return add.getQuestionId();
     }
 
+    @Override
+    @Transactional
+    public void questionImport() {
+        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+        HashMap<String, String> map = new HashMap<>();
+        map.put("TenantId", tenantId);
+        String respone = HttpUtils.sendPostJsonHeader(EXAM_QUESTION, "",map);
+        JSONObject jsonObject1 = JSONObject.parseObject(respone);
+        List<ExternalQuestionVo> questionVos = JSONArray.parseArray(jsonObject1.get("data").toString(), ExternalQuestionVo.class);
+        //考前培训
+        CourseEducationType educationType = iCourseEducationTypeService
+                .getOne(new LambdaQueryWrapper<CourseEducationType>()
+                .eq(CourseEducationType::getEducationName, "考前培训")
+                .eq(CourseEducationType::getStatus, 1)
+                .last("limit 1"));
+
+        //施工现场人员
+        CourseProjectType projectType = iCourseProjectTypeService
+                .getOne(new LambdaQueryWrapper<CourseProjectType>()
+                .eq(CourseProjectType::getProjectName, "施工现场专业人员")
+                .eq(CourseProjectType::getEducationId, educationType.getId())
+                .eq(CourseProjectType::getStatus, 1)
+                .last("limit 1"));
+
+        //七大员
+        CourseBusiness business = iCourseBusinessService
+                .getOne(new LambdaQueryWrapper<CourseBusiness>()
+                .eq(CourseBusiness::getBusinessName, "七大员")
+                .eq(CourseBusiness::getProjectId, projectType.getId())
+                .eq(CourseBusiness::getStatus, 1)
+                .last("limit 1"));
+
+        //专业
+        List<MajorProject> list = iMajorProjectService
+                .list(new LambdaQueryWrapper<MajorProject>()
+                .eq(MajorProject::getProjectId, projectType.getId()));
+        List<Major> majorList = iMajorService.listByIds(list.stream().map(MajorProject::getMajorId).collect(Collectors.toList()));
+
+        //科目
+        List<CourseSubjectProject> list1 = iCourseSubjectProjectService
+                .list(new LambdaQueryWrapper<CourseSubjectProject>()
+                .eq(CourseSubjectProject::getProjectId, projectType.getId()));
+        List<CourseSubject> subjectList = iCourseSubjectService.listByIds(list1.stream().map(CourseSubjectProject::getSubjectId).collect(Collectors.toList()));
+
+
+        //七大员新考题库商品
+        List<ExternalQuestionVo> collect = questionVos.stream().filter(x -> x.getParentId() == 1)
+                .sorted(Comparator.comparing(ExternalQuestionVo::getSortNumber))
+                .collect(Collectors.toList());
+        for (ExternalQuestionVo item : collect) {
+            //专业顺序
+
+            //劳务员考核评价大纲及习题集
+            //施工员考核评价大纲及习题集(土建方向)
+            //施工员考核评价大纲及习题集(市政方向)
+            //施工员考核评价大纲及习题集(装饰方向)
+            //施工员考核评价大纲及习题集(设备方向)
+            //机械员考核评价大纲及习题集
+            //材料员考核评价大纲及习题集
+            //标准员考核评价大纲及习题集
+            //质量员考核评价大纲及习题集(土建方向)
+            //质量员考核评价大纲及习题集(市政方向)
+            //质量员考核评价大纲及习题集(装饰方向)
+            //质量员考核评价大纲及习题集(设备方向)
+            //资料员考核评价大纲及习题集
+            Major major = majorList.stream().filter(x -> x.getCategoryName().equals(item.getTopicNoteTypeNum())).findFirst().orElse(null);
+            Long majorId = 0L;
+            if (ObjectUtils.isNotNull(major)){
+                majorId = major.getId();
+            }
+
+            //科目
+            CourseSubject courseSubject = subjectList.stream().filter(x -> x.getSubjectName().equals(item.getTopicNoteTypeNum())).findFirst().orElse(null);
+            Long subjectId = 0L;
+            if (ObjectUtils.isNotNull(courseSubject)){
+                subjectId = courseSubject.getId();
+            }
+
+            //创建商品
+            Goods goods = new Goods();
+            goods.setGoodsName(item.getName());
+            goods.setYear(2023L);
+            goods.setSupplyId(2L);
+            goods.setCode(ServletUtils.getEncoded("SP"));
+            goods.setGoodsType(2);
+            goods.setEducationTypeId(educationType.getId());
+            goods.setBusinessId(business.getId());
+            goods.setProjectId(projectType.getId().intValue());
+            goods.setStandPrice(new BigDecimal("150.00"));
+            goods.setLowestPrice(new BigDecimal("150.00"));
+            goods.setCreateTime(DateUtils.getNowTime());
+            goods.setUpdateTime(DateUtils.getNowTime());
+            goods.setStatus(1);
+            goods.setGoodsStatus(0);
+            goods.setMajorId(majorId);
+            goods.setSubjectIds(subjectId.toString());
+            iGoodsService.save(goods);
+
+            String upStr1 = "web/Uploads/qdytopic/";
+            //题库
+            List<ExternalQuestionVo> questionVos1 = questionVos.stream()
+                    .filter(x -> x.getParentId().equals(item.getMeasureModelId())).sorted(Comparator.comparing(ExternalQuestionVo::getSortNumber)).collect(Collectors.toList());
+            if (CollectionUtils.isNotEmpty(questionVos1)){
+                for (ExternalQuestionVo item1 : questionVos1) {
+                    //模块卷
+                    QuestionModule module = new QuestionModule();
+                    module.setCode(ServletUtils.getEncoded("MJ"));
+                    module.setModuleName(item1.getName());
+                    module.setPublishStatus(1L);
+                    module.setStatus(1);
+                    module.setCreateTime(DateUtils.getNowTime());
+                    module.setUpdateTime(DateUtils.getNowTime());
+                    iQuestionModuleService.save(module);
+                    //模块卷业务层
+                    QuestionBusiness questionBusiness = new QuestionBusiness();
+                    questionBusiness.setEducationTypeId(educationType.getId());
+                    questionBusiness.setBusinessId(business.getId());
+                    questionBusiness.setProjectId(projectType.getId());
+                    questionBusiness.setMajorId(module.getModuleExamId());
+                    questionBusiness.setType(4);
+                    questionBusiness.setSubjectId(subjectId);
+                    iQuestionBusinessService.save(questionBusiness);
+                    //题库模块关联
+                    GoodsAttached goodsAttached = new GoodsAttached();
+                    goodsAttached.setGoodsId(goods.getGoodsId());
+                    goodsAttached.setMajorId(module.getModuleExamId());
+                    goodsAttached.setType(1);
+                    goodsAttached.setCreateTime(DateUtils.getNowTime());
+                    goodsAttached.setUpdateTime(DateUtils.getNowTime());
+                    iGoodsAttachedService.save(goodsAttached);
+
+                    //章卷
+                    List<ExternalQuestionVo> questionVos2 = questionVos.stream()
+                            .filter(x -> x.getParentId().equals(item1.getMeasureModelId()))
+                            .sorted(Comparator.comparing(ExternalQuestionVo::getSortNumber)).collect(Collectors.toList());
+                    for (ExternalQuestionVo item2 : questionVos2) {
+                        QuestionChapter questionChapter = new QuestionChapter();
+                        questionChapter.setName(item2.getName());
+                        questionChapter.setStatus(1);
+                        questionChapter.setCreateTime(DateUtils.getNowTime());
+                        questionChapter.setUpdateTime(DateUtils.getNowTime());
+                        questionChapter.setPublishStatus(1L);
+                        questionChapter.setCode(ServletUtils.getEncoded("ZJ"));
+                        iQuestionChapterService.save(questionChapter);
+
+                        //章卷业务
+                        QuestionBusiness questionBusiness1 = new QuestionBusiness();
+                        questionBusiness1.setEducationTypeId(educationType.getId());
+                        questionBusiness1.setBusinessId(business.getId());
+                        questionBusiness1.setProjectId(projectType.getId());
+                        questionBusiness1.setMajorId(questionChapter.getChapterExamId());
+                        questionBusiness1.setType(3);
+                        questionBusiness1.setSubjectId(subjectId);
+                        iQuestionBusinessService.save(questionBusiness1);
+
+                        //模块章卷关联
+                        QuestionModuleChapter moduleChapter = new QuestionModuleChapter();
+                        moduleChapter.setModuleExamId(module.getModuleExamId());
+                        moduleChapter.setChapterExamId(questionChapter.getChapterExamId());
+                        moduleChapter.setSort(item2.getSortNumber().longValue());
+                        iQuestionModuleChapterService.save(moduleChapter);
+
+                        if (ObjectUtils.isNotNull(item2.getIsTopic()) && item2.getIsTopic()){
+                            //获取题目内容
+                            String topParam = String.format("MeasureModelId=%s",item2.getMeasureModelId());
+                            log.error(topParam);
+                            String respone2 = HttpUtils.sendPostJsonHeader(EXAM_QUESTION_DETAIL, topParam,map);
+                            JSONObject jsonObject = JSONObject.parseObject(respone2);
+                            log.error(respone2);
+                            List<ExternalQuestionDetailVo> questionDetailVos = JSONArray.parseArray(jsonObject.get("data").toString(), ExternalQuestionDetailVo.class);
+
+                            if (CollectionUtils.isNotEmpty(questionDetailVos)){
+                                //处理图片
+                                handlePhoto(questionDetailVos);
+                                //创建试卷
+                                Exam exam = new Exam();
+                                exam.setCode(ServletUtils.getEncoded("SJ"));
+                                exam.setStatus(1);
+                                exam.setCreateTime(DateUtils.getNowTime());
+                                exam.setUpdateTime(DateUtils.getNowTime());
+                                exam.setExamName(item2.getName() + "测试卷");
+                                exam.setPublishStatus(1L);
+                                exam.setDoType(1);
+                                //试卷类型
+                                ExamPaper paper = iExamPaperService.getOne(new LambdaQueryWrapper<ExamPaper>()
+                                        .eq(ExamPaper::getPaperName, "普通练习")
+                                        .eq(ExamPaper::getStatus, 1)
+                                        .last("limit 1"));
+                                if (ObjectUtils.isNotNull(paper)){
+                                    exam.setExamPaperId(paper.getPaperId());
+                                }
+                                iExamService.save(exam);
+                                //试卷业务
+                                QuestionBusiness questionBusiness2 = new QuestionBusiness();
+                                questionBusiness2.setEducationTypeId(educationType.getId());
+                                questionBusiness2.setBusinessId(business.getId());
+                                questionBusiness2.setProjectId(projectType.getId());
+                                questionBusiness2.setMajorId(exam.getExamId());
+                                questionBusiness2.setType(2);
+                                questionBusiness2.setSubjectId(subjectId);
+                                iQuestionBusinessService.save(questionBusiness2);
+
+                                //章卷关联
+                                QuestionChapterExam chapterExam = new QuestionChapterExam();
+                                chapterExam.setChapterExamId(questionChapter.getChapterExamId());
+                                chapterExam.setExamId(exam.getExamId());
+                                chapterExam.setSort(item2.getSortNumber().longValue());
+                                iQuestionChapterExamService.save(chapterExam);
+                                for (ExternalQuestionDetailVo detailVo : questionDetailVos) {
+                                        switch (detailVo.getTopicType()){
+                                            case 1://单选题
+                                                Question question = new Question();
+                                                question.setContent(detailVo.getTitle());
+                                                question.setType(1);
+                                                question.setStatus(1);
+                                                question.setCreateTime(DateUtils.getNowTime());
+                                                question.setUpdateTime(DateUtils.getNowTime());
+                                                question.setAnalysisContent(detailVo.getDescription());
+                                                question.setPublishStatus(1);
+                                                question.setCode(ServletUtils.getEncoded("TM"));
+                                                question.setCreateBy("(系统)外部题库导入");
+                                                if (CollectionUtils.isNotEmpty(detailVo.getChildList())){
+                                                    List<QuestionDetailVo> detail = new ArrayList<>();
+                                                    Integer index = 0;
+                                                    for (int i = 0; i < detailVo.getChildList().size(); i++) {
+                                                        ExternalQuestionChildVo childVo = detailVo.getChildList().get(i);
+                                                        QuestionDetailVo questionDetailVo = new QuestionDetailVo();
+                                                        if (childVo.getOptionTitle().contains(upStr1)){
+                                                            questionDetailVo.setImgUrl(getImgUrl(childVo.getOptionTitle()));
+                                                            questionDetailVo.setContent("如图所示");
+                                                        }else {
+                                                            questionDetailVo.setContent(childVo.getOptionTitle());
+                                                        }
+                                                        questionDetailVo.setOptionsId(i +1);
+                                                        if (ObjectUtils.isNotNull(childVo.getIsAnswer()) && childVo.getIsAnswer()){
+                                                            index = i + 1;
+                                                        }
+                                                        detail.add(questionDetailVo);
+                                                    }
+                                                    String s = JSONArray.toJSONString(detail);
+                                                    question.setAnswerQuestion(index.toString());
+                                                    question.setJsonStr(s);
+                                                }
+                                                save(question);
+                                                //题目业务
+                                                QuestionBusiness questionBusiness3 = new QuestionBusiness();
+                                                questionBusiness3.setEducationTypeId(educationType.getId());
+                                                questionBusiness3.setBusinessId(business.getId());
+                                                questionBusiness3.setProjectId(projectType.getId());
+                                                questionBusiness3.setMajorId(question.getQuestionId());
+                                                questionBusiness3.setType(1);
+                                                questionBusiness3.setSubjectId(subjectId);
+                                                iQuestionBusinessService.save(questionBusiness3);
+
+                                                //试卷题目关联
+                                                ExamQuestion examQuestion = new ExamQuestion();
+                                                examQuestion.setExamId(exam.getExamId());
+                                                examQuestion.setQuestionId(question.getQuestionId());
+                                                examQuestion.setSort(detailVo.getSortNumber());
+                                                examQuestion.setScore(BigDecimal.ZERO);
+                                                examQuestion.setPartScore(BigDecimal.ZERO);
+                                                iExamQuestionService.save(examQuestion);
+                                                break;
+                                            case 2://多选题
+                                                Question question1 = new Question();
+                                                question1.setContent(detailVo.getTitle());
+                                                question1.setType(2);
+                                                question1.setStatus(1);
+                                                question1.setCreateTime(DateUtils.getNowTime());
+                                                question1.setUpdateTime(DateUtils.getNowTime());
+                                                question1.setAnalysisContent(detailVo.getDescription());
+                                                question1.setPublishStatus(1);
+                                                question1.setCode(ServletUtils.getEncoded("TM"));
+                                                question1.setCreateBy("(系统)外部题库导入");
+                                                if (CollectionUtils.isNotEmpty(detailVo.getChildList())){
+                                                    List<QuestionDetailVo> detail = new ArrayList<>();
+                                                    List<String> index = new ArrayList<>();
+                                                    for (int i = 0; i < detailVo.getChildList().size(); i++) {
+                                                        ExternalQuestionChildVo childVo = detailVo.getChildList().get(i);
+                                                        QuestionDetailVo questionDetailVo = new QuestionDetailVo();
+                                                        if (childVo.getOptionTitle().contains(upStr1)){
+                                                            questionDetailVo.setImgUrl(getImgUrl(childVo.getOptionTitle()));
+                                                            questionDetailVo.setContent("如图所示");
+                                                        }else {
+                                                            questionDetailVo.setContent(childVo.getOptionTitle());
+                                                        }
+                                                        questionDetailVo.setOptionsId(i + 1);
+                                                        if (ObjectUtils.isNotNull(childVo.getIsAnswer()) && childVo.getIsAnswer()){
+                                                            Integer x = i + 1;
+                                                            index.add(x +"");
+                                                        }
+                                                        detail.add(questionDetailVo);
+                                                    }
+                                                    String s = JSONArray.toJSONString(detail);
+                                                    question1.setAnswerQuestion(index.stream().collect(Collectors.joining(",")));
+                                                    question1.setJsonStr(s);
+                                                }
+                                                save(question1);
+                                                //题目业务
+                                                QuestionBusiness questionBusiness4 = new QuestionBusiness();
+                                                questionBusiness4.setEducationTypeId(educationType.getId());
+                                                questionBusiness4.setBusinessId(business.getId());
+                                                questionBusiness4.setProjectId(projectType.getId());
+                                                questionBusiness4.setMajorId(question1.getQuestionId());
+                                                questionBusiness4.setType(1);
+                                                questionBusiness4.setSubjectId(subjectId);
+                                                iQuestionBusinessService.save(questionBusiness4);
+
+                                                //试卷题目关联
+                                                ExamQuestion examQuestion1 = new ExamQuestion();
+                                                examQuestion1.setExamId(exam.getExamId());
+                                                examQuestion1.setQuestionId(question1.getQuestionId());
+                                                examQuestion1.setSort(detailVo.getSortNumber());
+                                                examQuestion1.setScore(BigDecimal.ZERO);
+                                                examQuestion1.setPartScore(BigDecimal.ZERO);
+                                                iExamQuestionService.save(examQuestion1);
+                                                break;
+                                            case 4://判断题
+                                                Question question2 = new Question();
+                                                question2.setContent(detailVo.getTitle());
+                                                question2.setType(3);
+                                                question2.setStatus(1);
+                                                question2.setCreateTime(DateUtils.getNowTime());
+                                                question2.setUpdateTime(DateUtils.getNowTime());
+                                                question2.setAnalysisContent(detailVo.getDescription());
+                                                question2.setPublishStatus(1);
+                                                question2.setCode(ServletUtils.getEncoded("TM"));
+                                                question2.setCreateBy("(系统)外部题库导入");
+                                                if (CollectionUtils.isNotEmpty(detailVo.getChildList())){
+                                                    ExternalQuestionChildVo childVo = detailVo.getChildList().stream().filter(x -> ObjectUtils.isNotNull(x.getIsAnswer()) && x.getIsAnswer()).findFirst().orElse(null);
+                                                    if (ObjectUtils.isNotNull(childVo)){
+                                                        if ("正确".equals(childVo.getOptionTitle())){
+                                                            question2.setAnswerQuestion("1");
+                                                        }else {
+                                                            question2.setAnswerQuestion("0");
+                                                        }
+                                                    }
+                                                }
+                                                save(question2);
+                                                //题目业务
+                                                QuestionBusiness questionBusiness5 = new QuestionBusiness();
+                                                questionBusiness5.setEducationTypeId(educationType.getId());
+                                                questionBusiness5.setBusinessId(business.getId());
+                                                questionBusiness5.setProjectId(projectType.getId());
+                                                questionBusiness5.setMajorId(question2.getQuestionId());
+                                                questionBusiness5.setType(1);
+                                                questionBusiness5.setSubjectId(subjectId);
+                                                iQuestionBusinessService.save(questionBusiness5);
+
+                                                //试卷题目关联
+                                                ExamQuestion examQuestion2 = new ExamQuestion();
+                                                examQuestion2.setExamId(exam.getExamId());
+                                                examQuestion2.setQuestionId(question2.getQuestionId());
+                                                examQuestion2.setSort(detailVo.getSortNumber());
+                                                examQuestion2.setScore(BigDecimal.ZERO);
+                                                examQuestion2.setPartScore(BigDecimal.ZERO);
+                                                iExamQuestionService.save(examQuestion2);
+                                                break;
+                                            case 5://案例题
+                                                Question question3 = new Question();
+                                                question3.setContent(detailVo.getTitle());
+                                                question3.setType(4);
+                                                question3.setStatus(1);
+                                                question3.setCreateTime(DateUtils.getNowTime());
+                                                question3.setUpdateTime(DateUtils.getNowTime());
+                                                question3.setPublishStatus(1);
+                                                question3.setCode(ServletUtils.getEncoded("TM"));
+                                                question3.setCreateBy("(系统)外部题库导入");
+                                                if (CollectionUtils.isNotEmpty(detailVo.getChildTopicLict())){
+                                                    List<QuestionInfoVo> infoVoList = new ArrayList<>();
+                                                    for (ExternalQuestionChildTopicVo topicVo : detailVo.getChildTopicLict()) {
+                                                        switch (topicVo.getTopicType()){
+                                                            case 1://单选
+                                                                QuestionInfoVo infoVo = new QuestionInfoVo();
+                                                                infoVo.setContent(topicVo.getTitle());
+                                                                infoVo.setAnalysisContent(topicVo.getDescription());
+                                                                infoVo.setType(1);
+                                                                if (CollectionUtils.isNotEmpty(topicVo.getChildList())){
+                                                                    List<QuestionDetailVo> voList = new ArrayList<>();
+                                                                    Integer index = 0;
+                                                                    for (int i = 0; i < topicVo.getChildList().size(); i++) {
+                                                                        ExternalQuestionChildVo childVo = topicVo.getChildList().get(i);
+                                                                        QuestionDetailVo detailVo1 = new QuestionDetailVo();
+                                                                        detailVo1.setOptionsId(i + 1);
+                                                                        if (childVo.getOptionTitle().contains(upStr1)){
+                                                                            detailVo1.setImgUrl(getImgUrl(childVo.getOptionTitle()));
+                                                                            detailVo1.setContent("如图所示");
+                                                                        }else {
+                                                                            detailVo1.setContent(childVo.getOptionTitle());
+                                                                        }
+                                                                        if (ObjectUtils.isNotNull(childVo.getIsAnswer()) && childVo.getIsAnswer()){
+                                                                            index = i + 1;
+                                                                        }
+                                                                        voList.add(detailVo1);
+                                                                    }
+                                                                    infoVo.setAnswerQuestion(index.toString());
+                                                                    infoVo.setOptionsList(voList);
+                                                                }
+                                                                infoVoList.add(infoVo);
+                                                                break;
+                                                            case 2://多选
+                                                                QuestionInfoVo infoVo1 = new QuestionInfoVo();
+                                                                infoVo1.setContent(topicVo.getTitle());
+                                                                infoVo1.setAnalysisContent(topicVo.getDescription());
+                                                                infoVo1.setType(2);
+                                                                if (CollectionUtils.isNotEmpty(topicVo.getChildList())){
+                                                                    List<QuestionDetailVo> voList = new ArrayList<>();
+                                                                    List<String> indexList = new ArrayList<>();
+                                                                    for (int i = 0; i < topicVo.getChildList().size(); i++) {
+                                                                        ExternalQuestionChildVo childVo = topicVo.getChildList().get(i);
+                                                                        QuestionDetailVo detailVo1 = new QuestionDetailVo();
+                                                                        detailVo1.setOptionsId(i + 1);
+                                                                        if (childVo.getOptionTitle().contains(upStr1)){
+                                                                            detailVo1.setImgUrl(getImgUrl(childVo.getOptionTitle()));
+                                                                            detailVo1.setContent("如图所示");
+                                                                        }else {
+                                                                            detailVo1.setContent(childVo.getOptionTitle());
+                                                                        }
+                                                                        if (ObjectUtils.isNotNull(childVo.getIsAnswer()) && childVo.getIsAnswer()){
+                                                                            Integer x = i + 1 ;
+                                                                            indexList.add(x+"");
+                                                                        }
+                                                                        voList.add(detailVo1);
+                                                                    }
+                                                                    infoVo1.setAnswerQuestion(indexList.stream().collect(Collectors.joining(",")));
+                                                                    infoVo1.setOptionsList(voList);
+                                                                }
+                                                                infoVoList.add(infoVo1);
+                                                                break;
+                                                            case 4://判断题
+                                                                QuestionInfoVo infoVo2 = new QuestionInfoVo();
+                                                                infoVo2.setContent(topicVo.getTitle());
+                                                                infoVo2.setAnalysisContent(topicVo.getDescription());
+                                                                infoVo2.setType(3);
+                                                                if (CollectionUtils.isNotEmpty(topicVo.getChildList())){
+                                                                    ExternalQuestionChildVo childVo = topicVo.getChildList().stream().filter(x -> ObjectUtils.isNotNull(x.getIsAnswer()) && x.getIsAnswer()).findFirst().orElse(null);
+                                                                    if (ObjectUtils.isNotNull(childVo)){
+                                                                        if ("正确".equals(childVo.getOptionTitle())){
+                                                                            infoVo2.setAnswerQuestion("1");
+                                                                        }else {
+                                                                            infoVo2.setAnswerQuestion("0");
+                                                                        }
+                                                                    }
+                                                                }
+                                                                infoVoList.add(infoVo2);
+                                                                break;
+                                                        }
+
+                                                    }
+                                                    question3.setJsonStr(JSONArray.toJSONString(infoVoList));
+                                                }
+                                                save(question3);
+                                                //题目业务
+                                                QuestionBusiness questionBusiness6 = new QuestionBusiness();
+                                                questionBusiness6.setEducationTypeId(educationType.getId());
+                                                questionBusiness6.setBusinessId(business.getId());
+                                                questionBusiness6.setProjectId(projectType.getId());
+                                                questionBusiness6.setMajorId(question3.getQuestionId());
+                                                questionBusiness6.setType(1);
+                                                questionBusiness6.setSubjectId(subjectId);
+                                                iQuestionBusinessService.save(questionBusiness6);
+
+                                                //试卷题目关联
+                                                ExamQuestion examQuestion3 = new ExamQuestion();
+                                                examQuestion3.setExamId(exam.getExamId());
+                                                examQuestion3.setQuestionId(question3.getQuestionId());
+                                                examQuestion3.setSort(detailVo.getSortNumber());
+                                                examQuestion3.setScore(BigDecimal.ZERO);
+                                                examQuestion3.setPartScore(BigDecimal.ZERO);
+                                                iExamQuestionService.save(examQuestion3);
+                                                break;
+                                        }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    public String getMeasureList() {
+        return HttpUtils.sendGet(QUESTION, "");
+    }
+
+    @Override
+    public String getTopicList(String topParam) {
+        log.error("参数:"+topParam);
+        String s = HttpUtils.sendGet(QUESTION_DETAIL, topParam);
+        log.error("结果:"+s);
+        return HttpUtils.sendGet(QUESTION_DETAIL, topParam);
+    }
+
+    private void handlePhoto(List<ExternalQuestionDetailVo> questionDetailVos) {
+        String prefix = "\\Uploads\\qdytopic\\";
+        String upStr = OSS_PREFIX + "/web/Uploads/qdytopic/";
+        String upStr1 = "web/Uploads/qdytopic/";
+        for (ExternalQuestionDetailVo detailVo : questionDetailVos) {
+            if (StringUtils.isNotBlank(detailVo.getTitle()) && detailVo.getTitle().contains(prefix)){
+                String title = detailVo.getTitle();
+                String replace = title.replace(prefix, upStr);
+                detailVo.setTitle(replace);
+            }
+
+            if (StringUtils.isNotBlank(detailVo.getDescription()) && detailVo.getDescription().contains(prefix)){
+                String description = detailVo.getDescription();
+                String replace = description.replace(prefix, upStr);
+                detailVo.setDescription(replace);
+            }
+
+            if (CollectionUtils.isNotEmpty(detailVo.getChildList())){
+                List<ExternalQuestionChildVo> childList = detailVo.getChildList();
+                for (ExternalQuestionChildVo childVo : childList) {
+                    if (StringUtils.isNotBlank(childVo.getOptionTitle()) && childVo.getOptionTitle().contains(prefix)){
+                        String optionTitle = childVo.getOptionTitle();
+                        String replace = optionTitle.replace(prefix, upStr1);
+                        childVo.setOptionTitle(replace);
+                    }
+                }
+            }
+
+            if (CollectionUtils.isNotEmpty(detailVo.getChildTopicLict())){
+                List<ExternalQuestionChildTopicVo> childTopicLict = detailVo.getChildTopicLict();
+                for (ExternalQuestionChildTopicVo childTopicVo : childTopicLict) {
+                    if (StringUtils.isNotBlank(childTopicVo.getTitle()) && childTopicVo.getTitle().contains(prefix)){
+                        String optionTitle = childTopicVo.getTitle();
+                        String replace = optionTitle.replace(prefix, upStr);
+                        childTopicVo.setTitle(replace);
+                    }
+
+                    if (StringUtils.isNotBlank(childTopicVo.getDescription()) && childTopicVo.getDescription().contains(prefix)){
+                        String description = childTopicVo.getDescription();
+                        String replace = description.replace(prefix, upStr);
+                        childTopicVo.setDescription(replace);
+                    }
+
+                    if (CollectionUtils.isNotEmpty(childTopicVo.getChildList())){
+                        List<ExternalQuestionChildVo> childList = childTopicVo.getChildList();
+                        for (ExternalQuestionChildVo childVo : childList) {
+                            if (StringUtils.isNotBlank(childVo.getOptionTitle()) && childVo.getOptionTitle().contains(prefix)){
+                                String optionTitle = childVo.getOptionTitle();
+                                String replace = optionTitle.replace(prefix, upStr1);
+                                childVo.setOptionTitle(replace);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+    }
+
+    private String getImgUrl(String img){
+        Matcher m = Pattern.compile("<img.*?src=\"(.*?)\"").matcher(img);
+        String filePath = "";
+        while(m.find())
+        {
+            filePath = m.group(1);
+        }
+        return filePath;
+    }
+
+
     private boolean checkNameUnique(Question entity) {
         Question info = getOne(new LambdaQueryWrapper<Question>()
                 .eq(Question::getPrefixName, entity.getPrefixName()).eq(Question::getContent, entity.getContent()).ne(Question::getStatus, -1).last("limit 1"));

+ 27 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/ExternalQuestionChildTopicVo.java

@@ -0,0 +1,27 @@
+package com.zhongzheng.modules.bank.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年12月06日 16:28
+ */
+@Data
+public class ExternalQuestionChildTopicVo implements Serializable {
+
+    private Long measureId;
+
+    private String title;
+
+    private Integer topicType;
+
+    private String description;
+
+    private Integer sortNumber;
+
+    private List<ExternalQuestionChildVo> childList;
+
+}

+ 20 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/ExternalQuestionChildVo.java

@@ -0,0 +1,20 @@
+package com.zhongzheng.modules.bank.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年12月06日 16:28
+ */
+@Data
+public class ExternalQuestionChildVo implements Serializable {
+
+    private Long topicOptionId;
+
+    private String optionTitle;
+
+    private Boolean isAnswer;
+
+}

+ 28 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/ExternalQuestionDetailVo.java

@@ -0,0 +1,28 @@
+package com.zhongzheng.modules.bank.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年12月06日 16:28
+ */
+@Data
+public class ExternalQuestionDetailVo implements Serializable {
+
+    private Long topicId;
+
+    private String title;
+
+    private Integer topicType;
+
+    private String description;
+
+    private Integer sortNumber;
+
+    private List<ExternalQuestionChildVo> childList;
+
+    private List<ExternalQuestionChildTopicVo> childTopicLict;
+}

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

@@ -0,0 +1,25 @@
+package com.zhongzheng.modules.bank.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年12月06日 16:28
+ */
+@Data
+public class ExternalQuestionVo implements Serializable {
+
+    private Long measureModelId;
+
+    private String name;
+
+    private Long parentId;
+
+    private Boolean isTopic;
+
+    private Integer sortNumber;
+
+    private String topicNoteTypeNum;
+}

+ 22 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionDetailVo.java

@@ -0,0 +1,22 @@
+package com.zhongzheng.modules.bank.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * 第三方题库视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-08-03
+ */
+@Data
+public class QuestionDetailVo implements Serializable {
+
+	private String content;
+
+	private String imgUrl;
+
+	private Integer optionsId;
+}

+ 27 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionInfoVo.java

@@ -0,0 +1,27 @@
+package com.zhongzheng.modules.bank.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 第三方题库视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-08-03
+ */
+@Data
+public class QuestionInfoVo implements Serializable {
+
+	private String analysisContent;
+
+	private String answerQuestion;
+
+	private String content;
+
+	private Integer type;
+
+	private List<QuestionDetailVo> optionsList;
+}

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/ProfileTpAddBo.java

@@ -48,4 +48,6 @@ public class ProfileTpAddBo {
     /** 商品id拼接,多个,拼接 */
     @ApiModelProperty("商品id拼接,多个,拼接")
     private String goodsIds;
+    @ApiModelProperty("是否审核通过才允许学习 1是0否")
+    private Integer checkStatus;
 }

+ 2 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/bo/ProfileTpEditBo.java

@@ -56,5 +56,6 @@ public class ProfileTpEditBo {
     /** 商品id拼接,多个,拼接 */
     @ApiModelProperty("商品id拼接,多个,拼接")
     private String goodsIds;
-
+    @ApiModelProperty("是否审核通过才允许学习 1是0否")
+    private Integer checkStatus;
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/domain/ProfileTp.java

@@ -48,6 +48,9 @@ private static final long serialVersionUID=1L;
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private String goodsIds;
     private String tenantId;
+    /** 是否审核通过才允许学习 1是0否 */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Integer checkStatus;
 
     @TableField(exist = false)
     private Long oId;

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/ICertificateTpService.java

@@ -45,6 +45,8 @@ public interface ICertificateTpService extends IService<CertificateTp> {
 
 	String makeCertificatePhoto(ClassGradeUserQueryBo bo);
 
+	String makeBatchCertificatePhoto(ClassGradeUserQueryBo bo);
+
 	List<CertificateTpVo> selectListByBo(CertificateTpQueryBo bo);
 
 	/**

+ 60 - 45
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/CertificateTpServiceImpl.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.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
@@ -43,14 +44,21 @@ import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.domain.ClassGradeUser;
 import com.zhongzheng.modules.grade.service.IClassGradeUserService;
+import com.zhongzheng.modules.grade.service.impl.ClassGradeServiceImpl;
+import com.zhongzheng.modules.order.domain.OrderGoods;
+import com.zhongzheng.modules.order.service.IOrderGoodsService;
+import com.zhongzheng.modules.system.domain.SysOldOrg;
 import com.zhongzheng.modules.user.bo.UserCertificateAddBo;
 import com.zhongzheng.modules.user.bo.UserStudyRecordQueryBo;
+import com.zhongzheng.modules.user.domain.UserCertificate;
 import com.zhongzheng.modules.user.service.IUserCertificateService;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.service.IUserStudyRecordService;
 import com.zhongzheng.modules.user.vo.UserStudyRecordVo;
 import com.zhongzheng.modules.user.vo.UserVo;
 import org.apache.commons.lang3.ArrayUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -76,6 +84,8 @@ import java.util.stream.Collectors;
 @Service
 public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, CertificateTp> implements ICertificateTpService {
 
+    private static Logger log = LoggerFactory.getLogger(CertificateTpServiceImpl.class);
+
     @Autowired
     private IGoodsService iGoodsService;
     @Autowired
@@ -103,6 +113,10 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
 
     @Autowired
     private ICourseModuleService iCourseModuleService;
+
+    @Autowired
+    private IOrderGoodsService iOrderGoodsService;
+
     @Autowired
     private IMajorService iMajorService;
     @Value("${certificate.host}")
@@ -179,6 +193,14 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
         if(Validator.isEmpty(bo.getUserId())||Validator.isEmpty(bo.getGradeId())||Validator.isEmpty(bo.getGoodsId())){
             throw new CustomException("数据错误");
         }
+        UserCertificate userCertificate = iUserCertificateService.getOne(new LambdaQueryWrapper<UserCertificate>()
+                .eq(UserCertificate::getUserId, bo.getUserId())
+                .eq(UserCertificate::getGradeId,bo.getGradeId()).last("limit 1"));
+        if(Validator.isNotEmpty(userCertificate)){
+            System.out.println("已存在证书");
+            log.info("已存在证书" + bo.getUserId()+"-"+bo.getGradeId(), "");
+            return null;
+        }
         bo.setPageSize(null);
         bo.setPageNum(null);
         GoodsVo goodsVo = iGoodsService.selectDetail(bo.getGoodsId());
@@ -194,31 +216,20 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
                 .eq(ObjectUtils.isNotNull(bo.getOrderGoodsId()),ClassGradeUser::getOrderGoodsId, bo.getOrderGoodsId())
                 .eq(ClassGradeUser::getGradeId,bo.getGradeId()).last("limit 1"));
         UserVo userVo = iUserService.queryById(bo.getUserId());
-        if(Validator.isEmpty(userVo.getRealname())){
-            throw new CustomException("生成证书姓名缺失");
-        }
         if(Validator.isNotEmpty(goodsVo.getMoreCertificateStatus())&&goodsVo.getMoreCertificateStatus()==1){
             //获取章列表
             List<CourseChapterVo> chapterList =  iClassGradeUserService.findChapterList(bo);
             BigDecimal totalTime = new BigDecimal(0);
-            BigDecimal totalClassHour = new BigDecimal(0);
             BigDecimal publicTotalTime = new BigDecimal(0);
-            BigDecimal publicClassHour = new BigDecimal(0);
             for(CourseChapterVo chapterVo : chapterList){
-                BigDecimal cTime = new BigDecimal(courseMenuMapper.countChapterTotalTime(chapterVo.getChapterId()));
                 if(Validator.isEmpty(chapterVo.getCommonSign())||chapterVo.getCommonSign()==0){
-                    totalTime=totalTime.add(cTime);
-                    totalClassHour = totalClassHour.add(cTime.divide(new BigDecimal(45*60),BigDecimal.ROUND_HALF_UP).setScale( 0, BigDecimal.ROUND_HALF_UP ));
+                    totalTime=totalTime.add(new BigDecimal(courseMenuMapper.countChapterTotalTime(chapterVo.getChapterId())));
                 }else if(chapterVo.getCommonSign()==1){
-                    publicTotalTime=publicTotalTime.add(cTime);
-                    publicClassHour = publicClassHour.add(cTime.divide(new BigDecimal(45*60),BigDecimal.ROUND_HALF_UP).setScale( 0, BigDecimal.ROUND_HALF_UP ));
+                    publicTotalTime=publicTotalTime.add(new BigDecimal(courseMenuMapper.countChapterTotalTime(chapterVo.getChapterId())));
                 }
-
             }
-            goodsVo.setClassHours(totalClassHour);
-            goodsVo.setPublicClassHours(publicClassHour);
-           /* goodsVo.setClassHours(totalTime.divide(new BigDecimal(45*60),BigDecimal.ROUND_HALF_UP));
-            goodsVo.setPublicClassHours(publicTotalTime.divide(new BigDecimal(45*60),BigDecimal.ROUND_HALF_UP));*/
+            goodsVo.setClassHours(totalTime.divide(new BigDecimal(45*60),BigDecimal.ROUND_HALF_UP));
+            goodsVo.setPublicClassHours(publicTotalTime.divide(new BigDecimal(45*60),BigDecimal.ROUND_HALF_UP));
             if(Validator.isNotEmpty(goodsVo.getCertificateTpId())){
                 //        String[] s = goodsVo.getCertificateIds().split(",");
                 List<Long> tpIds = new ArrayList<>();
@@ -252,13 +263,10 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
                     //获取章列表
                     List<CourseChapterVo> chapterList =  iClassGradeUserService.findChapterList(bo);
                     BigDecimal totalTime = new BigDecimal(0);
-                    BigDecimal totalClassHour = new BigDecimal(0);
                     for(CourseChapterVo chapterVo : chapterList){
-                        BigDecimal cTime = new BigDecimal(courseMenuMapper.countChapterTotalTime(chapterVo.getChapterId()));
-                        totalTime=totalTime.add(cTime);
-                        totalClassHour = totalClassHour.add(cTime.divide(new BigDecimal(45*60),BigDecimal.ROUND_HALF_UP).setScale( 0, BigDecimal.ROUND_HALF_UP ));
+                        totalTime=totalTime.add(new BigDecimal(courseMenuMapper.countChapterTotalTime(chapterVo.getChapterId())));
                     }
-                    goodsVo.setClassHours(totalClassHour);
+                    goodsVo.setClassHours(totalTime.divide(new BigDecimal(45*60),BigDecimal.ROUND_HALF_UP));
                     List<Long> tpIds = new ArrayList<>();
                     if(Validator.isNotEmpty(moduleVo.getCertificateTpId())){
                         tpIds.add(moduleVo.getCertificateTpId());
@@ -273,9 +281,26 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
                     }
                 }
             }
-
         }
+        return null;
+    }
 
+    @Override
+    public String makeBatchCertificatePhoto(ClassGradeUserQueryBo bo) {
+        List<ClassGradeUser> list = iClassGradeUserService.list(new LambdaQueryWrapper<ClassGradeUser>()
+                .eq(ClassGradeUser::getPeriodStatus, 1).ge(ClassGradeUser::getPeriodTime,bo.getClassStartTime()));
+        for(ClassGradeUser gradeUser : list){
+            ClassGradeUserQueryBo queryBo = new ClassGradeUserQueryBo();
+            queryBo.setGradeId(gradeUser.getGradeId());
+            queryBo.setUserId(gradeUser.getUserId());
+            queryBo.setOrderGoodsId(gradeUser.getOrderGoodsId());
+            OrderGoods orderGoods = iOrderGoodsService.getOne(new LambdaQueryWrapper<OrderGoods>()
+                    .eq(OrderGoods::getOrderGoodsId, gradeUser.getOrderGoodsId()));
+            queryBo.setGoodsId(orderGoods.getGoodsId());
+            System.out.println("生成证书");
+            System.out.println(JSON.toJSONString(queryBo));
+            makeCertificatePhoto(queryBo);
+        }
         return null;
     }
 
@@ -523,7 +548,9 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
             vo.setRealname(userVo.getRealname());
             vo.setIdCard(userVo.getIdCard());
             String date = DateUtils.timestampToDate(goodsVo.getCreateTime());
-            vo.setYear(date.substring(0, 4));
+            OrderGoods orderGoods = iOrderGoodsService.getOne(new LambdaQueryWrapper<OrderGoods>()
+                    .eq(OrderGoods::getOrderGoodsId, bo.getOrderGoodsId()));
+            vo.setYear(orderGoods.getSevenYear());
             String sex = "男";
             if(Validator.isNotEmpty(userVo.getSex())&&userVo.getSex()==2){
                 sex = "女";
@@ -627,11 +654,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
         addBo.setMoreCertificateStatus(goodsVo.getMoreCertificateStatus());
         addBo.setModuleId(moduleId);
         addBo.setPublicClassHours(goodsVo.getPublicClassHours().setScale( 0, BigDecimal.ROUND_HALF_UP ));
-        if(Validator.isEmpty(goodsVo.getPublicClassHours())){
-            addBo.setPublicClassHours(BigDecimal.ZERO);
-        }else{
-            addBo.setPublicClassHours(goodsVo.getPublicClassHours().setScale( 0, BigDecimal.ROUND_HALF_UP ));
-        }
+        addBo.setOrderGoodsId(bo.getOrderGoodsId());
         return addBo;
     }
     private String getCertificateCode(){
@@ -721,9 +744,6 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
             else if(i==13){
                 numTag = "14. ";
             }
-            else if(i==14){
-                numTag = "15. ";
-            }
             chapterListTxt.add(numTag+chapterList.get(i).getName());
         }
         return chapterListTxt;
@@ -904,7 +924,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
             g.drawString(entity.getDateY()+"年"+entity.getDateM()+"月"+entity.getDateD()+"日", 846, 1616);
             g.drawString("施工现场专业人员", 1508, 1616);
 
-            g.drawString(entity.getDateY(), 311, 1770);
+            g.drawString(entity.getYear(), 311, 1770);
             g.drawString(String.valueOf(Integer.parseInt(entity.getPublicClassHours())+Integer.parseInt(entity.getClassHours())), 1341, 1770);
 
             g.drawString(entity.getPublicClassHours(), 311, 1920);
@@ -935,6 +955,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
             return ossPath;
         } catch (Exception e) {
             e.printStackTrace();
+            System.out.println(e.getMessage());
         }
         // 返回给页面的图片地址(因为绝对路径无法访问)
         //    imgName = Constants.PROJECT_URL + "codeImg/" + userId + ".png";
@@ -945,7 +966,6 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
     private  String drawPicErZao(CertificatePhotoVo entity){
         Font font = new Font("微软雅黑", Font.PLAIN, 31);// 添加字体的属性设置 微软雅黑
         Font font2 = new Font("微软雅黑", Font.BOLD, 38);
-        Font font3 = new Font("微软雅黑", Font.PLAIN, 28);
         String imgName = null;
         try {
             // 加载本地图片
@@ -973,9 +993,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
             if("必修".equals(entity.getMajor())){
                 g.drawString(entity.getMajor(), 768, 718);
             }else{
-                g.setFont(font3);
-                g.drawString("选修("+entity.getMajor()+")", 675, 718);
-                g.setFont(font);
+                g.drawString("选修("+entity.getMajor()+")", 677, 718);
             }
 
 
@@ -989,7 +1007,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
             Integer startY = 810;
             Integer j = 0;
             for(String name : entity.getChapterList()){
-                if(j<15){
+                if(j<6){
                     g.drawString(name, 300, startY);
                     startY+=50;
                 }else{
@@ -1015,10 +1033,10 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
             //二维码
             String qrTxt = CERTIFICATE_HOST+"pages/certificate/index?code="+entity.getCode();
             QRCodeWriter qrCodeWriter = new QRCodeWriter();
-            BitMatrix bitMatrix = qrCodeWriter.encode(qrTxt, BarcodeFormat.QR_CODE, 180, 180);
+            BitMatrix bitMatrix = qrCodeWriter.encode(qrTxt, BarcodeFormat.QR_CODE, 150, 150);
             BufferedImage qrImage = toBufferedImage(bitMatrix);
             // 在模板上添加用户二维码(地址,左边距,上边距,图片宽度,图片高度,未知)
-            g.drawImage(qrImage, 1209, 145, 180, 180, null);
+            g.drawImage(qrImage, 1233, 175, 150, 150, null);
             // 完成模板修改
             g.dispose();
             // 获取新文件的地址
@@ -1043,7 +1061,6 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
     private  String drawPicErJian(CertificatePhotoVo entity){
         Font font = new Font("微软雅黑", Font.PLAIN, 31);// 添加字体的属性设置 微软雅黑
         Font font2 = new Font("微软雅黑", Font.BOLD, 38);
-        Font font3 = new Font("微软雅黑", Font.PLAIN, 28);
         String imgName = null;
         try {
             // 加载本地图片
@@ -1071,9 +1088,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
             if("必修".equals(entity.getMajor())){
                 g.drawString(entity.getMajor(), 768, 718);
             }else{
-                g.setFont(font3);
-                g.drawString("选修("+entity.getMajor()+")", 675, 718);
-                g.setFont(font);
+                g.drawString("选修("+entity.getMajor()+")", 677, 718);
             }
 
 
@@ -1087,7 +1102,7 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
             Integer startY = 810;
             Integer j = 0;
             for(String name : entity.getChapterList()){
-                if(j<15){
+                if(j<14){
                     g.drawString(name, 300, startY);
                     startY+=50;
                 }else{
@@ -1113,10 +1128,10 @@ public class CertificateTpServiceImpl extends ServiceImpl<CertificateTpMapper, C
             //二维码
             String qrTxt = CERTIFICATE_HOST+"pages/certificate/index?code="+entity.getCode();
             QRCodeWriter qrCodeWriter = new QRCodeWriter();
-            BitMatrix bitMatrix = qrCodeWriter.encode(qrTxt, BarcodeFormat.QR_CODE, 180, 180);
+            BitMatrix bitMatrix = qrCodeWriter.encode(qrTxt, BarcodeFormat.QR_CODE, 150, 150);
             BufferedImage qrImage = toBufferedImage(bitMatrix);
             // 在模板上添加用户二维码(地址,左边距,上边距,图片宽度,图片高度,未知)
-            g.drawImage(qrImage, 1209, 145, 180, 180, null);
+            g.drawImage(qrImage, 1233, 175, 150, 150, null);
             // 完成模板修改
             g.dispose();
             // 获取新文件的地址

+ 37 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/UserProfileServiceImpl.java

@@ -499,7 +499,7 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
         String keyValue = bo.getKeyValue();
         if (Validator.isNotEmpty(keyValue)) {
             Map<String, String> maps = JSONObject.parseObject(keyValue, Map.class);
-            String recent_photos, idcard_face_photo, idcard_national_photo,work_unit,idcard,name,education,apply_post,telphone,sex;
+            String recent_photos, idcard_face_photo, idcard_national_photo,work_unit,idcard,name,education,apply_post,telphone,sex,school,unit_contact,unit_tel,graduation_time,major,working_years;
             LambdaUpdateWrapper<User> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
             objectLambdaUpdateWrapper.eq(User::getUserId, bo.getUserId());
             UserVo user = iUserService.queryById(bo.getUserId());
@@ -583,6 +583,42 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
                     objectLambdaUpdateWrapper.set(User::getSex, sex.equals("男")?1:2);
                 }
             }
+            if (maps.containsKey("school")) {
+                school = JSONObject.parseObject(String.valueOf(maps.get("school")), UserProfileFit.class).getValue();
+                if(Validator.isNotEmpty(school)){
+                    objectLambdaUpdateWrapper.set(User::getSchool, school);
+                }
+            }
+            if (maps.containsKey("unit_contact")) {
+                unit_contact = JSONObject.parseObject(String.valueOf(maps.get("unit_contact")), UserProfileFit.class).getValue();
+                if(Validator.isNotEmpty(unit_contact)){
+                    objectLambdaUpdateWrapper.set(User::getUnitContact, unit_contact);
+                }
+            }
+            if (maps.containsKey("unit_tel")) {
+                unit_tel = JSONObject.parseObject(String.valueOf(maps.get("unit_tel")), UserProfileFit.class).getValue();
+                if(Validator.isNotEmpty(unit_tel)){
+                    objectLambdaUpdateWrapper.set(User::getUnitTel, unit_tel);
+                }
+            }
+            if (maps.containsKey("graduation_time")) {
+                graduation_time = JSONObject.parseObject(String.valueOf(maps.get("graduation_time")), UserProfileFit.class).getValue();
+                if(Validator.isNotEmpty(graduation_time)){
+                    objectLambdaUpdateWrapper.set(User::getGraduationTime, graduation_time);
+                }
+            }
+            if (maps.containsKey("major")) {
+                major = JSONObject.parseObject(String.valueOf(maps.get("major")), UserProfileFit.class).getValue();
+                if(Validator.isNotEmpty(major)){
+                    objectLambdaUpdateWrapper.set(User::getMajor, major);
+                }
+            }
+            if (maps.containsKey("working_years")) {
+                working_years = JSONObject.parseObject(String.valueOf(maps.get("working_years")), UserProfileFit.class).getValue();
+                if(Validator.isNotEmpty(working_years)){
+                    objectLambdaUpdateWrapper.set(User::getWorkYear, working_years);
+                }
+            }
             objectLambdaUpdateWrapper.set(User::getUpdateTime, DateUtils.getNowTime());
             iUserService.update(null, objectLambdaUpdateWrapper);
         }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/vo/ProfileTpVo.java

@@ -58,4 +58,6 @@ public class ProfileTpVo {
 	@Excel(name = "商品id拼接,多个,拼接")
 	@ApiModelProperty("商品id拼接,多个,拼接")
 	private String goodsIds;
+	@ApiModelProperty("是否审核通过才允许学习 1是0否")
+	private Integer checkStatus;
 }

+ 2 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseAddBo.java

@@ -82,5 +82,6 @@ public class CourseAddBo {
     /** 优选生成 0否 1是 */
     @ApiModelProperty("优选生成 0否 1是")
     private Integer firstChoice;
-
+    @ApiModelProperty("视频标签:1保利威 2腾讯")
+    private Integer viewSign;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseChapterAddBo.java

@@ -55,4 +55,6 @@ public class CourseChapterAddBo {
     private String importNo;
     @ApiModelProperty("公共标识:1公共章 0非公共章")
     private Integer commonSign;
+    @ApiModelProperty("视频标签:1保利威 2腾讯")
+    private Integer viewSign;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseChapterEditBo.java

@@ -67,4 +67,6 @@ public class CourseChapterEditBo {
 
     @ApiModelProperty("公共标识:1公共章 0非公共章")
     private Integer commonSign;
+    @ApiModelProperty("视频标签:1保利威 2腾讯")
+    private Integer viewSign;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseChapterQueryBo.java

@@ -75,4 +75,6 @@ public class CourseChapterQueryBo extends BaseEntity {
 	/** 导入编号 */
 	@ApiModelProperty("导入编号")
 	private String importNo;
+	@ApiModelProperty("视频标签:1保利威 2腾讯")
+	private Integer viewSign;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseEditBo.java

@@ -100,5 +100,7 @@ public class CourseEditBo {
     /** 优选生成 0否 1是 */
     @ApiModelProperty("优选生成 0否 1是")
     private Integer firstChoice;
+    @ApiModelProperty("视频标签:1保利威 2腾讯")
+    private Integer viewSign;
 
 }

+ 2 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseModuleAddBo.java

@@ -66,5 +66,6 @@ public class CourseModuleAddBo {
     /** 证书模板ID */
     @ApiModelProperty("证书模板ID")
     private Long certificateTpId;
-
+    @ApiModelProperty("视频标签:1保利威 2腾讯")
+    private Integer viewSign;
 }

+ 2 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseModuleEditBo.java

@@ -78,5 +78,6 @@ public class CourseModuleEditBo {
     private Long certificateTpId;
     @ApiModelProperty("公共标识:1公共章 0非公共章")
     private Integer commonSign;
-
+    @ApiModelProperty("视频标签:1保利威 2腾讯")
+    private Integer viewSign;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseModuleQueryBo.java

@@ -72,4 +72,6 @@ public class CourseModuleQueryBo extends BaseEntity {
 	/** 赠送卷ID */
 	@ApiModelProperty("赠送卷ID")
 	private Long freeExamId;
+	@ApiModelProperty("视频标签:1保利威 2腾讯")
+	private Integer viewSign;
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseQueryBo.java

@@ -147,4 +147,7 @@ public class CourseQueryBo extends BaseEntity {
 	private Integer studyFinishStatus;
 
 	private List<Long> orderGoodsIds;
+
+	@ApiModelProperty("视频标签:1保利威 2腾讯")
+	private Integer viewSign;
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseSectionAddBo.java

@@ -87,4 +87,7 @@ public class CourseSectionAddBo {
     /** 讲师ID */
     @ApiModelProperty("讲师ID")
     private Long teacherId;
+    /** 视频标签:1保利威 2腾讯 */
+    @ApiModelProperty("视频标签:1保利威 2腾讯")
+    private Integer viewSign;
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseSectionEditBo.java

@@ -94,4 +94,7 @@ public class CourseSectionEditBo {
     /** 讲师ID */
     @ApiModelProperty("讲师ID")
     private Long teacherId;
+    /** 视频标签:1保利威 2腾讯 */
+    @ApiModelProperty("视频标签:1保利威 2腾讯")
+    private Integer viewSign;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseSectionQueryBo.java

@@ -104,4 +104,6 @@ public class CourseSectionQueryBo extends BaseEntity {
 	/** 讲师ID */
 	@ApiModelProperty("讲师ID")
 	private Long teacherId;
+	@ApiModelProperty("视频标签:1保利威 2腾讯")
+	private Integer viewSign;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/Course.java

@@ -74,6 +74,8 @@ private static final long serialVersionUID=1L;
     private Long oId;
     /** 优选生成 0否 1是 */
     private Integer firstChoice;
+    /** 视频标签:1保利威 2腾讯*/
+    private Integer viewSign;
 
 
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseChapter.java

@@ -55,4 +55,6 @@ private static final long serialVersionUID=1L;
     /** 公共标识:1公共章 0非公共章 */
     private String commonSign;
 
+    /** 视频标签:1保利威 2腾讯*/
+    private Integer viewSign;
 }

+ 2 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseModule.java

@@ -63,5 +63,6 @@ private static final long serialVersionUID=1L;
     private Long certificateTpId;
     /** 公共标识:1公共章 0非公共章 */
     private String commonSign;
-
+    /** 视频标签:1保利威 2腾讯*/
+    private Integer viewSign;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/domain/CourseSection.java

@@ -77,4 +77,6 @@ private static final long serialVersionUID=1L;
 
     @TableField(exist = false)
     private Long oId;
+    /** 视频标签:1保利威 2腾讯 */
+    private Integer viewSign;
 }

+ 6 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseService.java

@@ -8,10 +8,7 @@ import com.zhongzheng.modules.course.domain.Course;
 import com.zhongzheng.modules.course.vo.CourseUserVo;
 import com.zhongzheng.modules.course.vo.CourseVo;
 import com.zhongzheng.modules.goods.bo.GoodsBatchDelBo;
-import com.zhongzheng.modules.goods.vo.GoodsPeriodStatusVo;
-import com.zhongzheng.modules.goods.vo.GoodsPeriodVo;
-import com.zhongzheng.modules.goods.vo.GoodsUserVo;
-import com.zhongzheng.modules.goods.vo.GoodsVo;
+import com.zhongzheng.modules.goods.vo.*;
 import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.vo.ClassGradeVo;
 import com.zhongzheng.modules.order.bo.SpecialQuestionBo;
@@ -73,6 +70,7 @@ public interface ICourseService extends IService<Course> {
 
 	List<GoodsPeriodStatusVo> listSection(ClassGradeUserQueryBo bo);
 
+
     boolean editRebuild(ClassGradeUserQueryBo bo);
 
     List<GoodsUserVo> goodsList(CourseQueryBo bo);
@@ -110,4 +108,8 @@ public interface ICourseService extends IService<Course> {
     Long getSpecialQuestionCount(SpecialQuestionBo bo);
 
 	Map<String,String> getSpecialQuestionSkipCode(Long userId);
+
+	UserNewGoodsVo getOldGoodsList(Long userId);
+
+    Map<String, String> getUserSkipPort(Long userId);
 }

+ 73 - 5
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java

@@ -24,6 +24,8 @@ import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.type.EncryptHandler;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.ToolsUtils;
+import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.modules.base.domain.UserProfile;
 import com.zhongzheng.modules.base.service.IUserProfileService;
 import com.zhongzheng.modules.course.bo.CourseAddBo;
@@ -49,10 +51,7 @@ import com.zhongzheng.modules.goods.service.IGoodsCourseService;
 import com.zhongzheng.modules.goods.service.IGoodsQuestionRelService;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.service.IQuestionMerchantService;
-import com.zhongzheng.modules.goods.vo.GoodsPeriodStatusVo;
-import com.zhongzheng.modules.goods.vo.GoodsPeriodVo;
-import com.zhongzheng.modules.goods.vo.GoodsSectionNumVo;
-import com.zhongzheng.modules.goods.vo.GoodsUserVo;
+import com.zhongzheng.modules.goods.vo.*;
 import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.bo.UserPeriodQueryBo;
 import com.zhongzheng.modules.grade.bo.UserPeriodStatusAddBo;
@@ -69,6 +68,7 @@ import com.zhongzheng.modules.order.vo.SpecialQuestionVo;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.system.domain.SysTenant;
 import com.zhongzheng.modules.system.service.ISysTenantService;
+import com.zhongzheng.modules.top.order.vo.TopConversionRateTrendVo;
 import com.zhongzheng.modules.user.bo.SubjectStudyRecordQueryBo;
 import com.zhongzheng.modules.user.bo.UserPhoneBo;
 import com.zhongzheng.modules.user.bo.UserPlanQueryBo;
@@ -162,6 +162,8 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
     private RedisCache redisCache;
     @Value("${liveGotoURL}")
     private String URL_PREFIX;
+    @Value("${oldSys.goods}")
+    private String OLD_GOODS;
     @Autowired
     private ClassGradeUserMapper classGradeUserMapper;
 
@@ -891,7 +893,10 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
                     .eq(UserSubscribe::getSubscribeStatus,1)
                     .eq(UserSubscribe::getExamStatus,0)
                     .last("limit 1"));
-            if (ObjectUtils.isNotNull(userSubscribeTwo)){
+
+            String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+            SysTenant tenant = iSysTenantService.getById(Long.valueOf(tenantId));
+            if (ObjectUtils.isNotNull(userSubscribeTwo) && tenant.getExamRoom() != 2){
                 Goods goods = iGoodsService.getById(goodsUserVo.getGoodsId());
                 if (ObjectUtils.isNull(goods.getQuestionGoodsId())){
                     //没有关联题库 是否购买过题库
@@ -1111,6 +1116,69 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
         return map;
     }
 
+    @Override
+    public UserNewGoodsVo getOldGoodsList(Long userId) {
+        UserNewGoodsVo vo = new UserNewGoodsVo();
+        User user = iUserService.getById(userId);
+        if (ObjectUtils.isNull(user)){
+            return null;
+        }
+        String idCard = EncryptHandler.decrypt(user.getIdCard());
+        String telPhone = EncryptHandler.decrypt(user.getTelphone());
+        Map<String, String> params = new HashMap<>();
+        Long nowTime = DateUtils.getNowTime();
+        String sign = ToolsUtils.EncoderByMd5(idCard+telPhone+nowTime + "pubilc2022");
+        params.put("stamp", nowTime.toString());
+        params.put("sign", sign);
+        params.put("idNum", idCard);
+        params.put("passwordSign", "2");
+        params.put("telphone",telPhone);
+        String respone = "";
+        try {
+            respone = HttpUtils.postFormBody(OLD_GOODS, params);
+            if (!respone.contains("\"code\":200")) {
+                throw new CustomException("旧系统用户商品接口错误");
+            }
+            JSONObject jsonObject = JSONObject.parseObject(respone);
+            Object data = jsonObject.get("data");
+            if (ObjectUtils.isNotNull(data)){
+                vo = JSONObject.parseObject(JSONObject.toJSONString(data), UserNewGoodsVo.class);
+            }else {
+                return null;
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+            throw new CustomException("旧系统用户商品接口错误");
+        }
+        return vo;
+    }
+
+    @Override
+    public Map<String, String> getUserSkipPort(Long userId) {
+        User user = iUserService.getById(userId);
+        if (ObjectUtils.isNull(user)){
+            throw new CustomException("用户信息错误!");
+        }
+        //新系统有账号
+        String tenantId = user.getTenantId();
+        //缓存用户信息key
+        String key = String.format("KQTZ%s", user.getUserId());
+        SysTenant sysTenant = iSysTenantService.getById(tenantId);
+        //课程
+        String domain = String.format("%s%s", URL_PREFIX, sysTenant.getHostH5());
+        HashMap<String, String> map = new HashMap<>();
+        map.put("domain", domain);
+        map.put("skipPort", key);
+        UserPhoneBo phoneBo = new UserPhoneBo();
+        phoneBo.setTelphone(EncryptHandler.decrypt(user.getTelphone()));
+        phoneBo.setTenantId(tenantId);
+        phoneBo.setIdNum(EncryptHandler.decrypt(user.getIdCard()));
+
+        //缓存用户信息
+        redisCache.setCacheObjectTenant(tenantId + ":" + key, JSONObject.toJSONString(phoneBo), 12, TimeUnit.HOURS);
+        return map;
+    }
+
     private Long liveTime(Long nowTime, Integer day) {
         for (Integer i = 0; i < day; i++) {
             Long dayAfter = DateUtils.getDayAfter(nowTime, 1);

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseChapterSectionVo.java

@@ -93,4 +93,7 @@ public class CourseChapterSectionVo {
 	@ApiModelProperty("直播地址")
 	private String liveUrl;
 
+	@ApiModelProperty("视频标签:1保利威 2腾讯")
+	private Integer viewSign;
+
 }

+ 2 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseChapterVo.java

@@ -87,5 +87,6 @@ public class CourseChapterVo {
 	private Integer commonSign;
 	@ApiModelProperty("节总时间")
 	private Long totalTime;
-
+	@ApiModelProperty("视频标签:1保利威 2腾讯")
+	private Integer viewSign;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseModuleChapterVo.java

@@ -66,4 +66,6 @@ public class CourseModuleChapterVo {
 			"" +
 			"")
 	private Integer sectionNum;
+	@ApiModelProperty("视频标签:1保利威 2腾讯")
+	private Long viewSign;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseModuleVo.java

@@ -99,4 +99,6 @@ public class CourseModuleVo {
 	@ApiModelProperty("公共标识:1公共章 0非公共章")
 	private Integer commonSign;
 
+	@ApiModelProperty("视频标签:1保利威 2腾讯")
+	private Integer viewSign;
 }

+ 4 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseSectionImport.java

@@ -74,7 +74,10 @@ public class CourseSectionImport {
     @Excel(name = "节时长")
     @ApiModelProperty("节时长(分钟)")
     private Long durationTime;
-
+    /** 视频标签:1保利威 2腾讯 */
+    @ApiModelProperty("视频标签:1保利威 2腾讯")
+    @Excel(name = "视频标签:1保利威 2腾讯")
+    private Integer viewSign;
 
     private Long educationTypeId;
 

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseSectionVo.java

@@ -133,4 +133,8 @@ public class CourseSectionVo {
 	/** 讲师ID */
 	@ApiModelProperty("讲师ID")
 	private Long teacherId;
+
+	/** 视频标签:1保利威 2腾讯 */
+	@ApiModelProperty("视频标签:1保利威 2腾讯")
+	private Integer viewSign;
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseUserChapterSectionVo.java

@@ -124,4 +124,7 @@ public class CourseUserChapterSectionVo {
 	@ApiModelProperty("观看时长(秒)")
 	private Long studyDuration;
 	private Long orderGoodsId;
+
+	@ApiModelProperty("视频标签:1保利威 2腾讯")
+	private Integer viewSign;
 }

Некоторые файлы не были показаны из-за большого количества измененных файлов