소스 검색

Merge branch 'crm/crm_14.2' of http://8.136.199.33:3000/hongze/hz_crm_api into debug

xingzai 1 년 전
부모
커밋
274720b87e

+ 750 - 0
controllers/statistic_company_merge.go

@@ -0,0 +1,750 @@
+package controllers
+
+import (
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/response"
+	"hongze/hz_crm_api/services"
+	"os"
+	"path/filepath"
+	"strings"
+
+	//"hongze/hz_crm_api/services"
+	"hongze/hz_crm_api/utils"
+	//"strings"
+	"time"
+)
+
+// 统计报表模块下权益合同合并
+// StatisticReportController 统计报告基类
+type StatisticCompanyMergerController struct {
+	BaseAuthController
+}
+
+// MergeCompanyList
+// @Title 权益客户统计列表(合同进行合并之后的)
+// @Description 权益客户统计列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   Keyword   query   string  true       "客户名称"
+// @Param   CompanyType   query   string  true       "客户类型:传空字符串或者不传为全部,'ficc','权益'"
+// @Param   AdminId   query   string  true       "销售id,多个用英文逗号隔开,空字符串为全部"
+// @Param   RegionType   query   string  false       "所属区域:传空字符串或者不传为全部,'国内','海外'"
+// @Param   StartDate   query   string  false       "开始日期"
+// @Param   EndDate   query   string  false       "结束日期"
+// @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   CompanyAscribeId   query   int  false       "归因ID"
+// @Param   PackageDifference   query   string  false       "和上一份合同的区别,枚举值:`增加套餐`,`减少套餐`,`维持套餐`"
+// @Success 200 {object} response.IncrementalCompanyListResp
+// @router /merge_company_list [get]
+func (this *StatisticCompanyMergerController) MergeCompanyList() {
+	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")
+
+	adminId := this.GetString("AdminId")
+	regionType := this.GetString("RegionType")
+	companyType := this.GetString("CompanyType")
+	dataType := this.GetString("DataType")
+	tryOutType := this.GetString("TryOutType")
+	keyword := this.GetString("Keyword")
+	packageDifference := this.GetString("PackageDifference")
+
+	startDate := this.GetString("StartDate")
+	endDate := this.GetString("EndDate")
+
+	isConfirm, _ := this.GetInt("IsConfirm", -1)
+	companyAscribeId, _ := this.GetInt("CompanyAscribeId", -1)
+	//if startDate == "" || endDate == "" {
+	//	br.Msg = "获取失败,开始日期或结束日期未传"
+	//	br.ErrMsg = "获取失败,开始日期或结束日期未传"
+	//	return
+	//}
+	if startDate == "" {
+		startDate = "2015-01-01"
+	}
+	if endDate == "" {
+		endDate = time.Now().Format(utils.FormatDate)
+	}
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+	if isExport {
+		pageSize = 10000
+		currentIndex = 1
+	}
+
+	var condition string
+	var pars []interface{}
+
+	//条件
+	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 + `%" `
+	}
+
+	var conditionAscribRai string          // 处理权益未续约客户检索列表SQL查询条件
+	var conditionAscribRaiTotal string     // 处理权益未续约客户总量查询条件
+	var conditionAscribRaiToBeTotal string // 处理权益未续约客户待确认总量查询条件
+	var parsAscribeRai []interface{}
+	var parsAscribeRaiTotal []interface{}     // 处理权益未续约客户总量查询条件
+	var parsAscribeRaiTobeTotal []interface{} // 处理权益未续约客户待确认总量查询条件
+	var conditionConfirm string
+	var parsConfirm []interface{}
+
+	companyConfirmList, err := company.GetCompanyNoRenewedAscribeList(conditionConfirm, parsConfirm, 0, 0)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,GetCompanyNoRenewedAscribeList Err:" + err.Error()
+		return
+	}
+	var noRenewedcompanyIds []int //已经确定未续约的公司ID
+	if len(companyConfirmList) == 0 {
+		noRenewedcompanyIds = append(noRenewedcompanyIds, 0) // 给一个不存在的ID
+	} else {
+		for _, v := range companyConfirmList {
+			noRenewedcompanyIds = append(noRenewedcompanyIds, v.CompanyId)
+		}
+	}
+	//是否确认续约 CRM 13.9
+	conditionAscribRaiTotal += ` AND ( c.company_id IN (` + utils.GetOrmInReplace(len(noRenewedcompanyIds)) + `)   OR c.product_id = 1  OR  a.create_time <  '2023-01-01'  )   ` // 已确认
+	parsAscribeRaiTotal = append(parsAscribeRaiTotal, noRenewedcompanyIds)
+
+	conditionAscribRaiToBeTotal += ` AND ( c.company_id NOT IN (` + utils.GetOrmInReplace(len(noRenewedcompanyIds)) + `)  AND  c.product_id = 2  AND  a.create_time >=  '2023-01-01' )  ` // 待确认
+	parsAscribeRaiTobeTotal = append(parsAscribeRaiTobeTotal, noRenewedcompanyIds)
+
+	if isConfirm != -1 {
+		if isConfirm == 0 {
+			conditionAscribRai += ` AND ( c.company_id NOT IN (` + utils.GetOrmInReplace(len(noRenewedcompanyIds)) + `)  AND  c.product_id = 2  AND  a.create_time >=  '2023-01-01' )  ` // 待确认
+		} else {
+			conditionAscribRai += ` AND ( c.company_id IN (` + utils.GetOrmInReplace(len(noRenewedcompanyIds)) + `)   OR c.product_id = 1  OR   a.create_time <  '2023-01-01' )    ` // 已确认
+		}
+		parsAscribeRai = append(parsAscribeRai, noRenewedcompanyIds)
+	}
+
+	//归因ID CRM 13.9
+	if companyAscribeId > 0 {
+		var conditionAscribe string
+		var parsAscribe []interface{}
+		conditionAscribe = "  AND  company_ascribe_id = ? "
+		parsAscribe = append(parsAscribe, companyAscribeId)
+		companyNoRenewedAscribeList, err := company.GetCompanyNoRenewedAscribeList(conditionAscribe, parsAscribe, 0, 0)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCompanyNoRenewedAscribeList Err:" + err.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)
+	}
+
+	switch companyType {
+	case "ficc":
+		condition += ` AND c.product_id = ? `
+		pars = append(pars, 1)
+	case "权益":
+		condition += ` AND c.product_id = ? `
+		pars = append(pars, 2)
+	case "":
+	default:
+		br.Msg = "获取失败,客户类型异常"
+		br.ErrMsg = "获取失败,客户类型异常"
+		return
+	}
+
+	var list []*models.IncrementalList
+	//moreListMap := make(map[int][]*models.IncrementalList)
+
+	var newCompanyTotal int                   //新签合同数量
+	var notRenewalCompanyTotal int            //未续约客户数已确认
+	var notRenewalCompanyToBeConfirmTotal int //未续约客户数待确认
+	var dataTotal, trialTotal, renewalCompanyTotal int
+	var notRenewalTryOut, notRenewalNotTryOut int
+
+	//新签客户数
+	{
+		condition1 := condition
+		pars1 := pars
+		condition1 += ` AND a.start_date >= ? AND a.start_date <= ? `
+		pars1 = append(pars1, startDate, endDate)
+		condition1 += ` AND a.contract_type = ? `
+		pars1 = append(pars1, "新签合同")
+		newCompanyTotal, err = company.GetIncrementalNewCompanyProductMergeCount(condition1, pars1)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+
+		if dataType == "新签客户" {
+			//列表数据数量
+			total, err := company.GetIncrementalNewCompanyProductMergeCount(condition1, pars1)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+
+			//列表页数据
+			tmpList, err := models.GetIncrementalCompanyMergeList(condition1, pars1, startSize, pageSize)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+			list = tmpList
+			dataTotal = total
+		}
+	}
+
+	//续约客户数
+	{
+
+		condition1 := condition
+		pars1 := pars
+		condition1 += ` AND a.start_date >= ? AND a.start_date <= ? `
+		pars1 = append(pars1, startDate, endDate)
+		condition1 += ` AND a.contract_type = ? `
+		pars1 = append(pars1, "续约合同")
+
+		//续约的客户才会查询
+		if packageDifference != "" {
+			condition1 += ` AND a.package_difference = ? `
+			pars1 = append(pars1, packageDifference)
+		}
+
+		////额外条件(续约合同的起始日期包含在所选时间段内且不包含在新签合同存续期内的客户)
+		//pars1 = append(pars1, endDate)
+
+		total, err := company.GetIncrementalNewCompanyProductMergeCount(condition1, pars1)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		renewalCompanyTotal = total
+
+		if dataType == "续约客户" {
+			//列表数据数量
+			total, err := company.GetIncrementalRenewalCompanyProductMergeCount(condition1, pars1)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+			//列表页数据
+			tmpList, err := models.GetIncrementalCompanyMergeList(condition1, pars1, startSize, pageSize)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+
+			list = tmpList
+			dataTotal = total
+
+		}
+	}
+
+	//未续约客户数
+	{
+		condition1 := condition
+		pars1 := pars
+
+		endDateTime, err := time.Parse(utils.FormatDate, endDate)
+		if err != nil {
+			br.Msg = "结束时间异常"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		//选择的日期加一天的原因是因为:筛选条件是截止到时分秒的,如果要把选择的这一天也统计进去,那么需要在选择的结束日期基础上加上一天
+		tryOutEndDate := endDateTime.AddDate(0, 0, 1).Format(utils.FormatDate)
+
+		condition1 += ` AND a.create_time >= ? AND a.create_time < ? `
+		pars1 = append(pars1, startDate, tryOutEndDate)
+		condition1 += ` AND a.operation = ? `
+		pars1 = append(pars1, "try_out")
+		condition1 += ` AND c.status not in ("永续","正式","关闭")  `
+
+		//未续约已确认数量
+		notRenewalCondition := condition1
+		notRenewalPars := pars1
+		notRenewalCondition += conditionAscribRaiTotal
+		notRenewalPars = append(notRenewalPars, parsAscribeRaiTotal)
+		total, err := models.GetIncrementalCompanyCountByOperationRecord(notRenewalCondition, notRenewalPars)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		notRenewalCompanyTotal = total
+
+		//未续约待确认数量
+		notRenewalToBeCondition := condition1
+		notRenewalToBePars := pars1
+		notRenewalToBeCondition += conditionAscribRaiToBeTotal
+		notRenewalToBePars = append(notRenewalToBePars, parsAscribeRaiTobeTotal)
+		notRenewalCompanyToBeConfirmTotal, err = models.GetIncrementalCompanyCountByOperationRecord(notRenewalToBeCondition, notRenewalToBePars)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+
+		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 && err.Error() != utils.ErrNoRow() {
+						br.Msg = "获取失败"
+						br.ErrMsg = "获取失败,Err:" + err.Error()
+						return
+					}
+					notRenewalTryOut = tmpTotal
+				} else if v == "非试用" {
+					totalCondition1 += ` AND c.status IN ("冻结","流失") `
+					tmpTotal, err = models.GetIncrementalCompanyProductCountByOperationRecord(totalCondition1, totalPars1)
+					if err != nil && err.Error() != utils.ErrNoRow() {
+						br.Msg = "获取失败"
+						br.ErrMsg = "获取失败,Err:" + err.Error()
+						return
+					}
+					notRenewalNotTryOut = tmpTotal
+				}
+
+			}
+			//列表数据数量
+			if tryOutType == "试用" {
+				condition1 += ` AND c.status = "试用" `
+				total = notRenewalTryOut
+			} else if tryOutType == "非试用" {
+				condition1 += ` AND c.status IN ("冻结","流失") `
+				total = notRenewalNotTryOut
+			}
+
+			//total, err := models.GetIncrementalCompanyProductCountByOperationRecord(condition1, pars1)
+			//if err != nil && err.Error() != utils.ErrNoRow() {
+			//	br.Msg = "获取失败"
+			//	br.ErrMsg = "获取失败,Err:" + err.Error()
+			//	return
+			//}
+
+			//分页total单独计算
+			total, err = models.GetIncrementalCompanyProductCountByOperationRecord(condition1, pars1)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+			//列表页数据
+			tmpList, err := models.GetIncrementalCompanyListByOperationRecord(condition1, pars1, startSize, pageSize)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+
+			var ascribecompanyIds []int
+			for _, item := range tmpList {
+				endDateTime, _ := time.Parse(utils.FormatDateTime, item.CreateTime)
+				item.EndDate = endDateTime.Format(utils.FormatDate)
+				ascribecompanyIds = append(ascribecompanyIds, item.CompanyId)
+			}
+			//归因标签
+			mapGetCompanyAscribeContent, mapContent := services.GetCompanyAscribeContentMap(ascribecompanyIds)
+			mapNoRenewedNote := services.GetCompanyNoRenewedNoteMap(ascribecompanyIds)
+
+			for _, item := range tmpList {
+				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)]
+			}
+
+			list = tmpList
+			dataTotal = total
+
+		}
+	}
+
+	listLen := len(list)
+
+	if listLen == 0 {
+		list = make([]*models.IncrementalList, 0)
+	}
+	mapCompamy := make(map[int]string)
+	for i := 0; i < listLen; i++ {
+		item := list[i]
+		mapCompamy[item.CompanyId] = item.CompanyContractIdGroup
+		//新增试用不需要计算剩余日期
+		if dataType != "新增试用" {
+			//剩余可用天数
+			endDateTime, _ := time.Parse(utils.FormatDate, item.EndDate)
+			endDateTime = endDateTime.AddDate(0, 0, 1)
+			sub := endDateTime.Sub(time.Now())
+			expireDay := fmt.Sprintf("%v", int(sub.Hours()/24))
+			list[i].ExpireDay = expireDay
+		}
+	}
+	if dataType == "新签客户" || dataType == "续约客户" {
+		//合并合同所对应的权限
+		mappermissionName, err := services.GetCompanyContractPermissionNameMapById(mapCompamy)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range list {
+			v.PermissionName = mappermissionName[v.CompanyId]
+		}
+	}
+	page := paging.GetPaging(currentIndex, pageSize, dataTotal)
+	resp := response.IncrementalCompanyListResp{
+		Paging:                            page,
+		List:                              list,
+		TrialTotal:                        trialTotal,
+		NewCompanyTotal:                   newCompanyTotal,
+		RenewalCompanyTotal:               renewalCompanyTotal,
+		NotRenewalCompanyTotal:            notRenewalCompanyTotal,
+		NotRenewalCompanyToBeConfirmTotal: notRenewalCompanyToBeConfirmTotal,
+		NotRenewalTryOut:                  notRenewalTryOut,
+		NotRenewalNotTryOut:               notRenewalNotTryOut,
+	}
+	//fmt.Println()
+	//导出excel
+	if isExport {
+		MergeCompanyListListExport(this, dataType, resp, br)
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// IncrementalCompanyListExport 导出增量客户数据报表excel
+func MergeCompanyListListExport(this *StatisticCompanyMergerController, dataType string, resp response.IncrementalCompanyListResp, br *models.BaseResponse) {
+	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
+
+	sheel, err := xlsxFile.AddSheet("增量客户数据")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	sheel.SetColWidth(0, 0, 30)
+	sheel.SetColWidth(1, 1, 15)
+	sheel.SetColWidth(2, 2, 15)
+	sheel.SetColWidth(3, 3, 18)
+	sheel.SetColWidth(4, 4, 40)
+	sheel.SetColWidth(5, 5, 18)
+
+	//统计数据
+	statisticRow := sheel.AddRow()
+
+	cell1 := statisticRow.AddCell()
+	cell1.SetStyle(style)
+	cell1.SetValue(fmt.Sprint("新增试用客户数:", resp.TrialTotal))
+
+	cell2 := statisticRow.AddCell()
+	cell2.SetStyle(style)
+	cell2.SetValue(fmt.Sprint("新签客户数:", resp.NewCompanyTotal))
+
+	cell3 := statisticRow.AddCell()
+	cell3.SetStyle(style)
+	cell3.SetValue(fmt.Sprint("续约客户数:", resp.RenewalCompanyTotal))
+
+	cell4 := statisticRow.AddCell()
+	cell4.SetStyle(style)
+	cell4.SetValue(fmt.Sprint("未续约客户数:", resp.NotRenewalCompanyTotal))
+	//表头
+
+	titleRow := sheel.AddRow()
+
+	cellName := titleRow.AddCell()
+	cellName.SetStyle(style)
+	cellName.SetValue("客户名称")
+
+	cellProName := titleRow.AddCell()
+	cellProName.SetStyle(style)
+	cellProName.SetValue("客户类型")
+
+	cellSellerName := titleRow.AddCell()
+	cellSellerName.SetStyle(style)
+	cellSellerName.SetValue("所属销售")
+
+	permissionMap := make(map[int][]string)
+	tmpPermissionMap := make(map[int]map[string][]string)
+	companyContractIdList := make([]string, 0)
+	for _, v := range resp.List {
+		companyContractIdList = append(companyContractIdList, fmt.Sprint(v.CompanyContractId))
+	}
+	if dataType == "新签客户" || dataType == "续约客户" {
+		cellMoney := titleRow.AddCell()
+		cellMoney.SetStyle(style)
+		cellMoney.SetValue("合同金额")
+		cellPermission := titleRow.AddCell()
+		cellPermission.SetStyle(style)
+		cellPermission.SetValue("合同品种")
+
+		//这么大费周章的目的是为了:权益的品种存在主观、客观的区分,如果一个品种既存在主观,又存在客观,那么就展示品种名称,否则就要列出品种名称+主、客观类型
+		if len(companyContractIdList) > 0 {
+			list, tmpErr := company.GetCompanyContractPermissionListByContractIds(strings.Join(companyContractIdList, ","))
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			for _, v := range list {
+				tmpPermissionNameMap, ok := tmpPermissionMap[v.CompanyContractId]
+				if ok {
+					tmpPermissionNameList, ok2 := tmpPermissionNameMap[v.ChartPermissionName]
+					if ok2 {
+						tmpPermissionNameList = append(tmpPermissionNameList, v.PermissionRemark)
+					} else {
+						tmpPermissionNameList = []string{v.PermissionRemark}
+					}
+					tmpPermissionNameMap[v.ChartPermissionName] = tmpPermissionNameList
+				} else {
+					tmpPermissionNameMap = make(map[string][]string)
+					tmpPermissionNameMap[v.ChartPermissionName] = []string{v.PermissionRemark}
+				}
+				tmpPermissionMap[v.CompanyContractId] = tmpPermissionNameMap
+			}
+		}
+	}
+
+	for companyContractId, tmpPermissionNameMap := range tmpPermissionMap {
+		tmpPermissionName := ``
+		tmpPermissionList := []string{}
+		for tmpChartPermissionName, tmpChartPermissionNameList := range tmpPermissionNameMap {
+			if len(tmpChartPermissionNameList) > 1 {
+				tmpPermissionName = tmpChartPermissionName
+			} else {
+				tmpPermissionName = tmpChartPermissionNameList[0]
+			}
+			tmpPermissionList = append(tmpPermissionList, tmpPermissionName)
+		}
+
+		permissionMap[companyContractId] = tmpPermissionList
+	}
+
+	cellTime := titleRow.AddCell()
+	cellTime.SetStyle(style)
+	switch dataType {
+	case "新增试用":
+		cellTime.SetValue("新增时间")
+	case "新签客户":
+		cellTime.SetValue("签约时间")
+	case "续约客户":
+		cellTime.SetValue("续约时间")
+	case "未续约客户":
+		cellTime.SetValue("最近合同到期时间")
+
+		cellAscribeContent := titleRow.AddCell()
+		cellAscribeContent.SetStyle(style)
+		cellAscribeContent.SetValue("不续约归因")
+
+		cellContent := titleRow.AddCell()
+		cellContent.SetStyle(style)
+		cellContent.SetValue("详细原因")
+	}
+
+	for _, v := range resp.List {
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+
+		cellDataName := dataRow.AddCell()
+		cellDataName.SetStyle(style)
+		cellDataName.SetValue(v.CompanyName)
+
+		cellDataProName := dataRow.AddCell()
+		cellDataProName.SetStyle(style)
+		cellDataProName.SetValue(v.ProductName)
+
+		cellDataSellerName := dataRow.AddCell()
+		cellDataSellerName.SetStyle(style)
+		cellDataSellerName.SetValue(v.SellerName)
+
+		if dataType == "新签客户" || dataType == "续约客户" {
+			cellDataMoney := dataRow.AddCell()
+			cellDataMoney.SetStyle(style)
+			cellDataMoney.SetValue(v.Money)
+			cellDataPermission := dataRow.AddCell()
+			cellDataPermission.SetStyle(style)
+			if permissionStrList, ok := permissionMap[v.CompanyContractId]; ok {
+				cellDataPermission.SetValue(strings.Join(permissionStrList, ","))
+			}
+		}
+
+		cellDataTime := dataRow.AddCell()
+		cellDataTime.SetStyle(style)
+		switch dataType {
+		case "新增试用":
+			cellDataTime.SetValue(v.CreateTime)
+		case "新签客户":
+			cellDataTime.SetValue(v.StartDate)
+		case "续约客户":
+			cellDataTime.SetValue(v.StartDate)
+		case "未续约客户":
+			cellDataTime.SetValue(v.EndDate)
+
+			cellAscribeContent := dataRow.AddCell()
+			cellAscribeContent.SetStyle(style)
+			cellAscribeContent.SetValue(v.AscribeContent)
+
+			cellContent := dataRow.AddCell()
+			cellContent.SetStyle(style)
+			cellContent.SetValue(v.Content)
+		}
+
+	}
+	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 = "导出成功"
+}
+
+// @Title 上一份合同详情
+// @Description 上一份合同详情接口
+// @Param   ComPanyId   query   int  true       "公司ID"
+// @Success Ret=200 {object} company.GetCompanyContractMergeDetailResp
+// @router /merge_company_previous/detail [get]
+func (this *StatisticCompanyMergerController) CompanyPreviousDetail() {
+	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
+	}
+	resp := new(company.GetCompanyContractMergeDetailResp)
+	comPanyId, _ := this.GetInt("ComPanyId")
+	if comPanyId < 1 {
+		br.Msg = "请输入公司ID"
+		return
+	}
+	var condition string
+	var pars []interface{}
+
+	condition = " AND company_id = ?  ORDER BY start_date DESC   LIMIT  1  "
+	pars = append(pars, comPanyId)
+	detail, err := company.GetCompanyContractMergeDetail(condition, pars)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	pars = make([]interface{}, 0)
+	condition = " AND company_id = ?  AND company_contract_merge_id != ?   ORDER BY start_date DESC   LIMIT  1  "
+	pars = append(pars, comPanyId, detail.CompanyContractMergeId)
+	detailPrevious, err := company.GetCompanyContractMergeDetail(condition, pars)
+	if err != nil {
+		br.Msg = "详情不存在"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	resp.Detail = detailPrevious
+	mappermissionName, err := services.GetCompanyContractPermissionNameMapById(map[int]string{detailPrevious.CompanyId: detailPrevious.CompanyContractIdGroup})
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	detailPrevious.PermissionName = mappermissionName[detailPrevious.CompanyId]
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 47 - 1
models/company/company_contract.go

@@ -194,4 +194,50 @@ func GetCompanyContractUpgradePermissionCheckByContractId(companyId, companyCont
 	sql := `SELECT COUNT(1) AS count FROM company_contract_permission AS a WHERE a.company_id=? AND company_contract_id=? AND a.chart_permission_id=? AND a.is_upgrade=? `
 	err = o.Raw(sql, companyId, companyContractId, permissionId, isUpgrade).QueryRow(&count)
 	return
-}
+}
+
+type CompanyContractResp struct {
+	CompanyContractId int       `orm:"column(company_contract_id);pk" description:"客户合同id"`
+	ContractType      string    `description:"合同类型:枚举值:'新签合同','续约合同','补充协议'"`
+	ProductId         int       `description:"产品id"`
+	ProductName       string    `description:"产品名称"`
+	CompanyId         int       `description:"客户id"`
+	CompanyProductId  int       `description:"客户产品id"`
+	ContractCode      string    `description:"合同编码"`
+	StartDate         time.Time `description:"合同开始时间"`
+	EndDate           time.Time `description:"合同结束时间"`
+	Money             float64   `description:"合同金额"`
+	PayMethod         string    `description:"支付方式"`
+	PayChannel        string    `description:"支付渠道"`
+	ImgUrl            string    `description:"合同图片,多个用#隔开"`
+	CreateTime        time.Time `description:"合同创建时间"`
+	ModifyTime        time.Time `description:"合同修改时间"`
+	Status            int       `description:"状态"`
+	Source            string    `description:"合同来源,枚举值:上传附件、系统合同,默认上传附件"`
+	PackageType       int       `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
+	RaiPackageType    int       `description:"权益套餐类型: 0-无; 1-70w大套餐; 2-45w大套餐"`
+}
+
+// 获取合同列表
+func GetCompanyContractList(condition string, pars []interface{}) (items []*CompanyContractResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_contract WHERE 1 = 1  `
+
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// 获取合同对应的权限列表
+func GetCompanyContractPermissionList(condition string, pars []interface{}) (items []*CompanyContractPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_contract_permission WHERE 1 = 1  `
+
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 113 - 0
models/company/company_contract_merge.go

@@ -0,0 +1,113 @@
+package company
+
+import (
+	//"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CompanyContractMerge struct {
+	CompanyContractMergeId int       `orm:"column(company_contract_merge_id);pk" description:"主键ID"`
+	ContractType           string    `description:"合同类型:枚举值:'新签合同','续约合同','补充协议'"`
+	ProductId              int       `description:"产品id"`
+	ProductName            string    `description:"产品名称"`
+	CompanyId              int       `description:"客户id"`
+	CompanyProductId       int       `description:"客户产品id"`
+	StartDate              string    `description:"合同开始时间"`
+	EndDate                string    `description:"合同结束时间"`
+	Money                  float64   `description:"合同金额"`
+	CreateTime             time.Time `description:"合同创建时间"`
+	ModifyTime             time.Time `description:"合同修改时间"`
+	CompanyContractIdGroup string    `description:"表company_contract合并的 company_contract_id"`
+	ChartPermissionName    string    `description:"权限类目名称"`
+	PackageDifference      string    `description:"和上一份合同的区别"`
+}
+
+type CompanyContractMergeResp struct {
+	CompanyContractMergeId int       `orm:"column(company_contract_merge_id);pk" description:"主键ID"`
+	ContractType           string    `description:"合同类型:枚举值:'新签合同','续约合同','补充协议'"`
+	ProductId              int       `description:"产品id"`
+	ProductName            string    `description:"产品名称"`
+	CompanyId              int       `description:"客户id"`
+	CompanyProductId       int       `description:"客户产品id"`
+	StartDate              time.Time `description:"合同开始时间"`
+	EndDate                time.Time `description:"合同结束时间"`
+	Money                  float64   `description:"合同金额"`
+	CreateTime             time.Time `description:"合同创建时间"`
+	ModifyTime             time.Time `description:"合同修改时间"`
+	CompanyContractIdGroup string    `description:"表company_contract合并的 company_contract_id"`
+	ChartPermissionName    string    `description:"权限类目名称"`
+	PackageDifference      string    `description:"和上一份合同的区别"`
+}
+
+type CompanyContractMergeDetailResp struct {
+	CompanyContractMergeId int       `orm:"column(company_contract_merge_id);pk" description:"主键ID"`
+	ContractType           string    `description:"合同类型:枚举值:'新签合同','续约合同','补充协议'"`
+	ProductId              int       `description:"产品id"`
+	ProductName            string    `description:"产品名称"`
+	CompanyId              int       `description:"客户id"`
+	CompanyProductId       int       `description:"客户产品id"`
+	StartDate              string    `description:"合同开始时间"`
+	EndDate                string    `description:"合同结束时间"`
+	Money                  float64   `description:"合同金额"`
+	CreateTime             time.Time `description:"合同创建时间"`
+	ModifyTime             time.Time `description:"合同修改时间"`
+	CompanyContractIdGroup string    `description:"表company_contract合并的 company_contract_id"`
+	ChartPermissionName    string    `description:"权限类目名称"`
+	PackageDifference      string    `description:"和上一份合同的区别"`
+	PermissionName         string    `description:"权限名"`
+}
+
+// MultiAddCompanyContractMerge 批量添加合同合并之后的数据
+func MultiAddCompanyContractMerge(items []*CompanyContractMerge) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+// GetIncrementalNewCompanyProductMergeCount 获取增量客户产品报表列表统计数据(根据合同来展示)
+func GetIncrementalNewCompanyProductMergeCount(condition string, pars []interface{}) (total int, err error) {
+	o := orm.NewOrm()
+
+	sql := `SELECT a.*,b.region_type,c.seller_id,c.seller_name,b.company_name FROM company_contract_merge 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 `
+
+	if condition != "" {
+		sql += condition
+	}
+	sql = `select count(1) count from (` + sql + ` group by company_id,product_id) f`
+	err = o.Raw(sql, pars).QueryRow(&total)
+	return
+}
+
+// GetIncrementalRenewalCompanyProductMergeCount 续约合同数量
+func GetIncrementalRenewalCompanyProductMergeCount(condition string, pars []interface{}) (total int, err error) {
+	o := orm.NewOrm()
+
+	sql := `SELECT a.*,b.region_type,c.seller_id,c.seller_name,b.company_name FROM company_contract_merge 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 `
+
+	if condition != "" {
+		sql += condition
+	}
+	sql = `select count(1) count from (` + sql + ` group by company_id,product_id) f`
+	err = o.Raw(sql, pars).QueryRow(&total)
+	return
+}
+
+type GetCompanyContractMergeDetailResp struct {
+	Detail *CompanyContractMergeDetailResp
+}
+
+// 通过ID获取详情
+func GetCompanyContractMergeDetail(condition string, pars []interface{}) (item *CompanyContractMergeDetailResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_contract_merge  WHERE 1= 1 ` + condition
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}

+ 1 - 0
models/db.go

@@ -235,6 +235,7 @@ func initCompany() {
 		new(company.CompanyPermissionLog),
 		new(company.CompanyReportPermission),
 		new(company.CompanyContract),
+		new(company.CompanyContractMerge), //续约合同,新签合同进行合并
 		new(company.CompanyContractPermission),
 		new(company.CompanyContractPermissionLog),
 		new(company.CompanyProduct),

+ 14 - 8
models/response/statistic_report.go

@@ -98,14 +98,15 @@ type StackCompanyListResp struct {
 
 // 增量客户统计报表返回类
 type IncrementalCompanyListResp struct {
-	List                   []*models.IncrementalList
-	Paging                 *paging.PagingItem `description:"分页数据"`
-	TrialTotal             int                `description:"新增试用客户数"`
-	NewCompanyTotal        int                `description:"新签客户数"`
-	RenewalCompanyTotal    int                `description:"续约客户数"`
-	NotRenewalCompanyTotal int                `description:"未续约客户数"`
-	NotRenewalTryOut       int                `description:"未续约客户(试用)数"`
-	NotRenewalNotTryOut    int                `description:"未续约客户(非试用)数"`
+	List                              []*models.IncrementalList
+	Paging                            *paging.PagingItem `description:"分页数据"`
+	TrialTotal                        int                `description:"新增试用客户数"`
+	NewCompanyTotal                   int                `description:"新签客户数"`
+	RenewalCompanyTotal               int                `description:"续约客户数"`
+	NotRenewalCompanyTotal            int                `description:"未续约客户数(已确认)"`
+	NotRenewalCompanyToBeConfirmTotal int                `description:"未续约客户数(待确认)"`
+	NotRenewalTryOut                  int                `description:"未续约客户(试用)数"`
+	NotRenewalNotTryOut               int                `description:"未续约客户(非试用)数"`
 }
 
 // MoreRenewReasonResp 未续约说明列表返回类
@@ -122,3 +123,8 @@ type RenewReasonItemResp struct {
 	RenewalTodo   string `description:"待办事项说明"`
 	CreateTime    string `description:"添加时间"`
 }
+
+// 合并之后的合同详情
+type CompanyPreviousDetailResp struct {
+	Detail *models.IncrementalList
+}

+ 48 - 29
models/statistic_report.go

@@ -371,35 +371,37 @@ func GetIncomeList(condition string, pars []interface{}, startSize, pageSize int
 
 // 增量客户统计报表列表数据结构
 type IncrementalList struct {
-	CompanyContractId   int                                `description:"合同id"`
-	ContractType        string                             `description:"合同类型"`
-	CompanyId           int                                `description:"企业客户id"`
-	CompanyName         string                             `description:"企业客户名称"`
-	ProductId           int                                `description:"产品id"`
-	ProductName         string                             `description:"产品名称"`
-	CompanyProductId    int                                `description:"客户购买产品授权id"`
-	ContractCode        string                             `description:"合同编码"`
-	StartDate           string                             `description:"合同开始日期"`
-	EndDate             string                             `description:"合同结束日期"`
-	Money               float64                            `description:"合同金额"`
-	PayMethod           string                             `description:"付款方式"`
-	PayChannel          string                             `description:"付款渠道"`
-	ImgUrl              string                             `description:"合同图片"`
-	CreateTime          string                             `description:"合同创建时间"`
-	ModifyTime          string                             `description:"合同修改时间"`
-	Status              string                             `description:"合同审批状态,0:待审批,1:已审批;默认:1"`
-	RegionType          string                             `description:"企业客户所属区域;可选范围:国内,海外"`
-	SellerId            int                                `description:"归属销售id"`
-	SellerName          string                             `description:"归属销售名称"`
-	ExpireDay           string                             `description:"剩余可用天数"`
-	PermissionList      []*company.CompanyReportPermission `description:"产品权限"`
-	Count               int                                `json:"-" description:"合同数"`
-	RenewalReason       string                             `description:"未续约说明"`
-	RenewalTodo         string                             `description:"未续约说明中的待办事项说明"`
-	PackageDifference   string                             `description:"和上一份合同的区别"`
-	AscribeContent      string                             `description:"归因标签说明"`
-	IsShowNoRenewedNote bool                               `description:"是否展示未续约备注按钮"`
-	Content             string                             `description:"归因内容说明"`
+	CompanyContractId      int                                `description:"合同id"`
+	ContractType           string                             `description:"合同类型"`
+	CompanyId              int                                `description:"企业客户id"`
+	CompanyName            string                             `description:"企业客户名称"`
+	ProductId              int                                `description:"产品id"`
+	ProductName            string                             `description:"产品名称"`
+	CompanyProductId       int                                `description:"客户购买产品授权id"`
+	ContractCode           string                             `description:"合同编码"`
+	StartDate              string                             `description:"合同开始日期"`
+	EndDate                string                             `description:"合同结束日期"`
+	Money                  float64                            `description:"合同金额"`
+	PayMethod              string                             `description:"付款方式"`
+	PayChannel             string                             `description:"付款渠道"`
+	ImgUrl                 string                             `description:"合同图片"`
+	CreateTime             string                             `description:"合同创建时间"`
+	ModifyTime             string                             `description:"合同修改时间"`
+	Status                 string                             `description:"合同审批状态,0:待审批,1:已审批;默认:1"`
+	RegionType             string                             `description:"企业客户所属区域;可选范围:国内,海外"`
+	SellerId               int                                `description:"归属销售id"`
+	SellerName             string                             `description:"归属销售名称"`
+	ExpireDay              string                             `description:"剩余可用天数"`
+	PermissionList         []*company.CompanyReportPermission `description:"产品权限"`
+	Count                  int                                `json:"-" description:"合同数"`
+	RenewalReason          string                             `description:"未续约说明"`
+	RenewalTodo            string                             `description:"未续约说明中的待办事项说明"`
+	PackageDifference      string                             `description:"和上一份合同的区别"`
+	AscribeContent         string                             `description:"归因标签说明"`
+	IsShowNoRenewedNote    bool                               `description:"是否展示未续约备注按钮"`
+	Content                string                             `description:"归因内容说明"`
+	PermissionName         string                             `description:"权限名"`
+	CompanyContractIdGroup string                             `description:"表company_contract合并的 company_contract_id"`
 }
 
 // GetIncrementalNewCompanyCount 获取增量客户报表列表统计数据(根据合同来展示)
@@ -844,3 +846,20 @@ func GetLastContractMoney(CompanyIds string) (items []*IncrementalList, err erro
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+// GetIncrementalNewCompanyList 获取增量客户报表列表数据(根据合同来展示)
+func GetIncrementalCompanyMergeList(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_merge 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 `
+
+	if condition != "" {
+		sql += condition
+	}
+	sql += " order by a.start_date desc "
+	sql = `select *,count(*) count from (` + sql + `) b group by company_id,product_id  order by start_date desc,company_id desc limit ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}

+ 18 - 0
routers/commentsRouter.go

@@ -9943,6 +9943,24 @@ 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: "MergeCompanyList",
+            Router: `/merge_company_list`,
+            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: "CompanyPreviousDetail",
+            Router: `/merge_company_previous/detail`,
+            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: "InvoicePaymentList",

+ 1 - 0
routers/router.go

@@ -68,6 +68,7 @@ func init() {
 				&controllers.StatisticReportController{},
 				&controllers.StatisticYbLogController{},
 				&controllers.StatisticReportCommonController{},
+				&controllers.StatisticCompanyMergerController{},
 			),
 		),
 		web.NSNamespace("/voice",

+ 203 - 0
services/company_contract.go

@@ -0,0 +1,203 @@
+package services
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+//func init() {
+//	InitCompanyContractMerge()
+//	//GetCompanyContractPermissionNameMapById(map[int]string{6513: "182,183", 6663: "435,542"})
+//}
+
+// 初始化合并合同之后的数据脚本
+func InitCompanyContractMerge() {
+
+	var condition string
+	var pars []interface{}
+	condition = "  AND status = 1  AND  product_id = 2  ORDER BY  company_contract_id ASC  "
+	companyContractList, err := company.GetCompanyContractList(condition, pars)
+
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	mapCompanyContractItems := make(map[int][]*company.CompanyContractResp)
+	for _, v := range companyContractList {
+		//fmt.Println(v)
+		mapCompanyContractItems[v.CompanyId] = append(mapCompanyContractItems[v.CompanyId], v)
+	}
+
+	mapCompanyMoney := make(map[int]float64)
+	var items []*company.CompanyContractMergeResp
+	for _, ContractItems := range mapCompanyContractItems {
+		item := new(company.CompanyContractMergeResp)
+		for k, v := range ContractItems {
+			item = new(company.CompanyContractMergeResp)
+			item.ContractType = v.ContractType
+			item.ProductId = v.ProductId
+			item.ProductName = v.ProductName
+			item.CompanyId = v.CompanyId
+			item.CompanyProductId = v.CompanyProductId
+			item.StartDate = v.StartDate
+			item.EndDate = v.EndDate
+			item.Money = v.Money
+			item.CompanyContractIdGroup += strconv.Itoa(v.CompanyContractId) + ","
+			if k == 0 {
+				items = append(items, item)
+				mapCompanyMoney[v.CompanyId] = item.Money
+			} else {
+				if v.CompanyId != items[len(items)-1].CompanyId {
+					items = append(items, item)
+				} else {
+					//续约的合同开始时间是否<上一次合同记录的结束时间 且间隔>6个月(180)天,那么就对两个合同进行合并
+					if item.StartDate.AddDate(0, 0, +180).Before(items[len(items)-1].EndDate) && item.EndDate.After(items[len(items)-1].EndDate) {
+						items[len(items)-1].Money += v.Money
+						items[len(items)-1].EndDate = v.EndDate
+						items[len(items)-1].CompanyContractIdGroup += strconv.Itoa(v.CompanyContractId) + ","
+					} else {
+						if item.ContractType == "续约合同" {
+							if item.Money > mapCompanyMoney[v.CompanyId] {
+								item.PackageDifference = "增加套餐"
+							}
+							if item.Money == mapCompanyMoney[v.CompanyId] {
+								item.PackageDifference = "维持套餐"
+							}
+							if item.Money < mapCompanyMoney[v.CompanyId] {
+								item.PackageDifference = "减少套餐"
+							}
+						}
+						items = append(items, item)
+						mapCompanyMoney[v.CompanyId] = item.Money
+					}
+				}
+			}
+		}
+	}
+
+	var contractMergeitems []*company.CompanyContractMerge
+	for _, v := range items {
+		item := new(company.CompanyContractMerge)
+		item.ContractType = v.ContractType
+		item.ProductId = v.ProductId
+		item.ProductName = v.ProductName
+		item.CompanyId = v.CompanyId
+		item.CompanyProductId = v.CompanyProductId
+		item.StartDate = v.StartDate.Format(utils.FormatDate)
+		item.EndDate = v.EndDate.Format(utils.FormatDate)
+		item.Money = v.Money
+		item.PackageDifference = v.PackageDifference
+		item.CompanyContractIdGroup = strings.TrimRight(v.CompanyContractIdGroup, ",")
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+		contractMergeitems = append(contractMergeitems, item)
+	}
+
+	err = company.MultiAddCompanyContractMerge(contractMergeitems)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+}
+
+func GetCompanyContractPermissionNameMapById(mapCompamy map[int]string) (mapContractResp map[int]string, err error) {
+	var condition string
+	var pars []interface{}
+
+	mapContracIdCompanyId := make(map[string]int) //建立合同ID与公司ID的map对应关系
+
+	var companyContractIdGroup string //多个合同ID
+	for k, v := range mapCompamy {
+		companyContractIdGroup += v + ","
+		sliceContract := strings.Split(v, ",")
+		for _, compamyContracId := range sliceContract {
+			mapContracIdCompanyId[compamyContracId] = k
+		}
+	}
+
+	companyContractIdGroup = strings.TrimRight(companyContractIdGroup, ",")
+	condition += " AND  company_contract_id IN (" + companyContractIdGroup + ")"
+	companyContractList, e := company.GetCompanyContractList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyContractList, Err: " + e.Error())
+		return
+	}
+
+	permissionList, e := models.GetChartPermissionList()
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetChartPermissionList, Err: " + e.Error())
+		return
+	}
+	mappermissionName := make(map[int]string)
+	for _, v := range permissionList {
+		mappermissionName[v.ChartPermissionId] = v.Remark
+	}
+
+	mapContractIdPerssion := make(map[string]string) //单个合同ID所对应的套餐或者权限名称
+	for _, v := range companyContractList {
+		if v.RaiPackageType == 1 {
+			mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)] = "70w套餐"
+		}
+		if v.RaiPackageType == 2 {
+			mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)] = "45w套餐"
+		}
+	}
+
+	companyContractPermissionList, e := company.GetCompanyContractPermissionList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyContractPermissionList, Err: " + e.Error())
+		return
+	}
+	for _, v := range companyContractPermissionList {
+		//如果开通的不是整个套餐,那么就做单独的子权限处理
+		if strings.Count(mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)], "w套餐") == 0 {
+			if v.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+				if v.ExpensiveYx == 1 {
+					mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(5w),"
+				} else {
+					mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(3w),"
+				}
+			} else {
+				mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)] += mappermissionName[v.ChartPermissionId] + ","
+			}
+		}
+	}
+
+	//过滤主客观权限
+	for k, v := range mapContractIdPerssion {
+		perssionName := v
+		if strings.Count(v, utils.YI_YAO_NAME) == 2 {
+			perssionName = strings.Replace(perssionName, "医药(主观)", "医药", -1)
+			perssionName = strings.Replace(perssionName, "医药(客观)", "", -1)
+		}
+		if strings.Count(v, utils.XIAO_FEI_NAME) == 2 {
+			perssionName = strings.Replace(perssionName, "消费(主观)", "消费", -1)
+			perssionName = strings.Replace(perssionName, "消费(客观)", "", -1)
+		}
+		if strings.Count(v, utils.KE_JI_NAME) == 2 {
+			perssionName = strings.Replace(perssionName, "科技(主观)", "科技", -1)
+			perssionName = strings.Replace(perssionName, "科技(客观)", "", -1)
+		}
+		if strings.Count(v, utils.ZHI_ZAO_NAME) == 2 {
+			perssionName = strings.Replace(perssionName, "智造(主观)", "智造", -1)
+			perssionName = strings.Replace(perssionName, "智造(客观)", "", -1)
+		}
+		perssionName = strings.TrimRight(perssionName, ",")
+		mapContractIdPerssion[k] = perssionName
+	}
+	mapContractResp = make(map[int]string, 0)
+	for k, v := range mapContractIdPerssion {
+		mapContractResp[mapContracIdCompanyId[k]] += v + ","
+	}
+
+	for k, v := range mapContractResp {
+		mapContractResp[k] = strings.TrimRight(v, ",")
+	}
+	return
+}