package services

import (
	"context"
	"errors"
	"fmt"
	"github.com/tealeg/xlsx"
	"hongze/hongze_cygx/models"
	"hongze/hongze_cygx/utils"
	"os"
	"path/filepath"
	"strconv"
	"strings"
	"time"
)

var ERR_NO_USER_RECORD = errors.New("用户关系没有入库")
var ERR_USER_NOT_BIND = errors.New("用户没有绑定")

// 通过openid获取用户信息
func GetWxUserItemByOpenId(openid string) (item *models.WxUserItem, err error) {
	//通过openid获取用户关联信息
	userRecord, userRecordErr := models.GetUserRecordByOpenId(openid)
	//fmt.Println("userRecordErr", userRecordErr)
	if userRecordErr != nil {
		if userRecordErr.Error() == utils.ErrNoRow() {
			err = ERR_NO_USER_RECORD
			return
		} else {
			err = userRecordErr
			return
		}
	}

	//该openid在系统中没有关联关系
	if userRecord == nil {
		err = ERR_NO_USER_RECORD
		return
	}

	//该openid没有绑定用户
	if userRecord.UserId <= 0 {
		err = ERR_USER_NOT_BIND
		item = new(models.WxUserItem)
		//格式化返回用户数据
		formatWxUserAndUserRecord(item, userRecord)
		return
	}

	//获取用户信息
	item, wxUserErr := models.GetWxUserItemByUserId(userRecord.UserId)
	//fmt.Println("wxUserErr", wxUserErr)
	if wxUserErr != nil {
		err = wxUserErr
		//如果是找不到数据，那么可能是该用户被删除了，但是user_record没有删除对应的关系
		if wxUserErr.Error() == utils.ErrNoRow() {
			//用户被删除了，但是user_record没有删除对应的关系，那么去解除绑定
			userUnbindErr := models.UnBindUserRecordByOpenid(openid)
			if userUnbindErr != nil {
				err = userUnbindErr
				return
			}
			//返回状态为 用户未绑定 逻辑代码
			err = ERR_USER_NOT_BIND
			item = new(models.WxUserItem)
			//格式化返回用户数据
			formatWxUserAndUserRecord(item, userRecord)
			return
		}
		return
	}
	if item.RealName == "" {
		item.RealName = userRecord.RealName
	}
	//格式化返回用户数据
	formatWxUserAndUserRecord(item, userRecord)
	return
}

// 根据用户id和平台id获取用户信息
func GetWxUserItemByUserId(userId, platform int) (wxUserItem *models.WxUserItem, err error) {
	//获取用户信息
	wxUserItem, wxUserErr := models.GetWxUserItemByUserId(userId)
	if wxUserErr != nil {
		err = wxUserErr
		return
	}
	//格式化返回用户数据
	formatWxUser(wxUserItem, platform)
	return
}

// 根据用户邮箱和平台id获取用户信息
func GetWxUserItemByEmail(email string, platform int) (wxUserItem *models.WxUserItem, err error) {
	//获取用户信息
	wxUserItem, wxUserErr := models.GetWxUserItemByEmail(email)
	if wxUserErr != nil {
		err = wxUserErr
		return
	}

	//格式化返回用户数据
	formatWxUser(wxUserItem, platform)
	return
}

// 根据用户手机号和平台id获取用户信息
func GetWxUserItemByMobile(mobile string, platform int) (wxUserItem *models.WxUserItem, err error) {
	//获取用户信息
	wxUserItem, wxUserErr := models.GetWxUserItemByMobile(mobile)
	if wxUserErr != nil {
		err = wxUserErr
		return
	}
	//格式化返回用户数据
	formatWxUser(wxUserItem, platform)
	return
}

// 根据用户unionid和平台id获取用户信息
func GetWxUserItemByUnionId(unionId string, platform int) (wxUserItem *models.WxUserItem, err error) {
	//获取用户信息
	wxUserItem, wxUserErr := models.GetWxUserItemByUnionid(unionId)
	if wxUserErr != nil {
		err = wxUserErr
		return
	}
	//格式化返回用户数据
	formatWxUser(wxUserItem, platform)
	return
}

// 通过用户 关系表记录  和  用户记录  格式化返回 用户数据
func formatWxUserAndUserRecord(wxUser *models.WxUserItem, userRecord *models.UserRecord) {
	wxUser.OpenId = userRecord.OpenId
	wxUser.UnionId = userRecord.UnionId
	wxUser.NickName = userRecord.NickName
	//wxUser.RealName = userRecord.RealName
	//wxUser.BindAccount = userRecord.BindAccount
	wxUser.Headimgurl = userRecord.Headimgurl
	wxUser.SessionKey = userRecord.SessionKey
}

