index.blade.php 48 KB

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