xingzai il y a 1 an
Parent
commit
538aa9c06f

+ 337 - 26
controllers/statistic_company_merge.go

@@ -3,10 +3,15 @@ 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"
@@ -19,9 +24,9 @@ type StatisticCompanyMergerController struct {
 	BaseAuthController
 }
 
-// IncrementalCompanyList
-// @Title 获取增量客户数据列表
-// @Description 获取增量客户数据列表接口
+// MergeCompanyList
+// @Title 权益客户统计列表(合同进行合并之后的)
+// @Description 权益客户统计列表接口
 // @Param   PageSize   query   int  true       "每页数据条数"
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   Keyword   query   string  true       "客户名称"
@@ -38,7 +43,7 @@ type StatisticCompanyMergerController struct {
 // @Param   PackageDifference   query   string  false       "和上一份合同的区别,枚举值:`增加套餐`,`减少套餐`,`维持套餐`"
 // @Success 200 {object} response.IncrementalCompanyListResp
 // @router /merge_company_list [get]
-func (this *StatisticCompanyMergerController) IncrementalCompanyList() {
+func (this *StatisticCompanyMergerController) MergeCompanyList() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
@@ -115,20 +120,17 @@ func (this *StatisticCompanyMergerController) IncrementalCompanyList() {
 		pars = append(pars, regionType)
 	}
 
-	if packageDifference != "" {
-		condition += ` AND b.package_difference = ? `
-		pars = append(pars, regionType)
-	}
-
 	//关键字搜索
 	if keyword != "" {
 		condition += ` and b.company_name like "%` + keyword + `%" `
 	}
 
-	var conditionAscribRai string      // 处理权益未续约客户检索列表SQL查询条件
-	var conditionAscribRaiTotal string // 处理权益未续约客户总量查询条件
+	var conditionAscribRai string          // 处理权益未续约客户检索列表SQL查询条件
+	var conditionAscribRaiTotal string     // 处理权益未续约客户总量查询条件
+	var conditionAscribRaiToBeTotal string // 处理权益未续约客户待确认总量查询条件
 	var parsAscribeRai []interface{}
-	var parsAscribeRaiTotal []interface{} // 处理权益未续约客户总量查询条件
+	var parsAscribeRaiTotal []interface{}     // 处理权益未续约客户总量查询条件
+	var parsAscribeRaiTobeTotal []interface{} // 处理权益未续约客户待确认总量查询条件
 	var conditionConfirm string
 	var parsConfirm []interface{}
 
@@ -149,6 +151,10 @@ func (this *StatisticCompanyMergerController) IncrementalCompanyList() {
 	//是否确认续约 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' )  ` // 待确认
@@ -199,8 +205,10 @@ func (this *StatisticCompanyMergerController) IncrementalCompanyList() {
 	var list []*models.IncrementalList
 	//moreListMap := make(map[int][]*models.IncrementalList)
 
-	var newCompanyTotal int //新签合同数量
-	var dataTotal, trialTotal, renewalCompanyTotal, notRenewalCompanyTotal int
+	var newCompanyTotal int                   //新签合同数量
+	var notRenewalCompanyTotal int            //未续约客户数已确认
+	var notRenewalCompanyToBeConfirmTotal int //未续约客户数待确认
+	var dataTotal, trialTotal, renewalCompanyTotal int
 	var notRenewalTryOut, notRenewalNotTryOut int
 
 	//新签客户数
@@ -241,6 +249,7 @@ func (this *StatisticCompanyMergerController) IncrementalCompanyList() {
 
 	//续约客户数
 	{
+
 		condition1 := condition
 		pars1 := pars
 		condition1 += ` AND a.start_date >= ? AND a.start_date <= ? `
@@ -248,6 +257,12 @@ func (this *StatisticCompanyMergerController) IncrementalCompanyList() {
 		condition1 += ` AND a.contract_type = ? `
 		pars1 = append(pars1, "续约合同")
 
+		//续约的客户才会查询
+		if packageDifference != "" {
+			condition1 += ` AND a.package_difference = ? `
+			pars1 = append(pars1, packageDifference)
+		}
+
 		////额外条件(续约合同的起始日期包含在所选时间段内且不包含在新签合同存续期内的客户)
 		//pars1 = append(pars1, endDate)
 
@@ -301,7 +316,7 @@ func (this *StatisticCompanyMergerController) IncrementalCompanyList() {
 		pars1 = append(pars1, "try_out")
 		condition1 += ` AND c.status not in ("永续","正式","关闭")  `
 
-		//未续约这里只统计已经确定的
+		//未续约已确认数量
 		notRenewalCondition := condition1
 		notRenewalPars := pars1
 		notRenewalCondition += conditionAscribRaiTotal
@@ -314,6 +329,18 @@ func (this *StatisticCompanyMergerController) IncrementalCompanyList() {
 		}
 		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 == "未续约客户" {
@@ -401,9 +428,10 @@ func (this *StatisticCompanyMergerController) IncrementalCompanyList() {
 	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 != "新增试用" {
 			//剩余可用天数
@@ -413,25 +441,308 @@ func (this *StatisticCompanyMergerController) IncrementalCompanyList() {
 			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,
-		NotRenewalTryOut:       notRenewalTryOut,
-		NotRenewalNotTryOut:    notRenewalNotTryOut,
+		Paging:                            page,
+		List:                              list,
+		TrialTotal:                        trialTotal,
+		NewCompanyTotal:                   newCompanyTotal,
+		RenewalCompanyTotal:               renewalCompanyTotal,
+		NotRenewalCompanyTotal:            notRenewalCompanyTotal,
+		NotRenewalCompanyToBeConfirmTotal: notRenewalCompanyToBeConfirmTotal,
+		NotRenewalTryOut:                  notRenewalTryOut,
+		NotRenewalNotTryOut:               notRenewalNotTryOut,
 	}
 	//fmt.Println()
 	//导出excel
 	if isExport {
-		//IncrementalCompanyListExport(this, dataType, resp, br)
+		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 = "获取成功"

+ 30 - 78
models/company/company_contract_merge.go

@@ -3,12 +3,11 @@ package company
 import (
 	//"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"time"
 )
 
 type CompanyContractMerge struct {
-	CompanyContractId      int       `orm:"column(company_contract_merge_id);pk" description:"主键ID"`
+	CompanyContractMergeId int       `orm:"column(company_contract_merge_id);pk" description:"主键ID"`
 	ContractType           string    `description:"合同类型:枚举值:'新签合同','续约合同','补充协议'"`
 	ProductId              int       `description:"产品id"`
 	ProductName            string    `description:"产品名称"`
@@ -21,10 +20,11 @@ type CompanyContractMerge struct {
 	ModifyTime             time.Time `description:"合同修改时间"`
 	CompanyContractIdGroup string    `description:"表company_contract合并的 company_contract_id"`
 	ChartPermissionName    string    `description:"权限类目名称"`
+	PackageDifference      string    `description:"和上一份合同的区别"`
 }
 
 type CompanyContractMergeResp struct {
-	CompanyContractId      int       `orm:"column(company_contract_merge_id);pk" description:"主键ID"`
+	CompanyContractMergeId int       `orm:"column(company_contract_merge_id);pk" description:"主键ID"`
 	ContractType           string    `description:"合同类型:枚举值:'新签合同','续约合同','补充协议'"`
 	ProductId              int       `description:"产品id"`
 	ProductName            string    `description:"产品名称"`
@@ -37,6 +37,25 @@ type CompanyContractMergeResp struct {
 	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 批量添加合同合并之后的数据
@@ -49,51 +68,6 @@ func MultiAddCompanyContractMerge(items []*CompanyContractMerge) (err error) {
 	return
 }
 
-// 增量客户统计报表列表数据结构
-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      []*CompanyReportPermission `description:"产品权限"`
-	Count               int                        `json:"-" description:"合同数"`
-	RenewalReason       string                     `description:"未续约说明"`
-	RenewalTodo         string                     `description:"未续约说明中的待办事项说明"`
-	PackageDifference   string                     `description:"和上一份合同的区别"`
-	AscribeContent      string                     `description:"归因标签说明"`
-	IsShowNoRenewedNote bool                       `description:"是否展示未续约备注按钮"`
-	Content             string                     `description:"归因内容说明"`
-}
-
-// 增量客户统计报表返回类
-type IncrementalCompanyListResp struct {
-	List                   []*IncrementalList
-	Paging                 *paging.PagingItem `description:"分页数据"`
-	TrialTotal             int                `description:"新增试用客户数"`
-	NewCompanyTotal        int                `description:"新签客户数"`
-	RenewalCompanyTotal    int                `description:"续约客户数"`
-	NotRenewalCompanyTotal int                `description:"未续约客户数"`
-	NotRenewalTryOut       int                `description:"未续约客户(试用)数"`
-	NotRenewalNotTryOut    int                `description:"未续约客户(非试用)数"`
-}
-
 // GetIncrementalNewCompanyProductMergeCount 获取增量客户产品报表列表统计数据(根据合同来展示)
 func GetIncrementalNewCompanyProductMergeCount(condition string, pars []interface{}) (total int, err error) {
 	o := orm.NewOrm()
@@ -110,23 +84,6 @@ func GetIncrementalNewCompanyProductMergeCount(condition string, pars []interfac
 	return
 }
 
-// GetIncrementalNewCompanyList 获取增量客户报表列表数据(根据合同来展示)
-func GetIncrementalCompanyProductMergeCount(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
-}
-
 // GetIncrementalRenewalCompanyProductMergeCount 续约合同数量
 func GetIncrementalRenewalCompanyProductMergeCount(condition string, pars []interface{}) (total int, err error) {
 	o := orm.NewOrm()
@@ -143,19 +100,14 @@ func GetIncrementalRenewalCompanyProductMergeCount(condition string, pars []inte
 	return
 }
 
-// GetIncrementalRenewalCompanyMergeList续约合同列表
-func GetIncrementalRenewalCompanyMergeList(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 `
+type GetCompanyContractMergeDetailResp struct {
+	Detail *CompanyContractMergeDetailResp
+}
 
-	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)
+// 通过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
 }

+ 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
+}

+ 31 - 30
models/statistic_report.go

@@ -371,36 +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:"归因内容说明"`
-	PermissionName      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 获取增量客户报表列表统计数据(根据合同来展示)

+ 10 - 1
routers/commentsRouter.go

@@ -9855,13 +9855,22 @@ func init() {
 
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticCompanyMergerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:StatisticCompanyMergerController"],
         beego.ControllerComments{
-            Method: "IncrementalCompanyList",
+            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",

+ 56 - 7
services/company_contract.go

@@ -13,6 +13,7 @@ import (
 
 //func init() {
 //	InitCompanyContractMerge()
+//	//GetCompanyContractPermissionNameMapById(map[int]string{6513: "182,183", 6663: "435,542"})
 //}
 
 // 初始化合并合同之后的数据脚本
@@ -20,7 +21,7 @@ func InitCompanyContractMerge() {
 
 	var condition string
 	var pars []interface{}
-	condition = "  AND status = 1  AND  product_id = 2   "
+	condition = "  AND status = 1  AND  product_id = 2  ORDER BY  company_contract_id ASC  "
 	companyContractList, err := company.GetCompanyContractList(condition, pars)
 
 	if err != nil {
@@ -32,6 +33,8 @@ func InitCompanyContractMerge() {
 		//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)
@@ -48,6 +51,7 @@ func InitCompanyContractMerge() {
 			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)
@@ -58,7 +62,19 @@ func InitCompanyContractMerge() {
 						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
 					}
 				}
 			}
@@ -76,6 +92,7 @@ func InitCompanyContractMerge() {
 		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()
@@ -93,10 +110,17 @@ func GetCompanyContractPermissionNameMapById(mapCompamy map[int]string) (mapCont
 	var condition string
 	var pars []interface{}
 
+	mapContracIdCompanyId := make(map[string]int) //建立合同ID与公司ID的map对应关系
+
 	var companyContractIdGroup string //多个合同ID
-	for _, v := range mapCompamy {
+	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)
@@ -135,20 +159,45 @@ func GetCompanyContractPermissionNameMapById(mapCompamy map[int]string) (mapCont
 		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)] += mappermissionName[v.ChartPermissionId] + ","
+					mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)] += utils.CHART_PERMISSION_NAME_MF_YANXUAN + "(5w),"
 				} else {
-					mapContractIdPerssion[strconv.Itoa(v.CompanyContractId)] += mappermissionName[v.ChartPermissionId] + ","
+					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 + ","
 	}
 
-	if err != nil {
-		fmt.Println(err)
-		return
+	for k, v := range mapContractResp {
+		mapContractResp[k] = strings.TrimRight(v, ",")
 	}
 	return
 }