// 通过用户 用户记录  和  来源平台  格式化返回 用户数据
func formatWxUser(wxUser *models.WxUserItem, platform int) {
	//根据用户id和平台id获取用户关系
	userRecord, userRecordErr := models.GetUserRecordByUserId(wxUser.UserId, platform)
	if userRecordErr != nil {
		if userRecordErr.Error() != utils.ErrNoRow() {
			return
		}
		if userRecordErr.Error() == utils.ErrNoRow() {
			return
		}
	}

	//该openid在系统中没有关联关系
	if userRecord == nil {
		return
	}

	wxUser.OpenId = userRecord.OpenId
	wxUser.UnionId = userRecord.UnionId
	wxUser.NickName = userRecord.NickName
	//wxUser.RealName = userRecord.RealName
	//wxUser.BindAccount = userRecord.BindAccount
	wxUser.Headimgurl = userRecord.Headimgurl
	wxUser.SessionKey = userRecord.SessionKey
	return
}

// 用户绑定
func BindWxUser(openid, mobile, email, countryCode string) (wxUser *models.WxUserItem, err error) {
	if mobile == "" && email == "" {
		err = errors.New("手机号或邮箱必填一个")
		return
	}
	var bindAccount string
	//根据手机号获取用户信息
	if mobile != "" {
		tmpWxUser, wxUserErr := models.GetWxUserItemByMobile(mobile)
		if wxUserErr != nil && wxUserErr.Error() != utils.ErrNoRow() {
			err = wxUserErr
			return
		}
		wxUser = tmpWxUser
		bindAccount = mobile
	}
	//根据邮箱获取用户信息
	if wxUser == nil && email != "" {
		tmpWxUser, wxUserErr := models.GetWxUserItemByEmail(email)
		if wxUserErr != nil && wxUserErr.Error() != utils.ErrNoRow() {
			err = wxUserErr
			return
		}
		wxUser = tmpWxUser
		bindAccount = email
	}

	//查询openid的第三方（微信）信息
	userRecord, err := models.GetUserRecordByOpenId(openid)
	if err != nil {
		return
	}

	var userId int
	//如果查询出来的用户是nil，那么需要新增用户
	if wxUser == nil {
		user := &models.WxUser{
			CompanyId:           1,
			CreatedTime:         time.Now(),
			FirstLogin:          1,
			Enabled:             1,
			RegisterPlatform:    4,
			RegisterTime:        time.Now(),
			Mobile:              mobile,
			Email:               email,
			IsRegister:          1,
			Source:              3,
			CountryCode:         countryCode,
			OutboundMobile:      mobile,
			OutboundCountryCode: countryCode,
		}
		tmpUserId, addUserErr := models.AddWxUser(user)
		if addUserErr != nil {
			err = addUserErr
			return
		}
		user.UserId = int(tmpUserId)
		userId = int(tmpUserId)
		wxUser, err = models.GetWxUserItemByUserId(userId)
	} else {
		userId = wxUser.UserId
		err = models.BindUserOutboundMobile(mobile, countryCode, userId)
		if err != nil {
			return
		}
		if wxUser.IsRegister == 0 {
			models.ModifyWxUserRegisterStatus(userId)
		}
	}

	//如果存在该手机号/邮箱，那么需要校验
	if userRecord.UserId > 0 && userRecord.UserId != userId {
		err = errors.New("用户已绑定，不允许重复绑定")
		return
	}

	err = models.BindUserRecordByOpenid(userId, openid, bindAccount)
	if err != nil {
		return
	}
	userRecord.UserId = userId

	//如果当前该第三方用户信息的昵称为空串的话，那么需要去查询该用户的第一个绑定信息的数据作为来源做数据修复
	if userRecord.NickName == "" {
		oldUserRecord, err := models.GetUserThirdRecordByUserId(userId)
		if err == nil && oldUserRecord != nil {
			//如果该用户绑定的第一条数据的头像信息不为空串，那么就去做新数据的修复
			if oldUserRecord.NickName != "" {
				_ = models.ModifyUserRecordByDetail(userRecord.OpenId, userRecord.UnionId, oldUserRecord.NickName, oldUserRecord.Headimgurl, oldUserRecord.City, oldUserRecord.Province, oldUserRecord.Country, oldUserRecord.Sex, userId)
			}
		}
	}

	//格式化用户数据
	formatWxUserAndUserRecord(wxUser, userRecord)
	return
}

