package cygx

import (
	"encoding/json"
	"fmt"
	"github.com/tealeg/xlsx"
	"hongze/hz_crm_api/controllers"
	"hongze/hz_crm_api/models"
	"hongze/hz_crm_api/models/cygx"
	"hongze/hz_crm_api/models/system"
	"hongze/hz_crm_api/services"
	cygxService "hongze/hz_crm_api/services/cygx"
	"hongze/hz_crm_api/utils"
	"os"
	"path/filepath"
	"strconv"
	"strings"
	"time"
)

// 专项调研行程
type ActivitySpecialTripCoAntroller struct {
	controllers.BaseAuthController
}

// @Title 新增报名
// @Description 新增报名接口
// @Param	request	body cygx.AddMeetingReminderReq true "type json string"
// @Success 200 操作成功
// @router /special/trip/addUser [post]
func (this *ActivitySpecialTripCoAntroller) AddUser() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	AdminUser := this.SysUser
	if AdminUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	var req cygx.AddMeetingReminderReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	roleTypeCode := AdminUser.RoleTypeCode
	var items []*cygx.CygxActivitySpecialTrip
	var itemsBill []*cygx.CygxActivitySpecialTripBill
	var itemsMeet []*cygx.CygxActivitySpecialMeetingDetail
	activityIds := req.ActivityIds
	uidList := req.List
	if activityIds == "" {
		br.Msg = "请选择活动"
		br.ErrMsg = "活动ID不能为空"
		return
	}
	activityIdList := strings.Split(activityIds, ",")
	var uids string
	for _, v := range uidList {
		uids += strconv.Itoa(v.UserId) + ","
	}
	uids = strings.TrimRight(uids, ",")
	for _, v := range uidList {
		uid := v.UserId
		wxUser, userErr := models.GetWxUserByUserId(uid)
		if userErr != nil {
			br.Msg = "编辑失败!查询用户信息失败"
			br.ErrMsg = "查询用户信息失败,Err:" + userErr.Error() + "用户UID:" + strconv.Itoa(uid) + "不存在"
			return
		}
		for _, vact := range activityIdList {
			activityId, _ := strconv.Atoi(vact)
			activityInfo, err := cygx.GetAddActivityInfoSpecialById(activityId)
			if err != nil {
				br.Msg = "活动不存在"
				br.ErrMsg = "活动ID错误,Err:activityId:" + strconv.Itoa(activityId)
				return
			}
			limitPeopleNum := activityInfo.LimitPeopleNum
			if limitPeopleNum > 0 {
				if AdminUser.RoleTypeCode != "admin" {
					havePower, err := cygxService.GetSpecialDetailUserPower(wxUser, activityInfo)
					if err != nil {
						br.Msg = "用户权限校验失败!"
						br.ErrMsg = "GetActivityDetailUserPower,Err:" + err.Error() + fmt.Sprint("UserId", wxUser.UserId, "ActivityId:", activityInfo.ActivityId)
						return
					}
					if !havePower {
						br.Msg = "当前活动对该客户不可见,无法报名"
						br.ErrMsg = "活动ID:" + strconv.Itoa(activityId) + "活动名称:" + activityInfo.ResearchTheme + "用户ID:" + strconv.Itoa(int(wxUser.UserId))
						return
					}
				}
				//获取这个活动已经报名的用户数量
				totalSignup, errSignup := cygx.GetActivitySpecialTripCountByActivityId(activityId)
				if errSignup != nil {
					br.Msg = "获取失败"
					br.ErrMsg = "获取失败,Err:" + errSignup.Error()
					return
				}
				//获取这个活动中输入的这些用户的报名数量
				totalThisUser, errThisUser := cygx.GetActivitySpecialTripCountByThisUser(activityId, uids)
				if errThisUser != nil {
					br.Msg = "获取失败"
					br.ErrMsg = "获取失败,Err:" + errThisUser.Error()
					return
				}
				//如果是限制人数的就做报名人数限制判断
				if limitPeopleNum < totalSignup+len(uidList)-totalThisUser {
					br.Msg = "新增失败,活动人数超限"
					br.ErrMsg = "当前活动报名人数已满,活动:" + activityInfo.ResearchTheme
					return
				}
			}
			//total, errtotal := cygx.GetActivitySpecialTripCount(uid, activityId)
			//if errtotal != nil {
			//	br.Msg = "获取失败"
			//	br.ErrMsg = "获取失败,Err:" + errtotal.Error()
			//	return
			//}
			infoUser, err := cygx.GetUserAndCompanyNameList(uid)
			if err != nil {
				br.Msg = "获取失败"
				br.ErrMsg = "获取数据失败,Err:" + err.Error()
				return
			}
			//if total == 0 {
			totalAll, err := cygx.GetUserActivitySpecialTripCount(uid, activityId)
			if err != nil {
				br.Msg = "获取信息失败"
				br.ErrMsg = "获取日程数量信息失败,Err:" + err.Error()
				return
			}
			if totalAll > 0 {
				continue
			}
			//流水记录表
			itemBill := new(cygx.CygxActivitySpecialTripBill)
			itemBill.UserId = infoUser.UserId
			itemBill.ActivityId = activityInfo.ActivityId
			itemBill.CreateTime = time.Now()
			itemBill.Mobile = infoUser.Mobile
			itemBill.Email = infoUser.Email
			itemBill.CompanyId = infoUser.CompanyId
			itemBill.CompanyName = infoUser.CompanyName
			itemBill.RealName = infoUser.RealName
			itemBill.Source = 2
			itemBill.DoType = 1
			itemBill.BillDetailed = -1 // 流水减一
			itemBill.RegisterPlatform = 3
			itemBill.ChartPermissionId = activityInfo.ChartPermissionId
			itemBill.ChartPermissionName = activityInfo.ChartPermissionName
			itemBill.AdminId = AdminUser.AdminId

			//if activityInfo.ChartPermissionName == utils.CE_LUE_NAME || activityInfo.ChartPermissionName == utils.GU_SHOU_NAME {
			if utils.InArrayByStr(utils.ACTIVITY_SPECIAL_TRIP_PERMISSION_NAME_OTHER, activityInfo.ChartPermissionName) {
				//如果是策略、固收、周期行业,把代扣行业信息放入流水表,取消报名的时候,返点使用
				maxChartPermissionId, maxChartPermissionName, err := cygxService.GetSpecialBillMaxChartPermissionId(infoUser)
				if err != nil {
					br.Msg = "操作失败"
					br.ErrMsg = "获取销售信息失败,GetSpecialBillMaxChartPermissionId Err:" + err.Error()
					return
				}
				itemBill.ChartPermissionId = maxChartPermissionId
				itemBill.ChartPermissionName = maxChartPermissionName
			}

			if totalAll == 0 {
				item := new(cygx.CygxActivitySpecialTrip)
				item.UserId = infoUser.UserId
				item.RealName = infoUser.RealName
				item.SellerName = infoUser.SellerName
				item.ActivityId = activityId
				item.CreateTime = time.Now()
				item.Mobile = infoUser.Mobile
				item.Email = infoUser.Email
				item.CompanyId = infoUser.CompanyId
				item.CompanyName = infoUser.CompanyName
				item.AdminId = AdminUser.AdminId
				item.Source = 2
				//优先绑定用户修改过的外呼手机号
				if infoUser.OutboundMobile != "" {
					item.OutboundMobile = infoUser.OutboundMobile
					if infoUser.OutboundCountryCode == "" {
						item.CountryCode = "86"
					} else {
						item.CountryCode = infoUser.OutboundCountryCode
					}
				} else {
					item.OutboundMobile = infoUser.Mobile
					if infoUser.CountryCode == "" {
						item.CountryCode = "86"
					} else {
						item.CountryCode = infoUser.CountryCode
					}
				}
				items = append(items, item)
				err = cygxService.DeductTripRemainingtimesByUser(infoUser, activityInfo, roleTypeCode) //扣除用户专项调研剩余次数
				if err != nil {
					br.Msg = "操作失败"
					br.ErrMsg = "操作失败,Err:" + err.Error()
					return
				}
			} else {
				err = cygx.UpdateSpecialTrip(1, 0, uid, activityId)
				if err != nil {
					br.Msg = "报名失败,"
					br.ErrMsg = "二次报名,更改报名是否有效状态失败,Err:" + err.Error()
					return
				}
				resultTime := utils.StrTimeToTime(activityInfo.ActivityTime)
				//48小时之内的取消也扣除一次参会记录
				if time.Now().Add(+time.Hour * 48).After(resultTime) {
					itemBill.BillDetailed = 0 //48小时之内,取消报名之后二次报名,不扣除流水记录
				} else {
					err = cygxService.DeductTripRemainingtimesByUser(infoUser, activityInfo, roleTypeCode) //扣除用户专项调研剩余次数
					if err != nil {
						br.Msg = "操作失败"
						br.ErrMsg = "操作失败,Err:" + err.Error()
						return
					}
				}
			}
			//userType, tripRemaining, mapChartName, err := cygxService.GetChartPermissionSpecialSurplusByCompany(infoUser.CompanyId)
			//if err != nil {
			//	br.Msg = "获取专项调研剩余次数失败"
			//	br.ErrMsg = "获取专项调研剩余次数失败,err:" + err.Error()
			//	return
			//}
			//if userType == 2 {
			//	tripRemaining = tripRemaining + itemBill.BillDetailed - i
			//	itemBill.Total = strconv.Itoa(tripRemaining) + "次"
			//} else {
			//	for k, num := range mapChartName {
			//		if activityInfo.ChartPermissionName == k {
			//			num = num + itemBill.BillDetailed - i
			//		}
			//		itemBill.Total += k + strconv.Itoa(num) + "次+"
			//	}
			//	itemBill.Total = strings.TrimRight(itemBill.Total, "+")
			//}
			totalText, err := cygxService.HandleActivitySpecialTripBillTotalText(infoUser.CompanyId)
			if err != nil {
				br.Msg = "报名失败,"
				br.ErrMsg = "二次报名,更改报名是否有效状态失败,Err:" + err.Error()
				return
			}
			itemBill.Total = totalText
			itemsBill = append(itemsBill, itemBill)
			//}

			var itemMeeting = new(cygx.CygxActivitySpecialMeetingDetail)
			itemMeeting.UserId = v.UserId
			itemMeeting.ActivityId = activityId
			itemMeeting.CreateTime = time.Now()
			itemMeeting.Mobile = infoUser.Mobile
			itemMeeting.Email = infoUser.Email
			itemMeeting.CompanyId = infoUser.CompanyId
			itemMeeting.CompanyName = infoUser.CompanyName
			itemMeeting.RealName = infoUser.RealName
			itemsMeet = append(itemsMeet, itemMeeting)
		}
	}
	err = cygx.AddCygxActivitySpecialTrip(items, itemsBill, itemsMeet)
	if err != nil {
		br.Msg = "操作失败"
		br.ErrMsg = "新增用户失败,Err:" + err.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
	br.IsAddLog = true
}

// @Title 报名列表
// @Description 报名列表接口
// @Param   ActivityId   query   int  true     "活动ID"
// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
// @Success 200 {object} cygx.GetAppointmentSpecialListRsep
// @router /special/tripList [get]
func (this *ActivitySpecialTripCoAntroller) TripList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	isExport, _ := this.GetBool("IsExport", false)
	activityId, _ := this.GetInt("ActivityId")
	if activityId < 1 {
		br.Msg = "活动不存在"
		return
	}
	respList := new(cygx.GetAppointmentSpecialListRsep)
	activityInfo, _ := cygx.GetAddActivityInfoSpecialById(activityId)
	if activityInfo == nil {
		br.Msg = "活动不存在"
		br.ErrMsg = "活动ID错误,Err:activityId:" + strconv.Itoa(activityId)
		return
	}
	//超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
	resp := new(cygx.CanDownload)
	adminInfo, errAdmin := system.GetSysUserById(sysUser.AdminId)
	if errAdmin != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + errAdmin.Error()
		return
	}
	if adminInfo.Role == "admin" || adminInfo.Role == "researcher" {
		resp.IsCanDownload = true
	}
	memberType := "Admin"
	sqlStr := `  AND s.is_cancel = 0`
	totalStr := sqlStr

	list, err := cygx.GetCygxActivitySpecialTripList(activityId, sqlStr)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	//线上活动,销售查看自己客户,销售组长查看组员
	if resp.IsCanDownload == false && activityInfo.SpecialType == 1 {
		mapMobile, err := cygxService.GetAdminLookUserMobile(adminInfo)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取失败,销售对应权限,Err:" + err.Error()
			return
		}
		for _, v := range list {
			if _, ok := mapMobile[v.Mobile]; ok {
				respList.List = append(respList.List, v)
			}
		}
		if adminInfo.RoleTypeCode == "rai_group" {
			//组长查看本组所有组员
			memberType = "GroupLeader"
		} else {
			//组员查看自己
			memberType = "Sale"
		}
	} else {
		respList.List = list
	}
	if len(respList.List) == 0 {
		respList.List = make([]*cygx.CygxActivitySpecialTripResp, 0)
	}
	//导出excel
	if isExport {
		TripListExport(this, respList.List)
		return
	}
	total, errtotal := cygx.GetActivitySpecialTripTotal(activityId, totalStr)
	if errtotal != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "客户总数获取失败,Err:" + errtotal.Error()
		return
	}
	myTotal := len(respList.List)
	respList.Source = 1
	respList.Total = total
	respList.MyTotal = myTotal
	respList.ActivityId = activityId
	respList.SpecialType = activityInfo.SpecialType
	if activityInfo.LimitPeopleNum > 0 {
		respList.IsLimitPeople = 1
	}
	respList.MemberType = memberType
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = respList
}

// TripListExport 下载报名信息
func TripListExport(this *ActivitySpecialTripCoAntroller, listDate []*cygx.CygxActivitySpecialTripResp) {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	activityId, _ := this.GetInt("ActivityId")
	activityInfo, _ := cygx.GetAddActivityInfoSpecialById(activityId)
	if activityInfo == nil {
		br.Msg = "活动不存在"
		br.ErrMsg = "活动ID错误,Err:activityId:" + strconv.Itoa(activityId)
		return
	}
	//超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
	resp := new(cygx.CanDownload)
	adminInfo, errAdmin := system.GetSysUserById(sysUser.AdminId)
	if errAdmin != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + errAdmin.Error()
		return
	}
	if adminInfo.Role == "admin" || adminInfo.Role == "researcher" {
		resp.IsCanDownload = true
	}

	//创建excel
	dir, err := os.Executable()
	exPath := filepath.Dir(dir)
	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	xlsxFile := xlsx.NewFile()
	if err != nil {
		br.Msg = "生成文件失败"
		br.ErrMsg = "生成文件失败"
		return
	}
	style := xlsx.NewStyle()
	alignment := xlsx.Alignment{
		Horizontal: "center",
		Vertical:   "center",
		WrapText:   true,
	}
	style.Alignment = alignment
	style.ApplyAlignment = true

	sheetName := "报名名单"
	sheet, err := xlsxFile.AddSheet(sheetName)
	if err != nil {
		br.Msg = "新增Sheet失败"
		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
		return
	}
	//标头
	if activityInfo.SpecialType == 1 || resp.IsCanDownload {
		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 listDate {
			row := sheet.AddRow()
			cellA := row.AddCell()
			cellA.Value = item.RealName
			cellB := row.AddCell()
			cellB.Value = item.Mobile
			cellC := row.AddCell()
			cellC.Value = item.CompanyName
			cellD := row.AddCell()
			cellD.Value = item.SellerName
		}
	} else {
		rowTitle := sheet.AddRow()
		cellA := rowTitle.AddCell()
		cellA.Value = "姓名"
		cellB := rowTitle.AddCell()
		cellB.Value = "公司名称"
		cellC := rowTitle.AddCell()
		cellC.Value = "所属销售"

		for _, item := range listDate {
			row := sheet.AddRow()
			cellA := row.AddCell()
			cellA.Value = item.RealName
			cellB := row.AddCell()
			cellB.Value = item.CompanyName
			cellC := row.AddCell()
			cellC.Value = item.SellerName
		}
	}

	err = xlsxFile.Save(downLoadnFilePath)
	if err != nil {
		br.Msg = "保存文件失败"
		br.ErrMsg = "保存文件失败"
		return
	}
	downloadFileName := activityInfo.ResearchTheme + ".xlsx"
	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
	defer func() {
		os.Remove(downLoadnFilePath)
	}()
	br.Success = true
	br.Ret = 200
	br.IsAddLog = true
}

// @Title 取消报名
// @Description 取消报名接口
// @Param	request	body cygx.ActivitySpecialTripCancelReq true "type json string"
// @Success 200 操作成功
// @router /special/trip/cancel [post]
func (this *ActivitySpecialTripCoAntroller) TripCancel() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	var req cygx.ActivitySpecialTripCancelReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}

	userId := req.UserId
	activityId := req.ActivityId
	total, err := cygx.GetActivitySpecialTripCountByThisUser(activityId, strconv.Itoa(userId))
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	if total == 0 {
		br.Msg = "获取报名信息失败"
		br.ErrMsg = "获取失败,activityId:" + strconv.Itoa(activityId)
		return
	}
	activityInfo, errInfo := cygx.GetAddActivityInfoSpecialById(activityId)
	if activityInfo == nil {
		br.Msg = "操作失败"
		br.ErrMsg = "活动ID错误,不存在activityId:" + strconv.Itoa(activityId)
		return
	}
	if errInfo != nil {
		br.Msg = "操作失败"
		br.ErrMsg = "操作失败,Err:" + errInfo.Error()
		return
	}

	infoUser, err := cygx.GetUserAndCompanyNameList(userId)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取数据失败,Err:" + err.Error()
		return
	}
	//流水记录表
	itemBill := new(cygx.CygxActivitySpecialTripBill)
	itemBill.UserId = infoUser.UserId
	itemBill.ActivityId = activityInfo.ActivityId
	itemBill.CreateTime = time.Now()
	itemBill.Mobile = infoUser.Mobile
	itemBill.Email = infoUser.Email
	itemBill.CompanyId = infoUser.CompanyId
	itemBill.CompanyName = infoUser.CompanyName
	itemBill.RealName = infoUser.RealName
	itemBill.Source = 2
	itemBill.DoType = 2
	itemBill.BillDetailed = 1 // 流水加一
	itemBill.RegisterPlatform = 3
	itemBill.ChartPermissionId = activityInfo.ChartPermissionId
	itemBill.ChartPermissionName = activityInfo.ChartPermissionName
	itemBill.AdminId = sysUser.AdminId

	//if activityInfo.ChartPermissionName == utils.CE_LUE_NAME || activityInfo.ChartPermissionName == utils.GU_SHOU_NAME {
	if utils.InArrayByStr(utils.ACTIVITY_SPECIAL_TRIP_PERMISSION_NAME_OTHER, activityInfo.ChartPermissionName) {
		//如果是策略、固收行业,把代扣行业信息放入流水表,取消报名的时候,返点使用
		lastTripBill, err := cygx.GetCygxActivitySpecialTripBillLastDetialByActivityId(activityInfo.ActivityId, userId)
		if err != nil {
			br.Msg = "操作失败"
			br.ErrMsg = "获取销售信息失败,GetCygxActivitySpecialTripBillLastDetialByActivityId Err:" + err.Error()
			return
		}
		itemBill.ChartPermissionId = lastTripBill.ChartPermissionId
		itemBill.ChartPermissionName = lastTripBill.ChartPermissionName
	}

	resultTime := utils.StrTimeToTime(activityInfo.ActivityTime)
	//48小时之内的取消也扣除一次参会记录
	var isValid int
	if time.Now().Add(+time.Hour * 48).After(resultTime) {
		isValid = 1
		itemBill.BillDetailed = 0 // 48小时之内取消的,照样扣点,流水不进行加一
	} else {
		err = cygxService.RebateTripRemainingtimesByUser(infoUser, activityInfo) // 返点
		if err != nil {
			br.Msg = "操作失败"
			br.ErrMsg = "操作失败,RebateTripRemainingtimesByUserErr:" + err.Error()
			return
		}
	}
	err = cygx.ActivitySpecialTripCancel(isValid, activityId, userId)
	if err != nil {
		br.Msg = "修改失败"
		br.ErrMsg = "修改失败 Err:" + err.Error()
		return
	}
	//userType, tripRemaining, mapChartName, err := cygxService.GetChartPermissionSpecialSurplusByCompany(infoUser.CompanyId)
	//if err != nil {
	//	br.Msg = "获取专项调研剩余次数失败"
	//	br.ErrMsg = "获取专项调研剩余次数失败,err:" + err.Error()
	//	return
	//}
	//if userType == 2 {
	//	tripRemaining += itemBill.BillDetailed
	//	itemBill.Total = strconv.Itoa(tripRemaining) + "次"
	//} else {
	//	for k, num := range mapChartName {
	//		if activityInfo.ChartPermissionName == k {
	//			num += itemBill.BillDetailed
	//		}
	//		itemBill.Total += k + strconv.Itoa(num) + "次+"
	//	}
	//	itemBill.Total = strings.TrimRight(itemBill.Total, "+")
	//}
	totalText, err := cygxService.HandleActivitySpecialTripBillTotalText(infoUser.CompanyId)
	if err != nil {
		br.Msg = "报名失败,"
		br.ErrMsg = "二次报名,更改报名是否有效状态失败,Err:" + err.Error()
		return
	}
	itemBill.Total = totalText
	err = cygx.AddCygxActivitySpecialTripBill(itemBill)
	if err != nil {
		br.Msg = "修改失败"
		br.ErrMsg = "修改失败流水记录添加失败 Err:" + err.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
	br.IsAddLog = true
}

// @Title 到会详情/提交到会详情
// @Description 报名详情列表接口
// @Param   ActivityId   query   int  true     "活动ID"
// @Success 200 {object} cygx.GetAppointmentSpecialListRsep
// @router /special/trip/meetDetial [get]
func (this *ActivitySpecialTripCoAntroller) MeetDetial() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	AdminUser := this.SysUser
	if AdminUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	activityId, _ := this.GetInt("ActivityId")
	if activityId < 1 {
		br.Msg = "活动不存在"
		return
	}
	activityInfo, err := cygx.GetAddActivityInfoSpecialById(activityId)
	if err != nil {
		br.Msg = "活动不存在"
		br.ErrMsg = "活动ID错误,Err:activityId:" + strconv.Itoa(activityId)
		return
	}

	respList := new(cygx.SpecialMeetingDetailRespList)
	if activityInfo.IsSubmitMeeting == 0 {
		sqlStr := `  AND s.is_cancel = 0`
		list, err := cygx.GetCygxActivitySpecialTripList(activityId, sqlStr)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取失败,Err:" + err.Error()
			return
		}
		for _, v := range list {
			item := new(cygx.CygxActivitySpecialMeetingDetailResp)
			item.UserId = v.UserId
			item.RealName = v.RealName
			item.CompanyName = v.CompanyName
			respList.List = append(respList.List, item)
		}
	} else {
		respList.List, err = cygx.GetCygxActivitySpecialMeetingDetailListByActivity(activityId)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取失败,Err:" + err.Error()
			return
		}
		UserMap, err := cygxService.GetSpecialTripUserMap(activityId)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取失败,Err:" + err.Error()
			return
		}
		for k, v := range respList.List {
			if v.IsMeeting == 1 {
				if _, ok := UserMap[v.UserId]; !ok {
					respList.List[k].IsMeeting = 2
				}
				respList.List[k].Operation = true
			}
		}
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = respList
}

// @Title 提交线下到会情况
// @Description 提交线下到会情况接口
// @Param	request	body cygx.MeetingDoRep true "type json string"
// @Success 200 操作成功
// @router /special/trip/meetingDo [post]
func (this *ActivitySpecialTripCoAntroller) MeetingDo() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	AdminUser := this.SysUser
	if AdminUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,用户信息为空"
		br.Ret = 408
		return
	}
	var req cygx.MeetingSpeciaDoRep
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	var userIdArr []int
	var newMeetingUserid = make(map[int]bool) //新提交的到会的额用户ID
	meetingUids := req.UserIds
	if len(meetingUids) == 0 {
		meetingUids = "0"
	} else {
		//过滤字段
		slice := strings.Split(meetingUids, ",")
		meetingUids = ""
		for _, v := range slice {
			if v != "" {
				meetingUids += v + ","
				userId, _ := strconv.Atoi(v)
				if userId > 0 {
					userIdArr = append(userIdArr, userId)
					newMeetingUserid[userId] = true
				}
			}
		}
		meetingUids = strings.TrimRight(meetingUids, ",")
	}
	activityId := req.ActivityId
	activityInfo, err := cygx.GetAddActivityInfoSpecialById(activityId)
	if err != nil {
		br.Msg = "活动不存在"
		br.ErrMsg = "活动ID错误,Err:activityId:" + strconv.Itoa(activityId)
		return
	}
	//校验活动后台管理员、销售是否有修改权限
	havePower, popupMsg, err := cygxService.CheckActivitySpecialUpdatePower(AdminUser.AdminId, activityInfo)
	if err != nil {
		br.Msg = "获取管理员身份信息失败"
		br.ErrMsg = "获取管理员身份信息失败,Err:" + err.Error()
		return
	}
	if !havePower {
		br.Msg = popupMsg
		return
	}
	noMeetingUids, err := cygx.GetSpecialTripUserIds(activityId, meetingUids) //未到会的用户ID
	if err != nil {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
		return
	}
	var allUids string
	if len(noMeetingUids) > 0 {
		allUids = noMeetingUids + "," + meetingUids
	} else {
		allUids = meetingUids
	}
	listUser, err := cygx.GetUserAndCompanyNameListByUids(allUids)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取数据失败,Err:" + err.Error()
		return
	}
	UserMap, err := cygxService.GetSpecialTripUserMap(activityId)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}

	var condition string
	var pars []interface{}
	condition += " AND is_meeting = 1  AND  activity_id = ? "
	pars = append(pars, activityId)
	listOldMeetingDetail, err := cygx.GetCygxActivitySpecialMeetingDetailList(condition, pars)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取失败"
		br.ErrMsg = "GetCygxActivitySpecialMeetingDetailList,Err:" + err.Error()
		return
	}
	//获取之前已经到会的人
	//var oldMeetingUserid = make(map[int]bool)

	pars = make([]interface{}, 0)
	condition = "  AND  activity_id = ? "
	pars = append(pars, activityId)
	listTripBill, err := cygx.GetCygxActivitySpecialTripBill(condition, pars)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取失败"
		br.ErrMsg = "GetCygxActivitySpecialTripBill,Err:" + err.Error()
		return
	}
	//获取用户最后一次的扣点状态
	mapUserLastTripBill := make(map[int]*cygx.CygxActivitySpecialTripBill)
	for _, v := range listTripBill {
		mapUserLastTripBill[v.UserId] = v
	}

	var items []*cygx.CygxActivitySpecialMeetingDetail
	var itemsBill []*cygx.CygxActivitySpecialTripBill
	if len(listOldMeetingDetail) > 0 {
		for _, v := range listOldMeetingDetail {
			if mapUserLastTripBill[v.UserId] == nil {
				continue
			}
			//如果上一次空降的用户,这一次提交的时候没有带入,而且还被扣点了,那么就进行返点处理
			if !newMeetingUserid[v.UserId] && v.IsAirborne == 1 && mapUserLastTripBill[v.UserId].BillDetailed < 0 {
				var itemBill = new(cygx.CygxActivitySpecialTripBill)
				//流水记录表
				itemBill.UserId = v.UserId
				itemBill.ActivityId = activityInfo.ActivityId
				itemBill.CreateTime = time.Now()
				itemBill.Mobile = v.Mobile
				itemBill.Email = v.Email
				itemBill.CompanyId = v.CompanyId
				itemBill.CompanyName = v.CompanyName
				itemBill.RealName = v.RealName
				itemBill.Source = 2
				itemBill.DoType = 2
				itemBill.BillDetailed = 1 // 流水加一
				itemBill.RegisterPlatform = 1
				itemBill.ChartPermissionId = activityInfo.ChartPermissionId
				itemBill.ChartPermissionName = activityInfo.ChartPermissionName
				itemBill.AdminId = AdminUser.AdminId
				itemBill.Way = 2
				userType, tripRemaining, mapChartName, err := cygxService.GetChartPermissionSpecialSurplusByCompany(v.CompanyId)
				if err != nil {
					br.Msg = "获取专项调研剩余次数失败"
					br.ErrMsg = "获取专项调研剩余次数失败,err:" + err.Error()
					return
				}
				if userType == 2 {
					tripRemaining += itemBill.BillDetailed
					itemBill.Total = strconv.Itoa(tripRemaining) + "次"
				} else {
					for k, num := range mapChartName {
						if activityInfo.ChartPermissionName == k {
							num += itemBill.BillDetailed
						}
						itemBill.Total += k + strconv.Itoa(num) + "次+"
					}
					itemBill.Total = strings.TrimRight(itemBill.Total, "+")
				}
				itemsBill = append(itemsBill, itemBill)
			}
		}
	}

	for _, v := range listUser {
		var item = new(cygx.CygxActivitySpecialMeetingDetail)
		item.UserId = v.UserId
		item.ActivityId = activityId
		item.CreateTime = time.Now()
		item.Mobile = v.Mobile
		item.Email = v.Email
		item.CompanyId = v.CompanyId
		item.CompanyName = v.CompanyName
		item.IsMeeting = 1
		item.RealName = v.RealName
		//添加空降人员字段
		if _, ok := UserMap[v.UserId]; !ok {
			item.IsAirborne = 1
		}
		var itemBill = new(cygx.CygxActivitySpecialTripBill)
		//如果是空降客户,(没有扣点记录,或者上一次的流水不为负) 就进行扣点处理
		if item.IsAirborne == 1 && (mapUserLastTripBill[v.UserId] == nil || mapUserLastTripBill[v.UserId].BillDetailed >= 0) {
			//流水记录表
			itemBill.UserId = v.UserId
			itemBill.ActivityId = activityInfo.ActivityId
			itemBill.CreateTime = time.Now()
			itemBill.Mobile = v.Mobile
			itemBill.Email = v.Email
			itemBill.CompanyId = v.CompanyId
			itemBill.CompanyName = v.CompanyName
			itemBill.RealName = v.RealName
			itemBill.Source = 2
			itemBill.DoType = 1
			itemBill.BillDetailed = -1 // 流水减一
			itemBill.RegisterPlatform = 1
			itemBill.ChartPermissionId = activityInfo.ChartPermissionId
			itemBill.ChartPermissionName = activityInfo.ChartPermissionName
			itemBill.AdminId = AdminUser.AdminId
			itemBill.Way = 2
			userType, tripRemaining, mapChartName, err := cygxService.GetChartPermissionSpecialSurplusByCompany(v.CompanyId)
			if err != nil {
				br.Msg = "获取专项调研剩余次数失败"
				br.ErrMsg = "获取专项调研剩余次数失败,err:" + err.Error()
				return
			}
			if userType == 2 {
				tripRemaining -= 1
				itemBill.Total = strconv.Itoa(tripRemaining) + "次"
			} else {
				for k, num := range mapChartName {
					if activityInfo.ChartPermissionName == k {
						num -= 1
					}
					itemBill.Total += k + strconv.Itoa(num) + "次+"
				}
				itemBill.Total = strings.TrimRight(itemBill.Total, "+")
			}
			itemsBill = append(itemsBill, itemBill)
		}
		items = append(items, item)
	}
	err = cygx.MeetingDopecialMeet(meetingUids, noMeetingUids, activityId, items, itemsBill)
	if err != nil {
		br.Msg = "操作失败"
		br.ErrMsg = "操作失败,Err:" + err.Error()
		return
	}
	go cygxService.ActivitySpecialUserLabelLogAdd(activityId, userIdArr)
	//添加操作日志记录
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
	br.IsAddLog = true
}

