Bladeren bron

Merge branch 'edb_data/fix_calculate' into debug

# Conflicts:
#	services/task.go
Roc 3 jaren geleden
bovenliggende
commit
4fad360514

+ 3 - 1
models/data_manage/edb_data_base.go

@@ -3,8 +3,8 @@ package data_manage
 import (
 import (
 	"errors"
 	"errors"
 	"fmt"
 	"fmt"
-	"hongze/hongze_task/utils"
 	"github.com/rdlucklib/rdluck_tools/orm"
 	"github.com/rdlucklib/rdluck_tools/orm"
+	"hongze/hongze_task/utils"
 	"strconv"
 	"strconv"
 	"time"
 	"time"
 )
 )
@@ -59,6 +59,8 @@ func GetEdbDataTableName(source int) (tableName string) {
 		tableName = "edb_data_calculate_time_shift"
 		tableName = "edb_data_calculate_time_shift"
 	case utils.DATA_SOURCE_CALCULATE_LJZTBPJ:
 	case utils.DATA_SOURCE_CALCULATE_LJZTBPJ:
 		tableName = "edb_data_calculate_ljztbpj"
 		tableName = "edb_data_calculate_ljztbpj"
+	case utils.DATA_SOURCE_LT:
+		tableName = "edb_data_lt"
 	default:
 	default:
 		tableName = ""
 		tableName = ""
 		errors.New("无效的渠道:" + strconv.Itoa(source))
 		errors.New("无效的渠道:" + strconv.Itoa(source))

+ 8 - 2
models/data_manage/edb_data_calculate.go

@@ -22,7 +22,6 @@ func ModifyEdbDataCalculate(edbInfoId int64, dataTime string, value float64) (er
 	return
 	return
 }
 }
 
 
-
 func AddEdbDataCalculateBySql(sqlStr string) (err error) {
 func AddEdbDataCalculateBySql(sqlStr string) (err error) {
 	o := orm.NewOrm()
 	o := orm.NewOrm()
 	o.Using("data")
 	o.Using("data")
@@ -30,6 +29,13 @@ func AddEdbDataCalculateBySql(sqlStr string) (err error) {
 	return
 	return
 }
 }
 
 
+// DeleteEdbDataCalculateBySql 根据删除sql删除指标数据
+func DeleteEdbDataCalculateBySql(deleteStr string, edbInfoId int) (err error) {
+	o := orm.NewOrm()
+	o.Using("data")
+	_, err = o.Raw(deleteStr, edbInfoId).Exec()
+	return
+}
 
 
 type EdbInfoCalculateDetail struct {
 type EdbInfoCalculateDetail struct {
 	EdbInfoCalculateId int       `orm:"column(edb_info_calculate_id);pk"`
 	EdbInfoCalculateId int       `orm:"column(edb_info_calculate_id);pk"`
@@ -69,4 +75,4 @@ func GetEdbInfoCalculateMap(edbInfoId, source int) (list []*EdbInfoCalculateDeta
 	sql = fmt.Sprintf(sql, calculateTableName)
 	sql = fmt.Sprintf(sql, calculateTableName)
 	_, err = o.Raw(sql, edbInfoId).QueryRows(&list)
 	_, err = o.Raw(sql, edbInfoId).QueryRows(&list)
 	return
 	return
-}
+}

+ 5 - 2
models/data_manage/edb_data_gl.go

@@ -2,8 +2,8 @@ package data_manage
 
 
 import (
 import (
 	"fmt"
 	"fmt"
-	"hongze/hongze_task/utils"
 	"github.com/rdlucklib/rdluck_tools/orm"
 	"github.com/rdlucklib/rdluck_tools/orm"
+	"hongze/hongze_task/utils"
 	"strconv"
 	"strconv"
 	"strings"
 	"strings"
 	"time"
 	"time"
@@ -22,7 +22,7 @@ type GlData struct {
 }
 }
 
 
 func GetGlDataByTradeCode(condition string, pars []interface{}) (item []*GlData, err error) {
 func GetGlDataByTradeCode(condition string, pars []interface{}) (item []*GlData, err error) {
-	sql := ` SELECT * FROM mb_index_main_data WHERE 1=1 `
+	sql := ` SELECT * FROM mb_index_main_data WHERE 1=1 AND DATA_VALUE is not null `
 	o := orm.NewOrm()
 	o := orm.NewOrm()
 	o.Using("gl")
 	o.Using("gl")
 	if condition != "" {
 	if condition != "" {
@@ -84,6 +84,9 @@ func RefreshEdbDataByGl(edbInfoId int, edbCode, startDate, endDate string) (err
 		condition += " AND DATA_DATE<=? "
 		condition += " AND DATA_DATE<=? "
 		pars = append(pars, endDate)
 		pars = append(pars, endDate)
 	}
 	}
+
+	condition += " AND IS_DELETE=0 "
+
 	//获取已存在指标所有数据
 	//获取已存在指标所有数据
 	existDataList := make([]*EdbDataBase, 0)
 	existDataList := make([]*EdbDataBase, 0)
 	dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_GL)
 	dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_GL)

+ 2 - 2
models/data_manage/edb_info_calculate_tbz.go

@@ -2,9 +2,9 @@ package data_manage
 
 
 import (
 import (
 	"fmt"
 	"fmt"
+	"github.com/rdlucklib/rdluck_tools/orm"
 	"github.com/shopspring/decimal"
 	"github.com/shopspring/decimal"
 	"hongze/hongze_task/utils"
 	"hongze/hongze_task/utils"
-	"github.com/rdlucklib/rdluck_tools/orm"
 	"strconv"
 	"strconv"
 	"strings"
 	"strings"
 	"time"
 	"time"
@@ -169,8 +169,8 @@ func RefreshCalculateTbz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate
 										return err
 										return err
 									}
 									}
 								}
 								}
+								break
 							}
 							}
