import.blade.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. @extends('layouts.app')
  2. @section('title')问题件-导入@endsection
  3. @section('content')
  4. <div id="nav2">
  5. @component('order.issue.menu')@endcomponent
  6. </div>
  7. <div class="container-fluid" id="issue_import_div">
  8. <div class="card col-md-8 offset-md-2">
  9. <div class="card-body">
  10. <div class="form-group row text-center">
  11. <div class="col-12 text-danger">
  12. 注意:请保证表第一行有以下对应的字段名<br><span class="text-muted">(可不按顺序):</span><br>
  13. 原始运单号,问题类别,情况说明<br>
  14. <span class="text-muted" style="opacity:0.7"> 订单问题类别:('拦截', '快递异常', '信息更改', '联系不上', '其他', '错漏发', '仓库问题', '快递丢件', '破损', '撤销丢件', '二次加工', '全检问题', '系统问题', '延迟发货', '仓库丢件', )<br></span>
  15. </div>
  16. <div class="col-12 text-info ">
  17. 导入时间随文件大小可能达数十分钟以上,请耐心等候
  18. <hr>
  19. </div>
  20. </div>
  21. @can('订单管理-问题件-导入-文本导入')
  22. <div class="form-group row text-center">
  23. <div class="col-12 text-danger">
  24. 订单问题类别:同Excel文件导入所要求的订单问题类别一致<br/>
  25. 注意:文本导入的问题件只有全部符合条件的才能生成问题件,自定义订单号可不填<br/>
  26. <span class="text-muted" style="opacity:0.7">
  27. 如果在导入后出现部分数据导入失败,修改对应错误的数据继续导入即可
  28. </span>
  29. </div>
  30. </div>
  31. <div class="form-group row">
  32. <div class="col-8 offset-2">
  33. <button type="button" class="btn form-control btn-primary" @click="showPasteDataModal">文本导入</button>
  34. </div>
  35. </div>
  36. <hr/>
  37. @endcan
  38. @can('订单管理-问题件-导入-Excel导入')
  39. <form action="{{url('order/issue/batchImport')}}" method="post" enctype="multipart/form-data" class="form" target="_blank">
  40. @csrf
  41. <div class="form-group row">
  42. <label for="sku" class="col-2 col-form-label text-right">选择EXCEL</label>
  43. <div class="col-8">
  44. <div class="form-control">
  45. <input type="file" class="form-control-file @error('file') is-invalid @enderror"
  46. name="file" value="{{ old('file') }}" required>
  47. @error('file')
  48. <span class="invalid-feedback" role="alert">
  49. <strong>{{ $message }}</strong>
  50. </span>
  51. @enderror
  52. </div>
  53. </div>
  54. </div>
  55. <div class="form-group row">
  56. <div class="col-8 offset-2">
  57. <input type="submit" class="btn btn-success form-control" value="执行导入">
  58. </div>
  59. </div>
  60. </form>
  61. @endcan
  62. </div>
  63. </div>
  64. <div class="modal fade" id="pasteData" role="dialog" tabindex="-1" aria-labelledby="pasteDataTetlie" aria-hidden="true">
  65. <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  66. <div class="modal-content">
  67. <div class="modal-header">
  68. <div class="row modal-title font-weight-bold w-100 text-nowrap ml-1 noselect" id="pasteDataTitle">
  69. <span v-for="(row,i) in rows" draggable="true"
  70. @drop="drop($event,i)" @dragover="dragover($event)" @dragstart="dragstart($event,i)"
  71. class="col-3 border" style="cursor: move"
  72. :class="requiredRows.includes(row)?'text-danger':''">@{{ row }}</span>
  73. </div>
  74. </div>
  75. <div class="modal-body text-center">
  76. <div class="form-group text-left">
  77. <input type="text" class="form-control-sm" v-model="hiddenTag" placeholder="输入标识">
  78. </div>
  79. <button type="button" id="popover" class="btn btn-danger" v-if="popoverContent"
  80. data-container="body" data-toggle="popover" data-placement="bottom"
  81. :data-content="popoverContent" data-html="true">
  82. 部分数据导入失败
  83. </button>
  84. <textarea id="pasteDataText" class="w-100" style="height: 400px" v-model="pasteDataText"
  85. @keydown.tab="forbidTab($event)" @keyup.tab="replaceSpacing()"
  86. placeholder="内容可为EXCEL复制,也可手动输入使用“TAB”缩进符区分列,请注意表头顺序,可拖拽表头字段调整顺序,以该顺序为准"></textarea>
  87. </div>
  88. <div class="modal-footer">
  89. <button class="btn btn-primary" @click="importPasteData">开始导入</button>
  90. </div>
  91. </div>
  92. </div>
  93. </div>
  94. </div>
  95. @endsection
  96. @section('lastScript')
  97. <script>
  98. let listVue = new Vue({
  99. el:'#issue_import_div',
  100. data:{
  101. rows:['原始运单号','问题类别','情况说明','自定义订单号'],
  102. requiredRows:['原始运单号','问题类别','情况说明','自定义订单号'],
  103. popoverContent:'',
  104. pasteDataText: '',
  105. hiddenTag:null
  106. },
  107. mounted:function(){
  108. $('[data-toggle="popover"]').popover();
  109. },
  110. methods:{
  111. showPasteDataModal(){
  112. $('#popover').attr('hidden','hidden')
  113. $('#pasteData').modal('show')
  114. },
  115. drop(e,index){
  116. e.preventDefault();
  117. if (this.dom !== e.target.innerHTML){
  118. this.dom.innerHTML = e.target.innerHTML;
  119. let temp=JSON.parse(JSON.stringify(this.rows[index]));
  120. this.$set(this.rows,index,this.rows[e.dataTransfer.getData('text/html')]);
  121. this.$set(this.rows,Number(e.dataTransfer.getData('text/html')),temp);
  122. }
  123. },
  124. dragover(e){
  125. e.preventDefault();
  126. },
  127. dragstart(e,index){
  128. this.dom = e.target.innerHTML;
  129. e.dataTransfer.setData("text/html",index);
  130. },
  131. importPasteData(){
  132. if(!this.pasteDataText){
  133. tempTip.setDuration(2000)
  134. tempTip.show('导入文本不能为空')
  135. }
  136. let _this = this
  137. let data = {rows:this.rows,pasteDataText:this.pasteDataText,hiddenTag: this.hiddenTag}
  138. tempTip.setDuration(99999)
  139. tempTip.setIndex(1051)
  140. tempTip.waitingTip('正在执行中,请稍后')
  141. axios.post('{{url('apiLocal/order/issue/importPasteData')}}',data).then(function (response) {
  142. tempTip.cancelWaitingTip()
  143. if(response.data.success){
  144. $('#pasteData').modal('hide')
  145. tempTip.setDuration(2000)
  146. tempTip.showSuccess('导入完毕')
  147. }else{
  148. let content = '';
  149. for (const key in response.data.fail_info) {
  150. content+=key+':'+response.data.fail_info[key] + "</br>"
  151. }
  152. _this.popoverContent = content
  153. setTimeout(function () {
  154. $("#popover").removeAttr('hidden').popover('show')
  155. },1);
  156. }
  157. }).catch(function(error){
  158. tempTip.cancelWaitingTip()
  159. tempTip.setDuration(2000)
  160. tempTip.show('导入失败'+error)
  161. })
  162. },
  163. forbidTab(e){
  164. e.preventDefault();
  165. },
  166. replaceSpacing(){
  167. this.pasteDataText += "\t";
  168. },
  169. }
  170. });
  171. </script>
  172. @endsection