task_portfolioPerformance.dos 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. module fundit::task_portfolioPerformance
  2. use fundit::dataPuller;
  3. use fundit::dataSaver;
  4. use fundit::navCalculator;
  5. /*
  6. * 多个组合计算全历史净值
  7. *
  8. * Example:calPortfolioNAV([143109, 145041]);
  9. */
  10. def calPortfolioNAV(portfolio_ids) {
  11. very_old_date = '1900-01-01';
  12. port_info = get_portfolio_list_by_fund_nav_updatetime(portfolio_ids, very_old_date, true);
  13. tb_ret = fundit::navCalculator::cal_portfolio_nav(port_info);
  14. }
  15. /*
  16. * [定时任务]批量计算组合净值
  17. *
  18. *
  19. * Example: calPortfolioPerformance(2024.10.28);
  20. */
  21. def calPortfolioPerformance(date) {
  22. rt = '';
  23. // 2.5 min
  24. tb_cal_ports = get_portfolio_list_by_fund_nav_updatetime(NULL, date, true);
  25. if(tb_cal_ports.isVoid() || tb_cal_ports.size() == 0) return;
  26. // 分批跑
  27. i = 0;
  28. batch_size = 1000;
  29. tb_portfolio_nav = fundit::dataSaver::create_entity_nav();
  30. all_portfolio_id = EXEC DISTINCT portfolio_id FROM tb_cal_ports;
  31. do {
  32. portfolio_info = SELECT * FROM tb_cal_ports
  33. WHERE portfolio_id IN all_portfolio_id[i : min(all_portfolio_id.size(), i+batch_size)];
  34. if(portfolio_info.isVoid() || portfolio_info.size() == 0) break;
  35. // 30 sec
  36. tb_ret = fundit::navCalculator::cal_portfolio_nav(portfolio_info);
  37. INSERT INTO tb_portfolio_nav SELECT portfolio_id$STRING, price_date, nav FROM tb_ret;
  38. i += batch_size;
  39. } while (i <= tb_cal_ports.size());
  40. if(! tb_portfolio_nav.isVoid() && tb_portfolio_nav.size() > 0) {
  41. // save data to MySQL (12 sec)
  42. try {
  43. tb_portfolio_nav.rename!('entity_id', 'portfolio_id');
  44. save_and_sync(tb_portfolio_nav, 'raw_db.pf_portfolio_nav', 'raw_db.pf_portfolio_nav');
  45. } catch(ex) {
  46. //TODO: Log errors
  47. rt = ex;
  48. }
  49. }
  50. }