yangdamao 2 роки тому
батько
коміт
2f70577e08
18 змінених файлів з 383 додано та 129 видалено
  1. 14 0
      zhongzheng-admin-data/src/main/java/com/zhongzheng/controller/UserSubscribeController.java
  2. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/bo/BatchCancelSubscribeBo.java
  3. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/bo/BatchSubscribeBo.java
  4. 29 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/bo/CdExamSubscribeBo.java
  5. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/bo/CdUserExamSubscribeQueryBo.java
  6. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/bo/CdUserSubscribeBo.java
  7. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/domain/CdExamErrorLog.java
  8. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/domain/CdExamSubscribe.java
  9. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/domain/CdUserSubscribe.java
  10. 2 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/mapper/CdUserSubscribeMapper.java
  11. 7 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/service/ICdUserSubscribeService.java
  12. 0 112
      zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/service/impl/CdCdUserSubscribeServiceImpl.java
  13. 78 9
      zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/service/impl/CdExamRoomServiceImpl.java
  14. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/service/impl/CdExamSiteServiceImpl.java
  15. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/service/impl/CdExamSubscribeServiceImpl.java
  16. 193 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/service/impl/CdUserSubscribeServiceImpl.java
  17. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/vo/CdUserExamSubscribeVo.java
  18. 21 3
      zhongzheng-system/src/main/resources/mapper/modules/middleground/CdUserSubscribeMapper.xml

+ 14 - 0
zhongzheng-admin-data/src/main/java/com/zhongzheng/controller/UserSubscribeController.java

@@ -2,6 +2,7 @@ package com.zhongzheng.controller;
 
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.modules.middleground.record.bo.CdExamSubscribeBo;
 import com.zhongzheng.modules.middleground.record.bo.CdUserSubscribeBo;
 import com.zhongzheng.modules.middleground.record.bo.CdUserSubscribeUpdateBo;
 import com.zhongzheng.modules.middleground.record.service.ICdUserSubscribeService;
@@ -38,4 +39,17 @@ public class UserSubscribeController extends BaseController {
         return toAjax(userSubscribeService.updateUserSubscribe(bo)?1:0);
     }
 
+    @ApiOperation("新增用户考试预约")
+    @PostMapping("/save/exam")
+    public AjaxResult<Void> saveUserExamSubscribe(@RequestBody CdExamSubscribeBo bo) {
+        return toAjax(userSubscribeService.saveExamSubscribe(bo)?1:0);
+    }
+
+    @ApiOperation("取消用户考试预约")
+    @PostMapping("/update/exam")
+    public AjaxResult<Void> updateUserExamSubscribe(@RequestBody CdExamSubscribeBo bo) {
+        return toAjax(userSubscribeService.updateUserExamSubscribe(bo)?1:0);
+    }
+
+
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/bo/BatchCancelSubscribeBo.java

@@ -16,4 +16,7 @@ public class BatchCancelSubscribeBo implements Serializable {
     @ApiModelProperty("学员预约ID")
     private List<Long> userSubscribeIds;
 
+    @ApiModelProperty("接口标识:1新系统C端取消预约推送")
+    private Integer sign;
+
 }

+ 7 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/bo/BatchSubscribeBo.java

@@ -5,6 +5,7 @@ import lombok.Data;
 
 import java.io.Serializable;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author yangdamao
@@ -18,4 +19,10 @@ public class BatchSubscribeBo implements Serializable {
 
     @ApiModelProperty("考试ID")
     private Long examId;
+
+    @ApiModelProperty("接口标识:1新系统C端预约推送")
+    private Integer sign;
+
+    @ApiModelProperty("学员座位号map")
+    private Map<Long,String> seatNumberMap;
 }

+ 29 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/bo/CdExamSubscribeBo.java

@@ -0,0 +1,29 @@
+package com.zhongzheng.modules.middleground.record.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年09月14日 11:23
+ */
+@Data
+public class CdExamSubscribeBo implements Serializable {
+
+    private Long userId;
+
+    private Long orderGoodsId;
+
+    private Long examApplyId;
+
+    private Long tenantId;
+
+    private Integer dataFrom;
+
+    private Integer type;
+
+    private Integer sign;
+
+    private Integer seatNumber;
+}

+ 7 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/bo/CdUserExamSubscribeQueryBo.java

@@ -64,4 +64,11 @@ public class CdUserExamSubscribeQueryBo implements Serializable {
     private String userCard;
 
     private List<String> userCardList;
+
+    @ApiModelProperty("旧企业ID")
+    private String oldCompanyId;
+    @ApiModelProperty("旧机构ID")
+    private String oldInstitutionId;
+    @ApiModelProperty("旧客户ID")
+    private String oldCustomerId;
 }

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/bo/CdUserSubscribeBo.java

