|
|
@@ -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"));
|
|
|
@@ -260,6 +264,10 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
|
|
|
String format = String.format("%s(%s-%s)", content, examRoom.getExamStartTime(), examRoom.getExamEndTime());
|
|
|
examSubscribeVo.setExamTime(format);
|
|
|
examSubscribeVo.setExamStatus(cdExamSubscribe.getExamStatus());
|
|
|
+ CdExamSite examSite = examSiteService.getById(examRoom.getExamSiteId());
|
|
|
+ if (ObjectUtils.isNotNull(examSite)){
|
|
|
+ examSubscribeVo.setExamSite(examSite.getSiteAddress());
|
|
|
+ }
|
|
|
if (ObjectUtils.isNotNull(cdExamSubscribe.getPerformance())){
|
|
|
examSubscribeVo.setPerformance(cdExamSubscribe.getPerformance());
|
|
|
examSubscribeVo.setExamStatus(cdExamSubscribe.getResult());
|
|
|
@@ -270,6 +278,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 +301,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 +326,15 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
|
|
|
subscribe.setDataFrom(userSubscribe.getDataFrom());
|
|
|
subscribe.setTenantId(userSubscribe.getTenantId());
|
|
|
subscribe.setType(userSubscribe.getType());
|
|
|
-
|
|
|
+ subscribe.setOrderGoodsId(userSubscribe.getOrderGoodsId());
|
|
|
+ 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 +351,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) -> {
|
|
|
@@ -349,11 +378,13 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
|
|
|
requstBo.setApplyStartTime(examRoom.getExamStartTime());
|
|
|
requstBo.setApplyEndTime(examRoom.getExamEndTime());
|
|
|
requstBo.setMajorName(item.getExamMajor());
|
|
|
- String param = JSONObject.toJSONString(bo);
|
|
|
+ requstBo.setOrderGoodsId(item.getOrderGoodsId());
|
|
|
+ String param = JSONObject.toJSONString(requstBo);
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(param);
|
|
|
Map<String, String> headersMap = new HashMap<>();
|
|
|
- headersMap.put("TenantId", ServletUtils.getRequest().getHeader("TenantId"));
|
|
|
+ headersMap.put("TenantId", getNewTenant(item.getTenantId(),1).getNewId().toString());
|
|
|
try {
|
|
|
- HttpUtils.sendPostJsonHeaderAsync(EXAM_SUBSCRIBE_PATH, param,headersMap);
|
|
|
+ HttpUtils.sendPostHeader(EXAM_SUBSCRIBE_PATH, jsonObject,headersMap);
|
|
|
}catch (Exception e){
|
|
|
//预约错误记录日志
|
|
|
CdExamErrorLog log = new CdExamErrorLog();
|
|
|
@@ -373,6 +404,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)
|
|
|
@@ -398,10 +458,17 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
|
|
|
throw new CustomException(String.format("【%s】学员预约的考试场次距开考少于7个工作日,不能取消预约!",userSubscribe.getUserName()));
|
|
|
}
|
|
|
subscribe.setSubscribeStatus(0);//取消预约
|
|
|
+ subscribe.setOrderGoodsId(userSubscribe.getOrderGoodsId());
|
|
|
subscribeList.add(subscribe);
|
|
|
});
|
|
|
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) -> {
|
|
|
@@ -424,18 +491,20 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
|
|
|
requstBo.setApplyStartTime(examRoom.getExamStartTime());
|
|
|
requstBo.setApplyEndTime(examRoom.getExamEndTime());
|
|
|
requstBo.setMajorName(item.getExamMajor());
|
|
|
- String param = JSONObject.toJSONString(bo);
|
|
|
+ requstBo.setOrderGoodsId(item.getOrderGoodsId());
|
|
|
+ String param = JSONObject.toJSONString(requstBo);
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(param);
|
|
|
Map<String, String> headersMap = new HashMap<>();
|
|
|
- headersMap.put("TenantId", ServletUtils.getRequest().getHeader("TenantId"));
|
|
|
+ headersMap.put("TenantId", getNewTenant(item.getTenantId(),1).getNewId().toString());
|
|
|
try {
|
|
|
- HttpUtils.sendPostJsonHeaderAsync(EXAM_SUBSCRIBE_CANCEL_PATH, param,headersMap);
|
|
|
+ HttpUtils.sendPostHeader(EXAM_SUBSCRIBE_CANCEL_PATH, jsonObject,headersMap);
|
|
|
}catch (Exception e){
|
|
|
//预约错误记录日志
|
|
|
CdExamErrorLog log = new CdExamErrorLog();
|
|
|
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);
|
|
|
}
|
|
|
});
|
|
|
@@ -490,6 +559,20 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
|
|
|
return cdUserSubscribeService.updateBatchById(entityList);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public boolean addExamApplyNum(AddExamApplyNumBo bo) {
|
|
|
+ CdUserSubscribe userSubscribe = cdUserSubscribeService.getOne(new LambdaQueryWrapper<CdUserSubscribe>()
|
|
|
+ .eq(CdUserSubscribe::getUserId, bo.getUserId())
|
|
|
+ .eq(CdUserSubscribe::getOrderGoodsId, bo.getOrderGoodsId()));
|
|
|
+ if (ObjectUtils.isNull(userSubscribe)){
|
|
|
+ throw new CustomException("学员学习信息获取有误!");
|
|
|
+ }
|
|
|
+ //新增考试次数
|
|
|
+ userSubscribe.setExamNum(userSubscribe.getExamNum() + bo.getNum());
|
|
|
+
|
|
|
+ return cdUserSubscribeService.updateById(userSubscribe);
|
|
|
+ }
|
|
|
+
|
|
|
//预约校验
|
|
|
private void subscribeVerify(BatchSubscribeBo bo) {
|
|
|
CdExamRoom courseRoom = getById(bo.getExamId());
|
|
|
@@ -512,6 +595,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){
|
|
|
//考试成绩没出
|
|
|
@@ -631,15 +721,8 @@ public class CdExamRoomServiceImpl extends ServiceImpl<CdExamRoomMapper, CdExamR
|
|
|
* @return java.lang.Long
|
|
|
*/
|
|
|
private DataTenant getNewTenant(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);
|
|
|
+ DataTenant tenant = dataTenantService
|
|
|
+ .getOne(new LambdaQueryWrapper<DataTenant>().eq(DataTenant::getTenantId, tenantId));
|
|
|
if (ObjectUtils.isNull(tenant)){
|
|
|
throw new CustomException("机构信息不匹配,请检查!");
|
|
|
}
|
|
|
@@ -655,6 +738,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)
|