浏览代码

部门及分组同步

hsun 1 年之前
父节点
当前提交
729178a9be

+ 5 - 7
init_serve/task.go

@@ -3,11 +3,9 @@ package init_serve
 import "hongze/hz_crm_eta/services"
 
 func InitTask() {
-	// 监听角色同步
-	go services.ListenSyncRoleFromCrm()
-	go services.ListenSyncRoleFromEta()
-
-	// 监听用户同步
-	go services.ListenSyncAdminFromCrm()
-	go services.ListenSyncAdminFromEta()
+	// 角色-用户-部门-分组同步
+	go services.ListenSyncRole()
+	go services.ListenSyncAdmin()
+	go services.ListenSyncDepartment()
+	go services.ListenSyncGroup()
 }

+ 2 - 2
models/crm/admin.go

@@ -49,13 +49,13 @@ func (m *Admin) TableName() string {
 	return "admin"
 }
 
-// Create 新增角色
+// Create 新增用户
 func (m *Admin) Create() (err error) {
 	err = global.MYSQL["hz_crm"].Create(m).Error
 	return
 }
 
-// Update 更新角色
+// Update 更新用户
 func (m *Admin) Update(cols []string) (err error) {
 	err = global.MYSQL["hz_crm"].Model(m).Select(cols).Updates(m).Error
 	return

+ 42 - 0
models/crm/sys_department.go

@@ -0,0 +1,42 @@
+package crm
+
+import (
+	"hongze/hz_crm_eta/global"
+	"time"
+)
+
+type SysDepartment struct {
+	DepartmentId   int       `gorm:"primaryKey;column:department_id;type:int(11);not null" json:"department_id"`
+	DepartmentName string    `gorm:"unique;column:department_name;type:varchar(255);default:''" json:"department_name"` // 部门名称
+	CreateTime     time.Time `gorm:"column:create_time;type:datetime" json:"create_time"`                               // 创建时间
+	Sort           int       `gorm:"column:sort;type:int(10);not null;default:0" json:"sort"`                           // 排序
+}
+
+func (m *SysDepartment) TableName() string {
+	return "sys_department"
+}
+
+// Create 新增部门
+func (m *SysDepartment) Create() (err error) {
+	err = global.MYSQL["hz_crm"].Create(m).Error
+	return
+}
+
+// Update 更新部门
+func (m *SysDepartment) Update(cols []string) (err error) {
+	err = global.MYSQL["hz_crm"].Model(m).Select(cols).Updates(m).Error
+	return
+}
+
+// GetDepartmentById 主键获取部门
+func GetDepartmentById(departmentId int) (item *SysDepartment, err error) {
+	err = global.MYSQL["hz_crm"].Where("department_id = ?", departmentId).First(&item).Error
+	return
+}
+
+// DeleteDepartmentById 主键删除部门
+func DeleteDepartmentById(departmentId int) (err error) {
+	sql := `DELETE FROM sys_department WHERE department_id = ? LIMIT 1`
+	err = global.MYSQL["hz_crm"].Exec(sql, departmentId).Error
+	return
+}

+ 50 - 0
models/crm/sys_group.go

@@ -0,0 +1,50 @@
+package crm
+
+import (
+	"hongze/hz_crm_eta/global"
+	"time"
+)
+
+type SysGroup struct {
+	GroupId      int       `gorm:"primaryKey;column:group_id;type:int(11);not null" json:"group_id"`
+	DepartmentId int       `gorm:"index:idx_department_id;column:department_id;type:int(11)" json:"department_id"` // 部门id
+	GroupName    string    `gorm:"column:group_name;type:varchar(255);default:''" json:"group_name"`               // 分组名称
+	CreateTime   time.Time `gorm:"column:create_time;type:datetime" json:"create_time"`
+	ParentId     int       `gorm:"column:parent_id;type:int(11);default:0" json:"parent_id"`
+	Sort         int       `gorm:"column:sort;type:int(10);not null;default:0" json:"sort"` // 排序
+}
+
+func (m *SysGroup) TableName() string {
+	return "sys_group"
+}
+
+// Create 新增分组
+func (m *SysGroup) Create() (err error) {
+	err = global.MYSQL["hz_crm"].Create(m).Error
+	return
+}
+
+// Update 更新分组
+func (m *SysGroup) Update(cols []string) (err error) {
+	err = global.MYSQL["hz_crm"].Model(m).Select(cols).Updates(m).Error
+	return
+}
+
+// GetSysGroupByGroupId 获取分组-根据主键
+func GetSysGroupByGroupId(groupId int) (item *SysGroup, err error) {
+	err = global.MYSQL["hz_crm"].Where("group_id = ?", groupId).First(&item).Error
+	return
+}
+
+// DeleteGroupByGroupId 删除分组-根据主键
+func DeleteGroupByGroupId(groupId int) (err error) {
+	sql := `DELETE FROM sys_group WHERE group_id = ? LIMIT 1`
+	err = global.MYSQL["hz_crm"].Exec(sql, groupId).Error
+	if err != nil {
+		return
+	}
+	// 清除关联
+	sql = `UPDATE admin SET group_id = 0, group_name = '' WHERE group_id = ? `
+	err = global.MYSQL["hz_crm"].Exec(sql, groupId).Error
+	return
+}

+ 7 - 7
models/crm/sys_role.go

@@ -32,15 +32,15 @@ func (m *SysRole) Update(cols []string) (err error) {
 	return
 }
 
-// GetSysRoleByName 根据角色名称获取角色
-func GetSysRoleByName(roleName string) (item *SysRole, err error) {
-	err = global.MYSQL["hz_crm"].Where("role_name = ?", roleName).First(&item).Error
+// GetSysRoleById 主键获取角色
+func GetSysRoleById(roleId int) (item *SysRole, err error) {
+	err = global.MYSQL["hz_crm"].Where("role_id = ?", roleId).First(&item).Error
 	return
 }
 
-// DeleteRoleByName 根据角色名称删除角色
-func DeleteRoleByName(roleName string) (err error) {
-	sql := `DELETE FROM sys_role WHERE role_name = ? LIMIT 1`
-	err = global.MYSQL["hz_crm"].Exec(sql, roleName).Error
+// DeleteRoleById 主键删除角色
+func DeleteRoleById(roleId int) (err error) {
+	sql := `DELETE FROM sys_role WHERE role_id = ? LIMIT 1`
+	err = global.MYSQL["hz_crm"].Exec(sql, roleId).Error
 	return
 }

+ 2 - 2
models/eta/admin.go

@@ -49,13 +49,13 @@ func (m *Admin) TableName() string {
 	return "admin"
 }
 
-// Create 新增角色
+// Create 新增用户
 func (m *Admin) Create() (err error) {
 	err = global.MYSQL["hz_eta"].Create(m).Error
 	return
 }
 
-// Update 更新角色
+// Update 更新用户
 func (m *Admin) Update(cols []string) (err error) {
 	err = global.MYSQL["hz_eta"].Model(m).Select(cols).Updates(m).Error
 	return

+ 42 - 0
models/eta/sys_department.go

@@ -0,0 +1,42 @@
+package eta
+
+import (
+	"hongze/hz_crm_eta/global"
+	"time"
+)
+
+type SysDepartment struct {
+	DepartmentId   int       `gorm:"primaryKey;column:department_id;type:int(11);not null" json:"department_id"`
+	DepartmentName string    `gorm:"unique;column:department_name;type:varchar(255);default:''" json:"department_name"` // 部门名称
+	CreateTime     time.Time `gorm:"column:create_time;type:datetime" json:"create_time"`                               // 创建时间
+	Sort           int       `gorm:"column:sort;type:int(10);not null;default:0" json:"sort"`                           // 排序
+}
+
+func (m *SysDepartment) TableName() string {
+	return "sys_department"
+}
+
+// Create 新增部门
+func (m *SysDepartment) Create() (err error) {
+	err = global.MYSQL["hz_eta"].Create(m).Error
+	return
+}
+
+// Update 更新部门
+func (m *SysDepartment) Update(cols []string) (err error) {
+	err = global.MYSQL["hz_eta"].Model(m).Select(cols).Updates(m).Error
+	return
+}
+
+// GetDepartmentById 主键获取部门
+func GetDepartmentById(departmentId int) (item *SysDepartment, err error) {
+	err = global.MYSQL["hz_eta"].Where("department_id = ?", departmentId).First(&item).Error
+	return
+}
+
+// DeleteDepartmentById 主键删除部门
+func DeleteDepartmentById(departmentId int) (err error) {
+	sql := `DELETE FROM sys_department WHERE department_id = ? LIMIT 1`
+	err = global.MYSQL["hz_eta"].Exec(sql, departmentId).Error
+	return
+}

+ 50 - 0
models/eta/sys_group.go

@@ -0,0 +1,50 @@
+package eta
+
+import (
+	"hongze/hz_crm_eta/global"
+	"time"
+)
+
+type SysGroup struct {
+	GroupId      int       `gorm:"primaryKey;column:group_id;type:int(11);not null" json:"group_id"`
+	DepartmentId int       `gorm:"index:idx_department_id;column:department_id;type:int(11)" json:"department_id"` // 部门id
+	GroupName    string    `gorm:"column:group_name;type:varchar(255);default:''" json:"group_name"`               // 分组名称
+	CreateTime   time.Time `gorm:"column:create_time;type:datetime" json:"create_time"`
+	ParentId     int       `gorm:"column:parent_id;type:int(11);default:0" json:"parent_id"`
+	Sort         int       `gorm:"column:sort;type:int(10);not null;default:0" json:"sort"` // 排序
+}
+
+func (m *SysGroup) TableName() string {
+	return "sys_group"
+}
+
+// Create 新增分组
+func (m *SysGroup) Create() (err error) {
+	err = global.MYSQL["hz_eta"].Create(m).Error
+	return
+}
+
+// Update 更新分组
+func (m *SysGroup) Update(cols []string) (err error) {
+	err = global.MYSQL["hz_eta"].Model(m).Select(cols).Updates(m).Error
+	return
+}
+
+// GetSysGroupByGroupId 获取分组-根据主键
+func GetSysGroupByGroupId(groupId int) (item *SysGroup, err error) {
+	err = global.MYSQL["hz_eta"].Where("group_id = ?", groupId).First(&item).Error
+	return
+}
+
+// DeleteGroupByGroupId 删除分组-根据主键
+func DeleteGroupByGroupId(groupId int) (err error) {
+	sql := `DELETE FROM sys_group WHERE group_id = ? LIMIT 1`
+	err = global.MYSQL["hz_eta"].Exec(sql, groupId).Error
+	if err != nil {
+		return
+	}
+	// 清除关联
+	sql = `UPDATE admin SET group_id = 0, group_name = '' WHERE group_id = ? `
+	err = global.MYSQL["hz_eta"].Exec(sql, groupId).Error
+	return
+}

+ 7 - 7
models/eta/sys_role.go

@@ -32,15 +32,15 @@ func (m *SysRole) Update(cols []string) (err error) {
 	return
 }
 
-// GetSysRoleByName 根据角色名称获取角色
-func GetSysRoleByName(roleName string) (item *SysRole, err error) {
-	err = global.MYSQL["hz_eta"].Where("role_name = ?", roleName).First(&item).Error
+// GetSysRoleById 主键获取角色
+func GetSysRoleById(roleId int) (item *SysRole, err error) {
+	err = global.MYSQL["hz_eta"].Where("role_id = ?", roleId).First(&item).Error
 	return
 }
 
-// DeleteRoleByName 根据角色名称删除角色
-func DeleteRoleByName(roleName string) (err error) {
-	sql := `DELETE FROM sys_role WHERE role_name = ? LIMIT 1`
-	err = global.MYSQL["hz_eta"].Exec(sql, roleName).Error
+// DeleteRoleById 主键删除角色
+func DeleteRoleById(roleId int) (err error) {
+	sql := `DELETE FROM sys_role WHERE role_id = ? LIMIT 1`
+	err = global.MYSQL["hz_eta"].Exec(sql, roleId).Error
 	return
 }

+ 28 - 29
services/cache_queue.go

@@ -7,67 +7,66 @@ import (
 	"hongze/hz_crm_eta/utils"
 )
 
-// ListenSyncAdminFromCrm 从CRM系统中同步用户
-func ListenSyncAdminFromCrm() {
+// ListenSyncRole 同步角色
+func ListenSyncRole() {
 	defer func() {
 		if err := recover(); err != nil {
-			fmt.Println("[ListenSyncAdminFromCrm]", err)
+			fmt.Println("[ListenSyncRole]", err)
 		}
 	}()
 	for {
-		global.Rc.Brpop(utils.CACHE_SYNC_SYS_USER_FROM_CRM, func(b []byte) {
-			var adminName string
-			_ = json.Unmarshal(b, &adminName)
-			_ = HandleSyncAdminFromCrm(utils.SOURCE_CRM_FLAG, adminName)
+		global.Rc.Brpop(utils.CACHE_SYNC_ROLE, func(b []byte) {
+			var d SyncRoleData
+			_ = json.Unmarshal(b, &d)
+			_ = HandleSyncRole(d)
 		})
 	}
 }
 
-// ListenSyncAdminFromEta 从ETA系统中同步用户
-func ListenSyncAdminFromEta() {
+// ListenSyncAdmin 同步用户
+func ListenSyncAdmin() {
 	defer func() {
 		if err := recover(); err != nil {
-			fmt.Println("[ListenSyncAdminFromEta]", err)
+			fmt.Println("[ListenSyncAdmin]", err)
 		}
 	}()
 	for {
-		global.Rc.Brpop(utils.CACHE_SYNC_SYS_USER_FROM_ETA, func(b []byte) {
-			var adminName string
-			_ = json.Unmarshal(b, &adminName)
-			_ = HandleSyncAdminFromCrm(utils.SOURCE_ETA_FLAG, adminName)
+		global.Rc.Brpop(utils.CACHE_SYNC_ADMIN, func(b []byte) {
+			var d SyncAdminData
+			_ = json.Unmarshal(b, &d)
+			_ = HandleSyncAdmin(d)
 		})
 	}
 }
 
-// ListenSyncRoleFromCrm 从CRM系统中同步角色
-func ListenSyncRoleFromCrm() {
+// ListenSyncDepartment 同步部门
+func ListenSyncDepartment() {
 	defer func() {
 		if err := recover(); err != nil {
-			fmt.Println("[ListenSyncRoleFromCrm]", err)
+			fmt.Println("[ListenSyncDepartment]", err)
 		}
 	}()
-	global.Rc.LPush(utils.CACHE_SYNC_SYS_ROLE_FROM_CRM, "同步角色")
 	for {
-		global.Rc.Brpop(utils.CACHE_SYNC_SYS_ROLE_FROM_CRM, func(b []byte) {
-			var roleName string
-			_ = json.Unmarshal(b, &roleName)
-			_ = HandleSyncSysRole(utils.SOURCE_CRM_FLAG, roleName)
+		global.Rc.Brpop(utils.CACHE_SYNC_DEPARTMENT, func(b []byte) {
+			var d SyncDepartmentData
+			_ = json.Unmarshal(b, &d)
+			_ = HandleSyncDepartment(d)
 		})
 	}
 }
 
-// ListenSyncRoleFromEta 从ETA系统中同步角色
-func ListenSyncRoleFromEta() {
+// ListenSyncGroup 同步分组
+func ListenSyncGroup() {
 	defer func() {
 		if err := recover(); err != nil {
-			fmt.Println("[ListenSyncRoleFromEta]", err)
+			fmt.Println("[ListenSyncGroup]", err)
 		}
 	}()
 	for {
-		global.Rc.Brpop(utils.CACHE_SYNC_SYS_ROLE_FROM_ETA, func(b []byte) {
-			var roleName string
-			_ = json.Unmarshal(b, &roleName)
-			_ = HandleSyncSysRole(utils.SOURCE_ETA_FLAG, roleName)
+		global.Rc.Brpop(utils.CACHE_SYNC_GROUP, func(b []byte) {
+			var d SyncGroupData
+			_ = json.Unmarshal(b, &d)
+			_ = HandleSyncGroup(d)
 		})
 	}
 }

+ 259 - 27
services/sys_user_sync.go

@@ -1,6 +1,7 @@
 package services
 
 import (
+	"encoding/json"
 	"fmt"
 	"hongze/hz_crm_eta/models/crm"
 	"hongze/hz_crm_eta/models/eta"
@@ -9,38 +10,43 @@ import (
 	"time"
 )
 
-// HandleSyncSysRole 同步系统角色
-func HandleSyncSysRole(source int, roleName string) (err error) {
-	// 角色名称唯一, 所以用角色名称做同步
-	if roleName == "" {
+// SyncRoleData 同步角色数据
+type SyncRoleData struct {
+	Source int `description:"来源: 1-CRM; 2-ETA"`
+	RoleId int `description:"角色ID"`
+}
+
+// HandleSyncRole 同步系统角色
+func HandleSyncRole(data SyncRoleData) (err error) {
+	if data.RoleId <= 0 {
 		return
 	}
-	if source != utils.SOURCE_CRM_FLAG && source != utils.SOURCE_ETA_FLAG {
+	if data.Source != utils.SOURCE_CRM_FLAG && data.Source != utils.SOURCE_ETA_FLAG {
 		return
 	}
 	defer func() {
 		if err != nil {
-			tips := fmt.Sprintf("CRM-ETA同步系统角色失败, source: %d, roleName: %s, errMsg: %s", source, roleName, err.Error())
-			fmt.Println(tips)
+			j, _ := json.Marshal(data)
+			tips := fmt.Sprintf("CRM-ETA同步系统角色失败, errMsg: %s\ndata: %s", err.Error(), string(j))
 			go alarm_msg.SendAlarmMsg(tips, 3)
 		}
 	}()
 
 	// CRM
-	if source == utils.SOURCE_CRM_FLAG {
+	if data.Source == utils.SOURCE_CRM_FLAG {
 		// 获取角色不存在, 则表示CRM删除了该角色, 需删除对应ETA角色
-		crmRole, e := crm.GetSysRoleByName(roleName)
+		crmRole, e := crm.GetSysRoleById(data.RoleId)
 		if e != nil {
 			if e != utils.ErrNoRow {
 				err = fmt.Errorf("获取CRM角色信息失败, Err: " + e.Error())
 				return
 			}
-			_ = eta.DeleteRoleByName(roleName)
+			_ = eta.DeleteRoleById(data.RoleId)
 			return
 		}
 
 		// 获取ETA对应角色, 存在则更新, 否则新增
-		etaRole, e := eta.GetSysRoleByName(roleName)
+		etaRole, e := eta.GetSysRoleById(data.RoleId)
 		if e != nil {
 			if e != utils.ErrNoRow {
 				err = fmt.Errorf("获取ETA对应角色信息失败, Err: " + e.Error())
@@ -48,6 +54,7 @@ func HandleSyncSysRole(source int, roleName string) (err error) {
 			}
 			// 新增
 			newRole := new(eta.SysRole)
+			newRole.RoleId = crmRole.RoleId
 			newRole.RoleName = crmRole.RoleName
 			newRole.RoleType = crmRole.RoleType
 			newRole.RoleTypeCode = crmRole.RoleTypeCode
@@ -75,17 +82,17 @@ func HandleSyncSysRole(source int, roleName string) (err error) {
 	}
 
 	// ETA
-	etaRole, e := eta.GetSysRoleByName(roleName)
+	etaRole, e := eta.GetSysRoleById(data.RoleId)
 	if e != nil {
 		if e != utils.ErrNoRow {
 			err = fmt.Errorf("获取ETA角色信息失败, Err: " + e.Error())
 			return
 		}
-		_ = crm.DeleteRoleByName(roleName)
+		_ = crm.DeleteRoleById(data.RoleId)
 		return
 	}
 
-	crmRole, e := crm.GetSysRoleByName(roleName)
+	crmRole, e := crm.GetSysRoleById(data.RoleId)
 	if e != nil {
 		if e != utils.ErrNoRow {
 			err = fmt.Errorf("获取CRM对应角色信息失败, Err: " + e.Error())
@@ -93,6 +100,7 @@ func HandleSyncSysRole(source int, roleName string) (err error) {
 		}
 		// 新增
 		newRole := new(crm.SysRole)
+		newRole.RoleId = etaRole.RoleId
 		newRole.RoleName = etaRole.RoleName
 		newRole.RoleType = etaRole.RoleType
 		newRole.RoleTypeCode = etaRole.RoleTypeCode
@@ -119,37 +127,43 @@ func HandleSyncSysRole(source int, roleName string) (err error) {
 	return
 }
 
-// HandleSyncAdminFromCrm 同步系统用户
-func HandleSyncAdminFromCrm(source int, adminName string) (err error) {
-	if adminName == "" {
+// SyncAdminData 同步用户数据
+type SyncAdminData struct {
+	Source    int    `description:"来源: 1-CRM; 2-ETA"`
+	AdminName string `description:"用户名"`
+}
+
+// HandleSyncAdmin 同步系统用户
+func HandleSyncAdmin(data SyncAdminData) (err error) {
+	if data.AdminName == "" {
 		return
 	}
-	if source != utils.SOURCE_CRM_FLAG && source != utils.SOURCE_ETA_FLAG {
+	if data.Source != utils.SOURCE_CRM_FLAG && data.Source != utils.SOURCE_ETA_FLAG {
 		return
 	}
 	defer func() {
 		if err != nil {
-			tips := fmt.Sprintf("CRM-ETA同步系统用户失败, source: %d, adminName: %s, errMsg: %s", source, adminName, err.Error())
-			fmt.Println(tips)
+			j, _ := json.Marshal(data)
+			tips := fmt.Sprintf("CRM-ETA同步系统用户失败, errMsg: %s\ndata: %s", err.Error(), string(j))
 			go alarm_msg.SendAlarmMsg(tips, 3)
 		}
 	}()
 
 	// CRM
-	if source == utils.SOURCE_CRM_FLAG {
+	if data.Source == utils.SOURCE_CRM_FLAG {
 		// 获取用户不存在, 则表示CRM删除了该用户, 需删除对应ETA用户
-		crmUser, e := crm.GetSysUserByAdminName(adminName)
+		crmUser, e := crm.GetSysUserByAdminName(data.AdminName)
 		if e != nil {
 			if e != utils.ErrNoRow {
 				err = fmt.Errorf("获取CRM用户信息失败, Err: " + e.Error())
 				return
 			}
-			_ = eta.DeleteSysUserByName(adminName)
+			_ = eta.DeleteSysUserByName(data.AdminName)
 			return
 		}
 
 		// 获取ETA对应用户, 存在则更新, 否则新增
-		etaUser, e := eta.GetSysUserByAdminName(adminName)
+		etaUser, e := eta.GetSysUserByAdminName(data.AdminName)
 		if e != nil {
 			if e != utils.ErrNoRow {
 				err = fmt.Errorf("获取ETA对应用户信息失败, Err: " + e.Error())
@@ -244,17 +258,17 @@ func HandleSyncAdminFromCrm(source int, adminName string) (err error) {
 	}
 
 	// ETA
-	etaUser, e := crm.GetSysUserByAdminName(adminName)
+	etaUser, e := eta.GetSysUserByAdminName(data.AdminName)
 	if e != nil {
 		if e != utils.ErrNoRow {
 			err = fmt.Errorf("获取ETA用户信息失败, Err: " + e.Error())
 			return
 		}
-		_ = eta.DeleteSysUserByName(adminName)
+		_ = crm.DeleteSysUserByName(data.AdminName)
 		return
 	}
 
-	crmUser, e := eta.GetSysUserByAdminName(adminName)
+	crmUser, e := crm.GetSysUserByAdminName(data.AdminName)
 	if e != nil {
 		if e != utils.ErrNoRow {
 			err = fmt.Errorf("获取ETA对应用户信息失败, Err: " + e.Error())
@@ -349,3 +363,221 @@ func HandleSyncAdminFromCrm(source int, adminName string) (err error) {
 	}
 	return
 }
+
+// SyncDepartmentData 同步部门数据
+type SyncDepartmentData struct {
+	Source       int `description:"来源: 1-CRM; 2-ETA"`
+	DepartmentId int `description:"部门ID"`
+}
+
+// HandleSyncDepartment 同步部门
+func HandleSyncDepartment(data SyncDepartmentData) (err error) {
+	if data.DepartmentId <= 0 {
+		return
+	}
+	if data.Source != utils.SOURCE_CRM_FLAG && data.Source != utils.SOURCE_ETA_FLAG {
+		return
+	}
+	defer func() {
+		if err != nil {
+			j, _ := json.Marshal(data)
+			tips := fmt.Sprintf("CRM-ETA同步部门失败, errMsg: %s\ndata: %s", err.Error(), string(j))
+			go alarm_msg.SendAlarmMsg(tips, 3)
+		}
+	}()
+
+	// CRM
+	if data.Source == utils.SOURCE_CRM_FLAG {
+		// 获取部门不存在, 则表示CRM删除了该部门, 需删除对应ETA部门
+		crmDepartment, e := crm.GetDepartmentById(data.DepartmentId)
+		if e != nil {
+			if e != utils.ErrNoRow {
+				err = fmt.Errorf("获取CRM部门信息失败, Err: " + e.Error())
+				return
+			}
+			_ = eta.DeleteDepartmentById(data.DepartmentId)
+			return
+		}
+
+		// 获取ETA对应部门, 存在则更新, 否则新增
+		etaDepartment, e := eta.GetDepartmentById(data.DepartmentId)
+		if e != nil {
+			if e != utils.ErrNoRow {
+				err = fmt.Errorf("获取ETA对应部门信息失败, Err: " + e.Error())
+				return
+			}
+			// 新增
+			newDepartment := new(eta.SysDepartment)
+			newDepartment.DepartmentId = crmDepartment.DepartmentId
+			newDepartment.DepartmentName = crmDepartment.DepartmentName
+			newDepartment.Sort = crmDepartment.Sort
+			newDepartment.CreateTime = time.Now().Local()
+			e = newDepartment.Create()
+			if e != nil {
+				err = fmt.Errorf("新增ETA对应部门失败, Err: " + e.Error())
+			}
+			return
+		}
+		// 更新
+		etaDepartment.DepartmentName = crmDepartment.DepartmentName
+		etaDepartment.Sort = crmDepartment.Sort
+		cols := []string{"DepartmentName", "Sort"}
+		e = etaDepartment.Update(cols)
+		if e != nil {
+			err = fmt.Errorf("更新ETA对应部门失败, Err: " + e.Error())
+		}
+		return
+	}
+
+	// ETA
+	etaDepartment, e := eta.GetDepartmentById(data.DepartmentId)
+	if e != nil {
+		if e != utils.ErrNoRow {
+			err = fmt.Errorf("获取ETA部门信息失败, Err: " + e.Error())
+			return
+		}
+		_ = crm.DeleteDepartmentById(data.DepartmentId)
+		return
+	}
+
+	crmDepartment, e := crm.GetDepartmentById(data.DepartmentId)
+	if e != nil {
+		if e != utils.ErrNoRow {
+			err = fmt.Errorf("获取CRM对应部门信息失败, Err: " + e.Error())
+			return
+		}
+		// 新增
+		newDepartment := new(eta.SysDepartment)
+		newDepartment.DepartmentId = etaDepartment.DepartmentId
+		newDepartment.DepartmentName = etaDepartment.DepartmentName
+		newDepartment.Sort = etaDepartment.Sort
+		newDepartment.CreateTime = time.Now().Local()
+		e = newDepartment.Create()
+		if e != nil {
+			err = fmt.Errorf("新增CRM对应部门失败, Err: " + e.Error())
+		}
+		return
+	}
+	// 更新
+	crmDepartment.DepartmentName = etaDepartment.DepartmentName
+	crmDepartment.Sort = etaDepartment.Sort
+	cols := []string{"DepartmentName", "Sort"}
+	e = crmDepartment.Update(cols)
+	if e != nil {
+		err = fmt.Errorf("更新CRM对应部门失败, Err: " + e.Error())
+	}
+	return
+}
+
+// SyncGroupData 同步分组数据
+type SyncGroupData struct {
+	Source  int `description:"来源: 1-CRM; 2-ETA"`
+	GroupId int `description:"分组ID"`
+}
+
+// HandleSyncGroup 同步分组
+func HandleSyncGroup(data SyncGroupData) (err error) {
+	if data.GroupId <= 0 {
+		return
+	}
+	if data.Source != utils.SOURCE_CRM_FLAG && data.Source != utils.SOURCE_ETA_FLAG {
+		return
+	}
+	defer func() {
+		if err != nil {
+			j, _ := json.Marshal(data)
+			tips := fmt.Sprintf("CRM-ETA同步分组失败, errMsg: %s\ndata: %s", err.Error(), string(j))
+			go alarm_msg.SendAlarmMsg(tips, 3)
+		}
+	}()
+
+	// CRM
+	if data.Source == utils.SOURCE_CRM_FLAG {
+		// 获取分组不存在, 则表示CRM删除了该分组, 需删除对应ETA分组
+		crmGroup, e := crm.GetSysGroupByGroupId(data.GroupId)
+		if e != nil {
+			if e != utils.ErrNoRow {
+				err = fmt.Errorf("获取CRM分组信息失败, Err: " + e.Error())
+				return
+			}
+			_ = eta.DeleteGroupByGroupId(data.GroupId)
+			return
+		}
+
+		// 获取ETA对应分组, 存在则更新, 否则新增
+		etaGroup, e := eta.GetSysGroupByGroupId(data.GroupId)
+		if e != nil {
+			if e != utils.ErrNoRow {
+				err = fmt.Errorf("获取ETA对应分组信息失败, Err: " + e.Error())
+				return
+			}
+			// 新增
+			newGroup := new(eta.SysGroup)
+			newGroup.GroupId = crmGroup.GroupId
+			newGroup.DepartmentId = crmGroup.DepartmentId
+			newGroup.GroupName = crmGroup.GroupName
+			newGroup.ParentId = crmGroup.ParentId
+			newGroup.Sort = crmGroup.Sort
+			newGroup.CreateTime = time.Now().Local()
+			e = newGroup.Create()
+			if e != nil {
+				err = fmt.Errorf("新增ETA对应分组失败, Err: " + e.Error())
+			}
+			return
+		}
+		// 更新
+		etaGroup.DepartmentId = crmGroup.DepartmentId
+		etaGroup.GroupName = crmGroup.GroupName
+		etaGroup.ParentId = crmGroup.ParentId
+		etaGroup.Sort = crmGroup.Sort
+		cols := []string{"DepartmentId", "GroupName", "ParentId", "Sort"}
+		e = etaGroup.Update(cols)
+		if e != nil {
+			err = fmt.Errorf("更新ETA对应分组失败, Err: " + e.Error())
+		}
+		return
+	}
+
+	// ETA
+	etaGroup, e := eta.GetSysGroupByGroupId(data.GroupId)
+	if e != nil {
+		if e != utils.ErrNoRow {
+			err = fmt.Errorf("获取ETA分组信息失败, Err: " + e.Error())
+			return
+		}
+		_ = crm.DeleteGroupByGroupId(data.GroupId)
+		return
+	}
+
+	crmGroup, e := crm.GetSysGroupByGroupId(data.GroupId)
+	if e != nil {
+		if e != utils.ErrNoRow {
+			err = fmt.Errorf("获取CRM对应分组信息失败, Err: " + e.Error())
+			return
+		}
+		// 新增
+		newGroup := new(eta.SysGroup)
+		newGroup.GroupId = etaGroup.GroupId
+		newGroup.DepartmentId = etaGroup.DepartmentId
+		newGroup.GroupName = etaGroup.GroupName
+		newGroup.ParentId = etaGroup.ParentId
+		newGroup.Sort = etaGroup.Sort
+		newGroup.CreateTime = time.Now().Local()
+		e = newGroup.Create()
+		if e != nil {
+			err = fmt.Errorf("新增CRM对应分组失败, Err: " + e.Error())
+		}
+		return
+	}
+	// 更新
+	crmGroup.DepartmentId = etaGroup.DepartmentId
+	crmGroup.GroupName = etaGroup.GroupName
+	crmGroup.ParentId = etaGroup.ParentId
+	crmGroup.Sort = etaGroup.Sort
+	cols := []string{"DepartmentId", "GroupName", "ParentId", "Sort"}
+	e = crmGroup.Update(cols)
+	if e != nil {
+		err = fmt.Errorf("更新CRM对应分组失败, Err: " + e.Error())
+	}
+	return
+}

+ 4 - 4
utils/constants.go

@@ -81,8 +81,8 @@ const (
 
 // 同步角色和用户的缓存队列key
 const (
-	CACHE_SYNC_SYS_USER_FROM_CRM = "hz_crm_eta:crm_admin_sync"
-	CACHE_SYNC_SYS_ROLE_FROM_CRM = "hz_crm_eta:crm_role_sync"
-	CACHE_SYNC_SYS_USER_FROM_ETA = "hz_crm_eta:eta_admin_sync"
-	CACHE_SYNC_SYS_ROLE_FROM_ETA = "hz_crm_eta:eta_role_sync"
+	CACHE_SYNC_ADMIN      = "hz_crm_eta:sync_admin"
+	CACHE_SYNC_ROLE       = "hz_crm_eta:sync_role"
+	CACHE_SYNC_DEPARTMENT = "hz_crm_eta:sync_department"
+	CACHE_SYNC_GROUP      = "hz_crm_eta:sync_group"
 )