index.blade.php 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820
  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 | dataTime}}</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 | dataTime}}</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 | dataTime}}</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 ? item.creator.name : '' }}</td>
  201. <td class="text-center">@{{ item.created_at | dataTime}}</td>
  202. <td>@{{ item.reviewer ? item.reviewer.name : ''}}</td>
  203. <td>@{{ item.review_at |dataTime}}</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. filters:{
  370. dataTime:function(value) {
  371. if (value !== null) {
  372. return moment(value).format('yyyy-MM-DD');
  373. }
  374. return value
  375. },
  376. },
  377. methods: {
  378. sortOrder(workOrder) {
  379. if (!workOrder.order) return;
  380. if (workOrder['order_issue']) {
  381. workOrder.result_explain = workOrder['order_issue'].result_explain;
  382. if (workOrder['order_issue']['issue_type']) {
  383. workOrder.issue_order_type = workOrder['order_issue']['issue_type']['name'];
  384. }
  385. if (workOrder['order_issue'].logs) {
  386. workOrder.issue_logs = this.mapLogs(workOrder['order_issue'].logs);
  387. }
  388. }
  389. if (!workOrder.order.packages) return;
  390. workOrder.order.packages.forEach(item=>{
  391. this.sortTransfer(item)
  392. })
  393. },
  394. mapLogs(logs){
  395. return logs.map(item=>{
  396. return {
  397. username: item.user ? item.user.name : '',
  398. content: item.content,
  399. created_at: item.created_at
  400. };
  401. });
  402. },
  403. sortTransfer(item) {
  404. if (!("transfer_status" in item)) return;
  405. if (item.transfer_status == null || !(item.transfer_status instanceof Array)) return;
  406. item.transfer_status.sort(function (item1, item2) {
  407. let date1 = new Date(item1['accept_time']);
  408. let date2 = new Date(item2['accept_time']);
  409. if (date1 - date2 > 0) return -1;
  410. if (date1 - date2 < 0) return 1;
  411. return 0;
  412. });
  413. },
  414. review(item, i) {
  415. let url = '{{route('workOrder.reviewApi')}}';
  416. let data = {id: item.id};
  417. window.axios.post(url, data).then(res => {
  418. if (res.data.success) {
  419. res.data.data.is_issue_order = item.is_issue_order;
  420. this.sortOrder(res.data.data);
  421. this.$set(this.workOrders, i, res.data.data);
  422. window.tempTip.showSuccess("审核完成");
  423. } else {
  424. window.tempTip.show(res.data.message ? res.data.message : '审核异常');
  425. }
  426. }).catch(err => {
  427. window.tempTip.show(err)
  428. })
  429. },
  430. createOrderIssue(item, tag) { // 生成问题件
  431. let url = '{{route('workOrder.buildOrderIssueApi')}}';
  432. let data = {};
  433. if (tag) data.ids = [item.id];
  434. else data.ids = checkData;
  435. if (!confirm('是否生成对应的问题件')) return;
  436. window.tempTip.waitingTip('生成中........');
  437. window.axios.post(url, data).then(res => {
  438. if (res.data.success) {
  439. this.replaceWorkOrder(res.data.data);
  440. this.$forceUpdate();
  441. window.tempTip.cancelWaitingTip();
  442. window.tempTip.showSuccess('已生成对应的问题件');
  443. } else {
  444. window.tempTip.cancelWaitingTip();
  445. window.tempTip.show(res.data.message ? res.data.message : '生成问题件异常');
  446. }
  447. }).catch(err => {
  448. window.tempTip.cancelWaitingTip();
  449. window.tempTip.show(err)
  450. });
  451. },
  452. replaceWorkOrder(workOrders){
  453. let data = [];
  454. workOrders.forEach(workOrder=>{data[workOrder.id] = workOrder;});
  455. this.workOrders.forEach((workOrder,i)=>{
  456. if (data[workOrder.id]){
  457. let item = data[workOrder.id];
  458. this.sortOrder(item);
  459. this.$set(this.workOrders,i,item);
  460. }
  461. });
  462. this.$forceUpdate();
  463. },
  464. getMessageWorkOrder() {
  465. let selected = checkData;
  466. if (!selected) {
  467. window.tempTip.show('未选中任何信息');
  468. return null;
  469. }
  470. return this.workOrders.filter((item) => {
  471. if (!item.order) return false;
  472. if (!item.order.packages) return false;
  473. return selected.includes(item.id + '');
  474. });
  475. },
  476. exportText() {
  477. let items = this.getMessageWorkOrder();
  478. if (items == null) return;
  479. let text = '';
  480. items.forEach(item => {
  481. if (item.order) text += this.getExportText(item);
  482. });
  483. this.copyText(text);
  484. },
  485. getExportText(item) {
  486. if (!item.order) return '';
  487. if (!item.order.packages) return '';
  488. let message = '';
  489. let issue_type = item['issue_type']? item['issue_type'].name : '';
  490. switch (issue_type) {
  491. case '拦截':
  492. message = this.interceptMessage(item);
  493. break;
  494. case '信息更改':
  495. message = this.modificationMessage(item);
  496. break;
  497. default:
  498. message = this.getMessage(item);
  499. break;
  500. }
  501. return message;
  502. },
  503. interceptMessage(item) {
  504. let message = '';
  505. if (item.order['logistic']['code'].includes('SF') || item.order['logistic'].code.includes('ZTO')) {
  506. item.order.packages.forEach(node => {
  507. message += node.logistic_number + '\n';
  508. });
  509. message = message.trim('\n') + ' ——拦截\n';
  510. } else {
  511. let item_order_logistic_name = item.order['logistic']['name'];
  512. let item_order_adder = item.order['consignee_name'] + ' '
  513. + item.order['consignee_phone'] + ' '
  514. + ' ' + item.order.address;
  515. item.order.packages.forEach(p => {
  516. if (p) message += item_order_logistic_name + ' ' + p.logistic_number + ' ' + item_order_adder + '\n';
  517. });
  518. message = message.trim('\n') + ' ——拦截\n';
  519. }
  520. return message;
  521. },
  522. modificationMessage(item) {
  523. let message = '';
  524. let logistic_code = item.order['logistic']['code'];
  525. let adder = item.order['consignee_name'] + ' ' + item.order['consignee_phone'] + ' '
  526. + item.order.province + ' ' + item.order.city + ' ' + item.order.district + ' ' + item.order.address;
  527. item.order.packages.forEach(node => {
  528. if (logistic_code.includes('SF')) { // 顺丰订单
  529. message += node['logistic_number'] + ' ——改信息: ' + item.remark + ',运费到付或月结' + '\n';
  530. } else if (logistic_code.includes('ZTO')) {
  531. message += node['logistic_number'] + ' ——改信息:' + item.remark + '\n';
  532. } else {
  533. message += node['logistic_number'] + ' ' + adder + ' ——改地址' + item.remark + '\n';
  534. }
  535. });
  536. return message;
  537. },
  538. getMessage(item) {
  539. let message = '';
  540. if (!item.order.packages) return message;
  541. let adder = item.order['consignee_name'] + ' ' + item.order['consignee_phone'] + ' '
  542. + item.order.province + ' ' + item.order.city + ' ' + item.order.district + ' ' + item.order.address;
  543. item.order.packages.forEach(p => {
  544. message += p.logistic_number + ' ' + adder + ' ——描述 ' + item.remark + '\n';
  545. });
  546. return message;
  547. },
  548. copyText(text) {
  549. let ele = document.querySelector('#copy_text');
  550. if (ele == null) {
  551. ele = document.createElement("textarea");
  552. ele.setAttribute('id', 'copy_text')
  553. ele.style.opacity = 0;
  554. document.querySelector('body').append(ele);
  555. }
  556. try {
  557. $("#copy_text").text(text).select().focus();
  558. document.execCommand("Copy");
  559. tempTip.showSuccess('复制成功')
  560. } catch (e) {
  561. tempTip.showSuccess('复制失败:' + e)
  562. }
  563. },
  564. batchReview() {
  565. let url = '{{route('workOrder.batchReviewApi')}}';
  566. let data = {ids: checkData};
  567. window.tempTip.setIndex('1999');
  568. if (!confirm('是否对当前选中订单进行审核')) return;
  569. window.tempTip.waitingTip('审核中........');
  570. window.axios.post(url, data).then(res => {
  571. if (res.data.success) {
  572. this.replaceWorkOrder(res.data.data);
  573. this.$forceUpdate();
  574. window.tempTip.cancelWaitingTip();
  575. window.tempTip.showSuccess('审核完成');
  576. } else {
  577. window.tempTip.cancelWaitingTip();
  578. window.tempTip.show(res.data.message ? res.data.message : '审核出现异常');
  579. }
  580. }).catch(err => {
  581. window.tempTip.cancelWaitingTip();
  582. window.tempTip.show(err);
  583. })
  584. },
  585. changeIssueType(item, e) {
  586. let url = '{{route('workOrder.updateIssueTypeApi')}}';
  587. let data = {
  588. id: item.id,
  589. type_id: $(e.target).val()
  590. };
  591. window.tempTip.waitingTip('修改中.........');
  592. window.axios.post(url, data).then(res => {
  593. if (res.data.success) {
  594. window.tempTip.cancelWaitingTip();
  595. window.tempTip.showSuccess('修改成功');
  596. item.order_issue_type_id = data.type_id;
  597. } else {
  598. window.tempTip.cancelWaitingTip();
  599. window.tempTip.show(res.data.message ? res.data.message : '修改异常');
  600. }
  601. }).catch(err => {
  602. window.tempTip.cancelWaitingTip();
  603. window.tempTip.show(err);
  604. });
  605. },
  606. copyLogisticNumber() {
  607. let items = this.getMessageWorkOrder();
  608. let logistic_numbers = '';
  609. items.forEach(item => {
  610. item.order.packages.forEach(node => {
  611. logistic_numbers += node.logistic_number + '\n';
  612. });
  613. })
  614. this.copyText(logistic_numbers);
  615. },
  616. showEditIssueType() {
  617. this.selectIssueType = 0;
  618. $("#edit-issue-type-type-modal").modal('show');
  619. },
  620. editOrderIssueType() {
  621. let url = '{{route('workOrder.batchUpdateIssueTypeApi')}}'
  622. let data = {ids: checkData, type: this.selectIssueType};
  623. window.tempTip.setIndex(1999);
  624. window.axios.post(url, data).then(res => {
  625. if (res.data.success) {
  626. window.tempTip.showSuccess('修改问题件类型成功');
  627. this.replaceWorkOrder(res.data.data);
  628. $("#edit-issue-type-type-modal").modal('hide');
  629. return;
  630. }
  631. window.tempTip.show(res.data.message ? res.data.message : '修改异常');
  632. }).catch(err => {
  633. window.tempTip.show(err)
  634. })
  635. },
  636. destroy(item,i){
  637. let url = '{{url('apiLocal/workOrder/')}}'+'/'+item.id;
  638. if(!confirm('是否删除当前工单')) return ;
  639. window.tempTip.waitingTip('删除.........');
  640. window.axios.delete(url).then(res=>{
  641. if (res.data.success){
  642. this.$delete(this.workOrders,i);
  643. window.tempTip.cancelWaitingTip();
  644. window.tempTip.showSuccess('删除成功');
  645. }else {
  646. window.tempTip.cancelWaitingTip();
  647. window.tempTip.show(res.data.message ? res.data.message : '');
  648. }
  649. }).catch(err=>{
  650. window.tempTip.cancelWaitingTip();
  651. window.tempTip.show(err);
  652. })
  653. },
  654. pushImagesAndShow(e, images) {
  655. let map = [];
  656. for (let i = 0; i < e.target.files.length; i++) {
  657. let image = e.target.files[i];
  658. if (this.imageExist(image,images)) {
  659. map.push(image.name);
  660. continue;
  661. }
  662. let src = window.URL.createObjectURL(image);
  663. images.push({src: src, file: image});
  664. }
  665. e.target.value = '';
  666. if (map.length === 0)return ;
  667. window.tempTip.setIndex(1999);
  668. window.tempTip.show(map.join('\n,')+'图片重复');
  669. },
  670. spliceImage(i, images) {
  671. if (!confirm('是否取消选择该图片')) return;
  672. images.splice(i, 1);
  673. },
  674. imageExist(image,images) {
  675. let arr = images.filter(item => {
  676. return item.file.name === image.name;
  677. });
  678. return arr.length > 0;
  679. },
  680. showFillModel(item,index){
  681. this.workOrder.id = item.id;
  682. this.workOrder.index = index;
  683. this.workOrder.reissue_logistic_number = null; // 补发单号
  684. this.workOrder.logistic_number = null; // 补发单号
  685. this.workOrder.dealImages = []; // 交易图
  686. this.workOrder.refundImages = []; // 退款图
  687. $("#fill-loss-work-order-modal").modal('show');
  688. },
  689. updateLossWorkOrder(){
  690. let formData = new FormData();
  691. formData.append('id',this.workOrder.id);
  692. formData.append('reissue_logistic_number',this.workOrder.reissue_logistic_number);
  693. formData.append('logistic_number',this.workOrder.logistic_number);
  694. let dealImages = this.getImages(this.workOrder.dealImages);
  695. let refundImages = this.getImages(this.workOrder.refundImages);
  696. this.setFormDataImagePrefix(formData,'dealImages',dealImages);
  697. this.setFormDataImagePrefix(formData,'refundImages',refundImages);
  698. this.fillLossWorkOrder(formData);
  699. },
  700. setFormDataImagePrefix(formData, prefix, images) {
  701. images.forEach((item, i) => {
  702. formData.append(`${prefix}[]`, item);
  703. });
  704. },
  705. getImages(images) {
  706. return images.map((item) => {
  707. return item.file;
  708. })
  709. },
  710. fillLossWorkOrder(data){
  711. let url = "{{route('workOrder.lossApi')}}";
  712. window.tempTip.setIndex(1999);
  713. window.axios.post(url,data,{'Content-Type': 'multipart/form-data',}).then(res=>{
  714. if (res.data.success){
  715. this.sortOrder(res.data.data);
  716. this.$set(this.workOrders,this.workOrder.index,res.data.data);
  717. window.tempTip.showSuccess('工单信息填充成功');
  718. }else {
  719. window.tempTip.show(res.data.message);
  720. }
  721. }).catch(err=>{
  722. window.template.show(err);
  723. });
  724. },
  725. showEditLog(item,index,type){
  726. this.processLog.type = type;
  727. this.processLog.index = index;
  728. this.processLog.work_order_id = item.id;
  729. this.processLog.indemnity = null;
  730. this.processLog.is_indemnity = null;
  731. this.processLog.remark = null;
  732. $("#work-order-process-log-modal").modal('show');
  733. },
  734. storeLogisticProcessLog(){
  735. let url = "{{route('workOrderProcessLog.logisticLogApi')}}";
  736. let data = {
  737. 'indemnity':this.processLog.indemnity,
  738. 'work_order_id':this.processLog.work_order_id,
  739. 'is_indemnity':this.processLog.is_indemnity,
  740. 'remark':this.processLog.remark,
  741. };
  742. if(!this.verifiedProcessLog())return;
  743. window.tempTip.setDuration(9999);
  744. window.tempTip.setIndex(1999);
  745. window.tempTip.waitingTip('操作中请稍后');
  746. window.axios.post(url,data).then(res=>{
  747. window.tempTip.cancelWaitingTip();
  748. window.tempTip.setIndex(1999);
  749. window.tempTip.setDuration(2000);
  750. if (res.data.success){
  751. window.tempTip.showSuccess('创建成功');
  752. this.$set(this.workOrders[this.processLog.index],'logisticLog',res.data.data);
  753. } else{
  754. window.tempTip.show(res.data.message ? res.data.message : '创建异常,刷新页面重试');
  755. }
  756. }).catch(err=>{
  757. window.tempTip.setIndex(1999);
  758. window.tempTip.setDuration(2000);
  759. window.tempTip.show(err);
  760. });
  761. },
  762. storeProcessLog(){
  763. let url = "{{route('workOrderProcessLog.LogApi')}}";
  764. let data = {
  765. 'indemnity':this.processLog.indemnity,
  766. 'work_order_id':this.processLog.work_order_id,
  767. 'is_indemnity':this.processLog.is_indemnity,
  768. 'remark':this.processLog.remark,
  769. };
  770. if(!this.verifiedProcessLog())return;
  771. window.tempTip.setDuration(9999);
  772. window.tempTip.setIndex(1999);
  773. window.tempTip.waitingTip('操作中请稍后');
  774. window.axios.post(url,data).then(res=>{
  775. window.tempTip.cancelWaitingTip();
  776. window.tempTip.setDuration(2000);
  777. if (res.data.success){
  778. window.tempTip.showSuccess('创建成功');
  779. this.$set(this.workOrders[this.processLog.index],'processLog',res.data.data);
  780. } else{
  781. window.tempTip.show(res.data.message ? res.data.message : '创建异常,刷新页面重试');
  782. }
  783. }).catch(err=>{
  784. window.tempTip.setDuration(2000);
  785. window.tempTip.show(err);
  786. });
  787. },
  788. verifiedProcessLog(){ // 校验处理信息
  789. window.tempTip.setIndex(1999);
  790. window.tempTip.setDuration(2000);
  791. if(this.processLog.is_indemnity === null){
  792. window.tempTip.show('选择处理方式');
  793. return false;
  794. }
  795. if(this.processLog.is_indemnity === '1'){
  796. if (!this.processLog.indemnity ){
  797. window.tempTip.show('填写赔偿金额');
  798. return false;
  799. }
  800. }else if (this.processLog.is_indemnity === '2'){
  801. if (this.processLog.remark ===null || this.processLog.remark.trim(' ').length === 0){
  802. window.tempTip.show('填写不赔偿理由');
  803. return false;
  804. }
  805. }
  806. return true;
  807. }
  808. },
  809. });
  810. </script>
  811. @endsection