index.blade.php 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917
  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 === "拦截"){
  301. return true;
  302. }else if (issueType === "取消拦截" || issueType === "快递丢件") {
  303. if (!this.checkRemark()) {
  304. this.errorTempTip("问题描述为必填项")
  305. return false;
  306. }
  307. } else if (issueType === "信息更改") {
  308. if (!this.checkInfoChange()) {
  309. return false;
  310. }
  311. } else if (issueType === "错漏发") {
  312. if (!this.checkMistakes()) {
  313. return false;
  314. }
  315. } else if (issueType === "快递异常") {
  316. if (!this.checkExpressAbnormal()) {
  317. return false;
  318. }
  319. } else if (issueType === "破损") {
  320. if (!this.checkDamage()) {
  321. return false;
  322. }
  323. }
  324. return true;
  325. },
  326. submitData() {
  327. let {issueType} = this;
  328. if (issueType === "拦截") {
  329. this.intercept()
  330. } else if (issueType === "取消拦截") {
  331. this.cancelIntercept();
  332. } else if (issueType === "快递丢件") {
  333. this.loss();
  334. } else if (issueType === "信息更改") {
  335. this.informationChange();
  336. } else if (issueType === "错漏发") {
  337. this.mistake()
  338. } else if (issueType === "快递异常") {
  339. this.expressAbnormal()
  340. } else if (issueType === "破损") {
  341. this.damage();
  342. }
  343. },
  344. loss() {
  345. let {remark, logisticNumbers} = this;
  346. let data = {
  347. logistic_numbers: logisticNumbers,
  348. remark: remark
  349. };
  350. this.waitingTempTip("处理中");
  351. let url = '{{ route("workOrder.loss.createBatchApi") }}';
  352. axios.post(url, data).then(res => {
  353. this.cancelWaitingTempTip();
  354. if (res.data.success === true) {
  355. this.successTempTip("添加成功");
  356. this.cancelSubData();
  357. } else {
  358. this.errorTempTip(res.data.message ? res.data.message : "创建出现异常");
  359. }
  360. }).catch(err => {
  361. this.cancelWaitingTempTip();
  362. this.errorTempTip(err);
  363. });
  364. },
  365. intercept() {
  366. let {remark, logisticNumbers} = this;
  367. let data = {
  368. logistic_numbers: logisticNumbers,
  369. remark: remark
  370. };
  371. this.waitingTempTip("处理中");
  372. let url = '{{ route("workOrder.intercept.createBatchApi") }}';
  373. axios.post(url, data).then(res => {
  374. this.cancelWaitingTempTip();
  375. if (res.data.success === true) {
  376. this.successTempTip("添加成功");
  377. this.cancelSubData();
  378. } else {
  379. this.errorTempTip(res.data.message ? res.data.message : "创建出现异常");
  380. }
  381. }).catch(err => {
  382. this.cancelWaitingTempTip();
  383. this.errorTempTip(err);
  384. });
  385. },
  386. cancelIntercept() {
  387. let url = '{{ route("workOrder.cancelIntercept.createBatchApi") }}';
  388. let {remark, logisticNumbers} = this;
  389. let data = {
  390. logistic_numbers: logisticNumbers,
  391. remark: remark
  392. };
  393. this.waitingTempTip("处理中");
  394. axios.post(url, data).then(res => {
  395. this.cancelWaitingTempTip();
  396. if (res.data.success === true) {
  397. this.successTempTip("添加成功");
  398. this.cancelSubData();
  399. } else {
  400. this.errorTempTip(res.data.message ? res.data.message : "创建出现异常");
  401. }
  402. }).catch(err => {
  403. this.cancelWaitingTempTip();
  404. this.errorTempTip(err);
  405. });
  406. },
  407. informationChange() {
  408. let url = '{{route('workOrder.informationChange.createBatchApi')}}';
  409. let {logisticNumbers, infoChange} = this;
  410. let data = {
  411. logistic_numbers: logisticNumbers,
  412. data: infoChange,
  413. };
  414. this.waitingTempTip("处理中");
  415. axios.post(url, data).then(res => {
  416. this.cancelWaitingTempTip();
  417. if (res.data.success === true) {
  418. this.successTempTip("添加成功");
  419. this.cancelSubData();
  420. } else {
  421. this.errorTempTip(res.data.message ? res.data.message : "创建出现异常");
  422. }
  423. }).catch(err => {
  424. this.cancelWaitingTempTip();
  425. this.errorTempTip(err);
  426. });
  427. },
  428. mistake() {
  429. let url = '{{route('workOrder.mistake.createBatchApi')}}';
  430. let {logisticNumbers, mistakes, remark} = this;
  431. let mistakesCommodities = [];
  432. for (let key in mistakes) {
  433. let commodities = mistakes[`${key}`] ? mistakes[`${key}`] : [];
  434. commodities = commodities.map(item => JSON.stringify(item));
  435. mistakesCommodities.push({
  436. order_no: key,
  437. commodities: commodities,
  438. });
  439. }
  440. let data = {
  441. logistic_numbers: logisticNumbers,
  442. remark: remark,
  443. data: mistakesCommodities,
  444. };
  445. this.waitingTempTip("提交中");
  446. axios.post(url, data).then(res => {
  447. this.cancelWaitingTempTip();
  448. if (res.data.success === true) {
  449. this.successTempTip("添加成功");
  450. this.cancelSubData();
  451. } else {
  452. this.errorTempTip(res.data.message ? res.data.message : "创建出现异常");
  453. }
  454. }).catch(err => {
  455. this.cancelWaitingTempTip();
  456. this.errorTempTip(err);
  457. });
  458. },
  459. expressAbnormal() {
  460. let {expressAbnormalData, remark} = this;
  461. let message = '';
  462. this.waitingTempTip("处理中");
  463. for (let i = 0; i < expressAbnormalData.length; i++) {
  464. let expressAbnormal = expressAbnormalData[i];
  465. let data = new FormData();
  466. let packages = expressAbnormal.packages ? expressAbnormal.packages : [];
  467. data.append('order_no', expressAbnormal.order_no);
  468. data.append('remark', remark);
  469. data.append('type', expressAbnormal.abnormal_type);
  470. data.append('process_progress', expressAbnormal.abnormal_type);
  471. packages = packages.filter(item => item.select);
  472. packages.forEach(e => {
  473. data.append('commodities[]', JSON.stringify({logistic_number: e.logistic_number}));
  474. })
  475. let dealImages = this.getImages(expressAbnormal.dealImages);
  476. console.log(data);
  477. // this.setFormDataImagePrefix(data, 'dealImages', dealImages);
  478. // this.syncExpressAbnormal(data).then(res => {
  479. // if (i === (expressAbnormalData.length - 1)) {
  480. // this.cancelWaitingTempTip();
  481. // this.cancelSubData();
  482. // }
  483. // this.successTempTip(`${expressAbnormal.order_no}创建完成`);
  484. // }).catch(err => {
  485. // message += err + '\\n';
  486. // });
  487. }
  488. },
  489. syncExpressAbnormal(data) {
  490. let url = "{{route('workOrder.expressAbnormal.storeApi')}}";
  491. return new Promise((resolve, reject) => {
  492. axios.post(url, data).then(res => {
  493. if (res.data.success) {
  494. resolve(true)
  495. } else {
  496. reject(res.data.message ? res.data.message : '创建工单异常');
  497. }
  498. }).catch(err => {
  499. reject(err);
  500. })
  501. });
  502. },
  503. damage() {
  504. let {damages, remark} = this;
  505. let message = '';
  506. this.waitingTempTip("处理中");
  507. for (let i = 0; i < damages.length; i++) {
  508. let fromData = new FormData();
  509. let damage = damages[i];
  510. let price = damage.price;
  511. let commodities = damage.commodities ? damage.commodities : [];
  512. fromData.append('order_no', damage.order_no);
  513. fromData.append('price', price);
  514. fromData.append('remark', remark);
  515. let packageImages = this.getImages(damage.packageImages ? damage.packageImages : []);
  516. this.setFormDataImagePrefix(fromData, 'packageImages', packageImages);
  517. let dealImages = this.getImages(damage.dealImages ? damage.dealImages : []);
  518. this.setFormDataImagePrefix(fromData, 'dealImages', dealImages);
  519. let commodityImages = this.getImages(damage.commodityImages ? damage.commodityImages : []);
  520. this.setFormDataImagePrefix(fromData, 'commodityImages', commodityImages);
  521. commodities.filter(item=>{
  522. return Number(item.abnormal_amount) !== 0;
  523. }).forEach(e => {
  524. fromData.append('commodities[]', JSON.stringify(e));
  525. });
  526. this.syncDamage(fromData).then(res => {
  527. if (i === (damages.length - 1)) {
  528. this.cancelWaitingTempTip();
  529. this.cancelSubData();
  530. }
  531. this.successTempTip(`${damage.order_no}创建完成`);
  532. }).catch(err => {
  533. message += err + '\\n';
  534. });
  535. }
  536. },
  537. syncDamage(data) {
  538. let url = "{{route('workOrder.damage.storeApi')}}";
  539. return new Promise((resolve, reject) => {
  540. axios.post(url, data).then(res => {
  541. if (res.data.success) {
  542. resolve(true)
  543. } else {
  544. reject(res.data.message ? res.data.message : '创建工单异常');
  545. }
  546. }).catch(err => {
  547. reject(err);
  548. })
  549. });
  550. },
  551. getIntercept(){
  552. let url = '{{route('workOrder.intercept.checkLogisticNumberApi')}}';
  553. let data = {
  554. 'logistic_numbers': this.logisticNumbers,
  555. };
  556. axios.post(url, data).then(res => {
  557. if (res.data.success) {
  558. if (res.data.data) {
  559. this.infoChange = res.data.data.map(item => {
  560. item.remark = '';
  561. return item;
  562. });
  563. }
  564. } else {
  565. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  566. }
  567. }).catch(err => {
  568. this.errorTempTip(err);
  569. });
  570. },
  571. getInfoChangeData() {
  572. let url = '{{route('workOrder.informationChange.checkLogisticNumberApi')}}';
  573. let data = {
  574. 'logistic_numbers': this.logisticNumbers,
  575. };
  576. axios.post(url, data).then(res => {
  577. if (res.data.success) {
  578. this.infoChange = res.data.data.map(item => {
  579. item.remark = '';
  580. return item;
  581. });
  582. } else {
  583. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  584. }
  585. }).catch(err => {
  586. this.errorTempTip(err);
  587. });
  588. },
  589. getMistakeData() {
  590. let url = '{{route('workOrder.mistake.checkLogisticNumberApi')}}';
  591. let data = {
  592. 'logistic_numbers': this.logisticNumbers
  593. };
  594. axios.post(url, data).then(res => {
  595. if (res.data.success) {
  596. res.data.data.forEach((item) => {
  597. item.abnormal_amount = item.amount;
  598. item.abnormal_type = '未错漏发';
  599. item.select = false;
  600. });
  601. let mistakes = {};
  602. for (let i = 0; i < res.data.data.length; i++) {
  603. let data = res.data.data[i];
  604. let order_code = data['order_code'];
  605. if (mistakes[order_code] == null) {
  606. mistakes[order_code] = []
  607. }
  608. mistakes[order_code].push(data);
  609. }
  610. this.mistakes = mistakes;
  611. } else {
  612. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  613. }
  614. }).catch(err => {
  615. this.errorTempTip(err);
  616. });
  617. },
  618. getExpressAbnormalData() {
  619. let url = '{{route('workOrder.expressAbnormal.checkLogisticNumberApi')}}';
  620. let data = {
  621. 'logistic_numbers': this.logisticNumbers
  622. };
  623. axios.post(url, data).then(res => {
  624. if (res.data.success) {
  625. this.expressAbnormalData = res.data.data.map(item => {
  626. item.abnormal_type = null;
  627. item.dealImages = [];
  628. item.packages.forEach(item => item.select = false);
  629. if(item.packages.length === 1){
  630. item.packages.map(i => i.select = true);
  631. }
  632. return item;
  633. });
  634. } else {
  635. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  636. }
  637. }).catch(err => {
  638. this.errorTempTip(err);
  639. });
  640. },
  641. getDamages() {
  642. let url = '{{route('workOrder.damage.checkLogisticNumberApi')}}';
  643. let data = {
  644. 'logistic_numbers': this.logisticNumbers
  645. };
  646. axios.post(url, data).then(res => {
  647. if (res.data.data) {
  648. res.data.data.forEach(item => {
  649. item.commodities.forEach(i => {
  650. i.abnormal_type = "破损";
  651. i.abnormal_amount = i.amount;
  652. i.price = 0;
  653. });
  654. item.commodityImages = [];
  655. item.dealImages = [];
  656. item.packageImages = [];
  657. item.price = 0;
  658. })
  659. this.damages = res.data.data;
  660. } else {
  661. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  662. }
  663. }).catch(err => {
  664. this.errorTempTip(err);
  665. });
  666. },
  667. computerPrice(item) {
  668. let {commodities} = item;
  669. item.price = commodities.map(item => {
  670. let {price, abnormal_amount} = item;
  671. return price * abnormal_amount;
  672. }).reduce((perv, next) => {
  673. return perv + next
  674. });
  675. },
  676. waitingTempTip(message) {
  677. window.tempTip.setIndex(2005);
  678. window.tempTip.setDuration(9999);
  679. window.tempTip.waitingTip(message);
  680. },
  681. cancelWaitingTempTip() {
  682. window.tempTip.cancelWaitingTip();
  683. },
  684. successTempTip(message) {
  685. window.tempTip.setDuration(1500);
  686. window.tempTip.setIndex(2005);
  687. window.tempTip.showSuccess(message);
  688. },
  689. errorTempTip(message) {
  690. window.tempTip.setDuration(2000);
  691. window.tempTip.setIndex(2005);
  692. window.tempTip.show(message);
  693. },
  694. mistakeAbnormalType(item) {
  695. let {abnormal_amount, amount} = item;
  696. if (abnormal_amount === amount) {
  697. item.abnormal_type = "未错漏发";
  698. } else if (abnormal_amount > amount) {
  699. item.abnormal_type = "多发";
  700. } else if (abnormal_amount < amount) {
  701. item.abnormal_type = "少发"
  702. }
  703. },
  704. addMistakeItem(mistake, i) {
  705. let logisticNumber = $(this.$refs["logistic_number" + i][0]).val();
  706. let sku = $(this.$refs["sku" + i][0]).val();
  707. let abnormalAmount = $(this.$refs["abnormal_amount" + i][0]).val();
  708. let ownerId = mistake[0]['owner_id'] ?? '';
  709. if (ownerId === '' || ownerId == null) {
  710. this.errorTempTip("添加商品时,校验失败货主异常");
  711. return;
  712. }
  713. this.asyncAddMistakeItem(mistake, i, ownerId, sku, abnormalAmount, logisticNumber);
  714. },
  715. cancelMistakeItem(i) {
  716. $(this.$refs["logistic_number" + i][0]).val("");
  717. $(this.$refs["sku" + i][0]).val("");
  718. $(this.$refs["abnormal_amount" + i][0]).val("");
  719. },
  720. asyncAddMistakeItem(mistake, i, ownerId, sku, abnormalAmount, logisticNumber) {
  721. let url = "{{route('commodity.getCommodityApi')}}";
  722. let data = {
  723. owner_id: ownerId,
  724. sku: sku
  725. }
  726. this.waitingTempTip("查询中");
  727. axios.post(url, data).then(res => {
  728. this.cancelWaitingTempTip();
  729. if (res.data.success) {
  730. let item = JSON.parse(JSON.stringify(mistake[0]));
  731. item.abnormal_amount = abnormalAmount;
  732. item.abnormal_type = "多发";
  733. item.logistic_number = logisticNumber;
  734. item.amount = 0;
  735. item.sku_name = res.data.data.name;
  736. item.commodity_id = res.data.data.id;
  737. mistake.push(item);
  738. this.cancelMistakeItem(i);
  739. } else {
  740. this.errorTempTip(res.data.message ? res.data.message : '查询商品失败')
  741. }
  742. }).catch(err => {
  743. this.cancelWaitingTempTip();
  744. this.errorTempTip(err);
  745. })
  746. },
  747. checkRemark() {
  748. let {remark} = this;
  749. if (remark == null || remark === "") return false;
  750. return remark.trim().length !== 0;
  751. },
  752. cancelSubData() {
  753. this.logisticNumbers = null;
  754. this.issueType = null;
  755. this.remark = null;
  756. this.infoChange = [];
  757. this.mistakes = [];
  758. this.expressAbnormalData = [];
  759. this.damages = [];
  760. },
  761. checkInfoChange() {
  762. let {infoChange} = this;
  763. if(infoChange.length === 0){
  764. this.errorTempTip("请检查信息");
  765. return false;
  766. }
  767. for (let i = 0; i < infoChange.length; i++) {
  768. let info = infoChange[i];
  769. let {remark} = info;
  770. if(remark == null || remark === "" || remark.trim().length === 0){
  771. this.errorTempTip("收方信息未必填项");
  772. return false;
  773. }
  774. }
  775. return true;
  776. },
  777. checkMistakes() {
  778. let {mistakes,remark} = this;
  779. if (mistakes.length === 0) {
  780. this.errorTempTip("请校验提交的商品信息是否为勾选")
  781. return false;
  782. }
  783. if(remark == null || remark === "" || remark.trim().length === 0){
  784. this.errorTempTip("问题描述为必填项");
  785. return false;
  786. }
  787. for (let orderCode in mistakes) {
  788. let mistake = mistakes[`${orderCode}`];
  789. if (!mistake) {
  790. this.errorTempTip('订单:${orderCode}未有订单商品信息');
  791. return false;
  792. }
  793. let count = mistake.filter(item => item.select === true).length;
  794. if (count === 0) {
  795. this.errorTempTip(`订单:${orderCode}未勾选商品列`);
  796. return false;
  797. }
  798. }
  799. return true;
  800. },
  801. checkExpressAbnormal() {
  802. let {expressAbnormalData,remark} = this;
  803. if (expressAbnormalData.length === 0) {
  804. this.errorTempTip("提交参数异常!");
  805. return false;
  806. }
  807. if(remark == null || remark === "" || remark.trim().length === 0){
  808. this.errorTempTip("问题描述为必填项");
  809. return false;
  810. }
  811. for (let i = 0; i < expressAbnormalData.length; i++) {
  812. let data = expressAbnormalData[i];
  813. let selectCount = data.packages.filter(item => item.select).length;
  814. if (selectCount === 0) {
  815. this.errorTempTip(`未选中快递单号 订单:${data.code}!`);
  816. return false;
  817. }
  818. }
  819. @if(\Illuminate\Support\Facades\Gate::check('订单管理-工单处理-宝时编辑') )
  820. @elseif(\Illuminate\Support\Facades\Gate::check('订单管理-工单处理-商家编辑'))
  821. for (let i = 0; i < expressAbnormalData.length; i++) {
  822. let data = expressAbnormalData[i];
  823. let selectCount = data.dealImages.filter(item => item.select).length;
  824. if (selectCount === 0) {
  825. this.errorTempTip(`未上传破损图片 订单:${data.code}!`);
  826. return false;
  827. }
  828. }
  829. @endif
  830. return true;
  831. },
  832. checkDamage() {
  833. let {damages,remark} = this;
  834. if(remark == null || remark === "" || remark.trim().length === 0){
  835. this.errorTempTip("问题描述为必填项");
  836. return false;
  837. }
  838. for (let i = 0; i < damages.length; i++) {
  839. let damage = damages[i];
  840. let {commodities,order_no} = damage;
  841. if(commodities.length === 0){
  842. this.errorTempTip(`订单${order_no}无商品详情`);
  843. return false;
  844. }
  845. let count = commodities.filter(item=>{
  846. return Number(item.abnormal_amount) === 0;
  847. }).length;
  848. if(count === commodities.length){
  849. this.errorTempTip(`${order_no}未填写破损数量`);
  850. return false;
  851. }
  852. }
  853. return true;
  854. },
  855. pasteImage(event, imageArray) {
  856. for (let i = 0; i < event.clipboardData.items.length; i++) {
  857. let item = event.clipboardData.items[i];
  858. if (item.kind === 'string') continue;
  859. if (item.type.indexOf('image') === -1) continue;
  860. if (item.kind === 'file') {
  861. let blob = item.getAsFile();
  862. let src = null;
  863. this.blobToBase64(blob).then(res => {
  864. src = res;
  865. imageArray.push({src: src, file: blob});
  866. });
  867. }
  868. }
  869. event.preventDefault();
  870. },
  871. spliceImage(i, images) {
  872. if (!confirm('是否取消选择该图片')) return;
  873. images.splice(i, 1);
  874. },
  875. blobToBase64(blob) {
  876. return new Promise((resolve, reject) => {
  877. const fileReader = new FileReader();
  878. fileReader.onload = (e) => {
  879. resolve(e.target.result);
  880. };
  881. fileReader.readAsDataURL(blob);
  882. fileReader.onerror = () => {
  883. reject(new Error('blobToBase64 error'));
  884. };
  885. });
  886. },
  887. getImages(images) {
  888. return images.map((item) => {
  889. return item.file;
  890. })
  891. },
  892. setFormDataImagePrefix(formData, prefix, images) {
  893. images.forEach((item) => {
  894. formData.append(`${prefix}[]`, item);
  895. });
  896. },
  897. }
  898. })
  899. </script>
  900. @endsection