305 lines
8.9 KiB
Go
305 lines
8.9 KiB
Go
package gorm
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"encoding/json"
|
|
|
|
"go-common/app/admin/main/aegis/model/resource"
|
|
"go-common/library/log"
|
|
|
|
"github.com/jinzhu/gorm"
|
|
"go-common/app/admin/main/aegis/model"
|
|
)
|
|
|
|
const (
|
|
_resourceResSQL = "SELECT r.id, r.business_id, r.oid, r.mid,r.content,r.extra1,r.extra2,r.extra3,r.extra4,r.extra1s,r.extra2s,r.metadata, rr.attribute, rr.note, rr.reject_reason, rr.reason_id, rr.state, rr.pubtime, rr.deltime " +
|
|
"FROM resource r LEFT JOIN resource_result rr ON r.id = rr.rid WHERE r.id = ?"
|
|
_resByOIDSQL = "SELECT r.id, r.business_id, r.oid, r.mid,r.content,r.extra1,r.extra2,r.extra3,r.extra4,r.extra1s,r.extra2s,r.metadata, rr.attribute, rr.note, rr.reject_reason, rr.reason_id, rr.state, rr.pubtime, rr.deltime " +
|
|
"FROM resource r LEFT JOIN resource_result rr ON r.id = rr.rid WHERE r.business_id = ? AND r.oid = ?"
|
|
)
|
|
|
|
var _changeableFields = map[string]struct{}{
|
|
"extra1": {},
|
|
"extra2": {},
|
|
"extra3": {},
|
|
"extra4": {},
|
|
"extra5": {},
|
|
"extra6": {},
|
|
"extra1s": {},
|
|
"extra2s": {},
|
|
"extra3s": {},
|
|
"extra4s": {},
|
|
"extratime1": {},
|
|
}
|
|
|
|
// ListHelperForTask 补充任务列表里面的oid和content
|
|
func (d *Dao) ListHelperForTask(c context.Context, rids []int64) (res map[int64][]interface{}, err error) {
|
|
var (
|
|
rows *sql.Rows
|
|
id int64
|
|
oid, content, metadata string
|
|
)
|
|
if rows, err = d.orm.Table("resource").Select("id,oid,content,metadata").Where("id IN (?)", rids).Rows(); err != nil {
|
|
log.Error("listHelperForTask err(%v)", err)
|
|
return
|
|
}
|
|
|
|
res = make(map[int64][]interface{})
|
|
defer rows.Close()
|
|
for rows.Next() {
|
|
if err = rows.Scan(&id, &oid, &content, &metadata); err != nil {
|
|
log.Error("rows.Scan error(%v)", err)
|
|
return
|
|
}
|
|
metas := make(map[string]interface{})
|
|
if len(metadata) > 0 {
|
|
if err = json.Unmarshal([]byte(metadata), &metas); err != nil {
|
|
log.Error("ListHelperForTask err(%+v)\n", err)
|
|
}
|
|
err = nil
|
|
}
|
|
res[id] = []interface{}{oid, content, metas}
|
|
}
|
|
return
|
|
}
|
|
|
|
// TxAddResource .
|
|
func (d *Dao) TxAddResource(tx *gorm.DB, r *resource.Resource, rr *resource.Result) (rid int64, err error) {
|
|
err = tx.Table("resource").Where("business_id=? AND oid=?", r.BusinessID, r.OID).
|
|
Assign(map[string]interface{}{
|
|
"oid": r.OID,
|
|
"content": r.Content,
|
|
"extra1": r.Extra1,
|
|
"extra2": r.Extra2,
|
|
"extra3": r.Extra3,
|
|
"extra4": r.Extra4,
|
|
"extra1s": r.Extra1s,
|
|
"extra2s": r.Extra2s,
|
|
"metadata": r.MetaData,
|
|
"extra5": r.Extra5,
|
|
"extra6": r.Extra6,
|
|
"extra3s": r.Extra3s,
|
|
"extra4s": r.Extra4s,
|
|
"extratime1": r.ExtraTime1,
|
|
"octime": r.OCtime,
|
|
"ptime": r.Ptime,
|
|
}).FirstOrCreate(&r).Error
|
|
if err != nil {
|
|
return
|
|
}
|
|
rid = r.ID
|
|
rr.RID = r.ID
|
|
err = tx.Table("resource_result").Where("rid=?", rr.RID).Assign(map[string]interface{}{
|
|
"attribute": rr.Attribute,
|
|
"note": rr.Note,
|
|
"reject_reason": rr.RejectReason,
|
|
"reason_id": rr.ReasonID,
|
|
"state": rr.State,
|
|
"pubtime": rr.PubTime,
|
|
"deltime": rr.DelTime,
|
|
}).FirstOrCreate(&rr).Error
|
|
return
|
|
}
|
|
|
|
// ResourceByOID .
|
|
func (d *Dao) ResourceByOID(c context.Context, OID string, bizID int64) (res *resource.Resource, err error) {
|
|
res = &resource.Resource{}
|
|
if err = d.orm.Where("oid = ? AND business_id = ?", OID, bizID).First(res).Error; err == gorm.ErrRecordNotFound {
|
|
res = nil
|
|
err = nil
|
|
}
|
|
return
|
|
}
|
|
|
|
// RidsByOids .
|
|
func (d *Dao) RidsByOids(c context.Context, bizID int64, oids []string) (rids string, err error) {
|
|
err = d.orm.Table("resource").Select("GROUP_CONCAT(id)").Where("business_id=? AND oid IN (?)", bizID, oids).Row().Scan(&rids)
|
|
return
|
|
}
|
|
|
|
// OidByRID 通过rid查到oid
|
|
func (d *Dao) OidByRID(c context.Context, rid int64) (oid string, err error) {
|
|
if err = d.orm.Table("resource").Select("oid").Where("id=?", rid).Row().Scan(&oid); err == sql.ErrNoRows {
|
|
err = nil
|
|
}
|
|
return
|
|
}
|
|
|
|
// TxUpdateResult .
|
|
func (d *Dao) TxUpdateResult(ormTx *gorm.DB, rid int64, res map[string]interface{}, rscRes *resource.Result) (err error) {
|
|
params := make(map[string]interface{})
|
|
for k, v := range res {
|
|
if k != "state" && k != "attribute" {
|
|
continue
|
|
}
|
|
params[k] = v
|
|
}
|
|
|
|
db := ormTx.Table("resource_result").
|
|
Where("rid = ?", rid)
|
|
//Update(params)
|
|
if rscRes != nil {
|
|
if rscRes.Attribute != -1 {
|
|
params["attribute"] = rscRes.Attribute
|
|
}
|
|
if rscRes.Note != "" {
|
|
params["note"] = rscRes.Note
|
|
}
|
|
if rscRes.RejectReason != "" {
|
|
params["reject_reason"] = rscRes.RejectReason
|
|
}
|
|
if rscRes.ReasonID != 0 {
|
|
params["reason_id"] = rscRes.ReasonID
|
|
}
|
|
}
|
|
return db.Update(params).Error
|
|
}
|
|
|
|
// TxUpdateResource . TODO Resource表的字段要不要直接审核提交变更 还是等待业务方同步更新?(例如单话的上线下线)
|
|
func (d *Dao) TxUpdateResource(ormTx *gorm.DB, rid int64, res map[string]interface{}) (err error) {
|
|
params := make(map[string]interface{})
|
|
for k, v := range res {
|
|
if _, ok := _changeableFields[k]; !ok {
|
|
continue
|
|
}
|
|
params[k] = v
|
|
}
|
|
|
|
return ormTx.Table("resource").Where("id = ?", rid).Update(params).Error
|
|
}
|
|
|
|
// TxUpdateState 更新状态
|
|
func (d *Dao) TxUpdateState(tx *gorm.DB, rids []int64, state int) (err error) {
|
|
return tx.Table("resource_result").Where("rid IN (?)", rids).Update("state", state).Error
|
|
}
|
|
|
|
// UpdateResource 更新资源
|
|
func (d *Dao) UpdateResource(c context.Context, bizid int64, oid string, update map[string]interface{}) (rows int64, err error) {
|
|
db := d.orm.Table("resource").Where("business_id=? AND oid=?", bizid, oid).Update(update)
|
|
return db.RowsAffected, db.Error
|
|
}
|
|
|
|
// ResourceRes .
|
|
func (d *Dao) ResourceRes(c context.Context, rid int64) (res *resource.Res, err error) {
|
|
res = &resource.Res{}
|
|
if err = d.orm.Raw(_resourceResSQL, rid).Scan(res).Error; err == gorm.ErrRecordNotFound {
|
|
res = nil
|
|
err = nil
|
|
}
|
|
return
|
|
}
|
|
|
|
// ResByOID .
|
|
func (d *Dao) ResByOID(c context.Context, bizID int64, OID string) (res *resource.Res, err error) {
|
|
res = &resource.Res{}
|
|
if err = d.orm.Raw(_resByOIDSQL, bizID, OID).Scan(res).Error; err == gorm.ErrRecordNotFound {
|
|
res = nil
|
|
err = nil
|
|
}
|
|
return
|
|
}
|
|
|
|
//ResOIDByID 根据id获取资源oid
|
|
func (d *Dao) ResOIDByID(c context.Context, rids []int64) (res map[int64]string, err error) {
|
|
list := []struct {
|
|
ID int64 `gorm:"column:id"`
|
|
OID string `gorm:"column:oid"`
|
|
}{}
|
|
res = map[int64]string{}
|
|
if err = d.orm.Table("resource").Select("id,oid").Where("id in (?)", rids).Find(&list).Error; err != nil {
|
|
log.Error("ResOIDByID error(%v) rids(%v)", err, rids)
|
|
return
|
|
}
|
|
|
|
for _, item := range list {
|
|
res[item.ID] = item.OID
|
|
}
|
|
return
|
|
}
|
|
|
|
//ResIDByOID 根据oid获取rid
|
|
func (d *Dao) ResIDByOID(C context.Context, bizID int64, oids []string) (res map[string]int64, err error) {
|
|
list := []struct {
|
|
ID int64 `gorm:"column:id"`
|
|
OID string `gorm:"column:oid"`
|
|
}{}
|
|
res = map[string]int64{}
|
|
if err = d.orm.Table("resource").Select("id,oid").Where("business_id=? and oid in (?)", bizID, oids).Find(&list).Error; err != nil {
|
|
log.Error("ResIDByOID error(%v) oids(%v)", err, oids)
|
|
return
|
|
}
|
|
|
|
for _, item := range list {
|
|
res[item.OID] = item.ID
|
|
}
|
|
return
|
|
}
|
|
|
|
//ResourceHit 根据状态筛选资源
|
|
func (d *Dao) ResourceHit(c context.Context, rids []int64) (hitids map[int64]int64, err error) {
|
|
hitids = make(map[int64]int64)
|
|
rows, err := d.orm.Table("resource_result").Select("rid,state").Where("rid IN (?)", rids).Rows()
|
|
if err != nil {
|
|
log.Error("ResourceHitState error(%v)", err)
|
|
return
|
|
}
|
|
defer rows.Close()
|
|
for rows.Next() {
|
|
var rid, state int64
|
|
if err = rows.Scan(&rid, &state); err != nil {
|
|
log.Error("ResourceHitState error(%v)", err)
|
|
}
|
|
hitids[rid] = state
|
|
}
|
|
return
|
|
}
|
|
|
|
//ResultByRID result by rid
|
|
func (d *Dao) ResultByRID(c context.Context, rid int64) (res *resource.Result, err error) {
|
|
res = &resource.Result{}
|
|
if err = d.orm.Where("rid=?", rid).First(&res).Error; err == gorm.ErrRecordNotFound {
|
|
log.Error("ResultByRID rid(%d) error(%v)", rid, err)
|
|
}
|
|
return
|
|
}
|
|
|
|
//MetaByRID .
|
|
func (d *Dao) MetaByRID(c context.Context, rids []int64) (metas map[int64]string, err error) {
|
|
var rows *sql.Rows
|
|
metas = make(map[int64]string)
|
|
rows, err = d.orm.Table("resource").Select("id,metadata").Where("id IN (?)", rids).Rows()
|
|
if err != nil {
|
|
log.Error("MetaByRID Query error(%v)", err)
|
|
return
|
|
}
|
|
defer rows.Close()
|
|
|
|
for rows.Next() {
|
|
var (
|
|
id int64
|
|
meta string
|
|
)
|
|
if err = rows.Scan(&id, &meta); err != nil {
|
|
log.Error("MetaByRID rows.Scan error(%v)", err)
|
|
return
|
|
}
|
|
metas[id] = meta
|
|
}
|
|
return
|
|
}
|
|
|
|
//UpsertByOIDs 获取需要更新到搜索部分
|
|
func (d *Dao) UpsertByOIDs(c context.Context, businessID int64, oids []string) (res []*model.UpsertItem, err error) {
|
|
res = []*model.UpsertItem{}
|
|
sqlstr := `SELECT r.id,r.extra1,r.extra2,r.extra3,r.extra4,rr.state
|
|
FROM resource r
|
|
LEFT JOIN resource_result rr ON r.id=rr.rid
|
|
WHERE r.business_id=? AND r.oid IN (?)`
|
|
if err = d.orm.Raw(sqlstr, businessID, oids).Find(&res).Error; err != nil {
|
|
log.Error("UpsertByOIDs error(%+v) businessid(%d) oids(%+v)", err, businessID, oids)
|
|
}
|
|
|
|
return
|
|
}
|