@@ -57,4 +57,10 @@ public class CdUserSubscribeBo implements Serializable {
     /** 公司名称 */
     @ApiModelProperty("公司名称")
     private String companyName;
+    @ApiModelProperty("旧企业ID")
+    private String oldCompanyId;
+    @ApiModelProperty("旧机构ID")
+    private String oldInstitutionId;
+    @ApiModelProperty("旧客户ID")
+    private String oldCustomerId;
 }

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/domain/CdExamErrorLog.java

@@ -23,7 +23,7 @@ public class CdExamErrorLog implements Serializable {
 
     @TableId(value = "id")
     private Long id;
-    /** 类型:1预约考试 */
+    /** 类型:1预约考试 2取消预约考试*/
     private Integer type;
     /** 备注 */
     private String remark;

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/domain/CdExamSubscribe.java

@@ -37,6 +37,8 @@ public class CdExamSubscribe implements Serializable {
     private String userPhone;
     /** 预约状态:1正常 2取消 3过期 */
     private Integer subscribeStatus;
+    /** 考场座位号 */
+    private String seatNumber;
     /** 报送时间 */
     private Long submissionTime;
     /** 是否签署承诺书 0 未签署 1已签署 */

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/domain/CdUserSubscribe.java

@@ -64,5 +64,11 @@ public class CdUserSubscribe implements Serializable {
     private String companyName;
     /** 有效状态:0有效 1无效 */
     private Integer exitType;
+    /** 旧企业ID */
+    private String oldCompanyId;
+    /** 旧机构ID */
+    private String oldInstitutionId;
+    /** 旧客户ID */
+    private String oldCustomerId;
 
 }

+ 2 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/mapper/CdUserSubscribeMapper.java

@@ -3,11 +3,12 @@ package com.zhongzheng.modules.middleground.record.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.middleground.record.bo.CdUserExamSubscribeQueryBo;
 import com.zhongzheng.modules.middleground.record.domain.CdUserSubscribe;
+import com.zhongzheng.modules.middleground.record.vo.CdUserExamSubscribeVo;
 
 import java.util.List;
 
 public interface CdUserSubscribeMapper extends BaseMapper<CdUserSubscribe> {
 
-    List<CdUserSubscribe> getUserSubscribeList(CdUserExamSubscribeQueryBo bo);
+    List<CdUserExamSubscribeVo> getUserSubscribeList(CdUserExamSubscribeQueryBo bo);
 
 }

+ 7 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/service/ICdUserSubscribeService.java

@@ -1,10 +1,12 @@
 package com.zhongzheng.modules.middleground.record.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.middleground.record.bo.CdExamSubscribeBo;
 import com.zhongzheng.modules.middleground.record.bo.CdUserExamSubscribeQueryBo;
 import com.zhongzheng.modules.middleground.record.bo.CdUserSubscribeBo;
 import com.zhongzheng.modules.middleground.record.bo.CdUserSubscribeUpdateBo;
 import com.zhongzheng.modules.middleground.record.domain.CdUserSubscribe;
+import com.zhongzheng.modules.middleground.record.vo.CdUserExamSubscribeVo;
 
 import java.util.List;
 
@@ -14,5 +16,9 @@ public interface ICdUserSubscribeService extends IService<CdUserSubscribe> {
 
     boolean updateUserSubscribe(CdUserSubscribeUpdateBo bo);
 
-    List<CdUserSubscribe> getUserSubscribeList(CdUserExamSubscribeQueryBo bo);
+    List<CdUserExamSubscribeVo> getUserSubscribeList(CdUserExamSubscribeQueryBo bo);
+
+    boolean saveExamSubscribe(CdExamSubscribeBo bo);
+
+    boolean updateUserExamSubscribe(CdExamSubscribeBo bo);
 }

+ 0 - 112
zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/service/impl/CdCdUserSubscribeServiceImpl.java

@@ -1,112 +0,0 @@
-package com.zhongzheng.modules.middleground.record.service.impl;
-
-import cn.hutool.core.bean.BeanUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.zhongzheng.common.exception.CustomException;
-import com.zhongzheng.modules.middleground.record.bo.CdUserExamSubscribeQueryBo;
-import com.zhongzheng.modules.middleground.record.bo.CdUserSubscribeBo;
-import com.zhongzheng.modules.middleground.record.bo.CdUserSubscribeUpdateBo;
-import com.zhongzheng.modules.middleground.record.domain.CdUserSubscribe;
-import com.zhongzheng.modules.middleground.record.mapper.CdUserSubscribeMapper;
-import com.zhongzheng.modules.middleground.record.service.ICdUserSubscribeService;
-import com.zhongzheng.modules.middleground.tenant.domain.DataTenant;
-import com.zhongzheng.modules.middleground.tenant.service.IDataTenantService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-/**
- * @author yangdamao
- * @date 2023年07月17日 9:44
- */
-@Service
-public class CdCdUserSubscribeServiceImpl extends ServiceImpl<CdUserSubscribeMapper, CdUserSubscribe> implements ICdUserSubscribeService {
-
-    @Autowired
-    private IDataTenantService dataTenantService;
-
-    @Override
-    public boolean saveUserSubscribe(CdUserSubscribeBo bo) {
-        CdUserSubscribe cdUserSubscribe = BeanUtil.toBean(bo, CdUserSubscribe.class);
-        //机构信息
-        cdUserSubscribe.setTenantId(getNewTenantId(bo.getTenantId(),bo.getDataFrom()));
-        return save(cdUserSubscribe);
-    }
-
-    @Override
-    public boolean updateUserSubscribe(CdUserSubscribeUpdateBo bo) {
-        CdUserSubscribe cdUserSubscribe = getOne(new LambdaQueryWrapper<CdUserSubscribe>()
-                .eq( CdUserSubscribe::getUserId, bo.getUserId())
-                .eq( CdUserSubscribe::getUserCard, bo.getUserCard())
-                .eq( CdUserSubscribe::getMajor, bo.getMajor())
-                .eq(CdUserSubscribe::getTenantId, getNewTenantId(bo.getTenantId(),bo.getDataFrom()))
-                .eq(CdUserSubscribe::getDataFrom, bo.getDataFrom())
-                .last("limit 1"));
-        if (ObjectUtils.isNull(cdUserSubscribe)){
-            throw new CustomException("用户信息不匹配,请检查!");
-        }
-        if (ObjectUtils.isNotNull(bo.getExamNum())){
-            cdUserSubscribe.setExamNum(bo.getExamNum());
-        }
-        if (ObjectUtils.isNotNull(bo.getReplenishExamNum())){
-            cdUserSubscribe.setReplenishExamNum(bo.getReplenishExamNum());
-        }
-        if (ObjectUtils.isNotNull(bo.getDoQuestionNum())){
-            cdUserSubscribe.setDoQuestionNum(bo.getDoQuestionNum());
-        }
-        if (ObjectUtils.isNotNull(bo.getQuestionMerchant())){
-            cdUserSubscribe.setQuestionMerchant(bo.getQuestionMerchant());
-        }
-
-        return updateById(cdUserSubscribe);
-    }
-
-    @Override
-    public List<CdUserSubscribe> getUserSubscribeList(CdUserExamSubscribeQueryBo bo) {
-        return baseMapper.getUserSubscribeList(bo);
-    }
-
-    /**
-     * 获取机构ID
-     * @author change
-     * @date 2023/7/17 10:13
-     * @param tenantId
-     * @return java.lang.Long
-     */
-    private Long getNewTenantId(Long tenantId,Integer dataFrom){
-        LambdaQueryWrapper<DataTenant> queryWrapper = new LambdaQueryWrapper<>();
-        if (dataFrom == 1){
-            //新系统
-            queryWrapper.eq(DataTenant::getNewId,tenantId);
-        }else {
-            //旧系统
-            queryWrapper.eq(DataTenant::getOldId,tenantId);
-        }
-        DataTenant tenant = dataTenantService.getOne(queryWrapper);
-        if (ObjectUtils.isNull(tenant)){
-            throw new CustomException("机构信息不匹配,请检查!");
-        }
-        return tenant.getTenantId();
-    }
-
-    /**
-     * 获取机构信息
-     * @author change
-     * @date 2023/7/17 10:13
-     * @param tenantId
-     * @return java.lang.Long
-     */
-    private DataTenant getNewTenant(Long tenantId){
-        DataTenant tenant = dataTenantService.getOne(new LambdaQueryWrapper<DataTenant>()
-                .eq(DataTenant::getNewId, tenantId)
-                .or().eq(DataTenant::getOldId, tenantId)
-                .last("limit 1"));
-        if (ObjectUtils.isNull(tenant)){
-            throw new CustomException("机构信息不匹配,请检查!");
-        }
-        return tenant;
-    }
-}

+ 78 - 9
zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/service/impl/CdExamRoomServiceImpl.java

@@ -30,6 +30,9 @@ import org.springframework.transaction.annotation.Transactional;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import static java.util.stream.Collectors.toCollection;
+import static java.util.stream.IntStream.rangeClosed;
+
 @Service
 public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamRoom> implements ICdExamRoomService {
 
@@ -118,11 +121,13 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
         if (ObjectUtils.isNotNull(bo.getTenantId())){
            bo.setTenantId(getTenantId(bo.getTenantId()));
         }
+        String before = getExamConfig("exam_before", 1,bo.getTenantId());
         List<CdExamRoom> cdExamRoomList = list(new LambdaQueryWrapper<CdExamRoom>()
                 .eq(ObjectUtils.isNotNull(bo.getTenantId()), CdExamRoom::getTenantId, bo.getTenantId())
                 .eq(ObjectUtils.isNotNull(bo.getApplyTime()), CdExamRoom::getExamTime, bo.getApplyTime())
                 .eq(CdExamRoom::getType,1)
                 .eq(CdExamRoom::getStatus,1)
+                .gt(CdExamRoom::getExamTime,getApplyAfterTime(DateUtils.getNowTime(), Integer.valueOf(before)))
                 .eq(ObjectUtils.isNotNull(bo.getApplyStartTime()), CdExamRoom::getExamStartTime, bo.getApplyStartTime())
                 .eq(ObjectUtils.isNotNull(bo.getApplyEndTime()), CdExamRoom::getExamEndTime, bo.getApplyEndTime()));
         if (CollectionUtils.isEmpty(cdExamRoomList)) {
@@ -237,16 +242,15 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
         if (StringUtils.isNotBlank(bo.getUserCard())){
             bo.setUserCardList(Arrays.stream(bo.getUserCard().split(",")).collect(Collectors.toList()));
         }
-        List<CdUserSubscribe> userSubscribe = cdUserSubscribeService.getUserSubscribeList(bo);
+        List<CdUserExamSubscribeVo> userSubscribe = cdUserSubscribeService.getUserSubscribeList(bo);
         if (CollectionUtils.isEmpty(userSubscribe)){
             return new ArrayList<>();
         }
         //考试信息
-        List<CdUserExamSubscribeVo> list = userSubscribe.stream().map(item -> {
-            CdUserExamSubscribeVo examSubscribeVo = BeanUtil.toBean(item, CdUserExamSubscribeVo.class);
+        userSubscribe.forEach(examSubscribeVo -> {
             CdExamSubscribe cdExamSubscribe = cdExamSubscribeService
                     .getOne(new LambdaQueryWrapper<CdExamSubscribe>()
-                    .eq(CdExamSubscribe::getUserSubscribeId, item.getId())
+                    .eq(CdExamSubscribe::getUserSubscribeId, examSubscribeVo.getId())
                     .eq(CdExamSubscribe::getStatus, 1)
                     .orderByDesc(CdExamSubscribe::getCreateTime)
                     .last("limit 1"));
@@ -270,6 +274,15 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
                             examSubscribeVo.setCertificateCode(cdExamSubscribe.getCertificateCode());
                             examSubscribeVo.setCertificateUrl(cdExamSubscribe.getCertificateUrl());
                         }
+
+                        Long tenantId = examRoom.getTenantId();
+                        Long time = examRoom.getExamTime();
+                        String before = getExamConfig("exam_before", 1,tenantId);
+                        Long applyBeforeTime = getApplyBeforeTime(time, Integer.valueOf(before));
+                        if (DateUtils.getNowTime() >= applyBeforeTime){
+                            //考试前7个工作日不可取消预约
+                            examSubscribeVo.setSubscribeSign(1);
+                        }
                         break;
                     case 2://取消
                         examSubscribeVo.setSubscribeStatus(2);
@@ -284,9 +297,8 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
                 Long num = cdExamSubscribeService.getReplenishNum(cdExamSubscribe.getUserId(),cdExamSubscribe.getExamMajor(),cdExamSubscribe.getTenantId());
                 examSubscribeVo.setReplenishNum(num);
             }
-            return examSubscribeVo;
-        }).collect(Collectors.toList());
-        return list;
+        });
+        return userSubscribe;
     }
 
     @Override
@@ -310,7 +322,14 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
             subscribe.setDataFrom(userSubscribe.getDataFrom());
             subscribe.setTenantId(userSubscribe.getTenantId());
             subscribe.setType(userSubscribe.getType());
-
+            if (CollectionUtils.isNotEmpty(bo.getSeatNumberMap())){
+                String number = bo.getSeatNumberMap().get(userSubscribeId);
+                subscribe.setSeatNumber(number);
+            }else {
+                //生成座位号
+                Integer seatNumber = getSeatNumber(bo.getExamId());
+                subscribe.setSeatNumber(seatNumber.toString());
+            }
             //是否是新考
             int count = cdExamSubscribeService.count(new LambdaQueryWrapper<CdExamSubscribe>()
                     .eq(CdExamSubscribe::getUserId, userSubscribe.getUserId())
@@ -327,6 +346,11 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
         }
         cdExamSubscribeService.saveBatch(resultList);
 
+        if (ObjectUtils.isNotNull(bo.getSign()) && bo.getSign() == 1){
+            //新系统C端预约推送过来
+            return;
+        }
+
         //todo 新旧系统学员预约处理
         Map<Integer, List<CdExamSubscribe>> collect = resultList.stream().collect(Collectors.groupingBy(CdExamSubscribe::getDataFrom));
         collect.forEach((k,v) -> {
@@ -373,6 +397,35 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
         });
     }
 
