Forráskód Böngészése

test: 身份供应接口

hsun 5 hónapja
szülő
commit
ca18b7a427
8 módosított fájl, 576 hozzáadás és 60 törlés
  1. 176 23
      controller/gn/user.go
  2. 32 0
      controller/resp/base.go
  3. 227 0
      logic/gn/user.go
  4. 60 0
      models/gn/user.go
  5. 48 0
      models/request/gn/auth.go
  6. 13 37
      routers/gn.go
  7. 7 0
      utils/common.go
  8. 13 0
      utils/constants.go

+ 176 - 23
controller/gn/user.go

@@ -3,13 +3,14 @@ package gn
 import (
 	"eta_gn/eta_bridge/controller/resp"
 	gnLogic "eta_gn/eta_bridge/logic/gn"
+	"eta_gn/eta_bridge/models/gn"
+	gnRequest "eta_gn/eta_bridge/models/request/gn"
+	"eta_gn/eta_bridge/utils"
 	"github.com/gin-gonic/gin"
+	"strings"
 	"sync"
 )
 
-// XiangyuController 象屿指标
-//type XiangyuController struct{}
-
 // 同步用户锁,防止重复同步,不管是全量还是增量,都是同一时间只能一个同步
 var lockSyncUser sync.Mutex
 
@@ -32,23 +33,175 @@ func (gc *GuoNengController) SyncUser(c *gin.Context) {
 	resp.Ok("同步成功", c)
 }
 
-// PullUser
-// @Description: 增量同步用户
-// @author: Roc
-// @receiver xc
-// @datetime 2024-01-23 17:13:07
-// @param c *gin.Context
-//func (xc *GuoNengController) PullUser(c *gin.Context) {
-//	lockSyncUser.Lock()
-//	defer func() {
-//		lockSyncUser.Unlock()
-//	}()
-//	err := xiangyu.PullUser()
-//	if err != nil {
-//		resp.FailData("同步失败", err.Error(), c)
-//		return
-//	}
-//	resp.Ok("同步成功", c)
-//
-//	return
-//}
+// 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)
+		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)
+		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)
+			return
+		}
+	}
+
+	// 新增账号
+	errCode, errMsg, e := gnLogic.AddAccount(req.UserEntity)
+	if e != nil {
+		resp.Gn4AResultData(false, errCode, errMsg, c)
+		return
+	}
+	resp.Gn4AResultData(true, utils.Gn4AErrCodeSuccess, "操作成功", 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)
+		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)
+		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)
+			return
+		}
+	}
+
+	// 新增账号
+	errCode, errMsg, e := gnLogic.ModifyAccount(req.UserEntity)
+	if e != nil {
+		resp.Gn4AResultData(false, errCode, errMsg, c)
+		return
+	}
+	resp.Gn4AResultData(true, utils.Gn4AErrCodeSuccess, "操作成功", 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)
+		return
+	}
+	if req.UserId == "" {
+		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "登录账号标识不可为空", c)
+		return
+	}
+
+	errCode, errMsg, e := gnLogic.DeleteAccount(req.UserId)
+	if e != nil {
+		resp.Gn4AResultData(false, errCode, errMsg, c)
+		return
+	}
+	resp.Gn4AResultData(true, utils.Gn4AErrCodeSuccess, "操作成功", 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)
+		return
+	}
+	if req.UserId == "" {
+		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "登录账号标识不可为空", c)
+		return
+	}
+
+	errCode, errMsg, e := gnLogic.SuspendAccount(req.UserId)
+	if e != nil {
+		resp.Gn4AResultData(false, errCode, errMsg, c)
+		return
+	}
+	resp.Gn4AResultData(true, utils.Gn4AErrCodeSuccess, "操作成功", 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)
+		return
+	}
+	if req.UserId == "" {
+		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "登录账号标识不可为空", c)
+		return
+	}
+
+	errCode, errMsg, e := gnLogic.RestoreAccount(req.UserId)
+	if e != nil {
+		resp.Gn4AResultData(false, errCode, errMsg, c)
+		return
+	}
+	resp.Gn4AResultData(true, utils.Gn4AErrCodeSuccess, "操作成功", 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)
+		return
+	}
+	if req.UserId == "" {
+		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "登录账号标识不可为空", c)
+		return
+	}
+	req.NewPassword = strings.TrimSpace(req.NewPassword)
+	if req.NewPassword == "" {
+		resp.Gn4AResultData(false, utils.Gn4AErrCode08, "新密码不可为空", c)
+		return
+	}
+
+	errCode, errMsg, e := gnLogic.ChangePassword(req.UserId, req.NewPassword)
+	if e != nil {
+		resp.Gn4AResultData(false, errCode, errMsg, c)
+		return
+	}
+	resp.Gn4AResultData(true, utils.Gn4AErrCodeSuccess, "操作成功", c)
+}

