Bläddra i källkod

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

zhangchuanxing 1 dag sedan
förälder
incheckning
e89dd00629

+ 103 - 3
controllers/statistic/rai_data_summary.go

@@ -6,6 +6,7 @@ import (
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/models/fms"
 	"hongze/hz_crm_api/models/statistic_report"
 	"hongze/hz_crm_api/models/system"
@@ -144,7 +145,6 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 	if !developButton && serverButton && adminId == "" && serviceAdminId == "" { //服务组筛选条件
 		condition += " AND  real_name   LIKE '%6%' "
 	}
-
 	sellerList, err := system.GetSysUserItemsOrderByCreated(condition, pars)
 	if err != nil {
 		br.Msg = "获取管理账号失败"
@@ -269,6 +269,8 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 	confirmedNoRenewalContractCompanyNumServer := make(map[string]int) // 确认不续约公司(数量)_服务组
 	mapSignedClientNumServer := make(map[string]int)                   // 签约客户(数量)
 	mapSignedClientMoneyServer := make(map[string]float64)             // 签约客户(金额)
+	ShareTotalServeCountRed := make(map[string]float64)                // 当时标红总数量
+	ShareTotalServeCount := make(map[string]float64)                   // 当时服务客户总数
 
 	var keyMap string
 	var keyMapTtoal string
@@ -671,14 +673,33 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 		mapAddTrialNum[keyMapTtoal]++
 	}
 
+	listCoverageRate, err := cygx.GetCygxRaiServeCompanyCoverageRateListByStartDate(startDate, endDate) // 覆盖率数据
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	//服务组财务系统数据
+	for _, v := range listCoverageRate {
+		yearStr := getYearStar(utils.StrDateToDate(v.EndDate), dataType, isCustomizeDate)
+		keyMap = fmt.Sprint(yearStr, "_Server_", v.ShareSellerId)
+		keyMapTtoal = fmt.Sprint(yearStr, "_Server_")
+		ShareTotalServeCountRed[keyMap] = float64(v.ShareSellerServeCountRed)
+		ShareTotalServeCountRed[keyMapTtoal] = float64(v.ShareTotalServeCountRed)
+
+		ShareTotalServeCount[keyMap] = float64(v.ShareSellerServeCount)
+		ShareTotalServeCount[keyMapTtoal] = float64(v.ShareTotalServeCount)
+
+	}
+
 	resp := new(statistic_report.RaiDataSummaryListResp)
 	var items []*statistic_report.RaiDataSummaryResp
 
 	mapSortDateService := make(map[int]float64)
 	mapSortDateDevelop := make(map[int]float64)
 
-	fmt.Println("mapExpiredContractMoneyServer2", mapExpiredContractMoneyServer2)
-
+	lastDayOfLastQuarter := utils.GetLastDayOfLastQuarter(time.Now()) //当前时间上一个季度的最后一天
 	for i := startYear; i <= endYear; i++ {
 		for _, Dv := range dataTypeArr {
 			item := new(statistic_report.RaiDataSummaryResp)
@@ -687,6 +708,30 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 			} else {
 				item.DataType = fmt.Sprint(i, Dv)
 			}
+
+			var haveShowCoverageRate bool //当前时间上一个季度的最后一天 之后的不展示
+			if item.DataType != "" {
+				var dataEndDate string
+				dataEndDate = strconv.Itoa(i)
+				if strings.Contains(item.DataType, "Q1") {
+					dataEndDate += "-03-31"
+				} else if strings.Contains(item.DataType, "Q2") {
+					dataEndDate += "-06-30"
+				} else if strings.Contains(item.DataType, "Q3") {
+					dataEndDate += "-09-30"
+				} else if strings.Contains(item.DataType, "Q4") {
+					dataEndDate += "-12-31"
+				} else if strings.Contains(item.DataType, "H1") {
+					dataEndDate += "-06-30"
+				} else {
+					dataEndDate += "-12-31"
+				}
+				dataEndTime := utils.StrDateToDate(dataEndDate)
+				if dataEndTime.Before(lastDayOfLastQuarter) {
+					haveShowCoverageRate = true
+				}
+			}
+
 			keyMapTtoal = fmt.Sprint(item.DataType, "_Develop")
 			keyMapTtoalServer = fmt.Sprint(item.DataType, "_Server_")
 
@@ -746,6 +791,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 				}
 				sellerItem.NewCustomerInvoicingCount = utils.FormatNumberWithCommas(mapNewCustomerInvoicingMoney[keyMap], 2)               // "新客开票-(数据)"
 				sellerItem.NewCustomerPaymentsReceivedCount = utils.FormatNumberWithCommas(mapNewCustomerPaymentsReceivedMoney[keyMap], 2) // "新客到款-(数据)"
+				sellerItem.CoverageRate = "--"                                                                                             //
 				if developButton || serverButton || adminId != "" {
 					item.DataList = append(item.DataList, sellerItem)
 					dataListDevelop = append(dataListDevelop, sellerItem)
@@ -856,6 +902,9 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 				}
 				sellerItem.NewCustomerInvoicingCount = utils.FormatNumberWithCommas(mapNewCustomerInvoicingMoney[keyMapTtoal], 2)               // "新客开票-(数据)"
 				sellerItem.NewCustomerPaymentsReceivedCount = utils.FormatNumberWithCommas(mapNewCustomerPaymentsReceivedMoney[keyMapTtoal], 2) // "新客到款-(数据)"
+
+				sellerItem.CoverageRate = "--" //
+				sellerItem.IsAmountTo = true   // 是否属于合计
 				item.DataList = append(item.DataList, sellerItem)
 			}
 
