he2802 2 anos atrás
pai
commit
6b7b7e71ac
35 arquivos alterados com 474 adições e 68 exclusões
  1. 1 3
      run-pre.sh
  2. 22 3
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  3. 21 7
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderController.java
  4. 45 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/http/HttpUtils.java
  5. 1 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/TokenService.java
  6. 7 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/UserProfileServiceImpl.java
  7. 26 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/ExternalQuestionBo.java
  8. 20 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java
  9. 38 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/ExternalQuestionVo.java
  10. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/CdUserSubscribeBo.java
  11. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamApplyGoodsVo.java
  12. 22 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/QuestionOpenBo.java
  13. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsMapper.java
  14. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsService.java
  15. 26 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java
  16. 14 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsSpecTemplateServiceImpl.java
  17. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsUserVo.java
  18. 10 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/SpecAttrPriceVo.java
  19. 39 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClientPostAddBo.java
  20. 2 5
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeUserService.java
  21. 54 17
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java
  22. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/UserPeriodServiceImpl.java
  23. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeStudentVo.java
  24. 12 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeUserVo.java
  25. 4 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderAddBo.java
  26. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderMapper.java
  27. 2 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderService.java
  28. 29 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsServiceImpl.java
  29. 26 13
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  30. 4 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/schedule/service/impl/ScheduleServiceImpl.java
  31. 18 0
      zhongzheng-system/src/main/resources/mapper/modules/goods/GoodsMapper.xml
  32. 2 0
      zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeMapper.xml
  33. 6 0
      zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeUserMapper.xml
  34. 0 1
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderMapper.xml
  35. 2 2
      zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyRecordMapper.xml

+ 1 - 3
run-pre.sh

@@ -117,6 +117,4 @@ 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----'

+ 22 - 3
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -29,6 +29,8 @@ import com.zhongzheng.modules.alioss.service.OssService;
 import com.zhongzheng.modules.bank.service.IExamService;
 import com.zhongzheng.modules.bank.service.IQuestionOtherService;
 import com.zhongzheng.modules.base.bo.ConfigQueryBo;
+import com.zhongzheng.modules.course.bo.ExternalQuestionBo;
+import com.zhongzheng.modules.course.vo.ExternalQuestionVo;
 import com.zhongzheng.modules.distribution.bo.DistributionActivityGoodsQueryBo;
 import com.zhongzheng.modules.distribution.bo.DistributionCashWithdrawalPayBo;
 import com.zhongzheng.modules.distribution.service.IDistributionActivityGoodsService;
@@ -341,13 +343,23 @@ public class CommonController extends BaseController {
     @ApiOperation("学员学时图片修改")
     @PostMapping("common/student/image/update")
     public AjaxResult updateStudentImage(@RequestBody UpdateStudentImageBo bo) {
-//        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
-//            return AjaxResult.error("签名错误");
-//        }
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
+            return AjaxResult.error("签名错误");
+        }
         String base = iUserSubscribeService.updateStudentImage(bo);
         return AjaxResult.success(base);
     }
 
+    @ApiOperation("获取外部题库商品(山东题库)")
+    @PostMapping("common/external/question")
+    public AjaxResult getExternalQuestion(@RequestBody ExternalQuestionBo bo) {
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
+            return AjaxResult.error("签名错误");
+        }
+        List<ExternalQuestionVo> questionVos = iGoodsService.getExternalQuestion(bo);
+        return AjaxResult.success(questionVos);
+    }
+
 
     @ApiOperation("获取某场考试信息")
     @PostMapping("common/apply/detail")
@@ -716,6 +728,7 @@ public class CommonController extends BaseController {
     public AjaxResult pushPeriod(@RequestBody List<ClassGradeUserQueryBo>  list) {
         return AjaxResult.success(iClassGradeUserService.pushOfficialPeriodMore(list));
     }
+
     @ApiOperation("测试获取山东题库")
     @PreAuthorize("@ss.hasPermi('system:withdrawal:add')")
     @Log(title = "测试获取山东题库", businessType = BusinessType.INSERT)
@@ -725,4 +738,10 @@ public class CommonController extends BaseController {
         return AjaxResult.success();
     }
 
+
+    @ApiOperation("旧系统post请求")
+    @PostMapping("/common/free/clientPost")
+    public AjaxResult<Void> clientPost(@RequestBody ClientPostAddBo bo) {
+        return AjaxResult.success(iClassGradeUserService.sendClientPost(bo));
+    }
 }

+ 21 - 7
zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderController.java

@@ -5,29 +5,28 @@ import java.time.format.DateTimeFormatter;
 import java.util.*;
 
 import cn.hutool.core.lang.Validator;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 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.TokenService;
+import com.zhongzheng.modules.goods.bo.QuestionOpenBo;
 import com.zhongzheng.modules.goods.bo.QuestionOpenImportBo;
 import com.zhongzheng.modules.goods.vo.QuestionOpenImportVo;
-import com.zhongzheng.modules.grade.vo.ClassPeriodStudentExportAllVo;
 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.OrderGoodsVo;
 import com.zhongzheng.modules.order.vo.OrderListVo;
 import com.zhongzheng.modules.order.vo.OrderVo;
-import com.zhongzheng.modules.user.bo.UserSubscribeExportBo;
-import com.zhongzheng.modules.user.vo.UserSubscribeImport;
+import com.zhongzheng.modules.user.domain.UserSubscribe;
+import com.zhongzheng.modules.user.service.IUserSubscribeService;
 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;
