package cygx

import (
	"fmt"
	"hongze/hz_crm_api/models/company"
	"hongze/hz_crm_api/utils"

	//"hongze/hongze_admin/models"
	"github.com/beego/beego/v2/client/orm"
	"github.com/rdlucklib/rdluck_tools/paging"
	"time"
)

// 活动详情
type CygxSignupList struct {
	ActivityId                int    `orm:"column(activity_id);pk";description:"活动ID 等于0新增活动,大于0修改活动"`
	ActivityName              string `description:"活动名称"`
	ActivityTypeName          string `description:"活动类型名称"`
	ChartPermissionName       string `description:"行业名称"`
	ChartPermissionNames      string `description:"行业名称辅助字段,区分研选子分类"`
	LimitPeopleNum            int    `description:"限制的人数数量"`
	ActivityTime              string `description:"活动时间"`
	ActivityTimeText          string `description:"活动时间带文字"`
	SignupPeopleNum           int    `description:"报名人数/预约外呼人数"`
	SignupFailPeopleNum       int    `description:"报名/预约外呼失败人数"`
	AskNum                    int    `description:"带问人数"`
	AppointmentPeopleNum      int    `description:"预约纪要人数"`
	ReminderPeopleNum         int    `description:"设置会议提醒人数"`
	IsShowAppointment         bool   `description:"是否展示预约纪要"`
	IsHideAppointment         int    `description:"是否隐藏预约纪要按钮  1是,0 否"`
	ActivityTypeId            int    `description:"活动类型id"`
	Label                     string `description:"标签"`
	ActiveState               int    `description:"活动进行状态 未开始:1、进行中2、已结束3"`
	PublishStatus             int    `description:"发布状态 1已发布,0未发布"`
	TemporaryLabel            string `description:"临时标签"`
	YidongActivityId          string `description:"易董的活动ID"`
	IsCanAppointmentMinutes   int    `description:"是否可预约纪要 1是 ,0 否 默认0 "`
	IsCancel                  int    `description:"是否取消,1是,0否"`
	IsYidongConduct           int    `description:"是否属于易董办会 1:是 、0:否"`
	IsResearchPoints          int    `description:"是否为研选扣点  1是,0否"`
	ChartPermissionNameDeputy string `description:"副行业名称"`
}

type GetCygxSignupListRep struct {
	Paging *paging.PagingItem `description:"分页数据"`
	List   []*CygxSignupList
}

// 获取数量
func GetCygxSignupCount(condition string, pars []interface{}) (count int, err error) {
	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity as art WHERE 1= 1  `
	if condition != "" {
		sqlCount += condition
	}
	o := orm.NewOrmUsingDB("hz_cygx")
	err = o.Raw(sqlCount, pars).QueryRow(&count)
	return
}

// 列表
func GetCygxSignupListAll(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxSignupList, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT 
		( SELECT COUNT( 1 ) FROM cygx_activity_signup AS s WHERE s.activity_id = art.activity_id  AND s.is_cancel = 0 AND  s.do_fail_type = 0 AND  s.company_id != 16 ) AS signup_people_num,
		( SELECT COUNT( 1 ) FROM cygx_activity_signup AS s  WHERE s.activity_id = art.activity_id  AND s.is_cancel = 0 AND  s.fail_type >= 1) AS signup_fail_people_num, 
		( SELECT COUNT( 1 ) FROM cygx_activity_help_ask AS k  WHERE k.activity_id = art.activity_id ) AS ask_num, 
		( SELECT COUNT( 1 ) FROM cygx_activity_appointment AS ap  WHERE ap.activity_id = art.activity_id ) AS appointment_people_num,
		( SELECT COUNT( 1 ) FROM cygx_activity_meeting_reminder AS ap    WHERE ap.activity_id = art.activity_id ) AS reminder_people_num,
		art.* FROM cygx_activity as art
		WHERE 1= 1 `
	if condition != "" {
		sql += condition
	}
	sql += ` LIMIT ?,?`
	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
	return
}

type CygxAppointmentList struct {
	Id             int    `orm:"column(id);pk"`
	ActivityId     int    `description:"活动ID"`
	ActivityTime   string `description:"活动时间"`
	UserId         int    `description:"用户ID"`
	CreateTime     string `description:"创建时间"`
	Mobile         string `description:"手机号"`
	OutboundMobile string `description:"外呼手机号"`
	CountryCode    string `description:"手机国家区号"`
	CompanyName    string `description:"公司名称"`
	CompanyId      int    `description:"公司ID"`
	RealName       string `description:"姓名"`
	FailType       int    `description:"失败原因,0,未失败,1总人数已满,2单机构超限制,3,爽约次数超限"`
	//MeetingType int    `description:"参会方式,0,无,1预约外呼,2自主拨入"`
	SellerName          string `description:"销售姓名"`
	PsellerName         string `description:"销售姓名"`
	SignupType          int    `description:"报名方式,1预约外呼,2自主拨入,3我要报名"`
	YidongExamineStatus int    `description:"易董活动报名审核状态0审核中,1:审核通过、2审核不通过"`
	Email               string `description:"邮箱"`
}

type CygxSignupUser struct {
	UserId     int `description:"用户ID"`
	ActivityId int `description:"活动ID"`
}

type CygxSignupId struct {
	SignupId    int `description:"报名ID"`
	CancelClass int `description:"取消类型 0取消报名,1取消外呼"`
}

