Bläddra i källkod

新增到期提醒

rdluck 4 år sedan
förälder
incheckning
24399eae69
6 ändrade filer med 321 tillägg och 48 borttagningar
  1. 37 6
      models/company_product.go
  2. 203 3
      services/company_product.go
  3. 12 8
      services/task.go
  4. 57 23
      services/wx_template_msg.go
  5. 3 0
      utils/config.go
  6. 9 8
      utils/email.go

+ 37 - 6
models/company_product.go

@@ -37,12 +37,12 @@ func CompanyFreeze(companyId, productId int) (err error) {
 	freezeEndDate := time.Now().AddDate(0, 3, 0).Format(utils.FormatDate)
 
 	sql := `UPDATE company_product SET status='冻结',freeze_time=NOW(),modify_time=NOW(),start_date=?,end_date=?,freeze_start_date=?,freeze_end_date=? WHERE company_id=? AND product_id=? `
-	_, err = o.Raw(sql,freezeStartDate,freezeEndDate, freezeStartDate, freezeEndDate, companyId, productId).Exec()
+	_, err = o.Raw(sql, freezeStartDate, freezeEndDate, freezeStartDate, freezeEndDate, companyId, productId).Exec()
 	if err != nil {
 		return err
 	}
 	sql = `UPDATE company SET type=3,last_updated_time=NOW(),start_date=?,end_date=? WHERE company_id=? `
-	_, err = o.Raw(sql,freezeStartDate,freezeEndDate, companyId).Exec()
+	_, err = o.Raw(sql, freezeStartDate, freezeEndDate, companyId).Exec()
 	if err != nil {
 		return err
 	}
@@ -66,16 +66,16 @@ func CompanyLoss(companyId, productId int) (err error) {
 
 func CompanyTryOut(companyId, productId int) (err error) {
 	o := orm.NewOrm()
-	startDate:=time.Now().Format(utils.FormatDate)
-	endDate:=time.Now().AddDate(0,2,0).Format(utils.FormatDate)
+	startDate := time.Now().Format(utils.FormatDate)
+	endDate := time.Now().AddDate(0, 2, 0).Format(utils.FormatDate)
 
 	sql := `UPDATE company_product SET status='试用',start_date=?,end_date=?,modify_time=NOW() WHERE company_id=? AND product_id=? `
-	_, err = o.Raw(sql,startDate,endDate, companyId, productId).Exec()
+	_, err = o.Raw(sql, startDate, endDate, companyId, productId).Exec()
 	if err != nil {
 		return err
 	}
 	sql = `UPDATE company SET type=2,last_updated_time=NOW(),start_date=?,end_date=? WHERE company_id=? `
-	_, err = o.Raw(sql,startDate,endDate, companyId).Exec()
+	_, err = o.Raw(sql, startDate, endDate, companyId).Exec()
 	if err != nil {
 		return err
 	}
@@ -127,3 +127,34 @@ func AddCompanyProduct(item *CompanyProduct) (newId int64, err error) {
 	newId, err = o.Insert(item)
 	return
 }
+
+type Sellers struct {
+	AdminId      int    `description:"销售id"`
+	RealName     string `description:"销售姓名"`
+	Email        string `description:"销售邮箱"`
+	OpenId       string `description:"销售openid"`
+	Mobile       string `description:"销售电话"`
+	RoleTypeCode string `description:"角色编码"`
+}
+
+func GetSellers() (items []*Sellers, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT a.real_name,a.email,b.open_id,a.mobile,b.mobile,a.role_type_code,a.admin_id
+           FROM admin AS a
+			LEFT JOIN wx_user AS b ON a.mobile=b.mobile
+			WHERE role_type_code IN('ficc_seller','ficc_admin','rai_seller','rai_admin')
+			AND b.open_id<>'' `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+func GetRemindCompany(sellerId int, endDate string) (items []*CompanyProduct, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT b.end_date,a.company_name,b.status,b.seller_id,b.seller_name
+             FROM company a
+			 INNER JOIN company_product AS b ON a.company_id=b.company_id
+			 WHERE  b.seller_id=? AND  b.end_date = ?
+			AND b.status IN('正式','试用') ORDER BY b.status DESC `
+	_,err=o.Raw(sql, sellerId, endDate).QueryRows(&items)
+	return
+}

+ 203 - 3
services/company_product.go

@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"hongze/hongze_task/models"
 	"hongze/hongze_task/utils"
+	"strconv"
 	"time"
 )
 
@@ -14,7 +15,7 @@ func CompanyFreeze() (err error) {
 			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "试用两个月结束后,进入冻结 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
 		}
 	}()
-	endDate := time.Now().Format(utils.FormatDate)
+	endDate := time.Now().AddDate(0,0,-1).Format(utils.FormatDate)
 	items, err := models.GetCompanyNeedFreeze(endDate)
 	if err != nil {
 		fmt.Println("GetCompanyNeedFreeze Err:" + err.Error())
@@ -54,7 +55,7 @@ func CompanyLoss() (err error) {
 			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "自动流失->冻结超3个月未处理 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
 		}
 	}()
-	endDate := time.Now().Format(utils.FormatDate)
+	endDate := time.Now().AddDate(0,0,-1).Format(utils.FormatDate)
 	items, err := models.GetCompanyNeedLoss(endDate)
 	if err != nil {
 		fmt.Println("GetCompanyNeedLoss Err:" + err.Error())
@@ -94,7 +95,7 @@ func CompanyTryOut() (err error) {
 			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "正式客户自动试用->合同到期未续约转试用 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
 		}
 	}()
-	endDate := time.Now().Format(utils.FormatDate)
+	endDate := time.Now().AddDate(0,0,-1).Format(utils.FormatDate)
 	items, err := models.GetCompanyNeedTryOut(endDate)
 	if err != nil {
 		fmt.Println("GetCompanyNeedTryOut Err:" + err.Error())
@@ -233,3 +234,202 @@ func CompanyOldDataSync() {
 		}
 	}
 }