@@ -58,6 +57,8 @@ public class OrderController extends BaseController {
 
     private final IOrderGoodsService iOrderGoodsService;
 
+    private final IUserSubscribeService iUserSubscribeService;
+
     private final TokenService tokenService;
 
     /**
@@ -150,6 +151,19 @@ public class OrderController extends BaseController {
     @PostMapping("/inputOrder")
     public AjaxResult addInputOrder(@RequestBody OrderAddBo bo) {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if (ObjectUtils.isNotNull(bo.getOpenQuestionSign()) && bo.getOpenQuestionSign() == 1){
+            //新B端外部题库开通
+            QuestionOpenBo questionOpenBo = new QuestionOpenBo();
+            questionOpenBo.setCreateSysUserId(loginUser.getUser().getUserId());
+            questionOpenBo.setCreateBy(SecurityUtils.getUsername());
+            questionOpenBo.setGoodsId(bo.getGoodsList().get(0).getGoodsId());
+            UserSubscribe userSubscribe = iUserSubscribeService.getOne(new LambdaQueryWrapper<UserSubscribe>()
+                    .eq(UserSubscribe::getUserId, bo.getUserId())
+                    .eq(UserSubscribe::getOrderGoodsId, bo.getSubOrderGoodsId())
+                    .last("limit 1"));
+            questionOpenBo.setUserSubscribeIds(Arrays.asList(userSubscribe.getSubscribeId()));
+            return AjaxResult.success(iOrderService.questionGoodsOpen(questionOpenBo));
+        }
         if(Validator.isEmpty(bo.getCreateUsername())){
             bo.setCreateSysUserId(loginUser.getUser().getUserId());
             bo.setCreateBy(SecurityUtils.getUsername());
@@ -179,7 +193,7 @@ public class OrderController extends BaseController {
      */
     @ApiOperation("七大员题库商品开通")
     @PostMapping("/question/open")
-    public AjaxResult<Void> questionGoodsOpen(@RequestBody questionOpenBo bo) {
+    public AjaxResult<Void> questionGoodsOpen(@RequestBody QuestionOpenBo bo) {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         bo.setCreateSysUserId(loginUser.getUser().getUserId());
         bo.setCreateBy(SecurityUtils.getUsername());

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

@@ -125,6 +125,16 @@ public class HttpUtils
 
     }
 
+    public static String postFormBodyHeader(String url, Map<String, String> paramMap, Map<String, String> headersMap) throws IOException{
+        try{
+            String result = postHead(url, paramMap, null,headersMap);
+            return result;
+        }catch (Exception e){
+            return null;
+        }
+
+    }
+
     public static String sendPost(String url, JSONObject param)
     {
         HttpClient client = HttpClients.createDefault();
@@ -472,6 +482,41 @@ public class HttpUtils
         return url;
     }
 
+    private static String postHead(String url, Map<String, String> paramMap, String encoding, Map<String, String> headersMap) throws IOException, NoSuchAlgorithmException, KeyManagementException {
+        log.debug("http 请求 url: {} , 请求参数: {}", url, appendUrl("", paramMap).replace("?", ""));
+        encoding = encoding == null ? UTF8 : encoding;
+        // 创建post方式请求对象
+        HttpPost httpPost = new HttpPost(url);
+        // 装填参数
+        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
+        if (paramMap != null) {
+            for (Map.Entry<String, String> entry : paramMap.entrySet()) {
+                String value = entry.getValue();
+                //去掉如下判断会造成String类型的value为null时
+                if (value != null) {
+                    nameValuePairs.add(new BasicNameValuePair(entry.getKey(), value));
+                }
+            }
+        }
+        // 设置参数到请求对象中
+        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, encoding));
+        // 设置header信息
+        // 指定报文头【Content-type】、【User-Agent】
+        httpPost.setHeader("Content-type", APPLICATION_FORM_URLENCODED);
+        headersMap.forEach(httpPost::setHeader);
+        return post(url, httpPost, encoding, new DataParse<String>() {
+            @Override
+            public String parseData(HttpEntity httpEntity, String encoding) throws IOException {
+                if(Validator.isNotEmpty(httpEntity)){
+                    return EntityUtils.toString(httpEntity, encoding);
+                }else{
+                    return null;
+                }
+
+            }
+        });
+    }
+
     /**
      * 向url发送post请求表单提交数据
      * @param url 请求url

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

@@ -98,7 +98,7 @@ public class TokenService
         {
             // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
             authentication = authenticationManager
-                    .authenticate(new UsernamePasswordAuthenticationToken("admin", "admin123"));
+                    .authenticate(new UsernamePasswordAuthenticationToken("admin", "admin159"));
         }
         catch (Exception e)
         {

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

@@ -500,7 +500,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;
+            String recent_photos, idcard_face_photo, idcard_national_photo,work_unit,idcard,name,education,apply_post,telphone,sex;
             LambdaUpdateWrapper<User> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
             objectLambdaUpdateWrapper.eq(User::getUserId, bo.getUserId());
             UserVo user = iUserService.queryById(bo.getUserId());
@@ -575,6 +575,12 @@ public class UserProfileServiceImpl extends ServiceImpl<UserProfileMapper, UserP
                     objectLambdaUpdateWrapper.set(User::getJob, apply_post);
                 }
             }
+            if (maps.containsKey("sex")) {
+                sex = JSONObject.parseObject(String.valueOf(maps.get("sex")), UserProfileFit.class).getValue();
+                if(Validator.isNotEmpty(sex)){
+                    objectLambdaUpdateWrapper.set(User::getSex, sex.equals("男")?1:2);
+                }
+            }
             objectLambdaUpdateWrapper.set(User::getUpdateTime, DateUtils.getNowTime());
             iUserService.update(null, objectLambdaUpdateWrapper);
         }

+ 26 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/ExternalQuestionBo.java

@@ -0,0 +1,26 @@
+package com.zhongzheng.modules.course.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年09月12日 8:52
+ */
+@Data
+public class ExternalQuestionBo implements Serializable {
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    private Long tenantId;
+
+}

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

@@ -570,13 +570,16 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
                         && (DateUtils.getNowTime() >= goodsUserVo.getServiceStartTime() && DateUtils.getNowTime() <= goodsUserVo.getServiceEndTime())){
                     UserSubscribe userSubscribe = iUserSubscribeService.getOne(new LambdaQueryWrapper<UserSubscribe>()
                             .eq(UserSubscribe::getUserId, bo.getUserId())
-                            .eq(UserSubscribe::getGoodsId, goodsUserVo.getGoodsId())
+                            .eq(UserSubscribe::getOrderGoodsId, goodsUserVo.getOrderGoodsId())
                             .eq(UserSubscribe::getSubscribeStatus, 1)
                             .orderByDesc(UserSubscribe::getCreateTime)
                             .last("limit 1"));
                     if (ObjectUtils.isNull(userSubscribe)){
                         goodsUserVo.setSubscribeSign(1);
-                    }else if (ObjectUtils.isNotNull(userSubscribe.getResult()) && userSubscribe.getResult() == 0){
+                    }else if (userSubscribe.getSubscribeStatus() == 1 && userSubscribe.getExamStatus() == 0){
+                        goodsUserVo.setSubscribeSign(4);
+
+                    } else if (ObjectUtils.isNotNull(userSubscribe.getResult()) && userSubscribe.getResult() == 0){
                         goodsUserVo.setSubscribeSign(3);
                     }
                 }
@@ -596,6 +599,13 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
                            String format = String.format("%s-%s", twoAddBo.getStartTime(), twoAddBo.getEndTime());
                             examApplyGoodsVo.setApplyTime(time);
                             examApplyGoodsVo.setApplyMoment(format);
