hsun 5 miesięcy temu
rodzic
commit
6d70c61b09

+ 260 - 75
controller/gn/user.go

@@ -6,202 +6,387 @@ import (
 	"eta_gn/eta_bridge/models/gn"
 	gnRequest "eta_gn/eta_bridge/models/request/gn"
 	"eta_gn/eta_bridge/utils"
+	"fmt"
 	"github.com/gin-gonic/gin"
 	"strings"
-	"sync"
+	"time"
 )
 
 // 同步用户锁,防止重复同步,不管是全量还是增量,都是同一时间只能一个同步
-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)
-}
+//var lockSyncUser sync.Mutex
+
+// SyncUser 临时-全量同步用户
+//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)
+//}
 
 // AddAccount 创建新账号
 func (gc *GuoNengController) AddAccount(c *gin.Context) {
 	var req gnRequest.AddAccountReq
 	if e := c.Bind(&req); e != nil {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "参数解析失败", c)
+		resp.Gn4AResultData(resp.FAIL_CODE, "参数有误", fmt.Sprintf("参数解析失败, %v", e), c)
 		return
 	}
 	if req.UserId == nil || (req.UserId != nil && *req.UserId == "") {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "登录账号标识不可为空", c)
+		resp.Gn4AResultData(resp.FAIL_CODE, "登录账号标识不可为空", "登录账号标识不可为空", c)
 		return
 	}
 	if req.FirstName == nil || (req.FirstName != nil && *req.FirstName == "") {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "姓名不可为空", c)
+		resp.Gn4AResultData(resp.FAIL_CODE, "姓名不可为空", "姓名不可为空", c)
 		return
 	}
 	if req.LastName == nil || (req.LastName != nil && *req.LastName == "") {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "姓名不可为空", c)
+		resp.Gn4AResultData(resp.FAIL_CODE, "姓名不可为空", "姓名不可为空", c)
 		return
 	}
 	if req.UserStatus == nil || (req.UserStatus != nil && *req.UserStatus == "") {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "账号状态不可为空", c)
+		resp.Gn4AResultData(resp.FAIL_CODE, "账号状态不可为空", "账号状态不可为空", c)
 		return
 	}
 	if req.Password == nil || (req.Password != nil && *req.Password == "") {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "密码不可为空", c)
+		resp.Gn4AResultData(resp.FAIL_CODE, "密码不可为空", "密码不可为空", c)
 		return
 	}
 	if req.UserStatus != nil {
 		statsMap := map[string]int{gn.UserStatusActive: 1, gn.UserStatusDisable: 0}
 		if _, ok := statsMap[*req.UserStatus]; !ok {
-			resp.Gn4AResultData(false, utils.Gn4AErrCode08, "枚举值异常: UserStatus", c)
+			resp.Gn4AResultData(resp.FAIL_CODE, "枚举值异常: UserStatus", fmt.Sprintf("枚举值异常, UserStatus: %s", *req.UserStatus), c)
 			return
 		}
 	}
+	if req.EmpNumber == nil || (req.EmpNumber != nil && *req.EmpNumber == "") {
+		resp.Gn4AResultData(resp.FAIL_CODE, "员工编号不可为空", "员工编号不可为空", c)
+		return
+	}
 
 	// 新增账号
-	errCode, errMsg, e := gnLogic.AddAccount(req.UserEntity)
+	errMsg, e := gnLogic.AddAccount(req.UserEntity)
 	if e != nil {
-		resp.Gn4AResultData(false, errCode, errMsg, c)
+		resp.Gn4AResultData(resp.FAIL_CODE, errMsg, fmt.Sprintf("AddAccount: %v", e), c)
 		return
 	}
-	resp.Gn4AResultData(true, utils.Gn4AErrCodeSuccess, "操作成功", c)
+	resp.Gn4AResultData(resp.GN_OK_CODE, "成功", "", c)
 }
 
 // ModifyAccount 修改账号信息
 func (gc *GuoNengController) ModifyAccount(c *gin.Context) {
 	var req gnRequest.ModifyAccountReq
 	if e := c.Bind(&req); e != nil {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "参数解析失败", c)
+		resp.Gn4AResultData(resp.FAIL_CODE, "参数有误", fmt.Sprintf("参数解析失败, %v", e), c)
 		return
 	}
 	if req.UserId == nil || (req.UserId != nil && *req.UserId == "") {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "登录账号标识不可为空", c)
-		return
-	}
-	if req.FirstName == nil || (req.FirstName != nil && *req.FirstName == "") {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "姓名不可为空", c)
-		return
-	}
-	if req.LastName == nil || (req.LastName != nil && *req.LastName == "") {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "姓名不可为空", c)
-		return
-	}
-	if req.UserStatus == nil || (req.UserStatus != nil && *req.UserStatus == "") {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "账号状态不可为空", c)
-		return
-	}
-	if req.Password == nil || (req.Password != nil && *req.Password == "") {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "密码不可为空", c)
+		resp.Gn4AResultData(resp.FAIL_CODE, "登录账号标识不可为空", "登录账号标识不可为空", c)
 		return
 	}
+	//if req.FirstName == nil || (req.FirstName != nil && *req.FirstName == "") {
+	//	resp.Gn4AResultData(resp.FAIL_CODE, "姓名不可为空", "姓名不可为空", c)
+	//	return
+	//}
+	//if req.LastName == nil || (req.LastName != nil && *req.LastName == "") {
+	//	resp.Gn4AResultData(resp.FAIL_CODE, "姓名不可为空", "姓名不可为空", c)
+	//	return
+	//}
+	//if req.UserStatus == nil || (req.UserStatus != nil && *req.UserStatus == "") {
+	//	resp.Gn4AResultData(resp.FAIL_CODE, "账号状态不可为空", "账号状态不可为空", c)
+	//	return
+	//}
+	//if req.Password == nil || (req.Password != nil && *req.Password == "") {
+	//	resp.Gn4AResultData(resp.FAIL_CODE, "密码不可为空", "密码不可为空", c)
+	//	return
+	//}
 	if req.UserStatus != nil {
 		statsMap := map[string]int{gn.UserStatusActive: 1, gn.UserStatusDisable: 0}
 		if _, ok := statsMap[*req.UserStatus]; !ok {
-			resp.Gn4AResultData(false, utils.Gn4AErrCode08, "枚举值异常: UserStatus", c)
+			resp.Gn4AResultData(resp.FAIL_CODE, "枚举值异常: UserStatus", fmt.Sprintf("枚举值异常, UserStatus: %s", *req.UserStatus), c)
 			return
 		}
 	}
+	//if req.EmpNumber == nil || (req.EmpNumber != nil && *req.EmpNumber == "") {
+	//	resp.Gn4AResultData(resp.FAIL_CODE, "员工编号不可为空", "员工编号不可为空", c)
+	//	return
+	//}
 
-	// 新增账号
-	errCode, errMsg, e := gnLogic.ModifyAccount(req.UserEntity)
+	// 新账号
+	errMsg, e := gnLogic.ModifyAccount(req.UserEntity)
 	if e != nil {
-		resp.Gn4AResultData(false, errCode, errMsg, c)
+		resp.Gn4AResultData(resp.FAIL_CODE, errMsg, fmt.Sprintf("ModifyAccount: %v", e), c)
 		return
 	}
-	resp.Gn4AResultData(true, utils.Gn4AErrCodeSuccess, "操作成功", c)
+	resp.Gn4AResultData(resp.GN_OK_CODE, "成功", "", c)
 }
 
 // DeleteAccount 删除账号
 func (gc *GuoNengController) DeleteAccount(c *gin.Context) {
 	var req gnRequest.DeleteAccountReq
 	if e := c.Bind(&req); e != nil {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "参数解析失败", c)
+		resp.Gn4AResultData(resp.FAIL_CODE, "参数有误", fmt.Sprintf("参数解析失败, %v", e), c)
 		return
 	}
 	if req.UserId == "" {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "登录账号标识不可为空", c)
+		resp.Gn4AResultData(resp.FAIL_CODE, "登录账号标识不可为空", "登录账号标识不可为空", c)
 		return
 	}
 
-	errCode, errMsg, e := gnLogic.DeleteAccount(req.UserId)
+	errMsg, e := gnLogic.DeleteAccount(req.UserId)
 	if e != nil {
-		resp.Gn4AResultData(false, errCode, errMsg, c)
+		resp.Gn4AResultData(resp.FAIL_CODE, errMsg, fmt.Sprintf("DeleteAccount: %v", e), c)
 		return
 	}
-	resp.Gn4AResultData(true, utils.Gn4AErrCodeSuccess, "操作成功", c)
+	resp.Gn4AResultData(resp.GN_OK_CODE, "成功", "", c)
 }
 
 // SuspendAccount 禁用账号
 func (gc *GuoNengController) SuspendAccount(c *gin.Context) {
 	var req gnRequest.SuspendAccountReq
 	if e := c.Bind(&req); e != nil {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "参数解析失败", c)
+		resp.Gn4AResultData(resp.FAIL_CODE, "参数有误", fmt.Sprintf("参数解析失败, %v", e), c)
 		return
 	}
 	if req.UserId == "" {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "登录账号标识不可为空", c)