@@ -921,6 +970,16 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 					dataListService = append(dataListService, sellerItem)
 				}
 
+				if !haveShowCoverageRate {
+					sellerItem.CoverageRate = "--"
+				} else {
+					if ShareTotalServeCountRed[keyMap] == 0 || ShareTotalServeCount[keyMap] == 0 {
+						sellerItem.CoverageRate = "0%"
+					} else {
+						sellerItem.CoverageRate = utils.SubFloatToString((ShareTotalServeCountRed[keyMap])/ShareTotalServeCount[keyMap]*100, 2) + "%" //"覆盖率"
+					}
+				}
+
 				//处理要排序的值
 				switch sortParam {
 				case "AddTrialCount": //新增试用
@@ -1027,6 +1086,18 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryList() {
 				}
 				sellerItem.NewCustomerInvoicingCount = utils.FormatNumberWithCommas(mapNewCustomerInvoicingMoney[keyMapTtoalServer], 2)               // "新客开票-(数据)"
 				sellerItem.NewCustomerPaymentsReceivedCount = utils.FormatNumberWithCommas(mapNewCustomerPaymentsReceivedMoney[keyMapTtoalServer], 2) // "新客到款-(数据)"
+
+				if !haveShowCoverageRate {
+					sellerItem.CoverageRate = "--"
+				} else {
+					if ShareTotalServeCountRed[keyMapTtoalServer] == 0 || ShareTotalServeCount[keyMapTtoalServer] == 0 {
+						sellerItem.CoverageRate = "0%"
+					} else {
+						sellerItem.CoverageRate = utils.SubFloatToString((ShareTotalServeCountRed[keyMapTtoalServer])/ShareTotalServeCount[keyMapTtoalServer]*100, 2) + "%" //"覆盖率"
+					}
+				}
+				sellerItem.IsAmountTo = true // 是否属于合计
+
 				item.DataList = append(item.DataList, sellerItem)
 			}
 			items = append(items, item)
@@ -1109,6 +1180,7 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 	sellerId := this.GetString("SellerId")
 	popupType := this.GetString("PopupType")
 	isServerSeller, _ := this.GetBool("IsServerSeller")
+	isAmountTo, _ := this.GetBool("IsAmountTo")
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
 
@@ -1953,6 +2025,34 @@ func (this *StatisticRaiDataSummaryController) RaiDataSummaryDetail() {
 			}
 		}
 
