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

298 lines
9.4 KiB
Go

package service
import (
"fmt"
"sync"
"time"
"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/sys_error"
)
var publishMapMutex sync.Mutex
// 查找发布地图分页信息
func PageQueryPublished(req *dto.PagePublishedReqDto) *dto.PageDto {
p, pv, u := dbquery.Published, dbquery.PublishedVersion, dbquery.User
where := p.
Select(
p.ID, p.Code.As("name"), p.Type, p.Category, p.Status,
pv.Note, pv.PublishAt, pv.Version, u.Name.As("publisher"),
).
LeftJoin(pv, p.DataID.EqCol(pv.ID)).
LeftJoin(u, pv.UserID.EqCol(u.ID)).
Order(p.Status.Desc(), pv.PublishAt.Desc())
if req.Name != "" {
where = where.Where(p.Code.Like(fmt.Sprintf("%%%s%%", req.Name)))
}
if req.Release {
where = where.Where(p.Status.Eq(1))
}
var records []*dto.PublishedDto
count, err := where.Debug().ScanByPage(&records, req.Offset(), req.Size)
if err != nil {
panic(sys_error.New("查询发布地图信息失败", err))
}
return &dto.PageDto{Total: int(count), PageQueryDto: req.PageQueryDto, Records: records}
}
// 地图信息列表信息
func ListQueryPublished(req *dto.PublishedListReqDto) []*dto.PublishedDto {
p := dbquery.Published
where := p.Select(p.ID, p.Code.As("name"), p.Type, p.Category).Where(p.Status.Eq(1))
if req.Name != "" {
where = where.Where(dbquery.Published.Code.Like(fmt.Sprintf("%%%s%%", req.Name)))
}
if req.Type != 0 {
where = where.Where(dbquery.Published.Type.Eq(req.Type))
}
if req.Category != "" {
where = where.Where(dbquery.Published.Category.Eq(req.Category))
}
var records []*dto.PublishedDto
err := where.Debug().Scan(&records)
if err != nil {
panic(sys_error.New("查询发布地图信息失败", err))
}
return records
}
// 项目启动时查询发布地图信息
func ListAllPublished() []*dto.PublishedDto {
p, pv := dbquery.Published, dbquery.PublishedVersion
where := p.Select(p.ID, p.Code.As("name"), p.Type, p.Category, pv.Proto, pv.Version).
LeftJoin(pv, p.DataID.EqCol(pv.ID)).
Where(p.Status.Eq(1), p.Type.Neq(trainDataType)).Order(pv.PublishAt)
var records []*dto.PublishedDto
err := where.Debug().Scan(&records)
if err != nil {
panic(sys_error.New("查询发布地图信息失败", err))
}
return records
}
// 查询详细信息
func GetPublishedById(id int32) *dto.PublishedDto {
p, pv := dbquery.Published, dbquery.PublishedVersion
where := p.Select(p.ID, p.Code.As("name"), p.Type, p.Category, pv.Proto, pv.Version).
LeftJoin(pv, p.DataID.EqCol(pv.ID)).
Where(p.ID.Eq(id), p.Status.Eq(1))
var record dto.PublishedDto
err := where.Debug().Scan(&record)
if err != nil {
panic(sys_error.New("查询发布地图信息失败", err))
}
return &record
}
// 草稿发布
func PublishFormDraft(req *dto.PublishReqDto, user *model.User) int32 {
draft := QueryDrafting(req.DraftId)
if draft.Proto == nil || len(draft.Proto) == 0 {
panic(sys_error.New(fmt.Sprintf("草稿[%v]绘图数据信息为空", req.DraftId)))
}
return publishData(&dto.PublishedDto{
Name: req.Name,
Proto: draft.Proto,
Type: draft.Type,
Category: draft.Category,
UserID: user.ID,
Note: req.Note,
}, req.Force)
}
// 发布数据
func publishData(publishData *dto.PublishedDto, force bool) int32 {
publishMapMutex.Lock()
defer publishMapMutex.Unlock()
p, pv := dbquery.Published, dbquery.PublishedVersion
// 查询发布图数据
oldPs, err1 := p.Where(p.Code.Eq(publishData.Name)).Find()
if err1 != nil {
panic(sys_error.New("发布草稿数据失败", err1))
}
var pid, version int32 = 0, 1
if len(oldPs) > 0 { // 发布图数据不为空
pid = oldPs[0].ID
if oldPs[0].Category != publishData.Category || publishData.Type != oldPs[0].Type {
if !force { // 非强制覆盖
panic(sys_error.New("草稿数据与在线数据类型不一致"))
} else {
p.Where(p.ID.Eq(pid)).UpdateColumns(&model.Published{ID: pid, Type: publishData.Type, Category: publishData.Category})
}
}
vds, _ := pv.Select(pv.Version).Where(pv.PublishID.Eq(pid)).Order(pv.Version.Desc()).Find()
if len(vds) > 0 { // 版本号 + 1
version = version + vds[0].Version
}
}
// 存入新版本数据
pvd := &model.PublishedVersion{
Code: publishData.Name,
Proto: publishData.Proto,
UserID: publishData.UserID,
Note: publishData.Note,
Type: publishData.Type,
Category: publishData.Category,
PublishAt: time.Now(),
Version: version,
PublishID: pid,
}
err2 := pv.Create(pvd)
if err2 != nil {
panic(sys_error.New("发布草稿数据失败", err2))
}
// 更新发布数据
if pid == 0 {
pd := &model.Published{
Code: publishData.Name,
Type: publishData.Type,
Category: publishData.Category,
DataID: pvd.ID,
Status: 1,
}
// 保存发布信息
err4 := p.Create(pd)
if err4 != nil {
panic(sys_error.New("发布草稿数据失败", err4))
}
pid = pd.ID
// 更新发布版本信息
pv.Where(pv.ID.Eq(pvd.ID)).UpdateColumn(pv.PublishID, pd.ID)
} else {
// 更新发布信息
p.Where(p.ID.Eq(pid)).UpdateColumn(p.DataID, pvd.ID)
}
return pid
}
// 删除发布数据
func DeletePublishedById(id int32) {
dbquery.Published.Where(dbquery.Published.ID.Eq(id)).Delete()
dbquery.PublishedVersion.Where(dbquery.PublishedVersion.PublishID.Eq(id)).Delete()
dbquery.ProjectPublishLink.Where(dbquery.ProjectPublishLink.Mid.In(id)).Delete()
}
// SaveAsDraftingFromPublish 另存为草稿
func SaveAsDraftingFromPublish(id int32, user *model.User, req dto.PublishToDraftReqDto) *sys_error.BusinessError {
num, _ := dbquery.Drafting.Where(dbquery.Drafting.Name.Eq(req.DraftName)).Count()
if num > 0 { // 处理重名情况
return sys_error.New(fmt.Sprintf("草稿【%s】已存在", req.DraftName))
}
p, pv := dbquery.Published, dbquery.PublishedVersion
where := p.Select(p.Type, p.Category, pv.Proto).LeftJoin(pv, p.DataID.EqCol(pv.ID)).Where(p.ID.Eq(id))
var record dto.PublishedDto
err := where.Debug().Scan(&record)
if err != nil {
panic(sys_error.New("查询发布地图信息失败", err))
}
err1 := dbquery.Drafting.Save(&model.Drafting{
Name: req.DraftName,
Category: req.Category,
Proto: record.Proto,
CreatorID: user.ID,
CreatedAt: time.Now(),
UpdateAt: time.Now(),
Type: record.Type,
})
if err1 != nil {
return sys_error.New("保存草稿出错", err1)
}
return nil
}
// 查询项目关联的详细数据
func QueryProjectPublished(id int32) []*model.Published {
// 获取项目关联的发布地图
dppl, p := dbquery.ProjectPublishLink, dbquery.Published
var publisheds []*model.Published
err := dppl.Select(p.ID, p.Code, p.Category, p.Type).
LeftJoin(p, p.ID.EqCol(dppl.Mid)).
Where(dppl.Pid.Eq(id), p.Status.Eq(1)).Debug().Order(p.Type, p.Code).Scan(&publisheds)
if err != nil {
panic(sys_error.New("发布草稿数据失败", err))
}
return publisheds
}
// 根据名称获取地图详细信息
func GetPublishedGiByName(param *dto.PublishedSingleQueryDto) *dto.PublishedDto {
p, pv := dbquery.Published, dbquery.PublishedVersion
where := p.Select(p.ID, p.Code.As("name"), p.Type, p.Category, pv.Proto).
LeftJoin(pv, p.DataID.EqCol(pv.ID)).
Where(p.Code.Eq(param.Name), p.Status.Eq(1))
var record dto.PublishedDto
err := where.Debug().Scan(&record)
if err != nil {
panic(sys_error.New("查询发布地图信息失败", err))
}
return &record
}
// 修改发布数据状态
func ChangePublishStatus(id int32, release bool) {
var status int
if release {
status = 1
}
dbquery.Published.Debug().Where(dbquery.Published.ID.Eq(id)).UpdateColumn(dbquery.Published.Status, status)
if !release { // 下架时,删除关联关系
dbquery.ProjectPublishLink.Where(dbquery.ProjectPublishLink.Mid.In(id)).Delete()
}
}
// 修改发布Code
func ChangePublishCode(id int32, code string) {
p := dbquery.Published
count, err := p.Where(p.ID.Neq(id), p.Code.Eq(code)).Count()
if err != nil {
panic(sys_error.New("修改发布名称失败", err))
}
if count > 0 {
panic(sys_error.New("修改名称失败:名称已存在"))
}
p.Debug().Where(dbquery.Published.ID.Eq(id)).UpdateColumn(dbquery.Published.Code, code)
}
// 查询发布历史
func GetPublishHistory(id int32) []*dto.PublishHistoryDto {
u, p, pv := dbquery.User, dbquery.Published, dbquery.PublishedVersion
pd, err1 := p.Select(p.ID, p.DataID).Where(p.ID.Eq(id)).First()
if err1 != nil {
panic(sys_error.New(fmt.Sprintf("地图【%d】不存在", id)))
}
var records []*dto.PublishHistoryDto
err := pv.
Select(pv.ID, pv.PublishAt, pv.Note, pv.Version, u.Name.As("publisher"), pv.ID.Eq(pd.DataID).As("current")).
LeftJoin(u, u.ID.EqCol(pv.UserID)).
Where(pv.PublishID.Eq(id)).Order(pv.Version.Desc()).Scan(&records)
if err != nil {
panic(sys_error.New("查询发布历史信息失败", err))
}
return records
}
// 回退发布版本
func FallBackPublishHistory(mapId, versionId int32) (bool, error) {
p, pv := dbquery.Published, dbquery.PublishedVersion
pd, err := p.Select(p.ID, p.DataID).Where(p.ID.Eq(mapId)).First()
if err != nil {
return false, fmt.Errorf("地图【%d】不存在", mapId)
}
pvd, err := pv.Select(pv.ID, pv.PublishID).Where(pv.ID.Eq(versionId)).First()
if err != nil {
return false, fmt.Errorf("地图【%d】版本【%d】数据不存在", mapId, versionId)
}
if pvd.PublishID != pd.ID {
return false, fmt.Errorf("地图【%d】版本【%d】数据不匹配", mapId, versionId)
}
if pd.DataID == pvd.ID {
return false, nil
}
// 更新版本数据
p.Where(p.ID.Eq(mapId)).UpdateColumn(p.DataID, versionId)
return true, nil
}