package service import ( "fmt" "time" "google.golang.org/protobuf/proto" "joylink.club/bj-rtsts-server/ats/verify/protos/graphicData" "joylink.club/bj-rtsts-server/ats/verify/simulation/wayside/memory" "joylink.club/bj-rtsts-server/db/dbquery" "joylink.club/bj-rtsts-server/db/model" "joylink.club/bj-rtsts-server/dto" "joylink.club/bj-rtsts-server/dto/publishedGi" ) func PageQueryPublishedGi(req *publishedGi.PublishedGiReqDto) *dto.PageDto { where := dbquery.PublishedGi.Where(dbquery.PublishedGi.Status.Eq(1)) if req.Name != "" { where = where.Where(dbquery.PublishedGi.Name.Like(fmt.Sprintf("%%%s%%", req.Name))) } result, count, err := where.Debug().FindByPage(req.Offset(), req.Size) if err != nil { panic(dto.ErrorDto{Code: dto.DataOperationError, Message: err.Error()}) } return &dto.PageDto{ Total: int(count), PageQueryDto: req.PageQueryDto, Records: publishedGi.ConvertFromSlice(result), } } func ListQueryPublishedGi(req *publishedGi.PublishedGiReqDto) []*publishedGi.PublishedGiDto { where := dbquery.PublishedGi.Where(dbquery.PublishedGi.Status.Eq(1)) if req.Name != "" { where = where.Where(dbquery.PublishedGi.Name.Like(fmt.Sprintf("%%%s%%", req.Name))) } find, err := where.Debug().Find() if err != nil { panic(dto.ErrorDto{Code: dto.DataOperationError, Message: err.Error()}) } return publishedGi.ConvertFromSlice(find) } func ListAllPublishedGi() ([]*model.PublishedGi, error) { return dbquery.PublishedGi.Debug().Where(dbquery.PublishedGi.Status.Eq(1)).Find() } func GetPublishedGiById(id int) (*model.PublishedGi, error) { return dbquery.PublishedGi.Where(dbquery.PublishedGi.ID.Eq(int32(id))).Debug().First() } func PublishFormDraft(req *publishedGi.PublishReqDto, user *model.User) { draft := QueryDrafting(req.DraftId) if draft.Proto == nil || len(draft.Proto) == 0 { panic(fmt.Sprintf("草稿[%v]绘图数据信息为空", req.DraftId)) } //需要删除的同名数据 oldData, _ := dbquery.PublishedGi.Debug().Where(dbquery.PublishedGi.Name.Eq(req.Name)).Find() if oldData != nil && len(oldData) > 0 { // 逻辑删除 dbquery.PublishedGi.Debug().Where(dbquery.PublishedGi.Name.Eq(req.Name)).UpdateColumn(dbquery.PublishedGi.Status, 0) for _, v := range oldData { memory.DeleteMapVerifyStructure(v.ID) // 移除内存中的发布信息 } } entity := model.PublishedGi{ Name: req.Name, Proto: handlerPublishedGiLinkData(draft.Proto, false), UserID: user.ID, PublishAt: time.Now(), Category: draft.Category, Note: req.Note, Status: 1, } //插入新数据 err := dbquery.PublishedGi.Debug().Create(&entity) if err != nil { panic(dto.ErrorDto{Code: dto.DataOperationError, Message: fmt.Sprintf("数据创建失败:\n%s", err.Error())}) } newData, _ := dbquery.PublishedGi. Where(dbquery.PublishedGi.Name.Eq(req.Name), dbquery.PublishedGi.Status.Eq(1)). Order(dbquery.PublishedGi.PublishAt.Desc()).First() // 地图信息更新到缓存 if newData != nil { memory.PublishMapVerifyStructure(newData) } } func DeletePublishedGiById(id int) { dbquery.PublishedGi.Debug().Where(dbquery.PublishedGi.ID.Eq(int32(id))).UpdateColumn(dbquery.PublishedGi.Status, 0) memory.DeleteMapVerifyStructure(int32(id)) // 移除内存中的发布信息 } func SaveAsDraftingFromPublish(id int32, user *model.User, name string) { num, _ := dbquery.Drafting.Where(dbquery.Drafting.Name.Eq(name)).Count() if num > 0 { // 处理重名情况 panic(dto.ErrorDto{Code: dto.DataOperationError, Message: fmt.Sprintf("草稿【%s】已存在", name)}) } publishedGi, err := dbquery.PublishedGi.Where(dbquery.PublishedGi.ID.Eq(id)).Debug().First() if err != nil { panic(dto.ErrorDto{Code: dto.DataOperationError, Message: err.Error()}) } drafting := &model.Drafting{ Name: name, Category: publishedGi.Category, Proto: handlerPublishedGiLinkData(publishedGi.Proto, true), CreatorID: user.ID, CreatedAt: time.Now(), UpdateAt: time.Now(), } err1 := dbquery.Drafting.Save(drafting) if err1 != nil { panic(dto.ErrorDto{Code: dto.DataOperationError, Message: err1.Error()}) } } // 操作地图数据中的link数据 // del 代表是否删除地图中的link数据 func handlerPublishedGiLinkData(data []byte, del bool) []byte { gd := &graphicData.RtssGraphicStorage{} proto.Unmarshal(data, gd) if del { gd.CalculateLink = []*graphicData.CalculateLink{} } else { gd.CalculateLink = memory.BuildCalculateLinkData(gd) } rd, err := proto.Marshal(gd) if err != nil { panic(dto.ErrorDto{Code: dto.DataOperationError, Message: err.Error()}) } return rd }