+ 32 - 0
controller/resp/base.go

@@ -153,3 +153,35 @@ func FailMsg(msg, errMsg string, c *gin.Context) {
 	}
 	result(200, resultData, c)
 }
+
+// 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:"返回结果信息, 可自定义"`
+}
+
+// Gn4AResultData 4A返回结果
+func Gn4AResultData(flag bool, code, msg string, c *gin.Context) {
+	resultData := Gn4AOperationResult{
+		ReturnFlag: flag,
+		ReturnCode: code,
+		ReturnMsg:  msg,
+	}
+	gnResult(200, resultData, c)
+}
+
+func gnResult(code int, resultData Gn4AOperationResult, c *gin.Context) {
+	logSlice := make([]string, 0)
+	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))
+	}
+	global.LOG.Info(strings.Join(logSlice, ";"))
+
+	c.JSON(code, resultData)
+	c.Abort()
+}

+ 227 - 0
logic/gn/user.go

@@ -358,3 +358,230 @@ func handleUser(oaUser *gn.OaUser, departmentMap map[string]*eta.SysDepartment,
 	}
 	return
 }
+
+// AddAccount 创建新账号
+func AddAccount(userReq gn.UserEntity) (errCode, errMsg string, err error) {
+	errCode = utils.Gn4AErrCode08
+	adminName := *userReq.UserId
+
+	// 校验是否存在, 若存在则更新信息, 否则新增
+	userInfo, e := eta.GetSysUserByAdminName(adminName)
+	if e != nil && !utils.IsErrNoRow(e) {
+		err = fmt.Errorf("获取用户是否存在失败, %v", e)
+		return
+	}
+
+	// 更新数据
+	if userInfo.AdminId > 0 {
+		if e = UpdateUser(userInfo, userReq); e != nil {
+			err = fmt.Errorf("更新用户数据失败, %v", e)
+			return
+		}
+		errCode = utils.Gn4AErrCodeSuccess
+		return
+	}
+
+	// 新增数据
+	newUser := new(eta.Admin)
+	newUser.AdminName = adminName
+	newUser.RealName = fmt.Sprint(*userReq.LastName, *userReq.FirstName)
+	newUser.Password = utils.MD5(*userReq.Password)
+	statsMap := map[string]int{gn.UserStatusActive: 1, gn.UserStatusDisable: 0}
+	newUser.Enabled = statsMap[*userReq.UserStatus]
+	newUser.Email = *userReq.Mail
+	newUser.Mobile = *userReq.Mobile
+	newUser.Position = *userReq.TitleName
+	// TODO:部门分组
+	newUser.CreatedTime = time.Now()
+	newUser.LastUpdatedTime = time.Now()
+	newUser.OutID = adminName
+	if e = userInfo.Create(); e != nil {
+		err = fmt.Errorf("新增用户失败, %v", e)
+		return
+	}
+	errCode = utils.Gn4AErrCodeSuccess
+	return
+}
+
+// UpdateUser 更新用户非null字段
+func UpdateUser(originUser *eta.Admin, userReq gn.UserEntity) (err error) {
+	if originUser == nil {
+		err = fmt.Errorf("用户信息有误")
+		return
+	}
+	updateCols := make([]string, 0)
+	// 密码
+	if userReq.Password != nil {
+		originUser.Password = utils.MD5(*userReq.Password)
+		updateCols = append(updateCols, "Password")
+	}
+	// TODO:组织部门相关
+	if userReq.OrgCode != nil {
+
+	}
+	// 姓名
+	if userReq.FirstName != nil && userReq.LastName != nil {
+		originUser.RealName = fmt.Sprint(*userReq.LastName, *userReq.FirstName)
+		updateCols = append(updateCols, "RealName")
+	}
+	// 状态
+	if userReq.UserStatus != nil {
+		statsMap := map[string]int{gn.UserStatusActive: 1, gn.UserStatusDisable: 0}
+		originUser.Enabled = statsMap[*userReq.UserStatus]
+		updateCols = append(updateCols, "Enabled")
+	}
+	// 联系方式
+	if userReq.Mail != nil {
+		originUser.Email = *userReq.Mail
+		updateCols = append(updateCols, "Email")
+	}
+	if userReq.Mobile != nil {
+		originUser.Mobile = *userReq.Mobile
+		updateCols = append(updateCols, "Mobile")
+	}
+	// 职位
+	if userReq.TitleName != nil {
+		originUser.Position = *userReq.TitleName
+		updateCols = append(updateCols, "Position")
+	}
+	// 更新数据
+	originUser.LastUpdatedTime = time.Now()
+	updateCols = append(updateCols, "LastUpdatedTime")
+	if e := originUser.Update(updateCols); e != nil {
+		err = fmt.Errorf("更新用户数据失败, %v", e)
+		return
+	}
+	return
+}
+
+// ModifyAccount 修改账号
+func ModifyAccount(userReq gn.UserEntity) (errCode, errMsg string, err error) {
+	errCode = utils.Gn4AErrCode08
+	adminName := *userReq.UserId
+
+	// 校验是否存在, 不存在返回异常
+	userInfo, e := eta.GetSysUserByAdminName(adminName)
+	if e != nil {
+		if utils.IsErrNoRow(e) {
+			errCode = utils.Gn4AErrCode02
+			err = fmt.Errorf("用户不存在")
+			return
+		}
+		err = fmt.Errorf("获取用户是否存在失败, %v", e)
+		return
+	}
+
+	// 更新数据
+	if e = UpdateUser(userInfo, userReq); e != nil {
+		err = fmt.Errorf("更新用户数据失败, %v", e)
+		return
+	}
+	errCode = utils.Gn4AErrCodeSuccess
+	return
+}
+
+// DeleteAccount 删除账号
+func DeleteAccount(userId string) (errCode, errMsg string, err error) {
+	errCode = utils.Gn4AErrCode08
+
+	// 校验是否存在, 不存在返回成功
+	_, e := eta.GetSysUserByAdminName(userId)
+	if e != nil {
+		if utils.IsErrNoRow(e) {
+			errCode = utils.Gn4AErrCodeSuccess
+			return
+		}
+		err = fmt.Errorf("获取用户是否存在失败, %v", e)
+		return
+	}
+
+	// 删除用户
+	if e = eta.DeleteSysUserByName(userId); e != nil {
+		err = fmt.Errorf("删除用户失败, %v", e)
+		return
+	}
+	errCode = utils.Gn4AErrCodeSuccess
+	return
+}
+
+// SuspendAccount 停用账号
+func SuspendAccount(userId string) (errCode, errMsg string, err error) {
+	errCode = utils.Gn4AErrCode08
+
+	// 校验是否存在, 不存在返回异常
+	userInfo, e := eta.GetSysUserByAdminName(userId)
+	if e != nil {
+		if utils.IsErrNoRow(e) {
+			errCode = utils.Gn4AErrCode02
+			err = fmt.Errorf("用户不存在")
+			return
+		}
+		err = fmt.Errorf("获取用户是否存在失败, %v", e)
+		return
+	}
+
+	userInfo.Enabled = 0
+	userInfo.LastUpdatedTime = time.Now()
+	updateCols := []string{"Enabled", "LastUpdatedTime"}
+	if e := userInfo.Update(updateCols); e != nil {
+		err = fmt.Errorf("禁用用户失败, %v", e)
+		return
+	}
+	errCode = utils.Gn4AErrCodeSuccess
+	return
+}
+
+// RestoreAccount 启用账号
+func RestoreAccount(userId string) (errCode, errMsg string, err error) {
+	errCode = utils.Gn4AErrCode08
+
+	// 校验是否存在, 不存在返回异常
+	userInfo, e := eta.GetSysUserByAdminName(userId)
+	if e != nil {
+		if utils.IsErrNoRow(e) {
+			errCode = utils.Gn4AErrCode02
+			err = fmt.Errorf("用户不存在")
+			return
+		}
+		err = fmt.Errorf("获取用户是否存在失败, %v", e)
+		return
+	}
+
+	userInfo.Enabled = 1
+	userInfo.LastUpdatedTime = time.Now()
+	updateCols := []string{"Enabled", "LastUpdatedTime"}
+	if e := userInfo.Update(updateCols); e != nil {
+		err = fmt.Errorf("启用用户失败, %v", e)
+		return
+	}
+	errCode = utils.Gn4AErrCodeSuccess
+	return
+}
+
+// ChangePassword 修改密码
+func ChangePassword(userId, newPassword string) (errCode, errMsg string, err error) {
+	errCode = utils.Gn4AErrCode08
+
+	// 校验是否存在, 不存在返回异常
+	userInfo, e := eta.GetSysUserByAdminName(userId)
+	if e != nil {
+		if utils.IsErrNoRow(e) {
+			errCode = utils.Gn4AErrCode02
+			err = fmt.Errorf("用户不存在")
+			return
+		}
+		err = fmt.Errorf("获取用户是否存在失败, %v", e)
+		return
+	}
+
+	userInfo.Password = utils.MD5(newPassword)
+	userInfo.LastUpdatedTime = time.Now()
+	userInfo.LastUpdatedPasswordTime = time.Now()
+	updateCols := []string{"Password", "LastUpdatedTime", "LastUpdatedPasswordTime"}
+	if e := userInfo.Update(updateCols); e != nil {
+		err = fmt.Errorf("用户密码修改失败, %v", e)
+		return
+	}
+	errCode = utils.Gn4AErrCodeSuccess
+	return
+}

