1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- 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;
- }
- }
- }
|