+    private Integer getSeatNumber(Long examId) {
+        List<CdExamSubscribe> list = cdExamSubscribeService
+                .list(new LambdaQueryWrapper<CdExamSubscribe>()
+                .eq(CdExamSubscribe::getExamId, examId)
+                .eq(CdExamSubscribe::getSubscribeStatus, 1));
+        if (CollectionUtils.isEmpty(list)){
+            return 1;
+        }
+        Integer userNum = getById(examId).getExamNum();
+        if (list.size() >= userNum){
+            throw new CustomException("本场考试已预约满,请选择其他场次!");
+        }
+        if (list.stream().allMatch(x -> ObjectUtils.isNull(x.getSeatNumber()))){
+            return 1;
+        }
+
+        List<Integer> nums = list.stream().map(x -> Integer.valueOf(x.getSeatNumber())).collect(Collectors.toList());
+        SortedSet<Integer> set = new TreeSet<Integer>(nums);
+        TreeSet<Integer> collect = rangeClosed(1, set.last()).boxed()
+                .filter(i -> !set.contains(i))
+                .collect(toCollection(TreeSet::new));
+        if (CollectionUtils.isNotEmpty(collect)){
+            Integer num = collect.stream().sorted(Comparator.comparing(o -> o)).findFirst().get();
+            return num;
+        }
+        Integer integer = nums.stream().max(Comparator.comparing(o -> o)).get();
+        return integer + 1;
+    }
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -402,6 +455,12 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
         });
         cdExamSubscribeService.updateBatchById(subscribeList);
 