+                            examApplyGoodsVo.setApplyNum(twoAddBo.getNum().intValue());
+                            //预约人数
+                            int count = iUserSubscribeService.count(new LambdaQueryWrapper<UserSubscribe>()
+                                    .eq(UserSubscribe::getSubscribeStatus, 1)
+                                    .eq(UserSubscribe::getExamStatus, 0)
+                                    .eq(UserSubscribe::getApplyId, examApplyGoodsVo.getApplyId()));
+                            examApplyGoodsVo.setSubscribeNum(count);
                         }
                     }
                     switch (examApply.getApplyNature()){
@@ -788,6 +798,8 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
                             .last("limit 1"));
                     if (ObjectUtils.isNull(userSubscribe)){
                         goodsUserVo.setSubscribeSign(1);
+                    }else if (userSubscribe.getSubscribeStatus() == 1 && userSubscribe.getExamStatus() == 0){
+                        goodsUserVo.setSubscribeSign(4);
                     }else if (ObjectUtils.isNotNull(userSubscribe.getResult()) && userSubscribe.getResult() == 0){
                         goodsUserVo.setSubscribeSign(3);
                     }
@@ -808,6 +820,12 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
                             String format = String.format("%s-%s", twoAddBo.getStartTime(), twoAddBo.getEndTime());
                             examApplyGoodsVo.setApplyTime(time);
                             examApplyGoodsVo.setApplyMoment(format);
+                            //预约人数
+                            int count = iUserSubscribeService.count(new LambdaQueryWrapper<UserSubscribe>()
+                                    .eq(UserSubscribe::getSubscribeStatus, 1)
+                                    .eq(UserSubscribe::getExamStatus, 0)
+                                    .eq(UserSubscribe::getApplyId, examApplyGoodsVo.getApplyId()));
+                            examApplyGoodsVo.setSubscribeNum(count);
                         }
                     }
                     switch (examApply.getApplyNature()){

+ 38 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/ExternalQuestionVo.java

@@ -0,0 +1,38 @@
+package com.zhongzheng.modules.course.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author yangdamao
+ * @date 2023年09月12日 8:52
+ */
+@Data
+public class ExternalQuestionVo implements Serializable {
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty("商家ID")
+    private Long merchantId;
+
+    @ApiModelProperty("商品名称")
+    private String goodsName;
+
+    @ApiModelProperty("商家名称")
+    private String merchantName;
+
+    @ApiModelProperty("做题次数")
+    private Integer doNum;
+
+    @ApiModelProperty("商品价格")
+    private BigDecimal goodsPrice;
+
+    @ApiModelProperty("封面地址")
+    private String coverUrl;
+
+}

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/CdUserSubscribeBo.java

@@ -27,6 +27,9 @@ public class CdUserSubscribeBo implements Serializable {
     /** 商品名称 */
     @ApiModelProperty("商品名称")
     private String goodsName;
+    /** 订单商品ID */
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
     /** 业务层次名称 */
     @ApiModelProperty("业务层次名称")
     private String businessName;

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamApplyGoodsVo.java

@@ -43,4 +43,8 @@ public class ExamApplyGoodsVo {
 	private String applyMoment;
 	@ApiModelProperty("考试时间")
 	private Long applyTime;
+	@ApiModelProperty("考场人数")
+	private Integer applyNum;
+	@ApiModelProperty("预约人数")
+	private Integer subscribeNum;
 }

+ 22 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/QuestionOpenBo.java

@@ -0,0 +1,22 @@
+package com.zhongzheng.modules.goods.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年09月12日 17:19
+ */
+@Data
+public class QuestionOpenBo implements Serializable {
+
+    private Long goodsId;
+
+    private List<Long> userSubscribeIds;
+
+    private Long createSysUserId;
+
+    private String createBy;
+}

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsMapper.java

@@ -3,7 +3,9 @@ package com.zhongzheng.modules.goods.mapper;
 import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.course.bo.CourseQueryBo;
+import com.zhongzheng.modules.course.bo.ExternalQuestionBo;
 import com.zhongzheng.modules.course.vo.CourseVo;
+import com.zhongzheng.modules.course.vo.ExternalQuestionVo;
 import com.zhongzheng.modules.exam.bo.ExamNumberGoodsQueryBo;
 import com.zhongzheng.modules.exam.vo.ExamNumberGoodsVo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
@@ -86,4 +88,7 @@ public interface GoodsMapper extends BaseMapper<Goods> {
 
     @InterceptorIgnore(tenantLine = "true")
     List<UserOrderGoodsListVo> getUserOrderGoodsList(Long userId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<ExternalQuestionVo> getExternalQuestion(ExternalQuestionBo bo);
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsService.java

@@ -2,7 +2,9 @@ package com.zhongzheng.modules.goods.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zhongzheng.modules.course.bo.CourseQueryBo;
+import com.zhongzheng.modules.course.bo.ExternalQuestionBo;
 import com.zhongzheng.modules.course.vo.CourseModuleFreeExamVo;
+import com.zhongzheng.modules.course.vo.ExternalQuestionVo;
 import com.zhongzheng.modules.exam.bo.ExamNumberGoodsQueryBo;
 import com.zhongzheng.modules.exam.vo.ExamNumberGoodsVo;
 import com.zhongzheng.modules.goods.bo.*;
@@ -148,4 +150,6 @@ public interface IGoodsService extends IService<Goods> {
 	List<UserOrderGoodsListVo> getUserOrderGoods(UserGoodsListBo bo);
 
 	Map<String,String> checkUserAccount(UserGoodsListBo bo);
+
+    List<ExternalQuestionVo> getExternalQuestion(ExternalQuestionBo bo);
 }

+ 26 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java

@@ -283,6 +283,9 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
     @Value("${liveGotoURL}")
     private String URL_PREFIX;
 
+    @Value("${aliyun.oss.endpoint}")
+    private String OSS_PREFIX;
+
     private static Logger log = LoggerFactory.getLogger(GoodsServiceImpl.class);
 
     @Override
@@ -467,6 +470,19 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
                 goodsVo.setMaxPrice(collect.get(collect.size() - 1).getStandPrice());
             }
         }
+        CourseBusinessQueryBo queryBo = new CourseBusinessQueryBo();
+        queryBo.setId(goodsVo.getBusinessId());
+        String fullName = iCourseBusinessService.queryFullName(queryBo);
+        goodsVo.setErJianErZao(false);
+        goodsVo.setJjShiGongYuan(false);
+        if(Validator.isNotEmpty(fullName)){
+            if(fullName.equals("继续教育二级建造师")||fullName.equals("继续教育二级造价师")){
+                goodsVo.setErJianErZao(true);
+            }
+            if(fullName.contains("继续教育")&&fullName.contains("施工现场专业人员")){
+                goodsVo.setJjShiGongYuan(true);
+            }
+        }
         return goodsVo;
     }
 
@@ -5127,6 +5143,16 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         return map;
     }
 
