index.blade.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. @extends('layouts.app')
  2. @section('title','出库复核')
  3. @section('head')
  4. <style>
  5. /*查询容器*/
  6. .select-wrapper {
  7. margin: 30px 20px;
  8. width: 100%;
  9. height: 50px;
  10. font-size: 32px;
  11. line-height: 50px;
  12. }
  13. .select-wrapper > div {
  14. float: left;
  15. margin-left: 30px;
  16. }
  17. table {
  18. margin: 10px;
  19. width: 100%;
  20. border-collapse: collapse;
  21. border-spacing: 0;
  22. table-layout: auto;
  23. vertical-align: text-top;
  24. border: rgb(245, 245, 245) solid 1px;
  25. }
  26. /*表头*/
  27. table .header {
  28. background-color: rgb(250, 250, 250);
  29. font-weight: bold;
  30. font-size: 16px;
  31. position: -webkit-sticky;
  32. position: sticky;
  33. top: 10px;
  34. }
  35. /*table .body .action .more-action {*/
  36. /*}*/
  37. table .body .action .more-action:focus + .more-action-list {
  38. display: block !important;
  39. /*background-color: red;*/
  40. }
  41. table .body .action .more-action + .more-action-list {
  42. display: none;
  43. position: absolute;
  44. margin-left: 50px;
  45. }
  46. table .body .action .more-action-list .more-action-item {
  47. display: block;
  48. }
  49. table tr {
  50. border-bottom: rgb(239, 239, 239) solid 1px;
  51. }
  52. .info-wrapper {
  53. min-width: 768px;
  54. overflow: hidden;
  55. }
  56. .commodity-all-wrapper {
  57. max-height: 300px;
  58. margin-bottom: 10px;
  59. overflow: scroll;
  60. }
  61. .commodity-all-wrapper::-webkit-scrollbar {
  62. width: 0;
  63. }
  64. .reviewed-commodity-wrapper {
  65. max-height: 300px;
  66. margin-bottom: 10px;
  67. }
  68. .reviewed-commodity-wrapper .commodity-list-wrapper {
  69. float: left;
  70. width: 70%;
  71. height: 380px;
  72. }
  73. /*新箱号*/
  74. .reviewed-commodity-wrapper .commodity-list-wrapper .new-box-wrapper {
  75. height: 80px;
  76. }
  77. .new-box-wrapper label {
  78. line-height: 80px;
  79. margin-left: 50px;
  80. font-size: 30px;
  81. font-weight: bold;
  82. }
  83. .new-box-wrapper input {
  84. font-size: 30px;
  85. }
  86. .new-box-wrapper button {
  87. font-size: 25px;
  88. margin-left: 20px;
  89. margin-bottom: 12px;
  90. }
  91. .reviewed-commodity-wrapper .commodity-list-wrapper .commodity-list {
  92. overflow: scroll;
  93. height: 300px;
  94. }
  95. .reviewed-commodity-wrapper .commodity-list-wrapper .commodity-list::-webkit-scrollbar {
  96. width: 0;
  97. }
  98. .reviewed-commodity-wrapper .commodity-info {
  99. float: left;
  100. width: 30%;
  101. }
  102. .commodity-info .info-item {
  103. font-size: 18px;
  104. width: 100%;
  105. display: block;
  106. margin: 5px 0;
  107. }
  108. .commodity-info .info-item label {
  109. display: inline-block;
  110. width: 100px;
  111. text-align: right;
  112. }
  113. .commodity-info .info-item input {
  114. vertical-align: top;
  115. }
  116. .review-status-wrapper {
  117. height: 75px;
  118. margin-bottom: 10px;
  119. }
  120. .review-status-wrapper .review-status-item {
  121. }
  122. .review-status-wrapper .review-status-item .description {
  123. font-size: 16px;
  124. }
  125. .review-status-wrapper .review-status-item .commodity-total-number,
  126. .review-status-wrapper .review-status-item .commodity-packed-number,
  127. .review-status-wrapper .review-status-item .commodity-unpacked-number,
  128. .review-status-wrapper .review-status-item .commodity-scan-number {
  129. font-size: 30px;
  130. font-weight: bold;
  131. display: inline-block;
  132. width: 100px;
  133. height: 35px;
  134. line-height: 35px;
  135. text-align: center;
  136. margin-top: 20px;
  137. margin-left: 20px;
  138. }
  139. .review-status-wrapper .review-status-item .commodity-total-number {
  140. background-color: rgb(235, 199, 13);
  141. }
  142. .review-status-wrapper .review-status-item .commodity-packed-number {
  143. background-color: rgb(118, 191, 226);
  144. }
  145. .review-status-wrapper .review-status-item .commodity-unpacked-number {
  146. background-color: rgb(237, 9, 9);
  147. }
  148. .review-status-wrapper .review-status-item .commodity-scan-number {
  149. background-color: rgb(25, 230, 48);
  150. }
  151. .button-list {
  152. height: 75px;
  153. margin-bottom: 10px;
  154. }
  155. .button-list button {
  156. float: left;
  157. margin: 3px 25px;
  158. width: 100px;
  159. }
  160. </style>
  161. @stop
  162. @section('content')
  163. @include('shared._messages')
  164. @include('shared._error')
  165. <div id="list" class="d-none">
  166. <div class="container-fluid">
  167. <div class="info-wrapper">
  168. <div class="select-wrapper">
  169. <div class="input-wrapper">
  170. <label for="orderno">订单号:</label>
  171. <input autofocus @keydown.enter="apiGetOrderDetail()" type="text" id="orderno"
  172. v-model="selectParameters.orderno">
  173. </div>
  174. <div class="input-wrapper">
  175. <label for="waveno">波次号:</label>
  176. <input @keydown.enter="apiGetOrderDetail()" type="text" id="waveno"
  177. v-model="selectParameters.waveno">
  178. </div>
  179. <div class="input-wrapper">
  180. <label for="expressno">快递单号:</label>
  181. <input @keydown.enter="apiGetOrderDetail()" type="text" id="expressno"
  182. v-model="selectParameters.expressno">
  183. </div>
  184. <div class="btn-wrapper">
  185. <button @click="apiGetOrderDetail()" type="button" class="btn btn-primary btn-lg"
  186. id="btn-search">查询
  187. </button>
  188. <button @click="clearSelectParameters()" type="button" class="btn btn-primary btn-lg">清除
  189. </button>
  190. </div>
  191. </div>
  192. <div class="commodity-all-wrapper">
  193. <table class="table table-bordered table-hover">
  194. <tr class="header">
  195. <td>行号</td>
  196. <td>产品代码</td>
  197. <td>中文描述</td>
  198. <td>状态</td>
  199. <td>装箱</td>
  200. <td>分配数</td>
  201. <td>复核数</td>
  202. <td>未复核数</td>
  203. <td>质量状态</td>
  204. <td>备注</td>
  205. <td>拣货库位</td>
  206. <td>英文描述</td>
  207. <td>产品条码</td>
  208. <td>操作</td>
  209. </tr>
  210. <tr v-for="(v,k) of orderDetails" @click="clickCurrentDetail(v)">
  211. <td>@{{ k+1 }}</td> {{--行号--}}
  212. <td>@{{ v.sku }}</td> {{--产品代码--}}
  213. <td>@{{ v.skudescrc }}</td> {{--中文描述--}}
  214. <td>@{{ v.status_name }}</td> {{--状态--}}
  215. <td>@{{ v.packflag }}</td> {{--装箱--}}
  216. <td>@{{ v.qty }}</td> {{--分配数--}}
  217. <td>@{{ v.packedqty }}</td> {{--复核数--}}
  218. <td>@{{ v.qty - v.packedqty }}</td> {{--未复核数--}}
  219. <td>@{{ v.lotatt08 }}</td> {{--质量状态--}}
  220. <td>-</td> {{--备注--}}
  221. <td>@{{ v.location }}</td> {{--拣货库位--}}
  222. <td>@{{ v.sku }}</td> {{--英文描述--}}
  223. <td>@{{ v.alternate_sku1 }}</td> {{--产品条码--}}
  224. <td>操作1 更多</td> {{--操作 --}}
  225. </tr>
  226. </table>
  227. </div>
  228. <div class="reviewed-commodity-wrapper">
  229. <div class="commodity-list-wrapper">
  230. <!--新箱号-->
  231. <div class="new-box-wrapper">
  232. <label for="new-box-number">新箱号: </label>
  233. <input type="text" class="new-box-input" id="new-box-number">
  234. <button class="btn btn-info">清除</button>
  235. </div>
  236. <div class="commodity-list">
  237. <table>
  238. <tr class="header">
  239. <td>产品代码</td>
  240. <td>中文描述</td>
  241. <td>英文描述</td>
  242. <td>数量</td>
  243. <td>操作</td>
  244. </tr>
  245. <tr class="body" v-for="(v,k) of reviewedSkus">
  246. <td>@{{ v.sku }}</td>
  247. <td>@{{ v.skudescrc }}</td>
  248. <td>@{{ v.sku }}</td>
  249. <td>@{{ v.inputQty }}</td>
  250. <td class="action">
  251. <a href="javascript:;">操作1</a>
  252. </td>
  253. </tr>
  254. </table>
  255. </div>
  256. </div>
  257. <div class="commodity-info">
  258. <div class="info-item">
  259. <label for="commodity-code">产品编码: </label>
  260. <input type="text" id="commodity-code" v-model="currentDetail.alternate_sku1">
  261. </div>
  262. <div class="info-item">
  263. <label for="amount">数量: </label>
  264. <input @keydown.enter="reviewSku()" type="number" id="amount" v-model="currentDetail.qty">
  265. </div>
  266. <div class="info-item">
  267. <label for="unit">单位: </label>
  268. <input disabled="true" type="text" id="unit" v-model="currentDetail.uom">
  269. </div>
  270. </div>
  271. </div>
  272. <div class="review-status-wrapper row col-8">
  273. <div class="review-status-item col">
  274. <span class="description">产品总数</span>
  275. <span class="commodity-total-number">@{{ reviewStatus.qty }}</span>
  276. </div>
  277. <div class="review-status-item col">
  278. <span class="description">已装箱数</span>
  279. <span class="commodity-packed-number">@{{ reviewStatus.packedqty }}</span>
  280. </div>
  281. <div class="review-status-item col">
  282. <span class="description">未装箱数</span>
  283. <span class="commodity-unpacked-number">@{{ reviewStatus.unpackedqty }}</span>
  284. </div>
  285. <div class="review-status-item col">
  286. <span class="description">扫描数量</span>
  287. <span class="commodity-scan-number">@{{ reviewStatus.scanedqty }}</span>
  288. </div>
  289. </div>
  290. <div class="button-list">
  291. <button class="btn btn-info">装箱完成</button>
  292. <button class="btn btn-info">打印装箱单</button>
  293. <button class="btn btn-info">装箱标签</button>
  294. <button class="btn btn-info">确定</button>
  295. </div>
  296. </div>
  297. </div>
  298. </div>
  299. @endsection
  300. @section('lastScript')
  301. <script>
  302. let vue = new Vue({
  303. el: "#list",
  304. data: {
  305. selectParameters: {
  306. orderno: '',
  307. waveno: '',
  308. expressno: ''
  309. },
  310. orderDetails: [],
  311. currentDetail: {
  312. alternate_sku1: null,
  313. qty: 1,
  314. uom: null,
  315. },
  316. reviewStatus: {
  317. qty: 0,
  318. packedqty: 0,
  319. unpackedqty: 0,
  320. scanedqty: 0,
  321. },
  322. reviewedSkus: []
  323. },
  324. created() {
  325. },
  326. mounted() {
  327. $('#list').removeClass('d-none');
  328. },
  329. methods: {
  330. apiGetOrderDetail() {
  331. //查询条件不能为空
  332. let preg = '[a-zA-z0-9]+';//包含任意字母,数字
  333. if (
  334. (!this.selectParameters.orderno.match(preg)) &&
  335. (!this.selectParameters.waveno.match(preg)) &&
  336. (!this.selectParameters.expressno.match(preg))
  337. ) {
  338. tempTip.setDuration(3000);
  339. tempTip.show("查询条件不能为空");
  340. return;
  341. }
  342. //拼接查询条件
  343. let url = '{{ url('apiLocal/storeOut/storeOutReview/apiGetOrderDetail/?') }}';
  344. if (this.selectParameters.orderno.match(preg)) {
  345. url += ("orderno=" + this.selectParameters.orderno.trim());
  346. } else if (this.selectParameters.waveno.match(preg)) {
  347. url += ("waveno=" + this.selectParameters.waveno.trim());
  348. } else if (this.selectParameters.expressno.match(preg)) {
  349. url += ("expressno=" + this.selectParameters.expressno.trim());
  350. }
  351. document.getElementById('btn-search').disabled = true;
  352. tempTip.setDuration(2000);
  353. tempTip.showSuccess('查询中请稍后!');
  354. axios.get(url).then(res => {
  355. if (res.data.success) {
  356. tempTip.setDuration(2000);
  357. tempTip.showSuccess('成功!');
  358. /*orderDetails 赋值*/
  359. this.orderDetails = res.data.data;
  360. /*reviewStatus 赋值*/
  361. this.reviewStatus.qty = this.orderDetails.reduce((sum, item) => sum + Number(item.qty), 0);
  362. this.reviewStatus.packedqty = this.orderDetails.reduce((sum, item) => sum + Number(item.packedqty), 0);
  363. this.reviewStatus.packedqty = this.reviewStatus.qty - this.reviewStatus.packedqty;
  364. /*产品编码自动获取焦点*/
  365. document.getElementById('commodity-code').focus();
  366. }
  367. document.getElementById('btn-search').disabled = false;
  368. }).catch(err => {
  369. document.getElementById('btn-search').disabled = false;
  370. tempTip.setDuration(2000);
  371. tempTip.show('系统异常' + err);
  372. });
  373. },
  374. /*清空查询输入*/
  375. clearSelectParameters() {
  376. this.selectParameters.orderno = '';
  377. this.selectParameters.waveno = '';
  378. this.selectParameters.expressno = '';
  379. },
  380. /*点击选中商品*/
  381. clickCurrentDetail(currentDetail) {
  382. this.currentDetail.alternate_sku1 = currentDetail.alternate_sku1;
  383. this.currentDetail.uom = currentDetail.uom;
  384. document.getElementById('amount').focus();
  385. },
  386. reviewSku() {
  387. //查询输入的产品编码
  388. let selectedSkuIndex = this.orderDetails.findIndex(item => {
  389. return item.alternate_sku1 === this.currentDetail.alternate_sku1;
  390. });
  391. console.log(selectedSkuIndex);
  392. //添加inputQty属性
  393. if (selectedSkuIndex !== -1) this.orderDetails[selectedSkuIndex].inputQty = this.currentDetail.qty;
  394. if (this.currentDetail.qty === 0) {
  395. tempTip.setDuration(2000);
  396. tempTip.show('数量不能为0!');
  397. } else if (selectedSkuIndex === -1) {
  398. tempTip.setDuration(2000);
  399. tempTip.show('输入产品编码有误!');
  400. } else if (this.currentDetail.qty > (this.orderDetails[selectedSkuIndex].qty - this.orderDetails[selectedSkuIndex].packedqty)) {
  401. tempTip.setDuration(2000);
  402. tempTip.show('输入数量不能大于未复核数!');
  403. } else {
  404. this.reviewedSkus.unshift(this.orderDetails[selectedSkuIndex]);//添加到头部
  405. tempTip.setDuration(2000);
  406. tempTip.showSuccess('成功!');
  407. this.orderDetails.splice(selectedSkuIndex, 1);
  408. }
  409. }
  410. },
  411. filters: {},
  412. });
  413. </script>
  414. @endsection