Roc 7 months ago
parent
commit
3af694bf4c
45 changed files with 612 additions and 3772 deletions
  1. 10 6
      config/config.go
  2. 0 107
      controller/xiangyu/auth.go
  3. 0 63
      controller/xiangyu/crm.go
  4. 0 126
      controller/xiangyu/index.go
  5. 0 56
      controller/xiangyu/user.go
  6. BIN
      eta_email_analysis.tar.gz
  7. 2 4
      global/global.go
  8. 1 1
      init_serve/router.go
  9. 2 1
      init_serve/task.go
  10. 0 102
      logic/xiangyu/auth.go
  11. 0 105
      logic/xiangyu/crm.go
  12. 0 73
      logic/xiangyu/index.go
  13. 0 439
      logic/xiangyu/user.go
  14. 0 159
      middleware/auth.go
  15. 1 1
      middleware/token.go
  16. 0 25
      models/crm/open_api_user.go
  17. 12 24
      models/eta/admin.go
  18. 0 36
      models/eta/crm_config.go
  19. 0 49
      models/eta/sys_department.go
  20. 0 57
      models/eta/sys_group.go
  21. 0 46
      models/eta/sys_role.go
  22. 0 39
      models/eta/sys_session.go
  23. 0 36
      models/eta/sys_third_session.go
  24. 0 25
      models/eta/sys_user_login_record.go
  25. 0 36
      models/index/base.go
  26. 0 59
      models/index/business_sys_interaction_log.go
  27. 0 44
      models/index/edb_data_business.go
  28. 0 35
      models/index/edb_update_log.go
  29. 0 41
      models/rddp/report_attachment.go
  30. 0 39
      models/rddp/sys_session.go
  31. 0 25
      models/rddp/sys_user_login_record.go
  32. 118 0
      models/report/outside_report.go
  33. 61 0
      models/report/outside_report_attachment.go
  34. 0 52
      routers/xiangyu.go
  35. 0 22
      services/company.go
  36. 145 31
      services/pcsg/mail.go
  37. 0 102
      services/session.go
  38. 0 372
      services/xiangyu/auth.go
  39. 0 228
      services/xiangyu/crm.go
  40. 0 402
      services/xiangyu/index.go
  41. 0 578
      services/xiangyu/user.go
  42. 24 0
      utils/common.go
  43. 3 73
      utils/constants.go
  44. 87 0
      utils/mail/charset_reader.go
  45. 146 53
      utils/mail/imap.go

+ 10 - 6
config/config.go

@@ -91,12 +91,16 @@ type Xiangyu struct {
 }
 
 type Email struct {
-	Host          string `mapstructure:"host" json:"host" yaml:"host" description:"邮件服务器"`
-	Port          int    `mapstructure:"port" json:"port" yaml:"port" description:"邮件服务器端口"`
-	UserName      string `mapstructure:"username" json:"username" yaml:"username" description:"邮件服务器用户名"`
-	Password      string `mapstructure:"password" json:"password" yaml:"password" description:"邮件服务器密码"`
-	Folder        string `mapstructure:"folder" json:"folder" yaml:"folder" description:"邮件服务器文件夹"`
-	ReadBatchSize int    `mapstructure:"read-batch-size" json:"read-batch-size" yaml:"read-batch-size" description:"邮件读取批次"`
+	Host                          string   `mapstructure:"host" json:"host" yaml:"host" description:"邮件服务器"`
+	Port                          int      `mapstructure:"port" json:"port" yaml:"port" description:"邮件服务器端口"`
+	UserName                      string   `mapstructure:"username" json:"username" yaml:"username" description:"邮件服务器用户名"`
+	Password                      string   `mapstructure:"password" json:"password" yaml:"password" description:"邮件服务器密码"`
+	Folder                        string   `mapstructure:"folder" json:"folder" yaml:"folder" description:"邮件服务器文件夹"`
+	ReadBatchSize                 int      `mapstructure:"read-batch-size" json:"read-batch-size" yaml:"read-batch-size" description:"邮件读取批次"`
+	IgnoreEmail                   []string `mapstructure:"ignore-email" json:"ignore-email" yaml:"ignore-email" description:"邮件过滤,不读取这些邮箱"`
+	IgnoreEmailCaseSensitive      []string `mapstructure:"ignore-email-case-sensitive" json:"ignore-email-case-sensitive" yaml:"ignore-email-case-sensitive" description:"邮件过滤,不读取这些邮箱,大小写敏感"`
+	IgnoreEmailTitle              []string `mapstructure:"ignore-email-title" json:"ignore-email-title" yaml:"ignore-email-title" description:"邮件过滤,不读取这些标题"`
+	IgnoreEmailTitleCaseSensitive []string `mapstructure:"ignore-email-title-case-sensitive" json:"ignore-email-title-case-sensitive" yaml:"ignore-email-title-case-sensitive" description:"邮件过滤,不读取这些标题,大小写敏感"`
 }
 
 type Oss struct {

+ 0 - 107
controller/xiangyu/auth.go

@@ -1,107 +0,0 @@
-package xiangyu
-
-import (
-	"eta/eta_email_analysis/controller/resp"
-	"eta/eta_email_analysis/global"
-	"eta/eta_email_analysis/logic/xiangyu"
-	xyReq "eta/eta_email_analysis/models/request/xiangyu"
-	"github.com/gin-gonic/gin"
-	"github.com/go-playground/validator/v10"
-)
-
-// GetToken
-// @Description: 获取token
-// @author: Roc
-// @receiver xc
-// @datetime 2024-01-23 17:06:34
-// @param c *gin.Context
-func (xc *XiangyuController) GetToken(c *gin.Context) {
-	var req xyReq.GetTokenReq
-	if e := c.Bind(&req); e != nil {
-		err, ok := e.(validator.ValidationErrors)
-		if !ok {
-			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
-			return
-		}
-		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
-		return
-	}
-	if req.Code == "" {
-		resp.FailMsg("请传入code码", "请输入指标code码", c)
-		return
-	}
-
-	result, err, errMsg := xiangyu.LoginEta(req.Code)
-
-	if err != nil {
-		resp.FailData(errMsg, err.Error(), c)
-		return
-	}
-	resp.OkData("获取成功", result, c)
-
-	return
-}
-
-// RefreshToken
-// @Description: 刷新token
-// @author: Roc
-// @receiver xc
-// @datetime 2024-01-23 17:06:25
-// @param c *gin.Context
-func (xc *XiangyuController) RefreshToken(c *gin.Context) {
-	var req xyReq.RefreshTokenReq
-	if e := c.Bind(&req); e != nil {
-		err, ok := e.(validator.ValidationErrors)
-		if !ok {
-			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
-			return
-		}
-		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
-		return
-	}
-	if req.RefreshToken == "" {
-		resp.FailMsg("请传入refresh_token", "请传入refresh_token", c)
-		return
-	}
-
-	err := xiangyu.RefreshToken(req.RefreshToken)
-
-	if err != nil {
-		resp.FailData("参数解析失败", err.Error(), c)
-		return
-	}
-	resp.Ok("刷新成功", c)
-	return
-}
-
-// RevokeToken
-// @Description: 销毁token
-// @author: Roc
-// @receiver xc
-// @datetime 2024-01-23 17:06:12
-// @param c *gin.Context
-func (xc *XiangyuController) RevokeToken(c *gin.Context) {
-	var req xyReq.RevokeTokenReq
-	if e := c.Bind(&req); e != nil {
-		err, ok := e.(validator.ValidationErrors)
-		if !ok {
-			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
-			return
-		}
-		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
-		return
-	}
-	if req.Token == "" {
-		resp.FailMsg("请传入token", "请传入token", c)
-		return
-	}
-
-	err := xiangyu.RevokeToken(req.Token)
-
-	if err != nil {
-		resp.FailData("参数解析失败", err.Error(), c)
-		return
-	}
-	resp.Ok("销毁成功", c)
-	return
-}

+ 0 - 63
controller/xiangyu/crm.go

@@ -1,63 +0,0 @@
-package xiangyu
-
-import (
-	"eta/eta_email_analysis/controller/resp"
-	"eta/eta_email_analysis/global"
-	"eta/eta_email_analysis/logic/xiangyu"
-	"eta/eta_email_analysis/models/index"
-	xiangyuSrc "eta/eta_email_analysis/services/xiangyu"
-	"github.com/gin-gonic/gin"
-	"github.com/go-playground/validator/v10"
-)
-
-// GetCrmData
-// @Description: 获取crm数据
-// @author: Roc
-// @receiver xc
-// @datetime 2024-5-14 13:09:30
-// @param c *gin.Context
-func (xc *XiangyuController) GetCrmData(c *gin.Context) {
-	var req index.GetBusinessDataReq
-	if e := c.Bind(&req); e != nil {
-		err, ok := e.(validator.ValidationErrors)
-		if !ok {
-			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
-			return
-		}
-		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
-		return
-	}
-
-	if req.IndexCode == `` && req.IndexPkgCode == `` {
-		resp.Fail("指标编码或者指标包编码不允许为空", c)
-	}
-	//if req.Partition == `` {
-	//	resp.Fail("数据分区参数不允许为空", c)
-	//}
-
-	xyReq := xiangyuSrc.PostGetIndexDataParamReq{
-		PageNum:                   req.CurrentIndex,
-		PageSize:                  req.PageSize,
-		AssetCd:                   req.IndexCode,
-		AssetPkgCd:                req.IndexPkgCode,
-		DataDt:                    "",
-		StartDt:                   "",
-		EndDt:                     "",
-		Sort:                      "",
-		DataSourceType:            req.DataSourceType,
-		InfoLastUpdateStartTime:   req.InfoLastUpdateStartTime,
-		InfoLastUpdateEndTime:     req.InfoLastUpdateEndTime,
-		DetailLastUpdateStartTime: req.DetailLastUpdateStartTime,
-		DetailLastUpdateEndTime:   req.DetailLastUpdateEndTime,
-	}
-
-	dataResp, err, errMsg := xiangyu.PostGetIndexData(xyReq)
-
-	if err != nil {
-		resp.FailData(errMsg, err.Error(), c)
-		return
-	}
-	resp.OkData("同步成功", dataResp, c)
-
-	return
-}

+ 0 - 126
controller/xiangyu/index.go

@@ -1,126 +0,0 @@
-package xiangyu
-
-import (
-	"eta/eta_email_analysis/controller/resp"
-	"eta/eta_email_analysis/global"
-	"eta/eta_email_analysis/logic/xiangyu"
-	xiangyuSrc "eta/eta_email_analysis/services/xiangyu"
-	"github.com/gin-gonic/gin"
-	"github.com/go-playground/validator/v10"
-)
-
-// PushIndexDataResp
-// @Description: 指标信息推送
-// @author: Roc
-// @receiver xc
-// @datetime 2024-02-27 17:53:24
-// @param c *gin.Context
-func (xc *XiangyuController) PushIndexDataResp(c *gin.Context) {
-	var req xiangyuSrc.PushBaseParamReq
-	if e := c.Bind(&req); e != nil {
-		err, ok := e.(validator.ValidationErrors)
-		if !ok {
-			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
-			return
-		}
-		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
-		return
-	}
-
-	err, errMsg := xiangyu.PushIndexDataResp(req)
-
-	if err != nil {
-		resp.FailData(errMsg, err.Error(), c)
-		return
-	}
-	resp.OkData("同步成功", "", c)
-
-	return
-}
-
-// PushIndexValueDataResp
-// @Description: 指标日期值信息推送
-// @author: Roc
-// @receiver xc
-// @datetime 2024-02-27 17:53:24
-// @param c *gin.Context
-func (xc *XiangyuController) PushIndexValueDataResp(c *gin.Context) {
-	var req xiangyuSrc.PushBaseParamReq
-	if e := c.Bind(&req); e != nil {
-		err, ok := e.(validator.ValidationErrors)
-		if !ok {
-			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
-			return
-		}
-		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
-		return
-	}
-
-	err, errMsg := xiangyu.PushEdbValueDataResp(req)
-
-	if err != nil {
-		resp.FailData(errMsg, err.Error(), c)
-		return
-	}
-	resp.OkData("同步成功", "", c)
-
-	return
-}
-
-// PushClassifyDataResp
-// @Description: 指标分类信息推送
-// @author: Roc
-// @receiver xc
-// @datetime 2024-02-27 17:53:24
-// @param c *gin.Context
-func (xc *XiangyuController) PushClassifyDataResp(c *gin.Context) {
-	var req xiangyuSrc.PushBaseParamReq
-	if e := c.Bind(&req); e != nil {
-		err, ok := e.(validator.ValidationErrors)
-		if !ok {
-			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
-			return
-		}
-		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
-		return
-	}
-
-	err, errMsg := xiangyu.PushClassifyDataResp(req)
-
-	if err != nil {
-		resp.FailData(errMsg, err.Error(), c)
-		return
-	}
-	resp.OkData("同步成功", "", c)
-
-	return
-}
-
-// PushEdbClassifyDataResp
-// @Description: 指标与分类的关系信息推送
-// @author: Roc
-// @receiver xc
-// @datetime 2024-02-27 17:53:24
-// @param c *gin.Context
-func (xc *XiangyuController) PushEdbClassifyDataResp(c *gin.Context) {
-	var req xiangyuSrc.PushBaseParamReq
-	if e := c.Bind(&req); e != nil {
-		err, ok := e.(validator.ValidationErrors)
-		if !ok {
-			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
-			return
-		}
-		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
-		return
-	}
-
-	err, errMsg := xiangyu.PushEdbClassifyDataResp(req)
-
-	if err != nil {
-		resp.FailData(errMsg, err.Error(), c)
-		return
-	}
-	resp.OkData("同步成功", "", c)
-
-	return
-}

+ 0 - 56
controller/xiangyu/user.go

@@ -1,56 +0,0 @@
-package xiangyu
-
-import (
-	"eta/eta_email_analysis/controller/resp"
-	"eta/eta_email_analysis/logic/xiangyu"
-	"github.com/gin-gonic/gin"
-	"sync"
-)
-
-// XiangyuController 象屿指标
-type XiangyuController struct{}
-
-// 同步用户锁,防止重复同步,不管是全量还是增量,都是同一时间只能一个同步
-var lockSyncUser sync.Mutex
-
-// SyncUser
-// @Description: 全量同步用户
-// @author: Roc
-// @receiver xc
-// @datetime 2024-01-22 15:51:25
-// @param c *gin.Context
-func (xc *XiangyuController) SyncUser(c *gin.Context) {
-	lockSyncUser.Lock()
-	defer func() {
-		lockSyncUser.Unlock()
-	}()
-	err := xiangyu.SyncUser()
-	if err != nil {
-		resp.FailData("同步失败", err.Error(), c)
-		return
-	}
-	resp.Ok("同步成功", c)
-
-	return
-}
-
-// PullUser
-// @Description: 增量同步用户
-// @author: Roc
-// @receiver xc
-// @datetime 2024-01-23 17:13:07
-// @param c *gin.Context
-func (xc *XiangyuController) 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
-}

BIN
eta_email_analysis.tar.gz


+ 2 - 4
global/global.go

