import.html 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. {% extends 'base.html' %}
  2. {% block title %}导入换月交易记录 - 期货数据管理系统{% endblock %}
  3. {% block content %}
  4. <div class="d-flex justify-content-between align-items-center mb-4">
  5. <h2>导入换月交易记录</h2>
  6. <a href="{{ url_for('trade.index') }}" class="btn btn-secondary">返回列表</a>
  7. </div>
  8. <div class="card">
  9. <div class="card-body">
  10. <div class="row mb-4">
  11. <div class="col-md-12">
  12. <p>请按照以下步骤操作:</p>
  13. <ol>
  14. <li>下载导入模板</li>
  15. <li>按照模板格式填写数据</li>
  16. <li>上传Excel文件</li>
  17. </ol>
  18. <div class="alert alert-info">
  19. <strong>提示:</strong> 必填字段包括"换月交易主ID"、"合约代码"、"名称"、"开仓时间"、"平仓时间"等。
  20. </div>
  21. </div>
  22. </div>
  23. <div class="row mb-4">
  24. <div class="col-md-6">
  25. <button id="download-template" class="btn btn-primary">
  26. <i class="fas fa-download"></i> 下载导入模板
  27. </button>
  28. </div>
  29. </div>
  30. <form id="import-form" enctype="multipart/form-data">
  31. <div class="row mb-4">
  32. <div class="col-md-6">
  33. <div class="form-group">
  34. <label for="file">选择Excel文件</label>
  35. <input type="file" class="form-control" id="file" name="file" accept=".xlsx" required>
  36. </div>
  37. </div>
  38. </div>
  39. <div class="form-group">
  40. <button type="submit" class="btn btn-success">
  41. <i class="fas fa-upload"></i> 导入数据
  42. </button>
  43. </div>
  44. </form>
  45. <div id="result" class="mt-4" style="display: none;">
  46. </div>
  47. </div>
  48. </div>
  49. <script>
  50. document.addEventListener('DOMContentLoaded', function() {
  51. const form = document.getElementById('import-form');
  52. const resultDiv = document.getElementById('result');
  53. const downloadBtn = document.getElementById('download-template');
  54. // 处理下载模板按钮点击
  55. downloadBtn.addEventListener('click', function(e) {
  56. // 禁用按钮防止重复点击
  57. downloadBtn.disabled = true;
  58. // 创建一个隐藏的iframe来处理下载
  59. const iframe = document.createElement('iframe');
  60. iframe.style.display = 'none';
  61. iframe.src = "{{ url_for('trade.get_template') }}";
  62. document.body.appendChild(iframe);
  63. // 3秒后重新启用按钮
  64. setTimeout(() => {
  65. downloadBtn.disabled = false;
  66. document.body.removeChild(iframe);
  67. }, 3000);
  68. });
  69. form.addEventListener('submit', function(e) {
  70. e.preventDefault();
  71. const formData = new FormData(form);
  72. // 显示加载状态
  73. resultDiv.innerHTML = '<div class="alert alert-info">正在导入数据,请稍候...</div>';
  74. resultDiv.style.display = 'block';
  75. fetch('/api/trade/import', {
  76. method: 'POST',
  77. body: formData
  78. })
  79. .then(response => response.json())
  80. .then(data => {
  81. if (data.code === 0) {
  82. // 成功导入
  83. let html = `<div class="alert alert-success">${data.msg}</div>`;
  84. if (data.data.error_count > 0) {
  85. html += '<div class="alert alert-warning"><strong>导入过程中出现以下错误:</strong><ul>';
  86. data.data.error_messages.forEach(msg => {
  87. html += `<li>${msg}</li>`;
  88. });
  89. html += '</ul></div>';
  90. }
  91. resultDiv.innerHTML = html;
  92. } else {
  93. // 导入失败
  94. resultDiv.innerHTML = `<div class="alert alert-danger">${data.msg}</div>`;
  95. }
  96. })
  97. .catch(error => {
  98. console.error('Error:', error);
  99. resultDiv.innerHTML = '<div class="alert alert-danger">导入失败,请查看控制台了解详情</div>';
  100. });
  101. });
  102. });
  103. </script>
  104. {% endblock %}