瀏覽代碼

Merge branch 'crm/crm_16.1' of http://8.136.199.33:3000/hongze/hz_crm_api into debug

xingzai 5 月之前
父節點
當前提交
158145dcd9

+ 386 - 4
controllers/statistic_company_merge.go

@@ -7,6 +7,7 @@ import (
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/response"
+	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/services"
 	cygxService "hongze/hz_crm_api/services/cygx"
 	"os"
@@ -40,7 +41,7 @@ type StatisticCompanyMergerController struct {
 // @Param   DataType   query   string  false       "报表类型,枚举值:`新增试用`,`新签客户`,`续约客户`,`未续约客户`"
 // @Param   TryOutType   query   string  false       " '试用', '非试用' 非试用即为冻结/流失"
 // @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
-// @Param   IsConfirm   query   int  false       "是否确认续约: -1-默认全部; 0-待确认; 1-已确认"
+// @Param   IsConfirm   query   int  false       "是否确认续约: -1-默认全部; 0-待确认; 1-已确认 ;2-到期合同"
 // @Param   CompanyAscribeId   query   int  false       "归因ID"
 // @Param   PackageDifference   query   string  false       "和上一份合同的区别,枚举值:`增加套餐`,`减少套餐`,`维持套餐`"
 // @Success 200 {object} response.IncrementalCompanyListResp
@@ -109,7 +110,7 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 
 	//条件
 	if adminId != "" {
-		condition += ` AND c.seller_id in  (` + adminId + `) `
+		condition += ` AND a.seller_id_init in  (` + adminId + `) `
 		//pars = append(pars, adminId)
 	} else {
 
@@ -160,10 +161,14 @@ func (this *StatisticCompanyMergerController) MergeCompanyList() {
 	if isConfirm != -1 {
 		if isConfirm == 0 {
 			conditionAscribRai += ` AND  a.company_contract_id NOT IN (` + utils.GetOrmInReplace(len(noRenewedcompanyContractIds)) + `)  ` // 待确认
-		} else {
+			parsAscribeRai = append(parsAscribeRai, noRenewedcompanyContractIds)
+		} else if isConfirm == 1 {
 			conditionAscribRai += ` AND  a.company_contract_id IN (` + utils.GetOrmInReplace(len(noRenewedcompanyContractIds)) + `)    ` // 已确认
+			parsAscribeRai = append(parsAscribeRai, noRenewedcompanyContractIds)
+		} else if isConfirm == 2 {
+			conditionAscribRai += ` AND  a.start_date  < ? ` // 已确认
+			parsAscribeRai = append(parsAscribeRai, time.Now().Format(utils.FormatDate))
 		}
-		parsAscribeRai = append(parsAscribeRai, noRenewedcompanyContractIds)
 	}
 	//归因ID CRM 13.9
 	if companyAscribeId > 0 {
@@ -1804,6 +1809,319 @@ func (this *StatisticCompanyMergerController) CompanyContractPercentageListV2()
 	br.Data = resp
 }
 
+// @Title 权益客户未续约率下载
+// @Description 权益客户未续约率下载接口
+// @Param   AdminId   query   string  true       "销售id,多个用英文逗号隔开,空字符串为全部"
+// @Param   StartDate   query   string  false       "开始日期"
+// @Param   EndDate   query   string  false       "结束日期"
+// @Param   ExportType   query   int	  true	       "下载类型 1:下载当前销售的合同明细数据;2:下载所有销售未续约数据列表"
+// @Success 200 {object} response.IncrementalCompanyListResp
+// @router /merge_company/company_contract_percentage/list_export [get]
+func (this *StatisticCompanyMergerController) CompanyContractPercentageListExport() {
+	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
+	}
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	exportType, _ := this.GetInt("ExportType")
+	adminId := this.GetString("AdminId")
+	contractDataType := this.GetString("ContractDataType")
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+	//initendDate := this.GetString("EndDate")
+	if startDate == "" || endDate == "" {
+		br.Msg = "开始时间或结束时间不能为空"
+		return
+	}
+
+	//判断结束时间是否晚于当前时间,如果晚于当前时间,那么就把当前时间作为截止时间。
+	endDateTime, _ := time.Parse(utils.FormatDate, endDate)
+	if endDateTime.After(time.Now()) {
+		endDate = time.Now().Format(utils.FormatDate)
+	}
+	//fmt.Println("endDate", endDate)
+	if contractDataType == "" {
+		contractDataType = "续约合同"
+	}
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = 10000
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	var condition string
+	var pars []interface{}
+
+	if exportType == 1 {
+		//条件
+		if adminId != "" {
+			condition += ` AND a.seller_id_init in  (` + adminId + `) `
+		}
+	}
+
+	//权益有效合同
+	condition += ` AND c.product_id = 2   AND  a.status = 1 `
+
+	//var list []*models.IncrementalList
+
+	condition1 := condition
+	pars1 := pars
+	condition1 += ` AND a.end_date >= ? AND a.end_date <= ? `
+	pars1 = append(pars1, startDate, endDate)
+	condition1 += ` AND  a.company_ascribe_id  > 0 AND  a.company_ascribe_id  !=9   ` // 已确认未续约
+
+	//if contractDataType == "续约合同" || contractDataType == "确认不续约合同" {
+	//不续约列表数据
+	listRenewal, err := models.GetIncrementalCompanyMergeListEnd(condition1, pars1, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	//}
+
+	conditionEnd1 := condition
+	parsEnd1 := pars
+
+	conditionEnd1 += ` AND a.end_date >= ? AND a.end_date <= ?  AND  a.company_ascribe_id  !=9   `
+	parsEnd1 = append(parsEnd1, startDate, endDate)
+
+	//if contractDataType == "到期合同" {
+	//到期列表数据
+	listEndDate, err := models.GetIncrementalCompanyMergeListEnd(conditionEnd1, parsEnd1, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	var companyContractIds []int
+	for _, v := range listRenewal {
+		companyContractIds = append(companyContractIds, v.CompanyContractId)
+		v.SellerId = v.SellerIdInit
+	}
+	for _, v := range listEndDate {
+		companyContractIds = append(companyContractIds, v.CompanyContractId)
+		v.SellerId = v.SellerIdInit
+	}
+
+	//合同归因标签
+	mapGetCompanyAscribeContent, mapContent := services.GetCompanyContractAscribeContentMap(companyContractIds)
+
+	//合并合同所对应的权限
+	mappermissionName, err := cygxService.GetCompanyContractPermissionNameMapById(companyContractIds)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	for _, v := range listRenewal {
+		v.PermissionName = mappermissionName[v.CompanyContractId]
+		if mapGetCompanyAscribeContent[v.CompanyContractId] != "" {
+			v.Content = mapContent[v.CompanyContractId]
+			v.AscribeContent = mapGetCompanyAscribeContent[v.CompanyContractId]
+			v.IsShowNoRenewedNote = true
+		}
+	}
+	for _, v := range listEndDate {
+		v.PermissionName = mappermissionName[v.CompanyContractId]
+		if mapGetCompanyAscribeContent[v.CompanyContractId] != "" {
+			v.Content = mapContent[v.CompanyContractId]
+			v.AscribeContent = mapGetCompanyAscribeContent[v.CompanyContractId]
+			v.IsShowNoRenewedNote = 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
+	if exportType == 1 {
+		for pidIndex := 0; pidIndex <= 1; pidIndex++ {
+			var sheetName string
+			var listDate []*models.IncrementalList
+			if pidIndex == 0 {
+				sheetName = "确认不续约合同"
+				listDate = listRenewal
+			} else {
+				sheetName = "到期合同"
+				listDate = listEndDate
+			}
+			sheet, err := xlsxFile.AddSheet(sheetName)
+			if err != nil {
+				br.Msg = "新增Sheet失败"
+				br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+				return
+			}
+			//标头
+			rowTitle := sheet.AddRow()
+			cellA := rowTitle.AddCell()
+			cellA.Value = "客户名称"
+			cellB := rowTitle.AddCell()
+			cellB.Value = "客户状态"
+			cellC := rowTitle.AddCell()
+			cellC.Value = "所属销售"
+			cellD := rowTitle.AddCell()
+			cellD.Value = "合同期限"
+			cellE := rowTitle.AddCell()
+			cellE.Value = "签约套餐"
+			cellF := rowTitle.AddCell()
+			cellF.Value = "合同金额"
+
+			if pidIndex == 0 {
+				cellG := rowTitle.AddCell()
+				cellG.Value = "不续约归因"
+			}
+
+			for _, item := range listDate {
+				row := sheet.AddRow()
+				cellAData := row.AddCell()
+				cellAData.Value = item.CompanyName
+				cellBData := row.AddCell()
+				cellBData.Value = item.ProductStatus
+				cellCData := row.AddCell()
+				cellCData.Value = item.SellerName
+				cellDData := row.AddCell()
+				cellDData.Value = item.StartDate + "~" + item.EndDate
+				cellEData := row.AddCell()
+				cellEData.Value = item.PermissionName
+				cellFData := row.AddCell()
+				cellFData.Value = fmt.Sprint(item.Money)
+				if pidIndex == 0 {
+					cellGData := row.AddCell()
+					cellGData.Value = item.Content
+				}
+			}
+		}
+		err = xlsxFile.Save(downLoadnFilePath)
+		if err != nil {
+			br.Msg = "保存文件失败"
+			br.ErrMsg = "保存文件失败"
+			return
+		}
+	} else {
+
+		var sheetName string
+		//var listDate []*models.IncrementalList
+		sheetName = "未续约率"
+		sheet, err := xlsxFile.AddSheet(sheetName)
+		if err != nil {
+			br.Msg = "新增Sheet失败"
+			br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+			return
+		}
+		//标头
+		rowTitle := sheet.AddRow()
+		cellA := rowTitle.AddCell()
+		cellA.Value = "姓名"
+		cellB := rowTitle.AddCell()
+		cellB.Value = "确认不续约合同数"
+		cellC := rowTitle.AddCell()
+		cellC.Value = "确认不续约合同金额"
+		cellD := rowTitle.AddCell()
+		cellD.Value = "到期合同数"
+		cellE := rowTitle.AddCell()
+		cellE.Value = "到期合同金额"
+		cellF := rowTitle.AddCell()
+		cellF.Value = "确认不续约率"
+
+		listRaiSeller, err := system.GetSysuserRaiListNoServer()
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取权益销售信息失败,Err:" + err.Error()
+			return
+		}
+
+		//NoRenewalContractTotal      int    `description:"确认不续约合同数"`
+		//NoRenewalContractMoney      int    `description:"确认不续约合同金额"`
+		//ExpireRenewalContractTotal  int    `description:"到期合同数量"`
+		//ExpireRenewalContractMoney  int    `description:"到期合同总金额"`
+		//NoRenewalContractPercentage string `description:"确认不续约率"`
+		mapNoRenewalContractTotal := make(map[int]int)
+		mapNoRenewalContractMoney := make(map[int]float64)
+		mapExpireRenewalContractTotal := make(map[int]int)
+		mapExpireRenewalContractMoney := make(map[int]float64)
+
+		//mapData := make(map[int]*response.IncrementalCompanyPercentageExportResp)
+		for _, v := range listRenewal {
+			mapNoRenewalContractTotal[v.SellerId]++
+			mapNoRenewalContractMoney[v.SellerId] += v.Money
+		}
+
+		for _, v := range listEndDate {
+			mapExpireRenewalContractTotal[v.SellerId]++
+			mapExpireRenewalContractMoney[v.SellerId] += v.Money
+		}
+		for _, item := range listRaiSeller {
+			row := sheet.AddRow()
+			cellAData := row.AddCell()
+			cellAData.Value = item.RealName
+			cellBData := row.AddCell()
+			cellBData.Value = fmt.Sprint(mapNoRenewalContractTotal[item.AdminId])
+			cellCData := row.AddCell()
+			cellCData.Value = fmt.Sprint(mapNoRenewalContractMoney[item.AdminId])
+
+			cellEData := row.AddCell()
+			cellEData.Value = fmt.Sprint(mapExpireRenewalContractTotal[item.AdminId])
+			cellFData := row.AddCell()
+			cellFData.Value = fmt.Sprint(mapExpireRenewalContractMoney[item.AdminId])
+
+			cellGData := row.AddCell()
+
+			//分子或者分母为零的时候,不做计算
+			if mapNoRenewalContractMoney[item.AdminId] == 0 || mapExpireRenewalContractMoney[item.AdminId] == 0 {
+				cellGData.Value = "0%"
+			} else {
+				cellGData.Value = fmt.Sprint(utils.SubFloatToString(float64(mapNoRenewalContractMoney[item.AdminId])/float64(mapExpireRenewalContractMoney[item.AdminId])*100, 2), "%")
+			}
+		}
+		err = xlsxFile.Save(downLoadnFilePath)
+		if err != nil {
+			br.Msg = "保存文件失败"
+			br.ErrMsg = "保存文件失败"
+			return
+		}
+	}
+	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
+	downloadFileName := "未续约率明细" + randStr + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "导出成功"
+}
+
 func init213() {
 	var condition string
 	var pars []interface{}
@@ -1855,3 +2173,67 @@ func init323() {
 		}
 	}
 }
+
+//func init() {
+//	init16_1_02()
+//}
+
+func init16_1_01() {
+	var condition string
+	var pars []interface{}
+
+	condition = "  AND  product_id = 2 "
+	var companyIds []int
+	companyContractList, e := company.GetCompanyContractList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		fmt.Println(e)
+		return
+	}
+
+	for _, v := range companyContractList {
+		if utils.InArrayByInt(companyIds, v.CompanyId) {
+			continue
+		}
+		companyIds = append(companyIds, v.CompanyId)
+	}
+
+	condition = "   AND company_id IN (" + (utils.GetOrmInReplace(len(companyIds))) + ") AND product_id = 2  AND share_seller_id > 0  "
+	pars = append(pars, companyIds)
+	listCompanyProduct, e := company.GetCompanyProductList(condition, pars)
+	if e != nil {
+		fmt.Println(e)
+		return
+	}
+	for _, v := range listCompanyProduct {
+		fmt.Println(v.ShareSellerId, v.ShareSeller)
+
+		e = company.UpdateCompanyContractTypeinit16_1_01(v.ShareSeller, v.ShareSellerId, v.CompanyId)
+		if e != nil {
+			fmt.Println(e)
+			return
+		}
+	}
+}
+
+func init16_1_02() {
+	var condition string
+	var pars []interface{}
+
+	condition = "  AND  product_id = 2  AND company_contract_id > 0  "
+
+	CompanyApprovalList, e := company.GetCompanyApprovalList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		fmt.Println(e)
+		return
+	}
+
+	for _, v := range CompanyApprovalList {
+		fmt.Println(v.CompanyId, v.CompanyContractId, "__", v.CompanyApprovalId)
+
+		e = company.UpdateCompanyContractTypeinit16_1_02(v.ApplyRealName, v.ApplyUserId, v.CompanyContractId)
+		if e != nil {
+			fmt.Println(e)
+			return
+		}
+	}
+}

+ 443 - 0
controllers/statistic_report.go

@@ -17,6 +17,7 @@ import (
 	"hongze/hz_crm_api/services"
 	"hongze/hz_crm_api/services/alarm_msg"
 	contractService "hongze/hz_crm_api/services/contract"
+	cygxService "hongze/hz_crm_api/services/cygx"
 	fmsService "hongze/hz_crm_api/services/fms"
 	"hongze/hz_crm_api/services/statistic_report"
 	"hongze/hz_crm_api/utils"
@@ -3802,6 +3803,9 @@ func (this *StatisticReportController) IncrementalCompanyList() {
 				item.AscribeContent = mapGetCompanyAscribeContent[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
 				item.Content = mapContent[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
 				item.IsShowNoRenewedNote = mapNoRenewedNote[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
+				if item.ProductId == utils.COMPANY_PRODUCT_RAI_ID { //权益客户的销售,按照创建时候对应的销售展示
+					item.SellerName = item.SellerNameInit
+				}
 			}
 			list = tmpList
 			dataTotal = total
@@ -6511,3 +6515,442 @@ func (this *StatisticReportController) UnusualRenewCompanyList() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// StackCompanyListRai
+// @Title 获取权益存量客户数据列表
+// @Description 获取权益存量客户数据列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   Keyword   query   string  true       "客户名称"
+// @Param   AdminId   query   string  true       "销售id,多个用英文逗号隔开,空字符串为全部"
+// @Param   RegionType   query   string  false       "所属区域:传空字符串或者不传为全部,'国内','海外'"
+// @Param   DataType   query   string  false       "报表类型,枚举值:`新签客户`,`续约客户`,`未续约客户`"
+// @Param   TryOutType   query   string  false       " '试用', '非试用' 非试用即为冻结/流失"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @Param   CompanyAscribeId   query   int  false       "归因ID"
+// @Success 200 {object} response.StackCompanyListResp
+// @router /stack_company_list_rai [get]
+func (this *StatisticReportController) StackCompanyListRai() {
+	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
+	}
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+	if isExport {
+		pageSize = 10000
+		currentIndex = 1
+	}
+
+	adminId := this.GetString("AdminId")
+	regionType := this.GetString("RegionType")
+	companyType := this.GetString("CompanyType")
+	dataType := this.GetString("DataType")
+	tryOutType := this.GetString("TryOutType")
+	keyword := this.GetString("Keyword")
+
+	companyAscribeId, _ := this.GetInt("CompanyAscribeId", -1) // CRM 13.9
+
+	var resp response.StackCompanyListResp
+	//历史统计数据
+	//获取实时统计数据(今天数据)
+	tmpResp, err := getTodayStackCompanyListV2Rai(sysUser, currentIndex, pageSize, companyAscribeId, adminId, regionType, companyType, dataType, tryOutType, keyword)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	resp = tmpResp
+
+	//导出excel
+	if isExport {
+		StackCompanyListExport(this, dataType, resp, br)
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+func getTodayStackCompanyListV2Rai(sysUser *system.Admin, currentIndex, pageSize, companyAscribeId int, adminId, regionType, companyType, dataType, tryOutType, keyword string) (returnData response.StackCompanyListResp, err error) {
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	var condition, listCondition string
+	var pars, listPars []interface{}
+
+	today := utils.GetToday(utils.FormatDate)
+	//条件
+	var conditionAscribRai string // 处理权益未续约客户检索列表SQL查询条件
+	var parsAscribeRai []interface{}
+
+	//归因ID CRM 13.9
+	if companyAscribeId > 0 {
+		var conditionAscribe string
+		var parsAscribe []interface{}
+		conditionAscribe = "  AND  company_ascribe_id = ? "
+		parsAscribe = append(parsAscribe, companyAscribeId)
+		companyNoRenewedAscribeList, e := company.GetCompanyNoRenewedAscribeList(conditionAscribe, parsAscribe, 0, 0)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetCompanyNoRenewedAscribeList" + e.Error())
+			return
+		}
+		var companyIds []int
+		if len(companyNoRenewedAscribeList) == 0 {
+			companyIds = append(companyIds, 0) // 给一个不存在的ID
+		} else {
+			for _, v := range companyNoRenewedAscribeList {
+				companyIds = append(companyIds, v.CompanyId)
+			}
+		}
+		conditionAscribRai += ` AND c.company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `)`
+		parsAscribeRai = append(parsAscribeRai, companyIds)
+	}
+
+	if adminId != "" {
+		//condition += ` AND c.seller_id in  (` + adminId + `) `
+		//pars = append(pars, adminId)
+	} else {
+		//根据当前角色来获取查询条件
+		condition, pars = getQueryParams(condition, pars, sysUser, "c.")
+
+	}
+	if regionType != "" {
+		condition += ` AND b.region_type = ? `
+		pars = append(pars, regionType)
+	}
+	//关键字搜索
+	if keyword != "" {
+		condition += ` and b.company_name like "%` + keyword + `%" `
+	}
+
+	condition += ` AND a.product_id = ? `
+	pars = append(pars, 2)
+
+	var dataTotal, newCompanyTotal, renewalCompanyTotal, notRenewalCompanyTotal int
+	var notRenewalTryOut, notRenewalNotTryOut int
+	var list []*models.IncrementalList
+	//新签客户数
+	{
+		condition1 := condition
+		if adminId != "" {
+			condition1 += ` AND a.seller_id_init in  (` + adminId + `) `
+		}
+		pars1 := pars
+		//condition1 += ` AND c.status = "正式"  `
+		condition1 += ` AND a.start_date <= ? AND a.end_date >= ? `
+		pars1 = append(pars1, today, today)
+		condition1 += ` AND a.contract_type = ? `
+		pars1 = append(pars1, "新签合同")
+
+		total, countErr := models.GetIncrementalNewCompanyCount(condition1, pars1)
+		if countErr != nil && countErr.Error() != utils.ErrNoRow() {
+			err = countErr
+			return
+		}
+		newCompanyTotal = total
+
+		if dataType == "新签客户" {
+			//页表页数据总和
+			total, countErr = models.GetTodayStackCompanyProductCount(condition1, pars1)
+			if countErr != nil && countErr.Error() != utils.ErrNoRow() {
+				err = countErr
+				return
+			}
+			dataTotal = total
+			listCondition = condition1
+			listPars = pars1
+		}
+	}
+
+	//续约客户数
+	{
+
+		condition1 := condition
+		if adminId != "" {
+			condition1 += ` AND a.seller_id_init in  (` + adminId + `) `
+		}
+		pars1 := pars
+		//condition1 += ` AND c.status  = "正式" `
+		condition1 += ` AND a.start_date <= ? AND a.end_date >= ? `
+		pars1 = append(pars1, today, today)
+		condition1 += ` AND a.contract_type = ? `
+		pars1 = append(pars1, "续约合同")
+
+		//额外条件(续约合同的起始日期包含在所选时间段内且不包含在新签合同存续期内的客户)
+		pars1 = append(pars1, today)
+		total, countErr := models.GetIncrementalNewCompanyCountV2(condition1, pars1)
+		if countErr != nil && countErr.Error() != utils.ErrNoRow() {
+			err = countErr
+			return
+		}
+		renewalCompanyTotal = total
+
+		if dataType == "续约客户" {
+			//页表页数据总和
+			total, countErr = models.GetTodayStackCompanyProductCountV2(condition1, pars1)
+			if countErr != nil && countErr.Error() != utils.ErrNoRow() {
+				err = countErr
+				return
+			}
+			dataTotal = total
+			listCondition = condition1
+			listPars = pars1
+		}
+	}
+
+	//未续约客户数
+	{
+		if adminId != "" {
+			condition += ` AND c.seller_id in  (` + adminId + `) `
+		}
+		condition1 := condition
+		pars1 := pars
+		condition1 += ` AND c.status not in ("永续","正式") AND a.create_time <= ? `
+		pars1 = append(pars1, time.Now().Format(utils.FormatDateTime))
+		condition1 += ` AND a.operation = 'try_out' `
+
+		total, countErr := models.GetIncrementalCompanyCountByOperationRecord(condition1, pars1)
+		if countErr != nil && countErr.Error() != utils.ErrNoRow() {
+			err = countErr
+			return
+		}
+		notRenewalCompanyTotal = total
+		condition1 += conditionAscribRai
+		pars1 = append(pars1, parsAscribeRai)
+		if dataType == "未续约客户" {
+			//页表页数据总和
+			//统计数据
+			for _, v := range []string{"试用", "非试用"} {
+				totalCondition1 := condition1
+				totalPars1 := pars1
+				var tmpTotal int
+				if v == "试用" {
+					totalCondition1 += ` AND c.status = "试用" `
+					tmpTotal, err = models.GetIncrementalCompanyProductCountByOperationRecord(totalCondition1, totalPars1)
+					if err != nil {
+						return
+					}
+					notRenewalTryOut = tmpTotal
+				} else if v == "非试用" {
+					totalCondition1 += ` AND c.status IN ("冻结","流失") `
+					tmpTotal, err = models.GetIncrementalCompanyProductCountByOperationRecord(totalCondition1, totalPars1)
+					if err != nil && err.Error() != utils.ErrNoRow() {
+						return
+					}
+					notRenewalNotTryOut = tmpTotal
+				}
+
+			}
+			//列表数据数量
+			if tryOutType == "试用" {
+				condition1 += ` AND c.status = "试用" `
+				total = notRenewalTryOut
+			} else if tryOutType == "非试用" {
+				condition1 += ` AND c.status IN ("冻结","流失") `
+				total = notRenewalNotTryOut
+			}
+
+			//total, countErr := models.GetIncrementalCompanyProductCountByOperationRecord(condition1, pars1)
+			//if countErr != nil && countErr.Error() != utils.ErrNoRow() {
+			//	err = countErr
+			//	return
+			//}
+
+			dataTotal = total
+			listCondition = condition1
+			listPars = pars1
+			if tryOutType == "试用" {
+				listCondition += ` AND c.status = "试用" `
+			} else if tryOutType == "非试用" {
+				listCondition += ` AND c.status IN ("冻结","流失") `
+			}
+			tmpList, countErr := models.GetIncrementalCompanyListByOperationRecord(listCondition, listPars, startSize, pageSize)
+			if countErr != nil {
+				err = countErr
+				return
+			}
+			for i := 0; i < len(tmpList); i++ {
+				endDateTime, parseErr := time.Parse(utils.FormatDateTime, tmpList[i].CreateTime)
+				if parseErr != nil {
+					err = parseErr
+					return
+				}
+				tmpList[i].EndDate = endDateTime.Format(utils.FormatDate)
+			}
+			list = tmpList
+
+		}
+	}
+
+	switch dataType {
+	case "新签客户":
+		tmpList, countErr := models.GetTodayStackCompanyList(listCondition, listPars, startSize, pageSize)
+		if countErr != nil {
+			err = countErr
+			return
+		}
+		list = tmpList
+	case "续约客户":
+		tmpList, countErr := models.GetTodayStackCompanyListV2(listCondition, listPars, startSize, pageSize)
+		if countErr != nil {
+			err = countErr
+			return
+		}
+		list = tmpList
+	}
+
+	if dataType == "续约客户" {
+		var ids []string
+		oldCompanyMap := make(map[int]*models.IncrementalList)
+		oldMoneyMap := make(map[int]float64)
+		countMap := make(map[int]int)
+		for _, item := range list {
+			ids = append(ids, strconv.Itoa(item.CompanyId))
+		}
+		if len(ids) > 0 {
+			idStr := strings.Join(ids, ",")
+			lists, contractErr := models.GetLastContractMoney(idStr)
+			if contractErr != nil {
+				err = contractErr
+				return
+			}
+
+			for _, item := range lists {
+				_, countOk := countMap[item.CompanyId]
+				_, ok := oldCompanyMap[item.CompanyId]
+				if !ok {
+					oldCompanyMap[item.CompanyId] = item
+					oldMoneyMap[item.CompanyId] = item.Money
+				} else if !countOk {
+					countMap[item.CompanyId] = 1
+					oldCompanyMap[item.CompanyId] = item
+				}
+			}
+
+			//给list赋值
+			for _, item := range list {
+				if item.ProductName == "权益" {
+					oldMoney, _ := oldMoneyMap[item.CompanyId]
+					lastContract, _ := oldCompanyMap[item.CompanyId]
+					if oldMoney > lastContract.Money {
+						item.PackageDifference = "增加套餐"
+					} else if oldMoney < lastContract.Money {
+						item.PackageDifference = "减少套餐"
+					} else {
+						item.PackageDifference = "维持套餐"
+					}
+				}
+			}
+		}
+	}
+
+	var ascribecompanyIds []int
+	for _, item := range list {
+		ascribecompanyIds = append(ascribecompanyIds, item.CompanyId)
+	}
+	//归因标签
+	mapGetCompanyAscribeContent, mapContent := services.GetCompanyAscribeContentMap(ascribecompanyIds)
+	mapNoRenewedNote := services.GetCompanyNoRenewedNoteMap(ascribecompanyIds)
+	for _, item := range list {
+		item.AscribeContent = mapGetCompanyAscribeContent[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
+		item.Content = mapContent[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
+		item.IsShowNoRenewedNote = mapNoRenewedNote[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
+	}
+
+	listLen := len(list)
+	var companyContractIds []int
+	for i := 0; i < listLen; i++ {
+		item := list[i]
+
+		//剩余可用天数
+		expireDay := "0"
+		endDateTime, _ := time.Parse(utils.FormatDate, item.EndDate)
+		var sub time.Duration
+		if dataType != "未续约客户" {
+			endDateTime = endDateTime.AddDate(0, 0, 1)
+			sub = endDateTime.Sub(time.Now())
+			//if sub < 0 {
+			//	sub = 0
+			//}
+		} else {
+			sub = time.Now().Sub(endDateTime)
+		}
+		expireDay = fmt.Sprintf("%v", int(sub.Hours()/24))
+		list[i].ExpireDay = expireDay
+		companyContractIds = append(companyContractIds, item.CompanyContractId)
+	}
+
+	//合并合同所对应的权限
+	mappermissionName, err := cygxService.GetCompanyContractPermissionNameMapById(companyContractIds)
+	if err != nil {
+		return
+	}
+	for _, v := range list {
+		v.PermissionName = mappermissionName[v.CompanyContractId]
+	}
+
+	var stackCompanyStatisticList []*models.StackCompanyStatisticList
+	for _, v := range list {
+		stackCompanyStatistic := models.StackCompanyStatisticList{
+			Type:        dataType,
+			CompanyId:   v.CompanyId,
+			CompanyName: v.CompanyName,
+			ProductId:   v.ProductId,
+			ProductName: v.ProductName,
+			ContractNum: v.Count,
+			SellerId:    v.SellerId,
+			SellerName:  v.SellerNameInit,
+			ShareSeller: v.ShareSellerInit,
+			Date:        today,
+			StartDate:   v.StartDate,
+			EndDate:     v.EndDate,
+			RegionType:  v.RegionType,
+			//CreateTime   :v.CreateTime,
+			CreateTimeStr:       v.CreateTime,
+			ExpireDay:           v.ExpireDay,
+			RenewalReason:       v.RenewalReason,
+			RenewalTodo:         v.RenewalTodo,
+			Status:              v.Status,
+			PackageDifference:   v.PackageDifference,
+			AscribeContent:      v.AscribeContent,
+			IsShowNoRenewedNote: v.IsShowNoRenewedNote,
+			Content:             v.Content,
+			PermissionName:      mappermissionName[v.CompanyContractId],
+			Money:               v.Money,
+		}
+		stackCompanyStatisticList = append(stackCompanyStatisticList, &stackCompanyStatistic)
+	}
+	page := paging.GetPaging(currentIndex, pageSize, dataTotal)
+	resp := response.StackCompanyListResp{
+		Paging:                 page,
+		List:                   stackCompanyStatisticList,
+		NewCompanyTotal:        newCompanyTotal,
+		RenewalCompanyTotal:    renewalCompanyTotal,
+		NotRenewalCompanyTotal: notRenewalCompanyTotal,
+		NotRenewalTryOut:       notRenewalTryOut,
+		NotRenewalNotTryOut:    notRenewalNotTryOut,
+	}
+	return resp, err
+}

+ 11 - 0
models/company/company_approval.go

@@ -1665,3 +1665,14 @@ GROUP BY
 
 	return
 }
+
+func GetCompanyApprovalList(condition string, pars []interface{}) (items []*CompanyApproval, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_approval WHERE 1 = 1  `
+
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 16 - 0
models/company/company_contract.go

@@ -350,3 +350,19 @@ func GetFirstContractRai(companyId int) (item *CompanyContract, err error) {
 	err = o.Raw(sql, companyId).QueryRow(&item)
 	return
 }
+
+// 更新合同类型
+func UpdateCompanyContractTypeinit16_1_01(share_seller_init string, share_seller_id_init, companyId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_contract SET share_seller_init = ? , share_seller_id_init = ?  WHERE company_id = ?  AND product_id= 2 `
+	_, err = o.Raw(sql, share_seller_init, share_seller_id_init, companyId).Exec()
+	return
+}
+
+// 更新合同类型
+func UpdateCompanyContractTypeinit16_1_02(seller_name_init string, seller_id_init, company_contract_id int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_contract SET seller_name_init = ? , seller_id_init = ?  WHERE company_contract_id = ?  AND product_id= 2 `
+	_, err = o.Raw(sql, seller_name_init, seller_id_init, company_contract_id).Exec()
+	return
+}

+ 9 - 0
models/response/statistic_report.go

@@ -143,3 +143,12 @@ type IncrementalCompanyPercentageListResp struct {
 	ExpireRenewalContractTotal int    `description:"到期合同数量"`
 	ExpireRenewalContractMoney int    `description:"到期合同总金额"`
 }
+
+// 权益客户统计,续约率,返回类
+type IncrementalCompanyPercentageExportResp struct {
+	NoRenewalContractTotal      int    `description:"确认不续约合同数"`
+	NoRenewalContractMoney      int    `description:"确认不续约合同金额"`
+	ExpireRenewalContractTotal  int    `description:"到期合同数量"`
+	ExpireRenewalContractMoney  int    `description:"到期合同总金额"`
+	NoRenewalContractPercentage string `description:"确认不续约率"`
+}

+ 3 - 0
models/stack_company_statistic.go

@@ -90,6 +90,7 @@ type StackCompanyStatisticList struct {
 	ContractNum         int       `description:"第几份合同,默认是:1"`
 	SellerId            int       `description:"所属销售id"`
 	SellerName          string    `description:"所属销售名称"`
+	ShareSeller         string    `description:"共享销售员"`
 	GroupId             int       `description:"所属销售分组id"`
 	DepartmentId        int       `description:"所属销售部门id"`
 	Date                string    `description:"记录日期"`
@@ -106,6 +107,8 @@ type StackCompanyStatisticList struct {
 	AscribeContent      string    `description:"归因标签说明"`
 	IsShowNoRenewedNote bool      `description:"是否展示未续约备注按钮"`
 	Content             string    `description:"归因内容说明"`
+	PermissionName      string    `description:"权限名"`
+	Money               float64   `description:"合同金额"`
 }
 
 func GetStackCompanyList(condition, orderBy string, pars []interface{}, startSize, pageSize int) (items []*StackCompanyStatisticList, err error) {

+ 7 - 3
models/statistic_report.go

@@ -377,6 +377,7 @@ type IncrementalList struct {
 	CompanyName          string                             `description:"企业客户名称"`
 	ProductId            int                                `description:"产品id"`
 	ProductName          string                             `description:"产品名称"`
+	ProductStatus        string                             `description:"产品名称"`
 	CompanyProductId     int                                `description:"客户购买产品授权id"`
 	ContractCode         string                             `description:"合同编码"`
 	StartDate            string                             `description:"合同开始日期"`
@@ -406,7 +407,10 @@ type IncrementalList struct {
 	PermissionNameStatus string                             `description:"权限状态"`
 	CompanyProductStatus string                             `description:"客户状态"`
 	//CompanyContractIdGroup string                             `description:"表company_contract合并的 company_contract_id"`
-	IsUserMaker int `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
+	IsUserMaker     int    `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
+	SellerNameInit  string `description:"权益初始化销售"`
+	SellerIdInit    int    `description:"权益初始化销售ID"`
+	ShareSellerInit string `description:"共享销售员"`
 }
 
 // GetIncrementalNewCompanyCount 获取增量客户报表列表统计数据(根据合同来展示)
@@ -795,7 +799,7 @@ func GetIncrementalCompanyListByOperationRecord(condition string, pars []interfa
 	sql1 += ` GROUP BY a.company_id, a.product_id `
 
 	//查询真正的数据
-	sql := `SELECT a.id, a.company_id, b.company_name, c.seller_id, c.seller_name, a.product_id, a.product_name, a.create_time, b.region_type, c.renewal_reason, c.renewal_todo, c.status FROM company_operation_record a
+	sql := `SELECT a.id, a.company_id, a.sys_real_name as  seller_name_init , b.company_name, c.seller_id, c.seller_name, a.product_id, a.product_name, a.create_time, b.region_type, c.renewal_reason, c.renewal_todo, c.status FROM company_operation_record a
 		RIGHT JOIN company b ON a.company_id = b.company_id
 		JOIN company_product c ON b.company_id = c.company_id 
 		AND a.product_id = c.product_id
@@ -880,7 +884,7 @@ func GetIncrementalCompanyMergeList(condition string, pars []interface{}, startS
 func GetIncrementalCompanyMergeListEnd(condition string, pars []interface{}, startSize, pageSize int) (items []*IncrementalList, err error) {
 	o := orm.NewOrm()
 
-	sql := `SELECT a.*,b.region_type,c.seller_id,c.seller_name,b.company_name,c.renewal_reason FROM company_contract a
+	sql := `SELECT a.*,b.region_type,c.seller_id,c.seller_name,b.company_name,c.renewal_reason,c.status AS product_status FROM company_contract a
 		 JOIN company b ON a.company_id = b.company_id
 		 JOIN company_product c ON a.company_id = c.company_id and a.product_id=c.product_id WHERE 1 = 1 `
 

+ 8 - 0
models/system/sys_admin.go

@@ -478,6 +478,14 @@ func GetSysuserRaiList() (items []*AdminItem, err error) {
 	return
 }
 
+// GetSysuserRaiList 获取除服务组之外的所有权益销售
+func GetSysuserRaiListNoServer() (items []*AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT  * FROM admin WHERE role_type_code  IN ('rai_group','rai_seller')  AND enabled = 1  AND role_name NOT IN ('权益服务销售','权益服务组长')  `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
 func GetSellerIdsByDepId(depId int) (ids []string, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT

+ 18 - 0
routers/commentsRouter.go

@@ -10933,6 +10933,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticCompanyMergerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticCompanyMergerController"],
+        beego.ControllerComments{
+            Method: "CompanyContractPercentageListExport",
+            Router: `/merge_company/company_contract_percentage/list_export`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticCompanyMergerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticCompanyMergerController"],
         beego.ControllerComments{
             Method: "CompanyContractPermissionList",
@@ -11131,6 +11140,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"],
+        beego.ControllerComments{
+            Method: "StackCompanyListRai",
+            Router: `/stack_company_list_rai`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticReportController"],
         beego.ControllerComments{
             Method: "WillExpireList",