From 677ad2c2ef26c4e5ece29b6cf59761f613be909a Mon Sep 17 00:00:00 2001 From: yanweidong Date: Sat, 24 Jan 2026 23:44:25 +0800 Subject: [PATCH] fix bug --- cmd/check/main.go | 4 +- cmd/test/main.go | 14 +- internal/logic/a/fina_indicator.go | 1043 ++++++++++++++++++----- internal/models/stock_fina_indicator.go | 3 +- 4 files changed, 823 insertions(+), 241 deletions(-) diff --git a/cmd/check/main.go b/cmd/check/main.go index bd7e68b..5a01d0d 100644 --- a/cmd/check/main.go +++ b/cmd/check/main.go @@ -42,8 +42,8 @@ func main() { // csv文件写入 func WriterCSV(fileName string, datas [][]string) { - //OpenFile读取文件,不存在时则创建,使用追加模式 - File, err := os.OpenFile(fileName, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666) + //OpenFile读取文件,不存在时则创建 + File, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { log.Println("文件打开失败!") } diff --git a/cmd/test/main.go b/cmd/test/main.go index 55387c3..a33c846 100644 --- a/cmd/test/main.go +++ b/cmd/test/main.go @@ -1,14 +1,16 @@ package main import ( + "encoding/json" "fmt" - "time" + + "git.apinb.com/dataset/stock/internal/logic/a" ) func main() { - t, err := time.Parse("20060102", "20230101") - if err != nil { - fmt.Println("error", err) - } - fmt.Println(t) + a.NewApiClient() + reply, err := a.SetFinaIndicator("000012.SZ", "20230101", "20260124") + fmt.Println("Err", err) + jsonBytes, _ := json.Marshal(reply.Data.Items) + fmt.Println("Reply", string(jsonBytes)) } diff --git a/internal/logic/a/fina_indicator.go b/internal/logic/a/fina_indicator.go index bf1c91b..4a91a1e 100644 --- a/internal/logic/a/fina_indicator.go +++ b/internal/logic/a/fina_indicator.go @@ -8,249 +8,828 @@ import ( "git.apinb.com/bsm-sdk/core/utils" "git.apinb.com/dataset/stock/internal/impl" "git.apinb.com/dataset/stock/internal/models" + tushare "github.com/ShawnRong/tushare-go" ) +var PeriodArgs []string = []string{ + "20230331", + "20230630", + "20230930", + "20231231", + "20240331", + "20240630", + "20240930", + "20241231", + "20250331", + "20250630", + "20250930", + "20251231", +} + +func SetFinaIndicator(code, period string) (*tushare.APIResponse, error) { + params := map[string]string{ + "ts_code": code, + "period": period, + } + + fields := strings.Split("ts_code,ann_date,end_date,eps,dt_eps,total_revenue_ps,revenue_ps,capital_rese_ps,surplus_rese_ps,undist_profit_ps,extra_item,profit_dedt,gross_margin,current_ratio,quick_ratio,cash_ratio,invturn_days,arturn_days,inv_turn,ar_turn,ca_turn,fa_turn,assets_turn,op_income,valuechange_income,interst_income,daa,ebit,ebitda,fcff,fcfe,current_exint,noncurrent_exint,interestdebt,netdebt,tangible_asset,working_capital,networking_capital,invest_capital,retained_earnings,diluted2_eps,bps,ocfps,retainedps,cfps,ebit_ps,fcff_ps,fcfe_ps,netprofit_margin,grossprofit_margin,cogs_of_sales,expense_of_sales,profit_to_gr,saleexp_to_gr,adminexp_of_gr,finaexp_of_gr,impai_ttm,gc_of_gr,op_of_gr,ebit_of_gr,roe,roe_waa,roe_dt,roa,npta,roic,roe_yearly,roa2_yearly,roe_avg,opincome_of_ebt,investincome_of_ebt,n_op_profit_of_ebt,tax_to_ebt,dtprofit_to_profit,salescash_to_or,ocf_to_or,ocf_to_opincome,capitalized_to_da,debt_to_assets,assets_to_eqt,dp_assets_to_eqt,ca_to_assets,nca_to_assets,tbassets_to_totalassets,int_to_talcap,eqt_to_talcapital,currentdebt_to_debt,longdeb_to_debt,ocf_to_shortdebt,debt_to_eqt,eqt_to_debt,eqt_to_interestdebt,tangibleasset_to_debt,tangasset_to_intdebt,tangibleasset_to_netdebt,ocf_to_debt,ocf_to_interestdebt,ocf_to_netdebt,ebit_to_interest,longdebt_to_workingcapital,ebitda_to_debt,turn_days,roa_yearly,roa_dp,fixed_assets,profit_prefin_exp,non_op_profit,op_to_ebt,nop_to_ebt,ocf_to_profit,cash_to_liqdebt,cash_to_liqdebt_withinterest,op_to_liqdebt,op_to_debt,roic_yearly,total_fa_trun,profit_to_op,q_opincome,q_investincome,q_dtprofit,q_eps,q_netprofit_margin,q_gsprofit_margin,q_exp_to_sales,q_profit_to_gr,q_saleexp_to_gr,q_adminexp_to_gr,q_finaexp_to_gr,q_impair_to_gr_ttm,q_gc_to_gr,q_op_to_gr,q_roe,q_dt_roe,q_npta,q_opincome_to_ebt,q_investincome_to_ebt,q_dtprofit_to_profit,q_salescash_to_or,q_ocf_to_sales,q_ocf_to_or,basic_eps_yoy,dt_eps_yoy,cfps_yoy,op_yoy,ebt_yoy,netprofit_yoy,dt_netprofit_yoy,ocf_yoy,roe_yoy,bps_yoy,assets_yoy,eqt_yoy,tr_yoy,or_yoy,q_gr_yoy,q_gr_qoq,q_sales_yoy,q_sales_qoq,q_op_yoy,q_op_qoq,q_profit_yoy,q_profit_qoq,q_netprofit_yoy,q_netprofit_qoq,equity_yoy,rd_exp,update_flag", ",") + return TushareClient.FinaIndicator(params, fields) +} + +func ExistFinaIndicator(code, period string) bool { + var cnt int64 + impl.DBService.Model(&models.StockFinaIndicator{}).Where("ts_code=? and period=?", code, utils.String2Int(period)).Count(&cnt) + if cnt == 0 { + return false + } else { + return true + } +} + +func ReFinaIndicator(in *tushare.APIResponse) (bool, map[string]any) { + fiLen := len(in.Data.Items) + if fiLen == 0 { + return false, nil + } + + itemData := make(map[string]any) + for i := 0; i < len(in.Data.Items[0]); i++ { + itemData[in.Data.Fields[i]] = in.Data.Items[0][i] + } + + if itemData == nil { + return false, nil + } + + return true, itemData + +} + func GetFinaIndicator() { - end := time.Now().Format("20060102") for _, code := range GetStockCodes() { - var start string = "20230101" - var last models.StockFinaIndicator - err := impl.DBService.Where("ts_code=?", code).Order("ann_date DESC").First(&last).Error - if err == nil { - start = utils.Int2String(last.AnnDate) - } - params := map[string]string{ - "ts_code": code, - "start_date": start, - "end_date": end, - } - - if start == end { - continue - } - - fields := strings.Split("ts_code,ann_date,end_date,eps,dt_eps,total_revenue_ps,revenue_ps,capital_rese_ps,surplus_rese_ps,undist_profit_ps,extra_item,profit_dedt,gross_margin,current_ratio,quick_ratio,cash_ratio,invturn_days,arturn_days,inv_turn,ar_turn,ca_turn,fa_turn,assets_turn,op_income,valuechange_income,interst_income,daa,ebit,ebitda,fcff,fcfe,current_exint,noncurrent_exint,interestdebt,netdebt,tangible_asset,working_capital,networking_capital,invest_capital,retained_earnings,diluted2_eps,bps,ocfps,retainedps,cfps,ebit_ps,fcff_ps,fcfe_ps,netprofit_margin,grossprofit_margin,cogs_of_sales,expense_of_sales,profit_to_gr,saleexp_to_gr,adminexp_of_gr,finaexp_of_gr,impai_ttm,gc_of_gr,op_of_gr,ebit_of_gr,roe,roe_waa,roe_dt,roa,npta,roic,roe_yearly,roa2_yearly,roe_avg,opincome_of_ebt,investincome_of_ebt,n_op_profit_of_ebt,tax_to_ebt,dtprofit_to_profit,salescash_to_or,ocf_to_or,ocf_to_opincome,capitalized_to_da,debt_to_assets,assets_to_eqt,dp_assets_to_eqt,ca_to_assets,nca_to_assets,tbassets_to_totalassets,int_to_talcap,eqt_to_talcapital,currentdebt_to_debt,longdeb_to_debt,ocf_to_shortdebt,debt_to_eqt,eqt_to_debt,eqt_to_interestdebt,tangibleasset_to_debt,tangasset_to_intdebt,tangibleasset_to_netdebt,ocf_to_debt,ocf_to_interestdebt,ocf_to_netdebt,ebit_to_interest,longdebt_to_workingcapital,ebitda_to_debt,turn_days,roa_yearly,roa_dp,fixed_assets,profit_prefin_exp,non_op_profit,op_to_ebt,nop_to_ebt,ocf_to_profit,cash_to_liqdebt,cash_to_liqdebt_withinterest,op_to_liqdebt,op_to_debt,roic_yearly,total_fa_trun,profit_to_op,q_opincome,q_investincome,q_dtprofit,q_eps,q_netprofit_margin,q_gsprofit_margin,q_exp_to_sales,q_profit_to_gr,q_saleexp_to_gr,q_adminexp_to_gr,q_finaexp_to_gr,q_impair_to_gr_ttm,q_gc_to_gr,q_op_to_gr,q_roe,q_dt_roe,q_npta,q_opincome_to_ebt,q_investincome_to_ebt,q_dtprofit_to_profit,q_salescash_to_or,q_ocf_to_sales,q_ocf_to_or,basic_eps_yoy,dt_eps_yoy,cfps_yoy,op_yoy,ebt_yoy,netprofit_yoy,dt_netprofit_yoy,ocf_yoy,roe_yoy,bps_yoy,assets_yoy,eqt_yoy,tr_yoy,or_yoy,q_gr_yoy,q_gr_qoq,q_sales_yoy,q_sales_qoq,q_op_yoy,q_op_qoq,q_profit_yoy,q_profit_qoq,q_netprofit_yoy,q_netprofit_qoq,equity_yoy,rd_exp,update_flag", ",") - reply, err := TushareClient.FinaIndicator(params, fields) - if err != nil { - log.Println("ERROR", "GetFinaIndicator", err) - return - } - - records := make([]*models.StockFinaIndicator, 0) - itemData := make(map[string]any) - for _, item := range reply.Data.Items { - for i := 0; i < len(item); i++ { - itemData[reply.Data.Fields[i]] = item[i] - } - t := utils.String2Int(itemData["ann_date"].(string)) - if t == 0 { + for _, period := range PeriodArgs { + // 请求API + reply, err := SetFinaIndicator(code, period) + if err != nil { + log.Println("ERROR", "GetFinaIndicator", err) continue } - var cnt int64 - impl.DBService.Model(&models.StockFinaIndicator{}).Where("ts_code=? and ann_date=?", itemData["ts_code"].(string), t).Count(&cnt) - if cnt == 0 { - records = append(records, &models.StockFinaIndicator{ - TsCode: itemData["ts_code"].(string), - AnnDate: t, - EndDate: itemData["end_date"].(string), - - // 每股指标 - Eps: Any2Float(itemData["eps"]), - DtEps: Any2Float(itemData["dt_eps"]), - TotalRevenuePs: Any2Float(itemData["total_revenue_ps"]), - RevenuePs: Any2Float(itemData["revenue_ps"]), - CapitalResePs: Any2Float(itemData["capital_rese_ps"]), - SurplusResePs: Any2Float(itemData["surplus_rese_ps"]), - UndistProfitPs: Any2Float(itemData["undist_profit_ps"]), - Diluted2Eps: Any2Float(itemData["diluted2_eps"]), - Bps: Any2Float(itemData["bps"]), - Ocfps: Any2Float(itemData["ocfps"]), - Retainedps: Any2Float(itemData["retainedps"]), - Cfps: Any2Float(itemData["cfps"]), - EbitPs: Any2Float(itemData["ebit_ps"]), - FcffPs: Any2Float(itemData["fcff_ps"]), - FcfePs: Any2Float(itemData["fcfe_ps"]), - - // 利润表相关 - ExtraItem: Any2Float(itemData["extra_item"]), - ProfitDedt: Any2Float(itemData["profit_dedt"]), - GrossMargin: Any2Float(itemData["gross_margin"]), - OpIncome: Any2Float(itemData["op_income"]), - ValuechangeIncome: Any2Float(itemData["valuechange_income"]), - InterstIncome: Any2Float(itemData["interst_income"]), - Daa: Any2Float(itemData["daa"]), - Ebit: Any2Float(itemData["ebit"]), - Ebitda: Any2Float(itemData["ebitda"]), - Fcff: Any2Float(itemData["fcff"]), - Fcfe: Any2Float(itemData["fcfe"]), - RdExp: Any2Float(itemData["rd_exp"]), - FixedAssets: Any2Float(itemData["fixed_assets"]), - ProfitPrefinExp: Any2Float(itemData["profit_prefin_exp"]), - NonOpProfit: Any2Float(itemData["non_op_profit"]), - - // 资产负债表相关 - CurrentExint: Any2Float(itemData["current_exint"]), - NoncurrentExint: Any2Float(itemData["noncurrent_exint"]), - Interestdebt: Any2Float(itemData["interestdebt"]), - Netdebt: Any2Float(itemData["netdebt"]), - TangibleAsset: Any2Float(itemData["tangible_asset"]), - WorkingCapital: Any2Float(itemData["working_capital"]), - NetworkingCapital: Any2Float(itemData["networking_capital"]), - InvestCapital: Any2Float(itemData["invest_capital"]), - RetainedEarnings: Any2Float(itemData["retained_earnings"]), - - // 偿债能力指标 - CurrentRatio: Any2Float(itemData["current_ratio"]), - QuickRatio: Any2Float(itemData["quick_ratio"]), - CashRatio: Any2Float(itemData["cash_ratio"]), - DebtToAssets: Any2Float(itemData["debt_to_assets"]), - AssetsToEqt: Any2Float(itemData["assets_to_eqt"]), - DpAssetsToEqt: Any2Float(itemData["dp_assets_to_eqt"]), - DebtToEqt: Any2Float(itemData["debt_to_eqt"]), - EqtToDebt: Any2Float(itemData["eqt_to_debt"]), - OcfToShortdebt: Any2Float(itemData["ocf_to_shortdebt"]), - EbitToInterest: Any2Float(itemData["ebit_to_interest"]), - - // 运营能力指标 - InvturnDays: Any2Float(itemData["invturn_days"]), - ArturnDays: Any2Float(itemData["arturn_days"]), - InvTurn: Any2Float(itemData["inv_turn"]), - ArTurn: Any2Float(itemData["ar_turn"]), - CaTurn: Any2Float(itemData["ca_turn"]), - FaTurn: Any2Float(itemData["fa_turn"]), - AssetsTurn: Any2Float(itemData["assets_turn"]), - TurnDays: Any2Float(itemData["turn_days"]), - TotalFaTrun: Any2Float(itemData["total_fa_trun"]), - - // 盈利能力指标 - NetprofitMargin: Any2Float(itemData["netprofit_margin"]), - GrossprofitMargin: Any2Float(itemData["grossprofit_margin"]), - CogsOfSales: Any2Float(itemData["cogs_of_sales"]), - ExpenseOfSales: Any2Float(itemData["expense_of_sales"]), - Roe: Any2Float(itemData["roe"]), - RoeWaa: Any2Float(itemData["roe_waa"]), - RoeDt: Any2Float(itemData["roe_dt"]), - Roa: Any2Float(itemData["roa"]), - Npta: Any2Float(itemData["npta"]), - Roic: Any2Float(itemData["roic"]), - RoaDp: Any2Float(itemData["roa_dp"]), - - // 结构指标 - CaToAssets: Any2Float(itemData["ca_to_assets"]), - NcaToAssets: Any2Float(itemData["nca_to_assets"]), - TbassetsToTotalassets: Any2Float(itemData["tbassets_to_totalassets"]), - IntToTalcap: Any2Float(itemData["int_to_talcap"]), - EqtToTalcapital: Any2Float(itemData["eqt_to_talcapital"]), - CurrentdebtToDebt: Any2Float(itemData["currentdebt_to_debt"]), - LongdebToDebt: Any2Float(itemData["longdeb_to_debt"]), - TangibleassetToDebt: Any2Float(itemData["tangibleasset_to_debt"]), - - // 单季度指标 - QOpincome: Any2Float(itemData["q_opincome"]), - QInvestincome: Any2Float(itemData["q_investincome"]), - QDtprofit: Any2Float(itemData["q_dtprofit"]), - QEps: Any2Float(itemData["q_eps"]), - QNetprofitMargin: Any2Float(itemData["q_netprofit_margin"]), - QGscaleprofitMargin: Any2Float(itemData["q_gsprofit_margin"]), - QExpToSales: Any2Float(itemData["q_exp_to_sales"]), - QRoe: Any2Float(itemData["q_roe"]), - QDtRoe: Any2Float(itemData["q_dt_roe"]), - QNpta: Any2Float(itemData["q_npta"]), - - // 同比增长率 - BasicEpsYoy: Any2Float(itemData["basic_eps_yoy"]), - DtEpsYoy: Any2Float(itemData["dt_eps_yoy"]), - CfpsYoy: Any2Float(itemData["cfps_yoy"]), - OpYoy: Any2Float(itemData["op_yoy"]), - EbtYoy: Any2Float(itemData["ebt_yoy"]), - NetprofitYoy: Any2Float(itemData["netprofit_yoy"]), - DtNetprofitYoy: Any2Float(itemData["dt_netprofit_yoy"]), - OcfYoy: Any2Float(itemData["ocf_yoy"]), - RoeYoy: Any2Float(itemData["roe_yoy"]), - BpsYoy: Any2Float(itemData["bps_yoy"]), - AssetsYoy: Any2Float(itemData["assets_yoy"]), - EqtYoy: Any2Float(itemData["eqt_yoy"]), - TrYoy: Any2Float(itemData["tr_yoy"]), - OrYoy: Any2Float(itemData["or_yoy"]), - EquityYoy: Any2Float(itemData["equity_yoy"]), - - // 其他比率指标 - ProfitToGr: Any2Float(itemData["profit_to_gr"]), - SaleexpToGr: Any2Float(itemData["saleexp_to_gr"]), - AdminexpOfGr: Any2Float(itemData["adminexp_of_gr"]), - FinaexpOfGr: Any2Float(itemData["finaexp_of_gr"]), - ImpaiTtm: Any2Float(itemData["impai_ttm"]), - GcOfGr: Any2Float(itemData["gc_of_gr"]), - OpOfGr: Any2Float(itemData["op_of_gr"]), - EbitOfGr: Any2Float(itemData["ebit_of_gr"]), - OpincomeOfEbt: Any2Float(itemData["opincome_of_ebt"]), - InvestincomeOfEbt: Any2Float(itemData["investincome_of_ebt"]), - NOpProfitOfEbt: Any2Float(itemData["n_op_profit_of_ebt"]), - TaxToEbt: Any2Float(itemData["tax_to_ebt"]), - DtprofitToProfit: Any2Float(itemData["dtprofit_to_profit"]), - SalescashToOr: Any2Float(itemData["salescash_to_or"]), - OcfToOr: Any2Float(itemData["ocf_to_or"]), - OcfToOpincome: Any2Float(itemData["ocf_to_opincome"]), - CapitalizedToDa: Any2Float(itemData["capitalized_to_da"]), - OcfToDebt: Any2Float(itemData["ocf_to_debt"]), - OcfToInterestdebt: Any2Float(itemData["ocf_to_interestdebt"]), - OcfToNetdebt: Any2Float(itemData["ocf_to_netdebt"]), - LongdebtToWorkingcapital: Any2Float(itemData["longdebt_to_workingcapital"]), - EbitdaToDebt: Any2Float(itemData["ebitda_to_debt"]), - OpToEbt: Any2Float(itemData["op_to_ebt"]), - NopToEbt: Any2Float(itemData["nop_to_ebt"]), - OcfToProfit: Any2Float(itemData["ocf_to_profit"]), - CashToLiqdebt: Any2Float(itemData["cash_to_liqdebt"]), - CashToLiqdebtWithinterest: Any2Float(itemData["cash_to_liqdebt_withinterest"]), - OpToLiqdebt: Any2Float(itemData["op_to_liqdebt"]), - OpToDebt: Any2Float(itemData["op_to_debt"]), - ProfitToOp: Any2Float(itemData["profit_to_op"]), - - // 年度化指标 - RoeYearly: Any2Float(itemData["roe_yearly"]), - Roa2Yearly: Any2Float(itemData["roa2_yearly"]), - RoaYearly: Any2Float(itemData["roa_yearly"]), - RoicYearly: Any2Float(itemData["roic_yearly"]), - RoeAvg: Any2Float(itemData["roe_avg"]), - - // 单季度增长比率 - QGrYoy: Any2Float(itemData["q_gr_yoy"]), - QGrQoq: Any2Float(itemData["q_gr_qoq"]), - QSalesYoy: Any2Float(itemData["q_sales_yoy"]), - QSalesQoq: Any2Float(itemData["q_sales_qoq"]), - QOpYoy: Any2Float(itemData["q_op_yoy"]), - QOpQoq: Any2Float(itemData["q_op_qoq"]), - QProfitYoy: Any2Float(itemData["q_profit_yoy"]), - QProfitQoq: Any2Float(itemData["q_profit_qoq"]), - QNetprofitYoy: Any2Float(itemData["q_netprofit_yoy"]), - QNetprofitQoq: Any2Float(itemData["q_netprofit_qoq"]), - - // 单季度比率指标 - QProfitToGr: Any2Float(itemData["q_profit_to_gr"]), - QSaleexpToGr: Any2Float(itemData["q_saleexp_to_gr"]), - QAdminexpToGr: Any2Float(itemData["q_adminexp_to_gr"]), - QFinaexpToGr: Any2Float(itemData["q_finaexp_to_gr"]), - QImpairToGrTtm: Any2Float(itemData["q_impair_to_gr_ttm"]), - QGcToGr: Any2Float(itemData["q_gc_to_gr"]), - QOpToGr: Any2Float(itemData["q_op_to_gr"]), - QOpincomeToEbt: Any2Float(itemData["q_opincome_to_ebt"]), - QInvestincomeToEbt: Any2Float(itemData["q_investincome_to_ebt"]), - QDtprofitToProfit: Any2Float(itemData["q_dtprofit_to_profit"]), - QSalescashToOr: Any2Float(itemData["q_salescash_to_or"]), - QOcfToSales: Any2Float(itemData["q_ocf_to_sales"]), - QOcfToOr: Any2Float(itemData["q_ocf_to_or"]), - - // 其他 - UpdateFlag: itemData["update_flag"].(string), - }) + if ok, item := ReFinaIndicator(reply); ok { + exist := ExistFinaIndicator(code, period) + if !exist { + CreateFinaIndicator(code, period, item) + } else { + UpdateFinaIndicator(code, period, item) + } } - } - if len(records) > 0 { - impl.DBService.CreateInBatches(records, 100) + for _, item := range reply.Data.Items { + // 重构数据 + itemData := make(map[string]any) + for i := 0; i < len(item); i++ { + itemData[reply.Data.Fields[i]] = item[i] + } + + } } time.Sleep(200 * time.Microsecond) } } + +func CreateFinaIndicator(code, period string, itemData map[string]any) { + // 不存在则创建 + data := models.StockFinaIndicator{ + TsCode: code, + Period: utils.String2Int(period), + AnnDate: itemData["ann_date"].(string), + EndDate: itemData["end_date"].(string), + + // 每股指标 + Eps: Any2Float(itemData["eps"]), + DtEps: Any2Float(itemData["dt_eps"]), + TotalRevenuePs: Any2Float(itemData["total_revenue_ps"]), + RevenuePs: Any2Float(itemData["revenue_ps"]), + CapitalResePs: Any2Float(itemData["capital_rese_ps"]), + SurplusResePs: Any2Float(itemData["surplus_rese_ps"]), + UndistProfitPs: Any2Float(itemData["undist_profit_ps"]), + Diluted2Eps: Any2Float(itemData["diluted2_eps"]), + Bps: Any2Float(itemData["bps"]), + Ocfps: Any2Float(itemData["ocfps"]), + Retainedps: Any2Float(itemData["retainedps"]), + Cfps: Any2Float(itemData["cfps"]), + EbitPs: Any2Float(itemData["ebit_ps"]), + FcffPs: Any2Float(itemData["fcff_ps"]), + FcfePs: Any2Float(itemData["fcfe_ps"]), + + // 利润表相关 + ExtraItem: Any2Float(itemData["extra_item"]), + ProfitDedt: Any2Float(itemData["profit_dedt"]), + GrossMargin: Any2Float(itemData["gross_margin"]), + OpIncome: Any2Float(itemData["op_income"]), + ValuechangeIncome: Any2Float(itemData["valuechange_income"]), + InterstIncome: Any2Float(itemData["interst_income"]), + Daa: Any2Float(itemData["daa"]), + Ebit: Any2Float(itemData["ebit"]), + Ebitda: Any2Float(itemData["ebitda"]), + Fcff: Any2Float(itemData["fcff"]), + Fcfe: Any2Float(itemData["fcfe"]), + RdExp: Any2Float(itemData["rd_exp"]), + FixedAssets: Any2Float(itemData["fixed_assets"]), + ProfitPrefinExp: Any2Float(itemData["profit_prefin_exp"]), + NonOpProfit: Any2Float(itemData["non_op_profit"]), + + // 资产负债表相关 + CurrentExint: Any2Float(itemData["current_exint"]), + NoncurrentExint: Any2Float(itemData["noncurrent_exint"]), + Interestdebt: Any2Float(itemData["interestdebt"]), + Netdebt: Any2Float(itemData["netdebt"]), + TangibleAsset: Any2Float(itemData["tangible_asset"]), + WorkingCapital: Any2Float(itemData["working_capital"]), + NetworkingCapital: Any2Float(itemData["networking_capital"]), + InvestCapital: Any2Float(itemData["invest_capital"]), + RetainedEarnings: Any2Float(itemData["retained_earnings"]), + + // 偿债能力指标 + CurrentRatio: Any2Float(itemData["current_ratio"]), + QuickRatio: Any2Float(itemData["quick_ratio"]), + CashRatio: Any2Float(itemData["cash_ratio"]), + DebtToAssets: Any2Float(itemData["debt_to_assets"]), + AssetsToEqt: Any2Float(itemData["assets_to_eqt"]), + DpAssetsToEqt: Any2Float(itemData["dp_assets_to_eqt"]), + DebtToEqt: Any2Float(itemData["debt_to_eqt"]), + EqtToDebt: Any2Float(itemData["eqt_to_debt"]), + OcfToShortdebt: Any2Float(itemData["ocf_to_shortdebt"]), + EbitToInterest: Any2Float(itemData["ebit_to_interest"]), + + // 运营能力指标 + InvturnDays: Any2Float(itemData["invturn_days"]), + ArturnDays: Any2Float(itemData["arturn_days"]), + InvTurn: Any2Float(itemData["inv_turn"]), + ArTurn: Any2Float(itemData["ar_turn"]), + CaTurn: Any2Float(itemData["ca_turn"]), + FaTurn: Any2Float(itemData["fa_turn"]), + AssetsTurn: Any2Float(itemData["assets_turn"]), + TurnDays: Any2Float(itemData["turn_days"]), + TotalFaTrun: Any2Float(itemData["total_fa_trun"]), + + // 盈利能力指标 + NetprofitMargin: Any2Float(itemData["netprofit_margin"]), + GrossprofitMargin: Any2Float(itemData["grossprofit_margin"]), + CogsOfSales: Any2Float(itemData["cogs_of_sales"]), + ExpenseOfSales: Any2Float(itemData["expense_of_sales"]), + Roe: Any2Float(itemData["roe"]), + RoeWaa: Any2Float(itemData["roe_waa"]), + RoeDt: Any2Float(itemData["roe_dt"]), + Roa: Any2Float(itemData["roa"]), + Npta: Any2Float(itemData["npta"]), + Roic: Any2Float(itemData["roic"]), + RoaDp: Any2Float(itemData["roa_dp"]), + + // 结构指标 + CaToAssets: Any2Float(itemData["ca_to_assets"]), + NcaToAssets: Any2Float(itemData["nca_to_assets"]), + TbassetsToTotalassets: Any2Float(itemData["tbassets_to_totalassets"]), + IntToTalcap: Any2Float(itemData["int_to_talcap"]), + EqtToTalcapital: Any2Float(itemData["eqt_to_talcapital"]), + CurrentdebtToDebt: Any2Float(itemData["currentdebt_to_debt"]), + LongdebToDebt: Any2Float(itemData["longdeb_to_debt"]), + TangibleassetToDebt: Any2Float(itemData["tangibleasset_to_debt"]), + + // 单季度指标 + QOpincome: Any2Float(itemData["q_opincome"]), + QInvestincome: Any2Float(itemData["q_investincome"]), + QDtprofit: Any2Float(itemData["q_dtprofit"]), + QEps: Any2Float(itemData["q_eps"]), + QNetprofitMargin: Any2Float(itemData["q_netprofit_margin"]), + QGscaleprofitMargin: Any2Float(itemData["q_gsprofit_margin"]), + QExpToSales: Any2Float(itemData["q_exp_to_sales"]), + QRoe: Any2Float(itemData["q_roe"]), + QDtRoe: Any2Float(itemData["q_dt_roe"]), + QNpta: Any2Float(itemData["q_npta"]), + + // 同比增长率 + BasicEpsYoy: Any2Float(itemData["basic_eps_yoy"]), + DtEpsYoy: Any2Float(itemData["dt_eps_yoy"]), + CfpsYoy: Any2Float(itemData["cfps_yoy"]), + OpYoy: Any2Float(itemData["op_yoy"]), + EbtYoy: Any2Float(itemData["ebt_yoy"]), + NetprofitYoy: Any2Float(itemData["netprofit_yoy"]), + DtNetprofitYoy: Any2Float(itemData["dt_netprofit_yoy"]), + OcfYoy: Any2Float(itemData["ocf_yoy"]), + RoeYoy: Any2Float(itemData["roe_yoy"]), + BpsYoy: Any2Float(itemData["bps_yoy"]), + AssetsYoy: Any2Float(itemData["assets_yoy"]), + EqtYoy: Any2Float(itemData["eqt_yoy"]), + TrYoy: Any2Float(itemData["tr_yoy"]), + OrYoy: Any2Float(itemData["or_yoy"]), + EquityYoy: Any2Float(itemData["equity_yoy"]), + + // 其他比率指标 + ProfitToGr: Any2Float(itemData["profit_to_gr"]), + SaleexpToGr: Any2Float(itemData["saleexp_to_gr"]), + AdminexpOfGr: Any2Float(itemData["adminexp_of_gr"]), + FinaexpOfGr: Any2Float(itemData["finaexp_of_gr"]), + ImpaiTtm: Any2Float(itemData["impai_ttm"]), + GcOfGr: Any2Float(itemData["gc_of_gr"]), + OpOfGr: Any2Float(itemData["op_of_gr"]), + EbitOfGr: Any2Float(itemData["ebit_of_gr"]), + OpincomeOfEbt: Any2Float(itemData["opincome_of_ebt"]), + InvestincomeOfEbt: Any2Float(itemData["investincome_of_ebt"]), + NOpProfitOfEbt: Any2Float(itemData["n_op_profit_of_ebt"]), + TaxToEbt: Any2Float(itemData["tax_to_ebt"]), + DtprofitToProfit: Any2Float(itemData["dtprofit_to_profit"]), + SalescashToOr: Any2Float(itemData["salescash_to_or"]), + OcfToOr: Any2Float(itemData["ocf_to_or"]), + OcfToOpincome: Any2Float(itemData["ocf_to_opincome"]), + CapitalizedToDa: Any2Float(itemData["capitalized_to_da"]), + OcfToDebt: Any2Float(itemData["ocf_to_debt"]), + OcfToInterestdebt: Any2Float(itemData["ocf_to_interestdebt"]), + OcfToNetdebt: Any2Float(itemData["ocf_to_netdebt"]), + LongdebtToWorkingcapital: Any2Float(itemData["longdebt_to_workingcapital"]), + EbitdaToDebt: Any2Float(itemData["ebitda_to_debt"]), + OpToEbt: Any2Float(itemData["op_to_ebt"]), + NopToEbt: Any2Float(itemData["nop_to_ebt"]), + OcfToProfit: Any2Float(itemData["ocf_to_profit"]), + CashToLiqdebt: Any2Float(itemData["cash_to_liqdebt"]), + CashToLiqdebtWithinterest: Any2Float(itemData["cash_to_liqdebt_withinterest"]), + OpToLiqdebt: Any2Float(itemData["op_to_liqdebt"]), + OpToDebt: Any2Float(itemData["op_to_debt"]), + ProfitToOp: Any2Float(itemData["profit_to_op"]), + + // 年度化指标 + RoeYearly: Any2Float(itemData["roe_yearly"]), + Roa2Yearly: Any2Float(itemData["roa2_yearly"]), + RoaYearly: Any2Float(itemData["roa_yearly"]), + RoicYearly: Any2Float(itemData["roic_yearly"]), + RoeAvg: Any2Float(itemData["roe_avg"]), + + // 单季度增长比率 + QGrYoy: Any2Float(itemData["q_gr_yoy"]), + QGrQoq: Any2Float(itemData["q_gr_qoq"]), + QSalesYoy: Any2Float(itemData["q_sales_yoy"]), + QSalesQoq: Any2Float(itemData["q_sales_qoq"]), + QOpYoy: Any2Float(itemData["q_op_yoy"]), + QOpQoq: Any2Float(itemData["q_op_qoq"]), + QProfitYoy: Any2Float(itemData["q_profit_yoy"]), + QProfitQoq: Any2Float(itemData["q_profit_qoq"]), + QNetprofitYoy: Any2Float(itemData["q_netprofit_yoy"]), + QNetprofitQoq: Any2Float(itemData["q_netprofit_qoq"]), + + // 单季度比率指标 + QProfitToGr: Any2Float(itemData["q_profit_to_gr"]), + QSaleexpToGr: Any2Float(itemData["q_saleexp_to_gr"]), + QAdminexpToGr: Any2Float(itemData["q_adminexp_to_gr"]), + QFinaexpToGr: Any2Float(itemData["q_finaexp_to_gr"]), + QImpairToGrTtm: Any2Float(itemData["q_impair_to_gr_ttm"]), + QGcToGr: Any2Float(itemData["q_gc_to_gr"]), + QOpToGr: Any2Float(itemData["q_op_to_gr"]), + QOpincomeToEbt: Any2Float(itemData["q_opincome_to_ebt"]), + QInvestincomeToEbt: Any2Float(itemData["q_investincome_to_ebt"]), + QDtprofitToProfit: Any2Float(itemData["q_dtprofit_to_profit"]), + QSalescashToOr: Any2Float(itemData["q_salescash_to_or"]), + QOcfToSales: Any2Float(itemData["q_ocf_to_sales"]), + QOcfToOr: Any2Float(itemData["q_ocf_to_or"]), + + // 其他 + UpdateFlag: itemData["update_flag"].(string), + } + + impl.DBService.Create(&data) +} + +func UpdateFinaIndicator(code, period string, item map[string]any) { + var old models.StockFinaIndicator + err := impl.DBService.Model(&models.StockFinaIndicator{}).Where("ts_code=? and period=?", code, utils.String2Int(period)).First(&old).Error + if err != nil { + return + } + + upd := make(map[string]any) + + // Compare each field and only add to update if different + // Date fields + if old.AnnDate != item["ann_date"].(string) { + upd["ann_date"] = item["ann_date"].(string) + } + if old.EndDate != item["end_date"].(string) { + upd["end_date"] = item["end_date"].(string) + } + + // 每股指标 + if old.Eps != Any2Float(item["eps"]) { + upd["eps"] = Any2Float(item["eps"]) + } + if old.DtEps != Any2Float(item["dt_eps"]) { + upd["dt_eps"] = Any2Float(item["dt_eps"]) + } + if old.TotalRevenuePs != Any2Float(item["total_revenue_ps"]) { + upd["total_revenue_ps"] = Any2Float(item["total_revenue_ps"]) + } + if old.RevenuePs != Any2Float(item["revenue_ps"]) { + upd["revenue_ps"] = Any2Float(item["revenue_ps"]) + } + if old.CapitalResePs != Any2Float(item["capital_rese_ps"]) { + upd["capital_rese_ps"] = Any2Float(item["capital_rese_ps"]) + } + if old.SurplusResePs != Any2Float(item["surplus_rese_ps"]) { + upd["surplus_rese_ps"] = Any2Float(item["surplus_rese_ps"]) + } + if old.UndistProfitPs != Any2Float(item["undist_profit_ps"]) { + upd["undist_profit_ps"] = Any2Float(item["undist_profit_ps"]) + } + if old.Diluted2Eps != Any2Float(item["diluted2_eps"]) { + upd["diluted2_eps"] = Any2Float(item["diluted2_eps"]) + } + if old.Bps != Any2Float(item["bps"]) { + upd["bps"] = Any2Float(item["bps"]) + } + if old.Ocfps != Any2Float(item["ocfps"]) { + upd["ocfps"] = Any2Float(item["ocfps"]) + } + if old.Retainedps != Any2Float(item["retainedps"]) { + upd["retainedps"] = Any2Float(item["retainedps"]) + } + if old.Cfps != Any2Float(item["cfps"]) { + upd["cfps"] = Any2Float(item["cfps"]) + } + if old.EbitPs != Any2Float(item["ebit_ps"]) { + upd["ebit_ps"] = Any2Float(item["ebit_ps"]) + } + if old.FcffPs != Any2Float(item["fcff_ps"]) { + upd["fcff_ps"] = Any2Float(item["fcff_ps"]) + } + if old.FcfePs != Any2Float(item["fcfe_ps"]) { + upd["fcfe_ps"] = Any2Float(item["fcfe_ps"]) + } + + // 利润表相关 + if old.ExtraItem != Any2Float(item["extra_item"]) { + upd["extra_item"] = Any2Float(item["extra_item"]) + } + if old.ProfitDedt != Any2Float(item["profit_dedt"]) { + upd["profit_dedt"] = Any2Float(item["profit_dedt"]) + } + if old.GrossMargin != Any2Float(item["gross_margin"]) { + upd["gross_margin"] = Any2Float(item["gross_margin"]) + } + if old.OpIncome != Any2Float(item["op_income"]) { + upd["op_income"] = Any2Float(item["op_income"]) + } + if old.ValuechangeIncome != Any2Float(item["valuechange_income"]) { + upd["valuechange_income"] = Any2Float(item["valuechange_income"]) + } + if old.InterstIncome != Any2Float(item["interst_income"]) { + upd["interst_income"] = Any2Float(item["interst_income"]) + } + if old.Daa != Any2Float(item["daa"]) { + upd["daa"] = Any2Float(item["daa"]) + } + if old.Ebit != Any2Float(item["ebit"]) { + upd["ebit"] = Any2Float(item["ebit"]) + } + if old.Ebitda != Any2Float(item["ebitda"]) { + upd["ebitda"] = Any2Float(item["ebitda"]) + } + if old.Fcff != Any2Float(item["fcff"]) { + upd["fcff"] = Any2Float(item["fcff"]) + } + if old.Fcfe != Any2Float(item["fcfe"]) { + upd["fcfe"] = Any2Float(item["fcfe"]) + } + if old.RdExp != Any2Float(item["rd_exp"]) { + upd["rd_exp"] = Any2Float(item["rd_exp"]) + } + if old.FixedAssets != Any2Float(item["fixed_assets"]) { + upd["fixed_assets"] = Any2Float(item["fixed_assets"]) + } + if old.ProfitPrefinExp != Any2Float(item["profit_prefin_exp"]) { + upd["profit_prefin_exp"] = Any2Float(item["profit_prefin_exp"]) + } + if old.NonOpProfit != Any2Float(item["non_op_profit"]) { + upd["non_op_profit"] = Any2Float(item["non_op_profit"]) + } + + // 资产负债表相关 + if old.CurrentExint != Any2Float(item["current_exint"]) { + upd["current_exint"] = Any2Float(item["current_exint"]) + } + if old.NoncurrentExint != Any2Float(item["noncurrent_exint"]) { + upd["noncurrent_exint"] = Any2Float(item["noncurrent_exint"]) + } + if old.Interestdebt != Any2Float(item["interestdebt"]) { + upd["interestdebt"] = Any2Float(item["interestdebt"]) + } + if old.Netdebt != Any2Float(item["netdebt"]) { + upd["netdebt"] = Any2Float(item["netdebt"]) + } + if old.TangibleAsset != Any2Float(item["tangible_asset"]) { + upd["tangible_asset"] = Any2Float(item["tangible_asset"]) + } + if old.WorkingCapital != Any2Float(item["working_capital"]) { + upd["working_capital"] = Any2Float(item["working_capital"]) + } + if old.NetworkingCapital != Any2Float(item["networking_capital"]) { + upd["networking_capital"] = Any2Float(item["networking_capital"]) + } + if old.InvestCapital != Any2Float(item["invest_capital"]) { + upd["invest_capital"] = Any2Float(item["invest_capital"]) + } + if old.RetainedEarnings != Any2Float(item["retained_earnings"]) { + upd["retained_earnings"] = Any2Float(item["retained_earnings"]) + } + + // 偿债能力指标 + if old.CurrentRatio != Any2Float(item["current_ratio"]) { + upd["current_ratio"] = Any2Float(item["current_ratio"]) + } + if old.QuickRatio != Any2Float(item["quick_ratio"]) { + upd["quick_ratio"] = Any2Float(item["quick_ratio"]) + } + if old.CashRatio != Any2Float(item["cash_ratio"]) { + upd["cash_ratio"] = Any2Float(item["cash_ratio"]) + } + if old.DebtToAssets != Any2Float(item["debt_to_assets"]) { + upd["debt_to_assets"] = Any2Float(item["debt_to_assets"]) + } + if old.AssetsToEqt != Any2Float(item["assets_to_eqt"]) { + upd["assets_to_eqt"] = Any2Float(item["assets_to_eqt"]) + } + if old.DpAssetsToEqt != Any2Float(item["dp_assets_to_eqt"]) { + upd["dp_assets_to_eqt"] = Any2Float(item["dp_assets_to_eqt"]) + } + if old.DebtToEqt != Any2Float(item["debt_to_eqt"]) { + upd["debt_to_eqt"] = Any2Float(item["debt_to_eqt"]) + } + if old.EqtToDebt != Any2Float(item["eqt_to_debt"]) { + upd["eqt_to_debt"] = Any2Float(item["eqt_to_debt"]) + } + if old.OcfToShortdebt != Any2Float(item["ocf_to_shortdebt"]) { + upd["ocf_to_shortdebt"] = Any2Float(item["ocf_to_shortdebt"]) + } + if old.EbitToInterest != Any2Float(item["ebit_to_interest"]) { + upd["ebit_to_interest"] = Any2Float(item["ebit_to_interest"]) + } + + // 运营能力指标 + if old.InvturnDays != Any2Float(item["invturn_days"]) { + upd["invturn_days"] = Any2Float(item["invturn_days"]) + } + if old.ArturnDays != Any2Float(item["arturn_days"]) { + upd["arturn_days"] = Any2Float(item["arturn_days"]) + } + if old.InvTurn != Any2Float(item["inv_turn"]) { + upd["inv_turn"] = Any2Float(item["inv_turn"]) + } + if old.ArTurn != Any2Float(item["ar_turn"]) { + upd["ar_turn"] = Any2Float(item["ar_turn"]) + } + if old.CaTurn != Any2Float(item["ca_turn"]) { + upd["ca_turn"] = Any2Float(item["ca_turn"]) + } + if old.FaTurn != Any2Float(item["fa_turn"]) { + upd["fa_turn"] = Any2Float(item["fa_turn"]) + } + if old.AssetsTurn != Any2Float(item["assets_turn"]) { + upd["assets_turn"] = Any2Float(item["assets_turn"]) + } + if old.TurnDays != Any2Float(item["turn_days"]) { + upd["turn_days"] = Any2Float(item["turn_days"]) + } + if old.TotalFaTrun != Any2Float(item["total_fa_trun"]) { + upd["total_fa_trun"] = Any2Float(item["total_fa_trun"]) + } + + // 盈利能力指标 + if old.NetprofitMargin != Any2Float(item["netprofit_margin"]) { + upd["netprofit_margin"] = Any2Float(item["netprofit_margin"]) + } + if old.GrossprofitMargin != Any2Float(item["grossprofit_margin"]) { + upd["grossprofit_margin"] = Any2Float(item["grossprofit_margin"]) + } + if old.CogsOfSales != Any2Float(item["cogs_of_sales"]) { + upd["cogs_of_sales"] = Any2Float(item["cogs_of_sales"]) + } + if old.ExpenseOfSales != Any2Float(item["expense_of_sales"]) { + upd["expense_of_sales"] = Any2Float(item["expense_of_sales"]) + } + if old.Roe != Any2Float(item["roe"]) { + upd["roe"] = Any2Float(item["roe"]) + } + if old.RoeWaa != Any2Float(item["roe_waa"]) { + upd["roe_waa"] = Any2Float(item["roe_waa"]) + } + if old.RoeDt != Any2Float(item["roe_dt"]) { + upd["roe_dt"] = Any2Float(item["roe_dt"]) + } + if old.Roa != Any2Float(item["roa"]) { + upd["roa"] = Any2Float(item["roa"]) + } + if old.Npta != Any2Float(item["npta"]) { + upd["npta"] = Any2Float(item["npta"]) + } + if old.Roic != Any2Float(item["roic"]) { + upd["roic"] = Any2Float(item["roic"]) + } + if old.RoaDp != Any2Float(item["roa_dp"]) { + upd["roa_dp"] = Any2Float(item["roa_dp"]) + } + + // 结构指标 + if old.CaToAssets != Any2Float(item["ca_to_assets"]) { + upd["ca_to_assets"] = Any2Float(item["ca_to_assets"]) + } + if old.NcaToAssets != Any2Float(item["nca_to_assets"]) { + upd["nca_to_assets"] = Any2Float(item["nca_to_assets"]) + } + if old.TbassetsToTotalassets != Any2Float(item["tbassets_to_totalassets"]) { + upd["tbassets_to_totalassets"] = Any2Float(item["tbassets_to_totalassets"]) + } + if old.IntToTalcap != Any2Float(item["int_to_talcap"]) { + upd["int_to_talcap"] = Any2Float(item["int_to_talcap"]) + } + if old.EqtToTalcapital != Any2Float(item["eqt_to_talcapital"]) { + upd["eqt_to_talcapital"] = Any2Float(item["eqt_to_talcapital"]) + } + if old.CurrentdebtToDebt != Any2Float(item["currentdebt_to_debt"]) { + upd["currentdebt_to_debt"] = Any2Float(item["currentdebt_to_debt"]) + } + if old.LongdebToDebt != Any2Float(item["longdeb_to_debt"]) { + upd["longdeb_to_debt"] = Any2Float(item["longdeb_to_debt"]) + } + if old.TangibleassetToDebt != Any2Float(item["tangibleasset_to_debt"]) { + upd["tangibleasset_to_debt"] = Any2Float(item["tangibleasset_to_debt"]) + } + + // 单季度指标 + if old.QOpincome != Any2Float(item["q_opincome"]) { + upd["q_opincome"] = Any2Float(item["q_opincome"]) + } + if old.QInvestincome != Any2Float(item["q_investincome"]) { + upd["q_investincome"] = Any2Float(item["q_investincome"]) + } + if old.QDtprofit != Any2Float(item["q_dtprofit"]) { + upd["q_dtprofit"] = Any2Float(item["q_dtprofit"]) + } + if old.QEps != Any2Float(item["q_eps"]) { + upd["q_eps"] = Any2Float(item["q_eps"]) + } + if old.QNetprofitMargin != Any2Float(item["q_netprofit_margin"]) { + upd["q_netprofit_margin"] = Any2Float(item["q_netprofit_margin"]) + } + if old.QGscaleprofitMargin != Any2Float(item["q_gsprofit_margin"]) { + upd["q_gsprofit_margin"] = Any2Float(item["q_gsprofit_margin"]) + } + if old.QExpToSales != Any2Float(item["q_exp_to_sales"]) { + upd["q_exp_to_sales"] = Any2Float(item["q_exp_to_sales"]) + } + if old.QRoe != Any2Float(item["q_roe"]) { + upd["q_roe"] = Any2Float(item["q_roe"]) + } + if old.QDtRoe != Any2Float(item["q_dt_roe"]) { + upd["q_dt_roe"] = Any2Float(item["q_dt_roe"]) + } + if old.QNpta != Any2Float(item["q_npta"]) { + upd["q_npta"] = Any2Float(item["q_npta"]) + } + + // 同比增长率 + if old.BasicEpsYoy != Any2Float(item["basic_eps_yoy"]) { + upd["basic_eps_yoy"] = Any2Float(item["basic_eps_yoy"]) + } + if old.DtEpsYoy != Any2Float(item["dt_eps_yoy"]) { + upd["dt_eps_yoy"] = Any2Float(item["dt_eps_yoy"]) + } + if old.CfpsYoy != Any2Float(item["cfps_yoy"]) { + upd["cfps_yoy"] = Any2Float(item["cfps_yoy"]) + } + if old.OpYoy != Any2Float(item["op_yoy"]) { + upd["op_yoy"] = Any2Float(item["op_yoy"]) + } + if old.EbtYoy != Any2Float(item["ebt_yoy"]) { + upd["ebt_yoy"] = Any2Float(item["ebt_yoy"]) + } + if old.NetprofitYoy != Any2Float(item["netprofit_yoy"]) { + upd["netprofit_yoy"] = Any2Float(item["netprofit_yoy"]) + } + if old.DtNetprofitYoy != Any2Float(item["dt_netprofit_yoy"]) { + upd["dt_netprofit_yoy"] = Any2Float(item["dt_netprofit_yoy"]) + } + if old.OcfYoy != Any2Float(item["ocf_yoy"]) { + upd["ocf_yoy"] = Any2Float(item["ocf_yoy"]) + } + if old.RoeYoy != Any2Float(item["roe_yoy"]) { + upd["roe_yoy"] = Any2Float(item["roe_yoy"]) + } + if old.BpsYoy != Any2Float(item["bps_yoy"]) { + upd["bps_yoy"] = Any2Float(item["bps_yoy"]) + } + if old.AssetsYoy != Any2Float(item["assets_yoy"]) { + upd["assets_yoy"] = Any2Float(item["assets_yoy"]) + } + if old.EqtYoy != Any2Float(item["eqt_yoy"]) { + upd["eqt_yoy"] = Any2Float(item["eqt_yoy"]) + } + if old.TrYoy != Any2Float(item["tr_yoy"]) { + upd["tr_yoy"] = Any2Float(item["tr_yoy"]) + } + if old.OrYoy != Any2Float(item["or_yoy"]) { + upd["or_yoy"] = Any2Float(item["or_yoy"]) + } + if old.EquityYoy != Any2Float(item["equity_yoy"]) { + upd["equity_yoy"] = Any2Float(item["equity_yoy"]) + } + + // 其他比率指标 + if old.ProfitToGr != Any2Float(item["profit_to_gr"]) { + upd["profit_to_gr"] = Any2Float(item["profit_to_gr"]) + } + if old.SaleexpToGr != Any2Float(item["saleexp_to_gr"]) { + upd["saleexp_to_gr"] = Any2Float(item["saleexp_to_gr"]) + } + if old.AdminexpOfGr != Any2Float(item["adminexp_of_gr"]) { + upd["adminexp_of_gr"] = Any2Float(item["adminexp_of_gr"]) + } + if old.FinaexpOfGr != Any2Float(item["finaexp_of_gr"]) { + upd["finaexp_of_gr"] = Any2Float(item["finaexp_of_gr"]) + } + if old.ImpaiTtm != Any2Float(item["impai_ttm"]) { + upd["impai_ttm"] = Any2Float(item["impai_ttm"]) + } + if old.GcOfGr != Any2Float(item["gc_of_gr"]) { + upd["gc_of_gr"] = Any2Float(item["gc_of_gr"]) + } + if old.OpOfGr != Any2Float(item["op_of_gr"]) { + upd["op_of_gr"] = Any2Float(item["op_of_gr"]) + } + if old.EbitOfGr != Any2Float(item["ebit_of_gr"]) { + upd["ebit_of_gr"] = Any2Float(item["ebit_of_gr"]) + } + if old.OpincomeOfEbt != Any2Float(item["opincome_of_ebt"]) { + upd["opincome_of_ebt"] = Any2Float(item["opincome_of_ebt"]) + } + if old.InvestincomeOfEbt != Any2Float(item["investincome_of_ebt"]) { + upd["investincome_of_ebt"] = Any2Float(item["investincome_of_ebt"]) + } + if old.NOpProfitOfEbt != Any2Float(item["n_op_profit_of_ebt"]) { + upd["n_op_profit_of_ebt"] = Any2Float(item["n_op_profit_of_ebt"]) + } + if old.TaxToEbt != Any2Float(item["tax_to_ebt"]) { + upd["tax_to_ebt"] = Any2Float(item["tax_to_ebt"]) + } + if old.DtprofitToProfit != Any2Float(item["dtprofit_to_profit"]) { + upd["dtprofit_to_profit"] = Any2Float(item["dtprofit_to_profit"]) + } + if old.SalescashToOr != Any2Float(item["salescash_to_or"]) { + upd["salescash_to_or"] = Any2Float(item["salescash_to_or"]) + } + if old.OcfToOr != Any2Float(item["ocf_to_or"]) { + upd["ocf_to_or"] = Any2Float(item["ocf_to_or"]) + } + if old.OcfToOpincome != Any2Float(item["ocf_to_opincome"]) { + upd["ocf_to_opincome"] = Any2Float(item["ocf_to_opincome"]) + } + if old.CapitalizedToDa != Any2Float(item["capitalized_to_da"]) { + upd["capitalized_to_da"] = Any2Float(item["capitalized_to_da"]) + } + if old.OcfToDebt != Any2Float(item["ocf_to_debt"]) { + upd["ocf_to_debt"] = Any2Float(item["ocf_to_debt"]) + } + if old.OcfToInterestdebt != Any2Float(item["ocf_to_interestdebt"]) { + upd["ocf_to_interestdebt"] = Any2Float(item["ocf_to_interestdebt"]) + } + if old.OcfToNetdebt != Any2Float(item["ocf_to_netdebt"]) { + upd["ocf_to_netdebt"] = Any2Float(item["ocf_to_netdebt"]) + } + if old.LongdebtToWorkingcapital != Any2Float(item["longdebt_to_workingcapital"]) { + upd["longdebt_to_workingcapital"] = Any2Float(item["longdebt_to_workingcapital"]) + } + if old.EbitdaToDebt != Any2Float(item["ebitda_to_debt"]) { + upd["ebitda_to_debt"] = Any2Float(item["ebitda_to_debt"]) + } + if old.OpToEbt != Any2Float(item["op_to_ebt"]) { + upd["op_to_ebt"] = Any2Float(item["op_to_ebt"]) + } + if old.NopToEbt != Any2Float(item["nop_to_ebt"]) { + upd["nop_to_ebt"] = Any2Float(item["nop_to_ebt"]) + } + if old.OcfToProfit != Any2Float(item["ocf_to_profit"]) { + upd["ocf_to_profit"] = Any2Float(item["ocf_to_profit"]) + } + if old.CashToLiqdebt != Any2Float(item["cash_to_liqdebt"]) { + upd["cash_to_liqdebt"] = Any2Float(item["cash_to_liqdebt"]) + } + if old.CashToLiqdebtWithinterest != Any2Float(item["cash_to_liqdebt_withinterest"]) { + upd["cash_to_liqdebt_withinterest"] = Any2Float(item["cash_to_liqdebt_withinterest"]) + } + if old.OpToLiqdebt != Any2Float(item["op_to_liqdebt"]) { + upd["op_to_liqdebt"] = Any2Float(item["op_to_liqdebt"]) + } + if old.OpToDebt != Any2Float(item["op_to_debt"]) { + upd["op_to_debt"] = Any2Float(item["op_to_debt"]) + } + if old.ProfitToOp != Any2Float(item["profit_to_op"]) { + upd["profit_to_op"] = Any2Float(item["profit_to_op"]) + } + + // 年度化指标 + if old.RoeYearly != Any2Float(item["roe_yearly"]) { + upd["roe_yearly"] = Any2Float(item["roe_yearly"]) + } + if old.Roa2Yearly != Any2Float(item["roa2_yearly"]) { + upd["roa2_yearly"] = Any2Float(item["roa2_yearly"]) + } + if old.RoaYearly != Any2Float(item["roa_yearly"]) { + upd["roa_yearly"] = Any2Float(item["roa_yearly"]) + } + if old.RoicYearly != Any2Float(item["roic_yearly"]) { + upd["roic_yearly"] = Any2Float(item["roic_yearly"]) + } + if old.RoeAvg != Any2Float(item["roe_avg"]) { + upd["roe_avg"] = Any2Float(item["roe_avg"]) + } + + // 单季度增长比率 + if old.QGrYoy != Any2Float(item["q_gr_yoy"]) { + upd["q_gr_yoy"] = Any2Float(item["q_gr_yoy"]) + } + if old.QGrQoq != Any2Float(item["q_gr_qoq"]) { + upd["q_gr_qoq"] = Any2Float(item["q_gr_qoq"]) + } + if old.QSalesYoy != Any2Float(item["q_sales_yoy"]) { + upd["q_sales_yoy"] = Any2Float(item["q_sales_yoy"]) + } + if old.QSalesQoq != Any2Float(item["q_sales_qoq"]) { + upd["q_sales_qoq"] = Any2Float(item["q_sales_qoq"]) + } + if old.QOpYoy != Any2Float(item["q_op_yoy"]) { + upd["q_op_yoy"] = Any2Float(item["q_op_yoy"]) + } + if old.QOpQoq != Any2Float(item["q_op_qoq"]) { + upd["q_op_qoq"] = Any2Float(item["q_op_qoq"]) + } + if old.QProfitYoy != Any2Float(item["q_profit_yoy"]) { + upd["q_profit_yoy"] = Any2Float(item["q_profit_yoy"]) + } + if old.QProfitQoq != Any2Float(item["q_profit_qoq"]) { + upd["q_profit_qoq"] = Any2Float(item["q_profit_qoq"]) + } + if old.QNetprofitYoy != Any2Float(item["q_netprofit_yoy"]) { + upd["q_netprofit_yoy"] = Any2Float(item["q_netprofit_yoy"]) + } + if old.QNetprofitQoq != Any2Float(item["q_netprofit_qoq"]) { + upd["q_netprofit_qoq"] = Any2Float(item["q_netprofit_qoq"]) + } + + // 单季度比率指标 + if old.QProfitToGr != Any2Float(item["q_profit_to_gr"]) { + upd["q_profit_to_gr"] = Any2Float(item["q_profit_to_gr"]) + } + if old.QSaleexpToGr != Any2Float(item["q_saleexp_to_gr"]) { + upd["q_saleexp_to_gr"] = Any2Float(item["q_saleexp_to_gr"]) + } + if old.QAdminexpToGr != Any2Float(item["q_adminexp_to_gr"]) { + upd["q_adminexp_to_gr"] = Any2Float(item["q_adminexp_to_gr"]) + } + if old.QFinaexpToGr != Any2Float(item["q_finaexp_to_gr"]) { + upd["q_finaexp_to_gr"] = Any2Float(item["q_finaexp_to_gr"]) + } + if old.QImpairToGrTtm != Any2Float(item["q_impair_to_gr_ttm"]) { + upd["q_impair_to_gr_ttm"] = Any2Float(item["q_impair_to_gr_ttm"]) + } + if old.QGcToGr != Any2Float(item["q_gc_to_gr"]) { + upd["q_gc_to_gr"] = Any2Float(item["q_gc_to_gr"]) + } + if old.QOpToGr != Any2Float(item["q_op_to_gr"]) { + upd["q_op_to_gr"] = Any2Float(item["q_op_to_gr"]) + } + if old.QOpincomeToEbt != Any2Float(item["q_opincome_to_ebt"]) { + upd["q_opincome_to_ebt"] = Any2Float(item["q_opincome_to_ebt"]) + } + if old.QInvestincomeToEbt != Any2Float(item["q_investincome_to_ebt"]) { + upd["q_investincome_to_ebt"] = Any2Float(item["q_investincome_to_ebt"]) + } + if old.QDtprofitToProfit != Any2Float(item["q_dtprofit_to_profit"]) { + upd["q_dtprofit_to_profit"] = Any2Float(item["q_dtprofit_to_profit"]) + } + if old.QSalescashToOr != Any2Float(item["q_salescash_to_or"]) { + upd["q_salescash_to_or"] = Any2Float(item["q_salescash_to_or"]) + } + if old.QOcfToSales != Any2Float(item["q_ocf_to_sales"]) { + upd["q_ocf_to_sales"] = Any2Float(item["q_ocf_to_sales"]) + } + if old.QOcfToOr != Any2Float(item["q_ocf_to_or"]) { + upd["q_ocf_to_or"] = Any2Float(item["q_ocf_to_or"]) + } + + // 其他 + if old.UpdateFlag != item["update_flag"].(string) { + upd["update_flag"] = item["update_flag"].(string) + } + + // Only perform update if there are actual changes + if len(upd) > 0 { + impl.DBService.Model(&models.StockFinaIndicator{}).Where("ts_code=? and period=?", code, utils.String2Int(period)).Updates(upd) + } +} diff --git a/internal/models/stock_fina_indicator.go b/internal/models/stock_fina_indicator.go index 0472bc4..2bfa804 100644 --- a/internal/models/stock_fina_indicator.go +++ b/internal/models/stock_fina_indicator.go @@ -9,7 +9,8 @@ import ( type StockFinaIndicator struct { gorm.Model TsCode string `gorm:"type:varchar(20);not null;index:fi_ts_code;uniqueIndex:un_fi_code_date;comment:TS代码"` - AnnDate int `gorm:"index:idx_ann_date;uniqueIndex:un_fi_code_date;comment:公告日期"` + Period int `gorm:"index:idx_period;uniqueIndex:un_fi_code_date;comment:报告期数"` + AnnDate string `gorm:"index:idx_ann_date;comment:公告日期"` EndDate string `gorm:"index:idx_end_date;comment:报告期"` // 每股指标