-							break
 						}
 						}
 					}
 					}
 				} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
 				} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {

+ 10 - 0
models/user_view_statistics.go

@@ -37,6 +37,16 @@ func GetUserViewStatisticsCount(dayStr string) (count int, err error) {
 	return
 	return
 }
 }
 
 
+// DeleteUserViewStatisticsCount 获取某天的用户报告报告阅读数量统计记录数量
+func DeleteUserViewStatisticsCount(dayStr string) (err error) {
+	o := orm.NewOrm()
+	//产品权限
+	sql := `delete from user_view_statistics WHERE date = ?`
+
+	_, err = o.Raw(sql, dayStr).Exec()
+	return
+}
+
 // UserViewMobileTotalSlice 根据用户手机号字符串获取用户的浏览数
 // UserViewMobileTotalSlice 根据用户手机号字符串获取用户的浏览数
 type UserViewMobileTotalSlice struct {
 type UserViewMobileTotalSlice struct {
 	Mobile      string `description:"用户手机号"`
 	Mobile      string `description:"用户手机号"`

+ 18 - 1
services/data/data_calculate.go

@@ -60,6 +60,7 @@ func RefreshCalculate(edbInfoIdArr []*data_manage.EdbInfo, edbInfoId int, edbCod
 	addSql := ` INSERT INTO edb_data_calculate(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
 	addSql := ` INSERT INTO edb_data_calculate(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
 	nowStr := time.Now().Format(utils.FormatDateTime)
 	nowStr := time.Now().Format(utils.FormatDateTime)
 	var isAdd bool
 	var isAdd bool
+	removeDateList := make([]string, 0) //需要移除的日期
 
 
 	for sk, sv := range saveDataMap {
 	for sk, sv := range saveDataMap {
 		formulaStr = strings.ToUpper(formulaStr)
 		formulaStr = strings.ToUpper(formulaStr)
@@ -69,6 +70,11 @@ func RefreshCalculate(edbInfoIdArr []*data_manage.EdbInfo, edbInfoId int, edbCod
 			expression := formula.NewExpression(formulaFormStr)
 			expression := formula.NewExpression(formulaFormStr)
 			calResult, err := expression.Evaluate()
 			calResult, err := expression.Evaluate()
 			if err != nil {
 			if err != nil {
+				// 分母为0的报错
+				if strings.Contains(err.Error(), "divide by zero") {
+					removeDateList = append(removeDateList, sk)
+					continue
+				}
 				err = errors.New("计算失败,edbCode:" + fmt.Sprint(edbCode) + ":Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
 				err = errors.New("计算失败,edbCode:" + fmt.Sprint(edbCode) + ":Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
 				fmt.Println(err)
 				fmt.Println(err)
 				return err
 				return err
@@ -105,11 +111,22 @@ func RefreshCalculate(edbInfoIdArr []*data_manage.EdbInfo, edbInfoId int, edbCod
 	}
 	}
 	if isAdd {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		addSql = strings.TrimRight(addSql, ",")
-		data_manage.AddEdbDataCalculateBySql(addSql)
+		err = data_manage.AddEdbDataCalculateBySql(addSql)
 		if err != nil {
 		if err != nil {
 			fmt.Println("AddEdbDataCalculate Err:" + err.Error())
 			fmt.Println("AddEdbDataCalculate Err:" + err.Error())
 			return err
 			return err
 		}
 		}
 	}
 	}
+	if len(removeDateList) > 0 {
+		removeDateStr := strings.Join(removeDateList, `","`)
+		removeDateStr = `"` + removeDateStr + `"`
+		//如果拼接指标变更了,那么需要删除所有的指标数据
+		sql := fmt.Sprintf(` DELETE FROM edb_data_calculate WHERE edb_info_id = ? and data_time in (%s) `, removeDateStr)
+		err = data_manage.DeleteEdbDataCalculateBySql(sql, edbInfoId)
+		if err != nil {
+			err = fmt.Errorf("删除计算失败的计算指标数据失败,Err:" + err.Error())
+			return
+		}
+	}
 	return
 	return
 }
 }

+ 37 - 16
services/data/edb_info.go

@@ -189,25 +189,30 @@ func RefreshDataFromPb(wg *sync.WaitGroup) (err error) {
 
 
 func CheckDataInterface(cont context.Context) (err error) {
 func CheckDataInterface(cont context.Context) (err error) {
 	go func() {
 	go func() {
-		checkUrl := utils.Hz_Data_Url + `hz_server`
-		body, err := http.Get(checkUrl)
-		if err != nil {
-			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"检测数据接口:失败提醒", "CheckDataInterface ErrMsg:"+err.Error(), utils.EmailSendToUsers)
-		}
-		result := string(body)
-		if result != "1" {
-			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"检测数据接口:失败提醒", "CheckDataInterface ErrMsg:"+string(body), utils.EmailSendToUsers)
+		//杭州办公室服务器
+		{
+			checkUrl := utils.Hz_Data_Url + `hz_server`
+			body, err := http.Get(checkUrl)
+			if err != nil {
+				go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"检测数据接口:失败提醒", "CheckDataInterface ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+			}
+			result := string(body)
+			if result != "1" {
+				go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"检测数据接口:失败提醒", "CheckDataInterface ErrMsg:"+string(body), utils.EmailSendToUsers)
+			}
 		}
 		}
 
 
 		//阿里服务器监听
 		//阿里服务器监听
-		checkUrl2 := utils.Hz_Server_Data_Url + `hz_server`
-		body, err = http.Get(checkUrl2)
-		if err != nil {
-			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"检测服务器数据接口:失败提醒", "CheckDataInterface ErrMsg:"+err.Error(), utils.EmailSendToUsers)
-		}
-		result = string(body)
-		if result != "1" {
-			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"检测服务器数据接口:失败提醒", "CheckDataInterface ErrMsg:"+string(body), utils.EmailSendToUsers)
+		{
+			checkUrl2 := utils.Hz_Server_Data_Url + `hz_server`
+			body, err := http.Get(checkUrl2)
+			if err != nil {
+				go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"检测服务器数据接口:失败提醒", "CheckDataInterface ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+			}
+			result := string(body)
+			if result != "1" {
+				go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"检测服务器数据接口:失败提醒", "CheckDataInterface ErrMsg:"+string(body), utils.EmailSendToUsers)
+			}
 		}
 		}
 	}()
 	}()
 	return
 	return
@@ -228,6 +233,22 @@ func CheckPbDataInterface(cont context.Context) (err error) {
 	return
 	return
 }
 }
 
 
+// CheckLtDataInterface 检测路透数据服务器
+func CheckLtDataInterface(cont context.Context) (err error) {
+	go func() {
+		checkUrl := utils.Hz_Data_LT_Url + `hz_server`
+		body, err := http.Get(checkUrl)
+		if err != nil {
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"检测数据接口:失败提醒", "检测路透数据服务器失败:CheckLtDataInterface ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+		}
+		result := string(body)
+		if result != `"ek true"` {
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"检测数据接口:失败提醒", "检测路透数据服务器失败:CheckLtDataInterface ErrMsg:"+string(body), utils.EmailSendToUsers)
+		}
+	}()
+	return
+}
+
 //刷新所有计算指标
 //刷新所有计算指标
 func RefreshDataFromCalculateAll() (err error) {
 func RefreshDataFromCalculateAll() (err error) {
 	defer func() {
 	defer func() {

+ 110 - 0
services/data/edb_info_calculate.go

@@ -134,6 +134,116 @@ func ReplaceFormula(edbInfoIdArr []*data_manage.EdbInfo, valArr map[int]float64,
 				}
 				}
 			}
 			}
 		}
 		}
+		if dk == 9 {
+			dKey := edbInfoIdBytes[dk]
+			if _, ok := formulaMap[dKey]; ok { //公式中存在
+				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
+					dvStr := fmt.Sprintf("%v", val)
+					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
+					replaceCount++
+				}
+			}
+		}
+		if dk == 10 {
+			dKey := edbInfoIdBytes[dk]
+			if _, ok := formulaMap[dKey]; ok { //公式中存在
+				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
+					dvStr := fmt.Sprintf("%v", val)
+					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
+					replaceCount++
+				}
+			}
+		}
+		if dk == 11 {
+			dKey := edbInfoIdBytes[dk]
+			if _, ok := formulaMap[dKey]; ok { //公式中存在
+				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
+					dvStr := fmt.Sprintf("%v", val)
+					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
+					replaceCount++
+				}
+			}
+		}
+		if dk == 12 {
+			dKey := edbInfoIdBytes[dk]
+			if _, ok := formulaMap[dKey]; ok { //公式中存在
+				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
+					dvStr := fmt.Sprintf("%v", val)
+					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
+					replaceCount++
+				}
+			}
+		}
+		if dk == 13 {
+			dKey := edbInfoIdBytes[dk]
+			if _, ok := formulaMap[dKey]; ok { //公式中存在
+				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
+					dvStr := fmt.Sprintf("%v", val)
+					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
+					replaceCount++
+				}
+			}
+		}
+		if dk == 14 {
+			dKey := edbInfoIdBytes[dk]
+			if _, ok := formulaMap[dKey]; ok { //公式中存在
+				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
+					dvStr := fmt.Sprintf("%v", val)
+					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
+					replaceCount++
+				}
+			}
+		}
+		if dk == 15 {
+			dKey := edbInfoIdBytes[dk]
+			if _, ok := formulaMap[dKey]; ok { //公式中存在
+				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
+					dvStr := fmt.Sprintf("%v", val)
+					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
+					replaceCount++
+				}
+			}
+		}
+		if dk == 16 {
+			dKey := edbInfoIdBytes[dk]
+			if _, ok := formulaMap[dKey]; ok { //公式中存在
+				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
+					dvStr := fmt.Sprintf("%v", val)
+					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
+					replaceCount++
+				}
+			}
+		}
+		if dk == 17 {
+			dKey := edbInfoIdBytes[dk]
+			if _, ok := formulaMap[dKey]; ok { //公式中存在
+				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
+					dvStr := fmt.Sprintf("%v", val)
+					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
+					replaceCount++
+				}
+			}
+		}
+		if dk == 18 {
+			dKey := edbInfoIdBytes[dk]
+			if _, ok := formulaMap[dKey]; ok { //公式中存在
+				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
+					dvStr := fmt.Sprintf("%v", val)
+					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
+					replaceCount++
+				}
+			}
+		}
+		if dk == 19 {
+			dKey := edbInfoIdBytes[dk]
+			if _, ok := formulaMap[dKey]; ok { //公式中存在
+				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
+					dvStr := fmt.Sprintf("%v", val)
+					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
+					replaceCount++
+				}
+			}
+		}
 	}
 	}
 	for k, v := range funMap {
 	for k, v := range funMap {
 		formulaStr = strings.Replace(formulaStr, v, k, -1)
 		formulaStr = strings.Replace(formulaStr, v, k, -1)

+ 7 - 0
services/task.go

@@ -138,6 +138,13 @@ func releaseTask() {
 
 
 	checkPbDataInterface := task.NewTask("checkPbDataInterface", "0 */2 * * * * ", data.CheckPbDataInterface)
 	checkPbDataInterface := task.NewTask("checkPbDataInterface", "0 */2 * * * * ", data.CheckPbDataInterface)
 	task.AddTask("checkPbDataInterface", checkPbDataInterface)
 	task.AddTask("checkPbDataInterface", checkPbDataInterface)
+
+	checkLtDataInterface := task.NewTask("checkLtDataInterface", "0 */2 * * * * ", data.CheckLtDataInterface)
+	task.AddTask("checkLtDataInterface", checkLtDataInterface)
+
+	//初始化指标更新状态
+	resetEdbInfoIsUpdate := task.NewTask("resetEdbInfoIsUpdate", "0 0 0 * * *", data.ResetEdbInfoIsUpdate)
+	task.AddTask("resetEdbInfoIsUpdate", resetEdbInfoIsUpdate)
 }
 }
 
 
 func TaskTest() {
 func TaskTest() {

+ 121 - 1
services/user_view_statistics.go

@@ -9,7 +9,7 @@ import (
 
 
 // StatisticsUserView 汇总统计表
 // StatisticsUserView 汇总统计表
 func StatisticsUserView(cont context.Context) (err error) {
 func StatisticsUserView(cont context.Context) (err error) {
-	dateTime := time.Now().AddDate(0, 0, 0)
+	dateTime := time.Now().AddDate(0, 0, -1)
 	dateStr := dateTime.Format(utils.FormatDate)
 	dateStr := dateTime.Format(utils.FormatDate)
 	count, err := models.GetUserViewStatisticsCount(dateStr)
 	count, err := models.GetUserViewStatisticsCount(dateStr)
 	if err != nil {
 	if err != nil {
@@ -152,3 +152,123 @@ func StatisticsUserView(cont context.Context) (err error) {
 
 
 	return
 	return
 }
 }
+
+// FixStatisticsUserView 数据修复
+func FixStatisticsUserView(dateStr string) (err error) {
+	//dateTime := time.Now().AddDate(0, 0, 0)
+	//dateStr := dateTime.Format(utils.FormatDate)
+	dateTime, _ := time.Parse(utils.FormatDate, dateStr)
+
+	err = models.DeleteUserViewStatisticsCount(dateStr)
+	if err != nil {
+		return
+	}
+
+	{
+		mobileViewMap := make(map[string]*models.UserViewMobileTotalSlice)
+
+		list, tmpErr := models.GetCountUserViewHistoryByMobiles(dateStr)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range list {
+			mobileViewMap[v.Mobile] = v
+		}
+
+		list, tmpErr = models.GetReportViewMaxTimeByMobiles(dateStr)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range list {
+			if userViewStatistics, ok := mobileViewMap[v.Mobile]; ok {
+				userViewStatistics.Total += v.Total
+			} else {
+				mobileViewMap[v.Mobile] = v
+			}
+		}
+
+		list, tmpErr = models.GetAdvisoryCountUserViewHistoryByMobiles(dateStr)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range list {
+			if userViewStatistics, ok := mobileViewMap[v.Mobile]; ok {
+				userViewStatistics.Total += v.Total
+			} else {
+				mobileViewMap[v.Mobile] = v
+			}
+		}
+
+		if len(mobileViewMap) > 0 {
+			tmpList := make([]*models.UserViewStatistics, 0)
+			for mobile, userViewStatistics := range mobileViewMap {
+				item := &models.UserViewStatistics{
+					Mobile:      mobile,
+					RealName:    userViewStatistics.RealName,
+					CompanyName: userViewStatistics.CompanyName,
+					ViewNum:     userViewStatistics.Total,
+					Date:        dateTime,
+					CreateTime:  time.Now(),
+				}
+				//小于200条的时候,不插入数据库
+				if len(tmpList) < 200 {
+					tmpList = append(tmpList, item)
+					continue
+				}
+				//大于200条的时候,才去插入数据库
+				_ = models.AddMultiUserViewStatistics(tmpList)
+				tmpList = make([]*models.UserViewStatistics, 0)
+			}
+			//最后出来后,如果还有数据未插入,那么再去批量插入数据库
+			if len(tmpList) > 0 {
+				_ = models.AddMultiUserViewStatistics(tmpList)
+			}
+		}
+	}
+
+	//邮箱
+	{
+		emailViewMap := make(map[string]*models.UserViewEmailTotalSlice)
+
+		list, tmpErr := models.GetCountUserViewHistoryByEmails(dateStr)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range list {
+			emailViewMap[v.Email] = v
+		}
+
+		list, tmpErr = models.GetReportViewMaxTimeByEmails(dateStr)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range list {
+			if userViewStatistics, ok := emailViewMap[v.Email]; ok {
+				userViewStatistics.Total += v.Total
+			} else {
+				emailViewMap[v.Email] = v
+			}
+		}
+
+		list, tmpErr = models.GetAdvisoryCountUserViewHistoryByEmails(dateStr)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range list {
+			if userViewStatistics, ok := emailViewMap[v.Email]; ok {
+				userViewStatistics.Total += v.Total
+			} else {
+				emailViewMap[v.Email] = v
+			}
+		}
+
+	}
+
+	return
+}

+ 24 - 9
utils/email.go

@@ -8,7 +8,7 @@ import (
 )
 )
 
 
 //发送邮件
 //发送邮件
-func SendEmail(title, content string, touser string)bool {
+func SendEmail(title, content string, touser string) bool {
 	var arr []string
 	var arr []string
 	sub := strings.Index(touser, ";")
 	sub := strings.Index(touser, ";")
 	if sub >= 0 {
 	if sub >= 0 {
@@ -16,23 +16,39 @@ func SendEmail(title, content string, touser string)bool {
 		for _, v := range spArr {
 		for _, v := range spArr {
 			arr = append(arr, v)
 			arr = append(arr, v)
 		}
 		}
-	}else{
+	} else {
 		arr = append(arr, touser)
 		arr = append(arr, touser)
 	}
 	}
+	//mailConn := map[string]string{
+	//	"user": "18170239278@163.com",
+	//	"pass": "JYWLATLVZJROWMWZ",
+	//	"host": "smtp.163.com",
+	//	"port": "465",
+	//}
+	//mailPort, _ := strconv.Atoi(mailConn["port"]) //转换端口类型为int
+
 	m := gomail.NewMessage()
 	m := gomail.NewMessage()
-	m.SetHeader("From", "317699326@qq.com ")
+	//m.SetHeader("From", mailConn["user"])
+	m.SetHeader("From", m.FormatAddress("317699326@qq.com", APPNAME)) //这种方式可以添加别名,即“XX官方”
+	// 说明:如果是用网易邮箱账号发送,以下方法别名可以是中文,如果是qq企业邮箱,以下方法用中文别名,会报错,需要用上面此方法转码
+	//m.SetHeader("From", "FB Sample"+"<"+mailConn["user"]+">") //这种方式可以添加别名,即“FB Sample”, 也可以直接用<code>m.SetHeader("From",mailConn["user"])</code> 读者可以自行实验下效果
+	//m.SetHeader("From", mailConn["user"])
+
 	m.SetHeader("To", arr...)
 	m.SetHeader("To", arr...)
 	m.SetHeader("Subject", title+" "+GetRandString(16))
 	m.SetHeader("Subject", title+" "+GetRandString(16))
 	m.SetBody("text/html", content)
 	m.SetBody("text/html", content)
 	d := gomail.NewDialer("smtp.qq.com", 587, "317699326@qq.com", "oqdypwfcvruwcbea")
 	d := gomail.NewDialer("smtp.qq.com", 587, "317699326@qq.com", "oqdypwfcvruwcbea")
+	//d := gomail.NewDialer(mailConn["host"], mailPort, mailConn["user"], mailConn["pass"])
+
 	if err := d.DialAndSend(m); err != nil {
 	if err := d.DialAndSend(m); err != nil {
+		fmt.Println("err:", err)
 		return false
 		return false
 	}
 	}
 	return true
 	return true
 }
 }
 
 
 //发送邮件
 //发送邮件
-func SendEmailByHongze(title, content string, touser,attachPath,attachName string)bool {
+func SendEmailByHongze(title, content string, touser, attachPath, attachName string) bool {
 	var arr []string
 	var arr []string
 	sub := strings.Index(touser, ";")
 	sub := strings.Index(touser, ";")
 	if sub >= 0 {
 	if sub >= 0 {
@@ -40,12 +56,11 @@ func SendEmailByHongze(title, content string, touser,attachPath,attachName strin
 		for _, v := range spArr {
 		for _, v := range spArr {
 			arr = append(arr, v)
 			arr = append(arr, v)
 		}
 		}
-	}else{
+	} else {
 		arr = append(arr, touser)
 		arr = append(arr, touser)
 	}
 	}
 	m := gomail.NewMessage()
 	m := gomail.NewMessage()
 
 
-
 	m.SetHeader("From", "public@hzinsights.com")
 	m.SetHeader("From", "public@hzinsights.com")
 	m.SetHeader("To", arr...)
 	m.SetHeader("To", arr...)
 	m.SetHeader("Subject", title+" "+GetRandStringNoSpecialChar(8))
 	m.SetHeader("Subject", title+" "+GetRandStringNoSpecialChar(8))
@@ -56,14 +71,14 @@ func SendEmailByHongze(title, content string, touser,attachPath,attachName strin
 		m.Attach(attachPath,
 		m.Attach(attachPath,
 			gomail.Rename(attachName),
 			gomail.Rename(attachName),
 			gomail.SetHeader(map[string][]string{
 			gomail.SetHeader(map[string][]string{
-				"Content-Disposition": []string{
+				"Content-Disposition": {
 					fmt.Sprintf(`attachment; filename="%s"`, mime.QEncoding.Encode("UTF-8", attachName)),
 					fmt.Sprintf(`attachment; filename="%s"`, mime.QEncoding.Encode("UTF-8", attachName)),
 				},
 				},
-			}),)
+			}))
 	}
 	}
 	d := gomail.NewDialer("smtp.mxhichina.com", 465, "public@hzinsights.com", "Hzinsights2018")
 	d := gomail.NewDialer("smtp.mxhichina.com", 465, "public@hzinsights.com", "Hzinsights2018")
 	if err := d.DialAndSend(m); err != nil {
 	if err := d.DialAndSend(m); err != nil {
-		fmt.Println("send err:",err.Error())
+		fmt.Println("send err:", err.Error())
 		return false
 		return false
 	}
 	}
 	return true
 	return true