index.blade.php 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915
  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. this.setFormDataImagePrefix(data, 'dealImages', dealImages);
  477. this.syncExpressAbnormal(data).then(res => {
  478. if (i === (expressAbnormalData.length - 1)) {
  479. this.cancelWaitingTempTip();
  480. this.cancelSubData();
  481. }
  482. this.successTempTip(`${expressAbnormal.order_no}创建完成`);
  483. }).catch(err => {
  484. message += err + '\\n';
  485. });
  486. }
  487. },
  488. syncExpressAbnormal(data) {
  489. let url = "{{route('workOrder.expressAbnormal.storeApi')}}";
  490. return new Promise((resolve, reject) => {
  491. axios.post(url, data).then(res => {
  492. if (res.data.success) {
  493. resolve(true)
  494. } else {
  495. reject(res.data.message ? res.data.message : '创建工单异常');
  496. }
  497. }).catch(err => {
  498. reject(err);
  499. })
  500. });
  501. },
  502. damage() {
  503. let {damages, remark} = this;
  504. let message = '';
  505. this.waitingTempTip("处理中");
  506. for (let i = 0; i < damages.length; i++) {
  507. let fromData = new FormData();
  508. let damage = damages[i];
  509. let price = damage.price;
  510. let commodities = damage.commodities ? damage.commodities : [];
  511. fromData.append('order_no', damage.order_no);
  512. fromData.append('price', price);
  513. fromData.append('remark', remark);
  514. let packageImages = this.getImages(damage.packageImages ? damage.packageImages : []);
  515. this.setFormDataImagePrefix(fromData, 'packageImages', packageImages);
  516. let dealImages = this.getImages(damage.dealImages ? damage.dealImages : []);
  517. this.setFormDataImagePrefix(fromData, 'dealImages', dealImages);
  518. let commodityImages = this.getImages(damage.commodityImages ? damage.commodityImages : []);
  519. this.setFormDataImagePrefix(fromData, 'commodityImages', commodityImages);
  520. commodities.filter(item=>{
  521. return Number(item.abnormal_amount) !== 0;
  522. }).forEach(e => {
  523. fromData.append('commodities[]', JSON.stringify(e));
  524. });
  525. this.syncDamage(fromData).then(res => {
  526. if (i === (damages.length - 1)) {
  527. this.cancelWaitingTempTip();
  528. this.cancelSubData();
  529. }
  530. this.successTempTip(`${damage.order_no}创建完成`);
  531. }).catch(err => {
  532. message += err + '\\n';
  533. });
  534. }
  535. },
  536. syncDamage(data) {
  537. let url = "{{route('workOrder.damage.storeApi')}}";
  538. return new Promise((resolve, reject) => {
  539. axios.post(url, data).then(res => {
  540. if (res.data.success) {
  541. resolve(true)
  542. } else {
  543. reject(res.data.message ? res.data.message : '创建工单异常');
  544. }
  545. }).catch(err => {
  546. reject(err);
  547. })
  548. });
  549. },
  550. getIntercept(){
  551. let url = '{{route('workOrder.intercept.checkLogisticNumberApi')}}';
  552. let data = {
  553. 'logistic_numbers': this.logisticNumbers,
  554. };
  555. axios.post(url, data).then(res => {
  556. if (res.data.success) {
  557. if (res.data.data) {
  558. this.infoChange = res.data.data.map(item => {
  559. item.remark = '';
  560. return item;
  561. });
  562. }
  563. } else {
  564. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  565. }
  566. }).catch(err => {
  567. this.errorTempTip(err);
  568. });
  569. },
  570. getInfoChangeData() {
  571. let url = '{{route('workOrder.informationChange.checkLogisticNumberApi')}}';
  572. let data = {
  573. 'logistic_numbers': this.logisticNumbers,
  574. };
  575. axios.post(url, data).then(res => {
  576. if (res.data.success) {
  577. this.infoChange = res.data.data.map(item => {
  578. item.remark = '';
  579. return item;
  580. });
  581. } else {
  582. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  583. }
  584. }).catch(err => {
  585. this.errorTempTip(err);
  586. });
  587. },
  588. getMistakeData() {
  589. let url = '{{route('workOrder.mistake.checkLogisticNumberApi')}}';
  590. let data = {
  591. 'logistic_numbers': this.logisticNumbers
  592. };
  593. axios.post(url, data).then(res => {
  594. if (res.data.success) {
  595. res.data.data.forEach((item) => {
  596. item.abnormal_amount = item.amount;
  597. item.abnormal_type = '未错漏发';
  598. item.select = false;
  599. });
  600. let mistakes = {};
  601. for (let i = 0; i < res.data.data.length; i++) {
  602. let data = res.data.data[i];
  603. let order_code = data['order_code'];
  604. if (mistakes[order_code] == null) {
  605. mistakes[order_code] = []
  606. }
  607. mistakes[order_code].push(data);
  608. }
  609. this.mistakes = mistakes;
  610. } else {
  611. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  612. }
  613. }).catch(err => {
  614. this.errorTempTip(err);
  615. });
  616. },
  617. getExpressAbnormalData() {
  618. let url = '{{route('workOrder.expressAbnormal.checkLogisticNumberApi')}}';
  619. let data = {
  620. 'logistic_numbers': this.logisticNumbers
  621. };
  622. axios.post(url, data).then(res => {
  623. if (res.data.success) {
  624. this.expressAbnormalData = res.data.data.map(item => {
  625. item.abnormal_type = null;
  626. item.dealImages = [];
  627. item.packages.forEach(item => item.select = false);
  628. if(item.packages.length === 1){
  629. item.packages.map(i => i.select = true);
  630. }
  631. return item;
  632. });
  633. } else {
  634. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  635. }
  636. }).catch(err => {
  637. this.errorTempTip(err);
  638. });
  639. },
  640. getDamages() {
  641. let url = '{{route('workOrder.damage.checkLogisticNumberApi')}}';
  642. let data = {
  643. 'logistic_numbers': this.logisticNumbers
  644. };
  645. axios.post(url, data).then(res => {
  646. if (res.data.data) {
  647. res.data.data.forEach(item => {
  648. item.commodities.forEach(i => {
  649. i.abnormal_type = "破损";
  650. i.abnormal_amount = i.amount;
  651. i.price = 0;
  652. });
  653. item.commodityImages = [];
  654. item.dealImages = [];
  655. item.packageImages = [];
  656. item.price = 0;
  657. })
  658. this.damages = res.data.data;
  659. } else {
  660. this.errorTempTip(res.data.message ? res.data.message : "获取订单号异常");
  661. }
  662. }).catch(err => {
  663. this.errorTempTip(err);
  664. });
  665. },
  666. computerPrice(item) {
  667. let {commodities} = item;
  668. item.price = commodities.map(item => {
  669. let {price, abnormal_amount} = item;
  670. return price * abnormal_amount;
  671. }).reduce((perv, next) => {
  672. return perv + next
  673. });
  674. },
  675. waitingTempTip(message) {
  676. window.tempTip.setIndex(2005);
  677. window.tempTip.setDuration(9999);
  678. window.tempTip.waitingTip(message);
  679. },
  680. cancelWaitingTempTip() {
  681. window.tempTip.cancelWaitingTip();
  682. },
  683. successTempTip(message) {
  684. window.tempTip.setDuration(1500);
  685. window.tempTip.setIndex(2005);
  686. window.tempTip.showSuccess(message);
  687. },
  688. errorTempTip(message) {
  689. window.tempTip.setDuration(2000);
  690. window.tempTip.setIndex(2005);
  691. window.tempTip.show(message);
  692. },
  693. mistakeAbnormalType(item) {
  694. let {abnormal_amount, amount} = item;
  695. if (abnormal_amount === amount) {
  696. item.abnormal_type = "未错漏发";
  697. } else if (abnormal_amount > amount) {
  698. item.abnormal_type = "多发";
  699. } else if (abnormal_amount < amount) {
  700. item.abnormal_type = "少发"
  701. }
  702. },
  703. addMistakeItem(mistake, i) {
  704. let logisticNumber = $(this.$refs["logistic_number" + i][0]).val();
  705. let sku = $(this.$refs["sku" + i][0]).val();
  706. let abnormalAmount = $(this.$refs["abnormal_amount" + i][0]).val();
  707. let ownerId = mistake[0]['owner_id'] ?? '';
  708. if (ownerId === '' || ownerId == null) {
  709. this.errorTempTip("添加商品时,校验失败货主异常");
  710. return;
  711. }
  712. this.asyncAddMistakeItem(mistake, i, ownerId, sku, abnormalAmount, logisticNumber);
  713. },
  714. cancelMistakeItem(i) {
  715. $(this.$refs["logistic_number" + i][0]).val("");
  716. $(this.$refs["sku" + i][0]).val("");
  717. $(this.$refs["abnormal_amount" + i][0]).val("");
  718. },
  719. asyncAddMistakeItem(mistake, i, ownerId, sku, abnormalAmount, logisticNumber) {
  720. let url = "{{route('commodity.getCommodityApi')}}";
  721. let data = {
  722. owner_id: ownerId,
  723. sku: sku
  724. }
  725. this.waitingTempTip("查询中");
  726. axios.post(url, data).then(res => {
  727. this.cancelWaitingTempTip();
  728. if (res.data.success) {
  729. let item = JSON.parse(JSON.stringify(mistake[0]));
  730. item.abnormal_amount = abnormalAmount;
  731. item.abnormal_type = "多发";
  732. item.logistic_number = logisticNumber;
  733. item.amount = 0;
  734. item.sku_name = res.data.data.name;
  735. item.commodity_id = res.data.data.id;
  736. mistake.push(item);
  737. this.cancelMistakeItem(i);
  738. } else {
  739. this.errorTempTip(res.data.message ? res.data.message : '查询商品失败')
  740. }
  741. }).catch(err => {
  742. this.cancelWaitingTempTip();
  743. this.errorTempTip(err);
  744. })
  745. },
  746. checkRemark() {
  747. let {remark} = this;
  748. if (remark == null || remark === "") return false;
  749. return remark.trim().length !== 0;
  750. },
  751. cancelSubData() {
  752. this.logisticNumbers = null;
  753. this.issueType = null;
  754. this.remark = null;
  755. this.infoChange = [];
  756. this.mistakes = [];
  757. this.expressAbnormalData = [];
  758. this.damages = [];
  759. },
  760. checkInfoChange() {
  761. let {infoChange} = this;
  762. if(infoChange.length === 0){
  763. this.errorTempTip("请检查信息");
  764. return false;
  765. }
  766. for (let i = 0; i < infoChange.length; i++) {
  767. let info = infoChange[i];
  768. let {remark} = info;
  769. if(remark == null || remark === "" || remark.trim().length === 0){
  770. this.errorTempTip("收方信息未必填项");
  771. return false;
  772. }
  773. }
  774. return true;
  775. },
  776. checkMistakes() {
  777. let {mistakes,remark} = this;
  778. if (mistakes.length === 0) {
  779. this.errorTempTip("请校验提交的商品信息是否为勾选")
  780. return false;
  781. }
  782. if(remark == null || remark === "" || remark.trim().length === 0){
  783. this.errorTempTip("问题描述为必填项");
  784. return false;
  785. }
  786. for (let orderCode in mistakes) {
  787. let mistake = mistakes[`${orderCode}`];
  788. if (!mistake) {
  789. this.errorTempTip('订单:${orderCode}未有订单商品信息');
  790. return false;
  791. }
  792. let count = mistake.filter(item => item.select === true).length;
  793. if (count === 0) {
  794. this.errorTempTip(`订单:${orderCode}未勾选商品列`);
  795. return false;
  796. }
  797. }
  798. return true;
  799. },
  800. checkExpressAbnormal() {
  801. let {expressAbnormalData,remark} = this;
  802. if (expressAbnormalData.length === 0) {
  803. this.errorTempTip("提交参数异常!");
  804. return false;
  805. }
  806. if(remark == null || remark === "" || remark.trim().length === 0){
  807. this.errorTempTip("问题描述为必填项");
  808. return false;
  809. }
  810. for (let i = 0; i < expressAbnormalData.length; i++) {
  811. let data = expressAbnormalData[i];
  812. let selectCount = data.packages.filter(item => item.select).length;
  813. if (selectCount === 0) {
  814. this.errorTempTip(`未选中快递单号 订单:${data.code}!`);
  815. return false;
  816. }
  817. }
  818. @if(\Illuminate\Support\Facades\Gate::check('订单管理-工单处理-宝时编辑') )
  819. @elseif(\Illuminate\Support\Facades\Gate::check('订单管理-工单处理-商家编辑'))
  820. for (let i = 0; i < expressAbnormalData.length; i++) {
  821. let data = expressAbnormalData[i];
  822. let selectCount = data.dealImages.filter(item => item.select).length;
  823. if (selectCount === 0) {
  824. this.errorTempTip(`未上传破损图片 订单:${data.code}!`);
  825. return false;
  826. }
  827. }
  828. @endif
  829. return true;
  830. },
  831. checkDamage() {
  832. let {damages,remark} = this;
  833. if(remark == null || remark === "" || remark.trim().length === 0){
  834. this.errorTempTip("问题描述为必填项");
  835. return false;
  836. }
  837. for (let i = 0; i < damages.length; i++) {
  838. let damage = damages[i];
  839. let {commodities,order_no} = damage;
  840. if(commodities.length === 0){
  841. this.errorTempTip(`订单${order_no}无商品详情`);
  842. return false;
  843. }
  844. let count = commodities.filter(item=>{
  845. return Number(item.abnormal_amount) === 0;
  846. }).length;
  847. if(count === commodities.length){
  848. this.errorTempTip(`${order_no}未填写破损数量`);
  849. return false;
  850. }
  851. }
  852. return true;
  853. },
  854. pasteImage(event, imageArray) {
  855. for (let i = 0; i < event.clipboardData.items.length; i++) {
  856. let item = event.clipboardData.items[i];
  857. if (item.kind === 'string') continue;
  858. if (item.type.indexOf('image') === -1) continue;
  859. if (item.kind === 'file') {
  860. let blob = item.getAsFile();
  861. let src = null;
  862. this.blobToBase64(blob).then(res => {
  863. src = res;
  864. imageArray.push({src: src, file: blob});
  865. });
  866. }
  867. }
  868. event.preventDefault();
  869. },
  870. spliceImage(i, images) {
  871. if (!confirm('是否取消选择该图片')) return;
  872. images.splice(i, 1);
  873. },
  874. blobToBase64(blob) {
  875. return new Promise((resolve, reject) => {
  876. const fileReader = new FileReader();
  877. fileReader.onload = (e) => {
  878. resolve(e.target.result);
  879. };
  880. fileReader.readAsDataURL(blob);
  881. fileReader.onerror = () => {
  882. reject(new Error('blobToBase64 error'));
  883. };
  884. });
  885. },
  886. getImages(images) {
  887. return images.map((item) => {
  888. return item.file;
  889. })
  890. },
  891. setFormDataImagePrefix(formData, prefix, images) {
  892. images.forEach((item) => {
  893. formData.append(`${prefix}[]`, item);
  894. });
  895. },
  896. }
  897. })
  898. </script>
  899. @endsection