+		resp.Gn4AResultData(resp.FAIL_CODE, "登录账号标识不可为空", "登录账号标识不可为空", c)
 		return
 	}
 
-	errCode, errMsg, e := gnLogic.SuspendAccount(req.UserId)
+	errMsg, e := gnLogic.SuspendAccount(req.UserId)
 	if e != nil {
-		resp.Gn4AResultData(false, errCode, errMsg, c)
+		resp.Gn4AResultData(resp.FAIL_CODE, errMsg, fmt.Sprintf("SuspendAccount: %v", e), c)
 		return
 	}
-	resp.Gn4AResultData(true, utils.Gn4AErrCodeSuccess, "操作成功", c)
+	resp.Gn4AResultData(resp.GN_OK_CODE, "成功", "", c)
 }
 
 // RestoreAccount 禁用账号
 func (gc *GuoNengController) RestoreAccount(c *gin.Context) {
 	var req gnRequest.RestoreAccountReq
 	if e := c.Bind(&req); e != nil {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "参数解析失败", c)
+		resp.Gn4AResultData(resp.FAIL_CODE, "参数有误", fmt.Sprintf("参数解析失败, %v", e), c)
 		return
 	}
 	if req.UserId == "" {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "登录账号标识不可为空", c)
+		resp.Gn4AResultData(resp.FAIL_CODE, "登录账号标识不可为空", "登录账号标识不可为空", c)
 		return
 	}
 
-	errCode, errMsg, e := gnLogic.RestoreAccount(req.UserId)
+	errMsg, e := gnLogic.RestoreAccount(req.UserId)
 	if e != nil {
-		resp.Gn4AResultData(false, errCode, errMsg, c)
+		resp.Gn4AResultData(resp.FAIL_CODE, errMsg, fmt.Sprintf("RestoreAccount: %v", e), c)
 		return
 	}
-	resp.Gn4AResultData(true, utils.Gn4AErrCodeSuccess, "操作成功", c)
+	resp.Gn4AResultData(resp.GN_OK_CODE, "成功", "", c)
 }
 
 // ChangePassword 修改密码
 func (gc *GuoNengController) ChangePassword(c *gin.Context) {
 	var req gnRequest.ChangePasswordReq
 	if e := c.Bind(&req); e != nil {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "参数解析失败", c)
+		resp.Gn4AResultData(resp.FAIL_CODE, "参数有误", fmt.Sprintf("参数解析失败, %v", e), c)
 		return
 	}
 	if req.UserId == "" {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "登录账号标识不可为空", c)
+		resp.Gn4AResultData(resp.FAIL_CODE, "登录账号标识不可为空", "登录账号标识不可为空", c)
 		return
 	}
 	req.NewPassword = strings.TrimSpace(req.NewPassword)
 	if req.NewPassword == "" {
-		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "新密码不可为空", c)
+		resp.Gn4AResultData(resp.FAIL_CODE, "新密码不可为空", "新密码不可为空", c)
 		return
 	}
 