// 预约外呼列表
func GetCygxAppointmentLisssst(activityId int) (items []*CygxAppointmentList, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT * FROM cygx_activity_signup  WHERE activity_id= ? `
	_, err = o.Raw(sql, activityId).QueryRows(&items)
	return
}

func GetCygxAppointmentList(article_id int, sqlStr string) (item []*CygxAppointmentList, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT s.*
			FROM
			cygx_activity_signup AS s
			LEFT JOIN cygx_activity AS a ON a.activity_id = s.activity_id
			WHERE a.activity_id = ?  AND s.do_fail_type = 0 ` + sqlStr + `  GROUP BY s.user_id   ORDER BY s.create_time DESC `
	_, err = o.Raw(sql, article_id).QueryRows(&item)
	return
}

type GetAppointmentListRep struct {
	ExcelType        string `description:"EXcel下载类型 AppointmentCall:预约外呼、ExpertSalon:专家沙龙报名、Teleconference:公司调研电话会、OfflineResearch:公司线下调研 、CClass: C类电话会 、YiDong:易董 "`
	ActivityId       int    `description:"活动ID"`
	Total            int    `description:"总人数"`
	MyTotal          int    `description:"本人名下客户"`
	IsLimitPeople    int    `description:"是否限制人数 1是,0否"`
	MemberType       string `description:"管理员身份 Admin:超级管理员、权益管理员、权益研究员、专家组;GroupLeader:组长;Sale:销售"`
	ActivityType     int    `description:"1线上 ,0 线下"`
	IsYidongConduct  int    `description:"是否属于易董办会 1:是 、0:否"`
	IsResearchPoints int    `description:"是否为研选扣点  1是,0否"`
	List             []*CygxAppointmentList
}

