Browse Source

no message

xingzai 1 year ago
parent
commit
401acb29c6

+ 296 - 3
controllers/company_renewal.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/utils"
 	"time"
 )
 
@@ -15,8 +16,8 @@ type CompanyRenewalController struct {
 
 // @Title 新建归因
 // @Description 新建归因接口
-// @Param   Classify   query   string  true       "客户类型:ficc,合作伙伴,权益"
-// @Success 200 {object} models.CompanyIndustryResp
+// @Param	request	body company.CompanyAscribeAddReq true "type json string"
+// @Success 200 {object} "保存成功"
 // @router /company_ascribe/add [post]
 func (this *CompanyRenewalController) CompanyAscribeAdd() {
 	br := new(models.BaseResponse).Init()
@@ -58,13 +59,305 @@ func (this *CompanyRenewalController) CompanyAscribeAdd() {
 	item.AdminId = sysUser.AdminId
 	item.CreateTime = time.Now()
 	item.ModifyTime = time.Now()
-	err = company.AddCompanyAscribe(item)
+	newId, err := company.AddCompanyAscribe(item)
 	if err != nil {
 		br.Msg = "新建失败"
 		br.ErrMsg = "新建失败,Err:" + err.Error()
 		return
 	}
+	detail := new(company.CompanyAscribeResp)
+	detail.CompanyAscribeId = int(newId)
+	detail.AscribeContent = ascribeContent
+	resp := new(company.CompanyAscribeDetailResp)
+	resp.Detail = detail
 	br.Ret = 200
 	br.Success = true
+	br.Data = resp
 	br.Msg = "新建成功"
 }
+
+// @Title 归因列表接口
+// @Description 归因列表接口
+// @Param   KeyWord   query   string  true       "搜索关键词"
+// @Success 200 {object} company.CompanyAscribeListResp
+// @router /company_ascribe/list [get]
+func (this *CompanyRenewalController) CompanyAscribeList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		return
+	}
+	keyWord := this.GetString("KeyWord")
+	var condition string
+	var pars []interface{}
+	if keyWord != "" {
+		condition += ` AND  ascribe_content LIKE '%` + keyWord + `%'  ORDER  BY  create_time DESC   `
+	}
+	list, err := company.GetCompanyAscribeList(condition, pars, 0, 0)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	resp := new(company.CompanyAscribeListResp)
+	if len(list) == 0 {
+		list = make([]*company.CompanyAscribeResp, 0)
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 添加未续约备注
+// @Description 添加未续约备注接口
+// @Param	request	body company.CompanyNoRenewedNoteReq true "type json string"
+// @Success 200 {object} "保存成功"
+// @router /company_no_renewed_note/add [post]
+func (this *CompanyRenewalController) CompanyNoRenewedNoteAdd() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req company.CompanyNoRenewedNoteReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	content := req.Content
+	companyId := req.CompanyId
+	productId := req.ProductId
+	if companyId < 1 {
+		br.Msg = "公司ID错误!"
+		return
+	}
+	if productId != 1 && productId != 2 {
+		br.Msg = "ProductId错误!"
+		return
+	}
+	item := new(company.CompanyNoRenewedNote)
+	item.Content = content
+	item.CompanyId = companyId
+	item.AdminId = sysUser.AdminId
+	item.ProductId = productId
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	err = company.AddCompanyNoRenewedNote(item)
+	if err != nil {
+		br.Msg = "新建失败"
+		br.ErrMsg = "新建失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "新建成功"
+}
+
+// @Title 未续约备注列表
+// @Description 未续约备注列表接口
+// @Param   CompanyId   query   int  true       "公司ID"
+// @Param   ProductId   query   int  true       "产品ID 1:FICC ,2:权益"
+// @Success 200 {object} company.CompanyAscribeListResp
+// @router /company_no_renewed_note/list [get]
+func (this *CompanyRenewalController) CompanyNoRenewedNoteList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		return
+	}
+	companyId, _ := this.GetInt("CompanyId")
+	productId, _ := this.GetInt("ProductId")
+	if companyId < 1 {
+		br.Msg = "公司ID错误!"
+		return
+	}
+	if productId != 1 && productId != 2 {
+		br.Msg = "ProductId错误!"
+		return
+	}
+	var condition string
+	var pars []interface{}
+	condition += ` AND  company_id  = ?  AND product_id = ?  ORDER  BY  create_time DESC   `
+	pars = append(pars, companyId, productId)
+	list, err := company.GetCompanyNoRenewedNoteList(condition, pars, 0, 0)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	resp := new(company.CompanyNoRenewedNoteListResp)
+	if len(list) == 0 {
+		list = make([]*company.CompanyNoRenewedNoteResp, 0)
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 通过归因添加确认不续约
+// @Description 通过归因添加确认不续约接口
+// @Param	request	body company.CompanyNoRenewedNoteReq true "type json string"
+// @Success 200 {object} "保存成功"
+// @router /company_no_renewed_ascribe/add [post]
+func (this *CompanyRenewalController) CompanyNoRenewedAscribeAdd() {
+	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
+	}
+
+	//内容仅权益管理员账号可以修改
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN {
+		br.Msg = "仅管理员可修改!"
+		return
+	}
+	var req company.CompanyNoRenewedAscribeReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	content := req.Content
+	companyId := req.CompanyId
+	productId := req.ProductId
+	companyAscribeId := req.CompanyAscribeId
+
+	if content == "" {
+		br.Msg = "内容不能为空!"
+		return
+	}
+	if companyId < 1 {
+		br.Msg = "公司ID错误!"
+		return
+	}
+	if productId != 1 && productId != 2 {
+		if companyId < 1 {
+			br.Msg = "ProductId错误!"
+			return
+		}
+	}
+	detail, err := company.GetCompanyAscribeDetail(companyAscribeId)
+	if err != nil {
+		br.Msg = "新建失败"
+		br.ErrMsg = "新建失败,GetCompanyAscribeDetail Err:" + err.Error()
+		return
+	}
+	var condition string
+	var pars []interface{}
+	condition += ` AND  company_id  = ?  AND product_id = ?  ORDER  BY  create_time DESC   `
+	pars = append(pars, companyId, productId)
+
+	total, err := company.GetCompanyNoRenewedAscribeCount(condition, pars)
+	if err != nil {
+		br.Msg = "新建失败"
+		br.ErrMsg = "新建失败,GetCompanyNoRenewedAscribeCount Err:" + err.Error()
+		return
+	}
+	item := new(company.CompanyNoRenewedAscribe)
+	item.CompanyAscribeId = companyAscribeId
+	item.AscribeContent = detail.AscribeContent
+	item.Content = content
+	item.ProductId = productId
+	item.CompanyId = companyId
+	item.AdminId = sysUser.AdminId
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+
+	itemLog := new(company.CompanyNoRenewedAscribeLog)
+	itemLog.CompanyAscribeId = companyAscribeId
+	itemLog.AscribeContent = detail.AscribeContent
+	itemLog.Content = content
+	itemLog.ProductId = productId
+	itemLog.CompanyId = companyId
+	itemLog.AdminId = sysUser.AdminId
+	itemLog.CreateTime = time.Now()
+	itemLog.ModifyTime = time.Now()
+	if total == 0 {
+		err = company.AddCompanyNoRenewedAscribe(item, itemLog)
+	} else {
+		err = company.UpdateCompanyNoRenewedAscribe(item, itemLog)
+	}
+	if err != nil {
+		br.Msg = "新建失败"
+		br.ErrMsg = "新建失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "新建成功"
+}
+
+// @Title 确认归因不续约详情接口
+// @Description 确认归因不续约详情接口
+// @Param   CompanyId   query   int  true       "公司ID"
+// @Param   ProductId   query   int  true       "产品ID 1:FICC ,2:权益"
+// @Success 200 {object} company.CompanyAscribeListResp
+// @router /company_no_renewed_ascribe/detail [get]
+func (this *CompanyRenewalController) CompanyNoRenewedAscribeAddDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		return
+	}
+	companyId, _ := this.GetInt("CompanyId")
+	productId, _ := this.GetInt("ProductId")
+	if companyId < 1 {
+		br.Msg = "公司ID错误!"
+		return
+	}
+	if productId != 1 && productId != 2 {
+		br.Msg = "ProductId错误!"
+		return
+	}
+	resp := new(company.CompanyNoRenewedAscribeDetailResp)
+	detail, err := company.GetCygxProductInteriorDetail(companyId, productId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	resp.Detail = detail
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 208 - 10
controllers/statistic_report.go

@@ -2087,6 +2087,8 @@ func IncomeListExport(this *StatisticReportController, resp response.IncomeListR
 // @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"
 // @Success 200 {object} response.StackCompanyListResp
 // @router /stack_company_list [get]
 func (this *StatisticReportController) StackCompanyList() {
@@ -2122,6 +2124,10 @@ func (this *StatisticReportController) StackCompanyList() {
 	keyword := this.GetString("Keyword")
 
 	date := this.GetString("Date")
+
+	isConfirm, _ := this.GetInt("IsConfirm", -1)               // CRM 13.9
+	companyAscribeId, _ := this.GetInt("CompanyAscribeId", -1) // CRM 13.9
+
 	if date == "" {
 		br.Msg = "获取失败,请选择日期"
 		br.ErrMsg = "获取失败,请选择日期"
@@ -2144,7 +2150,7 @@ func (this *StatisticReportController) StackCompanyList() {
 	var resp response.StackCompanyListResp
 	//历史统计数据
 	if dateTime < todayTimeNumber {
-		tmpResp, err := getHistoryStackCompanyList(sysUser, currentIndex, pageSize, adminId, regionType, companyType, dataType, tryOutType, date, keyword)
+		tmpResp, err := getHistoryStackCompanyList(sysUser, currentIndex, pageSize, isConfirm, companyAscribeId, adminId, regionType, companyType, dataType, tryOutType, date, keyword)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -2153,7 +2159,7 @@ func (this *StatisticReportController) StackCompanyList() {
 		resp = tmpResp
 	} else {
 		//获取实时统计数据(今天数据)
-		tmpResp, err := getTodayStackCompanyListV2(sysUser, currentIndex, pageSize, adminId, regionType, companyType, dataType, tryOutType, keyword)
+		tmpResp, err := getTodayStackCompanyListV2(sysUser, currentIndex, pageSize, isConfirm, companyAscribeId, adminId, regionType, companyType, dataType, tryOutType, keyword)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -2313,7 +2319,7 @@ func StackCompanyListExport(this *StatisticReportController, dataType string, re
 }
 
 // 获取历史的数据
-func getHistoryStackCompanyList(sysUser *system.Admin, currentIndex, pageSize int, adminId, regionType, companyType, dataType, tryOutType, date, keyword string) (returnData response.StackCompanyListResp, err error) {
+func getHistoryStackCompanyList(sysUser *system.Admin, currentIndex, pageSize, isConfirm, companyAscribeId int, adminId, regionType, companyType, dataType, tryOutType, date, keyword string) (returnData response.StackCompanyListResp, err error) {
 	if date == "" {
 		err = errors.New("请选择日期")
 		return
@@ -2335,6 +2341,55 @@ func getHistoryStackCompanyList(sysUser *system.Admin, currentIndex, pageSize in
 	condition += ` AND date = ? `
 	pars = append(pars, date)
 
+	//是否确认续约 CRM 13.9
+	if isConfirm != -1 {
+		var conditionConfirm string
+		var parsConfirm []interface{}
+
+		companyConfirmList, e := company.GetCompanyNoRenewedAscribeList(conditionConfirm, parsConfirm, 0, 0)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetCompanyNoRenewedAscribeList" + e.Error())
+			return
+		}
+		var companyIds []int
+		if len(companyConfirmList) == 0 {
+			companyIds = append(companyIds, 0) // 给一个不存在的ID
+		} else {
+			for _, v := range companyConfirmList {
+				companyIds = append(companyIds, v.CompanyId)
+			}
+		}
+		if isConfirm == 0 {
+			condition += ` AND c.company_id NOT IN (` + utils.GetOrmInReplace(len(companyIds)) + `)` // 待确认
+		} else {
+			condition += ` AND c.company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `)` // 已确认
+		}
+		pars = append(pars, companyIds)
+	}
+
+	//归因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)
+			}
+		}
+		condition += ` AND c.company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `)`
+		pars = append(pars, companyIds)
+	}
+
 	if adminId != "" {
 		condition += ` AND a.seller_id in  (` + adminId + `) `
 		//pars = append(pars, adminId)
@@ -2493,12 +2548,17 @@ func getHistoryStackCompanyList(sysUser *system.Admin, currentIndex, pageSize in
 	//moreListMap := make(map[int][]*models.StackCompanyStatisticList)
 	if dataType == "续约客户" {
 		var ids []string
+		var ascribecompanyIds []int
 		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))
+			ascribecompanyIds = append(ascribecompanyIds, item.CompanyId)
 		}
+		//归因标签
+		mapGetCompanyAscribeContent := services.GetCompanyAscribeContentMap(ascribecompanyIds)
+		mapNoRenewedNote := services.GetCompanyNoRenewedNoteMap(ascribecompanyIds)
 		if len(ids) > 0 {
 			idStr := strings.Join(ids, ",")
 			lists, contractErr := models.GetLastContractMoney(idStr)
@@ -2531,6 +2591,8 @@ func getHistoryStackCompanyList(sysUser *system.Admin, currentIndex, pageSize in
 						item.PackageDifference = "维持套餐"
 					}
 				}
+				item.AscribeContent = mapGetCompanyAscribeContent[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
+				item.IsShowNoRenewedNote = mapNoRenewedNote[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
 			}
 		}
 	}
@@ -2847,7 +2909,7 @@ func getTodayStackCompanyList(sysUser *system.Admin, currentIndex, pageSize int,
 	return resp, err
 }
 
-func getTodayStackCompanyListV2(sysUser *system.Admin, currentIndex, pageSize int, adminId, regionType, companyType, dataType, tryOutType, keyword string) (returnData response.StackCompanyListResp, err error) {
+func getTodayStackCompanyListV2(sysUser *system.Admin, currentIndex, pageSize, isConfirm, companyAscribeId int, adminId, regionType, companyType, dataType, tryOutType, keyword string) (returnData response.StackCompanyListResp, err error) {
 	var startSize int
 	if pageSize <= 0 {
 		pageSize = utils.PageSize20
@@ -2863,6 +2925,55 @@ func getTodayStackCompanyListV2(sysUser *system.Admin, currentIndex, pageSize in
 	today := utils.GetToday(utils.FormatDate)
 	//条件
 
+	//是否确认续约 CRM 13.9
+	if isConfirm != -1 {
+		var conditionConfirm string
+		var parsConfirm []interface{}
+
+		companyConfirmList, e := company.GetCompanyNoRenewedAscribeList(conditionConfirm, parsConfirm, 0, 0)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetCompanyNoRenewedAscribeList" + e.Error())
+			return
+		}
+		var companyIds []int
+		if len(companyConfirmList) == 0 {
+			companyIds = append(companyIds, 0) // 给一个不存在的ID
+		} else {
+			for _, v := range companyConfirmList {
+				companyIds = append(companyIds, v.CompanyId)
+			}
+		}
+		if isConfirm == 0 {
+			condition += ` AND c.company_id NOT IN (` + utils.GetOrmInReplace(len(companyIds)) + `)` // 待确认
+		} else {
+			condition += ` AND c.company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `)` // 已确认
+		}
+		pars = append(pars, companyIds)
+	}
+
+	//归因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)
+			}
+		}
+		condition += ` AND c.company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `)`
+		pars = append(pars, companyIds)
+	}
+
 	if adminId != "" {
 		condition += ` AND c.seller_id in  (` + adminId + `) `
 		//pars = append(pars, adminId)
@@ -2879,6 +2990,7 @@ func getTodayStackCompanyListV2(sysUser *system.Admin, currentIndex, pageSize in
 	if keyword != "" {
 		condition += ` and b.company_name like "%` + keyword + `%" `
 	}
+
 	switch companyType {
 	case "ficc":
 		condition += ` AND a.product_id = ? `
@@ -3081,6 +3193,7 @@ func getTodayStackCompanyListV2(sysUser *system.Admin, currentIndex, pageSize in
 					oldCompanyMap[item.CompanyId] = item
 				}
 			}
+
 			//给list赋值
 			for _, item := range list {
 				if item.ProductName == "权益" {
@@ -3097,6 +3210,19 @@ func getTodayStackCompanyListV2(sysUser *system.Admin, currentIndex, pageSize in
 			}
 		}
 	}
+
+	var ascribecompanyIds []int
+	for _, item := range list {
+		ascribecompanyIds = append(ascribecompanyIds, item.CompanyId)
+	}
+	//归因标签
+	mapGetCompanyAscribeContent := services.GetCompanyAscribeContentMap(ascribecompanyIds)
+	mapNoRenewedNote := services.GetCompanyNoRenewedNoteMap(ascribecompanyIds)
+	for _, item := range list {
+		item.AscribeContent = mapGetCompanyAscribeContent[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
+		item.IsShowNoRenewedNote = mapNoRenewedNote[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
+	}
+
 	listLen := len(list)
 	for i := 0; i < listLen; i++ {
 		item := list[i]
@@ -3134,12 +3260,14 @@ func getTodayStackCompanyListV2(sysUser *system.Admin, currentIndex, pageSize in
 			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,
+			CreateTimeStr:       v.CreateTime,
+			ExpireDay:           v.ExpireDay,
+			RenewalReason:       v.RenewalReason,
+			RenewalTodo:         v.RenewalTodo,
+			Status:              v.Status,
+			PackageDifference:   v.PackageDifference,
+			AscribeContent:      v.AscribeContent,
+			IsShowNoRenewedNote: v.IsShowNoRenewedNote,
 		}
 		stackCompanyStatisticList = append(stackCompanyStatisticList, &stackCompanyStatistic)
 	}
@@ -3170,6 +3298,8 @@ func getTodayStackCompanyListV2(sysUser *system.Admin, currentIndex, pageSize in
 // @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"
 // @Success 200 {object} response.IncrementalCompanyListResp
 // @router /incremental_company_list [get]
 func (this *StatisticReportController) IncrementalCompanyList() {
@@ -3199,6 +3329,9 @@ func (this *StatisticReportController) IncrementalCompanyList() {
 
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
+
+	isConfirm, _ := this.GetInt("IsConfirm", -1)               // CRM 13.9
+	companyAscribeId, _ := this.GetInt("CompanyAscribeId", -1) // CRM 13.9
 	//if startDate == "" || endDate == "" {
 	//	br.Msg = "获取失败,开始日期或结束日期未传"
 	//	br.ErrMsg = "获取失败,开始日期或结束日期未传"
@@ -3248,6 +3381,57 @@ func (this *StatisticReportController) IncrementalCompanyList() {
 	if keyword != "" {
 		condition += ` and b.company_name like "%` + keyword + `%" `
 	}
+
+	//是否确认续约 CRM 13.9
+	if isConfirm != -1 {
+		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 companyIds []int
+		if len(companyConfirmList) == 0 {
+			companyIds = append(companyIds, 0) // 给一个不存在的ID
+		} else {
+			for _, v := range companyConfirmList {
+				companyIds = append(companyIds, v.CompanyId)
+			}
+		}
+		if isConfirm == 0 {
+			condition += ` AND c.company_id NOT IN (` + utils.GetOrmInReplace(len(companyIds)) + `)` // 待确认
+		} else {
+			condition += ` AND c.company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `)` // 已确认
+		}
+		pars = append(pars, companyIds)
+	}
+
+	//归因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)
+			}
+		}
+		condition += ` AND c.company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `)`
+		pars = append(pars, companyIds)
+	}
 	switch companyType {
 	case "ficc":
 		condition += ` AND c.product_id = ? `
@@ -3553,9 +3737,20 @@ func (this *StatisticReportController) IncrementalCompanyList() {
 				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 := services.GetCompanyAscribeContentMap(ascribecompanyIds)
+			mapNoRenewedNote := services.GetCompanyNoRenewedNoteMap(ascribecompanyIds)
+
+			for _, item := range tmpList {
+				item.AscribeContent = mapGetCompanyAscribeContent[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
+				item.IsShowNoRenewedNote = mapNoRenewedNote[fmt.Sprint("CID_", item.CompanyId, "PID_", item.ProductId)]
 			}
 			list = tmpList
 			dataTotal = total
@@ -3588,6 +3783,9 @@ func (this *StatisticReportController) IncrementalCompanyList() {
 
 	listLen := len(list)
 
+	if listLen == 0 {
+		list = make([]*models.IncrementalList, 0)
+	}
 	for i := 0; i < listLen; i++ {
 		item := list[i]
 

+ 20 - 5
models/company/company_ascribe.go

@@ -20,6 +20,10 @@ type CompanyAscribeResp struct {
 	CreateTime       string `description:"创建时间"`
 }
 
+type CompanyAscribeDetailResp struct {
+	Detail *CompanyAscribeResp
+}
+
 type CompanyAscribeListResp struct {
 	List []*CompanyAscribeResp
 }
@@ -29,9 +33,9 @@ type CompanyAscribeAddReq struct {
 }
 
 // 添加
-func AddCompanyAscribe(item *CompanyAscribe) (err error) {
+func AddCompanyAscribe(item *CompanyAscribe) (newId int64, err error) {
 	o := orm.NewOrm()
-	_, err = o.Insert(item)
+	newId, err = o.Insert(item)
 	return
 }
 
@@ -47,13 +51,24 @@ func GetCompanyAscribeCount(condition string, pars []interface{}) (count int, er
 }
 
 // 列表
-func GetCygxProductInteriorList(condition string, pars []interface{}, startSize, pageSize int) (items []*CompanyAscribeResp, err error) {
+func GetCompanyAscribeList(condition string, pars []interface{}, startSize, pageSize int) (items []*CompanyAscribeResp, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM company_ascribe as a  WHERE 1= 1 `
 	if condition != "" {
 		sql += condition
 	}
-	sql += ` LIMIT ?,?  `
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	if startSize+pageSize > 0 {
+		sql += ` LIMIT ?,?  `
+		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// 通过ID获取详情
+func GetCompanyAscribeDetail(companyAscribeId int) (item *CompanyAscribeResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_ascribe  WHERE company_ascribe_id=? `
+	err = o.Raw(sql, companyAscribeId).QueryRow(&item)
 	return
 }

+ 146 - 0
models/company/company_no_renewed_ascribe.go

@@ -0,0 +1,146 @@
+package company
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CompanyNoRenewedAscribe struct {
+	NoRenewedAscribeId int       `orm:"column(no_renewed_ascribe_id);pk" description:"主键ID"`
+	CompanyAscribeId   int       `description:"归因ID"`
+	AscribeContent     string    `description:"归因说明"`
+	Content            string    `description:"内容说明"`
+	AdminId            int       `description:"管理员ID"`
+	CompanyId          int       `description:"公司ID"`
+	ProductId          int       `description:"产品id"`
+	CreateTime         time.Time `description:"创建时间"`
+	ModifyTime         time.Time `description:"更新时间"`
+}
+
+type CompanyNoRenewedAscribeLog struct {
+	NoRenewedAscribeId int       `orm:"column(no_renewed_ascribe_id);pk" description:"主键ID"`
+	CompanyAscribeId   int       `description:"归因ID"`
+	AscribeContent     string    `description:"归因说明"`
+	Content            string    `description:"内容说明"`
+	AdminId            int       `description:"管理员ID"`
+	CompanyId          int       `description:"公司ID"`
+	ProductId          int       `description:"产品id"`
+	CreateTime         time.Time `description:"创建时间"`
+	ModifyTime         time.Time `description:"更新时间"`
+}
+
+type CompanyNoRenewedAscribeResp struct {
+	NoRenewedAscribeId int    `description:"主键ID"`
+	CompanyAscribeId   int    `description:"归因ID"`
+	AscribeContent     string `description:"归因说明"`
+	ProductId          int    `description:"产品id"`
+	Content            string `description:"内容说明"`
+	AdminId            int    `description:"管理员ID"`
+	CompanyId          int    `description:"公司ID"`
+	CreateTime         string `description:"创建时间"`
+	ModifyTime         string `description:"更新时间"`
+}
+type CompanyNoRenewedAscribeListResp struct {
+	List []*CompanyNoRenewedAscribeResp
+}
+
+type CompanyNoRenewedAscribeDetailResp struct {
+	Detail *CompanyNoRenewedAscribeResp
+}
+
+type CompanyNoRenewedAscribeReq struct {
+	CompanyAscribeId int    `description:"归因ID"`
+	ProductId        int    `description:"产品id"`
+	Content          string `description:"内容说明"`
+	CompanyId        int    `description:"公司ID"`
+}
+
+// 添加
+func AddCompanyNoRenewedAscribe(item *CompanyNoRenewedAscribe, itemLog *CompanyNoRenewedAscribeLog) (err error) {
+	o := orm.NewOrm()
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	_, err = to.Insert(item)
+	if err != nil {
+		return
+	}
+
+	_, err = to.Insert(itemLog)
+	return
+}
+
+// 修改
+func UpdateCompanyNoRenewedAscribe(item *CompanyNoRenewedAscribe, itemLog *CompanyNoRenewedAscribeLog) (err error) {
+	o := orm.NewOrm()
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	updateParams := make(map[string]interface{})
+	updateParams["CompanyAscribeId"] = item.CompanyAscribeId
+	updateParams["ModifyTime"] = item.ModifyTime
+	updateParams["Content"] = item.Content
+	updateParams["AscribeContent"] = item.AscribeContent
+	ptrStructOrTableName := "company_no_renewed_ascribe"
+	whereParam := map[string]interface{}{"company_id": item.CompanyId, "product_id": item.ProductId}
+	qs := to.QueryTable(ptrStructOrTableName)
+	for expr, exprV := range whereParam {
+		qs = qs.Filter(expr, exprV)
+	}
+	_, err = qs.Update(updateParams)
+	if err != nil {
+		return
+	}
+	_, err = to.Insert(itemLog)
+	return
+}
+
+// 获取数量
+func GetCompanyNoRenewedAscribeCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM company_no_renewed_ascribe as a WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 通过ID获取详情
+func GetCygxProductInteriorDetail(companyId, productId int) (item *CompanyNoRenewedAscribeResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_no_renewed_ascribe   WHERE company_id=?  AND product_id = ? `
+	err = o.Raw(sql, companyId, productId).QueryRow(&item)
+	return
+}
+
+// 列表
+func GetCompanyNoRenewedAscribeList(condition string, pars []interface{}, startSize, pageSize int) (items []*CompanyNoRenewedAscribeResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_no_renewed_ascribe as a  WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	if startSize+pageSize > 0 {
+		sql += ` LIMIT ?,?  `
+		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 68 - 0
models/company/company_no_renewed_note.go

@@ -0,0 +1,68 @@
+package company
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CompanyNoRenewedNote struct {
+	NoRenewedNoteId int       `orm:"column(no_renewed_note_id);pk" description:"主键ID"`
+	Content         string    `description:"内容说明"`
+	AdminId         int       `description:"管理员ID"`
+	CompanyId       int       `description:"公司ID"`
+	ProductId       int       `description:"产品id"`
+	CreateTime      time.Time `description:"创建时间"`
+	ModifyTime      time.Time `description:"更新时间"`
+}
+
+type CompanyNoRenewedNoteResp struct {
+	NoRenewedNoteId int    `orm:"column(no_renewed_note_id);pk" description:"主键ID"`
+	CompanyId       int    `description:"公司ID"`
+	Content         string `description:"内容说明"`
+	AdminId         int    `description:"管理员ID"`
+	ProductId       int    `description:"产品id"`
+	CreateTime      string `description:"创建时间"`
+}
+
+type CompanyNoRenewedNoteListResp struct {
+	List []*CompanyNoRenewedNoteResp
+}
+
+type CompanyNoRenewedNoteReq struct {
+	Content   string `description:"内容说明"`
+	CompanyId int    `description:"公司ID"`
+	ProductId int    `description:"产品id"`
+}
+
+// 添加
+func AddCompanyNoRenewedNote(item *CompanyNoRenewedNote) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}
+
+// 获取数量
+func GetCompanyNoRenewedNoteCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM company_no_renewed_note as a WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 列表
+func GetCompanyNoRenewedNoteList(condition string, pars []interface{}, startSize, pageSize int) (items []*CompanyNoRenewedNoteResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_no_renewed_note as a  WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	if startSize+pageSize > 0 {
+		sql += ` LIMIT ?,?  `
+		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 3 - 0
models/db.go

@@ -245,6 +245,9 @@ func initCompany() {
 		new(company.SellerCompanyPermission),                 //销售客户权限("添加客户"权限)
 		new(company.CompanyServiceRecord),                    // 客户服务记录表
 		new(company.CompanyAscribe),                          // 客户归因
+		new(company.CompanyNoRenewedNote),                    // 客户未续约记录
+		new(company.CompanyNoRenewedAscribe),                 // 确认不续约记录
+		new(company.CompanyNoRenewedAscribeLog),              // 确认不续约记录日志
 	)
 }
 

+ 32 - 30
models/stack_company_statistic.go

@@ -5,7 +5,7 @@ import (
 	"time"
 )
 
-//存量客户数据表
+// 存量客户数据表
 type StackCompanyStatistic struct {
 	StatisticId  int       `orm:"column(statistic_id);pk"`
 	Type         string    `description:"数据类型,取值范围:新签客户,续约客户,未续约客户"`
@@ -25,7 +25,7 @@ type StackCompanyStatistic struct {
 	CreateTime   time.Time `description:"记录添加时间"`
 }
 
-//获取客户数量
+// 获取客户数量
 func GetStackCompanyCount(condition string, pars []interface{}) (count int, err error) {
 	o := orm.NewOrm()
 	//o.Using("rddp")
@@ -43,7 +43,7 @@ join company c on a.company_id=c.company_id WHERE 1 = 1 `
 	return
 }
 
-//获取客户产品数量
+// 获取客户产品数量
 func GetStackCompanyProductCount(condition string, pars []interface{}) (count int, err error) {
 	o := orm.NewOrm()
 	//o.Using("rddp")
@@ -60,7 +60,7 @@ join company c on a.company_id=c.company_id WHERE 1 = 1 `
 	return
 }
 
-//GetNotRenewalStackCompanyProductCount 获取未续约客户产品数量
+// GetNotRenewalStackCompanyProductCount 获取未续约客户产品数量
 func GetNotRenewalStackCompanyProductCount(condition string, pars []interface{}) (count int, err error) {
 	o := orm.NewOrm()
 	//o.Using("rddp")
@@ -78,31 +78,33 @@ join company c on a.company_id=c.company_id WHERE 1 = 1 `
 	return
 }
 
-//获取收入统计报表列表数据(根据合同来展示)
+// 获取收入统计报表列表数据(根据合同来展示)
 type StackCompanyStatisticList struct {
-	StatisticId       int       `orm:"column(statistic_id);pk"`
-	Type              string    `description:"数据类型,取值范围:新签客户,续约客户,未续约客户"`
-	Status            string    `description:"当前状态"`
-	CompanyId         int       `description:"企业客户id"`
-	CompanyName       string    `description:"企业客户名称"`
-	ProductId         int       `description:"客户产品id"`
-	ProductName       string    `description:"客户产品名称"`
-	ContractNum       int       `description:"第几份合同,默认是:1"`
-	SellerId          int       `description:"所属销售id"`
-	SellerName        string    `description:"所属销售名称"`
-	GroupId           int       `description:"所属销售分组id"`
-	DepartmentId      int       `description:"所属销售部门id"`
-	Date              string    `description:"记录日期"`
-	StartDate         string    `description:"服务起始时间"`
-	EndDate           string    `description:"服务截止时间"`
-	RegionType        string    `description:"所属区域,国内,海外"`
-	CreateTime        time.Time `description:"记录添加时间"`
-	CreateTimeStr     string    `description:"记录添加时间,字符串形式"`
-	ExpireDay         string    `description:"剩余可用天数"`
-	Count             int       `json:"-"`
-	RenewalReason     string    `description:"未续约说明"`
-	RenewalTodo       string    `description:"未续约说明中的待办事项说明"`
-	PackageDifference string    `description:"和上一份合同的区别"`
+	StatisticId         int       `orm:"column(statistic_id);pk"`
+	Type                string    `description:"数据类型,取值范围:新签客户,续约客户,未续约客户"`
+	Status              string    `description:"当前状态"`
+	CompanyId           int       `description:"企业客户id"`
+	CompanyName         string    `description:"企业客户名称"`
+	ProductId           int       `description:"客户产品id"`
+	ProductName         string    `description:"客户产品名称"`
+	ContractNum         int       `description:"第几份合同,默认是:1"`
+	SellerId            int       `description:"所属销售id"`
+	SellerName          string    `description:"所属销售名称"`
+	GroupId             int       `description:"所属销售分组id"`
+	DepartmentId        int       `description:"所属销售部门id"`
+	Date                string    `description:"记录日期"`
+	StartDate           string    `description:"服务起始时间"`
+	EndDate             string    `description:"服务截止时间"`
+	RegionType          string    `description:"所属区域,国内,海外"`
+	CreateTime          time.Time `description:"记录添加时间"`
+	CreateTimeStr       string    `description:"记录添加时间,字符串形式"`
+	ExpireDay           string    `description:"剩余可用天数"`
+	Count               int       `json:"-"`
+	RenewalReason       string    `description:"未续约说明"`
+	RenewalTodo         string    `description:"未续约说明中的待办事项说明"`
+	PackageDifference   string    `description:"和上一份合同的区别"`
+	AscribeContent      string    `description:"归因标签说明"`
+	IsShowNoRenewedNote bool      `description:"是否展示未续约备注按钮"`
 }
 
 func GetStackCompanyList(condition, orderBy string, pars []interface{}, startSize, pageSize int) (items []*StackCompanyStatisticList, err error) {
@@ -132,7 +134,7 @@ func GetStackCompanyList(condition, orderBy string, pars []interface{}, startSiz
 	return
 }
 
-//GetStackCompanyListFromReportRecord 查找存量客户数据FromReportRecord
+// GetStackCompanyListFromReportRecord 查找存量客户数据FromReportRecord
 func GetStackCompanyListFromReportRecord(condition, orderBy string, pars []interface{}, startSize, pageSize int) (items []*StackCompanyStatisticList, err error) {
 	o := orm.NewOrm()
 
@@ -150,7 +152,7 @@ func GetStackCompanyListFromReportRecord(condition, orderBy string, pars []inter
 	return
 }
 
-//根据企业客户编号数据集、记录编号数据集获取不在里面的数据列表
+// 根据企业客户编号数据集、记录编号数据集获取不在里面的数据列表
 func GetStackCompanyListByCompanyIds(companyIds, statisticIds, condition string, pars []interface{}) (items []*StackCompanyStatisticList, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * from stack_company_statistic WHERE 1 = 1 AND company_id in (` + companyIds + `) 

+ 28 - 26
models/statistic_report.go

@@ -371,32 +371,34 @@ 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:"和上一份合同的区别"`
+	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:"是否展示未续约备注按钮"`
 }
 
 // GetIncrementalNewCompanyCount 获取增量客户报表列表统计数据(根据合同来展示)

+ 45 - 0
routers/commentsRouter.go

@@ -8917,6 +8917,51 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyRenewalController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyRenewalController"],
+        beego.ControllerComments{
+            Method: "CompanyAscribeList",
+            Router: `/company_ascribe/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyRenewalController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyRenewalController"],
+        beego.ControllerComments{
+            Method: "CompanyNoRenewedAscribeAdd",
+            Router: `/company_no_renewed_ascribe/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyRenewalController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyRenewalController"],
+        beego.ControllerComments{
+            Method: "CompanyNoRenewedAscribeAddDetail",
+            Router: `/company_no_renewed_ascribe/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyRenewalController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyRenewalController"],
+        beego.ControllerComments{
+            Method: "CompanyNoRenewedNoteAdd",
+            Router: `/company_no_renewed_note/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyRenewalController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanyRenewalController"],
+        beego.ControllerComments{
+            Method: "CompanyNoRenewedNoteList",
+            Router: `/company_no_renewed_note/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers:CompanySellerController"],
         beego.ControllerComments{
             Method: "CheckList",

+ 67 - 0
services/company_ascribe.go

@@ -0,0 +1,67 @@
+package services
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+)
+
+// 处理公司归因展示
+func GetCompanyAscribeContentMap(companyIds []int) (mapResp map[string]string) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg(" 处理公司归因展示失败 GetCompanyAscribeContent,Err:"+err.Error(), 3)
+		}
+	}()
+	lenArr := len(companyIds)
+	if lenArr == 0 {
+		return
+	}
+	var condition string
+	var pars []interface{}
+	condition = ` AND company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `)`
+	pars = append(pars, companyIds)
+	list, e := company.GetCompanyNoRenewedAscribeList(condition, pars, 0, 0)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyNoRenewedAscribeList, Err: " + e.Error())
+		return
+	}
+	mapResp = make(map[string]string, 0)
+	for _, v := range list {
+		mapResp[fmt.Sprint("CID_", v.CompanyId, "PID_", v.ProductId)] = v.AscribeContent
+	}
+	return
+}
+
+// 处理公司是否添加过未续约说明展示
+func GetCompanyNoRenewedNoteMap(companyIds []int) (mapResp map[string]bool) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg(" 处理公司是否添加过未续约说明展示失败 GetCompanyNoRenewedNoteMap,Err:"+err.Error(), 3)
+		}
+	}()
+	lenArr := len(companyIds)
+	if lenArr == 0 {
+		return
+	}
+	var condition string
+	var pars []interface{}
+	condition = ` AND company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `)`
+	pars = append(pars, companyIds)
+	list, e := company.GetCompanyNoRenewedNoteList(condition, pars, 0, 0)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyNoRenewedNoteList, Err: " + e.Error())
+		return
+	}
+	mapResp = make(map[string]bool, 0)
+	for _, v := range list {
+		mapResp[fmt.Sprint("CID_", v.CompanyId, "PID_", v.ProductId)] = true
+	}
+	return
+}