rts-sim-testing-service/service/publishedGi.go

171 lines
5.5 KiB
Go
Raw Normal View History

2023-07-18 17:19:03 +08:00
package service
import (
"fmt"
2023-10-20 14:27:13 +08:00
"sync"
"time"
2023-07-18 17:19:03 +08:00
"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"
2023-10-26 17:16:07 +08:00
"joylink.club/bj-rtsts-server/ts/simulation/wayside/memory"
2023-07-18 17:19:03 +08:00
)
2023-10-20 14:27:13 +08:00
var publishMapMutex sync.Mutex
func PageQueryPublishedGi(req *publishedGi.PublishedGiReqDto) *dto.PageDto {
dp := dbquery.PublishedGi
where := dp.Where(dp.Status.Eq(1))
2023-07-18 17:19:03 +08:00
if req.Name != "" {
where = where.Where(dp.Name.Like(fmt.Sprintf("%%%s%%", req.Name)))
}
2023-09-05 09:38:12 +08:00
result, count, err := where.Omit(dbquery.PublishedGi.Proto).Debug().FindByPage(req.Offset(), req.Size)
if err != nil {
panic(dto.ErrorDto{Code: dto.DataOperationError, Message: err.Error()})
2023-07-18 17:19:03 +08:00
}
return &dto.PageDto{
Total: int(count),
PageQueryDto: req.PageQueryDto,
Records: publishedGi.ConvertFromSlice(result),
}
2023-07-18 17:19:03 +08:00
}
func ListQueryPublishedGi(req *publishedGi.PublishedGiListReqDto) []*publishedGi.PublishedGiDto {
2023-08-31 16:16:18 +08:00
where := dbquery.PublishedGi.Omit(dbquery.PublishedGi.Proto).Where(dbquery.PublishedGi.Status.Eq(1))
2023-07-18 17:19:03 +08:00
if req.Name != "" {
where = where.Where(dbquery.PublishedGi.Name.Like(fmt.Sprintf("%%%s%%", req.Name)))
2023-07-18 17:19:03 +08:00
}
if req.Type != 0 {
where = where.Where(dbquery.PublishedGi.Type.Eq(req.Type))
}
if req.Category != "" {
where = where.Where(dbquery.PublishedGi.Category.Eq(req.Category))
}
find, err := where.Debug().Find()
if err != nil {
panic(dto.ErrorDto{Code: dto.DataOperationError, Message: err.Error()})
}
return publishedGi.ConvertFromSlice(find)
2023-07-18 17:19:03 +08:00
}
2023-08-01 17:16:16 +08:00
func ListAllPublishedGi() ([]*model.PublishedGi, error) {
return dbquery.PublishedGi.Debug().Where(dbquery.PublishedGi.Status.Eq(1)).Find()
2023-08-01 17:16:16 +08:00
}
func GetPublishedGiById(id int) *model.PublishedGi {
data, err := dbquery.PublishedGi.Where(dbquery.PublishedGi.ID.Eq(int32(id))).Debug().First()
if err != nil {
panic(err)
}
return data
2023-07-18 17:19:03 +08:00
}
func PublishFormDraft(req *publishedGi.PublishReqDto, user *model.User) {
2023-10-20 14:27:13 +08:00
publishMapMutex.Lock()
defer publishMapMutex.Unlock()
2023-07-18 17:19:03 +08:00
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()
oldDataLen := len(oldData)
mids := make([]int32, oldDataLen)
if oldDataLen > 0 {
// 逻辑删除
dbquery.PublishedGi.Debug().Where(dbquery.PublishedGi.Name.Eq(req.Name)).UpdateColumn(dbquery.PublishedGi.Status, 0)
for i, v := range oldData {
mids[i] = v.ID
memory.DeleteMapVerifyStructure(v.ID) // 移除内存中的发布信息
}
}
entity := model.PublishedGi{
Name: req.Name,
2023-09-21 16:22:55 +08:00
Proto: draft.Proto,
UserID: user.ID,
PublishAt: time.Now(),
Category: draft.Category,
Note: req.Note,
2023-09-18 15:19:07 +08:00
Type: draft.Type,
Status: 1,
}
//插入新数据
err := dbquery.PublishedGi.Debug().Create(&entity)
if err != nil {
panic(dto.ErrorDto{Code: dto.DataOperationError, Message: fmt.Sprintf("数据创建失败:\n%s", err.Error())})
2023-07-18 17:19:03 +08:00
}
newData, _ := dbquery.PublishedGi.
Where(dbquery.PublishedGi.Name.Eq(req.Name), dbquery.PublishedGi.Status.Eq(1)).
Order(dbquery.PublishedGi.PublishAt.Desc()).First()
// 对项目关联的地图进行修改
if oldDataLen > 0 {
dbquery.ProjectPublishLink.Where(dbquery.ProjectPublishLink.Mid.In(mids...)).UpdateColumn(dbquery.ProjectPublishLink.Mid, newData.ID)
}
// 地图信息更新到缓存
if newData != nil {
memory.PublishMapVerifyStructure(newData)
}
2023-07-18 17:19:03 +08:00
}
func DeletePublishedGiById(id int) {
mid := int32(id)
dbquery.PublishedGi.Debug().Where(dbquery.PublishedGi.ID.Eq(mid)).UpdateColumn(dbquery.PublishedGi.Status, 0)
memory.DeleteMapVerifyStructure(int32(id)) // 移除内存中的发布信息
dbquery.ProjectPublishLink.Where(dbquery.ProjectPublishLink.Mid.In(mid)).Delete()
2023-07-18 17:19:03 +08:00
}
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,
2023-09-21 16:22:55 +08:00
Proto: publishedGi.Proto,
CreatorID: user.ID,
CreatedAt: time.Now(),
UpdateAt: time.Now(),
2023-09-18 15:19:07 +08:00
Type: publishedGi.Type,
}
err1 := dbquery.Drafting.Save(drafting)
if err1 != nil {
panic(dto.ErrorDto{Code: dto.DataOperationError, Message: err1.Error()})
}
}
2023-08-31 16:16:18 +08:00
func QueryProjectPublishedGi(id int32) []*model.PublishedGi {
// 获取项目关联的发布地图
dppl := dbquery.ProjectPublishLink
links, _ := dppl.Select(dppl.Mid).Where(dppl.Pid.Eq(id)).Find()
2023-08-31 16:16:18 +08:00
if len(links) == 0 {
return nil
}
mids := make([]int32, len(links))
for i, m := range links {
mids[i] = m.Mid
}
2023-08-31 16:16:18 +08:00
dp := dbquery.PublishedGi
2023-09-19 10:23:25 +08:00
publishedGis, _ := dp.Select(dp.ID, dp.Name, dp.Category, dp.Type).Where(dp.ID.In(mids...), dp.Status.Eq(1)).Order(dp.Name).Find()
2023-08-31 16:16:18 +08:00
return publishedGis
}
func GetPublishedGiByName(param *publishedGi.PublishedGiSingleQueryDto) *model.PublishedGi {
where := dbquery.PublishedGi.
Where(dbquery.PublishedGi.Name.Eq(param.Name)).
Where(dbquery.PublishedGi.Status.Eq(1))
if !param.Detail {
where = where.Omit(dbquery.PublishedGi.Proto)
}
data, err := where.Debug().First()
if err != nil {
panic(dto.ErrorDto{Code: dto.DataOperationError, Message: err.Error()})
}
return data
}