+    @Override
+    public List<ExternalQuestionVo> getExternalQuestion(ExternalQuestionBo bo) {
+        List<ExternalQuestionVo> questionVos = baseMapper.getExternalQuestion(bo);
+        //商品封面地址前缀 OSS_PREFIX
+        if (CollectionUtils.isNotEmpty(questionVos)){
+            questionVos.forEach(item -> item.setCoverUrl(String.format("%s/%s",OSS_PREFIX,item.getCoverUrl())));
+        }
+        return questionVos;
+    }
+
     private void updateHandoutsId(Long goodsId, Long tenantId, Long handoutsId) {
         baseMapper.updateHandoutsId(goodsId,tenantId,handoutsId);
     }

+ 14 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsSpecTemplateServiceImpl.java

@@ -15,9 +15,11 @@ import com.zhongzheng.modules.activity.domain.ActivityGoodsPrice;
 import com.zhongzheng.modules.activity.service.IActivityGoodsPriceService;
 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.goods.bo.*;
 import com.zhongzheng.modules.goods.domain.*;
@@ -54,6 +56,8 @@ public class GoodsSpecTemplateServiceImpl extends ServiceImpl<GoodsSpecTemplateM
     @Autowired
     public ICourseEducationTypeService courseEducationTypeService;
     @Autowired
+    public ICourseProjectTypeService courseProjectTypeService;
+    @Autowired
     public ICourseBusinessService courseBusinessService;
     @Autowired
     private IActivityGoodsPriceService iActivityGoodsPriceService;
@@ -96,17 +100,25 @@ public class GoodsSpecTemplateServiceImpl extends ServiceImpl<GoodsSpecTemplateM
                             SpecAttrPriceVo priceVo = BeanUtil.toBean(goods,SpecAttrPriceVo.class);
                             priceVo.setSpecAttrIds(x.getSpecAttributeIds());
                             priceVo.setSpecialGoods(0);
-                            priceVo.setSpecialGoods(0);
+                            CourseEducationType educationType = courseEducationTypeService.getById(goods.getEducationTypeId());
+                            priceVo.setEducationName(educationType.getEducationName());
+                            CourseProjectType projectType = courseProjectTypeService.getById(goods.getProjectId());
+                            priceVo.setProjectName(projectType.getProjectName());
                             CourseBusiness business = courseBusinessService.getById(goods.getBusinessId());
+                            priceVo.setBusinessName(business.getBusinessName());
                             if (ObjectUtils.isNotNull(business.getTemplateStatus()) && business.getTemplateStatus() == 1){
                                 priceVo.setTemplateType("class");
                             }
+                            priceVo.setErJianErZao(false);
+                            priceVo.setJjShiGongYuan(false);
                             //商品业务类型
                             String businessName = goodsService.getGoodsBusinessName(x.getGoodsId());
-                            if (businessName.contains("继续教育二级建造师")){
+                            if (businessName.contains("继续教育二级建造师") || businessName.equals("继续教育二级造价师")){
                                 priceVo.setSpecialGoods(1);
+                                priceVo.setErJianErZao(true);
                             }else if (businessName.contains("继续教育") && businessName.contains("施工现场专业人员")){
                                 vo.setSign(1);
+                                priceVo.setJjShiGongYuan(true);
                             }
                             return priceVo;
                         }).collect(Collectors.toList());

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

