index.blade.php 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910
  1. @extends("layouts.app")
  2. @section('title','批量创建工单')
  3. @section('head')
  4. @endsection
  5. @section("content")
  6. <div class="container mt-3 d-none" id="batch_container">
  7. <div class="form-group">
  8. <label for="logistic_numbers">请输入快递单号</label>
  9. <textarea class="form-control" name="logistic_numbers" id="logistic_numbers" cols="30" rows="2"
  10. v-model="logisticNumbers"
  11. ref="logistic_numbers"></textarea>
  12. <small id="emailHelp" class="form-text text-muted">如添加多个单号,请将快递单号以“空格”、“,”等分隔符隔开</small>
  13. </div>
  14. <div class="form-group">
  15. <label for="">工单类型</label>
  16. <div class="btn-group" role="group" aria-label="工单类型">
  17. <button type="button" v-for="item in issueTypes" class="btn"
  18. :class="issueType === item.name ? 'btn-info' : 'btn-secondary'"
  19. @click="issueType = item.name">@{{ item.name }}</button>
  20. </div>
  21. </div>
  22. <div class="form-group" id="remark-div" v-if="showRemarkDiv">
  23. <label for="">请填写问题描述</label>
  24. <textarea class="form-control" name="remark" id="remark" cols="30" rows="2" ref="remark"
  25. v-model="remark"></textarea>
  26. </div>
  27. <div class="form-group" id="info-edit" v-if="'信息更改' === issueType">
  28. <div class="alert alert-info" v-for="(item,index) in infoChange">
  29. <div class="form-row">
  30. <div class="col-sm-3">
  31. <label>订单</label>
  32. <p v-text="item.code"></p>
  33. </div>
  34. <div class="col-sm-9 ">
  35. <label class="text-dark font-weight-bolder"><span class="text-danger">*</span>请填写新的收方信息</label>
  36. <textarea class="form-control form-control-sm col-12" name="" id="" cols="30" rows="2"
  37. v-model="item.remark"></textarea>
  38. </div>
  39. </div>
  40. </div>
  41. </div>
  42. <div class="form-group" id="info-edit" v-if="'错漏发' === issueType">
  43. <p for="" class="">商品信息:<span class="text-primary float-right">注意需要勾选商品列才能正确提交!</span></p>
  44. <div class="alert alert-info" v-for="(mistake,index) in mistakes">
  45. <div class="form-row">
  46. <label class="text-dark font-weight-bolder" v-text="'订单号:'+index"></label>
  47. <table class="table table-bordered table-hover bg-white">
  48. <thead>
  49. <tr>
  50. <th scope="col">勾选</th>
  51. <th scope="col">快递单号</th>
  52. <th scope="col">商品条码</th>
  53. <th scope="col">商品名称</th>
  54. <th scope="col">订单数量</th>
  55. <th scope="col">异常类型</th>
  56. <th scope="col">客户实收数</th>
  57. </tr>
  58. </thead>
  59. <tbody>
  60. <tr v-for="(item,index) in mistake">
  61. <td>
  62. <div class="form-group form-check">
  63. <input type="checkbox" class="form-check-input" v-model="item.select">
  64. </div>
  65. </td>
  66. <td v-text="item.logistic_number"></td>
  67. <td v-text="item.sku"></td>
  68. <td v-text="item.sku_name"></td>
  69. <td v-text="item.amount"></td>
  70. <td v-text="item.abnormal_type"></td>
  71. <td>
  72. <input type="number" class="form-control form-control-sm"
  73. v-model="item.abnormal_amount"
  74. @input="mistakeAbnormalType(item)">
  75. </td>
  76. </tr>
  77. </tbody>
  78. </table>
  79. <table>
  80. <tbody>
  81. <tr class="add-mistake">
  82. <td><input type="text" placeholder="快递单号" class="logistic_number form-control"
  83. :ref="'logistic_number'+index"></td>
  84. <td><input type="text" placeholder="商品条码" class="sku form-control"
  85. :ref="'sku'+index"></td>
  86. <td><input type="text" placeholder="实收数量" class="abnormal_amount form-control"
  87. :ref="'abnormal_amount'+index"></td>
  88. <td>
  89. <button class="btn btn-sm btn-outline-success" @click="addMistakeItem(mistake,index)">
  90. 添加
  91. </button>
  92. </td>
  93. </tr>
  94. </tbody>
  95. </table>
  96. </div>
  97. </div>
  98. </div>
  99. <div class="form-group" id="express-abnormal-edit" v-if="'快递异常' === issueType"
  100. v-for="(item,index) in expressAbnormalData">
  101. <p class="text-dark">异常信息</p>
  102. <div class="alert alert-info">
  103. <p class="text-dark font-weight-bolder" v-text="'订单号:'+item.order_no"></p>
  104. <div class="form-row">
  105. <div class="col-sm-3">
  106. <label class="text-dark">快递单号</label>
  107. <div class="form-group form-check" v-for="package in item.packages">
  108. <input type="checkbox" class="form-check-input"
  109. :id=" item.code+':'+ package.logistic_number" v-model="package.select">
  110. <label class="text-dark " v-text="package.logistic_number"
  111. :for="item.code+':'+ package.logistic_number"></label>
  112. </div>
  113. </div>
  114. <div class="col-sm-3 ">
  115. <label class="text-dark "><span class="text-danger">*</span>请选择异常类型</label>
  116. <select name="" id="" class="form-control" v-model="item.abnormal_type">
  117. <option v-for="type in expressAbnormalType" v-text="type" :value="type"></option>
  118. </select>
  119. </div>
  120. <div class="col-sm-6 ">
  121. <label class="text-dark"><span class="text-danger">*</span>交易截图</label>
  122. <div class="h-auto border border-secondary bg-white rounded" id="package-image"
  123. style="min-height: 75px"
  124. contenteditable="true"
  125. @paste="pasteImage($event,item.dealImages)">
  126. <div v-for="(image,i) in item.dealImages"
  127. class="d-inline-block col-4 position-relative card">
  128. <div class="card-body">
  129. <img :src="image.src" class="card-img-top" :alt="image.file.name">
  130. <div class="float-right position-relative">
  131. <button type="button" class="btn btn-sm btn-outline-danger"
  132. @click="spliceImage(i,item.dealImages)">取消
  133. </button>
  134. </div>
  135. </div>
  136. </div>
  137. </div>
  138. </div>
  139. </div>
  140. </div>
  141. </div>
  142. <div class="form-group" id="damage-edit" v-if="'破损' === issueType">
  143. <p class="text-dark">破损信息</p>
  144. <div class="alert alert-info" v-for="(item,index) in damages">
  145. <div class="form-row ">
  146. <label class="">订单:</label>
  147. <label class="text-dark" v-text="item.order_no"></label>
  148. </div>
  149. <div class="form-row mb-2">
  150. <label class="">破损商品价格:</label>
  151. <div class="col-sm-4">
  152. <input type="number" class="form-control form-control-sm" v-model="item.price">
  153. </div>
  154. </div>
  155. <div class="damage-table form-row form-group">
  156. <table class="table table-bordered bg-white">
  157. <thead>
  158. <tr>
  159. <th>快递单号</th>
  160. <th>商品条码</th>
  161. <th>异常类型</th>
  162. <th>商品名称</th>
  163. <th>订单数量</th>
  164. <th>异常数量</th>
  165. <th>破损单价</th>
  166. </tr>
  167. </thead>
  168. <tbody>
  169. <tr v-for="(commodity,i) in item.commodities">
  170. <td v-text="commodity.logistic_number"></td>
  171. <td v-text="commodity.sku"></td>
  172. <th v-text="commodity.abnormal_type"></th>
  173. <td v-text="commodity.sku_name"></td>
  174. <td v-text="commodity.amount"></td>
  175. <td>
  176. <input type="number" class="form-control form-control-sm"
  177. v-model="commodity.abnormal_amount" @change="computerPrice(item)">
  178. </td>
  179. <td>
  180. <input type="number" class="form-control form-control-sm"
  181. v-model="commodity.price" @change="computerPrice(item)">
  182. </td>
  183. </tr>
  184. </tbody>
  185. </table>
  186. </div>
  187. <div class="form-row">
  188. <div class="col-sm-4">
  189. <label class="text-dark"><span class="text-danger">*</span>外包装图片</label>
  190. <div class="h-auto border border-secondary bg-white rounded"
  191. style="min-height: 100px"
  192. contenteditable="true"
  193. @paste="pasteImage($event,item.packageImages)">
  194. <div v-for="(image,i) in item.packageImages"
  195. class="d-inline-block col-4 position-relative card">
  196. <div class="card-body">
  197. <img :src="image.src" class="card-img-top" :alt="image.file.name">
  198. <div class="float-right position-relative">
  199. <button type="button" class="btn btn-sm btn-outline-danger"
  200. @click="spliceImage(i,item.packageImages)">取消
  201. </button>
  202. </div>
  203. </div>
  204. </div>
  205. </div>
  206. </div>
  207. <div class="col-sm-4">
  208. <label class="text-dark"><span class="text-danger">*</span>内物破损图</label>
  209. <div class="h-auto border border-secondary bg-white rounded"
  210. style="min-height: 100px"
  211. contenteditable="true"
  212. @paste="pasteImage($event,item.commodityImages)">
  213. <div v-for="(image,i) in item.commodityImages"
  214. class="d-inline-block col-4 position-relative card">
  215. <div class="card-body">
  216. <img :src="image.src" class="card-img-top" :alt="image.file.name">
  217. <div class="float-right position-relative">
  218. <button type="button" class="btn btn-sm btn-outline-danger"
  219. @click="spliceImage(i,item.commodityImages)">取消
  220. </button>
  221. </div>
  222. </div>
  223. </div>
  224. </div>
  225. </div>
  226. <div class="col-sm-4">
  227. <label class="text-dark"><span class="text-danger">*</span>交易截图</label>
  228. <div class="h-auto border border-secondary bg-white rounded"
  229. style="min-height: 100px"
  230. contenteditable="true"
  231. @paste="pasteImage($event,item.dealImages)">
  232. <div v-for="(image,i) in item.dealImages"
  233. class="d-inline-block col-4 position-relative card">
  234. <div class="card-body">
  235. <img :src="image.src" class="card-img-top" :alt="image.file.name">
  236. <div class="float-right position-relative">
  237. <button type="button" class="btn btn-sm btn-outline-danger"
  238. @click="spliceImage(i,item.dealImages)">取消
  239. </button>
  240. </div>
  241. </div>
  242. </div>
  243. </div>
  244. </div>
  245. </div>
  246. </div>
  247. </div>
  248. <div class="form-group" id="submit-div">
  249. <button class="btn btn-primary" @click="submit" >提交</button>
  250. </div>
  251. </div>
  252. @endsection
  253. @section("lastScript")
  254. <script>
  255. new Vue({
  256. el: "#batch_container",
  257. data: {
  258. issueTypes: {!! $types !!},
  259. issueType: null,
  260. logisticNumbers: null,
  261. remark: null,
  262. expressAbnormalType: ['在途异常', '签收未收到'],
  263. infoChange: [],
  264. mistakes: [],
  265. expressAbnormalData: [],
  266. damages: [],
  267. },
  268. computed: {
  269. showRemarkDiv() {
  270. return '信息更改' !== this.issueType;
  271. }
  272. },
  273. watch: {
  274. issueType: function (val) {
  275. if (val === "信息更改") {
  276. this.getInfoChangeData();
  277. } else if (val === "错漏发") {
  278. this.getMistakeData();
  279. } else if (val === "快递异常") {
  280. this.getExpressAbnormalData();
  281. } else if (val === "破损") {
  282. this.getDamages();
  283. } else if(val==="拦截"){
  284. this.getIntercept();
  285. }
  286. }
  287. },
  288. mounted() {
  289. $("#batch_container").removeClass("d-none")
  290. },
  291. methods: {
  292. submit() {
  293. if (!this.checkSubmitData()) {
  294. return;
  295. }
  296. this.submitData();
  297. },
  298. checkSubmitData() {
  299. let {issueType} = this;
  300. if (issueType === "拦截" || issueType === "取消拦截" || issueType === "快递丢件") {
  301. if (!this.checkRemark()) {
  302. this.errorTempTip("问题描述为必填项")
  303. return false;
  304. }
  305. } else if (issueType === "信息更改") {
  306. if (!this.checkInfoChange()) {
  307. return false;
  308. }
  309. } else if (issueType === "错漏发") {
  310. if (!this.checkMistakes()) {
  311. return false;
  312. }
  313. } else if (issueType === "快递异常") {
  314. if (!this.checkExpressAbnormal()) {
  315. return false;
  316. }
  317. } else if (issueType === "破损") {
  318. if (!this.checkDamage()) {
  319. return false;
  320. }
  321. }
  322. return true;
  323. },
  324. submitData() {
  325. let {issueType} = this;
  326. if (issueType === "拦截") {
  327. this.intercept()
  328. } else if (issueType === "取消拦截") {
  329. this.cancelIntercept();
  330. } else if (issueType === "快递丢件") {
  331. this.loss();
  332. } else if (issueType === "信息更改") {
  333. this.informationChange();
  334. } else if (issueType === "错漏发") {
  335. this.mistake()
  336. } else if (issueType === "快递异常") {
  337. this.expressAbnormal()
  338. } else if (issueType === "破损") {
  339. this.damage();
  340. }
  341. },
  342. loss() {
  343. let {remark, logisticNumbers} = this;
  344. let data = {
  345. logistic_numbers: logisticNumbers,
  346. remark: remark
  347. };
  348. this.waitingTempTip("处理中");
  349. let url = '{{ route("workOrder.loss.createBatchApi") }}';
  350. axios.post(url, data).then(res => {
  351. this.cancelWaitingTempTip();
  352. if (res.data.success === true) {
  353. this.successTempTip("添加成功");
  354. this.cancelSubData();
  355. } else {
  356. this.errorTempTip(res.data.message ? res.data.message : "创建出现异常");
  357. }
  358. }).catch(err => {
  359. this.cancelWaitingTempTip();
  360. this.errorTempTip(err);
  361. });
  362. },
  363. intercept() {
  364. let {remark, logisticNumbers} = this;
  365. let data = {
  366. logistic_numbers: logisticNumbers,
  367. remark: remark
  368. };
  369. this.waitingTempTip("处理中");
  370. let url = '{{ route("workOrder.intercept.createBatchApi") }}';
  371. axios.post(url, data).then(res => {
  372. this.cancelWaitingTempTip();
  373. if (res.data.success === true) {
  374. this.successTempTip("添加成功");
  375. this.cancelSubData();
  376. } else {
  377. this.errorTempTip(res.data.message ? res.data.message : "创建出现异常");
  378. }
  379. }).catch(err => {
  380. this.cancelWaitingTempTip();
  381. this.errorTempTip(err);
  382. });
  383. },
  384. cancelIntercept() {
  385. let url = '{{ route("workOrder.cancelIntercept.createBatchApi") }}';
  386. let {remark, logisticNumbers} = this;
  387. let data = {
  388. logistic_numbers: logisticNumbers,
  389. remark: remark
  390. };
  391. this.waitingTempTip("处理中");
  392. axios.post(url, data).then(res => {
  393. this.cancelWaitingTempTip();
  394. if (res.data.success === true) {
  395. this.successTempTip("添加成功");
  396. this.cancelSubData();
  397. } else {
  398. this.errorTempTip(res.data.message ? res.data.message : "创建出现异常");
  399. }
  400. }).catch(err => {
  401. this.cancelWaitingTempTip();
  402. this.errorTempTip(err);
  403. });
  404. },
  405. informationChange() {
  406. let url = '{{route('workOrder.informationChange.createBatchApi')}}';
  407. let {logisticNumbers, infoChange} = this;
  408. let data = {
  409. logistic_numbers: logisticNumbers,
  410. data: infoChange,
  411. };
  412. this.waitingTempTip("处理中");
  413. axios.post(url, data).then(res => {
  414. this.cancelWaitingTempTip();
  415. if (res.data.success === true) {
  416. this.successTempTip("添加成功");
  417. this.cancelSubData();
  418. } else {
  419. this.errorTempTip(res.data.message ? res.data.message : "创建出现异常");
  420. }
  421. }).catch(err => {
  422. this.cancelWaitingTempTip();
  423. this.errorTempTip(err);
  424. });
  425. },
  426. mistake() {
  427. let url = '{{route('workOrder.mistake.createBatchApi')}}';
  428. let {logisticNumbers, mistakes, remark} = this;
  429. let mistakesCommodities = [];
  430. for (let key in mistakes) {
  431. let commodities = mistakes[`${key}`] ? mistakes[`${key}`] : [];
  432. commodities = commodities.map(item => JSON.stringify(item));
  433. mistakesCommodities.push({
  434. order_no: key,
  435. commodities: commodities,
  436. });
  437. }
  438. let data = {
  439. logistic_numbers: logisticNumbers,
  440. remark: remark,
  441. data: mistakesCommodities,
  442. };
  443. this.waitingTempTip("提交中");
  444. axios.post(url, data).then(res => {
  445. this.cancelWaitingTempTip();
  446. if (res.data.success === true) {
  447. this.successTempTip("添加成功");
  448. this.cancelSubData();
  449. } else {
  450. this.errorTempTip(res.data.message ? res.data.message : "创建出现异常");
  451. }
  452. }).catch(err => {
  453. this.cancelWaitingTempTip();
  454. this.errorTempTip(err);
  455. });
  456. },
  457. expressAbnormal() {
  458. let {expressAbnormalData, remark} = this;
  459. let message = '';
  460. this.waitingTempTip("处理中");
  461. for (let i = 0; i < expressAbnormalData.length; i++) {
  462. let expressAbnormal = expressAbnormalData[i];
  463. let data = new FormData();
  464. let packages = expressAbnormal.packages ? expressAbnormal.packages : [];
  465. data.append('order_no', expressAbnormal.order_no);
  466. data.append('remark', remark);
  467. data.append('type', expressAbnormal.abnormal_type);
  468. data.append('process_progress', expressAbnormal.abnormal_type);
  469. packages = packages.filter(item => item.select);
  470. packages.forEach(e => {
  471. data.append('commodities[]', JSON.stringify({logistic_number: e.logistic_number}));
  472. })
  473. let dealImages = this.getImages(expressAbnormal.dealImages);
  474. this.setFormDataImagePrefix(data, 'dealImages', dealImages);
  475. this.syncExpressAbnormal(data).then(res => {
  476. if (i === (expressAbnormalData.length - 1)) {
  477. this.cancelWaitingTempTip();
  478. this.cancelSubData();
  479. }
  480. this.successTempTip(`${expressAbnormal.order_no}创建完成`);
  481. }).catch(err => {
  482. message += err + '\\n';
  483. });
  484. }
  485. },
  486. syncExpressAbnormal(data) {
  487. let url = "{{route('workOrder.expressAbnormal.storeApi')}}";
  488. return new Promise((resolve, reject) => {
  489. axios.post(url, data).then(res => {
  490. if (res.data.success) {
  491. resolve(true)
  492. } else {
  493. reject(res.data.message ? res.data.message : '创建工单异常');
  494. }
  495. }).catch(err => {
  496. reject(err);
  497. })
  498. });
  499. },
  500. damage() {
  501. let {damages, remark} = this;
  502. let message = '';
  503. this.waitingTempTip("处理中");
  504. for (let i = 0; i < damages.length; i++) {
  505. let fromData = new FormData();
  506. let damage = damages[i];
  507. let price = damage.price;
  508. let commodities = damage.commodities ? damage.commodities : [];
  509. fromData.append('order_no', damage.order_no);
  510. fromData.append('price', price);
  511. fromData.append('remark', remark);
  512. let packageImages = this.getImages(damage.packageImages ? damage.packageImages : []);
  513. this.setFormDataImagePrefix(fromData, 'packageImages', packageImages);
  514. let dealImages = this.getImages(damage.dealImages ? damage.dealImages : []);
  515. this.setFormDataImagePrefix(fromData, 'dealImages', dealImages);
  516. let commodityImages = this.getImages(damage.commodityImages ? damage.commodityImages : []);
  517. this.setFormDataImagePrefix(fromData, 'commodityImages', commodityImages);
  518. commodities.filter(item=>{
  519. return Number(item.abnormal_amount) !== 0;
  520. }).forEach(e => {
  521. fromData.append('commodities[]', JSON.stringify(e));
  522. });
  523. this.syncDamage(fromData).then(res => {
  524. if (i === (damages.length - 1)) {
  525. this.cancelWaitingTempTip();
  526. this.cancelSubData();
  527. }
  528. this.successTempTip(`${damage.order_no}创建完成`);
  529. }).catch(err => {
  530. message += err + '\\n';
  531. });
  532. }
  533. },
  534. syncDamage(data) {
  535. let url = "{{route('workOrder.damage.storeApi')}}";
  536. return new Promise((resolve, reject) => {
  537. axios.post(url, data).then(res => {
  538. if (res.data.success) {
  539. resolve(true)
  540. } else {
  541. reject(res.data.message ? res.data.message : '创建工单异常');
  542. }
  543. }).catch(err => {
  544. reject(err);
  545. })
  546. });
  547. },
  548. getIntercept(){
  549. let url = '{{route('workOrder.intercept.checkLogisticNumberApi')}}';
  550. let data = {
  551. 'logistic_numbers': this.logisticNumbers,
  552. };
  553. axios.post(url, data).then(res => {
  554. if (res.data.success) {
  555. if (res.data.data) {
  556. this.infoChange = res.data.data.map(item => {
  557. item.remark = '';
  558. return item;
  559. });
  560. }
  561. } else {
  562. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  563. }
  564. }).catch(err => {
  565. this.errorTempTip(err);
  566. });
  567. },
  568. getInfoChangeData() {
  569. let url = '{{route('workOrder.informationChange.checkLogisticNumberApi')}}';
  570. let data = {
  571. 'logistic_numbers': this.logisticNumbers,
  572. };
  573. axios.post(url, data).then(res => {
  574. if (res.data.success) {
  575. this.infoChange = res.data.data.map(item => {
  576. item.remark = '';
  577. return item;
  578. });
  579. } else {
  580. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  581. }
  582. }).catch(err => {
  583. this.errorTempTip(err);
  584. });
  585. },
  586. getMistakeData() {
  587. let url = '{{route('workOrder.mistake.checkLogisticNumberApi')}}';
  588. let data = {
  589. 'logistic_numbers': this.logisticNumbers
  590. };
  591. axios.post(url, data).then(res => {
  592. if (res.data.success) {
  593. res.data.data.forEach((item) => {
  594. item.abnormal_amount = item.amount;
  595. item.abnormal_type = '未错漏发';
  596. item.select = false;
  597. });
  598. let mistakes = {};
  599. for (let i = 0; i < res.data.data.length; i++) {
  600. let data = res.data.data[i];
  601. let order_code = data['order_code'];
  602. if (mistakes[order_code] == null) {
  603. mistakes[order_code] = []
  604. }
  605. mistakes[order_code].push(data);
  606. }
  607. this.mistakes = mistakes;
  608. } else {
  609. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  610. }
  611. }).catch(err => {
  612. this.errorTempTip(err);
  613. });
  614. },
  615. getExpressAbnormalData() {
  616. let url = '{{route('workOrder.expressAbnormal.checkLogisticNumberApi')}}';
  617. let data = {
  618. 'logistic_numbers': this.logisticNumbers
  619. };
  620. axios.post(url, data).then(res => {
  621. if (res.data.success) {
  622. this.expressAbnormalData = res.data.data.map(item => {
  623. item.abnormal_type = null;
  624. item.dealImages = [];
  625. item.packages.forEach(item => item.select = false);
  626. return item;
  627. });
  628. } else {
  629. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  630. }
  631. }).catch(err => {
  632. this.errorTempTip(err);
  633. });
  634. },
  635. getDamages() {
  636. let url = '{{route('workOrder.damage.checkLogisticNumberApi')}}';
  637. let data = {
  638. 'logistic_numbers': this.logisticNumbers
  639. };
  640. axios.post(url, data).then(res => {
  641. if (res.data.data) {
  642. res.data.data.forEach(item => {
  643. item.commodities.forEach(i => {
  644. i.abnormal_type = "破损";
  645. i.abnormal_amount = i.amount;
  646. i.price = 0;
  647. });
  648. item.commodityImages = [];
  649. item.dealImages = [];
  650. item.packageImages = [];
  651. item.price = 0;
  652. })
  653. this.damages = res.data.data;
  654. } else {
  655. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  656. }
  657. }).catch(err => {
  658. this.errorTempTip(err);
  659. });
  660. },
  661. computerPrice(item) {
  662. let {commodities} = item;
  663. item.price = commodities.map(item => {
  664. let {price, abnormal_amount} = item;
  665. return price * abnormal_amount;
  666. }).reduce((perv, next) => {
  667. return perv + next
  668. });
  669. },
  670. waitingTempTip(message) {
  671. window.tempTip.setIndex(2005);
  672. window.tempTip.setDuration(9999);
  673. window.tempTip.waitingTip(message);
  674. },
  675. cancelWaitingTempTip() {
  676. window.tempTip.cancelWaitingTip();
  677. },
  678. successTempTip(message) {
  679. window.tempTip.setDuration(1500);
  680. window.tempTip.setIndex(2005);
  681. window.tempTip.showSuccess(message);
  682. },
  683. errorTempTip(message) {
  684. window.tempTip.setDuration(2000);
  685. window.tempTip.setIndex(2005);
  686. window.tempTip.show(message);
  687. },
  688. mistakeAbnormalType(item) {
  689. let {abnormal_amount, amount} = item;
  690. if (abnormal_amount === amount) {
  691. item.abnormal_type = "未错漏发";
  692. } else if (abnormal_amount > amount) {
  693. item.abnormal_type = "多发";
  694. } else if (abnormal_amount < amount) {
  695. item.abnormal_type = "少发"
  696. }
  697. },
  698. addMistakeItem(mistake, i) {
  699. let logisticNumber = $(this.$refs["logistic_number" + i][0]).val();
  700. let sku = $(this.$refs["sku" + i][0]).val();
  701. let abnormalAmount = $(this.$refs["abnormal_amount" + i][0]).val();
  702. let ownerId = mistake[0]['owner_id'] ?? '';
  703. if (ownerId === '' || ownerId == null) {
  704. this.errorTempTip("添加商品时,校验失败货主异常");
  705. return;
  706. }
  707. this.asyncAddMistakeItem(mistake, i, ownerId, sku, abnormalAmount, logisticNumber);
  708. },
  709. cancelMistakeItem(i) {
  710. $(this.$refs["logistic_number" + i][0]).val("");
  711. $(this.$refs["sku" + i][0]).val("");
  712. $(this.$refs["abnormal_amount" + i][0]).val("");
  713. },
  714. asyncAddMistakeItem(mistake, i, ownerId, sku, abnormalAmount, logisticNumber) {
  715. let url = "{{route('commodity.getCommodityApi')}}";
  716. let data = {
  717. owner_id: ownerId,
  718. sku: sku
  719. }
  720. this.waitingTempTip("查询中");
  721. axios.post(url, data).then(res => {
  722. this.cancelWaitingTempTip();
  723. if (res.data.success) {
  724. let item = JSON.parse(JSON.stringify(mistake[0]));
  725. item.abnormal_amount = abnormalAmount;
  726. item.abnormal_type = "多发";
  727. item.logistic_number = logisticNumber;
  728. item.amount = 0;
  729. item.sku_name = res.data.data.name;
  730. item.commodity_id = res.data.data.id;
  731. mistake.push(item);
  732. this.cancelMistakeItem(i);
  733. } else {
  734. this.errorTempTip(res.data.message ? res.data.message : '查询商品失败')
  735. }
  736. }).catch(err => {
  737. this.cancelWaitingTempTip();
  738. this.errorTempTip(err);
  739. })
  740. },
  741. checkRemark() {
  742. let {remark} = this;
  743. if (remark == null || remark === "") return false;
  744. return remark.trim().length !== 0;
  745. },
  746. cancelSubData() {
  747. this.logisticNumbers = null;
  748. this.issueType = null;
  749. this.remark = null;
  750. this.infoChange = [];
  751. this.mistakes = [];
  752. this.expressAbnormalData = [];
  753. this.damages = [];
  754. },
  755. checkInfoChange() {
  756. let {infoChange} = this;
  757. if(infoChange.length === 0){
  758. this.errorTempTip("请检查信息");
  759. return false;
  760. }
  761. for (let i = 0; i < infoChange.length; i++) {
  762. let info = infoChange[i];
  763. let {remark} = info;
  764. if(remark == null || remark === "" || remark.trim().length === 0){
  765. this.errorTempTip("收方信息未必填项");
  766. return false;
  767. }
  768. }
  769. return true;
  770. },
  771. checkMistakes() {
  772. let {mistakes,remark} = this;
  773. if (mistakes.length === 0) {
  774. this.errorTempTip("请校验提交的商品信息是否为勾选")
  775. return false;
  776. }
  777. if(remark == null || remark === "" || remark.trim().length === 0){
  778. this.errorTempTip("问题描述为必填项");
  779. return false;
  780. }
  781. for (let orderCode in mistakes) {
  782. let mistake = mistakes[`${orderCode}`];
  783. if (!mistake) {
  784. this.errorTempTip('订单:${orderCode}未有订单商品信息');
  785. return false;
  786. }
  787. let count = mistake.filter(item => item.select === true).length;
  788. if (count === 0) {
  789. this.errorTempTip(`订单:${orderCode}未勾选商品列`);
  790. return false;
  791. }
  792. }
  793. return true;
  794. },
  795. checkExpressAbnormal() {
  796. let {expressAbnormalData,remark} = this;
  797. if (expressAbnormalData.length === 0) {
  798. this.errorTempTip("提交参数异常!");
  799. return false;
  800. }
  801. if(remark == null || remark === "" || remark.trim().length === 0){
  802. this.errorTempTip("问题描述为必填项");
  803. return false;
  804. }
  805. for (let i = 0; i < expressAbnormalData.length; i++) {
  806. let data = expressAbnormalData[i];
  807. let selectCount = data.packages.filter(item => item.select).length;
  808. if (selectCount === 0) {
  809. this.errorTempTip(`未选中快递单号 订单:${data.code}!`);
  810. return false;
  811. }
  812. }
  813. @if(\Illuminate\Support\Facades\Gate::check('订单管理-工单处理-宝时编辑') )
  814. @elseif(\Illuminate\Support\Facades\Gate::check('订单管理-工单处理-商家编辑'))
  815. for (let i = 0; i < expressAbnormalData.length; i++) {
  816. let data = expressAbnormalData[i];
  817. let selectCount = data.dealImages.filter(item => item.select).length;
  818. if (selectCount === 0) {
  819. this.errorTempTip(`未上传破损图片 订单:${data.code}!`);
  820. return false;
  821. }
  822. }
  823. @endif
  824. return true;
  825. },
  826. checkDamage() {
  827. let {damages,remark} = this;
  828. if(remark == null || remark === "" || remark.trim().length === 0){
  829. this.errorTempTip("问题描述为必填项");
  830. return false;
  831. }
  832. for (let i = 0; i < damages.length; i++) {
  833. let damage = damages[i];
  834. let {commodities,order_no} = damage;
  835. if(commodities.length === 0){
  836. this.errorTempTip(`订单${order_no}无商品详情`);
  837. return false;
  838. }
  839. let count = commodities.filter(item=>{
  840. return Number(item.abnormal_amount) === 0;
  841. }).length;
  842. if(count === commodities.length){
  843. this.errorTempTip(`${order_no}未填写破损数量`);
  844. return false;
  845. }
  846. }
  847. return true;
  848. },
  849. pasteImage(event, imageArray) {
  850. for (let i = 0; i < event.clipboardData.items.length; i++) {
  851. let item = event.clipboardData.items[i];
  852. if (item.kind === 'string') continue;
  853. if (item.type.indexOf('image') === -1) continue;
  854. if (item.kind === 'file') {
  855. let blob = item.getAsFile();
  856. let src = null;
  857. this.blobToBase64(blob).then(res => {
  858. src = res;
  859. imageArray.push({src: src, file: blob});
  860. });
  861. }
  862. }
  863. event.preventDefault();
  864. },
  865. spliceImage(i, images) {
  866. if (!confirm('是否取消选择该图片')) return;
  867. images.splice(i, 1);
  868. },
  869. blobToBase64(blob) {
  870. return new Promise((resolve, reject) => {
  871. const fileReader = new FileReader();
  872. fileReader.onload = (e) => {
  873. resolve(e.target.result);
  874. };
  875. fileReader.readAsDataURL(blob);
  876. fileReader.onerror = () => {
  877. reject(new Error('blobToBase64 error'));
  878. };
  879. });
  880. },
  881. getImages(images) {
  882. return images.map((item) => {
  883. return item.file;
  884. })
  885. },
  886. setFormDataImagePrefix(formData, prefix, images) {
  887. images.forEach((item) => {
  888. formData.append(`${prefix}[]`, item);
  889. });
  890. },
  891. }
  892. })
  893. </script>
  894. @endsection