|
@@ -0,0 +1,360 @@
|
|
|
+package gn
|
|
|
+
|
|
|
+import (
|
|
|
+ "eta_gn/eta_bridge/global"
|
|
|
+ "eta_gn/eta_bridge/models/eta"
|
|
|
+ "eta_gn/eta_bridge/models/gn"
|
|
|
+ "eta_gn/eta_bridge/utils"
|
|
|
+ "fmt"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+// SyncUser
|
|
|
+// @Description: 全量同步用户
|
|
|
+// @author: Roc
|
|
|
+// @datetime 2024-01-22 10:28:39
|
|
|
+// @return err error
|
|
|
+func SyncUser() (err error) {
|
|
|
+ roleId := global.CONFIG.Gn.DefaultRoleId
|
|
|
+ if roleId <= 0 {
|
|
|
+ err = fmt.Errorf("默认角色ID不能为空")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if global.CONFIG.Gn.DefaultUserPass == "" {
|
|
|
+ err = fmt.Errorf("默认用户密码不能为空")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 指定的角色
|
|
|
+ roleInfo, e := eta.GetSysRoleById(roleId)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("获取默认角色信息失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取所有部门和分组
|
|
|
+ departmentMap, _, groupMap, _, userMap, e := getAllDepartmentAndGroup()
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("获取部门/分组/用户失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 从公共库里面读取部门和用户
|
|
|
+ oaUser, e := gn.GetGnOaUser()
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("获取OA全量用户失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, v := range oaUser {
|
|
|
+ fmt.Printf("正在同步用户: %s\n", v.AddrName)
|
|
|
+ e = handleUser(v, departmentMap, groupMap, userMap, roleInfo)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("同步OA用户失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// PullUser
|
|
|
+// @Description: 增量同步用户
|
|
|
+// @author: Roc
|
|
|
+// @datetime 2024-01-23 18:01:27
|
|
|
+// @return err error
|
|
|
+//func PullUser() (err error) {
|
|
|
+// if global.CONFIG.Xiangyu.DefaultRoleId <= 0 {
|
|
|
+// err = errors.New("默认角色ID不能为空")
|
|
|
+// return
|
|
|
+// }
|
|
|
+// defer func() {
|
|
|
+// if err != nil {
|
|
|
+// global.FILE_LOG.Info("同步增量用户失败:" + err.Error())
|
|
|
+// }
|
|
|
+// }()
|
|
|
+//
|
|
|
+// // 指定的角色
|
|
|
+// roleInfo, err := eta.GetSysRoleById(global.CONFIG.Xiangyu.DefaultRoleId)
|
|
|
+// if err != nil {
|
|
|
+// return
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 获取所有部门和分组
|
|
|
+// departmentMap, departmentNameMap, groupMap, groupNameMap, userMap, err := getAllDepartmentAndGroup()
|
|
|
+// if err != nil {
|
|
|
+// return
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 获取token
|
|
|
+// tokenId, err := xiangyu.Login()
|
|
|
+// if err != nil {
|
|
|
+// return
|
|
|
+// }
|
|
|
+//
|
|
|
+// defer func() {
|
|
|
+// // 获取用户列表
|
|
|
+// tmpErr := xiangyu.Logout(tokenId)
|
|
|
+// if tmpErr != nil {
|
|
|
+// fmt.Println("退出失败:", tmpErr.Error())
|
|
|
+// }
|
|
|
+// }()
|
|
|
+//
|
|
|
+// for {
|
|
|
+// // 获取增量用户列表
|
|
|
+// userResp, tmpErr := xiangyu.PullTask(tokenId)
|
|
|
+// if tmpErr != nil {
|
|
|
+// err = tmpErr
|
|
|
+// return
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 没有数据了,那么结束同步了
|
|
|
+// if userResp == nil || userResp.Out.ObjectCode == `` {
|
|
|
+// return
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 是否同步成功
|
|
|
+// var isSync bool
|
|
|
+//
|
|
|
+// var etaUserId, message string
|
|
|
+//
|
|
|
+// // 处理用户信息,将象屿用户与eta用户做关联
|
|
|
+// tmpErr = handleUser(userResp.Out.Data, userResp.Out.Id, departmentMap, departmentNameMap, groupMap, groupNameMap, userMap, roleInfo)
|
|
|
+// if tmpErr == nil {
|
|
|
+// isSync = true
|
|
|
+// if etUserInfo, ok := userMap[userResp.Out.Data.Username]; ok {
|
|
|
+// etaUserId = fmt.Sprint(etUserInfo.AdminId)
|
|
|
+// }
|
|
|
+// } else {
|
|
|
+// message = tmpErr.Error()
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 结束单次增量同步
|
|
|
+// err = xiangyu.PullFinish(tokenId, userResp.Out.TaskId, etaUserId, message, isSync)
|
|
|
+// if err != nil {
|
|
|
+// return
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// return
|
|
|
+//}
|
|
|
+
|
|
|
+// TaskPullUser
|
|
|
+// @Description: 定时增量同步用户
|
|
|
+// @author: Roc
|
|
|
+// @datetime 2024-01-23 18:03:04
|
|
|
+//func TaskPullUser() {
|
|
|
+// PullUser()
|
|
|
+// return
|
|
|
+//}
|
|
|
+
|
|
|
+// getAllDepartmentAndGroup
|
|
|
+// @Description: 获取所有的部门和分组
|
|
|
+// @author: Roc
|
|
|
+// @datetime 2024-01-18 17:39:14
|
|
|
+// @return departmentMap map[string]*eta.SysDepartment
|
|
|
+// @return groupMap map[string]*eta.SysGroup
|
|
|
+// @return err error
|
|
|
+func getAllDepartmentAndGroup() (departmentMap, departmentNameMap map[string]*eta.SysDepartment, groupMap, groupNameMap map[string]*eta.SysGroup, userMap map[string]*eta.Admin, err error) {
|
|
|
+ // 获取所有的部门
|
|
|
+ departmentList, e := eta.GetAllDepartment()
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("获取所有部门失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ departmentMap = make(map[string]*eta.SysDepartment)
|
|
|
+ departmentNameMap = make(map[string]*eta.SysDepartment)
|
|
|
+ for _, department := range departmentList {
|
|
|
+ if department.OutID == `` {
|
|
|
+ //departmentNameMap[department.DepartmentName] = department
|
|
|
+ } else {
|
|
|
+ departmentMap[department.OutID] = department
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取所有的分组
|
|
|
+ groupList, e := eta.GetAllSysGroup()
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("获取所有分组失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ groupMap = make(map[string]*eta.SysGroup)
|
|
|
+ groupNameMap = make(map[string]*eta.SysGroup)
|
|
|
+ for _, group := range groupList {
|
|
|
+ if group.OutID == `` {
|
|
|
+ //groupNameMap[fmt.Sprint(group.DepartmentId, "_", group.GroupName)] = group
|
|
|
+ } else {
|
|
|
+ groupMap[group.OutID] = group
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取所有的用户
|
|
|
+ adminList, e := eta.GetAllSysUser()
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("获取所有用户失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ userMap = make(map[string]*eta.Admin)
|
|
|
+ for _, admin := range adminList {
|
|
|
+ userMap[admin.AdminName] = admin
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+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) {
|
|
|
+ if oaUser == nil {
|
|
|
+ err = fmt.Errorf("OA用户信息不存在")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 从部门字段中拆分出部门和分组, 数据格式: 销售业务部/福建办事处/华南销售分公司, 层级不定, 目前最大3级
|
|
|
+ oaUser.AddrDepartmentFullName = strings.TrimSpace(oaUser.AddrDepartmentFullName)
|
|
|
+ departmentArr := strings.Split(oaUser.AddrDepartmentFullName, "/")
|
|
|
+ //var departmentId, groupId int
|
|
|
+ departmentLen := len(departmentArr)
|
|
|
+ departmentInfo := new(eta.SysDepartment)
|
|
|
+ groupInfo := new(eta.SysGroup)
|
|
|
+ if departmentLen > 0 {
|
|
|
+ // 部门是最后那个
|
|
|
+ departmentName := departmentArr[departmentLen-1]
|
|
|
+ depart, ok := departmentMap[departmentName]
|
|
|
+ if !ok {
|
|
|
+ // 如果没有的话,那么就创建该部门
|
|
|
+ depart = &eta.SysDepartment{
|
|
|
+ DepartmentName: departmentName,
|
|
|
+ OutID: departmentName, // 因为部门是从用户信息中取的, 没有ID这种字段, 所以部门全程作为out_id
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ }
|
|
|
+ if err = depart.Create(); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ departmentMap[departmentName] = depart
|
|
|
+ } else {
|
|
|
+ // TODO:是否更新outId
|
|
|
+ }
|
|
|
+ departmentInfo = depart
|
|
|
+
|
|
|
+ // 分组信息
|
|
|
+ reversed := departmentArr
|
|
|
+ for i, j := 0, departmentLen-1; i < j; i, j = i+1, j-1 {
|
|
|
+ reversed[i], reversed[j] = reversed[j], reversed[i]
|
|
|
+ }
|
|
|
+ lastOutId := departmentName // 分组的out_id格式: 部门out_id_一级分组out_id_二级分组out_id...
|
|
|
+ for k, v := range reversed {
|
|
|
+ if k == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ lastOutId = fmt.Sprintf("%s_%s", lastOutId, v)
|
|
|
+ group, ok := groupMap[lastOutId]
|
|
|
+ if !ok {
|
|
|
+ group = &eta.SysGroup{
|
|
|
+ DepartmentId: departmentInfo.DepartmentId,
|
|
|
+ GroupName: v,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ ParentId: groupInfo.GroupId,
|
|
|
+ OutID: lastOutId,
|
|
|
+ }
|
|
|
+ if err = group.Create(); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ groupMap[lastOutId] = group
|
|
|
+ } else {
|
|
|
+ // TODO:是否更新outId
|
|
|
+ }
|
|
|
+ groupInfo = group
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 同步用户
|
|
|
+ userInfo, ok := userMap[oaUser.AddrUserId]
|
|
|
+ if !ok {
|
|
|
+ userInfo = &eta.Admin{
|
|
|
+ AdminName: oaUser.AddrUserId,
|
|
|
+ RealName: oaUser.AddrName,
|
|
|
+ Password: utils.MD5(global.CONFIG.Gn.DefaultUserPass),
|
|
|
+ Enabled: 1,
|
|
|
+ Email: "",
|
|
|
+ CreatedTime: time.Now(),
|
|
|
+ LastUpdatedTime: time.Now(),
|
|
|
+ Mobile: oaUser.AddrMobilePhone,
|
|
|
+ RoleType: 0,
|
|
|
+ RoleId: roleInfo.RoleId,
|
|
|
+ RoleName: roleInfo.RoleName,
|
|
|
+ RoleTypeCode: roleInfo.RoleTypeCode,
|
|
|
+ DepartmentId: departmentInfo.DepartmentId,
|
|
|
+ DepartmentName: departmentInfo.DepartmentName,
|
|
|
+ GroupId: groupInfo.GroupId,
|
|
|
+ GroupName: groupInfo.GroupName,
|
|
|
+ Authority: 0,
|
|
|
+ Position: oaUser.AddrJobTitle,
|
|
|
+ ChartPermission: 0,
|
|
|
+ EdbPermission: 0,
|
|
|
+ MysteelChemicalPermission: 0,
|
|
|
+ OpenId: "",
|
|
|
+ UnionId: "",
|
|
|
+ PredictEdbPermission: 0,
|
|
|
+ Province: "",
|
|
|
+ ProvinceCode: "",
|
|
|
+ City: "",
|
|
|
+ CityCode: "",
|
|
|
+ EmployeeId: "",
|
|
|
+ TelAreaCode: "",
|
|
|
+ OutID: oaUser.AddrUserId,
|
|
|
+ }
|
|
|
+ if err = userInfo.Create(); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ userMap[oaUser.AddrUserId] = userInfo
|
|
|
+ } else {
|
|
|
+ updateColList := make([]string, 0)
|
|
|
+
|
|
|
+ // 部门
|
|
|
+ if userInfo.DepartmentId != departmentInfo.DepartmentId {
|
|
|
+ updateColList = append(updateColList, "DepartmentId", "DepartmentName")
|
|
|
+ userInfo.DepartmentId = departmentInfo.DepartmentId
|
|
|
+ userInfo.DepartmentName = departmentInfo.DepartmentName
|
|
|
+ }
|
|
|
+
|
|
|
+ // 分组
|
|
|
+ if userInfo.GroupId != groupInfo.GroupId {
|
|
|
+ updateColList = append(updateColList, "GroupId", "GroupName")
|
|
|
+ userInfo.GroupId = groupInfo.GroupId
|
|
|
+ userInfo.GroupName = groupInfo.GroupName
|
|
|
+ }
|
|
|
+
|
|
|
+ // 职位
|
|
|
+ if userInfo.Position != oaUser.AddrJobTitle {
|
|
|
+ updateColList = append(updateColList, "Position")
|
|
|
+ userInfo.Position = oaUser.AddrJobTitle
|
|
|
+ }
|
|
|
+
|
|
|
+ // 姓名
|
|
|
+ if userInfo.RealName != oaUser.AddrName {
|
|
|
+ updateColList = append(updateColList, "RealName")
|
|
|
+ userInfo.RealName = oaUser.AddrName
|
|
|
+ }
|
|
|
+
|
|
|
+ // 手机号
|
|
|
+ if userInfo.Mobile != oaUser.AddrMobilePhone {
|
|
|
+ updateColList = append(updateColList, "Mobile")
|
|
|
+ userInfo.Mobile = oaUser.AddrMobilePhone
|
|
|
+ }
|
|
|
+
|
|
|
+ // 外部id
|
|
|
+ if userInfo.OutID == `` {
|
|
|
+ updateColList = append(updateColList, "OutID")
|
|
|
+ userInfo.OutID = oaUser.AddrUserId
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(updateColList) > 0 {
|
|
|
+ updateColList = append(updateColList, "LastUpdatedTime")
|
|
|
+ userInfo.LastUpdatedTime = time.Now()
|
|
|
+ if err = userInfo.Update(updateColList); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|