record.blade.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <!DOCTYPE html>
  2. <html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <link rel="icon" href="{{asset('icon/faviconc.ico')}}" type="image/x-icon"/>
  7. <!-- CSRF Token -->
  8. <meta name="csrf-token" content="{{ csrf_token() }}">
  9. <title>快递记录</title>
  10. <!-- Styles -->
  11. <link href="{{ mix('css/app.css') }}" rel="stylesheet">
  12. <style>
  13. html{
  14. width: 100%;
  15. height: 100%;
  16. }
  17. body{
  18. width: 100%;
  19. height: 100%;
  20. }
  21. .bg-suc{
  22. background: RGB(240,249,235);
  23. }
  24. .bg-fail{
  25. background: RGB(255,240,240);
  26. }
  27. </style>
  28. </head>
  29. <body allowfullscreen="true">
  30. <div class="container-fluid w-100 h-100" id="container">
  31. <div id="toast-container" style="position: absolute;top: 0;width: 100%;z-index: 999"></div>
  32. <div class="row w-100 h-100">
  33. <div class="col-4">
  34. <div class="dropdown">
  35. <button type="button" class="btn col-5 p-0" id="dropdownMenu"
  36. data-toggle="dropdown">
  37. <h4 class="text-muted mt-1">@{{ name }}&nbsp;&nbsp;<i class="fa fa-exchange text-info"></i></h4>
  38. </button>
  39. <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu">
  40. <li role="presentation" v-for="warehouse in warehouses" v-if="warehouse.id!==selected">
  41. <a role="menuitem" tabindex="-1" style="cursor: pointer" class="ml-3"
  42. @click="selectedWarehouse(warehouse)">@{{ warehouse.name }}</a>
  43. </li>
  44. </ul>
  45. </div>
  46. <p class="text-center h1 pt-3 font-weight-bold">@{{sum}}</p>
  47. <p class="text-center text-secondary">本次单量</p>
  48. <div class="form-group mt-4">
  49. <label for="logisticNumber">快递单号</label>
  50. <input class="form-control" disabled id="logisticNumber" placeholder="快递单号"
  51. v-model="logisticNumber">
  52. </div>
  53. <div class="form-group">
  54. <label for="recordAt">记录时间</label>
  55. <input class="form-control" disabled id="recordAt" placeholder="记录时间"
  56. v-model="recordAt">
  57. </div>
  58. <button class="btn btn-info col-12 text-white" @click="fullScreen()" style="position:absolute;bottom: 20px;cursor: pointer">
  59. <span v-if="!full">全屏</span>
  60. <span v-else>退出全屏</span>
  61. </button>
  62. </div>
  63. <div class="col-8 p-0">
  64. <p class="bg-white h2 text-center p-2 text-secondary" style="height: 5vh">记录信息</p>
  65. <div class="w-100" style="height: 93vh;overflow: auto">
  66. <table class="table w-100 text-center">
  67. <thead>
  68. <tr>
  69. <th>快递单号</th>
  70. <th>快递公司</th>
  71. <th>记录时间</th>
  72. <th>上传状态</th>
  73. </tr>
  74. </thead>
  75. <tbody>
  76. <tr v-for="item in data" :class="item.status ? 'bg-suc text-success' : 'bg-fail text-danger'">
  77. <td>@{{ item.logisticNumber }}</td>
  78. <td>@{{ item.logistic }}</td>
  79. <td>@{{ item.recordAt }}</td>
  80. <td>
  81. <span v-if="item.status">OK</span>
  82. <span v-else>FAIL</span>
  83. </td>
  84. </tr>
  85. </tbody>
  86. </table>
  87. </div>
  88. </div>
  89. </div>
  90. </div>
  91. </body>
  92. <script src="{{ mix('js/app.js') }}"></script>
  93. <script type="text/javascript">
  94. new Vue({
  95. el:"#container",
  96. data:{
  97. sum:0,
  98. data:[
  99. ],
  100. warehouses:[@foreach($warehouses as $warehouse)@json($warehouse),@endforeach],
  101. logisticNumber:"",
  102. recordAt:"",
  103. maxLen:20,
  104. full:false,
  105. selected:"",
  106. name:"",
  107. },
  108. mounted() {
  109. this.registerEvent();
  110. let record = localStorage.getItem("record:warehouse");
  111. if (record){
  112. let recordObj = JSON.parse(record);
  113. this.selected = recordObj.id;
  114. this.name = recordObj.name;
  115. }else{
  116. if (this.warehouses.length>0)this.selectedWarehouse(this.warehouses[0]);
  117. }
  118. },
  119. methods:{
  120. selectedWarehouse(warehouse){
  121. this.selected = warehouse.id;
  122. this.name = warehouse.name;
  123. localStorage.setItem("record:warehouse", JSON.stringify(warehouse));
  124. },
  125. //全屏
  126. fullScreen() {
  127. if (this.full){
  128. this.exitFullscreen();
  129. return;
  130. }
  131. let element = document.documentElement;
  132. if (element.requestFullscreen) {
  133. element.requestFullscreen();
  134. } else if (element.msRequestFullscreen) {
  135. element.msRequestFullscreen();
  136. } else if (element.mozRequestFullScreen) {
  137. element.mozRequestFullScreen();
  138. } else if (element.webkitRequestFullscreen) {
  139. element.webkitRequestFullscreen();
  140. }
  141. this.full = true;
  142. },
  143. //退出全屏
  144. exitFullscreen() {
  145. if (document.exitFullscreen) {
  146. document.exitFullscreen();
  147. } else if (document.msExitFullscreen) {
  148. document.msExitFullscreen();
  149. } else if (document.mozCancelFullScreen) {
  150. document.mozCancelFullScreen();
  151. } else if (document.webkitExitFullscreen) {
  152. document.webkitExitFullscreen();
  153. }
  154. this.full = false;
  155. },
  156. registerEvent(){
  157. $(document).on('keypress', e=>{
  158. if (e.keyCode===13){
  159. if(this.logisticNumber==="")return;
  160. this.submitRecord(this.logisticNumber,this.recordAt);
  161. this.logisticNumber = "";
  162. this.recordAt = "";
  163. return;
  164. }
  165. if (this.logisticNumber.length===this.maxLen)return;
  166. if ((e.keyCode>=97 && e.keyCode<=122) || (e.keyCode>=65 && e.keyCode<=90)
  167. || (e.keyCode>=48 && e.keyCode<=57)){
  168. if (this.logisticNumber===""){
  169. let now = new Date();
  170. let yy = now.getFullYear();
  171. let mm = now.getMonth() + 1;
  172. let dd = now.getDate();
  173. let hh = now.getHours();
  174. let m = now.getMinutes();
  175. let ss = now.getSeconds();
  176. this.recordAt = yy+'-'+(mm<10 ? '0'+mm : mm)+'-'+(dd<10 ? '0'+dd : dd)+" "+(hh<10 ? '0'+hh : hh)+":"+(m<10 ? '0'+m : m)+":"+(ss<10 ? '0'+ss : ss);
  177. }
  178. this.logisticNumber += e.key;
  179. }
  180. });
  181. },
  182. submitRecord(logisticNumber,recordAt){
  183. window.axios.post('{{url('record')}}',{logisticNumber:logisticNumber,warehouse:this.selected}).then(body=>{
  184. let res = body.data;
  185. let status = true;
  186. if (!res.success){
  187. status = false;
  188. if (res.data==="unique"){
  189. this.buildToast(false,logisticNumber);
  190. return;
  191. }
  192. }
  193. this.buildToast(status,logisticNumber);
  194. this.data.unshift({
  195. logisticNumber:logisticNumber,logistic:status ? res.data.logistic : "未知",recordAt:status ? res.data.recordAt : recordAt,status:status
  196. });
  197. this.sum++;
  198. }).catch(err=>{
  199. this.buildToast(false,logisticNumber);
  200. this.data.unshift({
  201. logisticNumber:logisticNumber,logistic:"未知",recordAt:recordAt,status:false
  202. });
  203. this.sum++;
  204. });
  205. },
  206. buildToast(status,sign){
  207. let div = document.createElement("div");
  208. div.className = "d-flex justify-content-center align-items-center p-2";
  209. let toast = document.createElement("div");
  210. toast.className = "toast hide";
  211. toast.setAttribute("role","alert");
  212. toast.setAttribute("aria-live","assertive");
  213. toast.setAttribute("aria-atomic","true");
  214. toast.setAttribute("data-delay","2000");
  215. toast.id = sign;
  216. let info = document.createElement("div");
  217. info.style.width = "400px";
  218. let txt = document.createElement("div");
  219. txt.className = "ml-3";
  220. let i = document.createElement("i");
  221. if (status){
  222. info.style.background = "RGB(240,249,235)";
  223. info.className = "toast-body text-success";
  224. i.className = "fa fa-chevron-circle-down text-success";
  225. }else {
  226. info.style.background = "RGB(255,240,240)";
  227. info.className = "toast-body text-danger";
  228. i.className = "fa fa-times-circle text-danger";
  229. }
  230. txt.append(i);
  231. txt.append(document.createTextNode(" 退件记录"+(status ? '成功' : "失败")+"!"));
  232. info.append(txt);
  233. toast.append(info);
  234. div.append(toast);
  235. $("#toast-container").append(div);
  236. let jqEl = $("#"+sign);
  237. jqEl.toast("show");
  238. jqEl.on("hidden.bs.toast",function (){
  239. div.remove();
  240. });
  241. }
  242. },
  243. });
  244. </script>
  245. </html>