+
+//正式/试用客户--到期提醒
+func CompanyRemind()(err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+	//获取销售
+	sellers, err := models.GetSellers()
+	for k, v := range sellers {
+		fmt.Println(k, v.AdminId, v.Mobile)
+		CompanyRemind30Day(v)
+		time.Sleep(5*time.Second)
+		CompanyRemind15Day(v)
+		time.Sleep(5*time.Second)
+		CompanyRemind7Day(v)
+		time.Sleep(5*time.Second)
+		CompanyRemind1Day(v)
+		time.Sleep(5*time.Second)
+	}
+	return
+}
+
+//30天后到期客户
+func CompanyRemind30Day(seller *models.Sellers) {
+	var err error
+	defer func() {
+		if err != nil {
+			go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+	remindEndDate := "2020-12-31" //time.Now().AddDate(0, 0, 30).Format(utils.FormatDate)
+	companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
+	if err != nil {
+		return
+	}
+	emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于30天后到期,请注意查看</p>"
+	emailContents += "<table border='1'><tr><td width='200'>30天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
+	var isSend bool
+	msgContent := ``
+	for _, v := range companyItems {
+		emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + v.EndDate + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
+		msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
+		isSend = true
+	}
+	emailContents += "</table></br>"
+
+	if isSend {
+		if seller.Email != "" {
+			utils.SendEmailByHongze("到期前30天提醒", emailContents, utils.EmailSendToUsers, "", "")
+		}
+
+		if seller.OpenId != "" {
+			first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于30天后到期,请注意查看"
+			keyword1 := "到期前30天提醒"
+			keyword2 := remindEndDate
+			remark := msgContent
+
+			openIdList := make([]*models.OpenIdList, 0)
+			openIdItem := new(models.OpenIdList)
+			openIdItem.OpenId = seller.OpenId
+			openIdList = append(openIdList, openIdItem)
+			SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, openIdList)
+		}
+	}
+}
+
+//15天后到期客户
+func CompanyRemind15Day(seller *models.Sellers) {
+	var err error
+	defer func() {
+		if err != nil {
+			go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+	remindEndDate := time.Now().AddDate(0, 0, 15).Format(utils.FormatDate)
+	companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
+	if err != nil {
+		return
+	}
+	var isSend bool
+	msgContent := ``
+	emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于15天后到期,请注意查看</p>"
+	emailContents += "<table border='1'><tr><td width='200'>30天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
+	for _, v := range companyItems {
+		emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + v.EndDate + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
+		msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
+		isSend = true
+	}
+	emailContents += "</table></br>"
+
+	if isSend {
+		if seller.Email != "" {
+			utils.SendEmailByHongze("到期前30天提醒", emailContents, utils.EmailSendToUsers, "", "")
+		}
+
+		if seller.OpenId != "" {
+			first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于30天后到期,请注意查看"
+			keyword1 := "到期前30天提醒"
+			keyword2 := remindEndDate
+			remark := msgContent
+
+			openIdList := make([]*models.OpenIdList, 0)
+			openIdItem := new(models.OpenIdList)
+			openIdItem.OpenId = seller.OpenId
+			openIdList = append(openIdList, openIdItem)
+			SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, openIdList)
+		}
+	}
+}
+
+//7天后到期客户名称
+func CompanyRemind7Day(seller *models.Sellers) {
+	var err error
+	defer func() {
+		if err != nil {
+			go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+	remindEndDate := time.Now().AddDate(0, 0, 7).Format(utils.FormatDate)
+	companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
+	if err != nil {
+		return
+	}
+	var isSend bool
+	msgContent := ``
+	emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于7天后到期,请注意查看</p>"
+	emailContents += "<table border='1'><tr><td width='200'>30天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
+	for _, v := range companyItems {
+		emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + v.EndDate + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
+		msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
+		isSend = true
+	}
+	emailContents += "</table></br>"
+
+	if isSend {
+		if seller.Email != "" {
+			utils.SendEmailByHongze("到期前30天提醒", emailContents, utils.EmailSendToUsers, "", "")
+		}
+
+		if seller.OpenId != "" {
+			first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于30天后到期,请注意查看"
+			keyword1 := "到期前30天提醒"
+			keyword2 := remindEndDate
+			remark := msgContent
+
+			openIdList := make([]*models.OpenIdList, 0)
+			openIdItem := new(models.OpenIdList)
+			openIdItem.OpenId = seller.OpenId
+			openIdList = append(openIdList, openIdItem)
+			SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, openIdList)
+		}
+	}
+}
+
+//d到期当天提醒
+func CompanyRemind1Day(seller *models.Sellers) {
+	var err error
+	defer func() {
+		if err != nil {
+			go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "到期提醒失败:CompanyRemind;Err"+err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+	remindEndDate := time.Now().AddDate(0, 0, 0).Format(utils.FormatDate)
+	companyItems, err := models.GetRemindCompany(seller.AdminId, remindEndDate)
+	if err != nil {
+		return
+	}
+	var isSend bool
+	msgContent := ``
+	emailContents := "<div><p>您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于今天后到期,请注意查看</p>"
+	emailContents += "<table border='1'><tr><td width='200'>30天后到期客户名称</td><td width='200'>到期日期</td><td width='200'>销售人员</td><td>客户类型</td></tr>"
+	for _, v := range companyItems {
+		emailContents += `<tr><td>` + v.CompanyName + `</td><td>` + v.EndDate + `</td><td>` + seller.RealName + `</td><td>` + v.Status + `</td></tr>`
+		msgContent += `客户:` + v.CompanyName + ";状态:" + v.Status + "\n"
+		isSend = true
+	}
+	emailContents += "</table></br>"
+
+	if isSend {
+		if seller.Email != "" {
+			utils.SendEmailByHongze("到期前30天提醒", emailContents, utils.EmailSendToUsers, "", "")
+		}
+
+		if seller.OpenId != "" {
+			first := "您有【" + strconv.Itoa(len(companyItems)) + "】 客户将于30天后到期,请注意查看"
+			keyword1 := "到期前30天提醒"
+			keyword2 := remindEndDate
+			remark := msgContent
+
+			openIdList := make([]*models.OpenIdList, 0)
+			openIdItem := new(models.OpenIdList)
+			openIdItem.OpenId = seller.OpenId
+			openIdList = append(openIdList, openIdItem)
+			SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark, openIdList)
+		}
+	}
+}

+ 12 - 8
services/task.go

@@ -40,9 +40,13 @@ func Task() {
 	companyLoss := toolbox.NewTask("companyLoss", "0 20 0 * * *", CompanyLoss)
 	toolbox.AddTask("companyLoss", companyLoss)
 
+	//到期提醒
+	companyRemind := toolbox.NewTask("companyRemind", "0 30 08 * * *", CompanyRemind)
+	toolbox.AddTask("companyRemind", companyRemind)
+
 	//删除日志记录
-	deleteReportSaveLog := toolbox.NewTask("deleteReportSaveLog", "0 20 0 * * *", DeleteReportSaveLog)
-	toolbox.AddTask("deleteReportSaveLog", deleteReportSaveLog)
+	//deleteReportSaveLog := toolbox.NewTask("deleteReportSaveLog", "0 30 08 * * *", DeleteReportSaveLog)
+	//toolbox.AddTask("deleteReportSaveLog", deleteReportSaveLog)
 
 	toolbox.StartTask()
 	//GetHistoryLzProductDetail()
@@ -52,12 +56,12 @@ func Task() {
 	//GetLzProductList()GetLzProductDetail
 	fmt.Println("task end")
 }
-//
-//func Task() {
-//	fmt.Println("start")
-//	ImportCompanyUsers()
-//	fmt.Println("end")
-//}
+
+func Task123() {
+	fmt.Println("start")
+	CompanyRemind()
+	fmt.Println("end")
+}
 
 func SendEmail() (err error) {
 	//报告历史访问次数

+ 57 - 23
services/wx_template_msg.go

@@ -11,44 +11,43 @@ import (
 	"time"
 )
 
-
-func SendWxMsgWithFrequency(first,keyword1,keyword2,remark string,openIdList []*models.OpenIdList)(err error) {
+func SendWxMsgWithFrequency(first, keyword1, keyword2, remark string, openIdList []*models.OpenIdList) (err error) {
 	var msg string
 	defer func() {
-		if err!=nil {
+		if err != nil {
 			go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
-			utils.FileLog.Info("发送模版消息失败,Err:%s",err.Error())
+			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
 		}
-		fmt.Println("line 21",err,msg)
+		fmt.Println("line 21", err, msg)
 	}()
-	utils.FileLog.Info("%s","services SendMsg")
-	accessToken,err:=models.GetWxAccessToken()
-	if err!=nil {
-		msg="GetWxAccessToken Err:"+err.Error()
+	utils.FileLog.Info("%s", "services SendMsg")
+	accessToken, err := models.GetWxAccessToken()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
 		return
 	}
-	if accessToken ==""{
-		msg="accessToken is empty"
+	if accessToken == "" {
+		msg = "accessToken is empty"
 		return
 	}
 
-	sendUrl:= "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+accessToken
-	templateId:=utils.TemplateId
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+	templateId := utils.TemplateId
 	//if true{
-	sendMap:=make(map[string]interface{})
-	sendData:=make(map[string]interface{})
+	sendMap := make(map[string]interface{})
+	sendData := make(map[string]interface{})
 
-	sendMap["template_id"]=templateId
+	sendMap["template_id"] = templateId
 
 	//redirectUrl:="report.hzinsights.com/#/allindex/"+strconv.Itoa(v.ResearchReportId)+"/"+v.ReportType;
 
 	//sendMap["url"]=redirectUrl
-	sendData["first"]=map[string]interface{}{"value":first,"color":"#173177"}
-	sendData["keyword1"]=map[string]interface{}{"value":keyword1,"color":"#173177"}
-	sendData["keyword2"]=map[string]interface{}{"value":keyword2,"color":"#173177"}
-	sendData["remark"]=map[string]interface{}{"value":remark,"color":"#173177"}
-	sendMap["data"]=sendData
-	WxSendTemplateMsg(sendUrl,sendMap,openIdList)
+	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
+	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
+	sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
+	sendMap["data"] = sendData
+	WxSendTemplateMsg(sendUrl, sendMap, openIdList)
 	return
 }
 
@@ -70,7 +69,7 @@ func WxSendTemplateMsg(sendUrl string, sendMap map[string]interface{}, items []*
 	return
 }
 
-func 	SendTemplateMsg(sendUrl string, data []byte) (err error) {
+func SendTemplateMsg(sendUrl string, data []byte) (err error) {
 	client := http.Client{}
 	resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
 	if err != nil {
@@ -87,3 +86,38 @@ func 	SendTemplateMsg(sendUrl string, data []byte) (err error) {
 	}
 	return
 }
+
+
+//到期提醒模板消息
+func SendWxMsgWithCompanyRemind(first,keyword1,keyword2,remark string,openIdList []*models.OpenIdList)(err error) {
+	var msg string
+	defer func() {
+		if err!=nil {
+			go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			utils.FileLog.Info("发送模版消息失败,Err:%s",err.Error())
+		}
+	}()
+	utils.FileLog.Info("%s","services SendMsg")
+	accessToken,err:=models.GetWxAccessToken()
+	if err!=nil {
+		msg="GetWxAccessToken Err:"+err.Error()
+		return
+	}
+	if accessToken ==""{
+		msg="accessToken is empty"
+		return
+	}
+
+	sendUrl:= "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+accessToken
+	sendMap:=make(map[string]interface{})
+	sendData:=make(map[string]interface{})
+
+	sendMap["template_id"]=utils.RemindTemplateId
+	sendData["first"]=map[string]interface{}{"value":first,"color":"#173177"}
+	sendData["productname"]=map[string]interface{}{"value":keyword1,"color":"#173177"}
+	sendData["date"]=map[string]interface{}{"value":keyword2,"color":"#173177"}
+	sendData["remark"]=map[string]interface{}{"value":remark,"color":"#173177"}
+	sendMap["data"]=sendData
+	WxSendTemplateMsg(sendUrl,sendMap,openIdList)
+	return
+}

+ 3 - 0
utils/config.go

@@ -21,6 +21,7 @@ var (
 	WxAppId     string
 	WxAppSecret string
 	TemplateId  string
+	RemindTemplateId string
 )
 
 func init() {
@@ -40,6 +41,7 @@ func init() {
 		WxAppId = "wx4a844c734d8c8e56"
 		WxAppSecret = "26c586e7ccb3c575433f0f37797b3eeb"
 		TemplateId = "P0klzaZjEI2UYth-z-WnmtOQgyxcF8klPoA_MlsA8Eo"
+		RemindTemplateId="PaHpQjVffrvmeW8wiOUcqlEhnD1LXyU9FnPVF-Jg9wM"
 	} else {
 		CompanyId = 16
 		RealName="超级管理员"
@@ -47,6 +49,7 @@ func init() {
 		WxAppId = "wx9b5d7291e581233a"
 		WxAppSecret = "f4d52e34021eee262dce9682b31f8861"
 		TemplateId = "P0klzaZjEI2UYth-z-WnmtOQgyxcF8klPoA_MlsA8Eo"
+		RemindTemplateId="9JYV6sHMJlu2EHRBIj_8ift6wkrrTb9_UO-M_-YXKBw"
 	}
 }
 

+ 9 - 8
utils/email.go

@@ -52,14 +52,15 @@ func SendEmailByHongze(title, content string, touser,attachPath,attachName strin
 	m.SetBody("text/html", content)
 
 	//body := new(bytes.Buffer)
-	m.Attach(attachPath,
-		gomail.Rename(attachName),
-		gomail.SetHeader(map[string][]string{
-			"Content-Disposition": []string{
-				fmt.Sprintf(`attachment; filename="%s"`, mime.QEncoding.Encode("UTF-8", attachName)),
-			},
-		}),)
-
+	if attachPath != "" {
+		m.Attach(attachPath,
+			gomail.Rename(attachName),
+			gomail.SetHeader(map[string][]string{
+				"Content-Disposition": []string{
+					fmt.Sprintf(`attachment; filename="%s"`, mime.QEncoding.Encode("UTF-8", attachName)),
+				},
+			}),)
+	}
 	d := gomail.NewDialer("smtp.mxhichina.com", 465, "public@hzinsights.com", "Hzinsights2018")
 	if err := d.DialAndSend(m); err != nil {
 		fmt.Println("send err:",err.Error())