index.blade.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. @extends('layouts.app')
  2. @section('title')时效进度@endsection
  3. @section('content')
  4. <div class="d-none" id="list">
  5. <!--查询 -->
  6. <div class="row m-3" style="background-color: #fff;">
  7. <div class="form-group m-2">
  8. <select class="form-control selectpicker" title="分页大小" v-model="size">
  9. <option value="50">50</option>
  10. <option value="100">100</option>
  11. <option value="200">200</option>
  12. <option value="500">500</option>
  13. <option value="1000">1000</option>
  14. </select>
  15. </div>
  16. <div class="form-group m-2" style="max-width: 200px !important;">
  17. <select v-model="search.customerId" class="selectpicker form-control" title="选择货主"
  18. data-actions-box="true"
  19. data-live-search="true"
  20. data-live-search-placeholder="搜索"
  21. >
  22. <option v-for="(v,k) of searchSelects.owners" :value="v.id" :key="v.id">@{{ v.name }}</option>
  23. </select>
  24. </div>
  25. <div class="form-group m-2" style="max-width: 200px !important;">
  26. <select v-model="search.workGroupId" class="selectpicker form-control" title="工作组"
  27. data-actions-box="true"
  28. data-live-search="true"
  29. data-live-search-placeholder="搜索"
  30. >
  31. <option v-for="(v,k) of searchSelects.workGroups" :value="v.id" :key="v.id">@{{ v.name }}</option>
  32. </select>
  33. </div>
  34. <div class="form-group m-2" data-toggle="tooltip" data-placement="top" title="货主">
  35. <input v-model="search.receiveTaskNo" class="form-control" type="text" step="01" placeholder="收货任务号">
  36. </div>
  37. <div class="form-group m-2" data-toggle="tooltip" data-placement="top" title="货主">
  38. <input v-model="search.reservationNo" class="form-control" type="text" step="01" placeholder="预约号">
  39. </div>
  40. <div class="form-group m-2" data-toggle="tooltip" data-placement="top" title="货主">
  41. <select v-model="search.status" class="selectpicker form-control" title="选择状态"
  42. data-actions-box="true"
  43. data-live-search="true"
  44. data-live-search-placeholder="搜索"
  45. >
  46. <option v-for="v of searchSelects.statuses" :value="v" :key="v.id">@{{ v }}</option>
  47. </select>
  48. </div>
  49. <div class="form-group m-2" data-toggle="tooltip" data-placement="top" title="货主">
  50. <input v-model="search.asnNo" class="form-control" type="text" step="01" placeholder="ASN号">
  51. </div>
  52. <div class="form-group m-2" data-toggle="tooltip" data-placement="top" title="起始日期">
  53. <input v-model="search.createSingleStartTime" class="form-control" type="date" step="01">
  54. </div>
  55. <div class="form-group m-2" data-toggle="tooltip" data-placement="top" title="截止日期">
  56. <input v-model="search.createSingleEndTime" class="form-control" type="date" step="01">
  57. </div>
  58. <div class="form-group m-2">
  59. <button class="form-control btn btn-sm btn-info" @click="searchData()">查询</button>
  60. </div>
  61. </div>
  62. <!-- 表格-->
  63. <table class="table table-striped table-bordered table-hover text-nowrap "
  64. style="background: #fff;" id="table">
  65. <tr v-for="(item,i) in resData.details.data" :key="i">
  66. <td class="td-warm text-muted "><span>@{{ i+1 }}</span></td>
  67. <td class="td-warm text-muted"><span>@{{ item.receiveTaskNo }}</span></td>
  68. <td class="td-warm text-muted"><span>@{{ item.status }}</span></td>
  69. <td class="td-warm text-muted"><span>@{{ item.asnNo }}</span></td>
  70. <td class="td-warm text-muted"><span>@{{ item.reservationNo }}</span></td>
  71. <td class="td-warm text-muted"><span>@{{ item.customerName }}</span></td>
  72. <td class="td-warm text-muted"><span>@{{ item.workGroupName }}</span></td>
  73. <td class="td-warm text-muted"><span>@{{ item.expectancyAmount }}</span></td>
  74. <td class="td-warm text-muted"><span>@{{ item.putawayAmount }}</span></td>
  75. <td class="td-warm text-muted"><span>@{{ item.receiveConsumeDuration }}</span></td>
  76. <td class="td-warm text-muted"><span>@{{ item.putawayConsumeDuration }}</span></td>
  77. <td class="td-warm text-muted text-center">
  78. <button @click="showDetail(item.receiveTaskNo,item.reservationNo,item.asnNo,item.createSingleTime)" type="button"
  79. class="btn btn-primary" data-toggle="modal"
  80. data-target="#staticBackdrop">
  81. 查看明细
  82. </button>
  83. @can('入库管理-实时收货看板-删除')
  84. <button @click="deleteTask(item.receiveTaskNo)" type="button" class="btn btn-danger float-right">
  85. 删除
  86. </button>
  87. @endcan
  88. </td>
  89. </tr>
  90. </table>
  91. <nav aria-label="..+.">
  92. <ul class="pagination">
  93. <li class="page-item" :class="current===1?'disabled':''">
  94. <button class="page-link" @click="pagination('pre')">上一页</button>
  95. </li>
  96. <li class="page-item" :class="current===resData.details.pages?'disabled':''">
  97. <button class="page-link" @click="pagination('next')">下一页</button>
  98. </li>
  99. </ul>
  100. </nav>
  101. <!-- Modal -->
  102. <div class="modal fade" id="staticBackdrop" tabindex="-1" aria-labelledby="staticBackdropLabel"
  103. aria-hidden="true">
  104. <div class="modal-dialog modal-xl" style="max-width:70% !important;">
  105. <div class="modal-content">
  106. <div class="modal-header">
  107. <h5 class="modal-title" id="staticBackdropLabel">明细</h5>
  108. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  109. <span aria-hidden="true">&times;</span>
  110. </button>
  111. </div>
  112. <div class="modal-body">
  113. <!-- Scrollable modal -->
  114. <div class="modal-dialog-scrollable">
  115. <table class="table table-sm text-nowrap"
  116. style="background: #fff;" id="table_inner">
  117. <tr v-for="(item,i) in resData.itemDetail" :key="i" >
  118. <td class="td-warm text-muted in"><span>@{{ i+1 }}</span></td>
  119. <td class="td-warm text-muted"><span>@{{ item.receiveTaskNo }}</span></td>
  120. <td class="td-warm text-muted"><span>@{{ item.asnNo }}</span></td>
  121. <td class="td-warm text-muted"><span>@{{ item.reservationNo }}</span></td>
  122. <td class="td-warm text-muted"><span>@{{ item.container }}</span></td>
  123. <td class="td-warm text-muted"><span>@{{ item.commName }}</span></td>
  124. <td class="td-warm text-muted"><span>@{{ item.commSku }}</span></td>
  125. <td class="td-warm text-muted"><span>@{{ item.commBarcode }}</span></td>
  126. <td class="td-warm text-muted"><span>@{{ item.receiveQty }}</span></td>
  127. <td class="td-warm text-muted"><span>@{{ item.putawayTime }}</span></td>
  128. <td class="td-warm text-muted"><span>@{{ item.receiveConsumeDuration }}</span></td>
  129. <td class="td-warm text-muted"><span>@{{ item.putawayConsumeDuration }}</span></td>
  130. </tr>
  131. </table>
  132. </div>
  133. </div>
  134. </div>
  135. </div>
  136. </div>
  137. </div>
  138. @endsection
  139. @section('lastScript')
  140. <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版2--}}
  141. <script>
  142. /**
  143. * @Description: 轮询执行方法
  144. * @param {func} function 需要轮询的方法
  145. * @param {time} number 轮询间隔,默认1s
  146. * @param {endTime} number 可轮询时间, 为空时一直轮询
  147. * @param {immedaite} boolean 第一次是否立即执行
  148. * @author: XuLijuan
  149. */
  150. const pollingFunction = (func, time = 1000, endTime, immediate = false) => {
  151. immediate && func(); //是否立即执行一次,由实际决定
  152. const startTime = new Date().getTime();
  153. const pollTimer = setInterval(() => {
  154. const nowTime = new Date().getTime();
  155. if (endTime && nowTime - startTime >= endTime) {
  156. pollTimer && clearInterval(pollTimer);
  157. }
  158. func();
  159. }, time);
  160. return pollTimer;
  161. };
  162. let vue = new Vue({
  163. el: "#list",
  164. data: {
  165. timer: null,
  166. resData: {
  167. details: {
  168. data: [],
  169. total: null,
  170. current: 1,
  171. pages: null,
  172. size: 50,
  173. },
  174. itemDetail: null,
  175. },
  176. searchSelects: {
  177. owners: {!! $owners !!},
  178. workGroups: {!! $workGroups !!},
  179. statuses: ['创建', '进行中', '完成', '超时完成'],
  180. },
  181. selectTr: null,
  182. search: {
  183. customerId: null,
  184. receiveTaskNo: null,
  185. reservationNo: null,
  186. status: null,
  187. asnNo: null,
  188. createSingleStartTime: null,
  189. createSingleEndTime: null,
  190. workGroupId: null,
  191. sign: null,
  192. ownerIdList:[
  193. @foreach($owners as $owner)
  194. {{$owner->id}},
  195. @endforeach
  196. ],
  197. },
  198. size: 50,
  199. current: 1,
  200. },
  201. created() {
  202. window.tempTip.show("功能关闭,移至SWMS系统进行操作");
  203. return
  204. let url = this.getBaseUrl() + `/api/device/check/receiveBoard/agingScheduleList?size=${this.size}&current=${this.current}`
  205. this.initSearchDate();
  206. this.getPageResult(url);
  207. },
  208. beforeDestroy() {
  209. clearInterval(this.timer)
  210. },
  211. mounted: function () {
  212. $('#list').removeClass('d-none');
  213. pollingFunction(this.searchData, 1000 * 30)
  214. let column = [
  215. {name: 'serial', value: '序号', neglect: true},
  216. {name: 'receiveTaskNo', value: '收货任务号', neglect: true},
  217. {name: 'status', value: '任务状态', neglect: true},
  218. {name: 'asnNo', value: 'ASN号', neglect: true},
  219. {name: 'reservationNo', value: '预约号', neglect: true},
  220. {name: 'customerName', value: '货主', neglect: true},
  221. {name: 'workGroupName', value: '操作组', neglect: true},
  222. {name: 'expectancyAmount', value: '预期总数', neglect: true},
  223. {name: 'putawayAmount', value: '已上架总数', neglect: true},
  224. {name: 'receiveConsumeDuration', value: ' 收货总耗时(分)', neglect: true},
  225. {name: 'putawayConsumeDuration', value: '上架总耗时(分)', neglect: true},
  226. {name: 'make', value: '操作', neglect: true,class:'text-center'},
  227. ];
  228. new Header({
  229. el: "table",
  230. name: "details",
  231. column: column,
  232. data: this.resData.details.data,
  233. restorationColumn: 'addtime',
  234. isCheckAllBox:false,
  235. fixedTop: ($('#form_div').height()) + ($('#btn').height()) + 1,
  236. }).init();
  237. let column2 = [
  238. {name: 'serial', value: '序号', neglect: true},
  239. {name: 'receiveTaskNo', value: '收货任务号', neglect: true},
  240. {name: 'asnNo', value: 'ASN号', neglect: true},
  241. {name: 'reservationNo', value: '预约号', neglect: true},
  242. {name: 'container', value: '容器号', neglect: true},
  243. {name: 'commName', value: '商品名称', neglect: true},
  244. {name: 'commSku', value: 'SKU', neglect: true},
  245. {name: 'commBarcode', value: '条码', neglect: true},
  246. {name: 'receiveQty', value: '收货数量', neglect: true},
  247. {name: 'putawayTime', value: '上架时间', neglect: true},
  248. {name: 'receiveConsumeDuration', value: '收货耗时(分)', neglect: true},
  249. {name: 'putawayConsumeDuration', value: '上架耗时(分)', neglect: true},
  250. ];
  251. new Header({
  252. el: "table_inner",
  253. name: "details",
  254. column: column2,
  255. data: this.resData.details.data,
  256. restorationColumn: 'addtime',
  257. isCheckAllBox:false,
  258. fixedTop: ($('#form_div').height()) + ($('#btn').height()) + 1,
  259. }).init();
  260. },
  261. methods: {
  262. getPageResult(url) {
  263. axios.post(url, this.getSearch()).then(res => {
  264. if (res.data.code !== 200) {
  265. this.resData.details.data = [];
  266. this.resData.details.total = 0
  267. this.resData.details.current = 1
  268. this.resData.details.pages = 0
  269. this.resData.details.size = 50;
  270. } else {
  271. this.resData.details.data = res.data.data.list;
  272. this.resData.details.total = res.data.data.page.total;
  273. this.resData.details.current = res.data.data.page.pageNum;
  274. this.resData.details.pages = res.data.data.page.pages
  275. this.resData.details.size = res.data.data.page.pageSize;
  276. }
  277. });
  278. },
  279. getSearch() {
  280. if (this.search.customerId!=null ||this.search.receiveTaskNo!=null ||this.search.reservationNo!=null
  281. ||this.search.status!=null ||this.search.asnNo!=null ||this.search.createSingleStartTime!=null
  282. ||this.search.createSingleEndTime!=null ||this.search.workGroupId!=null){
  283. this.search.sign='有筛选';
  284. }
  285. let search = Object.assign({}, this.search);
  286. search.startTime += ' 00:00:00';
  287. search.endTime += ' 23:59:59';
  288. return search;
  289. },
  290. //初始化日期为今天和昨天
  291. initSearchDate() {
  292. let day1 = new Date();
  293. day1.setTime(day1.getTime() - 24 * 60 * 60 * 1000);
  294. let s1 = day1.getFullYear() + "-" + ((day1.getMonth() + 1) >= 10 ? (day1.getMonth() + 1) : ('0' + (day1.getMonth() + 1))) + "-" + (day1.getDate() >= 10 ? day1.getDate() : ('0' + day1.getDate()));
  295. //今天的时间
  296. let day2 = new Date();
  297. day2.setTime(day2.getTime());
  298. let s2 = day2.getFullYear() + "-" + ((day2.getMonth() + 1) >= 10 ? (day2.getMonth() + 1) : ('0' + (day2.getMonth() + 1))) + "-" + (day2.getDate() >= 10 ? day2.getDate() : ('0' + day2.getDate()));
  299. this.search.startTime = s1;
  300. this.search.endTime = s2;
  301. },
  302. searchData() {
  303. this.current = 1;
  304. this.pagination();
  305. },
  306. //根据环境获取不同的url
  307. getBaseUrl() {
  308. let url = null;
  309. let env = "{{ config('app.env') }}";
  310. if (env === 'local') {
  311. url = 'http://127.0.0.1:8116'
  312. } else if (env === 'production') {
  313. url = 'https://api-back.baoshi56.com'
  314. }
  315. return url;
  316. },
  317. pagination(flag) {
  318. if (flag === 'pre' && this.current > 1) {
  319. this.current--;
  320. } else if (flag === 'next' && this.current < this.resData.details.pages) {
  321. this.current++;
  322. }
  323. let url = this.getBaseUrl() + `/api/device/check/receiveBoard/agingScheduleList?size=${this.size}&current=${this.current}`
  324. this.getPageResult(url);
  325. },
  326. showDetail(receiveTaskNo, reservationNo, asnNo,createSingleTime) {
  327. let url = this.getBaseUrl() + `/api/device/check/receiveBoard/agingScheduleDetail?receiveTaskNo=${receiveTaskNo}&reservationNo=${reservationNo}&asnNo=${asnNo}&createSingleTime=${createSingleTime}`
  328. axios.get(url, this.getSearch()).then(res => {
  329. if (res.data.code !== 200) {
  330. this.resData.itemDetail = null;
  331. } else {
  332. this.resData.itemDetail = res.data.data;
  333. }
  334. });
  335. },
  336. deleteTask(receiveTaskNo) {
  337. if(!confirm('确定要删除收获任务号单号为:“'+receiveTaskNo+'”的开单任务吗?')){return};
  338. let url = this.getBaseUrl() + `/api/device/check/receiveBoard/deleteTask?receiveTaskNo=${receiveTaskNo}`
  339. axios.get(url).then(res => {
  340. if (res.data.code !== 200 || !res.data.data) {
  341. window.tempTip.setDuration(2000);
  342. window.tempTip.show("删除开单任务失败!");
  343. } else {
  344. window.tempTip.setDuration(2000);
  345. window.tempTip.showSuccess("删除开单任务成功!");
  346. for (let i = this.resData.details.data.length - 1; i >= 0; i--) {
  347. if (this.resData.details.data[i].receiveTaskNo === receiveTaskNo) {
  348. this.resData.details.data.splice(i, 1);
  349. }
  350. }
  351. }
  352. });
  353. },
  354. },
  355. });
  356. </script>
  357. @endsection