浏览代码

Merge remote-tracking branch 'origin/dm' into dm

Roc 6 月之前
父节点
当前提交
001bd4b1a9
共有 9 个文件被更改,包括 464 次插入7 次删除
  1. 2 0
      config/config.go
  2. 54 0
      controller/gn/user.go
  3. 4 4
      init_serve/task.go
  4. 360 0
      logic/gn/user.go
  5. 2 1
      models/eta/admin.go
  6. 3 1
      models/eta/sys_department.go
  7. 2 1
      models/eta/sys_group.go
  8. 36 0
      models/gn/user.go
  9. 1 0
      routers/gn.go

+ 2 - 0
config/config.go

@@ -135,4 +135,6 @@ type Gn struct {
 	AuthSSOCallbackUrl  string `mapstructure:"auth-sso-callback-url" json:"auth-sso-callback-url" yaml:"auth-sso-callback-url" description:"统一认证-回调地址"`
 	AuthTokenApiUrl     string `mapstructure:"auth-token-api-url" json:"auth-token-api-url" yaml:"auth-token-api-url" description:"统一认证-获取Token地址"`
 	AuthUserApiUrl      string `mapstructure:"auth-user-api-url" json:"auth-user-api-url" yaml:"auth-user-api-url" description:"统一认证-获取UserInfo地址"`
+	DefaultRoleId       int    `mapstructure:"default-role-id" json:"default-role-id" yaml:"default-role-id" description:"默认的角色id"`
+	DefaultUserPass     string `mapstructure:"default-user-pass" json:"default-user-pass" yaml:"default-user-pass" description:"默认密码"`
 }

+ 54 - 0
controller/gn/user.go

@@ -0,0 +1,54 @@
+package gn
+
+import (
+	"eta_gn/eta_bridge/controller/resp"
+	gnLogic "eta_gn/eta_bridge/logic/gn"
+	"github.com/gin-gonic/gin"
+	"sync"
+)
+
+// XiangyuController 象屿指标
+//type XiangyuController struct{}
+
+// 同步用户锁,防止重复同步,不管是全量还是增量,都是同一时间只能一个同步
+var lockSyncUser sync.Mutex
+
+// SyncUser
+// @Description: 全量同步用户
+// @author: Roc
+// @receiver xc
+// @datetime 2024-01-22 15:51:25
+// @param c *gin.Context
+func (gc *GuoNengController) SyncUser(c *gin.Context) {
+	lockSyncUser.Lock()
+	defer func() {
+		lockSyncUser.Unlock()
+	}()
+	err := gnLogic.SyncUser()
+	if err != nil {
+		resp.FailData("同步失败", err.Error(), c)
+		return
+	}
+	resp.Ok("同步成功", c)
+}
+
+// PullUser
+// @Description: 增量同步用户
+// @author: Roc
+// @receiver xc
+// @datetime 2024-01-23 17:13:07
+// @param c *gin.Context
+//func (xc *GuoNengController) PullUser(c *gin.Context) {
+//	lockSyncUser.Lock()
+//	defer func() {
+//		lockSyncUser.Unlock()
+//	}()
+//	err := xiangyu.PullUser()
+//	if err != nil {
+//		resp.FailData("同步失败", err.Error(), c)
+//		return
+//	}
+//	resp.Ok("同步成功", c)
+//
+//	return
+//}

+ 4 - 4
init_serve/task.go

@@ -20,10 +20,10 @@ func InitTask() {
 	}
 
 	// 角色-用户-部门-分组同步
-	go services.ListenSyncRole()
-	go services.ListenSyncAdmin()
-	go services.ListenSyncDepartment()
-	go services.ListenSyncGroup()
+	//go services.ListenSyncRole()
+	//go services.ListenSyncAdmin()
+	//go services.ListenSyncDepartment()
+	//go services.ListenSyncGroup()
 
 	go services.ListenSyncUserEnRole()
 

+ 360 - 0
logic/gn/user.go

@@ -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
+}

+ 2 - 1
models/eta/admin.go

