Browse Source

域登录

kobe6258 5 months ago
parent
commit
0ee5c435d4

+ 4 - 2
controller/haitong/auth_controller.go

@@ -1,6 +1,7 @@
 package haitong
 
 import (
+	"encoding/json"
 	"eta/eta_bridge/controller/resp"
 	"eta/eta_bridge/global"
 	"eta/eta_bridge/logic/htfutures"
@@ -36,13 +37,14 @@ func (xc *SSOLoginController) SSOLogin(c *gin.Context) {
 		resp.FailMsg("请传入code码", "请输入指标code码", c)
 		return
 	}
-
 	result, err, errMsg := htfutures.LoginEta(req.Code)
+	global.FILE_LOG.Info("oss 请求结束", err.Error())
 	if err != nil {
 		resp.FailData(errMsg, err.Error(), c)
 		return
 	}
+	str, err := json.Marshal(result)
+	global.FILE_LOG.Info("请求成功,返回响应体:%s", str)
 	resp.OkData("获取成功", result, c)
-
 	return
 }

+ 0 - 26
controller/haitong/orm_controller.go

@@ -1,26 +0,0 @@
-package haitong
-
-import (
-	"eta/eta_bridge/models/ht/oa"
-	"fmt"
-	"github.com/gin-gonic/gin"
-)
-
-type OrmController struct {
-}
-
-// Test
-// @Description: 用code换取token
-// @author: CH
-// @receiver xc
-// @datetime 2024-01-23 17:06:34
-// @param c *gin.Context
-func (xc *SSOLoginController) Test(c *gin.Context) {
-	list, err := oa.GetDepartMentListWithOrm()
-	if err != nil {
-		fmt.Println(err)
-		return
-	}
-	fmt.Println(len(list))
-	return
-}

+ 1 - 1
core/run_server.go

