zwxi 1 year ago
parent
commit
1e5c29a223

+ 249 - 460
controller/census/seller.go

@@ -9,14 +9,13 @@ import (
 	"github.com/tealeg/xlsx"
 	"hongze/fms_api/controller/resp"
 	"hongze/fms_api/global"
-	"hongze/fms_api/models"
 	"hongze/fms_api/models/base"
 	"hongze/fms_api/models/crm"
 	"hongze/fms_api/models/fms"
-	"hongze/fms_api/services/alarm_msg"
 	crmService "hongze/fms_api/services/crm"
 	"hongze/fms_api/utils"
 	"net/http"
+	"sort"
 	"strconv"
 	"strings"
 	"time"
@@ -49,12 +48,12 @@ func (ct *SellerController) GroupInvoiceList(c *gin.Context) {
 	var departmentId int
 	if req.SellerType == 1 {
 		departmentId = crm.SellerDepartmentId
-	}else if req.SellerType == 2 {
+	} else if req.SellerType == 2 {
 		departmentId = crm.RaiSellerDepartmentId
-	}else if req.SellerType == 0 {
+	} else if req.SellerType == 0 {
 		resp.Fail("请选择销售类型", c)
 		return
-	}else {
+	} else {
 		resp.Fail("请选择正确的销售类型", c)
 		return
 	}
@@ -131,7 +130,7 @@ func (ct *SellerController) GroupInvoiceList(c *gin.Context) {
 	}
 	//total := len(groupList)
 	groupMap := make(map[int]*crm.SysGroup)
-	groupIdSlice := make([]string,0)
+	groupIdSlice := make([]string, 0)
 	for i := range groupList {
 		groupMap[groupList[i].GroupId] = groupList[i]
 		groupIdSlice = append(groupIdSlice, strconv.Itoa(groupList[i].GroupId))
@@ -144,7 +143,7 @@ func (ct *SellerController) GroupInvoiceList(c *gin.Context) {
 		return
 	}
 	for _, v := range list {
-		if group, ok := groupMap[v.GroupId]; ok{
+		if group, ok := groupMap[v.GroupId]; ok {
 			v.GroupName = group.GroupName
 		}
 	}
@@ -257,17 +256,16 @@ func (ct *SellerController) InvoiceList(c *gin.Context) {
 	var departmentId int
 	if req.SellerType == 1 {
 		departmentId = crm.SellerDepartmentId
-	}else if req.SellerType == 2 {
+	} else if req.SellerType == 2 {
 		departmentId = crm.RaiSellerDepartmentId
-	}else if req.SellerType == 0 {
+	} else if req.SellerType == 0 {
 		resp.Fail("请选择销售类型", c)
 		return
-	}else {
+	} else {
 		resp.Fail("请选择正确的销售类型", c)
 		return
 	}
 
-
 	pars := make([]interface{}, 0)
 	adminPars := make([]interface{}, 0)
 	outCond := ` a.department_id = %d `
@@ -305,8 +303,6 @@ func (ct *SellerController) InvoiceList(c *gin.Context) {
 		totalPars = append(totalPars, groupIds)
 	}
 
-
-
 	sumCond := ` (invoice_type = ? OR invoice_type = ? ) AND a.is_deleted = 0 AND a.seller_id != 0 `
 	sumPars := make([]interface{}, 0)
 	sumPars = append(sumPars, fms.ContractInvoiceTypeMake, fms.ContractInvoiceTypePreMake)
@@ -374,14 +370,13 @@ func (ct *SellerController) InvoiceList(c *gin.Context) {
 		return
 	}
 	//total := len(adminList)
-	adminIdSlice := make([]string,0)
+	adminIdSlice := make([]string, 0)
 	sellerMap := make(map[int]*crm.Admin)
 	for i := range adminList {
 		sellerMap[adminList[i].AdminId] = adminList[i]
 		adminIdSlice = append(adminIdSlice, strconv.Itoa(adminList[i].AdminId))
 	}
 
-
 	adminStr := strings.Join(adminIdSlice, ",")
 
 	total, list, e := fms.GetCensusSellerInvoicePageListV2(page, adminStr, inCond, cond, pars, invSum)
@@ -391,7 +386,7 @@ func (ct *SellerController) InvoiceList(c *gin.Context) {
 	}
 
 	for _, v := range list {
-		if admin, ok := sellerMap[v.SellerId]; ok{
+		if admin, ok := sellerMap[v.SellerId]; ok {
 			v.GroupName = admin.GroupName
 			v.SellerName = admin.RealName
 			v.GroupId = admin.GroupId
@@ -500,7 +495,7 @@ func ExportInvoiceList(c *gin.Context, list []*fms.CensusSellerInvoiceItem, req
 }
 
 func (this *SellerController) GroupInvoiceListV2(c *gin.Context) {
-	var req fms.IncomeListReq
+	var req fms.CensusSellerGroupInvoiceListReq
 	if e := c.BindQuery(&req); e != nil {
 		err, ok := e.(validator.ValidationErrors)
 		if !ok {
@@ -511,38 +506,11 @@ func (this *SellerController) GroupInvoiceListV2(c *gin.Context) {
 		return
 	}
 	//收入统计
-	var incomeList models.CensusIncomeChartResp
-	ch := make(chan models.CensusIncomeChartResp, 1)
-	go getGroupInvoiceList(ch, req)
-
-	for v := range ch {
-		incomeList = v
-		close(ch)
-	}
-	// 是否导出
-	if req.IsExport == 1 {
-		ExportIncomeList(c, incomeList.DataList)
-		return
-	}
-	resp.OkData("获取成功", incomeList, c)
-}
-
-func getGroupInvoiceList(ch chan models.CensusIncomeChartResp, req fms.IncomeListReq) (incomeChart models.CensusIncomeChartResp, err error) {
-	defer func() {
-		if err != nil {
-			global.LOG.Error(err)
-			if err != utils.ErrNoRow {
-				go alarm_msg.SendAlarmMsg("获取业务收入金额统计数据异常,Err:"+err.Error(), 3)
-			}
-		}
-		ch <- incomeChart
-	}()
-
 	//获取最新的开票到款日期
-	cond := ``
+	cond1 := ``
 	historyCond := ``
-	pars := make([]interface{}, 0)
-	historyPars := make([]interface{}, 0)
+	//pars1 := make([]interface{}, 0)
+	//historyPars1 := make([]interface{}, 0)
 
 	//if req.SellerIds != "" {
 	//	sellerIds := strings.Split(req.SellerIds, ",")
@@ -552,41 +520,14 @@ func getGroupInvoiceList(ch chan models.CensusIncomeChartResp, req fms.IncomeLis
 	//	historyPars = append(historyPars, sellerIds)
 	//}
 	if req.CompanyType == 1 {
-		cond += ` AND b.contract_type = 1 `
+		cond1 += ` AND b.contract_type = 1 `
 		historyCond += ` AND new_company = 1 `
 	} else if req.CompanyType == 2 {
-		cond += ` AND b.contract_type IN (2,3,4) `
+		cond1 += ` AND b.contract_type IN (2,3,4) `
 		historyCond += ` AND new_company = 0 `
 	}
 
-	var latestTime time.Time
-
-	invoiceItem, err := fms.GetLatestIncome(cond, pars)
-	if err != nil && err != utils.ErrNoRow {
-		err = fmt.Errorf("获取最新的开票或到款日期, Err: %s", err.Error())
-		return
-	}
-	latestTime = invoiceItem.InvoiceDate
-
-	if err == utils.ErrNoRow {
-		historyItem, e := fms.GetLatestHistoryIncome(historyCond, historyPars)
-		if e != nil && e != utils.ErrNoRow {
-			err = fmt.Errorf("获取最新的历史开票或到款日期, Err: %s", e.Error())
-			return
-		}
-		latestTime = historyItem.InvoiceDate
-	}
-
-	if latestTime.IsZero() {
-		latestTime = time.Now()
-	}
-
-	latestTime = latestTime.AddDate(0, 0, -latestTime.Day()+1)
-
-	var dateSlice []string
-	var totalMoneySlice, prevTotalMoneySlice []float64
-	var yoySlice []string
-	var yearNum, monthNum int
+	var totalMoneySlice []float64
 	var reqStartDate, reqEndDate time.Time
 	historyTime, _ := time.Parse(utils.FormatDate, "2023-04-01")
 
@@ -595,418 +536,266 @@ func getGroupInvoiceList(ch chan models.CensusIncomeChartResp, req fms.IncomeLis
 		ed := fmt.Sprint(req.EndDate, "-01 23:59:59")
 		reqStartDate, _ = time.Parse(utils.FormatDateTime, st)
 		reqEndDate, _ = time.Parse(utils.FormatDateTime, ed)
-		if reqEndDate.After(latestTime) {
-			yearNum = latestTime.Year() - reqStartDate.Year()
-			monthNum = int(latestTime.Month() - reqStartDate.Month())
-		} else {
-			yearNum = reqEndDate.Year() - reqStartDate.Year()
-			monthNum = int(reqEndDate.Month() - reqStartDate.Month())
-		}
-	} else {
-		yearNum = latestTime.Year() - 2020
-		monthNum = int(latestTime.Month() - 1)
 	}
 
-	if yearNum < 0 {
-		yearNum = -yearNum
-	}
-	if monthNum < 0 {
-		monthNum = -monthNum
-	}
-	numMonth := yearNum*12 + monthNum //共存在多少个月
-
 	// 累计值
 	var accumulate float64
-	var partAccumulate float64
-	var historyAccumulate float64
-	var partHistoryAccumulate float64
 	//dataList := make([]*fms.IncomeSummaryItem, 0)
 	//historydataList := make([]*fms.IncomeSummaryItem, 0)
-	fmt.Println("numMonth:", numMonth)
-	fmt.Println("InvoiceDate:", latestTime)
-
-	var j int
-	for i := 0; i <= numMonth; i++ {
-		//timeNow, _ := time.Parse("2006-01", time.Now().Format("2006-01"))
-
-		var endDateTime time.Time
-		var prevEndDateTime time.Time
-		var prevStartDate, prevEndDate string
-		var startDate, endDate string
-		//开始日期
-		if req.StartDate != "" && req.EndDate != "" {
-			startDate = reqStartDate.AddDate(0, i, 0).Format("2006-01")
-			prevStartDate = reqStartDate.AddDate(-1, i, 0).Format("2006-01")
-		} else {
-			startDate = latestTime.AddDate(0, i-numMonth, 0).Format("2006-01")
-			prevStartDate = latestTime.AddDate(-1, i-numMonth, 0).Format("2006-01")
-		}
-		startDate = fmt.Sprint(startDate, "-01")
-		prevStartDate = fmt.Sprint(prevStartDate, "-01")
-		startDateTime, _ := time.Parse(utils.FormatDate, startDate)
-		prevStartDateTime, _ := time.Parse(utils.FormatDate, prevStartDate)
-
-		//结束日期
-		if req.StartDate != "" && req.EndDate != "" {
-			endDateTime = reqStartDate.AddDate(0, i+1, -1)
-			prevEndDateTime = reqStartDate.AddDate(-1, i+1, -1)
-			if reqEndDate.After(latestTime) {
-				endDateTime = latestTime.AddDate(0, i-numMonth+1, -1)
-				prevEndDateTime = latestTime.AddDate(-1, i-numMonth+1, -1)
-			}
-		} else {
-			endDateTime = latestTime.AddDate(0, i-numMonth+1, -1)
-			prevEndDateTime = latestTime.AddDate(-1, i-numMonth+1, -1)
-		}
-		endDate = endDateTime.Format(utils.FormatDate)
-		prevEndDate = prevEndDateTime.Format(utils.FormatDate)
-
-		cond := `1 = 1`
-		histrtyCond := `1 = 1`
-		pars := make([]interface{}, 0)
-		historyPars := make([]interface{}, 0)
-
-		prevCond := `1 = 1`
-		prevHistoryCond := `1 = 1`
-		prevPars := make([]interface{}, 0)
-		prevHistoryPars := make([]interface{}, 0)
-
-		if req.CompanyType == 1 {
-			cond += ` AND b.contract_type = 1 `
-			prevCond += ` AND b.contract_type = 1 `
-			histrtyCond += ` AND new_company = 1 `
-			prevHistoryCond += ` AND new_company = 1 `
-		} else if req.CompanyType == 2 {
-			cond += ` AND b.contract_type IN (2,3,4) `
-			prevCond += ` AND b.contract_type IN (2,3,4) `
-			histrtyCond += ` AND new_company = 0 `
-			prevHistoryCond += ` AND new_company = 0 `
-		}
 
-		//if req.SellerIds != "" {
-		//	sellerIds := strings.Split(req.SellerIds, ",")
-		//	cond += ` AND (c.seller_id in ? OR d.seller_id in ?)`
-		//	pars = append(pars, sellerIds, sellerIds)
-		//	prevCond += ` AND (c.seller_id in ? OR d.seller_id in ?)`
-		//	prevPars = append(prevPars, sellerIds, sellerIds)
-		//	histrtyCond += ` AND seller_id in ? `
-		//	prevHistoryCond += ` AND seller_id in ? `
-		//	historyPars = append(historyPars, sellerIds)
-		//	prevHistoryPars = append(prevHistoryPars, sellerIds)
-		//}
-
-
-		{
-			//本期
-			st := fmt.Sprint(startDate, " 00:00:00")
-			ed := fmt.Sprint(endDate, " 23:59:59")
-			//校验日期,分段查询
-			if startDateTime.After(historyTime) || startDateTime.Equal(historyTime) {
-				//全部走新查询
-				//fmt.Println("新查询")
-				cond += ` AND ((c.invoice_time BETWEEN ? AND ?) or (d.invoice_time BETWEEN ? AND ?))`
-				pars = append(pars, st, ed, st, ed)
-				summaryIds, e := fms.GetInvoicePaymentCensusSummaryDataIds(cond, pars)
-				if e != nil {
-					return
-				}
+	//timeNow, _ := time.Parse("2006-01", time.Now().Format("2006-01"))
 
-				// 开票到款金额合计(换算后)
-				var amountTotal float64
-
-				if len(summaryIds) > 0 {
-					amountCond := `a.id IN ? `
-					amountPars := make([]interface{}, 0)
-					amountPars = append(amountPars, summaryIds)
-					if req.SellerIds != "" {
-						sellerIds := strings.Split(req.SellerIds, ",")
-						amountCond += ` AND (( b.seller_id IN ? AND a.invoice_id <> 0 AND b.invoice_time BETWEEN ? AND ?)`
-						amountCond += `OR ( d.seller_id IN ? AND  a.payment_id <> 0 AND a.invoice_id = 0 AND d.invoice_time BETWEEN ? AND ?)) `
-						amountPars = append(amountPars, sellerIds, st, ed, sellerIds, st, ed)
-					} else {
-						amountCond += ` AND ((a.invoice_id <> 0 AND b.invoice_time BETWEEN ? AND ?)`
-						amountCond += `OR (a.payment_id <> 0 AND a.invoice_id = 0 AND d.invoice_time BETWEEN ? AND ?))`
-						amountPars = append(amountPars, st, ed, st, ed)
-					}
-					results, e := fms.GetContractSummaryIncomeAmount(amountCond, amountPars)
-					if e != nil {
-						err = fmt.Errorf("获取汇总数据失败, Err: %s", e.Error())
-						return
-					}
-					//dataList = append(dataList, results...)
-					var amountSum float64
-					for _, result := range results {
-						incomeChart.DataList = append(incomeChart.DataList, result)
-						amountSum += result.Amount
-						fmt.Println("result.Amount:", result.Amount)
-					}
-					amountTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", amountSum), 64)
-					accumulate += amountTotal
-					partAccumulate += amountTotal
-				}
-				if i == j || i == numMonth {
-					if req.ListParam == "4" {
-						totalMoneySlice = append(totalMoneySlice, accumulate)
-						if startDateTime.Month() == 12 {
-							accumulate = 0
-						}
-					} else if req.ListParam == "0" {
-						totalMoneySlice = append(totalMoneySlice, amountTotal)
-					} else if i > 0 || i == numMonth {
-						totalMoneySlice = append(totalMoneySlice, partAccumulate)
-						fmt.Println("partAccumulate:", partAccumulate)
-						partAccumulate = 0.0
-					}
-				}
-			} else if endDateTime.Before(historyTime) || endDateTime.Equal(historyTime) {
-				//全部走旧查询
-				//fmt.Println("旧查询")
-				//fmt.Println("st:",st)
-				//fmt.Println("ed:",ed)
-				histrtyCond += ` AND (invoice_time BETWEEN ? AND ? )`
-				historyPars = append(historyPars, st, ed)
-				//fmt.Println("st:",st)
-				//fmt.Println("ed:",ed)
-				// 开票到款金额合计(换算后)
-				var amountTotal float64
-				results, e := fms.GetIncomeHistory(histrtyCond, historyPars)
-				if e != nil {
-					err = fmt.Errorf("获取汇总数据失败, Err: %s", e.Error())
-					return
-				}
-				var amountSum float64
-				//dataList = append(dataList, results...)
-				for _, result := range results {
-					incomeChart.DataList = append(incomeChart.DataList, result)
-					amountSum += result.Amount
-				}
-				amountTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", amountSum), 64)
-				accumulate += amountTotal
-				partAccumulate += amountTotal
-
-				if i == j || i == numMonth {
-					if req.ListParam == "4" {
-						totalMoneySlice = append(totalMoneySlice, accumulate)
-						if startDateTime.Month() == 12 {
-							accumulate = 0
-						}
-					} else if req.ListParam == "0" {
-						totalMoneySlice = append(totalMoneySlice, amountTotal)
-					} else if i > 0 || i == numMonth {
-						totalMoneySlice = append(totalMoneySlice, partAccumulate)
-						partAccumulate = 0.0
-					}
-				}
+	var prevStartDate string
+	var startDate, endDate string
+	//开始日期
+	if req.StartDate != "" && req.EndDate != "" {
+		startDate = reqStartDate.Format("2006-01")
+		prevStartDate = reqStartDate.Format("2006-01")
+	}
+	startDate = fmt.Sprint(startDate, "-01")
+	prevStartDate = fmt.Sprint(prevStartDate, "-01")
+	startDateTime, _ := time.Parse(utils.FormatDate, startDate)
+	endDateTime, _ := time.Parse(utils.FormatDate, endDate)
 
-				//fmt.Println("partAccumulate:",partAccumulate)
-			}
+	//结束日期
+	if req.StartDate != "" && req.EndDate != "" {
+		endDate = reqEndDate.Format("2006-01")
+	}
 
-		}
+	cond := `1 = 1`
+	histrtyCond := `1 = 1`
+	pars := make([]interface{}, 0)
+	historyPars := make([]interface{}, 0)
 
-		{ // 去年同期,用于计算同比值
-			prevSt := fmt.Sprint(prevStartDate, " 00:00:00") // 格式化上一年同一天的开始时间
-			prevEd := fmt.Sprint(prevEndDate, " 23:59:59")   // 格式化上一年同一天的结束时间
-
-			// 校验日期,分段查询
-			if prevStartDateTime.After(historyTime) || prevStartDateTime.Equal(historyTime) {
-				// 全部走新查询
-				prevCond += ` AND ((b.invoice_time BETWEEN ? AND ?) or (d.invoice_time BETWEEN ? AND ?))` // 查询条件加入新的时间范围
-				prevPars = append(prevPars, prevSt, prevEd, prevSt, prevEd)                               // 添加时间参数到参数列表
-				prevSummaryIds, e := fms.GetInvoicePaymentCensusSummaryDataIds(prevCond, prevPars)        // 获取摘要ID列表
-				if e != nil {
-					return
-				}
+	if req.CompanyType == 1 {
+		cond += ` AND b.contract_type = 1 `
+		histrtyCond += ` AND new_company = 1 `
+	} else if req.CompanyType == 2 {
+		cond += ` AND b.contract_type IN (2,3,4) `
+		histrtyCond += ` AND new_company = 0 `
+	}
 
-				// 开票到款金额合计(换算后)
-				var prevAmountTotal float64
-
-				if len(prevSummaryIds) > 0 {
-					amountCond := `a.id IN ? ` // 查询条件为ID在给定的摘要ID列表中
-					amountPars := make([]interface{}, 0)
-					amountPars = append(amountPars, prevSummaryIds) // 将摘要ID列表添加到参数列表
-					if req.SellerIds != "" {
-						sellerIds := strings.Split(req.SellerIds, ",")
-						amountCond += ` AND (( b.seller_id IN ? AND a.invoice_id <> 0 AND b.invoice_time BETWEEN ? AND ?)`
-						amountCond += `OR ( d.seller_id IN ? AND  a.payment_id <> 0 AND a.invoice_id = 0 AND d.invoice_time BETWEEN ? AND ?)) ` // 根据卖家ID和发票/支付状态筛选时间范围
-						amountPars = append(amountPars, sellerIds, prevSt, prevEd, sellerIds, prevSt, prevEd)                                   // 将卖家ID列表添加到参数列表
-					} else {
-						amountCond += ` AND ((a.invoice_id <> 0 AND b.invoice_time BETWEEN ? AND ?)`
-						amountCond += `OR (a.payment_id <> 0 AND a.invoice_id = 0 AND d.invoice_time BETWEEN ? AND ?))` // 根据发票/支付状态筛选时间范围
-						amountPars = append(amountPars, prevSt, prevEd)
-					}
-					results, e := fms.GetContractSummaryIncomeAmount(amountCond, amountPars) // 获取合同摘要收入金额数据
-					if e != nil {
-						err = fmt.Errorf("获取汇总数据失败, Err: %s", e.Error())
-						return
-					}
-					var amountSum float64
-					//historydataList = append(historydataList, results...)
-					for _, result := range results {
-						amountSum += result.Amount // 累计收入金额
-					}
-					prevAmountTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", amountSum), 64) // 将累计金额转换为浮点数
-					historyAccumulate += prevAmountTotal                                        // 累计历史金额
-					partHistoryAccumulate += prevAmountTotal                                    // 累计部分历史金额
-				}
-				if i == j || i == numMonth {
-					if req.ListParam == "4" {
-						prevTotalMoneySlice = append(prevTotalMoneySlice, historyAccumulate) // 将累计金额添加到总金额切片中
-						if prevStartDateTime.Month() == 12 {
-							historyAccumulate = 0 // 如果是去年的12月份,则将历史金额清零
-						}
-					} else if req.ListParam == "0" {
-						prevTotalMoneySlice = append(prevTotalMoneySlice, prevAmountTotal) // 将部分历史金额添加到总金额切片中
-					} else if i > 0 || i == numMonth {
-						prevTotalMoneySlice = append(prevTotalMoneySlice, partHistoryAccumulate) // 将部分历史金额添加到总金额切片中
-						fmt.Println("partHistoryAccumulate:", partHistoryAccumulate)
-						partHistoryAccumulate = 0.0 // 清零部分历史金额
-					}
-				}
-			} else if prevEndDateTime.Before(historyTime) || prevEndDateTime.Equal(historyTime) {
-				// 全部走旧查询
-				fmt.Println("prevSt:", prevSt)
-				fmt.Println("prevEd:", prevEd)
-				prevHistoryCond += ` AND (invoice_time BETWEEN ? AND ?)`  // 查询条件加入旧的时间范围
-				prevHistoryPars = append(prevHistoryPars, prevSt, prevEd) // 添加时间参数到参数列表
-				// 开票到款金额合计(换算后)
-				var amountTotal float64
-				results, e := fms.GetIncomeHistory(prevHistoryCond, prevHistoryPars) // 获取历史收入数据
-				if e != nil {
-					err = fmt.Errorf("获取汇总数据失败, Err: %s", e.Error())
-					return
-				}
-				//historydataList = append(historydataList, results...)
-				var amountSum float64
-				for _, result := range results {
-					amountSum += result.Amount // 累计收入金额
-				}
-				amountTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", amountSum), 64) // 将累计金额转换为浮点数
-				historyAccumulate += amountTotal                                        // 累计历史金额
-				partHistoryAccumulate += amountTotal                                    // 累计部分历史金额
-
-				if i == j || i == numMonth {
-					if req.ListParam == "4" {
-						prevTotalMoneySlice = append(prevTotalMoneySlice, historyAccumulate) // 将累计金额添加到总金额切片中
-						if prevStartDateTime.Month() == 12 {
-							historyAccumulate = 0 // 如果是去年的12月份,则将历史金额清零
-						}
-					} else if req.ListParam == "0" {
-						prevTotalMoneySlice = append(prevTotalMoneySlice, amountTotal) // 将历史金额添加到总金额切片中
-					} else if i > 0 || i == numMonth {
-						prevTotalMoneySlice = append(prevTotalMoneySlice, partHistoryAccumulate) // 将部分历史金额添加到总金额切片中
-						fmt.Println("partHistoryAccumulate:", partHistoryAccumulate)
-						partHistoryAccumulate = 0.0 // 清零部分历史金额
-					}
-				}
-				if req.ListParam == "1" && i == j {
-					if i == 0 {
-						dateSlice = append(dateSlice, startDateTime.AddDate(0, 2, 0).Format("06/01")) // 添加下一个月份的开始日期到日期切片中
-						j = j + 2
-					} else {
-						dateSlice = append(dateSlice, startDateTime.AddDate(0, 3, 0).Format("06/01")) // 添加下一季度的开始日期到日期切片中
-						j = j + 3
-					}
-				} else if req.ListParam == "2" && i == j {
-					if i == 0 {
-						dateSlice = append(dateSlice, startDateTime.AddDate(0, 5, 0).Format("06/01")) // 添加下五个月份的开始日期到日期切片中
-						j = j + 5
-					} else {
-						dateSlice = append(dateSlice, startDateTime.AddDate(0, 6, 0).Format("06/01")) // 添加下半年的开始日期到日期切片中
-						j = j + 6
-					}
-				} else if req.ListParam == "3" && i == j {
-					if i == 0 {
-						dateSlice = append(dateSlice, startDateTime.AddDate(0, 11, 0).Format("06/01")) // 添加下十一个月份的开始日期到日期切片中
-						j = j + 11
-					} else {
-						dateSlice = append(dateSlice, startDateTime.AddDate(0, 12, 0).Format("06/01")) // 添加下一季度的开始日期到日期切片中
-						j = j + 12
-					}
-				} else if i == j {
-					dateSlice = append(dateSlice, startDateTime.Format("06/01")) // 添加当月开始日期到日期切片中
-					j++
-				}
+	//if req.SellerIds != "" {
+	//	sellerIds := strings.Split(req.SellerIds, ",")
+	//	cond += ` AND (c.seller_id in ? OR d.seller_id in ?)`
+	//	pars = append(pars, sellerIds, sellerIds)
+	//	prevCond += ` AND (c.seller_id in ? OR d.seller_id in ?)`
+	//	prevPars = append(prevPars, sellerIds, sellerIds)
+	//	histrtyCond += ` AND seller_id in ? `
+	//	prevHistoryCond += ` AND seller_id in ? `
+	//	historyPars = append(historyPars, sellerIds)
+	//	prevHistoryPars = append(prevHistoryPars, sellerIds)
+	//}
+
+	st := fmt.Sprint(startDate, " 00:00:00")
+	ed := fmt.Sprint(endDate, " 23:59:59")
+	groupInvoiceMap := make(map[int]float64)
+	//校验日期,分段查询
+	if req.StartDate == "" && req.EndDate == "" {
+		summaryIds, e := fms.GetInvoicePaymentCensusSummaryDataIds(cond, pars)
+		if e != nil {
+			return
+		}
+
+		// 开票到款金额合计(换算后)
+		var amountTotal float64
+
+		if len(summaryIds) > 0 {
+			amountCond := `a.id IN ? `
+			amountPars := make([]interface{}, 0)
+			amountPars = append(amountPars, summaryIds)
+			//if req.SellerIds != "" {
+			//	sellerIds := strings.Split(req.SellerIds, ",")
+			//	amountCond += ` AND (( b.seller_id IN ? AND a.invoice_id <> 0 AND b.invoice_time BETWEEN ? AND ?)`
+			//	amountCond += `OR ( d.seller_id IN ? AND  a.payment_id <> 0 AND a.invoice_id = 0 AND d.invoice_time BETWEEN ? AND ?)) `
+			//	amountPars = append(amountPars, sellerIds, st, ed, sellerIds, st, ed)
+			//} else {
+			//	amountCond += ` AND ((a.invoice_id <> 0 AND b.invoice_time BETWEEN ? AND ?)`
+			//	amountCond += `OR (a.payment_id <> 0 AND a.invoice_id = 0 AND d.invoice_time BETWEEN ? AND ?))`
+			//	amountPars = append(amountPars, st, ed, st, ed)
+			//}
+			results, e := fms.GetContractSummaryIncomeAmount(amountCond, amountPars)
+			if e != nil {
+				resp.FailMsg("查询错误",fmt.Sprintf("获取汇总数据失败, Err: %s", e.Error()), c)
+				return
 			}
-			if req.ListParam == "1" && i == j {
-				if i == 0 {
-					dateSlice = append(dateSlice, startDateTime.AddDate(0, 2, 0).Format("06/01")) // 添加下一个月份的开始日期到日期切片中
-					j = j + 2
-				} else {
-					dateSlice = append(dateSlice, startDateTime.AddDate(0, 3, 0).Format("06/01")) // 添加下一季度的开始日期到日期切片中
-					j = j + 3
-				}
-			} else if req.ListParam == "2" && i == j {
-				if i == 0 {
-					dateSlice = append(dateSlice, startDateTime.AddDate(0, 5, 0).Format("06/01")) // 添加下五个月份的开始日期到日期切片中
-					j = j + 5
+			//dataList = append(dataList, results...)
+			var amountSum float64
+			for _, result := range results {
+				amountSum += result.Amount
+				fmt.Println("result.Amount:", result.Amount)
+				if _, ok := groupInvoiceMap[result.SellerGroupId]; ok {
+					groupInvoiceMap[result.SellerGroupId] += result.Amount
 				} else {
-					dateSlice = append(dateSlice, startDateTime.AddDate(0, 6, 0).Format("06/01")) // 添加下半年的开始日期到日期切片中
-					j = j + 6
+					groupInvoiceMap[result.SellerGroupId] = result.Amount
 				}
-			} else if req.ListParam == "3" && i == j {
-				if i == 0 {
-					dateSlice = append(dateSlice, startDateTime.AddDate(0, 11, 0).Format("06/01"))
-					j = j + 11
+			}
+			amountTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", amountSum), 64)
+			accumulate += amountTotal
+
+
+			//var amountTotal float64
+			results, e = fms.GetIncomeHistory(histrtyCond, historyPars)
+			if e != nil {
+				resp.FailMsg("查询错误",fmt.Sprintf("获取汇总数据失败, Err: %s", e.Error()), c)
+				return
+			}
+			//dataList = append(dataList, results...)
+			for _, result := range results {
+				amountSum += result.Amount
+				if _, ok := groupInvoiceMap[result.SellerGroupId]; ok {
+					groupInvoiceMap[result.SellerGroupId] += result.Amount
 				} else {
-					dateSlice = append(dateSlice, startDateTime.AddDate(0, 12, 0).Format("06/01"))
-					j = j + 12
+					groupInvoiceMap[result.SellerGroupId] = result.Amount
 				}
-			} else if i == j {
-				dateSlice = append(dateSlice, startDateTime.Format("06/01"))
-				j++
 			}
+			amountTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", amountSum), 64)
+			accumulate += amountTotal
+		}
+	} else if startDateTime.After(historyTime) || startDateTime.Equal(historyTime) {
+		//全部走新查询
+		//fmt.Println("新查询")
+		if st != "" && ed != "" {
+			cond += ` AND ((c.invoice_time BETWEEN ? AND ?) or (d.invoice_time BETWEEN ? AND ?))`
+			pars = append(pars, st, ed, st, ed)
+		}
+		summaryIds, e := fms.GetInvoicePaymentCensusSummaryDataIds(cond, pars)
+		if e != nil {
+			return
 		}
-	}
-
-	fmt.Println("prevTotalMoneySlice:", len(prevTotalMoneySlice))
-	fmt.Println("totalMoneySlice:", len(totalMoneySlice))
 
-	if req.CompanyType != 3 {
-		//计算同比值
-		for i := range prevTotalMoneySlice {
-			var yoy float64
-			var yoyStr string
-			totalMoneySlice[i], _ = strconv.ParseFloat(fmt.Sprintf("%.2f", totalMoneySlice[i]), 64)
-			if prevTotalMoneySlice[i] != 0 && totalMoneySlice[i] != 0 {
-				yoy = (totalMoneySlice[i] - prevTotalMoneySlice[i]) / prevTotalMoneySlice[i]
-				yoyStr = fmt.Sprintf("%.4f", yoy)
-
-				if i == len(prevTotalMoneySlice)-1 && i > 0 && req.ListParam == "3" {
-					fmt.Println("totalMoneySlice[i-1]:", totalMoneySlice[i-1])
-					yoy = (totalMoneySlice[i] - totalMoneySlice[i-1]) / totalMoneySlice[i-1]
-					yoyStr = fmt.Sprintf("%.4f", yoy)
+		// 开票到款金额合计(换算后)
+		var amountTotal float64
+
+		if len(summaryIds) > 0 {
+			amountCond := `a.id IN ? `
+			amountPars := make([]interface{}, 0)
+			amountPars = append(amountPars, summaryIds)
+			//if req.SellerIds != "" {
+			//	sellerIds := strings.Split(req.SellerIds, ",")
+			//	amountCond += ` AND (( b.seller_id IN ? AND a.invoice_id <> 0 AND b.invoice_time BETWEEN ? AND ?)`
+			//	amountCond += `OR ( d.seller_id IN ? AND  a.payment_id <> 0 AND a.invoice_id = 0 AND d.invoice_time BETWEEN ? AND ?)) `
+			//	amountPars = append(amountPars, sellerIds, st, ed, sellerIds, st, ed)
+			//} else {
+			//	amountCond += ` AND ((a.invoice_id <> 0 AND b.invoice_time BETWEEN ? AND ?)`
+			//	amountCond += `OR (a.payment_id <> 0 AND a.invoice_id = 0 AND d.invoice_time BETWEEN ? AND ?))`
+			//	amountPars = append(amountPars, st, ed, st, ed)
+			//}
+			results, e := fms.GetContractSummaryIncomeAmount(amountCond, amountPars)
+			if e != nil {
+				resp.FailMsg("查询错误",fmt.Sprintf("获取汇总数据失败, Err: %s", e.Error()), c)
+				return
+			}
+			//dataList = append(dataList, results...)
+			var amountSum float64
+			for _, result := range results {
+				amountSum += result.Amount
+				fmt.Println("result.Amount:", result.Amount)
+				if _, ok := groupInvoiceMap[result.SellerGroupId]; ok {
+					groupInvoiceMap[result.SellerGroupId] += result.Amount
+				} else {
+					groupInvoiceMap[result.SellerGroupId] = result.Amount
 				}
 			}
-			yoySlice = append(yoySlice, yoyStr)
+			amountTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", amountSum), 64)
+			accumulate += amountTotal
 		}
-	} else {
-		// 当筛选条件是”月度“时,并且客户是”未续约“客户,展示柱形图和曲线图
-		// 当筛选条件是”季度“、”半年度“、”年度“、”月度统计“时,并且客户是”未续约“时,仅展示柱形图,无曲线图
-		// 未续约收入金额=去年同期总收入金额(新客户+老客户)-当期老客户收入金额
-		// 移动平均值:若是10月份,计算8月,9月,10月,这三个月的收入金额平均值
-		for i := range prevTotalMoneySlice {
-			totalMoneySlice[i], _ = strconv.ParseFloat(fmt.Sprintf("%.2f", prevTotalMoneySlice[i]-totalMoneySlice[i]), 64)
-
-			var yoy float64
-			var yoyStr string
-			if i > 1 && req.ListParam == "0" {
-				// 前俩月没有
-				yoy = (totalMoneySlice[i] + totalMoneySlice[i-1] + totalMoneySlice[i-2]) / 3
-				yoyStr = fmt.Sprintf("%.4f", yoy)
-				yoySlice = append(yoySlice, yoyStr)
+	} else if endDateTime.Before(historyTime) || endDateTime.Equal(historyTime) {
+		//全部走旧查询
+		//fmt.Println("旧查询")
+		//fmt.Println("st:",st)
+		//fmt.Println("ed:",ed)
+		if st != "" && ed != "" {
+			histrtyCond += ` AND (invoice_time BETWEEN ? AND ? )`
+			historyPars = append(historyPars, st, ed)
+		}
+		//fmt.Println("st:",st)
+		//fmt.Println("ed:",ed)
+		// 开票到款金额合计(换算后)
+		var amountTotal float64
+		results, e := fms.GetIncomeHistory(histrtyCond, historyPars)
+		if e != nil {
+			resp.FailMsg("查询错误",fmt.Sprintf("获取汇总数据失败, Err: %s", e.Error()), c)
+			return
+		}
+		var amountSum float64
+		//dataList = append(dataList, results...)
+		for _, result := range results {
+			amountSum += result.Amount
+			if _, ok := groupInvoiceMap[result.SellerGroupId]; ok {
+				groupInvoiceMap[result.SellerGroupId] += result.Amount
 			} else {
-				yoySlice = append(yoySlice, "")
+				groupInvoiceMap[result.SellerGroupId] = result.Amount
 			}
 		}
+		amountTotal, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", amountSum), 64)
+		accumulate += amountTotal
+
+
+		//fmt.Println("partAccumulate:",partAccumulate)
+	}
+
+	fmt.Println("totalMoneySlice:", len(totalMoneySlice))
+
+	var departmentId int
+	if req.SellerType == 1 {
+		departmentId = crm.SellerDepartmentId
+	} else if req.SellerType == 2 {
+		departmentId = crm.RaiSellerDepartmentId
+	} else if req.SellerType == 0 {
+		resp.FailMsg("查询错误","请选择正确的销售类型", c)
+		return
+	} else {
+		resp.FailMsg("查询错误","请选择正确的销售类型", c)
+		return
 	}
+	groupCond := ` department_id = %d AND parent_id = 0 `
+	groupCond = fmt.Sprintf(groupCond, departmentId)
+	groupPars := make([]interface{}, 0)
+	groupOB := new(crm.SysGroup)
+	groupList, e := groupOB.List(groupCond, groupPars)
+	if e != nil {
+		resp.FailMsg("查询错误",fmt.Sprintf("获取组别列表失败, Err:  %s", e.Error()), c)
+		return
+	}
+	//total := len(groupList)
+	groupMap := make(map[int]*crm.SysGroup)
+	groupIdSlice := make([]string, 0)
+	for i := range groupList {
+		groupMap[groupList[i].GroupId] = groupList[i]
+		groupIdSlice = append(groupIdSlice, strconv.Itoa(groupList[i].GroupId))
+	}
+
+	list := make([]*fms.CensusSellerGroupInvoiceItem, 0)
 
-	incomeChart.Title = "开票到款统计图"
-	incomeChart.Date = dateSlice
-	incomeChart.TotalMoney = totalMoneySlice
-	incomeChart.PrevTotalMoney = prevTotalMoneySlice
-	incomeChart.Yoy = yoySlice
+	for k, v := range groupInvoiceMap {
+		rate := v / accumulate
+		mulNum := decimal.NewFromFloat(100)
+		d := decimal.NewFromFloat(rate)
+		d = d.Mul(mulNum).Round(2)
+		a, _ := d.Float64()
+
+		groupName := ""
+		if groupItem ,ok := groupMap[k]; ok {
+			groupName = groupItem.GroupName
+		}
+		list = append(list, &fms.CensusSellerGroupInvoiceItem{
+			GroupId:       k,
+			GroupName:     groupName,
+			InvoiceAmount: v,
+			GroupRate:     a,
+		})
+	}
 
+	var respList fms.CensusSellerGroupList
+	respList = list
 
+	sort.Sort(respList)
 
-	return
+	// 是否导出
+	//if req.IsExport == 1 {
+	//	ExportIncomeList(c, incomeList.DataList)
+	//	return
+	//}
+	resp.OkData("获取成功", respList, c)
 }

+ 6 - 4
controller/crm/company_seller.go

@@ -113,9 +113,9 @@ func FIXIncomeHistorySellerId() (err error) {
 	if e != nil {
 		return
 	}
-	sellerMap := make(map[string]*crm.Admin)
+	sellerMap := make(map[int]*crm.Admin)
 	for i := range adminList {
-		sellerMap[adminList[i].RealName] = adminList[i]
+		sellerMap[adminList[i].AdminId] = adminList[i]
 	}
 
 	list,err := fms.GetIncomeHistoryList()
@@ -124,9 +124,11 @@ func FIXIncomeHistorySellerId() (err error) {
 	}
 	for _, v := range list {
 		fmt.Println("v:", v.IncomeId)
-		if seller, ok := sellerMap[v.SellerName]; ok{
+		if seller, ok := sellerMap[v.SellerId]; ok{
 			v.SellerId = seller.AdminId
-			if e = v.Update([]string{"SellerId"}); e != nil {
+			v.GroupId  = seller.GroupId
+			v.GroupName  = seller.GroupName
+			if e = v.Update([]string{"GroupId,GroupName"}); e != nil {
 				fmt.Println("更新销售失败, Err: " + e.Error())
 				return
 			}

+ 11 - 9
models/fms/contract_income_history.go

@@ -6,13 +6,15 @@ import (
 )
 
 type ContractIncomeHistory struct {
-	IncomeId    int       `json:"income_id" gorm:"primaryKey;column:income_id"`       //
-	Amount      float64   `json:"amount" gorm:"column:amount"`             // 开票金额
-	InvoiceTime time.Time `json:"invoice_time" gorm:"column:invoice_time"` // 开票日期/到款月
-	SellerId    int       `json:"seller_id" gorm:"column:seller_id"`       // 销售ID
-	SellerName  string    `json:"seller_name" gorm:"column:seller_name"`   // 销售名称
-	NewCompany  int       `json:"new_company" gorm:"column:new_company"`   // 是否为新客户:0-否;1-是
-	CompanyName string    `json:"company_name" gorm:"column:company_name"` // 客户名称
+	IncomeId    int       `json:"income_id" gorm:"primaryKey;column:income_id"` //
+	Amount      float64   `json:"amount" gorm:"column:amount"`                  // 开票金额
+	InvoiceTime time.Time `json:"invoice_time" gorm:"column:invoice_time"`      // 开票日期/到款月
+	SellerId    int       `json:"seller_id" gorm:"column:seller_id"`            // 销售ID
+	GroupId     int       `json:"group_id" gorm:"column:group_id"`              // 销售ID
+	SellerName  string    `json:"seller_name" gorm:"column:seller_name"`        // 销售名称
+	GroupName   string    `json:"group_name" gorm:"column:group_name"`          // 销售名称
+	NewCompany  int       `json:"new_company" gorm:"column:new_company"`        // 是否为新客户:0-否;1-是
+	CompanyName string    `json:"company_name" gorm:"column:company_name"`      // 客户名称
 }
 
 func (c *ContractIncomeHistory) List(condition string, pars []interface{}) (list []*ContractIncomeHistory, err error) {
@@ -29,7 +31,7 @@ func (c *ContractIncomeHistory) TableName() string {
 
 // GetIncomeHistory
 func GetIncomeHistory(condition string, pars []interface{}) (results []*IncomeSummaryItem, err error) {
-	sql := `SELECT amount,seller_name,new_company AS contract_type,company_name,invoice_time AS invoice_date FROM contract_income_history WHERE  `
+	sql := `SELECT amount,seller_name,new_company AS contract_type,company_name,invoice_time AS invoice_date, seller_id as final_seller_id,group_id AS seller_group_id FROM contract_income_history WHERE  `
 	sql += condition
 	sql += ` ORDER BY invoice_date `
 	err = global.DEFAULT_MYSQL.Raw(sql, pars...).Find(&results).Error
@@ -57,4 +59,4 @@ FROM
 	sql += ` ORDER BY invoice_time DESC  `
 	err = global.DEFAULT_MYSQL.Raw(sql, pars...).First(&result).Error
 	return
-}
+}

+ 14 - 0
models/fms/contract_invoice.go

@@ -819,3 +819,17 @@ func GetInvoiceCountByRegisterId(registerId int) (total int64, err error) {
 		Where("is_deleted = 0 AND contract_register_id = ?", registerId).Count(&total).Error
 	return
 }
+
+type CensusSellerGroupList []*CensusSellerGroupInvoiceItem
+
+func (c CensusSellerGroupList) Len() int {
+	return len(c)
+}
+
+func (c CensusSellerGroupList) Less(i, j int) bool {
+	return c[i].InvoiceAmount < c[j].InvoiceAmount
+}
+
+func (c CensusSellerGroupList) Swap(i, j int) {
+	c[i], c[j] = c[j], c[i]
+}

+ 6 - 1
models/fms/invoice_payment_summary.go

@@ -197,12 +197,17 @@ type IncomeSummaryItem struct {
 	InvoiceDate  time.Time `json:"invoice_time" description:"开票日期"`
 	Amount       float64   `json:"amount" description:"金额"`
 	SellerName   string    `json:"seller_name" description:"销售名称"`
+	FinalSellerId int       `json:"final_seller_id" description:"最终销售ID"`
+	SellerGroupId int       `json:"seller_group_id" description:"销售分组ID"`
 }
 
 // GetContractSummaryIncomeAmount 获取汇总金额合计信息
 func GetContractSummaryIncomeAmount(condition string, pars []interface{}) (results []*IncomeSummaryItem, err error) {
 	query := global.DEFAULT_MYSQL.Table("invoice_payment_summary AS a").
-		Select("IF(a.invoice_id=0,d.amount, b.amount) AS amount,IF(a.invoice_id=0,d.invoice_time, b.invoice_time) AS invoice_date, c.contract_type,c.company_name,IF(a.invoice_id=0,d.seller_name, b.seller_name) AS seller_name,IF(a.invoice_id=0,d.seller_id, b.seller_id) AS final_seller_id").
+		Select("IF(a.invoice_id=0,d.amount, b.amount) AS amount,IF(a.invoice_id=0,d.invoice_time, b.invoice_time) AS invoice_date," +
+			" c.contract_type,c.company_name,IF(a.invoice_id=0,d.seller_name, b.seller_name) AS seller_name," +
+			"IF(a.invoice_id=0,d.seller_id, b.seller_id) AS final_seller_id," +
+			"IF(a.invoice_id=0,d.seller_group_id, b.seller_group_id) AS seller_group_id").
 		Joins("LEFT JOIN contract_invoice AS b ON a.invoice_id = b.contract_invoice_id AND b.is_deleted = 0 ").
 		Joins("LEFT JOIN contract_invoice AS d ON a.payment_id = d.contract_invoice_id AND d.is_deleted = 0").
 		Joins("JOIN contract_register AS c ON a.register_id = c.contract_register_id AND c.is_deleted = 0").

+ 1 - 1
routers/census.go

@@ -19,6 +19,6 @@ func InitCensus(rg *gin.RouterGroup) {
 	// 销售
 	sel := new(census.SellerController)
 	selGroup := rg.Group("seller/").Use(middleware.Token())
-	selGroup.GET("group_invoice_list", sel.GroupInvoiceList)
+	selGroup.GET("group_invoice_list", sel.GroupInvoiceListV2)
 	selGroup.GET("invoice_list", sel.InvoiceList)
 }