// 微信登录
func WxLogin(code, openId, unionId string, wxUserInfo *WxUserInfo) (token string, userId, firstLogin, permission int, err error) {
	if unionId == "" {
		unionId = wxUserInfo.Unionid
	}
	//firstLogin==1，强制绑定手机号或者邮箱
	firstLogin = 1
	fmt.Println("GetWxUserItemByOpenId ", openId)

QUERY_WX_USER:
	wxUser, wxUserErr := GetWxUserItemByOpenId(openId)
	fmt.Println("wxUserErr", wxUserErr)
	if wxUserErr == ERR_NO_USER_RECORD { //没有用户openid记录
		//先添加第三方信息（openid等信息）
		_, recordErr := AddUserRecord(openId, unionId, wxUserInfo.Nickname, "", wxUserInfo.Province, wxUserInfo.City, wxUserInfo.Country, wxUserInfo.Headimgurl, wxUserInfo.SessionKey, utils.WxPlatform, wxUserInfo.Sex, 0)
		//如果插入失败，那么直接将错误信息返回
		if recordErr != nil {
			err = recordErr
			return
		}
		//插入成功后，需要重新查询该用户，并进入下面的逻辑
		goto QUERY_WX_USER
	} else if wxUserErr == ERR_USER_NOT_BIND {
		//没有用户信息
		//wxUser.FirstLogin = 1
	} else if wxUserErr != nil {
		err = wxUserErr
		return
	}
	fmt.Println("wxUserInfo", wxUserInfo)
	fmt.Println("wxUserInfo.Nickname", wxUserInfo.Nickname)
	fmt.Println("SessionKey", wxUserInfo.SessionKey)
	if wxUserInfo != nil {
		fmt.Println("ModifyUserRecordSessionKey")
		err = models.ModifyUserRecordSessionKey(openId, wxUserInfo.SessionKey)
		fmt.Println("ModifyUserRecordSessionKey Err", err)
	}
	//如果已经登录注册绑定的情况下
	if wxUser != nil && wxUserErr == nil {
		//获取用户权限
		firstLogin = wxUser.FirstLogin
		userId = wxUser.UserId
		{
			codeLog := new(models.WxUserCode)
			codeLog.WxCode = code
			codeLog.UserId = userId
			codeLog.Code = 0
			codeLog.FirstLogin = firstLogin
			codeLog.Authorization = token
			codeLog.UserPermission = permission
			codeLog.CreateTime = time.Now()
			go models.AddWxUserCode(codeLog)
		}
		if wxUser.Mobile == "" && wxUser.Email == "" {
			firstLogin = 1
		}
	}

	//获取登录token
	tokenItem, tokenErr := models.GetTokenByOpenId(openId)
	if tokenErr != nil && tokenErr.Error() != utils.ErrNoRow() {
		err = errors.New("登录失败，获取token失败:" + tokenErr.Error())
		return
	}
	fmt.Println("line 271 ", openId)
	if tokenItem == nil || (tokenErr != nil && tokenErr.Error() == utils.ErrNoRow()) {
		timeUnix := time.Now().Unix()
		timeUnixStr := strconv.FormatInt(timeUnix, 10)
		token = utils.MD5(openId) + utils.MD5(timeUnixStr)
		//新增session
		{
			session := new(models.CygxSession)
			session.OpenId = openId
			session.UserId = userId
			session.CreatedTime = time.Now()
			session.LastUpdatedTime = time.Now()
			session.ExpireTime = time.Now().AddDate(0, 3, 0)
			session.AccessToken = token
			sessionErr := models.AddSession(session)
			if err != nil {
				err = errors.New("登录失败，新增用户session信息失败:" + sessionErr.Error())
				return
			}
		}
	} else {
		token = tokenItem.AccessToken
	}
	fmt.Println("line 294 ", token)
	//新增登录日志
	{
		loginLog := new(models.WxUserLog)
		loginLog.UserId = userId
		loginLog.OpenId = openId
		loginLog.UnionId = unionId
		loginLog.CreateTime = time.Now()
		loginLog.Handle = "wechat_login_cygx"
		loginLog.Remark = token
		go models.AddWxUserLog(loginLog)
	}
	return
}

func UserLogin() {

}

// 添加第三方用户（微信）记录
func AddUserRecord(openId, unionId, nickName, realName, province, city, country, headimgurl, sessionKey string, platform, sex, subscribe int) (userRecord *models.UserRecord, err error) {
	find, err := models.GetUserRecordByOpenId(openId)
	if err != nil && err.Error() != utils.ErrNoRow() {
		return
	}
	if find != nil {
		userRecord = find
		return
	}
	userRecord = &models.UserRecord{
		OpenId:         openId,  //用户open_id
		UnionId:        unionId, //用户union_id
		Subscribe:      subscribe,
		NickName:       nickName,   //用户昵称，最大长度：32
		RealName:       realName,   //用户实际名称，最大长度：32
		Sex:            sex,        //普通用户性别，1为男性，2为女性
		Province:       province,   //普通用户个人资料填写的省份,最大长度：30
		City:           city,       //普通用户个人资料填写的城市,最大长度：30
		Country:        country,    //国家，如中国为CN,最大长度：30
		Headimgurl:     headimgurl, //用户第三方（微信）头像,最大长度：512
		CreateTime:     time.Now(), //创建时间，关系添加时间、用户授权时间
		CreatePlatform: platform,   //注册平台,1:日度点评公众号,2:管理后台，3：pc端网站,4:查研观向小程序；默认：1
		SessionKey:     sessionKey, //微信小程序会话密钥，最大长度：255
	}
	recordId, err := models.AddUserRecord(userRecord)
	if err != nil {
		return
	}
	userRecord.UserRecordId = int(recordId)
	return
}

