index.blade.php 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883
  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. <select name="issueType" id="issueType" class="form-control" v-model="issueType">
  17. <option value=""></option>
  18. <option v-for="item in issueTypes" :value="item.name">@{{ item.name }}</option>
  19. </select>
  20. </div>
  21. <div class="form-group" id="remark-div" v-if="showRemarkDiv">
  22. <label for="">请填写问题描述</label>
  23. <textarea class="form-control" name="remark" id="remark" cols="30" rows="2" ref="remark"
  24. v-model="remark"></textarea>
  25. </div>
  26. <div class="form-group" id="info-edit" v-if="'信息更改' === issueType">
  27. <div class="alert alert-info" v-for="(item,index) in infoChange">
  28. <div class="form-row">
  29. <div class="col-sm-3">
  30. <label>订单</label>
  31. <p v-text="item.code"></p>
  32. </div>
  33. <div class="col-sm-9 ">
  34. <label class="text-dark font-weight-bolder"><span class="text-danger">*</span>请填写新的收方信息</label>
  35. <textarea class="form-control form-control-sm col-12" name="" id="" cols="30" rows="2"
  36. v-model="item.remark"></textarea>
  37. </div>
  38. </div>
  39. </div>
  40. </div>
  41. <div class="form-group" id="info-edit" v-if="'错漏发' === issueType">
  42. <p for="" class="">商品信息:<span class="text-primary float-right">注意需要勾选商品列才能正确提交!</span></p>
  43. <div class="alert alert-info" v-for="(mistake,index) in mistakes">
  44. <div class="form-row">
  45. <label class="text-dark font-weight-bolder" v-text="'订单号:'+index"></label>
  46. <table class="table table-bordered table-hover bg-white">
  47. <thead>
  48. <tr>
  49. <th scope="col">勾选</th>
  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. </tr>
  57. </thead>
  58. <tbody>
  59. <tr v-for="(item,index) in mistake">
  60. <td>
  61. <div class="form-group form-check">
  62. <input type="checkbox" class="form-check-input" v-model="item.select">
  63. </div>
  64. </td>
  65. <td v-text="item.logistic_number"></td>
  66. <td v-text="item.sku"></td>
  67. <td v-text="item.sku_name"></td>
  68. <td v-text="item.amount"></td>
  69. <td v-text="item.abnormal_type"></td>
  70. <td>
  71. <input type="number" class="form-control form-control-sm"
  72. v-model="item.abnormal_amount"
  73. @input="mistakeAbnormalType(item)">
  74. </td>
  75. </tr>
  76. </tbody>
  77. </table>
  78. <table>
  79. <tbody>
  80. <tr class="add-mistake">
  81. <td><input type="text" placeholder="快递单号" class="logistic_number form-control"
  82. :ref="'logistic_number'+index"></td>
  83. <td><input type="text" placeholder="商品条码" class="sku form-control"
  84. :ref="'sku'+index"></td>
  85. <td><input type="text" placeholder="实收数量" class="abnormal_amount form-control"
  86. :ref="'abnormal_amount'+index"></td>
  87. <td>
  88. <button class="btn btn-sm btn-outline-success" @click="addMistakeItem(mistake,index)">
  89. 添加
  90. </button>
  91. </td>
  92. </tr>
  93. </tbody>
  94. </table>
  95. </div>
  96. </div>
  97. </div>
  98. <div class="form-group" id="express-abnormal-edit" v-if="'快递异常' === issueType"
  99. v-for="(item,index) in expressAbnormalData">
  100. <p class="text-dark">异常信息</p>
  101. <div class="alert alert-info">
  102. <p class="text-dark font-weight-bolder" v-text="'订单号:'+item.order_no"></p>
  103. <div class="form-row">
  104. <div class="col-sm-3">
  105. <label class="text-dark">快递单号</label>
  106. <div class="form-group form-check" v-for="package in item.packages">
  107. <input type="checkbox" class="form-check-input"
  108. :id=" item.code+':'+ package.logistic_number" v-model="package.select">
  109. <label class="text-dark " v-text="package.logistic_number"
  110. :for="item.code+':'+ package.logistic_number"></label>
  111. </div>
  112. </div>
  113. <div class="col-sm-3 ">
  114. <label class="text-dark "><span class="text-danger">*</span>请选择异常类型</label>
  115. <select name="" id="" class="form-control" v-model="item.abnormal_type">
  116. <option v-for="type in expressAbnormalType" v-text="type" :value="type"></option>
  117. </select>
  118. </div>
  119. <div class="col-sm-6 ">
  120. <label class="text-dark"><span class="text-danger">*</span>交易截图</label>
  121. <div class="h-auto border border-secondary bg-white rounded" id="package-image"
  122. style="min-height: 75px"
  123. contenteditable="true"
  124. @paste="pasteImage($event,item.dealImages)">
  125. <div v-for="(image,i) in item.dealImages"
  126. class="d-inline-block col-4 position-relative card">
  127. <div class="card-body">
  128. <img :src="image.src" class="card-img-top" :alt="image.file.name">
  129. <div class="float-right position-relative">
  130. <button type="button" class="btn btn-sm btn-outline-danger"
  131. @click="spliceImage(i,item.dealImages)">取消
  132. </button>
  133. </div>
  134. </div>
  135. </div>
  136. </div>
  137. </div>
  138. </div>
  139. </div>
  140. </div>
  141. <div class="form-group" id="damage-edit" v-if="'破损' === issueType">
  142. <p class="text-dark">破损信息</p>
  143. <div class="alert alert-info" v-for="(item,index) in damages">
  144. <div class="form-row ">
  145. <label class="">订单:</label>
  146. <label class="text-dark" v-text="item.order_no"></label>
  147. </div>
  148. <div class="form-row mb-2">
  149. <label class="">破损商品价格:</label>
  150. <div class="col-sm-4">
  151. <input type="number" class="form-control form-control-sm" v-model="item.price">
  152. </div>
  153. </div>
  154. <div class="damage-table form-row form-group">
  155. <table class="table table-bordered bg-white">
  156. <thead>
  157. <tr>
  158. <th>快递单号</th>
  159. <th>商品条码</th>
  160. <th>异常类型</th>
  161. <th>商品名称</th>
  162. <th>订单数量</th>
  163. <th>异常数量</th>
  164. <th>破损单价</th>
  165. </tr>
  166. </thead>
  167. <tbody>
  168. <tr v-for="(commodity,i) in item.commodities">
  169. <td v-text="commodity.logistic_number"></td>
  170. <td v-text="commodity.sku"></td>
  171. <th v-text="commodity.abnormal_type"></th>
  172. <td v-text="commodity.sku_name"></td>
  173. <td v-text="commodity.amount"></td>
  174. <td>
  175. <input type="number" class="form-control form-control-sm"
  176. v-model="commodity.abnormal_amount" @change="computerPrice(item)">
  177. </td>
  178. <td>
  179. <input type="number" class="form-control form-control-sm"
  180. v-model="commodity.price" @change="computerPrice(item)">
  181. </td>
  182. </tr>
  183. </tbody>
  184. </table>
  185. </div>
  186. <div class="form-row">
  187. <div class="col-sm-4">
  188. <label class="text-dark"><span class="text-danger">*</span>外包装图片</label>
  189. <div class="h-auto border border-secondary bg-white rounded"
  190. style="min-height: 100px"
  191. contenteditable="true"
  192. @paste="pasteImage($event,item.packageImages)">
  193. <div v-for="(image,i) in item.packageImages"
  194. class="d-inline-block col-4 position-relative card">
  195. <div class="card-body">
  196. <img :src="image.src" class="card-img-top" :alt="image.file.name">
  197. <div class="float-right position-relative">
  198. <button type="button" class="btn btn-sm btn-outline-danger"
  199. @click="spliceImage(i,item.packageImages)">取消
  200. </button>
  201. </div>
  202. </div>
  203. </div>
  204. </div>
  205. </div>
  206. <div class="col-sm-4">
  207. <label class="text-dark"><span class="text-danger">*</span>内物破损图</label>
  208. <div class="h-auto border border-secondary bg-white rounded"
  209. style="min-height: 100px"
  210. contenteditable="true"
  211. @paste="pasteImage($event,item.commodityImages)">
  212. <div v-for="(image,i) in item.commodityImages"
  213. class="d-inline-block col-4 position-relative card">
  214. <div class="card-body">
  215. <img :src="image.src" class="card-img-top" :alt="image.file.name">
  216. <div class="float-right position-relative">
  217. <button type="button" class="btn btn-sm btn-outline-danger"
  218. @click="spliceImage(i,item.commodityImages)">取消
  219. </button>
  220. </div>
  221. </div>
  222. </div>
  223. </div>
  224. </div>
  225. <div class="col-sm-4">
  226. <label class="text-dark"><span class="text-danger">*</span>交易截图</label>
  227. <div class="h-auto border border-secondary bg-white rounded"
  228. style="min-height: 100px"
  229. contenteditable="true"
  230. @paste="pasteImage($event,item.dealImages)">
  231. <div v-for="(image,i) in item.dealImages"
  232. class="d-inline-block col-4 position-relative card">
  233. <div class="card-body">
  234. <img :src="image.src" class="card-img-top" :alt="image.file.name">
  235. <div class="float-right position-relative">
  236. <button type="button" class="btn btn-sm btn-outline-danger"
  237. @click="spliceImage(i,item.dealImages)">取消
  238. </button>
  239. </div>
  240. </div>
  241. </div>
  242. </div>
  243. </div>
  244. </div>
  245. </div>
  246. </div>
  247. <div class="form-group" id="submit-div">
  248. <button class="btn btn-primary" @click="submit" >提交</button>
  249. </div>
  250. </div>
  251. @endsection
  252. @section("lastScript")
  253. <script>
  254. new Vue({
  255. el: "#batch_container",
  256. data: {
  257. issueTypes: {!! $types !!},
  258. issueType: null,
  259. logisticNumbers: null,
  260. remark: null,
  261. expressAbnormalType: ['在途异常', '签收未收到'],
  262. infoChange: [],
  263. mistakes: [],
  264. expressAbnormalData: [],
  265. damages: [],
  266. },
  267. computed: {
  268. showRemarkDiv() {
  269. return '信息更改' !== this.issueType;
  270. }
  271. },
  272. watch: {
  273. issueType: function (val) {
  274. if (val === "信息更改") {
  275. this.getInfoChangeData();
  276. } else if (val === "错漏发") {
  277. this.getMistakeData();
  278. } else if (val === "快递异常") {
  279. this.getExpressAbnormalData();
  280. } else if (val === "破损") {
  281. this.getDamages();
  282. } else if(val==="拦截"){
  283. this.getIntercept();
  284. }
  285. this.cancelSubData();
  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. this.infoChange = res.data.data.map(item => {
  556. item.remark = '';
  557. return item;
  558. });
  559. } else {
  560. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  561. }
  562. }).catch(err => {
  563. this.errorTempTip(err);
  564. });
  565. },
  566. getInfoChangeData() {
  567. let url = '{{route('workOrder.informationChange.checkLogisticNumberApi')}}';
  568. let data = {
  569. 'logistic_numbers': this.logisticNumbers,
  570. };
  571. axios.post(url, data).then(res => {
  572. if (res.data.success) {
  573. this.infoChange = res.data.data.map(item => {
  574. item.remark = '';
  575. return item;
  576. });
  577. } else {
  578. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  579. }
  580. }).catch(err => {
  581. this.errorTempTip(err);
  582. });
  583. },
  584. getMistakeData() {
  585. let url = '{{route('workOrder.mistake.checkLogisticNumberApi')}}';
  586. let data = {
  587. 'logistic_numbers': this.logisticNumbers
  588. };
  589. axios.post(url, data).then(res => {
  590. if (res.data.success) {
  591. res.data.data.forEach((item) => {
  592. item.abnormal_amount = item.amount;
  593. item.abnormal_type = '未错漏发';
  594. item.select = false;
  595. });
  596. let mistakes = {};
  597. for (let i = 0; i < res.data.data.length; i++) {
  598. let data = res.data.data[i];
  599. let order_code = data['order_code'];
  600. if (mistakes[order_code] == null) {
  601. mistakes[order_code] = []
  602. }
  603. mistakes[order_code].push(data);
  604. }
  605. this.mistakes = mistakes;
  606. } else {
  607. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  608. }
  609. }).catch(err => {
  610. this.errorTempTip(err);
  611. });
  612. },
  613. getExpressAbnormalData() {
  614. let url = '{{route('workOrder.expressAbnormal.checkLogisticNumberApi')}}';
  615. let data = {
  616. 'logistic_numbers': this.logisticNumbers
  617. };
  618. axios.post(url, data).then(res => {
  619. if (res.data.success) {
  620. this.expressAbnormalData = res.data.data.map(item => {
  621. item.abnormal_type = null;
  622. item.dealImages = [];
  623. item.packages.forEach(item => item.select = false);
  624. return item;
  625. });
  626. } else {
  627. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  628. }
  629. }).catch(err => {
  630. this.errorTempTip(err);
  631. });
  632. },
  633. getDamages() {
  634. let url = '{{route('workOrder.damage.checkLogisticNumberApi')}}';
  635. let data = {
  636. 'logistic_numbers': this.logisticNumbers
  637. };
  638. axios.post(url, data).then(res => {
  639. if (res.data.data) {
  640. res.data.data.forEach(item => {
  641. item.commodities.forEach(i => {
  642. i.abnormal_type = "破损";
  643. i.abnormal_amount = i.amount;
  644. i.price = 0;
  645. });
  646. item.commodityImages = [];
  647. item.dealImages = [];
  648. item.packageImages = [];
  649. item.price = 0;
  650. })
  651. this.damages = res.data.data;
  652. } else {
  653. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  654. }
  655. }).catch(err => {
  656. this.errorTempTip(err);
  657. });
  658. },
  659. computerPrice(item) {
  660. let {commodities} = item;
  661. item.price = commodities.map(item => {
  662. let {price, abnormal_amount} = item;
  663. return price * abnormal_amount;
  664. }).reduce((perv, next) => {
  665. return perv + next
  666. });
  667. },
  668. waitingTempTip(message) {
  669. window.tempTip.setIndex(2005);
  670. window.tempTip.setDuration(9999);
  671. window.tempTip.waitingTip(message);
  672. },
  673. cancelWaitingTempTip() {
  674. window.tempTip.cancelWaitingTip();
  675. },
  676. successTempTip(message) {
  677. window.tempTip.setDuration(1500);
  678. window.tempTip.setIndex(2005);
  679. window.tempTip.showSuccess(message);
  680. },
  681. errorTempTip(message) {
  682. window.tempTip.setDuration(2000);
  683. window.tempTip.setIndex(2005);
  684. window.tempTip.show(message);
  685. },
  686. mistakeAbnormalType(item) {
  687. let {abnormal_amount, amount} = item;
  688. if (abnormal_amount === amount) {
  689. item.abnormal_type = "未错漏发";
  690. } else if (abnormal_amount > amount) {
  691. item.abnormal_type = "多发";
  692. } else if (abnormal_amount < amount) {
  693. item.abnormal_type = "少发"
  694. }
  695. },
  696. addMistakeItem(mistake, i) {
  697. let logisticNumber = $(this.$refs["logistic_number" + i][0]).val();
  698. let sku = $(this.$refs["sku" + i][0]).val();
  699. let abnormalAmount = $(this.$refs["abnormal_amount" + i][0]).val();
  700. let ownerId = mistake[0]['owner_id'] ?? '';
  701. if (ownerId === '' || ownerId == null) {
  702. this.errorTempTip("添加商品时,校验失败货主异常");
  703. return;
  704. }
  705. this.asyncAddMistakeItem(mistake, i, ownerId, sku, abnormalAmount, logisticNumber);
  706. },
  707. cancelMistakeItem(i) {
  708. $(this.$refs["logistic_number" + i][0]).val("");
  709. $(this.$refs["sku" + i][0]).val("");
  710. $(this.$refs["abnormal_amount" + i][0]).val("");
  711. },
  712. asyncAddMistakeItem(mistake, i, ownerId, sku, abnormalAmount, logisticNumber) {
  713. let url = "{{route('commodity.getCommodityApi')}}";
  714. let data = {
  715. owner_id: ownerId,
  716. sku: sku
  717. }
  718. this.waitingTempTip("查询中");
  719. axios.post(url, data).then(res => {
  720. this.cancelWaitingTempTip();
  721. if (res.data.success) {
  722. let item = JSON.parse(JSON.stringify(mistake[0]));
  723. item.abnormal_amount = abnormalAmount;
  724. item.abnormal_type = "多发";
  725. item.logistic_number = logisticNumber;
  726. item.amount = 0;
  727. item.sku_name = res.data.data.name;
  728. item.commodity_id = res.data.data.id;
  729. mistake.push(item);
  730. this.cancelMistakeItem(i);
  731. } else {
  732. this.errorTempTip(res.data.message ? res.data.message : '查询商品失败')
  733. }
  734. }).catch(err => {
  735. this.cancelWaitingTempTip();
  736. this.errorTempTip(err);
  737. })
  738. },
  739. checkRemark() {
  740. let {remark} = this;
  741. if (remark == null || remark === "") return false;
  742. return remark.trim().length !== 0;
  743. },
  744. cancelSubData() {
  745. this.logisticNumbers = null;
  746. this.issueType = null;
  747. this.remark = null;
  748. this.infoChange = [];
  749. this.mistakes = [];
  750. this.expressAbnormalData = [];
  751. this.damages = [];
  752. },
  753. checkInfoChange() {
  754. let {infoChange} = this;
  755. if(infoChange.length === 0){
  756. this.errorTempTip("请检查信息");
  757. return false;
  758. }
  759. for (let i = 0; i < infoChange.length; i++) {
  760. let info = infoChange[i];
  761. let {remark} = info;
  762. if(remark == null || remark === "" || remark.trim().length === 0){
  763. this.errorTempTip("收方信息未必填项");
  764. }
  765. }
  766. return true;
  767. },
  768. checkMistakes() {
  769. let {mistakes} = this;
  770. if (mistakes.length === 0) {
  771. this.errorTempTip("请校验提交的商品信息是否为勾选")
  772. return false;
  773. }
  774. for (let orderCode in mistakes) {
  775. let mistake = mistakes[`${orderCode}`];
  776. if (!mistake) {
  777. this.errorTempTip('订单:${orderCode}未有订单商品信息');
  778. return false;
  779. }
  780. let count = mistake.filter(item => item.select === true).length;
  781. if (count === 0) {
  782. this.errorTempTip(`订单:${orderCode}未勾选商品列`);
  783. return false;
  784. }
  785. }
  786. return true;
  787. },
  788. checkExpressAbnormal() {
  789. let {expressAbnormalData} = this;
  790. if (expressAbnormalData.length === 0) {
  791. this.errorTempTip("提交参数异常!");
  792. return false;
  793. }
  794. for (let i = 0; i < expressAbnormalData.length; i++) {
  795. let data = expressAbnormalData[i];
  796. let selectCount = data.packages.filter(item => item.select).length;
  797. if (selectCount === 0) {
  798. this.errorTempTip(`未选中快递单号 订单:${data.code}!`);
  799. return false;
  800. }
  801. }
  802. return true;
  803. },
  804. checkDamage() {
  805. let {damages} = this;
  806. for (let i = 0; i < damages.length; i++) {
  807. let damage = damages[i];
  808. let {commodities,order_no} = damage;
  809. if(commodities.length === 0){
  810. this.errorTempTip(`订单${order_no}无商品详情`);
  811. return false;
  812. }
  813. let count = commodities.filter(item=>{
  814. return Number(item.abnormal_amount) === 0;
  815. }).length;
  816. if(count === commodities.length){
  817. this.errorTempTip(`${order_no}未填写破损数量`);
  818. return false;
  819. }
  820. }
  821. return true;
  822. },
  823. pasteImage(event, imageArray) {
  824. for (let i = 0; i < event.clipboardData.items.length; i++) {
  825. let item = event.clipboardData.items[i];
  826. if (item.kind === 'string') continue;
  827. if (item.type.indexOf('image') === -1) continue;
  828. if (item.kind === 'file') {
  829. let blob = item.getAsFile();
  830. let src = null;
  831. this.blobToBase64(blob).then(res => {
  832. src = res;
  833. imageArray.push({src: src, file: blob});
  834. });
  835. }
  836. }
  837. event.preventDefault();
  838. },
  839. spliceImage(i, images) {
  840. if (!confirm('是否取消选择该图片')) return;
  841. images.splice(i, 1);
  842. },
  843. blobToBase64(blob) {
  844. return new Promise((resolve, reject) => {
  845. const fileReader = new FileReader();
  846. fileReader.onload = (e) => {
  847. resolve(e.target.result);
  848. };
  849. fileReader.readAsDataURL(blob);
  850. fileReader.onerror = () => {
  851. reject(new Error('blobToBase64 error'));
  852. };
  853. });
  854. },
  855. getImages(images) {
  856. return images.map((item) => {
  857. return item.file;
  858. })
  859. },
  860. setFormDataImagePrefix(formData, prefix, images) {
  861. images.forEach((item) => {
  862. formData.append(`${prefix}[]`, item);
  863. });
  864. },
  865. }
  866. })
  867. </script>
  868. @endsection