package sandbox import ( "eta/eta_api/models/system" "eta/eta_api/utils" "fmt" "github.com/beego/beego/v2/client/orm" "github.com/rdlucklib/rdluck_tools/paging" "time" ) // Sandbox 沙盘推演主表 //type Sandbox struct { // SandboxId int `orm:"column(sandbox_id);pk" description:"沙盘id"` // Name string `description:"沙盘名称"` // ChartPermissionId int `description:"品种id"` // ChartPermissionName string `description:"品种名称"` // CurrVersion int `description:"当前版本"` // Code string `description:"沙盘code"` // Content string `description:"沙盘数据"` // PicUrl string `description:"沙盘图片地址"` // OpUserId int `description:"最近一次编辑操作的用户id"` // OpUserName string `description:"最近一次编辑的用户名称(冗余字段,避免查表)"` // IsDelete int8 `description:"是否删除,0:未删除,1:已删除"` // ModifyTime time.Time `description:"修改时间"` // CreateTime time.Time `description:"创建时间"` // SandboxClassifyId int `description:"分类id"` // Sort int `description:"排序"` //} type Sandbox struct { SandboxId int `orm:"column(sandbox_id);pk" description:"沙盘id"` Name string `description:"沙盘名称"` Code string `description:"沙盘code"` Content string `description:"沙盘数据"` MindmapData string `description:"思维导图数据"` PicUrl string `description:"沙盘图片地址"` SysUserId int `description:"作者id"` SysUserName string `description:"作者名称"` IsDelete int8 `description:"是否删除,0:未删除,1:已删除"` ModifyTime time.Time `description:"修改时间"` CreateTime time.Time `description:"创建时间"` SandboxClassifyId int `description:"分类id"` Sort int `description:"排序"` Style int `description:"风格"` } // Update 沙盘字段变更 func (sandbox *Sandbox) Update(cols []string) (err error) { o := orm.NewOrmUsingDB("data") _, err = o.Update(sandbox, cols...) return } // GetSandboxById 根据沙盘id获取沙盘详情 func GetSandboxById(sandboxId int) (sandboxInfo *Sandbox, err error) { o := orm.NewOrmUsingDB("data") sql := `select * from sandbox where sandbox_id = ? and is_delete = 0` err = o.Raw(sql, sandboxId).QueryRow(&sandboxInfo) return } // AddNewSandbox 添加一个新的沙盘 func AddNewSandbox(sandboxInfo *Sandbox, sandboxVersion *SandboxVersion, sandboxDraft *SandboxDraft) (err error) { o := orm.NewOrmUsingDB("data") to, err := o.Begin() if err != nil { return } defer func() { if err != nil { _ = to.Rollback() } else { _ = to.Commit() } }() id, err := to.Insert(sandboxInfo) if err != nil { return } sandboxInfo.SandboxId = int(id) // 新增版本 sandboxVersion.SandboxId = sandboxInfo.SandboxId id, err = to.Insert(sandboxVersion) if err != nil { return } sandboxVersion.SandboxVersionId = int(id) // 新增草稿 sandboxDraft.SandboxId = sandboxInfo.SandboxId id, err = to.Insert(sandboxDraft) if err != nil { return } sandboxDraft.SandboxDraftId = int(id) return } // UpdateSandbox 更新沙盘 func UpdateSandbox(sandboxInfo *Sandbox, updateSandboxColumn []string, sandboxVersion *SandboxVersion, sandboxDraft *SandboxDraft) (err error) { o := orm.NewOrmUsingDB("data") to, err := o.Begin() if err != nil { return } defer func() { if err != nil { _ = to.Rollback() } else { _ = to.Commit() } }() _, err = to.Update(sandboxInfo, updateSandboxColumn...) if err != nil { return } // 新增版本 sandboxVersion.SandboxId = sandboxInfo.SandboxId id, err := to.Insert(sandboxVersion) if err != nil { return } sandboxVersion.SandboxVersionId = int(id) // 新增草稿 sandboxDraft.SandboxId = sandboxInfo.SandboxId id, err = to.Insert(sandboxDraft) if err != nil { return } sandboxDraft.SandboxDraftId = int(id) return } // UpdateSandboxName 更新沙盘(仅仅更新名称) func UpdateSandboxName(sandboxInfo *Sandbox, sandboxVersion *SandboxVersion, sandboxDraft *SandboxDraft, updateSandboxColumn, updateSandboxVersionColumn []string) (err error) { o := orm.NewOrmUsingDB("data") to, err := o.Begin() if err != nil { return } defer func() { if err != nil { _ = to.Rollback() } else { _ = to.Commit() } }() _, err = to.Update(sandboxInfo, updateSandboxColumn...) if err != nil { return } // 更新版本 _, err = to.Update(sandboxVersion, updateSandboxVersionColumn...) if err != nil { return } // 新增草稿 sandboxDraft.SandboxId = sandboxInfo.SandboxId id, err := to.Insert(sandboxDraft) if err != nil { return } sandboxDraft.SandboxDraftId = int(id) return } // SandboxListItem 沙盘推演列表数据 type SandboxListItem struct { SandboxId int `description:"沙盘id"` Name string `description:"沙盘名称"` ChartPermissionId int `description:"品种id"` ChartPermissionName string `description:"品种名称"` CurrVersion int `description:"当前版本"` Code string `description:"沙盘code"` VersionCode string `description:"沙盘版本code"` //Content string `description:"沙盘数据"` PicUrl string `description:"沙盘图片地址"` OpUserId int `description:"最近一次编辑操作的用户id"` OpUserName string `description:"最近一次编辑的用户名称(冗余字段,避免查表)"` IsDelete int8 `description:"是否删除,0:未删除,1:已删除" json:"is_delete"` CanEdit bool `description:"是否可编辑"` Editor string `description:"编辑人"` VersionTotal int `description:"历史版本数量"` ModifyTime time.Time `description:"修改时间"` CreateTime time.Time `description:"创建时间"` } // GetList 获取沙盘列表页 func GetList(condition string, pars []interface{}, startSize, pageSize int) (total int, list []*Sandbox, err error) { o := orm.NewOrmUsingDB("data") sql := "select a.sandbox_id,a.name,a.code,a.pic_url,a.sys_user_id,a.sys_user_name,a.modify_time,a.create_time from sandbox as a where 1=1 AND a.is_delete = 0 " sql += condition sql += ` order by a.modify_time desc,a.sandbox_id desc` totalSql := `select count(1) total from (` + sql + `) z ` err = o.Raw(totalSql, pars).QueryRow(&total) if err != nil { return } sql += ` LIMIT ?,? ` _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list) return } // SandboxSaveResp 保存沙盘响应体 type SandboxSaveResp struct { *Sandbox VersionCode string `description:"版本号"` } func GetSandboxAll() (list []*SandboxClassifyItems, err error) { o := orm.NewOrmUsingDB("data") sql := `SELECT sandbox_id,sandbox_classify_id,name AS sandbox_classify_name, sort FROM sandbox ` _, err = o.Raw(sql).QueryRows(&list) return } // CheckOpSandboxPermission 判断沙盘操作权限 func CheckOpSandboxPermission(sysUser *system.Admin, createUserId int) (ok bool) { if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN { ok = true } // 如果图表创建人与当前操作人相同的话,那么就是允许操作 if ok == false && createUserId == sysUser.AdminId { ok = true } // 如果图表权限id 是 1 ,那么允许编辑 if ok == false && sysUser.ChartPermission == 1 { ok = true } return } // GetSandboxInfoByAdminId 获取所有我创建的沙盘,用于分类展示 func GetSandboxInfoByAdminId(adminId int) (items []*SandboxClassifyItems, err error) { o := orm.NewOrmUsingDB("data") sql := ` SELECT sandbox_id,sandbox_classify_id,name AS sandbox_classify_name,code, sys_user_id,sys_user_name FROM sandbox where sys_user_id = ? ORDER BY sort asc,create_time ASC ` _, err = o.Raw(sql, adminId).QueryRows(&items) return } func GetSandboxClassify(sandboxClassifyId int) (sandbox_classify_id string, err error) { o := orm.NewOrmUsingDB("data") sql := `SELECT GROUP_CONCAT(t.sandbox_classify_id) AS sandbox_classify_id FROM ( SELECT a.sandbox_classify_id FROM sandbox_classify AS a WHERE a.sandbox_classify_id=? UNION ALL SELECT a.sandbox_classify_id FROM sandbox_classify AS a WHERE a.parent_id=? UNION ALL SELECT sandbox_classify_id FROM sandbox_classify WHERE parent_id IN ( SELECT sandbox_classify_id FROM sandbox_classify WHERE parent_id = ? ) )AS t` err = o.Raw(sql, sandboxClassifyId, sandboxClassifyId, sandboxClassifyId).QueryRow(&sandbox_classify_id) return } type SandboxListItems struct { Sandbox ParentIds string } func GetSandboxListByCondition(condition string, pars []interface{}, startSize, pageSize int) (item []*SandboxListItems, err error) { o := orm.NewOrmUsingDB("data") sql := ` SELECT * FROM sandbox WHERE 1=1 ` if condition != "" { sql += condition } sql += " ORDER BY create_time DESC LIMIT ?,? " _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item) return } func GetSandboxListCountByCondition(condition string, pars []interface{}) (count int, err error) { o := orm.NewOrmUsingDB("data") sql := ` SELECT COUNT(1) AS count FROM sandbox WHERE 1=1 ` if condition != "" { sql += condition } err = o.Raw(sql, pars).QueryRow(&count) return } type SandboxListResp struct { Paging *paging.PagingItem List []*SandboxListItems } func AddSandbox(item *Sandbox) (lastId int64, err error) { o := orm.NewOrmUsingDB("data") lastId, err = o.Insert(item) return } func GetSandboxItemsByClassifyId(sandboxClassifyId int) (list []*SandboxClassifyItems, err error) { o := orm.NewOrmUsingDB("data") sql := `SELECT sandbox_id,sandbox_classify_id,name AS sandbox_classify_name, sort FROM sandbox WHERE sandbox_classify_id = ? AND is_delete = 0 ORDER BY sort ` _, err = o.Raw(sql, sandboxClassifyId).QueryRows(&list) return } func GetSandboxAllParentByClassifyId(sandboxClassifyId int) (ids string, err error) { o := orm.NewOrmUsingDB("data") sql := `SELECT GROUP_CONCAT(DISTINCT m.sandbox_classify_id ORDER BY m.level) AS ids FROM ( SELECT @id AS _id,( SELECT @id := parent_id FROM sandbox_classify WHERE sandbox_classify_id = _id ) FROM ( SELECT @id :=( SELECT parent_id FROM sandbox_classify WHERE sandbox_classify_id = ? )) vm, sandbox_classify m WHERE @id IS NOT NULL ) vm INNER JOIN sandbox_classify m WHERE sandbox_classify_id = vm._id ` err = o.Raw(sql, sandboxClassifyId).QueryRow(&ids) return } type MoveSandboxReq struct { SandboxId int `description:"沙盘ID"` PrevSandboxId int `description:"上一个沙盘ID"` NextSandboxId int `description:"下一个沙盘ID"` SandboxClassifyId int `description:"分类id"` } func GetSandboxClassifyCountById(classifyId int) (count int, err error) { o := orm.NewOrmUsingDB("data") sql := `SELECT count(1) AS count FROM sandbox_classify WHERE sandbox_classify_id=? ` err = o.Raw(sql, classifyId).QueryRow(&count) return } // GetSandboxByClassifyIdAndName 根据分类id和沙盘名获取图表信息 func GetSandboxByClassifyIdAndName(classifyId int, name string) (item *Sandbox, err error) { o := orm.NewOrmUsingDB("data") sql := ` SELECT * FROM sandbox WHERE sandbox_classify_id = ? and name=? ` err = o.Raw(sql, classifyId, name).QueryRow(&item) return } // GetSandboxNameByIds 根据沙盘名称 func GetSandboxNameByIds(ids []int) (items []*Sandbox, err error) { o := orm.NewOrmUsingDB("data") sql := ` SELECT sandbox_id, name FROM sandbox WHERE sandbox_id in (` + utils.GetOrmInReplace(len(ids)) + `) ` _, err = o.Raw(sql, ids).QueryRows(&items) return } func MoveSandbox(sandboxId, classifyId int) (err error) { o := orm.NewOrmUsingDB("data") sql := ` UPDATE sandbox SET sandbox_classify_id = ? WHERE sandbox_id = ?` _, err = o.Raw(sql, classifyId, sandboxId).Exec() return } // UpdateSandboxSortByClassifyId 根据沙盘id更新排序 func UpdateSandboxSortByClassifyId(classifyId, nowSort, prevSandboxId int, updateSort string) (err error) { o := orm.NewOrmUsingDB("data") sql := ` update sandbox set sort = ` + updateSort + ` WHERE sandbox_classify_id=? AND ` if prevSandboxId > 0 { sql += ` (sort > ? or (sandbox_id > ` + fmt.Sprint(prevSandboxId) + ` and sort = ` + fmt.Sprint(nowSort) + `))` } _, err = o.Raw(sql, classifyId, nowSort).Exec() return } // GetFirstSandboxByClassifyId 获取当前分类下,且排序数相同 的排序第一条的数据 func GetFirstSandboxByClassifyId(classifyId int) (item *Sandbox, err error) { o := orm.NewOrmUsingDB("data") sql := ` SELECT * FROM sandbox WHERE sandbox_classify_id=? order by sort asc,sandbox_id asc limit 1` err = o.Raw(sql, classifyId).QueryRow(&item) return } // ContentDataStruct 沙盘内容结构体 type ContentDataStruct struct { Cells []struct { Data *NodeData `json:"data,omitempty"` } `json:"cells"` } type NodeData struct { LinkData []*LinkData `json:"linkData"` LinkFold bool `json:"linkFold"` } type LinkData struct { RId string `json:"RId"` Id int `json:"Id"` Name string `json:"Name"` Type int `json:"Type"` Editing bool `json:"editing"` DatabaseType int `json:"databaseType"` DetailParams DetailParams `json:"detailParams"` } type DetailParams struct { Code string `json:"code"` Id int `json:"id"` ClassifyId int `json:"classifyId"` } // UpdateSandboxContent 更新沙盘内容 func UpdateSandboxContent(list []Sandbox) (err error) { o := orm.NewOrmUsingDB("data") to, err := o.Begin() if err != nil { return } defer func() { if err != nil { _ = to.Rollback() } else { _ = to.Commit() } }() //循环更新沙盘内容 for _, sandbox := range list { _, err = to.Update(&sandbox, "Content", "ModifyTime") if err != nil { return } } return }