// 每天新增，删除的白名单
func SendEmailUserWhiteListChange(cont context.Context) (err error) {
	var msg string
	var fieldStr string
	var condition string
	defer func() {
		if err != nil {
			go utils.SendAlarmMsg("发送附件模版消息失败", 2)
			fmt.Println("err：", err, time.Now())
			go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
			utils.FileLog.Info("发送附件模版消息失败,Err:%s", err.Error())
		}
		if msg != "" {
			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
		}
	}()
	mobileStr, err := models.GetWxUserWhiteMobile()
	if err != nil {
		msg = "获取失败，Err:" + err.Error()
		return
	}
	if mobileStr == "" {
		mobileStr = "1"
	}
	mobileStr = strings.Replace(mobileStr, " ", "", -1)
	mobileStr = strings.Replace(mobileStr, ",", "','", -1)
	mobileStr = "'" + mobileStr + "'"
	//手机号新增
	fieldStr = ` u.mobile,u.country_code,u.real_name,c.company_name,u.company_id,cp.seller_name,cp.status,`
	condition = `  AND cp.status IN ( '正式', '试用' ) AND u.mobile IN (` + mobileStr + `) `
	condition += ` AND  u.mobile !=''  AND DATE_SUB(CURDATE(), INTERVAL 2 DAY) <= DATE(u.created_time )`
	listMobile, err := models.GetFormalUserWhiteList(fieldStr, condition)
	if err != nil {
		msg = "获取失败，Err:" + err.Error()
		return
	}
	//外呼手机号新增
	outboundMobileStr, err := models.GetWxUserWhiteOutboundMobile()
	if outboundMobileStr == "" {
		outboundMobileStr = "1"
	}
	outboundMobileStr = strings.Replace(outboundMobileStr, " ", "", -1)
	fieldStr = ` u.outbound_mobile as mobile,u.outbound_country_code as country_code,u.real_name,c.company_name,u.company_id,cp.status,`
	condition = `  AND cp.status IN ( '正式', '试用' ) AND u.outbound_mobile IN (` + outboundMobileStr + `) `
	condition += `  AND DATE_SUB(CURDATE(), INTERVAL 2 DAY) <= DATE(u.created_time )`
	listOutboundMobile, err := models.GetFormalUserWhiteList(fieldStr, condition)
	if err != nil {
		msg = "获取失败，Err:" + err.Error()
		return
	}

	var rep models.UserWhiteListRep
	var repList []*models.UserWhiteList
	repList = listMobile
	if len(listOutboundMobile) > 0 {
		for _, v := range listOutboundMobile {
			repList = append(listMobile, v)
		}
	}

	//新增用户，过滤手机号为空的
	for _, v := range repList {
		if v.Mobile == "" {
			continue
		}
		rep.List = append(rep.List, v)
	}

	//rep.List = repList
	//创建excel
	dir, errFile := os.Executable()
	exPath := filepath.Dir(dir)
	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandDigit(5) + ".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, err := xlsxFile.AddSheet("白名单")
	if err != nil {
		msg = "新增Sheet失败,Err:" + err.Error()
		return
	}
	//设置宽度
	_ = sheet.SetColWidth(2, 2, 15)
	_ = sheet.SetColWidth(6, 6, 30)
	_ = sheet.SetColWidth(13, 13, 35)
	//标头
	rowTitle := sheet.AddRow()
	cellA := rowTitle.AddCell()
	cellA.Value = "姓名"
	cellB := rowTitle.AddCell()
	cellB.Value = "国际代码1"
	cellC := rowTitle.AddCell()
	cellC.Value = "手机号"
	cellD := rowTitle.AddCell()
	cellD.Value = "国际代码2"
	cellE := rowTitle.AddCell()
	cellE.Value = "备用号"
	cellF := rowTitle.AddCell()
	cellF.Value = "电子邮箱"
	cellG := rowTitle.AddCell()
	cellG.Value = "公司名称"
	cellH := rowTitle.AddCell()
	cellH.Value = "职位名称"
	cellI := rowTitle.AddCell()
	cellI.Value = "客户类型"
	cellJ := rowTitle.AddCell()
	cellJ.Value = "对口销售"
	cellK := rowTitle.AddCell()
	cellK.Value = "归属部门"
	cellL := rowTitle.AddCell()
	cellL.Value = "有效开始时间"
	cellM := rowTitle.AddCell()
	cellM.Value = "有效结束时间"
	cellN := rowTitle.AddCell()
	cellN.Value = "备注"
	cellO := rowTitle.AddCell()
	cellO.Value = "权限（消费，医药，智造，科技，策略）"

	if len(rep.List) > 0 {
		for _, item := range rep.List {
			row := sheet.AddRow()
			cellA := row.AddCell()
			cellA.Value = item.RealName
			cellB := row.AddCell()
			cellB.Value = item.CountryCode
			if len(item.Mobile) >= 11 && item.CountryCode == "" {
				cellB.Value = "86"
			}
			cellC := row.AddCell()
			cellC.Value = item.Mobile
			cellD := row.AddCell()
			cellD.Value = ""
			cellE := row.AddCell()
			cellE.Value = ""
			cellF := row.AddCell()
			cellF.Value = ""
			cellG := row.AddCell()
			cellG.Value = item.CompanyName
			cellH := row.AddCell()
			cellH.Value = ""
			cellI := row.AddCell()
			cellI.Value = ""
			cellJ := row.AddCell()
			cellJ.Value = item.SellerName
			cellK := row.AddCell()
			cellK.Value = ""
			cellL := row.AddCell()
			cellL.Value = ""
			cellM := row.AddCell()
			cellM.Value = ""
			cellN := row.AddCell()
			cellN.Value = ""
			cellO := row.AddCell()
			if item.Permission == "" {
				item.Permission = "专家/医药/智造/消费/研选/科技/策略/路演服务"
			}
			cellO.Value = item.Permission
		}
	}
	errFile = xlsxFile.Save(downLoadnFilePath)
	if errFile != nil {
		msg = "保存文件失败Err:" + errFile.Error()
		return
	}
	title := time.Now().Format("2006-01-02") + "新增白名单用户"
	content := time.Now().Format("2006-01-02") + "新增白名单用户"
	fileName := downLoadnFilePath
	var sendResult bool
	if len(rep.List) > 0 {
		sendResult = utils.SendEmailByHongze(title, content, utils.EmaiWhiteUserList, fileName, title+".xlsx")

	}

	os.Remove(downLoadnFilePath)
	//创建冻结excel
	dir, errFile = os.Executable()
	exPath = filepath.Dir(dir)
	downLoadnFilePaths := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandDigit(5) + ".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, err = xlsxFile.AddSheet("白名单")
	if err != nil {
		msg = "新增Sheet失败,Err:" + err.Error()
		return
	}
	//设置宽度
	_ = sheet.SetColWidth(2, 2, 15)
	_ = sheet.SetColWidth(6, 6, 30)
	_ = sheet.SetColWidth(13, 13, 35)
	//标头
	rowTitle = sheet.AddRow()
	cellA = rowTitle.AddCell()
	cellA.Value = "姓名"
	cellB = rowTitle.AddCell()
	cellB.Value = "国际代码1"
	cellC = rowTitle.AddCell()
	cellC.Value = "手机号"
	cellD = rowTitle.AddCell()
	cellD.Value = "国际代码2"
	cellE = rowTitle.AddCell()
	cellE.Value = "备用号"
	cellF = rowTitle.AddCell()
	cellF.Value = "电子邮箱"
	cellG = rowTitle.AddCell()
	cellG.Value = "公司名称"
	cellH = rowTitle.AddCell()
	cellH.Value = "职位名称"
	cellI = rowTitle.AddCell()
	cellI.Value = "客户类型"
	cellJ = rowTitle.AddCell()
	cellJ.Value = "对口销售"
	cellK = rowTitle.AddCell()
	cellK.Value = "归属部门"
	cellL = rowTitle.AddCell()
	cellL.Value = "有效开始时间"
	cellM = rowTitle.AddCell()
	cellM.Value = "有效结束时间"
	cellN = rowTitle.AddCell()
	cellN.Value = "备注"
	cellO = rowTitle.AddCell()
	cellO.Value = "权限（消费，医药，智造，科技，策略）"
	//手机号冻结
	listFrozen, err := models.GetFrozenUserWhiteList()                 //手机号用户修改
	listFrozenOutbound, err := models.GetFrozenUserWhiteListOutbound() //外呼手机号用户修改
	if err != nil {
		msg = "获取失败，Err:" + err.Error()
		return
	}
	if len(listFrozenOutbound) > 0 {
		for _, v := range listFrozenOutbound {
			listFrozen = append(listFrozen, v)
		}
	}

	var listFrozenUser []*models.WxUserWhite
	for _, v := range listFrozen {
		if v.Mobile == "" {
			continue
		}
		listFrozenUser = append(listFrozenUser, v)
	}

	if len(listFrozenUser) > 0 {
		for _, item := range listFrozenUser {
			row := sheet.AddRow()
			cellA := row.AddCell()
			cellA.Value = item.RealName
			cellB := row.AddCell()
			cellB.Value = item.CountryCode
			if len(item.Mobile) >= 11 && item.CountryCode == "" {
				cellB.Value = "86"
			}
			cellC := row.AddCell()
			cellC.Value = item.Mobile
			cellD := row.AddCell()
			cellD.Value = ""
			cellE := row.AddCell()
			cellE.Value = ""
			cellF := row.AddCell()
			cellF.Value = ""
			cellG := row.AddCell()
			cellG.Value = item.CompanyName
			cellH := row.AddCell()
			cellH.Value = ""
			cellI := row.AddCell()
			cellI.Value = ""
			cellJ := row.AddCell()
			cellJ.Value = item.SellerName
			cellK := row.AddCell()
			cellK.Value = ""
			cellL := row.AddCell()
			cellL.Value = ""
			cellM := row.AddCell()
			cellM.Value = ""
			cellN := row.AddCell()
			cellN.Value = ""
			cellO := row.AddCell()
			cellO.Value = item.PermissionName
		}
	}
	errFile = xlsxFile.Save(downLoadnFilePaths)
	if errFile != nil {
		msg = "保存文件失败Err:" + errFile.Error()
		return
	}
	title = time.Now().Format("2006-01-02") + "删除白名单用户"
	content = time.Now().Format("2006-01-02") + "删除白名单用户"
	fileName = downLoadnFilePaths
	var sendResult2 bool
	if len(listFrozenOutbound) > 0 {
		sendResult2 = utils.SendEmailByHongze(title, content, utils.EmaiWhiteUserList, fileName, title+".xlsx")
	}

	os.Remove(downLoadnFilePaths)
	//更新名单表
	if sendResult {
		if len(listMobile) > 0 {
			for _, v := range listMobile {
				item := new(models.WxUserWhite)
				item.Mobile = v.Mobile
				item.CountryCode = v.CountryCode
				item.CreatedTime = time.Now()
				item.CompanyName = v.CompanyName
				item.PermissionName = v.Permission
				item.UserCreatedTime = v.CreatedTime
				item.RealName = v.RealName
				item.SellerName = v.SellerName
				item.Status = v.Status
				_, err = models.AddWxUserWhite(item)
				if err != nil {
					msg = "获取失败，Err:" + err.Error()
					return
				}
			}
		}
		if len(listOutboundMobile) > 0 {
			for _, v := range listOutboundMobile {
				item := new(models.WxUserWhite)
				item.Mobile = v.Mobile
				item.OutboundMobile = v.Mobile
				item.OutboundCountryCode = v.CountryCode
				item.CreatedTime = time.Now()
				item.CompanyName = v.CompanyName
				item.PermissionName = v.Permission
				item.UserCreatedTime = v.CreatedTime
				item.RealName = v.RealName
				item.SellerName = v.SellerName
				item.Status = v.Status
				_, err = models.AddWxUserWhite(item)
				if err != nil {
					msg = "获取失败，Err:" + err.Error()
					return
				}
			}
		}
	}

	if sendResult2 {
		for _, v := range listFrozen {
			err = models.DeleteWxUserWhite(v)
			if err != nil {
				msg = "删除信息失败，Err:" + err.Error()
				return
			}
		}
	}
	fmt.Println("发送附件完成", len(listFrozen))
	return
}