@@ -1,7 +1,6 @@
 package global
 
 import (
-	"database/sql"
 	"eta/eta_email_analysis/config"
 	"eta/eta_email_analysis/utils"
 	"fmt"
@@ -20,15 +19,14 @@ var (
 	MYSQL_LOG     io.Writer
 	DEFAULT_MYSQL *gorm.DB //默认数据库连接配置
 	//Redis         *redis.Client //redis链接
-	OracleJy *sql.DB //嘉悦物产数据库连接
 
 	//Rc *cache.Cache //redis缓存
 	Rc utils.RedisClient //redis缓存
 	Re error             //redis错误
 )
 
-const ConfigFile = "config/config_debug.yaml" //本地(测试)环境下的配置文件地址
-const ProConfigFile = "config/config.yaml"    //生产环境下的配置文件地址
+const ConfigFile = "config/config_debug.yaml"                                   //本地(测试)环境下的配置文件地址
+const ProConfigFile = "/home/code/config/eta_email_analysis/config/config.yaml" //生产环境下的配置文件地址
 
 func init() {
 	v := viper.New()

+ 1 - 1
init_serve/router.go

@@ -18,6 +18,6 @@ func InitRouter() (r *gin.Engine) {
 
 	rBase := r.Group("api/")
 	routers.InitAuth(rBase)
-	routers.InitXiangyu(rBase)
+	//routers.InitXiangyu(rBase)
 	return
 }

+ 2 - 1
init_serve/task.go

@@ -2,6 +2,7 @@ package init_serve
 
 import (
 	"eta/eta_email_analysis/global"
+	"eta/eta_email_analysis/services/pcsg"
 	"github.com/robfig/cron/v3"
 )
 
@@ -23,7 +24,7 @@ func InitTask() {
 	//	}
 	//}
 
-	//pcsg.ListenMail()
+	pcsg.ListenMail()
 
 	c.Start()
 }

+ 0 - 102
logic/xiangyu/auth.go

@@ -1,102 +0,0 @@
-package xiangyu
-
-import (
-	"eta/eta_email_analysis/models/eta"
-	"eta/eta_email_analysis/models/response"
-	"eta/eta_email_analysis/services"
-	"eta/eta_email_analysis/services/xiangyu"
-	"fmt"
-	"time"
-)
-
-// LoginEta
-// @Description: 获取eta的session
-// @author: Roc
-// @datetime 2024-01-23 17:44:15
-// @param code string
-// @return resp response.LoginResp
-// @return err error
-// @return errMsg string
-func LoginEta(code string) (resp response.LoginResp, err error, errMsg string) {
-	//  获取xiangyu token
-	tokenResp, err := xiangyu.GetToken(code)
-	if err != nil {
-		return
-	}
-
-	//// 获取eta用户信息
-	//adminInfo, err := eta.GetSysUserByOutId(tokenResp.Uid)
-	//if err != nil {
-	//	return
-	//}
-
-	// 获取用户信息
-	userInfoResp, err := xiangyu.GetUserInfo(tokenResp.AccessToken)
-	if err != nil {
-		return
-	}
-
-	// 获取eta用户信息
-	adminInfo, err := eta.GetSysUserByAdminName(userInfoResp.LoginName)
-	if err != nil {
-		return
-	}
-
-	// 生成登录session
-	resp, session, err, errMsg := services.CreateEtaSession(adminInfo)
-	if err != nil {
-		return
-	}
-
-	// 记录两方session的绑定信息
-	thirdSession := &eta.SysThirdSession{
-		ID:               0,
-		SysUserID:        uint64(session.SysUserId),
-		UserName:         session.UserName,
-		AccessToken:      session.AccessToken,
-		ThirdAccessToken: tokenResp.AccessToken,
-		//ThirdRefreshToken: tokenResp.RefreshToken,
-		ThirdExpiredTime: time.Now().Add(time.Duration(tokenResp.ExpiresIn-100) * time.Second),
-		CreatedTime:      time.Now(),
-		LastUpdatedTime:  time.Now(),
-	}
-	eta.AddSysThirdSession(thirdSession)
-
-	return
-}
-
-func GetToken(code string) (err error) {
-	fmt.Println(xiangyu.GetToken(code))
-
-	return
-}
-
-func GetUserInfo(token string) (err error) {
-	fmt.Println(xiangyu.GetUserInfo(token))
-
-	return
-}
-
-func CheckToken(token string) (err error) {
-	fmt.Println(xiangyu.CheckToken(token))
-
-	return
-}
-
-func GetTokenInfo(token string) (err error) {
-	fmt.Println(xiangyu.GetTokenInfo(token))
-
-	return
-}
-
-func RefreshToken(token string) (err error) {
-	fmt.Println(xiangyu.RefreshToken(token))
-
-	return
-}
-
-func RevokeToken(token string) (err error) {
-	fmt.Println(xiangyu.RevokeToken(token))
-
-	return
-}

+ 0 - 105
logic/xiangyu/crm.go

@@ -1,105 +0,0 @@
-package xiangyu
-
-import (
-	"eta/eta_email_analysis/global"
-	"eta/eta_email_analysis/models/index"
-	"eta/eta_email_analysis/services/xiangyu"
-	"eta/eta_email_analysis/utils"
-	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
-	"strings"
-	"time"
-)
-
-// PostGetIndexData
-// @Description: 获取数据
-// @author: Roc
-// @datetime 2024-05-14 17:23:39
-// @param data xiangyu.PostGetIndexDataParamReq
-// @return dataResp xiangyu.CrmDataResp
-// @return err error
-// @return errMsg string
-func PostGetIndexData(data xiangyu.PostGetIndexDataParamReq) (dataResp index.GetBusinessDataResp, err error, errMsg string) {
-	errMsgList := make([]string, 0)
-	defer func() {
-		if len(errMsgList) > 0 {
-			tips := "PostGetIndexData-获取CRM数据失败, ErrMsg:\n" + strings.Join(errMsgList, "\n")
-			global.FILE_LOG.Error(tips)
-		}
-	}()
-	dataResp = index.GetBusinessDataResp{
-		List: make([]index.PushBusinessIndex, 0),
-	}
-	errMsg = `获取失败`
-	resp, err := xiangyu.PostGetCrmData(data)
-	if err != nil {
-		return
-	}
-
-	dataResp.Paging = paging.GetPaging(resp.PageNum, resp.PageSize, resp.TotalNum)
-
-	// 列表数据
-
-	businessIndexMap := make(map[string]index.PushBusinessIndex)
-	//index.PushBusinessIndex
-	for _, v := range resp.Rows {
-		tmpDate, tmpErr := time.ParseInLocation(utils.FormatDateUnSpace, v.DataDt, time.Local)
-		if tmpErr != nil {
-			errMsgList = append(errMsgList, fmt.Sprintf("指标日期转换失败,指标编码:%s;日期:%s", v.AssetCd, v.DataDt))
-			continue
-		}
-
-		frequency := handleXyFrequency(v.FrequencyName)
-		if frequency == `` {
-			errMsgList = append(errMsgList, fmt.Sprintf("指标频度异常,指标编码:%s;日期:%s", v.AssetCd, v.FrequencyName))
-			continue
-		}
-
-		businessIndex, ok := businessIndexMap[v.AssetCd]
-
-		//
-		if !ok {
-			dataList := make([]index.AddBusinessData, 0)
-			businessIndex = index.PushBusinessIndex{
-				IndexCode:            v.AssetCd,
-				IndexName:            v.AssetName,
-				Unit:                 v.UnitName,
-				Frequency:            frequency,
-				SourceName:           v.DataSourceType,
-				Remark:               "",
-				DetailDataCreateTime: v.DetailDataStockInTime,
-				DataList:             dataList,
-			}
-		}
-
-		businessIndex.DataList = append(businessIndex.DataList, index.AddBusinessData{
-			Value: v.Price,
-			Date:  tmpDate.Format(utils.FormatDate),
-		})
-		businessIndexMap[v.AssetCd] = businessIndex
-	}
-
-	// 将处理后的指标返回
-	for _, v := range businessIndexMap {
-		dataResp.List = append(dataResp.List, v)
-	}
-
-	return
-}
-
-// handleXyFrequency
-// @Description: 处理象屿频度问题
-// @author: Roc
-// @datetime 2024-05-14 18:15:28
-// @param frequencyName string
-// @return frequency string
-func handleXyFrequency(frequencyName string) (frequency string) {
-	switch frequencyName {
-	case "季度", "半年度", "年度", "日度", "周度", "旬度", "月度 ":
-		frequency = frequencyName
-	case "每天", "每交易日":
-		frequency = "日度"
-	}
-
-	return
-}

+ 0 - 73
logic/xiangyu/index.go

@@ -1,73 +0,0 @@
-package xiangyu
-
-import (
-	"eta/eta_email_analysis/services/xiangyu"
-)
-
-// PushIndexDataResp
-// @Description: 推送指标信息数据
-// @author: Roc
-// @datetime 2024-02-28 17:48:01
-// @param data xiangyu.PushBaseParamReq
-// @return err error
-// @return errMsg string
-func PushIndexDataResp(data xiangyu.PushBaseParamReq) (err error, errMsg string) {
-	//  获取xiangyu token
-
-	errMsg = `同步失败`
-	data.TableCode = "CY_DATA_ASSETS_INFO" // 固定字段
-	_, err = xiangyu.PushIndexData(data)
-	//fmt.Println(resp)
-
-	return
-}
-
-// PushEdbValueDataResp
-// @Description: 推送指标对应的日期值数据
-// @author: Roc
-// @datetime 2024-02-29 09:39:07
-// @param data xiangyu.PushBaseParamReq
-// @return err error
-// @return errMsg string
-func PushEdbValueDataResp(data xiangyu.PushBaseParamReq) (err error, errMsg string) {
-	//  获取xiangyu token
-
-	errMsg = `同步失败`
-	data.TableCode = "CY_DATA_ASSETS_DETAIL" // 固定字段
-	_, err = xiangyu.PushEdbValue(data)
-	//fmt.Println(resp)
-
-	return
-}
-
-// PushClassifyDataResp
-// @Description: 推送分类数据
-// @author: Roc
-// @datetime 2024-02-29 09:39:07
-// @param data xiangyu.PushBaseParamReq
-// @return err error
-// @return errMsg string
-func PushClassifyDataResp(data xiangyu.PushBaseParamReq) (err error, errMsg string) {
-	errMsg = `同步失败`
-	data.TableCode = "CY_CATALOG_CLASSIFY" // 固定字段
-	_, err = xiangyu.PushClassify(data)
-	//fmt.Println(resp)
-
-	return
-}
-
-// PushEdbClassifyDataResp
-// @Description: 推送指标分类数据
-// @author: Roc
-// @datetime 2024-02-29 09:39:07
-// @param data xiangyu.PushBaseParamReq
-// @return err error
-// @return errMsg string
-func PushEdbClassifyDataResp(data xiangyu.PushBaseParamReq) (err error, errMsg string) {
-	errMsg = `同步失败`
-	data.TableCode = "CY_CATALOG_INDEX_ASSOCIATE" // 固定字段
-	_, err = xiangyu.PushBase(data)
-	//fmt.Println(resp)
-
-	return
-}

+ 0 - 439
logic/xiangyu/user.go

@@ -1,439 +0,0 @@
-package xiangyu
-
-import (
-	"errors"
-	"eta/eta_email_analysis/global"
-	"eta/eta_email_analysis/models/eta"
-	"eta/eta_email_analysis/services/xiangyu"
-	"fmt"
-	"strings"
-	"time"
-)
-
-// SyncUser
-// @Description: 全量同步用户
-// @author: Roc
-// @datetime 2024-01-22 10:28:39
-// @return err error
-func SyncUser() (err error) {
-	if global.CONFIG.Xiangyu.DefaultRoleId <= 0 {
-		err = errors.New("默认角色ID不能为空")
-		return
-	}
-	// 指定的角色
-	roleInfo, err := eta.GetSysRoleById(global.CONFIG.Xiangyu.DefaultRoleId)
-	if err != nil {
-		return
-	}
-
-	// 获取所有部门和分组
-	departmentMap, departmentNameMap, groupMap, groupNameMap, userMap, err := getAllDepartmentAndGroup()
-	if err != nil {
-		return
-	}
-
-	// 获取token
-	tokenId, err := xiangyu.Login()
-	if err != nil {
-		return
-	}
-	//tokenId := `228f7024-1966-47bf-86b5-9ec61ac149ed`
-
-	defer func() {
-		// 获取用户列表
-		tmpErr := xiangyu.Logout(tokenId)
-		if tmpErr != nil {
-			fmt.Println("退出失败:", tmpErr.Error())
-		}
-	}()
-
-	for {
-		// 获取用户列表
-		userResp, tmpErr := xiangyu.SyncTask(tokenId)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-
-		// 没有数据了,那么结束同步了
-		if userResp == nil || userResp.Out.ObjectCode == `` {
-			return
-		}
-
-		// 是否同步成功
-		var isSync bool
-
-		var etaUserId, message string
-
-		//  处理用户信息,将象屿用户与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)
-			}
-		} else {
-			message = tmpErr.Error()
-		}
-
-		// 结束单次同步
-		err = xiangyu.SyncFinish(tokenId, userResp.Out.ObjectCode, userResp.Out.ObjectType, userResp.Out.Id, etaUserId, message, isSync)
-		if err != nil {
-			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不能为空")
-		return
-	}
-	defer func() {
-		if err != nil {
-			global.FILE_LOG.Info("同步增量用户失败:" + err.Error())
-		}
-	}()
-
-	// 指定的角色
-	roleInfo, err := eta.GetSysRoleById(global.CONFIG.Xiangyu.DefaultRoleId)
-	if err != nil {
-		return
-	}
-
-	// 获取所有部门和分组
-	departmentMap, departmentNameMap, groupMap, groupNameMap, userMap, err := getAllDepartmentAndGroup()
-	if err != nil {
-		return
-	}
-
-	// 获取token
-	tokenId, err := xiangyu.Login()
-	if err != nil {
-		return
-	}
-
-	defer func() {
-		// 获取用户列表
-		tmpErr := xiangyu.Logout(tokenId)
-		if tmpErr != nil {
-			fmt.Println("退出失败:", tmpErr.Error())
-		}
-	}()
-
-	for {
-		// 获取增量用户列表
-		userResp, tmpErr := xiangyu.PullTask(tokenId)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-
-		// 没有数据了,那么结束同步了
-		if userResp == nil || userResp.Out.ObjectCode == `` {
-			return
-		}
-
-		// 是否同步成功
-		var isSync bool
-
-		var etaUserId, message string
-
-		//  处理用户信息,将象屿用户与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)
-			}
-		} else {
-			message = tmpErr.Error()
-		}
-
-		// 结束单次增量同步
-		err = xiangyu.PullFinish(tokenId, userResp.Out.TaskId, etaUserId, message, isSync)
-		if 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, err := eta.GetAllDepartment()
-	if err != nil {
-		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, err := eta.GetAllSysGroup()
-	if err != nil {
-		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, err := eta.GetAllSysUser()
-	if err != nil {
-		return
-	}
-
-	// 部门信息
-	userMap = make(map[string]*eta.Admin)
-	for _, admin := range adminList {
-		userMap[admin.AdminName] = admin
-	}
-
-	return
-}
-
-// handleUser
-// @Description: 用户信息处理
-// @author: Roc
-// @datetime 2024-01-18 18:00:04
-// @param xyUserInfo xiangyu.UserData
-// @param departmentMap map[string]*eta.SysDepartment
-// @param groupMap map[string]*eta.SysGroup
-// @param userMap map[string]*eta.Admin
-// @return err error
-func handleUser(xyUserInfo xiangyu.UserData, xyUserId string, departmentMap, departmentNameMap map[string]*eta.SysDepartment, groupMap, groupNameMap map[string]*eta.SysGroup, userMap map[string]*eta.Admin, roleInfo *eta.SysRole) (err error) {
-	// 判断公司id是否存在,如果不存在,那么就去创建
-	departmentInfo, ok := departmentMap[xyUserInfo.CompanyId]
-	if !ok {
-		// 没有外部id的部门,那么用名称去匹配
-		departmentInfo, ok = departmentNameMap[xyUserInfo.CompanyName]
-		if !ok {
-			// 如果没有的话,那么就创建该部门
-			departmentInfo = &eta.SysDepartment{
-				DepartmentId:   0,
-				DepartmentName: xyUserInfo.CompanyName,
-				OutID:          xyUserInfo.CompanyId,
-				CreateTime:     time.Now(),
-				Sort:           0,
-			}
-			err = departmentInfo.Create()
-
-			if err != nil {
-				return
-			}
-		} else {
-			// 如果通过名称找到了,那么就更新一下外部id
-			departmentInfo.OutID = xyUserInfo.CompanyId
-			err = departmentInfo.Update([]string{"OutID"})
-			if err != nil {
-				return
-			}
-			delete(departmentNameMap, xyUserInfo.CompanyName)
-		}
-
-		departmentMap[xyUserInfo.CompanyId] = departmentInfo
-	}
-
-	// 判断部门id是否存在,如果不存在,那么就去创建
-	groupInfo, ok := groupMap[xyUserInfo.DepartId]
-	if !ok {
-		groupInfo, ok = groupNameMap[fmt.Sprint(departmentInfo.DepartmentId, "_", xyUserInfo.DepartmentName)]
-		if !ok {
-			// 如果通过名称还是没有找到,那么就创建一个分组
-			groupInfo = &eta.SysGroup{
-				GroupId:      0,
-				DepartmentId: departmentInfo.DepartmentId,
-				GroupName:    xyUserInfo.DepartmentName,
-				CreateTime:   time.Now(),
-				ParentId:     0,
-				Sort:         0,
-				OutID:        xyUserInfo.DepartId,
-			}
-
-			// 如果没有的话,那么就创建该分组
-			err = groupInfo.Create()
-			if err != nil {
-				return
-			}
-		} else {
-			// 如果通过名称找到了,那么就更新一下外部id
-			groupInfo.OutID = xyUserInfo.DepartId
-			err = groupInfo.Update([]string{"OutID"})
-			if err != nil {
-				return
-			}
-			delete(groupNameMap, xyUserInfo.DepartmentName)
-		}
-		groupMap[xyUserInfo.DepartId] = groupInfo
-	}
-
-	enabled := 1
-	if xyUserInfo.IsDisabled {
-		enabled = 0
-	}
-	// 判断用户是否存在,如果不存在,那么就去创建
-	userInfo, ok := userMap[xyUserInfo.Username]
-	if !ok {
-
-		userInfo = &eta.Admin{
-			AdminId:     0,
-			AdminName:   xyUserInfo.Username,
-			AdminAvatar: "",
-			RealName:    xyUserInfo.FullName,
-			Password:    xyUserInfo.Password,
-			//LastUpdatedPasswordTime:   time.Time{},
-			Enabled: enabled,
-			Email:   "",
-			//LastLoginTime:             time.Time{},
-			CreatedTime:     time.Now(),
-			LastUpdatedTime: time.Now(),
-			//Role:            roleInfo.,
-			Mobile:         xyUserInfo.Mobile,
-			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:       xyUserInfo.PositionName,
-			//DisableTime:               time.Time{},
-			ChartPermission:           0,
-			EdbPermission:             0,
-			MysteelChemicalPermission: 0,
-			OpenId:                    "",
-			UnionId:                   "",
-			PredictEdbPermission:      0,
-			Province:                  "",
-			ProvinceCode:              "",
-			City:                      "",
-			CityCode:                  "",
-			EmployeeId:                xyUserInfo.EmployeeNo,
-			TelAreaCode:               "",
-			OutID:                     xyUserId,
-		}
-
-		if strings.Contains(roleInfo.RoleTypeCode, "researcher") {
-			userInfo.Role = "researcher"
-		} else if strings.Contains(userInfo.RoleTypeCode, "seller") {
-			userInfo.Role = "sales"
-		} else {
-			userInfo.Role = "admin"
-		}
-
-		// 如果没有的话,那么就创建该用户
-		err = userInfo.Create()
-		if err != nil {
-			return
-		}
-
-	} else {
-		updateColList := make([]string, 0)
-
-		//状态
-		if userInfo.Enabled != enabled {
-			updateColList = append(updateColList, "Enabled")
-			userInfo.Enabled = enabled
-		}
-
-		// 部门
-		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 != xyUserInfo.PositionName {
-			updateColList = append(updateColList, "Position")
-			userInfo.Position = xyUserInfo.PositionName
-		}
-
-		// 姓名
-		if userInfo.RealName != xyUserInfo.FullName {
-			updateColList = append(updateColList, "RealName")
-			userInfo.RealName = xyUserInfo.FullName
-		}
-
-		// 手机号
-		if userInfo.Mobile != xyUserInfo.Mobile {
-			updateColList = append(updateColList, "Mobile")
-			userInfo.Mobile = xyUserInfo.Mobile
-		}
-
-		// 外部id
-		if userInfo.OutID == `` {
-			updateColList = append(updateColList, "OutID")
-			userInfo.OutID = xyUserId
-		}
-
-		// 工号
-		if userInfo.EmployeeId != xyUserInfo.EmployeeNo {
-			updateColList = append(updateColList, "EmployeeId")
-			userInfo.OutID = xyUserInfo.EmployeeNo
-		}
-
-		if len(updateColList) > 0 {
-			updateColList = append(updateColList, "LastUpdatedTime")
-			userInfo.LastUpdatedTime = time.Now()
-			err = userInfo.Update(updateColList)
-			if err != nil {
-				return
-			}
-		}
-	}
-
-	userMap[xyUserInfo.Username] = userInfo
-
-	return
-}

+ 0 - 159
middleware/auth.go

@@ -1,159 +0,0 @@
-package middleware
-
-import (
-	"crypto/md5"
-	"errors"
-	"eta/eta_email_analysis/controller/resp"
-	"eta/eta_email_analysis/global"
-	"eta/eta_email_analysis/models/crm"
-	"eta/eta_email_analysis/utils"
-	"fmt"
-	"github.com/gin-gonic/gin"
-	"math"
-	"sort"
-	"strconv"
-	"strings"
-	"time"
-)
-
-func BaseAuthCheck() gin.HandlerFunc {
-	return func(c *gin.Context) {
-		method := c.Request.Method
-		if method != "POST" {
-			resp.TokenError(nil, "请求异常", "不支持非POST请求", c)
-			c.Abort()
-			return
-		}
-		pass, e := signCheck(c)
-		if e != nil {
-			resp.TokenError(nil, "签名错误", "签名校验失败, Err: "+e.Error(), c)
-			c.Abort()
-			return
-		}
-		if !pass {
-			resp.TokenError(nil, "签名错误", "签名错误", c)
-			c.Abort()
-			return
-		}
-	}
-}
-
-func signCheck(c *gin.Context) (ok bool, err error) {
-	params := make(map[string][]string)
-	err = c.ShouldBind(params)
-	if err != nil {
-		return
-	}
-	signData := convertParam(params)
-
-	// 签名校验
-	ip := c.ClientIP()
-	err = checkSignData(signData, ip)
-	if err != nil {
-		return
-	}
-	ok = true
-	return
-}
-
-// convertParam 将请求传入的数据格式转换成签名需要的格式
-func convertParam(params map[string][]string) (signData map[string]string) {
-	signData = make(map[string]string)
-	for key := range params {
-		signData[key] = params[key][0]
-	}
-	return signData
-}
-
-// checkSignData 请求参数签名校验
-func checkSignData(postData map[string]string, ip string) (err error) {
-	isSandbox := postData["is_sandbox"]
-	// 如果是测试环境, 且是沙箱环境的话, 那么绕过测试
-	if global.CONFIG.Serve.RunMode == "debug" && isSandbox != "" {
-		return
-	}
-
-	appid := postData["appid"]
-	if appid == "" {
-		err = errors.New("参数异常,缺少appid")
-		return
-	}
-
-	openApiOB := new(crm.OpenApiUser)
-	apiUser, e := openApiOB.GetItemByAppid(appid)
-	if e != nil {
-		if e != utils.ErrNoRow {
-			err = errors.New("系统异常,请联系管理员")
-			return
-		}
-		err = errors.New("appid异常,请联系管理员")
-		return
-	}
-	if apiUser == nil {
-		err = errors.New("系统异常,请联系管理员")
-		return
-	}
-
-	// 如果有ip限制, 则校验IP
-	if apiUser.Ip != "" {
-		if !strings.Contains(apiUser.Ip, ip) {
-			err = errors.New(fmt.Sprintf("无权限访问该接口,ip:%v,请联系管理员", ip))
-			return
-		}
-	}
-
-	// 接口提交的签名字符串
-	ownSign := postData["sign"]
-	if ownSign == "" {
-		err = errors.New("参数异常,缺少签名字符串")
-		return
-	}
-	if postData["nonce_str"] == "" {
-		err = errors.New("参数异常,缺少随机字符串")
-		return
-	}
-	if postData["timestamp"] == "" {
-		err = errors.New("参数异常,缺少时间戳")
-		return
-	} else {
-		timeUnix := time.Now().Unix() // 当前格林威治时间,int64类型
-		// 将接口传入的时间做转换
-		timestamp, timeErr := strconv.ParseInt(postData["timestamp"], 10, 64)
-		if timeErr != nil {
-			err = errors.New("参数异常,时间戳格式异常")
-			return
-		}
-		if math.Abs(float64(timeUnix-timestamp)) > 300 {
-			err = errors.New("当前时间异常,请调整设备时间与北京时间一致")
-			return
-		}
-	}
-
-	// 先取出除sign外的所有的提交的参数key
-	var keys []string
-	for k := range postData {
-		if k != "sign" {
-			keys = append(keys, k)
-		}
-	}
-
-	//1,根据参数名称的ASCII码表的顺序排序
-	sort.Strings(keys)
-
-	//2 根据排序后的参数名称,取出对应的值,并拼接字符串
-	var signStr string
-	for _, v := range keys {
-		signStr += v + "=" + postData[v] + "&"
-	}
-	//3,全转小写(md5(拼装的字符串后+分配给你的app_secret))
-	//sign := strings.ToLower(fmt.Sprintf("%x", md5.Sum([]byte(strings.Trim(signStr, "&")+key))))
-
-	//md5.Sum([]byte(signStr+"key="+key))  这是md5加密出来后的每个字符的AscII码,需要再转换成对应的字符
-	//3,全转大写(md5(拼装的字符串后+分配给你的app_secret))
-	sign := strings.ToUpper(fmt.Sprintf("%x", md5.Sum([]byte(signStr+"secret="+apiUser.Secret))))
-	if sign != ownSign {
-		global.LOG.Info(fmt.Sprintf("签名校验异常,签名字符串:%v;服务端签名值:%v", signStr, sign))
-		return errors.New("签名校验异常,请核实签名")
-	}
-	return nil
-}

+ 1 - 1
middleware/token.go

@@ -21,7 +21,7 @@ func Token() gin.HandlerFunc {
 			c.Abort()
 			return
 		}
-		if token != utils.CrmEtaAuthorization {
+		if token != utils.Authorization {
 			resp.TokenError(nil, "非法访问", "非法访问", c)
 			c.Abort()
 			return

+ 0 - 25
models/crm/open_api_user.go

@@ -1,25 +0,0 @@
-package crm
-
-import (
-	"eta/eta_email_analysis/global"
-	"time"
-)
-
-type OpenApiUser struct {
-	Appid      string    `gorm:"primaryKey;column:appid;type:varchar(32);not null;default:''" json:"appid"`      // 开放平台appid
-	Secret     string    `gorm:"column:secret;type:varchar(64);default:''" json:"secret"`                        // 开放平台秘钥
-	Ip         string    `gorm:"column:ip;type:text" json:"ip"`                                                  // 限制请求来源ip,多个ip用英文,隔开
-	Remark     string    `gorm:"column:remark;type:varchar(255);default:''" json:"remark"`                       // 备注,记录来源等信息
-	CreateTime time.Time `gorm:"column:create_time;type:timestamp;default:CURRENT_TIMESTAMP" json:"create_time"` // 创建时间
-	ModifyTime time.Time `gorm:"column:modify_time;type:datetime" json:"modify_time"`                            // 最近一次更新时间
-}
-
-func (m *OpenApiUser) TableName() string {
-	return "open_api_user"
-}
-
-// GetItemByAppid AppID获取信息
-func (m *OpenApiUser) GetItemByAppid(appid string) (item *OpenApiUser, err error) {
-	err = global.MYSQL["hz_crm"].Model(m).Where("appid = ?", appid).First(&item).Error
-	return
-}

+ 12 - 24
models/eta/admin.go

@@ -1,7 +1,6 @@
 package eta
 
 import (
-	"errors"
 	"eta/eta_email_analysis/global"
 	"time"
 )
@@ -69,31 +68,20 @@ func GetSysUserById(sysUserId int) (item *Admin, err error) {
 	return
 }
 
-// GetSysUserByAdminName 用户名获取系统用户
-func GetSysUserByAdminName(adminName string) (item *Admin, err error) {
-	err = global.MYSQL["hz_eta"].Where("admin_name = ?", adminName).First(&item).Error
-	return
-}
-
-// DeleteSysUserByName 根据用户名删除用户
-func DeleteSysUserByName(adminName string) (err error) {
-	sql := `DELETE FROM admin WHERE admin_name = ? LIMIT 1`
-	err = global.MYSQL["hz_eta"].Exec(sql, adminName).Error
+// GetSysUserByEmail
+// @Description: 根据邮箱号获取系统用户
+// @author: Roc
+// @datetime 2024-09-14 17:01:13
+// @param email string
+// @return item *Admin
+// @return err error
+func GetSysUserByEmail(email string) (item *Admin, err error) {
+	err = global.MYSQL["hz_eta"].Where("email = ?", email).First(&item).Error
 	return
 }
 
-// GetAllSysUser 获取所有用户
-func GetAllSysUser() (items []*Admin, err error) {
-	err = global.MYSQL["hz_eta"].Find(&items).Error
-	return
-}
-
-// GetSysUserByOutId 通过外部id获取系统用户
-func GetSysUserByOutId(outId string) (item *Admin, err error) {
-	if outId == `` {
-		err = errors.New("outId不能为空")
-		return
-	}
-	err = global.MYSQL["hz_eta"].Where("out_id = ?", outId).First(&item).Error
+// GetSysUserByAdminName 用户名获取系统用户
+func GetSysUserByAdminName(adminName string) (item *Admin, err error) {
+	err = global.MYSQL["hz_eta"].Where("admin_name = ?", adminName).First(&item).Error
 	return
 }

+ 0 - 36
models/eta/crm_config.go

@@ -1,36 +0,0 @@
-package eta
-
-import (
-	"eta/eta_email_analysis/global"
-	"time"
-)
-
-const (
-	ConfEnAuthRoleKey = "en_auth_role" // 英文权限角色配置Key
-)
-
-// CrmConfig CRM配置表
-type CrmConfig struct {
-	ConfigId    int       `gorm:"primaryKey;column:config_id;type:int(11);not null" json:"config_id"`
-	ConfigCode  string    `gorm:"column:config_code;type:varchar(50);default:''" json:"config_code"` // 配置编码
-	ConfigValue string    `gorm:"column:config_value;type:text" json:"config_value"`                 // 配置值
-	Remark      string    `gorm:"column:remark;type:varchar(255);default:''" json:"remark"`          // 备注信息
-	CreateTime  time.Time `gorm:"column:create_time;type:datetime" json:"create_time"`               // 创建时间
-}
-
-func (m *CrmConfig) TableName() string {
-	return "crm_config"
-}
-
-// GetCrmConfByCode code获取配置
-func GetCrmConfByCode(code string) (item *CrmConfig, err error) {
-	err = global.MYSQL["hz_eta"].Where("config_code = ?", code).First(&item).Error
-	return
-}
-
-// ConfEnAuthRole 配置-英文权限角色
-type ConfEnAuthRole struct {
-	RoleCode string `description:"角色编码"`
-	RoleName string `description:"角色名称"`
-	SyncCrm  bool   `description:"是否同步CRM"`
-}

+ 0 - 49
models/eta/sys_department.go

@@ -1,49 +0,0 @@
-package eta
-
-import (
-	"eta/eta_email_analysis/global"
-	"time"
-)
-
-type SysDepartment struct {
-	DepartmentId   int       `gorm:"primaryKey;column:department_id;type:int(11);not null" json:"department_id"`
-	DepartmentName string    `gorm:"unique;column:department_name;type:varchar(255);default:''" json:"department_name"` // 部门名称
-	OutID          string    `gorm:"column:out_id" json:"out_id"`                                                       // 外部id
-	CreateTime     time.Time `gorm:"column:create_time;type:datetime" json:"create_time"`                               // 创建时间
-	Sort           int       `gorm:"column:sort;type:int(10);not null;default:0" json:"sort"`                           // 排序
-}
-
-func (m *SysDepartment) TableName() string {
-	return "sys_department"
-}
-
-// Create 新增部门
-func (m *SysDepartment) Create() (err error) {
-	err = global.MYSQL["hz_eta"].Create(m).Error
-	return
-}
-
-// Update 更新部门
-func (m *SysDepartment) Update(cols []string) (err error) {
-	err = global.MYSQL["hz_eta"].Model(m).Select(cols).Updates(m).Error
-	return
-}
-
-// GetDepartmentById 主键获取部门
-func GetDepartmentById(departmentId int) (item *SysDepartment, err error) {
-	err = global.MYSQL["hz_eta"].Where("department_id = ?", departmentId).First(&item).Error
-	return
-}
-
-// GetAllDepartment 获取所有部门
-func GetAllDepartment() (items []*SysDepartment, err error) {
-	err = global.MYSQL["hz_eta"].Find(&items).Error
-	return
-}
-
-// DeleteDepartmentById 主键删除部门
-func DeleteDepartmentById(departmentId int) (err error) {
-	sql := `DELETE FROM sys_department WHERE department_id = ? LIMIT 1`
-	err = global.MYSQL["hz_eta"].Exec(sql, departmentId).Error
-	return
-}

+ 0 - 57
models/eta/sys_group.go

@@ -1,57 +0,0 @@
-package eta
-
-import (
-	"eta/eta_email_analysis/global"
-	"time"
-)
-
-type SysGroup struct {
-	GroupId      int       `gorm:"primaryKey;column:group_id;type:int(11);not null" json:"group_id"`
-	DepartmentId int       `gorm:"index:idx_department_id;column:department_id;type:int(11)" json:"department_id"` // 部门id
-	GroupName    string    `gorm:"column:group_name;type:varchar(255);default:''" json:"group_name"`               // 分组名称
-	CreateTime   time.Time `gorm:"column:create_time;type:datetime" json:"create_time"`
-	ParentId     int       `gorm:"column:parent_id;type:int(11);default:0" json:"parent_id"`
-	Sort         int       `gorm:"column:sort;type:int(10);not null;default:0" json:"sort"` // 排序
-	OutID        string    `gorm:"column:out_id" json:"out_id"`                             // 外部id
-}
-
-func (m *SysGroup) TableName() string {
-	return "sys_group"
-}
-
-// Create 新增分组
-func (m *SysGroup) Create() (err error) {
-	err = global.MYSQL["hz_eta"].Create(m).Error
-	return
-}
-
-// Update 更新分组
-func (m *SysGroup) Update(cols []string) (err error) {
-	err = global.MYSQL["hz_eta"].Model(m).Select(cols).Updates(m).Error
-	return
-}
-
-// GetSysGroupByGroupId 获取分组-根据主键
-func GetSysGroupByGroupId(groupId int) (item *SysGroup, err error) {
-	err = global.MYSQL["hz_eta"].Where("group_id = ?", groupId).First(&item).Error
-	return
-}
-
-// GetAllSysGroup 获取所有的分组
-func GetAllSysGroup() (items []*SysGroup, err error) {
-	err = global.MYSQL["hz_eta"].Find(&items).Error
-	return
-}
-
-// DeleteGroupByGroupId 删除分组-根据主键
-func DeleteGroupByGroupId(groupId int) (err error) {
-	sql := `DELETE FROM sys_group WHERE group_id = ? LIMIT 1`
-	err = global.MYSQL["hz_eta"].Exec(sql, groupId).Error
-	if err != nil {
-		return
-	}
-	// 清除关联
-	sql = `UPDATE admin SET group_id = 0, group_name = '' WHERE group_id = ? `
-	err = global.MYSQL["hz_eta"].Exec(sql, groupId).Error
-	return
-}

+ 0 - 46
models/eta/sys_role.go

@@ -1,46 +0,0 @@
-package eta
-
-import (
-	"eta/eta_email_analysis/global"
-	"time"
-)
-
-// SysRole 角色表
-type SysRole struct {
-	RoleId       int       `gorm:"primaryKey;column:role_id;type:int(11);not null" json:"role_id""`
-	RoleName     string    `gorm:"column:role_name;type:varchar(100)" json:"role_name"`
-	RoleType     string    `gorm:"column:role_type;type:varchar(50)" json:"role_type"`            // 角色类型
-	RoleTypeCode string    `gorm:"column:role_type_code;type:varchar(100)" json:"role_type_code"` // 角色类型编码
-	CreateTime   time.Time `gorm:"column:create_time;type:datetime" json:"create_time"`
-	ModifyTime   time.Time `gorm:"column:modify_time;type:datetime" json:"modify_time"`
-	RoleLevel    int       `gorm:"column:role_level;type:tinyint(4);not null;default:0" json:"role_level"` // 角色等级:0-表示一级角色,每个账号只能绑定一个一级角色 ,1-表示二级角色,每个账号可以绑定多个二级 角色
-}
-
-func (m *SysRole) TableName() string {
-	return "sys_role"
-}
-
-// Create 新增角色
-func (m *SysRole) Create() (err error) {
-	err = global.MYSQL["hz_eta"].Create(m).Error
-	return
-}
-
-// Update 更新角色
-func (m *SysRole) Update(cols []string) (err error) {
-	err = global.MYSQL["hz_eta"].Model(m).Select(cols).Updates(m).Error
-	return
-}
-
-// GetSysRoleById 主键获取角色
-func GetSysRoleById(roleId int) (item *SysRole, err error) {
-	err = global.MYSQL["hz_eta"].Where("role_id = ?", roleId).First(&item).Error
-	return
-}
-
-// DeleteRoleById 主键删除角色
-func DeleteRoleById(roleId int) (err error) {
-	sql := `DELETE FROM sys_role WHERE role_id = ? LIMIT 1`
-	err = global.MYSQL["hz_eta"].Exec(sql, roleId).Error
-	return
-}

+ 0 - 39
models/eta/sys_session.go

@@ -1,39 +0,0 @@
-package eta
-
-import (
-	"eta/eta_email_analysis/global"
-	"time"
-)
-
-type SysSession struct {
-	Id              int       `gorm:"primaryKey;column:id;type:bigint(20);not null" json:"id"`
-	SysUserId       int       `gorm:"column:sys_user_id;type:bigint(20)" json:"sys_user_id"`
-	UserName        string    `gorm:"column:user_name;type:varchar(32)" json:"user_name"`
-	AccessToken     string    `gorm:"index:access_token;column:access_token;type:varchar(255)" json:"access_token"`
-	IsRemember      int       `gorm:"column:is_remember;type:tinyint(9) unsigned;default:0" json:"is_remember"` // 是否记住密码,属于受信设备
-	ExpiredTime     time.Time `gorm:"column:expired_time;type:datetime" json:"expired_time"`
-	CreatedTime     time.Time `gorm:"index:created_time;column:created_time;type:datetime;default:CURRENT_TIMESTAMP" json:"created_time"` // 创建时间
-	LastUpdatedTime time.Time `gorm:"index:last_updated_time;column:last_updated_time;type:timestamp;not null;default:CURRENT_TIMESTAMP" json:"last_updated_time"`
-}
-
-func (m *SysSession) TableName() string {
-	return "sys_session"
-}
-
-// AddSysSession 新增session
-func AddSysSession(item *SysSession) (err error) {
-	err = global.MYSQL["hz_eta"].Create(item).Error
-	return
-}
-
-// GetSysSessionByToken 根据Token获取session
-func GetSysSessionByToken(token string) (item *SysSession, err error) {
-	err = global.MYSQL["hz_eta"].Where("access_token = ? AND expired_time > NOW()", token).Order("expired_time DESC").First(&item).Error
-	return
-}
-
-// GetUserUnexpiredSysSession 获取用户未过期的Token
-func GetUserUnexpiredSysSession(userName, expiredTime string) (item *SysSession, err error) {
-	err = global.MYSQL["hz_eta"].Where("user_name = ? AND expired_time > ?", userName, expiredTime).Order("expired_time DESC").First(&item).Error
-	return
-}

+ 0 - 36
models/eta/sys_third_session.go

@@ -1,36 +0,0 @@
-package eta
-
-import (
-	"eta/eta_email_analysis/global"
-	"time"
-)
-
-// SysThirdSession
-// @Description: 第三方登录会话session
-type SysThirdSession struct {
-	ID               uint64 `gorm:"primaryKey;column:id"`
-	SysUserID        uint64 `gorm:"column:sys_user_id"`
-	UserName         string `gorm:"column:user_name"`
-	AccessToken      string `gorm:"index:access_token;column:access_token"`
-	ThirdAccessToken string `gorm:"index:third_access_token;column:third_access_token"`
-	//ThirdRefreshToken string    `gorm:"column:third_refresh_token"`
-	ThirdExpiredTime time.Time `gorm:"column:third_expired_time"`
-	CreatedTime      time.Time `gorm:"index:created_time;column:created_time"`
-	LastUpdatedTime  time.Time `gorm:"index:last_updated_time;column:last_updated_time"`
-}
-
-func (m *SysThirdSession) TableName() string {
-	return "sys_third_session"
-}
-
-// AddSysThirdSession 新增第三方的session
-func AddSysThirdSession(item *SysThirdSession) (err error) {
-	err = global.MYSQL["hz_eta"].Create(item).Error
-	return
-}
-
-// GetSysThirdSessionByToken 根据Token获取第三方session
-func GetSysThirdSessionByToken(token string) (item *SysThirdSession, err error) {
-	err = global.MYSQL["hz_eta"].Where("access_token = ? AND expired_time > NOW()", token).Order("expired_time DESC").First(&item).Error
-	return
-}

+ 0 - 25
models/eta/sys_user_login_record.go

@@ -1,25 +0,0 @@
-package eta
-
-import (
-	"eta/eta_email_analysis/global"
-	"time"
-)
-
-type SysUserLoginRecord struct {
-	Id         int       `gorm:"primaryKey;column:id;type:int(11);not null" json:"id"`
-	Uid        int       `gorm:"column:uid;type:int(11)" json:"uid"`
-	UserName   string    `gorm:"column:user_name;type:varchar(30)" json:"user_name"`
-	Ip         string    `gorm:"column:ip;type:varchar(30)" json:"ip"`
-	Stage      string    `gorm:"column:stage;type:varchar(30)" json:"stage"`
-	CreateTime time.Time `gorm:"column:create_time;type:datetime" json:"create_time"`
-}
-
-func (m *SysUserLoginRecord) TableName() string {
-	return "sys_user_login_record"
-}
-
-// AddSysUserLoginRecord 新增登录记录
-func AddSysUserLoginRecord(item *SysUserLoginRecord) (err error) {
-	err = global.MYSQL["hz_eta"].Create(item).Error
-	return
-}

+ 0 - 36
models/index/base.go

@@ -1,36 +0,0 @@
-package index
-
-import "eta/eta_email_analysis/global"
-
-// BinlogFormatStruct
-// @Description: 数据库的binlog格式
-type BinlogFormatStruct struct {
-	VariableName string `json:"Variable_name"`
-	Value        string `json:"Value"`
-}
-
-// GetBinlogFormat
-// @Description: 获取数据库的binlog格式
-// @return item
-// @return err
-func GetBinlogFormat() (item *BinlogFormatStruct, err error) {
-	sql := `SHOW VARIABLES LIKE 'binlog_format';`
-	err = global.MYSQL["index"].Raw(sql).First(&item).Error
-	return
-}
-
-type BinlogFileStruct struct {
-	File     string `json:"File"`
-	Position uint32 `json:"Position"`
-}
-
-// GetShowMaster
-// @Description: 获取master的状态
-// @return item
-// @return err
-func GetShowMaster() (item *BinlogFileStruct, err error) {
-	sql := `show master status;`
-	err = global.MYSQL["index"].Raw(sql).First(&item).Error
-
-	return
-}

+ 0 - 59
models/index/business_sys_interaction_log.go

@@ -1,59 +0,0 @@
-package index
-
-import (
-	"eta/eta_email_analysis/global"
-	"time"
-)
-
-// BusinessSysInteractionLog 商家系统交互记录表
-type BusinessSysInteractionLog struct {
-	ID             uint32    `gorm:"primaryKey;column:id;type:int(10) unsigned;not null" json:"-"`
-	InteractionKey string    `gorm:"unique;column:interaction_key;type:varchar(128);not null;default:''" json:"interactionKey"` // 记录Key
-	InteractionVal string    `gorm:"column:interaction_val;type:text;default:null" json:"interactionVal"`                       // 记录值
-	Remark         string    `gorm:"column:remark;type:varchar(128);not null;default:''" json:"remark"`                         // 备注
-	ModifyTime     time.Time `gorm:"column:modify_time;type:datetime;default:null" json:"modifyTime"`                           // 修改日期
-	CreateTime     time.Time `gorm:"column:create_time;type:datetime;default:null" json:"createTime"`                           // 创建时间
-}
-
-// TableName get sql table name.获取数据库表名
-func (m *BusinessSysInteractionLog) TableName() string {
-	return "business_sys_interaction_log"
-}
-
-// BusinessSysInteractionLogColumns get sql column name.获取数据库列名
-var BusinessSysInteractionLogColumns = struct {
-	ID             string
-	InteractionKey string
-	InteractionVal string
-	Remark         string
-	ModifyTime     string
-	CreateTime     string
-}{
-	ID:             "id",
-	InteractionKey: "interaction_key",
-	InteractionVal: "interaction_val",
-	Remark:         "remark",
-	ModifyTime:     "modify_time",
-	CreateTime:     "create_time",
-}
-
-// Create 添加数据
-func (m *BusinessSysInteractionLog) Create() (err error) {
-	err = global.MYSQL["index"].Create(m).Error
-	return
-}
-
-// Update 更新数据
-func (m *BusinessSysInteractionLog) Update(cols []string) (err error) {
-	err = global.MYSQL["index"].Model(m).Select(cols).Updates(m).Error
-	return
-}
-
-var BinlogFileNameKey = "binlog_filename"        // binlog文件名
-var BinlogPositionKey = "binlog_binlog_position" // binlog位置
-
-// GetBusinessSysInteractionLogByKey 根据记录key获取数据
-func GetBusinessSysInteractionLogByKey(key string) (item *BusinessSysInteractionLog, err error) {
-	err = global.MYSQL["index"].Where("interaction_key = ?", key).First(&item).Error
-	return
-}

+ 0 - 44
models/index/edb_data_business.go

@@ -1,44 +0,0 @@
-package index
-
-import "github.com/rdlucklib/rdluck_tools/paging"
-
-type GetBusinessDataReq struct {
-	CurrentIndex int    `json:"current_index" form:"current_index" binding:"required"  description:"当前页码"`
-	PageSize     int    `json:"page_size" form:"page_size" binding:"required"  description:"单页条数,自己填,一页要多少条,最大2000条"`
-	IndexCode    string `json:"index_code" form:"index_code" description:"指标编码"`
-	IndexPkgCode string `json:"index_pkg_code" form:"index_pkg_code" description:"指标包编码,与指标编码二选一填写"`
-	DataDate     string `json:"data_date" form:"data_date" description:"指定数据日期,数据日期格式为2024-05-15"`
-	StartDate    string `json:"start_date" form:"start_date" description:"启始时间,格式 YYYY-MM-DD 如:2024-05-15;不为空时,将过滤出数据日期>=startDate 的数据行"`
-	EndDate      string `json:"end_date" form:"end_date" description:"结束时间,格式 YYYY-MM-DD 如:2024-05-15;不为空时,将过滤出数据日期<=endDate 的数据行"`
-	//Sort                      string `json:"sort" description:"排序字段,默认为0正序;按数据日期字段排序,0为正序 1为倒序"`
-	DataSourceType            string `json:"data_source_type" form:"data_source_type"  description:"内部来源系统参数,可只获取对应数据源数据,不传则默认获取所有数据源信息;参数含义:① CY产研平台;② RPA;③ KSF 金仕达;④CRM参数例子: CY,RPA,KSF,CRM  (参数传递字符串列表,通过逗号分隔)"`
-	InfoLastUpdateStartTime   string `json:"info_last_update_start_time" form:"info_last_update_start_time" description:"资产信息数据落到数仓时间,参数:YYYY-MM-DD HH24:MI:SS 如:2024-05-15 10:16:52不为空时,将过滤出 资产信息入库时间>=infoLastUpdateStartTime 的数据行"`
-	InfoLastUpdateEndTime     string `json:"info_last_update_end_time" form:"info_last_update_end_time" description:"资产信息数据落到数仓时间,参数:YYYY-MM-DD HH24:MI:SS 如:2024-05-15 10:16:52不为空时,将过滤出 资产信息入库时间<=infoLastUpdateStartTime 的数据行"`
-	DetailLastUpdateStartTime string `json:"detail_last_update_start_time" form:"detail_last_update_start_time" description:"明细数据落到数仓启始时间,参数:YYYY-MM-DD HH24:MI:SS 如:2024-05-15 10:16:52不为空时,将过滤出 资产详细信息入库时间>=detailLastUpdateStartTime 的数据行,建议延迟15分钟抽取"`
-	DetailLastUpdateEndTime   string `json:"detail_last_update_end_time" form:"detail_last_update_end_time" description:"明细数据落到数仓结束时间,参数:YYYY-MM-DD HH24:MI:SS 如:2024-05-15 10:16:52不为空时,将过滤出 资产详细信息入库时间<=detailLastUpdateStartTime 的数据行,建议延迟15分钟抽取"`
-}
-
-type GetBusinessDataResp struct {
-	List   []PushBusinessIndex
-	Paging *paging.PagingItem `description:"分页数据"`
-}
-
-// PushBusinessIndex
-// @Description:  添加外部指标(商家)请求
-type PushBusinessIndex struct {
-	IndexCode            string            `description:"指标编码"`
-	IndexName            string            `description:"指标名称"`
-	Unit                 string            `description:"单位"`
-	Frequency            string            `description:"频度"`
-	SourceName           string            `description:"数据来源名称"`
-	Remark               string            `description:"备注字段"`
-	DetailDataCreateTime string            `description:"明细数据入库时间"`
-	DataList             []AddBusinessData `description:"指标数据"`
-}
-
-// AddBusinessData
-// @Description: 外部指标(商家系统)数据
-type AddBusinessData struct {
-	Value float64 `description:"值"`
-	Date  string  `description:"日期"`
-}

+ 0 - 35
models/index/edb_update_log.go

@@ -1,35 +0,0 @@
-package index
-
-import (
-	"eta/eta_email_analysis/global"
-	"fmt"
-	"time"
-)
-
-type EdbUpdateLog struct {
-	Id          int64     `gorm:"column:id;type:bigint(20) UNSIGNED;primaryKey;not null;" json:"id"`
-	OpDbName    string    `gorm:"column:op_db_name;type:varchar(255);comment:库名;default:NULL;" json:"op_db_name"` // 库名
-	OpTableName string    `gorm:"column:op_table_name;type:varchar(255);comment:表名;" json:"op_table_name"`        // 表名
-	OpType      string    `gorm:"column:op_type;type:varchar(16);comment:变更类型;default:NULL;" json:"op_type"`      // 变更类型
-	OldData     string    `gorm:"column:old_data;type:text;comment:历史数据;" json:"old_data"`                        // 历史数据
-	NewData     string    `gorm:"column:new_data;type:text;comment:新数据;" json:"new_data"`                         // 新数据
-	CreateTime  time.Time `gorm:"column:create_time;type:timestamp;default:CURRENT_TIMESTAMP;" json:"create_time"`
-}
-
-func (m *EdbUpdateLog) TableName() string {
-	return "edb_update_log"
-}
-
-// Create 添加数据
-func (m *EdbUpdateLog) Create() (err error) {
-	err = global.MYSQL["index"].Create(m).Error
-	return
-}
-
-// DeleteBeforeTenDayLog 清除n前的日志数据
-func (m *EdbUpdateLog) DeleteBeforeTenDayLog(beforeDate string) (err error) {
-	sql := fmt.Sprintf(`DELETE FROM %s WHERE create_time < ?`, m.TableName())
-	err = global.MYSQL["index"].Exec(sql, beforeDate).Error
-
-	return
-}

+ 0 - 41
models/rddp/report_attachment.go

@@ -1,41 +0,0 @@
-package rddp
-
-import (
-	"eta/eta_email_analysis/global"
-	"time"
-)
-
-// ReportAttachment 报告附件
-type ReportAttachment struct {
-	ReportAttachmentID int       `gorm:"primaryKey;column:report_attachment_id" json:"-"`
-	ReportID           int       `gorm:"column:report_id" json:"reportId"`     // 报告id
-	Title              string    `gorm:"column:title" json:"title"`            // 附件名称
-	URL                string    `gorm:"column:url" json:"url"`                // 附件地址
-	CreateTime         time.Time `gorm:"column:create_time" json:"createTime"` // 附件新增时间
-}
-
-// TableName get sql table name.获取数据库表名
-func (m *ReportAttachment) TableName() string {
-	return "report_attachment"
-}
-
-// ReportAttachmentColumns get sql column name.获取数据库列名
-var ReportAttachmentColumns = struct {
-	ReportAttachmentID string
-	ReportID           string
-	Title              string
-	URL                string
-	CreateTime         string
-}{
-	ReportAttachmentID: "report_attachment_id",
-	ReportID:           "report_id",
-	Title:              "title",
-	URL:                "url",
-	CreateTime:         "create_time",
-}
-
-// AddReportAttachment 新增附件
-func AddReportAttachment(item *ReportAttachment) (err error) {
-	err = global.MYSQL["rddp"].Create(item).Error
-	return
-}

+ 0 - 39
models/rddp/sys_session.go

@@ -1,39 +0,0 @@
-package rddp
-
-import (
-	"eta/eta_email_analysis/global"
-	"time"
-)
-
-type SysSession struct {
-	Id              int       `gorm:"primaryKey;column:id;type:bigint(20);not null" json:"id"`
-	SysUserId       int       `gorm:"column:sys_user_id;type:bigint(20)" json:"sys_user_id"`
-	UserName        string    `gorm:"column:user_name;type:varchar(32)" json:"user_name"`
-	AccessToken     string    `gorm:"index:access_token;column:access_token;type:varchar(255)" json:"access_token"`
-	IsRemember      int       `gorm:"column:is_remember;type:tinyint(9) unsigned;default:0" json:"is_remember"` // 是否记住密码,属于受信设备
-	ExpiredTime     time.Time `gorm:"column:expired_time;type:datetime" json:"expired_time"`
-	CreatedTime     time.Time `gorm:"index:created_time;column:created_time;type:datetime;default:CURRENT_TIMESTAMP" json:"created_time"` // 创建时间
-	LastUpdatedTime time.Time `gorm:"index:last_updated_time;column:last_updated_time;type:timestamp;not null;default:CURRENT_TIMESTAMP" json:"last_updated_time"`
-}
-
-func (m *SysSession) TableName() string {
-	return "sys_session"
-}
-
-// AddSysSession 新增session
-func AddSysSession(item *SysSession) (err error) {
-	err = global.MYSQL["rddp"].Create(item).Error
-	return
-}
-
-// GetSysSessionByToken 根据Token获取session
-func GetSysSessionByToken(token string) (item *SysSession, err error) {
-	err = global.MYSQL["rddp"].Where("access_token = ? AND expired_time > NOW()", token).Order("expired_time DESC").First(&item).Error
-	return
-}
-
-// GetUserUnexpiredSysSession 获取用户未过期的Token
-func GetUserUnexpiredSysSession(userName, expiredTime string) (item *SysSession, err error) {
-	err = global.MYSQL["rddp"].Where("user_name = ? AND expired_time > ?", userName, expiredTime).Order("expired_time DESC").First(&item).Error
-	return
-}

+ 0 - 25
models/rddp/sys_user_login_record.go

@@ -1,25 +0,0 @@
-package rddp
-
-import (
-	"eta/eta_email_analysis/global"
-	"time"
-)
-
-type SysUserLoginRecord struct {
-	Id         int       `gorm:"primaryKey;column:id;type:int(11);not null" json:"id"`
-	Uid        int       `gorm:"column:uid;type:int(11)" json:"uid"`
-	UserName   string    `gorm:"column:user_name;type:varchar(30)" json:"user_name"`
-	Ip         string    `gorm:"column:ip;type:varchar(30)" json:"ip"`
-	Stage      string    `gorm:"column:stage;type:varchar(30)" json:"stage"`
-	CreateTime time.Time `gorm:"column:create_time;type:datetime" json:"create_time"`
-}
-
-func (m *SysUserLoginRecord) TableName() string {
-	return "sys_user_login_record"
-}
-
-// AddSysUserLoginRecord 新增登录记录
-func AddSysUserLoginRecord(item *SysUserLoginRecord) (err error) {
-	err = global.MYSQL["rddp"].Create(item).Error
-	return
-}

+ 118 - 0
models/report/outside_report.go

@@ -0,0 +1,118 @@
+package report
+
+import (
+	"eta/eta_email_analysis/global"
+	"eta/eta_email_analysis/utils"
+	"time"
+)
+
+// OutsideReport 外部报告
+type OutsideReport struct {
+	OutsideReportID  int       `gorm:"primaryKey;column:outside_report_id" json:"-"`
+	Source           uint8     `gorm:"column:source" json:"source"`                       // 来源,1:ETA系统录入;2:API接口录入;3:邮件监听录入
+	Title            string    `gorm:"column:title" json:"title"`                         // 报告标题
+	Abstract         string    `gorm:"column:abstract" json:"abstract"`                   // 摘要
+	ClassifyID       int       `gorm:"column:classify_id" json:"classifyId"`              // 所属分类id
+	ClassifyName     string    `gorm:"column:classify_name" json:"classifyName"`          // 所属分类名称(整个分类链条)
+	Content          string    `gorm:"column:content" json:"content"`                     // 报告富文本内容
+	SysUserID        int       `gorm:"column:sys_user_id" json:"sysUserId"`               // 创建人id
+	SysUserName      string    `gorm:"column:sys_user_name" json:"sysUserName"`           // 创建人姓名
+	EmailMessageUID  int       `gorm:"column:email_message_uid" json:"emailMessageUid"`   // 该邮件在邮箱中的唯一id
+	ReportUpdateTime time.Time `gorm:"column:report_update_time" json:"reportUpdateTime"` // 报告更新时间,如果来源于邮件,那么取邮件的收件时间
+	ModifyTime       time.Time `gorm:"column:modify_time" json:"modifyTime"`              // 最近一次修改时间
+	CreateTime       time.Time `gorm:"column:create_time" json:"createTime"`              // 创建时间
+	ReportCode       string    `gorm:"column:report_code" json:"reportCode"`              // 报告唯一编码
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *OutsideReport) TableName() string {
+	return "outside_report"
+}
+
+// OutsideReportColumns get sql column name.获取数据库列名
+var OutsideReportColumns = struct {
+	OutsideReportID  string
+	Source           string
+	Title            string
+	Abstract         string
+	ClassifyID       string
+	ClassifyName     string
+	Content          string
+	SysUserID        string
+	SysUserName      string
+	EmailMessageUID  string
+	ReportUpdateTime string
+	ModifyTime       string
+	CreateTime       string
+	ReportCode       string
+}{
+	OutsideReportID:  "outside_report_id",
+	Source:           "source",
+	Title:            "title",
+	Abstract:         "abstract",
+	ClassifyID:       "classify_id",
+	ClassifyName:     "classify_name",
+	Content:          "content",
+	SysUserID:        "sys_user_id",
+	SysUserName:      "sys_user_name",
+	EmailMessageUID:  "email_message_uid",
+	ReportUpdateTime: "report_update_time",
+	ModifyTime:       "modify_time",
+	CreateTime:       "create_time",
+	ReportCode:       "report_code",
+}
+
+// GetOutsideReportByEmailMessageId
+// @Description: 根据邮件id获取报告
+// @author: Roc
+// @datetime 2024-09-14 17:49:35
+// @param emailMessageUid int
+// @return item *OutsideReport
+// @return err error
+func GetOutsideReportByEmailMessageId(emailMessageUid int) (item *OutsideReport, err error) {
+	err = global.DEFAULT_MYSQL.Where("email_message_uid = ?", emailMessageUid).First(&item).Error
+	return
+}
+
+// AddOutsideReport
+// @Description: 新增报告
+// @author: Roc
+// @datetime 2024-09-14 16:23:32
+// @param item *OutsideReport
+// @return err error
+func AddOutsideReport(item *OutsideReport) (err error) {
+	err = global.DEFAULT_MYSQL.Create(item).Error
+	return
+}
+
+// CreateOutsideReport
+// @Description: 新增报告&附件
+// @author: Roc
+// @datetime 2024-09-14 16:23:41
+// @param item *OutsideReport
+// @return err error
+func CreateOutsideReport(item *OutsideReport, outsideReportAttachmentList []*OutsideReportAttachment) (err error) {
+	db := global.DEFAULT_MYSQL.Begin()
+	defer func() {
+		if err != nil {
+			db.Rollback()
+		} else {
+			db.Commit()
+		}
+	}()
+
+	// 添加报告
+	err = global.DEFAULT_MYSQL.Create(item).Error
+	if err != nil {
+		return
+	}
+
+	// 添加报告附件
+	for _, v := range outsideReportAttachmentList {
+		v.OutsideReportID = item.OutsideReportID
+	}
+	err = global.DEFAULT_MYSQL.CreateInBatches(outsideReportAttachmentList, utils.BatchSize).Error
+
+	return
+
+}

+ 61 - 0
models/report/outside_report_attachment.go

@@ -0,0 +1,61 @@
+package report
+
+import (
+	"eta/eta_email_analysis/global"
+	"eta/eta_email_analysis/utils"
+	"time"
+)
+
+// OutsideReportAttachment 外部报告附件
+type OutsideReportAttachment struct {
+	OutsideReportAttachmentID int       `gorm:"primaryKey;column:outside_report_attachment_id" json:"-"`
+	OutsideReportID           int       `gorm:"column:outside_report_id" json:"outsideReportId"` // 报告id
+	Title                     string    `gorm:"column:title" json:"title"`                       // 附件名称
+	URL                       string    `gorm:"column:url" json:"url"`                           // 附件地址
+	CreateTime                time.Time `gorm:"column:create_time" json:"createTime"`            // 附件新增时间
+	FileSize                  int64     `gorm:"column:file_size" json:"fileSize"`                // 附件大小
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *OutsideReportAttachment) TableName() string {
+	return "outside_report_attachment"
+}
+
+// OutsideReportAttachmentColumns get sql column name.获取数据库列名
+var OutsideReportAttachmentColumns = struct {
+	OutsideReportAttachmentID string
+	OutsideReportID           string
+	Title                     string
+	URL                       string
+	CreateTime                string
+	FileSize                  string
+}{
+	OutsideReportAttachmentID: "outside_report_attachment_id",
+	OutsideReportID:           "outside_report_id",
+	Title:                     "title",
+	URL:                       "url",
+	CreateTime:                "create_time",
+	FileSize:                  "file_size",
+}
+
+// AddOutsideReportAttachment
+// @Description: 新增附件
+// @author: Roc
+// @datetime 2024-09-14 09:36:48
+// @param item *OutsideReportAttachment
+// @return err error
+func AddOutsideReportAttachment(item *OutsideReportAttachment) (err error) {
+	err = global.DEFAULT_MYSQL.Create(item).Error
+	return
+}
+
+// BatchesAddOutsideReportAttachment
+// @Description: 批量新增附件
+// @author: Roc
+// @datetime 2024-09-14 09:36:48
+// @param items []*OutsideReportAttachment
+// @return err error
+func BatchesAddOutsideReportAttachment(items []*OutsideReportAttachment) (err error) {
+	err = global.DEFAULT_MYSQL.CreateInBatches(items, utils.BatchSize).Error
+	return
+}

+ 0 - 52
routers/xiangyu.go

@@ -1,52 +0,0 @@
-package routers
-
-import (
-	"eta/eta_email_analysis/controller/xiangyu"
-	"eta/eta_email_analysis/middleware"
-	"github.com/gin-gonic/gin"
-)
-
-// InitXiangyu 获取象屿
-func InitXiangyu(r *gin.RouterGroup) {
-	control := new(xiangyu.XiangyuController)
-	group := r.Group("xy/")
-	group.GET("user/sync", control.SyncUser)
-	group.GET("user/pull", control.PullUser)
-
-	// 需要内部鉴权的接口
-	initAuthXiangyu(r)
-
-	// 指标接口
-	initIndexXiangyu(r)
-
-	// crm数据接口
-	initCrmXiangyu(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)
-}

+ 0 - 22
services/company.go

@@ -1,22 +0,0 @@
-package services
-
-import "eta/eta_email_analysis/utils"
-
-// GetProductId 根据角色类型获取对应的产品ID
-func GetProductId(roleTypeCode string) (productId int) {
-	if roleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER ||
-		roleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN ||
-		roleTypeCode == utils.ROLE_TYPE_CODE_FICC_TEAM ||
-		roleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP ||
-		roleTypeCode == utils.ROLE_TYPE_CODE_FICC_DEPARTMENT {
-		productId = 1
-	} else if roleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER ||
-		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN ||
-		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP ||
-		roleTypeCode == utils.ROLE_TYPE_CODE_RAI_DEPARTMENT {
-		productId = 2
-	} else {
-		productId = 0
-	}
-	return
-}

+ 145 - 31
services/pcsg/mail.go

@@ -2,25 +2,39 @@ package pcsg
 
 import (
 	"eta/eta_email_analysis/global"
-	"eta/eta_email_analysis/models/rddp"
+	"eta/eta_email_analysis/models/eta"
+	"eta/eta_email_analysis/models/report"
 	"eta/eta_email_analysis/services/oss"
 	"eta/eta_email_analysis/utils"
 	"eta/eta_email_analysis/utils/mail"
 	"fmt"
+	"github.com/google/uuid"
 	"html"
+	"io/fs"
 	"os"
 	"path"
 	"strings"
+	"sync"
 	"time"
 )
 
+// 同步用户锁,防止重复同步,不管是全量还是增量,都是同一时间只能一个同步
+var lockListenEmail sync.Mutex
+
 func ListenMail() (err error) {
+	lockListenEmail.Lock()
+	// 目录创建
+	_ = ensureDirExists(fmt.Sprintf("%s%s", global.CONFIG.Serve.StaticDir, `file`))
+
 	mailMessageChan := make(chan mail.MailMessage, 5) // 创建一个通道,用于接收邮件消息
 	mailMessageDoneChan := make(chan bool, 1)         // 创建一个通道,用于接收邮件消息
 
 	fmt.Println(len(mailMessageChan))
 
+	// 邮件监听后的处理函数
 	go afterByListen(mailMessageChan, mailMessageDoneChan)
+
+	fmt.Println("开始监听邮件")
 	mailAddress := fmt.Sprintf("%s:%d", global.CONFIG.Email.Host, global.CONFIG.Email.Port)
 	mail.ListenMail(mailAddress, global.CONFIG.Email.Folder, global.CONFIG.Email.UserName, global.CONFIG.Email.Password, global.CONFIG.Email.ReadBatchSize, mailMessageChan, mailMessageDoneChan)
 
@@ -28,18 +42,21 @@ func ListenMail() (err error) {
 }
 
 func afterByListen(mailMessageChan chan mail.MailMessage, mailMessageDoneChan chan bool) {
-
+	defer func() {
+		fmt.Println("监听读取结束")
+		lockListenEmail.Unlock()
+	}()
 	for {
 		select {
 		case mailMessage := <-mailMessageChan:
-			fmt.Println("读取成功")
-			fmt.Println(mailMessage.Title)
+			//fmt.Println("读取成功")
+			//fmt.Println(mailMessage.Title)
 			handleMailMessage(mailMessage)
 		case <-time.After(10 * time.Second):
-			fmt.Println("超时了")
+			//fmt.Println("监听超时了")
 			break
 		case <-mailMessageDoneChan:
-			fmt.Println("读取完成了")
+			fmt.Println("读取完成一轮了")
 			for len(mailMessageChan) > 0 {
 				mailMessage := <-mailMessageChan
 				handleMailMessage(mailMessage)
@@ -50,20 +67,50 @@ func afterByListen(mailMessageChan chan mail.MailMessage, mailMessageDoneChan ch
 	}
 }
 
-func handleMailMessage(mailMessage mail.MailMessage) {
-	rootPath := `C:\Users\123\go\src\eta\eta_email_analysis\static\`
+func handleMailMessage(mailMessage mail.MailMessage) (err error) {
+	defer func() {
+		if err != nil {
+			global.FILE_LOG.Errorf("邮件处理失败,邮件标题:%s,错误原因:%v", mailMessage.Title, err)
+		}
+
+		for _, v := range mailMessage.Resources {
+			os.Remove(v)
+		}
+
+		for _, v := range mailMessage.Attachment {
+			os.Remove(v)
+		}
+	}()
+	//rootPath := `C:\Users\123\go\src\eta\eta_email_analysis\static\`
 	ossClient := oss.NewOssClient()
-	fmt.Println(mailMessage.Title)
-	for k, v := range mailMessage.Resources {
+	//fmt.Println(mailMessage.Title)
+	outsideReportAttachmentList := make([]*report.OutsideReportAttachment, 0)
+
+	emailMessageUID := int(mailMessage.Uid)
+	outReport, err := report.GetOutsideReportByEmailMessageId(emailMessageUID)
+	// 已经存在了,那么就返回
+	if err == nil {
+		fmt.Println("已存在,就不处理了,报告标题:", outReport.Title)
+		return
+	}
+	// sql报错,那么就返回
+	if err != nil && !utils.IsErrNoRow(err) {
+		return
+	}
+	// 已经存在了,那么就返回
+	if outReport.OutsideReportID > 0 {
+		return
+	}
 
+	for k, v := range mailMessage.Resources {
 		randStr := utils.GetRandStringNoSpecialChar(28)
 		ext := path.Ext(v)
 		fileName := randStr + ext
 
-		resourceUrl, err := ossClient.UploadFile(fileName, v, "")
-		os.Remove(v)
-		if err != nil {
-			fmt.Println("上传文件失败:", err)
+		resourceUrl, tmpErr := ossClient.UploadFile(fileName, v, "")
+		//os.Remove(v)
+		if tmpErr != nil {
+			fmt.Println("上传文件失败:", tmpErr)
 			continue
 		}
 		tmpK := strings.Replace(k, "<", "cid:", -1)
@@ -73,32 +120,99 @@ func handleMailMessage(mailMessage mail.MailMessage) {
 	}
 
 	for name, v := range mailMessage.Attachment {
+		var fileSize int64
+		fileInfo, tmpErr := os.Stat(v)
+		if tmpErr != nil {
+			continue
+		}
+		fileSize = fileInfo.Size()
+
 		randStr := utils.GetRandStringNoSpecialChar(28)
 		ext := path.Ext(v)
 		fileName := randStr + ext
 
-		resourceUrl, err := ossClient.UploadFile(fileName, v, "")
-		os.Remove(v)
-		if err != nil {
-			fmt.Println("上传文件失败:", err)
+		resourceUrl, tmpErr := ossClient.UploadFile(fileName, v, "")
+		//defer os.Remove(v)
+		if tmpErr != nil {
+			fmt.Println("上传文件失败:", tmpErr)
 			continue
 		}
-		item := &rddp.ReportAttachment{
-			ReportAttachmentID: 0,
-			ReportID:           5494,
-			Title:              name,
-			URL:                resourceUrl,
-			CreateTime:         time.Now(),
-		}
-		rddp.AddReportAttachment(item)
+		outsideReportAttachmentList = append(outsideReportAttachmentList, &report.OutsideReportAttachment{
+			OutsideReportAttachmentID: 0,
+			OutsideReportID:           0,
+			Title:                     name,
+			URL:                       resourceUrl,
+			CreateTime:                time.Now(),
+			FileSize:                  fileSize,
+		})
 	}
 
-	fileName := fmt.Sprintf("%s%s.%s", rootPath, mailMessage.Title, "html")
+	//fileName := fmt.Sprintf("%s%s.%s", rootPath, mailMessage.Title, "html")
 
 	htmlEscapeBody := html.EscapeString(mailMessage.Content)
-	fmt.Println(htmlEscapeBody)
-	err := utils.SaveToFile([]byte(mailMessage.Content), fileName)
-	if err != nil {
-		fmt.Println(fileName, "生成失败;err:", err)
+	//fmt.Println(htmlEscapeBody)
+	//err = utils.SaveToFile([]byte(mailMessage.Content), fileName)
+	//if err != nil {
+	//	fmt.Println(fileName, "生成失败;err:", err)
+	//}
+
+	var sysUserId int
+	sysUserName := mailMessage.FromEmail
+	// 查找用户
+	if mailMessage.From != `` {
+		tmpEmailStrList := strings.Split(sysUserName, "<")
+		if len(tmpEmailStrList) >= 2 {
+			sysUserName = tmpEmailStrList[1]
+			tmpEmailStrList = strings.Split(sysUserName, ">")
+			if len(tmpEmailStrList) >= 2 {
+				sysUserName = tmpEmailStrList[0]
+			}
+		}
+		sysUser, tmpErr := eta.GetSysUserByEmail(sysUserName)
+		if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
+			err = tmpErr
+			return
+		}
+		if tmpErr == nil {
+			sysUserId = sysUser.AdminId
+			sysUserName = sysUser.RealName
+		}
+	}
+
+	reportUpdateTime := mailMessage.Date
+	if reportUpdateTime.IsZero() {
+		reportUpdateTime = time.Now()
+	}
+	reportInfo := &report.OutsideReport{
+		OutsideReportID:  0,
+		Source:           3,
+		Title:            mailMessage.Title,
+		Abstract:         "",
+		ClassifyID:       0,
+		ClassifyName:     "",
+		Content:          htmlEscapeBody,
+		SysUserID:        sysUserId,
+		SysUserName:      sysUserName,
+		EmailMessageUID:  emailMessageUID,
+		ReportUpdateTime: reportUpdateTime,
+		ModifyTime:       time.Now(),
+		CreateTime:       time.Now(),
+		ReportCode:       uuid.New().String(),
+	}
+	err = report.CreateOutsideReport(reportInfo, outsideReportAttachmentList)
+
+	return
+}
+func ensureDirExists(dirPath string) error {
+	info, err := os.Stat(dirPath)
+	if err == nil {
+		if info.IsDir() {
+			return nil // 目录已存在
+		}
+		return fmt.Errorf("path '%s' exists but is not a directory", dirPath)
+	}
+	if os.IsNotExist(err) {
+		return os.MkdirAll(dirPath, fs.ModePerm)
 	}
+	return err
 }

+ 0 - 102
services/session.go

@@ -1,102 +0,0 @@
-package services
-
-import (
-	"errors"
-	"eta/eta_email_analysis/models/eta"
-	"eta/eta_email_analysis/models/response"
-	"eta/eta_email_analysis/utils"
-	"time"
-)
-
-// CreateEtaSession
-// @Description: 创建ETA会话session
-// @author: Roc
-// @datetime 2024-01-23 17:42:54
-// @param sysUser *eta.Admin
-// @return login *response.LoginResp
-// @return err error
-// @return errMsg string
-func CreateEtaSession(sysUser *eta.Admin) (login response.LoginResp, session *eta.SysSession, err error, errMsg string) {
-	errMsg = `登录失败`
-	login = response.LoginResp{}
-
-	var token string
-	account := utils.MD5(sysUser.AdminName)
-	//// 获取用户未过期的session, 避免过于频繁生成token
-	//expired := time.Now().AddDate(0, 0, 1).Format(utils.FormatDateTime)
-	//session, _ = eta.GetUserUnexpiredSysSession(sysUser.AdminName, expired)
-	//if session != nil && session.AccessToken != "" {
-	//	token = session.AccessToken
-	//} else {
-	//	token = utils.GenToken(account)
-	//	session = new(eta.SysSession)
-	//	session.UserName = sysUser.AdminName
-	//	session.SysUserId = sysUser.AdminId
-	//	session.ExpiredTime = time.Now().AddDate(0, 0, 90)
-	//	session.IsRemember = 1
-	//	session.CreatedTime = time.Now()
-	//	session.LastUpdatedTime = time.Now()
-	//	session.AccessToken = token
-	//	if e := eta.AddSysSession(session); e != nil {
-	//		errMsg = "新增session失败, err: "
-	//		err = errors.New("新增session失败, err: " + e.Error())
-	//		return
-	//	}
-	//}
-
-	token = utils.GenToken(account)
-	session = new(eta.SysSession)
-	session.UserName = sysUser.AdminName
-	session.SysUserId = sysUser.AdminId
-	session.ExpiredTime = time.Now().AddDate(0, 0, 90)
-	session.IsRemember = 1
-	session.CreatedTime = time.Now()
-	session.LastUpdatedTime = time.Now()
-	session.AccessToken = token
-	if e := eta.AddSysSession(session); e != nil {
-		errMsg = "新增session失败, err: "
-		err = errors.New("新增session失败, err: " + e.Error())
-		return
-	}
-
-	login.Authorization = token
-	login.Authorization = "authorization=" + token
-	login.RealName = sysUser.RealName
-	login.AdminId = sysUser.AdminId
-	login.AdminName = sysUser.AdminName
-	login.RoleName = sysUser.RoleName
-	login.SysRoleTypeCode = sysUser.RoleTypeCode //系统角色编码
-	login.RoleTypeCode = sysUser.RoleTypeCode
-	login.Authority = sysUser.Authority
-
-	// 判断实际的角色类型
-	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP {
-		login.RoleTypeCode = utils.ROLE_TYPE_CODE_FICC_SELLER
-	}
-	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_TEAM {
-		login.RoleTypeCode = utils.ROLE_TYPE_CODE_FICC_SELLER
-	}
-	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_DEPARTMENT {
-		login.RoleTypeCode = utils.ROLE_TYPE_CODE_FICC_SELLER
-	}
-	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
-		login.RoleTypeCode = utils.ROLE_TYPE_CODE_RAI_SELLER
-	}
-	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_DEPARTMENT {
-		login.RoleTypeCode = utils.ROLE_TYPE_CODE_RAI_SELLER
-	}
-	if sysUser.RoleName == utils.ROLE_NAME_FICC_DIRECTOR {
-		login.RoleTypeCode = utils.ROLE_TYPE_CODE_FICC_SELLER
-	}
-
-	// 角色产品ID
-	productId := GetProductId(sysUser.RoleTypeCode)
-	productIdName := map[int]string{
-		0:                             "admin",
-		utils.COMPANY_PRODUCT_FICC_ID: utils.COMPANY_PRODUCT_FICC_NAME,
-		utils.COMPANY_PRODUCT_RAI_ID:  utils.COMPANY_PRODUCT_RAI_NAME,
-	}
-	login.ProductName = productIdName[productId]
-
-	return
-}

+ 0 - 372
services/xiangyu/auth.go

@@ -1,372 +0,0 @@
-package xiangyu
-
-import (
-	"encoding/json"
-	"errors"
-	"eta/eta_email_analysis/global"
-	"fmt"
-	"io"
-	"net/http"
-	"strings"
-)
-
-// ErrResp
-// @Description: 错误信息返回
-type ErrResp struct {
-	ErrCode string `json:"errcode" description:"失败编码 1001:缺少参数client_id, 2001:缺少参数access_token, 2006:缺少参数uid, 2002:参数access _token,不正确或过期, 1005:参数client_id非法"`
-	Msg     string `json:"msg" description:"失败信息"`
-}
-
-// GetTokenResp
-// @Description: 获取token返回
-type GetTokenResp struct {
-	ErrResp
-	AccessToken  string `json:"access_token"`
-	RefreshToken string `json:"refresh_token"`
-	Uid          string `json:"uid"`
-	ExpiresIn    int    `json:"expires_in"`
-}
-
-// GetToken
-// @Description: 获取token信息
-// @author: Roc
-// @datetime 2024-01-23 15:40:56
-// @param code string
-// @return resp *GetTokenResp
-// @return err error
-func GetToken(code string) (resp *GetTokenResp, err error) {
-	urlPath := fmt.Sprintf(`/idp/oauth2/getToken?client_id=%s&grant_type=authorization_code&code=%s&client_secret=%s`, global.CONFIG.Xiangyu.SystemCode, code, global.CONFIG.Xiangyu.UserKey)
-
-	if err != nil {
-		return
-	}
-	result, err := HttpPostAuth(urlPath, ``, "application/json")
-	if err != nil {
-		return
-	}
-
-	//  解析响应结果
-	err = json.Unmarshal(result, &resp)
-	if err != nil {
-		return
-	}
-
-	if resp.AccessToken == "" {
-		err = errors.New(fmt.Sprintf("响应代码:%s,错误信息:%s", resp.ErrCode, resp.Msg))
-		return
-	}
-
-	return
-}
-
-// UserInfoResp
-// @Description: 用户信息
-type UserInfoResp struct {
-	ErrResp
-
-	Country     string `json:"country"`
-	SorgId      string `json:"sorgId"`
-	UpdateDate  string `json:"updateDate"`
-	Mail        string `json:"mail"`
-	Gender      string `json:"gender"`
-	LoginType   string `json:"loginType"`
-	Nation      string `json:"nation"`
-	DisplayName string `json:"displayName" description:"姓名"`
-	Uid         string `json:"uid" description:"唯一标识"`
-	LoginName   string `json:"loginName" description:"登录账号"`
-	//PositionNumber          string   `json:"positionNumber"`
-	//Title                   string   `json:"title"`
-	//LoginInterceptFlagTwo   int           `json:"loginInterceptFlagTwo"`
-	//LoginInterceptFlagFour  int           `json:"loginInterceptFlagFour"`
-	//EmployeeNumber          string   `json:"employeeNumber"`
-	//ChangePwdAt             string        `json:"changePwdAt"`
-	////SpRoleList              []interface{} `json:"spRoleList"`
-	//PwdPolicy               string        `json:"pwdPolicy"`
-	//LoginInterceptFlagFive  int           `json:"loginInterceptFlagFive"`
-	//LoginInterceptFlagThree int           `json:"loginInterceptFlagThree"`
-	//IdentityNumber          string  `json:"identityNumber"`
-	//IdentityType            string   `json:"identityType"`
-	//SecAccValid             int           `json:"secAccValid"`
-	//PinyinShortName         string   `json:"pinyinShortName"`
-	//OrgNumber               string   `json:"orgNumber"`
-	//WechatNo                string   `json:"wechatNo"`
-	//OrgNamePath             string        `json:"orgNamePath"`
-	//PasswordModifyRequired  int           `json:"passwordModifyRequired"`
-	//BirthDay                string        `json:"birthDay"`
-	//GivenName               string   `json:"givenName"`
-	//Mobile                  string        `json:"mobile"`
-	//LoginInterceptFlagOne   int           `json:"loginInterceptFlagOne"`
-	//CertSn                  interface{}   `json:"certSn"`
-	//EmployeeType            interface{}   `json:"employeeType"`
-	//OrgCodePath             interface{}   `json:"orgCodePath"`
-	//OtpKey                  interface{}   `json:"otpKey"`
-	//PositionStatus          interface{}   `json:"positionStatus"`
-	//DepartmentNumber        interface{}   `json:"departmentNumber"`
-	//CertDn                  interface{}   `json:"certDn"`
-	//SpNameList              []string      `json:"spNameList"`
-	//IsPassRemind            int           `json:"isPassRemind"`
-}
-
-// GetUserInfo
-// @Description: 获取用户信息
-// @author: Roc
-// @datetime 2024-01-23 15:49:38
-// @param token string
-// @return resp *UserInfoResp
-// @return err error
-func GetUserInfo(token string) (resp *UserInfoResp, err error) {
-	urlPath := fmt.Sprintf(`/idp/oauth2/getUserInfo?client_id=%s&access_token=%s`, global.CONFIG.Xiangyu.SystemCode, token)
-
-	if err != nil {
-		return
-	}
-	result, err := HttpGetAuth(urlPath)
-	if err != nil {
-		return
-	}
-
-	//  解析响应结果
-	err = json.Unmarshal(result, &resp)
-	if err != nil {
-		return
-	}
-
-	if resp.ErrCode != "" {
-		err = errors.New(fmt.Sprintf("响应代码:%s,错误信息:%s", resp.ErrCode, resp.Msg))
-		return
-	}
-
-	return
-}
-
-// CheckTokenResp
-// @Description: 校验token是否有效的返回
-type CheckTokenResp struct {
-	ErrResp
-	Result bool `json:"result" description:"校验结果,true 有效"`
-}
-
-// CheckToken
-// @Description: 校验token是否有效
-// @author: Roc
-// @datetime 2024-01-23 15:54:16
-// @param token string
-// @return isOk bool
-// @return err error
-func CheckToken(token string) (isOk bool, err error) {
-	urlPath := fmt.Sprintf(`/idp/oauth2/checkTokenValid?&access_token=%s`, token)
-
-	if err != nil {
-		return
-	}
-	result, err := HttpGetAuth(urlPath)
-	if err != nil {
-		return
-	}
-
-	var resp *CheckTokenResp
-	//  解析响应结果
-	err = json.Unmarshal(result, &resp)
-	if err != nil {
-		return
-	}
-
-	if resp.ErrCode != "" {
-		err = errors.New(fmt.Sprintf("响应代码:%s,错误信息:%s", resp.ErrCode, resp.Msg))
-		return
-	}
-
-	if resp.Result {
-		isOk = true
-	}
-
-	return
-}
-
-// GetTokenInfo
-// @Description: 查询授权信息
-// @author: Roc
-// @datetime 2024-01-23 15:57:04
-// @param token string
-// @return resp *GetTokenResp
-// @return err error
-func GetTokenInfo(token string) (resp *GetTokenResp, err error) {
-	urlPath := fmt.Sprintf(`/idp/oauth2/getTokenInfo?&access_token=%s`, token)
-
-	if err != nil {
-		return
-	}
-	result, err := HttpGetAuth(urlPath)
-	if err != nil {
-		return
-	}
-
-	//  解析响应结果
-	err = json.Unmarshal(result, &resp)
-	if err != nil {
-		return
-	}
-
-	if resp.ErrCode != "" {
-		err = errors.New(fmt.Sprintf("响应代码:%s,错误信息:%s", resp.ErrCode, resp.Msg))
-		return
-	}
-
-	return
-}
-
-// RefreshToken
-// @Description: 刷新token
-// @author: Roc
-// @datetime 2024-01-23 16:02:03
-// @param refreshToken string
-// @return resp *GetTokenResp
-// @return err error
-func RefreshToken(refreshToken string) (resp *GetTokenResp, err error) {
-	urlPath := fmt.Sprintf(`/idp/oauth2/refreshToken?client_id=%s&grant_type=refresh_token&client_secret=%s&refresh_token=%s`, global.CONFIG.Xiangyu.SystemCode, global.CONFIG.Xiangyu.UserKey, refreshToken)
-
-	if err != nil {
-		return
-	}
-	result, err := HttpPostAuth(urlPath, ``, "application/json")
-	if err != nil {
-		return
-	}
-
-	//  解析响应结果
-	err = json.Unmarshal(result, &resp)
-	if err != nil {
-		return
-	}
-
-	if resp.ErrCode != "" {
-		err = errors.New(fmt.Sprintf("响应代码:%s,错误信息:%s", resp.ErrCode, resp.Msg))
-		return
-	}
-
-	return
-}
-
-// RevokeToken
-// @Description: token销毁
-// @author: Roc
-// @datetime 2024-01-23 16:06:52
-// @param token string
-// @return isOk bool
-// @return err error
-func RevokeToken(token string) (isOk bool, err error) {
-	urlPath := fmt.Sprintf(`/idp/oauth2/revokeToken?&access_token=%s`, token)
-
-	if err != nil {
-		return
-	}
-	result, err := HttpGetAuth(urlPath)
-	if err != nil {
-		return
-	}
-
-	var resp *CheckTokenResp
-	//  解析响应结果
-	err = json.Unmarshal(result, &resp)
-	if err != nil {
-		return
-	}
-
-	if resp.ErrCode != "" {
-		err = errors.New(fmt.Sprintf("响应代码:%s,错误信息:%s", resp.ErrCode, resp.Msg))
-		return
-	}
-
-	if resp.Result {
-		isOk = true
-	}
-
-	return
-}
-
-// HttpPostAuth
-// @Description: post请求
-// @author: Roc
-// @datetime 2024-01-23 16:20:10
-// @param urlPath string
-// @param postData string
-// @param params ...string
-// @return []byte
-// @return error
-func HttpPostAuth(urlPath, postData string, params ...string) ([]byte, error) {
-	if global.CONFIG.Xiangyu.UserAuthHost == `` {
-		return nil, errors.New("统一用户同步接口地址为空")
-	}
-	// 请求地址
-	postUrl := global.CONFIG.Xiangyu.UserAuthHost + urlPath
-
-	body := io.NopCloser(strings.NewReader(postData))
-	client := &http.Client{}
-	req, err := http.NewRequest("POST", postUrl, body)
-	if err != nil {
-		return nil, err
-	}
-	contentType := "application/x-www-form-urlencoded;charset=utf-8"
-	if len(params) > 0 && params[0] != "" {
-		contentType = params[0]
-	}
-	req.Header.Set("content-Type", contentType)
-	resp, err := client.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	defer resp.Body.Close()
-	result, err := io.ReadAll(resp.Body)
-	if err != nil {
-		return nil, err
-	}
-
-	// 日志记录
-	global.FILE_LOG.Debug("统一认证:地址:" + postUrl + ";\n请求参数:" + postData + ";\n返回参数:" + string(result))
-
-	//  解析返回参数,判断是否是json
-	if !json.Valid(result) {
-		err = errors.New("返回参数不是json格式")
-	}
-
-	return result, err
-}
-
-// HttpGetAuth
-// @Description: get请求
-// @author: Roc
-// @datetime 2024-01-23 16:20:16
-// @param urlPath string
-// @return []byte
-// @return error
-func HttpGetAuth(urlPath string) ([]byte, error) {
-	if global.CONFIG.Xiangyu.UserAuthHost == `` {
-		return nil, errors.New("统一用户同步接口地址为空")
-	}
-	// 请求地址
-	getUrl := global.CONFIG.Xiangyu.UserAuthHost + urlPath
-	client := &http.Client{}
-	req, err := http.NewRequest("GET", getUrl, nil)
-	if err != nil {
-		return nil, err
-	}
-	resp, err := client.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	defer resp.Body.Close()
-	result, err := io.ReadAll(resp.Body)
-	if err != nil {
-		return nil, err
-	}
-
-	// 日志记录
-	global.FILE_LOG.Debug("统一认证:地址:" + getUrl + ";\n返回参数:" + string(result))
-
-	//  解析返回参数,判断是否是json
-	if !json.Valid(result) {
-		err = errors.New("返回参数不是json格式")
-	}
-
-	return result, err
-}

+ 0 - 228
services/xiangyu/crm.go

@@ -1,228 +0,0 @@
-package xiangyu
-
-import (
-	"encoding/json"
-	"errors"
-	"eta/eta_email_analysis/global"
-	"fmt"
-	"io"
-	"net/http"
-	"net/url"
-	"strings"
-)
-
-type PostGetIndexDataParamReq struct {
-	PageNum                   int    `json:"pageNum" description:"页码,先取第一页,看一下总条数,然后根据总条数给返回"`
-	PageSize                  int    `json:"pageSize" description:"单页条数,自己填,一页要多少条,最大2000条"`
-	AssetCd                   string `json:"assetCd" description:"资产编码,与资产包编码二选一填写,该类业务数据在数仓中的唯一编码,该编码由数仓提供给项目组"`
-	AssetPkgCd                string `json:"assetPkgCd" description:"资产包编码,与资产编码二选一填写,传入该参数时,将返回该资产包内的所有资产,该编码由数仓提供给项目组"`
-	DataDt                    string `json:"dataDt" description:"数据日期,如2022年5月25日的铝的市价,数据日期则为20220525"`
-	StartDt                   string `json:"startDt" description:"启始时间,格式 YYYYMMDD 如:20211010;不为空时,将过滤出数据日期>=startDate 的数据行"`
-	EndDt                     string `json:"endDt" description:"结束时间,格式 YYYYMMDD 如:20211010;不为空时,将过滤出数据日期<=endDate 的数据行"`
-	Sort                      string `json:"sort" description:"排序字段,默认为0正序;按数据日期字段排序,0为正序 1为倒序"`
-	DataSourceType            string `json:"dataSourceType" description:"内部来源系统参数,可只获取对应数据源数据,不传则默认获取所有数据源信息;参数含义:① CY产研平台;② RPA;③ KSF 金仕达;④CRM参数例子: CY,RPA,KSF,CRM  (参数传递字符串列表,通过逗号分隔)"`
-	InfoLastUpdateStartTime   string `json:"infoLastUpdateStartTime" description:"资产信息数据落到数仓时间,参数:YYYYMMDD HH24:MI:SS 如:20240229 18:00:00 不为空时,将过滤出 资产信息入库时间>=infoLastUpdateStartTime 的数据行"`
-	InfoLastUpdateEndTime     string `json:"infoLastUpdateEndTime" description:"资产信息数据落到数仓时间,参数:YYYYMMDD HH24:MI:SS 如:20240229 18:00:00 不为空时,将过滤出 资产信息入库时间<=infoLastUpdateStartTime 的数据行"`
-	DetailLastUpdateStartTime string `json:"detailLastUpdateStartTime" description:"明细数据落到数仓启始时间,参数:YYYYMMDD HH24:MI:SS 如:20240229 18:00:00 不为空时,将过滤出 资产详细信息入库时间>=detailLastUpdateStartTime 的数据行,建议延迟15分钟抽取"`
-	DetailLastUpdateEndTime   string `json:"detailLastUpdateEndTime" description:"明细数据落到数仓结束时间,参数:YYYYMMDD HH24:MI:SS 如:20240229 18:00:00 不为空时,将过滤出 资产详细信息入库时间<=detailLastUpdateStartTime 的数据行,建议延迟15分钟抽取"`
-
-	//CommonParameters In0 `json:"commonParameters" description:"公共参数"`
-}
-
-func structToURLParams(req interface{}) (string, error) {
-	// 首先,将结构体转换为map[string]interface{}
-	marshaledBytes, err := json.Marshal(req)
-	if err != nil {
-		return "", err
-	}
-
-	var params map[string]interface{}
-	err = json.Unmarshal(marshaledBytes, &params)
-	if err != nil {
-		return "", err
-	}
-
-	// 创建url.Values,它是一个键值对的集合,用于构建URL查询字符串
-	values := url.Values{}
-	for key, value := range params {
-		values.Set(key, fmt.Sprintf("%v", value))
-	}
-
-	// 返回查询字符串
-	return values.Encode(), nil
-}
-
-// CrmBaseResp
-// @Description: Crm基础信息返回
-type CrmBaseResp struct {
-	ErrCode   int         `json:"errCode"`
-	RequestId string      `json:"requestId"`
-	ErrMsg    string      `json:"errMsg"`
-	ApiLog    interface{} `json:"apiLog"`
-}
-
-// GetCrmDataResp
-// @Description: CRM数据接口返回
-type GetCrmDataResp struct {
-	CrmBaseResp
-	Data CrmDataResp `json:"data"`
-}
-
-// CrmDataResp
-// @Description: 实际数据返回
-type CrmDataResp struct {
-	TotalNum int               `json:"totalNum"`
-	PageSize int               `json:"pageSize"`
-	Rows     []CrmDataItemResp `json:"rows"`
-	PageNum  int               `json:"pageNum"`
-}
-
-// CrmDataItemResp
-// @Description: 指标数据返回
-type CrmDataItemResp struct {
-	Price                 float64     `json:"price"`
-	DataDt                string      `json:"datadt"`
-	UpdateTime            string      `json:"updatetime"`
-	AssetCd               string      `json:"assetcd"`
-	MarketName            string      `json:"marketname"`
-	AreaName              string      `json:"areaname"`
-	AssetName             string      `json:"assetname"`
-	Currency              interface{} `json:"currency"`
-	MaterialName          string      `json:"materialname"`
-	SpecName              string      `json:"specname"`
-	BreedName             string      `json:"breedname"`
-	UnitName              string      `json:"unitname"`
-	SourceName            string      `json:"sourcename"`
-	FrequencyName         string      `json:"frequencyname"`
-	CountryName           string      `json:"countryname"`
-	ProvinceName          string      `json:"provincename"`
-	CityName              string      `json:"cityname"`
-	CountyName            string      `json:"countyname"`
-	CompanyName           string      `json:"companyname"`
-	Description           string      `json:"description"`
-	BeginDate             string      `json:"begindate"`
-	EndDate               string      `json:"enddate"`
-	CreateTime            string      `json:"createtime"`
-	Status                interface{} `json:"status"`
-	PublishRuleName       string      `json:"publishrulename"`
-	AuthKind              *string     `json:"authkind"`
-	SmallClassName        interface{} `json:"smallclassname"`
-	DataSource            string      `json:"datasource"`
-	DataSourceType        string      `json:"datasourcetype"`
-	OrginSysSource        interface{} `json:"orginsyssource"`
-	SourceType            interface{} `json:"sourcetype"`
-	DeptCd                string      `json:"deptcd"`
-	DutyDept              string      `json:"dutydept"`
-	DerivativeType        string      `json:"derivativetype"`
-	StkCode               string      `json:"stkcode"`
-	StkName               string      `json:"stkname"`
-	MetricName            string      `json:"metricname"`
-	AssetInfoStockInTime  string      `json:"asset_info_stock_in_time" description:"资产信息数据落到数仓时间,参数:YYYYMMDD HH24:MI:SS;如:20240229 18:00:00"`
-	DetailDataStockInTime string      `json:"detail_data_stock_in_time" description:"明细数据落到数仓时间,参数:YYYYMMDD HH24:MI:SS;如:20240229 18:00:00"`
-}
-
-// PostGetCrmData
-// @Description: 获取CRM数据
-// @author: Roc
-// @datetime 2024-05-14 16:45:40
-// @param req PostGetIndexDataParamReq
-// @return dataResp *CrmDataResp
-// @return err error
-func PostGetCrmData(req PostGetIndexDataParamReq) (dataResp CrmDataResp, err error) {
-	urlPath := `/mpdata/index/data`
-	//req.CommonParameters = In0{
-	//	PageTotal: "",
-	//	PageNo:    "",
-	//	DocType:   "数仓市价服务",
-	//	Property:  "",
-	//	//DocCode:   getDocCode(),
-	//	Source: global.CONFIG.Xiangyu.SystemCode,
-	//	Target: global.CONFIG.Xiangyu.IndexCrmTarget,
-	//}
-
-	queryString, err := structToURLParams(req)
-	if err != nil {
-		fmt.Println("Error:", err)
-		return
-	}
-	urlPath += "?" + queryString
-
-	postData, err := json.Marshal(req)
-	if err != nil {
-		return
-	}
-	result, err := HttpPostXmxyg(urlPath, string(postData))
-	if err != nil {
-		return
-	}
-
-	var resp *GetCrmDataResp
-	//  解析响应结果
-	err = json.Unmarshal(result, &resp)
-	if err != nil {
-		return
-	}
-
-	if resp.ErrCode != 0 {
-		err = errors.New(fmt.Sprintf("响应代码:%d,错误信息:%s", resp.ErrCode, resp.ErrMsg))
-		return
-	}
-
-	dataResp = resp.Data
-
-	return
-}
-
-// HttpPostXmxyg
-// @Description: post请求
-// @author: Roc
-// @datetime 2024-02-27 18:45:30
-// @param urlPath string
-// @param postData string
-// @return []byte
-// @return error
-func HttpPostXmxyg(urlPath, postData string) ([]byte, error) {
-	if global.CONFIG.Xiangyu.IndexCrmHost == `` {
-		return nil, errors.New("crm数据平台地址为空")
-	}
-	// 请求地址
-	postUrl := global.CONFIG.Xiangyu.IndexCrmHost + urlPath
-
-	body := io.NopCloser(strings.NewReader(postData))
-	client := &http.Client{}
-	req, err := http.NewRequest("POST", postUrl, body)
-	if err != nil {
-		return nil, err
-	}
-	req.Header.Set("content-Type", "application/json; charset=utf-8")
-	req.Header.Set("Accept-Encoding", "application/json; charset=utf-8")
-	req.Header.Set("Accept", "application/json; charset=utf-8")
-
-	// 鉴权
-	req.SetBasicAuth(global.CONFIG.Xiangyu.IndexSyncAuthUserName, global.CONFIG.Xiangyu.IndexSyncAuthPwd)
-
-	// 秘钥
-	if global.CONFIG.Xiangyu.IndexKey != `` {
-		req.Header.Set("deipaaskeyauth", global.CONFIG.Xiangyu.IndexKey)
-	}
-
-	resp, err := client.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	defer resp.Body.Close()
-	result, err := io.ReadAll(resp.Body)
-	if err != nil {
-		return nil, err
-	}
-
-	// 日志记录
-	global.FILE_LOG.Debug("crm数据平台:地址:" + postUrl + ";\n请求参数:" + postData + ";\n返回参数:" + string(result))
-
-	//  解析返回参数,判断是否是json
-	if !json.Valid(result) {
-		err = errors.New("返回参数不是json格式")
-	}
-
-	return result, err
-}

+ 0 - 402
services/xiangyu/index.go

@@ -1,402 +0,0 @@
-package xiangyu
-
-import (
-	"encoding/json"
-	"errors"
-	"eta/eta_email_analysis/global"
-	"fmt"
-	"io"
-	"net/http"
-	"strings"
-)
-
-// IndexErrResp
-// @Description: 错误信息返回
-type IndexErrResp struct {
-	ErrCode string `json:"errcode" description:"失败编码 1001:缺少参数client_id, 2001:缺少参数access_token, 2006:缺少参数uid, 2002:参数access _token,不正确或过期, 1005:参数client_id非法"`
-	Msg     string `json:"msg" description:"失败信息"`
-}
-
-// PushResp
-// @Description: push数据返回
-type PushResp struct {
-	IndexErrResp
-	AccessToken  string `json:"access_token"`
-	RefreshToken string `json:"refresh_token"`
-	Uid          string `json:"uid"`
-	ExpiresIn    int    `json:"expires_in"`
-}
-
-// PushIndexReq
-// @Description: 指标推送请求
-type PushIndexReq struct {
-	In0        In0               `json:"in0"`
-	Parameters PushIndexParamReq `json:"parameters" description:"业务报文"`
-}
-
-// PushIndexParamReq
-// @Description: 业务报文
-type PushIndexParamReq struct {
-	SerialID    string             `json:"serialID" description:"流水号"`
-	TableCode   string             `json:"tableCode" description:"数据表编码"`
-	Total       int                `json:"total" description:"本次落表数据总数"`
-	IsEmailWarn int                `json:"isEmailWarn" description:"是否发送预警邮件,(1-是 0-否)"`
-	Data        []PushIndexItemReq `json:"data" description:"报文体,指标数据列表"`
-}
-
-// PushIndexItemReq
-// @Description: 指标数据结构
-type PushIndexItemReq struct {
-	SourceIndexCode string `json:"source_index_code" description:"上游来源指标ID"`
-	IndexCode       string `json:"index_code" description:""`
-	IndexName       string `json:"index_name" description:""`
-	IndexShortName  string `json:"index_short_name" description:""`
-	FrequenceName   string `json:"frequence_name" description:""`
-	UnitName        string `json:"unit_name" description:""`
-	//CountryName          string `json:"country_name" description:""`
-	//ProvinceName         string `json:"province_name" description:""`
-	//AreaName             string `json:"area_name" description:""`
-	//CityName             string `json:"city_name" description:""`
-	//CountyName           string `json:"county_name" description:""`
-	//RegionName           string `json:"region_name" description:""`
-	//CompanyName          string `json:"company_name" description:""`
-	//BreedName            string `json:"breed_name" description:""`
-	//MaterialName         string `json:"material_name" description:""`
-	//SpecName             string `json:"spec_name" description:""`
-	//MarketName           string `json:"market_name" description:""`
-	//DerivativeType       string `json:"derivative_type" description:""`
-	//ContractName         string `json:"contract_name" description:""`
-	//AuthKindName         string `json:"auth_kind_name" description:""`
-	//CustomSmallClassName string `json:"custom_small_class_name" description:""`
-	AssetBeginDate   string `json:"asset_begin_date" description:""`
-	AssetEndDate     string `json:"asset_end_date" description:""`
-	CreateUser       string `json:"create_user" description:""`
-	IndexCreateTime  string `json:"index_create_time" description:""`
-	UpdateUser       string `json:"update_user" description:""`
-	DetailUpdateTime string `json:"detail_update_time" description:""`
-	IndexUpdateTime  string `json:"index_update_time" description:""`
-	//DutyDept         string `json:"duty_dept" description:""`
-	//BusinessDept     string `json:"business_dept" description:""`
-	OrginSource    string `json:"orgin_source" description:""`
-	OrginSysSource string `json:"orgin_sys_source" description:""`
-	SysSource      string `json:"sys_source" description:""`
-	SourceType     string `json:"source_type" description:""`
-	Status         int    `json:"status" description:""`
-}
-
-type PushIndexDataResp struct {
-	Out struct {
-		ReturnCode string `json:"returnCode"`
-		ReturnMsg  string `json:"returnMsg"`
-		Data       int    `json:"data"`
-	} `json:"out"`
-}
-
-// PushIndexData
-// @Description: 指标信息推送
-// @author: Roc
-// @datetime 2024-02-28 17:45:03
-// @param data PushIndexParamReq
-// @return resp *PushDataResp
-// @return err error
-func PushIndexData(data PushBaseParamReq) (resp *PushIndexDataResp, err error) {
-	urlPath := `/DAQ/CY/ProxyServices/pushMarketPricePS`
-	req := PushBaseReq{
-		In0: In0{
-			PageTotal: "",
-			PageNo:    "",
-			DocType:   "pushMarketPricePS",
-			Property:  "",
-			//DocCode:   getDocCode(),
-			Source: global.CONFIG.Xiangyu.SystemCode,
-			Target: global.CONFIG.Xiangyu.IndexSyncTarget,
-		},
-		Parameters: data,
-	}
-
-	postData, err := json.Marshal(req)
-	if err != nil {
-		return
-	}
-	result, err := HttpPostIndex(urlPath, string(postData))
-	if err != nil {
-		return
-	}
-
-	//  解析响应结果
-	err = json.Unmarshal(result, &resp)
-	if err != nil {
-		return
-	}
-
-	if resp.Out.ReturnCode != "S" {
-		err = errors.New(fmt.Sprintf("响应代码:%s,错误信息:%s", resp.Out.ReturnCode, resp.Out.ReturnMsg))
-		return
-	}
-
-	return
-}
-
-// PushIndexValueReq
-// @Description: 指标日期值推送请求
-type PushIndexValueReq struct {
-	In0        In0                    `json:"in0"`
-	Parameters PushIndexValueParamReq `json:"parameters" description:"业务报文"`
-}
-
-// PushIndexValueParamReq
-// @Description: 业务报文
-type PushIndexValueParamReq struct {
-	SerialID    string                  `json:"serialID" description:"流水号"`
-	TableCode   string                  `json:"tableCode" description:"数据表编码"`
-	Total       int                     `json:"total" description:"本次落表数据总数"`
-	IsEmailWarn int                     `json:"isEmailWarn" description:"是否发送预警邮件,(1-是 0-否)"`
-	Data        []PushIndexValueItemReq `json:"data" description:"报文体,指标日期值数据列表"`
-}
-
-// PushIndexValueItemReq
-// @Description: 指标日期值数据结构
-type PushIndexValueItemReq struct {
-	Id           string `json:"id"`
-	IndexCode    string `json:"index_code" description:"指标代码"`
-	Value        string `json:"value" description:"数值"`
-	BusinessDate string `json:"business_date" description:"业务日期(数据日期)"`
-	CreateTime   string `json:"create_time" description:"数据进入ETA的时间"`
-	UpdateTime   string `json:"update_time" description:"eta库中修改数据的时间"`
-	Status       string `json:"status" description:"逻辑删除使用,0-禁用,1-启用"`
-}
-
-// PushEdbValue
-// @Description: 获取token信息
-// @author: Roc
-// @datetime 2024-01-23 15:40:56
-// @param code string
-// @return resp *GetTokenResp
-// @return err error
-func PushEdbValue(data PushBaseParamReq) (resp *PushIndexDataResp, err error) {
-	urlPath := `/DAQ/CY/ProxyServices/pushMarketPricePS`
-	req := PushBaseReq{
-		In0: In0{
-			PageTotal: "",
-			PageNo:    "",
-			DocType:   "pushMarketPricePS",
-			Property:  "",
-			//DocCode:   getDocCode(),
-			Source: global.CONFIG.Xiangyu.SystemCode,
-			Target: global.CONFIG.Xiangyu.IndexSyncTarget,
-		},
-		Parameters: data,
-	}
-
-	postData, err := json.Marshal(req)
-	if err != nil {
-		return
-	}
-	result, err := HttpPostIndex(urlPath, string(postData))
-	if err != nil {
-		return
-	}
-
-	//  解析响应结果
-	err = json.Unmarshal(result, &resp)
-	if err != nil {
-		return
-	}
-
-	if resp.Out.ReturnCode != "S" {
-		err = errors.New(fmt.Sprintf("响应代码:%s,错误信息:%s", resp.Out.ReturnCode, resp.Out.ReturnMsg))
-		return
-	}
-
-	return
-}
-
-// PushBaseReq
-// @Description: 基础请求
-type PushBaseReq struct {
-	In0        In0              `json:"in0"`
-	Parameters PushBaseParamReq `json:"parameters" description:"业务报文"`
-}
-
-// PushBaseParamReq
-// @Description: 基础业务报文
-type PushBaseParamReq struct {
-	SerialID    string      `json:"serialID" description:"流水号"`
-	TableCode   string      `json:"tableCode" description:"数据表编码"`
-	Total       int         `json:"total" description:"本次落表数据总数"`
-	IsEmailWarn int         `json:"isEmailWarn" description:"是否发送预警邮件,(1-是 0-否)"`
-	Data        interface{} `json:"data" description:"报文体,指标日期值数据列表"`
-}
-
-// PushClassifyItemReq
-// @Description: 指标分类数据结构
-type PushClassifyItemReq struct {
-	ClassifyId      int    `json:"classify_id" description:"自增id"`
-	ClassifyType    int    `json:"classify_type" description:"分类类型,0:普通指标分类,1:预测指标分类"`
-	ClassifyName    string `json:"classify_name" description:"分类名称"`
-	ParentId        int    `json:"parent_id" description:"父级id"`
-	HasData         int    `json:"has_data" description:"是否存在指标数据,1:有,2:无"`
-	CreateTime      string `json:"create_time" description:"创建时间"`
-	UpdateTime      string `json:"update_time" description:"修改时间"`
-	SysUserId       int    `json:"sys_user_id" description:"创建人id"`
-	SysUserRealName string `json:"sys_user_real_name" description:"创建人姓名"`
-	Level           int    `json:"level" description:"层级"`
-	UniqueCode      string `json:"unique_code" description:"唯一编码"`
-	SortColumn      int    `json:"sort_column" description:"排序字段,越小越靠前,默认值:10"`
-}
-
-// PushClassify
-// @Description: 推送指标分类
-// @author: Roc
-// @datetime 2024-01-23 15:40:56
-// @param code string
-// @return resp *GetTokenResp
-// @return err error
-func PushClassify(data PushBaseParamReq) (resp *PushIndexDataResp, err error) {
-	urlPath := `/DAQ/CY/ProxyServices/pushMarketPricePS`
-	req := PushBaseReq{
-		In0: In0{
-			PageTotal: "",
-			PageNo:    "",
-			DocType:   "pushMarketPricePS",
-			Property:  "",
-			//DocCode:   getDocCode(),
-			Source: global.CONFIG.Xiangyu.SystemCode,
-			Target: global.CONFIG.Xiangyu.IndexSyncTarget,
-		},
-		Parameters: data,
-	}
-
-	postData, err := json.Marshal(req)
-	if err != nil {
-		return
-	}
-	result, err := HttpPostIndex(urlPath, string(postData))
-	if err != nil {
-		return
-	}
-
-	//  解析响应结果
-	err = json.Unmarshal(result, &resp)
-	if err != nil {
-		return
-	}
-
-	if resp.Out.ReturnCode != "S" {
-		err = errors.New(fmt.Sprintf("响应代码:%s,错误信息:%s", resp.Out.ReturnCode, resp.Out.ReturnMsg))
-		return
-	}
-
-	return
-}
-
-// PushBase
-// @Description: 基础推送接口
-// @author: Roc
-// @datetime 2024-01-23 15:40:56
-// @param code string
-// @return resp *GetTokenResp
-// @return err error
-func PushBase(data PushBaseParamReq) (resp *PushIndexDataResp, err error) {
-	urlPath := `/DAQ/CY/ProxyServices/pushMarketPricePS`
-	req := PushBaseReq{
-		In0: In0{
-			PageTotal: "",
-			PageNo:    "",
-			DocType:   "pushMarketPricePS",
-			Property:  "",
-			//DocCode:   getDocCode(),
-			Source: global.CONFIG.Xiangyu.SystemCode,
-			Target: global.CONFIG.Xiangyu.IndexSyncTarget,
-		},
-		Parameters: data,
-	}
-
-	postData, err := json.Marshal(req)
-	if err != nil {
-		return
-	}
-	result, err := HttpPostIndex(urlPath, string(postData))
-	if err != nil {
-		return
-	}
-
-	//  解析响应结果
-	err = json.Unmarshal(result, &resp)
-	if err != nil {
-		return
-	}
-
-	if resp.Out.ReturnCode != "S" {
-		err = errors.New(fmt.Sprintf("响应代码:%s,错误信息:%s", resp.Out.ReturnCode, resp.Out.ReturnMsg))
-		return
-	}
-
-	return
-}
-
-// PushEdbClassifyItemReq
-// @Description: 指标与目录的关系请求结构
-type PushEdbClassifyItemReq struct {
-	Id         string `json:"id" description:"唯一主键"`
-	ClassifyId int    `json:"classify_id" description:"目录分类ID"`
-	IndexCode  string `json:"index_code" description:"指标ID"`
-	CreateTime string `json:"create_time" description:"创建时间"`
-	CreateUser string `json:"create_user" description:"创建人"`
-	UpdateTime string `json:"update_time" description:"修改时间"`
-	UpdateUser string `json:"update_user" description:"修改人"`
-}
-
-// HttpPostIndex
-// @Description: post请求
-// @author: Roc
-// @datetime 2024-02-27 18:45:30
-// @param urlPath string
-// @param postData string
-// @return []byte
-// @return error
-func HttpPostIndex(urlPath, postData string) ([]byte, error) {
-	if global.CONFIG.Xiangyu.IndexSyncHost == `` {
-		return nil, errors.New("数仓同步接口地址为空")
-	}
-	// 请求地址
-	postUrl := global.CONFIG.Xiangyu.IndexSyncHost + urlPath
-
-	body := io.NopCloser(strings.NewReader(postData))
-	client := &http.Client{}
-	req, err := http.NewRequest("POST", postUrl, body)
-	if err != nil {
-		return nil, err
-	}
-	req.Header.Set("content-Type", "application/json; charset=utf-8")
-	req.Header.Set("Accept-Encoding", "application/json; charset=utf-8")
-	req.Header.Set("Accept", "application/json; charset=utf-8")
-
-	// 鉴权
-	req.SetBasicAuth(global.CONFIG.Xiangyu.IndexSyncAuthUserName, global.CONFIG.Xiangyu.IndexSyncAuthPwd)
-
-	// 秘钥
-	if global.CONFIG.Xiangyu.IndexKey != `` {
-		req.Header.Set("deipaaskeyauth", global.CONFIG.Xiangyu.IndexKey)
-	}
-
-	resp, err := client.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	defer resp.Body.Close()
-	result, err := io.ReadAll(resp.Body)
-	if err != nil {
-		return nil, err
-	}
-
-	// 日志记录
-	global.FILE_LOG.Debug("指标同步服务:地址:" + postUrl + ";\n请求参数:" + postData + ";\n返回参数:" + string(result))
-
-	//  解析返回参数,判断是否是json
-	if !json.Valid(result) {
-		err = errors.New("返回参数不是json格式")
-	}
-
-	return result, err
-}

+ 0 - 578
services/xiangyu/user.go

@@ -1,578 +0,0 @@
-package xiangyu
-
-import (
-	"encoding/json"
-	"errors"
-	"eta/eta_email_analysis/global"
-	"eta/eta_email_analysis/utils"
-	"fmt"
-	"io"
-	"net/http"
-	"strings"
-	"time"
-)
-
-// LoginReq
-// @Description: 登录请求参数
-type LoginReq struct {
-	SystemCode     string `json:"systemCode" description:"来源系统"`
-	In0            In0    `json:"in0"`
-	IntegrationKey string `json:"integrationKey" description:"集成密钥"`
-}
-
-// In0
-// @Description: 通用参数
-type In0 struct {
-	PageTotal string `json:"pageTotal" description:"总页数"`
-	PageNo    string `json:"pageNo" description:"当前请求页"`
-	DocType   string `json:"docType" description:"单据类型"`
-	Property  string `json:"property" description:"备用字段"`
-	DocCode   string `json:"docCode" description:"单据号码"`
-	Source    string `json:"source" description:"来源系统"`
-	Target    string `json:"target" description:"目标系统"`
-}
-
-// BaseResponse
-// @Description: 基础返回数据返回
-type BaseResponse struct {
-	ReturnCode string `json:"returnCode" description:"响应代码,成功--S,失败--F"`
-	ReturnMsg  string `json:"returnMsg" description:"响应消息"`
-	Success    bool   `description:"true 执行成功,false 执行失败"`
-	Message    string `description:"消息"`
-}
-
-// LoginResp
-// @Description:  登录响应参数
-type LoginResp struct {
-	Out struct {
-		ReturnCode string `json:"returnCode" description:"响应代码,成功--S,失败--F"`
-		ReturnMsg  string `json:"returnMsg" description:"响应消息"`
-		TokenId    string `json:"tokenId" description:"令牌id,login接口生成"`
-		Success    bool   `description:"true 执行成功,false 执行失败"`
-		Message    string `description:"消息"`
-	} `json:"out"`
-}
-
-// Login
-// @Description: 第三方应用系统集成统一身份管理平台,通过login接口进行身份验证,获取token,用于后续调用身份信息同步接口
-// @author: Roc
-// @datetime 2024-01-16 16:20:10
-// @return tokenId string
-// @return err error
-func Login() (tokenId string, err error) {
-	urlPath := `/IAM/XYGIntegrationService/login/ProxyServices/loginPS`
-	req := LoginReq{
-		SystemCode: global.CONFIG.Xiangyu.SystemCode,
-		In0: In0{
-			PageTotal: "",
-			PageNo:    "",
-			DocType:   "login",
-			Property:  "",
-			//DocCode:   getDocCode(),
-			Source: global.CONFIG.Xiangyu.SystemCode,
-			Target: global.CONFIG.Xiangyu.UserSyncTarget,
-		},
-		IntegrationKey: global.CONFIG.Xiangyu.UserKey,
-	}
-
-	postData, err := json.Marshal(req)
-	if err != nil {
-		return
-	}
-	result, err := HttpPost(urlPath, string(postData), "application/json")
-	if err != nil {
-		return
-	}
-
-	//  解析响应结果
-	var resp *LoginResp
-	err = json.Unmarshal(result, &resp)
-	if err != nil {
-		return
-	}
-
-	if resp.Out.Success == false {
-		err = errors.New(fmt.Sprintf("响应代码:%s,响应消息:%s,错误信息:%s", resp.Out.ReturnCode, resp.Out.ReturnMsg, resp.Out.Message))
-		return
-	}
-
-	if resp.Out.TokenId == "" {
-		err = errors.New(fmt.Sprintf("响应代码:%s,响应消息:%s,错误信息:%s", resp.Out.ReturnCode, resp.Out.ReturnMsg, resp.Out.Message))
-		return
-	}
-
-	tokenId = resp.Out.TokenId
-
-	return
-}
-
-// LogoutReq
-// @Description: 清除tokenId的请求参数
-type LogoutReq struct {
-	SystemCode string `json:"systemCode" description:"来源系统"`
-	In0        In0    `json:"in0"`
-	TokenId    string `json:"tokenId" description:"令牌id,login接口生成"`
-}
-
-// Logout
-// @Description: 第三方应用系统集成统一身份管理平台,身份信息同步完成后,调用logout接口清除tokenId,结束整个身份信息同步流程
-// @author: Roc
-// @datetime 2024-01-16 13:53:12
-// @param tokenId string
-// @return err error
-func Logout(tokenId string) (err error) {
-	urlPath := `/IAM/XYGIntegrationService/logout/ProxyServices/logoutPS`
-	req := LogoutReq{
-		SystemCode: global.CONFIG.Xiangyu.SystemCode,
-		In0: In0{
-			PageTotal: "",
-			PageNo:    "",
-			DocType:   "logout",
-			Property:  "",
-			DocCode:   getDocCode(),
-			Source:    global.CONFIG.Xiangyu.SystemCode,
-			Target:    global.CONFIG.Xiangyu.UserSyncTarget,
-		},
-		TokenId: tokenId,
-	}
-
-	postData, err := json.Marshal(req)
-	if err != nil {
-		return
-	}
-	result, err := HttpPost(urlPath, string(postData), "application/json")
-	if err != nil {
-		return
-	}
-
-	//  解析响应结果
-	var resp *LoginResp
-	err = json.Unmarshal(result, &resp)
-	if err != nil {
-		return
-	}
-
-	if resp.Out.Success == false {
-		err = errors.New(fmt.Sprintf("响应代码:%s,响应消息:%s,错误信息:%s", resp.Out.ReturnCode, resp.Out.ReturnMsg, resp.Out.Message))
-		return
-	}
-
-	return
-}
-
-// PullTaskResp
-// @Description: 开始同步用户的接口返回数据
-type PullTaskResp struct {
-	BaseResponse
-	ObjectCode string `json:"objectCode" description:"对象代码,BIM中注册对象代码:账号:T_ACC;机构:T_ORC;岗位:T_POS"`
-	Id         string `json:"id" description:"身份管理平台内部对象ID"`
-	TaskId     string `json:"taskId" description:"身份管理平台下拉任务ID"`
-	EffectOn   string `json:"effectOn" description:"任务操作类型;创建:CREATED、更新:UPDATED、禁用:DISABLED、启用:ENABLED"`
-	Timestamp  int64  `json:"timestamp" description:"BIM当前时间戳"`
-	ObjectType string `json:"objectType" description:"对象类型:账号:TARGET_ACCOUNT、机构;TARGET_ORGANIZATION、资源:TARGET_RESOURCE、角色:TARGET_ROLE"`
-	Data       string `json:"data" description:"任务数据,JSON格式,具体数据结构根据任务类型不同而不同"`
-}
-
-// AccountData
-// @Description: 账号对象信息
-type AccountData struct {
-	Username     string      `json:"username"`
-	Password     interface{} `json:"password"`
-	Fullname     string      `json:"fullname"`
-	IsDisabled   bool        `json:"isDisabled"`
-	StartDate    interface{} `json:"startDate"`
-	EndDate      interface{} `json:"endDate"`
-	IsAdmin      bool        `json:"isAdmin"`
-	CompanyEmail interface{} `json:"companyEmail"`
-	CompanyPlate string      `json:"companyPlate"`
-	DepartName   string      `json:"departName"`
-	Departld     string      `json:"departld"`
-	CompanyName  string      `json:"companyName"`
-	Companyld    string      `json:"companyld"`
-	Sex          string      `json:"sex"`
-	PyName       string      `json:"pyName"`
-	Personld     string      `json:"personld"`
-	IdCard       interface{} `json:"idCard"`
-	EmployeeNo   string      `json:"employeeNo"`
-	Mobile       interface{} `json:"mobile"`
-	ScEmail      interface{} `json:"ScEmail"`
-	Email        interface{} `json:"email"`
-}
-
-// SyncTaskResp
-// @Description:  全量同步的响应数据
-// 1.objectType 为TARGET_ACCOUNT   时,表示下拉数据为账号信息。
-// 2.objectType 为TARGET_ORGANIZATION  时,表示下拉数据为机构(公司和部门)信息。
-// 3.objectType 为TARGET_RESOURCE并且objectCode为T_USR时,表示下拉数据为HR人员信息。
-// 4.objectType为TARGET_RESOURCE  并且objectCode为T_POS 时,表示下拉数据为岗位信息。
-// 5.objectType 为TARGET_RESOURCE并且objectCode为T_SEQ时,表示下拉数据为岗位序列信息
-type SyncTaskResp struct {
-	Out struct {
-		ReturnCode string `json:"returnCode" description:"响应代码,成功--S,失败--F"`
-		ReturnMsg  string `json:"returnMsg" description:"响应消息"`
-		ObjectCode string `json:"objectCode" description:"BIM中注册对象代码:账号:T_ACC;机构:T_ORC;岗位:T_POS"`
-		Success    bool   `description:"true 执行成功,false 执行失败"`
-		Message    string `description:"消息"`
-		Id         string `json:"id"`
-		Timestamp  int64  `json:"timestamp"`
-		ObjectType string `json:"objectType" description:"对象类型:账号:TARGET_ACCOUNT、机构;TARGET_ORGANIZATION、资源:TARGET_RESOURCE、角色:TARGET_ROLE"`
-	} `json:"out"`
-}
-
-// SyncTaskUserResp
-// @Description:  全量同步的账号响应数据
-type SyncTaskUserResp struct {
-	Out struct {
-		ReturnCode string   `json:"returnCode" description:"响应代码,成功--S,失败--F"`
-		ReturnMsg  string   `json:"returnMsg" description:"响应消息"`
-		ObjectCode string   `json:"objectCode" description:"BIM中注册对象代码:账号:T_ACC;机构:T_ORC;岗位:T_POS"`
-		Success    bool     `description:"true 执行成功,false 执行失败"`
-		Message    string   `description:"消息"`
-		Id         string   `json:"id"`
-		Timestamp  int64    `json:"timestamp"`
-		ObjectType string   `json:"objectType" description:"对象类型:账号:TARGET_ACCOUNT、机构;TARGET_ORGANIZATION、资源:TARGET_RESOURCE、角色:TARGET_ROLE"`
-		Data       UserData `json:"data"`
-	} `json:"out"`
-}
-
-// UserData
-// @Description: 用户账户信息
-type UserData struct {
-	Username       string      `json:"username" description:"统一登录名,和AD账号一致"`
-	Password       string      `json:"password" description:"密码"`
-	FullName       string      `json:"fullname" description:"姓名"`
-	IsDisabled     bool        `json:"isDisabled" description:"状态(true禁用,false启用)"`
-	StartDate      interface{} `json:"startDate" description:""`
-	EndDate        interface{} `json:"endDate" description:""`
-	PositionId     string      `json:"positionId" description:"HR人员中所属岗位ID(主岗职位记录中的)"`
-	DepartId       string      `json:"departId" description:"HR人员中所属部门ID(主岗职位记录中的)"`
-	CompanyId      string      `json:"companyId" description:"HR人员中所属公司ID(主岗职位记录中的)"`
-	RefOrgid       interface{} `json:"ref_orgid" description:""`
-	PositionName   string      `json:"positionName" description:"HR人员中所属岗位名称(主岗职位记录中的)"`
-	CompanyName    string      `json:"companyName" description:"HR人员中所属公司名称(主岗职位记录中的)"`
-	DepartmentName string      `json:"departmentName" description:"HR人员中所属部门名称(主岗职位记录中的)"`
-	Mobile         string      `json:"mobile" description:"手机号"`
-	OfficePhone    string      `json:"officePhone" description:""`
-	Sex            string      `json:"sex" description:"性别(1男,2女)"`
-	EmployeeNo     string      `json:"employeeNo" description:"员工号。"`
-}
-
-// SyncTask
-// @Description: 第三方应用系统集成统一身份管理平台,通过调用syncTask同步接口,从统一身份管理平台全量同步数据(账号、机构、岗位
-// @author: Roc
-// @datetime 2024-01-18 13:30:38
-// @param tokenId string
-// @return resp *BaseResponse
-// @return err error
-func SyncTask(tokenId string) (userResp *SyncTaskUserResp, err error) {
-	urlPath := `/IAM/XYGIntegrationService/syncTask/ProxyServices/syncTaskPS`
-	req := LogoutReq{
-		SystemCode: global.CONFIG.Xiangyu.SystemCode,
-		In0: In0{
-			PageTotal: "",
-			PageNo:    "",
-			DocType:   "syncTask",
-			Property:  "",
-			DocCode:   getDocCode(),
-			Source:    global.CONFIG.Xiangyu.SystemCode,
-			Target:    global.CONFIG.Xiangyu.UserSyncTarget,
-		},
-		TokenId: tokenId,
-	}
-
-	postData, err := json.Marshal(req)
-	if err != nil {
-		return
-	}
-	result, err := HttpPost(urlPath, string(postData), "application/json")
-	if err != nil {
-		return
-	}
-
-	var baseResp *SyncTaskResp
-	err = json.Unmarshal(result, &baseResp)
-	if err != nil {
-		return
-	}
-
-	if baseResp.Out.Success == false {
-		err = errors.New(fmt.Sprintf("响应代码:%s,响应消息:%s,错误信息:%s", baseResp.Out.ReturnCode, baseResp.Out.ReturnMsg, baseResp.Out.Message))
-		return
-	}
-
-	// 如果不是账号信息的话,那么就过滤,不做处理
-	if baseResp.Out.ObjectType != "TARGET_ACCOUNT" {
-		return
-	}
-
-	//  解析数据 获取账号信息
-	err = json.Unmarshal(result, &userResp)
-	if err != nil {
-		return
-	}
-
-	return
-}
-
-// SyncFinishReq
-// @Description: 结束同步的接口请求
-type SyncFinishReq struct {
-	SystemCode string      `json:"systemCode" description:"来源系统"`
-	In0        In0         `json:"in0"`
-	TokenId    string      `json:"tokenId" description:"令牌id,login接口生成"`
-	ObjectCode string      `json:"objectCode" description:"对象代码,BIM中注册对象代码"`
-	ObjectType string      `json:"objectType" description:"对象类型:账号:TARGET__ACCOUNT、机构:TARGET_ORGANIZATION、资源:TARGET__RESOURCE、角色:TARGET_ROLE"`
-	Id         string      `json:"id" description:"BIM中对象ID,从syncTask响应中获取"`
-	Success    bool        `json:"success" description:"成功--true,失败--false"`
-	Data       interface{} `json:"data" description:"默认给空Map对象{)不能为null"`
-	Guid       string      `json:"guid" description:"下游系统中对象主键字段success=true时必须"`
-	Message    string      `json:"message" description:"success=false时必须"`
-}
-
-// SyncFinish
-// @Description: syncFinish 接口需要配合syncTask 接 口 同 时 使 用 ,syncFinish 接口作用是:应用系统调用syncTask  接口同步数据,并对数据做处理后,将结果通过syncFinish接口回写到统一身份管理平台
-// @author: Roc
-// @datetime 2024-01-18 13:30:38
-// @param tokenId string
-// @return resp *BaseResponse
-// @return err error
-func SyncFinish(tokenId, objectCode, objectType, id, guid, message string, success bool) (err error) {
-	urlPath := `/IAM/XYGIntegrationService/syncFinish/ProxyServices/syncFinishPS`
-
-	req := SyncFinishReq{
-		SystemCode: global.CONFIG.Xiangyu.SystemCode,
-		In0: In0{
-			PageTotal: "",
-			PageNo:    "",
-			DocType:   "syncFinish",
-			Property:  "",
-			DocCode:   getDocCode(),
-			Source:    global.CONFIG.Xiangyu.SystemCode,
-			Target:    global.CONFIG.Xiangyu.UserSyncTarget,
-		},
-		TokenId:    tokenId,
-		ObjectCode: objectCode,
-		ObjectType: objectType,
-		Id:         id,
-		Success:    success,
-		Data:       struct{}{},
-		Guid:       guid,
-		Message:    message,
-	}
-
-	postData, err := json.Marshal(req)
-	if err != nil {
-		return
-	}
-	result, err := HttpPost(urlPath, string(postData), "application/json")
-	if err != nil {
-		return
-	}
-
-	//  解析响应结果
-	var resp *LoginResp
-	err = json.Unmarshal(result, &resp)
-	if err != nil {
-		return
-	}
-
-	if resp.Out.Success == false {
-		err = errors.New(fmt.Sprintf("响应代码:%s,响应消息:%s,错误信息:%s", resp.Out.ReturnCode, resp.Out.ReturnMsg, resp.Out.Message))
-		return
-	}
-
-	return
-}
-
-// PullTaskUserResp
-// @Description:  增量同步的账号响应数据
-type PullTaskUserResp struct {
-	Out struct {
-		ReturnCode string   `json:"returnCode" description:"响应代码,成功--S,失败--F"`
-		ReturnMsg  string   `json:"returnMsg" description:"响应消息"`
-		ObjectCode string   `json:"objectCode" description:"BIM中注册对象代码:账号:T_ACC;机构:T_ORC;岗位:T_POS"`
-		Success    bool     `description:"true 执行成功,false 执行失败"`
-		Message    string   `description:"消息"`
-		Id         string   `json:"id" description:"身份管理平台内部对象ID"`
-		Timestamp  int64    `json:"timestamp"`
-		ObjectType string   `json:"objectType" description:"对象类型:账号:TARGET_ACCOUNT、机构;TARGET_ORGANIZATION、资源:TARGET_RESOURCE、角色:TARGET_ROLE"`
-		Data       UserData `json:"data"`
-		GUid       string   `json:"guid" description:"下游数据主键,下游系统下拉到的数据后,若要做更新、启 用、禁用操作,可根据此字段查询到对应记录。"`
-		EffectOn   string   `json:"effectOn" description:"作用点,任务操作类型;创建:CREATED、更新:UPDATED、禁用:DISABLED、启用:ENABLED。"`
-		TaskId     string   `json:"Taskid" description:"任务id,身份管理平台下拉任务ID"`
-	} `json:"out"`
-}
-
-// PullTask
-// @Description: 第三方应用系统集成统一身份管理平台,通过调用pulITask 下拉接口,从统一身份管理平台获取身份信息(机构、账号、岗位)。  注:下拉接口只会从统一身份管理平台下拉变更(新增、更新、启用、禁用)的记录,并且每一条变更记录在统一身份管理平台,都是 以待处理任务形式存在。 pullTask 接口下拉逻辑为:每调用一次下拉接口,获取一条待处理任务(任务中有详细身份数据)。当接口响应中 "objectCode"  为N U L L 时 , 表 示 统 一 身 份 管 理 平 台 待 处 理 任 务 全 部 下 拉 完 成 。
-// @Description: 这个接口只会返回一条数据,所以同步账号的时候,需要循环调用
-// @author: Roc
-// @datetime 2024-01-16 14:04:47
-// @param tokenId string
-// @return resp *BaseResponse
-// @return err error
-func PullTask(tokenId string) (userResp *PullTaskUserResp, err error) {
-	urlPath := `/IAM/XYGIntegrationService/pullTask/ProxyServices/pullTaskPS`
-	req := LogoutReq{
-		SystemCode: global.CONFIG.Xiangyu.SystemCode,
-		In0: In0{
-			PageTotal: "",
-			PageNo:    "",
-			DocType:   "pullTask",
-			Property:  "",
-			DocCode:   getDocCode(),
-			Source:    global.CONFIG.Xiangyu.SystemCode,
-			Target:    global.CONFIG.Xiangyu.UserSyncTarget,
-		},
-		TokenId: tokenId,
-	}
-
-	postData, err := json.Marshal(req)
-	if err != nil {
-		return
-	}
-	result, err := HttpPost(urlPath, string(postData), "application/json")
-	if err != nil {
-		return
-	}
-
-	var baseResp *SyncTaskResp
-	err = json.Unmarshal(result, &baseResp)
-	if err != nil {
-		return
-	}
-
-	if baseResp.Out.Success == false {
-		err = errors.New(fmt.Sprintf("响应代码:%s,响应消息:%s,错误信息:%s", baseResp.Out.ReturnCode, baseResp.Out.ReturnMsg, baseResp.Out.Message))
-		return
-	}
-
-	// 如果不是账号信息的话,那么就过滤,不做处理
-	if baseResp.Out.ObjectType != "TARGET_ACCOUNT" {
-		return
-	}
-
-	//  解析数据 获取账号信息
-	err = json.Unmarshal(result, &userResp)
-	if err != nil {
-		return
-	}
-
-	return
-}
-
-type PullFinishReq struct {
-	SystemCode string `json:"systemCode" description:"来源系统"`
-	In0        In0    `json:"in0"`
-	TokenId    string `json:"tokenId" description:"令牌id,login接口生成"`
-	TaskId     string `json:"taskId" description:"任务ID,pullTask获取的下拉任务ID"`
-	Guid       string `json:"guid" description:"唯一标识,第三方系统中对象唯一标识success=true时必须"`
-	Success    bool   `json:"success" description:"true 成功,false 失败"`
-	Message    string `json:"message" description:"错误消息,success=false时必须"`
-}
-
-// PullFinish
-// @Description: pullFinish接口作用是:应用系统调用pullTask 接口下拉数据,并对数据做处理后,将结果通过pullFinish接口回写到统一身份管理平台,统一身份管理平台根据结果标记下拉任务状态。
-// @Description: pullFinish接口需要配合pullTask 接口同时使用。
-// @author: Roc
-// @datetime 2024-01-16 14:17:27
-// @param tokenId string
-// @param taskId string
-// @param guid string
-// @param success bool
-// @param message string
-// @return resp *BaseResponse
-// @return err error
-func PullFinish(tokenId, taskId, guid, message string, success bool) (err error) {
-	urlPath := `/IAM/XYGIntegrationService/pullFinish/ProxyServices/pullFinishPS`
-	req := PullFinishReq{
-		SystemCode: global.CONFIG.Xiangyu.SystemCode,
-		In0: In0{
-			PageTotal: "",
-			PageNo:    "",
-			DocType:   "pullFinish",
-			Property:  "",
-			DocCode:   getDocCode(),
-			Source:    global.CONFIG.Xiangyu.SystemCode,
-			Target:    global.CONFIG.Xiangyu.UserSyncTarget,
-		},
-		TokenId: tokenId,
-		TaskId:  taskId,
-		Guid:    guid,
-		Success: success,
-		Message: message,
-	}
-
-	postData, err := json.Marshal(req)
-	if err != nil {
-		return
-	}
-	result, err := HttpPost(urlPath, string(postData), "application/json")
-	if err != nil {
-		return
-	}
-
-	//  解析响应结果
-	var resp *LoginResp
-	err = json.Unmarshal(result, &resp)
-	if err != nil {
-		return
-	}
-
-	if resp.Out.Success == false {
-		err = errors.New(fmt.Sprintf("响应代码:%s,响应消息:%s,错误信息:%s", resp.Out.ReturnCode, resp.Out.ReturnMsg, resp.Out.Message))
-		return
-	}
-
-	return
-}
-
-// getDocCode
-// @Description: 获取单据号码
-// @author: Roc
-// @datetime 2024-01-16 10:29:02
-// @return string
-func getDocCode() string {
-	return fmt.Sprintf("%s-%s", time.Now().Format(utils.FormatDateTimeUnSpace), utils.GetRandStringNoSpecialChar(32))
-}
-
-func HttpPost(urlPath, postData string, params ...string) ([]byte, error) {
-	if global.CONFIG.Xiangyu.UserSyncHost == `` {
-		return nil, errors.New("统一用户同步接口地址为空")
-	}
-	// 请求地址
-	postUrl := global.CONFIG.Xiangyu.UserSyncHost + urlPath
-
-	//body := strings.NewReader(postData)
-	body := io.NopCloser(strings.NewReader(postData))
-	client := &http.Client{}
-	req, err := http.NewRequest("POST", postUrl, body)
-	if err != nil {
-		return nil, err
-	}
-	contentType := "application/x-www-form-urlencoded;charset=utf-8"
-	if len(params) > 0 && params[0] != "" {
-		contentType = params[0]
-	}
-	req.Header.Set("content-Type", contentType)
-	req.SetBasicAuth(global.CONFIG.Xiangyu.UserSyncAuthUserName, global.CONFIG.Xiangyu.UserSyncAuthPwd)
-	resp, err := client.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	defer resp.Body.Close()
-	result, err := io.ReadAll(resp.Body)
-	if err != nil {
-		return nil, err
-	}
-
-	// 日志记录
-	global.FILE_LOG.Debug("统一身份:地址:" + postUrl + ";\n请求参数:" + postData + ";\n返回参数:" + string(result))
-
-	//  解析返回参数,判断是否是json
-	if !json.Valid(result) {
-		err = errors.New("返回参数不是json格式")
-	}
-
-	return result, err
-}

+ 24 - 0
utils/common.go

@@ -953,3 +953,27 @@ func InArrayByInt(idStrList []int, searchId int) (has bool) {
 	}
 	return
 }
+
+// IsErrNoRow
+// @Description: 判断是否是gorm的查询不到数据的报错
+// @param err
+// @return bool
+func IsErrNoRow(err error) bool {
+	if err == nil {
+		return false
+	}
+	return errors.Is(err, gorm.ErrRecordNotFound)
+}
+
+// ContainsWholeWord
+// @Description: 匹配是否存在该单词
+// @author: Roc
+// @datetime 2024-09-30 13:59:45
+// @param s string
+// @param word string
+// @return bool
+func ContainsWholeWord(s string, word string) bool {
+	pattern := fmt.Sprintf(`\b%s\b`, regexp.QuoteMeta(word))
+	re := regexp.MustCompile(pattern)
+	return re.MatchString(s)
+}

+ 3 - 73
utils/constants.go

@@ -24,79 +24,9 @@ const (
 )
 
 const (
-	APPNAME = "ETA桥接服务"
+	APPNAME = "ETA邮箱监听服务"
 )
 
-const (
-	CACHE_CRM_AUTH_CODE_PREFIX = "hz_crm_eta:crm_auth_code_" // 免密登录Code-CRM
-	CACHE_ETA_AUTH_CODE_PREFIX = "hz_crm_eta:eta_auth_code_" // 免密登录Code-ETA
-	CACHE_EDB_SMM_SERVER_TOKEN = "edb:smm_server_token"      //smm调用凭证
-)
-
-// 管理员,ficc管理员,ficc销售,权益管理员,权益销售。
-// 角色类型/类型编码
-const (
-	ROLE_TYPE_ADMIN       = "管理员"
-	ROLE_TYPE_FICC_ADMIN  = "ficc管理员"
-	ROLE_TYPE_FICC_SELLER = "ficc销售"
-	ROLE_TYPE_RAI_ADMIN   = "权益管理员"
-	ROLE_TYPE_RAI_SELLER  = "权益销售"
-
-	ROLE_TYPE_FICC_GROUP      = "ficc销售组长"
-	ROLE_TYPE_FICC_MANAGER    = "ficc销售主管"
-	ROLE_TYPE_RAI_GROUP       = "权益组长"
-	ROLE_TYPE_FICC_DEPARTMENT = "ficc部门经理"
-	ROLE_TYPE_RAI_DEPARTMENT  = "权益部门经理"
-	ROLE_TYPE_FICC_RESEARCHR  = "ficc研究员"
-	ROLE_TYPE_RAI_RESEARCHR   = "权益研究员"
-	ROLE_NAME_FICC_DIRECTOR   = "ficc销售经理" // 实际角色类型为ficc销售主管
-
-	ROLE_TYPE_CODE_ADMIN           = "admin"           //管理员
-	ROLE_TYPE_CODE_FICC_ADMIN      = "ficc_admin"      //ficc管理员
-	ROLE_TYPE_CODE_FICC_SELLER     = "ficc_seller"     //ficc销售
-	ROLE_TYPE_CODE_RAI_ADMIN       = "rai_admin"       //权益管理员
-	ROLE_TYPE_CODE_RAI_SELLER      = "rai_seller"      //权益销售
-	ROLE_TYPE_CODE_FICC_GROUP      = "ficc_group"      //ficc销售主管
-	ROLE_TYPE_CODE_RAI_GROUP       = "rai_group"       //ficc组长
-	ROLE_TYPE_CODE_FICC_DEPARTMENT = "ficc_department" //ficc部门经理
-	ROLE_TYPE_CODE_RAI_DEPARTMENT  = "rai_department"  //权益部门经理
-	ROLE_TYPE_CODE_FICC_RESEARCHR  = "ficc_researcher" //ficc研究员
-	ROLE_TYPE_CODE_RESEARCHR       = "researcher"      //ficc研究员(最早定义的)
-	ROLE_TYPE_CODE_RAI_RESEARCHR   = "rai_researcher"  //权益研究员
-	ROLE_TYPE_CODE_COMPLIANCE      = "compliance"      //合规角色
-	ROLE_TYPE_CODE_FINANCE         = "finance"         //财务角色
-	ROLE_TYPE_CODE_FICC_TEAM       = "ficc_team"       //ficc销售组长
-)
-
-const (
-	COMPANY_PRODUCT_FICC_ID   = 1
-	COMPANY_PRODUCT_FICC_NAME = "ficc"
-	COMPANY_PRODUCT_RAI_ID    = 2
-	COMPANY_PRODUCT_RAI_NAME  = "权益"
-)
-
-// 系统来源
-const (
-	SOURCE_CRM_FLAG = 1
-	SOURCE_ETA_FLAG = 2
-)
-
-// 同步角色和用户的缓存队列key
-const (
-	CACHE_SYNC_ADMIN        = "hz_crm_eta:sync_admin"
-	CACHE_SYNC_ROLE         = "hz_crm_eta:sync_role"
-	CACHE_SYNC_DEPARTMENT   = "hz_crm_eta:sync_department"
-	CACHE_SYNC_GROUP        = "hz_crm_eta:sync_group"
-	CACHE_SYNC_USER_EN_ROLE = "hz_crm_eta:sync_user_en_role" // 同步用户英文权限角色缓存队列key
-)
-
-const CrmEtaAuthorization = "NIi1RbEmH0C2rksXtPGDPBBgRgTZY87Q"
-
-// 自用商户号
-const (
-	BusinessCodeSandbox = "E2023080700" // ETA体验版
-	BusinessCodeRelease = "E2023080900" // 弘则ETA
-)
+const Authorization = "FJSJDFSOJOIAFNGIEJOSNNOJIUTNVNAQ320KMDSJFA"
 
-const CACHE_MYSQL_MASTER_FILENAME = "eta:mysql:binlog:filename"
-const CACHE_MYSQL_MASTER_POSITION = "eta:mysql:binlog:position"
+const BatchSize = 500

+ 87 - 0
utils/mail/charset_reader.go

@@ -0,0 +1,87 @@
+package mail
+
+import (
+	"fmt"
+	"golang.org/x/text/encoding/charmap"
+	"golang.org/x/text/encoding/simplifiedchinese"
+	"golang.org/x/text/transform"
+	"io"
+	"strings"
+)
+
+var charsetMap = map[string]transform.Transformer{
+	"gb2312":         simplifiedchinese.GBK.NewDecoder(),
+	"gbk":            simplifiedchinese.GBK.NewDecoder(),
+	"ibm037":         charmap.CodePage037.NewDecoder(),
+	"ibm437":         charmap.CodePage437.NewDecoder(),
+	"ibm850":         charmap.CodePage850.NewDecoder(),
+	"ibm852":         charmap.CodePage852.NewDecoder(),
+	"ibm855":         charmap.CodePage855.NewDecoder(),
+	"ibm858":         charmap.CodePage858.NewDecoder(),
+	"ibm860":         charmap.CodePage860.NewDecoder(),
+	"ibm862":         charmap.CodePage862.NewDecoder(),
+	"ibm863":         charmap.CodePage863.NewDecoder(),
+	"ibm865":         charmap.CodePage865.NewDecoder(),
+	"ibm866":         charmap.CodePage866.NewDecoder(),
+	"ibm1047":        charmap.CodePage1047.NewDecoder(),
+	"ibm1140":        charmap.CodePage1140.NewDecoder(),
+	"iso-8859-1":     charmap.ISO8859_1.NewDecoder(),
+	"iso-8859-2":     charmap.ISO8859_2.NewDecoder(),
+	"iso-8859-3":     charmap.ISO8859_3.NewDecoder(),
+	"iso-8859-4":     charmap.ISO8859_4.NewDecoder(),
+	"iso-8859-5":     charmap.ISO8859_5.NewDecoder(),
+	"iso-8859-6":     charmap.ISO8859_6.NewDecoder(),
+	"iso-8859-7":     charmap.ISO8859_7.NewDecoder(),
+	"iso-8859-8":     charmap.ISO8859_8.NewDecoder(),
+	"iso-8859-9":     charmap.ISO8859_9.NewDecoder(),
+	"iso-8859-10":    charmap.ISO8859_10.NewDecoder(),
+	"iso-8859-13":    charmap.ISO8859_13.NewDecoder(),
+	"iso-8859-14":    charmap.ISO8859_14.NewDecoder(),
+	"iso-8859-15":    charmap.ISO8859_15.NewDecoder(),
+	"iso-8859-16":    charmap.ISO8859_16.NewDecoder(),
+	"koi8-r":         charmap.KOI8R.NewDecoder(),
+	"koi8-u":         charmap.KOI8U.NewDecoder(),
+	"macintosh":      charmap.Macintosh.NewDecoder(),
+	"x-mac-cyrillic": charmap.MacintoshCyrillic.NewDecoder(),
+	"windows-874":    charmap.Windows874.NewDecoder(),
+	"windows-1250":   charmap.Windows1250.NewDecoder(),
+	"windows-1251":   charmap.Windows1251.NewDecoder(),
+	"windows-1252":   charmap.Windows1252.NewDecoder(),
+	"windows-1253":   charmap.Windows1253.NewDecoder(),
+	"windows-1254":   charmap.Windows1254.NewDecoder(),
+	"windows-1255":   charmap.Windows1255.NewDecoder(),
+	"windows-1257":   charmap.Windows1257.NewDecoder(),
+	"windows-1258":   charmap.Windows1258.NewDecoder(),
+	"x-user-defined": charmap.XUserDefined.NewDecoder(),
+}
+
+// 定义一个自定义的 CharsetReader 函数,它能够处理 gb2312 和 gbk 字符集
+func myCharsetReader(charset string, input io.Reader) (io.Reader, error) {
+	charset = strings.ToLower(charset)
+	newDecoder, ok := charsetMap[charset]
+	if ok {
+		reader := transform.NewReader(input, newDecoder)
+		return reader, nil
+	}
+	if charset == `utf-8` {
+		return input, nil
+	}
+
+	switch strings.ToLower(charset) {
+	case "gb2312", "gbk":
+		reader := transform.NewReader(input, simplifiedchinese.GBK.NewDecoder())
+		return reader, nil
+	case "utf-8":
+		return input, nil
+	case "iso-8859-1":
+		reader := transform.NewReader(input, charmap.ISO8859_1.NewDecoder())
+
+		return reader, nil
+	case "windows-1252":
+		reader := transform.NewReader(input, charmap.Windows1252.NewDecoder())
+		return reader, nil
+	default:
+	}
+	return input, fmt.Errorf("unsupported charset: %s", charset)
+
+}

+ 146 - 53
utils/mail/imap.go

@@ -10,16 +10,19 @@ import (
 	"github.com/emersion/go-message"
 	"github.com/emersion/go-message/mail"
 	"github.com/h2non/filetype"
-	"golang.org/x/text/encoding/simplifiedchinese"
-	"golang.org/x/text/transform"
 	"io"
 	"log"
+	"os"
 	"path"
 	"strings"
 	"time"
 )
 
 type MailMessage struct {
+	Date       time.Time         `description:"收件时间"`
+	Uid        uint32            `description:"该邮件在邮箱中的唯一id"`
+	FromEmail  string            `description:"发件人邮箱"`
+	From       string            `description:"发件人名称"`
 	Title      string            `description:"邮件标题"`
 	Content    string            `description:"邮件主体正文"`
 	Resources  map[string]string `description:"正文内嵌资源"`
@@ -28,6 +31,8 @@ type MailMessage struct {
 
 func ListenMail(mailAddress, folder, userName, password string, readBatchSize int, mailMessageChan chan MailMessage, mailMessageDoneChan chan bool) (err error) { // 收件箱
 	defer func() {
+		// 处理结束
+		mailMessageDoneChan <- true
 		if err != nil {
 			fmt.Println("err:", err.Error())
 		}
@@ -64,15 +69,20 @@ func ListenMail(mailAddress, folder, userName, password string, readBatchSize in
 		}
 	}
 
-	if err := <-done; err != nil {
-		log.Fatalf("列出邮箱列表时,出现错误:%v \n", err)
+	err = <-done
+	if err != nil {
+		global.LOG.Errorf("列出邮箱列表时,出现错误:%v \n", err)
+		return
 	}
+
 	log.Println("-->列出邮箱列表完毕!")
 	if !folderExists {
 		err = errors.New(fmt.Sprintf("文件夹[%s] 不存在 \n", folder))
 		return
 	}
 
+	message.CharsetReader = myCharsetReader
+
 	// 选择指定的文件夹
 	mbox, err := c.Select(folder, false)
 	if err != nil {
@@ -92,17 +102,23 @@ func ListenMail(mailAddress, folder, userName, password string, readBatchSize in
 	// 假设需要获取最后4封邮件时
 	from := uint32(1)
 	to := mbox.Messages // 此文件下的邮件总数
+	var maxNum uint32
+
+	// 该次监听获取的最大数量
+	maxNum = 20000
 
-	if to > 13 {
-		from = to - 13
+	if to > maxNum {
+		from = to - maxNum + 1
 	}
-	step := uint32(2)
+	step := uint32(5)
 	for i := from; i <= to; {
 		end := i + step - 1
 		if end > to {
 			end = to
 		}
 
+		fmt.Printf("当前剩余%d封邮件待处理\n", to-i+1)
+
 		seqSet.Clear()
 		seqSet.AddRange(i, end) // 添加指定范围内的邮件编号
 
@@ -119,20 +135,34 @@ func ListenMail(mailAddress, folder, userName, password string, readBatchSize in
 			fetchDone <- c.Fetch(seqSet, items, messages)
 		}()
 
-		if err := <-fetchDone; err != nil {
-			log.Fatalf("获取邮件信息出现错误:%v \n", err)
+		err = <-fetchDone
+		if err != nil {
+			global.LOG.Errorf("获取邮件信息出现错误:%v \n", err)
+			return
 		}
 		// 获取邮件内容 End
 
-		log.Println("开始读取邮件内容")
+		//log.Println("开始读取邮件内容")
 		for msg := range messages {
-			mailMessage, tmpErr := readEveryMsg(msg)
+			emailMessage, isRead, tmpErr := readEveryMsg(msg)
 			if tmpErr != nil {
+				// 移除本地文件
+				{
+					for _, v := range emailMessage.Attachment {
+						os.Remove(v)
+					}
+					for _, v := range emailMessage.Resources {
+						os.Remove(v)
+					}
+				}
 				global.FILE_LOG.Fatalf("读取邮件内容时出现错误:%v \n", tmpErr)
 				continue
 			}
-			// 写入邮件处理chan
-			mailMessageChan <- mailMessage
+			// 如果取到了,那么写入待处理chan
+			if isRead {
+				// 写入邮件处理chan
+				mailMessageChan <- emailMessage
+			}
 		}
 
 		//time.Sleep(time.Second * 5) // 休眠10秒
@@ -141,7 +171,6 @@ func ListenMail(mailAddress, folder, userName, password string, readBatchSize in
 	}
 
 	log.Println("读取了所有邮件,完毕!")
-	mailMessageDoneChan <- true
 
 	return
 }
@@ -249,7 +278,7 @@ func ListenMail(mailAddress, folder, userName, password string, readBatchSize in
 //			continue
 //		}
 //		// 写入邮件处理chan
-//		mailMessageChan <- mailMessage
+//		mailMessageChan <-  emailMessage
 //	}
 //
 //	time.Sleep(time.Second * 5) // 休眠10秒
@@ -259,36 +288,29 @@ func ListenMail(mailAddress, folder, userName, password string, readBatchSize in
 //	return
 //}
 
-// 定义一个自定义的 CharsetReader 函数,它能够处理 gb2312 和 gbk 字符集
-func myCharsetReader(charset string, input io.Reader) (io.Reader, error) {
-
-	switch strings.ToLower(charset) {
-	case "gb2312", "gbk":
-		reader := transform.NewReader(input, simplifiedchinese.GBK.NewDecoder())
-		return reader, nil
-	case "utf-8":
-		return input, nil
-	default:
-		return input, fmt.Errorf("unsupported charset: %s", charset)
-	}
-}
-
 // document link: https://github.com/emersion/go-imap/wiki/Fetching-messages
-func readEveryMsg(msg *imap.Message) (mailMessage MailMessage, err error) {
+func readEveryMsg(msg *imap.Message) (emailMessage MailMessage, ok bool, err error) {
+	ok = true
+	defer func() {
+		if err != nil {
+			ok = false
+			global.FILE_LOG.Errorf("邮件读取失败;Err:%s", err.Error())
+		}
+	}()
 	message.CharsetReader = myCharsetReader
-	mailMessage.Resources = make(map[string]string)  // 内嵌资源
-	mailMessage.Attachment = make(map[string]string) // 附件
+	emailMessage.Resources = make(map[string]string)  // 内嵌资源
+	emailMessage.Attachment = make(map[string]string) // 附件
 
+	emailMessage.Uid = msg.Uid
 	htmlStr := ``
 	textStr := ``
-	rootPath := `C:\Users\123\go\src\eta\eta_email_analysis\static\`
 
 	//log.Printf("当前邮件的消息序列号 %+v \n", msg.SeqNum)
 	//log.Println("-------------------------")
 	// 获取邮件正文
 	r := msg.GetBody(&imap.BodySectionName{})
 	if r == nil {
-		log.Fatal("服务器没有返回消息内容")
+		global.FILE_LOG.Info("服务器没有返回消息内容")
 	}
 
 	mr, err := mail.CreateReader(r)
@@ -297,12 +319,31 @@ func readEveryMsg(msg *imap.Message) (mailMessage MailMessage, err error) {
 		err = errors.New(fmt.Sprintf("邮件读取时出现错误:%v \n", err))
 		return
 	}
-	//if date, err := mr.Header.Date(); err == nil {
-	//	log.Println("收件时间 Date:", date)
-	//}
-	//if from, err := mr.Header.AddressList("From"); err == nil {
-	//	log.Println("发件人 From:", from)
-	//}
+
+	// 收件时间
+	{
+		date, err := mr.Header.Date()
+		if err != nil {
+			log.Println("收件时间 异常:", err.Error())
+		}
+		emailMessage.Date = date
+		//log.Println("收件时间 Date:", date)
+	}
+
+	// 发件人
+	{
+		from, err := mr.Header.AddressList("From")
+		if err != nil {
+			log.Println("发件人 异常:", err.Error())
+		}
+		if len(from) > 0 {
+			emailMessage.FromEmail = from[0].Address
+			emailMessage.From = from[0].Name
+			//mailMessage.From = from[0].String()
+			//log.Println("发件人 From:", from)
+		}
+	}
+
 	//if to, err := mr.Header.AddressList("To"); err == nil {
 	//	log.Println("收件人 To:", to)
 	//}
@@ -312,16 +353,23 @@ func readEveryMsg(msg *imap.Message) (mailMessage MailMessage, err error) {
 	subject, err := mr.Header.Subject()
 	if err != nil {
 		log.Println("邮件主题 Subject ERR:", err)
+	} else {
+		//log.Println("邮件主题 Subject:", subject)
+	}
+	emailMessage.Title = subject
+
+	// 过滤
+	if isIgnore(emailMessage) {
+		ok = false
+		return
 	}
-	log.Println("邮件主题 Subject:", subject)
-	mailMessage.Title = subject
 
 	for {
 		p, tmpErr := mr.NextPart()
 		if tmpErr == io.EOF {
 			break
 		} else if tmpErr != nil {
-			//log.Fatalf("读取邮件内容时出现错误:%v \n", tmpErr)
+			global.FILE_LOG.Errorf("读取邮件内容时出现错误:%v \n", tmpErr)
 			err = tmpErr
 			return
 		}
@@ -351,7 +399,7 @@ func readEveryMsg(msg *imap.Message) (mailMessage MailMessage, err error) {
 
 				// 确定文件后缀
 				fileSuffix := determineFileSuffix(bodyBytes)
-				fileName := fmt.Sprintf("%s%s.%s", rootPath, cid[1:len(cid)-1], fileSuffix)
+				fileName := fmt.Sprintf("%s%s.%s", global.CONFIG.Serve.StaticDir, cid[1:len(cid)-1], fileSuffix)
 
 				err = utils.SaveToFile(bodyBytes, fileName)
 				if err != nil {
@@ -359,7 +407,7 @@ func readEveryMsg(msg *imap.Message) (mailMessage MailMessage, err error) {
 					err = errors.New(fmt.Sprintf("保存文件时出现错误:%v \n", err))
 					return
 				}
-				mailMessage.Resources[cid] = fileName
+				emailMessage.Resources[cid] = fileName
 			}
 			break
 		case *mail.AttachmentHeader:
@@ -367,7 +415,7 @@ func readEveryMsg(msg *imap.Message) (mailMessage MailMessage, err error) {
 			filename, _ := h.Filename()
 			//log.Printf("得到附件: %v,content-type:%s \n", filename, p.Header.Get("Content-Type"))
 			saveName := fmt.Sprint(msg.SeqNum, utils.MD5(filename), time.Now().Format(utils.FormatDateTimeUnSpace), time.Now().Nanosecond(), path.Ext(filename))
-			filePath := fmt.Sprintf("%s%s%s", rootPath, `file\`, saveName)
+			filePath := fmt.Sprintf("%s%s%s%s", global.CONFIG.Serve.StaticDir, `file`, string(os.PathSeparator), saveName)
 			err = utils.SaveToFile(bodyBytes, filePath)
 			if err != nil {
 				//log.Fatalf("保存文件时出现错误:%v \n", err)
@@ -378,11 +426,11 @@ func readEveryMsg(msg *imap.Message) (mailMessage MailMessage, err error) {
 			// 这是附件资源
 			if contentDisposition := p.Header.Get("Content-Disposition"); contentDisposition != "" {
 				if strings.HasPrefix(contentDisposition, "attachment") {
-					mailMessage.Attachment[filename] = filePath
+					emailMessage.Attachment[filename] = filePath
 				}
 			} else if cid := p.Header.Get("Content-ID"); cid != "" {
 				// 这是内嵌资源
-				mailMessage.Resources[cid] = filePath
+				emailMessage.Resources[cid] = filePath
 			}
 			//else {
 			//	mailMessage.Attachment[filename] = filePath
@@ -390,12 +438,13 @@ func readEveryMsg(msg *imap.Message) (mailMessage MailMessage, err error) {
 
 			break
 		default:
-			log.Println(h)
+			global.FILE_LOG.Info("未知格式:", h)
+			//log.Println(h)
 		}
 	}
-	mailMessage.Content = htmlStr
-	if mailMessage.Content == `` {
-		mailMessage.Content = textStr
+	emailMessage.Content = htmlStr
+	if emailMessage.Content == `` {
+		emailMessage.Content = textStr
 	}
 
 	//log.Println("一封邮件读取完毕")
@@ -408,8 +457,52 @@ func readEveryMsg(msg *imap.Message) (mailMessage MailMessage, err error) {
 func determineFileSuffix(content []byte) string {
 	kind, err := filetype.Match(content)
 	if err != nil {
-		log.Printf("无法确定文件类型:%v \n", err)
+		global.FILE_LOG.Error("无法确定文件类型:%v \n", err)
 		return ".bin"
 	}
 	return kind.Extension
 }
+
+// isIgnore
+// @Description: 校验是否忽略的邮件
+// @author: Roc
+// @datetime 2024-09-30 16:09:34
+// @param emailMessage MailMessage
+// @return bool
+func isIgnore(emailMessage MailMessage) bool {
+	// 发件人中包含待过滤的字符串,那么就过滤
+	lowerFrom := strings.ToLower(emailMessage.From)
+	for _, email := range global.CONFIG.Email.IgnoreEmail {
+		if utils.ContainsWholeWord(lowerFrom, email) {
+			global.FILE_LOG.Infof("发件人包含%s,过滤掉,标题:%s", email, emailMessage.Title)
+			return true
+		}
+	}
+
+	// 邮件标题中包含待过滤的字符串(大小写敏感的标题),那么就过滤
+	for _, email := range global.CONFIG.Email.IgnoreEmailCaseSensitive {
+		if utils.ContainsWholeWord(emailMessage.From, email) {
+			global.FILE_LOG.Infof("发件人包含%s,过滤掉,标题:%s", email, emailMessage.Title)
+			return true
+		}
+	}
+
+	// 邮件标题中包含待过滤的字符串,那么就过滤
+	lowerTitle := strings.ToLower(emailMessage.Title)
+	for _, title := range global.CONFIG.Email.IgnoreEmailTitle {
+		if utils.ContainsWholeWord(lowerTitle, title) {
+			global.FILE_LOG.Infof("邮件标题包含%s,过滤掉,标题:%s", title, emailMessage.Title)
+			return true
+		}
+	}
+
+	// 邮件标题中包含待过滤的字符串(大小写敏感的标题),那么就过滤
+	for _, title := range global.CONFIG.Email.IgnoreEmailTitleCaseSensitive {
+		if utils.ContainsWholeWord(emailMessage.Title, title) {
+			global.FILE_LOG.Infof("邮件标题包含%s,过滤掉,标题:%s", title, emailMessage.Title)
+			return true
+		}
+	}
+
+	return false
+}