index.blade.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  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. </div>
  16. <div>
  17. <table class="table table-sm table-striped table-hover table-bordered td-min-width-80" id="table">
  18. <tbody class="">
  19. <template v-for="(item,i) in workOrders">
  20. <tr @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
  21. <td>
  22. <label><input type="checkbox" :value="item.id"></label>
  23. </td>
  24. <td class="text-center">
  25. <span>@{{ i+1 }}</span>
  26. <span v-if="item.order && item.order.issue" class="badge badge-primary">问题件</span>
  27. </td>
  28. <td class="text-center">
  29. <template v-if="item.status === '已处理'">
  30. <h5><span class="badge badge-secondary"
  31. style="opacity: 0.7">@{{ item.grad }}</span></h5>
  32. </template>
  33. <template v-else>
  34. <h5><span class="badge badge-light" style="opacity: 0.7"
  35. v-if="item.grad === '一般'">@{{ item.grad }}</span></h5>
  36. <h5><span class="badge badge-primary" style="opacity: 0.7"
  37. v-if="item.grad === '重要'">@{{ item.grad }}</span></h5>
  38. <h5><span class="badge badge-warning" style="opacity: 0.7"
  39. v-if="item.grad === '紧急'">@{{ item.grad }}</span></h5>
  40. <h5><span class="badge badge-danger" style="opacity: 0.7"
  41. v-if="item.grad === '重要且紧急'">@{{ item.grad }}</span></h5>
  42. </template>
  43. </td>
  44. <td>@{{item.type ? item.type.name : '' }}</td>
  45. <td class="text-center">@{{ item.status }}</td>
  46. <td class="text-center">@{{ item.creator.name }}</td>
  47. <td class="text-center">@{{ item.created_at }}</td>
  48. <td class="text-center">@{{ item.remark }}</td>
  49. <td class="text-center">
  50. <template v-if="item.order">
  51. <template v-if="item.order.packages && item.order.packages.length === 1">
  52. <p>@{{ item.order.packages[0].logistic_number }}</p>
  53. </template>
  54. <template v-else-if="item.order.packages && item.order.packages.length > 0">
  55. <template v-if="selectOrder === item.order.id">
  56. <template v-for="(package,index) in item.order.packages">
  57. @{{ package.logistic_number }}
  58. </template>
  59. </template>
  60. <template v-else>
  61. <p>@{{ item.order.packages[0].logistic_number }}</p>
  62. </template>
  63. <button class="btn btn-sm btn-outline-primary"
  64. @click="selectOrder = item.order.id">
  65. 展开
  66. </button>
  67. <button class="btn btn-sm btn-outline-primary" @click="selectOrder = null">
  68. 收起
  69. </button>
  70. </template>
  71. </template>
  72. </td>
  73. <td class="text-center">
  74. <template v-if="item.review_at">
  75. <div v-if="item.order && item.order.packages">
  76. <template v-for="package in item.order.packages">
  77. <template
  78. v-if="package.transfer_status && package.transfer_status.length > 0">
  79. <div v-if="selectOrderPackage === package.id">
  80. <template v-for="transfer in package.transfer_status">
  81. <p>@{{
  82. transfer['accept_time']+':'+transfer['accept_address']
  83. }}</p>
  84. </template>
  85. </div>
  86. <div v-else>
  87. @{{ package.transfer_status[0]['accept_time']+':'+package.transfer_status[0]['accept_address'] }}
  88. </div>
  89. <button class="btn btn-sm btn-outline-primary" v-if="selectOrderPackage !== package.id"
  90. @click="selectOrderPackage = package.id">展开
  91. </button>
  92. <button class="btn btn-sm btn-outline-primary" v-else
  93. @click="selectOrderPackage = null">收起
  94. </button>
  95. </template>
  96. </template>
  97. </div>
  98. </template>
  99. </td>
  100. <td>@{{ item.reviewer ? item.reviewer.name : ''}}</td>
  101. <td>@{{ item.review_at }}</td>
  102. <td class="text-center">
  103. @can('订单管理-订单问题件生成')
  104. <template v-if="item.type && item.type.name === '订单拦截' && item.status !== '已处理' ">
  105. <button class="btn btn-sm btn-outline-primary" @click="createOrderIssue(item,true)" v-if="item.order && item.order.issue === null">
  106. 生成问题件
  107. </button>
  108. </template>
  109. @endcan
  110. @can('订单管理-工单处理-审核')
  111. <button class="btn btn-sm btn-outline-success" v-if="item.status !== '已处理'" @click="review(item,i)">
  112. 审核
  113. </button>
  114. @endcan
  115. </td>
  116. </tr>
  117. </template>
  118. </tbody>
  119. </table>
  120. {{ $workOrders->withQueryString()->links() }}
  121. </div>
  122. </div>
  123. </div>
  124. </div>
  125. @endsection()
  126. @section("lastScript")
  127. <script type="text/javascript" src="{{asset('js/queryForm/queryForm.js')}}"></script>
  128. <script type="text/javascript" src="{{asset('js/queryForm/header.js')}}"></script>
  129. <script>
  130. let list = new Vue({
  131. el: "#list",
  132. data: {
  133. workOrders: {!! $workOrders->toJson() !!}['data'],
  134. selectTr: null,
  135. form: null,
  136. logistics: [
  137. @foreach($logistics as $logistic)
  138. {name:{{$logistic->id}}, value: '{{$logistic->name}}'},
  139. @endforeach
  140. ],
  141. selectOrderPackage: null,
  142. selectOrder: null,
  143. },
  144. mounted() {
  145. console.log();
  146. let data = [[
  147. {name: 'created_at_start', type: 'time', tip: ['工单创建开始日期', '时间']},
  148. {name: 'created_at_end', type: 'time', tip: ['工单创建结束日期', '时间']},
  149. {
  150. name: 'logistic',
  151. type: 'select_multiple_select',
  152. data:this.logistics,
  153. tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的承运商'],
  154. placeholder: ['承运商', '定位或多选承运商']
  155. },
  156. ], [{name: 'review_at_start', type: 'time', tip: ['工单审核开始日期', '时间']},
  157. {name: 'review_at_end', type: 'time', tip: ['工单审核结束日期', '时间']},
  158. ]];
  159. this.form = new query({
  160. el: '#form_div',
  161. condition: data,
  162. });
  163. this.form.init();
  164. let column = [
  165. {name: 'no', value: '序号', neglect: true},
  166. {name: 'grad', value: '工单等级'},
  167. {name: 'type', value: '相关类型'},
  168. {name: 'status', value: '状态', neglect: true},
  169. {name: 'creator', value: '创建人'},
  170. {name: 'submit_at', value: '提交时间'},
  171. {name: 'workOrderInfo', value: '问题描述'},
  172. {name: 'logisticNumber', value: '快递单号'},
  173. {name: 'Info', value: '物流跟踪信息', neglect: true},
  174. {name: 'reviewer', value: '审核人'},
  175. {name: 'review_at', value: '审核时间'},
  176. {name: 'operation', value: '操作', neglect: true},
  177. ];
  178. new Header({
  179. el: "table",
  180. name: "area",
  181. column: column,
  182. data: this.workOrders,
  183. fixedTop: ($('#form_div').height()) + 2,
  184. }).init();
  185. $("#list").removeClass("d-none");
  186. },
  187. created() {
  188. let self = this;
  189. $.each(this.workOrders, function (index, workOrder) {
  190. if (!workOrder.order) return;
  191. if (!workOrder.order.packages) return;
  192. self.sortOrder(workOrder);
  193. });
  194. },
  195. methods: {
  196. sortOrder(workOrder) {
  197. let self = this;
  198. if (!workOrder.order) return;
  199. if (!workOrder.order.packages) return;
  200. $.each(workOrder.order.packages, function (i, item) {
  201. self.sortTransfer(item);
  202. })
  203. },
  204. sortTransfer(item) {
  205. if (!("transfer_status" in item)) return;
  206. if (item.transfer_status == null || !(item.transfer_status instanceof Array)) return;
  207. item.transfer_status.sort(function (item1, item2) {
  208. let date1 = new Date(item1['accept_time']);
  209. let date2 = new Date(item2['accept_time']);
  210. if (date1 - date2 > 0) return -1;
  211. if (date1 - date2 < 0) return 1;
  212. return 0;
  213. });
  214. },
  215. review(item, i) {
  216. let url = '{{url('apiLocal/workOrder/review')}}';
  217. let data = {id: item.id};
  218. window.axios.post(url, data).then(res => {
  219. if (res.data.success) {
  220. this.$set(this.workOrders, i, res.data.data);
  221. this.sortOrder(res.data.data);
  222. window.tempTip.showSuccess("审核完成");
  223. } else {
  224. window.tempTip.show(res.data.message ? res.data.message : '审核异常');
  225. }
  226. }).catch(err => {
  227. window.tempTip.show(err)
  228. })
  229. },
  230. createOrderIssue(item, tag) { // 生成问题件
  231. let url = '{{url('apiLocal/workOrder/createOrderIssue')}}';
  232. let data = {};
  233. let _this = this;
  234. if (tag) data.ids = [item.id];
  235. else data.ids = checkData;
  236. if (!confirm('是否生成对应的问题件')) return;
  237. window.axios.post(url, data).then(res => {
  238. if (res.data.success) {
  239. if(res.data.data ){
  240. $.each(res.data.data,(i,data)=>{
  241. $.each(_this.workOrders,(index,item)=>{
  242. if (item.id === data.id){
  243. _this.$set(this.workOrders,index,data);
  244. }
  245. });
  246. });
  247. }
  248. this.$forceUpdate();
  249. window.tempTip.showSuccess('已生成对应的问题件');
  250. } else {
  251. window.tempTip.show(res.data.message ? res.data.message : '生成问题件异常');
  252. }
  253. }).catch(err => {
  254. window.tempTip.show(err)
  255. });
  256. },
  257. },
  258. });
  259. </script>
  260. @endsection