func GetCygxAppointmentCount(articleId int, sqlStr string) (count int, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT COUNT(*) FROM
			cygx_activity_signup AS s
			LEFT JOIN cygx_activity AS a ON a.activity_id = s.activity_id
			WHERE
			s.activity_id = ? ` + sqlStr + `
            GROUP BY s.user_id)`
	sql = `SELECT COUNT(*)  as count FROM (` + sql + ` a`

	err = o.Raw(sql, articleId).QueryRow(&count)
	return
}

// 新增外呼人员
type GetOutboundPersonnelListRep struct {
	List []*GetOutboundPersonnelRep
}

type GetOutboundPersonnelRep struct {
	UserId      int    `description:"用户id"`
	RealName    string `description:"姓名"`
	Mobile      string `description:"手机号"`
	CompanyName string `description:"公司名称"`
}

// 列表
func GetOutboundPersonnelList(name string) (items []*GetOutboundPersonnelRep, err error) {
	o := orm.NewOrm()
	sql := `SELECT u.user_id,u.real_name,u.mobile,p.company_name FROM wx_user as u INNER JOIN company AS p ON p.company_id = u.company_id WHERE  real_name LIKE '%` + name + `%'  AND u.company_id >1   GROUP BY u.user_id  ORDER BY user_id ASC`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

type AddOutboundPersonnelItm struct {
	UserIds     string `description:"用户id,多个用,隔开"`
	ActivityIds string `description:"活动ID,多个用,隔开"`
}

type AddOutboundPersonnelJsonItm struct {
	JsonStar    string `description:"报名信息json字符串 :Uid 用户ID,int类型 。Type string类型,报名方式,1预约外呼,2自主拨入 "`
	ActivityIds string `description:"活动ID,多个用,隔开"`
}

type CygxActivitySignup struct {
	Id             int       `orm:"column(id);pk"`
	UserId         int       `description:"用户id,多个用,隔开"`
	ActivityId     int       `description:"活动ID"`
	CreateTime     time.Time `description:"创建时间"`
	Mobile         string    `description:"手机号"`
	Email          string    `description:"邮箱号"`
	CompanyId      int       `description:"公司ID"`
	CompanyName    string    `description:"公司名称"`
	OutboundMobile string    `description:"外呼手机号"`
	CountryCode    string    `description:"手机国家区号"`
	Source         int       `description:"来源,1小程序,2后台添加"`
	SignupType     int       `description:"报名方式,1预约外呼,2自主拨入,3我要报名"`
	RealName       string    `description:"用户实际名称"`
	SellerName     string    `description:"所属销售"`
}

// 我的日程
type CygxMySchedule struct {
	Id          int       `orm:"column(id);pk"`
	ActivityId  int       `description:"活动ID"`
	UserId      int       `description:"用户ID"`
	CreateTime  time.Time `description:"创建时间"`
	Mobile      string    `description:"手机号"`
	Email       string    `description:"邮箱"`
	CompanyId   int       `description:"公司id"`
	CompanyName string    `description:"公司名称"`
}

type UserAndCompanyName struct {
	UserId              int `orm:"column(user_id);pk"`
	Mobile              string
	Email               string
	CompanyId           int
	CompanyName         string `description:"公司名称"`
	CountryCode         string `description:"手机国家区号"`
	OutboundMobile      string `description:"外呼手机号"`
	OutboundCountryCode string `description:"外呼手机号区号"`
	SellerName          string `description:"所属销售"`
	RealName            string `description:"真实姓名"`
}

func GetUserAndCompanyNameList(uid int) (item *UserAndCompanyName, err error) {
	o := orm.NewOrm()
	sql := ` SELECT
			u.*,
			c.company_name,
			GROUP_CONCAT( DISTINCT p.seller_name SEPARATOR '/' ) AS seller_name 
		FROM
			wx_user AS u
			INNER JOIN company AS c ON c.company_id = u.company_id
			LEFT JOIN company_product AS p ON p.company_id = u.company_id 
		WHERE
			user_id = ?`
	err = o.Raw(sql, uid).QueryRow(&item)
	return
}

func GetUserAndCompanyNameListByUids(uids string) (items []*UserAndCompanyName, err error) {
	o := orm.NewOrm()
	sql := ` SELECT u.*,c.company_name FROM wx_user AS u
	INNER JOIN company AS c ON c.company_id = u.company_id
	WHERE user_id IN (` + uids + `)`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// 新增预约人数
func AddCygxActivitySignup(items []*CygxActivitySignup, itemsAppointment []*CygxActivityAppointment, mapYidongActivity map[int]int) (err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()
	//添加预约纪要部分
	if len(itemsAppointment) > 0 {
		for _, item := range itemsAppointment {
			var count int
			sql := `SELECT COUNT(1) AS count FROM cygx_activity_appointment WHERE user_id=? AND activity_id=? `
			err = to.Raw(sql, item.UserId, item.ActivityId).QueryRow(&count)
			if err != nil {
				return
			}
			if count == 0 {
				_, err = to.Insert(item)
				if err != nil {
					return
				}
			}
		}
	}
	//添加会议提醒
	for _, item := range items {
		var count int
		sql := `SELECT COUNT(1) AS count FROM cygx_my_schedule WHERE user_id=? AND activity_id=? `
		err = to.Raw(sql, item.UserId, item.ActivityId).QueryRow(&count)
		if err != nil {
			return
		}
		//如果是易懂的活动就不加入日程
		if count == 0 && mapYidongActivity[item.ActivityId] == 0 {
			itemMy := new(CygxMySchedule)
			itemMy.UserId = item.UserId
			itemMy.ActivityId = item.ActivityId
			itemMy.CreateTime = time.Now()
			itemMy.Mobile = item.Mobile
			itemMy.Email = item.Email
			itemMy.CompanyId = item.CompanyId
			itemMy.CompanyName = item.CompanyName
			_, err = to.Insert(itemMy)
			if err != nil {
				return
			}
		}
		sql = `SELECT COUNT(1) AS count FROM cygx_activity_signup WHERE user_id=? AND activity_id=? `
		err = to.Raw(sql, item.UserId, item.ActivityId).QueryRow(&count)
		if err != nil {
			return
		}
		if count == 0 {
			_, err = to.Insert(item)
		} else {
			sql := `UPDATE cygx_activity_signup SET  is_cancel=0, do_fail_type = 0 ,create_time = NOW() WHERE user_id=? AND activity_id=? `
			_, err = to.Raw(sql, item.UserId, item.ActivityId).Exec()
		}
	}
	return
}

// 获取用户报名数量
func GetActivitySignupCount(uid, activityId int) (count int, err error) {
	sqlCount := `SELECT COUNT(1) AS count FROM cygx_activity_signup WHERE is_cancel=0  AND do_fail_type = 0  AND user_id=? AND activity_id=? `
	o := orm.NewOrmUsingDB("hz_cygx")
	err = o.Raw(sqlCount, uid, activityId).QueryRow(&count)
	return
}

func GetActivitySignupCountByActivityId(activityId int) (count int, err error) {
	sqlCount := `SELECT
					COUNT( 1 ) AS count 
				FROM
					cygx_activity_signup AS s
				WHERE
					s.do_fail_type = 0 
					AND s.company_id != 16 
					AND s.activity_id = ? `
	o := orm.NewOrmUsingDB("hz_cygx")
	err = o.Raw(sqlCount, activityId).QueryRow(&count)
	return
}

func GetActivitySignupCountByThisUser(activityId int, uids string) (count int, err error) {
	sqlCount := `SELECT COUNT(1) AS count FROM cygx_activity_signup WHERE do_fail_type = 0 AND activity_id=? AND user_id IN (` + uids + `) `
	o := orm.NewOrmUsingDB("hz_cygx")
	err = o.Raw(sqlCount, activityId).QueryRow(&count)
	return
}

//end

// 报名失败
type FailSignupListRep struct {
	Id               int    `orm:"column(id);pk;"description:"报名ID"`
	ActivityId       int    `description:"活动ID"`
	CreateTime       string `description:"创建时间"`
	Mobile           string `description:"手机号"`
	CompanyName      string `description:"公司名称"`
	CompanyId        int    `description:"公司ID"`
	RealName         string `description:"姓名"`
	UserId           int    `description:"用户id"`
	SellerName       string `description:"销售姓名"`
	PsellerName      string `description:"销售姓名"`
	FailType         int    `description:"失败原因,0,未失败,1总人数已满,2单机构超限制,3,爽约次数超限"`
	DoFailType       int    `description:"报名失败之后的操作,失败原因,0,未失败,1总人数已满,2单机构超限制,3,爽约次数超限"`
	SalonOperation   bool   `description:"操作按钮1,true,加入报名,false 限制报名"`
	CallOperation    int    `description:"操作按钮2,1预约外呼,2自主拨入,3限制报名"`
	IsAdminAddSignup int    `description:"(多余字段不使用)"`
	MeetingType      int    `description:"(多余字段不使用)"`
	IsMeeting        int    `description:"是否到会 ,1是, 0否"`
	SignupType       int    `description:"报名方式,1预约外呼,2自主拨入,3我要报名"`
}

type GetFailSignupListRep struct {
	ExcelType  string `description:"EXcel下载类型 AppointmentCall:预约外呼、ExpertSalon:专家沙龙报名、Teleconference:公司调研电话会、OfflineResearch:公司线下调研 "`
	MemberType string `description:"管理员身份 Admin:超级管理员、权益管理员、权益研究员、专家组;GroupLeader:组长;Sale:销售"`
	//ActivityId    int    `description:"活动ID"`
	Total         int  `description:"预约外呼总人数"`
	MyTotal       int  `description:"预约外呼本人名下客户"`
	IsLimitPeople int  `description:"是否限制人数 1是,0否"`
	IsFull        bool `description:"报名人数是否已满"`
	List          []*FailSignupListRep
}

func GetFailSignupList(activity_id int, sqlStr string) (item []*FailSignupListRep, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT s.* ,a.is_limit_people
			FROM
			cygx_activity_signup AS s
			LEFT JOIN cygx_activity AS a ON a.activity_id = s.activity_id
			WHERE a.activity_id = ?` + sqlStr + ` GROUP BY s.id  ORDER BY s.create_time DESC `
	_, err = o.Raw(sql, activity_id).QueryRows(&item)
	return
}

