Commit f91f7e33 authored by duanruiming's avatar duanruiming

[update] 添加异常类,优化异常处理

parent 4e0dce3b
package net.wanji.web.common.exception;
import net.wanji.common.framework.exceptionhandler.GlobalExceptionHandler;
/**
* @author duanruiming
* @date 2023/03/03 14:42
*/
public class ControlServiceException extends GlobalExceptionHandler {
}
...@@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; ...@@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
/** /**
* @author * @author
*/ */
@SpringBootApplication(scanBasePackages = {"net.wanji.opt", "net.wanji.databus"}) @SpringBootApplication(scanBasePackages = {"net.wanji.opt", "net.wanji.databus", "net.wanji.common"})
@MapperScan(basePackages = {"net.wanji.opt.dao.mapper", "net.wanji.databus.dao.mapper"}) @MapperScan(basePackages = {"net.wanji.opt.dao.mapper", "net.wanji.databus.dao.mapper"})
@EnableTransactionManagement @EnableTransactionManagement
@EnableScheduling @EnableScheduling
......
...@@ -6,6 +6,7 @@ import net.wanji.common.enums.TurnConvertEnum; ...@@ -6,6 +6,7 @@ import net.wanji.common.enums.TurnConvertEnum;
import net.wanji.common.enums.WeekEnum; import net.wanji.common.enums.WeekEnum;
import net.wanji.common.framework.Constants; import net.wanji.common.framework.Constants;
import net.wanji.common.utils.tool.DateUtil; import net.wanji.common.utils.tool.DateUtil;
import net.wanji.opt.common.exception.OptServiceException;
import net.wanji.opt.dto.*; import net.wanji.opt.dto.*;
import net.wanji.opt.service.CrossSchedulesService; import net.wanji.opt.service.CrossSchedulesService;
import net.wanji.opt.service.CrossSchemeService; import net.wanji.opt.service.CrossSchemeService;
...@@ -88,7 +89,7 @@ public class CrossDirTurnPhaseCache implements CommandLineRunner { ...@@ -88,7 +89,7 @@ public class CrossDirTurnPhaseCache implements CommandLineRunner {
dir = lights.getDir(); dir = lights.getDir();
if (Objects.isNull(lights.getLaneInfos())) { if (Objects.isNull(lights.getLaneInfos())) {
log.error("{}-路口, {}-方案,{}-灯组,灯组中车道信息不能为空", crossId, scheme.getId(), lights.getId()); log.error("{}-路口, {}-方案,{}-灯组,灯组中车道信息不能为空", crossId, scheme.getId(), lights.getId());
throw new Exception("灯组中车道信息不能为空"); throw new OptServiceException("当前路口:".concat(crossId).concat(", 灯组关联车道信息不能为空"));
} }
for (LaneInfoDTO lane : lights.getLaneInfos()) { for (LaneInfoDTO lane : lights.getLaneInfos()) {
// 车道转向转换为转向类型,并去重 // 车道转向转换为转向类型,并去重
......
...@@ -20,4 +20,9 @@ public class OptExceptionHandler extends GlobalExceptionHandler { ...@@ -20,4 +20,9 @@ public class OptExceptionHandler extends GlobalExceptionHandler {
public JsonViewObject uniqueExceptionHandler(UniqueException e) { public JsonViewObject uniqueExceptionHandler(UniqueException e) {
return JsonViewObject.newInstance().fail(e); return JsonViewObject.newInstance().fail(e);
} }
@ExceptionHandler(value = OptServiceException.class)
public JsonViewObject OptServiceExceptionHandler(OptServiceException e) {
return JsonViewObject.newInstance().fail(e.getMessage(), "optService服务调用异常");
}
} }
\ No newline at end of file
package net.wanji.opt.common.exception;
/**
* @author duanruiming
* @date 2023/03/03 13:47
*/
public class OptServiceException extends RuntimeException {
public OptServiceException() {
super();
}
public OptServiceException(String message) {
super(message);
}
public OptServiceException(String message, Exception e) {
super(message, e);
}
}
\ No newline at end of file
...@@ -4,6 +4,8 @@ import io.swagger.annotations.Api; ...@@ -4,6 +4,8 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses; import io.swagger.annotations.ApiResponses;
import net.wanji.common.annotation.aspect.AspectLog;
import net.wanji.common.enums.BaseEnum;
import net.wanji.common.framework.rest.JsonViewObject; import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.service.signalcontrol.FeignProxyService; import net.wanji.opt.service.signalcontrol.FeignProxyService;
import net.wanji.opt.vo.SchemeOptSendVO; import net.wanji.opt.vo.SchemeOptSendVO;
...@@ -29,6 +31,7 @@ public class SignalCommandOptController { ...@@ -29,6 +31,7 @@ public class SignalCommandOptController {
@Autowired @Autowired
private FeignProxyService feignProxyService; private FeignProxyService feignProxyService;
@AspectLog(description = "诊断优化手动优化方案下发", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "手动优化方案下发", notes = "优化方案下发", response = JsonViewObject.class, @ApiOperation(value = "手动优化方案下发", notes = "优化方案下发", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON) produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/schemeOptSend", @PostMapping(value = "/schemeOptSend",
...@@ -39,6 +42,7 @@ public class SignalCommandOptController { ...@@ -39,6 +42,7 @@ public class SignalCommandOptController {
return jsonViewObject; return jsonViewObject;
} }
@AspectLog(description = "诊断优化手动优化方案恢复", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "手动优化方案恢复", notes = "优化方案恢复", response = JsonViewObject.class, @ApiOperation(value = "手动优化方案恢复", notes = "优化方案恢复", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON) produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/schemeOptRestore", @PostMapping(value = "/schemeOptRestore",
......
...@@ -11,6 +11,7 @@ import net.wanji.feign.pojo.vo.SchemeSendVO; ...@@ -11,6 +11,7 @@ import net.wanji.feign.pojo.vo.SchemeSendVO;
import net.wanji.feign.pojo.vo.SignalStatusVO; import net.wanji.feign.pojo.vo.SignalStatusVO;
import net.wanji.feign.service.UtcFeignClients; import net.wanji.feign.service.UtcFeignClients;
import net.wanji.opt.cache.CrossDirTurnPhaseCache; import net.wanji.opt.cache.CrossDirTurnPhaseCache;
import net.wanji.opt.common.exception.OptServiceException;
import net.wanji.opt.dao.mapper.CrossPhaseMapper; import net.wanji.opt.dao.mapper.CrossPhaseMapper;
import net.wanji.opt.dao.mapper.CrossSchemeMapper; import net.wanji.opt.dao.mapper.CrossSchemeMapper;
import net.wanji.opt.dao.mapper.CrossSchemeOptLogMapper; import net.wanji.opt.dao.mapper.CrossSchemeOptLogMapper;
...@@ -186,7 +187,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -186,7 +187,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
List<CrossTurnDataRealtimeDTO> endcrossTurnDataRealtimeDTOS = turnDataRealtimeMap.get(endCrossId); List<CrossTurnDataRealtimeDTO> endcrossTurnDataRealtimeDTOS = turnDataRealtimeMap.get(endCrossId);
if (CollectionUtils.isEmpty(endcrossTurnDataRealtimeDTOS)) { if (CollectionUtils.isEmpty(endcrossTurnDataRealtimeDTOS)) {
log.error("溢出路口:{},优化其下游路口:{}时,路口转向数据为空", crossId, ridInfoEntity.getEndCrossId()); log.error("溢出路口:{},优化其下游路口:{}时,路口转向数据为空", crossId, ridInfoEntity.getEndCrossId());
throw new Exception(); throw new OptServiceException("实时监控->溢出路口方案优化异常,优化路口转向数据异常");
} }
endcrossTurnDataRealtimeDTOS.forEach(item -> item.setPassTime(calPassTime(item))); endcrossTurnDataRealtimeDTOS.forEach(item -> item.setPassTime(calPassTime(item)));
// 进行优化下发 // 进行优化下发
...@@ -272,7 +273,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -272,7 +273,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
// 记录已优化的路口 // 记录已优化的路口
CROSS_OPT.add(crossId); CROSS_OPT.add(crossId);
} else { } else {
log.error("当前拥堵路口: {}, 实时监控优化上游路口: {}时,未获取到上游路口的实时转向数据!", crossId, startCrossId); log.error("当前拥堵路口: {}, 实时监控->优化上游路口: {}时,未获取到上游路口的实时转向数据!", crossId, startCrossId);
} }
} }
} }
...@@ -359,8 +360,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -359,8 +360,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
SchemeSendVO schemeSendVO = getSchemeSendVO(optCrossId, phaseMap, Collections.EMPTY_MAP); SchemeSendVO schemeSendVO = getSchemeSendVO(optCrossId, phaseMap, Collections.EMPTY_MAP);
JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO); JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO);
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) { if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("实时监控路口优化方案下发远程调用异常!", jsonViewObject); log.error("实时监控->路口优化方案下发远程调用异常!", jsonViewObject);
throw new Exception(); throw new OptServiceException("实时监控->恢复原始方案调用UTC服务异常");
} }
CROSS_OPT.remove(optCrossId); CROSS_OPT.remove(optCrossId);
} }
...@@ -430,8 +431,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -430,8 +431,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
//todo test下发成功 //todo test下发成功
jsonViewObject.success(); jsonViewObject.success();
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) { if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("实时监控路口优化方案下发远程调用异常!", jsonViewObject); log.error("实时监控->路口优化方案下发远程调用异常!", jsonViewObject);
throw new Exception(); throw new OptServiceException("实时监控->下发优化方案调用UTC服务异常");
} }
// 将优化记录插入方案优化记录表 // 将优化记录插入方案优化记录表
...@@ -490,8 +491,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -490,8 +491,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
String key = String.join(Constants.SystemParam.SEPARATOR_UNDER_LINE, crossId, "1", "s"); String key = String.join(Constants.SystemParam.SEPARATOR_UNDER_LINE, crossId, "1", "s");
CrossPhaseDTO crossPhaseDTO = phaseMap.get(key); CrossPhaseDTO crossPhaseDTO = phaseMap.get(key);
if (Objects.isNull(crossPhaseDTO)) { if (Objects.isNull(crossPhaseDTO)) {
log.error("当前路口:{}未获取到信号机相位等信息,无法进行方案下发优化", crossId); log.error("当前路口:{}未获取到信号机方案信息,无法进行方案下发优化", crossId);
throw new Exception(); throw new OptServiceException("当前路口不能获取到运行方案相位信息!");
} }
Integer schemeId = crossPhaseDTO.getSchemeId(); Integer schemeId = crossPhaseDTO.getSchemeId();
...@@ -716,7 +717,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -716,7 +717,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
JsonViewObject jsonViewObject = utcFeignClients.runningStatusAlarm(); JsonViewObject jsonViewObject = utcFeignClients.runningStatusAlarm();
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) { if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("路口优化获取当前路口控制模式异常!"); log.error("路口优化获取当前路口控制模式异常!");
throw new Exception(); throw new OptServiceException("路口优化获取当前路口控制模式异常!");
} }
List<SignalStatusVO> signalStatusVOS = (List<SignalStatusVO>) jsonViewObject.getContent(); List<SignalStatusVO> signalStatusVOS = (List<SignalStatusVO>) jsonViewObject.getContent();
List<SignalStatusVO> resultList = signalStatusVOS.stream().filter(signalStatusVO -> Objects.equals(crossId, signalStatusVO.getCrossId())).collect(Collectors.toList()); List<SignalStatusVO> resultList = signalStatusVOS.stream().filter(signalStatusVO -> Objects.equals(crossId, signalStatusVO.getCrossId())).collect(Collectors.toList());
......
package net.wanji.opt.service.signalcontrol.impl; package net.wanji.opt.service.signalcontrol.impl;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.exception.FeignServiceException;
import net.wanji.common.framework.rest.JsonViewObject; import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.databus.entity.develop.servicedevelop.develop.StatusCodeEnum; import net.wanji.databus.entity.develop.servicedevelop.develop.StatusCodeEnum;
import net.wanji.feign.pojo.vo.SchemeSendVO; import net.wanji.feign.pojo.vo.SchemeSendVO;
...@@ -44,8 +45,8 @@ public class FeignProxyServiceImpl implements FeignProxyService { ...@@ -44,8 +45,8 @@ public class FeignProxyServiceImpl implements FeignProxyService {
BeanUtils.copyProperties(schemeOptSendVO, schemeSendVO); BeanUtils.copyProperties(schemeOptSendVO, schemeSendVO);
JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO); JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO);
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) { if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("实时监控路口优化方案下发远程调用异常!", jsonViewObject); log.error("诊断优化手动下发优化方案,UTC服务调用异常", jsonViewObject);
return jsonViewObject.fail("手动下发优化方案,UTC服务调用异常"); throw new FeignServiceException("诊断优化手动下发优化方案,UTC服务调用异常");
} }
// 将优化记录插入方案优化记录表 // 将优化记录插入方案优化记录表
...@@ -61,10 +62,10 @@ public class FeignProxyServiceImpl implements FeignProxyService { ...@@ -61,10 +62,10 @@ public class FeignProxyServiceImpl implements FeignProxyService {
SchemeSendVO schemeSendVO = getSchemeSendVO(crossId, phaseMap, Collections.EMPTY_MAP); SchemeSendVO schemeSendVO = getSchemeSendVO(crossId, phaseMap, Collections.EMPTY_MAP);
JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO); JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO);
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) { if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("实时监控路口优化方案恢复远程调用异常!", jsonViewObject); log.error("诊断优化手动恢复优化方案,UTC服务调用异常!", jsonViewObject);
return jsonViewObject.fail("手动恢复优化方案,UTC服务调用异常"); throw new FeignServiceException("手动恢复优化方案,UTC服务调用异常");
} }
return null; return jsonViewObject.success("手动恢复优化方案成功");
} }
/** /**
......
package net.wanji.common.framework.exception;
/**
* @author duanruiming
* @date 2023/03/03 14:22
*/
public class FeignServiceException extends RuntimeException {
public FeignServiceException(Exception e) {
super(e);
}
public FeignServiceException(String msg, Exception e) {
super(msg, e);
}
public FeignServiceException(String msg) {
super(msg);
}
}
package net.wanji.common.framework.exceptionhandler; package net.wanji.common.framework.exceptionhandler;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.exception.FeignServiceException;
import net.wanji.common.framework.rest.JsonViewObject; import net.wanji.common.framework.rest.JsonViewObject;
import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.DuplicateKeyException;
import org.springframework.validation.FieldError; import org.springframework.validation.FieldError;
...@@ -106,6 +107,20 @@ public class GlobalExceptionHandler { ...@@ -106,6 +107,20 @@ public class GlobalExceptionHandler {
return JsonViewObject.newInstance().fail("发生参数异常!原因是:" + errorMessage); return JsonViewObject.newInstance().fail("发生参数异常!原因是:" + errorMessage);
} }
@ExceptionHandler(value = FeignServiceException.class)
public JsonViewObject feignServiceExceptionHandler(HttpServletRequest req, FeignServiceException e) {
Throwable cause = e.getCause();
String errorMessage;
if (cause != null) {
errorMessage = cause.getMessage();
} else {
StackTraceElement element = e.getStackTrace()[0];
errorMessage = element.getClassName() + " " + element.getLineNumber();
}
log.error("feign远程服务调用异常:", e);
return JsonViewObject.newInstance().fail("feign远程服务调用异常!位置在:" + errorMessage);
}
/** /**
* 处理其他异常 * 处理其他异常
*/ */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment