package controllers

import (
	"encoding/json"
	"fmt"
	"hongze/hz_crm_api/models"
	"hongze/hz_crm_api/models/company"
	"hongze/hz_crm_api/services"
	"hongze/hz_crm_api/utils"
	"strconv"
	"strings"
	"time"
)

// 客户权限管理
type CompanyPermissionController struct {
	BaseAuthController
}

// List
// @Title 获取权限设置基础信息
// @Description 获取权限设置基础信息接口
// @Param   CompanyType   query   string  true       "客户类型:传空字符串或者不传为全部,'ficc','权益'"
// @Param   CompanyStatus   query   string  true       "客户状态"
// @Param   NoUpgrade   query   bool  false       "是否不展示升级权限,默认为 false"
// @Param   IsShowYanXuanKouDian   query   bool  false       "是否展示研选扣点包,默认为 false"
// @Success 200 {object} company.PermissionSetResp
// @router /permission/list [get]
func (this *CompanyPermissionController) List() {
	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"
		br.Ret = 408
		return
	}
	// Tips:目前这个接口权益在添加客户、申请转正、领取客户、续约申请均有用到

	companyType := this.GetString("CompanyType")
	noUpgrade, _ := this.GetBool("NoUpgrade", false)                       // 添加客户、领取客户=true; 申请转正、续约申请=false
	isShowYanXuanKouDian, _ := this.GetBool("IsShowYanXuanKouDian", false) // 是否展示研选扣点
	companyStatus := this.GetString("CompanyStatus")                       // 客户状态
	if strings.Contains(companyStatus, utils.COMPANY_STATUS_X_CLASS_TRY_OUT) || strings.Contains(companyStatus, utils.COMPANY_STATUS_FOREVER) {
		companyStatus = utils.COMPANY_STATUS_FOREVER
	}
	var productId int
	resp := new(company.PermissionSetResp)

	roleTypeCode := sysUser.RoleTypeCode
	productId = services.GetProductId(roleTypeCode)

	// FICC
	if productId == utils.COMPANY_PRODUCT_FICC_ID || companyType == utils.COMPANY_PRODUCT_FICC_NAME {
		items, err := company.GetPermissionByProductId(utils.COMPANY_PRODUCT_FICC_ID)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
			return
		}
		permissionMap := make(map[int][]*company.PermissionSetItem, 0)
		permissionCheckMap := make(map[int][]int, 0)
		for _, v := range items {
			if v.ParentId > 0 {
				permissionMap[v.ParentId] = append(permissionMap[v.ParentId], v)
				if v.IsPublic == 1 {
					permissionCheckMap[v.ParentId] = append(permissionCheckMap[v.ParentId], v.ChartPermissionId)
				}
			}
		}
		for _, v := range items {
			if v.ParentId == 0 {
				p := new(company.PermissionSetList)
				p.Items = make([]*company.PermissionSetItem, 0)
				p.CheckList = make([]int, 0)
				p.ClassifyName = v.PermissionName

				if subList, ok := permissionMap[v.ChartPermissionId]; ok {
					p.Items = subList
				}

				if checkList, ok := permissionCheckMap[v.ChartPermissionId]; ok {
					p.CheckList = checkList
				}
				resp.List = append(resp.List, p)
			}
		}

		br.Ret = 200
		br.Success = true
		br.Msg = "获取成功"
		br.Data = resp
		return
	}

	// 权益
	if productId == utils.COMPANY_PRODUCT_RAI_ID || companyType == utils.COMPANY_PRODUCT_RAI_NAME {
		p := new(company.PermissionSetList)
		items, err := company.GetPermissionSetItemsByType(utils.COMPANY_PRODUCT_RAI_ID, utils.COMPANY_PRODUCT_RAI_NAME)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
			return
		}
		filterPermissionName := []string{"专家", "路演服务", "调研"} // 需要过滤不展示的行业
		if isShowYanXuanKouDian {
			filterPermissionName = []string{"专家"} //申请转正,或者申请续约的时候 调研 行业需要进行展示
		}

		// 原始版的权限
		if noUpgrade {
			for _, v := range items {
				if !isShowYanXuanKouDian && v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
					continue
				}
				if utils.InArrayByStr(filterPermissionName, v.PermissionName) {
					continue
				}
				p.Items = append(p.Items, v)
			}
		}

		// 展示升级权限, 需要有套餐的展示, 行业可能需要拆分主客观, 买方研选需要分为3w和5w两种
		if !noUpgrade {
			//判断是不是永续类型的客户
			if companyStatus == utils.COMPANY_STATUS_FOREVER {
				filterPermissionName = []string{"专家", "路演服务", "调研", "研选订阅", "研选扣点包"} //权益的永续客户这些不展示
				for _, v := range items {
					if utils.InArrayByStr(filterPermissionName, v.PermissionName) {
						continue
					}
					p.Items = append(p.Items, v)
				}
			} else {
				p.Items = append(p.Items, &company.PermissionSetItem{
					PermissionName: utils.CHART_PERMISSION_NAME_45W,
				}, &company.PermissionSetItem{
					PermissionName: utils.CHART_PERMISSION_NAME_70W,
				})

				// 是否为内部人员
				isRai, e := services.CheckRaiAdmin(sysUser.AdminId)
				if e != nil {
					br.Msg = "获取失败"
					br.ErrMsg = "判断是否为权益内部人员失败, GetRaiAdmin Err: " + e.Error()
					return
				}

				// 获取行业主客观权限ID
				childSubMap, childObjMap := make(map[string]int), make(map[string]int)
				{
					permissions, e := models.GetChartPermissionList()
					if e != nil {
						br.Msg = "获取失败"
						br.ErrMsg = "获取权限列表失败, GetChartPermissionList Err: " + e.Error()
						return
					}
					for _, v := range permissions {
						if !strings.Contains("医药消费科技智造", v.PermissionName) {
							continue
						}
						if strings.Contains(v.Remark, "主观") {
							childSubMap[v.PermissionName] = v.ChartPermissionId
							continue
						}
						childObjMap[v.PermissionName] = v.ChartPermissionId
					}
				}
				for _, v := range items {
					if !isShowYanXuanKouDian && v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
						continue
					}
					if utils.InArrayByStr(filterPermissionName, v.PermissionName) {
						continue
					}
					// 处理四大行业的升级展示
					if strings.Contains("医药消费科技智造", v.PermissionName) {
						// 内部人员需要拆分主客观权限
						if isRai {
							v.Child = make([]*company.PermissionSetItem, 0)
							v.Child = append(v.Child, &company.PermissionSetItem{
								ChartPermissionId: childSubMap[v.PermissionName],
								PermissionName:    "主观",
								PermissionType:    1,
							}, &company.PermissionSetItem{
								ChartPermissionId: childObjMap[v.PermissionName],
								PermissionName:    "客观",
								PermissionType:    2,
							})
						}
						p.Items = append(p.Items, v)

						t := new(company.PermissionSetItem)
						t.ChartPermissionId = v.ChartPermissionId + utils.PERMISSION_ID_UPGRADE
						t.PermissionName = v.PermissionName + "(升级)"
						t.PermissionType = v.PermissionType
						t.Checked = v.Checked
						p.Items = append(p.Items, t)
						continue
					}

					// 买方研选划分为3w和5w,10W三种
					//if v.PermissionName == utils.CHART_PERMISSION_NAME_MF_YANXUAN {
					//	m3, m5, m10 := new(company.PermissionSetItem), new(company.PermissionSetItem), new(company.PermissionSetItem)
					//	m3.ChartPermissionId = v.ChartPermissionId
					//	m3.PermissionName = fmt.Sprint(v.PermissionName, "(3w)")
					//	p.Items = append(p.Items, m3)
					//
					//	m5.ChartPermissionId = v.ChartPermissionId + utils.PERMISSION_ID_YANXUAN_DIFF
					//	m5.PermissionName = fmt.Sprint(v.PermissionName, "(5w)")
					//	p.Items = append(p.Items, m5)
					//
					//	m10.ChartPermissionId = utils.PERMISSION_ID_YANXUAN_10W_DIFF
					//	m10.PermissionName = fmt.Sprint(v.PermissionName, "(10w)")
					//	p.Items = append(p.Items, m10)
					//	continue
					//}

					p.Items = append(p.Items, v)
				}
			}
		}

		p.ClassifyName = utils.COMPANY_PRODUCT_RAI_NAME
		p.CheckList = make([]int, 0)
		resp.List = append(resp.List, p)
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 获取合同列表的权限设置基础信息
// @Description 获取权限设置基础信息接口
// @Param   CompanyType   query   string  true       "客户类型:传空字符串或者不传为全部,'ficc','权益'"
// @Success 200 {object} company.PermissionSetResp
// @router /contract_permission/list [get]
func (this *CompanyPermissionController) ListByContract() {
	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"
		br.Ret = 408
		return
	}

	companyType := this.GetString("CompanyType")

	var productId int
	resp := new(company.PermissionSetResp)

	roleTypeCode := sysUser.RoleTypeCode
	productId = services.GetProductId(roleTypeCode)
	if productId == 1 || companyType == utils.COMPANY_PRODUCT_FICC_NAME {
		allFiccPermissions, err := company.GetPermissionByProductId(utils.COMPANY_PRODUCT_FICC_ID)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
			return
		}
		permissionMap := make(map[int][]*company.PermissionSetItem, 0)
		permissionCheckMap := make(map[int][]int, 0)
		for _, v := range allFiccPermissions {
			if v.ParentId > 0 {
				permissionMap[v.ParentId] = append(permissionMap[v.ParentId], v)
				if v.IsPublic == 1 {
					permissionCheckMap[v.ParentId] = append(permissionCheckMap[v.ParentId], v.ChartPermissionId)
				}
			}
		}
		for _, v := range allFiccPermissions {
			if v.ParentId == 0 {
				//合同这边市场策略不需要体现出来,所以调整返回
				if v.PermissionName == "市场策略" {
					continue
				}
				p := new(company.PermissionSetList)
				p.Items = make([]*company.PermissionSetItem, 0)
				p.CheckList = make([]int, 0)
				p.ClassifyName = v.PermissionName
				if subList, ok := permissionMap[v.ChartPermissionId]; ok {
					p.Items = subList
				}
				if checkList, ok := permissionCheckMap[v.ChartPermissionId]; ok {
					p.CheckList = checkList
				}
				resp.List = append(resp.List, p)
			}
		}
	} else if productId == 2 {
		checkList := make([]int, 0)
		v := "权益"
		p := new(company.PermissionSetList)
		p.ClassifyName = v
		items, err := company.GetPermissionSetItems(productId, v)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
			return
		}
		p.Items = items
		p.CheckList = checkList
		resp.List = append(resp.List, p)
	} else {
		if companyType != utils.COMPANY_PRODUCT_FICC_NAME {
			v := "权益"
			checkList := make([]int, 0)
			p := new(company.PermissionSetList)
			p.ClassifyName = v
			items, err := company.GetPermissionSetItems(2, v)
			if err != nil {
				br.Msg = "获取失败"
				br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
				return
			}
			p.Items = items
			p.CheckList = checkList
			resp.List = append(resp.List, p)
		}
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 查看客户权限
// @Description 查看客户权限接口
// @Param   CompanyId   query   int  true       "客户id"
// @Param   LookType   query   int  true       "调用类型:1增开试用,0其他"
// @Success 200 {object} company.PermissionLookResp
// @router /permission/look [get]
func (this *CompanyPermissionController) PermissionLook() {
	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"
		br.Ret = 408
		return
	}
	roleTypeCode := sysUser.RoleTypeCode
	companyId, _ := this.GetInt("CompanyId")
	if companyId <= 0 {
		br.Msg = "参数错误"
		br.ErrMsg = "参数错误,CompanyId 小于等于0 "
		return
	}
	lookType, _ := this.GetInt("LookType")

	productId := services.GetProductId(roleTypeCode)

	resp := new(company.PermissionLookResp)
	permissionArr := make([]*models.ChartPermission, 0)
	var err error
	if lookType == 1 {
		permissionArr, err = services.GetPermissionFirstArr(productId)
	} else {
		permissionArr, err = services.GetPermissionFirstArr(0)
	}
	if err != nil {
		br.Msg = "获取权限失败"
		br.ErrMsg = "获取权限失败 err:" + err.Error()
		return
	}
	//ficc权限类目
	for _, v := range permissionArr {
		checkList := make([]int, 0)
		p := new(company.PermissionLookList)
		p.Items = make([]*company.PermissionLookItem, 0)
		var productId int
		//if v == "权益" {
		//	productId = 2
		//} else {
		//	productId = 1
		//}
		if v.PermissionName != "权益" {
			productId = 1
			//mapPermissionName := make(map[string]int)
			items, err := company.GetPermissionLookItemsByParentId(productId, v.ChartPermissionId)
			if err != nil {
				br.Msg = "获取失败"
				br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
				return
			}
			itemLen := len(items)
			permissionList := make([]*company.PermissionLookItem, 0)
			for i := 0; i < itemLen; i++ {
				var isAdd bool
				item := items[i]
				permission, err := company.GetCompanyPermissionCheckItem(companyId, item.ChartPermissionId)
				if err != nil && err.Error() != utils.ErrNoRow() {
					br.Msg = "获取失败"
					br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
					return
				}
				if permission != nil && permission.ChartPermissionId > 0 {
					items[i].StartDate = permission.StartDate
					items[i].EndDate = permission.EndDate
					items[i].Status = permission.Status
					//判断主观、客观
					if items[i].PermissionType == 1 {
						items[i].PermissionTypeName = "主观"
					} else if items[i].PermissionType == 2 {
						items[i].PermissionTypeName = "客观"
					}
					checkList = append(checkList, item.ChartPermissionId)
					isAdd = true
					////如果主观客观 都有,则不显示类型,如果只有一种就显示主观,或者客观
					//if mapPermissionName[items[i].PermissionName] == 0 {
					//	checkList = append(checkList, item.ChartPermissionId)
					//	mapPermissionName[items[i].PermissionName] = i + 1
					//
					//} else {
					//	items[mapPermissionName[items[i].PermissionName]-1].PermissionTypeName = ""
					//}
				}
				endDateTime, _ := time.Parse(utils.FormatDate, item.EndDate)
				endDateTime = endDateTime.AddDate(0, 0, 1)
				sub := endDateTime.Sub(time.Now())
				if sub < 0 {
					sub = 0
				}
				expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
				items[i].ExpireDay = expireDay
				items[i].ClassifyName = v.PermissionName
				if lookType == 1 {
					permissionList = append(permissionList, items[i])
				} else {
					if isAdd {
						permissionList = append(permissionList, items[i])
					}
				}
			}
			//合并主观客观
			mapPermissionNameList := make(map[string]int)
			for _, v := range permissionList {
				if mapPermissionNameList[v.PermissionName] == 0 {
					p.Items = append(p.Items, v)
					mapPermissionNameList[v.PermissionName] = v.ChartPermissionId
				}
			}
			p.ClassifyName = v.PermissionName
			//p.Items = permissionList
			p.CheckList = checkList
			if lookType == 1 {
				resp.List = append(resp.List, p)
			} else {
				if len(checkList) > 0 {
					resp.List = append(resp.List, p)
				}
			}
		}
	}

	var filterPermissionName []string
	if lookType == 1 {
		filterPermissionName = []string{"专家", "路演服务", "研选扣点包", "调研"}
	} else {
		filterPermissionName = []string{"调研"}
	}
	//权益权限类目
	for _, v := range permissionArr {

		if v.PermissionName == "权益" {
			// CRM8.8-权益权限列表调用较多、统一进行调整
			unify := false
			if lookType == 1 {
				unify = true
			}
			p, e := services.RaiCompanyPermissionAndCheckList(companyId, unify, filterPermissionName)
			if e != nil {
				br.Msg = "获取客户权益权限列表信息失败"
				br.ErrMsg = "获取客户权益权限列表信息失败,Err:" + e.Error()
				return
			}

			if lookType == 1 {
				resp.ListRai = append(resp.ListRai, p)
			} else {
				if len(p.CheckList) > 0 {
					resp.ListRai = append(resp.ListRai, p)
				}
			}
		}
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 查看客户权限(主观客观)(该接口暂已弃用-2022-0826)
// @Description 查看客户权限接口(主观客观)
// @Param   CompanyId   query   int  true       "客户id"
// @Param   LookType   query   int  true       "调用类型:1增开试用,0其他"
// @Success 200 {object} company.PermissionLookSandoResp
// @router /permission/lookSando [get]
func (this *CompanyPermissionController) PermissionLookSando() {
	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"
		br.Ret = 408
		return
	}
	roleTypeCode := sysUser.RoleTypeCode
	companyId, _ := this.GetInt("CompanyId")
	if companyId <= 0 {
		br.Msg = "参数错误"
		br.ErrMsg = "参数错误,CompanyId 小于等于0 "
		return
	}
	lookType, _ := this.GetInt("LookType")

	productId := services.GetProductId(roleTypeCode)

	resp := new(company.PermissionLookSandoResp)
	permissionArr := []string{}
	if lookType == 1 {
		if productId == 1 {
			for _, permission := range utils.PermissionFiccClassifyArr {
				permissionArr = append(permissionArr, permission)
			}
		} else if productId == 2 {
			permissionArr = []string{"权益"}
		} else {
			for _, permission := range utils.PermissionAllClassifyArr {
				permissionArr = append(permissionArr, permission)
			}
		}
	} else {
		for _, permission := range utils.PermissionAllClassifyArr {
			permissionArr = append(permissionArr, permission)
		}
	}
	//ficc权限类目
	if productId == 1 {
		for _, v := range permissionArr {
			checkList := make([]int, 0)
			p := new(company.PermissionLookList)
			var productId int
			productId = 1
			items, err := company.GetPermissionLookItems(productId, v)
			if err != nil {
				br.Msg = "获取失败"
				br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
				return
			}
			itemLen := len(items)
			permissionList := make([]*company.PermissionLookItem, 0)
			for i := 0; i < itemLen; i++ {
				var isAdd bool
				item := items[i]
				permission, err := company.GetCompanyPermissionCheckItem(companyId, item.ChartPermissionId)
				if err != nil && err.Error() != utils.ErrNoRow() {
					br.Msg = "获取失败"
					br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
					return
				}

				if permission != nil && permission.ChartPermissionId > 0 {
					checkList = append(checkList, item.ChartPermissionId)
					items[i].StartDate = permission.StartDate
					items[i].EndDate = permission.EndDate
					items[i].Status = permission.Status
					isAdd = true
				}
				endDateTime, _ := time.Parse(utils.FormatDate, item.EndDate)
				endDateTime = endDateTime.AddDate(0, 0, 1)
				sub := endDateTime.Sub(time.Now())
				if sub < 0 {
					sub = 0
				}
				expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
				items[i].ExpireDay = expireDay
				items[i].ClassifyName = v
				if lookType == 1 {
					permissionList = append(permissionList, items[i])
				} else {
					if isAdd {
						permissionList = append(permissionList, items[i])
					}
				}
			}
			p.ClassifyName = v
			p.Items = permissionList
			p.CheckList = checkList
			if lookType == 1 {
				resp.List = append(resp.List, p)
			} else {
				if len(checkList) > 0 {
					resp.List = append(resp.List, p)
				}
			}
		}
	}
	//权益权限类目
	for _, v := range permissionArr {

		productId = 2
		if v == "权益" {
			v := "权益"
			checkList := make([]int, 0)
			p := new(company.PermissionLookList)
			pListType := new(company.PermissionSetListType)
			p.ClassifyName = v
			pListType.ClassifyName = v
			items, err := company.GetPermissionSetSandoItems(2, v)
			if err != nil {
				br.Msg = "获取失败"
				br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
				return
			}
			itemLen := len(items)
			//permissionList := make([]*company.PermissionLookItem, 0)
			for i := 0; i < itemLen; i++ {
				//var isAdd bool
				item := items[i]
				permission, err := company.GetCompanyPermissionCheckItem(companyId, item.ChartPermissionId)
				if err != nil && err.Error() != utils.ErrNoRow() {
					br.Msg = "获取失败"
					br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
					return
				}

				if permission != nil && permission.ChartPermissionId > 0 {
					checkList = append(checkList, item.ChartPermissionId)
					items[i].StartDate = permission.StartDate
					items[i].EndDate = permission.EndDate
					items[i].Status = permission.Status
					items[i].Checked = true
				}
				if items[i].PermissionType == 1 {
					items[i].PermissionTypeName = "主观"
				} else if items[i].PermissionType == 2 {
					items[i].PermissionTypeName = "客观"
				}
				endDateTime, _ := time.Parse(utils.FormatDate, item.EndDate)
				endDateTime = endDateTime.AddDate(0, 0, 1)
				sub := endDateTime.Sub(time.Now())
				if sub < 0 {
					sub = 0
				}
				expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
				items[i].ExpireDay = expireDay
				items[i].ClassifyName = v
			}
			//itemsType, err := company.GetPermissionSetItemsType(2, v)
			//if err != nil {
			//	br.Msg = "获取失败"
			//	br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
			//	return
			//}
			//mapChartPermission := make(map[string]int)
			//pType := new(company.PermissionSetItemType)
			//for i, val := range itemsType {
			//	if mapChartPermission[val.PermissionName] == 0 {
			//		mapChartPermission[val.PermissionName] = val.ChartPermissionId
			//		pType = new(company.PermissionSetItemType)
			//		pType.PermissionName = val.PermissionName
			//	}
			//	pType.Items = append(pType.Items, val)
			//
			//	item := itemsType[i]
			//	permission, err := company.GetCompanyPermissionCheckItem(companyId, item.ChartPermissionId)
			//	if err != nil && err.Error() != utils.ErrNoRow() {
			//		br.Msg = "获取失败"
			//		br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
			//		return
			//	}
			//	if permission != nil && permission.ChartPermissionId > 0 {
			//		checkList = append(checkList, item.ChartPermissionId)
			//		itemsType[i].StartDate = permission.StartDate
			//		itemsType[i].EndDate = permission.EndDate
			//		itemsType[i].Status = permission.Status
			//		itemsType[i].Checked = true
			//		endDateTime, _ := time.Parse(utils.FormatDate, item.EndDate)
			//		endDateTime = endDateTime.AddDate(0, 0, 1)
			//		sub := endDateTime.Sub(time.Now())
			//		if sub < 0 {
			//			sub = 0
			//		}
			//		expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
			//		itemsType[i].ExpireDay = expireDay
			//	}
			//	//判断主观、客观
			//	if itemsType[i].PermissionType == 1 {
			//		itemsType[i].PermissionTypeName = "主观"
			//	} else if itemsType[i].PermissionType == 2 {
			//		itemsType[i].PermissionTypeName = "客观"
			//	}
			//	itemsType[i].ClassifyName = v
			//	//处理权限分类是否打钩
			//	//if len(pType.Items) == 2 {
			//	//	var checkedMinateBool bool
			//	//	pType.Checked = true
			//	//	for _, pv := range pType.Items {
			//	//		if pv.Checked == false {
			//	//			pType.Checked = false
			//	//		} else {
			//	//			checkedMinateBool = true
			//	//			pType.NoClicking = true
			//	//		}
			//	//	}
			//	//	if checkedMinateBool == true && pType.Checked == false {
			//	//		pType.CheckedMinate = true
			//	//	}
			//	//	pListType.Items = append(pListType.Items, pType)
			//	//}
			//}

			//合并主观客观
			mapPermissionName := make(map[string]int)
			for _, v := range items {
				if mapPermissionName[v.PermissionName] == 0 {
					p.Items = append(p.Items, v)
					mapPermissionName[v.PermissionName] = v.ChartPermissionId
				}
			}
			p.CheckList = checkList
			pListType.CheckList = checkList
			resp.List = append(resp.List, p)
			//resp.ListType = append(resp.ListType, pListType)
		}
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 品种
// @Description 品种接口
// @Param   CompanyType   query   string  true       "客户类型:传空字符串或者不传为全部,'ficc','权益'"
// @Success 200 {object} company.PermissionVarietyResp
// @router /permission/variety [get]
func (this *CompanyPermissionController) PermissionVariety() {
	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"
		br.Ret = 408
		return
	}

	companyType := this.GetString("CompanyType")

	var productId int
	resp := new(company.PermissionVarietyResp)

	roleTypeCode := sysUser.RoleTypeCode
	if roleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
		productId = 2
	} else if roleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER || roleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN {
		productId = 1
	} else {
		productId = 0
	}

	if productId == 1 || companyType == utils.COMPANY_PRODUCT_FICC_NAME {
		permissionFirst, e := services.GetPermissionFirstArr(utils.COMPANY_PRODUCT_FICC_ID)
		if e != nil {
			br.Msg = "获取权限信息失败"
			br.ErrMsg = "获取权限信息失败,Err:" + e.Error()
			return
		}
		allFiccPermissions, e := company.GetPermissionVarietyItemsByProductId(utils.COMPANY_PRODUCT_FICC_ID)
		if e != nil {
			br.Msg = "获取权限信息失败"
			br.ErrMsg = "获取权限信息失败,Err:" + e.Error()
			return
		}
		permissionMap := make(map[int][]*company.PermissionVarietyItem, 0)
		for _, v := range allFiccPermissions {
			permissionMap[v.ParentId] = append(permissionMap[v.ParentId], v)
		}
		for _, v := range permissionFirst {
			p := new(company.PermissionVarietyList)
			p.ClassifyName = v.ClassifyName
			p.ChartPermissionId = v.ChartPermissionId + 100
			items, ok := permissionMap[v.ChartPermissionId]
			if ok {
				p.Items = items
			}
			resp.List = append(resp.List, p)
		}
		/*for k, v := range utils.PermissionFiccClassifyArr {
			p := new(company.PermissionVarietyList)
			p.ClassifyName = v
			p.ChartPermissionId = k + 100
			items, err := company.GetPermissionVarietyItems(productId, v)
			if err != nil {
				br.Msg = "获取失败"
				br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
				return
			}
			p.Items = items
			resp.List = append(resp.List, p)
		}*/
	} else if productId == 2 {
		v := "权益"
		p := new(company.PermissionVarietyList)
		p.ClassifyName = v
		p.ChartPermissionId = 105
		items, err := company.GetPermissionVarietyItems(productId, v)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
			return
		}
		p.Items = items
		resp.List = append(resp.List, p)
	} else {
		if companyType == utils.COMPANY_PRODUCT_RAI_NAME {
			v := "权益"
			p := new(company.PermissionVarietyList)
			p.ClassifyName = v
			p.ChartPermissionId = 105
			items, err := company.GetPermissionVarietyItems(2, v)
			if err != nil {
				br.Msg = "获取失败"
				br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
				return
			}
			p.Items = items
			resp.List = append(resp.List, p)
		}
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 新增试用权限
// @Description 新增试用权限
// @Param	request	body company.PermissionAddTryOutReq true "type json string"
// @Success Ret=200
// @router /permission/add/try/out [post]
func (this *CompanyPermissionController) PermissionAddTryOut() {
	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"
		br.Ret = 408
		return
	}
	var req company.PermissionAddTryOutReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	if req.ChartPermissionId == "" {
		br.Msg = "请选择权限"
		br.ErrMsg = "请选择权限"
		return
	} else {
		// CRM8.8-取消增开试用这里的主客观默认同时开启
		//permissionStr, err := company.GetPermissionIdById(req.ChartPermissionId)
		//if err != nil {
		//	br.Msg = "获取信息失败"
		//	br.ErrMsg = "获取主观客观权限信息失败,Err:" + err.Error()
		//	return
		//}
		//req.ChartPermissionId = permissionStr
	}
	if req.CompanyId <= 0 {
		br.Msg = "参数错误"
		return
	}
	roleTypeCode := sysUser.RoleTypeCode
	product := services.GetProductId(roleTypeCode)
	if product == 0 {
		br.Msg = "无权新开试用权限"
		br.ErrMsg = "无权新开试用权限"
		return
	}
	companyProduct, err := company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, product)
	if err != nil {
		br.Msg = "新增试用权限失败"
		br.ErrMsg = "新增试用权限失败,Err:" + err.Error()
		return
	}
	if companyProduct.Status != utils.COMPANY_STATUS_FORMAL {
		br.Msg = "客户状态为:" + companyProduct.Status + ",不可增开试用权限"
		br.ErrMsg = "客户状态为:" + companyProduct.Status + ",不可增开试用权限"
		return
	}
	permissionArr := strings.Split(req.ChartPermissionId, ",")
	//增开试用修改对应更新时间,上海策略平台,同步客户信息试用
	err = company.UpdateCompanyProductModifyTime(req.CompanyId, product)
	if err != nil {
		br.Msg = "新增试用权限失败"
		br.ErrMsg = "新增更新更改时间失败,Err:" + err.Error()
		return
	}
	companyReportPermissionList := make([]*company.CompanyReportPermission, 0) //添加的品种
	startDateTime := time.Now()
	endDateTime := startDateTime.AddDate(0, 2, 0)
	for _, v := range permissionArr {
		permissionId, _ := strconv.Atoi(v)
		count, err := company.GetCompanyPermissionCheck(req.CompanyId, permissionId)
		if err != nil {
			br.Msg = "新增试用权限失败"
			br.ErrMsg = "判断权限是否存在失败,Err:" + err.Error()
			return
		}
		fmt.Println(permissionId)
		fmt.Println(count)
		if count <= 0 {
			item := new(company.CompanyReportPermission)
			startDate := startDateTime.Format(utils.FormatDate)
			endDate := endDateTime.Format(utils.FormatDate)
			item.CompanyId = req.CompanyId
			item.CreatedTime = time.Now()
			item.LastUpdatedTime = time.Now()
			item.ChartPermissionId = permissionId
			item.StartDate = startDate
			item.EndDate = endDate
			item.ProductId = product
			item.ProductName = companyProduct.ProductName
			item.CompanyContractId = 0
			item.Status = "试用"
			item.ModifyTime = time.Now()
			err = company.AddCompanyReportPermission(item)
			if err != nil {
				br.Msg = "新增试用权限失败"
				br.ErrMsg = "新增试用权限失败,Err:" + err.Error()
				return
			}
			companyReportPermissionList = append(companyReportPermissionList, item)
		}
	}

	//新增客户产品状态变更日志
	{
		companyProductTryOutUpdateLog := &company.CompanyProductTryOutUpdateLog{
			Id:          0,
			CompanyId:   req.CompanyId,
			ProductId:   companyProduct.ProductId,
			Source:      "",
			SellerId:    companyProduct.SellerId,
			SellerName:  companyProduct.SellerName,
			StartDate:   startDateTime,
			EndDate:     endDateTime,
			RealEndDate: startDateTime,
			IsStop:      0,
			CreateTime:  time.Now(),
		}
		go company.AddCompanyProductTryOutUpdateLog(companyProductTryOutUpdateLog, companyReportPermissionList)
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "新增试用权限成功"
	br.IsAddLog = true
}