b_organization.go 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. package internal
  2. import (
  3. "context"
  4. "github.com/gogf/gf/v2/util/guid"
  5. "yx-dataset-server/app/errors"
  6. "yx-dataset-server/app/model"
  7. "yx-dataset-server/app/schema"
  8. "yx-dataset-server/library/redis"
  9. )
  10. // NewOrganization 创建Organization
  11. func NewOrganization(
  12. mTrans model.ITrans,
  13. mOrganization model.IOrganization,
  14. mFile model.IDatasetFile,
  15. mDataset model.IDataset,
  16. mUser model.IUser,
  17. mRole model.IRole,
  18. mRelation model.IDatasetRelation,
  19. ) *Organization {
  20. return &Organization{
  21. transModel: mTrans,
  22. organizationModel: mOrganization,
  23. fileModel: mFile,
  24. datasetModel: mDataset,
  25. userModel: mUser,
  26. roleModel: mRole,
  27. relationModel: mRelation,
  28. }
  29. }
  30. // Organization 创建Organization对象
  31. type Organization struct {
  32. organizationModel model.IOrganization
  33. transModel model.ITrans
  34. fileModel model.IDatasetFile
  35. datasetModel model.IDataset
  36. userModel model.IUser
  37. roleModel model.IRole
  38. relationModel model.IDatasetRelation
  39. }
  40. // Query 查询数据
  41. func (a *Organization) Query(ctx context.Context, params schema.OrganizationQueryParam, opts ...schema.OrganizationQueryOptions) (*schema.OrganizationQueryResult, error) {
  42. dataset, err := a.datasetModel.Query(ctx, schema.DatasetQueryParam{})
  43. if err != nil {
  44. return nil, err
  45. }
  46. // 非系统管理员仅可看到本组织
  47. if isSys, _ := IsSystemAdmin(ctx, a.userModel, a.roleModel); !isSys {
  48. user, err := a.userModel.Get(ctx, GetUserID(ctx))
  49. if err != nil {
  50. return nil, err
  51. }
  52. // 基于组织+用户维度的授权查询本组织可访问的知识库
  53. bizIds := []string{user.OrgId, GetUserID(ctx)}
  54. rel, err := a.relationModel.Query(ctx, schema.DatasetRelationQueryParam{BizIds: bizIds})
  55. if err != nil {
  56. return nil, err
  57. }
  58. dataset, err = a.datasetModel.Query(ctx, schema.DatasetQueryParam{RecordIds: rel.Data.ToDatasetIds()})
  59. if err != nil {
  60. return nil, err
  61. }
  62. if len(dataset.Data) == 0 {
  63. params.RecordIds = []string{user.OrgId}
  64. } else {
  65. params.RecordIds = dataset.Data.ToOrgIds()
  66. if params.RecordIds == nil {
  67. params.RecordIds = []string{}
  68. }
  69. params.RecordIds = append(params.RecordIds, user.OrgId)
  70. }
  71. }
  72. result, err := a.organizationModel.Query(ctx, params, opts...)
  73. if err != nil {
  74. return nil, err
  75. }
  76. if len(result.Data) > 0 {
  77. user, err := a.userModel.Query(ctx, schema.UserQueryParam{RecordIDs: result.Data.ToUserIds()})
  78. if err != nil {
  79. return nil, err
  80. }
  81. dataset.Data.FillCreator(user.Data)
  82. result.Data.FillCreator(user.Data)
  83. result.Data.FillDataset(dataset.Data)
  84. }
  85. for _, v := range result.Data {
  86. v.Used, _ = redis.GetRedisClient().Get(ctx, "chart:organization:"+v.RecordID).Int()
  87. v.Unused = v.ChartNum - v.Used
  88. }
  89. return result, nil
  90. }
  91. // Get 查询指定数据
  92. func (a *Organization) Get(ctx context.Context, recordID string, opts ...schema.OrganizationQueryOptions) (*schema.Organization, error) {
  93. item, err := a.organizationModel.Get(ctx, recordID, opts...)
  94. if err != nil {
  95. return nil, err
  96. } else if item == nil {
  97. return nil, errors.ErrNotFound
  98. }
  99. user, err := a.userModel.Get(ctx, item.CreatorId)
  100. if err != nil {
  101. return nil, err
  102. }
  103. if user != nil {
  104. item.CreatorName = user.RealName
  105. }
  106. // 查询组织维度有权限的知识库(包含自建企业KB 与 被分配的共享KB)
  107. rel, err := a.relationModel.Query(ctx, schema.DatasetRelationQueryParam{BizId: recordID})
  108. if err != nil {
  109. return nil, err
  110. }
  111. if len(rel.Data) > 0 {
  112. datasets, err := a.datasetModel.Query(ctx, schema.DatasetQueryParam{RecordIds: rel.Data.ToDatasetIds()})
  113. if err != nil {
  114. return nil, err
  115. }
  116. item.Datasets = datasets.Data
  117. }
  118. item.Used, _ = redis.GetRedisClient().Get(ctx, "chart:organization:"+item.RecordID).Int()
  119. item.Unused = item.ChartNum - item.Used
  120. return item, nil
  121. }
  122. // Create 创建数据(仅系统管理员):item.Datasets 为勾选共享给该组织的知识库列表(填 record_id)
  123. func (a *Organization) Create(ctx context.Context, item schema.Organization) error {
  124. ok, err := IsSystemAdmin(ctx, a.userModel, a.roleModel)
  125. if err != nil {
  126. return err
  127. }
  128. if !ok {
  129. return errors.New400Response("仅系统管理员可创建组织")
  130. }
  131. item.RecordID = guid.S()
  132. item.CreatorId = GetUserID(ctx)
  133. org, err := a.organizationModel.GetByName(ctx, item.Name)
  134. if err != nil {
  135. return err
  136. } else if org != nil {
  137. return errors.New("命名重复")
  138. }
  139. return ExecTrans(ctx, a.transModel, func(ctx context.Context) error {
  140. if err := a.organizationModel.Create(ctx, item); err != nil {
  141. return err
  142. }
  143. // 将勾选的共享知识库分配给该组织,写入关系映射
  144. for _, d := range item.Datasets {
  145. ds, err := a.datasetModel.Get(ctx, d.RecordID)
  146. if err != nil {
  147. return err
  148. }
  149. if ds == nil {
  150. return errors.New400Response("知识库不存在: " + d.RecordID)
  151. }
  152. if ds.Type != schema.DatasetTypePublic {
  153. return errors.New400Response("仅共享知识库可分配给组织: " + d.RecordID)
  154. }
  155. if err := a.relationModel.Create(ctx, schema.DatasetRelation{
  156. RecordID: guid.S(),
  157. DatasetId: ds.RecordID,
  158. BizId: item.RecordID,
  159. Type: schema.DatasetTypePublic,
  160. CreatorId: GetUserID(ctx),
  161. }); err != nil {
  162. return err
  163. }
  164. }
  165. return nil
  166. })
  167. }
  168. // Update 更新数据
  169. // 组织的共享知识库(type=1)发生变化时,同步刷新该组织所有企业管理员的共享知识库权限
  170. func (a *Organization) Update(ctx context.Context, recordID string, item schema.Organization) error {
  171. oldItem, err := a.organizationModel.Get(ctx, recordID)
  172. if err != nil {
  173. return err
  174. } else if oldItem == nil {
  175. return errors.ErrNotFound
  176. }
  177. return ExecTrans(ctx, a.transModel, func(ctx context.Context) error {
  178. // 仅重置组织级的共享知识库映射(type=1),保留该组织企业自建KB(type=2)
  179. if err := a.relationModel.DeleteByBizIdAndType(ctx, recordID, schema.DatasetTypePublic); err != nil {
  180. return err
  181. }
  182. // 收集本次分配给组织的共享知识库
  183. sharedDatasetIds := make([]string, 0, len(item.Datasets))
  184. for _, d := range item.Datasets {
  185. ds, err := a.datasetModel.Get(ctx, d.RecordID)
  186. if err != nil {
  187. return err
  188. }
  189. if ds == nil || ds.Type != schema.DatasetTypePublic {
  190. return errors.New400Response("仅共享知识库可分配给组织: " + d.RecordID)
  191. }
  192. if err := a.relationModel.Create(ctx, schema.DatasetRelation{
  193. RecordID: guid.S(),
  194. DatasetId: d.RecordID,
  195. BizId: recordID,
  196. Type: schema.DatasetTypePublic,
  197. CreatorId: GetUserID(ctx),
  198. }); err != nil {
  199. return err
  200. }
  201. sharedDatasetIds = append(sharedDatasetIds, d.RecordID)
  202. }
  203. // 同步刷新该组织所有企业管理员的用户级共享知识库映射
  204. admins, err := a.userModel.Query(ctx, schema.UserQueryParam{
  205. OrgId: recordID,
  206. RoleCode: []string{RoleCodeEnterpriseAdmin},
  207. })
  208. if err != nil {
  209. return err
  210. }
  211. for _, admin := range admins.Data {
  212. if err := a.relationModel.DeleteByBizIdAndType(ctx, admin.RecordID, schema.DatasetTypePublic); err != nil {
  213. return err
  214. }
  215. for _, dsId := range sharedDatasetIds {
  216. if err := a.relationModel.Create(ctx, schema.DatasetRelation{
  217. RecordID: guid.S(),
  218. DatasetId: dsId,
  219. BizId: admin.RecordID,
  220. Type: schema.DatasetTypePublic,
  221. CreatorId: GetUserID(ctx),
  222. }); err != nil {
  223. return err
  224. }
  225. }
  226. }
  227. return a.organizationModel.Update(ctx, recordID, item)
  228. })
  229. }
  230. // Delete 删除数据
  231. func (a *Organization) Delete(ctx context.Context, recordID string) error {
  232. return ExecTrans(ctx, a.transModel, func(ctx context.Context) error {
  233. oldItem, err := a.organizationModel.Get(ctx, recordID)
  234. if err != nil {
  235. return err
  236. } else if oldItem == nil {
  237. return errors.ErrNotFound
  238. }
  239. // 先清理组织级映射
  240. if err := a.relationModel.DeleteByBizId(ctx, recordID); err != nil {
  241. return err
  242. }
  243. // 删除组织自建的企业知识库及其文件/关系
  244. dataset, err := a.datasetModel.Query(ctx, schema.DatasetQueryParam{OrgId: recordID, Type: schema.DatasetTypeOrg})
  245. if err != nil {
  246. return err
  247. }
  248. if len(dataset.Data) > 0 {
  249. ids := dataset.Data.ToRecordIds()
  250. for _, id := range ids {
  251. if err := a.relationModel.DeleteByDatasetId(ctx, id); err != nil {
  252. return err
  253. }
  254. }
  255. if err := a.fileModel.DeleteByDatasetIds(ctx, ids); err != nil {
  256. return err
  257. }
  258. if err := a.datasetModel.DeleteByOrgId(ctx, recordID); err != nil {
  259. return err
  260. }
  261. }
  262. return a.organizationModel.Delete(ctx, recordID)
  263. })
  264. }
  265. // UpdateStatus 更新状态
  266. func (a *Organization) UpdateStatus(ctx context.Context, recordID string, status int) error {
  267. oldItem, err := a.organizationModel.Get(ctx, recordID)
  268. if err != nil {
  269. return err
  270. } else if oldItem == nil {
  271. return errors.ErrNotFound
  272. }
  273. return a.organizationModel.UpdateStatus(ctx, recordID, status)
  274. }