index.blade.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  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="interceptMessage()">拦截导出</button>
  19. </span>
  20. @endcan
  21. @can('订单管理-订单问题件生成')
  22. <span class="ml-1">
  23. <button type="button" class="btn btn-outline-primary btn-sm form-control-sm tooltipTarget"
  24. @click="modificationMessage()">信息修改导出</button>
  25. </span>
  26. @endcan
  27. </div>
  28. <div>
  29. <table class="table table-sm table-striped table-hover table-bordered td-min-width-80" id="table">
  30. <tbody class="">
  31. <template v-for="(item,i) in workOrders">
  32. <tr @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
  33. <td>
  34. <label><input type="checkbox" :value="item.id"></label>
  35. </td>
  36. <td class="text-center">
  37. <span>@{{ i+1 }}</span>
  38. <span v-if="item.order && item.order.issue" class="badge badge-primary">问题件</span>
  39. </td>
  40. <td class="text-center">
  41. <template v-if="item.status === '已处理'">
  42. <h5><span class="badge badge-secondary"
  43. style="opacity: 0.7">@{{ item.grad }}</span></h5>
  44. </template>
  45. <template v-else>
  46. <h5><span class="badge badge-light" style="opacity: 0.7"
  47. v-if="item.grad === '一般'">@{{ item.grad }}</span></h5>
  48. <h5><span class="badge badge-primary" style="opacity: 0.7"
  49. v-if="item.grad === '重要'">@{{ item.grad }}</span></h5>
  50. <h5><span class="badge badge-warning" style="opacity: 0.7"
  51. v-if="item.grad === '紧急'">@{{ item.grad }}</span></h5>
  52. <h5><span class="badge badge-danger" style="opacity: 0.7"
  53. v-if="item.grad === '重要且紧急'">@{{ item.grad }}</span></h5>
  54. </template>
  55. </td>
  56. <td>@{{item.type ? item.type.name : '' }}</td>
  57. <td>@{{item.order ? (item.order.logistic ? item.order.logistic.name : '') : '' }}</td>
  58. <td class="text-center">
  59. <template v-if="item.order">
  60. <template v-if="item.order.packages && item.order.packages.length === 1">
  61. <p>@{{ item.order.packages[0].logistic_number }}</p>
  62. </template>
  63. <template v-else-if="item.order.packages && item.order.packages.length > 0">
  64. <template v-if="selectOrder === item.order.id">
  65. <template v-for="(package,index) in item.order.packages">
  66. @{{ package.logistic_number }}
  67. </template>
  68. </template>
  69. <template v-else>
  70. <p>@{{ item.order.packages[0].logistic_number }}</p>
  71. </template>
  72. <button class="btn btn-sm btn-outline-primary"
  73. @click="selectOrder = item.order.id">
  74. 展开
  75. </button>
  76. <button class="btn btn-sm btn-outline-primary" @click="selectOrder = null">
  77. 收起
  78. </button>
  79. </template>
  80. </template>
  81. </td>
  82. <td class="text-center">@{{ item.remark }}</td>
  83. <td class="text-center">@{{ item.status }}</td>
  84. <td class="text-center">
  85. <template v-if="item.review_at">
  86. <div v-if="item.order && item.order.packages">
  87. <template v-for="package in item.order.packages">
  88. <template
  89. v-if="package.transfer_status && package.transfer_status.length > 0">
  90. <div v-if="selectOrderPackage === package.id">
  91. <template v-for="transfer in package.transfer_status">
  92. <p>@{{
  93. transfer['accept_time']+':'+transfer['accept_address']
  94. }}</p>
  95. </template>
  96. </div>
  97. <div v-else>
  98. @{{
  99. package.transfer_status[0]['accept_time']+':'+package.transfer_status[0]['accept_address']
  100. }}
  101. </div>
  102. <button class="btn btn-sm btn-outline-primary"
  103. v-if="selectOrderPackage !== package.id"
  104. @click="selectOrderPackage = package.id">展开
  105. </button>
  106. <button class="btn btn-sm btn-outline-primary" v-else
  107. @click="selectOrderPackage = null">收起
  108. </button>
  109. </template>
  110. </template>
  111. </div>
  112. </template>
  113. </td>
  114. <td class="text-center">@{{ item.creator.name }}</td>
  115. <td class="text-center">@{{ item.created_at }}</td>
  116. <td>@{{ item.reviewer ? item.reviewer.name : ''}}</td>
  117. <td>@{{ item.review_at }}</td>
  118. <td class="text-center">
  119. @can('订单管理-订单问题件生成')
  120. <template
  121. v-if="item.type && item.type.name === '订单拦截' && item.status !== '已处理' ">
  122. <button class="btn btn-sm btn-outline-primary"
  123. @click="createOrderIssue(item,true)"
  124. v-if="item.order && item.order.issue === null">
  125. 生成问题件
  126. </button>
  127. </template>
  128. @endcan
  129. @can('订单管理-工单处理-审核')
  130. <button class="btn btn-sm btn-outline-success" v-if="item.status !== '已处理'"
  131. @click="review(item,i)">
  132. 审核
  133. </button>
  134. @endcan
  135. </td>
  136. </tr>
  137. </template>
  138. </tbody>
  139. </table>
  140. {{ $workOrders->withQueryString()->links() }}
  141. </div>
  142. </div>
  143. </div>
  144. </div>
  145. @endsection()
  146. @section("lastScript")
  147. <script type="text/javascript" src="{{asset('js/queryForm/queryForm.js')}}"></script>
  148. <script type="text/javascript" src="{{asset('js/queryForm/header.js')}}"></script>
  149. <script>
  150. let list = new Vue({
  151. el: "#list",
  152. data: {
  153. workOrders: {!! $workOrders->toJson() !!}['data'],
  154. selectTr: null,
  155. form: null,
  156. logistics: [
  157. @foreach($logistics as $logistic)
  158. {
  159. name: {{$logistic->id}}, value: '{{$logistic->name}}'
  160. },
  161. @endforeach
  162. ],
  163. selectOrderPackage: null,
  164. selectOrder: null,
  165. },
  166. mounted() {
  167. console.log();
  168. let data = [[
  169. {name: 'created_at_start', type: 'time', tip: ['工单创建开始日期', '时间']},
  170. {name: 'created_at_end', type: 'time', tip: ['工单创建结束日期', '时间']},
  171. {
  172. name: 'logistic',
  173. type: 'select_multiple_select',
  174. data: this.logistics,
  175. tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的承运商'],
  176. placeholder: ['承运商', '定位或多选承运商']
  177. },
  178. ], [{name: 'review_at_start', type: 'time', tip: ['工单审核开始日期', '时间']},
  179. {name: 'review_at_end', type: 'time', tip: ['工单审核结束日期', '时间']},
  180. ]];
  181. this.form = new query({
  182. el: '#form_div',
  183. condition: data,
  184. });
  185. this.form.init();
  186. let column = [
  187. {name: 'no', value: '序号', neglect: true},
  188. {name: 'grad', value: '工单等级'},
  189. {name: 'type', value: '相关类型'},
  190. {name: 'logisticName', value: '承运商'},
  191. {name: 'logisticNumber', value: '快递单号'},
  192. {name: 'workOrderInfo', value: '问题描述'},
  193. {name: 'status', value: '状态', neglect: true},
  194. {name: 'Info', value: '物流跟踪信息', neglect: true},
  195. {name: 'creator', value: '创建人'},
  196. {name: 'submit_at', value: '提交时间'},
  197. {name: 'reviewer', value: '审核人'},
  198. {name: 'review_at', value: '审核时间'},
  199. {name: 'operation', value: '操作', neglect: true},
  200. ];
  201. new Header({
  202. el: "table",
  203. name: "area",
  204. column: column,
  205. data: this.workOrders,
  206. fixedTop: ($('#form_div').height()) + 2,
  207. }).init();
  208. $("#list").removeClass("d-none");
  209. },
  210. created() {
  211. let self = this;
  212. $.each(this.workOrders, function (index, workOrder) {
  213. if (!workOrder.order) return;
  214. if (!workOrder.order.packages) return;
  215. self.sortOrder(workOrder);
  216. });
  217. },
  218. methods: {
  219. sortOrder(workOrder) {
  220. let self = this;
  221. if (!workOrder.order) return;
  222. if (!workOrder.order.packages) return;
  223. $.each(workOrder.order.packages, function (i, item) {
  224. self.sortTransfer(item);
  225. })
  226. },
  227. sortTransfer(item) {
  228. if (!("transfer_status" in item)) return;
  229. if (item.transfer_status == null || !(item.transfer_status instanceof Array)) return;
  230. item.transfer_status.sort(function (item1, item2) {
  231. let date1 = new Date(item1['accept_time']);
  232. let date2 = new Date(item2['accept_time']);
  233. if (date1 - date2 > 0) return -1;
  234. if (date1 - date2 < 0) return 1;
  235. return 0;
  236. });
  237. },
  238. review(item, i) {
  239. let url = '{{url('apiLocal/workOrder/review')}}';
  240. let data = {id: item.id};
  241. window.axios.post(url, data).then(res => {
  242. if (res.data.success) {
  243. this.$set(this.workOrders, i, res.data.data);
  244. this.sortOrder(res.data.data);
  245. window.tempTip.showSuccess("审核完成");
  246. } else {
  247. window.tempTip.show(res.data.message ? res.data.message : '审核异常');
  248. }
  249. }).catch(err => {
  250. window.tempTip.show(err)
  251. })
  252. },
  253. createOrderIssue(item, tag) { // 生成问题件
  254. let url = '{{url('apiLocal/workOrder/createOrderIssue')}}';
  255. let data = {};
  256. let _this = this;
  257. if (tag) data.ids = [item.id];
  258. else data.ids = checkData;
  259. if (!confirm('是否生成对应的问题件')) return;
  260. window.axios.post(url, data).then(res => {
  261. if (res.data.success) {
  262. if (res.data.data) {
  263. $.each(res.data.data, (i, data) => {
  264. $.each(_this.workOrders, (index, item) => {
  265. if (item.id === data.id) {
  266. _this.$set(this.workOrders, index, data);
  267. }
  268. });
  269. });
  270. }
  271. this.$forceUpdate();
  272. window.tempTip.showSuccess('已生成对应的问题件');
  273. } else {
  274. window.tempTip.show(res.data.message ? res.data.message : '生成问题件异常');
  275. }
  276. }).catch(err => {
  277. window.tempTip.show(err)
  278. });
  279. },
  280. getMessageWorkOrder(){
  281. let selected = checkData;
  282. if (!selected){
  283. window.tempTip.show('未选中任何信息');
  284. return null;
  285. }
  286. return this.workOrders.filter((item) =>{
  287. return selected.includes(item.id+'');
  288. });
  289. },
  290. interceptMessage() {
  291. let selectItems = this.getMessageWorkOrder();
  292. if (selectItems === null )return ;
  293. let zto_and_sf = '';
  294. let rest_logistic = '';
  295. selectItems.forEach(item=>{
  296. // 中通、顺丰
  297. if (item.order.logistic.code.includes('SF') ||item.order.logistic.code.includes('ZTO') ){
  298. item.order.packages.forEach(node=>{
  299. zto_and_sf += node.logistic_number + '\n';
  300. });
  301. } else{
  302. let item_order_logistic_name = item.order.logistic.name;
  303. let item_order_adder = item.order.consignee_name + ' '
  304. + item.order.consignee_phone + ' '
  305. + item.order.province + ' ' + item.order.city + ' ' + item.order.district + ' ' + item.order.address;
  306. item.order.packages.forEach(node=>{
  307. rest_logistic += item_order_logistic_name +' ' + node.logistic_number + ' '+item_order_adder + '——拦截\n';
  308. });
  309. }
  310. });
  311. let text = zto_and_sf.trim('\n') + '——拦截' + '\n';
  312. text += rest_logistic;
  313. this.copyText(text);
  314. },
  315. modificationMessage(){
  316. let selectItems = this.getMessageWorkOrder();
  317. if (selectItems === null) return ;
  318. let zto = '';
  319. let sf = '';
  320. let rest_logistic = '';
  321. selectItems.forEach(item=>{
  322. let logistic_code = item.order.logistic.code;
  323. item.order.packages.forEach(node=> {
  324. if (logistic_code.includes('SF')) { // 顺丰订单
  325. sf += node.logistic_number +' 改信息: ' + item.remark + ',运费到付或月结'+'\n';
  326. } else if (logistic_code.includes('ZTO')){
  327. zto += node.logistic_number + ' 改信息' +item.remark+'\n';
  328. } else {
  329. }
  330. });
  331. });
  332. },
  333. copyText(text){
  334. let ele = document.querySelector('#copy_text');
  335. if (ele == null ){
  336. ele = document.createElement("textarea");
  337. ele.setAttribute('id','copy_text')
  338. ele.style.opacity=0;
  339. document.querySelector('body').append(ele);
  340. }
  341. try {
  342. $("#copy_text").text(text).select().focus();
  343. document.execCommand("Copy");
  344. tempTip.showSuccess('复制成功')
  345. } catch (e) {
  346. tempTip.showSuccess('复制失败:' + e)
  347. }
  348. }
  349. },
  350. });
  351. </script>
  352. @endsection