Skip to content

Commit 223e64c

Browse files
authored
🐛 fix(dingtalk): 修复钉钉部门同步的错误处理和日志记录 (#403)
- 添加错误消息格式化并记录详细日志 - 改进错误提示信息,包含部门名称等上下文 🐛 fix(feishu): 修复飞书部门同步的错误处理和日志记录 - 添加错误消息格式化并记录详细日志 - 改进错误提示信息,包含部门名称等上下文 🐛 fix(openldap): 修复OpenLDAP同步的错误处理和日志记录 - 添加错误消息格式化并记录详细日志 - 改进错误提示信息,包含用户和部门名称等上下文 🐛 fix(sql): 修复SQL同步的错误处理和日志记录 - 添加错误消息格式化并记录详细日志 - 改进错误提示信息,包含用户和分组名称等上下文 🐛 fix(wecom): 修复企业微信同步的错误处理和日志记录 - 添加错误消息格式化并记录详细日志 - 改进错误提示信息,包含用户和部门名称等上下文 🔧 chore(logic): 统一添加common包导入 - 在所有逻辑文件中添加common包用于日志记录 📝 docs(logic): 添加详细的同步进度日志 - 在部门同步成功时记录成功日志 - 在用户同步时添加进度跟踪日志(当前序号/总数) - 在同步完成时统计并记录同步数量汇总信息
1 parent 06b6c87 commit 223e64c

File tree

5 files changed

+214
-59
lines changed

5 files changed

+214
-59
lines changed

logic/dingtalk_logic.go

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/eryajf/go-ldap-admin/config"
88
"github.com/eryajf/go-ldap-admin/model"
99
"github.com/eryajf/go-ldap-admin/public/client/dingtalk"
10+
"github.com/eryajf/go-ldap-admin/public/common"
1011
"github.com/eryajf/go-ldap-admin/public/tools"
1112
"github.com/eryajf/go-ldap-admin/service/ildap"
1213
"github.com/eryajf/go-ldap-admin/service/isql"
@@ -21,19 +22,29 @@ func (d *DingTalkLogic) SyncDingTalkDepts(c *gin.Context, req interface{}) (data
2122
// 1.获取所有部门
2223
deptSource, err := dingtalk.GetAllDepts()
2324
if err != nil {
24-
return nil, tools.NewOperationError(fmt.Errorf("获取钉钉部门列表失败:%s", err.Error()))
25+
errMsg := fmt.Sprintf("获取钉钉部门列表失败:%s", err.Error())
26+
common.Log.Errorf("SyncDingTalkDepts: %s", errMsg)
27+
return nil, tools.NewOperationError(fmt.Errorf(errMsg))
2528
}
2629
depts, err := ConvertDeptData(config.Conf.DingTalk.Flag, deptSource)
2730
if err != nil {
28-
return nil, tools.NewOperationError(fmt.Errorf("转换钉钉部门数据失败:%s", err.Error()))
31+
errMsg := fmt.Sprintf("转换钉钉部门数据失败:%s", err.Error())
32+
common.Log.Errorf("SyncDingTalkDepts: %s", errMsg)
33+
return nil, tools.NewOperationError(fmt.Errorf(errMsg))
2934
}
3035

3136
// 2.将远程数据转换成树
3237
deptTree := GroupListToTree(fmt.Sprintf("%s_1", config.Conf.DingTalk.Flag), depts)
3338

3439
// 3.根据树进行创建
3540
err = d.addDepts(deptTree.Children)
41+
if err != nil {
42+
errMsg := fmt.Sprintf("创建钉钉部门失败:%s", err.Error())
43+
common.Log.Errorf("SyncDingTalkDepts: %s", errMsg)
44+
return nil, err
45+
}
3646

47+
common.Log.Infof("SyncDingTalkDepts: 钉钉部门同步成功")
3748
return nil, err
3849
}
3950

@@ -42,12 +53,16 @@ func (d DingTalkLogic) addDepts(depts []*model.Group) error {
4253
for _, dept := range depts {
4354
err := d.AddDepts(dept)
4455
if err != nil {
45-
return tools.NewOperationError(fmt.Errorf("DsyncDingTalkDepts添加部门失败: %s", err.Error()))
56+
errMsg := fmt.Sprintf("DsyncDingTalkDepts添加部门[%s]失败: %s", dept.GroupName, err.Error())
57+
common.Log.Errorf("%s", errMsg)
58+
return tools.NewOperationError(fmt.Errorf(errMsg))
4659
}
4760
if len(dept.Children) != 0 {
4861
err = d.addDepts(dept.Children)
4962
if err != nil {
50-
return tools.NewOperationError(fmt.Errorf("DsyncDingTalkDepts添加部门失败: %s", err.Error()))
63+
errMsg := fmt.Sprintf("DsyncDingTalkDepts添加子部门失败: %s", err.Error())
64+
common.Log.Errorf("%s", errMsg)
65+
return tools.NewOperationError(fmt.Errorf(errMsg))
5166
}
5267
}
5368
}
@@ -83,19 +98,26 @@ func (d DingTalkLogic) SyncDingTalkUsers(c *gin.Context, req interface{}) (data
8398
// 1.获取钉钉用户列表
8499
staffSource, err := dingtalk.GetAllUsers()
85100
if err != nil {
86-
return nil, tools.NewOperationError(fmt.Errorf("SyncDingTalkUsers获取钉钉用户列表失败:%s", err.Error()))
101+
errMsg := fmt.Sprintf("获取钉钉用户列表失败:%s", err.Error())
102+
common.Log.Errorf("SyncDingTalkUsers: %s", errMsg)
103+
return nil, tools.NewOperationError(fmt.Errorf(errMsg))
87104
}
88105
staffs, err := ConvertUserData(config.Conf.DingTalk.Flag, staffSource)
89106
if err != nil {
90-
return nil, tools.NewOperationError(fmt.Errorf("转换钉钉用户数据失败:%s", err.Error()))
107+
errMsg := fmt.Sprintf("转换钉钉用户数据失败:%s", err.Error())
108+
common.Log.Errorf("SyncDingTalkUsers: %s", errMsg)
109+
return nil, tools.NewOperationError(fmt.Errorf(errMsg))
91110
}
92111
// 2.遍历用户,开始写入
93-
for _, staff := range staffs {
112+
for i, staff := range staffs {
94113
// 入库
95114
err = d.AddUsers(staff)
96115
if err != nil {
97-
return nil, tools.NewOperationError(fmt.Errorf("SyncDingTalkUsers写入用户失败:%s", err.Error()))
116+
errMsg := fmt.Sprintf("写入用户[%s]失败:%s", staff.Username, err.Error())
117+
common.Log.Errorf("SyncDingTalkUsers: %s", errMsg)
118+
return nil, tools.NewOperationError(fmt.Errorf(errMsg))
98119
}
120+
common.Log.Infof("SyncDingTalkUsers: 成功同步用户[%s] (%d/%d)", staff.Username, i+1, len(staffs))
99121
}
100122

101123
// 3.获取钉钉已离职用户id列表
@@ -107,9 +129,13 @@ func (d DingTalkLogic) SyncDingTalkUsers(c *gin.Context, req interface{}) (data
107129
userIds, err = dingtalk.GetLeaveUserIdsDateRange(config.Conf.DingTalk.ULeaveRange)
108130
}
109131
if err != nil {
110-
return nil, tools.NewOperationError(fmt.Errorf("SyncDingTalkUsers获取钉钉离职用户列表失败:%s", err.Error()))
132+
errMsg := fmt.Sprintf("获取钉钉离职用户列表失败:%s", err.Error())
133+
common.Log.Errorf("SyncDingTalkUsers: %s", errMsg)
134+
return nil, tools.NewOperationError(fmt.Errorf(errMsg))
111135
}
136+
112137
// 4.遍历id,开始处理
138+
processedCount := 0
113139
for _, uid := range userIds {
114140
if isql.User.Exist(
115141
tools.H{
@@ -119,21 +145,30 @@ func (d DingTalkLogic) SyncDingTalkUsers(c *gin.Context, req interface{}) (data
119145
user := new(model.User)
120146
err = isql.User.Find(tools.H{"source_user_id": fmt.Sprintf("%s_%s", config.Conf.DingTalk.Flag, uid)}, user)
121147
if err != nil {
122-
return nil, tools.NewMySqlError(fmt.Errorf("在MySQL查询用户失败: " + err.Error()))
148+
errMsg := fmt.Sprintf("在MySQL查询离职用户[%s]失败: %s", uid, err.Error())
149+
common.Log.Errorf("SyncDingTalkUsers: %s", errMsg)
150+
return nil, tools.NewMySqlError(fmt.Errorf(errMsg))
123151
}
124152
// 先从ldap删除用户
125153
err = ildap.User.Delete(user.UserDN)
126154
if err != nil {
127-
return nil, tools.NewLdapError(fmt.Errorf("在LDAP删除用户失败" + err.Error()))
155+
errMsg := fmt.Sprintf("在LDAP删除离职用户[%s]失败: %s", user.Username, err.Error())
156+
common.Log.Errorf("SyncDingTalkUsers: %s", errMsg)
157+
return nil, tools.NewLdapError(fmt.Errorf(errMsg))
128158
}
129159
// 然后更新MySQL中用户状态
130160
err = isql.User.ChangeStatus(int(user.ID), 2)
131161
if err != nil {
132-
return nil, tools.NewMySqlError(fmt.Errorf("在MySQL更新用户状态失败: " + err.Error()))
162+
errMsg := fmt.Sprintf("在MySQL更新离职用户[%s]状态失败: %s", user.Username, err.Error())
163+
common.Log.Errorf("SyncDingTalkUsers: %s", errMsg)
164+
return nil, tools.NewMySqlError(fmt.Errorf(errMsg))
133165
}
166+
processedCount++
167+
common.Log.Infof("SyncDingTalkUsers: 成功处理离职用户[%s]", user.Username)
134168
}
135169
}
136170

171+
common.Log.Infof("SyncDingTalkUsers: 钉钉用户同步完成,共同步%d个在职用户,处理%d个离职用户", len(staffs), processedCount)
137172
return nil, nil
138173
}
139174

logic/feishu_logic.go

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
"github.com/eryajf/go-ldap-admin/config"
88
"github.com/eryajf/go-ldap-admin/model"
99
"github.com/eryajf/go-ldap-admin/public/client/feishu"
10-
10+
"github.com/eryajf/go-ldap-admin/public/common"
1111
"github.com/eryajf/go-ldap-admin/public/tools"
1212
"github.com/eryajf/go-ldap-admin/service/ildap"
1313
"github.com/eryajf/go-ldap-admin/service/isql"
@@ -22,19 +22,29 @@ func (d *FeiShuLogic) SyncFeiShuDepts(c *gin.Context, req interface{}) (data int
2222
// 1.获取所有部门
2323
deptSource, err := feishu.GetAllDepts()
2424
if err != nil {
25-
return nil, tools.NewOperationError(fmt.Errorf("获取飞书部门列表失败:%s", err.Error()))
25+
errMsg := fmt.Sprintf("获取飞书部门列表失败:%s", err.Error())
26+
common.Log.Errorf("SyncFeiShuDepts: %s", errMsg)
27+
return nil, tools.NewOperationError(fmt.Errorf(errMsg))
2628
}
2729
depts, err := ConvertDeptData(config.Conf.FeiShu.Flag, deptSource)
2830
if err != nil {
29-
return nil, tools.NewOperationError(fmt.Errorf("转换飞书部门数据失败:%s", err.Error()))
31+
errMsg := fmt.Sprintf("转换飞书部门数据失败:%s", err.Error())
32+
common.Log.Errorf("SyncFeiShuDepts: %s", errMsg)
33+
return nil, tools.NewOperationError(fmt.Errorf(errMsg))
3034
}
3135

3236
// 2.将远程数据转换成树
3337
deptTree := GroupListToTree(fmt.Sprintf("%s_0", config.Conf.FeiShu.Flag), depts)
3438

3539
// 3.根据树进行创建
3640
err = d.addDepts(deptTree.Children)
41+
if err != nil {
42+
errMsg := fmt.Sprintf("创建飞书部门失败:%s", err.Error())
43+
common.Log.Errorf("SyncFeiShuDepts: %s", errMsg)
44+
return nil, err
45+
}
3746

47+
common.Log.Infof("SyncFeiShuDepts: 飞书部门同步成功")
3848
return nil, err
3949
}
4050

@@ -43,12 +53,16 @@ func (d FeiShuLogic) addDepts(depts []*model.Group) error {
4353
for _, dept := range depts {
4454
err := d.AddDepts(dept)
4555
if err != nil {
46-
return tools.NewOperationError(fmt.Errorf("DsyncFeiShuDepts添加部门失败: %s", err.Error()))
56+
errMsg := fmt.Sprintf("DsyncFeiShuDepts添加部门[%s]失败: %s", dept.GroupName, err.Error())
57+
common.Log.Errorf("%s", errMsg)
58+
return tools.NewOperationError(fmt.Errorf(errMsg))
4759
}
4860
if len(dept.Children) != 0 {
4961
err = d.addDepts(dept.Children)
5062
if err != nil {
51-
return tools.NewOperationError(fmt.Errorf("DsyncFeiShuDepts添加部门失败: %s", err.Error()))
63+
errMsg := fmt.Sprintf("DsyncFeiShuDepts添加子部门失败: %s", err.Error())
64+
common.Log.Errorf("%s", errMsg)
65+
return tools.NewOperationError(fmt.Errorf(errMsg))
5266
}
5367
}
5468
}
@@ -85,27 +99,37 @@ func (d FeiShuLogic) SyncFeiShuUsers(c *gin.Context, req interface{}) (data inte
8599
// 1.获取飞书用户列表
86100
staffSource, err := feishu.GetAllUsers()
87101
if err != nil {
88-
return nil, tools.NewOperationError(fmt.Errorf("获取飞书用户列表失败:%s", err.Error()))
102+
errMsg := fmt.Sprintf("获取飞书用户列表失败:%s", err.Error())
103+
common.Log.Errorf("SyncFeiShuUsers: %s", errMsg)
104+
return nil, tools.NewOperationError(fmt.Errorf(errMsg))
89105
}
90106
staffs, err := ConvertUserData(config.Conf.FeiShu.Flag, staffSource)
91107
if err != nil {
92-
return nil, tools.NewOperationError(fmt.Errorf("转换飞书用户数据失败:%s", err.Error()))
108+
errMsg := fmt.Sprintf("转换飞书用户数据失败:%s", err.Error())
109+
common.Log.Errorf("SyncFeiShuUsers: %s", errMsg)
110+
return nil, tools.NewOperationError(fmt.Errorf(errMsg))
93111
}
94112
// 2.遍历用户,开始写入
95-
for _, staff := range staffs {
113+
for i, staff := range staffs {
96114
// 入库
97115
err = d.AddUsers(staff)
98116
if err != nil {
99-
return nil, tools.NewOperationError(fmt.Errorf("SyncFeiShuUsers写入用户失败:%s", err.Error()))
117+
errMsg := fmt.Sprintf("写入用户[%s]失败:%s", staff.Username, err.Error())
118+
common.Log.Errorf("SyncFeiShuUsers: %s", errMsg)
119+
return nil, tools.NewOperationError(fmt.Errorf(errMsg))
100120
}
121+
common.Log.Infof("SyncFeiShuUsers: 成功同步用户[%s] (%d/%d)", staff.Username, i+1, len(staffs))
101122
}
102123

103124
// 3.获取飞书已离职用户id列表
104125
userIds, err := feishu.GetLeaveUserIds()
105126
if err != nil {
106-
return nil, tools.NewOperationError(fmt.Errorf("SyncFeiShuUsers获取飞书离职用户列表失败:%s", err.Error()))
127+
errMsg := fmt.Sprintf("获取飞书离职用户列表失败:%s", err.Error())
128+
common.Log.Errorf("SyncFeiShuUsers: %s", errMsg)
129+
return nil, tools.NewOperationError(fmt.Errorf(errMsg))
107130
}
108131
// 4.遍历id,开始处理
132+
processedCount := 0
109133
for _, uid := range userIds {
110134
if isql.User.Exist(
111135
tools.H{
@@ -115,21 +139,30 @@ func (d FeiShuLogic) SyncFeiShuUsers(c *gin.Context, req interface{}) (data inte
115139
user := new(model.User)
116140
err = isql.User.Find(tools.H{"source_union_id": fmt.Sprintf("%s_%s", config.Conf.FeiShu.Flag, uid)}, user)
117141
if err != nil {
118-
return nil, tools.NewMySqlError(fmt.Errorf("在MySQL查询用户失败: " + err.Error()))
142+
errMsg := fmt.Sprintf("在MySQL查询离职用户[%s]失败: %s", uid, err.Error())
143+
common.Log.Errorf("SyncFeiShuUsers: %s", errMsg)
144+
return nil, tools.NewMySqlError(fmt.Errorf(errMsg))
119145
}
120146
// 先从ldap删除用户
121147
err = ildap.User.Delete(user.UserDN)
122148
if err != nil {
123-
return nil, tools.NewLdapError(fmt.Errorf("在LDAP删除用户失败" + err.Error()))
149+
errMsg := fmt.Sprintf("在LDAP删除离职用户[%s]失败: %s", user.Username, err.Error())
150+
common.Log.Errorf("SyncFeiShuUsers: %s", errMsg)
151+
return nil, tools.NewLdapError(fmt.Errorf(errMsg))
124152
}
125153
// 然后更新MySQL中用户状态
126154
err = isql.User.ChangeStatus(int(user.ID), 2)
127155
if err != nil {
128-
return nil, tools.NewMySqlError(fmt.Errorf("在MySQL更新用户状态失败: " + err.Error()))
156+
errMsg := fmt.Sprintf("在MySQL更新离职用户[%s]状态失败: %s", user.Username, err.Error())
157+
common.Log.Errorf("SyncFeiShuUsers: %s", errMsg)
158+
return nil, tools.NewMySqlError(fmt.Errorf(errMsg))
129159
}
160+
processedCount++
161+
common.Log.Infof("SyncFeiShuUsers: 成功处理离职用户[%s]", user.Username)
130162
}
131163
}
132164

165+
common.Log.Infof("SyncFeiShuUsers: 飞书用户同步完成,共同步%d个在职用户,处理%d个离职用户", len(staffs), processedCount)
133166
return nil, nil
134167
}
135168

logic/openldap_logic.go

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66

77
"github.com/eryajf/go-ldap-admin/model"
88
"github.com/eryajf/go-ldap-admin/public/client/openldap"
9-
9+
"github.com/eryajf/go-ldap-admin/public/common"
1010
"github.com/eryajf/go-ldap-admin/public/tools"
1111
"github.com/eryajf/go-ldap-admin/service/isql"
1212
"github.com/gin-gonic/gin"
@@ -20,7 +20,9 @@ func (d *OpenLdapLogic) SyncOpenLdapDepts(c *gin.Context, req interface{}) (data
2020
// 1.获取所有部门
2121
depts, err := openldap.GetAllDepts()
2222
if err != nil {
23-
return nil, tools.NewOperationError(fmt.Errorf("获取ldap部门列表失败:%s", err.Error()))
23+
errMsg := fmt.Sprintf("获取OpenLDAP部门列表失败:%s", err.Error())
24+
common.Log.Errorf("SyncOpenLdapDepts: %s", errMsg)
25+
return nil, tools.NewOperationError(fmt.Errorf(errMsg))
2426
}
2527
groups := make([]*model.Group, 0)
2628
for _, dept := range depts {
@@ -37,7 +39,13 @@ func (d *OpenLdapLogic) SyncOpenLdapDepts(c *gin.Context, req interface{}) (data
3739

3840
// 3.根据树进行创建
3941
err = d.addDepts(deptTree.Children)
42+
if err != nil {
43+
errMsg := fmt.Sprintf("创建OpenLDAP部门失败:%s", err.Error())
44+
common.Log.Errorf("SyncOpenLdapDepts: %s", errMsg)
45+
return nil, err
46+
}
4047

48+
common.Log.Infof("SyncOpenLdapDepts: OpenLDAP部门同步成功")
4149
return nil, err
4250
}
4351

@@ -46,12 +54,16 @@ func (d OpenLdapLogic) addDepts(depts []*model.Group) error {
4654
for _, dept := range depts {
4755
err := d.AddDepts(dept)
4856
if err != nil {
49-
return tools.NewOperationError(fmt.Errorf("DsyncOpenLdapDepts添加部门失败: %s", err.Error()))
57+
errMsg := fmt.Sprintf("DsyncOpenLdapDepts添加部门[%s]失败: %s", dept.GroupName, err.Error())
58+
common.Log.Errorf("%s", errMsg)
59+
return tools.NewOperationError(fmt.Errorf(errMsg))
5060
}
5161
if len(dept.Children) != 0 {
5262
err = d.addDepts(dept.Children)
5363
if err != nil {
54-
return tools.NewOperationError(fmt.Errorf("DsyncOpenLdapDepts添加部门失败: %s", err.Error()))
64+
errMsg := fmt.Sprintf("DsyncOpenLdapDepts添加子部门失败: %s", err.Error())
65+
common.Log.Errorf("%s", errMsg)
66+
return tools.NewOperationError(fmt.Errorf(errMsg))
5567
}
5668
}
5769
}
@@ -103,18 +115,24 @@ func (d OpenLdapLogic) SyncOpenLdapUsers(c *gin.Context, req interface{}) (data
103115
// 1.获取ldap用户列表
104116
staffs, err := openldap.GetAllUsers()
105117
if err != nil {
106-
return nil, tools.NewOperationError(fmt.Errorf("获取ldap用户列表失败:%s", err.Error()))
118+
errMsg := fmt.Sprintf("获取OpenLDAP用户列表失败:%s", err.Error())
119+
common.Log.Errorf("SyncOpenLdapUsers: %s", errMsg)
120+
return nil, tools.NewOperationError(fmt.Errorf(errMsg))
107121
}
108122
// 2.遍历用户,开始写入
109-
for _, staff := range staffs {
123+
for i, staff := range staffs {
110124
groupIds, err := isql.Group.DeptIdsToGroupIds(staff.DepartmentIds)
111125
if err != nil {
112-
return nil, tools.NewMySqlError(fmt.Errorf("将部门ids转换为内部部门id失败:%s", err.Error()))
126+
errMsg := fmt.Sprintf("将用户[%s]的部门ids转换为内部部门id失败:%s", staff.Name, err.Error())
127+
common.Log.Errorf("SyncOpenLdapUsers: %s", errMsg)
128+
return nil, tools.NewMySqlError(fmt.Errorf(errMsg))
113129
}
114130
// 根据角色id获取角色
115131
roles, err := isql.Role.GetRolesByIds([]uint{2})
116132
if err != nil {
117-
return nil, tools.NewValidatorError(fmt.Errorf("根据角色ID获取角色信息失败:%s", err.Error()))
133+
errMsg := fmt.Sprintf("获取用户[%s]的角色信息失败:%s", staff.Name, err.Error())
134+
common.Log.Errorf("SyncOpenLdapUsers: %s", errMsg)
135+
return nil, tools.NewValidatorError(fmt.Errorf(errMsg))
118136
}
119137
// 入库
120138
err = d.AddUsers(&model.User{
@@ -137,9 +155,14 @@ func (d OpenLdapLogic) SyncOpenLdapUsers(c *gin.Context, req interface{}) (data
137155
UserDN: staff.DN,
138156
})
139157
if err != nil {
140-
return nil, tools.NewOperationError(fmt.Errorf("SyncOpenLdapUsers写入用户失败:%s", err.Error()))
158+
errMsg := fmt.Sprintf("写入用户[%s]失败:%s", staff.Name, err.Error())
159+
common.Log.Errorf("SyncOpenLdapUsers: %s", errMsg)
160+
return nil, tools.NewOperationError(fmt.Errorf(errMsg))
141161
}
162+
common.Log.Infof("SyncOpenLdapUsers: 成功同步用户[%s] (%d/%d)", staff.Name, i+1, len(staffs))
142163
}
164+
165+
common.Log.Infof("SyncOpenLdapUsers: OpenLDAP用户同步完成,共同步%d个用户", len(staffs))
143166
return nil, nil
144167
}
145168

0 commit comments

Comments
 (0)