@@ -84,7 +84,8 @@ func DeleteSysUserByName(adminName string) (err error) {
 
 // GetAllSysUser 获取所有用户
 func GetAllSysUser() (items []*Admin, err error) {
-	err = global.MYSQL["hz_eta"].Find(&items).Error
+	sql := `SELECT * FROM "admin" `
+	err = global.MYSQL["hz_eta"].Raw(sql).Find(&items).Error
 	return
 }
 

+ 3 - 1
models/eta/sys_department.go

@@ -37,7 +37,9 @@ func GetDepartmentById(departmentId int) (item *SysDepartment, err error) {
 
 // GetAllDepartment 获取所有部门
 func GetAllDepartment() (items []*SysDepartment, err error) {
-	err = global.MYSQL["hz_eta"].Find(&items).Error
+	//sql := `SELECT * FROM sys_department WHERE out_id <> ""`
+	sql := `SELECT * FROM sys_department `
+	err = global.MYSQL["hz_eta"].Raw(sql).Find(&items).Error
 	return
 }
 

+ 2 - 1
models/eta/sys_group.go

@@ -39,7 +39,8 @@ func GetSysGroupByGroupId(groupId int) (item *SysGroup, err error) {
 
 // GetAllSysGroup 获取所有的分组
 func GetAllSysGroup() (items []*SysGroup, err error) {
-	err = global.MYSQL["hz_eta"].Find(&items).Error
+	sql := `SELECT * FROM sys_group `
+	err = global.MYSQL["hz_eta"].Raw(sql).Find(&items).Error
 	return
 }
 

+ 36 - 0
models/gn/user.go

@@ -0,0 +1,36 @@
+package gn
+
+import "eta_gn/eta_bridge/global"
+
+// OaDept OA部门
+type OaDept struct {
+	DepartmentId       string `json:"dept_id" description:"部门ID"`
+	DepartmentName     string `json:"deptname" description:"部门名称"`
+	ParentDepartmentId string `json:"pdeptid" description:"上级部门名称"`
+}
+
+// OaUser OA用户
+type OaUser struct {
+	AddrName               string `gorm:"column:addr_name" json:"addr_name" description:"姓名"`
+	AddrUserId             string `gorm:"column:addr_Userid" json:"addr_Userid" description:"用户ID"`
+	AddrOfficeTel          string `gorm:"column:addr_OfficeTel" json:"addr_OfficeTel" description:"办公电话"`
+	AddrMobilePhone        string `gorm:"column:addr_MobilePhone" json:"addr_MobilePhone" description:"手机号"`
+	AddrJobTitle           string `gorm:"column:addr_JobTitle" json:"addr_JobTitle" description:"职位"`
+	AddrEmployeeId         string `gorm:"column:addr_EMPLOYEEID" json:"addr_EMPLOYEEID" description:""`
+	AddrDepartmentFullName string `gorm:"column:addr_DepFullname" json:"addr_DepFullname" description:"部门全称, 格式:直属部门/上级部门/顶级部门, 层级不定"`
+	OEmployeeNo            string `gorm:"column:o_EMPLOYEENO" json:"o_EMPLOYEENO" description:"OA工号"`
+}
+
+// GetGnOaDepartment 获取OA部门
+func GetGnOaDepartment() (items []*OaDept, err error) {
+	sql := `SELECT * FROM oa_dept `
+	err = global.MYSQL["oa_user"].Raw(sql).Find(&items).Error
+	return
+}
+
+// GetGnOaUser 获取OA用户
+func GetGnOaUser() (items []*OaUser, err error) {
+	sql := `SELECT * FROM oa_user `
+	err = global.MYSQL["oa_user"].Raw(sql).Find(&items).Error
+	return
+}

+ 1 - 0
routers/gn.go

@@ -10,6 +10,7 @@ func InitGn(r *gin.RouterGroup) {
 	control := new(gn.GuoNengController)
 	group := r.Group("gn/")
 	group.GET("auth/getToken", control.GetToken)
+	group.GET("user/sync", control.SyncUser)
 	//group.GET("user/pull", control.PullUser)
 
 	// 需要内部鉴权的接口