user.go 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. package gn
  2. import (
  3. "eta_gn/eta_bridge/global"
  4. "eta_gn/eta_bridge/models/eta"
  5. "eta_gn/eta_bridge/models/gn"
  6. "eta_gn/eta_bridge/utils"
  7. "fmt"
  8. "strings"
  9. "time"
  10. )
  11. // SyncUser
  12. // @Description: 全量同步用户
  13. // @author: Roc
  14. // @datetime 2024-01-22 10:28:39
  15. // @return err error
  16. func SyncUser() (err error) {
  17. roleId := global.CONFIG.Gn.DefaultRoleId
  18. if roleId <= 0 {
  19. err = fmt.Errorf("默认角色ID不能为空")
  20. return
  21. }
  22. if global.CONFIG.Gn.DefaultUserPass == "" {
  23. err = fmt.Errorf("默认用户密码不能为空")
  24. return
  25. }
  26. // 指定的角色
  27. roleInfo, e := eta.GetSysRoleById(roleId)
  28. if e != nil {
  29. err = fmt.Errorf("获取默认角色信息失败, %v", e)
  30. return
  31. }
  32. // 获取所有部门和分组
  33. departmentMap, _, groupMap, _, userMap, e := getAllDepartmentAndGroup()
  34. if e != nil {
  35. err = fmt.Errorf("获取部门/分组/用户失败, %v", e)
  36. return
  37. }
  38. // 从公共库里面读取部门和用户
  39. oaUser, e := gn.GetGnOaUser()
  40. if e != nil {
  41. err = fmt.Errorf("获取OA全量用户失败, %v", e)
  42. return
  43. }
  44. for _, v := range oaUser {
  45. fmt.Printf("正在同步用户: %s\n", v.AddrName)
  46. e = handleUser(v, departmentMap, groupMap, userMap, roleInfo)
  47. if e != nil {
  48. err = fmt.Errorf("同步OA用户失败, %v", e)
  49. return
  50. }
  51. }
  52. return
  53. }
  54. // PullUser
  55. // @Description: 增量同步用户
  56. // @author: Roc
  57. // @datetime 2024-01-23 18:01:27
  58. // @return err error
  59. //func PullUser() (err error) {
  60. // if global.CONFIG.Xiangyu.DefaultRoleId <= 0 {
  61. // err = errors.New("默认角色ID不能为空")
  62. // return
  63. // }
  64. // defer func() {
  65. // if err != nil {
  66. // global.FILE_LOG.Info("同步增量用户失败:" + err.Error())
  67. // }
  68. // }()
  69. //
  70. // // 指定的角色
  71. // roleInfo, err := eta.GetSysRoleById(global.CONFIG.Xiangyu.DefaultRoleId)
  72. // if err != nil {
  73. // return
  74. // }
  75. //
  76. // // 获取所有部门和分组
  77. // departmentMap, departmentNameMap, groupMap, groupNameMap, userMap, err := getAllDepartmentAndGroup()
  78. // if err != nil {
  79. // return
  80. // }
  81. //
  82. // // 获取token
  83. // tokenId, err := xiangyu.Login()
  84. // if err != nil {
  85. // return
  86. // }
  87. //
  88. // defer func() {
  89. // // 获取用户列表
  90. // tmpErr := xiangyu.Logout(tokenId)
  91. // if tmpErr != nil {
  92. // fmt.Println("退出失败:", tmpErr.Error())
  93. // }
  94. // }()
  95. //
  96. // for {
  97. // // 获取增量用户列表
  98. // userResp, tmpErr := xiangyu.PullTask(tokenId)
  99. // if tmpErr != nil {
  100. // err = tmpErr
  101. // return
  102. // }
  103. //
  104. // // 没有数据了,那么结束同步了
  105. // if userResp == nil || userResp.Out.ObjectCode == `` {
  106. // return
  107. // }
  108. //
  109. // // 是否同步成功
  110. // var isSync bool
  111. //
  112. // var etaUserId, message string
  113. //
  114. // // 处理用户信息,将象屿用户与eta用户做关联
  115. // tmpErr = handleUser(userResp.Out.Data, userResp.Out.Id, departmentMap, departmentNameMap, groupMap, groupNameMap, userMap, roleInfo)
  116. // if tmpErr == nil {
  117. // isSync = true
  118. // if etUserInfo, ok := userMap[userResp.Out.Data.Username]; ok {
  119. // etaUserId = fmt.Sprint(etUserInfo.AdminId)
  120. // }
  121. // } else {
  122. // message = tmpErr.Error()
  123. // }
  124. //
  125. // // 结束单次增量同步
  126. // err = xiangyu.PullFinish(tokenId, userResp.Out.TaskId, etaUserId, message, isSync)
  127. // if err != nil {
  128. // return
  129. // }
  130. // }
  131. //
  132. // return
  133. //}
  134. // TaskPullUser
  135. // @Description: 定时增量同步用户
  136. // @author: Roc
  137. // @datetime 2024-01-23 18:03:04
  138. //func TaskPullUser() {
  139. // PullUser()
  140. // return
  141. //}
  142. // getAllDepartmentAndGroup
  143. // @Description: 获取所有的部门和分组
  144. // @author: Roc
  145. // @datetime 2024-01-18 17:39:14
  146. // @return departmentMap map[string]*eta.SysDepartment
  147. // @return groupMap map[string]*eta.SysGroup
  148. // @return err error
  149. func getAllDepartmentAndGroup() (departmentMap, departmentNameMap map[string]*eta.SysDepartment, groupMap, groupNameMap map[string]*eta.SysGroup, userMap map[string]*eta.Admin, err error) {
  150. // 获取所有的部门
  151. departmentList, e := eta.GetAllDepartment()
  152. if e != nil {
  153. err = fmt.Errorf("获取所有部门失败, %v", e)
  154. return
  155. }
  156. departmentMap = make(map[string]*eta.SysDepartment)
  157. departmentNameMap = make(map[string]*eta.SysDepartment)
  158. for _, department := range departmentList {
  159. if department.OutID == `` {
  160. //departmentNameMap[department.DepartmentName] = department
  161. } else {
  162. departmentMap[department.OutID] = department
  163. }
  164. }
  165. // 获取所有的分组
  166. groupList, e := eta.GetAllSysGroup()
  167. if e != nil {
  168. err = fmt.Errorf("获取所有分组失败, %v", e)
  169. return
  170. }
  171. groupMap = make(map[string]*eta.SysGroup)
  172. groupNameMap = make(map[string]*eta.SysGroup)
  173. for _, group := range groupList {
  174. if group.OutID == `` {
  175. //groupNameMap[fmt.Sprint(group.DepartmentId, "_", group.GroupName)] = group
  176. } else {
  177. groupMap[group.OutID] = group
  178. }
  179. }
  180. // 获取所有的用户
  181. adminList, e := eta.GetAllSysUser()
  182. if e != nil {
  183. err = fmt.Errorf("获取所有用户失败, %v", e)
  184. return
  185. }
  186. userMap = make(map[string]*eta.Admin)
  187. for _, admin := range adminList {
  188. userMap[admin.AdminName] = admin
  189. }
  190. return
  191. }
  192. func handleUser(oaUser *gn.OaUser, departmentMap map[string]*eta.SysDepartment, groupMap map[string]*eta.SysGroup, userMap map[string]*eta.Admin, roleInfo *eta.SysRole) (err error) {
  193. if oaUser == nil {
  194. err = fmt.Errorf("OA用户信息不存在")
  195. return
  196. }
  197. // 从部门字段中拆分出部门和分组, 数据格式: 销售业务部/福建办事处/华南销售分公司, 层级不定, 目前最大3级
  198. oaUser.AddrDepartmentFullName = strings.TrimSpace(oaUser.AddrDepartmentFullName)
  199. departmentArr := strings.Split(oaUser.AddrDepartmentFullName, "/")
  200. //var departmentId, groupId int
  201. departmentLen := len(departmentArr)
  202. departmentInfo := new(eta.SysDepartment)
  203. groupInfo := new(eta.SysGroup)
  204. if departmentLen > 0 {
  205. // 部门是最后那个
  206. departmentName := departmentArr[departmentLen-1]
  207. depart, ok := departmentMap[departmentName]
  208. if !ok {
  209. // 如果没有的话,那么就创建该部门
  210. depart = &eta.SysDepartment{
  211. DepartmentName: departmentName,
  212. OutID: departmentName, // 因为部门是从用户信息中取的, 没有ID这种字段, 所以部门全程作为out_id
  213. CreateTime: time.Now(),
  214. }
  215. if err = depart.Create(); err != nil {
  216. return
  217. }
  218. departmentMap[departmentName] = depart
  219. } else {
  220. // TODO:是否更新outId
  221. }
  222. departmentInfo = depart
  223. // 分组信息
  224. reversed := departmentArr
  225. for i, j := 0, departmentLen-1; i < j; i, j = i+1, j-1 {
  226. reversed[i], reversed[j] = reversed[j], reversed[i]
  227. }
  228. lastOutId := departmentName // 分组的out_id格式: 部门out_id_一级分组out_id_二级分组out_id...
  229. for k, v := range reversed {
  230. if k == 0 {
  231. continue
  232. }
  233. lastOutId = fmt.Sprintf("%s_%s", lastOutId, v)
  234. group, ok := groupMap[lastOutId]
  235. if !ok {
  236. group = &eta.SysGroup{
  237. DepartmentId: departmentInfo.DepartmentId,
  238. GroupName: v,
  239. CreateTime: time.Now(),
  240. ParentId: groupInfo.GroupId,
  241. OutID: lastOutId,
  242. }
  243. if err = group.Create(); err != nil {
  244. return
  245. }
  246. groupMap[lastOutId] = group
  247. } else {
  248. // TODO:是否更新outId
  249. }
  250. groupInfo = group
  251. }
  252. }
  253. // 同步用户
  254. userInfo, ok := userMap[oaUser.AddrUserId]
  255. if !ok {
  256. userInfo = &eta.Admin{
  257. AdminName: oaUser.AddrUserId,
  258. RealName: oaUser.AddrName,
  259. Password: utils.MD5(global.CONFIG.Gn.DefaultUserPass),
  260. Enabled: 1,
  261. Email: "",
  262. CreatedTime: time.Now(),
  263. LastUpdatedTime: time.Now(),
  264. Mobile: oaUser.AddrMobilePhone,
  265. RoleType: 0,
  266. RoleId: roleInfo.RoleId,
  267. RoleName: roleInfo.RoleName,
  268. RoleTypeCode: roleInfo.RoleTypeCode,
  269. DepartmentId: departmentInfo.DepartmentId,
  270. DepartmentName: departmentInfo.DepartmentName,
  271. GroupId: groupInfo.GroupId,
  272. GroupName: groupInfo.GroupName,
  273. Authority: 0,
  274. Position: oaUser.AddrJobTitle,
  275. ChartPermission: 0,
  276. EdbPermission: 0,
  277. MysteelChemicalPermission: 0,
  278. OpenId: "",
  279. UnionId: "",
  280. PredictEdbPermission: 0,
  281. Province: "",
  282. ProvinceCode: "",
  283. City: "",
  284. CityCode: "",
  285. EmployeeId: "",
  286. TelAreaCode: "",
  287. OutID: oaUser.AddrUserId,
  288. }
  289. if err = userInfo.Create(); err != nil {
  290. return
  291. }
  292. userMap[oaUser.AddrUserId] = userInfo
  293. } else {
  294. updateColList := make([]string, 0)
  295. // 部门
  296. if userInfo.DepartmentId != departmentInfo.DepartmentId {
  297. updateColList = append(updateColList, "DepartmentId", "DepartmentName")
  298. userInfo.DepartmentId = departmentInfo.DepartmentId
  299. userInfo.DepartmentName = departmentInfo.DepartmentName
  300. }
  301. // 分组
  302. if userInfo.GroupId != groupInfo.GroupId {
  303. updateColList = append(updateColList, "GroupId", "GroupName")
  304. userInfo.GroupId = groupInfo.GroupId
  305. userInfo.GroupName = groupInfo.GroupName
  306. }
  307. // 职位
  308. if userInfo.Position != oaUser.AddrJobTitle {
  309. updateColList = append(updateColList, "Position")
  310. userInfo.Position = oaUser.AddrJobTitle
  311. }
  312. // 姓名
  313. if userInfo.RealName != oaUser.AddrName {
  314. updateColList = append(updateColList, "RealName")
  315. userInfo.RealName = oaUser.AddrName
  316. }
  317. // 手机号
  318. if userInfo.Mobile != oaUser.AddrMobilePhone {
  319. updateColList = append(updateColList, "Mobile")
  320. userInfo.Mobile = oaUser.AddrMobilePhone
  321. }
  322. // 外部id
  323. if userInfo.OutID == `` {
  324. updateColList = append(updateColList, "OutID")
  325. userInfo.OutID = oaUser.AddrUserId
  326. }
  327. if len(updateColList) > 0 {
  328. updateColList = append(updateColList, "LastUpdatedTime")
  329. userInfo.LastUpdatedTime = time.Now()
  330. if err = userInfo.Update(updateColList); err != nil {
  331. return
  332. }
  333. }
  334. }
  335. return
  336. }