@@ -397,7 +397,7 @@ public class GoodsUserVo {
 	private Long periodWaitTime;
 	@ApiModelProperty("是否是二建二造")
 	private Boolean erJianErZao;
-	@ApiModelProperty("是否可以预约标识:1未参加考试 2已参加考试 3考试成绩未通过")
+	@ApiModelProperty("是否可以预约标识:1未参加考试 2已参加考试 3考试成绩未通过 4已预约未参加考试")
 	private Integer subscribeSign;
 	/** 学员编码 */
 	@Excel(name = "学员姓名")

+ 10 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/SpecAttrPriceVo.java

@@ -35,8 +35,12 @@ public class SpecAttrPriceVo implements Serializable {
     private Integer goodsType;
     /** 教育类型id */
     private Long educationTypeId;
+    /** 教育类型id */
+    private String educationName;
     /** 业务层次id */
     private Long businessId;
+    /** 业务层次id */
+    private String businessName;
     /** 所属院校 */
     private Long schoolId;
     /** 所属专业 */
@@ -82,7 +86,8 @@ public class SpecAttrPriceVo implements Serializable {
     private String supplyName;
     /** 项目id */
     private Integer projectId;
-
+    /** 项目id */
+    private String projectName;
     /** 试听设置 */
     private String goodsAuditionConfig;
     /** 拍照设置 */
@@ -140,6 +145,10 @@ public class SpecAttrPriceVo implements Serializable {
     private Integer specialGoods;
     /** 模版类型 */
     private String templateType;
+    @ApiModelProperty("是否是继教施工员")
+    private Boolean jjShiGongYuan;
+    @ApiModelProperty("是否是二建二造")
+    private Boolean erJianErZao;
 
 
 }

+ 39 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClientPostAddBo.java

@@ -0,0 +1,39 @@
+package com.zhongzheng.modules.grade.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+
+/**
+ * 班级添加对象 class_grade
+ *
+ * @author ruoyi
+ * @date 2021-11-10
+ */
+@Data
+@ApiModel("班级添加对象")
+public class ClientPostAddBo {
+
+    @ApiModelProperty("请求文本")
+    @NotBlank(message = "请求文本")
+    private String content;
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    @ApiModelProperty("请求文本")
+    @NotBlank(message = "请求文本")
+    private String token;
+
+    @ApiModelProperty("url")
+    @NotBlank(message = "url")
+    private String url;
+}

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

@@ -1,21 +1,16 @@
 package com.zhongzheng.modules.grade.service;
 
-import com.zhongzheng.common.core.domain.AjaxResult;
-import com.zhongzheng.modules.base.bo.UserProfileQueryBo;
-import com.zhongzheng.modules.base.vo.UserProfileExportGaiVo;
 import com.zhongzheng.modules.course.vo.CourseChapterVo;
 import com.zhongzheng.modules.grade.bo.*;
 import com.zhongzheng.modules.grade.domain.ClassGradeUser;
 import com.zhongzheng.modules.grade.vo.*;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zhongzheng.modules.user.bo.UserQueryBo;
-import com.zhongzheng.modules.user.bo.UserStudyRecordQueryBo;
 import com.zhongzheng.modules.user.domain.User;
 
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import java.util.zip.ZipOutputStream;
 
 /**
  * 学员记录Service接口
@@ -70,6 +65,8 @@ public interface IClassGradeUserService extends IService<ClassGradeUser> {
 
 	Map<String,Object> exportWeekPo(ClassGradeUserQueryBo bo);
 
+	String sendClientPost(ClientPostAddBo bo);
+
 
 	/**
 	 * 根据编辑业务对象修改学员记录

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

@@ -36,7 +36,6 @@ import com.zhongzheng.modules.course.vo.CourseBusinessVo;
 import com.zhongzheng.modules.course.vo.CourseChapterVo;
 import com.zhongzheng.modules.course.vo.CourseProjectTypeVo;
 import com.zhongzheng.modules.goods.domain.Goods;
-import com.zhongzheng.modules.goods.domain.GoodsCourse;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.grade.bo.*;
@@ -72,7 +71,6 @@ 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.security.core.token.TokenService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -635,10 +633,10 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
         params.put("bmrq", DateUtils.timestampToDate(bmrq));
         String dataTxt = params.get("zh") + params.get("bh") + params.get("xm") + params.get("sfz") + params.get("dh") + params.get("bmrq");
         log.info("报名信息推送参数"+ dataTxt);
-        String encrypted = dataSign(dataTxt, OFFICIALPUSH_TOKEN);
-        params.put("SignMsg", encrypted);
-        String respone = "";
         try {
+            String encrypted = dataSign(dataTxt, OFFICIALPUSH_TOKEN);
+            params.put("SignMsg", encrypted);
+            String respone = "";
             respone = HttpUtils.postFormBody(OFFICIALPUSH_INFOPATH, params);
             if (Validator.isEmpty(respone)) {
                 return "响应信息空";
@@ -733,6 +731,9 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
         if (Validator.isEmpty(userVo.getRealName()) || Validator.isEmpty(userVo.getIdCard()) || Validator.isEmpty(userVo.getTelPhone())) {
             return "用户信息缺失";
         }
+        if (Validator.isEmpty(userVo.getEduLevel()) || Validator.isEmpty(userVo.getCompanyName()) || Validator.isEmpty(userVo.getSex())) {
+            return "用户详细信息缺失";
+        }
         if (Validator.isEmpty(orderGoods.getSevenYear())) {
             return "商品年份缺失";
         }
@@ -748,12 +749,15 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
         params.put("sfz", userVo.getIdCard());
         params.put("dh", userVo.getTelPhone());
         params.put("bmrq", DateUtils.timestampToDate(bmrq));
-        String dataTxt = params.get("zh") + params.get("bh") + params.get("year") + params.get("xm") + params.get("sfz") + params.get("dh") + params.get("bmrq");
+        params.put("dw", userVo.getCompanyName());
+        params.put("xl", userVo.getEduLevel());
+        params.put("xb", userVo.getSex()==1?"男":"女");
+        String dataTxt = params.get("zh") + params.get("bh") + params.get("year") + params.get("xm") + params.get("sfz") + params.get("dh") + params.get("dw") + params.get("xl") + params.get("xb") + params.get("bmrq");
         log.info("报名信息推送参数"+ dataTxt);
-        String encrypted = dataSign(dataTxt, SEVEN_OFFICIALPUSH_TOKEN);
-        params.put("SignMsg", encrypted);
-        String respone = "";
         try {
+            String encrypted = dataSign(dataTxt, SEVEN_OFFICIALPUSH_TOKEN);
+            params.put("SignMsg", encrypted);
+            String respone = "";
             respone = HttpUtils.postFormBody(OFFICIALPUSH_SEVEN_INFOPATH, params);
             if (Validator.isEmpty(respone)) {
                 return "响应信息空";
@@ -1100,12 +1104,15 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
         params.put("ksrq", DateUtils.timestampToDate(startTime));
         params.put("jsrq", DateUtils.timestampToDate(endTime));
         String dataTxt = params.get("zh") + params.get("bh") + params.get("xm") + params.get("sfz") + params.get("ksrq") + params.get("jsrq");
-        String encrypted = dataSign(dataTxt, OFFICIALPUSH_TOKEN);
-        params.put("SignMsg", encrypted);
-        String respone = "";
-        log.info("学时信息推送参数"+ dataTxt);
         try {
+            String encrypted = dataSign(dataTxt, OFFICIALPUSH_TOKEN);
+            params.put("SignMsg", encrypted);
+            String respone = "";
+            log.info("学时信息推送参数"+ dataTxt);
             respone = HttpUtils.postFormBody(OFFICIALPUSH_PERIODPATH, params);
+            if (Validator.isEmpty(respone)) {
+                return "响应信息空";
+            }
             log.info("学时信息推送参数结果"+ respone);
             String[] split = respone.split("\\|");
             if (split.length < 2) {
@@ -1215,13 +1222,19 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
         params.put("ksrq", DateUtils.timestampToDate(startTime));
         params.put("jsrq", DateUtils.timestampToDate(endTime));
         String dataTxt = params.get("zh") + params.get("bh") + params.get("year") + params.get("xm") + params.get("sfz") + params.get("ksrq") + params.get("jsrq");
-        String encrypted = dataSign(dataTxt, SEVEN_OFFICIALPUSH_TOKEN);
-        params.put("SignMsg", encrypted);
-        String respone = "";
-        log.info("学时信息推送参数"+ dataTxt);
         try {
+            String encrypted = dataSign(dataTxt, SEVEN_OFFICIALPUSH_TOKEN);
+            params.put("SignMsg", encrypted);
+            String respone = "";
+            log.info("学时信息推送参数"+ dataTxt);
             respone = HttpUtils.postFormBody(OFFICIALPUSH_SEVEN_PERIODPATH, params);
+            if (Validator.isEmpty(respone)) {
+                return "响应信息空";
+            }
             log.info("学时信息推送参数结果"+ respone);
+            if(Validator.isEmpty(respone)){
+                return null;
+            }
             String[] split = respone.split("\\|");
             if (split.length < 2) {
                 return "推送接口返回数据错误";
@@ -1434,6 +1447,30 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
         return totalRs;
     }
 
+    @Override
+    public String sendClientPost(ClientPostAddBo bo) {
+        if(Validator.isEmpty(bo.getContent())){
+            throw new CustomException("参数错误");
+        }
+        String respone = "";
+        try {
+            Map<String, String> params = Splitter.on("&").withKeyValueSeparator("=").split(bo.getContent());
+            Map<String, String> head = new HashMap<>();
+            if(Validator.isNotEmpty(bo.getToken())){
+                head.put("token", bo.getToken());
+            }
+            respone = HttpUtils.postFormBodyHeader(bo.getUrl(), params,head);
+            if (Validator.isEmpty(respone)) {
+                return "响应信息空";
+            }
+            return respone;
+
+        } catch (IOException e) {
+            //    throw new CustomException("请求错误");
+            return null;
+        }
+    }
+
     //填充满列表的用户信息
     private Map<String, Object> fillListWeek(List<ClassPeriodStudentExportVo> list) {
         List<ClassPeriodStudentExportWeekAllVo> newList = new ArrayList<>();

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

@@ -540,6 +540,7 @@ public class UserPeriodServiceImpl extends ServiceImpl<UserPeriodMapper, UserPer
             subscribeBo.setUserCard(EncryptHandler.decrypt(user.getIdCard()));
             subscribeBo.setUserPhone(EncryptHandler.decrypt(user.getTelphone()));
             subscribeBo.setUserName(user.getRealname());
+            subscribeBo.setOrderGoodsId(bo.getOrderGoodsId());
             subscribeBo.setGoodsName(goods.getGoodsName());
             CourseBusinessQueryBo courseBusinessQueryBo = new CourseBusinessQueryBo();
             courseBusinessQueryBo.setId(goods.getBusinessId());

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeStudentVo.java

@@ -229,4 +229,6 @@ public class ClassGradeStudentVo {
 	@ApiModelProperty("已消耗前培次数")
 	private Long expendBefore;
 
+	private String sevenYear;
+
 }

+ 12 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassGradeUserVo.java

@@ -160,4 +160,16 @@ public class ClassGradeUserVo {
 	@ApiModelProperty("学习记录同步到老系统时间")
 	private Long toOldTime;
 	private Long orderGoodsId;
+	/** 教育层次 */
+	@cn.afterturn.easypoi.excel.annotation.Excel(name = "教育层次")
+	@ApiModelProperty("教育层次")
+	private String eduLevel;
+	/** 公司名称 */
+	@cn.afterturn.easypoi.excel.annotation.Excel(name = "公司名称")
+	@ApiModelProperty("公司名称")
+	private String companyName;
+	/** 性别 */
+	@cn.afterturn.easypoi.excel.annotation.Excel(name = "性别1男2女")
+	@ApiModelProperty("性别1男2女")
+	private Integer sex;
 }

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

@@ -101,15 +101,16 @@ public class OrderAddBo {
     /** 旧企业ID */
     @ApiModelProperty("旧企业ID")
     private String oldCompanyId;
-
     /** 旧机构ID */
     @ApiModelProperty("旧机构ID")
     private String oldInstitutionId;
-
     @ApiModelProperty("旧客户ID")
     private String oldCustomerId;
-
     /** 培训计划ID */
     @ApiModelProperty("计划ID")
     private Integer planId;
+    @ApiModelProperty("预约订单商品ID")
+    private Long subOrderGoodsId;
+    @ApiModelProperty("新B端题库开通标识")
+    private Integer openQuestionSign;
 }

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderMapper.java

@@ -50,5 +50,5 @@ public interface OrderMapper extends BaseMapper<Order> {
 
     Integer getStudeCountByCode(String sevenCode);
 
-    ClassGrade getClassNameByGoods(@Param("educationTypeId") Long educationTypeId,@Param("projectId") Long projectId,@Param("businessId") Long businessId,@Param("majorId") Long majorId);
+    List<ClassGrade> getClassNameByGoods(@Param("educationTypeId") Long educationTypeId,@Param("projectId") Long projectId,@Param("businessId") Long businessId,@Param("majorId") Long majorId);
 }

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

@@ -2,6 +2,7 @@ package com.zhongzheng.modules.order.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
+import com.zhongzheng.modules.goods.bo.QuestionOpenBo;
 import com.zhongzheng.modules.goods.bo.QuestionOpenImportBo;
 import com.zhongzheng.modules.goods.vo.QuestionOpenImportVo;
 import com.zhongzheng.modules.order.bo.*;
@@ -115,7 +116,7 @@ public interface IOrderService extends IService<Order> {
 
 	List<String> queryBusinessFullNameBySn(String orderSn);
 
-	boolean questionGoodsOpen(questionOpenBo bo);
+	boolean questionGoodsOpen(QuestionOpenBo bo);
 
     Boolean studyCheck(Long orderGoodsId, Long userId);
 

+ 29 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderGoodsServiceImpl.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.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -27,9 +28,12 @@ import com.zhongzheng.modules.course.service.ICourseMenuService;
 import com.zhongzheng.modules.course.service.ICourseSectionService;
 import com.zhongzheng.modules.course.vo.CourseLiveVo;
 import com.zhongzheng.modules.course.vo.CourseVo;
+import com.zhongzheng.modules.exam.bo.ExamApplySiteTimeTwoAddBo;
+import com.zhongzheng.modules.exam.domain.ExamApplySiteTime;
 import com.zhongzheng.modules.exam.domain.ExamApplyUser;
 import com.zhongzheng.modules.exam.domain.ExamBefore;
 import com.zhongzheng.modules.exam.service.IExamApplyGoodsService;
+import com.zhongzheng.modules.exam.service.IExamApplySiteTimeService;
 import com.zhongzheng.modules.exam.service.IExamApplyUserService;
 import com.zhongzheng.modules.exam.service.IExamBeforeService;
 import com.zhongzheng.modules.exam.vo.ExamApplyGoodsVo;
@@ -132,6 +136,9 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
     @Autowired
     private IUserSubscribeService iUserSubscribeService;
 
+    @Autowired
+    private IExamApplySiteTimeService iExamApplySiteTimeService;
+
     @Autowired
     private ICourseMenuService courseMenuService;
 
@@ -662,6 +669,8 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
                                 .last("limit 1"));
                         if (ObjectUtils.isNull(subscribe)){
                             goodsVo.setSubscribeSign(1);
+                        }else if (subscribe.getSubscribeStatus() == 1 && subscribe.getExamStatus() == 0){
+                            goodsVo.setSubscribeSign(4);
                         }else if (ObjectUtils.isNotNull(subscribe.getResult()) && subscribe.getResult() == 0){
                             goodsVo.setSubscribeSign(3);
                         }
@@ -670,6 +679,26 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
                     List<ExamApplyGoodsVo> examApplyGoodsVos = new ArrayList<>();
                     List<ExamApplyGoodsVo> examApplyGoodsVos2 = new ArrayList<>();
                     examApplyGoodsVoList.forEach(examApplyGoodsVo -> {
+                        List<ExamApplySiteTime> siteTimes = iExamApplySiteTimeService.list(new LambdaQueryWrapper<ExamApplySiteTime>()
+                                .eq(ExamApplySiteTime::getApplyId, examApplyGoodsVo.getApplyId()));
+                        if (CollectionUtils.isNotEmpty(siteTimes)){
+                            ExamApplySiteTime timeTime = siteTimes.get(0);
+                            List<ExamApplySiteTimeTwoAddBo> siteTimeTwoAddBos = JSONArray.parseArray(timeTime.getSiteTime(), ExamApplySiteTimeTwoAddBo.class);
+                            ExamApplySiteTimeTwoAddBo twoAddBo = siteTimeTwoAddBos.get(0);
+                            if (ObjectUtils.isNotNull(twoAddBo)){
+                                Long time = timeTime.getExamTime()+28800L;
+                                String format = String.format("%s-%s", twoAddBo.getStartTime(), twoAddBo.getEndTime());
+                                examApplyGoodsVo.setApplyTime(time);
+                                examApplyGoodsVo.setApplyMoment(format);
+                                examApplyGoodsVo.setApplyNum(twoAddBo.getNum().intValue());
+                                //预约人数
+                                int count = iUserSubscribeService.count(new LambdaQueryWrapper<UserSubscribe>()
+                                        .eq(UserSubscribe::getSubscribeStatus, 1)
+                                        .eq(UserSubscribe::getExamStatus, 0)
+                                        .eq(UserSubscribe::getApplyId, examApplyGoodsVo.getApplyId()));
+                                examApplyGoodsVo.setSubscribeNum(count);
+                            }
+                        }
                         LambdaQueryWrapper<ExamApplyUser> lqw = Wrappers.lambdaQuery();
                         lqw.eq(ExamApplyUser::getApplyId, examApplyGoodsVo.getApplyId());
                         List<ExamApplyUser> examApplyUserList = iExamApplyUserService.list(lqw);

+ 26 - 13
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java

@@ -35,10 +35,7 @@ import com.zhongzheng.modules.course.vo.CourseModuleFreeExamVo;
 import com.zhongzheng.modules.distribution.domain.DistributionActivity;
 import com.zhongzheng.modules.distribution.service.IDistributionActivityGoodsService;
 import com.zhongzheng.modules.distribution.service.IDistributionActivityService;
-import com.zhongzheng.modules.goods.bo.GoodsAttachedAddBo;
-import com.zhongzheng.modules.goods.bo.GoodsBankAddBo;
-import com.zhongzheng.modules.goods.bo.GoodsFreeBankAddBo;
-import com.zhongzheng.modules.goods.bo.QuestionOpenImportBo;
+import com.zhongzheng.modules.goods.bo.*;
 import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.domain.GoodsFreeBank;
 import com.zhongzheng.modules.goods.domain.GoodsQuestionRel;
@@ -76,7 +73,6 @@ import com.zhongzheng.modules.top.financial.vo.TopCostTpItemVo;
 import com.zhongzheng.modules.top.financial.vo.TopCostTpVo;
 import com.zhongzheng.modules.top.goods.bo.TopOldOrderAddBo;
 import com.zhongzheng.modules.top.goods.bo.TopOldOrderGoodsAddBo;
-import com.zhongzheng.modules.top.goods.domain.TopOldOrder;
 import com.zhongzheng.modules.top.goods.domain.TopOldOrderCheck;
 import com.zhongzheng.modules.top.goods.domain.TopOldOrderCheckLog;
 import com.zhongzheng.modules.top.goods.service.ITopOldOrderCheckLogService;
@@ -950,11 +946,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         rel.setUpdateTime(DateUtils.getNowTime());
         iGoodsQuestionRelService.save(rel);
         //补充题库商品服务时间
-        setQuestionServiceTime(qsOrderGoodsId,userId);
+        setQuestionServiceTime(orderGoodsId,userId,qsOrderGoodsId);
     }
 
 
-    private void setQuestionServiceTime(Long orderGoodsId,Long userId) {
+    private void setQuestionServiceTime(Long orderGoodsId,Long userId,Long qsOrderGoodsId) {
         UserSubscribe subscribe = iUserSubscribeService.getOne(new LambdaQueryWrapper<UserSubscribe>()
                 .eq(UserSubscribe::getUserId, userId)
                 .eq(UserSubscribe::getOrderGoodsId, orderGoodsId)
@@ -968,7 +964,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         Long examTime = subscribe.getApplySiteExamTime();
         //前推8天
         Long dayBefore = DateUtils.getDayBefore(examTime, 8);
-        OrderGoods orderGoods = iOrderGoodsService.getById(orderGoodsId);
+        OrderGoods orderGoods = iOrderGoodsService.getById(qsOrderGoodsId);
         orderGoods.setServiceStartTime(dayBefore);
         orderGoods.setServiceEndTime(examTime);
         iOrderGoodsService.updateById(orderGoods);
@@ -2419,9 +2415,26 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         //七大员继教同一个专业下同一个班级名称
         Boolean classFlag = true;
         if (businessFull.contains("继续教育") && businessFull.contains("施工现场专业人员")){
-            ClassGrade gradeName = baseMapper.getClassNameByGoods(goods.getEducationTypeId(),goods.getProjectId().longValue(),goods.getBusinessId(),goods.getMajorId());
-            if (ObjectUtils.isNotNull(gradeName)){
-                classGrade.setClassName(gradeName.getClassName());
+            List<ClassGrade> gradeName = baseMapper.getClassNameByGoods(goods.getEducationTypeId(),goods.getProjectId().longValue(),goods.getBusinessId(),goods.getMajorId());
+            if (CollectionUtils.isNotEmpty(gradeName)){
+                ClassGrade grade = gradeName.stream().filter(x -> ObjectUtils.isNotNull(x.getClassStatus()) && x.getClassStatus() == 1).findFirst().orElse(null);
+                if (ObjectUtils.isNotEmpty(grade)){
+                    //存在已开班的班级
+                    classGrade.setClassStatus(grade.getClassStatus());
+                    classGrade.setOfficialName(grade.getOfficialName());
+                    classGrade.setClassName(grade.getClassName());
+                    classGrade.setLearningStatus(grade.getLearningStatus());
+                    if (grade.getLearningStatus() == 3){
+                        classGrade.setLearningTimeStart(grade.getLearningTimeStart());
+                    }
+                    classGrade.setClassStartTime(grade.getClassStartTime());
+                    classGrade.setClassEndTime(grade.getClassEndTime());
+                    classGrade.setInterfacePeriodId(grade.getInterfacePeriodId());
+                    classGrade.setInterfacePushId(grade.getInterfacePushId());
+                }else {
+                    String name = gradeName.stream().findFirst().get().getClassName();
+                    classGrade.setClassName(name);
+                }
                 classFlag = false;
             }
         }
@@ -3124,7 +3137,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean questionGoodsOpen(questionOpenBo bo) {
+    public boolean questionGoodsOpen(QuestionOpenBo bo) {
         //开通校验
         questionGoodsOpenCheck(bo);
         //创建录单信息
@@ -3210,7 +3223,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         return iOrderInputService.save(orderInput);
     }
 
-    private void questionGoodsOpenCheck(questionOpenBo bo) {
+    private void questionGoodsOpenCheck(QuestionOpenBo bo) {
         for (Long userSubscribeId : bo.getUserSubscribeIds()) {
             //校验学员是否已经购买题库
             UserSubscribe userSubscribe = iUserSubscribeService.getById(userSubscribeId);

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

@@ -1862,22 +1862,22 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
         ExamApplySiteTimeTwoAddBo timeTwoVo = new ExamApplySiteTimeTwoAddBo();
         timeTwoVo.setStartTime("09:00");
         timeTwoVo.setEndTime("11:00");
-        timeTwoVo.setNum(50L);
+        timeTwoVo.setNum(60L);
         list.add(timeTwoVo);
         ExamApplySiteTimeTwoAddBo timeTwoVo1 = new ExamApplySiteTimeTwoAddBo();
         timeTwoVo1.setStartTime("11:10");
         timeTwoVo1.setEndTime("13:10");
-        timeTwoVo1.setNum(50L);
+        timeTwoVo1.setNum(60L);
         list.add(timeTwoVo1);
         ExamApplySiteTimeTwoAddBo timeTwoVo2 = new ExamApplySiteTimeTwoAddBo();
         timeTwoVo2.setStartTime("14:00");
         timeTwoVo2.setEndTime("16:00");
-        timeTwoVo2.setNum(50L);
+        timeTwoVo2.setNum(60L);
         list.add(timeTwoVo2);
         ExamApplySiteTimeTwoAddBo timeTwoVo3 = new ExamApplySiteTimeTwoAddBo();
         timeTwoVo3.setStartTime("16:10");
         timeTwoVo3.setEndTime("18:10");
-        timeTwoVo3.setNum(50L);
+        timeTwoVo3.setNum(60L);
         list.add(timeTwoVo3);
         return list;
     }

+ 18 - 0
zhongzheng-system/src/main/resources/mapper/modules/goods/GoodsMapper.xml

@@ -799,6 +799,24 @@
           AND og.tenant_id = #{tenantId}
     </select>
 
+    <select id="getExternalQuestion" parameterType="com.zhongzheng.modules.course.bo.ExternalQuestionBo" resultType="com.zhongzheng.modules.course.vo.ExternalQuestionVo">
+        SELECT
+            g.goods_id,
+            qm.merchant_id,
+            g.goods_name,
+            qm.merchant_name,
+            qm.do_num,
+            g.stand_price AS goodsPrice,
+            g.cover_url
+        FROM
+            question_merchant qm
+                LEFT JOIN goods g ON qm.merchant_id = g.question_merchant_id
+        WHERE
+            qm.`status` = 1
+          AND qm.tenant_id = #{tenantId}
+          AND g.`status` = 1
+    </select>
+
     <select id="queryGoodsByIdTenant" parameterType="map" resultType="com.zhongzheng.modules.goods.domain.Goods">
         SELECT *
         FROM `goods`

+ 2 - 0
zhongzheng-system/src/main/resources/mapper/modules/grade/ClassGradeMapper.xml

@@ -170,6 +170,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="reason" column="reason"/>
         <result property="projectName" column="project_name"/>
         <result property="businessName" column="business_name"/>
+        <result property="sevenYear" column="seven_year"/>
 
         <result property="userBindWx" column="user_bind_wx"/>
         <result property="userFollowWx" column="user_follow_wx"/>
@@ -426,6 +427,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         og.service_end_time,
         g.goods_name,
         og.order_sn,
+        og.seven_year,
         m.category_name,
         g.major_id,
         u.province,

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

@@ -67,6 +67,9 @@
         <result property="toOldResult" column="to_old_result"/>
         <result property="toOldTime" column="to_old_time"/>
         <result property="orderGoodsId" column="order_goods_id"/>
+        <result property="sex" column="sex"/>
+        <result property="eduLevel" column="edu_level"/>
+        <result property="companyName" column="company_name"/>
     </resultMap>
 
 
@@ -247,6 +250,9 @@
         u.realname,
         u.id_card,
         u.telphone,
+        u.sex,
+        u.edu_level,
+        u.company_name,
         cg.class_name,
         cg.official_name,
         cg.class_status,

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

@@ -513,6 +513,5 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                       AND cgu.change_grade = 0
                 ) + ( SELECT COUNT( DISTINCT cgut.user_id ) FROM class_grade_user_temp cgut WHERE cgut.grade_id = cg.grade_id AND cgut.`status` = 1 )
             ) <![CDATA[ < ]]>  cg.student_upper
-            LIMIT 1
     </select>
 </mapper>

+ 2 - 2
zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyRecordMapper.xml

@@ -828,7 +828,7 @@
             </otherwise>
         </choose>
         <if test="orderGoodsId != null and orderGoodsId != '' ">
-            AND up.order_goods_id =  #{orderGoodsId}
+            AND (up.order_goods_id =  #{orderGoodsId} or up.order_goods_id is null)
         </if>
         AND up.user_id = #{userId}
     </select>
@@ -905,7 +905,7 @@
             and up.type = 3
         </if>
         <if test="orderGoodsId != null and orderGoodsId != '' ">
-            AND up.order_goods_id =  #{orderGoodsId}
+            AND (up.order_goods_id =  #{orderGoodsId} or up.order_goods_id is null)
         </if>
         AND up.user_id = #{userId}
     </select>