xiziwen 3 miesięcy temu
rodzic
commit
a3612774cd

+ 1588 - 0
controller/census/income_list.go

@@ -0,0 +1,1588 @@
+package census
+
+import (
+	"bytes"
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"github.com/go-playground/validator/v10"
+	"github.com/tealeg/xlsx"
+	"hongze/fms_api/controller/resp"
+	"hongze/fms_api/global"
+	"hongze/fms_api/models"
+	"hongze/fms_api/models/fms"
+	"hongze/fms_api/services/alarm_msg"
+	"hongze/fms_api/utils"
+	"net/http"
+	"sort"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// IncomeList
+// @Title 业务收入统计表
+// @Description 获取业务收入统计表接口
+// @Param   ListParam		query	int		false	"套餐类型: 0-月度; 1-季度; 2-半年度;3-年度;4-月度累计"
+// @Success 200 {object} fms.CensusIncomeChartResp
+// @router /census/income/chart_list [get]
+func (this *InvoicePaymentController) IncomeChartList(c *gin.Context) {
+	var req fms.IncomeChartListReq
+	if e := c.BindQuery(&req); e != nil {
+		err, ok := e.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
+		return
+	}
+	//收入统计
+	var incomeList models.CensusIncomeChartResp
+	ch := make(chan models.CensusIncomeChartResp, 1)
+	if req.IncomeType == 0 {
+		go getCensusIncomeChartList(ch, req)
+	} else {
+		go getPaymentIncomeChartList(ch, req)
+	}
+
+	for v := range ch {
+		incomeList = v
+		close(ch)
+	}
+	// 是否导出
+	if req.IsExport == 1 {
+		ExportIncomeList(c, incomeList.DataList)
+		return
+	}
+	resp.OkData("获取成功", incomeList, c)
+}
+
+func getCensusIncomeChartList(ch chan models.CensusIncomeChartResp, req fms.IncomeChartListReq) (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
+	}()
+	//todayStr := utils.GetToday("20060102")
+	//key := "admin:home:fmsIncomeList:" + todayStr
+	//
+	//redisJsonData, redisErr := global.Redis.Get(context.TODO(), key).Result()
+	//if redisErr != nil {
+
+	//获取最新的开票到款日期
+	cond := ``
+	historyCond := ``
+	pars := make([]interface{}, 0)
+	historyPars := make([]interface{}, 0)
+
+	if req.SellerIds != "" {
+		sellerIds := strings.Split(req.SellerIds, ",")
+		cond += ` AND (a.seller_id in ? ) `
+		historyCond += ` AND (seller_id in ? ) `
+		pars = append(pars, sellerIds)
+		historyPars = append(historyPars, sellerIds)
+	}
+	if req.CompanyType == 1 {
+		cond += ` AND b.contract_type = 1 `
+		historyCond += ` AND new_company = 1 `
+	} else if req.CompanyType == 2 {
+		cond += ` 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()
+	}
+
+	if req.CompanyType == 3 {
+		cond += ` AND b.contract_type IN (2,3,4) `
+		historyCond += ` AND new_company = 0 `
+	}
+
+	latestTime = latestTime.AddDate(0, 0, -latestTime.Day()+1)
+	addMonth := 0
+	if req.ListParam == "1" {
+		addMonth = int(3 - latestTime.Month()%3)
+	}
+	if req.ListParam == "2" {
+		addMonth = int(6 - latestTime.Month()%6)
+	}
+	if req.ListParam == "3" {
+		addMonth = int(12 - latestTime.Month()%12)
+	}
+	latestTime = latestTime.AddDate(0, addMonth, 0)
+
+	var dateSlice []string
+	var totalMoneySlice, prevTotalMoneySlice []float64
+	var yoySlice []string
+	var yearNum, monthNum int
+	var reqStartDate, reqEndDate time.Time
+	historyTime, _ := time.Parse(utils.FormatDate, "2023-04-01")
+
+	// 套餐筛选
+	if req.ServiceTypes != "" {
+		serviceTypes := strings.Split(req.ServiceTypes, ",")
+		registerIds, e := fms.GetContractRegisterIdsByTempId(serviceTypes)
+		if e != nil {
+			err = fmt.Errorf("获取合同登记IDs失败, Err: %s", e.Error())
+			return
+		}
+		if len(registerIds) > 0 {
+			cond += ` AND b.contract_register_id IN ?`
+			pars = append(pars, registerIds)
+		} else {
+			cond += ` AND 1 = 2`
+		}
+		// 勾选套餐筛选时忽略导入的历史数据
+		if req.StartDate == "" {
+			req.StartDate = "2023-04"
+			req.EndDate = "3023-04"
+		} else {
+			startDateTime, _ := time.Parse(utils.FormatMonth, req.StartDate)
+			if startDateTime.Before(historyTime) {
+				req.StartDate = "2023-04"
+			}
+		}
+	}
+
+	if req.StartDate != "" && req.EndDate != "" {
+		st := fmt.Sprint(req.StartDate, "-01 00:00:00")
+		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 //共存在多少个月
+	if numMonth < 0 {
+		numMonth = -numMonth
+	}
+	//if req.ListParam == "1" {
+	//	numMonth = numMonth / 3
+	//} else if req.ListParam == "2" {
+	//	numMonth = numMonth / 6
+	//} else if req.ListParam == "3" {
+	//	numMonth = numMonth / 12
+	//}
+	// 累计值
+	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 `
+		} else if req.CompanyType == 3 {
+			//未续约收入金额=去年同期总收入金额(新客户+老客户)-当期老客户收入金额
+			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)
+		}
+
+		// 套餐筛选
+		if req.ServiceTypes != "" {
+			serviceTypes := strings.Split(req.ServiceTypes, ",")
+			registerIds, e := fms.GetContractRegisterIdsByTempId(serviceTypes)
+			if e != nil {
+				err = fmt.Errorf("获取合同登记IDs失败, Err: %s", e.Error())
+				return
+			}
+			if len(registerIds) > 0 {
+				cond += ` AND a.register_id IN ?`
+				prevCond += ` AND a.register_id IN ?`
+				pars = append(pars, registerIds)
+				prevPars = append(pars, registerIds)
+			} else {
+				cond += ` AND 1 = 2`
+				prevCond += ` AND 1 = 2`
+			}
+		}
+
+		//fmt.Println("i:",i)
+		//fmt.Println("j:",j)
+		{
+			//本期
+			st := fmt.Sprint(startDate, " 00:00:00")
+			ed := fmt.Sprint(endDate, " 23:59:59")
+			//校验日期,分段查询
+			if startDateTime.After(historyTime) || startDateTime.Equal(historyTime) {
+				//全部走新查询
+				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
+				}
+
+				// 开票到款金额合计(换算后)
+				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
+					}
+				}
+
+				//fmt.Println("partAccumulate:",partAccumulate)
+			}
+
+		}
+
+		{ // 去年同期,用于计算同比值
+			prevSt := fmt.Sprint(prevStartDate, " 00:00:00") // 格式化上一年同一天的开始时间
+			prevEd := fmt.Sprint(prevEndDate, " 23:59:59")   // 格式化上一年同一天的结束时间
+
+			// 校验日期,分段查询
+			if prevStartDateTime.After(historyTime) || prevStartDateTime.Equal(historyTime) {
+				// 全部走新查询
+				prevCond += ` AND ((c.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
+				}
+
+				// 开票到款金额合计(换算后)
+				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, 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.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++
+			}
+		}
+	}
+
+	fmt.Println("prevTotalMoneySlice:", len(prevTotalMoneySlice))
+	fmt.Println("totalMoneySlice:", len(totalMoneySlice))
+
+	if req.CompanyType != 3 {
+		//计算同比值
+		for i := range prevTotalMoneySlice {
+			var yoy float64
+			var yoyStr string
+			//fmt.Println("1:", prevTotalMoneySlice[i])
+			//fmt.Println("2:", totalMoneySlice[i])
+			//fmt.Println("3:", totalMoneySlice[i]-prevTotalMoneySlice[i])
+			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)
+				}
+			}
+			yoySlice = append(yoySlice, yoyStr)
+		}
+	} 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 {
+				yoySlice = append(yoySlice, "")
+			}
+		}
+	}
+
+	incomeChart.Title = "开票到款统计图"
+	incomeChart.Date = dateSlice[:len(totalMoneySlice)]
+	incomeChart.TotalMoney = totalMoneySlice
+	incomeChart.PrevTotalMoney = prevTotalMoneySlice
+	incomeChart.Yoy = yoySlice
+
+	//redisJsonData, err := json.Marshal(incomeChart)
+	//if err == nil {
+	//	global.Redis.SetEX(context.TODO(), key, string(redisJsonData), time.Minute*30)
+	//}
+	//} else {
+	//	err = json.Unmarshal([]byte(redisJsonData), &incomeChart)
+	//	if err != nil {
+	//		fmt.Println("近两年的收入统计数据,json转换失败")
+	//	}
+	//}
+
+	return
+}
+
+func getPaymentIncomeChartList(ch chan models.CensusIncomeChartResp, req fms.IncomeChartListReq) (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
+	}()
+	//todayStr := utils.GetToday("20060102")
+	//key := "admin:home:fmsIncomeList:" + todayStr
+	//
+	//redisJsonData, redisErr := global.Redis.Get(context.TODO(), key).Result()
+	//if redisErr != nil {
+
+	//获取最新的开票到款日期
+	cond := ``
+	historyCond := ``
+	pars := make([]interface{}, 0)
+	historyPars := make([]interface{}, 0)
+
+	if req.SellerIds != "" {
+		sellerIds := strings.Split(req.SellerIds, ",")
+		cond += ` AND (a.seller_id in ? ) `
+		historyCond += ` AND (seller_id in ? ) `
+		pars = append(pars, sellerIds)
+		historyPars = append(historyPars, sellerIds)
+	}
+	if req.CompanyType == 1 {
+		cond += ` AND b.contract_type = 1 `
+		historyCond += ` AND new_company = 1 `
+	} else if req.CompanyType == 2 {
+		cond += ` 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 latestTime.IsZero() {
+		latestTime = time.Now()
+	}
+
+	if req.CompanyType == 3 {
+		cond += ` AND b.contract_type IN (2,3,4) `
+		historyCond += ` AND new_company = 0 `
+	}
+
+	latestTime = latestTime.AddDate(0, 0, -latestTime.Day()+1)
+	addMonth := 0
+	if req.ListParam == "1" {
+		addMonth = int(3 - latestTime.Month()%3)
+	}
+	if req.ListParam == "2" {
+		addMonth = int(6 - latestTime.Month()%6)
+	}
+	if req.ListParam == "3" {
+		addMonth = int(12 - latestTime.Month()%12)
+	}
+	latestTime = latestTime.AddDate(0, addMonth, 0)
+
+	var dateSlice []string
+	var totalMoneySlice, prevTotalMoneySlice []float64
+	var yoySlice []string
+	var yearNum, monthNum int
+	var reqStartDate, reqEndDate time.Time
+
+	// 套餐筛选
+	if req.ServiceTypes != "" {
+		serviceTypes := strings.Split(req.ServiceTypes, ",")
+		registerIds, e := fms.GetContractRegisterIdsByTempId(serviceTypes)
+		if e != nil {
+			err = fmt.Errorf("获取合同登记IDs失败, Err: %s", e.Error())
+			return
+		}
+		if len(registerIds) > 0 {
+			cond += ` AND b.contract_register_id IN ?`
+			pars = append(pars, registerIds)
+		} else {
+			cond += ` AND 1 = 2`
+		}
+	}
+
+	if req.StartDate != "" && req.EndDate != "" {
+		st := fmt.Sprint(req.StartDate, "-01 00:00:00")
+		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)
+	}
+
+	numMonth := yearNum*12 + monthNum //共存在多少个月
+	if numMonth < 0 {
+		numMonth = -numMonth
+	}
+
+	// 累计值
+	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 `
+		} else if req.CompanyType == 3 {
+			//未续约收入金额=去年同期总收入金额(新客户+老客户)-当期老客户收入金额
+			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)
+		}
+
+		// 套餐筛选
+		if req.ServiceTypes != "" {
+			serviceTypes := strings.Split(req.ServiceTypes, ",")
+			registerIds, e := fms.GetContractRegisterIdsByTempId(serviceTypes)
+			if e != nil {
+				err = fmt.Errorf("获取合同登记IDs失败, Err: %s", e.Error())
+				return
+			}
+			if len(registerIds) > 0 {
+				cond += ` AND a.register_id IN ?`
+				prevCond += ` AND a.register_id IN ?`
+				pars = append(pars, registerIds)
+				prevPars = append(pars, registerIds)
+			} else {
+				cond += ` AND 1 = 2`
+				prevCond += ` AND 1 = 2`
+			}
+		}
+
+		//fmt.Println("i:",i)
+		//fmt.Println("j:",j)
+		{
+			//本期
+			st := fmt.Sprint(startDate, " 00:00:00")
+			ed := fmt.Sprint(endDate, " 23:59:59")
+			//校验日期
+			//全部走新查询
+			cond += ` AND (d.invoice_time BETWEEN ? AND ?)`
+			pars = append(pars, st, ed, st, ed)
+			summaryIds, e := fms.GetPaymentCensusSummaryDataIds(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 ( d.seller_id IN ? AND  a.payment_id <> 0 AND d.invoice_time BETWEEN ? AND ?) `
+					amountPars = append(amountPars, sellerIds, st, ed, sellerIds, st, ed)
+				} else {
+					amountCond += `AND (a.payment_id <> 0  AND d.invoice_time BETWEEN ? AND ?)`
+					amountPars = append(amountPars, st, ed, st, ed)
+				}
+				results, e := fms.GetContractSummaryPaymentIncomeAmount(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
+				}
+			}
+
+		}
+
+		{ // 去年同期,用于计算同比值
+			prevSt := fmt.Sprint(prevStartDate, " 00:00:00") // 格式化上一年同一天的开始时间
+			prevEd := fmt.Sprint(prevEndDate, " 23:59:59")   // 格式化上一年同一天的结束时间
+
+			// 校验日期,分段查询
+			// 全部走新查询
+			prevCond += ` AND (d.invoice_time BETWEEN ? AND ?)`                         // 查询条件加入新的时间范围
+			prevPars = append(prevPars, prevSt, prevEd, prevSt, prevEd)                 // 添加时间参数到参数列表
+			prevSummaryIds, e := fms.GetPaymentCensusSummaryDataIds(prevCond, prevPars) // 获取摘要ID列表
+			if e != nil {
+				return
+			}
+
+			// 开票到款金额合计(换算后)
+			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 ( d.seller_id IN ? AND  a.payment_id <> 0 AND d.invoice_time BETWEEN ? AND ?) ` // 根据卖家ID和发票/支付状态筛选时间范围
+					amountPars = append(amountPars, sellerIds, prevSt, prevEd, sellerIds, prevSt, prevEd)              // 将卖家ID列表添加到参数列表
+				} else {
+					amountCond += `AND (a.payment_id <> 0 AND d.invoice_time BETWEEN ? AND ?)` // 根据发票/支付状态筛选时间范围
+					amountPars = append(amountPars, prevSt, prevEd, prevSt, prevEd)
+				}
+				results, e := fms.GetContractSummaryPaymentIncomeAmount(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 // 清零部分历史金额
+				}
+			}
+
+			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++
+			}
+		}
+	}
+
+	fmt.Println("prevTotalMoneySlice:", len(prevTotalMoneySlice))
+	fmt.Println("totalMoneySlice:", len(totalMoneySlice))
+
+	if req.CompanyType != 3 {
+		//计算同比值
+		for i := range prevTotalMoneySlice {
+			var yoy float64
+			var yoyStr string
+			//fmt.Println("1:", prevTotalMoneySlice[i])
+			//fmt.Println("2:", totalMoneySlice[i])
+			//fmt.Println("3:", totalMoneySlice[i]-prevTotalMoneySlice[i])
+			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)
+				}
+			}
+			yoySlice = append(yoySlice, yoyStr)
+		}
+	} 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 {
+				yoySlice = append(yoySlice, "")
+			}
+		}
+	}
+
+	incomeChart.Title = "开票到款统计图"
+	incomeChart.Date = dateSlice[:len(totalMoneySlice)]
+	incomeChart.TotalMoney = totalMoneySlice
+	incomeChart.PrevTotalMoney = prevTotalMoneySlice
+	incomeChart.Yoy = yoySlice
+
+	//redisJsonData, err := json.Marshal(incomeChart)
+	//if err == nil {
+	//	global.Redis.SetEX(context.TODO(), key, string(redisJsonData), time.Minute*30)
+	//}
+	//} else {
+	//	err = json.Unmarshal([]byte(redisJsonData), &incomeChart)
+	//	if err != nil {
+	//		fmt.Println("近两年的收入统计数据,json转换失败")
+	//	}
+	//}
+
+	return
+}
+
+// ExportIncomeList 导出业务收入统计列表
+func ExportIncomeList(c *gin.Context, list []*fms.IncomeSummaryItem) {
+	// 生成Excel文件
+	xlsxFile := xlsx.NewFile()
+	style := xlsx.NewStyle()
+	alignment := xlsx.Alignment{
+		Horizontal: "center",
+		Vertical:   "center",
+		WrapText:   true,
+	}
+	style.Alignment = alignment
+	style.ApplyAlignment = true
+
+	sheetName := "业务收入统计表"
+	sheet, err := xlsxFile.AddSheet(sheetName)
+	if err != nil {
+		resp.FailData("新增Sheet失败", "Err:"+err.Error(), c)
+		return
+	}
+
+	// 数据表头
+	rowTitle := []string{"开票日期", "新客户(1)", "客户名称", "金额", "销售"}
+	titleRow := sheet.AddRow()
+	for i := range rowTitle {
+		v := titleRow.AddCell()
+		v.SetString(rowTitle[i])
+		v.SetStyle(style)
+	}
+	incomeSummaryItemList := make(fms.IncomeSummaryItemList, 0)
+	incomeSummaryItemList = list
+	sort.Sort(incomeSummaryItemList)
+	// 填充数据
+	for _, v := range incomeSummaryItemList {
+		dataRow := sheet.AddRow()
+		dataRow.AddCell().SetString(v.InvoiceDate.Format(utils.FormatDate)) // 开票日期
+		newCompany := 0
+		if v.ContractType == 1 {
+			newCompany = 1
+		}
+		dataRow.AddCell().SetString(strconv.Itoa(newCompany)) // 新客户
+		dataRow.AddCell().SetString(v.CompanyName)            // 客户名称
+		dataRow.AddCell().SetString(fmt.Sprint(v.Amount))     // 金额
+		dataRow.AddCell().SetString(v.SellerName)             // 销售员
+	}
+
+	// 输出文件
+	var buffer bytes.Buffer
+	_ = xlsxFile.Write(&buffer)
+	content := bytes.NewReader(buffer.Bytes())
+	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
+	fileName := sheetName + randStr + ".xlsx"
+
+	c.Writer.Header().Add("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, fileName))
+	c.Writer.Header().Add("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
+	http.ServeContent(c.Writer, c.Request, fileName, time.Now(), content)
+}
+
+// IncomeList
+// @Title 业务收入统计表
+// @Description 获取业务收入统计表接口
+// @Param   ListParam		query	int		false	"套餐类型: 0-月度; 1-季度; 2-半年度;3-年度;4-月度累计"
+// @Success 200 {object} fms.CensusIncomeChartResp
+// @router /census/income/list [get]
+func (this *InvoicePaymentController) IncomeList(c *gin.Context) {
+	var req fms.IncomeListReq
+	if e := c.BindQuery(&req); e != nil {
+		err, ok := e.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
+		return
+	}
+	//收入统计
+	incomeList := make([]*fms.IncomeSummaryRespItem, 0)
+	ch := make(chan []*fms.IncomeSummaryRespItem, 1)
+	if req.IncomeType == 0 {
+		go getPaymentIncomeList(ch, req)
+	} else {
+		go getPaymentIncomeList(ch, req)
+	}
+
+	for v := range ch {
+		incomeList = append(incomeList, v...)
+		close(ch)
+	}
+	// 是否导出
+	//if req.IsExport == 1 {
+	//	ExportIncomeList(c, incomeList.DataList)
+	//	return
+	//}
+	resp.OkData("获取成功", incomeList, c)
+}
+
+//func getCensusIncomeList(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
+//	}()
+//
+//	var dateSlice []string
+//	var totalMoneySlice, prevTotalMoneySlice []float64
+//	var yoySlice []string
+//
+//	var reqStartDate, reqEndDate time.Time
+//	historyTime, _ := time.Parse(utils.FormatDate, "2023-04-01")
+//
+//	// 套餐筛选
+//	if req.ServiceTypes != "" {
+//		serviceTypes := strings.Split(req.ServiceTypes, ",")
+//		registerIds, e := fms.GetContractRegisterIdsByTempId(serviceTypes)
+//		if e != nil {
+//			err = fmt.Errorf("获取合同登记IDs失败, Err: %s", e.Error())
+//			return
+//		}
+//		// 勾选套餐筛选时忽略导入的历史数据
+//		if req.StartDate == "" {
+//			req.StartDate = "2023-04"
+//			req.EndDate = "3023-04"
+//		} else {
+//			startDateTime, _ := time.Parse(utils.FormatMonth, req.StartDate)
+//			if startDateTime.Before(historyTime) {
+//				req.StartDate = "2023-04"
+//			}
+//		}
+//	}
+//
+//	if req.StartDate != "" && req.EndDate != "" {
+//		st := fmt.Sprint(req.StartDate, "-01 00:00:00")
+//		ed := fmt.Sprint(req.EndDate, "-01 23:59:59")
+//		reqStartDate, _ = time.Parse(utils.FormatDateTime, st)
+//		reqEndDate, _ = time.Parse(utils.FormatDateTime, ed)
+//	}
+//
+//
+//		//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 `
+//		} else if req.CompanyType == 3 {
+//			//未续约收入金额=去年同期总收入金额(新客户+老客户)-当期老客户收入金额
+//			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)
+//		}
+//
+//		// 套餐筛选
+//		if req.ServiceTypes != "" {
+//			serviceTypes := strings.Split(req.ServiceTypes, ",")
+//			registerIds, e := fms.GetContractRegisterIdsByTempId(serviceTypes)
+//			if e != nil {
+//				err = fmt.Errorf("获取合同登记IDs失败, Err: %s", e.Error())
+//				return
+//			}
+//			if len(registerIds) > 0 {
+//				cond += ` AND a.register_id IN ?`
+//				prevCond += ` AND a.register_id IN ?`
+//				pars = append(pars, registerIds)
+//				prevPars = append(pars, registerIds)
+//			} else {
+//				cond += ` AND 1 = 2`
+//				prevCond += ` AND 1 = 2`
+//			}
+//		}
+//
+//		//fmt.Println("i:",i)
+//		//fmt.Println("j:",j)
+//		{
+//			//本期
+//			st := fmt.Sprint(startDate, " 00:00:00")
+//			ed := fmt.Sprint(endDate, " 23:59:59")
+//			//校验日期,分段查询
+//			if startDateTime.After(historyTime) || startDateTime.Equal(historyTime) {
+//				//全部走新查询
+//				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
+//				}
+//
+//				// 开票到款金额合计(换算后)
+//				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
+//					}
+//				}
+//
+//				//fmt.Println("partAccumulate:",partAccumulate)
+//			}
+//
+//		}
+//
+//
+//	fmt.Println("prevTotalMoneySlice:", len(prevTotalMoneySlice))
+//	fmt.Println("totalMoneySlice:", len(totalMoneySlice))
+//
+//	if req.CompanyType != 3 {
+//		//计算同比值
+//		for i := range prevTotalMoneySlice {
+//			var yoy float64
+//			var yoyStr string
+//			//fmt.Println("1:", prevTotalMoneySlice[i])
+//			//fmt.Println("2:", totalMoneySlice[i])
+//			//fmt.Println("3:", totalMoneySlice[i]-prevTotalMoneySlice[i])
+//			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)
+//				}
+//			}
+//			yoySlice = append(yoySlice, yoyStr)
+//		}
+//	} 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 {
+//				yoySlice = append(yoySlice, "")
+//			}
+//		}
+//	}
+//
+//	incomeChart.Title = "开票到款统计图"
+//	incomeChart.Date = dateSlice[:len(totalMoneySlice)]
+//	incomeChart.TotalMoney = totalMoneySlice
+//	incomeChart.PrevTotalMoney = prevTotalMoneySlice
+//	incomeChart.Yoy = yoySlice
+//
+//	//redisJsonData, err := json.Marshal(incomeChart)
+//	//if err == nil {
+//	//	global.Redis.SetEX(context.TODO(), key, string(redisJsonData), time.Minute*30)
+//	//}
+//	//} else {
+//	//	err = json.Unmarshal([]byte(redisJsonData), &incomeChart)
+//	//	if err != nil {
+//	//		fmt.Println("近两年的收入统计数据,json转换失败")
+//	//	}
+//	//}
+//
+//	return
+//}
+
+func getPaymentIncomeList(ch chan []*fms.IncomeSummaryRespItem, req fms.IncomeListReq) (resp []*fms.IncomeSummaryRespItem, err error) {
+	defer func() {
+		if err != nil {
+			global.LOG.Error(err)
+			if err != utils.ErrNoRow {
+				go alarm_msg.SendAlarmMsg("获取业务收入金额统计数据异常,Err:"+err.Error(), 3)
+			}
+		}
+		ch <- resp
+	}()
+
+
+	var reqStartDate, reqEndDate time.Time
+
+	st := fmt.Sprint(req.StartDate, "-01 00:00:00")
+	ed := fmt.Sprint(req.EndDate, "-01 23:59:59")
+	reqStartDate, _ = time.Parse(utils.FormatDateTime, st)
+	reqEndDate, _ = time.Parse(utils.FormatDateTime, ed)
+
+	var startDate, endDate string
+	//开始日期
+	if req.StartDate != "" && req.EndDate != "" {
+		startDate = reqStartDate.Format(utils.FormatDate)
+	}
+
+
+	//结束日期
+	if req.StartDate != "" && req.EndDate != "" {
+		endDate = reqEndDate.Format(utils.FormatDate)
+	}
+
+
+	cond := `1 = 1`
+	pars := make([]interface{}, 0)
+
+	if req.CompanyType == 1 {
+		cond += ` AND b.contract_type = 1 `
+	} else if req.CompanyType == 2 {
+		cond += ` AND b.contract_type IN (2,3,4) `
+	} else if req.CompanyType == 3 {
+		//未续约收入金额=去年同期总收入金额(新客户+老客户)-当期老客户收入金额
+		cond += ` AND b.contract_type IN (2,3,4) `
+	}
+
+	if req.SellerIds != "" {
+		sellerIds := strings.Split(req.SellerIds, ",")
+		cond += ` AND (c.seller_id in ? OR d.seller_id in ?)`
+		pars = append(pars, sellerIds, sellerIds)
+	}
+
+	// 套餐筛选
+	if req.ServiceTypes != "" {
+		serviceTypes := strings.Split(req.ServiceTypes, ",")
+		registerIds, e := fms.GetContractRegisterIdsByTempId(serviceTypes)
+		if e != nil {
+			err = fmt.Errorf("获取合同登记IDs失败, Err: %s", e.Error())
+			return
+		}
+		if len(registerIds) > 0 {
+			cond += ` AND a.register_id IN ?`
+			pars = append(pars, registerIds)
+		} else {
+			cond += ` AND 1 = 2`
+		}
+	}
+
+	{
+		if startDate != "" && endDate != "" {
+			st := fmt.Sprint(startDate, " 00:00:00")
+			ed := fmt.Sprint(endDate, " 23:59:59")
+			cond += ` AND (d.invoice_time BETWEEN ? AND ?)`
+			pars = append(pars, st, ed, st, ed)
+		}
+
+		summaryIds, e := fms.GetPaymentCensusSummaryDataIds(cond, pars)
+		if e != nil {
+			return
+		}
+
+		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 ( d.seller_id IN ? AND  a.payment_id <> 0 ) `
+				amountPars = append(amountPars, sellerIds)
+			} else {
+				amountCond += `AND (a.payment_id <> 0)`
+			}
+			results, e := fms.GetContractSummaryPaymentIncomeAmountPage(amountCond, amountPars)
+			if e != nil {
+				err = fmt.Errorf("获取汇总数据失败, Err: %s", e.Error())
+				return
+			}
+			for _, v := range results {
+				respItem := &fms.IncomeSummaryRespItem{
+					CompanyName:     v.CompanyName,
+					ContractType:    v.ContractType,
+					InvoiceDate:     v.InvoiceDate.Format(utils.FormatDate),
+					Amount:          v.Amount,
+					SellerName:      v.SellerName,
+					FinalSellerId:   v.FinalSellerId,
+				}
+				resp = append(resp, respItem)
+			}
+		}
+	}
+
+	return
+}

+ 1 - 671
controller/census/invoice_payment.go

@@ -8,16 +8,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"
 	fmsService "hongze/fms_api/services/fms"
 	"hongze/fms_api/utils"
 	"net/http"
-	"sort"
 	"strconv"
 	"strings"
 	"sync"
@@ -737,674 +734,6 @@ func (ct *InvoicePaymentController) List(c *gin.Context) {
 	resp.OkData("获取成功", baseData, c)
 }
 
-// IncomeList
-// @Title 业务收入统计表
-// @Description 获取业务收入统计表接口
-// @Param   ListParam		query	int		false	"套餐类型: 0-月度; 1-季度; 2-半年度;3-年度;4-月度累计"
-// @Success 200 {object} fms.CensusIncomeChartResp
-// @router /census/income/list [get]
-func (this *InvoicePaymentController) IncomeList(c *gin.Context) {
-	var req fms.IncomeListReq
-	if e := c.BindQuery(&req); e != nil {
-		err, ok := e.(validator.ValidationErrors)
-		if !ok {
-			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
-			return
-		}
-		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
-		return
-	}
-	//收入统计
-	var incomeList models.CensusIncomeChartResp
-	ch := make(chan models.CensusIncomeChartResp, 1)
-	go getCensusIncomeListV2(ch, req)
-
-	for v := range ch {
-		incomeList = v
-		close(ch)
-	}
-	// 是否导出
-	if req.IsExport == 1 {
-		ExportIncomeList(c, incomeList.DataList)
-		return
-	}
-	resp.OkData("获取成功", incomeList, c)
-}
-
-func getCensusIncomeListV2(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
-	}()
-	//todayStr := utils.GetToday("20060102")
-	//key := "admin:home:fmsIncomeList:" + todayStr
-	//
-	//redisJsonData, redisErr := global.Redis.Get(context.TODO(), key).Result()
-	//if redisErr != nil {
-
-	//获取最新的开票到款日期
-	cond := ``
-	historyCond := ``
-	pars := make([]interface{}, 0)
-	historyPars := make([]interface{}, 0)
-
-	if req.SellerIds != "" {
-		sellerIds := strings.Split(req.SellerIds, ",")
-		cond += ` AND (a.seller_id in ? ) `
-		historyCond += ` AND (seller_id in ? ) `
-		pars = append(pars, sellerIds)
-		historyPars = append(historyPars, sellerIds)
-	}
-	if req.CompanyType == 1 {
-		cond += ` AND b.contract_type = 1 `
-		historyCond += ` AND new_company = 1 `
-	} else if req.CompanyType == 2 {
-		cond += ` 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()
-	}
-
-	if req.CompanyType == 3 {
-		cond += ` AND b.contract_type IN (2,3,4) `
-		historyCond += ` AND new_company = 0 `
-	}
-
-	latestTime = latestTime.AddDate(0, 0, -latestTime.Day()+1)
-	addMonth := 0
-	if req.ListParam == "1" {
-		addMonth = int(3 - latestTime.Month() % 3)
-	}
-	if req.ListParam == "2" {
-		addMonth = int(6 - latestTime.Month() % 6)
-	}
-	if req.ListParam == "3" {
-		addMonth = int(12 - latestTime.Month() % 12)
-	}
-	latestTime = latestTime.AddDate(0,addMonth,0)
-
-	var dateSlice []string
-	var totalMoneySlice, prevTotalMoneySlice []float64
-	var yoySlice []string
-	var yearNum, monthNum int
-	var reqStartDate, reqEndDate time.Time
-	historyTime, _ := time.Parse(utils.FormatDate, "2023-04-01")
-
-	// 套餐筛选
-	if req.ServiceTypes != "" {
-		serviceTypes := strings.Split(req.ServiceTypes, ",")
-		registerIds, e := fms.GetContractRegisterIdsByTempId(serviceTypes)
-		if e != nil {
-			err = fmt.Errorf("获取合同登记IDs失败, Err: %s", e.Error())
-			return
-		}
-		if len(registerIds) > 0 {
-			cond += ` AND b.contract_register_id IN ?`
-			pars = append(pars, registerIds)
-		} else {
-			cond += ` AND 1 = 2`
-		}
-		// 勾选套餐筛选时忽略导入的历史数据
-		if req.StartDate == "" {
-			req.StartDate = "2023-04"
-			req.EndDate = "3023-04"
-		} else {
-			startDateTime, _ := time.Parse(utils.FormatMonth, req.StartDate)
-			if startDateTime.Before(historyTime) {
-				req.StartDate = "2023-04"
-			}
-		}
-	}
-
-	if req.StartDate != "" && req.EndDate != "" {
-		st := fmt.Sprint(req.StartDate, "-01 00:00:00")
-		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 //共存在多少个月
-	if numMonth < 0 {
-		numMonth = -numMonth
-	}
-	//if req.ListParam == "1" {
-	//	numMonth = numMonth / 3
-	//} else if req.ListParam == "2" {
-	//	numMonth = numMonth / 6
-	//} else if req.ListParam == "3" {
-	//	numMonth = numMonth / 12
-	//}
-	// 累计值
-	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 `
-		} else if req.CompanyType == 3 {
-			//未续约收入金额=去年同期总收入金额(新客户+老客户)-当期老客户收入金额
-			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)
-		}
-
-		// 套餐筛选
-		if req.ServiceTypes != "" {
-			serviceTypes := strings.Split(req.ServiceTypes, ",")
-			registerIds, e := fms.GetContractRegisterIdsByTempId(serviceTypes)
-			if e != nil {
-				err = fmt.Errorf("获取合同登记IDs失败, Err: %s", e.Error())
-				return
-			}
-			if len(registerIds) > 0 {
-				cond += ` AND a.register_id IN ?`
-				prevCond += ` AND a.register_id IN ?`
-				pars = append(pars, registerIds)
-				prevPars = append(pars, registerIds)
-			} else {
-				cond += ` AND 1 = 2`
-				prevCond += ` AND 1 = 2`
-			}
-		}
-
-		//fmt.Println("i:",i)
-		//fmt.Println("j:",j)
-		{
-			//本期
-			st := fmt.Sprint(startDate, " 00:00:00")
-			ed := fmt.Sprint(endDate, " 23:59:59")
-			//校验日期,分段查询
-			if startDateTime.After(historyTime) || startDateTime.Equal(historyTime) {
-				//全部走新查询
-				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
-				}
-
-				// 开票到款金额合计(换算后)
-				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
-					}
-				}
-
-				//fmt.Println("partAccumulate:",partAccumulate)
-			}
-
-		}
-
-		{ // 去年同期,用于计算同比值
-			prevSt := fmt.Sprint(prevStartDate, " 00:00:00") // 格式化上一年同一天的开始时间
-			prevEd := fmt.Sprint(prevEndDate, " 23:59:59")   // 格式化上一年同一天的结束时间
-
-			// 校验日期,分段查询
-			if prevStartDateTime.After(historyTime) || prevStartDateTime.Equal(historyTime) {
-				// 全部走新查询
-				prevCond += ` AND ((c.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
-				}
-
-				// 开票到款金额合计(换算后)
-				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, 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.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++
-			}
-		}
-	}
-
-	fmt.Println("prevTotalMoneySlice:", len(prevTotalMoneySlice))
-	fmt.Println("totalMoneySlice:", len(totalMoneySlice))
-
-	if req.CompanyType != 3 {
-		//计算同比值
-		for i := range prevTotalMoneySlice {
-			var yoy float64
-			var yoyStr string
-			//fmt.Println("1:", prevTotalMoneySlice[i])
-			//fmt.Println("2:", totalMoneySlice[i])
-			//fmt.Println("3:", totalMoneySlice[i]-prevTotalMoneySlice[i])
-			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)
-				}
-			}
-			yoySlice = append(yoySlice, yoyStr)
-		}
-	} 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 {
-				yoySlice = append(yoySlice, "")
-			}
-		}
-	}
-
-	incomeChart.Title = "开票到款统计图"
-	incomeChart.Date = dateSlice[:len(totalMoneySlice)]
-	incomeChart.TotalMoney = totalMoneySlice
-	incomeChart.PrevTotalMoney = prevTotalMoneySlice
-	incomeChart.Yoy = yoySlice
-
-	//redisJsonData, err := json.Marshal(incomeChart)
-	//if err == nil {
-	//	global.Redis.SetEX(context.TODO(), key, string(redisJsonData), time.Minute*30)
-	//}
-	//} else {
-	//	err = json.Unmarshal([]byte(redisJsonData), &incomeChart)
-	//	if err != nil {
-	//		fmt.Println("近两年的收入统计数据,json转换失败")
-	//	}
-	//}
-
-	return
-}
-
-// ExportIncomeList 导出业务收入统计列表
-func ExportIncomeList(c *gin.Context, list []*fms.IncomeSummaryItem) {
-	// 生成Excel文件
-	xlsxFile := xlsx.NewFile()
-	style := xlsx.NewStyle()
-	alignment := xlsx.Alignment{
-		Horizontal: "center",
-		Vertical:   "center",
-		WrapText:   true,
-	}
-	style.Alignment = alignment
-	style.ApplyAlignment = true
-
-	sheetName := "业务收入统计表"
-	sheet, err := xlsxFile.AddSheet(sheetName)
-	if err != nil {
-		resp.FailData("新增Sheet失败", "Err:"+err.Error(), c)
-		return
-	}
-
-	// 数据表头
-	rowTitle := []string{"开票日期", "新客户(1)", "客户名称", "金额", "销售"}
-	titleRow := sheet.AddRow()
-	for i := range rowTitle {
-		v := titleRow.AddCell()
-		v.SetString(rowTitle[i])
-		v.SetStyle(style)
-	}
-	incomeSummaryItemList := make(fms.IncomeSummaryItemList, 0)
-	incomeSummaryItemList = list
-	sort.Sort(incomeSummaryItemList)
-	// 填充数据
-	for _, v := range incomeSummaryItemList {
-		dataRow := sheet.AddRow()
-		dataRow.AddCell().SetString(v.InvoiceDate.Format(utils.FormatDate)) // 开票日期
-		newCompany := 0
-		if v.ContractType == 1 {
-			newCompany = 1
-		}
-		dataRow.AddCell().SetString(strconv.Itoa(newCompany)) // 新客户
-		dataRow.AddCell().SetString(v.CompanyName)            // 客户名称
-		dataRow.AddCell().SetString(fmt.Sprint(v.Amount))     // 金额
-		dataRow.AddCell().SetString(v.SellerName)             // 销售员
-	}
-
-	// 输出文件
-	var buffer bytes.Buffer
-	_ = xlsxFile.Write(&buffer)
-	content := bytes.NewReader(buffer.Bytes())
-	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
-	fileName := sheetName + randStr + ".xlsx"
-
-	c.Writer.Header().Add("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, fileName))
-	c.Writer.Header().Add("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
-	http.ServeContent(c.Writer, c.Request, fileName, time.Now(), content)
-}
-
 // List
 // @Title 未开票统计列表
 // @Description 未开票统计列表
@@ -2639,3 +1968,4 @@ func ExportNotPaymentCensusList(c *gin.Context, results *fms.NotInvoicePaymentCe
 	c.Writer.Header().Add("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
 	http.ServeContent(c.Writer, c.Request, fileName, time.Now(), content)
 }
+

+ 13 - 1
models/fms/contract_invoice.go

@@ -665,7 +665,7 @@ func GetDuplicateContractInvoiceDetailItemList(companyName, startDate, endDate s
 	return
 }
 
-type IncomeListReq struct {
+type IncomeChartListReq struct {
 	SellerIds    string `json:"seller_ids" form:"seller_ids" description:"销售ID,多个ID之间用逗号拼接"`
 	StartDate    string `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01" description:"开始日期"`
 	EndDate      string `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01" description:"结束日期"`
@@ -673,6 +673,7 @@ type IncomeListReq struct {
 	ListParam    string `json:"list_param" form:"list_param" description:"套餐类型: 0-月度; 1-季度; 2-半年度;3-年度;4-月度累计"`
 	CompanyType  int    `json:"company_type" form:"company_type" description:"客户类型 0全部 1新客户 2老客户 3未续约"`
 	ServiceTypes string `json:"service_types" form:"service_types" description:"套餐类型"`
+	IncomeType   int    `json:"income_type" form:"income_type" description:"收入类型 0开票收入 1到款收入"`
 }
 
 // 获取最新的开票或到款日期
@@ -827,3 +828,14 @@ func GetInvoiceCountByRegisterId(registerId int) (total int64, err error) {
 		Where("is_deleted = 0 AND contract_register_id = ?", registerId).Count(&total).Error
 	return
 }
+
+type IncomeListReq struct {
+	SellerIds    string `json:"seller_ids" form:"seller_ids" description:"销售ID,多个ID之间用逗号拼接"`
+	StartDate    string `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01" description:"开始日期"`
+	EndDate      string `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01" description:"结束日期"`
+	IsExport     int    `json:"is_export" form:"is_export" description:"是否导出: 0-否; 1-是"`
+	ListParam    string `json:"list_param" form:"list_param" description:"套餐类型: 0-月度; 1-季度; 2-半年度;3-年度;4-月度累计"`
+	CompanyType  int    `json:"company_type" form:"company_type" description:"客户类型 0全部 1新客户 2老客户 3未续约"`
+	ServiceTypes string `json:"service_types" form:"service_types" description:"套餐类型"`
+	IncomeType   int    `json:"income_type" form:"income_type" description:"收入类型 0开票收入 1到款收入"`
+}

+ 53 - 0
models/fms/invoice_payment_summary.go

@@ -385,3 +385,56 @@ func UpdateInvoicePaymentSummaryByRegisterId(newId int, registerIds []int) (err
 	err = global.DEFAULT_MYSQL.Exec(sql, newId, registerIds).Error
 	return
 }
+
+
+// GetContractSummaryPaymentIncomeAmount 获取汇总金额合计信息-到款收入统计
+func GetContractSummaryPaymentIncomeAmount(condition string, pars []interface{}) (results []*IncomeSummaryItem, err error) {
+	query := global.DEFAULT_MYSQL.Table("invoice_payment_summary AS a").
+		Select("d.amount AS amount,d.invoice_time AS invoice_date,"+
+			" c.contract_type,c.company_name,d.seller_name," +
+			" d.seller_id AS final_seller_id, d.seller_group_id AS seller_group_id").
+		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").
+		Where(condition, pars...).Group("id").Order("invoice_date ")
+	//nq := global.DEFAULT_MYSQL.Table("(?) AS e", query).
+	//	Select(" IFNULL( SUM( e.amount ), 0 ) ")
+
+	err = query.Find(&results).Error
+	return
+}
+
+type IncomeSummaryRespItem struct {
+	CompanyName     string    `json:"company_name" description:"客户名称"`
+	ContractType    int       `json:"contract_type" description:"是否为新客户: 2-否; 1-是"`
+	InvoiceDate     string `json:"invoice_time" description:"开票日期"`
+	Amount          float64   `json:"amount" description:"金额"`
+	SellerName      string    `json:"seller_name" description:"销售名称"`
+	FinalSellerId   int       `json:"final_seller_id" description:"最终销售ID"`
+}
+
+// GetContractSummaryPaymentIncomeAmountPage 获取汇总金额合计信息-到款收入统计
+func GetContractSummaryPaymentIncomeAmountPage(condition string, pars []interface{}) (results []*IncomeSummaryItem, err error) {
+	query := global.DEFAULT_MYSQL.Table("invoice_payment_summary AS a").
+		Select("d.amount AS amount,d.invoice_time AS invoice_date,"+
+			" c.contract_type,c.company_name,d.seller_name," +
+			" d.seller_id AS final_seller_id").
+		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").
+		Where(condition, pars...).Group("id").Order("invoice_date ")
+	//nq := global.DEFAULT_MYSQL.Table("(?) AS e", query).
+	//	Select(" IFNULL( SUM( e.amount ), 0 ) ")
+
+	err = query.Find(&results).Error
+	return
+}
+
+// GetPaymentCensusSummaryDataIds 获取商品到款统计列表-汇总数据IDs
+func GetPaymentCensusSummaryDataIds(condition string, pars []interface{}) (summaryIds []int, err error) {
+	query := global.DEFAULT_MYSQL.Table("invoice_payment_summary AS a").
+		Select("a.id AS summary_id").
+		Joins("JOIN contract_register AS b ON a.register_id = b.contract_register_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").
+		Where(condition, pars...)
+	query.Find(&summaryIds)
+	return
+}

+ 1 - 0
routers/census.go

@@ -13,6 +13,7 @@ func InitCensus(rg *gin.RouterGroup) {
 	invGroup.GET("list", inv.List)
 	invGroup.GET("not_invoice/list", inv.NotInvoiceList)
 	invGroup.GET("not_payment/list", inv.NotPaymentList)
+	invGroup.GET("income/chart_list", inv.IncomeChartList)
 	invGroup.GET("income/list", inv.IncomeList)