@@ -31,7 +31,7 @@ func RunServe() {
 	//初始化海通的相关逻辑
 	if global.CONFIG.HTFutures.OaDBDns != "" {
 		init_serve.DMDataBase()
-		init_serve.DMDataBaseORM()
+		//init_serve.DMDataBaseORM()
 	}
 	if global.CONFIG.HTFutures.SyncTask.EnableTask {
 		HTtask.StartCronJob()

+ 42 - 44
init_serve/dm_database_orm.go

@@ -1,47 +1,45 @@
 package init_serve
 
-import (
-	"eta/eta_bridge/global"
-	"eta/eta_bridge/models/ht/oa"
-	"fmt"
-	_ "github.com/alexbrainman/odbc"
-	"github.com/astaxie/beego/orm"
-)
+//import (
+//	_ "github.com/alexbrainman/odbc"
+//	"github.com/astaxie/beego/orm"
+//)
+//
+//const (
+//	DR_ODBC orm.DriverType = 6
+//)
 
-const (
-	DR_ODBC orm.DriverType = 6
-)
-
-func DMDataBaseORM() {
-
-	//开启日志
-	err := orm.RegisterDriver("odbc", orm.DRTiDB)
-	if err != nil {
-		fmt.Println("注册数据库驱动失败,数据库:", ";Err:", err)
-		return
-	}
-	dsn := "Driver={DM8 ODBC DRIVER};Server=localhost:5236;Database=ETA;UID=ETA;PWD=Han6258199118`;"
-	err = orm.RegisterDataBase("default", "odbc", dsn)
-	orm.SetMaxIdleConns("default", 50)
-	orm.SetMaxOpenConns("default", 100)
-	orm.RegisterModel(new(oa.HrmResource))
-	orm.RegisterModel(new(oa.HrmDepartment))
-	orm.RegisterModel(new(oa.HrmSubCompany))
-	if err != nil {
-		fmt.Println("注册数据库失败,数据库:", ";Err:", err)
-		return
-	}
-	//ormdb, err := orm.GetDB("defalut")
-	//if err != nil {
-	//	fmt.Println("获取数据库连接失败,数据库:", ";Err:", err)
-	//	return
-	//}
-
-	//ormdb.SetConnMaxLifetime(10 * time.Minute)
-	if err != nil {
-		global.LOG.Errorf("海通OA数据库 启动异常,数据库:", ";Err:", err)
-		panic(fmt.Errorf("海通OA数据库 启动异常,数据库:", "Err:%s", err))
-	}
-	//global.OaDbHTORM = ormdb
-	fmt.Println("ht oa database init end")
-}
+//
+//func DMDataBaseORM() {
+//
+//	//开启日志
+//	err := orm.RegisterDriver("odbc", orm.DRTiDB)
+//	if err != nil {
+//		fmt.Println("注册数据库驱动失败,数据库:", ";Err:", err)
+//		return
+//	}
+//	dsn := "Driver={DM8 ODBC DRIVER};Server=localhost:5236;Database=ETA;UID=ETA;PWD=Han6258199118`;"
+//	err = orm.RegisterDataBase("default", "odbc", dsn)
+//	orm.SetMaxIdleConns("default", 50)
+//	orm.SetMaxOpenConns("default", 100)
+//	orm.RegisterModel(new(oa.HrmResource))
+//	orm.RegisterModel(new(oa.HrmDepartment))
+//	orm.RegisterModel(new(oa.HrmSubCompany))
+//	if err != nil {
+//		fmt.Println("注册数据库失败,数据库:", ";Err:", err)
+//		return
+//	}
+//	//ormdb, err := orm.GetDB("defalut")
+//	//if err != nil {
+//	//	fmt.Println("获取数据库连接失败,数据库:", ";Err:", err)
+//	//	return
+//	//}
+//
+//	//ormdb.SetConnMaxLifetime(10 * time.Minute)
+//	if err != nil {
+//		global.LOG.Errorf("海通OA数据库 启动异常,数据库:", ";Err:", err)
+//		panic(fmt.Errorf("海通OA数据库 启动异常,数据库:", "Err:%s", err))
+//	}
+//	//global.OaDbHTORM = ormdb
+//	fmt.Println("ht oa database init end")
+//}

+ 18 - 18
logic/htfutures/http_client.go

@@ -18,27 +18,27 @@ const (
 	post = "POST"
 )
 
-type HttpClient interface {
-	Get(url string, head http.Header, params map[string]interface{}) (Response, error)
-	Post(url string, head http.Header, data interface{}) (Response, error)
-	PostFromData(url string, fromData url.Values) (Response, error)
-	doRequest(req *http.Request) (Response, error)
+type HttpClient[T any] interface {
+	Get(url string, head http.Header, params map[string]interface{}) (Response[T], error)
+	Post(url string, head http.Header, data interface{}) (Response[T], error)
+	PostFromData(url string, fromData url.Values) (Response[T], error)
+	doRequest(req *http.Request) (Response[T], error)
 }
 
-type Response struct {
+type Response[T any] struct {
 	Code    int    `json:"code"`
 	Message string `json:"message"`
-	Data    string `json:"data"`
+	Data    T      `json:"data"`
 	TraceId string `json:"traceId"`
 }
 
 // DefaultHttpClient 结构体实现 SSOClient 接口
-type DefaultHttpClient struct {
+type DefaultHttpClient[T any] struct {
 	client        *http.Client
 	retryStrategy RetryStrategy
 }
 
-func (c *DefaultHttpClient) PostFromData(urlStr string, fromData url.Values) (Response, error) {
+func (c *DefaultHttpClient[T]) PostFromData(urlStr string, fromData url.Values) (Response[T], error) {
 	dataStr, err := json.Marshal(fromData)
 	if err != nil {
 		global.FILE_LOG.Error("formData参数json序列化失败,err:" + err.Error())
@@ -46,7 +46,7 @@ func (c *DefaultHttpClient) PostFromData(urlStr string, fromData url.Values) (Re
 	global.FILE_LOG.Info("post请求:" + urlStr + ",formData:" + string(dataStr))
 	return c.doPostForm(urlStr, fromData)
 }
-func (c *DefaultHttpClient) Post(urlStr string, head http.Header, data interface{}) (response Response, err error) {
+func (c *DefaultHttpClient[T]) Post(urlStr string, head http.Header, data interface{}) (response Response[T], err error) {
 	dataStr, err := json.Marshal(data)
 	if err != nil {
 		global.FILE_LOG.Error("请求data json序列化失败,err:" + err.Error())
@@ -70,7 +70,7 @@ func (c *DefaultHttpClient) Post(urlStr string, head http.Header, data interface
 	return c.doRequest(req)
 }
 
-func (c *DefaultHttpClient) Get(urlStr string, head http.Header, params map[string]interface{}) (response Response, err error) {
+func (c *DefaultHttpClient[T]) Get(urlStr string, head http.Header, params map[string]interface{}) (response Response[T], err error) {
 	if len(params) > 0 {
 		queryParams := url.Values{}
 		for key, value := range params {
@@ -92,14 +92,14 @@ func (c *DefaultHttpClient) Get(urlStr string, head http.Header, params map[stri
 	return c.doRequest(req)
 }
 
-func (c *DefaultHttpClient) RetryStrategy(retryStrategy RetryStrategy) *DefaultHttpClient {
+func (c *DefaultHttpClient[T]) RetryStrategy(retryStrategy RetryStrategy) *DefaultHttpClient[T] {
 	c.retryStrategy = retryStrategy
 	return c
 }
 
 // retryRequest 尝试执行请求并根据重试策略重试
 // retryRequest 尝试执行请求并根据重试策略重试
-func (c *DefaultHttpClient) retryRequest(requestFunc func() (*http.Response, error)) (result *http.Response, err error) {
+func (c *DefaultHttpClient[T]) retryRequest(requestFunc func() (*http.Response, error)) (result *http.Response, err error) {
 	for i := 0; ; i++ {
 		result, err = requestFunc()
 		if err == nil || !c.retryStrategy.ShouldRetry(i, err) {
@@ -110,7 +110,7 @@ func (c *DefaultHttpClient) retryRequest(requestFunc func() (*http.Response, err
 	}
 }
 
-func (c *DefaultHttpClient) doPostForm(urlStr string, values url.Values) (response Response, err error) {
+func (c *DefaultHttpClient[T]) doPostForm(urlStr string, values url.Values) (response Response[T], err error) {
 	global.FILE_LOG.Info("发送请求:")
 	//ctx 用Background
 	resp, err := c.retryRequest(func() (*http.Response, error) {
@@ -126,7 +126,7 @@ func (c *DefaultHttpClient) doPostForm(urlStr string, values url.Values) (respon
 		global.FILE_LOG.Error("http请求失败,读取body失败:" + err.Error())
 		return
 	}
-	global.FILE_LOG.Error("应答为:" + string(repBody))
+	global.FILE_LOG.Info("应答为:" + string(repBody))
 	if resp.StatusCode != http.StatusOK {
 		global.FILE_LOG.Error("http请求异常,请求状态为:" + resp.Status)
 		return
@@ -140,7 +140,7 @@ func (c *DefaultHttpClient) doPostForm(urlStr string, values url.Values) (respon
 }
 
 // DoRequest 执行 HTTP 请求
-func (c *DefaultHttpClient) doRequest(req *http.Request) (response Response, err error) {
+func (c *DefaultHttpClient[T]) doRequest(req *http.Request) (response Response[T], err error) {
 	global.FILE_LOG.Info("发送请求:")
 	//ctx 用Background
 	resp, err := c.retryRequest(func() (*http.Response, error) {
@@ -200,8 +200,8 @@ func (s *FixedRetryStrategy) RetryDelay(attempt int) time.Duration {
 	return time.Duration(attempt) * s.delay
 }
 
-func CreateDefault() *DefaultHttpClient {
-	return &DefaultHttpClient{
+func CreateDefault[T any]() *DefaultHttpClient[T] {
+	return &DefaultHttpClient[T]{
 		client:        &http.Client{Timeout: 10 * time.Second},
 		retryStrategy: newFixedRetryStrategy(3, 3*time.Second),
 	}

+ 26 - 69
logic/htfutures/sso_auth.go

@@ -26,67 +26,23 @@ const (
 )
 
 var (
-	base_url            = global.CONFIG.HTFutures.SSOAuthHost
-	client   HttpClient = CreateDefault()
+	base_url                             = global.CONFIG.HTFutures.SSOAuthHost
+	clientToken HttpClient[string]       = CreateDefault[string]()
+	clientUser  HttpClient[UserInfoResp] = CreateDefault[UserInfoResp]()
 )
 
 type UserInfoResp struct {
-	UserId                   string   `json:"userId"`
-	CreatedAt                string   `json:"createdAt"`
-	UpdatedAt                string   `json:"updatedAt"`
-	Status                   string   `json:"status"`
-	WorkStatus               string   `json:"workStatus"`
-	ExternalId               string   `json:"externalId"`
-	Email                    string   `json:"email"`
-	Phone                    string   `json:"phone"`
-	PhoneCountryCode         string   `json:"phoneCountryCode"`
-	Username                 string   `json:"username"`
-	Name                     string   `json:"name"`
-	Nickname                 string   `json:"nickname"`
-	Photo                    string   `json:"photo"`
-	LoginsCount              int      `json:"loginsCount"`
-	LastLogin                string   `json:"lastLogin"`
-	LastIp                   string   `json:"lastIp"`
-	Gender                   string   `json:"gender"`
-	EmailVerified            bool     `json:"emailVerified"`
-	PhoneVerified            bool     `json:"phoneVerified"`
-	PasswordLastSetAt        string   `json:"passwordLastSetAt"`
-	Birthdate                string   `json:"birthdate"`
-	Country                  string   `json:"country"`
-	Province                 string   `json:"province"`
-	City                     string   `json:"city"`
-	Address                  string   `json:"address"`
-	StreetAddress            string   `json:"streetAddress"`
-	PostalCode               string   `json:"postalCode"`
-	Company                  string   `json:"company"`
-	Browser                  string   `json:"browser"`
-	Device                   string   `json:"device"`
-	GivenName                string   `json:"givenName"`
-	FamilyName               string   `json:"familyName"`
-	MiddleName               string   `json:"middleName"`
-	Profile                  string   `json:"profile"`
-	PreferredUsername        string   `json:"preferredUsername"`
-	Website                  string   `json:"website"`
-	Zoneinfo                 string   `json:"zoneinfo"`
-	Locale                   string   `json:"locale"`
-	Formatted                string   `json:"formatted"`
-	Region                   string   `json:"region"`
-	UserSourceType           string   `json:"userSourceType"`
-	UserSourceId             string   `json:"userSourceId"`
-	LastLoginApp             string   `json:"lastLoginApp"`
-	MainDepartmentId         string   `json:"mainDepartmentId"`
-	LastMfaTime              string   `json:"lastMfaTime"`
-	PasswordSecurityLevel    int      `json:"passwordSecurityLevel"`
-	ResetPasswordOnNextLogin bool     `json:"resetPasswordOnNextLogin"`
-	RegisterSource           []string `json:"registerSource"`
-	DepartmentIds            []string `json:"departmentIds"`
-	Identities               []string `json:"identities"`
-	IdentityNumber           string   `json:"identityNumber"`
-	CustomData               string   `json:"customData"`
-	MetadataSource           string   `json:"metadataSource"`
-	PostIdList               string   `json:"postIdList"`
-	StatusChangedAt          string   `json:"statusChangedAt"`
-	TenantId                 string   `json:"tenantId"`
+	UserId     string `json:"userId"`
+	Status     string `json:"status"`
+	WorkStatus string `json:"workStatus"`
+	Username   string `json:"username"`
+	Name       string `json:"name"`
+	Nickname   string `json:"nickname"`
+	LastLogin  string `json:"lastLogin"`
+	LastIp     string `json:"lastIp"`
+	GivenName  string `json:"givenName"`
+	FamilyName string `json:"familyName"`
+	MiddleName string `json:"middleName"`
 }
 
 func ssoLogin(code string, systemType string) (token string, userInfo UserInfoResp, err error) {
@@ -148,7 +104,6 @@ func LoginCRM(code string) (resp response.LoginResp, err error, errMsg string) {
 		global.FILE_LOG.Error("生成登录session失败:" + err.Error())
 		return
 	}
-
 	// 记录两方session的绑定信息
 	thirdSession := &eta.SysThirdSession{
 		ID:               0,
@@ -218,7 +173,8 @@ func LoginEta(code string) (resp response.LoginResp, err error, errMsg string) {
 		global.FILE_LOG.Error("生成登录session失败:" + err.Error())
 		return
 	}
-
+	str, _ := json.Marshal(resp)
+	global.FILE_LOG.Info(fmt.Sprintf("session json 序列化结果为:%s", str))
 	// 记录两方session的绑定信息
 	thirdSession := &eta.SysThirdSession{
 		ID:               0,
@@ -440,12 +396,12 @@ func GetToken(code string, systemType string) (token string, err error) {
 	params := url.Values{}
 	params.Add(authCode, code)
 	params.Add(sysType, systemType)
-	resp, err := client.PostFromData(urlStr, params)
+	resp, err := clientToken.PostFromData(urlStr, params)
 	if err != nil {
 		global.FILE_LOG.Error("获取token失败:" + err.Error())
 		return
 	}
-	if resp.Code != 200 {
+	if resp.Code != 0 {
 		global.FILE_LOG.Error("请求接口应答异常:" + resp.Message)
 		err = errors.New("接口异常应答:" + resp.Message)
 		return
@@ -459,20 +415,21 @@ func GetUserInfo(token string, systemType string) (userinfo UserInfoResp, err er
 	params := url.Values{}
 	params.Add(accessToken, token)
 	params.Add(sysType, systemType)
-	resp, err := client.PostFromData(urlStr, params)
+	resp, err := clientUser.PostFromData(urlStr, params)
 	if err != nil {
 		global.FILE_LOG.Error("获取用户信息失败:" + err.Error())
 		return
 	}
-	if resp.Code != 200 {
+	if resp.Code != 0 {
 		global.FILE_LOG.Error("请求接口应答异常:" + resp.Message)
 		err = errors.New("接口异常应答:" + resp.Message)
 		return
 	}
-	err = json.Unmarshal([]byte(resp.Data), &userinfo)
-	if err != nil {
-		global.FILE_LOG.Error("解析用户信息失败:" + err.Error())
-		return
-	}
+	userinfo = resp.Data
+	//err = json.Unmarshal([]byte(resp.Data), &userinfo)
+	//if err != nil {
+	//	global.FILE_LOG.Error("解析用户信息失败:" + err.Error())
+	//	return
+	//}
 	return
 }

+ 8 - 0
main.go

@@ -6,5 +6,13 @@ import (
 
 // @BasePath /
 func main() {
+	//	resp := `{"data":{"userId":"66bdb5fbf6c885e788a745e4","createdAt":"2024-08-15T08:02:03.829Z","updatedAt":"2024-09-19T01:24:30.315Z","status":"ACTIVATED","workStatus":"CLOSED","externalId":null,"email":null,"phone":null,"phoneCountryCode":null,"username":"iirphz","name":"洪泽账号","nickname":null,"photo":"//auth-files.htfutures.com/authing-console/default-user-avatar.png","loginsCount":6,"lastLogin":"2024-09-19T01:24:30.000Z","lastIp":"10.219.161.70","gender":"U","emailVerified":false,"phoneVerified":false,"passwordLastSetAt":null,"birthdate":null,"country":null,"province":null,"city":null,"address":null,"streetAddress":null,"postalCode":null,"company":null,"browser":null,"device":null,"givenName":null,"familyName":null,"middleName":null,"profile":null,"preferredUsername":null,"website":null,"zoneinfo":null,"locale":null,"formatted":null,"region":null,"userSourceType":"ADMIN_CREATED","userSourceId":null,"lastLoginApp":"6658225e2f0010df5906d4ec","mainDepartmentId":null,"lastMfaTime":null,"passwordSecurityLevel":1,"resetPasswordOnNextLogin":false,"registerSource":["import:manual"],"departmentIds":[],"identities":[],"identityNumber":null,"customData":null,"metadataSource":null,"postIdList":null,"statusChangedAt":"2024-08-26T08:28:17.679Z","tenantId":null},"code":0,"message":"success","traceId":"44bef1abdb90463e89ec8dfe77c990f2"}
+	//`
+	//	var userInfo htfutures.Response[htfutures.UserInfoResp]
+	//	err := json.Unmarshal([]byte(resp), &userInfo)
+	//	if err != nil {
+	//		fmt.Sprintln(err)
+	//		return
+	//	}
 	core.RunServe()
 }

+ 16 - 17
models/ht/oa/hrm_department.go

@@ -2,8 +2,6 @@ package oa
 
 import (
 	"eta/eta_bridge/global"
-	"fmt"
-	"github.com/astaxie/beego/orm"
 )
 
 type HrmDepartment struct {
@@ -17,7 +15,7 @@ type HrmDepartment struct {
 
 type HrmDepartmentOrm struct {
 	Id              int    `orm:"column(ID)"`
-	Departmentname  string `orm:"column(DEPARTMENTNAME)"`
+	Departmentname  []byte `orm:"column(DEPARTMENTNAME);type(varchar(200))"`
 	Subcompanyid1   int    `orm:"column(SUBCOMPANYID1)"`
 	Supdepid        int    `orm:"column(SUPDEPID)"`
 	Tlevel          int    `orm:"column(TLEVEL)"`
@@ -35,18 +33,19 @@ func GetDepartMentList() (list []HrmDepartment, err error) {
 
 	return
 }
-func GetDepartMentListWithOrm() (list []*HrmDepartmentOrm, err error) {
-	o := orm.NewOrm()
-	err = o.Using("default")
-	if err != nil {
-		fmt.Sprintln("Using orm error", err)
-		return nil, err
-	}
-	sql := `select ID,DEPARTMENTNAME,SUBCOMPANYID1,SUPDEPID,TLEVEL,SHOWORDEROFTREE from ECOLOGY_TARGET.HRMDEPARTMENT where CANCELED IS NULL`
-	_, err = o.Raw(sql).QueryRows(&list)
-	if err != nil {
-		global.FILE_LOG.Error("获取子公司列表失败")
-	}
 
-	return
-}
+//func GetDepartMentListWithOrm() (list []*HrmDepartmentOrm, err error) {
+//	o := orm.NewOrm()
+//	err = o.Using("default")
+//	if err != nil {
+//		fmt.Sprintln("Using orm error", err)
+//		return nil, err
+//	}
+//	sql := `select ID,DEPARTMENTNAME,SUBCOMPANYID1,SUPDEPID,TLEVEL,SHOWORDEROFTREE from HRMDEPARTMENT where CANCELED IS NULL`
+//	_, err = o.Raw(sql).QueryRows(&list)
+//	if err != nil {
+//		global.FILE_LOG.Error("获取子公司列表失败")
+//	}
+//
+//	return
+//}

+ 3 - 3
models/ht/wx_crm/sys_role.go

@@ -6,8 +6,8 @@ import (
 
 // SysRole 角色表
 type SysRole struct {
-	SysRoleId   int    `gorm:"primaryKey;column:role_id;type:int(11);not null" json:"role_id"`
-	SysRoleName string `gorm:"column:role_name;type:varchar(100)" json:"role_name"`
+	SysRoleId   int    `gorm:"primaryKey;column:sys_role_id;type:int(11);not null" json:"role_id"`
+	SysRoleName string `gorm:"column:sys_role_name;type:varchar(100)" json:"role_name"`
 }
 
 func (m *SysRole) TableName() string {
@@ -16,6 +16,6 @@ func (m *SysRole) TableName() string {
 
 // GetSysRoleById 主键获取角色
 func GetSysRoleById(roleId int) (item *SysRole, err error) {
-	err = global.MYSQL["ht_crm"].Where("role_id = ?", roleId).First(&item).Error
+	err = global.MYSQL["ht_crm"].Where("sys_role_id = ?", roleId).First(&item).Error
 	return
 }

+ 0 - 1
routers/htsso.go

@@ -26,5 +26,4 @@ func initCRMSSO(r *gin.RouterGroup) {
 	//group := r.Group("ht/").Use(middleware.BaseAuthCheck())
 	group := r.Group("ht/")
 	group.POST("login", controller.SSOLogin)
-	group.POST("test", controller.Test)
 }

+ 5 - 5
task/htfutures/sync_staff_task.go

@@ -102,11 +102,11 @@ func SyncETA() {
 			continue
 		}
 		sysUser := eta.Admin{
-			AdminName:      item.LOGINID,
-			RealName:       item.LASTNAME,
-			Enabled:        1,
-			Email:          item.EMAIL,
-			Role:           "63",
+			AdminName: item.LOGINID,
+			RealName:  item.LASTNAME,
+			Enabled:   1,
+			Email:     item.EMAIL,
+			//Role:           role.RoleName,
 			Mobile:         item.MOBILE,
 			RoleType:       0,
 			RoleId:         role.RoleId,