Browse Source

Merge branch 'cygx_v2' of hongze/hongze_cygx into master

hongze 3 years ago
parent
commit
330f39f7b6

+ 87 - 7
controllers/activity.go

@@ -16,6 +16,10 @@ type ActivityCoAntroller struct {
 	BaseAuthController
 }
 
+type ActivityABaseController struct {
+	BaseCommonController
+}
+
 // @Title 活动类型列表
 // @Description活动类型列表接口
 // @Success 200 {object} models.ActivityTypeListResp
@@ -53,8 +57,9 @@ func (this *ActivityCoAntroller) List() {
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   ChartPermissionIds   query   string  false     "行业id 多个用 , 隔开"
 // @Param   ActivityTypeIds   query   string  false     "活动类型id 多个用 , 隔开"
-// @Param   KeyWord   query   string  false       "搜索关键词"
+// @Param   KeyWord   query   string  false       "搜索关键词 多个用 , 隔开"
 // @Param   ActiveState   query   string  false       "活动进行状态 未开始:1、进行中2、已结束3"
+// @Param   WhichDay   query   string  false       "哪一天 今天:1、明天:2,多个用 , 隔开"
 // @Param   IsShowJurisdiction   query   int  false       "是否仅展示有权限的,1是,2否 默认为零"
 // @Success 200 {object} models.GetCygxActivityListRep
 // @router /list [get]
@@ -77,6 +82,7 @@ func (this *ActivityCoAntroller) ActivityList() {
 	currentIndex, _ := this.GetInt("CurrentIndex")
 	chartPermissionIds := this.GetString("ChartPermissionIds")
 	activityTypeIds := this.GetString("ActivityTypeIds")
+	whichDay := this.GetString("WhichDay")
 	isShowJurisdiction, _ := this.GetInt("IsShowJurisdiction")
 
 	keyWord := this.GetString("KeyWord")
@@ -123,6 +129,12 @@ func (this *ActivityCoAntroller) ActivityList() {
 		//4、仅开通专家套餐的正式客户
 		//5、开通对应行业套餐或专家套餐的试用客户
 		if companyDetail.Status == "永续" {
+			permissionStr, err = models.GetCompanyPermission(user.CompanyId)
+			if err != nil {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
+				return
+			}
 			userType = 1
 		} else if companyDetail.Status == "试用" {
 			userType = 5
@@ -145,7 +157,6 @@ func (this *ActivityCoAntroller) ActivityList() {
 	if isShowJurisdiction == 1 && chartPermissionIds == "" && userType == 4 {
 		activityTypeIds = "1,3"
 	}
-
 	var startSize int
 	if pageSize <= 0 {
 		pageSize = utils.PageSize20
@@ -157,16 +168,37 @@ func (this *ActivityCoAntroller) ActivityList() {
 	var condition string
 	var pars []interface{}
 	//活动可见限制
-
 	var sqlExport string
+
+	slicePer := strings.Split(permissionStr, ",")
+	var permissionSqlStr string
+	for _, v := range slicePer {
+		permissionSqlStr += "'" + v + "',"
+	}
+	permissionSqlStr = strings.TrimRight(permissionSqlStr, ",")
+	fmt.Println(permissionSqlStr)
+	permissionSqlStr = ` AND art.chart_permission_name  IN (` + permissionSqlStr + `)`
 	if userType == 3 && strings.Contains(permissionStr, "专家") {
-		sqlExport = `	OR ( is_limit_people = 1 OR  customer_type_ids LIKE '%4%' ) `
+		sqlExport = `	OR ( art.is_limit_people = 1 AND   art.customer_type_ids LIKE '%4%'   ` + permissionSqlStr + `) `
 	}
-	condition += ` AND (is_limit_people = 0 OR(is_limit_people = 1 AND customer_type_ids LIKE'%` + strconv.Itoa(userType) + `%')  ` + sqlExport + `) `
+
 	if keyWord != "" {
-		condition += ` AND (art.activity_name LIKE '%` + keyWord + `%' )`
+		slicekeyWord := strings.Split(keyWord, ",")
+		var sqlOr string
+		if len(slicekeyWord) >= 2 {
+			for _, v := range slicekeyWord {
+				sqlOr += `  OR art.activity_name LIKE '%` + v + `%' `
+			}
+			condition += ` AND (art.activity_name LIKE '%` + keyWord + `%' ` + sqlOr + ` )`
+		} else {
+			condition += ` AND (art.activity_name LIKE '%` + keyWord + `%' )`
+		}
 	}
 
+	//if userType == 3 {
+
+	//}
+
 	//行业名称
 	if len(chartPermissionIds) > 0 {
 		condition += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
@@ -174,11 +206,34 @@ func (this *ActivityCoAntroller) ActivityList() {
 	if activityTypeIds != "" {
 		condition += ` AND art.activity_type_id  IN (` + activityTypeIds + `)`
 	}
+	if whichDay != "" {
+		var startDate string
+		var endDate string
+		if whichDay == "1" {
+			startDate = time.Now().Format(utils.FormatDate)
+			endDate = startDate
+		} else if whichDay == "2" {
+			startDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
+			endDate = startDate
+		} else {
+			startDate = time.Now().Format(utils.FormatDate)
+			endDate = time.Now().AddDate(0, 0, +1).Format(utils.FormatDate)
+		}
+		condition += ` AND art.activity_time >= ` + "'" + startDate + " 00:00:00'"
+		condition += ` AND art.activity_time <= ` + "'" + endDate + " 23:59:59'"
+	}
 
-	condition += ` AND art.publish_status = 1 `
+	condition += ` AND (art.is_limit_people = 0 OR(art.is_limit_people = 1 AND art.customer_type_ids LIKE'%` + strconv.Itoa(userType) + `%')  ` + sqlExport + permissionSqlStr + `) `
 	if activeState != "" {
 		condition += ` AND art.active_state  IN (` + activeState + `)`
 	}
+	var conditionOr string
+	if strings.Contains(permissionStr, "专家") {
+		conditionOr = `	OR ( art.activity_type_id IN ( 1,2,3 ) AND art.publish_status = 1 ` + condition + `) `
+	}
+	condition += ` AND art.publish_status = 1 `
+
+	condition += ` AND art.chart_permission_name  ` + permissionSqlStr + conditionOr
 	total, err := models.GetActivityCount(condition, pars)
 	if err != nil {
 		br.Msg = "获取失败"
@@ -1351,3 +1406,28 @@ func (this *ActivityCoAntroller) MeetingReminderCancel() {
 	br.Msg = "会议提醒已取消"
 	br.Data = resp
 }
+
+// @Title 敏捷搜索关键词的列表
+// @Description 获取敏捷搜索关键词的列表接口
+// @Success 200 {object} models.ActivityFastsearchKeywordsListResp
+// @router /fastSearchKeWord [get]
+func (this *ActivityABaseController) FastSearch() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	resp := new(models.ActivityFastsearchKeywordsListResp)
+	list, err := models.GetActivityFastsearchKeywordsList()
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 63 - 0
models/activity.go

@@ -349,3 +349,66 @@ func UPdateSendedMsgMeetingStatus(signupIds string) (err error) {
 	_, err = o.Raw(sql).Exec()
 	return
 }
+
+//获取满足推送的活动ID数量
+func GetCountActivityIdToSendFile(endDate string) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+	COUNT(1) count
+FROM
+	cygx_activity AS a
+	INNER JOIN cygx_activity_signup AS s ON s.activity_id = a.activity_id 
+WHERE
+	1 = 1 
+	AND s.signup_type = 1 
+	AND s.fail_type = 0 
+	AND a.is_send_file_toemail = 0 
+	AND a.activity_time <= ? AND a.activity_time >= NOW() 	GROUP BY a.activity_id `
+	err = o.Raw(sql, endDate).QueryRow(&count)
+	return
+}
+
+//获取满足推送的活动ID
+func GetActivityIdToSendFile(endDate string) (items []*ActivityIdRep, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+	* 
+FROM
+	cygx_activity AS a
+	INNER JOIN cygx_activity_signup AS s ON s.activity_id = a.activity_id 
+WHERE
+	1 = 1 
+	AND s.signup_type = 1 
+	AND s.fail_type = 0 
+	AND a.is_send_file_toemail = 0 
+	AND a.activity_time <= ? AND a.activity_time >= NOW() 	GROUP BY a.activity_id `
+	_, err = o.Raw(sql, endDate).QueryRows(&items)
+	return
+}
+
+type SignupExportRep struct {
+	Mobile      string `description:"手机号"`
+	CompanyName string `description:"公司名称"`
+	RealName    string `description:"姓名"`
+	CountryCode string `description:"区号"`
+}
+
+func GetSignupExport(activityId int) (item []*SignupExportRep, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT s.*  ,a.is_limit_people,u.real_name ,u.country_code
+			FROM
+			cygx_activity_signup AS s
+			LEFT JOIN wx_user AS u ON u.user_id = s.user_id
+			LEFT JOIN cygx_activity AS a ON a.activity_id = s.activity_id
+			WHERE a.activity_id = ?  AND s.fail_type = 0`
+	_, err = o.Raw(sql, activityId).QueryRows(&item)
+	return
+}
+
+//修改文件是否推送状态
+func UPdateActivityIdToSendFile(activityId int) (err error) {
+	sql := ` UPDATE cygx_activity SET  is_send_file_toemail= 1  WHERE activity_id = ?`
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, activityId).Exec()
+	return
+}

+ 22 - 0
models/activity_fastsearch_keywords.go

@@ -0,0 +1,22 @@
+package models
+
+import (
+	"rdluck_tools/orm"
+)
+
+type ActivityFastsearchKeywords struct {
+	Id      int    `description:"活动类型id"`
+	KeyWord string `description:"关键词"`
+}
+
+type ActivityFastsearchKeywordsListResp struct {
+	List []*ActivityFastsearchKeywords
+}
+
+//列表
+func GetActivityFastsearchKeywordsList() (items []*ActivityFastsearchKeywords, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_activity_fastsearch_keywords ORDER BY sort DESC`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 1 - 0
routers/router.go

@@ -84,6 +84,7 @@ func init() {
 		beego.NSNamespace("/activity",
 			beego.NSInclude(
 				&controllers.ActivityCoAntroller{},
+				&controllers.ActivityABaseController{},
 			),
 		),
 	)

+ 132 - 2
services/activity.go

@@ -2,8 +2,11 @@ package services
 
 import (
 	"fmt"
+	"github.com/tealeg/xlsx"
 	"hongze/hongze_cygx/models"
 	"hongze/hongze_cygx/utils"
+	"os"
+	"path/filepath"
 	"strconv"
 	"strings"
 	"time"
@@ -23,14 +26,14 @@ func UpdateActivitySattus() (err error) {
 	return
 }
 
-//推送会议开始消息提醒30分钟前
+//推送会议开始消息提醒60分钟前
 func SendActivityBeginMsg() (err error) {
 	defer func() {
 		if err != nil {
 			fmt.Println("发送失败,Err:", err.Error())
 		}
 	}()
-	endDate := time.Now().Add(+time.Minute * 30).Format("2006-01-02 15:04:05")
+	endDate := time.Now().Add(+time.Minute * 60).Format("2006-01-02 15:04:05")
 	listActivity, err := models.GetActivitySendMsgListAll(endDate)
 	fmt.Println(len(listActivity))
 	if err != nil {
@@ -119,3 +122,130 @@ func SendActivityBeginMsgMeeting() (err error) {
 	}
 	return
 }
+
+//预约外呼名单,会前1小时自动发送邮件给专家组
+func SendEmailFileToExpert() (err error) {
+	var msg string
+	var touser string
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			utils.FileLog.Info("发送附件模版消息失败,Err:%s", err.Error())
+		}
+		if msg != "" {
+			fmt.Println(msg)
+			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+		}
+	}()
+	fmt.Println("发送附件")
+	endDate := time.Now().Add(+time.Minute * 60).Format("2006-01-02 15:04:05")
+	total, err := models.GetCountActivityIdToSendFile(endDate)
+
+	if total == 0 {
+		fmt.Println("发送附件完成0")
+		return nil
+	}
+	if err != nil {
+		msg = "发送附件模版消息失败 Err:" + err.Error()
+		return
+	}
+	listActivity, err := models.GetActivityIdToSendFile(endDate)
+	if err != nil {
+		msg = "发送附件模版消息失败 Err:" + err.Error()
+		return
+	}
+
+	for _, v := range listActivity {
+		fmt.Println(v.ActivityId)
+		activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
+		if activityInfo == nil {
+			msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
+			return
+		}
+		list, errFile := models.GetSignupExport(v.ActivityId)
+		if errFile != nil {
+			msg = "获取失败,Err:" + errFile.Error()
+			return
+		}
+		//创建excel
+		dir, errFile := os.Executable()
+		exPath := filepath.Dir(dir)
+		downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+		xlsxFile := xlsx.NewFile()
+		if errFile != nil {
+			msg = "生成文件失败Err:" + errFile.Error()
+			return
+		}
+		style := xlsx.NewStyle()
+		alignment := xlsx.Alignment{
+			Horizontal: "center",
+			Vertical:   "center",
+			WrapText:   true,
+		}
+		style.Alignment = alignment
+		style.ApplyAlignment = true
+		sheet, errFile := xlsxFile.AddSheet("外呼名单")
+		if errFile != nil {
+			msg = "新增Sheet失败,Err:" + errFile.Error()
+			return
+		}
+		//标头
+		rowTitle := sheet.AddRow()
+		cellA := rowTitle.AddCell()
+		cellA.Value = "姓名"
+		cellB := rowTitle.AddCell()
+		cellB.Value = "手机号"
+		cellC := rowTitle.AddCell()
+		cellC.Value = "国际代码"
+		cellD := rowTitle.AddCell()
+		cellD.Value = "公司名称"
+
+		for _, item := range list {
+			row := sheet.AddRow()
+			cellA := row.AddCell()
+			cellA.Value = item.RealName
+			cellB := row.AddCell()
+			cellB.Value = item.Mobile
+			cellC := row.AddCell()
+			if item.CountryCode == "" {
+				cellC.Value = "86"
+			} else {
+				cellC.Value = item.CountryCode
+			}
+			cellD := row.AddCell()
+			cellD.Value = item.CompanyName
+		}
+		errFile = xlsxFile.Save(downLoadnFilePath)
+		if errFile != nil {
+			msg = "保存文件失败Err:" + errFile.Error()
+			return
+		}
+		title := activityInfo.ActivityName + "外呼名单"
+		content := "外呼名单详情"
+		fileName := downLoadnFilePath
+		if activityInfo.ChartPermissionName == "科技" {
+			touser = utils.EmailTechnology
+		} else if activityInfo.ChartPermissionName == "医药" {
+			touser = utils.EmailMedicine
+		} else if activityInfo.ChartPermissionName == "消费" {
+			touser = utils.EmailConsumption
+		} else if activityInfo.ChartPermissionName == "智造" {
+			touser = utils.EmailZhizao
+		} else if activityInfo.ChartPermissionName == "策略" {
+			touser = utils.EmailStrategy
+		}
+		go utils.SendEmailHaveFile(title, content, fileName, touser)
+		defer func() {
+			os.Remove(downLoadnFilePath)
+		}()
+		time.Sleep(time.Duration(2) * time.Second) //延迟两秒,避免过多活动的时候邮件发送没有内容
+		errFile = models.UPdateActivityIdToSendFile(v.ActivityId)
+		if errFile != nil {
+			msg = "获取失败,Err:" + errFile.Error()
+			return
+		}
+	}
+	fmt.Println("发送附件完成")
+	return
+}

+ 4 - 1
services/task.go

@@ -42,11 +42,14 @@ func Task() {
 	//更新报告的搜索栏内容
 	//UpdateIndustrialManagementSubjectNnames()
 	//会议提醒模板消息推送
-	sendActivityBeginMsg := toolbox.NewTask("sendActivityBeginMsg", "0 */10 8-22 * * *", SendActivityBeginMsg) //会议前30分钟的提醒
+	sendActivityBeginMsg := toolbox.NewTask("sendActivityBeginMsg", "0 */10 8-22 * * *", SendActivityBeginMsg) //会议前60分钟的提醒
 	toolbox.AddTask("sendActivityBeginMsg", sendActivityBeginMsg)
 	sendActivityBeginMsgMeeting := toolbox.NewTask("sendActivityBeginMsgMeeting", "0 */5 8-22 * * *", SendActivityBeginMsgMeeting) //会议前15分钟的提醒
 	toolbox.AddTask("sendActivityBeginMsgMeeting", sendActivityBeginMsgMeeting)
 
+	//预约外呼名单,会前1小时自动发送邮件给专家组
+	sendEmailFileToExpert := toolbox.NewTask("sendEmailFileToExpert", "0 */5 8-22 * * *", SendEmailFileToExpert) //预约外呼名单,会前1小时自动发送邮件给专家组
+	toolbox.AddTask("sendEmailFileToExpert", sendEmailFileToExpert)
 	//UpdateActivitySattus()
 	toolbox.StartTask()
 	fmt.Println("end")

+ 19 - 0
utils/config.go

@@ -42,6 +42,11 @@ var (
 	IndexName        string
 	OnlineTime       string
 	SummaryArticleId int
+	EmailTechnology  string //科技行业专家邮箱
+	EmailMedicine    string //医药行业专家邮箱
+	EmailConsumption string //消费行业专家邮箱
+	EmailZhizao      string //智造行业专家邮箱
+	EmailStrategy    string //策略行业专家邮箱
 )
 
 func init() {
@@ -79,6 +84,13 @@ func init() {
 		WxPublicAppSecret = "26c586e7ccb3c575433f0f37797b3eeb"
 		WxPublicId = "gh_b67e0049fb8c"
 		IndexName = "cygx_article_v0712"
+
+		//接收附件邮箱
+		EmailTechnology = "mlluo@hzinsights.com; jxu@hzinsights.com; agne@hzinsights.com" //科技行业专家邮箱
+		EmailMedicine = "xlzheng@hzinsights.com"                                          //医药行业专家邮箱
+		EmailConsumption = "yrhuang@hzinsights.com"                                       //消费行业专家邮箱
+		EmailZhizao = "xfma@hzinsights.com; agne@hzinsights.com"                          //智造行业专家邮箱
+		EmailStrategy = "xfma@hzinsights.com"                                             //策略行业专家邮箱
 	} else {
 		WxAppId = "wxcc32b61f96720d2f"
 		WxAppSecret = "06894933fafb24dafead7eaae09c08e0"
@@ -94,6 +106,13 @@ func init() {
 		WxPublicAppSecret = "f4d52e34021eee262dce9682b31f8861"
 		WxPublicId = "gh_5dc508325c6f"
 		IndexName = "cygx_article_v1"
+
+		//接收附件邮箱
+		EmailTechnology = "jhwang@hzinsights.com;cxzhang@hzinsights.com"  //科技行业专家邮箱
+		EmailMedicine = "jhwang@hzinsights.com;cxzhang@hzinsights.com"    //医药行业专家邮箱
+		EmailConsumption = "jhwang@hzinsights.com;cxzhang@hzinsights.com" //消费行业专家邮箱
+		EmailZhizao = "jhwang@hzinsights.com;cxzhang@hzinsights.com"      //智造行业专家邮箱
+		EmailStrategy = "jhwang@hzinsights.com;cxzhang@hzinsights.com"    //策略行业专家邮箱
 	}
 }
 

+ 3 - 2
utils/constants.go

@@ -19,8 +19,9 @@ const (
 )
 
 const (
-	APPNAME          = "弘则-查研观向"
-	EmailSendToUsers = "glji@hzinsights.com;pyan@hzinsights.com;cxzhang@hzinsights.com"
+	APPNAME           = "弘则-查研观向"
+	EmailSendToUsers  = "glji@hzinsights.com;pyan@hzinsights.com;cxzhang@hzinsights.com"
+	EmailSendToExpert = "jhwang@hzinsights.com;cxzhang@hzinsights.com"
 )
 
 //手机号,电子邮箱正则

+ 25 - 0
utils/email.go

@@ -61,3 +61,28 @@ func SendEmailByHz(title, content string, touser string) (result bool, err error
 	result = true
 	return
 }
+
+//发送带有文件的邮件
+func SendEmailHaveFile(title, content string, fileName, touser string) bool {
+	var arr []string
+	sub := strings.Index(touser, ";")
+	if sub >= 0 {
+		spArr := strings.Split(touser, ";")
+		for _, v := range spArr {
+			arr = append(arr, v)
+		}
+	} else {
+		arr = append(arr, touser)
+	}
+	m := gomail.NewMessage()
+	m.SetHeader("From", "317699326@qq.com ")
+	m.SetHeader("To", arr...)
+	m.SetHeader("Subject", title)
+	m.Attach(fileName)
+	m.SetBody("text/html", content)
+	d := gomail.NewDialer("smtp.qq.com", 587, "317699326@qq.com", "oqdypwfcvruwcbea")
+	if err := d.DialAndSend(m); err != nil {
+		return false
+	}
+	return true
+}