module fundit::task_portfolioPerformance use fundit::dataPuller; use fundit::dataSaver; use fundit::navCalculator; /* * 多个组合计算全历史净值 * * Example:calPortfolioNAV([143109, 145041]); */ def calPortfolioNAV(portfolio_ids) { very_old_date = '1900-01-01'; port_info = get_portfolio_list_by_fund_nav_updatetime(portfolio_ids, very_old_date, true); tb_ret = fundit::navCalculator::cal_portfolio_nav(port_info); } /* * [定时任务]批量计算组合净值 * * * Example: calPortfolioPerformance(2024.10.28); */ def calPortfolioPerformance(date) { rt = ''; // 2.5 min tb_cal_ports = get_portfolio_list_by_fund_nav_updatetime(NULL, date, true); if(tb_cal_ports.isVoid() || tb_cal_ports.size() == 0) return; // 分批跑 i = 0; batch_size = 1000; tb_portfolio_nav = fundit::dataSaver::create_entity_nav(); all_portfolio_id = EXEC DISTINCT portfolio_id FROM tb_cal_ports; do { portfolio_info = SELECT * FROM tb_cal_ports WHERE portfolio_id IN all_portfolio_id[i : min(all_portfolio_id.size(), i+batch_size)]; if(portfolio_info.isVoid() || portfolio_info.size() == 0) break; // 30 sec tb_ret = fundit::navCalculator::cal_portfolio_nav(portfolio_info); INSERT INTO tb_portfolio_nav SELECT portfolio_id$STRING, price_date, nav FROM tb_ret; i += batch_size; } while (i <= tb_cal_ports.size()); if(! tb_portfolio_nav.isVoid() && tb_portfolio_nav.size() > 0) { // save data to MySQL (12 sec) try { tb_portfolio_nav.rename!('entity_id', 'portfolio_id'); save_and_sync(tb_portfolio_nav, 'raw_db.pf_portfolio_nav', 'raw_db.pf_portfolio_nav'); } catch(ex) { //TODO: Log errors rt = ex; } } }