Files
stock/internal/logic/a/fina_indicator.go
yanweidong 44d1a93789 fix bug
2026-01-26 02:39:26 +08:00

842 lines
33 KiB
Go

package a
import (
"log"
"strings"
"time"
"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() {
for _, code := range GetStockCodes() {
var fCnt int64
impl.DBService.Model(&models.StockFinaIndicator{}).Where("ts_code=?", code).Count(&fCnt)
if fCnt >= 11 {
continue
}
for _, period := range PeriodArgs {
// 请求API
reply, err := SetFinaIndicator(code, period)
if err != nil {
log.Println("ERROR", "GetFinaIndicator", err)
continue
}
if ok, item := ReFinaIndicator(reply); ok {
exist := ExistFinaIndicator(code, period)
if !exist {
CreateFinaIndicator(code, period, item)
} else {
UpdateFinaIndicator(code, period, item)
}
}
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: utils.AnyToString(itemData["ann_date"]),
EndDate: utils.AnyToString(itemData["end_date"]),
// 每股指标
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 != utils.AnyToString(item["ann_date"]) {
upd["ann_date"] = utils.AnyToString(item["ann_date"])
}
if old.EndDate != utils.AnyToString(item["end_date"]) {
upd["end_date"] = utils.AnyToString(item["end_date"])
}
// 每股指标
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)
}
}