-	errCode, errMsg, e := gnLogic.ChangePassword(req.UserId, req.NewPassword)
+	errMsg, e := gnLogic.ChangePassword(req.UserId, req.NewPassword)
 	if e != nil {
-		resp.Gn4AResultData(false, errCode, errMsg, c)
+		resp.Gn4AResultData(resp.FAIL_CODE, errMsg, fmt.Sprintf("ChangePassword: %v", e), c)
+		return
+	}
+	resp.Gn4AResultData(resp.GN_OK_CODE, "成功", "", c)
+}
+
+// SyncMdmOrganization 同步mdm组织部门
+func (gc *GuoNengController) SyncMdmOrganization(c *gin.Context) {
+	var req gnRequest.SyncMdmOrganizationReq
+	if e := c.Bind(&req); e != nil {
+		resp.Gn4AResultData(resp.FAIL_CODE, "参数有误", "参数解析失败", c)
+		return
+	}
+	req.MainFieldComstruCode = strings.TrimSpace(req.MainFieldComstruCode)
+	if req.MainFieldComstruCode == "" {
+		resp.Gn4AResultData(resp.FAIL_CODE, "组织机构编码不可为空", "组织机构编码不可为空", c)
+		return
+	}
+
+	// 根据主编码判断是否已同步过, 同步过则更新
+	ob := new(gn.MDM_COMSTRU)
+	cond := ` AND Main_Field_Comstru_Code = ?`
+	pars := make([]interface{}, 0)
+	pars = append(pars, req.MainFieldComstruCode)
+	item, e := ob.GetItemByCondition(cond, pars)
+	if e != nil && !utils.IsErrNoRow(e) {
+		resp.Gn4AResultData(resp.FAIL_CODE, "组织信息异常", fmt.Sprintf("获取MDM组织信息失败, %v", e), c)
+		return
+	}
+
+	// 更新
+	if item != nil && item.Id > 0 {
+		updateCols := []string{"Main_Field_Comstru_Code_HR", "Main_Field_Comstru_Type_HR", "ZDWLX", "Main_Field_Comstru_Name_HR", "Main_Field_Comstru_Short_Name_HR", "Main_Field_ParentAdmin_Comstru_Code_HR", "Main_Field_ParentAdmin_Comstru_Code", "Main_Field_ParentAdmin_Comstru_Name", "Main_Field_Company_Level", "Main_Field_Secondcomstrucodehr", "Main_Field_Sh_Business_Type", "Main_Field_YZGDWZCNDGX", "Main_Field_Order_HR", "Main_Field_Company_Code", "Main_Field_Company_Chain", "Main_Field_PARENTCOMPANYVIRTUAL", "ZQYZT", "ModifyTime"}
+		item.MainFieldComstruCodeHR = req.MainFieldComstruCodeHR
+		item.MainFieldComstruTypeHR = req.MainFieldComstruTypeHR
+		item.ZDWLX = req.ZDWLX
+		item.MainFieldComstruNameHR = req.MainFieldComstruNameHR
+		item.MainFieldComstruShortNameHR = req.MainFieldComstruShortNameHR
+		item.MainFieldParentAdminComstruCodeHR = req.MainFieldParentAdminComstruCodeHR
+		item.MainFieldParentAdminComstruCode = req.MainFieldParentAdminComstruCode
+		item.MainFieldParentAdminComstruName = req.MainFieldParentAdminComstruName
+		item.MainFieldCompanyLevel = req.MainFieldCompanyLevel
+		item.MainFieldSecondcomstrucodehr = req.MainFieldSecondcomstrucodehr
+		item.MainFieldShBusinessType = req.MainFieldShBusinessType
+		item.MainFieldYZGDWZCNDGX = req.MainFieldYZGDWZCNDGX
+		item.MainFieldOrderHR = req.MainFieldOrderHR
+		item.MainFieldCompanyCode = req.MainFieldCompanyCode
+		item.MainFieldCompanyChain = req.MainFieldCompanyChain
+		item.MainFieldPARENTCOMPANYVIRTUAL = req.MainFieldPARENTCOMPANYVIRTUAL
+		item.ZQYZT = req.ZQYZT
+		item.ModifyTime = time.Now()
+		if e = item.Update(updateCols); e != nil {
+			resp.Gn4AResultData(resp.FAIL_CODE, "同步失败", fmt.Sprintf("更新MDM组织信息失败, %v", e), c)
+			return
+		}
+		resp.Gn4AResultData(resp.GN_OK_CODE, "成功", "", c)
+		return
+	}
+
+	// 新增
+	newOrganizer := gn.MDM_COMSTRU{
+		MainFieldComstruCode:              req.MainFieldComstruCode,
+		MainFieldComstruCodeHR:            req.MainFieldComstruCodeHR,
+		MainFieldComstruTypeHR:            req.MainFieldComstruTypeHR,
+		ZDWLX:                             req.ZDWLX,
+		MainFieldComstruNameHR:            req.MainFieldComstruNameHR,
+		MainFieldComstruShortNameHR:       req.MainFieldComstruShortNameHR,
+		MainFieldParentAdminComstruCodeHR: req.MainFieldParentAdminComstruCodeHR,
+		MainFieldParentAdminComstruCode:   req.MainFieldParentAdminComstruCode,
+		MainFieldParentAdminComstruName:   req.MainFieldParentAdminComstruName,
+		MainFieldCompanyLevel:             req.MainFieldCompanyLevel,
+		MainFieldSecondcomstrucodehr:      req.MainFieldSecondcomstrucodehr,
+		MainFieldShBusinessType:           req.MainFieldShBusinessType,
+		MainFieldYZGDWZCNDGX:              req.MainFieldYZGDWZCNDGX,
+		MainFieldOrderHR:                  req.MainFieldOrderHR,
+		MainFieldCompanyCode:              req.MainFieldCompanyCode,
+		MainFieldCompanyChain:             req.MainFieldCompanyChain,
+		MainFieldPARENTCOMPANYVIRTUAL:     req.MainFieldPARENTCOMPANYVIRTUAL,
+		ZQYZT:                             req.ZQYZT,
+		CreateTime:                        time.Now(),
+		ModifyTime:                        time.Now(),
+	}
+	if e = newOrganizer.Create(); e != nil {
+		resp.Gn4AResultData(resp.FAIL_CODE, "同步失败", fmt.Sprintf("新增MDM组织信息失败, %v", e), c)
+		return
+	}
+
+	// 同步ETA部门
+	go func() {
+		_ = gnLogic.SyncSysDepartment(&newOrganizer)
+	}()
+
+	resp.Gn4AResultData(resp.GN_OK_CODE, "成功", "", c)
+}
+
+// SyncMdmEmployee 同步mdm员工
+func (gc *GuoNengController) SyncMdmEmployee(c *gin.Context) {
+	var req gnRequest.SyncMdmEmployeeReq
+	if e := c.Bind(&req); e != nil {
+		resp.Gn4AResultData(resp.FAIL_CODE, "参数有误", "参数解析失败", c)
+		return
+	}
+	req.MainFieldEmployeeCode = strings.TrimSpace(req.MainFieldEmployeeCode)
+	if req.MainFieldEmployeeCode == "" {
+		resp.Gn4AResultData(resp.FAIL_CODE, "员工编码不可为空", "员工编码不可为空", c)
+		return
+	}
+
+	// 根据主编码判断是否已同步过, 同步过则更新
+	ob := new(gn.MDM_EMPLOYEE)
+	cond := ` AND Main_Field_Employee_Code = ?`
+	pars := make([]interface{}, 0)
+	pars = append(pars, req.MainFieldEmployeeCode)
+	item, e := ob.GetItemByCondition(cond, pars)
+	if e != nil && !utils.IsErrNoRow(e) {
+		resp.Gn4AResultData(resp.FAIL_CODE, "员工信息异常", fmt.Sprintf("获取MDM员工信息失败, %v", e), c)
 		return
 	}
-	resp.Gn4AResultData(true, utils.Gn4AErrCodeSuccess, "操作成功", c)
+
+	// 员工组织关系
+	relations := make([]*gn.MDM_RELA_COMSTRU_EMPLOYEE, 0)
+	if len(req.MDM_MATERIAL_PROPS) > 0 {
+		for _, v := range req.MDM_MATERIAL_PROPS {
+			relations = append(relations, &gn.MDM_RELA_COMSTRU_EMPLOYEE{
+				Main_Field_Employee_Code:  req.MainFieldEmployeeCode,
+				TuplesFieldCompanyCode:    v.TuplesFieldCompanyCode,
+				TuplesFieldCompanyName:    v.TuplesFieldCompanyName,
+				TuplesFieldDepartmentCode: v.TuplesFieldDepartmentCode,
+				TuplesFieldDepartmentName: v.TuplesFieldDepartmentName,
+				CreateTime:                time.Now(),
+				ModifyTime:                time.Now(),
+			})
+		}
+	}
+
+	// 更新
+	var isUpdate bool
+	employeeOb := new(gn.MDM_EMPLOYEE)
+	if item != nil && item.Id > 0 {
+		isUpdate = true
+		updateCols := []string{"Main_Field_Employee_FirstName", "Main_Field_Employee_LastName", "Main_Field_Gender", "Main_Field_Empolyee_Group", "Main_Field_Office_Telephone", "Main_Field_Date_Type", "Main_Field_Employee_Status", "Main_Field_Delete_Flag", "Main_Field_Email", "Main_Field_Company_code", "Main_Field_Secondcomstrucodehr", "Main_Field_Company_Chain", "ModifyTime"}
+		item.MainFieldEmployeeFirstName = req.MainFieldEmployeeFirstName
+		item.MainFieldEmployeeLastName = req.MainFieldEmployeeLastName
+		item.MainFieldGender = req.MainFieldGender
+		item.MainFieldEmpolyeeGroup = req.MainFieldEmpolyeeGroup
+		item.MainFieldOfficeTelephone = req.MainFieldOfficeTelephone
+		item.MainFieldDateType = req.MainFieldDateType
+		item.MainFieldEmployeeStatus = req.MainFieldEmployeeStatus
+		item.MainFieldDeleteFlag = req.MainFieldDeleteFlag
+		item.MainFieldEmail = req.MainFieldEmail
+		item.MainFieldCompanyCode = req.MainFieldCompanyCode
+		item.MainFieldSecondcomstrucodehr = req.MainFieldSecondcomstrucodehr
+		item.MainFieldCompanyChain = req.MainFieldCompanyChain
+		item.ModifyTime = time.Now()
+		if e = employeeOb.UpdateEmployee(item, updateCols, relations); e != nil {
+			resp.Gn4AResultData(resp.FAIL_CODE, "同步失败", fmt.Sprintf("更新MDM组织信息失败, %v", e), c)
+			return
+		}
+	}
+
+	// 新增
+	if !isUpdate {
+		newEmployee := &gn.MDM_EMPLOYEE{
+			MainFieldEmployeeCode:        req.MainFieldEmployeeCode,
+			MainFieldEmployeeFirstName:   req.MainFieldEmployeeFirstName,
+			MainFieldEmployeeLastName:    req.MainFieldEmployeeLastName,
+			MainFieldGender:              req.MainFieldGender,
+			MainFieldEmpolyeeGroup:       req.MainFieldEmpolyeeGroup,
+			MainFieldOfficeTelephone:     req.MainFieldOfficeTelephone,
+			MainFieldDateType:            req.MainFieldDateType,
+			MainFieldEmployeeStatus:      req.MainFieldEmployeeStatus,
+			MainFieldDeleteFlag:          req.MainFieldDeleteFlag,
+			MainFieldEmail:               req.MainFieldEmail,
+			MainFieldCompanyCode:         req.MainFieldCompanyCode,
+			MainFieldSecondcomstrucodehr: req.MainFieldSecondcomstrucodehr,
+			MainFieldCompanyChain:        req.MainFieldCompanyChain,
+			CreateTime:                   time.Now(),
+			ModifyTime:                   time.Now(),
+		}
+		if e = employeeOb.CreateEmployee(newEmployee, relations); e != nil {
+			resp.Gn4AResultData(resp.FAIL_CODE, "同步失败", fmt.Sprintf("新增MDM员工信息失败, %v", e), c)
+			return
+		}
+	}
+	resp.Gn4AResultData(resp.GN_OK_CODE, "成功", "", c)
 }

+ 14 - 10
controller/resp/base.go

