user.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  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. }
  337. // AddAccount 创建新账号
  338. func AddAccount(userReq gn.UserEntity) (errCode, errMsg string, err error) {
  339. errCode = utils.Gn4AErrCode08
  340. adminName := *userReq.UserId
  341. // 校验是否存在, 若存在则更新信息, 否则新增
  342. userInfo, e := eta.GetSysUserByAdminName(adminName)
  343. if e != nil && !utils.IsErrNoRow(e) {
  344. err = fmt.Errorf("获取用户是否存在失败, %v", e)
  345. return
  346. }
  347. // 更新数据
  348. if userInfo.AdminId > 0 {
  349. if e = UpdateUser(userInfo, userReq); e != nil {
  350. err = fmt.Errorf("更新用户数据失败, %v", e)
  351. return
  352. }
  353. errCode = utils.Gn4AErrCodeSuccess
  354. return
  355. }
  356. // 新增数据
  357. newUser := new(eta.Admin)
  358. newUser.AdminName = adminName
  359. newUser.RealName = fmt.Sprint(*userReq.LastName, *userReq.FirstName)
  360. newUser.Password = utils.MD5(*userReq.Password)
  361. statsMap := map[string]int{gn.UserStatusActive: 1, gn.UserStatusDisable: 0}
  362. newUser.Enabled = statsMap[*userReq.UserStatus]
  363. newUser.Email = *userReq.Mail
  364. newUser.Mobile = *userReq.Mobile
  365. newUser.Position = *userReq.TitleName
  366. // TODO:部门分组
  367. newUser.CreatedTime = time.Now()
  368. newUser.LastUpdatedTime = time.Now()
  369. newUser.OutID = adminName
  370. if e = userInfo.Create(); e != nil {
  371. err = fmt.Errorf("新增用户失败, %v", e)
  372. return
  373. }
  374. errCode = utils.Gn4AErrCodeSuccess
  375. return
  376. }
  377. // UpdateUser 更新用户非null字段
  378. func UpdateUser(originUser *eta.Admin, userReq gn.UserEntity) (err error) {
  379. if originUser == nil {
  380. err = fmt.Errorf("用户信息有误")
  381. return
  382. }
  383. updateCols := make([]string, 0)
  384. // 密码
  385. if userReq.Password != nil {
  386. originUser.Password = utils.MD5(*userReq.Password)
  387. updateCols = append(updateCols, "Password")
  388. }
  389. // TODO:组织部门相关
  390. if userReq.OrgCode != nil {
  391. }
  392. // 姓名
  393. if userReq.FirstName != nil && userReq.LastName != nil {
  394. originUser.RealName = fmt.Sprint(*userReq.LastName, *userReq.FirstName)
  395. updateCols = append(updateCols, "RealName")
  396. }
  397. // 状态
  398. if userReq.UserStatus != nil {
  399. statsMap := map[string]int{gn.UserStatusActive: 1, gn.UserStatusDisable: 0}
  400. originUser.Enabled = statsMap[*userReq.UserStatus]
  401. updateCols = append(updateCols, "Enabled")
  402. }
  403. // 联系方式
  404. if userReq.Mail != nil {
  405. originUser.Email = *userReq.Mail
  406. updateCols = append(updateCols, "Email")
  407. }
  408. if userReq.Mobile != nil {
  409. originUser.Mobile = *userReq.Mobile
  410. updateCols = append(updateCols, "Mobile")
  411. }
  412. // 职位
  413. if userReq.TitleName != nil {
  414. originUser.Position = *userReq.TitleName
  415. updateCols = append(updateCols, "Position")
  416. }
  417. // 更新数据
  418. originUser.LastUpdatedTime = time.Now()
  419. updateCols = append(updateCols, "LastUpdatedTime")
  420. if e := originUser.Update(updateCols); e != nil {
  421. err = fmt.Errorf("更新用户数据失败, %v", e)
  422. return
  423. }
  424. return
  425. }
  426. // ModifyAccount 修改账号
  427. func ModifyAccount(userReq gn.UserEntity) (errCode, errMsg string, err error) {
  428. errCode = utils.Gn4AErrCode08
  429. adminName := *userReq.UserId
  430. // 校验是否存在, 不存在返回异常
  431. userInfo, e := eta.GetSysUserByAdminName(adminName)
  432. if e != nil {
  433. if utils.IsErrNoRow(e) {
  434. errCode = utils.Gn4AErrCode02
  435. err = fmt.Errorf("用户不存在")
  436. return
  437. }
  438. err = fmt.Errorf("获取用户是否存在失败, %v", e)
  439. return
  440. }
  441. // 更新数据
  442. if e = UpdateUser(userInfo, userReq); e != nil {
  443. err = fmt.Errorf("更新用户数据失败, %v", e)
  444. return
  445. }
  446. errCode = utils.Gn4AErrCodeSuccess
  447. return
  448. }
  449. // DeleteAccount 删除账号
  450. func DeleteAccount(userId string) (errCode, errMsg string, err error) {
  451. errCode = utils.Gn4AErrCode08
  452. // 校验是否存在, 不存在返回成功
  453. _, e := eta.GetSysUserByAdminName(userId)
  454. if e != nil {
  455. if utils.IsErrNoRow(e) {
  456. errCode = utils.Gn4AErrCodeSuccess
  457. return
  458. }
  459. err = fmt.Errorf("获取用户是否存在失败, %v", e)
  460. return
  461. }
  462. // 删除用户
  463. if e = eta.DeleteSysUserByName(userId); e != nil {
  464. err = fmt.Errorf("删除用户失败, %v", e)
  465. return
  466. }
  467. errCode = utils.Gn4AErrCodeSuccess
  468. return
  469. }
  470. // SuspendAccount 停用账号
  471. func SuspendAccount(userId string) (errCode, errMsg string, err error) {
  472. errCode = utils.Gn4AErrCode08
  473. // 校验是否存在, 不存在返回异常
  474. userInfo, e := eta.GetSysUserByAdminName(userId)
  475. if e != nil {
  476. if utils.IsErrNoRow(e) {
  477. errCode = utils.Gn4AErrCode02
  478. err = fmt.Errorf("用户不存在")
  479. return
  480. }
  481. err = fmt.Errorf("获取用户是否存在失败, %v", e)
  482. return
  483. }
  484. userInfo.Enabled = 0
  485. userInfo.LastUpdatedTime = time.Now()
  486. updateCols := []string{"Enabled", "LastUpdatedTime"}
  487. if e := userInfo.Update(updateCols); e != nil {
  488. err = fmt.Errorf("禁用用户失败, %v", e)
  489. return
  490. }
  491. errCode = utils.Gn4AErrCodeSuccess
  492. return
  493. }
  494. // RestoreAccount 启用账号
  495. func RestoreAccount(userId string) (errCode, errMsg string, err error) {
  496. errCode = utils.Gn4AErrCode08
  497. // 校验是否存在, 不存在返回异常
  498. userInfo, e := eta.GetSysUserByAdminName(userId)
  499. if e != nil {
  500. if utils.IsErrNoRow(e) {
  501. errCode = utils.Gn4AErrCode02
  502. err = fmt.Errorf("用户不存在")
  503. return
  504. }
  505. err = fmt.Errorf("获取用户是否存在失败, %v", e)
  506. return
  507. }
  508. userInfo.Enabled = 1
  509. userInfo.LastUpdatedTime = time.Now()
  510. updateCols := []string{"Enabled", "LastUpdatedTime"}
  511. if e := userInfo.Update(updateCols); e != nil {
  512. err = fmt.Errorf("启用用户失败, %v", e)
  513. return
  514. }
  515. errCode = utils.Gn4AErrCodeSuccess
  516. return
  517. }
  518. // ChangePassword 修改密码
  519. func ChangePassword(userId, newPassword string) (errCode, errMsg string, err error) {
  520. errCode = utils.Gn4AErrCode08
  521. // 校验是否存在, 不存在返回异常
  522. userInfo, e := eta.GetSysUserByAdminName(userId)
  523. if e != nil {
  524. if utils.IsErrNoRow(e) {
  525. errCode = utils.Gn4AErrCode02
  526. err = fmt.Errorf("用户不存在")
  527. return
  528. }
  529. err = fmt.Errorf("获取用户是否存在失败, %v", e)
  530. return
  531. }
  532. userInfo.Password = utils.MD5(newPassword)
  533. userInfo.LastUpdatedTime = time.Now()
  534. userInfo.LastUpdatedPasswordTime = time.Now()
  535. updateCols := []string{"Password", "LastUpdatedTime", "LastUpdatedPasswordTime"}
  536. if e := userInfo.Update(updateCols); e != nil {
  537. err = fmt.Errorf("用户密码修改失败, %v", e)
  538. return
  539. }
  540. errCode = utils.Gn4AErrCodeSuccess
  541. return
  542. }