general.blade.php 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776
  1. @extends('layouts.app')
  2. @section('title')查询-退货管理@endsection
  3. @section('content')
  4. <div class="container-fluid">
  5. <div>
  6. <div class="d-none" id="list">
  7. @if(Session::has('successTip'))
  8. <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
  9. @endif
  10. <div id="form_div"></div>
  11. <span class="dropdown">
  12. <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
  13. data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
  14. 导出Excel
  15. </button>
  16. <div class="dropdown-menu">
  17. <a class="dropdown-item" @click="exportExcel(false)" href="javascript:">导出勾选内容</a>
  18. <a class="dropdown-item" @click="exportExcel(true)" href="javascript:">导出所有页</a>
  19. </div>
  20. </span>
  21. @can('退货管理-审核')
  22. <span class="btn btn-sm btn-outline-dark" @click="checkAll" style="cursor: pointer">审核</span>
  23. @endcan
  24. @can('退货管理-收货')
  25. <span class="btn btn-sm btn-outline-dark" @click="deliveryCheck()" style="cursor: pointer">收货</span>
  26. @endcan
  27. @can('退货管理-编辑')
  28. <span class="btn btn-sm btn-outline-dark" @click="finishAll" style="cursor: pointer">完结</span>
  29. @endcan
  30. @can('退货管理-查询-一般-修改入库')
  31. @cannot('退货管理-客户不可见')
  32. <span class="dropdown">
  33. <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
  34. data-toggle="dropdown" title="将勾选记录的入库状态设定为是或否,仅对未完结状态的记录有效">
  35. 修改入库
  36. </button>
  37. <div class="dropdown-menu">
  38. <a class="dropdown-item" @click="setIsLoaded_batch(1)" href="javascript:">设定为是</a>
  39. <a class="dropdown-item" @click="setIsLoaded_batch(0)" href="javascript:">设定为否</a>
  40. <a class="dropdown-item" @click="setIsLoaded_batch('null')" href="javascript:">无需入库</a>
  41. <a class="dropdown-item" @click="setIsLoaded_batch(2)" href="javascript:">待推单</a>
  42. <a class="dropdown-item" @click="setIsLoaded_batch(4)" href="javascript:">待确认</a>
  43. </div>
  44. </span>
  45. @endcannot
  46. @endcan
  47. @can('退货管理-编辑')
  48. <a class="btn btn-sm btn-outline-dark" href="{{url('rejected/importRejectedNumber')}}"
  49. style="cursor: pointer">批量填充订单号</a>
  50. @endcan
  51. <button class="btn btn-sm ml-2 btn-primary" @click="copyLogisticNumber()">复制快递单号</button>
  52. <button class="btn btn-sm btn-outline-dark" @click="cancelCheck">取消审核</button>
  53. <table
  54. class="table table-striped table-sm table-bordered table-hover text-nowrap table-body td-min-width-80"
  55. style="background: #fff;" id="table">
  56. <tr v-for="(rejectedBill,i) in rejectedBills" :data-id="rejectedBill.id"
  57. @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
  58. <td>
  59. <label><input type="checkbox" :value="rejectedBill.id"/></label>
  60. </td>
  61. <td class="text-nowrap">
  62. <span class="text-muted" style="opacity:0.7">@{{ i+1 }}</span>
  63. <template v-if="rejectedBill.order_issue_rejected_bill">
  64. <br v-if="rejectedBill.order_issue_rejected_bill.order_issue"/>
  65. <span v-if="rejectedBill.order_issue_rejected_bill.order_issue"
  66. class="badge badge-pill badge-danger"
  67. v-text="rejectedBill.order_issue_rejected_bill.order_issue.issue_type.name">
  68. </span>
  69. <br v-if="rejectedBill.order_issue_rejected_bill.work_order"/>
  70. <span v-if="rejectedBill.order_issue_rejected_bill.work_order"
  71. class="badge badge-pill badge-info text-white"
  72. v-text="rejectedBill.order_issue_rejected_bill.work_order.issue_type.name">
  73. </span>
  74. </template>
  75. </td>
  76. <td class="text-muted text-center">
  77. <span v-if="rejectedBill.is_checked==1">
  78. <span class="text-success">
  79. <span class="fa fa-check-square"></span> @{{ rejectedBill.checked_numbers }}
  80. </span>
  81. </span>
  82. <span v-else>未审核</span>
  83. </td>
  84. <td class="text-muted text-center">@{{ rejectedBill.delivery_status }}</td>
  85. <td class="" :class="[rejectedBill.is_finished==1?'text-success':'text-muted']">
  86. @{{rejectedBill.is_finished | yesNo}}
  87. </td>
  88. <td class="" :class="[rejectedBill.is_loaded==1?'text-success':'text-muted']">
  89. <span>
  90. <span v-if="rejectedBill.is_loaded==4">
  91. @can('退货管理-查询-一般-修改入库')
  92. <button class="btn btn-sm btn-info"
  93. @click="confirmBeStored($event,rejectedBill.id)">确定入库</button>
  94. @endcan
  95. </span>
  96. <span v-else>@{{rejectedBill.is_loaded | yesNoIsLoaded}}</span>
  97. </span>
  98. </td>
  99. <td class="text-muted"><span>@{{rejectedBill.created_at}}</span></td>
  100. <td class="text-muted"><span>@{{rejectedBill.record ? (rejectedBill.record.location_at ? rejectedBill.record.location_at : rejectedBill.record.record_at) : ''}}</span>
  101. </td>
  102. <td><span v-if="rejectedBill.owner"><span>@{{rejectedBill.owner.name}}</span></span></td>
  103. <td><span>@{{rejectedBill.logistic_number_return}}</span></td>
  104. <td class="text-muted"><span
  105. v-if="rejectedBill.logistic"><span>@{{rejectedBill.logistic.name}}</span></span></td>
  106. <td>@{{rejectedBill.order_number}}</td>
  107. <td class="text-muted text-overflow-replace-100" style="pointer-events:auto"><span>@{{rejectedBill.sender}}</span>
  108. </td>
  109. <td class="text-muted text-overflow-replace-200" style="pointer-events:auto"><span>@{{rejectedBill.mobile_sender}}</span>
  110. </td>
  111. <td>@{{rejectedBill.logistic_number}}</td>
  112. @cannot('退货管理-到付费用')
  113. <td class="text-muted"><span>@{{rejectedBill.fee_collected}}</span></td>@endcannot
  114. @can('退货管理-查询-客户定义-爱奇艺')
  115. <td class="text-muted"><span>@{{rejectedBill.common_01}}</span></td>@endcan
  116. @cannot('退货管理-客户不可见')
  117. <td class="text-muted">@{{rejectedBill.common_02}}</td>@endcannot
  118. <td class="text-muted"><span>@{{rejectedBill.goods_amount}}</span></td>
  119. <td style="min-width: 1500px">
  120. <div class="w-100" :class="rejectedBill.items.length>1 ? 'up' : ''"
  121. :id="'rejected-'+rejectedBill.id">
  122. <div class="row m-0" v-for="(item,i) in rejectedBill.items">
  123. @if($ownerSign)
  124. <div class="col-1 border border-1" style="overflow-x: hidden">
  125. <div class="w-100 text-overflow-warp-200 warp-min-200">@{{ (item.barcode &&
  126. item.barcode.commodity) ? item.barcode.commodity.sku : '' }}
  127. </div>
  128. </div>@endif
  129. <div title="双击展开全部" @dblclick="barcodeGoodsLength(item)" class="border border-1"
  130. :class="item.barcode_goods_show_long ? 'col-auto' : '@if($ownerSign)col-1 @else col-1 @endif'"
  131. style="overflow-x: hidden">
  132. <div class="w-100 text-overflow-warp-200 warp-min-200">@{{item.barcode_goods}}
  133. </div>
  134. </div>
  135. <div title="双击展开全部" @dblclick="goodsNameLength(item)" class="border border-1"
  136. :class="item.name_goods_show_long ? 'col-auto' : 'col-1'"
  137. style="overflow-x: hidden">
  138. <div class="w-100 text-overflow-warp-200 warp-min-200">@{{item.name_goods}}
  139. </div>
  140. </div>
  141. <div class="col-1 border border-1">@{{item.amount}}</div>
  142. <div class="col-1 border border-1">@{{item.quality_label}}</div>
  143. <div class="col-1 border border-1">@{{item.batch_number}}</div>
  144. <div class="col-1 border border-1">@{{item.made_at}}</div>
  145. <div class="col-1 border border-1">@{{item.validity_at}}</div>
  146. <div class="col-1 border border-1">
  147. <div align="center" @mouseleave="removeCommonImg('common_img_package'+item.id)"
  148. @mouseenter="commonImg('img_package'+item.id,item.package_images)">
  149. <div :id="'img_package'+item.id">
  150. <img v-for="uploadFile in item.package_images"
  151. :src="imgPrefix+uploadFile.url+'-thumbnail.'+uploadFile.type">
  152. </div>
  153. </div>
  154. </div>
  155. <div class="col-1 border border-1">
  156. <div align="center"
  157. @mouseleave="removeCommonImg('common_img_commodity'+item.id)"
  158. @mouseenter="commonImg('img_commodity'+item.id,item.commodity_images)">
  159. <div :id="'img_commodity'+item.id">
  160. <img v-for="uploadFile in item.commodity_images"
  161. :src="imgPrefix+uploadFile.url+'-thumbnail.'+uploadFile.type">
  162. </div>
  163. </div>
  164. </div>
  165. <div class="col-1 border border-1">
  166. <div align="center" @mouseleave="removeCommonImg('common_img_'+item.id)"
  167. @mouseenter="commonImg('img_'+item.id,item.upload_files)">
  168. <div :id="'img_'+item.id">
  169. <img v-for="uploadFile in item.upload_files"
  170. :src="imgPrefix+uploadFile.url+'-thumbnail.'+uploadFile.type">
  171. </div>
  172. </div>
  173. </div>
  174. <div class="col-1 border border-1">@{{item.remark}}</div>
  175. </div>
  176. </div>
  177. <div class="text-center cursor-pointer" v-if="rejectedBill.items.length>1"
  178. @click="unfold(rejectedBill.id)">
  179. <div v-if="upList[rejectedBill.id]">点击收起明细</div>
  180. <div v-else>@{{rejectedBill.goods_amount}}件商品,点击展开明细</div>
  181. </div>
  182. </td>
  183. <td style="min-width:150px;">
  184. @can('退货管理-编辑备注')
  185. <textarea class="form-control form-control-sm"
  186. :rows="rejectedBill.remark?Math.ceil(rejectedBill.remark.length/8):2" cols=8
  187. @change="updateRejectedBillRemark($event)" :value="rejectedBill.remark"
  188. :data_id="rejectedBill.id">@{{ rejectedBill.remark }}</textarea>
  189. @else
  190. <span>@{{rejectedBill.remark}}</span>
  191. @endcan
  192. </td>
  193. <td class="text-muted">@{{rejectedBill.operator_name}}</td>
  194. @can('退货管理-编辑')
  195. <td>
  196. <span v-if="rejectedBill.is_finished!=1">
  197. @can('退货管理-编辑')
  198. <button class="btn btn-outline-info btn-sm tooltipTarget"
  199. @click="edit(rejectedBill.id)">改</button>
  200. @endcan
  201. @can('退货管理-删除')
  202. <button
  203. class="btn btn-outline-danger btn-sm tooltipTarget"
  204. @click="destroy(rejectedBill)">删</button>
  205. @endcan
  206. </span>
  207. <span v-else class="text-muted">已完结</span>
  208. </td>
  209. @endcan
  210. </tr>
  211. </table>
  212. <!--<div class="text-info h5 btn btn">{{--{{$rejectedBills->count()}}--}}/{{--{{$rejectedBills->total()}}--}}</div>-->
  213. {{$rejectedBills->appends($paginateParams)->links()}}
  214. </div>
  215. <label><textarea id="clipboardDiv" style="opacity:0"></textarea></label>
  216. </div>
  217. </div>
  218. @endsection
  219. @section('lastScript')
  220. <script>
  221. let rejectedBills = {!! $rejectedBills->toJson()!!}.data;
  222. let owners = [
  223. @foreach($owners as $owner)
  224. {
  225. id: '{{$owner->id}}', name: '{{$owner->name}}'
  226. },
  227. @endforeach
  228. ];
  229. let logistics = [
  230. @foreach($logistics as $logistic)
  231. {!! $logistic !!},
  232. @endforeach
  233. ];
  234. let qualityLabels = [
  235. @foreach($qualityLabels as $qualityLabel)
  236. {
  237. id: '{{$qualityLabel->id}}', name: '{{$qualityLabel->name}}'
  238. },
  239. @endforeach
  240. ];
  241. @if(isset($paginateParams))
  242. let paginateParams = {!! json_encode($paginateParams) !!};
  243. @endif
  244. let total = 500000;
  245. let editUrl = "{{url('rejectedBill')}}/";
  246. let destroyUrl = "{{url('rejectedBill')}}/";
  247. let ajaxConfirmBeStoredUrl = '{{url("apiLocal/rejectedBill/apiConfirmBeStored")}}';
  248. let ajaxCheckUrl = '{{url("apiLocal/rejectedBill/apiSetIsLoadedAll")}}';
  249. let ajaxCheckAllURL = '{{url("rejected/ajaxCheckAll")}}';
  250. let ajaxFinishAllUrl = '{{url("rejected/ajaxFinishAll")}}';
  251. let csrfInput = '@csrf';
  252. </script>
  253. <script src="{{mix('js/queryForm/export.js')}}"></script>
  254. <script src="{{mix('js/queryForm/queryForm.js')}}"></script>
  255. <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版2--}}
  256. <script>
  257. let vue = new Vue({
  258. el: "#list",
  259. data: {
  260. imgPrefix: "{{asset("/storage")}}",
  261. rejectedBills: rejectedBills,
  262. owners: [
  263. @foreach($owners as $owner)
  264. {
  265. name: '{{$owner->id}}', value: '{{$owner->name}}'
  266. },
  267. @endforeach
  268. ],
  269. logistics: [
  270. @foreach($logistics as $logistic)
  271. {
  272. name: '{{$logistic->id}}', value: '{{$logistic->name}}'
  273. },
  274. @endforeach
  275. ],
  276. qualityLabels: [
  277. @foreach($qualityLabels as $qualityLabel)
  278. {
  279. name: '{{$qualityLabel->id}}', value: '{{$qualityLabel->name}}'
  280. },
  281. @endforeach
  282. ],
  283. selectTr: '',
  284. upList: {},
  285. },
  286. mounted: function () {
  287. $(".up").slideUp();
  288. $(".tooltipTarget").tooltip({'trigger': 'hover'});
  289. $('#list').removeClass('d-none');
  290. let data = [
  291. [
  292. {name: 'created_at_start', type: 'dateTime', tip: '选择显示指定日期的起始时间'},
  293. {
  294. name: 'owner', type: 'select_multiple_select', tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的客户'],
  295. placeholder: ['货主', '定位或多选货主'], data: this.owners
  296. },
  297. {name: 'order_number', type: 'input', tip: '可支持多客户单号,糊模查找需要在右边打上%符号', placeholder: '客户单号'},
  298. {
  299. name: 'logistic_number_return',
  300. type: 'input',
  301. tip: '可支持多退回单号,糊模查找需要在右边打上%符号',
  302. placeholder: '退回单号'
  303. },
  304. {name: 'logistic_number', type: 'input', tip: '可支持多原单单号,糊模查找需要在右边打上%符号', placeholder: '原单单号'},
  305. {
  306. name: 'is_checked',
  307. type: 'select',
  308. placeholder: '是否审核',
  309. data: [{name: 1, value: '已审核'}, {name: 0, value: '未审核'}]
  310. },
  311. {name: 'id_logistic_return', type: 'select', placeholder: '快递名称', data: this.logistics},
  312. {name: 'remark', type: 'input', tip: '退单备注:默认查询15天以内记录信息', placeholder: '退单备注'},
  313. ], [
  314. {name: 'created_at_end', type: 'dateTime', tip: '选择显示指定日期的结束时间'},
  315. {name: 'barcode_goods', type: 'input', tip: '可支持多商品条码,糊模查找需要在右边打上%符号', placeholder: '商品条码'},
  316. {
  317. name: 'id_quality_label',
  318. type: 'select',
  319. tip: '是否正品:正品仅显示全部是正品的退单,但残次显示的是包含有残次的退单',
  320. placeholder: '是否正品',
  321. data: this.qualityLabels
  322. },
  323. {name: 'mobile_sender', type: 'input', tip: '寄件人手机:输入完成敲回车提交', placeholder: '寄件人手机'},
  324. {name: 'checked_numbers', type: 'input', tip: '可支持多审核批次号,糊模查找需要在右边打上%符号', placeholder: '审核批次号'},
  325. {
  326. name: 'is_loaded',
  327. type: 'select',
  328. placeholder: '是否入库',
  329. data: [{name: 1, value: '是'}, {name: 0, value: '否'},
  330. {name: 'null', value: '无需入库'}, {name: 2, value: '待推单'}, {
  331. name: 4,
  332. value: '待确认'
  333. }, {name: 3, value: '交互异常'}]
  334. },
  335. {
  336. name: 'is_issue',
  337. type: 'select',
  338. data: [{name: 'true', value: '有'}, {name: 'false', value: '无'}],
  339. tip: '问题件',
  340. placeholder: '问题件'
  341. }
  342. ]
  343. ];
  344. this.form = new query({
  345. el: "#form_div",
  346. condition: data
  347. });
  348. this.form.init();
  349. setTimeout(() => {
  350. if (this.form.isRender()) {
  351. this.getTotal();
  352. }
  353. }, 300);
  354. let column = [
  355. {name: 'index', value: '序号', neglect: true},
  356. {name: 'checked_numbers', value: '是否审核',},
  357. {name: 'delivery_status', value: '是否收货',},
  358. {name: 'is_finished', value: '是否完结', neglect: true},
  359. {name: 'is_loaded', value: '是否入库', neglect: true},
  360. {name: 'created_at', value: '创建时间'},
  361. {name: 'record_at', value: '退回记录时间'},
  362. {name: 'owner_name', value: '客户名称', neglect: true},
  363. {name: 'logistic_number_return', value: '退回单号'},
  364. {name: 'logistic_name', value: '退回公司', neglect: true},
  365. {name: 'order_number', value: '订单号'},
  366. {name: 'sender', value: '姓名'},
  367. {name: 'mobile_sender', value: '电话'},
  368. {name: 'logistic_number', value: '原单单号'},
  369. @cannot('退货管理-到付费用'){name: 'fee_collected', value: '到付费用', neglect: true}, @endcannot
  370. @can('退货管理-查询-客户定义-爱奇艺'){
  371. name: 'common_01', value: '寄件方省'
  372. }, @endcan
  373. @cannot('退货管理-客户不可见'){
  374. name: 'common_02', value: '重量'
  375. }, @endcannot
  376. {
  377. name: 'goods_amount', value: '商品总数'
  378. },
  379. {
  380. name: "goods", type: "multi", title: "商品信息", rows: [
  381. @if($ownerSign){value: "商品SKU", col: "1"}, {value: "商品条码", col: "1"},
  382. @else{value: "商品条码", col: "1"}, @endif
  383. {
  384. value: "商品名称", col: "1"
  385. },
  386. {value: "数量", col: "1"},
  387. {value: "质量", col: "1"},
  388. {value: "批次号", col: "1"},
  389. {value: "产期", col: "1"},
  390. {value: "效期", col: "1"},
  391. {value: "外箱图", col: "1"},
  392. {value: "产品图", col: "1"},
  393. {value: "照片", col: "1"},
  394. {value: "备注", col: "1"},
  395. ]
  396. },
  397. {name: 'remark', value: '退单备注'},
  398. {name: 'operator_name', value: '录入人'},
  399. @can('退货管理-编辑','退货管理-删除'){name: 'remove', value: '操作', neglect: true},@endcan
  400. ];
  401. new Header({
  402. el: "table",
  403. name: "general",
  404. column: column,
  405. data: this.rejectedBills,
  406. fixedTop: ($('#form_div').height()) + 2,
  407. }).init();
  408. this.rejectedBills.forEach(function (rejectedBill) {
  409. rejectedBill.isShowCancelBtn = false;
  410. });
  411. },
  412. methods: {
  413. renderingTotal() {
  414. $("#paginate").after('<div class="position-relative font-weight-bold" style="left:160px;top:0;margin-top: -25px">共 <b style="color:#0000FF!important;">' +
  415. this.sum + '</b> 条数据</div>');
  416. },
  417. getTotal() {
  418. window.axios.post(decodeURIComponent(decodeURIComponent(window.location.href))).then(res => {
  419. this.sum = res.data;
  420. this.renderingTotal();
  421. });
  422. },
  423. removeCommonImg(id) {
  424. $('#' + id).remove();
  425. },
  426. commonImg(id, uploadFiles) {
  427. let div = "";
  428. let isBtn = '@can('运输管理-运单-图片删除') true @endcan ';
  429. for (let i = 0; i < uploadFiles.length; i++) {
  430. let href = this.imgPrefix + uploadFiles[i].url + '-common.' + uploadFiles[i].type;
  431. let src = this.imgPrefix + uploadFiles[i].url + '-common.' + uploadFiles[i].type;
  432. div += "<div><a target='_blank' href='" + href + "'><img alt='#' src='" + src + "' style='position: relative;' ></a>" + "</div>"
  433. }
  434. $('#' + id).after(
  435. "<div id=\"common_" + id + "\" style='position: relative;padding-bottom: 2px;z-index: 99'>" +
  436. "<div style='position:relative;left: -50px' class='overflow-y-scrollbar-400'>" + div +
  437. "</div></div>");
  438. },
  439. cancelCheck() {
  440. let url = '{{url("apiLocal/rejected/cancelCheck")}}';
  441. let data = {ids: checkData};
  442. window.tempTip.setDuration(2000);
  443. window.axios.post(url, data).then(res => {
  444. if (res.data.success) {
  445. this.rejectedBills.forEach(item => {
  446. if (res.data.data.includes(item.id)) item.is_checked = 0;
  447. });
  448. window.tempTip.showSuccess('取消审核成功!');
  449. return;
  450. }
  451. window.tempTip.show(res.data.message ? res.data.message : '取消审核失败!');
  452. }).catch(err => {
  453. tempTip.show('取消审核失败!网络异常:' + err);
  454. });
  455. },
  456. unfold(id) {
  457. this.$set(this.upList, id, this.upList[id] ? !this.upList[id] : true);
  458. $("#rejected-" + id).slideToggle();
  459. },
  460. selectTableRow(id, e) {
  461. $('#headerParent tr[class=focusing]').removeClass('focusing');
  462. if (id === this.selectTr) {
  463. this.selectTr = '';
  464. return;
  465. }
  466. this.selectTr = id;
  467. $(e.target).parent('tr').addClass('focusing')
  468. },
  469. copyLogisticNumber() {
  470. let text = "";
  471. checkData.forEach((id, i) => {
  472. this.rejectedBills.some(bill => {
  473. if (bill.id == id) {
  474. text += bill.logistic_number_return;
  475. if (i !== checkData.length - 1) text += "\r\n";
  476. return true;
  477. }
  478. });
  479. });
  480. this.copyText(text)
  481. },
  482. copyText(text) {
  483. try {
  484. $('#clipboardDiv').text(text).select().focus();
  485. document.execCommand("Copy");
  486. tempTip.setIndex(1052)
  487. tempTip.setDuration(2000)
  488. tempTip.showSuccess('复制成功')
  489. } catch (e) {
  490. tempTip.setIndex(1052)
  491. tempTip.setDuration(2000)
  492. tempTip.showSuccess('复制失败:' + e)
  493. }
  494. },
  495. updateRejectedBillRemark: function (e) {
  496. let target = $(e.target);
  497. let _this = this;
  498. let id = target.attr('data_id');
  499. let remark = target.val();
  500. let ajaxUrl = '{{url("rejected/changeRejectedBillRemark")}}';
  501. axios.post(ajaxUrl, {'id': id, 'remark': remark}).then(function (response) {
  502. if (response.data.success) {
  503. _this.updateRejectedBills(id, remark);
  504. tempTip.setDuration(2000);
  505. tempTip.showSuccess('备注修改成功');
  506. } else {
  507. tempTip.setDuration(3000);
  508. tempTip.show('备注修改失败!' + response.data.fail_info);
  509. }
  510. }).catch(function (err) {
  511. tempTip.setDuration(3000);
  512. tempTip.show('备注修改失败!网络异常:' + err);
  513. });
  514. },
  515. // 更新表格数据
  516. updateRejectedBills(id, remark) {
  517. this.rejectedBills.some(function (rejectedBill) {
  518. if (parseInt(rejectedBill.id) === parseInt(id)) {
  519. rejectedBill.remark = remark;
  520. return true;
  521. }
  522. })
  523. },
  524. edit(id) {
  525. window.location.href = editUrl + id + "/edit";
  526. },
  527. destroy: function (rejectedBill) {
  528. if (!confirm('确定要删除退货信息“' + rejectedBill.owner.name + ':' + rejectedBill.logistic_number_return + '”吗?')) {
  529. return;
  530. }
  531. let data = this;
  532. let url = destroyUrl + rejectedBill.id;
  533. axios.delete(url, {id: rejectedBill.id})
  534. .then(function (response) {
  535. if (response.data.success) {
  536. for (let i = 0; i < data.rejectedBills.length; i++) {
  537. if (data.rejectedBills[i].id === rejectedBill.id) {
  538. data.rejectedBills.splice(i, 1);
  539. break;
  540. }
  541. }
  542. tempTip.setDuration(1000);
  543. tempTip.showSuccess('删除退货信息"' + rejectedBill.owner.name + ':' + rejectedBill.logistic_number_return + '"成功!')
  544. } else {
  545. tempTip.setDuration(1000);
  546. tempTip.show('删除退货信息"' + rejectedBill.owner.name + ':' + rejectedBill.logistic_number_return + '"失败!')
  547. }
  548. })
  549. .catch(function (err) {
  550. tempTip.setDuration(3000);
  551. tempTip.show('删除退货信息失败!' + '网络错误:' + err);
  552. });
  553. },
  554. cancelCheckConfirmAll: function () {
  555. $('#checkConfirmingAll').tooltip('hide');
  556. setTimeout(function () {
  557. $(".tooltipTarget").tooltip({'trigger': 'hover'})
  558. }, 10);
  559. this.rejectedBills.forEach(function (rejectedBill) {
  560. if (rejectedBill.is_checked === -1)
  561. rejectedBill.is_checked = '0';
  562. })
  563. },
  564. setIsLoaded_batch: function (val) {
  565. let _this = this;
  566. if (checkData.length === 0) {
  567. tempTip.show('没有勾选记录');
  568. $(e.target).val("");
  569. return;
  570. }
  571. let is_loaded = 0;
  572. let is_loadedLabel = '否';
  573. if (parseInt(val) === 1) {
  574. is_loaded = 1;
  575. is_loadedLabel = '是';
  576. } else if (parseInt(val) === 2) {
  577. is_loaded = 2;
  578. is_loadedLabel = '待推单';
  579. } else if (parseInt(val) === 4) {
  580. is_loaded = 4;
  581. is_loadedLabel = '待确认';
  582. } else if (val === "null") {
  583. is_loaded = 'null';
  584. is_loadedLabel = '无需入库';
  585. }
  586. if (!confirm("确定要标记所有勾选入库情况为'" + is_loadedLabel + "'吗")) {
  587. return;
  588. }
  589. axios.post(ajaxCheckUrl, {ids: checkData, is_loaded: is_loaded}).then(function (response) {
  590. if (response.data.success) {
  591. checkData.forEach(function (id) {
  592. _this.rejectedBills.forEach(function (bill) {
  593. if (bill.id === id) {
  594. bill.is_loaded = is_loaded;
  595. }
  596. });
  597. });
  598. tempTip.setDuration(1000);
  599. tempTip.showSuccess('修改勾选记录的入库状态成功');
  600. } else {
  601. tempTip.setDuration(2500);
  602. tempTip.show('修改勾选记录的入库状态失败,错误:' + response.data.fail_info);
  603. }
  604. }).catch(function (e) {
  605. tempTip.setDuration(2500);
  606. tempTip.show('审核勾选内容失败,网络连接错误:' + e);
  607. });
  608. $(e.target).val("")
  609. },
  610. deliveryCheck() {
  611. let _this = this;
  612. if (checkData.length === 0) {
  613. tempTip.show('没有勾选记录');
  614. return
  615. }
  616. if (!confirm("确定要标记所有勾选内容为'已收货'吗")) {
  617. return;
  618. }
  619. let url = '{{url("apiLocal/rejectedBill/updateDeliveryStatus")}}'
  620. axios.post(url, {ids: checkData}).then((response) => {
  621. if (response.data.success) {
  622. for (let id of checkData) {
  623. _this.rejectedBills.forEach(function (rejectedBill) {
  624. if (parseInt(rejectedBill.id) === parseInt(id)) {
  625. rejectedBill.delivery_status = '已收货';
  626. }
  627. });
  628. }
  629. tempTip.setDuration(1000);
  630. tempTip.showSuccess('收货勾选内容成功');
  631. } else {
  632. tempTip.setDuration(2500);
  633. tempTip.show('收货勾选内容失败,错误:' + response.data.error);
  634. }
  635. }).catch(function (e) {
  636. tempTip.setDuration(2500);
  637. tempTip.show('收货勾选内容失败,网络连接错误:' + e);
  638. })
  639. },
  640. checkAll: function () {
  641. let _this = this;
  642. if (checkData.length === 0) {
  643. tempTip.show('没有勾选记录');
  644. return
  645. }
  646. if (!confirm("确定要标记所有勾选内容为'已审核'吗")) {
  647. return;
  648. }
  649. axios.post(ajaxCheckAllURL, {ids: checkData}).then(function (response) {
  650. if (response.data.success) {
  651. response.data.rejecteds.forEach(function (rejected) {
  652. _this.rejectedBills.forEach(function (rejectedBill) {
  653. if (parseInt(rejectedBill.id) === parseInt(rejected.id)) {
  654. rejectedBill.is_checked = 1;
  655. rejectedBill.checked_numbers = rejected.checked_numbers;
  656. }
  657. });
  658. });
  659. tempTip.setDuration(1000);
  660. tempTip.showSuccess('审核勾选内容成功');
  661. } else {
  662. tempTip.setDuration(2500);
  663. tempTip.show('审核勾选内容失败,错误:' + response.data.fail_info);
  664. }
  665. }).catch(function (e) {
  666. tempTip.setDuration(2500);
  667. tempTip.show('审核勾选内容失败,网络连接错误:' + e);
  668. })
  669. },
  670. confirmBeStored: function ($e, id) {
  671. let _this = this;
  672. axios.post(ajaxConfirmBeStoredUrl, {id: id}).then(function (response) {
  673. if (response.data.success) {
  674. _this.rejectedBills.forEach(function (rejectedBill) {
  675. if (rejectedBill.id === id) {
  676. rejectedBill.is_loaded = 1;
  677. }
  678. });
  679. tempTip.setDuration(1000);
  680. tempTip.showSuccess('确认入库成功');
  681. } else {
  682. tempTip.setDuration(2500);
  683. tempTip.okWindow('数据异常无法确认!请在WMS确定入库状态后,勾选该条目手动修改相应入库状态!', '知道了')
  684. }
  685. }).catch(function (e) {
  686. alert('确认失败,网络连接错误:' + e);
  687. tempTip.setDuration(2500);
  688. tempTip.show('确认失败,网络连接错误:' + e);
  689. })
  690. },
  691. finishAll: function () {
  692. let _this = this;
  693. if (checkData.length === 0) {
  694. tempTip.show('没有勾选记录');
  695. return
  696. }
  697. if (!confirm("确定要标记所有勾选内容为'已完结'吗")) {
  698. return;
  699. }
  700. axios.post(ajaxFinishAllUrl, {ids: checkData}).then(function (response) {
  701. if (response.data.success) {
  702. _this.rejectedBills.forEach(function (rejectedBill) {
  703. checkData.forEach(function (checkedId) {
  704. if (rejectedBill.id === checkedId) {
  705. rejectedBill.is_finished = 1;
  706. }
  707. });
  708. });
  709. tempTip.setDuration(1000);
  710. tempTip.showSuccess('标记勾选内容为完结成功');
  711. } else {
  712. tempTip.setDuration(2500);
  713. tempTip.show('标记勾选内容为完结失败,错误:' + response.data.fail_info);
  714. }
  715. }).catch(function (e) {
  716. alert('网络连接错误:' + e);
  717. tempTip.setDuration(2500);
  718. tempTip.show('标记勾选内容完结失败,网络连接错误:' + e);
  719. })
  720. },
  721. exportExcel: function (checkAllSign) {
  722. let url = '{{url('rejected/export')}}';
  723. let token = '{{ csrf_token() }}';
  724. excelExport(checkAllSign, checkData, url, total, token);
  725. },
  726. goodsNameLength(obj) {
  727. obj.name_goods_show_long = !obj.name_goods_show_long;
  728. this.$forceUpdate();
  729. },
  730. barcodeGoodsLength(obj) {
  731. obj.barcode_goods_show_long = !obj.barcode_goods_show_long;
  732. this.$forceUpdate();
  733. },
  734. },
  735. filters: {
  736. yesNo: function (val) {
  737. if (!val || val === 0 || val === '0') {
  738. return '否'
  739. }
  740. return '完结'
  741. },
  742. yesNoIsLoaded: function (val) {
  743. switch (val) {
  744. case 0:
  745. case '0':
  746. return '否';
  747. case 1:
  748. case '1':
  749. return '是';
  750. case 2:
  751. case '2':
  752. return '待推单';
  753. case 3:
  754. case '3':
  755. return '交互异常';
  756. case 4:
  757. case '4':
  758. return '待确认';
  759. case null:
  760. case 'null':
  761. return '无需入库';
  762. }
  763. return '';
  764. }
  765. }
  766. });
  767. </script>
  768. @endsection