// @Title 修改外呼号码
// @Description 修改外呼号码接口
// @Param	request	body cygx.OutboundMobileEditResp true "type json string"
// @Success 200 操作成功
// @router /special/trip/outboundMobileEdit [post]
func (this *ActivitySpecialTripCoAntroller) OutboundMobileEdit() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	var req cygx.OutboundMobileEditResp
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	id := req.Id
	outboundMobile := req.OutboundMobile
	countryCode := req.CountryCode
	err = cygx.SpecialTripOutboundMobileEdit(id, outboundMobile, countryCode)
	if err != nil {
		br.Msg = "修改失败"
		br.ErrMsg = "修改失败 Err:" + err.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
	br.IsAddLog = true
}

// @Title 模版消息发送客户类型列表
// @Description 模版消息发送客户类型列表接口
// @Success Ret=200
// @router /special/trip/tempMsg/sendGroupList [get]
func (this *ActivitySpecialTripCoAntroller) SendGroupList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	AdminUser := this.SysUser
	if AdminUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	list := make([]cygx.SendGroup, 0)
	list = append(list, cygx.SendGroup{
		Id:   1,
		Name: "已报名客户",
	})
	br.Ret = 200
	br.Success = true
	br.Data = list
}

// @Title 发送模版消息
// @Description 发送模版消息接口
// @Param	request	body cygx.AddOutboundPersonnelItm true "type json string"
// @Success 200 操作成功
// @router /special/trip/tempMsg [post]
func (this *ActivitySpecialTripCoAntroller) TempMsg() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	AdminUser := this.SysUser
	if AdminUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	var req cygx.ActivitySpecialSignupTempMsgReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	idSlice := strings.Split(req.ActivityIds, ",")
	for _, sId := range idSlice {
		id, e := strconv.Atoi(sId)
		if e != nil {
			br.Msg = "活动Id参数异常"
			br.ErrMsg = "参数解析异常, Err:" + e.Error()
			return
		}
		var openIdList []*cygx.OpenIdList
		idMap := make(map[string]string, 0)
		//1已报名
		if strings.Contains(req.SendGroup, "1") {
			listSignup, err := cygx.GetCygxActivitySpecialTripListByActivityId(id)
			if err != nil {
				br.Msg = "查询报名信息失败失败"
				br.ErrMsg = "GetCygxActivitySpecialTripListByActivityId,Err:" + err.Error()
				return
			}
			if len(listSignup) == 0 {
				continue
			}
			var mobileArr []string
			for _, v := range listSignup {
				if v.Mobile != "" {
					mobileArr = append(mobileArr, v.Mobile)
				}
			}
			mobileLen := len(mobileArr)
			var condition string
			var pars []interface{}
			if mobileLen > 0 {
				condition += ` AND u.mobile IN (` + utils.GetOrmInReplace(mobileLen) + `)`
				pars = append(pars, mobileArr)
			}
			//list, err := models.GetActivitySpecialOpenIdListMobile(condition, pars)
			//if err != nil {
			//	br.Msg = "查询openId失败"
			//	br.ErrMsg = "查询openId失败,Err:" + err.Error()
			//	return
			//}

			if mobileLen == 0 {
				return
			}
			list, err := cygx.GetUserRecordListByMobileArr(mobileArr)
			for _, idList := range list {
				openIdList = append(openIdList, idList)
				idMap[idList.OpenId] = idList.OpenId
			}
		}

		if len(openIdList) > 0 {
			openIdArr := make([]string, len(openIdList))
			for i, v := range openIdList {
				openIdArr[i] = v.OpenId
			}
			sendInfo := new(services.SendWxTemplate)
			sendInfo.Keyword1 = req.ResearchTheme
			sendInfo.Keyword2 = req.Content
			sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
			sendInfo.RedirectUrl = utils.WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL + strconv.Itoa(id)
			if utils.RunMode == "debug" {
				sendInfo.RedirectUrl = utils.WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL + strconv.Itoa(110) //测试环境调正式的ID
			}
			sendInfo.RedirectTarget = 3
			sendInfo.Resource = strconv.Itoa(id)
			sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_CUSTOMIZE
			sendInfo.OpenIdArr = openIdArr
			e = services.SendTemplateMsg(sendInfo)
			if e != nil {
				br.Msg = "推送模板消息失败!"
				br.ErrMsg = "参数解析失败,Err:" + e.Error()
				return
			}
		}
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "发送成功"
}