package dfcf import ( "fmt" "gitee.com/quant1x/exchange" "gitee.com/quant1x/gox/api" "gitee.com/quant1x/gox/http" "gitee.com/quant1x/gox/logger" "gitee.com/quant1x/pkg/fastjson" urlpkg "net/url" ) // 数据来源: https://data.eastmoney.com/bbsj/yjbb/301381.html const ( urlQuarterlyReportAll = "https://datacenter-web.eastmoney.com/api/data/v1/get" EastmoneyQuarterlyReportAllPageSize = 50 // 一页最大50条 ) // QuarterlyReport 财报 type QuarterlyReport struct { SecurityCode string `json:"CODE"` // 证券代码 ReportDate string `json:"REPORTDATE"` // 报告日期 NoticeDate string `json:"NOTICE_DATE"` // 最新公告日期 UpdateDate string `json:"UPDATE_DATE"` // 更新日期 SecuCode string `json:"SECUCODE"` // 证券代码 BasicEPS float64 `json:"BASIC_EPS"` // 每股收益 DeductBasicEPS float64 `json:"DEDUCT_BASIC_EPS"` // 每股收益(扣除) TotalOperateIncome float64 `json:"TOTAL_OPERATE_INCOME"` // 营业总收入 ParentNetprofit float64 `json:"PARENT_NETPROFIT"` // 净利润 WeightAvgRoe float64 `json:"WEIGHTAVG_ROE"` // 净资产收益率 YSTZ float64 `json:"YSTZ"` // 营业总收入同比增长 SJLTZ float64 `json:"SJLTZ"` // 净利润同比增长 BPS float64 `json:"BPS"` // 每股净资产 MGJYXJJE float64 `json:"MGJYXJJE"` // 每股经营现金流量(元) XSMLL float64 `json:"XSMLL"` // 销售毛利率(%) YSHZ float64 `json:"YSHZ"` SJLHZ float64 `json:"SJLHZ"` ASSIGNDSCRPT float64 `json:"ASSIGNDSCRPT"` PAYYEAR float64 `json:"PAYYEAR"` PUBLISHNAME float64 `json:"PUBLISHNAME"` ZXGXL float64 `json:"ZXGXL"` ORGCODE string `json:"ORG_CODE"` TRADEMARKETZJG string `json:"TRADE_MARKET_ZJG"` IsNew string `json:"ISNEW"` QDATE string `name:"报告期" json:"QDATE"` // 季报期 DATATYPE string `json:"DATATYPE"` DATAYEAR string `json:"DATAYEAR"` DATEMMDD string `json:"DATEMMDD"` EITIME string `json:"EITIME"` TRADEMARKETCODE string `json:"TRADE_MARKET_CODE"` TRADEMARKET string `json:"TRADE_MARKET"` //市场 SECURITYTYPECODE string `json:"SECURITY_TYPE_CODE"` SECURITYTYPE string `json:"SECURITY_TYPE"` SECURITYCODE string `json:"SECURITY_CODE"` // 证券代码 SECURITYNAMEABBR string `json:"SECURITY_NAME_ABBR"` // 证券名称 } // GetQuarterlyReports 分页获取季报数据 func GetQuarterlyReports(pageNumber ...int) (reports []QuarterlyReport, pages int, err error) { pageNo := 1 if len(pageNumber) > 0 { pageNo = pageNumber[0] } _, qEnd := api.GetQuarterDay(4) beginDate := exchange.FixTradeDate(qEnd) params := urlpkg.Values{ //"callback": {"jQuery1123043614175387302234_1685785566671"}, //"sortColumns": {"UPDATE_DATE,SECURITY_CODE"}, "sortColumns": {"REPORTDATE,SECURITY_CODE"}, "sortTypes": {"-1,1"}, "pageSize": {fmt.Sprint(EastmoneyQuarterlyReportAllPageSize)}, "pageNumber": {fmt.Sprintf("%d", pageNo)}, "reportName": {"RPT_LICO_FN_CPD"}, "columns": {"ALL"}, //"filter": {"(REPORTDATE>='2023-03-31')"}, "filter": {fmt.Sprintf("(REPORTDATE>='%s')", beginDate)}, //"filter": {fmt.Sprintf("(REPORTDATE<='%s')(SECURITY_CODE=\"301381\")", beginDate)}, //"filter": {fmt.Sprintf("(REPORTDATE>='%s')(REPORTDATE<'%s')", beginDate, "2023-03-31")}, } url := urlQuarterlyReportAll + "?" + params.Encode() data, err := http.Get(url) //fmt.Println(api.Bytes2String(data)) obj, err := fastjson.ParseBytes(data) if err != nil { logger.Errorf("%+v\n", err) return } result := obj.Get("result") list := result.GetArray("data") pages = result.GetInt("pages") if len(list) > 0 { for _, v := range list { v.GetStringBytes() report := QuarterlyReport{ SecuCode: v.GetString("SECUCODE"), UpdateDate: v.GetString("UPDATE_DATE"), ReportDate: v.GetString("REPORTDATE"), BasicEPS: v.GetFloat64("BASIC_EPS"), DeductBasicEPS: v.GetFloat64("DEDUCT_BASIC_EPS"), BPS: v.GetFloat64("BPS"), NoticeDate: v.GetString("NOTICE_DATE"), IsNew: v.GetString("ISNEW"), ORGCODE: v.GetString("ORG_CODE"), TRADEMARKETZJG: v.GetString("TRADE_MARKET_ZJG"), QDATE: v.GetString("QDATE"), DATATYPE: v.GetString("DATATYPE"), DATAYEAR: v.GetString("DATAYEAR"), DATEMMDD: v.GetString("DATEMMDD"), EITIME: v.GetString("EITIME"), SECURITYCODE: v.GetString("SECURITY_CODE"), SECURITYNAMEABBR: v.GetString("SECURITY_NAME_ABBR"), TRADEMARKETCODE: v.GetString("TRADE_MARKET_CODE"), TRADEMARKET: v.GetString("TRADE_MARKET"), SECURITYTYPECODE: v.GetString("SECURITY_TYPE_CODE"), SECURITYTYPE: v.GetString("SECURITY_TYPE"), TotalOperateIncome: v.GetFloat64("TOTAL_OPERATE_INCOME"), ParentNetprofit: v.GetFloat64("PARENT_NETPROFIT"), WeightAvgRoe: v.GetFloat64("WEIGHTAVG_ROE"), YSTZ: v.GetFloat64("YSTZ"), SJLTZ: v.GetFloat64("SJLTZ"), MGJYXJJE: v.GetFloat64("MGJYXJJE"), XSMLL: v.GetFloat64("XSMLL"), YSHZ: v.GetFloat64("YSHZ"), SJLHZ: v.GetFloat64("SJLHZ"), ASSIGNDSCRPT: v.GetFloat64("ASSIGNDSCRPT"), PAYYEAR: v.GetFloat64("PAYYEAR"), PUBLISHNAME: v.GetFloat64("PUBLISHNAME"), ZXGXL: v.GetFloat64("ZXGXL"), } // 截取市场编码,截取股票编码,市场编码+股票编码拼接作为主键 securityCode := exchange.CorrectSecurityCode(report.SecuCode) report.SecurityCode = securityCode reports = append(reports, report) } } return }