+        if (ObjectUtils.isNotNull(bo.getSign()) && bo.getSign() == 1){
+            //新系统C端取消预约推送过来
+            return;
+        }
+
+
         //todo 新旧系统取消预约处理
         Map<Integer, List<CdExamSubscribe>> map = subscribeList.stream().collect(Collectors.groupingBy(CdExamSubscribe::getDataFrom));
         map.forEach((k,v) -> {
@@ -435,7 +494,7 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
                             log.setTenantId(item.getTenantId());
                             log.setRemark(String.format("学员:%s,身份证:%s,预约专业:%s,预约表数据ID:%s",item.getUserName(),item.getUserCard(),item.getExamMajor(),item.getId()));
                             log.setErrorLog(e.getMessage());
-                            log.setType(1);//预约考试错误
+                            log.setType(2);//预约考试错误
                             cdExamErrorLogService.save(log);
                         }
                     });
@@ -512,6 +571,13 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
             if (ObjectUtils.isNull(subscribe)){
                 continue;
             }
+            List<CdExamSubscribe> list = cdExamSubscribeService
+                    .list(new LambdaQueryWrapper<CdExamSubscribe>()
+                            .eq(CdExamSubscribe::getExamId, bo.getExamId())
+                            .eq(CdExamSubscribe::getSubscribeStatus, 1));
+            if (list.size() >= courseRoom.getExamNum()){
+                throw new CustomException("本场考试已预约满,请选择其他场次!");
+            }
             CdUserSubscribe userSubscribe = cdUserSubscribeService.getById(userSubscribeId);
             if (subscribe.getExamStatus() == 0){
                 //考试成绩没出
@@ -655,6 +721,9 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
      * @return java.lang.String
      */
     private String getExamConfig(String key,Integer type,Long tenantId){
+        if (ObjectUtils.isNull(tenantId)){
+            tenantId = 1L;
+        }
         CdExamConfig config = cdExamConfigService
                 .getOne(new LambdaQueryWrapper<CdExamConfig>()
                 .eq(CdExamConfig::getConfigKey, key)

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/service/impl/CdCdExamSiteServiceImpl.java → zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/service/impl/CdExamSiteServiceImpl.java

@@ -11,5 +11,5 @@ import org.springframework.stereotype.Service;
  * @date 2023年07月17日 9:44
  */
 @Service
-public class CdCdExamSiteServiceImpl extends ServiceImpl<CdExamSiteMapper, CdExamSite> implements ICdExamSiteService {
+public class CdExamSiteServiceImpl extends ServiceImpl<CdExamSiteMapper, CdExamSite> implements ICdExamSiteService {
 }

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/service/impl/CdCdExamSubscribeServiceImpl.java → zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/service/impl/CdExamSubscribeServiceImpl.java

@@ -11,7 +11,7 @@ import org.springframework.stereotype.Service;
  * @date 2023年07月17日 9:44
  */
 @Service
-public class CdCdExamSubscribeServiceImpl extends ServiceImpl<CdExamSubscribeMapper, CdExamSubscribe> implements ICdExamSubscribeService {
+public class CdExamSubscribeServiceImpl extends ServiceImpl<CdExamSubscribeMapper, CdExamSubscribe> implements ICdExamSubscribeService {
     @Override
     public Long getReplenishNum(Long userId, String examMajor,Long tenantId) {
         return baseMapper.getReplenishNum(userId, examMajor,tenantId);

+ 193 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/service/impl/CdUserSubscribeServiceImpl.java

@@ -0,0 +1,193 @@
+package com.zhongzheng.modules.middleground.record.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.modules.middleground.record.bo.*;
+import com.zhongzheng.modules.middleground.record.domain.CdExamRoom;
+import com.zhongzheng.modules.middleground.record.domain.CdUserSubscribe;
+import com.zhongzheng.modules.middleground.record.mapper.CdUserSubscribeMapper;
+import com.zhongzheng.modules.middleground.record.service.ICdExamRoomService;
+import com.zhongzheng.modules.middleground.record.service.ICdUserSubscribeService;
+import com.zhongzheng.modules.middleground.record.vo.CdUserExamSubscribeVo;
+import com.zhongzheng.modules.middleground.tenant.domain.DataTenant;
+import com.zhongzheng.modules.middleground.tenant.service.IDataTenantService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月17日 9:44
+ */
+@Service
+public class CdUserSubscribeServiceImpl extends ServiceImpl<CdUserSubscribeMapper, CdUserSubscribe> implements ICdUserSubscribeService {
+
+    @Autowired
+    private IDataTenantService dataTenantService;
+
+    @Autowired
+    private ICdExamRoomService cdExamRoomService;
+
+    @Override
+    public boolean saveUserSubscribe(CdUserSubscribeBo bo) {
+        CdUserSubscribe userSubscribe = getOne(new LambdaQueryWrapper<CdUserSubscribe>().eq(CdUserSubscribe::getUserId, bo.getUserId())
+                .eq(CdUserSubscribe::getOrderGoodsId, bo.getOrderGoodsId())
+                .eq(CdUserSubscribe::getStatus, 1));
+        if (ObjectUtils.isNotNull(userSubscribe)){
+            //已经存在,不重复添加
+            return true;
+        }
+        CdUserSubscribe cdUserSubscribe = BeanUtil.toBean(bo, CdUserSubscribe.class);
+        //机构信息
+        cdUserSubscribe.setTenantId(getNewTenantId(bo.getTenantId(),bo.getDataFrom()));
+        return save(cdUserSubscribe);
+    }
+
+    @Override
+    public boolean updateUserSubscribe(CdUserSubscribeUpdateBo bo) {
+        CdUserSubscribe cdUserSubscribe = getOne(new LambdaQueryWrapper<CdUserSubscribe>()
+                .eq( CdUserSubscribe::getUserId, bo.getUserId())
+                .eq( CdUserSubscribe::getUserCard, bo.getUserCard())
+                .eq( CdUserSubscribe::getMajor, bo.getMajor())
+                .eq(CdUserSubscribe::getTenantId, getNewTenantId(bo.getTenantId(),bo.getDataFrom()))
+                .eq(CdUserSubscribe::getDataFrom, bo.getDataFrom())
+                .last("limit 1"));
+        if (ObjectUtils.isNull(cdUserSubscribe)){
+            throw new CustomException("用户信息不匹配,请检查!");
+        }
+        if (ObjectUtils.isNotNull(bo.getExamNum())){
+            cdUserSubscribe.setExamNum(bo.getExamNum());
+        }
+        if (ObjectUtils.isNotNull(bo.getReplenishExamNum())){
+            cdUserSubscribe.setReplenishExamNum(bo.getReplenishExamNum());
+        }
+        if (ObjectUtils.isNotNull(bo.getDoQuestionNum())){
+            cdUserSubscribe.setDoQuestionNum(bo.getDoQuestionNum());
+        }
+        if (ObjectUtils.isNotNull(bo.getQuestionMerchant())){
+            cdUserSubscribe.setQuestionMerchant(bo.getQuestionMerchant());
+        }
+
+        return updateById(cdUserSubscribe);
+    }
+
+    @Override
+    public List<CdUserExamSubscribeVo> getUserSubscribeList(CdUserExamSubscribeQueryBo bo) {
+        return baseMapper.getUserSubscribeList(bo);
+    }
+
+    @Override
+    public boolean saveExamSubscribe(CdExamSubscribeBo bo) {
+        CdUserSubscribe userSubscribe = getOne(new LambdaQueryWrapper<CdUserSubscribe>()
+                .eq(CdUserSubscribe::getUserId, bo.getUserId())
+                .eq(CdUserSubscribe::getOrderGoodsId, bo.getOrderGoodsId()));
+        if (ObjectUtils.isNull(userSubscribe)){
+            throw new CustomException("学员学习记录查询不到,请检查");
+        }
+        LambdaQueryWrapper<CdExamRoom> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CdExamRoom::getStatus,1);
+        queryWrapper.eq(CdExamRoom::getType,bo.getType());
+        queryWrapper.eq(CdExamRoom::getTenantId,getNewTenantId(bo.getTenantId(),bo.getDataFrom()));
+        if (bo.getDataFrom() == 1){
+            queryWrapper.eq(CdExamRoom::getNewSignId,bo.getExamApplyId());
+        }
+        if (bo.getDataFrom() == 2){
+            queryWrapper.eq(CdExamRoom::getOldSignId,bo.getExamApplyId());
+        }
+        CdExamRoom examRoom = cdExamRoomService.getOne(queryWrapper);
+        if (ObjectUtils.isNull(examRoom)){
+            throw new CustomException("考试信息查询不到,请检查");
+        }
+        //新建考试预约记录
+        BatchSubscribeBo subscribeBo = new BatchSubscribeBo();
+        subscribeBo.setExamId(examRoom.getExamId());
+        subscribeBo.setUserSubscribeIds(Arrays.asList(userSubscribe.getId()));
+        subscribeBo.setSign(bo.getSign());
+        if (ObjectUtils.isNotNull(bo.getSeatNumber())){
+            Map<Long,String> map = new HashMap<>();
+            map.put(userSubscribe.getId(),bo.getSeatNumber().toString());
+            subscribeBo.setSeatNumberMap(map);
+        }
+        cdExamRoomService.batchSubscribe(subscribeBo);
+        return true;
+    }
+
+    @Override
+    public boolean updateUserExamSubscribe(CdExamSubscribeBo bo) {
+        CdUserSubscribe userSubscribe = getOne(new LambdaQueryWrapper<CdUserSubscribe>()
+                .eq(CdUserSubscribe::getUserId, bo.getUserId())
+                .eq(CdUserSubscribe::getOrderGoodsId, bo.getOrderGoodsId()));
+        if (ObjectUtils.isNull(userSubscribe)){
+            throw new CustomException("学员学习记录查询不到,请检查");
+        }
+        LambdaQueryWrapper<CdExamRoom> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CdExamRoom::getStatus,1);
+        queryWrapper.eq(CdExamRoom::getType,bo.getType());
+        queryWrapper.eq(CdExamRoom::getTenantId,getNewTenantId(bo.getTenantId(),bo.getDataFrom()));
+        if (bo.getDataFrom() == 1){
+            queryWrapper.eq(CdExamRoom::getNewSignId,bo.getExamApplyId());
+        }
+        if (bo.getDataFrom() == 2){
+            queryWrapper.eq(CdExamRoom::getOldSignId,bo.getExamApplyId());
+        }
+        CdExamRoom examRoom = cdExamRoomService.getOne(queryWrapper);
+        if (ObjectUtils.isNull(examRoom)){
+            throw new CustomException("考试信息查询不到,请检查");
+        }
+        //取消考试预约
+        BatchCancelSubscribeBo subscribeBo = new BatchCancelSubscribeBo();
+        subscribeBo.setUserSubscribeIds(Arrays.asList(userSubscribe.getId()));
+        subscribeBo.setSign(bo.getSign());
+        cdExamRoomService.batchCancelSubscribe(subscribeBo);
+        return true;
+    }
+
+
+    /**
+     * 获取机构ID
+     * @author change
+     * @date 2023/7/17 10:13
+     * @param tenantId
+     * @return java.lang.Long
+     */
+    private Long getNewTenantId(Long tenantId,Integer dataFrom){
+        LambdaQueryWrapper<DataTenant> queryWrapper = new LambdaQueryWrapper<>();
+        if (dataFrom == 1){
+            //新系统
+            queryWrapper.eq(DataTenant::getNewId,tenantId);
+        }else {
+            //旧系统
+            queryWrapper.eq(DataTenant::getOldId,tenantId);
+        }
+        DataTenant tenant = dataTenantService.getOne(queryWrapper);
+        if (ObjectUtils.isNull(tenant)){
+            throw new CustomException("机构信息不匹配,请检查!");
+        }
+        return tenant.getTenantId();
+    }
+
+    /**
+     * 获取机构信息
+     * @author change
+     * @date 2023/7/17 10:13
+     * @param tenantId
+     * @return java.lang.Long
+     */
+    private DataTenant getNewTenant(Long tenantId){
+        DataTenant tenant = dataTenantService.getOne(new LambdaQueryWrapper<DataTenant>()
+                .eq(DataTenant::getNewId, tenantId)
+                .or().eq(DataTenant::getOldId, tenantId)
+                .last("limit 1"));
+        if (ObjectUtils.isNull(tenant)){
+            throw new CustomException("机构信息不匹配,请检查!");
+        }
+        return tenant;
+    }
+}

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/middleground/record/vo/CdUserExamSubscribeVo.java

@@ -37,6 +37,8 @@ public class CdUserExamSubscribeVo implements Serializable {
     private String examTime;
     @ApiModelProperty("考试状态:1通过 0不通过 2缺考 3作弊 4替考")
     private Integer examStatus;
+    @ApiModelProperty("座位号")
+    private String seatNumber;
     @ApiModelProperty("成绩")
     private BigDecimal performance;
     @ApiModelProperty("类型:1新考 2补考")
@@ -58,4 +60,7 @@ public class CdUserExamSubscribeVo implements Serializable {
     @ApiModelProperty("有效状态:0有效 1无效")
     private Integer exitType;
 
+    @ApiModelProperty("取消预约标识:1不可取消")
+    private Integer subscribeSign;
+
 }

+ 21 - 3
zhongzheng-system/src/main/resources/mapper/modules/middleground/CdUserSubscribeMapper.xml

@@ -5,7 +5,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 <mapper namespace="com.zhongzheng.modules.middleground.record.mapper.CdUserSubscribeMapper">
 
     <select id="getUserSubscribeList" parameterType="com.zhongzheng.modules.middleground.record.bo.CdUserExamSubscribeQueryBo"
-            resultType="com.zhongzheng.modules.middleground.record.domain.CdUserSubscribe">
+            resultType="com.zhongzheng.modules.middleground.record.vo.CdUserExamSubscribeVo">
         SELECT
         *
         FROM
@@ -58,11 +58,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="exitType != null ">
             AND cus.exit_type = #{exitType}
         </if>
+        <if test="major != null and major != ''">
+            AND cus.major = #{major}
+        </if>
+        <if test="oldCompanyId != null and oldCompanyId != ''">
+            AND cus.old_company_id = #{oldCompanyId}
+        </if>
+        <if test="oldInstitutionId != null and oldInstitutionId != ''">
+            AND cus.old_institution_id = #{oldInstitutionId}
+        </if>
+        <if test="oldCustomerId != null and oldCustomerId != ''">
+            AND cus.old_customer_id = #{oldCustomerId}
+        </if>
+        <if test="newApply != null and newApply == 1">
+            AND (SELECT COUNT(DISTINCT ces.id) FROM cd_exam_subscribe ces WHERE ces.user_subscribe_id = cus.id AND ces.subscribe_status = 1) = 1
+        </if>
+        <if test="newApply != null and newApply == 0">
+            AND (SELECT COUNT(DISTINCT ces.id) FROM cd_exam_subscribe ces WHERE ces.user_subscribe_id = cus.id AND ces.subscribe_status = 1) > 1
+        </if>
         <if test="applyNumber != null and applyNumber == 1">
             AND cus.exam_num > 0
         </if>
-        <if test="applyNumber != null and applyNumber == 0">
-            AND cus.exam_num <![CDATA[   <=  ]]> 0
+        <if test="applyNumber != null and applyNumber == 2">
+            AND cus.exam_num <![CDATA[ <= ]]> 0
         </if>
         <if test="certificateStatus != null and certificateStatus == 1">
             AND (