@@ -15,6 +15,7 @@ var (
 	TOKEN_ERROR_CODE   = 401  //toke异常
 	NO_AUTH            = 403  //没有权限
 	SPECIFIC_FAIL_CODE = 4001 // 业务指定错误
+	GN_OK_CODE         = 0    // 国能业务成功
 )
 
 type ResultData struct {
@@ -156,18 +157,21 @@ func FailMsg(msg, errMsg string, c *gin.Context) {
 
 // Gn4AOperationResult 国能4A响应结果
 type Gn4AOperationResult struct {
-	RequestId  string `json:"requestID" description:"请求唯一标识"`
-	ReturnFlag bool   `json:"returnFlag" description:"处理结果标识: true-成功; false-失败"`
-	ReturnCode string `json:"returnCode" description:"返回结果编号, returnFlag为true时, returnCode为0, 否则为错误编码"`
-	ReturnMsg  string `json:"returnMsg" description:"返回结果信息, 可自定义"`
+	//RequestId  string `json:"requestID" description:"请求唯一标识"`
+	//ReturnFlag bool   `json:"returnFlag" description:"处理结果标识: true-成功; false-失败"`
+	//ReturnCode string `json:"returnCode" description:"返回结果编号, returnFlag为true时, returnCode为0, 否则为错误编码"`
+	//ReturnMsg  string `json:"returnMsg" description:"返回结果信息, 可自定义"`
+	Code   int    `json:"code" description:"状态码"`
+	Msg    string `json:"msg" description:"提示信息"`
+	ErrMsg string `json:"-" description:"错误信息,仅做日志记录"`
 }
 
 // Gn4AResultData 4A返回结果
-func Gn4AResultData(flag bool, code, msg string, c *gin.Context) {
+func Gn4AResultData(code int, msg, errMsg string, c *gin.Context) {
 	resultData := Gn4AOperationResult{
-		ReturnFlag: flag,
-		ReturnCode: code,
-		ReturnMsg:  msg,
+		Code:   code,
+		Msg:    msg,
+		ErrMsg: errMsg,
 	}
 	gnResult(200, resultData, c)
 }
@@ -177,8 +181,8 @@ func gnResult(code int, resultData Gn4AOperationResult, c *gin.Context) {
 	logSlice = append(logSlice, fmt.Sprint("Url:", c.Request.RequestURI))
 
 	// 记录错误日志
-	if !resultData.ReturnFlag {
-		logSlice = append(logSlice, fmt.Sprintf("ErrCode: %s, ErrMsg: %s", resultData.ReturnCode, resultData.ReturnMsg))
+	if resultData.ErrMsg != "" {
+		logSlice = append(logSlice, fmt.Sprintf("ErrCode: %d, Msg: %s, ErrMsg: %s", resultData.Code, resultData.Msg, resultData.ErrMsg))
 	}
 	global.LOG.Info(strings.Join(logSlice, ";"))
 

+ 191 - 0
logic/gn/mdm.go

@@ -0,0 +1,191 @@
+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"
+	"strconv"
+	"time"
+)
+
+// SyncSysDepartment 同步部门
+func SyncSysDepartment(mdmDepart *gn.MDM_COMSTRU) (err error) {
+	defer func() {
+		if err != nil {
+			global.LOG.Info(fmt.Sprintf("同步ETA部门失败, %v", err))
+		}
+	}()
+	if mdmDepart == nil {
+		err = fmt.Errorf("部门信息有误")
+		return
+	}
+
+	// 上级编码为空, ETA中为部门
+	if mdmDepart.MainFieldParentAdminComstruCode == "" {
+		// 查询ETA中是否已同步
+		existDepart, e := eta.GetSysDepartmentByOutId(mdmDepart.MainFieldComstruCode)
+		if e != nil && !utils.IsErrNoRow(e) {
+			err = fmt.Errorf("获取ETA部门失败, %v", e)
+			return
+		}
+
+		// 已同步, 名称不一致时更新
+		if existDepart != nil && existDepart.DepartmentId > 0 {
+			if existDepart.DepartmentName != mdmDepart.MainFieldComstruNameHR {
+				existDepart.DepartmentName = mdmDepart.MainFieldComstruNameHR
+				updateCols := []string{"DepartmentName"}
+				if e = existDepart.Update(updateCols); e != nil {
+					err = fmt.Errorf("更新ETA部门失败, %v", e)
+				}
+			}
+			return
+		}
+
+		// 新增部门
+		newDepart := new(eta.SysDepartment)
+		newDepart.DepartmentName = mdmDepart.MainFieldComstruNameHR
+		newDepart.OutID = mdmDepart.MainFieldComstruCode
+		s, _ := strconv.Atoi(mdmDepart.MainFieldOrderHR)
+		newDepart.Sort = s
+		newDepart.CreateTime = time.Now()
+		if e = newDepart.Create(); e != nil {
+			err = fmt.Errorf("新增ETA部门失败, %v", e)
+		}
+		return
+	}
+
+	// 上级编码不为空, ETA中为分组
+	if mdmDepart.MainFieldParentAdminComstruCode != "" {
+		var departmentId, parentId int
+		var isFind bool
+		// 查询父级, 先从分组中找
+		parentGroup, e := eta.GetSysGroupByOutId(mdmDepart.MainFieldParentAdminComstruCode)
+		if e != nil && !utils.IsErrNoRow(e) {
+			err = fmt.Errorf("获取ETA父级分组失败, %v", e)
+			return
+		}
+		if parentGroup != nil && parentGroup.GroupId > 0 {
+			isFind = true
+			departmentId = parentGroup.DepartmentId
+			parentId = parentGroup.GroupId
+		}
+		if !isFind {
+			parentDepart, e := eta.GetSysDepartmentByOutId(mdmDepart.MainFieldParentAdminComstruCode)
+			if e != nil && !utils.IsErrNoRow(e) {
+				err = fmt.Errorf("获取ETA父级部门失败, %v", e)
+				return
+			}
+			if parentDepart != nil && parentDepart.DepartmentId > 0 {
+				isFind = true
+				departmentId = parentDepart.DepartmentId
+				parentId = 0
+			}
+		}
+		if !isFind {
+			err = fmt.Errorf("未找到对应父级部门或分组, ParentCode: %s", mdmDepart.MainFieldParentAdminComstruCode)
+			return
+		}
+
+		// 查询ETA中是否已同步
+		existGroup, e := eta.GetSysGroupByOutId(mdmDepart.MainFieldComstruCode)
+		if e != nil && !utils.IsErrNoRow(e) {
+			err = fmt.Errorf("获取ETA分组失败, %v", e)
+			return
+		}
+
+		// 已同步则更新
+		if existGroup != nil && existGroup.GroupId > 0 {
+			updateCols := []string{"GroupName", "DepartmentId", "ParentId"}
+			existGroup.GroupName = mdmDepart.MainFieldComstruNameHR
+			existGroup.DepartmentId = departmentId
+			existGroup.ParentId = parentId
+			if e = existGroup.Update(updateCols); e != nil {
+				err = fmt.Errorf("更新ETA分组失败, %v", e)
+			}
+			return
+		}
+
+		// 否则新增分组
+		newGroup := new(eta.SysGroup)
+		newGroup.DepartmentId = departmentId
+		newGroup.GroupName = mdmDepart.MainFieldComstruNameHR
+		newGroup.ParentId = parentId
+		newGroup.OutID = mdmDepart.MainFieldComstruCode
+		s, _ := strconv.Atoi(mdmDepart.MainFieldOrderHR)
+		newGroup.Sort = s
+		newGroup.CreateTime = time.Now()
+		if e = newGroup.Create(); e != nil {
+			err = fmt.Errorf("新增ETA分组失败, %v", e)
+			return
+		}
+	}
+
+	// TODO:父级从分组到部门交叉改变的情况?
+	return
+}
+
+// GetDepartmentGroupIdByMdmCode 根据MDM的部门编码获取ETA的部门和分组ID
+func GetDepartmentGroupIdByMdmCode(mdmCode string) (departmentId, groupId int, departmentName, groupName string, err error) {
+	defer func() {
+		if departmentId == 0 && groupId == 0 {
+			global.LOG.Info(fmt.Sprintf("MDM编码: %s, 未找到对应部门或分组", mdmCode))
+		}
+	}()
+
+	// 校验一下MDM部门是否存在?
+	//mdmDepartOb := new(gn.MDM_COMSTRU)
+	//cond := ` AND Main_Field_Comstru_Code = ?`
+	//pars := make([]interface{}, 0)
+	//_, e := mdmDepartOb.GetItemByCondition(cond, pars)
+	//if e != nil {
+	//	if utils.IsErrNoRow(e) {
+	//		err = fmt.Errorf("MDM部门不存在, code: %s", mdmCode)
+	//		return
+	//	}
+	//	err = fmt.Errorf("获取MDM部门失败, %v", e)
+	//	return
+	//}
+
+	// 先查分组, 查得到的话直接返回
+	groupOb := new(eta.SysGroup)
+	cond := ` AND out_id = ?`
+	pars := make([]interface{}, 0)
+	pars = append(pars, mdmCode)
+	groupItem, e := groupOb.GetItemByCondition(cond, pars)
+	if e != nil && !utils.IsErrNoRow(e) {
+		err = fmt.Errorf("编码获取分组失败, %v", e)
+		return
+	}
+	if groupItem != nil && groupItem.GroupId > 0 {
+		groupId = groupItem.GroupId
+		groupName = groupItem.GroupName
+		// 查询部门
+		depart, e := eta.GetDepartmentById(groupItem.DepartmentId)
+		if e != nil && !utils.IsErrNoRow(e) {
+			err = fmt.Errorf("获取部门失败, %v", e)
+			return
+		}
+		departmentId = depart.DepartmentId
+		departmentName = depart.DepartmentName
+		return
+	}
+
+	// 查部门
+	departOb := new(eta.SysDepartment)
+	departItem, e := departOb.GetItemByCondition(cond, pars)
+	if e != nil && !utils.IsErrNoRow(e) {
+		err = fmt.Errorf("编码获取部门失败, %v", e)
+		return
+	}
+	if departItem != nil && departItem.DepartmentId > 0 {
+		departmentId = departItem.DepartmentId
+		departmentName = departItem.DepartmentName
+	}
+	return
+}
+
+func GetParentDepartmentOrGroup() (err error) {
+	return
+}

+ 271 - 349
logic/gn/user.go

@@ -1,12 +1,10 @@
 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"
 )
 
@@ -15,369 +13,279 @@ import (
 // @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不能为空")
+//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
 //	}
-//	defer func() {
-//		if err != nil {
-//			global.FILE_LOG.Info("同步增量用户失败:" + err.Error())
-//		}
-//	}()
 //
 //	// 指定的角色
-//	roleInfo, err := eta.GetSysRoleById(global.CONFIG.Xiangyu.DefaultRoleId)
-//	if err != nil {
+//	roleInfo, e := eta.GetSysRoleById(roleId)
+//	if e != nil {
+//		err = fmt.Errorf("获取默认角色信息失败, %v", e)
 //		return
 //	}
 //
 //	// 获取所有部门和分组
-//	departmentMap, departmentNameMap, groupMap, groupNameMap, userMap, err := getAllDepartmentAndGroup()
-//	if err != nil {
+//	departmentMap, _, groupMap, _, userMap, e := getAllDepartmentAndGroup()
+//	if e != nil {
+//		err = fmt.Errorf("获取部门/分组/用户失败, %v", e)
 //		return
 //	}
 //
-//	// 获取token
-//	tokenId, err := xiangyu.Login()
-//	if err != nil {
+//	// 从公共库里面读取部门和用户
+//	oaUser, e := gn.GetGnOaUser()
+//	if e != nil {
+//		err = fmt.Errorf("获取OA全量用户失败, %v", e)
 //		return
 //	}
 //
-//	defer func() {
-//		// 获取用户列表
-//		tmpErr := xiangyu.Logout(tokenId)
-//		if tmpErr != nil {
-//			fmt.Println("退出失败:", tmpErr.Error())
+//	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
+//}
+
+// 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
+//		}
+//	}
 //
-//	for {
-//		// 获取增量用户列表
-//		userResp, tmpErr := xiangyu.PullTask(tokenId)
-//		if tmpErr != nil {
-//			err = tmpErr
-//			return
+//	// 获取所有的分组
+//	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
 //		}
+//	}
 //
-//		// 没有数据了,那么结束同步了
-//		if userResp == nil || userResp.Out.ObjectCode == `` {
-//			return
+//	// 获取所有的用户
+//	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
 //
-//		// 是否同步成功
-//		var isSync bool
+//		// 分组信息
+//		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
+//			}
 //
-//		var etaUserId, message string
+//			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
+//				}
 //
-//		//  处理用户信息,将象屿用户与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)
+//				groupMap[lastOutId] = group
+//			} else {
+//				// TODO:是否更新outId
 //			}
-//		} else {
-//			message = tmpErr.Error()
+//			groupInfo = group
 //		}
+//	}
 //
-//		// 结束单次增量同步
-//		err = xiangyu.PullFinish(tokenId, userResp.Out.TaskId, etaUserId, message, isSync)
-//		if err != nil {
+//	// 同步用户
+//	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
 //}
 
-// 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
-}
-
 // AddAccount 创建新账号
-func AddAccount(userReq gn.UserEntity) (errCode, errMsg string, err error) {
-	errCode = utils.Gn4AErrCode08
+func AddAccount(userReq gn.UserEntity) (errMsg string, err error) {
 	adminName := *userReq.UserId
 
 	// 校验是否存在, 若存在则更新信息, 否则新增
 	userInfo, e := eta.GetSysUserByAdminName(adminName)
 	if e != nil && !utils.IsErrNoRow(e) {
+		errMsg = "用户不存在"
 		err = fmt.Errorf("获取用户是否存在失败, %v", e)
 		return
 	}
 
 	// 更新数据
-	if userInfo.AdminId > 0 {
+	if userInfo != nil && userInfo.AdminId > 0 {
 		if e = UpdateUser(userInfo, userReq); e != nil {
+			errMsg = "操作失败"
 			err = fmt.Errorf("更新用户数据失败, %v", e)
 			return
 		}
-		errCode = utils.Gn4AErrCodeSuccess
 		return
 	}
 
@@ -391,15 +299,25 @@ func AddAccount(userReq gn.UserEntity) (errCode, errMsg string, err error) {
 	newUser.Email = *userReq.Mail
 	newUser.Mobile = *userReq.Mobile
 	newUser.Position = *userReq.TitleName
-	// TODO:部门分组
+	// 部门分组
+	departmentId, groupId, departmentName, groupName, e := GetDepartmentGroupIdByMdmCode(*userReq.DepartmentNum)
+	if e != nil {
+		errMsg = "操作失败"
+		err = fmt.Errorf("根据MDM编码获取ETA部门失败, %v", e)
+		return
+	}
+	newUser.DepartmentId = departmentId
+	newUser.DepartmentName = departmentName
+	newUser.GroupId = groupId
+	newUser.GroupName = groupName
 	newUser.CreatedTime = time.Now()
 	newUser.LastUpdatedTime = time.Now()
-	newUser.OutID = adminName
+	newUser.OutID = *userReq.EmpNumber // 这里用工号
 	if e = userInfo.Create(); e != nil {
+		errMsg = "操作失败"
 		err = fmt.Errorf("新增用户失败, %v", e)
 		return
 	}
-	errCode = utils.Gn4AErrCodeSuccess
 	return
 }
 
@@ -415,9 +333,18 @@ func UpdateUser(originUser *eta.Admin, userReq gn.UserEntity) (err error) {
 		originUser.Password = utils.MD5(*userReq.Password)
 		updateCols = append(updateCols, "Password")
 	}
-	// TODO:组织部门相关
-	if userReq.OrgCode != nil {
-
+	// 部门分组
+	if userReq.DepartmentNum != nil {
+		departmentId, groupId, departmentName, groupName, e := GetDepartmentGroupIdByMdmCode(*userReq.DepartmentNum)
+		if e != nil {
+			err = fmt.Errorf("根据MDM编码获取ETA部门失败, %v", e)
+			return
+		}
+		originUser.DepartmentId = departmentId
+		originUser.DepartmentName = departmentName
+		originUser.GroupId = groupId
+		originUser.GroupName = groupName
+		updateCols = append(updateCols, "DepartmentId", "DepartmentName", "GroupId", "GroupName")
 	}
 	// 姓名
 	if userReq.FirstName != nil && userReq.LastName != nil {
@@ -455,67 +382,64 @@ func UpdateUser(originUser *eta.Admin, userReq gn.UserEntity) (err error) {
 }
 
 // ModifyAccount 修改账号
-func ModifyAccount(userReq gn.UserEntity) (errCode, errMsg string, err error) {
-	errCode = utils.Gn4AErrCode08
+func ModifyAccount(userReq gn.UserEntity) (errMsg string, err error) {
 	adminName := *userReq.UserId
 
 	// 校验是否存在, 不存在返回异常
 	userInfo, e := eta.GetSysUserByAdminName(adminName)
 	if e != nil {
 		if utils.IsErrNoRow(e) {
-			errCode = utils.Gn4AErrCode02
+			errMsg = "用户不存在"
 			err = fmt.Errorf("用户不存在")
 			return
 		}
+		errMsg = "操作失败"
 		err = fmt.Errorf("获取用户是否存在失败, %v", e)
 		return
 	}
 
 	// 更新数据
 	if e = UpdateUser(userInfo, userReq); e != nil {
+		errMsg = "操作失败"
 		err = fmt.Errorf("更新用户数据失败, %v", e)
 		return
 	}
-	errCode = utils.Gn4AErrCodeSuccess
 	return
 }
 
 // DeleteAccount 删除账号
-func DeleteAccount(userId string) (errCode, errMsg string, err error) {
-	errCode = utils.Gn4AErrCode08
-
+func DeleteAccount(userId string) (errMsg string, err error) {
 	// 校验是否存在, 不存在返回成功
 	_, e := eta.GetSysUserByAdminName(userId)
 	if e != nil {
 		if utils.IsErrNoRow(e) {
-			errCode = utils.Gn4AErrCodeSuccess
 			return
 		}
+		errMsg = "操作失败"
 		err = fmt.Errorf("获取用户是否存在失败, %v", e)
 		return
 	}
 
 	// 删除用户
 	if e = eta.DeleteSysUserByName(userId); e != nil {
+		errMsg = "操作失败"
 		err = fmt.Errorf("删除用户失败, %v", e)
 		return
 	}
-	errCode = utils.Gn4AErrCodeSuccess
 	return
 }
 
 // SuspendAccount 停用账号
-func SuspendAccount(userId string) (errCode, errMsg string, err error) {
-	errCode = utils.Gn4AErrCode08
-
+func SuspendAccount(userId string) (errMsg string, err error) {
 	// 校验是否存在, 不存在返回异常
 	userInfo, e := eta.GetSysUserByAdminName(userId)
 	if e != nil {
 		if utils.IsErrNoRow(e) {
-			errCode = utils.Gn4AErrCode02
+			errMsg = "用户不存在"
 			err = fmt.Errorf("用户不存在")
 			return
 		}
+		errMsg = "操作失败"
 		err = fmt.Errorf("获取用户是否存在失败, %v", e)
 		return
 	}
@@ -524,25 +448,24 @@ func SuspendAccount(userId string) (errCode, errMsg string, err error) {
 	userInfo.LastUpdatedTime = time.Now()
 	updateCols := []string{"Enabled", "LastUpdatedTime"}
 	if e := userInfo.Update(updateCols); e != nil {
+		errMsg = "操作失败"
 		err = fmt.Errorf("禁用用户失败, %v", e)
 		return
 	}
-	errCode = utils.Gn4AErrCodeSuccess
 	return
 }
 
 // RestoreAccount 启用账号
-func RestoreAccount(userId string) (errCode, errMsg string, err error) {
-	errCode = utils.Gn4AErrCode08
-
+func RestoreAccount(userId string) (errMsg string, err error) {
 	// 校验是否存在, 不存在返回异常
 	userInfo, e := eta.GetSysUserByAdminName(userId)
 	if e != nil {
 		if utils.IsErrNoRow(e) {
-			errCode = utils.Gn4AErrCode02
+			errMsg = "用户不存在"
 			err = fmt.Errorf("用户不存在")
 			return
 		}
+		errMsg = "操作失败"
 		err = fmt.Errorf("获取用户是否存在失败, %v", e)
 		return
 	}
@@ -551,25 +474,24 @@ func RestoreAccount(userId string) (errCode, errMsg string, err error) {
 	userInfo.LastUpdatedTime = time.Now()
 	updateCols := []string{"Enabled", "LastUpdatedTime"}
 	if e := userInfo.Update(updateCols); e != nil {
+		errMsg = "操作失败"
 		err = fmt.Errorf("启用用户失败, %v", e)
 		return
 	}
-	errCode = utils.Gn4AErrCodeSuccess
 	return
 }
 
 // ChangePassword 修改密码
-func ChangePassword(userId, newPassword string) (errCode, errMsg string, err error) {
-	errCode = utils.Gn4AErrCode08
-
+func ChangePassword(userId, newPassword string) (errMsg string, err error) {
 	// 校验是否存在, 不存在返回异常
 	userInfo, e := eta.GetSysUserByAdminName(userId)
 	if e != nil {
 		if utils.IsErrNoRow(e) {
-			errCode = utils.Gn4AErrCode02
+			errMsg = "用户不存在"
 			err = fmt.Errorf("用户不存在")
 			return
 		}
+		errMsg = "操作失败"
 		err = fmt.Errorf("获取用户是否存在失败, %v", e)
 		return
 	}
@@ -579,9 +501,9 @@ func ChangePassword(userId, newPassword string) (errCode, errMsg string, err err
 	userInfo.LastUpdatedPasswordTime = time.Now()
 	updateCols := []string{"Password", "LastUpdatedTime", "LastUpdatedPasswordTime"}
 	if e := userInfo.Update(updateCols); e != nil {
+		errMsg = "操作失败"
 		err = fmt.Errorf("用户密码修改失败, %v", e)
 		return
 	}
-	errCode = utils.Gn4AErrCodeSuccess
 	return
 }

+ 28 - 0
models/eta/sys_department.go

@@ -2,6 +2,8 @@ package eta
 
 import (
 	"eta_gn/eta_bridge/global"
+	"fmt"
+	"strings"
 	"time"
 )
 
@@ -49,3 +51,29 @@ func DeleteDepartmentById(departmentId int) (err error) {
 	err = global.MYSQL["hz_eta"].Exec(sql, departmentId).Error
 	return
 }
+
+func (m *SysDepartment) GetItemByCondition(condition string, pars []interface{}) (item *SysDepartment, err error) {
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s LIMIT 1`, m.TableName(), condition)
+	err = global.MYSQL["hz_eta"].Raw(sql, pars...).First(&item).Error
+	return
+}
+
+func (m *SysDepartment) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*SysDepartment, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	err = global.MYSQL["hz_eta"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+// GetSysDepartmentByOutId 获取部门-根据OutId
+func GetSysDepartmentByOutId(outId string) (item *SysDepartment, err error) {
+	err = global.MYSQL["hz_eta"].Where("out_id = ?", outId).First(&item).Error
+	return
+}

+ 28 - 0
models/eta/sys_group.go

@@ -2,6 +2,8 @@ package eta
 
 import (
 	"eta_gn/eta_bridge/global"
+	"fmt"
+	"strings"
 	"time"
 )
 
@@ -56,3 +58,29 @@ func DeleteGroupByGroupId(groupId int) (err error) {
 	err = global.MYSQL["hz_eta"].Exec(sql, groupId).Error
 	return
 }
+
+func (m *SysGroup) GetItemByCondition(condition string, pars []interface{}) (item *SysGroup, err error) {
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s LIMIT 1`, m.TableName(), condition)
+	err = global.MYSQL["hz_eta"].Raw(sql, pars...).First(&item).Error
+	return
+}
+
+func (m *SysGroup) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*SysGroup, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	err = global.MYSQL["hz_eta"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+// GetSysGroupByOutId 获取分组-根据OutId
+func GetSysGroupByOutId(outId string) (item *SysGroup, err error) {
+	err = global.MYSQL["hz_eta"].Where("out_id = ?", outId).First(&item).Error
+	return
+}

+ 204 - 0
models/gn/mdm.go

@@ -0,0 +1,204 @@
+package gn
+
+import (
+	"eta_gn/eta_bridge/global"
+	"eta_gn/eta_bridge/utils"
+	"fmt"
+	"strings"
+	"time"
+)
+
+// MDM_COMSTRU MDM组织机构
+type MDM_COMSTRU struct {
+	Id                                int       `gorm:"column:Id;primaryKey;autoIncrement" json:"-"`
+	MainFieldComstruCode              string    `gorm:"column:Main_Field_Comstru_Code" json:"Main_Field_Comstru_Code"`
+	MainFieldComstruCodeHR            string    `gorm:"column:Main_Field_Comstru_Code_HR" json:"Main_Field_Comstru_Code_HR"`
+	MainFieldComstruTypeHR            string    `gorm:"column:Main_Field_Comstru_Type_HR" json:"Main_Field_Comstru_Type_HR"`
+	ZDWLX                             string    `gorm:"column:ZDWLX" json:"ZDWLX"`
+	MainFieldComstruNameHR            string    `gorm:"column:Main_Field_Comstru_Name_HR" json:"Main_Field_Comstru_Name_HR"`
+	MainFieldComstruShortNameHR       string    `gorm:"column:Main_Field_Comstru_Short_Name_HR" json:"Main_Field_Comstru_Short_Name_HR"`
+	MainFieldParentAdminComstruCodeHR string    `gorm:"column:Main_Field_ParentAdmin_Comstru_Code_HR" json:"Main_Field_ParentAdmin_Comstru_Code_HR"`
+	MainFieldParentAdminComstruCode   string    `gorm:"column:Main_Field_ParentAdmin_Comstru_Code" json:"Main_Field_ParentAdmin_Comstru_Code"`
+	MainFieldParentAdminComstruName   string    `gorm:"column:Main_Field_ParentAdmin_Comstru_Name" json:"Main_Field_ParentAdmin_Comstru_Name"`
+	MainFieldCompanyLevel             string    `gorm:"column:Main_Field_Company_Level" json:"Main_Field_Company_Level"`
+	MainFieldSecondcomstrucodehr      string    `gorm:"column:Main_Field_Secondcomstrucodehr" json:"Main_Field_Secondcomstrucodehr"`
+	MainFieldShBusinessType           string    `gorm:"column:Main_Field_Sh_Business_Type" json:"Main_Field_Sh_Business_Type"`
+	MainFieldYZGDWZCNDGX              string    `gorm:"column:Main_Field_YZGDWZCNDGX" json:"Main_Field_YZGDWZCNDGX"`
+	MainFieldOrderHR                  string    `gorm:"column:Main_Field_Order_HR" json:"Main_Field_Order_HR"`
+	MainFieldCompanyCode              string    `gorm:"column:Main_Field_Company_Code" json:"Main_Field_Company_Code"`
+	MainFieldCompanyChain             string    `gorm:"column:Main_Field_Company_Chain" json:"Main_Field_Company_Chain"`
+	MainFieldPARENTCOMPANYVIRTUAL     string    `gorm:"column:Main_Field_PARENTCOMPANYVIRTUAL" json:"Main_Field_PARENTCOMPANYVIRTUAL"`
+	ZQYZT                             string    `gorm:"column:ZQYZT" json:"ZQYZT"`
+	CreateTime                        time.Time `gorm:"column:create_time" json:"create_time"`
+	ModifyTime                        time.Time `gorm:"column:modify_time" json:"modify_time"`
+}
+
+func (m *MDM_COMSTRU) TableName() string {
+	return "MDM_COMSTRU"
+}
+
+func (m *MDM_COMSTRU) Create() (err error) {
+	err = global.MYSQL["hz_eta"].Create(m).Error
+	return
+}
+
+func (m *MDM_COMSTRU) Update(cols []string) (err error) {
+	err = global.MYSQL["hz_eta"].Select(cols).Updates(m).Error
+	return
+}
+
+func (m *MDM_COMSTRU) GetItemByCondition(condition string, pars []interface{}) (item *MDM_COMSTRU, err error) {
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s LIMIT 1`, m.TableName(), condition)
+	err = global.MYSQL["hz_eta"].Raw(sql, pars...).First(&item).Error
+	return
+}
+
+func (m *MDM_COMSTRU) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*MDM_COMSTRU, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	err = global.MYSQL["hz_eta"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+// MDM_EMPLOYEE MDM员工表
+type MDM_EMPLOYEE struct {
+	Id                           int       `gorm:"column:Id;primaryKey;autoIncrement" json:"-"`
+	MainFieldEmployeeCode        string    `gorm:"column:Main_Field_Employee_Code" json:"Main_Field_Employee_Code"`
+	MainFieldEmployeeFirstName   string    `gorm:"column:Main_Field_Employee_FirstName" json:"Main_Field_Employee_FirstName"`
+	MainFieldEmployeeLastName    string    `gorm:"column:Main_Field_Employee_LastName" json:"Main_Field_Employee_LastName"`
+	MainFieldGender              string    `gorm:"column:Main_Field_Gender" json:"Main_Field_Gender"`
+	MainFieldEmpolyeeGroup       string    `gorm:"column:Main_Field_Empolyee_Group" json:"Main_Field_Empolyee_Group"`
+	MainFieldOfficeTelephone     string    `gorm:"column:Main_Field_Office_Telephone" json:"Main_Field_Office_Telephone"`
+	MainFieldDateType            string    `gorm:"column:Main_Field_Date_Type" json:"Main_Field_Date_Type"`
+	MainFieldEmployeeStatus      string    `gorm:"column:Main_Field_Employee_Status" json:"Main_Field_Employee_Status"`
+	MainFieldDeleteFlag          string    `gorm:"column:Main_Field_Delete_Flag" json:"Main_Field_Delete_Flag"`
+	MainFieldEmail               string    `gorm:"column:Main_Field_Email" json:"Main_Field_Email"`
+	MainFieldCompanyCode         string    `gorm:"column:Main_Field_Company_code" json:"Main_Field_Company_code"`
+	MainFieldSecondcomstrucodehr string    `gorm:"column:Main_Field_Secondcomstrucodehr" json:"Main_Field_Secondcomstrucodehr"`
+	MainFieldCompanyChain        string    `gorm:"column:Main_Field_Company_Chain" json:"Main_Field_Company_Chain"`
+	CreateTime                   time.Time `gorm:"column:create_time" json:"create_time"`
+	ModifyTime                   time.Time `gorm:"column:modify_time" json:"modify_time"`
+}
+
+func (m *MDM_EMPLOYEE) TableName() string {
+	return "MDM_EMPLOYEE"
+}
+
+func (m *MDM_EMPLOYEE) Create() (err error) {
+	err = global.MYSQL["hz_eta"].Create(m).Error
+	return
+}
+
+func (m *MDM_EMPLOYEE) Update(cols []string) (err error) {
+	err = global.MYSQL["hz_eta"].Select(cols).Updates(m).Error
+	return
+}
+
+func (m *MDM_EMPLOYEE) GetItemByCondition(condition string, pars []interface{}) (item *MDM_EMPLOYEE, err error) {
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s LIMIT 1`, m.TableName(), condition)
+	err = global.MYSQL["hz_eta"].Raw(sql, pars...).First(&item).Error
+	return
+}
+
+func (m *MDM_EMPLOYEE) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*MDM_EMPLOYEE, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	err = global.MYSQL["hz_eta"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+// CreateEmployee 新增员工及组织关系
+func (m *MDM_EMPLOYEE) CreateEmployee(employee *MDM_EMPLOYEE, employeeRelation []*MDM_RELA_COMSTRU_EMPLOYEE) (err error) {
+	if employee == nil {
+		err = fmt.Errorf("employee is nil")
+		return
+	}
+	tx := global.MYSQL["hz_eta"].Begin()
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	if e := tx.Create(employee).Error; e != nil {
+		err = fmt.Errorf("create employee err, %v", e)
+		return
+	}
+	if len(employeeRelation) == 0 {
+		return
+	}
+	if e := tx.CreateInBatches(employeeRelation, utils.MultiAddNum).Error; e != nil {
+		err = fmt.Errorf("create employee relations err, %v", e)
+		return
+	}
+	return
+}
+
+// UpdateEmployee 更新员工及组织关系
+func (m *MDM_EMPLOYEE) UpdateEmployee(employee *MDM_EMPLOYEE, updateCols []string, employeeRelation []*MDM_RELA_COMSTRU_EMPLOYEE) (err error) {
+	if employee == nil {
+		err = fmt.Errorf("employee is nil")
+		return
+	}
+	tx := global.MYSQL["hz_eta"].Begin()
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	if e := tx.Select(updateCols).Updates(employee).Error; e != nil {
+		err = fmt.Errorf("update employee err, %v", e)
+		return
+	}
+	sql := `DELETE FROM MDM_RELA_COMSTRU_EMPLOYEE WHERE Main_Field_Employee_Code = ?`
+	if e := tx.Exec(sql, employee.MainFieldEmployeeCode); e != nil {
+		err = fmt.Errorf("delete employee relations err, %v", e)
+		return
+	}
+	if len(employeeRelation) == 0 {
+		return
+	}
+	if e := tx.CreateInBatches(employeeRelation, utils.MultiAddNum).Error; e != nil {
+		err = fmt.Errorf("create employee relations err, %v", e)
+		return
+	}
+	return
+}
+
+// MDM_RELA_COMSTRU_EMPLOYEE MDM员工组织关系表
+type MDM_RELA_COMSTRU_EMPLOYEE struct {
+	Id                        int       `gorm:"column:Id;primaryKey;autoIncrement" json:"-"`
+	Main_Field_Employee_Code  string    `gorm:"column:Main_Field_Employee_Code" json:"Main_Field_Employee_Code"`
+	TuplesFieldCompanyCode    string    `gorm:"column:Tuples_Field_Company_Code" json:"Tuples_Field_Company_Code"`
+	TuplesFieldCompanyName    string    `gorm:"column:Tuples_Field_Company_Name" json:"Tuples_Field_Company_Name"`
+	TuplesFieldDepartmentCode string    `gorm:"column:Tuples_Field_Department_Code" json:"Tuples_Field_Department_Code"`
+	TuplesFieldDepartmentName string    `gorm:"column:Tuples_Field_Department_Name" json:"Tuples_Field_Department_Name"`
+	TuplesFieldPositionCode   string    `gorm:"column:Tuples_Field_Position_Code" json:"Tuples_Field_Position_Code"`
+	TuplesFieldPositionName   string    `gorm:"column:Tuples_Field_Position_Name" json:"Tuples_Field_Position_Name"`
+	TuplesFieldPostFlag       string    `gorm:"column:Tuples_Field_Post_Flag" json:"Tuples_Field_Post_Flag"`
+	CreateTime                time.Time `gorm:"column:create_time" json:"create_time"`
+	ModifyTime                time.Time `gorm:"column:modify_time" json:"modify_time"`
+}
+
+func (m *MDM_RELA_COMSTRU_EMPLOYEE) TableName() string {
+	return "MDM_RELA_COMSTRU_EMPLOYEE"
+}

+ 0 - 48
models/request/gn/auth.go

@@ -1,54 +1,6 @@
 package gn
 
-import (
-	gnModel "eta_gn/eta_bridge/models/gn"
-	"time"
-)
-
 // GetTokenReq 获取token请求体
 type GetTokenReq struct {
 	Code string `json:"code" form:"code" description:"code编码"`
 }
-
-// AddAccountReq 创建账号请求
-type AddAccountReq struct {
-	gnModel.UserEntity `description:"账号信息"`
-	RequestId          string    `json:"requestID" description:"请求唯一标识"`
-	TimeStamp          time.Time `json:"timeStamp" description:"时间戳"`
-}
-
-// ModifyAccountReq 编辑账号请求
-type ModifyAccountReq struct {
-	gnModel.UserEntity `description:"账号信息"`
-	RequestId          string    `json:"requestID" description:"请求唯一标识"`
-	TimeStamp          time.Time `json:"timeStamp" description:"时间戳"`
-}
-
-// DeleteAccountReq 删除账号请求
-type DeleteAccountReq struct {
-	UserId    string    `json:"userId" description:"用户名"`
-	RequestId string    `json:"requestID" description:"请求唯一标识"`
-	TimeStamp time.Time `json:"timeStamp" description:"时间戳"`
-}
-
-// SuspendAccountReq 禁用账号请求
-type SuspendAccountReq struct {
-	UserId    string    `json:"userId" description:"用户名"`
-	RequestId string    `json:"requestID" description:"请求唯一标识"`
-	TimeStamp time.Time `json:"timeStamp" description:"时间戳"`
-}
-
-// RestoreAccountReq 启用账号请求
-type RestoreAccountReq struct {
-	UserId    string    `json:"userId" description:"用户名"`
-	RequestId string    `json:"requestID" description:"请求唯一标识"`
-	TimeStamp time.Time `json:"timeStamp" description:"时间戳"`
-}
-
-// ChangePasswordReq 修改密码请求
-type ChangePasswordReq struct {
-	UserId      string    `json:"userId" description:"用户名"`
-	NewPassword string    `json:"newPassword" description:"新密码"`
-	RequestId   string    `json:"requestID" description:"请求唯一标识"`
-	TimeStamp   time.Time `json:"timeStamp" description:"时间戳"`
-}

+ 49 - 0
models/request/gn/mdm.go

@@ -0,0 +1,49 @@
+package gn
+
+// SyncMdmEmployeeReq 同步mdm员工请求
+type SyncMdmEmployeeReq struct {
+	MainFieldEmployeeCode        string `json:"Main_Field_Employee_Code"`
+	MainFieldEmployeeFirstName   string `json:"Main_Field_Employee_FirstName"`
+	MainFieldEmployeeLastName    string `json:"Main_Field_Employee_LastName"`
+	MainFieldGender              string `json:"Main_Field_Gender"`
+	MainFieldEmpolyeeGroup       string `json:"Main_Field_Empolyee_Group"`
+	MainFieldOfficeTelephone     string `json:"Main_Field_Office_Telephone"`
+	MainFieldDateType            string `json:"Main_Field_Date_Type"`
+	MainFieldEmployeeStatus      string `json:"Main_Field_Employee_Status"`
+	MainFieldDeleteFlag          string `json:"Main_Field_Delete_Flag"`
+	MainFieldEmail               string `json:"Main_Field_Email"`
+	MainFieldCompanyCode         string `json:"Main_Field_Company_code"`
+	MainFieldSecondcomstrucodehr string `json:"Main_Field_Secondcomstrucodehr"`
+	MainFieldCompanyChain        string `json:"Main_Field_Company_Chain"`
+	MDM_MATERIAL_PROPS           []struct {
+		TuplesFieldCompanyCode    string `json:"Tuples_Field_Company_Code"`
+		TuplesFieldCompanyName    string `json:"Tuples_Field_Company_Name"`
+		TuplesFieldDepartmentCode string `json:"Tuples_Field_Department_Code"`
+		TuplesFieldDepartmentName string `json:"Tuples_Field_Department_Name"`
+		TuplesFieldPositionCode   string `json:"Tuples_Field_Position_Code"`
+		TuplesFieldPositionName   string `json:"Tuples_Field_Position_Name"`
+		TuplesFieldPostFlag       string `json:"Tuples_Field_Post_Flag"`
+	} `json:"MDM_MATERIAL_PROPS"`
+}
+
+// SyncMdmOrganizationReq 同步mdm组织部门请求
+type SyncMdmOrganizationReq struct {
+	MainFieldComstruCode              string `json:"Main_Field_Comstru_Code"`
+	MainFieldComstruCodeHR            string `json:"Main_Field_Comstru_Code_HR"`
+	MainFieldComstruTypeHR            string `json:"Main_Field_Comstru_Type_HR"`
+	ZDWLX                             string `json:"ZDWLX"`
+	MainFieldComstruNameHR            string `json:"Main_Field_Comstru_Name_HR"`
+	MainFieldComstruShortNameHR       string `json:"Main_Field_Comstru_Short_Name_HR"`
+	MainFieldParentAdminComstruCodeHR string `json:"Main_Field_ParentAdmin_Comstru_Code_HR"`
+	MainFieldParentAdminComstruCode   string `json:"Main_Field_ParentAdmin_Comstru_Code"`
+	MainFieldParentAdminComstruName   string `json:"Main_Field_ParentAdmin_Comstru_Name"`
+	MainFieldCompanyLevel             string `json:"Main_Field_Company_Level"`
+	MainFieldSecondcomstrucodehr      string `json:"Main_Field_Secondcomstrucodehr"`
+	MainFieldShBusinessType           string `json:"Main_Field_Sh_Business_Type"`
+	MainFieldYZGDWZCNDGX              string `json:"Main_Field_YZGDWZCNDGX"`
+	MainFieldOrderHR                  string `json:"Main_Field_Order_HR"`
+	MainFieldCompanyCode              string `json:"Main_Field_Company_Code"`
+	MainFieldCompanyChain             string `json:"Main_Field_Company_Chain"`
+	MainFieldPARENTCOMPANYVIRTUAL     string `json:"Main_Field_PARENTCOMPANYVIRTUAL"`
+	ZQYZT                             string `json:"ZQYZT"`
+}

+ 49 - 0
models/request/gn/user.go

@@ -0,0 +1,49 @@
+package gn
+
+import (
+	gnModel "eta_gn/eta_bridge/models/gn"
+	"time"
+)
+
+// AddAccountReq 创建账号请求
+type AddAccountReq struct {
+	gnModel.UserEntity `description:"账号信息"`
+	RequestId          string    `json:"requestID" description:"请求唯一标识"`
+	TimeStamp          time.Time `json:"timeStamp" description:"时间戳"`
+}
+
+// ModifyAccountReq 编辑账号请求
+type ModifyAccountReq struct {
+	gnModel.UserEntity `description:"账号信息"`
+	RequestId          string    `json:"requestID" description:"请求唯一标识"`
+	TimeStamp          time.Time `json:"timeStamp" description:"时间戳"`
+}
+
+// DeleteAccountReq 删除账号请求
+type DeleteAccountReq struct {
+	UserId    string    `json:"userId" description:"用户名"`
+	RequestId string    `json:"requestID" description:"请求唯一标识"`
+	TimeStamp time.Time `json:"timeStamp" description:"时间戳"`
+}
+
+// SuspendAccountReq 禁用账号请求
+type SuspendAccountReq struct {
+	UserId    string    `json:"userId" description:"用户名"`
+	RequestId string    `json:"requestID" description:"请求唯一标识"`
+	TimeStamp time.Time `json:"timeStamp" description:"时间戳"`
+}
+
+// RestoreAccountReq 启用账号请求
+type RestoreAccountReq struct {
+	UserId    string    `json:"userId" description:"用户名"`
+	RequestId string    `json:"requestID" description:"请求唯一标识"`
+	TimeStamp time.Time `json:"timeStamp" description:"时间戳"`
+}
+
+// ChangePasswordReq 修改密码请求
+type ChangePasswordReq struct {
+	UserId      string    `json:"userId" description:"用户名"`
+	NewPassword string    `json:"newPassword" description:"新密码"`
+	RequestId   string    `json:"requestID" description:"请求唯一标识"`
+	TimeStamp   time.Time `json:"timeStamp" description:"时间戳"`
+}

+ 8 - 6
routers/gn.go

@@ -10,7 +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/sync", control.SyncUser)
 
 	// 4A身份供应接口
 	init4A(r)
@@ -22,12 +22,14 @@ func InitGn(r *gin.RouterGroup) {
 func init4A(r *gin.RouterGroup) {
 	control := new(gn.GuoNengController)
 	group := r.Group("gn/")
-	group.POST("user/addAccount", control.AddAccount)
-	group.POST("user/modifyAccount", control.ModifyAccount)
-	group.POST("user/deleteAccount", control.DeleteAccount)
-	group.POST("user/suspendAccount", control.SuspendAccount)
-	group.POST("user/restoreAccount", control.RestoreAccount)
+	group.POST("user/add4AUser", control.AddAccount)
+	group.POST("user/modify4AUser", control.ModifyAccount)
+	group.POST("user/delete4AUser", control.DeleteAccount)
+	group.POST("user/suspend4AUser", control.SuspendAccount)
+	group.POST("user/restore4AUser", control.RestoreAccount)
 	group.POST("user/ChangePassword", control.ChangePassword)
+	group.POST("user/syncMdmComstru", control.SyncMdmOrganization)
+	group.POST("user/syncMdmEmployee", control.SyncMdmEmployee)
 }
 
 func initOA(r *gin.RouterGroup) {

+ 14 - 11
utils/constants.go

@@ -68,15 +68,18 @@ const CrmEtaAuthorization = "NIi1RbEmH0C2rksXtPGDPBBgRgTZY87Q"
 const CACHE_MYSQL_MASTER_FILENAME = "eta:mysql:binlog:filename"
 const CACHE_MYSQL_MASTER_POSITION = "eta:mysql:binlog:position"
 
+// MultiAddNum 批量插入的数据量
+const MultiAddNum = 500
+
 // 4A接口错误编码
-const (
-	Gn4AErrCodeSuccess = "0"            // 操作成功
-	Gn4AErrCode01      = "LoginErr-001" // 您没有权限登录该系统
-	Gn4AErrCode02      = "LoginErr-002" // 系统内部无此用户
-	Gn4AErrCode03      = "LoginErr-003" // 用户已被禁用
-	Gn4AErrCode04      = "LoginErr-004" // 无法获取登录用户
-	Gn4AErrCode05      = "LoginErr-005" // 用户来源非法
-	Gn4AErrCode06      = "LoginErr-006" // 提交数据异常
-	Gn4AErrCode07      = "LoginErr-007" // 认证服务无法访问
-	Gn4AErrCode08      = "LoginErr-008" // 自定义错误文本
-)
+//const (
+//	Gn4AErrCodeSuccess = "0"            // 操作成功
+//	Gn4AErrCode01      = "LoginErr-001" // 您没有权限登录该系统
+//	Gn4AErrCode02      = "LoginErr-002" // 系统内部无此用户
+//	Gn4AErrCode03      = "LoginErr-003" // 用户已被禁用
+//	Gn4AErrCode04      = "LoginErr-004" // 无法获取登录用户
+//	Gn4AErrCode05      = "LoginErr-005" // 用户来源非法
+//	Gn4AErrCode06      = "LoginErr-006" // 提交数据异常
+//	Gn4AErrCode07      = "LoginErr-007" // 认证服务无法访问
+//	Gn4AErrCode08      = "LoginErr-008" // 自定义错误文本
+//)