index.blade.php 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812
  1. @extends("layouts.app")
  2. @section('title','处理工单')
  3. @section("content")
  4. <div class="container-fluid d-none" id="list">
  5. <div>
  6. <div class="">
  7. <div id="form_div" style="min-width: 1220px;"></div>
  8. <div class="form-inline mt-1" id="btn">
  9. @can('订单管理-订单问题件生成')
  10. <span class="ml-1">
  11. <button type="button" class="btn btn-outline-dark btn-sm form-control-sm tooltipTarget"
  12. @click="createOrderIssue(null,false)" style="background: #dad7e8;">生成问题件</button>
  13. </span>
  14. @endcan
  15. @can('订单管理-订单问题件生成')
  16. <span class="ml-1">
  17. <button type="button" class="btn btn-outline-primary btn-sm form-control-sm tooltipTarget"
  18. @click="exportText()">导出文本</button>
  19. </span>
  20. @endcan
  21. @can('订单管理-工单处理-审核')
  22. <span class="ml-1">
  23. <button type="button" class="btn btn-outline-success btn-sm form-control-sm tooltipTarget"
  24. @click="batchReview">
  25. 批量审核
  26. </button>
  27. </span>
  28. @endcan
  29. <span class="ml-1">
  30. <button type="button" class="btn btn-outline-dark btn-sm form-control-sm tooltipTarget"
  31. @click="copyLogisticNumber()" style="background: #dad7e8;">批量复制单号</button>
  32. </span>
  33. @can('订单管理-工单处理-审核')
  34. <span class="ml-1">
  35. <button type="button" class="btn btn-outline-success btn-sm form-control-sm tooltipTarget"
  36. @click="showEditIssueType">
  37. 批量修改问题件类型
  38. </button>
  39. </span>
  40. @endcan
  41. </div>
  42. <div>
  43. <table class="table table-sm table-striped table-hover table-bordered td-min-width-80" id="table">
  44. <tbody class="">
  45. <template v-for="(item,i) in workOrders">
  46. <tr @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
  47. <td>
  48. <label><input type="checkbox" :value="item.id"></label>
  49. </td>
  50. <td class="text-center">
  51. <span>@{{ i+1 }}</span>
  52. <span v-show="item.is_issue_order" class="badge badge-primary">问题件</span>
  53. </td>
  54. <td class="text-left">
  55. @can('订单管理-订单问题件生成')
  56. <button class="btn btn-sm btn-outline-primary"
  57. @click="createOrderIssue(item,true)" v-show="!item.is_issue_order ">
  58. 生成问题件
  59. </button>
  60. @endcan
  61. @can('订单管理-工单处理-审核')
  62. <button class="btn btn-sm btn-outline-success" v-show="item.status !== '已处理'"
  63. @click="review(item,i)">
  64. 审核
  65. </button>
  66. @endcan
  67. @can('订单管理-工单处理-货主编辑')
  68. <button class="btn btn-sm btn-outline-secondary" @click="showFillModel(item,i)" v-if="item['issue_type']['name'] ==='快递丢件'">信息填充</button>
  69. @endcan
  70. @can('订单管理-工单处理-承运商编辑')
  71. <button class="btn btn-sm btn-outline-secondary" @click="showEditLog(item,i,2)" v-if="['快递丢件','破损'].includes(item['issue_type']['name'])">快递处理</button>
  72. @endcan
  73. @can('订单管理-工单处理-宝时编辑')
  74. <button class="btn btn-sm btn-outline-secondary" @click="showEditLog(item,i,1)" v-if="['快递丢件','破损'].includes(item['issue_type']['name'])">宝时处理</button>
  75. @endcan
  76. </td>
  77. <td class="text-center">@{{ item.status }}</td>
  78. <td class="text-center">@{{ item.owner ? item.owner.name : '' }}</td>
  79. <td class="text-center">@{{ item.order ? item.order.client_code : ''}}</td>
  80. <td>@{{item.order ? (item.order.logistic ? item.order.logistic.name : '') : '' }}</td>
  81. <td class="text-center">
  82. <template v-if="item.order">
  83. <template v-if="item.order.packages && item.order.packages.length === 1">
  84. <p>@{{ item.order.packages[0].logistic_number }}</p>
  85. </template>
  86. <template v-else-if="item.order.packages && item.order.packages.length > 0">
  87. <template v-if="selectOrder === item.order.id">
  88. <template v-for="(package,index) in item.order.packages">
  89. @{{ package.logistic_number }}
  90. </template>
  91. </template>
  92. <template v-else>
  93. <p>@{{ item.order.packages[0].logistic_number }}</p>
  94. </template>
  95. <button class="btn btn-sm btn-outline-primary" v-show="selectOrder === null"
  96. @click="selectOrder = item.order.id">
  97. 展开
  98. </button>
  99. <button class="btn btn-sm btn-outline-primary"
  100. v-show="selectOrder === item.order.id"
  101. @click="selectOrder = null">
  102. 收起
  103. </button>
  104. </template>
  105. </template>
  106. </td>
  107. <td class="text-center">
  108. @can('订单管理-工单处理-审核')
  109. <select class="form-control form-control-sm"
  110. :disabled="item.review_at || item.is_issue_order"
  111. :value="item.order_issue_type_id"
  112. @change="changeIssueType(item,$event)">
  113. <option value="0"></option>
  114. <option v-for="type in orderIssueTypes" :value="type.name">@{{ type.value
  115. }}
  116. </option>
  117. </select>
  118. @else
  119. @{{ item.issue_type ? item.issue_type.name : '' }}
  120. @endcan
  121. </td>
  122. <td class="text-center">@{{ item.remark }}</td>
  123. <td class="text-center">
  124. @{{ item.result_explain ?item.result_explain : '' }}
  125. </td>
  126. <td class="text-center">
  127. @{{ item.issue_order_type ?item.issue_order_type : '' }}
  128. </td>
  129. <td class="text-center p-0">
  130. <template v-if="item.issue_logs">
  131. <template v-if="item.issue_logs.length === 1">
  132. <table class="table table-sm m-0">
  133. <tr class="table table-sm">
  134. <td>@{{ item.issue_logs[0].content }}</td>
  135. <td>@{{ item.issue_logs[0].username }}</td>
  136. <td>@{{ item.issue_logs[0].created_at }}</td>
  137. </tr>
  138. </table>
  139. </template>
  140. <template v-else>
  141. <transition name="fade">
  142. <table class="table table-sm m-0" v-if="selectOrderIssue === item.id">
  143. <tr v-for="log in item.issue_logs">
  144. <td>@{{ log.content }}</td>
  145. <td>@{{ log.username }}</td>
  146. <td>@{{ log.created_at }}</td>
  147. </tr>
  148. </table>
  149. </transition>
  150. <transition name="fade">
  151. <table class="table table-sm m-0" v-if="selectOrderIssue !== item.id">
  152. <tr>
  153. <td>@{{ item.issue_logs[0].content }}</td>
  154. <td>@{{ item.issue_logs[0].username }}</td>
  155. <td>@{{ item.issue_logs[0].created_at }}</td>
  156. </tr>
  157. </table>
  158. </transition>
  159. <button class="btn btn-sm btn-outline-primary"
  160. v-show="selectOrderIssue !== item.id"
  161. @click="selectOrderIssue = item.id">展开
  162. </button>
  163. <button class="btn btn-sm btn-outline-primary"
  164. v-show="selectOrderIssue === item.id"
  165. @click="selectOrderIssue = null">收起
  166. </button>
  167. </template>
  168. </template>
  169. </td>
  170. <td class="text-center">
  171. <template v-if="item.review_at">
  172. <div v-if="item.order && item.order.packages">
  173. <template v-for="package in item.order.packages">
  174. <template
  175. v-if="package.transfer_status && package.transfer_status.length > 0">
  176. <div v-if="selectOrderPackage === package.id">
  177. <template v-for="transfer in package.transfer_status">
  178. <p>@{{
  179. transfer['accept_time']+':'+transfer['accept_address']
  180. }}</p>
  181. </template>
  182. </div>
  183. <div v-else>
  184. @{{
  185. package.transfer_status[0]['accept_time']+':'+package.transfer_status[0]['accept_address']
  186. }}
  187. </div>
  188. <button class="btn btn-sm btn-outline-primary"
  189. v-if="selectOrderPackage !== package.id"
  190. @click="selectOrderPackage = package.id">展开
  191. </button>
  192. <button class="btn btn-sm btn-outline-primary" v-else
  193. @click="selectOrderPackage = null">收起
  194. </button>
  195. </template>
  196. </template>
  197. </div>
  198. </template>
  199. </td>
  200. <td class="text-center">@{{ item.creator.name }}</td>
  201. <td class="text-center">@{{ item.created_at }}</td>
  202. <td>@{{ item.reviewer ? item.reviewer.name : ''}}</td>
  203. <td>@{{ item.review_at }}</td>
  204. @can('订单管理-工单处理-删除')
  205. <td>
  206. <button class="btn btn-sm btn-outline-danger"
  207. @click="destroy(item,i)">
  208. 删除
  209. </button>
  210. </td>
  211. @endcan
  212. </tr>
  213. </template>
  214. </tbody>
  215. </table>
  216. {{ $workOrders->withQueryString()->links() }}
  217. </div>
  218. </div>
  219. @can('订单管理-工单处理-审核')
  220. @include('order.workOrder._edit_issue_type')
  221. @endcan
  222. @include('order.workOrder._fill_loss_work_order')
  223. @include('order.workOrder._edit_process_log')
  224. </div>
  225. </div>
  226. @endsection()
  227. @section("lastScript")
  228. <script type="text/javascript" src="{{asset('js/queryForm/queryForm.js')}}"></script>
  229. <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
  230. <style>
  231. .fade-enter-active, .fade-leave-active {
  232. transition: opacity .5s;
  233. }
  234. .fade-enter, .fade-leave-to {
  235. opacity: 0;
  236. }
  237. </style>
  238. <script>
  239. let list = new Vue({
  240. el: "#list",
  241. data: {
  242. workOrders: {!! $workOrders->toJson() !!}['data'],
  243. selectTr: null,
  244. form: null,
  245. logistics: [
  246. @foreach($logistics as $logistic)
  247. {
  248. name: {{$logistic->id}}, value: '{{$logistic->name}}'
  249. },
  250. @endforeach
  251. ],
  252. orderIssueTypes: [
  253. @foreach($orderIssueTypes as $type)
  254. {
  255. name: '{{$type->id}}', value: "{{$type->name}}"
  256. },
  257. @endforeach
  258. ],
  259. owners:[
  260. @foreach($owners as $owner)
  261. {name:'{{$owner->id}}',value:'{{$owner->name}}'},
  262. @endforeach
  263. ],
  264. workOrder:{
  265. id:null,
  266. index:null,
  267. reissue_logistic_number:null, // 补发单号
  268. logistic_number:null, // 原单号
  269. refundImages:[], // 退款图
  270. dealImages:[], // 交易图
  271. },
  272. processLog:{
  273. id:null, // log->id
  274. index:'', // 下标
  275. work_order_id:null, // work_order_id
  276. type:null, // 类型
  277. is_indemnity:null, // 是否赔偿
  278. indemnity:null, // 金额
  279. remark:null,
  280. },
  281. selectOrderPackage: null,
  282. selectOrder: null,
  283. selectOrderIssue: null,
  284. selectIssueType: '',
  285. },
  286. mounted() {
  287. let data = [[
  288. {name: 'created_at_start', type: 'time', tip: ['工单创建开始日期', '时间']},
  289. {name: 'created_at_end', type: 'time', tip: ['工单创建结束日期', '时间']},
  290. {
  291. name: 'logistic',
  292. type: 'select_multiple_select',
  293. data: this.logistics,
  294. tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的承运商'],
  295. placeholder: ['承运商', '定位或多选承运商']
  296. },
  297. @can('订单管理-订单问题件生成')
  298. {
  299. name: 'owner',
  300. type: 'select_multiple_select',
  301. data: this.owners,
  302. tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的货主'],
  303. placeholder: ['货主', '定位或多选货主']
  304. },
  305. @endcan
  306. {name: 'logistic_number', type: 'input', placeholder: '快递单号'},
  307. {
  308. name: 'is_issue_order',
  309. type: 'select',
  310. placeholder: '问题件',
  311. data: [{name: 'true', value: '有'}, {name: 'false', value: '无'}]
  312. },
  313. {name: 'creator', type: 'input', placeholder: '创建人'},
  314. ], [{name: 'review_at_start', type: 'time', tip: ['工单审核开始日期', '时间']},
  315. {name: 'review_at_end', type: 'time', tip: ['工单审核结束日期', '时间']},
  316. {name: 'order_issue_type', type: 'select', placeholder: '问题件类型', data: this.orderIssueTypes},
  317. {name: 'client_code', type: 'input', placeholder: '客户订单号'},
  318. {name: 'is_review', type: 'checkbox', tip: '是否审核', data: [{name: 'true', value: '已审核'}]},
  319. ]];
  320. this.form = new query({
  321. el: '#form_div',
  322. condition: data,
  323. });
  324. this.form.init();
  325. let column = [
  326. {name: 'no', value: '序号', neglect: true},
  327. {name: 'operation', value: '操作', neglect: true},
  328. {name: 'status', value: '状态',neglect: true},
  329. {name: 'owner', value: '货主',neglect: true},
  330. {name: 'client_code', value: '订单号',neglect: true},
  331. {name: 'logisticName', value: '承运商',neglect: true},
  332. {name: 'logisticNumber', value: '快递单号'},
  333. {name: 'issueType', value: '问题件类型'},
  334. {name: 'workOrderInfo', value: '问题描述',neglect: true},
  335. {name: 'result_explain', value: '情况说明',neglect: true},
  336. {name: 'orderIssueType', value: '问题件类别'},
  337. {
  338. name: 'orderIssueProcessLogs', type: 'multi', title: "处理结果", rows: [
  339. {value: "内容", col: "4"},
  340. {value: "操作人", col: "4"},
  341. {value: "时间", col: "4"},
  342. ],neglect: true
  343. },
  344. {name: 'Info', value: '物流跟踪信息', neglect: true},
  345. {name: 'creator', value: '创建人',neglect: true},
  346. {name: 'submit_at', value: '提交时间',neglect: true},
  347. {name: 'reviewer', value: '审核人',neglect: true},
  348. {name: 'review_at', value: '审核时间',neglect: true},
  349. @can('订单管理-工单处理-删除')
  350. {name: 'delete_operation', value: '其他操作',neglect: true},
  351. @endcan()
  352. ];
  353. new Header({
  354. el: "table",
  355. name: "workOrders",
  356. column: column,
  357. data: this.workOrders,
  358. fixedTop: ($('#form_div').height()) + 2,
  359. }).init();
  360. $("#list").removeClass("d-none");
  361. },
  362. created() {
  363. this.workOrders.forEach(item=>{
  364. if (!item.order) return;
  365. if (!item.order.packages) return;
  366. this.sortOrder(item);
  367. });
  368. },
  369. methods: {
  370. sortOrder(workOrder) {
  371. if (!workOrder.order) return;
  372. if (workOrder['order_issue']) {
  373. workOrder.result_explain = workOrder['order_issue'].result_explain;
  374. if (workOrder['order_issue']['issue_type']) {
  375. workOrder.issue_order_type = workOrder['order_issue']['issue_type']['name'];
  376. }
  377. if (workOrder['order_issue'].logs) {
  378. workOrder.issue_logs = this.mapLogs(workOrder['order_issue'].logs);
  379. }
  380. }
  381. if (!workOrder.order.packages) return;
  382. workOrder.order.packages.forEach(item=>{
  383. this.sortTransfer(item)
  384. })
  385. },
  386. mapLogs(logs){
  387. return logs.map(item=>{
  388. return {
  389. username: item.user ? item.user.name : '',
  390. content: item.content,
  391. created_at: item.created_at
  392. };
  393. });
  394. },
  395. sortTransfer(item) {
  396. if (!("transfer_status" in item)) return;
  397. if (item.transfer_status == null || !(item.transfer_status instanceof Array)) return;
  398. item.transfer_status.sort(function (item1, item2) {
  399. let date1 = new Date(item1['accept_time']);
  400. let date2 = new Date(item2['accept_time']);
  401. if (date1 - date2 > 0) return -1;
  402. if (date1 - date2 < 0) return 1;
  403. return 0;
  404. });
  405. },
  406. review(item, i) {
  407. let url = '{{route('workOrder.reviewApi')}}';
  408. let data = {id: item.id};
  409. window.axios.post(url, data).then(res => {
  410. if (res.data.success) {
  411. res.data.data.is_issue_order = item.is_issue_order;
  412. this.sortOrder(res.data.data);
  413. this.$set(this.workOrders, i, res.data.data);
  414. window.tempTip.showSuccess("审核完成");
  415. } else {
  416. window.tempTip.show(res.data.message ? res.data.message : '审核异常');
  417. }
  418. }).catch(err => {
  419. window.tempTip.show(err)
  420. })
  421. },
  422. createOrderIssue(item, tag) { // 生成问题件
  423. let url = '{{route('workOrder.buildOrderIssueApi')}}';
  424. let data = {};
  425. if (tag) data.ids = [item.id];
  426. else data.ids = checkData;
  427. if (!confirm('是否生成对应的问题件')) return;
  428. window.tempTip.waitingTip('生成中........');
  429. window.axios.post(url, data).then(res => {
  430. if (res.data.success) {
  431. this.replaceWorkOrder(res.data.data);
  432. this.$forceUpdate();
  433. window.tempTip.cancelWaitingTip();
  434. window.tempTip.showSuccess('已生成对应的问题件');
  435. } else {
  436. window.tempTip.cancelWaitingTip();
  437. window.tempTip.show(res.data.message ? res.data.message : '生成问题件异常');
  438. }
  439. }).catch(err => {
  440. window.tempTip.cancelWaitingTip();
  441. window.tempTip.show(err)
  442. });
  443. },
  444. replaceWorkOrder(workOrders){
  445. let data = [];
  446. workOrders.forEach(workOrder=>{data[workOrder.id] = workOrder;});
  447. this.workOrders.forEach((workOrder,i)=>{
  448. if (data[workOrder.id]){
  449. let item = data[workOrder.id];
  450. this.sortOrder(item);
  451. this.$set(this.workOrders,i,item);
  452. }
  453. });
  454. this.$forceUpdate();
  455. },
  456. getMessageWorkOrder() {
  457. let selected = checkData;
  458. if (!selected) {
  459. window.tempTip.show('未选中任何信息');
  460. return null;
  461. }
  462. return this.workOrders.filter((item) => {
  463. if (!item.order) return false;
  464. if (!item.order.packages) return false;
  465. return selected.includes(item.id + '');
  466. });
  467. },
  468. exportText() {
  469. let items = this.getMessageWorkOrder();
  470. if (items == null) return;
  471. let text = '';
  472. items.forEach(item => {
  473. if (item.order) text += this.getExportText(item);
  474. });
  475. this.copyText(text);
  476. },
  477. getExportText(item) {
  478. if (!item.order) return '';
  479. if (!item.order.packages) return '';
  480. let message = '';
  481. let issue_type = item['issue_type']? item['issue_type'].name : '';
  482. switch (issue_type) {
  483. case '拦截':
  484. message = this.interceptMessage(item);
  485. break;
  486. case '信息更改':
  487. message = this.modificationMessage(item);
  488. break;
  489. default:
  490. message = this.getMessage(item);
  491. break;
  492. }
  493. return message;
  494. },
  495. interceptMessage(item) {
  496. let message = '';
  497. if (item.order['logistic']['code'].includes('SF') || item.order['logistic'].code.includes('ZTO')) {
  498. item.order.packages.forEach(node => {
  499. message += node.logistic_number + '\n';
  500. });
  501. message = message.trim('\n') + ' ——拦截\n';
  502. } else {
  503. let item_order_logistic_name = item.order['logistic']['name'];
  504. let item_order_adder = item.order['consignee_name'] + ' '
  505. + item.order['consignee_phone'] + ' '
  506. + ' ' + item.order.address;
  507. item.order.packages.forEach(p => {
  508. if (p) message += item_order_logistic_name + ' ' + p.logistic_number + ' ' + item_order_adder + '\n';
  509. });
  510. message = message.trim('\n') + ' ——拦截\n';
  511. }
  512. return message;
  513. },
  514. modificationMessage(item) {
  515. let message = '';
  516. let logistic_code = item.order['logistic']['code'];
  517. let adder = item.order['consignee_name'] + ' ' + item.order['consignee_phone'] + ' '
  518. + item.order.province + ' ' + item.order.city + ' ' + item.order.district + ' ' + item.order.address;
  519. item.order.packages.forEach(node => {
  520. if (logistic_code.includes('SF')) { // 顺丰订单
  521. message += node['logistic_number'] + ' ——改信息: ' + item.remark + ',运费到付或月结' + '\n';
  522. } else if (logistic_code.includes('ZTO')) {
  523. message += node['logistic_number'] + ' ——改信息:' + item.remark + '\n';
  524. } else {
  525. message += node['logistic_number'] + ' ' + adder + ' ——改地址' + item.remark + '\n';
  526. }
  527. });
  528. return message;
  529. },
  530. getMessage(item) {
  531. let message = '';
  532. if (!item.order.packages) return message;
  533. let adder = item.order['consignee_name'] + ' ' + item.order['consignee_phone'] + ' '
  534. + item.order.province + ' ' + item.order.city + ' ' + item.order.district + ' ' + item.order.address;
  535. item.order.packages.forEach(p => {
  536. message += p.logistic_number + ' ' + adder + ' ——描述 ' + item.remark + '\n';
  537. });
  538. return message;
  539. },
  540. copyText(text) {
  541. let ele = document.querySelector('#copy_text');
  542. if (ele == null) {
  543. ele = document.createElement("textarea");
  544. ele.setAttribute('id', 'copy_text')
  545. ele.style.opacity = 0;
  546. document.querySelector('body').append(ele);
  547. }
  548. try {
  549. $("#copy_text").text(text).select().focus();
  550. document.execCommand("Copy");
  551. tempTip.showSuccess('复制成功')
  552. } catch (e) {
  553. tempTip.showSuccess('复制失败:' + e)
  554. }
  555. },
  556. batchReview() {
  557. let url = '{{route('workOrder.batchReviewApi')}}';
  558. let data = {ids: checkData};
  559. window.tempTip.setIndex('1999');
  560. if (!confirm('是否对当前选中订单进行审核')) return;
  561. window.tempTip.waitingTip('审核中........');
  562. window.axios.post(url, data).then(res => {
  563. if (res.data.success) {
  564. this.replaceWorkOrder(res.data.data);
  565. this.$forceUpdate();
  566. window.tempTip.cancelWaitingTip();
  567. window.tempTip.showSuccess('审核完成');
  568. } else {
  569. window.tempTip.cancelWaitingTip();
  570. window.tempTip.show(res.data.message ? res.data.message : '审核出现异常');
  571. }
  572. }).catch(err => {
  573. window.tempTip.cancelWaitingTip();
  574. window.tempTip.show(err);
  575. })
  576. },
  577. changeIssueType(item, e) {
  578. let url = '{{route('workOrder.updateIssueTypeApi')}}';
  579. let data = {
  580. id: item.id,
  581. type_id: $(e.target).val()
  582. };
  583. window.tempTip.waitingTip('修改中.........');
  584. window.axios.post(url, data).then(res => {
  585. if (res.data.success) {
  586. window.tempTip.cancelWaitingTip();
  587. window.tempTip.showSuccess('修改成功');
  588. item.order_issue_type_id = data.type_id;
  589. } else {
  590. window.tempTip.cancelWaitingTip();
  591. window.tempTip.show(res.data.message ? res.data.message : '修改异常');
  592. }
  593. }).catch(err => {
  594. window.tempTip.cancelWaitingTip();
  595. window.tempTip.show(err);
  596. });
  597. },
  598. copyLogisticNumber() {
  599. let items = this.getMessageWorkOrder();
  600. let logistic_numbers = '';
  601. items.forEach(item => {
  602. item.order.packages.forEach(node => {
  603. logistic_numbers += node.logistic_number + '\n';
  604. });
  605. })
  606. this.copyText(logistic_numbers);
  607. },
  608. showEditIssueType() {
  609. this.selectIssueType = 0;
  610. $("#edit-issue-type-type-modal").modal('show');
  611. },
  612. editOrderIssueType() {
  613. let url = '{{route('workOrder.batchUpdateIssueTypeApi')}}'
  614. let data = {ids: checkData, type: this.selectIssueType};
  615. window.tempTip.setIndex(1999);
  616. window.axios.post(url, data).then(res => {
  617. if (res.data.success) {
  618. window.tempTip.showSuccess('修改问题件类型成功');
  619. this.replaceWorkOrder(res.data.data);
  620. $("#edit-issue-type-type-modal").modal('hide');
  621. return;
  622. }
  623. window.tempTip.show(res.data.message ? res.data.message : '修改异常');
  624. }).catch(err => {
  625. window.tempTip.show(err)
  626. })
  627. },
  628. destroy(item,i){
  629. let url = '{{url('apiLocal/workOrder/')}}'+'/'+item.id;
  630. if(!confirm('是否删除当前工单')) return ;
  631. window.tempTip.waitingTip('删除.........');
  632. window.axios.delete(url).then(res=>{
  633. if (res.data.success){
  634. this.$delete(this.workOrders,i);
  635. window.tempTip.cancelWaitingTip();
  636. window.tempTip.showSuccess('删除成功');
  637. }else {
  638. window.tempTip.cancelWaitingTip();
  639. window.tempTip.show(res.data.message ? res.data.message : '');
  640. }
  641. }).catch(err=>{
  642. window.tempTip.cancelWaitingTip();
  643. window.tempTip.show(err);
  644. })
  645. },
  646. pushImagesAndShow(e, images) {
  647. let map = [];
  648. for (let i = 0; i < e.target.files.length; i++) {
  649. let image = e.target.files[i];
  650. if (this.imageExist(image,images)) {
  651. map.push(image.name);
  652. continue;
  653. }
  654. let src = window.URL.createObjectURL(image);
  655. images.push({src: src, file: image});
  656. }
  657. e.target.value = '';
  658. if (map.length === 0)return ;
  659. window.tempTip.setIndex(1999);
  660. window.tempTip.show(map.join('\n,')+'图片重复');
  661. },
  662. spliceImage(i, images) {
  663. if (!confirm('是否取消选择该图片')) return;
  664. images.splice(i, 1);
  665. },
  666. imageExist(image,images) {
  667. let arr = images.filter(item => {
  668. return item.file.name === image.name;
  669. });
  670. return arr.length > 0;
  671. },
  672. showFillModel(item,index){
  673. this.workOrder.id = item.id;
  674. this.workOrder.index = index;
  675. this.workOrder.reissue_logistic_number = null; // 补发单号
  676. this.workOrder.logistic_number = null; // 补发单号
  677. this.workOrder.dealImages = []; // 交易图
  678. this.workOrder.refundImages = []; // 退款图
  679. $("#fill-loss-work-order-modal").modal('show');
  680. },
  681. updateLossWorkOrder(){
  682. let formData = new FormData();
  683. formData.append('id',this.workOrder.id);
  684. formData.append('reissue_logistic_number',this.workOrder.reissue_logistic_number);
  685. formData.append('logistic_number',this.workOrder.logistic_number);
  686. let dealImages = this.getImages(this.workOrder.dealImages);
  687. let refundImages = this.getImages(this.workOrder.refundImages);
  688. this.setFormDataImagePrefix(formData,'dealImages',dealImages);
  689. this.setFormDataImagePrefix(formData,'refundImages',refundImages);
  690. this.fillLossWorkOrder(formData);
  691. },
  692. setFormDataImagePrefix(formData, prefix, images) {
  693. images.forEach((item, i) => {
  694. formData.append(`${prefix}[]`, item);
  695. });
  696. },
  697. getImages(images) {
  698. return images.map((item) => {
  699. return item.file;
  700. })
  701. },
  702. fillLossWorkOrder(data){
  703. let url = "{{route('workOrder.lossApi')}}";
  704. window.tempTip.setIndex(1999);
  705. window.axios.post(url,data,{'Content-Type': 'multipart/form-data',}).then(res=>{
  706. if (res.data.success){
  707. this.sortOrder(res.data.data);
  708. this.$set(this.workOrders,this.workOrder.index,res.data.data);
  709. window.tempTip.showSuccess('工单信息填充成功');
  710. }else {
  711. window.tempTip.show(res.data.message);
  712. }
  713. }).catch(err=>{
  714. window.template.show(err);
  715. });
  716. },
  717. showEditLog(item,index,type){
  718. this.processLog.type = type;
  719. this.processLog.index = index;
  720. this.processLog.work_order_id = item.id;
  721. this.processLog.indemnity = null;
  722. this.processLog.is_indemnity = null;
  723. this.processLog.remark = null;
  724. $("#work-order-process-log-modal").modal('show');
  725. },
  726. storeLogisticProcessLog(){
  727. let url = "{{route('workOrderProcessLog.logisticLogApi')}}";
  728. let data = {
  729. 'indemnity':this.processLog.indemnity,
  730. 'work_order_id':this.processLog.work_order_id,
  731. 'is_indemnity':this.processLog.is_indemnity,
  732. 'remark':this.processLog.remark,
  733. };
  734. if(!this.verifiedProcessLog())return;
  735. window.tempTip.setDuration(9999);
  736. window.tempTip.setIndex(1999);
  737. window.tempTip.waitingTip('操作中请稍后');
  738. window.axios.post(url,data).then(res=>{
  739. window.tempTip.cancelWaitingTip();
  740. window.tempTip.setIndex(1999);
  741. window.tempTip.setDuration(2000);
  742. if (res.data.success){
  743. window.tempTip.showSuccess('创建成功');
  744. this.$set(this.workOrders[this.processLog.index],'logisticLog',res.data.data);
  745. } else{
  746. window.tempTip.show(res.data.message ? res.data.message : '创建异常,刷新页面重试');
  747. }
  748. }).catch(err=>{
  749. window.tempTip.setIndex(1999);
  750. window.tempTip.setDuration(2000);
  751. window.tempTip.show(err);
  752. });
  753. },
  754. storeProcessLog(){
  755. let url = "{{route('workOrderProcessLog.LogApi')}}";
  756. let data = {
  757. 'indemnity':this.processLog.indemnity,
  758. 'work_order_id':this.processLog.work_order_id,
  759. 'is_indemnity':this.processLog.is_indemnity,
  760. 'remark':this.processLog.remark,
  761. };
  762. if(!this.verifiedProcessLog())return;
  763. window.tempTip.setDuration(9999);
  764. window.tempTip.setIndex(1999);
  765. window.tempTip.waitingTip('操作中请稍后');
  766. window.axios.post(url,data).then(res=>{
  767. window.tempTip.cancelWaitingTip();
  768. window.tempTip.setDuration(2000);
  769. if (res.data.success){
  770. window.tempTip.showSuccess('创建成功');
  771. this.$set(this.workOrders[this.processLog.index],'processLog',res.data.data);
  772. } else{
  773. window.tempTip.show(res.data.message ? res.data.message : '创建异常,刷新页面重试');
  774. }
  775. }).catch(err=>{
  776. window.tempTip.setDuration(2000);
  777. window.tempTip.show(err);
  778. });
  779. },
  780. verifiedProcessLog(){ // 校验处理信息
  781. window.tempTip.setIndex(1999);
  782. window.tempTip.setDuration(2000);
  783. if(this.processLog.is_indemnity === null){
  784. window.tempTip.show('选择处理方式');
  785. return false;
  786. }
  787. if(this.processLog.is_indemnity === '1'){
  788. if (!this.processLog.indemnity ){
  789. window.tempTip.show('填写赔偿金额');
  790. return false;
  791. }
  792. }else if (this.processLog.is_indemnity === '2'){
  793. if (this.processLog.remark ===null || this.processLog.remark.trim(' ').length === 0){
  794. window.tempTip.show('填写不赔偿理由');
  795. return false;
  796. }
  797. }
  798. return true;
  799. }
  800. },
  801. });
  802. </script>
  803. @endsection