+ 60 - 0
models/gn/user.go

@@ -34,3 +34,63 @@ func GetGnOaUser() (items []*OaUser, err error) {
 	err = global.MYSQL["oa_user"].Raw(sql).Find(&items).Error
 	return
 }
+
+// UserEntity枚举值
+const (
+	UserStatusActive  = "Active"
+	UserStatusDisable = "Disabled"
+	UserIsByWorkFull  = "全职"
+	UserIsByWorkPart  = "兼职"
+)
+
+// UserEntity 4A用户字段
+//type UserEntity11 struct {
+//	UserId         string                 `json:"userId" description:"登录账号标识[必填], string:256"`
+//	Password       string                 `json:"password" description:"密码(预留,4A平台不提供), string:256"`
+//	OrgCode        string                 `json:"orgCode" description:"对应MDM组织机构-单位的编号(预留,4A平台不提供), string:8"`
+//	OrgName        string                 `json:"orgName" description:"对应员工直接所属的MDM组织机构-单位名称(预留,4A平台不提供), string:40"`
+//	DepartmentNum  string                 `json:"departmentNum" description:"对应MDM组织机构-部门的编号(预留,4A平台不提供), string:8"`
+//	DepartmentName string                 `json:"departmentName" description:"对应员工直接所属的MDM组织机构-部门名称(预留,4A平台不提供), string:40"`
+//	FirstName      string                 `json:"firstName" description:"身份证中的名[必填], string:150"`
+//	LastName       string                 `json:"lastName" description:"身份证中的姓[必填], string:150"`
+//	Sex            string                 `json:"sex" description:"员工性别(预留,4A平台不提供), string:10"`
+//	UserType       string                 `json:"userType" description:"用户类型, 枚举值(预留,4A平台不提供), string:256"`
+//	Mail           string                 `json:"mail" description:"员工邮箱(预留,4A平台不提供), string: 256"`
+//	DisplayIndex   int                    `json:"displayIndex" description:"排序(预留,4A平台不提供), int: 256"`
+//	Mobile         string                 `json:"mobile" description:"员工手机号, 可能存在多值(预留,4A平台不提供), string:50"`
+//	Telephone      string                 `json:"telephone" description:"员工办公室电话, 可能存在多值(预留,4A平台不提供), string:50"`
+//	PID            string                 `json:"PID" description:"身份证号(预留,4A平台不提供), string: 50"`
+//	PassportId     string                 `json:"passportID" description:"护照号(预留,4A平台不提供), string:50"`
+//	UserStatus     string                 `json:"userStatus" description:"账号状态[必填], 枚举值: Active-激活; Disabled-禁用, string:256"`
+//	EmpNumber      string                 `json:"empNumber" description:"员工在ERP系统中的唯一编号, 默认与账号标识一致(预留,4A平台不提供), string:256"`
+//	Title          string                 `json:"title" description:"员工主职位编号(预留,4A平台不提供), string:40"`
+//	TitleName      string                 `json:"titleName" description:"员工主职位名称(预留,4A平台不提供), string:256"`
+//	IsByWork       string                 `json:"isBywork" description:"是否兼职(预留,4A平台不提供), 枚举值: 全职-MDM推送的全职人员信息, string:10"`
+//	Extensions     map[string]interface{} `json:"extensions" description:"扩展字段, key-value"`
+//}
+
+// UserEntity 4A用户字段
+type UserEntity struct {
+	UserId         *string                 `json:"userId" description:"登录账号标识[必填], string:256"`
+	Password       *string                 `json:"password" description:"密码(预留,4A平台不提供), string:256"`
+	OrgCode        *string                 `json:"orgCode" description:"对应MDM组织机构-单位的编号(预留,4A平台不提供), string:8"`
+	OrgName        *string                 `json:"orgName" description:"对应员工直接所属的MDM组织机构-单位名称(预留,4A平台不提供), string:40"`
+	DepartmentNum  *string                 `json:"departmentNum" description:"对应MDM组织机构-部门的编号(预留,4A平台不提供), string:8"`
+	DepartmentName *string                 `json:"departmentName" description:"对应员工直接所属的MDM组织机构-部门名称(预留,4A平台不提供), string:40"`
+	FirstName      *string                 `json:"firstName" description:"身份证中的名[必填], string:150"`
+	LastName       *string                 `json:"lastName" description:"身份证中的姓[必填], string:150"`
+	Sex            *string                 `json:"sex" description:"员工性别(预留,4A平台不提供), string:10"`
+	UserType       *string                 `json:"userType" description:"用户类型, 枚举值(预留,4A平台不提供), string:256"`
+	Mail           *string                 `json:"mail" description:"员工邮箱(预留,4A平台不提供), string: 256"`
+	DisplayIndex   *int                    `json:"displayIndex" description:"排序(预留,4A平台不提供), int: 256"`
+	Mobile         *string                 `json:"mobile" description:"员工手机号, 可能存在多值(预留,4A平台不提供), string:50"`
+	Telephone      *string                 `json:"telephone" description:"员工办公室电话, 可能存在多值(预留,4A平台不提供), string:50"`
+	PID            *string                 `json:"PID" description:"身份证号(预留,4A平台不提供), string: 50"`
+	PassportId     *string                 `json:"passportID" description:"护照号(预留,4A平台不提供), string:50"`
+	UserStatus     *string                 `json:"userStatus" description:"账号状态[必填], 枚举值: Active-激活; Disabled-禁用, string:256"`
+	EmpNumber      *string                 `json:"empNumber" description:"员工在ERP系统中的唯一编号, 默认与账号标识一致(预留,4A平台不提供), string:256"`
+	Title          *string                 `json:"title" description:"员工主职位编号(预留,4A平台不提供), string:40"`
+	TitleName      *string                 `json:"titleName" description:"员工主职位名称(预留,4A平台不提供), string:256"`
+	IsByWork       *string                 `json:"isBywork" description:"是否兼职(预留,4A平台不提供), 枚举值: 全职-MDM推送的全职人员信息, string:10"`
+	Extensions     *map[string]interface{} `json:"extensions" description:"扩展字段, key-value"`
+}

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

