delivering.blade.php 102 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888
  1. @extends('layouts.app')
  2. @section('title')查询-订单管理@endsection
  3. @section('content')
  4. <div class="container-fluid">
  5. <div style="min-width: 4120px;">{{--4070--}}
  6. <div id="list" class="d-none">
  7. <div id="form_div"></div>
  8. <div class="ml-3 form-inline" id="btn">
  9. <div class="dropdown">
  10. <button type="button"
  11. class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
  12. data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
  13. 导出Excel
  14. </button>
  15. <div class="dropdown-menu">
  16. <a class="dropdown-item" @click="orderExport(false)" href="javascript:">导出勾选内容</a>
  17. <a class="dropdown-item" @click="orderExport(true)" href="javascript:">导出所有页</a>
  18. </div>
  19. </div>
  20. <div class="custom-control custom-checkbox ml-1">
  21. <input type="checkbox" class="custom-control-input" id="customCheck" name="is_merge"
  22. v-model="is_merge">
  23. <label class="custom-control-label" for="customCheck">导出是否格式化</label>
  24. </div>
  25. @can('订单管理-批量备注')
  26. <button @click="modal()" type="button" class="btn btn-sm ml-2 btn-outline-primary">批量备注追加
  27. </button>@endcan
  28. @can('订单管理-编辑')
  29. <span class="btn btn-sm btn-outline-dark tooltipTarget ml-1" @click="freezeAll"
  30. style="cursor: pointer" title="订单的冻结条件要只局限在“创建订单”,“分配完成”,“拣货完成”,“播种完成”">冻结</span>
  31. <button type="button" @click="thaw(null,true)"
  32. class="btn btn-sm btn-outline-danger tooltipTarget ml-1" title="解除已冻结订单"
  33. style="opacity: 0.7">解冻
  34. </button>
  35. <span class="btn btn-sm btn-outline-dark tooltipTarget ml-1" @click="deAllocationAll"
  36. style="cursor: pointer" title="订单的取消分配条件要只局限在“分配完成”或“部分分配”">取消分配</span>
  37. <span class="btn btn-sm btn-outline-primary tooltipTarget ml-1" @click="allocation()"
  38. style="cursor: pointer" title="仅能分配未分配订单">订单分配</span>
  39. <button type="button" @click="resetLogisticsGetMark()"
  40. class="btn btn-sm ml-1 btn-outline-success">重置快递获取标记
  41. </button>
  42. <button type="button" @click="resetInterfaceReturnMark()"
  43. class="btn btn-sm ml-1 btn-outline-secondary">重置接口回传标记
  44. </button>
  45. @endcan
  46. @can('订单管理-订单-生成问题件')
  47. <button @click="orderIssueTag()" type="button" class="btn btn-sm ml-1 btn-outline-primary">
  48. 标记问题件
  49. </button>
  50. @endcan
  51. @can('订单管理-订单-生成退货单')
  52. <button class="btn btn-sm btn-outline-dark ml-1" @click="isRejectedBillExist()"
  53. style="opacity: 0.7">生成退货单
  54. </button>
  55. @endcan
  56. <button class="btn btn-sm ml-1 btn-primary" @click="copyLogisticNumber()">复制快递单号</button>
  57. @can('订单管理-订单-生成工单')
  58. <button class="btn btn-sm ml-1 btn-outline-success" @click="checkWorkOrderOrCreateWorkOrder">生成工单</button>
  59. @endcan
  60. @can('订单管理-订单-一键回传')
  61. <button class="btn btn-sm ml-1 btn-success tooltipTarget"
  62. title="订单一键回传必须满足条件:订单状态为“分配完成,部分拣货,拣货完成,播种完成”;订单未冻结;订单有快递单号"
  63. @click="manualBack()">一键回传
  64. </button>
  65. @endcan
  66. {{-- @can('订单管理-订单-一键揽收')--}}
  67. <button class="btn btn-sm ml-1 btn-success tooltipTarget" title="目前仅中通可用,默认重量0.01kg,默认揽收不需要任何条件"
  68. @click="collectUpload()">一键揽收</button>
  69. {{-- @endcan--}}
  70. </div>
  71. <div class="modal fade " style="top: 20%" id="myModal" tabindex="-1" role="dialog"
  72. aria-labelledby="myModalLabel" aria-hidden="true">
  73. <div class="modal-dialog">
  74. <div class="modal-content">
  75. <div class="modal-header">
  76. <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;
  77. </button>
  78. </div>
  79. <div class="modal-body">
  80. <input class="form-control" v-model="content" placeholder="注释内容">
  81. </div>
  82. <div class="modal-footer">
  83. <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
  84. <button type="button" @click="batchComments()" class="btn btn-primary">批量备注追加</button>
  85. </div>
  86. </div><!-- /.modal-content -->
  87. </div><!-- /.modal -->
  88. </div>
  89. <table class="table table-striped table-bordered table-hover card-body td-min-width-80" id="table">
  90. <tr v-for="(order,i) in orders" @click="selectedColor(order.orderno)"
  91. :style="{'background-color': order.orderno==selectedStyle?'#aac7ea':''}">
  92. <td>
  93. <input class="checkItem" type="checkbox" :value="order.orderno">
  94. </td>
  95. <td class="text-nowrap">
  96. <span >@{{ i+1 }}</span>
  97. @can('订单管理-问题件')
  98. <a :href="'{{url("order/issue/index")}}'+'?orderCode='+order.orderno"
  99. target="order/issue/index?addtime=15">
  100. <span v-show="order.is_order_issue" class="badge badge-pill badge-danger">问题件</span>
  101. </a>
  102. @else
  103. <span v-show="order.is_order_issue" class="badge badge-pill badge-danger">问题件</span>
  104. @endcan
  105. <br v-show="order.is_order_issue">
  106. @can('订单管理-工单处理')
  107. <a :href="'{{url("order/workOrder/index")}}'+'?client_code='+order.soreference1" target="order/workOrder/index">
  108. <span v-show="order['is_work_order']" class="badge badge-pill badge-primary">工单</span>
  109. </a>
  110. @else
  111. <span v-show="order['is_work_order']" class="badge badge-pill badge-primary">工单</span>
  112. @endcan
  113. </td>
  114. <td class="text-dark font-weight-bold text-nowrap"><span>@{{ order.orderno }}</span></td>
  115. <td class="text-muted text-nowrap"><span>@{{ order.ordercodename }}</span></td>
  116. <td class="text-nowrap"><span>@{{ order.addtime }}</span></td>
  117. <td class="text-nowrap"><span>@{{ order.issuepartyname }}</span></td>
  118. <td class="text-nowrap"><span>@{{ order.customer_descr_c }}</span></td>
  119. <td class="text-nowrap"><span>@{{ order.soreference1 }}</span></td>
  120. <td class="text-muted text-nowrap"><span>@{{ order.carriername }}</span></td>
  121. <td class="text-nowrap">
  122. <div v-if="picktotraceidMap[order.orderno] && picktotraceidMap[order.orderno].length>1"
  123. class="text-center">
  124. <span v-for="(picktotraceid,key) in picktotraceidMap[order.orderno]"
  125. v-if="order.is_unfold">
  126. @{{ isDB(order.carriername) ? (order.code5+'#'+(key+1)) : picktotraceid }}<br>
  127. </span>
  128. <button class="btn btn-sm btn-outline-info"
  129. :style="order.is_unfold ? 'opacity:0.7' : ''" @click="isUnfold(order)">
  130. <span v-if="order.is_unfold" class="mt-1">收起</span>
  131. <span v-else>分箱 @{{ picktotraceidMap[order.orderno].length }} 件,展开单号</span>
  132. </button>
  133. </div>
  134. <span v-else v-text="(order.carriername !==null && order.carriername.includes('唯品顺丰')) ? order.code5 : order.soreference5"></span>
  135. </td>
  136. <td class="text-muted text-wrap text-letter">
  137. <div class="text-overflow-warp-200 warp-min-200"
  138. :class="order.is_encryption ? 'text-danger' : ''"><span
  139. v-if="order.is_encryption">*加密*</span><span v-else>@{{ order.c_contact }}</span>
  140. </div>
  141. </td>
  142. <td class="text-muted text-wrap text-letter">
  143. <div class="text-overflow-warp-200 warp-min-200"
  144. :class="order.is_encryption ? 'text-danger' : ''"><span
  145. v-if="order.is_encryption">*加密*</span><span v-else>@{{ order.c_tel2?order.c_tel2:order.c_tel1 }}</span>
  146. </div>
  147. </td>
  148. <td class="text-nowrap"><span> @{{ order.c_province }}</span></td>
  149. <td class="text-nowrap"><span> @{{ order.c_city }}</span></td>
  150. <td class="text-nowrap">
  151. <div class="text-overflow-warp-200 warp-min-200">@{{ order.c_district }}</div>
  152. </td>
  153. <td class="text-muted text-wrap text-letter">
  154. <div class="text-overflow-warp-200 warp-min-200"
  155. :class="order.is_encryption ? 'text-danger' : ''"><span
  156. v-if="order.is_encryption">*加密*</span><span v-else>@{{ order.c_address1 }}</span>
  157. </div>
  158. </td>
  159. <td class="text-nowrap"><span>@{{ order.waveno }}</span></td>
  160. <td class="text-nowrap"><span> @{{ order.warehouseid }}</span></td>
  161. <td class="text-nowrap"><span v-if="order.edisendflag2=='Y'">是</span><span
  162. v-if="order.edisendflag2=='N'">否</span><span v-if="order.edisendflag2=='W'">错误</span>
  163. </td>
  164. <td class="text-nowrap"><span>@{{ order.edisendtime2 }}</span></td>
  165. <td class="text-center" style="min-width: 900px">
  166. <div :class="commodities[order.orderno]&&commodities[order.orderno].length==1 ? '' : 'up'"
  167. :id="'order-'+i">
  168. <div v-for="oracleDOCOrderDetail in commodities[order.orderno]" class="row">
  169. <div class="col-2 border border-1">@{{ oracleDOCOrderDetail.sku }}</div>
  170. <div class="col-2 border border-1">@{{ oracleDOCOrderDetail.alternate_sku1 }}</div>
  171. <div class="col-2 border border-1" @dblclick.stop="replaceText(i)">
  172. <div class="w-100"
  173. :class="order.replaceText ? 'text-overflow-warp-100' : 'text-overflow-replace-100 cursor-pointer'">
  174. @{{ oracleDOCOrderDetail.descr_c }}
  175. </div>
  176. </div>
  177. <div class="col-1 border border-1">@{{ oracleDOCOrderDetail.qtyordered }}</div>
  178. <div class="col-2 border border-1">@{{ oracleDOCOrderDetail.lotnum }}</div>
  179. <div class="col-1 m-0 p-0 border border-1">@{{
  180. oracleDOCOrderDetail.orderdetailcodename }}
  181. </div>
  182. <div class="col-2 border border-1">@{{ oracleDOCOrderDetail.checktime }}</div>
  183. </div>
  184. </div>
  185. <div class="row text-center cursor-pointer"
  186. v-if="commodities[order.orderno]&&commodities[order.orderno].length>1">
  187. <b @click="unfold(i)" class="col-12 cursor-pointer" v-if="!upList[i]">共有 @{{
  188. commodities[order.orderno].length }} 件商品,点击展开</b>
  189. <b class="col-12" @click="unfold(i)" v-else>点击收起明细</b>
  190. </div>
  191. </td>
  192. <td><span>@{{ order.notes }}</span></td>
  193. <td><span>@{{ order.manualflag}}</span></td>
  194. <td><span>@{{ order.erpcancelflag }}</span></td>
  195. <td><span>@{{ order.picking_print_flag }}</span></td>
  196. <td><span>@{{ order.edisendflag }}</span></td>
  197. <td><span>@{{ order.ediremarks2}}</span></td>
  198. <td>
  199. @can('订单管理-编辑')
  200. <button v-if="order.releasestatus!=='H'" @click="freeze(order.orderno,order.waveno)"
  201. class="btn btn-sm btn-outline-dark text-nowrap"
  202. :disabled="!(order.ordercodename==='创建订单'||order.ordercodename==='分配完成'||order.ordercodename==='拣货完成'||order.ordercodename==='播种完成')">
  203. 冻结
  204. </button>
  205. <button v-else @click="thaw(order.orderno,false,order)"
  206. class="btn btn-sm btn-outline-danger text-nowrap"
  207. :disabled="!(order.ordercodename==='创建订单'||order.ordercodename==='分配完成'||order.ordercodename==='拣货完成'||order.ordercodename==='播种完成')">
  208. 解冻
  209. </button>
  210. @else
  211. <span>@{{ order.releasestatus }}</span>
  212. @endcan
  213. </td>
  214. <td>
  215. @can('订单管理-编辑')
  216. <button v-if="order.sostatus=='40'||'30'"
  217. @click="deAllocation(order.orderno,order.waveno)"
  218. class="btn btn-sm btn-outline-dark text-nowrap"
  219. :disabled="!(order.sostatus==='40'|| order.sostatus==='30')">取消分配
  220. </button>
  221. @else
  222. <span>@{{ order.sostatus }}</span>
  223. @endcan
  224. </td>
  225. </tr>
  226. </table>
  227. <button type="button" @click="pageUp()" :readonly="page>1?false:true" class="btn btn-sm "
  228. :class="page>1?'btn-outline-info':''">上一页
  229. </button>
  230. <button type="button" @click="pageDown()" :readonly="maxPage == 0 ? false : (page<maxPage?false:true)"
  231. class="btn btn-sm m-3"
  232. :class="maxPage == 0 ? 'btn-outline-info' : (page<maxPage?'btn-outline-info':'')">下一页
  233. </button>
  234. <input @keyup.enter="pageSkip($event)" class="form-control-sm ml-3 tooltipTarget" placeholder="此处输入页数"
  235. title="去往指定页">
  236. <span class="text-muted m-1">@{{ pagePlaceholder }}</span>
  237. <span class="text-muted m-1" v-if="maxPage != 0">共 @{{ sum }} 条</span>
  238. <div class="modal fade " id="checkModal" tabindex="-1" role="dialog" aria-labelledby="checkModalLabel"
  239. aria-hidden="true">
  240. <div class="modal-dialog modal-dialog-centered">
  241. <div class="modal-content">
  242. <div class="modal-header">
  243. <h5 class="modal-title" id="checkModalLabel">标记问题件提示</h5>
  244. <button type="button" class="close" data-dismiss="modal" aria-label="Close"
  245. @click="changeRemark">
  246. <span aria-hidden="true">&times;</span>
  247. </button>
  248. </div>
  249. <div class="modal-body">
  250. <div class="alert" id="alert-message">
  251. @{{ message.checkOrderIssueMessage }}
  252. </div>
  253. </div>
  254. <div class="modal-footer">
  255. <button type="button" class="btn btn-secondary" data-dismiss="modal"
  256. @click="message.checkOrderIssueMessage=''">关闭
  257. </button>
  258. </div>
  259. </div>
  260. </div>
  261. </div>
  262. <div class="modal fade " id="exampleModal" tabindex="-1" role="dialog"
  263. aria-labelledby="exampleModalLabel"
  264. aria-hidden="true">
  265. <div class="modal-dialog modal-dialog-centered modal-xl">
  266. <div class="modal-content">
  267. <div class="modal-header">
  268. <h5 class="modal-title" id="exampleModalLabel">输入问题件信息</h5>
  269. <button type="button" class="close" data-dismiss="modal" aria-label="Close"
  270. @click="changeRemark">
  271. <span aria-hidden="true">&times;</span>
  272. </button>
  273. </div>
  274. <div class="modal-body">
  275. <div class="form-group row m-0 p-0">
  276. <label class="col-md-1 col-sm-2 text-right">问题类别</label>
  277. <select name="order_issues_type_id" v-model="typeId" class="form-control col-4"
  278. id="orderIssueType" @focus="focusOnModal($event)">
  279. <option value></option>
  280. <option v-for="type in orderIssueType" :value="type.id">@{{ type.name }}
  281. </option>
  282. </select>
  283. <label class="col-md-1 col-sm-2 text-right">
  284. 快递
  285. </label>
  286. <div class="col-4">
  287. <textarea class="form-control m-0">@{{ tagOrder.logisticInfo }}</textarea>
  288. <button type="button" class="btn btn-sm btn-outline-primary"
  289. @click="copyLogisticInfo">复制
  290. </button>
  291. </div>
  292. </div>
  293. <div class="form-group row m-0">
  294. <label class="col-md-1 col-sm-2 text-right">情况说明</label>
  295. <label for="result_explain"></label>
  296. <textarea name="result_explain" v-model="result_explain" class="form-control col-4"
  297. id="result_explain"></textarea>
  298. <label class="col-md-1 col-sm-2 text-right">
  299. 商家
  300. </label>
  301. <div class="col-4">
  302. <textarea class="form-control m-0 row">@{{ tagOrder.merchantInfo }}</textarea>
  303. <button type="button" class="btn btn-sm btn-outline-primary"
  304. @click="copyMerchantInfo">复制
  305. </button>
  306. </div>
  307. </div>
  308. </div>
  309. <div class="modal-footer">
  310. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal"
  311. @click="changeRemark">关闭
  312. </button>
  313. <button type="button" class="btn btn-sm btn-primary" @click="orderIssueTagSubmit">提交
  314. </button>
  315. </div>
  316. </div>
  317. </div>
  318. </div>
  319. @can('订单管理-订单-生成工单')
  320. @include('order.index._work_order_modal')
  321. @include('order.index._work_order_info_modal')
  322. @endcan
  323. <textarea id="clipboardDiv" style="opacity:0"></textarea>
  324. </div>
  325. </div>
  326. </div>
  327. @endsection
  328. @section('lastScript')
  329. <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
  330. <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
  331. <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版2--}}
  332. <script>
  333. let vue = new Vue({
  334. el: "#list",
  335. data: {
  336. page: Number('{{$page}}'),
  337. paginate: Number('{{$request['paginate'] ?? 50}}'),
  338. maxPage: 1,
  339. sum: 0,
  340. owners: [
  341. @foreach($customers as $customer)
  342. {
  343. name: '{{$customer->code}}', value: '{{$customer->name}}'
  344. },
  345. @endforeach
  346. ],
  347. logistics: [
  348. @foreach($logistics as $logistic)
  349. {
  350. name: '{{$logistic->name}}', value: '{{$logistic->name}}'
  351. },
  352. @endforeach
  353. ],
  354. orders: {!! $orders !!},
  355. commodities: {!! $commodities !!},
  356. content: '',
  357. codes: [
  358. @foreach($codes as $code)
  359. {
  360. name: '{{$code->code}}', value: '{{$code->codename_c}}'
  361. },
  362. @endforeach
  363. ],
  364. selectedStyle: '',
  365. picktotraceidMap: {!! $picktotraceids !!},
  366. pagePlaceholder: "",
  367. typeId: '',
  368. result_explain: '',
  369. orderIssueType: {!! $orderIssueType !!},
  370. is_merge: false,
  371. message: {
  372. checkOrderIssueMessage: '',
  373. },
  374. tagOrders: [],
  375. tagOrder: {
  376. logisticInfo: '',
  377. merchantInfo: '',
  378. },
  379. upList: {},
  380. workOrder: {
  381. types: ['拦截', '快递异常', '信息更改', '错漏发', '破损','快递丢件'],
  382. orderIssueType: 0,
  383. grad: 1,
  384. remark: {
  385. name: null, // 联系人
  386. phone: null, // 联系号码
  387. province: null, // 省
  388. city: null, // 市
  389. district: null, // 区
  390. adder: null, // 详细地址
  391. info: null,
  392. },
  393. packageImages: [], // 外包装图片
  394. commodityImages: [], // 内物破损图片
  395. dealImages: [], // 交易截图
  396. commodities: [],
  397. logistic_number: null, // 快递单号
  398. price: null,
  399. },
  400. grads: [
  401. {name: '一般', value: '1'},
  402. {name: '重要', value: '2'},
  403. {name: '紧急', value: '3'},
  404. {name: '重要且紧急', value: '4'},
  405. ],
  406. exeSign: {},
  407. workOrderInfos:[],
  408. workOrderIndex:null,
  409. workOrderInfo:{
  410. id:'',
  411. type:'',
  412. clientCode:'',
  413. logistic_numbers:[],
  414. detail:{
  415. price:'',
  416. return_logistic_number:'',
  417. reissue_logistic_number:'',
  418. },
  419. commodities:[],
  420. packagesImages:[],
  421. commodityImages:[],
  422. dealImages:[],
  423. refundImages:[],
  424. remark:'',
  425. issue_name:'',
  426. },
  427. },
  428. mounted: function () {
  429. this.initData();
  430. $(".up").slideUp();
  431. $(".tooltipTarget").tooltip({'trigger': 'hover'});
  432. $("#list").removeClass('d-none');
  433. if (this.orders.length > 0) {
  434. this.maxPage = Math.ceil(this.orders[0].counted / this.paginate);
  435. this.sum = this.orders[0].counted;
  436. }
  437. if (this.getQueryVariable('alternate_sku1')) {
  438. this.maxPage = 0;
  439. this.pagePlaceholder = '当前页数:' + this.page;
  440. } else {
  441. this.pagePlaceholder = '当前页数:' + this.page + '/' + this.maxPage;
  442. }
  443. let data = [
  444. [{name: 'codename_c', type: 'select', placeholder: '订单状态', data: this.codes},
  445. {
  446. name: 'orderdate_start', type: 'time', tip: ['选择显示日期的起始时间', '选择显示日期的起始时间'],
  447. rules: {
  448. date_relevance: {
  449. date: ['orderdate_start', 'orderdate_end'],
  450. relevance: 'addtime',
  451. killing: 'relevance',
  452. default: [31, 92, 183, 366]
  453. }
  454. }
  455. },
  456. {name: 'orderno', type: 'input', tip: '可支持多SO号,糊模查找需要在左边打上%符号', placeholder: 'SO号'},
  457. {
  458. name: 'carriername',
  459. type: 'select_multiple_select',
  460. tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的承运人'],
  461. placeholder: ['承运人', '定位或多选承运人'],
  462. data: this.logistics
  463. },
  464. {
  465. name: ['notes', 'addtime'],
  466. type: 'input_select',
  467. tip: ['右侧选择查询范围,默认为一月内', '查询范围,范围越短搜索越快'],
  468. placeholder: ['备注', ''],
  469. data: [{name: '31', value: '近一月'}, {name: '92', value: '近三月'}, {
  470. name: '183',
  471. value: '近半年'
  472. }, {name: '366', value: '近一年'}, {name: '0', value: '不限'},],
  473. rules: {
  474. son: {
  475. addtime: {
  476. default: '31',
  477. required_without_all_if: ['orderdate_start', 'orderdate_end']
  478. }
  479. },
  480. date_relevance: {
  481. date: ['orderdate_start', 'orderdate_end'],
  482. relevance: 'addtime',
  483. killing: 'date',
  484. default: [31, 92, 183, 366]
  485. }
  486. }
  487. },
  488. {name: 'issuepartyname', type: 'input', tip: '糊模查找需要在左边打上%符号', placeholder: '店铺名称'},
  489. {
  490. name: 'edisendflag2',
  491. type: 'select',
  492. tip: '快递获取标记',
  493. placeholder: '快递获取标记',
  494. data: [{name: 'Y', value: '是'}, {name: 'N', value: '否'}, {name: 'W', value: '错误'},]
  495. },
  496. {
  497. name: 'edisendflag',
  498. type: 'select',
  499. tip: '接口回传标记',
  500. placeholder: '接口回传标记',
  501. data: [{name: 'Y', value: 'Y'}, {name: 'N', value: 'N'}, {
  502. name: 'W',
  503. value: 'W'
  504. }, {name: 'R', value: 'R'},]
  505. }
  506. ],
  507. [
  508. {name: 'codename_c_end', type: 'select', placeholder: '订单状态范围', data: this.codes},
  509. {
  510. name: 'orderdate_end', type: 'time', tip: ['选择显示指定日期的结束时间', '选择显示指定日期的结束时间'],
  511. rules: {
  512. date_relevance: {
  513. date: ['orderdate_start', 'orderdate_end'],
  514. relevance: 'addtime',
  515. killing: 'relevance',
  516. default: [31, 92, 183, 366]
  517. }
  518. }
  519. },
  520. {
  521. name: 'customerid', type: 'select_multiple_select', tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的客户'],
  522. placeholder: ['货主', '定位或多选货主'], data: this.owners
  523. },
  524. {name: 'soreference5', type: 'input', tip: '可支持多快递单号,糊模查找需要在左边打上%符号', placeholder: '多快递单号'},
  525. {
  526. name: 'soreference1',
  527. type: 'input',
  528. tip: '支持多客户订单号精确和模糊查找,糊模查找需要在右边打上%符号,多单号可用逗号或者空格分隔',
  529. placeholder: '客户订单号'
  530. },
  531. {name: 'waveno', type: 'input', tip: '可支持多波次编号,模糊查找需要在左边打上%的符号', placeholder: '波次编号'},
  532. {name: 'alternate_sku1', type: 'input', tip: '产品条码,模糊查找需要在左边打上%的符号', placeholder: '产品条码'},
  533. {name: 'c_contact', type: 'input', tip: '可支持多收货人名称:15天以内模糊搜索,15天以外精确搜索', placeholder: '收货人名称'},
  534. ],
  535. [
  536. {name: 'c_tel2', type: 'input', tip: '收货人电话:15天以内模糊搜索,15天以外精确搜索', placeholder: '收货人电话'},
  537. {name: 'c_province', type: 'input', tip: '省:15天以内模糊搜索,15天以外精确搜索', placeholder: '省'},
  538. {name: 'c_city', type: 'input', tip: '市:15天以内模糊搜索,15天以外精确搜索', placeholder: '市'},
  539. {name: 'c_district', type: 'input', tip: '区:15天以内模糊搜索,15天以外精确搜索', placeholder: '区'},
  540. {
  541. name: 'releasestatus',
  542. type: 'select',
  543. tip: '是否冻结冻结',
  544. placeholder: '是否冻结',
  545. data: [{name: 'H', value: '是'}, {name: '', value: '否'}]
  546. },
  547. {name: 'checktime_start', type: 'time', tip: ['选择显示复核时间的起始日期', "选择显示复核时间的起始时间"]},
  548. {name: 'checktime_end', type: 'time', tip: ['选择显示复核时间的结束日期', '选择显示复核时间的结束时间']},
  549. {
  550. name: 'is_display_all',
  551. type: 'checkbox',
  552. tip: '是否隐藏装箱完成以后的状态',
  553. data: [{name: 'ture', value: '隐藏完成状态'}]
  554. },
  555. ],
  556. [
  557. {
  558. name: 'restrict_time',
  559. type: 'select',
  560. tip: '查询限定时间范围',
  561. placeholder: '查询时间范围',
  562. data: [{name: '1', value: '一天内'}, {name: '7', value: '一周内'}, {
  563. name: "30",
  564. value: "一月内"
  565. }, {name: "90", value: "本季度"}]
  566. },
  567. {
  568. name: 'manualflag',
  569. type: 'select',
  570. tip: '是否人工回传',
  571. placeholder: '是否人工回传',
  572. data: [{name: 'Y', value: '是'}, {name: 'N', value: '否'}]
  573. },
  574. /*{name: 'delayedDeliver', type: 'input', tip: 'M:延时发货,填写整数,单位/时', placeholder: '历史延时发货'},*/
  575. {name: 'presentDelayed', type: 'input', tip: 'M:延时发货,填写整数,单位/时', placeholder: '延时发货'},
  576. ],
  577. ];
  578. this.form = new query({
  579. el: "#form_div",
  580. condition: data,
  581. appendDom: "btn",
  582. });
  583. this.form.init();
  584. let column = [
  585. {name: 'index', value: '序号', neglect: true},
  586. {name: 'orderno', value: '编号'},
  587. {name: 'ordercodename', value: '订单状态'},
  588. {name: 'addtime', value: '接口下发时间'},
  589. {name: 'issuepartyname', value: '店铺名称'},
  590. {name: 'customer_descr_c', value: '客户'},
  591. {name: 'soreference1', value: '客户订单号'},
  592. {name: 'carriername', value: '承运人'},
  593. {name: 'soreference5', value: '快递单号'},
  594. {name: 'c_contact', value: '收货人名称'},
  595. {name: 'c_tel2', value: '收货人电话'},
  596. {name: 'c_province', value: '省'},
  597. {name: 'c_city', value: '市'},
  598. {name: 'c_district', value: '区'},
  599. {name: 'c_address1', value: '收货人地址'},
  600. {name: 'waveno', value: '波次编号'},
  601. {name: 'warehouseid', value: '仓库'},
  602. {name: 'edisendflag2', value: '快递获取标记'},
  603. {name: 'edisendtime2', value: '快递获取时间'},
  604. {
  605. name: "commodity", type: "multi", title: "商品信息", rows: [
  606. {value: "商品编码", col: "2"},
  607. {value: "商品条码", col: "2"},
  608. {value: "商品名称", col: "2"},
  609. {value: "订单数量", col: "1"},
  610. {value: "批次号", col: "2"},
  611. {value: "明细状态", col: "1"},
  612. {value: "复核时间", col: "2"}
  613. ]
  614. },
  615. {name: 'notes', value: '备注'},
  616. {name: 'manualflag', value: '人工回传标记'},
  617. {name: 'erpcancelflag', value: '接口取消标记'},
  618. {name: 'picking_print_flag', value: '拣货单打印标记'},
  619. {name: 'edisendflag', value: '接口回传标记'},
  620. {name: 'ediremarks2', value: '接口回传异常备注'},
  621. {name: 'update', value: '订单冻结', neglect: true},
  622. {name: 'remove', value: '取消分配', neglect: true},
  623. ];
  624. new Header({
  625. el: "table",
  626. name: "order",
  627. column: column,
  628. data: this.orders,
  629. restorationColumn: 'addtime',
  630. fixedTop: ($('#form_div').height()) + ($('#btn').height()) + 1,
  631. }).init();
  632. },
  633. watch: {
  634. result_explain: function () {
  635. this.setLogisticInfo();
  636. this.setMerchantInfo();
  637. },
  638. 'workOrder.orderIssueType':function(newValue){
  639. if (newValue === null) return;
  640. if (['破损','错漏发','快递异常'].includes(newValue)){
  641. this.fillWorkOrderCommodity();
  642. }
  643. },
  644. },
  645. computed:{
  646. },
  647. methods: {
  648. initData() {
  649. this.orders.forEach((order) => {
  650. if (order.c_contact && order.c_contact.length > 50 && order.c_contact.substring(0, 3) === '~Ag') order.is_encryption = true;
  651. });
  652. let start = "{{$request["orderdate_start"] ?? ''}}";
  653. let end = "{{$request["orderdate_end"] ?? ''}}";
  654. let time = "{{$request["restrict_time"] ?? ''}}";
  655. if (time)this.changeURLParam("restrict_time", time);
  656. if (start)this.changeURLParam("orderdate_start", start);
  657. if (end)this.changeURLParam("orderdate_end", end);
  658. },
  659. changeURLParam(name, value) {
  660. let url = document.URL, resultUrl = ''
  661. let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')
  662. let r = window.location.search.substr(1).match(reg);
  663. let replaceText = name + '=' + value;
  664. if (r != null) {
  665. let tmp = url.replace(name + '=' + r[2], replaceText);
  666. resultUrl = (tmp);
  667. } else {
  668. if (url.match('[\?]')) {
  669. resultUrl = url + '&' + replaceText;
  670. } else {
  671. resultUrl = url + '?' + replaceText;
  672. }
  673. }
  674. history.replaceState(null, null, resultUrl)
  675. },
  676. getQueryVariable(variable) {
  677. let query = window.location.search.substring(1);
  678. let vars = query.split("&");
  679. for (let i = 0; i < vars.length; i++) {
  680. let pair = vars[i].split("=");
  681. if (pair[0] == variable) {
  682. return pair[1];
  683. }
  684. }
  685. return (false);
  686. },
  687. pageUp() {
  688. if (this.page <= 1) return;
  689. this.href(this.page - 1);
  690. },
  691. pageDown() {
  692. if (this.page >= this.maxPage && this.maxPage !== 0) return;
  693. this.href(this.page + 1);
  694. },
  695. pageSkip(e) {
  696. if (Number(e.target.value) <= 0 || Number(e.target.value) > this.maxPage) {
  697. tempTip.setDuration(2000);
  698. tempTip.show('页数不存在! ');
  699. return
  700. }
  701. this.href(e.target.value);
  702. },
  703. href(page) {
  704. let url = document.URL;
  705. if (url.indexOf('page=' + this.page) !== -1) {
  706. url = url.replace("page=" + this.page, "page=" + page);
  707. } else {
  708. if (url.indexOf('?') === -1) url += "?page=" + page;
  709. else url += "&page=" + page;
  710. }
  711. window.location.href = url;
  712. },
  713. unfold(index) {
  714. this.$set(this.upList, index, this.upList[index] ? !this.upList[index] : true);
  715. $("#order-" + index).slideToggle();
  716. },
  717. orderExport(checkAllSign) {
  718. let url = '{{url('order/index/export')}}';
  719. let token = '{{ csrf_token() }}';
  720. excelExport(checkAllSign, checkData, url, this.sum, token, {is_merge: this.is_merge});
  721. },
  722. modal() {
  723. $("#myModal").modal('show');
  724. },
  725. //批量冻结
  726. freezeAll: function () {
  727. let _this = this;
  728. if (checkData.length === 0) {
  729. tempTip.show('没有勾选记录');
  730. return
  731. }
  732. if (!confirm("确定要标记所有勾选内容为'冻结'吗")) {
  733. return;
  734. }
  735. axios.post('{{url('order/freezeAll')}}', {checkData: checkData}).then(function (response) {
  736. if (response.data.success) {
  737. _this.orders.forEach(function (order) {
  738. checkData.forEach(function (checkedId) {
  739. if (order.orderno === checkedId) {
  740. order.releasestatus = 'H';
  741. order.waveno = '*';
  742. }
  743. });
  744. });
  745. tempTip.setDuration(1000);
  746. tempTip.showSuccess('标记勾选内容为冻结成功');
  747. } else {
  748. tempTip.setDuration(2500);
  749. tempTip.show('标记勾选内容冻结失败,错误:' + response.data.fail_info);
  750. }
  751. }).catch(function (e) {
  752. tempTip.setDuration(2500);
  753. tempTip.show('标记勾选内容冻结失败,网络连接错误:' + e);
  754. })
  755. },
  756. //订单分配
  757. allocation() {
  758. if (this.exeSign.allocation) return;
  759. if (checkData.length === 0) {
  760. tempTip.show('没有勾选记录');
  761. return;
  762. }
  763. let arr = [];
  764. checkData.forEach(no => {
  765. this.orders.some(order => {
  766. if (order.orderno === no) {
  767. let obj = {
  768. "status": order.sostatus,
  769. "number": order.soreference5,
  770. "warehouse": order.warehouseid,
  771. "code": order.orderno,
  772. };
  773. arr.push(obj);
  774. return true;
  775. }
  776. });
  777. });
  778. window.tempTip.confirm("确定要分配这些订单吗?", () => {
  779. this.exeSign.allocation = true;
  780. axios.post("{{url('order/allocation')}}", {list: arr}).then((res) => {
  781. tempTip.setDuration(3000);
  782. this.exeSign.allocation = false;
  783. switch (res.data.status) {
  784. case "success":
  785. tempTip.showSuccess('订单分配成功');
  786. setTimeout(function () {
  787. window.location.reload();
  788. }, 3000);
  789. break;
  790. case "fail":
  791. tempTip.show(res.data.msg);
  792. break;
  793. default:
  794. tempTip.confirm(res.data.msg, function () {
  795. window.location.reload();
  796. });
  797. }
  798. }).catch((e) => {
  799. this.exeSign.allocation = false;
  800. tempTip.setDuration(2500);
  801. tempTip.show('分配失败,预期之外的错误:' + e);
  802. })
  803. })
  804. },
  805. //批量取消分配
  806. deAllocationAll() {
  807. let _this = this;
  808. if (checkData.length === 0) {
  809. tempTip.show('没有勾选记录');
  810. return
  811. }
  812. if (!confirm("确定要所有勾选内容'取消分配'吗")) {
  813. return;
  814. }
  815. axios.post('{{url('order/deAllocationAll')}}', {checkData: checkData}).then(function (response) {
  816. if (response.data.success) {
  817. _this.orders.forEach(function (order) {
  818. checkData.forEach(function (checkedId) {
  819. if (order.orderno === checkedId) {
  820. order.sostatus = '00';
  821. order.waveno = '*';
  822. }
  823. });
  824. });
  825. tempTip.setDuration(1000);
  826. tempTip.showSuccess('标记勾选内容取消分配成功');
  827. window.location.reload();
  828. } else {
  829. tempTip.setDuration(2500);
  830. tempTip.show('标记勾选内容取消分配失败,错误:' + response.data.fail_info);
  831. }
  832. }).catch(function (e) {
  833. tempTip.setDuration(2500);
  834. tempTip.show('标记勾选内容取消分配失败,网络连接错误:' + e);
  835. })
  836. },
  837. batchComments() {
  838. let _this = this;
  839. if (checkData.length < 1 || !this.content) {
  840. $("#myModal").modal('hide');
  841. tempTip.setDuration(3000);
  842. if (checkData.length < 1) tempTip.showSuccess('没有勾选任何记录');
  843. else tempTip.showSuccess('没有输入任何内容');
  844. return;
  845. }
  846. axios.post('{{url('order/create/batchComments')}}', {checkData: checkData, content: this.content})
  847. .then(function (response) {
  848. let sign = [];
  849. _this.orders.every(function (order) {
  850. if (sign.length === response.data.length) return false;
  851. response.data.every(function (data) {
  852. if (order.orderno === data.orderno) {
  853. order.notes = data.notes;
  854. sign.push(order.orderno);
  855. return false;
  856. }
  857. return true;
  858. });
  859. return true;
  860. });
  861. tempTip.setDuration(3000);
  862. tempTip.showSuccess('注释完毕!')
  863. _this.content = '';
  864. }).catch(function (err) {
  865. tempTip.setDuration(4000);
  866. tempTip.show('网络错误:' + err)
  867. });
  868. $("#myModal").modal('hide');
  869. },
  870. selectedColor(orderno) {
  871. if (orderno == this.selectedStyle) return;
  872. this.selectedStyle = orderno;
  873. },
  874. freeze(orderno, waveno) {
  875. if (!confirm('确定要冻结“' + orderno + '”吗?')) return;
  876. let _this = this;
  877. axios.post('{{url('order/freeze')}}', {orderno: orderno, waveno: waveno})
  878. .then(function (response) {
  879. if (response.data.success) {
  880. _this.orders.some(function (order) {
  881. if (order.orderno === orderno) {
  882. order.releasestatus = 'H';
  883. order.waveno = '*';
  884. return true;
  885. }
  886. });
  887. tempTip.setDuration(3000);
  888. tempTip.showSuccess('订单已被冻结!');
  889. }
  890. }).catch(function (err) {
  891. tempTip.setDuration(3000);
  892. tempTip.show('网络异常:' + err);
  893. });
  894. },
  895. thaw(orderno = null, is_batch = false, order = null) {
  896. if (!orderno) orderno = checkData;
  897. if (!confirm('确定要解冻“' + orderno + '”吗?')) return;
  898. let _this = this;
  899. axios.post('{{url('order/thaw')}}', {orderno: orderno})
  900. .then(function (response) {
  901. if (response.data.success) {
  902. if (is_batch) {
  903. orderno.forEach(order_no => {
  904. _this.orders.some(function (order) {
  905. if (order.orderno === order_no) {
  906. order.releasestatus = 'N';
  907. return true;
  908. }
  909. });
  910. });
  911. } else {
  912. order.releasestatus = 'N';
  913. }
  914. tempTip.setDuration(3000);
  915. tempTip.showSuccess('订单已成功解冻!');
  916. }
  917. }).catch(function (err) {
  918. tempTip.setDuration(3000);
  919. tempTip.show('网络异常:' + err);
  920. });
  921. },
  922. deAllocation(orderno, waveno) {
  923. if (!confirm('确定要取消分配“' + orderno + '”吗?')) return;
  924. let _this = this;
  925. axios.post('{{url('order/deAllocation')}}', {orderno: orderno, waveno: waveno})
  926. .then(function (response) {
  927. if (response.data.success) {
  928. _this.orders.some(function (order) {
  929. if (order.orderno === orderno) {
  930. order.sostatus = '00';
  931. order.waveno = '*';
  932. return true;
  933. }
  934. });
  935. tempTip.setDuration(3000);
  936. tempTip.showSuccess('订单已被取消分配!');
  937. window.location.reload();
  938. }
  939. }).catch(function (err) {
  940. tempTip.setDuration(3000);
  941. tempTip.show('网络异常:' + err);
  942. });
  943. },
  944. isUnfold(order) {
  945. if (!order.is_unfold) {
  946. this.$set(order, 'is_unfold', true);
  947. return;
  948. }
  949. order.is_unfold = false;
  950. },
  951. orderIssueTag() {
  952. if (checkData.length === 0) {
  953. tempTip.setDuration(2000);
  954. tempTip.show('没有勾选记录');
  955. return;
  956. }
  957. this.isExistByOrderNos();
  958. },
  959. orderIssueTagSubmit() {
  960. if (this.typeId === '') {
  961. $("#orderIssueType").addClass('is-invalid');
  962. return;
  963. } else {
  964. $("#result_explain #result_explain").removeClass('is-invalid');
  965. $("#exampleModal").modal('hide');
  966. }
  967. let _this = this;
  968. tempTip.setDuration(1999);
  969. tempTip.waitingTip('处理中,请稍候');
  970. let data = {orderNos: checkData, typeId: this.typeId, result_explain: this.result_explain};
  971. axios.post("{{url('apiLocal/order/issue/orderIssueTag')}}", data).then(function (res) {
  972. tempTip.setDuration(5000);
  973. tempTip.cancelWaitingTip();
  974. if (res.data.success) {
  975. tempTip.setDuration(3000);
  976. tempTip.showSuccess('已标记为问题件');
  977. _this.orders.forEach(item => {
  978. if (checkData.includes(item.orderno)) item.is_order_issue = true;
  979. });
  980. } else {
  981. if (res.data.exitsOrderNos) {
  982. _this.message.checkOrderIssueMessage = res.data.fail_info + res.data.exitsOrderNos;
  983. $("#checkModal").modal('show');
  984. } else {
  985. tempTip.setDuration(3000);
  986. tempTip.show(res.data.fail_info);
  987. }
  988. }
  989. }).catch(function (err) {
  990. tempTip.setDuration(3000);
  991. tempTip.cancelWaitingTip();
  992. tempTip.show('网络链接异常' + err);
  993. })
  994. },
  995. //重置快递获取标记
  996. resetLogisticsGetMark() {
  997. if (checkData.length < 1) {
  998. tempTip.setDuration(3000);
  999. tempTip.showSuccess('未选择任何单号');
  1000. return
  1001. }
  1002. if (!confirm('确定要重置这些单的快递获取标记吗?')) return;
  1003. let url = '{{url('order/resetLogisticsGetMark')}}';
  1004. let _this = this;
  1005. axios.post(url, {orderno: checkData})
  1006. .then(function (response) {
  1007. if (response.data.success) {
  1008. checkData.forEach(orderno => {
  1009. _this.orders.some(order => {
  1010. if (order.orderno === orderno && order.edisendflag2 === 'W') {
  1011. order.edisendflag2 = "N";
  1012. return true;
  1013. }
  1014. });
  1015. });
  1016. tempTip.setDuration(2000);
  1017. tempTip.showSuccess('重置快递获取标记成功!');
  1018. } else {
  1019. tempTip.setDuration(3000);
  1020. tempTip.show(response.data.data);
  1021. }
  1022. }).catch(function (err) {
  1023. tempTip.setDuration(3000);
  1024. tempTip.show("网络错误:" + err)
  1025. })
  1026. },
  1027. resetInterfaceReturnMark() {
  1028. if (checkData.length < 1) {
  1029. tempTip.setDuration(3000);
  1030. tempTip.showSuccess('未选择任何单号');
  1031. return
  1032. }
  1033. if (!confirm('确定要重置接口回传标记吗?')) return;
  1034. let url = '{{url('order/resetInterfaceReturnMark')}}';
  1035. let _this = this;
  1036. axios.post(url, {orderno: checkData}).then(function (response) {
  1037. if (response.data.success) {
  1038. checkData.forEach(orderno => {
  1039. _this.orders.some(order => {
  1040. if (order.orderno === orderno) {
  1041. order.edisendflag = "N";
  1042. return true;
  1043. }
  1044. });
  1045. });
  1046. tempTip.setDuration(2000);
  1047. tempTip.showSuccess('重置接口回传标记成功!');
  1048. } else {
  1049. tempTip.setDuration(5000);
  1050. tempTip.show(response.data.fail_info);
  1051. }
  1052. }).catch(function (err) {
  1053. tempTip.setDuration(3000);
  1054. tempTip.show("网络错误:" + err)
  1055. });
  1056. },
  1057. changeRemark() {
  1058. this.typeId = '';
  1059. this.result_explain = '';
  1060. },
  1061. focusOnModal(e) {
  1062. $(e.target).removeClass('is-invalid');
  1063. },
  1064. isRejectedBillExist() {
  1065. if (checkData.length === 0) {
  1066. tempTip.show('没有勾选记录');
  1067. return
  1068. }
  1069. tempTip.confirm("是否要生成“" + checkData + "”的退货单?", () => {
  1070. let _this = this;
  1071. let arr = [];
  1072. window.tempTip.setDuration(9999);
  1073. window.tempTip.waitingTip("生成中,请稍等......")
  1074. this.orders.forEach(order => {
  1075. if (checkData.includes(order.orderno)) arr.push(order.soreference1);
  1076. });
  1077. axios.post('{{url('order/isRejectedBillExist')}}', {data: arr})
  1078. .then(function (response) {
  1079. if (!response.data.success) {
  1080. tempTip.confirm(response.data.data + ',已存在,是否仍要生成退货单?', function () {
  1081. _this.createRejectedBill();
  1082. window.tempTip.cancelWaitingTip();
  1083. }, function () {
  1084. window.tempTip.cancelWaitingTip();
  1085. });
  1086. return;
  1087. }
  1088. _this.createRejectedBill();
  1089. }).catch(function (error) {
  1090. tempTip.setDuration(3000);
  1091. tempTip.cancelWaitingTip();
  1092. tempTip.show('网络错误:' + error);
  1093. });
  1094. });
  1095. },
  1096. createRejectedBill() {
  1097. let url = '{{url('order/createRejectedBill')}}';
  1098. axios.post(url, {data: checkData})
  1099. .then(res => {
  1100. if (res.data.success) {
  1101. tempTip.cancelWaitingTip();
  1102. tempTip.setDuration(2000);
  1103. tempTip.showSuccess("生成退货单成功!");
  1104. } else {
  1105. tempTip.cancelWaitingTip();
  1106. tempTip.setDuration(3000);
  1107. tempTip.show(res.data.data);
  1108. }
  1109. })
  1110. .catch(err => {
  1111. tempTip.cancelWaitingTip();
  1112. tempTip.setDuration(3000);
  1113. tempTip.show('网络错误:' + err);
  1114. });
  1115. },
  1116. isExistByOrderNos() {
  1117. let orderNos = checkData;
  1118. let data = {orderNos: orderNos};
  1119. let _this = this;
  1120. axios.post("{{url('apiLocal/order/issue/isExistByOrderNo')}}", data).then(function (res) {
  1121. if (res.data.success) {
  1122. _this.getTagOrder(orderNos);
  1123. $("#exampleModal").modal('show')
  1124. } else {
  1125. _this.message.checkOrderIssueMessage = res.data.fail_info
  1126. $("#checkModal").modal('show')
  1127. }
  1128. }).catch(function (error) {
  1129. tempTip.setDuration(3000)
  1130. tempTip.show('网络异常:' + error)
  1131. })
  1132. },
  1133. replaceText(index) {
  1134. this.$set(this.orders[index], "replaceText", true);
  1135. },
  1136. getTagOrder(orderNos) {
  1137. this.tagOrders = [];
  1138. if (orderNos.length === 0) {
  1139. this.tagOrders = [];
  1140. return;
  1141. }
  1142. if (this.orders.length === 0) {
  1143. this.tagOrders = [];
  1144. return;
  1145. }
  1146. for (let i = 0; i < this.orders.length; i++) {
  1147. let order = this.orders[i];
  1148. let orderno = order.orderno;
  1149. if (orderNos.includes(orderno)) {
  1150. this.tagOrders.push(this.orders[i])
  1151. }
  1152. }
  1153. this.setLogisticInfo();
  1154. this.setMerchantInfo();
  1155. },
  1156. setLogisticInfo() {
  1157. let content = ''
  1158. let _this = this
  1159. this.tagOrders.forEach(order => {
  1160. content += _this.getOrderLogisticNumbers(order);
  1161. let tel = order.c_tel2 ? order.c_tel2 : order.c_tel1;
  1162. content += ' ' + order.c_contact + tel + order.c_province + order.c_city + ' ' + order.c_district + order.c_address1 + '\n' + _this.result_explain + "\n"
  1163. })
  1164. this.tagOrder.logisticInfo = content
  1165. },
  1166. setMerchantInfo() {
  1167. let content = ''
  1168. let _this = this
  1169. this.tagOrders.forEach(order => {
  1170. content += order.issuepartyname + ' ' + order.customer_descr_c + ' ' + order.soreference1 + ' ' + _this.getOrderLogisticNumbers(order)
  1171. content += '\n' + _this.result_explain + "\n"
  1172. })
  1173. this.tagOrder.merchantInfo = content
  1174. },
  1175. copyLogisticInfo() {
  1176. this.copyText(this.tagOrder.logisticInfo)
  1177. },
  1178. copyLogisticNumber() {
  1179. let text = "";
  1180. checkData.forEach((code, i) => {
  1181. if (this.picktotraceidMap[code] && this.picktotraceidMap[code].length > 1) {
  1182. this.picktotraceidMap[code].forEach((number, j) => {
  1183. text += number + "\r\n";
  1184. });
  1185. } else {
  1186. this.orders.some(order => {
  1187. if (order.orderno == code) {
  1188. if (order.soreference5) {
  1189. text += order.soreference5 + "\r\n";
  1190. }
  1191. return true;
  1192. }
  1193. });
  1194. }
  1195. });
  1196. text.substring(0, text.lastIndexOf("\r\n", text));
  1197. if (!text) text = " ";
  1198. this.copyText(text)
  1199. },
  1200. copyMerchantInfo() {
  1201. this.copyText(this.tagOrder.merchantInfo)
  1202. },
  1203. copyText(text) {
  1204. try {
  1205. $('#clipboardDiv').text(text).select().focus();
  1206. document.execCommand("Copy");
  1207. tempTip.setIndex(1052)
  1208. tempTip.setDuration(2000)
  1209. tempTip.showSuccess('复制成功')
  1210. } catch (e) {
  1211. tempTip.setIndex(1052)
  1212. tempTip.setDuration(2000)
  1213. tempTip.showSuccess('复制失败:' + e)
  1214. }
  1215. },
  1216. getOrderLogisticNumbers(order) {
  1217. let char = '';
  1218. let picktotraceids = this.picktotraceidMap[order.orderno];
  1219. if ($.type(picktotraceids) === 'array') {
  1220. picktotraceids.forEach(function (picktotraceid, index, array) {
  1221. if (array.length === index + 1) char += picktotraceid;
  1222. else char += picktotraceid + ','
  1223. });
  1224. } else {
  1225. char += order.soreference5
  1226. }
  1227. return char;
  1228. },
  1229. checkWorkOrderOrCreateWorkOrder(){
  1230. window.tempTip.setIndex(1999);
  1231. window.tempTip.waitingTip('校验是否有对应工单');
  1232. this.checkWorkOrder().then(res=>{
  1233. window.tempTip.cancelWaitingTip();
  1234. if (res) {
  1235. window.tempTip.confirm('当前勾选订单已有工单是否查看',()=>{
  1236. this.workOrderInfo = this.workOrderInfos[0];
  1237. this.workOrderIndex = 0;
  1238. $('#work-order-info').modal('show');
  1239. },()=>{
  1240. this.showInterceptModel();
  1241. },'查看','重新生成工单');
  1242. } else {
  1243. this.showInterceptModel();
  1244. }
  1245. }).catch(err=>{
  1246. window.tempTip.cancelWaitingTip();
  1247. })
  1248. },
  1249. showCreateWorkOrder(){
  1250. $("#work-order-info").modal('hide');
  1251. $("#intercept-modal").modal('show');
  1252. },
  1253. showInterceptModel() {
  1254. this.workOrder.grad = 1;
  1255. if (checkData.length < 1) {
  1256. window.tempTip.setDuration(1500);
  1257. window.tempTip.show('未选中任何订单');
  1258. return;
  1259. }
  1260. this.workOrder.orderIssueType = null;
  1261. this.workOrder.price = null;
  1262. this.workOrder.refundImages = [];
  1263. this.workOrder.packageImages = [];
  1264. this.workOrder.commodityImages = [];
  1265. this.workOrder.dealImages = [];
  1266. this.workOrder.remark.info = '';
  1267. this.workOrder.commodities = [];
  1268. this.workOrder.logistic_number = null;
  1269. $("#intercept-modal").modal('show');
  1270. },
  1271. checkOrderIssue(name) { //
  1272. let types = this.orderIssueType.filter(item => {
  1273. return item.name === name;
  1274. });
  1275. if (types.length === 0) return false;
  1276. return this.workOrder.orderIssueType === types[0].id
  1277. },
  1278. pushImagesAndShow(e, images) {
  1279. let map = [];
  1280. for (let i = 0; i < e.target.files.length; i++) {
  1281. let image = e.target.files[i];
  1282. if (this.imageExist(image,images)) {
  1283. map.push(image.name);
  1284. continue;
  1285. }
  1286. let src = window.URL.createObjectURL(image);
  1287. images.push({src: src, file: image});
  1288. }
  1289. e.target.value = '';
  1290. if (map.length === 0)return ;
  1291. window.tempTip.setIndex(1999);
  1292. window.tempTip.show(map.join('\n,')+'图片重复');
  1293. },
  1294. imageExist(image,images) {
  1295. let arr = images.filter(item => {
  1296. return item.file.name === image.name;
  1297. });
  1298. return arr.length > 0;
  1299. },
  1300. spliceImage(i, images) {
  1301. if (!confirm('是否取消选择该图片')) return;
  1302. images.splice(i, 1);
  1303. },
  1304. buildWorkOrder() { // 生成工单
  1305. if (['信息更改', '错漏发', '破损','拦截'].includes(this.workOrder.orderIssueType) && checkData.length !== 1) {
  1306. window.tempTip.show('该类型不能批量操作');
  1307. return;
  1308. }
  1309. if ('拦截' === this.workOrder.orderIssueType) {
  1310. this.createInterceptWorkOrder();
  1311. } else if ('信息更改' === this.workOrder.orderIssueType) {
  1312. this.createInformationChangeWorkOrder();
  1313. } else if ('快递丢件' === this.workOrder.orderIssueType) {
  1314. this.createLossWorkOrder();
  1315. } else if ('快递异常' === this.workOrder.orderIssueType) {
  1316. this.createExpressAbnormalWorkOrder();
  1317. } else if ('错漏发' === this.workOrder.orderIssueType) {
  1318. this.createMistakeWorkOrder();
  1319. } else if ('破损' === this.workOrder.orderIssueType) {
  1320. this.createDamagedWorkOrder();
  1321. } else {
  1322. this.createDefaultWorkOrder();
  1323. }
  1324. },
  1325. createInterceptWorkOrder() { // 拦截
  1326. let formData = new FormData();
  1327. formData.append('orderNos',checkData[0]);
  1328. formData.append('remark',this.workOrder ? (this.workOrder.remark ? this.workOrder.remark.info : '') : '');
  1329. let url = "{{route('workOrder.intercept.storeApi')}}";
  1330. this.createWorkOrder(formData,url);
  1331. },
  1332. createInformationChangeWorkOrder() { // 信息修改
  1333. let data = this.getCreateWorkOrderData();
  1334. if (data.length > 1){
  1335. window.tempTip.setIndex(1999);
  1336. window.tempTip.show('信息修改仅支持单个订单修改');
  1337. }
  1338. let url = "{{route('workOrder.informationChange.storeApi')}}";
  1339. this.createWorkOrder(data[0],url);
  1340. },
  1341. createLossWorkOrder(){ // 快递丢件
  1342. let data = this.getCreateWorkOrderData();
  1343. let formData = new FormData();
  1344. formData.append('order_no', data[0]['order_no']);
  1345. formData.append('remark', this.workOrder.remark.info);
  1346. let url = "{{route('workOrder.loss.storeApi')}}";
  1347. this.createWorkOrder(formData,url);
  1348. },
  1349. createExpressAbnormalWorkOrder(){ // 快递异常
  1350. if (!this.checkExpressAbnormalWorkOrder()) return;
  1351. let data = this.getCreateWorkOrderData();
  1352. let formData = new FormData();
  1353. formData.append('order_no', data[0]['order_no']);
  1354. formData.append('remark', this.workOrder.remark ? this.workOrder.remark.info : '');
  1355. let dealImages = this.getImages(this.workOrder.dealImages);
  1356. this.setFormDataImagePrefix(formData, 'dealImages', dealImages);
  1357. this.setFormDataCommodities(formData);
  1358. let url = "{{route('workOrder.expressAbnormal.storeApi')}}";
  1359. this.createWorkOrder(formData, url);
  1360. },
  1361. createMistakeWorkOrder() { // 错漏发
  1362. let data = this.getCreateWorkOrderData();
  1363. let formData = new FormData();
  1364. formData.append('order_no', data[0]['order_no']);
  1365. formData.append('remark', data[0]['remark']);
  1366. formData.append('logistic_number', data[0]['logistic_number']);
  1367. let dealImages = this.getImages(this.workOrder.dealImages);
  1368. this.setFormDataImagePrefix(formData, 'dealImages', dealImages);
  1369. this.setFormDataCommodities(formData);
  1370. let url = "{{route('workOrder.mistake.storeApi')}}";
  1371. this.createWorkOrder(formData, url);
  1372. },
  1373. createDefaultWorkOrder() { // 其他
  1374. let data = this.getCreateWorkOrderData();
  1375. this.createWorkOrder(data);
  1376. },
  1377. createDamagedWorkOrder() { //破损工单创建
  1378. let packageImages = this.getImages(this.workOrder.packageImages); // 外包装破损图片
  1379. let commodityImages = this.getImages(this.workOrder.commodityImages); // 内物破损图片
  1380. let dealImages = this.getImages(this.workOrder.dealImages); // 交易截图
  1381. if (!this.checkDamagedWorkOrder(packageImages,commodityImages,dealImages)) return;
  1382. let formData = this.getDamagedFormData(packageImages,commodityImages,dealImages);
  1383. let url = "{{route('workOrder.damage.storeApi')}}";
  1384. this.createWorkOrder(formData, url);
  1385. },
  1386. checkWorkOrderImage(packageImages,commodityImages,dealImages) {
  1387. let message = null;
  1388. if (0 === packageImages.length) {
  1389. message = '请选择外包图片';
  1390. } else if (0 === commodityImages.length) {
  1391. message = '请选择内物装破损图片';
  1392. } else if (0 === dealImages.length) {
  1393. message = '请选择交易截图'
  1394. }
  1395. return message;
  1396. },
  1397. getDamagedFormData(packageImages,commodityImages,dealImages){
  1398. let formData = new FormData();
  1399. let data = this.getCreateWorkOrderData();
  1400. formData.append('order_no', data[0]['order_no']);
  1401. formData.append('remark', data[0]['remark']);
  1402. formData.append('logistic_number', data[0]['logistic_number']);
  1403. formData.append('price', this.workOrder.price);
  1404. this.setFormDataImagePrefix(formData,'packageImages',packageImages);
  1405. this.setFormDataImagePrefix(formData,'commodityImages',commodityImages);
  1406. this.setFormDataImagePrefix(formData,'dealImages',dealImages);
  1407. this.setFormDataCommodities(formData);
  1408. return formData;
  1409. },
  1410. setFormDataCommodities(formData){
  1411. this.workOrder.commodities.map(commodity=>{
  1412. let item = {
  1413. sku:commodity.sku,
  1414. amount:commodity.amount,
  1415. commodity_id:commodity['commodity_id'],
  1416. logistic_number:commodity['logistic_number'],
  1417. abnormal_amount:commodity['abnormal_amount'],
  1418. abnormal_type:commodity['abnormal_type'],
  1419. price:commodity['price'],
  1420. };
  1421. formData.append('commodities[]',JSON.stringify(item)) ;
  1422. });
  1423. },
  1424. setFormDataImagePrefix(formData, prefix, images) {
  1425. images.forEach((item) => {
  1426. formData.append(`${prefix}[]`, item);
  1427. });
  1428. },
  1429. getImages(images) {
  1430. return images.map((item) => {
  1431. return item.file;
  1432. })
  1433. },
  1434. checkDamagedWorkOrder(packageImages,commodityImages,dealImages){
  1435. let message = null;
  1436. if (!this.checkPrice()){
  1437. message = '商品价值需大于0';
  1438. }
  1439. if (!message){
  1440. message = this.checkWorkOrderImage(packageImages,commodityImages,dealImages);
  1441. }
  1442. let filter = this.workOrder.commodities.filter(e=>{
  1443. return Number(e.price) <=0 || Number(e.abnormal_amount) <= 0;
  1444. })
  1445. if (filter.length > 0){
  1446. message = '破损商品的数量和价格不能为0';
  1447. }
  1448. if (message){
  1449. window.tempTip.setIndex(1999);
  1450. window.tempTip.show(message);
  1451. return false;
  1452. }
  1453. return true;
  1454. },
  1455. checkPrice(){
  1456. return parseInt(this.workOrder.price) !== 0;
  1457. },
  1458. createWorkOrder(data, url) {
  1459. window.tempTip.setIndex(1999);
  1460. window.tempTip.waitingTip('生成工单中');
  1461. window.axios.post(url, data, {'Content-Type': 'multipart/form-data'}).then(res => {
  1462. window.tempTip.cancelWaitingTip();
  1463. if (res.data.success) {
  1464. window.tempTip.showSuccess('工单生成成功');
  1465. $('#intercept-modal').modal('hide');
  1466. this.tagWorkOrders(checkData);
  1467. } else {
  1468. if (res.data.errors){
  1469. for (const resKey in res.data.errors) {
  1470. window.tempTip.show(res.data.errors[resKey]);
  1471. return ;
  1472. }
  1473. }else{
  1474. window.tempTip.show(res.data.message ? res.data.message : '工单创建异常');
  1475. }
  1476. }
  1477. }).catch(err => {
  1478. window.tempTip.cancelWaitingTip();
  1479. window.tempTip.show(err)
  1480. });
  1481. },
  1482. tagWorkOrders(orderNos){
  1483. this.orders.forEach((item)=>{
  1484. if (orderNos.includes(item.orderno)){
  1485. item['is_work_order'] = true;
  1486. }
  1487. })
  1488. },
  1489. clearWorkOrder(){
  1490. this.workOrder.packageImages = [];
  1491. this.workOrder.dealImages = [];
  1492. this.workOrder.commodities = [];
  1493. this.workOrder.price = '';
  1494. this.workOrder.logisticNumber = '';
  1495. this.workOrder.orderIssueType = 0;
  1496. },
  1497. getCreateWorkOrderData() {
  1498. return checkData.map(item => {
  1499. return {
  1500. order_no: item,
  1501. order_issue_type: this.workOrder.orderIssueType,
  1502. remark: this.workOrder.remark.info,
  1503. };
  1504. });
  1505. },
  1506. changeReceiveInfo() {
  1507. let url = '{{url('apiLocal/workOrder/editOrderReceiveInfo')}}';
  1508. let data = {
  1509. order_nos: checkData[0],
  1510. grad: this.grad,
  1511. remake: `${this.remark.name} ${this.remark.phone} ${this.remark.province} ${this.remark.city} ${this.remark.city} ${this.remark.district} ${this.remark.adder}`,
  1512. };
  1513. window.tempTip.setIndex('1999');
  1514. window.axios.post(url, data).then(res => {
  1515. if (res.data.success) {
  1516. window.tempTip.showSuccess('生成修改工单成功');
  1517. $('#intercept-modal').modal('hide');
  1518. } else {
  1519. window.tempTip.show(res.data.message);
  1520. }
  1521. }).catch(err => {
  1522. window.tempTip.show(err);
  1523. });
  1524. },
  1525. manualBack() {
  1526. let _this = this;
  1527. let orders = [];
  1528. let fail = [];
  1529. let isGreater = false;
  1530. const start = new Date(new Date(new Date().toLocaleDateString()).getTime() + 16 * 60 * 60 * 1000 + 30 * 60 * 1000);
  1531. if (checkData.length === 0) {
  1532. tempTip.show('没有勾选记录');
  1533. return;
  1534. }
  1535. _this.orders.forEach(function (order) {
  1536. if (new Date(new Date(order.addtime).getTime()) > start) isGreater = true;
  1537. checkData.forEach(function (checkedId) {
  1538. if (order.orderno === checkedId) {
  1539. if (order.soreference5 //存在快递单号
  1540. && order.releasestatus != 'H' //订单未冻结
  1541. && order.manualflag == 'N' //订单未回传
  1542. && (order.sostatus == '00' ||
  1543. order.sostatus == '10' ||
  1544. order.sostatus == '20' ||
  1545. order.sostatus == '40' ||
  1546. order.sostatus == '50' ||
  1547. order.sostatus == '60' ||
  1548. order.sostatus == '61')//订单状态为 创建订单,部分预配,预配完成,分配完成,部分拣货,拣货完成,或播种完成
  1549. ) {
  1550. orders.push(order.orderno);
  1551. } else {
  1552. fail.push(order.orderno)
  1553. }
  1554. }
  1555. });
  1556. });
  1557. let failText = '';
  1558. fail.forEach(function (item) {
  1559. failText += item + ','
  1560. });
  1561. if (isGreater) {
  1562. if (!confirm('订单中包含16:30以后推送的订单,有超时揽收风险,是否确定操作?')) return;
  1563. } else {
  1564. if (!confirm('提前回传订单将无法取消,是否确定操作?')) return;
  1565. }
  1566. let url = '{{url('order/manualBack')}}';
  1567. window.axios.post(url, {ordernos: orders})
  1568. .then(res => {
  1569. if (res.data.success) {
  1570. _this.orders.forEach(function (order) {
  1571. res.data.successNo.forEach(function (success_item) {
  1572. if (order.orderno == success_item) {
  1573. if (order.sostatus == '00'
  1574. || order.sostatus == '10'
  1575. || order.sostatus == '20') {
  1576. order.ordercodename = '分配完成';
  1577. }
  1578. order.manualflag = 'Y';
  1579. }
  1580. })
  1581. })
  1582. res.data.failNo.forEach(function (item) {
  1583. failText += item + ','
  1584. });
  1585. if (failText.length > 0) {
  1586. failText = failText.substr(0, failText.length - 1);
  1587. }
  1588. window.tempTip.setDuration(4000);
  1589. window.tempTip.showSuccess('回传成功!' + ' 单号:' + failText + '不满足回传条件,系统已自动筛除');
  1590. this.$forceUpdate();
  1591. return;
  1592. }
  1593. window.tempTip.setDuration(3000);
  1594. window.tempTip.show('人工回传失败');
  1595. }).catch(err => {
  1596. window.tempTip.setDuration(3000);
  1597. window.tempTip.show("网络错误:" + err);
  1598. });
  1599. },
  1600. isDB(item) {
  1601. if (item.indexOf('德邦') == -1 || item.indexOf('京东') == -1) return false;
  1602. return true;
  1603. },
  1604. collectUpload(){
  1605. if(checkData.length===0){tempTip.show('没有勾选记录');return;}
  1606. const data = {
  1607. 'orderno': checkData,
  1608. 'strict': false,
  1609. };
  1610. window.axios.post("{{url('order/collectUpload')}}", data).then(res => {
  1611. if (res.data.success) {
  1612. tempTip.showSuccess(res.data.message)
  1613. }else {
  1614. tempTip.show(res.data.error_message);
  1615. }
  1616. });
  1617. },
  1618. fillWorkOrderCommodity(){
  1619. let url = "{{route('order.commodity.getCommoditiesApi')}}";
  1620. let data = {orderNo:checkData[0]};
  1621. window.axios.post(url,data).then(res=>{
  1622. if (res.data.success){
  1623. let commodities = res.data.data.map(item=>{
  1624. item.abnormal_amount = item.amount;
  1625. item.abnormal_type = this.workOrder.orderIssueType === '错漏发' ? '未错漏发' : '';
  1626. item.price = 0;
  1627. return item;
  1628. });
  1629. let index = 0;
  1630. let logistic_number = commodities[0]['logistic_number'];
  1631. let count = 0;
  1632. for(let i = 0; i < commodities.length;i++){
  1633. let cur_logistic_number = commodities[i]['logistic_number'];
  1634. if (i === commodities.length - 1 && cur_logistic_number === logistic_number){
  1635. count ++;
  1636. commodities[index]['count'] = count;
  1637. break;
  1638. }
  1639. if (logistic_number === cur_logistic_number){
  1640. count++;
  1641. } else if (logistic_number !== cur_logistic_number){
  1642. commodities[index]['count'] = count;
  1643. index = i;
  1644. count = 1;
  1645. }
  1646. if (i === commodities.length - 1){
  1647. commodities[index]['count'] = count;
  1648. }
  1649. }
  1650. this.workOrder.commodities = commodities;
  1651. } else {
  1652. }
  1653. }).catch(err=>{
  1654. })
  1655. },
  1656. pasteImage(event,imageArray){
  1657. for (let i = 0; i < event.clipboardData.items.length; i++) {
  1658. let item = event.clipboardData.items[i];
  1659. if (item.kind === 'string') continue;
  1660. if (item.type.indexOf('image') === -1) continue;
  1661. if (item.kind === 'file'){
  1662. let blob = item.getAsFile();
  1663. let src = null;
  1664. this.blobToBase64(blob).then(res => {
  1665. src = res;
  1666. imageArray.push({src:src,file:blob});
  1667. });
  1668. }
  1669. }
  1670. event.preventDefault();
  1671. },
  1672. blobToBase64(blob) {
  1673. return new Promise((resolve, reject) => {
  1674. const fileReader = new FileReader();
  1675. fileReader.onload = (e) => {
  1676. resolve(e.target.result);
  1677. };
  1678. fileReader.readAsDataURL(blob);
  1679. fileReader.onerror = () => {
  1680. reject(new Error('blobToBase64 error'));
  1681. };
  1682. });
  1683. },
  1684. checkWorkOrder(){
  1685. return new Promise((resolve, reject)=>{
  1686. let no = checkData;
  1687. let url = '{{route('workOrder.checkApi')}}';
  1688. window.axios.post(url,{no:no}).then(res=>{
  1689. if (res.data.success){
  1690. this.workOrderInfos = [];
  1691. res.data.data.forEach(e=>{
  1692. let array = this.conversionWorkOrder(e);
  1693. this.workOrderInfos.push(...array);
  1694. });
  1695. if (this.workOrderInfos.length>0)resolve(true) ;
  1696. else resolve(false);
  1697. } else {
  1698. this.workOrderInfos = [];
  1699. resolve(false);
  1700. }
  1701. }).catch(err=>{
  1702. reject(err);
  1703. });
  1704. });
  1705. },
  1706. conversionWorkOrder(workOrder){
  1707. let items = [];
  1708. workOrder.details.forEach(detail=>{
  1709. let item = this.conversionDetail(detail);
  1710. item.logistic_numbers = this.getLogisticNumbers(workOrder);
  1711. item.clientCode = workOrder.order ? workOrder.order.client_code : '';
  1712. items.push(item);
  1713. });
  1714. return items;
  1715. },
  1716. conversionDetail(detail){
  1717. return {
  1718. type: detail.issue_type ? detail.issue_type.name : '',
  1719. detail:{
  1720. price:detail.price,
  1721. return_logistic_number:detail.return_logistic_number,
  1722. reissue_logistic_number:detail.reissue_logistic_number,
  1723. },
  1724. commodities:this.getCommodities(detail),
  1725. packagesImages:this.getImageList(detail.images,'外包装图片'),
  1726. commodityImages:this.getImageList(detail.images,'内物破碎图片'),
  1727. dealImages:this.getImageList(detail.images,'交易截图'),
  1728. refundImages:this.getImageList(detail.images,'退款成功截图'),
  1729. remark:detail.remark,
  1730. issue_name : detail.issue_type ? detail.issue_type.name : '',
  1731. };
  1732. },
  1733. getLogisticNumbers(workOrder){
  1734. let packages = workOrder? (workOrder.order ? workOrder.order.packages : []) : [] ;
  1735. return packages.map(e=>{return e.logistic_number});
  1736. },
  1737. getDetails(workOrder){
  1738. let details = workOrder ? workOrder.details : [];
  1739. return details.map(e=>{return e;});
  1740. },
  1741. getCommodities(detail){
  1742. return (detail ? detail.commodities : []).map(item=>{
  1743. item.name =item.commodity ? item.commodity.name :'';
  1744. return item;
  1745. });
  1746. },
  1747. getImageList(images,type){
  1748. let filePrefix = "{{asset("/storage")}}";
  1749. let imageList = images.filter(e=>{
  1750. return parseInt(e.type) === parseInt(type);
  1751. });
  1752. return imageList.map(e=>{
  1753. return {
  1754. src:filePrefix+(e.upload_file ? e.upload_file.url : '')+'.'+(e.upload_file? e.upload_file.type : ''),
  1755. };
  1756. });
  1757. },
  1758. selectWorkOrderIndex(index){
  1759. if (index < 0)index = this.workOrderInfos.length-1;
  1760. if (index >= this.workOrderInfos.length) index = 0;
  1761. this.workOrderIndex = index;
  1762. this.workOrderInfo = this.workOrderInfos[index];
  1763. },
  1764. showParentWorkOrder(){
  1765. if (parseInt(this.workOrderIndex) === 0) return false;
  1766. return this.workOrderIndex < this.workOrderInfos -1;
  1767. },
  1768. showNextWorkOrder(){
  1769. if (parseInt(this.workOrderIndex) === (this.workOrderInfos.length -1)) return false;
  1770. return this.workOrderIndex < this.workOrderInfos.length -1;
  1771. },
  1772. addWorkOrderCommodity(){
  1773. window.tempTip.setIndex(1999);
  1774. window.tempTip.setDuration(1500);
  1775. let sku = this.$refs['add-commodity-sku'].value;
  1776. let logistic_number = this.$refs['add-commodity-logistic-number'].value;
  1777. if (logistic_number.trim().length === 0){
  1778. window.tempTip.show('填写快递单号');
  1779. return ;
  1780. }
  1781. let {customerid} = this.orders.find((item)=>{
  1782. return item.orderno === checkData[0];
  1783. });
  1784. this.getCommodity(customerid,sku).then(res => {
  1785. if (res===null){
  1786. window.tempTip.show('请检查商品条码');
  1787. } else {
  1788. this.workOrder.commodities.push({
  1789. logistic_number:logistic_number,
  1790. commodity_id:res.id,
  1791. name:res.name,
  1792. abnormal_type:"错发",
  1793. amount:0,
  1794. sku:this.$refs['add-commodity-sku'].value,
  1795. abnormal_amount:this.$refs['add-commodity-number'].value,
  1796. });
  1797. this.countByCommodities(this.workOrder.commodities);
  1798. this.$refs['add-commodity-logistic-number'].value = "";
  1799. this.$refs['add-commodity-sku'].value = "";
  1800. this.$refs['add-commodity-number'].value = "";
  1801. window.tempTip.showSuccess("添加成功");
  1802. }
  1803. }).catch(err=>{
  1804. window.tempTip.show("获取商品信息异常");
  1805. });
  1806. },
  1807. getCommodity(owner,code){
  1808. return new Promise((resolve, reject) => {
  1809. let url = "{{route('commodity.getCommodityApi')}}";
  1810. let data = {owner_code:owner,sku:code};
  1811. console.log(data);
  1812. window.axios.post(url,data).then(res=>{
  1813. if (res.data.success){
  1814. resolve(res.data.data);
  1815. } else {
  1816. resolve(null);
  1817. }
  1818. }).catch(err=>{
  1819. reject(null);
  1820. });
  1821. });
  1822. },
  1823. computeAbnormalType(item){
  1824. if (this.workOrder.orderIssueType !=='错漏发') return;
  1825. let abnormal_amount = Number(item.abnormal_amount); // 客户实收数量
  1826. let amount = Number(item.amount);
  1827. item.abnormal_type = abnormal_amount === amount ? '未错漏发' : (amount < abnormal_amount ? '多发' : '少发')
  1828. },
  1829. sunPrice(){
  1830. this.workOrder.price = this.workOrder.commodities.reduce((prev,cur)=>{
  1831. return prev + Number(cur.price);
  1832. },0);
  1833. },
  1834. checkExpressAbnormalWorkOrder(){ // 校验 快递异常问题
  1835. window.tempTip.setIndex(1999);
  1836. window.tempTip.setDuration(1500);
  1837. let message = null
  1838. let items = this.workOrder.commodities.filter(item=>{
  1839. return Number(item.abnormal_amount) === 0;
  1840. });
  1841. if (items.length > 0)message = '请填写快递异常数量!';
  1842. if (this.workOrder.dealImages.length === 0) message = '交易截图为必须项!';
  1843. if (message){
  1844. window.tempTip.show(message);
  1845. return false;
  1846. }
  1847. return true;
  1848. },
  1849. countByCommodities(commodities){
  1850. if (commodities.length === 0) return;
  1851. let index = 0;
  1852. let logistic_number = commodities[0]['logistic_number'];
  1853. let count = 0;
  1854. for(let i = 0; i < commodities.length;i++){
  1855. let cur_logistic_number = commodities[i]['logistic_number'];
  1856. if (i === commodities.length - 1 && cur_logistic_number === logistic_number){
  1857. count ++;
  1858. commodities[index]['count'] = count;
  1859. break;
  1860. }
  1861. if (logistic_number === cur_logistic_number){
  1862. count++;
  1863. } else if (logistic_number !== cur_logistic_number){
  1864. commodities[index]['count'] = count;
  1865. index = i;
  1866. count = 1;
  1867. }
  1868. if (i === commodities.length - 1){
  1869. commodities[index]['count'] = count;
  1870. }
  1871. }
  1872. },
  1873. },
  1874. });
  1875. </script>
  1876. @endsection