rts-sim-testing-service/api/simulation.go

282 lines
8.2 KiB
Go
Raw Normal View History

2023-07-28 14:36:16 +08:00
package api
import (
2023-07-31 17:27:05 +08:00
"fmt"
2023-07-28 14:36:16 +08:00
"net/http"
2023-07-31 17:27:05 +08:00
"strconv"
2023-07-28 14:36:16 +08:00
jwt "github.com/appleboy/gin-jwt/v2"
"github.com/gin-gonic/gin"
2023-07-31 17:27:05 +08:00
"github.com/golang/protobuf/proto"
2023-07-28 14:36:16 +08:00
"go.uber.org/zap"
2023-07-31 17:27:05 +08:00
"joylink.club/bj-rtsts-server/ats/verify/protos/graphicData"
"joylink.club/bj-rtsts-server/ats/verify/protos/state"
2023-07-31 08:41:42 +08:00
"joylink.club/bj-rtsts-server/ats/verify/simulation"
2023-08-01 14:54:11 +08:00
"joylink.club/bj-rtsts-server/ats/verify/simulation/wayside/memory"
2023-07-28 14:36:16 +08:00
"joylink.club/bj-rtsts-server/dto"
2023-07-31 08:41:42 +08:00
apiproto "joylink.club/bj-rtsts-server/grpcproto"
"joylink.club/bj-rtsts-server/service"
2023-07-28 14:36:16 +08:00
)
func InitSimulationRouter(api *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
authed := api.Group("/v1/simulation").Use(authMiddleware.MiddlewareFunc())
authed.POST("/create", create)
authed.GET("/state/:id", findSimulationState)
2023-07-28 17:24:58 +08:00
authed.POST("/destroy/:id", destroy)
authed.GET("/list", findAllSimulations)
authed.POST("/check/data", checkSimMapData)
2023-07-31 17:27:05 +08:00
authed.POST("/train/add", addTrain)
authed.POST("/train/remove", removeTrain)
authed.POST("/switch/operation", switchOperation)
2023-07-31 08:41:42 +08:00
// 初始化地图信息
initPublishMapInfo()
2023-07-31 08:41:42 +08:00
apiproto.RegisterMsgServer(&apiproto.SimulationServer{})
2023-07-28 14:36:16 +08:00
}
func initPublishMapInfo() {
mapArr, err := service.ListQueryPublishedGi(&dto.PublishedGiReqDto{})
if err != nil {
panic("地图加载出错")
}
for _, v := range mapArr {
memory.PublishMapVerifyStructure(v)
}
}
2023-07-28 14:36:16 +08:00
// 创建ATS测试仿真
//
// @Summary 创建ATS测试仿真
//
// @Security JwtAuth
//
// @Description 创建ATS测试仿真
// @Tags ATS测试仿真Api
// @Accept json
// @Produce json
// @Param Authorization header string true "JWT Token"
// @Param SimulationCreateReqDto body dto.SimulationCreateReqDto true "创建仿真请求"
// @Success 200 {object} dto.SimulationCreateRspDto
// @Failure 500 {object} dto.ErrorDto
// @Router /api/v1/simulation/create [post]
func create(c *gin.Context) {
//user,_:=c.Get(middleware.IdentityKey)
req := dto.SimulationCreateReqDto{}
if err := c.ShouldBind(&req); nil != err {
panic(err)
}
zap.S().Debug("创建仿真请求:", req)
2023-07-31 17:27:05 +08:00
rsp := dto.SimulationCreateRspDto{
MapId: req.MapId,
2023-07-28 14:36:16 +08:00
}
2023-08-01 14:54:11 +08:00
rsp.SimulationId = simulation.CreateSimulation(req.MapId)
2023-07-28 14:36:16 +08:00
c.JSON(http.StatusOK, &rsp)
}
// 创建并进入仿真后获取仿真的设备信息
//
// @Summary 创建并进入仿真后获取仿真的设备信息
//
// @Security JwtAuth
//
// @Description 创建并进入仿真后获取仿真的设备信息
// @Tags ATS测试仿真Api
// @Accept json
// @Produce json
// @Param Authorization header string true "JWT Token"
// @Param SimulationCreateReqDto body dto.SimulationCreateReqDto true "创建仿真请求"
// @Success 200 {object} dto.SimulationCreateRspDto
// @Failure 500 {object} dto.ErrorDto
// @Router /api/v1/simulation/create [post]
func findSimulationState(c *gin.Context) {
simId := c.Param("id")
simulation := checkDeviceDataAndReturn(simId)
allState := simulation.GetAllState()
c.JSON(http.StatusOK, allState)
}
// ATS仿真销毁
//
// @Summary ATS仿真销毁
//
// @Security JwtAuth
//
// @Description ATS测试仿真-添加列车
// @Tags ATS测试仿真Api
// @Accept json
// @Produce json
// @Param Authorization header string true "JWT Token"
// @Param id path int true "仿真id"
// @Success 200 {object} string
// @Failure 500 {object} dto.ErrorDto
// @Router /api/v1/simulation/destroy/{id} [post]
func destroy(c *gin.Context) {
simId := c.Param("id")
zap.S().Debug("ATS测试仿真-ATS仿真销毁 请求:", simId)
simulation.DestroySimulation(simId)
c.JSON(http.StatusOK, "ok")
}
// 获取ATS测试系统所有仿真实例的基本信息
//
// @Summary 获取ATS测试系统所有仿真实例的基本信息
//
// @Security JwtAuth
//
// @Description ATS测试仿真-添加列车
// @Tags ATS测试仿真Api
// @Accept json
// @Produce json
// @Param Authorization header string true "JWT Token"
//
// @Success 200 {object} dto.SimulationInfoRepDtoArr
// @Failure 500 {object} dto.ErrorDto
// @Router /api/v1/simulation/list [get]
func findAllSimulations(c *gin.Context) {
zap.S().Debug("ATS测试仿真-获取ATS测试系统所有仿真实例的基本信息,请求")
//TODO 后续调用
2023-08-01 14:54:11 +08:00
c.JSON(http.StatusOK, simulation.ListAllSimulations())
}
// ATS测试仿真地图数据校验
//
// @Summary ATS测试仿真地图数据校验
//
// @Security JwtAuth
//
// @Description ATS测试仿真-添加列车
// @Tags ATS测试仿真Api
// @Accept json
// @Produce json
// @Param Authorization header string true "JWT Token"
// @Param RemoveTrainDto body dto.CheckMapDataReqDto true "ATS测试仿真-地图数据"
//
// @Success 200 {object} dto.CheckMapDataRspDto
// @Failure 500 {object} dto.ErrorDto
// @Router /api/v1/simulation/check/data [post]
func checkSimMapData(c *gin.Context) {
2023-07-31 17:27:05 +08:00
rt := &dto.CheckMapDataReqDto{}
if err := c.ShouldBind(&rt); nil != err {
panic(err)
}
err := proto.Unmarshal(rt.Data, &graphicData.RtssGraphicStorage{})
if err != nil {
c.JSON(http.StatusInternalServerError, "参数错误")
} else {
2023-07-31 17:27:05 +08:00
c.JSON(http.StatusOK, &dto.CheckMapDataRspDto{Success: true})
}
}
2023-07-31 17:27:05 +08:00
// ATS测试仿真-添加列车
//
// @Summary ATS测试仿真-添加列车
//
// @Security JwtAuth
//
// @Description ATS测试仿真-添加列车
// @Tags ATS测试仿真Api
// @Accept json
// @Produce json
// @Param Authorization header string true "JWT Token"
// @Param AddTrainReqDto body dto.AddTrainReqDto true "ATS测试仿真-添加列车"
// @Success 200 {object} dto.AddTrainRspDto
// @Failure 500 {object} dto.ErrorDto
// @Router /api/v1/simulation/train/add [post]
func addTrain(c *gin.Context) {
//user,_:=c.Get(middleware.IdentityKey)
req := dto.AddTrainReqDto{}
if err := c.ShouldBind(&req); err != nil {
panic(err)
}
zap.S().Debug("ATS测试仿真-添加列车,请求:", req)
simulation := checkDeviceDataAndReturn(req.SimulationId)
trainMap := &simulation.Memory.Status.TrainStateMap
2023-07-31 17:27:05 +08:00
// 获取列车ID
i := 1
for {
2023-08-01 14:54:11 +08:00
_, ok := trainMap.Load(strconv.Itoa(i))
if ok {
2023-07-31 17:27:05 +08:00
i++
2023-08-01 14:54:11 +08:00
} else {
break
2023-07-31 17:27:05 +08:00
}
}
id := strconv.Itoa(i)
rsp := &state.TrainState{
Id: id,
HeadLinkId: req.HeadLinkId,
HeadLinkOffset: req.HeadLinkOffset,
Up: req.Up,
}
memory.AddTrainState(simulation, rsp)
2023-07-31 17:27:05 +08:00
c.JSON(http.StatusOK, &rsp)
}
2023-07-28 16:14:31 +08:00
// ATS测试仿真-移除列车
//
2023-07-28 16:14:31 +08:00
// @Summary ATS测试仿真-移除列车
//
// @Security JwtAuth
//
2023-07-28 16:14:31 +08:00
// @Description ATS测试仿真-移除列车
// @Tags ATS测试仿真Api
// @Accept json
// @Produce json
// @Param Authorization header string true "JWT Token"
// @Param RemoveTrainDto body dto.RemoveTrainDto true "ATS测试仿真-移除列车"
//
// @Success 200 {object} string
// @Failure 500 {object} dto.ErrorDto
// @Router /api/v1/simulation/train/remove [post]
func removeTrain(c *gin.Context) {
rt := &dto.RemoveTrainDto{}
2023-07-31 17:27:05 +08:00
if err := c.ShouldBind(&rt); err != nil {
panic(err)
}
2023-07-31 17:27:05 +08:00
zap.S().Debug("ATS测试仿真-移除列车,请求:", rt)
simulation := checkDeviceDataAndReturn(rt.SimulationId)
memory.RemoveTrainState(simulation, rt.TrainId)
2023-07-31 17:27:05 +08:00
//TODO 后续调用列车删除操作
c.JSON(http.StatusOK, "ok")
}
// 获取ATS测试-操作道岔
//
// @Summary 获取ATS测试-操作道岔
//
// @Security JwtAuth
//
// @Description ATS测试仿真-添加列车
// @Tags ATS测试仿真Api
// @Accept json
// @Produce json
// @Param Authorization header string true "JWT Token"
// @Param RemoveTrainDto body dto.SwitchOperationReqDto true "ATS测试仿真-操作道岔"
//
// @Success 200 {object} string
// @Failure 500 {object} dto.ErrorDto
// @Router /api/v1/simulation/switch/operation [post]
func switchOperation(c *gin.Context) {
2023-07-31 17:27:05 +08:00
req := &dto.SwitchOperationReqDto{}
if err := c.ShouldBind(&req); err != nil {
panic(err)
}
simulation := checkDeviceDataAndReturn(req.SimulationId)
zap.S().Info("传入状态参数", req)
memory.ChangeTurnoutState(simulation, &state.SwitchState{
Id: req.SwitchIndex,
Normal: req.TurnNormal,
Reverse: req.TurnReverse,
})
2023-07-31 17:27:05 +08:00
c.JSON(http.StatusOK, "ok")
}
2023-07-31 17:27:05 +08:00
// 获取仿真设备数据并返回
2023-08-01 14:54:11 +08:00
func checkDeviceDataAndReturn(simId string) *memory.VerifySimulation {
2023-07-31 17:27:05 +08:00
deviceMemory := simulation.FindSimulation(simId)
if deviceMemory == nil {
panic(&dto.ErrorDto{Code: dto.DataNotExist, Message: fmt.Sprintf("仿真[%s]不存在", simId)})
}
2023-07-31 17:27:05 +08:00
return deviceMemory
}