@@ -1,6 +1,54 @@
 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:"时间戳"`
+}

+ 13 - 37
routers/gn.go

@@ -5,48 +5,24 @@ import (
 	"github.com/gin-gonic/gin"
 )
 
-// InitGn 国能路由
+// InitGn 国能接口
 func InitGn(r *gin.RouterGroup) {
 	control := new(gn.GuoNengController)
 	group := r.Group("gn/")
 	group.GET("auth/getToken", control.GetToken)
 	group.GET("user/sync", control.SyncUser)
-	//group.GET("user/pull", control.PullUser)
 
-	// 需要内部鉴权的接口
-	//initAuthXiangyu(r)
-
-	// 指标接口
-	//initIndexXiangyu(r)
-
-	// crm数据接口
-	//initCrmXiangyu(r)
+	// 4A身份供应接口
+	init4A(r)
 }
 
-//func initAuthXiangyu(r *gin.RouterGroup) {
-//	control := new(xiangyu.XiangyuController)
-//	group := r.Group("xy/").Use(middleware.InternalToken())
-//	group.POST("auth/getToken", control.GetToken)
-//	group.GET("auth/refreshToken", control.RefreshToken)
-//	group.POST("auth/revokeToken", control.RevokeToken)
-//}
-
-//func initIndexXiangyu(r *gin.RouterGroup) {
-//	control := new(xiangyu.XiangyuController)
-//	group := r.Group("xy/").Use(middleware.InternalToken())
-//	group.POST("index/pushIndexData", control.PushIndexDataResp)
-//	group.POST("index/pushIndexValue", control.PushIndexValueDataResp)
-//	group.POST("index/pushClassify", control.PushClassifyDataResp)
-//	group.POST("index/pushEdbClassify", control.PushEdbClassifyDataResp)
-//}
-
-// initCrmXiangyu
-// @Description: Crm数据接口
-// @author: Roc
-// @datetime 2024-05-14 17:21:22
-// @param r *gin.RouterGroup
-//func initCrmXiangyu(r *gin.RouterGroup) {
-//	control := new(xiangyu.XiangyuController)
-//	group := r.Group("xy/index/").Use(middleware.InternalToken())
-//	group.GET("crm/getCrmData", control.GetCrmData)
-//}
+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/ChangePassword", control.ChangePassword)
+}

+ 7 - 0
utils/common.go

@@ -1102,3 +1102,10 @@ func InArrayByStr(idStrList []string, searchId string) (has bool) {
 	}
 	return
 }
+
+func IsErrNoRow(err error) bool {
+	if err == nil {
+		return false
+	}
+	return errors.Is(err, gorm.ErrRecordNotFound)
+}

+ 13 - 0
utils/constants.go

@@ -101,3 +101,16 @@ const (
 
 const CACHE_MYSQL_MASTER_FILENAME = "eta:mysql:binlog:filename"
 const CACHE_MYSQL_MASTER_POSITION = "eta:mysql:binlog:position"
+
+// 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" // 自定义错误文本
+)