records.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2. var Controller = {
  3. index: function () {
  4. // 初始化表格参数配置
  5. Table.api.init({
  6. extend: {
  7. index_url: 'records/index' + location.search,
  8. add_url: 'records/add',
  9. edit_url: 'records/edit',
  10. del_url: 'records/del',
  11. multi_url: 'records/multi',
  12. import_url: 'records/import',
  13. table: 'records',
  14. }
  15. });
  16. var table = $("#table");
  17. // 初始化表格
  18. table.bootstrapTable({
  19. url: $.fn.bootstrapTable.defaults.extend.index_url,
  20. pk: 'id',
  21. sortName: 'id',
  22. fixedColumns: true,
  23. fixedRightNumber: 1,
  24. columns: [
  25. [
  26. {checkbox: true},
  27. {field: 'id', title: __('Id')},
  28. {field: 'rfid', title: '电子耳标号', operate: 'LIKE'},
  29. {field: 'number', title:'国标号', operate: 'LIKE'},
  30. {field: 'birthDate', title:"出生日期", operate: 'LIKE'},
  31. {field: 'category', title: "品类", operate: 'LIKE'},
  32. {field: 'gender', title:"性别", operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
  33. {field: 'dayage', title: "日龄", operate: 'LIKE'},
  34. // {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
  35. ]
  36. ]
  37. });
  38. // 使用全局事件委托,确保即使DOM动态变化也能触发
  39. $(document).ready(function() {
  40. console.log('绑定事件');
  41. // 直接绑定到body的点击事件,用于测试按钮点击是否有反应
  42. $(document).on('click', '.btn-file', function() {
  43. console.log('按钮被点击了');
  44. // 手动触发文件输入框
  45. var fileInput = $('#xlsxFile');
  46. if(fileInput.length) {
  47. console.log('文件输入框存在,触发点击');
  48. fileInput.click();
  49. } else {
  50. console.error('文件输入框不存在!');
  51. }
  52. });
  53. // 绑定文件选择事件
  54. $(document).on('change', '#xlsxFile', function() {
  55. console.log('文件选择事件触发!');
  56. var file = this.files[0];
  57. if (!file) {
  58. console.log('未选择文件');
  59. return;
  60. }
  61. console.log('已选择文件:', file.name, '大小:', file.size, '类型:', file.type);
  62. // 检查文件类型
  63. var ext = file.name.split('.').pop().toLowerCase();
  64. console.log('文件扩展名:', ext);
  65. if (ext !== 'xlsx' && ext !== 'xls') {
  66. layer.msg('请选择Excel文件(.xlsx或.xls)', {icon: 2});
  67. return;
  68. }
  69. var formData = new FormData();
  70. formData.append('file', file);
  71. // 检查formData内容
  72. for (var pair of formData.entries()) {
  73. console.log('FormData键值对:', pair[0], pair[1]);
  74. }
  75. console.log('准备发送AJAX请求');
  76. // 创建进度条弹窗
  77. var progressBar = layer.open({
  78. type: 1,
  79. title: '导入进度',
  80. area: ['400px', '200px'],
  81. content: '<div style="padding: 20px;"><div class="progress" style="margin-bottom: 10px;"><div id="importProgressBar" class="progress-bar progress-bar-success" role="progressbar" style="width: 0%;">0%</div></div><p id="importProgressText">准备导入...</p><p id="importProgressDetail"></p></div>',
  82. cancel: function() {
  83. // 阻止用户手动关闭弹窗,必须等待导入完成
  84. return false;
  85. }
  86. });
  87. $.ajax({
  88. url: 'records/getxlsxdata',
  89. type: 'post',
  90. data: formData,
  91. contentType: false,
  92. processData: false,
  93. // 添加超时设置
  94. timeout: 30000,
  95. // 添加全局错误处理
  96. xhr: function() {
  97. var xhr = new XMLHttpRequest();
  98. // 上传进度事件
  99. xhr.upload.addEventListener('progress', function(e) {
  100. if (e.lengthComputable) {
  101. var percentComplete = (e.loaded / e.total) * 100;
  102. console.log('文件上传进度: ' + percentComplete.toFixed(2) + '%');
  103. }
  104. }, false);
  105. return xhr;
  106. },
  107. success: function(res) {
  108. console.log('AJAX请求成功,返回数据:', res);
  109. // 更新进度条为100%
  110. $('#importProgressBar').css('width', '100%').text('100%');
  111. if (res.code === 1) {
  112. // 更新进度文本
  113. $('#importProgressText').text('导入完成');
  114. $('#importProgressDetail').text('总共' + res.data.total_rows + '条数据,成功导入' + res.data.inserted_count + '条');
  115. // 2秒后关闭进度条弹窗并显示成功消息
  116. setTimeout(function() {
  117. layer.close(progressBar);
  118. layer.msg(res.msg || '导入成功', {icon: 1});
  119. // 刷新表格数据
  120. $('.btn-refresh').trigger('click');
  121. }, 2000);
  122. } else {
  123. // 更新进度文本为失败信息
  124. $('#importProgressText').text('导入失败');
  125. $('#importProgressDetail').text(res.msg || '未知错误');
  126. // 2秒后关闭进度条弹窗并显示失败消息
  127. setTimeout(function() {
  128. layer.close(progressBar);
  129. layer.msg(res.msg || '导入失败', {icon: 2});
  130. }, 2000);
  131. }
  132. },
  133. error: function(xhr, status, error) {
  134. console.error('AJAX请求失败:', error, '状态:', status);
  135. console.error('XHR详情:', xhr);
  136. // 更新进度文本为错误信息
  137. $('#importProgressText').text('导入失败');
  138. $('#importProgressDetail').text('请求失败,请重试');
  139. // 2秒后关闭进度条弹窗并显示错误消息
  140. setTimeout(function() {
  141. layer.close(progressBar);
  142. layer.msg('请求失败,请重试', {icon: 2});
  143. }, 2000);
  144. },
  145. complete: function(xhr, status) {
  146. console.log('AJAX请求完成,状态:', status);
  147. }
  148. });
  149. });
  150. });
  151. // 为表格绑定事件
  152. Table.api.bindevent(table);
  153. },
  154. add: function () {
  155. Controller.api.bindevent();
  156. },
  157. edit: function () {
  158. Controller.api.bindevent();
  159. },
  160. api: {
  161. bindevent: function () {
  162. Form.api.bindevent($("form[role=form]"));
  163. }
  164. }
  165. };
  166. return Controller;
  167. });