//end

type SignupId struct {
	Id int `orm:"column(id);pk;"description:"报名ID"`
}

type SignupIdCall struct {
	Id              int `description:"报名ID"`
	OperationStatus int `description:"操作方式:1预约外呼,2自主拨入,3限制报名"`
}

// 获取失败数量
func GetCygxSignupCountFile(id int) (count int, err error) {
	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity_signup  WHERE id= ?`
	o := orm.NewOrmUsingDB("hz_cygx")
	err = o.Raw(sqlCount, id).QueryRow(&count)
	return
}
func GetCygxSignupDetailById(id int) (item *FailSignupListRep, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT * FROM cygx_activity_signup  WHERE id=?`
	err = o.Raw(sql, id).QueryRow(&item)
	return
}

func GetCygxSignupDetailByUid(id int) (item *FailSignupListRep, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT * FROM cygx_activity_signup  WHERE user_id=? LIMIT 1`
	err = o.Raw(sql, id).QueryRow(&item)
	return
}

// 加入报名限制报名
func SalonSignupEdit(newIsAdminAddSignup, doFailType, id int, item *CygxActivitySignup) (err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			fmt.Println(err)
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()

	var count int
	sql := `SELECT COUNT(1) AS count FROM cygx_activity_meeting_reminder  WHERE user_id=?  AND activity_id=?  `
	err = to.Raw(sql, item.UserId, item.ActivityId).QueryRow(&count)
	if err != nil {
		return
	}
	sql = `UPDATE cygx_activity_signup SET is_admin_add_signup=?,do_fail_type=? WHERE id=? `
	_, err = to.Raw(sql, newIsAdminAddSignup, doFailType, id).Exec()
	if doFailType == 0 && count == 0 {
		//加入报名后并添加到我的日程
		itemMy := new(CygxMySchedule)
		itemMy.UserId = item.UserId
		itemMy.ActivityId = item.ActivityId
		itemMy.CreateTime = time.Now()
		itemMy.Mobile = item.Mobile
		itemMy.Email = item.Email
		itemMy.CompanyId = item.CompanyId
		itemMy.CompanyName = item.CompanyName
		_, err = to.Insert(itemMy)
		if err != nil {
			return
		}
	} else {
		//删除我的日程
		if count == 0 {
			sql = `DELETE  FROM cygx_my_schedule   WHERE user_id=?  AND activity_id=? `
			_, err = to.Raw(sql, item.UserId, item.ActivityId).Exec()
			if err != nil {
				return
			}
		}
	}
	return
}

func CallSignupEditByStatus3(doFailType, id int, item *CygxMySchedule) (err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			fmt.Println(err)
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()
	sql := `UPDATE cygx_activity_signup SET is_admin_add_signup=0, do_fail_type = ?  WHERE id=? `
	_, err = to.Raw(sql, id, doFailType).Exec()
	if err != nil {
		return
	}
	sql = `DELETE  FROM cygx_my_schedule   WHERE user_id=?  AND activity_id=? `
	_, err = to.Raw(sql, item.UserId, item.ActivityId).Exec()
	if err != nil {
		return
	}
	return
}

func CallSignupEditByStatus1_2(operationStatus, id int, item *CygxMySchedule) (err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			fmt.Println(err)
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()
	var count int
	sql := `UPDATE cygx_activity_signup SET is_admin_add_signup = 1,do_fail_type=0, signup_type =?  WHERE id=? `
	_, err = to.Raw(sql, operationStatus, id).Exec()
	if err != nil {
		return
	}
	sql = `SELECT COUNT(1) AS count FROM cygx_my_schedule WHERE user_id=? AND activity_id=? `
	err = to.Raw(sql, item.UserId, item.ActivityId).QueryRow(&count)
	if err != nil {
		return
	}
	if count == 0 {
		//添加我的日程
		_, err = to.Insert(item)
	}

	return
}

//报名信息Excel下载

type SignupExportRep struct {
	Mobile         string `description:"手机号"`
	CompanyName    string `description:"公司名称"`
	RealName       string `description:"姓名"`
	CountryCode    string `description:"区号"`
	SellerName     string `description:"销售姓名"`
	OutboundMobile string `description:"外呼手机号"`
}

type CygxActivitySignupList struct {
	Id          int    `orm:"column(id);pk"`
	UserId      int    `description:"用户id"`
	ActivityId  int    `description:"活动ID"`
	CompanyName string `description:"公司名称"`
	RealName    string `description:"姓名"`
	CreateTime  string `description:"创建时间"`
	IsMeeting   int    `description:"是否到会 ,1是, 0否"`
	Operation   bool   `description:"操作按钮,true,到会,false 未到会"`
	Channel     int    `description:"报名渠道,0 空降、 1小程序报名"`
	SigninTime  string `description:"签到时间"`
	SellerName  string `description:"所属销售"`
	Mobile      string `description:"手机号"`
	Email       string `description:"邮箱"`
	CompanyId   int    `description:"公司id"`
	IsAirborne  int    `description:"是否属于空降  1.是 ,0否"`
}
type CygxActivitySignupListRep struct {
	ActivityId int `description:"活动ID"`
	List       []*CygxActivitySignupList
	ListSignin []*CygxActivitySignin
}

// 预约外呼列表
func GetCygxActivitySignup(condition string) (items []*CygxActivitySignupList, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT s.*  FROM cygx_activity_signup  as s 
	  WHERE 1 =1 ` + condition
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// 获取用户报名数量
func GetActivitySignupNomeetingCount(activityId int) (count int, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sqlCount := `SELECT
	COUNT( 1 ) count 
FROM
	cygx_activity_signup AS s
	INNER JOIN cygx_activity AS a ON a.activity_id = s.activity_id 
WHERE
	1 = 1 
	AND a.is_limit_people > 0 
	AND s.is_meeting = 0 
	AND a.is_submit_meeting = 1
	AND a.activity_id = ?`
	err = o.Raw(sqlCount, activityId).QueryRow(&count)
	return
}

// 获取用户报名列表
func GetActivitySignupNomeetingCountList(activityId int) (items []*CygxActivitySignupList, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT
	s.*
FROM
	cygx_activity_signup AS s
	INNER JOIN cygx_activity AS a ON a.activity_id = s.activity_id 
WHERE
	1 = 1 
	AND s.do_fail_type = 0
	AND s.is_meeting = 0
	AND a.activity_id = ?`
	_, err = o.Raw(sql, activityId).QueryRows(&items)
	return
}

// 获取用户爽约次数
func GetActivitySignupNomeetingCountByUid(uid int) (count int, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sqlCount := `SELECT
	COUNT( 1 ) count 
FROM
	cygx_activity_signup AS s
	INNER JOIN cygx_activity AS a ON a.activity_id = s.activity_id 
WHERE
	1 = 1 
	AND a.is_limit_people > 0 
	AND s.is_meeting = 0 
	AND a.is_submit_meeting = 1
	AND s.do_fail_type = 0
	AND s.user_id = ?`
	err = o.Raw(sqlCount, uid).QueryRow(&count)
	return
}

func GetUserMeetingMobile(activityId int) (items []*CygxActivitySignup, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT *
FROM
	cygx_activity_signup AS s 
WHERE
	s.is_meeting = 1 
	AND s.activity_id = ?`
	_, err = o.Raw(sql, activityId).QueryRows(&items)
	return
}

// 修改外呼电话以及区号
type OutboundMobileEditResp struct {
	Id             int    `description:"报名ID"`
	OutboundMobile string `description:"外呼手机号"`
	CountryCode    string `description:"手机国家区号"`
}

func OutboundMobileEdit(id int, outboundMobile, countryCode string) (err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `UPDATE cygx_activity_signup SET outbound_mobile = ?,country_code=?  WHERE id=? `
	_, err = o.Raw(sql, outboundMobile, countryCode, id).Exec()
	return
}

//end

func AddCygxActivitySignupUser(items []*CygxActivitySignup) (err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			fmt.Println(err)
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()
	for _, item := range items {
		var count int
		sql := `SELECT COUNT(1) AS count FROM cygx_my_schedule WHERE user_id=? AND activity_id=? `
		err = to.Raw(sql, item.UserId, item.ActivityId).QueryRow(&count)
		if err != nil {
			return
		}
		if count == 0 {
			itemMy := new(CygxMySchedule)
			itemMy.UserId = item.UserId
			itemMy.ActivityId = item.ActivityId
			itemMy.CreateTime = time.Now()
			itemMy.Mobile = item.Mobile
			itemMy.Email = item.Email
			itemMy.CompanyId = item.CompanyId
			itemMy.CompanyName = item.CompanyName
			_, err = to.Insert(itemMy)
			if err != nil {
				return
			}
		}
		sql = `SELECT COUNT(1) AS count FROM cygx_activity_signup WHERE user_id=? AND activity_id=? `
		err = to.Raw(sql, item.UserId, item.ActivityId).QueryRow(&count)
		if err != nil {
			return
		}
		if count == 0 {
			_, err = to.Insert(item)
		} else {
			sql := `UPDATE cygx_activity_signup SET  is_cancel=0, do_fail_type = 0 ,create_time = NOW()  WHERE user_id=? AND activity_id=? `
			_, err = to.Raw(sql, item.UserId, item.ActivityId).Exec()
		}
	}
	return
}

// 通过ID获取报名详情
func GetActivitySignupInfoById(id int) (item *CygxActivitySignup, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT * FROM cygx_activity_signup  WHERE id=?`
	err = o.Raw(sql, id).QueryRow(&item)
	return
}

type RequestCommonPolicyConfigrep struct {
	Type string `description:"报名方式 ,1 预约外呼 ,2 自主拨入"`
	Uid  int    `description:"用户ID"`
}

type RequestCommonPolicyConfig struct {
	CommonPolicyconfig  []interface{}                  `json:"common_policy_config"`
	CommonPolicyconfigs []RequestCommonPolicyConfigrep `json:"common_policy_configs"`
}

// 取消报名
func CancelActivitySignup(item *CygxActivitySignup) (lastId int64, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			fmt.Println(err)
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()
	//判断是否删除我的日程
	var count int
	sql := `SELECT COUNT(1) AS count FROM cygx_activity_meeting_reminder WHERE is_cancel = 0  AND  user_id=? AND activity_id=? `
	err = to.Raw(sql, item.UserId, item.ActivityId).QueryRow(&count)
	if err != nil {
		return
	}
	if count == 0 {
		sql = `DELETE  FROM cygx_my_schedule   WHERE user_id=?  AND activity_id=? `
		_, err = to.Raw(sql, item.UserId, item.ActivityId).Exec()
		if err != nil {
			return
		}
	}
	sql = `DELETE  FROM cygx_activity_signup   WHERE user_id=?  AND activity_id=? `
	_, err = to.Raw(sql, item.UserId, item.ActivityId).Exec()
	if err != nil {
		return
	}
	return
}

func GetCompanyPermission(companyId int) (permission string, err error) {
	sql := ` SELECT GROUP_CONCAT(DISTINCT b.remark  ORDER BY b.sort ASC SEPARATOR ',') AS permission
			FROM company_report_permission AS a
			INNER JOIN chart_permission AS b ON a.chart_permission_id=b.chart_permission_id
			INNER JOIN company_product AS c ON a.company_id=c.company_id AND a.product_id=c.product_id
			WHERE  a.company_id=?
			AND c.is_suspend=0
            AND b.cygx_auth=1 
			AND c.status IN('正式','试用','永续')
			AND a.status IN('正式','试用','永续') `
	o := orm.NewOrm()
	err = o.Raw(sql, companyId).QueryRow(&permission)
	return
}

// 获取可查看升级权限的正式权限
func GetCompanyPermissionByUserZhengShiTrip(companyId int) (permission string, err error) {
	sql := ` SELECT GROUP_CONCAT(DISTINCT b.chart_permission_name  ORDER BY b.sort ASC  SEPARATOR ',') AS permission
			FROM company_report_permission AS a
			INNER JOIN chart_permission AS b ON a.chart_permission_id=b.chart_permission_id
			INNER JOIN company_product AS c ON a.company_id=c.company_id AND a.product_id=c.product_id
			WHERE  a.company_id=?
			AND c.is_suspend=0
            AND b.cygx_auth=1
			AND ( a.is_upgrade = 1 AND c.STATUS = '正式' OR c.STATUS = '永续' ) `
	o := orm.NewOrm()
	err = o.Raw(sql, companyId).QueryRow(&permission)
	return
}

func GetCountCompanyDetailByIdGroup(companyId int) (count int, err error) {
	sql := ` SELECT COUNT(1) AS count
            FROM company AS a
			INNER JOIN company_product AS b ON a.company_id=b.company_id
			INNER JOIN company_report_permission AS p ON p.company_id = a.company_id
			INNER JOIN chart_permission AS cp ON cp.chart_permission_id = p.chart_permission_id
			LEFT JOIN admin AS c ON b.seller_id=c.admin_id
			WHERE a.company_id=? AND b.product_id = 2    OR (a.company_id = ? AND  cp.permission_name = '策略' )   `
	o := orm.NewOrm()
	err = o.Raw(sql, companyId, companyId).QueryRow(&count)
	return
}

type CompanyDetail struct {
	CompanyId   int    `orm:"column(company_id);pk"`
	CompanyName string `description:"客户名称"`
	Status      string `description:"客户状态"`
	SellerId    int    `description:"销售id"`
	SellerName  string `description:"销售名称"`
	Mobile      string `description:"销售手机号"`
	ProductId   int    `description:"1,FICC,2权益"`
}

func GetCompanyDetailByIdGroup(companyId int) (item *CompanyDetail, err error) {
	sql := ` SELECT a.company_id,a.company_name,b.status,b.seller_id,b.seller_name,c.mobile
            FROM company AS a
			INNER JOIN company_product AS b ON a.company_id=b.company_id
			INNER JOIN company_report_permission AS p ON p.company_id = a.company_id
			INNER JOIN chart_permission AS cp ON cp.chart_permission_id = p.chart_permission_id
			LEFT JOIN admin AS c ON b.seller_id=c.admin_id
			WHERE a.company_id=? AND b.product_id = 2
			OR (a.company_id = ? AND  cp.permission_name = '策略' )
			ORDER BY b.product_id DESC  LIMIT 0,1 `
	o := orm.NewOrm()
	err = o.Raw(sql, companyId, companyId).QueryRow(&item)
	return
}

func GetCompanyPermissionByUser(companyId int) (permission string, err error) {
	sql := ` SELECT GROUP_CONCAT(DISTINCT b.remark  ORDER BY b.sort ASC  SEPARATOR ',') AS permission
			FROM company_report_permission AS a
			INNER JOIN chart_permission AS b ON a.chart_permission_id=b.chart_permission_id
			INNER JOIN company_product AS c ON a.company_id=c.company_id AND a.product_id=c.product_id
			WHERE  a.company_id=?
			AND c.is_suspend=0
            AND b.cygx_auth=1`
	o := orm.NewOrm()
	err = o.Raw(sql, companyId).QueryRow(&permission)
	return
}

// 获取正式权限
func GetCompanyPermissionByUserZhengShi(companyId int) (permission string, err error) {
	sql := ` SELECT GROUP_CONCAT(DISTINCT b.remark  ORDER BY b.sort ASC  SEPARATOR ',') AS permission
			FROM company_report_permission AS a
			INNER JOIN chart_permission AS b ON a.chart_permission_id=b.chart_permission_id
			INNER JOIN company_product AS c ON a.company_id=c.company_id AND a.product_id=c.product_id
			WHERE  a.company_id=?
			AND c.is_suspend=0
            AND b.cygx_auth=1
			AND c.status IN('正式')
			AND a.status IN('正式') `
	o := orm.NewOrm()
	err = o.Raw(sql, companyId).QueryRow(&permission)
	return
}

// 活动模板消息推送,权限处理start
// GetCompanyDetailByIdGroupList 根据公司ID获取公司对应状态
func GetCompanyDetailByIdGroupList(companyIds []int) (items []*CompanyDetail, err error) {
	lenCompanyId := len(companyIds)
	if lenCompanyId == 0 {
		return
	}
	sql := ` SELECT a.company_id,a.company_name,b.status
            FROM company AS a
			INNER JOIN company_product AS b ON a.company_id=b.company_id
			WHERE a.company_id IN (` + utils.GetOrmInReplace(lenCompanyId) + `)  AND b.product_id = 2
			GROUP BY a.company_id  `
	o := orm.NewOrm()
	_, err = o.Raw(sql, companyIds).QueryRows(&items)
	return
}

type CompanyPermission struct {
	CompanyId      int    `description:"公司ID"`
	PermissionName string `description:"权限名称"`
}

// 公司权限结构体
type CompanyPermissionPower struct {
	CompanyId              int    `description:"公司ID"`
	UserType               int    `description:"用户类型   //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户"`
	Status                 string `description:"客户状态"`
	PermissionName         string `description:"权限名称"`
	PermissionNameZhengShi string `description:"权限名称(正式)"`
	HavePower              bool   `description:"是否有权限"`
}

// GetCompanyPermissionByCompanyIds 根据公司ID获取公司对应的权限
func GetCompanyPermissionByCompanyIds(companyIds []int) (items []*CompanyPermission, err error) {
	lenCompanyId := len(companyIds)
	if lenCompanyId == 0 {
		return
	}
	sql := ` SELECT
			GROUP_CONCAT( DISTINCT b.remark ORDER BY b.sort ASC SEPARATOR ',' ) AS permission_name,
			a.company_id 
		FROM
			company_report_permission AS a
			INNER JOIN chart_permission AS b ON a.chart_permission_id = b.chart_permission_id
			INNER JOIN company_product AS c ON a.company_id = c.company_id 
			AND a.product_id = c.product_id 
		WHERE
			a.company_id IN  (` + utils.GetOrmInReplace(lenCompanyId) + `)
			AND c.is_suspend = 0 
			AND b.cygx_auth = 1
		GROUP BY
			a.company_id `
	o := orm.NewOrm()
	_, err = o.Raw(sql, companyIds).QueryRows(&items)
	return
}

// GetCompanyPermissionZhenShiByCompanyIds 根据公司ID获取正式公司对应的权限
func GetCompanyPermissionZhenShiByCompanyIds(companyIds []int) (items []*CompanyPermission, err error) {
	lenCompanyId := len(companyIds)
	if lenCompanyId == 0 {
		return
	}
	sql := ` SELECT
			GROUP_CONCAT( DISTINCT b.remark ORDER BY b.sort ASC SEPARATOR ',' ) AS permission_name,
			a.company_id 
		FROM
			company_report_permission AS a
			INNER JOIN chart_permission AS b ON a.chart_permission_id = b.chart_permission_id
			INNER JOIN company_product AS c ON a.company_id = c.company_id 
			AND a.product_id = c.product_id 
		WHERE
			a.company_id IN  (` + utils.GetOrmInReplace(lenCompanyId) + `)
			AND c.is_suspend = 0 
			AND b.cygx_auth = 1 
			AND c.STATUS IN ( '正式' ) 
			AND a.STATUS IN ( '正式' ) 
		GROUP BY
			a.company_id `
	o := orm.NewOrm()
	_, err = o.Raw(sql, companyIds).QueryRows(&items)
	return
}

type YidongActivitySignup struct {
	YidongActivityId string `description:"易董的活动ID"`
	Mobile           string `description:"手机号"`
	RealName         string `description:"用户实际名称"`
	CompanyName      string `description:"公司名称"`
	CountryCode      string `description:"手机国家区号"`
	ActivityJoinType string `description:"活动入会类型01报名审核后可入会 02预约即可入会 03仅定向邀请人员可入会"`
}

// GetCompanyByUserSignUp 获取客户ID列表
func GetCompanyByUserSignUp(condition string, pars []interface{}) (items []*company.CompanyNameAndId, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT
	s.company_id
FROM
	cygx_activity_signup AS s
	INNER JOIN cygx_activity AS a ON a.activity_id = s.activity_id
	INNER JOIN cygx_activity_type AS t ON t.activity_type_id = a.activity_type_id 
WHERE
	1 = 1 
	AND s.is_meeting = 1 
	AND t.activity_type = 1 `
	if condition != `` {
		sql += condition
	}
	sql += ` GROUP BY s.company_id `
	_, err = o.Raw(sql, pars).QueryRows(&items)
	return
}

type UserSignUpLossResp struct {
	Mobile       string `description:"手机号"`
	RealName     string `description:"姓名"`
	TotalMeeting int    `description:"参会次数"`
}

type UserSignUpLossListResp struct {
	CompanyId   int    `description:"公司Id"`
	CompanyName string `description:"公司名称"`
	SellerName  string `description:"销售名称"`
	List        []*UserSignUpLossResp
}

// GetUserSignUpList 获取用户报名列表
func GetUserSignUpList(condition string, pars []interface{}) (items []*UserSignUpLossResp, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT
	s.real_name,
	s.mobile 
FROM
	cygx_activity_signup_detail AS s
	INNER JOIN cygx_activity AS a ON a.activity_id = s.activity_id
	INNER JOIN cygx_activity_type AS t ON t.activity_type_id = a.activity_type_id
WHERE
	1 = 1 
	AND s.is_meeting = 1 
	AND t.activity_type = 1  `
	if condition != `` {
		sql += condition
	}
	_, err = o.Raw(sql, pars).QueryRows(&items)
	return
}

type UserSignUpMeetLossListResp struct {
	Mobile   string              `description:"手机号"`
	RealName string              `description:"姓名"`
	List     []*AttendanceDetail `description:"预约客户"`
}

type ActivitySignupTempMsgReq struct {
	ActivityIds  string `description:"活动id,用,隔开"`
	SendGroup    string `description:"发送对象,1全部 2永续 3大套餐 4行业套餐 5其他行业正式 6试用 7已参与互动 用,隔开"`
	FirstText    string `description:"首段提示文字"`
	ActivityName string `description:"活动名称"`
	Content      string `description:"变更内容"`
}

type SendGroup struct {
	Id   int
	Name string
}

type SendGroupStr struct {
	Id   string
	Name string
}

type PermissionList struct {
	CompanyId  int
	Permission string
}

// 获取正式权限
func GetCompanyPermissionByUsersZhengShi(companyIds string) (items []*PermissionList, err error) {
	sql := ` SELECT a.company_id, b.remark  AS permission
			FROM company_report_permission AS a
			INNER JOIN chart_permission AS b ON a.chart_permission_id=b.chart_permission_id
			INNER JOIN company_product AS c ON a.company_id=c.company_id AND a.product_id=c.product_id
			WHERE  a.company_id IN (` + companyIds + `)
			AND c.is_suspend=0
            AND b.cygx_auth=1
			AND c.status IN('正式')
			AND a.status IN('正式') `
	o := orm.NewOrm()
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// 获取某一活动某个机构已经报名的数量
func GetActivitySignupCompanyCount(activityId, companyId int) (count int, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sqlCount := `SELECT COUNT(1) AS count FROM cygx_activity_signup WHERE is_cancel=0 AND do_fail_type = 0 AND activity_id=? AND company_id=? `
	err = o.Raw(sqlCount, activityId, companyId).QueryRow(&count)
	return
}

func GetCompanyPermissionByUserTrip(companyId int) (permission string, err error) {
	o := orm.NewOrm()
	sql := ` SELECT
			GROUP_CONCAT( DISTINCT b.remark ORDER BY b.sort ASC SEPARATOR ',' ) AS permission 
		FROM
			company_report_permission AS a
			INNER JOIN chart_permission AS b ON a.chart_permission_id = b.chart_permission_id
			INNER JOIN company_product AS c ON a.company_id = c.company_id 
			AND a.product_id = c.product_id 
		WHERE
			a.company_id = ? 
			AND c.is_suspend = 0 
			AND b.cygx_auth = 1 
			AND a.is_upgrade = 1 
			AND c.STATUS IN ( '正式' ) 
			OR ( a.company_id = ? AND c.is_suspend = 0 AND b.cygx_auth = 1 AND c.STATUS IN ( '永续' ) ) 
			OR ( a.company_id = ? AND c.is_suspend = 0 AND b.cygx_auth = 1 AND b.chart_permission_name = '策略' AND c.STATUS IN ( '正式' ) )`
	err = o.Raw(sql, companyId, companyId, companyId).QueryRow(&permission)
	return
}

// GetCygxCygxActivitySignupList 获取报名列表信息
func GetActivitySignupList(condition string, pars []interface{}) (items []*CygxActivitySignup, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT
			*
		FROM
			cygx_activity_signup AS v
		WHERE
			1 = 1 	` + condition
	_, err = o.Raw(sql, pars).QueryRows(&items)
	return
}

// GetCygxCygxActivitySignupList 获取报名列表信息
func GetActivitySignupInnerActivityList(condition string, pars []interface{}) (items []*CygxActivitySignup, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT
			*
		FROM
			cygx_activity_signup AS v 
			INNER JOIN cygx_activity as a ON v.activity_id = a.activity_id
		WHERE
			1 = 1 	` + condition
	_, err = o.Raw(sql, pars).QueryRows(&items)
	return
}