// 获取用户权限
func GetUserhasPermission(user *models.WxUserItem) (hasPermission int, err error) {
	//判断是否已经申请过
	applyCount, err := models.GetApplyRecordCount(user.UserId)
	if err != nil && err.Error() != utils.ErrNoRow() {
		return
	}
	if applyCount > 0 {
		hasPermission = 3
	} else {
		hasPermission = 4
	}
	//HasPermission int  `description:"1:有该行业权限,正常展示，2：无该行业权限，不存在权益客户下，3:无该品类权限,已提交过申请，4：无该行业权限,未提交过申请，5：潜在客户，未提交过申请，6：潜在客户,已提交过申请"`
	if user.CompanyId > 1 {
		companyPermission, errPer := models.GetCompanyPermission(user.CompanyId)
		if errPer != nil {
			err = errPer
			return
		}
		if companyPermission == "" {
			if applyCount > 0 {
				hasPermission = 3
			} else {
				hasPermission = 4
			}
		} else {
			if strings.Contains(companyPermission, "医药") || strings.Contains(companyPermission, "科技") || strings.Contains(companyPermission, "消费") || strings.Contains(companyPermission, "智造") || strings.Contains(companyPermission, "策略") {
				hasPermission = 1
			}
		}
	}
	return
}

// 获取用户权限（推荐列表权限校验）
func GetUserhasPermissionReportSelection(user *models.WxUserItem) (hasPermission int, err error) {
	//判断是否已经申请过
	applyCount, err := models.GetApplyRecordCount(user.UserId)
	if err != nil && err.Error() != utils.ErrNoRow() {
		return
	}
	if applyCount > 0 {
		hasPermission = 3
	} else {
		hasPermission = 5
	}
	//HasPermission int  `description:"1:有该行业权限,正常展示，2：无该行业权限，不存在权益客户下，3:无该品类权限,已提交过申请，4：无该行业权限,未提交过申请，5：潜在客户，未提交过申请，6：潜在客户,已提交过申请"`
	if user.CompanyId > 1 {
		companyPermission, errPer := models.GetCompanyPermission(user.CompanyId)
		if errPer != nil {
			err = errPer
			return
		}
		if strings.Contains(companyPermission, utils.TUI_JIAN_LIE_BIAO) {
			hasPermission = 1
		} else {
			if applyCount > 0 {
				hasPermission = 5
			} else {
				hasPermission = 2
			}
		}
	} else {
		if applyCount > 0 {
			hasPermission = 5
		} else {
			hasPermission = 4
		}
	}
	return
}

