Bladeren bron

fix:异常续约客户统计数据修复

Roc 1 jaar geleden
bovenliggende
commit
e6cbc75312
3 gewijzigde bestanden met toevoegingen van 464 en 7 verwijderingen
  1. 29 0
      models/company_contract/company_contract.go
  2. 434 6
      services/company_contract/company_contract.go
  3. 1 1
      services/task.go

+ 29 - 0
models/company_contract/company_contract.go

@@ -2,6 +2,7 @@ package company_contract
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"hongze/hongze_task/utils"
 	"time"
 )
 
@@ -59,6 +60,34 @@ func GetContractListByEndDate(endDate string) (total int64, list []*CompanyContr
 	return
 }
 
+// GetContractListByEndDateAndModifyTime 通过结束日期获取之前已经续约了的合同列表
+func GetContractListByEndDateAndModifyTime(endDate, modifyTime string, companyIdList []int) (total int64, list []*CompanyContract, err error) {
+	num := len(companyIdList)
+	if num <= 0 {
+		return
+	}
+
+	o := orm.NewOrm()
+	sql := "SELECT * FROM company_contract where end_date > ? AND product_id = 1 AND status = 1 AND modify_time <= ? AND company_id in (" + utils.GetOrmInReplace(num) + ")"
+	total, err = o.Raw(sql, endDate, modifyTime, companyIdList).QueryRows(&list)
+
+	return
+}
+
+// GetAfterCompanyContractListByCompanyIdListAndEndDate 通过结束日期和客户id列表获取合同列表
+func GetAfterCompanyContractListByCompanyIdListAndEndDate(endDate string, companyIdList []int) (total int64, list []*CompanyContract, err error) {
+	num := len(companyIdList)
+	if num <= 0 {
+		return
+	}
+
+	o := orm.NewOrm()
+	sql := "SELECT * FROM company_contract where end_date > ? AND product_id = 1 AND status = 1 AND company_id in (" + utils.GetOrmInReplace(num) + ")"
+	total, err = o.Raw(sql, endDate, companyIdList).QueryRows(&list)
+
+	return
+}
+
 // GetLastContractListByEndDate 通过最近一份合同的日期获取早于该合同的最晚一份合同
 func GetLastContractListByEndDate(companyId, productId int, endDate string) (item *CompanyContract, err error) {
 	o := orm.NewOrm()

+ 434 - 6
services/company_contract/company_contract.go

@@ -31,7 +31,7 @@ func HandleCompanyContract(cont context.Context) (err error) {
 		utils.FileLog.Info("HandleCompanyContract Err:%s" + err.Error())
 		return
 	}
-	fmt.Sprintln("总共d%条数据待处理", total)
+	fmt.Printf("总共%d条数据待处理\n", total)
 	errorList := make([]string, 0)
 	for _, v := range list {
 		//fmt.Println(k, v.CompanyId)
@@ -135,10 +135,10 @@ func HandleCompanyContract(cont context.Context) (err error) {
 		//研选审批通过的时候研选扣点更新
 		{
 			cygx.YanXuanCompanyApproval(v.CompanyId)
-			cygx.ActivitySpecialCompanyApproval(v.CompanyId,  v.CompanyContractId, companyProduct.CompanyName) //审批通过的时候专项调研次数更新
-			cygx.HandleAllocationCompanyContractByYanXuan(v.CompanyContractId) //如果合同只有研选的时候,自动处理派点
-			cygx.HandleCompanyContractPackageDifference(v.CompanyContractId) //更新与上一份合同的金额的对比 '增加套餐','减少套餐','维持套餐'
-			cygx.HandleCompanyContractPermissionContractType(v.CompanyContractId) //更新合同权限表中的权限名称,以及对应的行业权限类型(行业新签、行业续约)
+			cygx.ActivitySpecialCompanyApproval(v.CompanyId, v.CompanyContractId, companyProduct.CompanyName) //审批通过的时候专项调研次数更新
+			cygx.HandleAllocationCompanyContractByYanXuan(v.CompanyContractId)                                //如果合同只有研选的时候,自动处理派点
+			cygx.HandleCompanyContractPackageDifference(v.CompanyContractId)                                  //更新与上一份合同的金额的对比 '增加套餐','减少套餐','维持套餐'
+			cygx.HandleCompanyContractPermissionContractType(v.CompanyContractId)                             //更新合同权限表中的权限名称,以及对应的行业权限类型(行业新签、行业续约)
 		}
 	}
 
@@ -235,7 +235,7 @@ func HandleCompanyRenewalRecord(cont context.Context) (err error) {
 		utils.FileLog.Info("HandleCompanyRenewalRecord GetStartContractListByEndDate Err:%s" + err.Error())
 		return
 	}
-	fmt.Sprintln("总共d%条数据待处理", total)
+	fmt.Printf("总共%d条数据待处理\n", total)
 	if total <= 0 {
 		return
 	}
@@ -281,3 +281,431 @@ func HandleCompanyRenewalRecord(cont context.Context) (err error) {
 	return
 }
 
+// handleCompanyRenewalRecord
+// @Description:  处理合同到期后还未续约的记录
+// @author: Roc
+// @datetime 2024-02-21 13:41:48
+// @param endDate string
+// @param source int
+// @return err error
+func handleCompanyRenewalRecord(endDate string, source int) (err error) {
+	defer func() {
+		if err != nil {
+			//fmt.Println("合同处理 ErrMsg:"+err.Error())
+			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "合同处理 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+			go alarm_msg.SendAlarmMsg(fmt.Sprintf("日期:%s;来源%d;处理合同到期后还未续约的记录异常 ErrMsg:%s", endDate, source, err.Error()), 3)
+		}
+	}()
+
+	// 根据日期获取截止日期是该日期的合同列表
+	total, list, err := company_contract.GetContractListByEndDate(endDate)
+	if err != nil {
+		utils.FileLog.Info("HandleCompanyRenewalRecord GetStartContractListByEndDate Err:%s" + err.Error())
+		return
+	}
+	fmt.Printf("总共%d条数据待处理\n", total)
+	if total <= 0 {
+		return
+	}
+	companyIdList := make([]int, 0)
+	for _, companyInfo := range list {
+		companyIdList = append(companyIdList, companyInfo.CompanyId)
+	}
+
+	companyList, err := models.GetCompanyProductItemListByCompanyIdList(companyIdList, 1)
+	if err != nil {
+		utils.FileLog.Info("HandleCompanyRenewalRecord GetCompanyProductListByCompanyIdList Err:%s" + err.Error())
+		return
+	}
+
+	addList := make([]*models.CompanyRenewalRecord, 0)
+	for _, v := range companyList {
+		if v.Status != "正式" {
+			var shareSellerId int
+			var shareSellerName string
+			if v.IsShare == 1 {
+				shareSellerId = v.ShareSellerId
+				shareSellerName = v.ShareSeller
+			}
+			addList = append(addList, &models.CompanyRenewalRecord{
+				Id:              0,
+				CompanyId:       v.CompanyId,
+				ProductId:       v.ProductId,
+				Source:          source,
+				SellerId:        v.SellerId,
+				SellerName:      v.SellerName,
+				ShareSellerId:   shareSellerId,
+				ShareSellerName: shareSellerName,
+				CreateTime:      time.Now(),
+				ModifyTime:      time.Now(),
+			})
+		}
+	}
+
+	if len(addList) > 0 {
+		err = models.MultiAddCompanyRenewalRecord(addList)
+	}
+
+	return
+}
+
+// handleCompanyRenewalRecord
+// @Description:  处理合同即将到期(还未过期)后还未续约的记录
+// @author: Roc
+// @datetime 2024-02-21 13:41:48
+// @param endDate string
+// @param source int
+// @return err error
+func handleCompanyExpiringRenewalRecord(contractDate string, source int) (err error) {
+	defer func() {
+		if err != nil {
+			//fmt.Println("合同处理 ErrMsg:"+err.Error())
+			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "合同处理 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+			go alarm_msg.SendAlarmMsg(fmt.Sprintf("日期:%s;来源%d;处理合同即将到期(还未过期)后还未续约的记录异常 ErrMsg:%s", contractDate, source, err.Error()), 3)
+		}
+	}()
+
+	// 根据日期获取截止日期是该日期的合同列表
+	total, list, err := company_contract.GetContractListByEndDate(contractDate)
+	if err != nil {
+		utils.FileLog.Info("HandleCompanyRenewalRecord GetStartContractListByEndDate Err:%s" + err.Error())
+		return
+	}
+	fmt.Printf("总共%d条数据待处理\n", total)
+	if total <= 0 {
+		return
+	}
+	companyIdList := make([]int, 0)
+	for _, companyInfo := range list {
+		companyIdList = append(companyIdList, companyInfo.CompanyId)
+	}
+
+	// 已经续约了的客户
+	afterContractCompanyIdMap := make(map[int]int)
+	{
+		// 根据客户id列表和上一份合同的结束日期,获取后续的合同
+		_, afterContractList, tmpErr := company_contract.GetAfterCompanyContractListByCompanyIdListAndEndDate(contractDate, companyIdList)
+		if tmpErr != nil {
+			err = tmpErr
+			utils.FileLog.Info("company_contract.GetAfterCompanyContractListByCompanyIdListAndEndDate Err:%s" + err.Error())
+			return
+		}
+		for _, afterContract := range afterContractList {
+			afterContractCompanyIdMap[afterContract.CompanyId] = afterContract.CompanyId
+		}
+	}
+
+	// 客户列表
+	companyList, err := models.GetCompanyProductItemListByCompanyIdList(companyIdList, 1)
+	if err != nil {
+		utils.FileLog.Info("HandleCompanyRenewalRecord GetCompanyProductListByCompanyIdList Err:%s" + err.Error())
+		return
+	}
+
+	addList := make([]*models.CompanyRenewalRecord, 0)
+	for _, v := range companyList {
+		_, ok := afterContractCompanyIdMap[v.CompanyId]
+
+		// 已经续约了,不处理
+		if ok {
+			continue
+		}
+
+		// 未续约客户,去记录
+		var shareSellerId int
+		var shareSellerName string
+		if v.IsShare == 1 {
+			shareSellerId = v.ShareSellerId
+			shareSellerName = v.ShareSeller
+		}
+		addList = append(addList, &models.CompanyRenewalRecord{
+			Id:              0,
+			CompanyId:       v.CompanyId,
+			ProductId:       v.ProductId,
+			Source:          source,
+			SellerId:        v.SellerId,
+			SellerName:      v.SellerName,
+			ShareSellerId:   shareSellerId,
+			ShareSellerName: shareSellerName,
+			CreateTime:      time.Now(),
+			ModifyTime:      time.Now(),
+		})
+	}
+
+	if len(addList) > 0 {
+		err = models.MultiAddCompanyRenewalRecord(addList)
+	}
+
+	return
+}
+
+func HandleCompanyRenewalRecordV2(cont context.Context) (err error) {
+	defer func() {
+		if err != nil {
+			//fmt.Println("合同处理 ErrMsg:"+err.Error())
+			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "合同处理 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+			go alarm_msg.SendAlarmMsg("合同处理 ErrMsg:"+err.Error(), 3)
+		}
+	}()
+	// 1:续约异常客户;4:合同到期后一个月未续约客户;5:合同到期未续约客户;6:合同到期前一个月还未续约的客户;7:合同到期前两个月还未续约客户;8:合同到期前3个月还未续约客户;9:合同到期前4个月还未续约客户'
+	// 下面的日期都减去1天,是为了加上当日
+
+	// 1:需求是60个自然日后未续约的客户
+	{
+		endDate := time.Now().AddDate(0, 0, -60-1).Format(utils.FormatDate)
+		handleCompanyRenewalRecord(endDate, 1)
+	}
+	// 4:需求是30个自然日后未续约的客户
+	{
+		endDate := time.Now().AddDate(0, 0, -30-1).Format(utils.FormatDate)
+		handleCompanyRenewalRecord(endDate, 4)
+	}
+	// 5:需求是到期日后未续约的客户
+	{
+		endDate := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
+		handleCompanyRenewalRecord(endDate, 5)
+	}
+
+	// 即将到期还未到期的统计
+	// 合同到期前一个月还未续约的客户;
+	{
+		endDate := time.Now().AddDate(0, 0, 30-1).Format(utils.FormatDate)
+		handleCompanyExpiringRenewalRecord(endDate, 6)
+	}
+	// 7:合同到期前两个月还未续约客户;
+	{
+		endDate := time.Now().AddDate(0, 0, 60-1).Format(utils.FormatDate)
+		handleCompanyExpiringRenewalRecord(endDate, 7)
+	}
+	// 8:合同到期前3个月还未续约客户;
+	{
+		endDate := time.Now().AddDate(0, 0, 90-1).Format(utils.FormatDate)
+		handleCompanyExpiringRenewalRecord(endDate, 8)
+	}
+	// 9:合同到期前4个月还未续约客户
+	{
+		endDate := time.Now().AddDate(0, 0, 120-1).Format(utils.FormatDate)
+		handleCompanyExpiringRenewalRecord(endDate, 9)
+	}
+
+	return
+}
+
+// 续约异常客户数据修复
+//func FixData() {
+//	firstTime := time.Date(2023, 1, 1, 0, 0, 0, 0, time.Local)
+//	endTime := time.Date(2024, 2, 21, 1, 0, 0, 0, time.Local)
+//
+//	for currTime := firstTime; currTime.Before(endTime); currTime = currTime.AddDate(0, 0, 1) {
+//		currDate := currTime.Format(utils.FormatDate)
+//		fmt.Printf("结束%s的数据修复\n", currDate)
+//
+//		//// 4:需求是30个自然日后未续约的客户
+//		//{
+//		//	handleFixCompanyRenewalRecord(currTime.AddDate(0, 0, -30-1).Format(utils.FormatDate), currTime, 4)
+//		//}
+//		//// 5:需求是到期日后未续约的客户
+//		//{
+//		//	handleFixCompanyRenewalRecord(currTime.AddDate(0, 0, -1).Format(utils.FormatDate), currTime, 5)
+//		//}
+//
+//		// 即将到期还未到期的统计
+//		// 合同到期前一个月还未续约的客户;
+//		{
+//			handleFixCompanyExpiringRenewalRecord(currTime.AddDate(0, 0, 30-1).Format(utils.FormatDate), currTime, 6)
+//		}
+//		// 7:合同到期前两个月还未续约客户;
+//		{
+//			handleFixCompanyExpiringRenewalRecord(currTime.AddDate(0, 0, 60-1).Format(utils.FormatDate), currTime, 7)
+//		}
+//		// 8:合同到期前3个月还未续约客户;
+//		{
+//			handleFixCompanyExpiringRenewalRecord(currTime.AddDate(0, 0, 90-1).Format(utils.FormatDate), currTime, 8)
+//		}
+//		// 9:合同到期前4个月还未续约客户
+//		{
+//			handleFixCompanyExpiringRenewalRecord(currTime.AddDate(0, 0, 120-1).Format(utils.FormatDate), currTime, 9)
+//		}
+//	}
+//
+//	fmt.Println("end fix")
+//}
+//
+//// handleFixCompanyRenewalRecord
+//// @Description: 修复合同到期后N个月还未续约的客户
+//// @author: Roc
+//// @datetime 2024-02-21 15:29:29
+//// @param endDate string
+//// @param source int
+//// @return err error
+//func handleFixCompanyRenewalRecord(endDate string, currTime time.Time, source int) (err error) {
+//	defer func() {
+//		if err != nil {
+//			//fmt.Println("合同处理 ErrMsg:"+err.Error())
+//			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "合同处理 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+//			go alarm_msg.SendAlarmMsg(fmt.Sprintf("日期:%s;来源%d;处理合同到期后还未续约的记录异常 ErrMsg:%s", currTime.Format(utils.FormatDate), source, err.Error()), 3)
+//		}
+//	}()
+//
+//	// 根据日期获取截止日期是该日期的合同列表
+//	total, list, err := company_contract.GetContractListByEndDate(endDate)
+//	if err != nil {
+//		utils.FileLog.Info("HandleCompanyRenewalRecord GetStartContractListByEndDate Err:%s" + err.Error())
+//		return
+//	}
+//	fmt.Printf("总共%d条数据待处理\n", total)
+//	if total <= 0 {
+//		return
+//	}
+//	companyIdList := make([]int, 0)
+//	for _, companyInfo := range list {
+//		companyIdList = append(companyIdList, companyInfo.CompanyId)
+//	}
+//
+//	// 已经续约了的合同列表
+//	afterContractCompanyIdMap := make(map[int]int)
+//	{
+//		// 根据客户id列表和上一份合同的结束日期,获取已经续约了的合同列表
+//		_, renewalList, tmpErr := company_contract.GetContractListByEndDateAndModifyTime(endDate, endDate, companyIdList)
+//		if tmpErr != nil {
+//			err = tmpErr
+//			utils.FileLog.Info("HandleCompanyRenewalRecord GetContractListByEndDateAndModifyTime Err:%s" + err.Error())
+//			return
+//		}
+//		for _, afterContract := range renewalList {
+//			afterContractCompanyIdMap[afterContract.CompanyId] = afterContract.CompanyId
+//		}
+//	}
+//
+//	// 获取客户列表
+//	companyList, err := models.GetCompanyProductItemListByCompanyIdList(companyIdList, 1)
+//	if err != nil {
+//		utils.FileLog.Info("HandleCompanyRenewalRecord GetCompanyProductListByCompanyIdList Err:%s" + err.Error())
+//		return
+//	}
+//
+//	addList := make([]*models.CompanyRenewalRecord, 0)
+//	for _, v := range companyList {
+//		_, ok := afterContractCompanyIdMap[v.CompanyId]
+//
+//		// 已经续约了,不处理
+//		if ok {
+//			continue
+//		}
+//
+//		var shareSellerId int
+//		var shareSellerName string
+//		if v.IsShare == 1 {
+//			shareSellerId = v.ShareSellerId
+//			shareSellerName = v.ShareSeller
+//		}
+//		addList = append(addList, &models.CompanyRenewalRecord{
+//			Id:              0,
+//			CompanyId:       v.CompanyId,
+//			ProductId:       v.ProductId,
+//			Source:          source,
+//			SellerId:        v.SellerId,
+//			SellerName:      v.SellerName,
+//			ShareSellerId:   shareSellerId,
+//			ShareSellerName: shareSellerName,
+//			CreateTime:      currTime,
+//			ModifyTime:      currTime,
+//		})
+//	}
+//
+//	if len(addList) > 0 {
+//		err = models.MultiAddCompanyRenewalRecord(addList)
+//	}
+//
+//	return
+//}
+//
+//// handleFixCompanyExpiringRenewalRecord
+//// @Description: 修复合同到期前N个月还未续约的客户
+//// @author: Roc
+//// @datetime 2024-02-21 15:29:29
+//// @param endDate string
+//// @param source int
+//// @return err error
+//func handleFixCompanyExpiringRenewalRecord(endDate string, currTime time.Time, source int) (err error) {
+//	currDate := currTime.Format(utils.FormatDate)
+//	defer func() {
+//		if err != nil {
+//			//fmt.Println("合同处理 ErrMsg:"+err.Error())
+//			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "合同处理 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+//			go alarm_msg.SendAlarmMsg(fmt.Sprintf("日期:%s;来源%d;处理合同到期后还未续约的记录异常 ErrMsg:%s", currDate, source, err.Error()), 3)
+//		}
+//	}()
+//
+//	// 根据日期获取截止日期是该日期的合同列表
+//	total, list, err := company_contract.GetContractListByEndDate(endDate)
+//	if err != nil {
+//		utils.FileLog.Info("HandleCompanyRenewalRecord GetStartContractListByEndDate Err:%s" + err.Error())
+//		return
+//	}
+//	fmt.Printf("总共%d条数据待处理\n", total)
+//	if total <= 0 {
+//		return
+//	}
+//	companyIdList := make([]int, 0)
+//	for _, companyInfo := range list {
+//		companyIdList = append(companyIdList, companyInfo.CompanyId)
+//	}
+//
+//	// 已经续约了的合同列表
+//	afterContractCompanyIdMap := make(map[int]int)
+//	{
+//		// 根据客户id列表和上一份合同的结束日期,获取已经续约了的合同列表
+//		_, renewalList, tmpErr := company_contract.GetContractListByEndDateAndModifyTime(endDate, currDate, companyIdList)
+//		if tmpErr != nil {
+//			err = tmpErr
+//			utils.FileLog.Info("HandleCompanyRenewalRecord GetContractListByEndDateAndModifyTime Err:%s" + err.Error())
+//			return
+//		}
+//		for _, afterContract := range renewalList {
+//			afterContractCompanyIdMap[afterContract.CompanyId] = afterContract.CompanyId
+//		}
+//	}
+//
+//	// 获取客户列表
+//	companyList, err := models.GetCompanyProductItemListByCompanyIdList(companyIdList, 1)
+//	if err != nil {
+//		utils.FileLog.Info("HandleCompanyRenewalRecord GetCompanyProductListByCompanyIdList Err:%s" + err.Error())
+//		return
+//	}
+//
+//	addList := make([]*models.CompanyRenewalRecord, 0)
+//	for _, v := range companyList {
+//		_, ok := afterContractCompanyIdMap[v.CompanyId]
+//
+//		// 已经续约了,不处理
+//		if ok {
+//			continue
+//		}
+//
+//		var shareSellerId int
+//		var shareSellerName string
+//		if v.IsShare == 1 {
+//			shareSellerId = v.ShareSellerId
+//			shareSellerName = v.ShareSeller
+//		}
+//		addList = append(addList, &models.CompanyRenewalRecord{
+//			Id:              0,
+//			CompanyId:       v.CompanyId,
+//			ProductId:       v.ProductId,
+//			Source:          source,
+//			SellerId:        v.SellerId,
+//			SellerName:      v.SellerName,
+//			ShareSellerId:   shareSellerId,
+//			ShareSellerName: shareSellerName,
+//			CreateTime:      currTime,
+//			ModifyTime:      currTime,
+//		})
+//	}
+//
+//	if len(addList) > 0 {
+//		err = models.MultiAddCompanyRenewalRecord(addList)
+//	}
+//
+//	return
+//}

+ 1 - 1
services/task.go

@@ -54,7 +54,7 @@ func Task() {
 	task.AddTask("每日定时合同处理", handleCompanyContract)
 
 	// 每日续约异常客户信息处理
-	handleCompanyRenewalRecord := task.NewTask("handleCompanyContract", "0 5 2 * * *", company_contract.HandleCompanyRenewalRecord)
+	handleCompanyRenewalRecord := task.NewTask("handleCompanyContract", "0 5 2 * * *", company_contract.HandleCompanyRenewalRecordV2)
 	task.AddTask("每日续约异常客户信息处理", handleCompanyRenewalRecord)
 
 	//正式->试用