2022-06-18 17:09:14 +08:00
|
|
|
|
package logic
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
2022-07-15 17:56:45 +08:00
|
|
|
|
"strings"
|
2022-06-18 17:09:14 +08:00
|
|
|
|
|
|
|
|
|
"github.com/eryajf/go-ldap-admin/config"
|
|
|
|
|
"github.com/eryajf/go-ldap-admin/model"
|
|
|
|
|
"github.com/eryajf/go-ldap-admin/public/client/wechat"
|
|
|
|
|
|
|
|
|
|
"github.com/eryajf/go-ldap-admin/public/tools"
|
|
|
|
|
"github.com/eryajf/go-ldap-admin/service/ildap"
|
|
|
|
|
"github.com/eryajf/go-ldap-admin/service/isql"
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type WeComLogic struct {
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-08 14:58:23 +08:00
|
|
|
|
// 通过企业微信获取部门信息
|
2022-06-18 17:09:14 +08:00
|
|
|
|
func (d *WeComLogic) SyncWeComDepts(c *gin.Context, req interface{}) (data interface{}, rspError interface{}) {
|
|
|
|
|
// 1.获取所有部门
|
2022-07-01 12:35:02 +08:00
|
|
|
|
deptSource, err := wechat.GetAllDepts()
|
2022-06-18 17:09:14 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, tools.NewOperationError(fmt.Errorf("获取企业微信部门列表失败:%s", err.Error()))
|
|
|
|
|
}
|
2022-07-01 12:35:02 +08:00
|
|
|
|
depts, err := ConvertDeptData(config.Conf.WeCom.Flag, deptSource)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, tools.NewOperationError(fmt.Errorf("转换企业微信部门数据失败:%s", err.Error()))
|
|
|
|
|
}
|
2022-07-13 16:43:05 +08:00
|
|
|
|
|
|
|
|
|
// 2.将远程数据转换成树
|
|
|
|
|
deptTree := GroupListToTree(fmt.Sprintf("%s_1", config.Conf.WeCom.Flag), depts)
|
|
|
|
|
|
|
|
|
|
// 3.根据树进行创建
|
|
|
|
|
err = d.addDepts(deptTree.Children)
|
|
|
|
|
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 添加部门
|
|
|
|
|
func (d WeComLogic) addDepts(depts []*model.Group) error {
|
2022-06-18 17:09:14 +08:00
|
|
|
|
for _, dept := range depts {
|
2022-07-01 12:35:02 +08:00
|
|
|
|
err := d.AddDepts(dept)
|
2022-06-18 17:09:14 +08:00
|
|
|
|
if err != nil {
|
2022-07-13 16:43:05 +08:00
|
|
|
|
return tools.NewOperationError(fmt.Errorf("DsyncWeComDepts添加部门失败: %s", err.Error()))
|
2022-06-18 17:09:14 +08:00
|
|
|
|
}
|
2022-07-13 16:43:05 +08:00
|
|
|
|
if len(dept.Children) != 0 {
|
|
|
|
|
err = d.addDepts(dept.Children)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return tools.NewOperationError(fmt.Errorf("DsyncWeComDepts添加部门失败: %s", err.Error()))
|
|
|
|
|
}
|
2022-06-18 17:09:14 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2022-07-13 16:43:05 +08:00
|
|
|
|
return nil
|
2022-06-18 17:09:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// AddGroup 添加部门数据
|
2022-07-01 12:35:02 +08:00
|
|
|
|
func (d WeComLogic) AddDepts(group *model.Group) error {
|
2022-06-18 17:09:14 +08:00
|
|
|
|
// 判断部门名称是否存在
|
|
|
|
|
parentGroup := new(model.Group)
|
2022-07-01 12:35:02 +08:00
|
|
|
|
err := isql.Group.Find(tools.H{"source_dept_id": group.SourceDeptParentId}, parentGroup)
|
2022-06-18 17:09:14 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
return tools.NewMySqlError(fmt.Errorf("查询父级部门失败:%s", err.Error()))
|
|
|
|
|
}
|
2022-07-18 11:38:38 +08:00
|
|
|
|
|
|
|
|
|
// 此时的 group 已经附带了Build后动态关联好的字段,接下来将一些确定性的其他字段值添加上,就可以创建这个分组了
|
|
|
|
|
group.Creator = "system"
|
|
|
|
|
group.GroupType = "cn"
|
|
|
|
|
group.ParentId = parentGroup.ID
|
|
|
|
|
group.Source = config.Conf.WeCom.Flag
|
|
|
|
|
group.GroupDN = fmt.Sprintf("cn=%s,%s", group.GroupName, parentGroup.GroupDN)
|
|
|
|
|
|
|
|
|
|
if !isql.Group.Exist(tools.H{"group_dn": group.GroupDN}) {
|
2022-07-01 12:35:02 +08:00
|
|
|
|
err = CommonAddGroup(group)
|
2022-06-18 17:09:14 +08:00
|
|
|
|
if err != nil {
|
2022-07-27 21:35:37 +08:00
|
|
|
|
return tools.NewOperationError(fmt.Errorf("添加部门: %s, 失败: %s", group.GroupName, err.Error()))
|
2022-06-18 17:09:14 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-08 14:58:23 +08:00
|
|
|
|
// 根据现有数据库同步到的部门信息,开启用户同步
|
2022-06-18 17:09:14 +08:00
|
|
|
|
func (d WeComLogic) SyncWeComUsers(c *gin.Context, req interface{}) (data interface{}, rspError interface{}) {
|
|
|
|
|
// 1.获取企业微信用户列表
|
2022-07-01 12:35:02 +08:00
|
|
|
|
staffSource, err := wechat.GetAllUsers()
|
2022-06-18 17:09:14 +08:00
|
|
|
|
if err != nil {
|
2022-07-01 12:35:02 +08:00
|
|
|
|
return nil, tools.NewOperationError(fmt.Errorf("获取企业微信用户列表失败:%s", err.Error()))
|
2022-06-18 17:09:14 +08:00
|
|
|
|
}
|
2022-07-01 12:35:02 +08:00
|
|
|
|
staffs, err := ConvertUserData(config.Conf.WeCom.Flag, staffSource)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, tools.NewOperationError(fmt.Errorf("转换企业微信用户数据失败:%s", err.Error()))
|
2022-06-18 17:09:14 +08:00
|
|
|
|
}
|
|
|
|
|
// 2.遍历用户,开始写入
|
2022-07-01 12:35:02 +08:00
|
|
|
|
for _, staff := range staffs {
|
2022-06-18 17:09:14 +08:00
|
|
|
|
// 入库
|
2022-07-01 12:35:02 +08:00
|
|
|
|
err = d.AddUsers(staff)
|
2022-06-18 17:09:14 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, tools.NewOperationError(fmt.Errorf("SyncWeComUsers写入用户失败:%s", err.Error()))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 3.获取企业微信已离职用户id列表
|
2022-07-18 11:38:38 +08:00
|
|
|
|
// 拿到MySQL所有用户数据(来源为 wecom的用户),远程没有的,则说明被删除了
|
|
|
|
|
// 如果以后企业微信透出了已离职用户列表的接口,则这里可以进行改进
|
2022-07-01 12:35:02 +08:00
|
|
|
|
var res []*model.User
|
2022-07-18 11:38:38 +08:00
|
|
|
|
users, err := isql.User.ListAll()
|
2022-07-01 12:35:02 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, tools.NewMySqlError(fmt.Errorf("获取用户列表失败:" + err.Error()))
|
|
|
|
|
}
|
|
|
|
|
for _, user := range users {
|
2022-07-18 11:38:38 +08:00
|
|
|
|
if user.Source != config.Conf.WeCom.Flag {
|
2022-07-01 12:35:02 +08:00
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
in := true
|
|
|
|
|
for _, staff := range staffs {
|
|
|
|
|
if user.Username == staff.Username {
|
|
|
|
|
in = false
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if in {
|
|
|
|
|
res = append(res, user)
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-06-18 17:09:14 +08:00
|
|
|
|
// 4.遍历id,开始处理
|
2022-07-01 12:35:02 +08:00
|
|
|
|
for _, userTmp := range res {
|
2022-06-18 17:09:14 +08:00
|
|
|
|
user := new(model.User)
|
2023-11-08 14:58:23 +08:00
|
|
|
|
err = isql.User.Find(tools.H{"source_user_id": userTmp.SourceUserId, "status": 1}, user)
|
2022-06-18 17:09:14 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, tools.NewMySqlError(fmt.Errorf("在MySQL查询用户失败: " + err.Error()))
|
|
|
|
|
}
|
|
|
|
|
// 先从ldap删除用户
|
|
|
|
|
err = ildap.User.Delete(user.UserDN)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, tools.NewLdapError(fmt.Errorf("在LDAP删除用户失败" + err.Error()))
|
|
|
|
|
}
|
|
|
|
|
// 然后更新MySQL中用户状态
|
|
|
|
|
err = isql.User.ChangeStatus(int(user.ID), 2)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, tools.NewMySqlError(fmt.Errorf("在MySQL更新用户状态失败: " + err.Error()))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// AddUser 添加用户数据
|
2022-07-01 12:35:02 +08:00
|
|
|
|
func (d WeComLogic) AddUsers(user *model.User) error {
|
2022-07-18 11:38:38 +08:00
|
|
|
|
// 根据角色id获取角色
|
|
|
|
|
roles, err := isql.Role.GetRolesByIds([]uint{2})
|
|
|
|
|
if err != nil {
|
|
|
|
|
return tools.NewValidatorError(fmt.Errorf("根据角色ID获取角色信息失败:%s", err.Error()))
|
|
|
|
|
}
|
|
|
|
|
user.Creator = "system"
|
|
|
|
|
user.Roles = roles
|
|
|
|
|
user.Password = config.Conf.Ldap.UserInitPassword
|
|
|
|
|
user.Source = config.Conf.WeCom.Flag
|
|
|
|
|
user.UserDN = fmt.Sprintf("uid=%s,%s", user.Username, config.Conf.Ldap.UserDN)
|
|
|
|
|
|
|
|
|
|
// 根据 user_dn 查询用户,不存在则创建
|
|
|
|
|
if !isql.User.Exist(tools.H{"user_dn": user.UserDN}) {
|
2022-07-15 17:56:45 +08:00
|
|
|
|
// 获取用户将要添加的分组
|
|
|
|
|
groups, err := isql.Group.GetGroupByIds(tools.StringToSlice(user.DepartmentId, ","))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return tools.NewMySqlError(fmt.Errorf("根据部门ID获取部门信息失败" + err.Error()))
|
|
|
|
|
}
|
|
|
|
|
var deptTmp string
|
|
|
|
|
for _, group := range groups {
|
|
|
|
|
deptTmp = deptTmp + group.GroupName + ","
|
|
|
|
|
}
|
|
|
|
|
user.Departments = strings.TrimRight(deptTmp, ",")
|
2022-07-18 11:38:38 +08:00
|
|
|
|
|
|
|
|
|
// 创建用户
|
2022-07-15 17:56:45 +08:00
|
|
|
|
err = CommonAddUser(user, groups)
|
2022-06-18 17:09:14 +08:00
|
|
|
|
if err != nil {
|
2022-07-27 21:35:37 +08:00
|
|
|
|
return tools.NewOperationError(fmt.Errorf("添加用户: %s, 失败: %s", user.Username, err.Error()))
|
2022-06-18 17:09:14 +08:00
|
|
|
|
}
|
2023-10-15 21:04:26 +08:00
|
|
|
|
} else {
|
|
|
|
|
// 此处逻辑未经实际验证,如在使用中有问题,请反馈
|
|
|
|
|
if config.Conf.WeCom.IsUpdateSyncd {
|
|
|
|
|
// 先获取用户信息
|
|
|
|
|
oldData := new(model.User)
|
|
|
|
|
err = isql.User.Find(tools.H{"user_dn": user.UserDN}, oldData)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
// 获取用户将要添加的分组
|
|
|
|
|
groups, err := isql.Group.GetGroupByIds(tools.StringToSlice(user.DepartmentId, ","))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return tools.NewMySqlError(fmt.Errorf("根据部门ID获取部门信息失败" + err.Error()))
|
|
|
|
|
}
|
|
|
|
|
var deptTmp string
|
|
|
|
|
for _, group := range groups {
|
|
|
|
|
deptTmp = deptTmp + group.GroupName + ","
|
|
|
|
|
}
|
|
|
|
|
user.Model = oldData.Model
|
|
|
|
|
user.Roles = oldData.Roles
|
|
|
|
|
user.Creator = oldData.Creator
|
|
|
|
|
user.Source = oldData.Source
|
|
|
|
|
user.Password = oldData.Password
|
|
|
|
|
user.UserDN = oldData.UserDN
|
|
|
|
|
user.Departments = strings.TrimRight(deptTmp, ",")
|
|
|
|
|
|
|
|
|
|
// 用户信息的预置处理
|
|
|
|
|
if user.Nickname == "" {
|
|
|
|
|
user.Nickname = oldData.Nickname
|
|
|
|
|
}
|
|
|
|
|
if user.GivenName == "" {
|
|
|
|
|
user.GivenName = user.Nickname
|
|
|
|
|
}
|
|
|
|
|
if user.Introduction == "" {
|
|
|
|
|
user.Introduction = user.Nickname
|
|
|
|
|
}
|
|
|
|
|
if user.Mail == "" {
|
|
|
|
|
user.Mail = oldData.Mail
|
|
|
|
|
}
|
|
|
|
|
if user.JobNumber == "" {
|
|
|
|
|
user.JobNumber = oldData.JobNumber
|
|
|
|
|
}
|
|
|
|
|
if user.Departments == "" {
|
|
|
|
|
user.Departments = oldData.Departments
|
|
|
|
|
}
|
|
|
|
|
if user.Position == "" {
|
|
|
|
|
user.Position = oldData.Position
|
|
|
|
|
}
|
|
|
|
|
if user.PostalAddress == "" {
|
|
|
|
|
user.PostalAddress = oldData.PostalAddress
|
|
|
|
|
}
|
|
|
|
|
if user.Mobile == "" {
|
|
|
|
|
user.Mobile = oldData.Mobile
|
|
|
|
|
}
|
|
|
|
|
if err = CommonUpdateUser(oldData, user, tools.StringToSlice(user.DepartmentId, ",")); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-06-18 17:09:14 +08:00
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|