// 获取用户有没有开通任意一个行业权限
func GetUserhasPermissionOne(user *models.WxUserItem) (hasPermission int, err error) {
	//判断是否已经申请过
	applyCount, err := models.GetApplyRecordCount(user.UserId)
	if err != nil && err.Error() != utils.ErrNoRow() {
		return
	}
	if applyCount > 0 {
		hasPermission = 3
	} else {
		hasPermission = 4
	}
	//HasPermission int  `description:"1:有该行业权限,正常展示，2：无该行业权限，不存在权益客户下，3:无该品类权限,已提交过申请，4：无该行业权限,未提交过申请，5：潜在客户，未提交过申请，6：潜在客户,已提交过申请"`
	if user.CompanyId > 1 {
		companyPermission, errPer := models.GetCompanyPermission(user.CompanyId)
		if errPer != nil {
			err = errPer
			return
		}
		if companyPermission == "" {
			if applyCount > 0 {
				hasPermission = 3
			} else {
				hasPermission = 4
			}
		} else {
			hasPermission = 1
		}
	}
	return
}

// 每周五发送当前所有的权益用户
func SendEmailAllUserWithRAI() (err error) {
	defer func() {
		if err != nil {
			fmt.Println("err：", err, time.Now())
			go utils.SendEmail("发送权益用户邮件失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), ";Err:"+err.Error(), utils.EmailSendToUsers)
			utils.FileLog.Info("发送权益用户邮件失败,Err:%s", err.Error())
		}
	}()
	list, err := models.GetSendEmailAllUserWithRAI()
	if err != nil {
		return
	}
	//创建excel
	dir, err := os.Executable()
	exPath := filepath.Dir(dir)
	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandDigit(5) + ".xlsx"
	xlsxFile := xlsx.NewFile()
	if err != nil {
		return
	}
	style := xlsx.NewStyle()
	alignment := xlsx.Alignment{
		Horizontal: "center",
		Vertical:   "center",
		WrapText:   true,
	}
	style.Alignment = alignment
	style.ApplyAlignment = true
	sheet, err := xlsxFile.AddSheet("权益用户名单")
	if err != nil {
		return
	}
	//设置宽度
	_ = sheet.SetColWidth(0, 0, 30)
	_ = sheet.SetColWidth(1, 1, 22)
	_ = sheet.SetColWidth(3, 3, 18)
	_ = sheet.SetColWidth(5, 5, 15)
	_ = sheet.SetColWidth(7, 8, 12)
	_ = sheet.SetColWidth(9, 9, 17)
	_ = sheet.SetColWidth(10, 10, 35)
	//标头
	rowTitle := sheet.AddRow()
	cellA := rowTitle.AddCell()
	cellA.Value = "客户名称"
	cellB := rowTitle.AddCell()
	cellB.Value = "社会信用码"
	cellC := rowTitle.AddCell()
	cellC.Value = "客户类型"
	cellD := rowTitle.AddCell()
	cellD.Value = "行业"
	cellE := rowTitle.AddCell()
	cellE.Value = "所属销售"
	cellF := rowTitle.AddCell()
	cellF.Value = "销售手机号"
	cellG := rowTitle.AddCell()
	cellG.Value = "状态"
	cellH := rowTitle.AddCell()
	cellH.Value = "服务起始期限"
	cellI := rowTitle.AddCell()
	cellI.Value = "服务结束期限"
	cellJ := rowTitle.AddCell()
	cellJ.Value = "创建时间"
	cellK := rowTitle.AddCell()
	cellK.Value = "权限"
	if len(list) > 0 {
		for _, item := range list {
			row := sheet.AddRow()
			cellA := row.AddCell()
			cellA.Value = item.CompanyName
			cellB := row.AddCell()
			cellB.Value = item.CreditCode
			cellC := row.AddCell()
			cellC.Value = item.ProductName
			cellD := row.AddCell()
			cellD.Value = item.IndustryName
			cellE := row.AddCell()
			cellE.Value = item.RealName
			cellF := row.AddCell()
			cellF.Value = item.Mobile
			cellG := row.AddCell()
			cellG.Value = item.Status
			cellH := row.AddCell()
			cellH.Value = item.StartDate
			cellI := row.AddCell()
			cellI.Value = item.EndDate
			cellJ := row.AddCell()
			cellJ.Value = item.CreatedTime
			cellK := row.AddCell()
			cellK.Value = item.Permission
		}
	}
	err = xlsxFile.Save(downLoadnFilePath)
	if err != nil {
		return
	}
	title := time.Now().Format(utils.FormatDate) + "权益用户名单"
	content := time.Now().Format(utils.FormatDate) + "权益用户名单"
	fileName := downLoadnFilePath
	if len(list) > 0 {
		utils.SendEmailByHongze(title, content, "cxzhang@hzinsights.com;tshen@hzinsights.com", fileName, title+".xlsx")
	}
	os.Remove(downLoadnFilePath)
	return
}

// 每周五发送发送这些公司下的用户
func SendEmailAllUserWithCompany() (err error) {
	defer func() {
		if err != nil {
			fmt.Println("err：", err, time.Now())
			go utils.SendEmail("发送权益用户邮件失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), ";Err:"+err.Error(), utils.EmailSendToUsers)
			utils.FileLog.Info("发送权益用户邮件失败,Err:%s", err.Error())
		}
	}()
	list, err := models.GetSendEmailAllUserWithCompany()
	if err != nil {
		return
	}
	//创建excel
	dir, err := os.Executable()
	exPath := filepath.Dir(dir)
	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandDigit(5) + ".xlsx"
	xlsxFile := xlsx.NewFile()
	if err != nil {
		return
	}
	style := xlsx.NewStyle()
	alignment := xlsx.Alignment{
		Horizontal: "center",
		Vertical:   "center",
		WrapText:   true,
	}
	style.Alignment = alignment
	style.ApplyAlignment = true
	sheet, err := xlsxFile.AddSheet("私募客户联系人名单")
	if err != nil {
		return
	}
	//设置宽度
	_ = sheet.SetColWidth(1, 1, 15)
	_ = sheet.SetColWidth(6, 6, 22)
	_ = sheet.SetColWidth(7, 7, 32)
	//标头
	rowTitle := sheet.AddRow()
	cellA := rowTitle.AddCell()
	cellA.Value = "*姓名"
	cellB := rowTitle.AddCell()
	cellB.Value = "*手机号1"
	cellC := rowTitle.AddCell()
	cellC.Value = "国家号1"
	cellD := rowTitle.AddCell()
	cellD.Value = "手机号2"
	cellE := rowTitle.AddCell()
	cellE.Value = "国家号2"
	cellF := rowTitle.AddCell()
	cellF.Value = "座机"
	cellG := rowTitle.AddCell()
	cellG.Value = "*邮箱"
	cellH := rowTitle.AddCell()
	cellH.Value = "*所属公司"
	cellI := rowTitle.AddCell()
	cellI.Value = "性别"
	cellJ := rowTitle.AddCell()
	cellJ.Value = "*是否决策人"
	cellK := rowTitle.AddCell()
	cellK.Value = "部门"
	cellL := rowTitle.AddCell()
	cellL.Value = "职位"
	cellM := rowTitle.AddCell()
	cellM.Value = "所属销售"
	cellN := rowTitle.AddCell()
	cellN.Value = "等级"
	cellO := rowTitle.AddCell()
	cellO.Value = "附件权限"
	cellP := rowTitle.AddCell()
	cellP.Value = "标签"
	cellQ := rowTitle.AddCell()
	cellQ.Value = "近期调研"
	cellR := rowTitle.AddCell()
	cellR.Value = "创建时间"
	if len(list) > 0 {
		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 != "" && item.Mobile != "" {
				cellC.Value = "+" + item.CountryCode
			}
			if item.CountryCode == "" && item.Mobile != "" {
				cellC.Value = "+86"
			}
			cellD := row.AddCell()
			cellD.Value = ""
			cellE := row.AddCell()
			cellE.Value = ""
			cellF := row.AddCell()
			cellF.Value = ""
			cellG := row.AddCell()
			cellG.Value = item.Email
			cellH := row.AddCell()
			cellH.Value = item.CompanyName
			cellI := row.AddCell()
			cellI.Value = ""
			cellJ := row.AddCell()
			if item.IsMaker == "1" {
				cellJ.Value = "是"
			} else {
				cellJ.Value = "否"
			}
		}
	}
	err = xlsxFile.Save(downLoadnFilePath)
	if err != nil {
		return
	}
	title := time.Now().Format(utils.FormatDate) + "私募客户联系人名单"
	content := time.Now().Format(utils.FormatDate) + "私募客户联系人名单"
	fileName := downLoadnFilePath
	if len(list) > 0 {
		utils.SendEmailByHongze(title, content, "cxzhang@hzinsights.com;tshen@hzinsights.com", fileName, title+".xlsx")
	}
	os.Remove(downLoadnFilePath)
	return
}

// 先关注后登录，更新用户是否关注过查研观向小助手公众号
func UpdateCygxSubscribe(uid int, unionId string) (err error) {
	defer func() {
		if err != nil && err.Error() != utils.ErrNoRow() {
			go utils.SendAlarmMsg("先关注后登录，更新用户是否关注过查研观向小助手公众号失败"+err.Error()+"uid:"+strconv.Itoa(uid)+"unionId:"+unionId, 2)
		}
	}()
	if unionId == "" {
		err = errors.New("unionId为空，用户ID：" + strconv.Itoa(uid))
		return
	}
	detail, err := models.GetCygxUserRecordSubscribe(unionId)
	if err != nil && err.Error() != utils.ErrNoRow() {
		return
	}
	if detail != nil {
		err = models.UserSubscribe(detail.SubscribeTime, uid)
	}
	return
}