+	case "标红覆盖率":
+
+		if sellerId != "" && !isAmountTo {
+			condition += ` AND share_seller_id   IN (` + sellerId + `) `
+		}
+
+		condition += ` AND  end_date = ?  `
+		pars = append(pars, endDate)
+
+		listCoverageRateData, err := cygx.GetCygxRaiServeCompanyCoverageRateLast(condition, pars, 0, 1)
+		if err != nil {
+			br.Msg = "获取数据信息失败"
+			br.ErrMsg = "获取数据信息失败,Err:" + err.Error()
+			return
+		}
+		if len(listCoverageRateData) > 0 {
+			for _, v := range listCoverageRateData {
+				item := new(statistic_report.RaiDataSummaryDetailResp)
+				if isAmountTo {
+					item.SellerServeCountRed = v.ShareTotalServeCountRed
+					item.TotalServeCount = v.ShareTotalServeCount
+				} else {
+					item.SellerServeCountRed = v.ShareSellerServeCountRed
+					item.TotalServeCount = v.ShareSellerServeCount
+				}
+				listResp = append(listResp, item)
+			}
+		}
 	}
 
 	if len(listResp) == 0 {

+ 46 - 0
models/cygx/rai_serve_company_coverage_rate.go

@@ -0,0 +1,46 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxRaiServeCompanyCoverageRate struct {
+	ServeCompanyCoverageRateId int       `orm:"column(serve_company_coverage_rate_id);pk" description:"主键ID"`
+	CompanyId                  int       `description:"公司ID"`
+	CompanyName                string    `description:"公司名称"`
+	CreateTime                 time.Time `description:"创建时间"`
+	SellerId                   int       `description:"所属销售id"`
+	SellerName                 string    `description:"所属销售名称"`
+	StartDate                  string    `description:"开始日期"`
+	EndDate                    string    `description:"结束日期"`
+	ShareSeller                string    `description:"共享销售"`
+	ShareSellerId              int       `description:"共享销售员id"`
+	GroupId                    int       `description:"销售分组id"`
+	ShareGroupId               int       `description:"共享销售分组id"`
+	Status                     string    `description:"客户状态"`
+	ShareSellerServeCount      int       `description:"服务销售下面的客户总数"`
+	ShareTotalServeCount       int       `description:"总的的服务销售客户总数"`
+	ShareSellerServeCountRed   int       `description:"服务销售下面的客户标红总数"`
+	ShareTotalServeCountRed    int       `description:"总的的服务销售客户标红总数"`
+}
+
+// 列表
+func GetCygxRaiServeCompanyCoverageRateListByStartDate(startDate, endDate string) (items []*CygxRaiServeCompanyCoverageRate, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_rai_serve_company_coverage_rate   WHERE 1= 1  AND  end_date >= ?  AND  end_date <= ? `
+	_, err = o.Raw(sql, startDate, endDate).QueryRows(&items)
+	return
+}
+
+// 列表
+func GetCygxRaiServeCompanyCoverageRateLast(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxRaiServeCompanyCoverageRate, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_rai_serve_company_coverage_rate   WHERE 1= 1   `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` LIMIT ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}

+ 4 - 0
models/statistic_report/rai_data_summary.go

@@ -39,6 +39,8 @@ type RaiDataSummaryDetail struct {
 	UnpaidRatioCount                 string `description:"未到款比例"`
 	NewCustomerInvoicingCount        string `description:"新客开票"`
 	NewCustomerPaymentsReceivedCount string `description:"新客到款"`
+	CoverageRate                     string `description:"覆盖率"`
+	IsAmountTo                       bool   `description:"是否属于合计"`
 }
 
 // 增量客户统计报表列表数据结构
@@ -191,4 +193,6 @@ type RaiDataSummaryDetailResp struct {
 	PaymentAmount          float64 ` description:"到款金额"`
 	NotReceivedtAmount     float64 ` description:"未到账金额"`
 	TbaleNameAText         string  ` description:"表格A列占位符"` //配合前端渲染使用,没有啥实际意义
+	SellerServeCountRed    int     `description:"标红总数量"`
+	TotalServeCount        int     `description:"服务客户数"`
 }

+ 22 - 0
utils/common.go

@@ -2387,3 +2387,25 @@ func FormatNumberWithCommas(num float64, m int) string {
 		return formatted.String() + "." + decimalPart
 	}
 }
+
+// 获取上一个季度的最后一天
+func GetLastDayOfLastQuarter(t time.Time) time.Time {
+	year, month, _ := t.Date()
+	currentQuarter := (int(month) - 1) / 3
+
+	var prevQuarter int
+	var prevYear int
+
+	if currentQuarter == 0 {
+		prevQuarter = 3
+		prevYear = year - 1
+	} else {
+		prevQuarter = currentQuarter - 1
+		prevYear = year
+	}
+
+	lastMonth := time.Month(prevQuarter*3 + 3) // Q4 -> 12月
+	lastDay := time.Date(prevYear, lastMonth+1, 0, 0, 0, 0, 0, t.Location()).Day()
+
+	return time.Date(prevYear, lastMonth, lastDay, 23, 59, 59, 0, t.Location())
+}