halfChestStorage.blade.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. @extends('layouts.app')
  2. @section('title')缓存架入库-半箱入库@endsection
  3. @section('content')
  4. <div class="container-fluid d-none" id="container">
  5. <div class="row">
  6. <div class="card offset-md-1 col-md-5 col-sm-12">
  7. <div class="card-body">
  8. <div class="form-group text-center mt-2" id="header_title">
  9. <span class="font-weight-bold h4">入库信息</span>
  10. <a class="small" href="#" @click="openModal()">溢出减量</a>
  11. </div>
  12. <div class="form-group row">
  13. <label for="track" class="col-sm-2 col-3 text-right">跟踪号:</label>
  14. <input type="text" class="form-control col-8" id="track" :class="errors.track ? 'is-invalid' : ''" @keydown.enter="enterVal($event)" v-model="info.track" @blur="check()">
  15. <span class="invalid-feedback offset-3" role="alert" v-if="errors.track">
  16. <strong>@{{ errors.track[0] }}</strong>
  17. </span>
  18. </div>
  19. <div class="form-group row">
  20. <label for="barCode" class="col-sm-2 col-3 text-right">条码:</label>
  21. <input type="text" class="form-control col-8" id="barCode" placeholder="扫描商品条码"
  22. :class="errors.barCode ? 'is-invalid' : ''" v-model="info.barCode" @blur="check()" @keydown.enter="enterVal($event)">
  23. <span class="invalid-feedback offset-3" role="alert" v-if="errors.barCode">
  24. <strong>@{{ errors.barCode[0] }}</strong>
  25. </span>
  26. </div>
  27. <div class="form-group row">
  28. <label for="amount" class="col-sm-2 col-3 text-right">数量:</label>
  29. <input type="number" class="form-control col-8" id="amount"
  30. @keydown.enter="enterVal($event)" :class="errors.amount ? 'is-invalid' : ''" @blur="check()" v-model="info.amount" :placeholder="info.maximum!==undefined ? '最大可上:'+info.maximum : ''" :max="info.maximum" step="1">
  31. <span class="invalid-feedback offset-3" role="alert" v-if="errors.amount">
  32. <strong>@{{ errors.amount[0] }}</strong>
  33. </span>
  34. </div>
  35. <div class="form-group row">
  36. <label for="call" class="col-sm-2 col-3 text-right">手动呼叫:</label>
  37. <input type="checkbox" style="top: 5px" class="switch" id="call" v-model="info.call">
  38. </div>
  39. <div class="input-group row mt-5">
  40. <button type="submit" id="submit" class="btn btn-success offset-3 col-6" @click="checkInfo()">提交</button>
  41. <button type="button" class="btn btn-sm btn-info col-2 text-white offset-1" @click="callRobot()">手动呼叫</button>
  42. </div>
  43. </div>
  44. </div>
  45. <div class="card col-md-5 col-sm-12">
  46. <div class="card-body">
  47. <div class="mt-1 text-center">
  48. <button class="btn btn-primary" @click="submitBox()">为选中格口手动补充料箱</button>
  49. <button class="btn btn-sm btn-info text-white" @click="reverse()">全选/反选</button>
  50. </div>
  51. <div class="mt-2 h-75">
  52. <div class="w-100 text-center mt-2" style="cursor: pointer" :style="{height:(100/ides.length)+'%'}" v-for="arr in ides">
  53. <div class="row" style="height: 33.3%" v-for="a in arr">
  54. <div class="col-4 border border-dark" v-for="ide in a" :class="[shelfOccupy[ide] ? 'bg-danger' : 'bg-success',selectedBox[ide] ? 'box-shadow-dark' : '']"
  55. @click="fillingBox(ide)">@{{ ide }}</div>
  56. </div>
  57. </div>
  58. </div>
  59. </div>
  60. </div>
  61. <div class="modal fade" tabindex="-1" role="dialog" id="modal">
  62. <div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
  63. <div class="modal-content">
  64. <div class="modal-header">
  65. <div class="font-weight-bold h4">溢出减量</div>
  66. <button type="button" class="close" data-dismiss="modal">&times;</button>
  67. </div>
  68. <div class="modal-body">
  69. <div class="form-group">
  70. <label for="location">料箱码</label>
  71. <input id="location" type="text" v-model="ov.ide" class="form-control" placeholder="料箱码">
  72. </div>
  73. <div class="form-group">
  74. <label for="ov_amount">溢出数量</label>
  75. <input id="ov_amount" type="number" v-model="ov.amount" min="1" step="1" class="form-control" placeholder="溢出数量">
  76. </div>
  77. </div>
  78. <div class="modal-footer">
  79. <button type="button" class="btn btn-success" @click="overflowRevision()">提交</button>
  80. </div>
  81. </div>
  82. </div>
  83. </div>
  84. @include("store.inStorage._setMaximum")
  85. @include("store.inStorage._lotModal")
  86. </div>
  87. </div>
  88. @stop
  89. @section('lastScript')
  90. <script type="text/javascript">
  91. new Vue({
  92. el:"#container",
  93. data:{
  94. permissionList:[ //允许聚焦许可列表
  95. "track","amount","location","ov_amount"
  96. ],
  97. info:{},
  98. mount:false,
  99. /*before:{},*/
  100. focus:"",
  101. errors:{},
  102. ov:{},//溢出减量数值
  103. element:[
  104. "track","barCode","amount","submit"
  105. ],
  106. isAndroid:false,
  107. shelfOccupy:{},
  108. selectedBox:{},
  109. ides:[
  110. [
  111. ["HAIB2-03-03","HAIB2-02-03","HAIB2-01-03"],
  112. ["HAIB2-03-02","HAIB2-02-02","HAIB2-01-02"],
  113. ["HAIB2-03-01","HAIB2-02-01","HAIB2-01-01"],
  114. ],
  115. [
  116. ["HAIB1-03-03","HAIB1-02-03","HAIB1-01-03"],
  117. ["HAIB1-03-02","HAIB1-02-02","HAIB1-01-02"],
  118. ["HAIB1-03-01","HAIB1-02-01","HAIB1-01-01"],
  119. ],
  120. ],
  121. models:null,
  122. oldInfo:{},
  123. lots:[],
  124. lotMap:{},
  125. },
  126. mounted(){
  127. if (navigator.userAgent.indexOf("Android")!==-1)this.isAndroid = true;
  128. @foreach($stations as $station)this.$set(this.shelfOccupy,"{{$station->code}}",!!{{$station->material_box_id}});@endforeach
  129. this.pageInit();
  130. $("#container").removeClass("d-none");
  131. },
  132. methods:{
  133. //页面初始化
  134. pageInit(){
  135. if (!this.isAndroid)return;
  136. let element = document.getElementById("navbarSupportedContent").parentElement;
  137. element.className = "row";
  138. element.children[0].className += " col-5";
  139. element.children[0].href = "#";
  140. element.innerHTML = element.children[0].outerHTML;
  141. let e1 = document.getElementById("menu");
  142. let e2 = document.getElementById("demand-div");
  143. if (e1)e1.remove();
  144. if (e2)e2.remove();
  145. },
  146. //提交溢出减量
  147. overflowRevision(){
  148. if (!this.ov.ide || !this.ov.amount){
  149. window.tempTip.show("信息不完整");
  150. return;
  151. }
  152. window.tempTip.postBasicRequest("{{url('store/inStorage/overflowRevision')}}",this.ov,()=>{
  153. $("#modal").modal('hide');
  154. this.ov = {};
  155. return "溢出减量成功!";
  156. });
  157. },
  158. //打开溢出减量模态框
  159. openModal(){
  160. $("#modal").modal("show");
  161. setTimeout(function () {
  162. document.getElementById("location").focus();
  163. },500);
  164. },
  165. checkInfo(){
  166. let error = {};
  167. if (!this.info.track)error.track = ["跟踪号必填"];
  168. if (!this.info.barCode)error.barCode = ["商品条码必填"];
  169. if (!this.info.amount && !this.info.maximum)error.amount = ["数量必填"];
  170. if (JSON.stringify(error)!=='{}'){this.errors = error;return;}
  171. if (!this.info.amount && this.info.maximum)this.info.amount = this.info.maximum;
  172. this._exeTask();
  173. },
  174. _exeTask(){
  175. window.tempTip.postBasicRequest("{{url('store/inStorage/acquireBox')}}",this.info,res=>{
  176. if (!res.status){
  177. this.info.commodityId = res.commodityId;
  178. this.showMaximumModal();
  179. return;
  180. }
  181. this.info = {track:this.info.track,call:this.info.call};
  182. this.errors = {};
  183. let element = document.getElementById("barCode");
  184. if (element)element.focus();
  185. return res.amount==0 ? "调取料箱成功!" : "空箱不足,剩余”"+res.amount+"“未上架";
  186. });
  187. },
  188. check(){
  189. if (!this.info.track || !this.info.barCode)return;
  190. if (!this.info.lotNum || this.info.track !== this.oldInfo.track || this.info.barCode !== this.oldInfo.barCode){
  191. window.tempTip.postBasicRequest("{{url('store/inStorage/checkTask')}}",this.info,res=>{
  192. this.oldInfo = {track:this.info.track,barCode:this.info.barCode};
  193. this.lotMap = res.lotMap;
  194. switch (res.count){
  195. case 0:
  196. window.tempTip.show("无此上架信息");
  197. break;
  198. case 1:
  199. this.info.lotNum = res.lots;
  200. this.info.maximum = res.lotMap[res.lots];
  201. return "最大可上数量为"+this.info.maximum;
  202. default:
  203. this.lots = res.lots;
  204. $("#lotModal").modal("show");
  205. }
  206. });
  207. }
  208. },
  209. //回车向下TAB
  210. enterVal(e){
  211. let index = this.element.indexOf(e.target.id)+1;
  212. let element = document.getElementById(this.element[index]);
  213. if (element)element.focus();
  214. e.preventDefault();
  215. return false;
  216. },
  217. //提交填充料箱
  218. submitBox(){
  219. window.tempTip.setDuration(3000);
  220. if (JSON.stringify(this.selectedBox)==='{}'){window.tempTip.show("未选中格口");return;}
  221. window.tempTip.confirm("确定选中格口已无料箱存在?",()=>{
  222. window.tempTip.setDuration(99999);
  223. window.tempTip.waitingTip("调取料箱中,请稍等");
  224. let boxes = [];
  225. for (let key in this.selectedBox)if (this.selectedBox[key]) boxes.push(key);
  226. window.tempTip.postBasicRequest("{{url('store/inStorage/resetCacheShelf')}}",{boxes:boxes},res=>{
  227. window.tempTip.cancelWaitingTip();
  228. window.tempTip.setDuration(3000);
  229. for (let i=0;i<res.boxes.length;i++){
  230. this.$set(this.shelfOccupy,res.boxes[i],true);
  231. this.$set(this.selectedBox,res.boxes[i],true);
  232. }
  233. if (res.data){
  234. window.tempTip.show(res.data);
  235. return;
  236. }
  237. return "手动补充成功";
  238. },true);
  239. })
  240. },
  241. reverse(){
  242. let ides = [];
  243. this.ides.forEach(arr=>{
  244. arr.forEach(a=>{
  245. a.forEach(ide=>{
  246. ides.push(ide);
  247. })
  248. })
  249. });
  250. ides.forEach((ideCode)=>{
  251. this.$set(this.selectedBox,ideCode,this.selectedBox[ideCode] ? !this.selectedBox[ideCode] : true);
  252. });
  253. },
  254. //选中填充料箱
  255. fillingBox(ideCode){
  256. this.$set(this.selectedBox,ideCode,this.selectedBox[ideCode] ? !this.selectedBox[ideCode] : true);
  257. },
  258. showMaximumModal(){
  259. if (this.models){
  260. $("#maximumModal").modal("show");
  261. return;
  262. }
  263. window.tempTip.postBasicRequest("{{url("store/inStorage/getModels")}}",{},res=>{
  264. this.models = res;
  265. $("#maximumModal").modal("show");
  266. })
  267. },
  268. settingModelMaximum(){
  269. let models = [];
  270. this.models.forEach(model=>{
  271. if (model.maximum)models.push(model);
  272. });
  273. if (models.length<1){
  274. window.tempTip.setDuration(3000);
  275. window.tempTip.setIndex(1099);
  276. window.tempTip.show("请至少设定一个上限型号");
  277. return;
  278. }
  279. window.tempTip.postBasicRequest("{{url('store/inStorage/setMaximum')}}",
  280. {models:models,commodityId:this.info.commodityId},()=>{
  281. $("#maximumModal").modal("hide");
  282. this._exeTask();
  283. },true);
  284. },
  285. selectedLot(index){
  286. this.info.lotNum = this.lots[index].lotnum;
  287. this.info.maximum = this.lotMap[this.lots[index].lotnum];
  288. $("#lotModal").modal("hide");
  289. },
  290. callRobot(){
  291. window.tempTip.postBasicRequest("{{url('store/inStorage/callRobot')}}",{},()=>{
  292. this.info = {call:this.info.call};
  293. let element = document.getElementById("track");
  294. if (element)element.focus();
  295. return '呼叫成功';
  296. });
  297. }
  298. },
  299. });
  300. </script>
  301. @stop