Browse Source

no message

xingzai 11 months ago
parent
commit
f7e062a1d1

+ 4 - 4
controllers/cygx/contract_allocation.go

@@ -702,7 +702,7 @@ func (this *ContractAllocationController) CompanyContracDetail() {
 		return
 	}
 
-	permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略", utils.CHART_PERMISSION_NAME_MAI_FANG_YANXUAN}
+	permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略", "固收", utils.CHART_PERMISSION_NAME_MAI_FANG_YANXUAN}
 	for _, v := range permissionNameArr {
 		for _, v2 := range respList {
 			if v2.ChartPermissionName == v {
@@ -798,8 +798,8 @@ func (this *ContractAllocationController) CompanyContracUpdate() {
 	}
 	mapPermissionNameHave := make(map[string]bool) // 判断合同是否存在某一行业权限种类
 	for _, n := range raiPermissions {
-		//只计算,医药、消费、科技、智造、策略、买方研选的
-		if n.PermissionName != utils.YI_YAO_NAME && n.PermissionName != utils.XIAO_FEI_NAME && n.PermissionName != utils.KE_JI_NAME && n.PermissionName != utils.ZHI_ZAO_NAME && n.PermissionName != utils.CE_LUE_NAME && n.PermissionName != utils.CHART_PERMISSION_NAME_MAI_FANG_YANXUAN {
+		//只计算,医药、消费、科技、智造、策略、固收、买方研选的
+		if n.PermissionName != utils.YI_YAO_NAME && n.PermissionName != utils.XIAO_FEI_NAME && n.PermissionName != utils.KE_JI_NAME && n.PermissionName != utils.ZHI_ZAO_NAME && n.PermissionName != utils.CE_LUE_NAME && n.PermissionName != utils.GU_SHOU_NAME && n.PermissionName != utils.CHART_PERMISSION_NAME_MAI_FANG_YANXUAN {
 			continue
 		}
 		match := hasMap[n.ChartPermissionId]
@@ -1122,7 +1122,7 @@ func (this *ContractAllocationController) CompanyContractStatistics() {
 	}
 
 	var list []*cygx.AllocationPermissionStatisticsListResp
-	permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略", "买方研选"}
+	permissionNameArr := []string{"医药", "消费", "科技", "智造", "策略", "固收", "买方研选"}
 	for _, v := range permissionNameArr {
 		item := new(cygx.AllocationPermissionStatisticsListResp)
 		item.ChartPermissionName = v

+ 327 - 6
controllers/cygx/enter_score.go

@@ -4,12 +4,15 @@ import (
 	"encoding/json"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
 	"hongze/hz_crm_api/controllers"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/models/system"
 	"hongze/hz_crm_api/utils"
+	"os"
+	"path/filepath"
 	"strings"
 	"time"
 )
@@ -346,6 +349,16 @@ func (this *EnterScoreController) EnterScoreUpdate() {
 	item.StartDate = req.StartDate
 	item.EndDate = req.EndDate
 	item.Quarter = strings.Join(req.Quarter, ",")
+
+	quarterDate, err := utils.GetQuarterStartDatesInRange(req.StartDate, req.EndDate)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取对应季度信息失败,Err:" + err.Error()
+		return
+	}
+
+	item.QuarterDate = strings.Join(quarterDate, ",")
+
 	item.EnterScoreType = req.EnterScoreType
 	item.Ranking = req.Ranking
 	item.IsMergeScoring = req.IsMergeScoring
@@ -590,7 +603,7 @@ func (this *EnterScoreController) EnterScoreDelete() {
 // @Param   EndDate   query   string  false       "结束日期"
 // @Param   EnterScoreType   query   string  false       "展示法方式 1:按评分录入、2:按比例录入,默认1"
 // @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
-// @Success Ret=200 {object} cygx.CompanyNameAndIdListResp
+// @Success Ret=200 {object} cygx.ScoreOverviewListResp
 // @router /enterScore/scoreOverview [get]
 func (this *EnterScoreController) EnterScoreScoreOverview() {
 	br := new(models.BaseResponse).Init()
@@ -606,7 +619,7 @@ func (this *EnterScoreController) EnterScoreScoreOverview() {
 		return
 	}
 	resp := new(cygx.ScoreOverviewListResp)
-	keyWord := this.GetString("keyWord")
+	keyWord := this.GetString("KeyWord")
 	city := this.GetString("City")
 	enterScoreType, _ := this.GetInt("EnterScoreType", 1)
 	startDate := this.GetString("StartDate")
@@ -618,10 +631,6 @@ func (this *EnterScoreController) EnterScoreScoreOverview() {
 		return
 	}
 
-	if isExport {
-		fmt.Println(isExport)
-	}
-
 	var companyCondition string
 	var companypars []interface{}
 	companyCondition += ` AND b.product_name = ? `
@@ -862,8 +871,320 @@ func (this *EnterScoreController) EnterScoreScoreOverview() {
 		resp.ListGroup = itemsG
 	}
 	resp.ListCompany = companyList
+
+	//导出excel
+	if isExport {
+		EnterScoreScoreOverviewExport(this, resp, br)
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EnterScoreScoreOverviewExport 导出Excel
+func EnterScoreScoreOverviewExport(this *EnterScoreController, resp *cygx.ScoreOverviewListResp, br *models.BaseResponse) {
+	dir, err := os.Executable()
+	exPath := filepath.Dir(dir)
+	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	if err != nil {
+		br.Msg = "生成文件失败"
+		br.ErrMsg = "生成文件失败"
+		return
+	}
+	style := xlsx.NewStyle()
+	alignment := xlsx.Alignment{
+		Horizontal: "center",
+		Vertical:   "center",
+		WrapText:   true,
+	}
+
+	style.Alignment = alignment
+	style.ApplyAlignment = true
+
+	sheel, err := xlsxFile.AddSheet("评分总览")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	sheel.SetColWidth(0, 0, 30)
+	sheel.SetColWidth(1, 1, 15)
+	sheel.SetColWidth(2, 2, 15)
+	sheel.SetColWidth(3, 3, 18)
+
+	companyList := resp.ListCompany
+	listPermission := resp.ListPermission
+	listGroup := resp.ListGroup
+	titleRow := sheel.AddRow()
+
+	cellNull := titleRow.AddCell()
+	cellNull.SetStyle(style)
+	cellNull.SetValue("")
+	for _, v := range companyList { //第一行公司
+		cellA := titleRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.CompanyName)
+	}
+	for _, v := range listPermission { // 行业排序名称
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+		cellA := dataRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.ChartPermissionName)
+
+		for _, vCp := range v.ProportionListText { // 行业对应的占比值
+			cellP := dataRow.AddCell()
+			cellP.SetStyle(style)
+			cellP.SetValue(vCp)
+		}
+
+		for _, vUser := range v.List { // 研究员姓名
+			dataRowName := sheel.AddRow()
+			dataRowName.SetHeight(20)
+			cellName := dataRowName.AddCell()
+			cellName.SetStyle(style)
+			cellName.SetValue(vUser.RealName)
+
+			for _, vUp := range vUser.ProportionListText { //研究员占比值
+				cellP := dataRowName.AddCell()
+				cellP.SetStyle(style)
+				cellP.SetValue(vUp)
+			}
+		}
+	}
+
+	for _, v := range listGroup { // 自定义名称
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+		cellA := dataRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.GroupName)
+
+		for _, vG := range v.ProportionListText { // 自定义名称所对应的值
+			cellP := dataRow.AddCell()
+			cellP.SetStyle(style)
+			cellP.SetValue(vG)
+		}
+	}
+
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
+	downloadFileName := "评分总览" + randStr + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "导出成功"
+}
+
+// @Title  排名总览
+// @Description 排名总览接口
+// @Param   AdminId   query   string  true       "销售id,多个用英文逗号隔开,空字符串为全部"
+// @Param   City   query   string  true       "城市"
+// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
+// @Success Ret=200 {object} cygx.CompanyNameAndIdListResp
+// @router /enterScore/rankingOverview [get]
+func (this *EnterScoreController) EnterScoreRankingOverview() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	resp := new(cygx.RankingOverviewListResp)
+	city := this.GetString("City")
+	adminId := this.GetString("AdminId")
+	//是否导出报表
+	isExport, _ := this.GetBool("IsExport")
+
+	var companyCondition string
+	var companypars []interface{}
+	companyCondition += ` AND b.product_name = ? `
+	companypars = append(companypars, "权益")
+	companyCondition += ` AND b.status = ? `
+	companypars = append(companypars, "永续")
+
+	if adminId != "" {
+		companyCondition += ` AND b.seller_id IN (` + adminId + `) `
+	}
+	if city != "" {
+		companyCondition += ` AND a.city = ? `
+		companypars = append(companypars, city)
+	}
+
+	companyList, err := company.GetCompanyIdListByproductName(companyCondition, companypars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	var condition string
+	var pars []interface{}
+
+	total, err := cygx.GetCygxEnterScoreCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	dataMd := []string{"10-01", "07-01", "04-01", "01-01"}
+	thisYear := time.Now().Year()
+	startYear := 2018 // 自定义开始时间
+	var quarterDate []string
+	for _, v := range dataMd {
+		dateTimeStr := fmt.Sprint(thisYear, "-", v)
+		dateTime, err := time.Parse("2006-01-02", dateTimeStr)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		if dateTime.After(time.Now()) {
+			continue
+		}
+		quarterDate = append(quarterDate, dateTimeStr)
+	}
+
+	for i := thisYear - 1; i >= startYear; i-- {
+		for _, v := range dataMd {
+			dateTimeStr := fmt.Sprint(i, "-", v)
+			quarterDate = append(quarterDate, dateTimeStr)
+		}
+	}
+
+	var itemsQuarter []*cygx.QuarterDateListResp
+
+	if total > 0 {
+		list, err := cygx.GetCygxEnterScoreList(condition, pars, 0, 9999)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,GetCygxEnterScoreList Err:" + err.Error()
+			return
+		}
+		mapQuarter := make(map[string]string)
+		for _, v := range list {
+			silicequarter := strings.Split(v.QuarterDate, ",")
+			for _, vQ := range silicequarter {
+				mapQuarter[fmt.Sprint(vQ, "_", v.CompanyId)] = v.Ranking //季度时间、公司ID,排名对应关系绑定
+			}
+		}
+		mapRankingText := make(map[string][]string)
+		for _, vC := range companyList {
+			for _, vQ := range quarterDate {
+				var ranking string
+				ranking = mapQuarter[fmt.Sprint(vQ, "_", vC.CompanyId)]
+				mapRankingText[vQ] = append(mapRankingText[vQ], ranking)
+			}
+		}
+		for _, v := range quarterDate {
+			itemQuarter := new(cygx.QuarterDateListResp)
+			itemQuarter.Quarter = v
+			itemQuarter.ProportionListText = mapRankingText[v]
+			itemsQuarter = append(itemsQuarter, itemQuarter)
+		}
+	}
+	resp.ListCompany = companyList
+	resp.ListQuarterDate = itemsQuarter
+	//导出excel
+	if isExport {
+		RankingOverviewExport(this, resp, br)
+		return
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// RankingOverviewExport 导出Excel
+func RankingOverviewExport(this *EnterScoreController, resp *cygx.RankingOverviewListResp, br *models.BaseResponse) {
+	dir, err := os.Executable()
+	exPath := filepath.Dir(dir)
+	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+	if err != nil {
+		br.Msg = "生成文件失败"
+		br.ErrMsg = "生成文件失败"
+		return
+	}
+	style := xlsx.NewStyle()
+	alignment := xlsx.Alignment{
+		Horizontal: "center",
+		Vertical:   "center",
+		WrapText:   true,
+	}
+
+	style.Alignment = alignment
+	style.ApplyAlignment = true
+
+	sheel, err := xlsxFile.AddSheet("排名总览")
+	if err != nil {
+		br.Msg = "新增Sheet失败"
+		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+		return
+	}
+	sheel.SetColWidth(0, 0, 30)
+	sheel.SetColWidth(1, 1, 15)
+	sheel.SetColWidth(2, 2, 15)
+	sheel.SetColWidth(3, 3, 18)
+
+	companyList := resp.ListCompany
+	listQuarterDate := resp.ListQuarterDate
+
+	titleRow := sheel.AddRow()
+
+	cellNull := titleRow.AddCell()
+	cellNull.SetStyle(style)
+	cellNull.SetValue("")
+	for _, v := range companyList { //第一行公司
+		cellA := titleRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.CompanyName)
+	}
+	for _, v := range listQuarterDate { // 季度排序
+		dataRow := sheel.AddRow()
+		dataRow.SetHeight(20)
+		cellA := dataRow.AddCell()
+		cellA.SetStyle(style)
+		cellA.SetValue(v.Quarter)
+
+		for _, vCp := range v.ProportionListText { // 行业对应的占比值
+			cellP := dataRow.AddCell()
+			cellP.SetStyle(style)
+			cellP.SetValue(vCp)
+		}
+	}
+
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
+	downloadFileName := "排名总览" + randStr + ".xlsx"
+	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "导出成功"
+}

+ 14 - 2
models/cygx/enter_score.go

@@ -16,6 +16,7 @@ type CygxEnterScore struct {
 	StartDate           string    `comment:"开始日期"`
 	EndDate             string    `comment:"结束日期"`
 	Quarter             string    `comment:"季度"`
+	QuarterDate         string    `comment:"季度带有年月日的多个数组转成的字符串"`
 	EnterScoreType      int       `comment:"录入方式 1:按评分录入、2:按比例录入"`
 	Ranking             string    `comment:"排名"`
 	IsMergeScoring      int       `comment:"是否合并打分"`
@@ -222,7 +223,7 @@ func UpdateCygxEnterScore(item *CygxEnterScore, itemsPermission []*CygxEnterScor
 		}
 	}()
 
-	_, err = to.Update(item, "CompanyId", "CompanyName", "StartDate", "EndDate", "Quarter", "EnterScoreType", "Ranking", "IsMergeScoring", "SecuritiesFirmsName", "MergeProportion", "RaiProportionTotal", "FiccProportionTotal", "ProportionTotal", "SellerId", "SellerName", "AdminId", "AdminName", "ModifyTime")
+	_, err = to.Update(item, "CompanyId", "CompanyName", "StartDate", "EndDate", "Quarter", "QuarterDate", "EnterScoreType", "Ranking", "IsMergeScoring", "SecuritiesFirmsName", "MergeProportion", "RaiProportionTotal", "FiccProportionTotal", "ProportionTotal", "SellerId", "SellerName", "AdminId", "AdminName", "ModifyTime")
 	if err != nil {
 		return
 	}
@@ -324,7 +325,7 @@ func GeCygxEnterScoreResearcherListByIds(enterScoreIds []int) (items []*CygxEnte
 		return
 	}
 	o := orm.NewOrmUsingDB("hz_cygx")
-	sql := `SELECT * FROM cygx_enter_score_researcher  WHERE  enter_score_id IN  (` + utils.GetOrmInReplace(lenArr) + `) `
+	sql := `SELECT * FROM cygx_enter_score_researcher  WHERE  enter_score_id IN  (` + utils.GetOrmInReplace(lenArr) + `)  AND  proportion > 0  `
 	_, err = o.Raw(sql, enterScoreIds).QueryRows(&items)
 	return
 }
@@ -444,3 +445,14 @@ type ScoreOverviewListResp struct {
 	ListPermission []*EnterScorePermissionListResp
 	ListGroup      []*EnterScoreGroupListResp
 }
+
+type RankingOverviewListResp struct {
+	ListCompany     []*company.CompanyNameAndId
+	ListQuarterDate []*QuarterDateListResp
+}
+
+// 排名总览
+type QuarterDateListResp struct {
+	Quarter            string   `description:"季度"`
+	ProportionListText []string `description:"占比列表"`
+}

+ 9 - 0
routers/commentsRouter.go

@@ -1492,6 +1492,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"],
+        beego.ControllerComments{
+            Method: "EnterScoreRankingOverview",
+            Router: `/enterScore/rankingOverview`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:EnterScoreController"],
         beego.ControllerComments{
             Method: "EnterScoreScoreOverview",

+ 35 - 0
utils/common.go

@@ -2201,3 +2201,38 @@ func GetLikeKeywordPars(pars []interface{}, keyword string, num int) (newPars []
 	}
 	return
 }
+
+// 通过开始时间,结束时间,获取对应季度的第一天数组
+func GetQuarterStartDatesInRange(startTimeStr, endTimeStr string) ([]string, error) {
+	startTime, err := time.Parse("2006-01-02", startTimeStr)
+	if err != nil {
+		return nil, fmt.Errorf("failed to parse start time: %v", err)
+	}
+
+	endTime, err := time.Parse("2006-01-02", endTimeStr)
+	if err != nil {
+		return nil, fmt.Errorf("failed to parse end time: %v", err)
+	}
+
+	adjustedStartTime := startTime.AddDate(0, -int(startTime.Month()-1)%3, -startTime.Day()+1)
+
+	startYear, _, _ := adjustedStartTime.Date()
+	endYear, _, _ := endTime.Date()
+
+	var quarters []string
+	//quarters := []string
+	for year := startYear; year <= endYear; year++ {
+		for quarter := 1; quarter <= 4; quarter++ {
+			firstMonth := (quarter-1)*3 + 1
+			quarterStartDate := time.Date(year, time.Month(firstMonth), 1, 0, 0, 0, 0, time.UTC)
+
+			// Check if quarter start date is within the range
+			if quarterStartDate.After(endTime) || quarterStartDate.AddDate(0, 3, -1).Before(adjustedStartTime) {
+				continue
+			}
+
+			quarters = append(quarters, quarterStartDate.Format(FormatDate))
+		}
+	}
+	return quarters, nil
+}