作者 yangfu

增加企业缓存

返回组织对应的企业信息
... ... @@ -13,6 +13,8 @@ type GetOrgQuery struct {
OperateInfo *domain.OperateInfo `json:"-"`
// 组织ID
OrgId int64 `cname:"组织ID" json:"orgId" valid:"Required"`
// 获取标记 bit 0:获取企业数据
FetchFlag int `cname:"获取标记" json:"fetchFlag,omitempty"`
}
func (getOrgQuery *GetOrgQuery) Valid(validation *validation.Validation) {
... ...
... ... @@ -9,6 +9,10 @@ import (
"github.com/beego/beego/v2/core/validation"
)
const (
FetchCompanyInfo = 1 << iota
)
type ListOrgQuery struct {
OperateInfo *domain.OperateInfo `json:"-"`
// 查询偏离量
... ...
... ... @@ -154,12 +154,18 @@ func (orgService *OrgService) GetOrg(getOrgQuery *query.GetOrgQuery) (interface{
}
if org == nil {
return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(getOrgQuery.OrgId)))
} else {
}
if getOrgQuery.FetchFlag&query.FetchCompanyInfo > 0 && org.CompanyId > 0 {
companyRepository, _, _ := factory.FastPgCompany(transactionContext, 0)
if company, err := companyRepository.FindOne(map[string]interface{}{"companyId": org.CompanyId}); err == nil && company != nil {
org.Company = company.ToCompanyVisible()
}
}
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
return org, nil
}
}
// 获取组织的子部门(通用部门列表使用)
... ... @@ -215,17 +221,11 @@ func (orgService *OrgService) ListOrg(listOrgQuery *query.ListOrgQuery) (interfa
defer func() {
transactionContext.RollbackTransaction()
}()
var orgRepository domain.OrgRepository
if value, err := factory.CreateOrgRepository(map[string]interface{}{
"transactionContext": transactionContext,
}); err != nil {
orgRepository, _, _ := factory.FastPgOrg(transactionContext, 0)
count, orgs, err := orgRepository.Find(utils.ObjectToMap(listOrgQuery))
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
orgRepository = value
}
if count, orgs, err := orgRepository.Find(utils.ObjectToMap(listOrgQuery)); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
... ... @@ -233,7 +233,6 @@ func (orgService *OrgService) ListOrg(listOrgQuery *query.ListOrgQuery) (interfa
"count": count,
"orgs": orgs,
}, nil
}
}
// 移除组织
... ...
package domain
import "time"
import (
"fmt"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-user/pkg/constant"
"time"
)
// 公司状态状态 1:已注册 2:待认证 3:已认证
const (
... ... @@ -76,9 +80,8 @@ func (company *Company) Update(data map[string]interface{}) error {
if createdAt, ok := data["createdAt"]; ok {
company.CreatedAt = createdAt.(time.Time)
}
if updatedAt, ok := data["updatedAt"]; ok {
company.UpdatedAt = updatedAt.(time.Time)
}
company.UpdatedAt = time.Now()
return nil
}
... ... @@ -89,3 +92,34 @@ func (company *Company) CloneSample() *Company {
CompanyInfo: company.CompanyInfo,
}
}
func (company *Company) ToCompanyVisible() *CompanyVisible {
return &CompanyVisible{
CompanyId: company.CompanyId,
CompanyInfo: *company.CompanyInfo,
Status: company.Status,
SystemName: company.CompanyConfig.SystemName,
}
}
/***** 2.缓存模块 *****/
func (company *Company) CacheKeyFunc() string {
if constant.DISABLE_REPOSITORY_CACHE {
return ""
}
if company.CompanyId == 0 {
return ""
}
return fmt.Sprintf("%v:cache:company:id:%v", constant.CACHE_PREFIX, company.CompanyId)
}
type CompanyVisible struct {
// 企业id
CompanyId int64 `json:"companyId"`
// 企业基本信息
CompanyInfo
Status int `json:"status"`
// 系统名称
SystemName string `json:"systemName,omitempty"`
}
... ...
... ... @@ -46,6 +46,9 @@ type Org struct {
ParentId int64 `json:"parentId,omitempty"`
// 父级节点路径("0,11,12,")
ParentPath string `json:"parentPath,omitempty"`
// 企业id
Company *CompanyVisible `json:"company,omitempty"`
}
type OrgRepository interface {
... ...
... ... @@ -3,6 +3,8 @@ package repository
import (
"fmt"
"github.com/go-pg/pg/v10"
"github.com/linmadan/egglib-go/persistent/cache"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-user/pkg/constant"
"github.com/linmadan/egglib-go/persistent/pg/sqlbuilder"
pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
... ... @@ -13,6 +15,7 @@ import (
)
type CompanyRepository struct {
*cache.CachedRepository
transactionContext *pgTransaction.TransactionContext
}
... ... @@ -66,6 +69,7 @@ func (repository *CompanyRepository) Save(company *domain.Company) (*domain.Comp
return company, err
}
} else {
queryFunc := func() (interface{}, error) {
if _, err := tx.QueryOne(
pg.Scan(
&company.CompanyId,
... ... @@ -85,6 +89,11 @@ func (repository *CompanyRepository) Save(company *domain.Company) (*domain.Comp
); err != nil {
return company, err
}
return company, nil
}
if _, err := repository.Query(queryFunc, company.CacheKeyFunc()); err != nil {
return company, err
}
}
return company, nil
}
... ... @@ -92,14 +101,21 @@ func (repository *CompanyRepository) Remove(company *domain.Company) (*domain.Co
tx := repository.transactionContext.PgTx
companyModel := new(models.Company)
companyModel.CompanyId = company.Identify().(int64)
queryFunc := func() (interface{}, error) {
if _, err := tx.Model(companyModel).WherePK().Delete(); err != nil {
return company, err
}
return company, nil
}
if _, err := repository.Query(queryFunc, company.CacheKeyFunc()); err != nil {
return company, err
}
return company, nil
}
func (repository *CompanyRepository) FindOne(queryOptions map[string]interface{}) (*domain.Company, error) {
tx := repository.transactionContext.PgTx
companyModel := new(models.Company)
queryFunc := func() (interface{}, error) {
query := sqlbuilder.BuildQuery(tx.Model(companyModel), queryOptions)
query.SetWhereByQueryOption("company.company_id = ?", "companyId")
... ... @@ -113,6 +129,15 @@ func (repository *CompanyRepository) FindOne(queryOptions map[string]interface{}
return nil, err
}
}
return companyModel, nil
}
var cacheModel = &domain.Company{}
if _, ok := queryOptions["companyId"]; ok {
cacheModel.CompanyId = queryOptions["companyId"].(int64)
}
if err := repository.QueryCache(cacheModel.CacheKeyFunc, companyModel, queryFunc, cache.WithObjectToExpire(constant.REPOSITORY_CACHE_EXPIRE)); err != nil {
return nil, err
}
if companyModel.CompanyId == 0 {
return nil, nil
} else {
... ... @@ -145,6 +170,7 @@ func NewCompanyRepository(transactionContext *pgTransaction.TransactionContext)
} else {
return &CompanyRepository{
transactionContext: transactionContext,
CachedRepository: cache.NewDefaultCachedRepository(),
}, nil
}
}
... ...
... ... @@ -36,6 +36,7 @@ func (controller *OrgController) GetOrg() {
getOrgQuery := &query.GetOrgQuery{}
orgId, _ := controller.GetInt64(":orgId")
getOrgQuery.OrgId = orgId
getOrgQuery.FetchFlag, _ = controller.GetInt("fetchFlag")
getOrgQuery.OperateInfo = ParseOperateInfo(controller.BaseController)
data, err := orgService.GetOrg(getOrgQuery)
controller.Response(data, err)
... ...