orderDetails.html 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642
  1. {extend name="base" /}
  2. {block name="title"}Order Info{/block}
  3. {block name="styles"}
  4. <link rel="stylesheet" href="/assets/index/css/orderDetails.css?t=12">
  5. {/block}
  6. {block name="mainArea"}
  7. <section class="pageContainer">
  8. <div class="pageMain">
  9. <!-- 页面菜单 -->
  10. <div class="navContainer" id="userNavContainer">
  11. <a href="/index/index/index.html">
  12. <nav class="navItem">
  13. <div class="navItemFlex">
  14. <img src="/assets/index/asstes/icon/hm.png" alt="">
  15. <h2 class="navTitle">Home</h2>
  16. </div>
  17. </nav>
  18. </a>
  19. <nav class="navItem">
  20. <div class="navItemFlex">
  21. <img src="/assets/index/asstes/icon/order.png" alt="">
  22. <h2 class="navTitle">My orders</h2>
  23. </div>
  24. <div class="sunNavBox">
  25. <a href="#">
  26. <nav class="sunNavItem orderNavItem" id="unpaid" data-type="payment">
  27. <h3 class="sunNavTitle">Unpaid</h3>
  28. </nav>
  29. </a>
  30. <a href="#">
  31. <nav class="sunNavItem orderNavItem" id="treat" data-type="delivery">
  32. <h3 class="sunNavTitle">To be shipped</h3>
  33. </nav>
  34. </a>
  35. <a href="#">
  36. <nav class="sunNavItem orderNavItem" data-type="received">
  37. <h3 class="sunNavTitle">Shipped</h3>
  38. </nav>
  39. </a>
  40. <a href="#">
  41. <nav class="sunNavItem orderNavItem" data-type="comment">
  42. <h3 class="sunNavTitle">Received</h3>
  43. </nav>
  44. </a>
  45. </div>
  46. </nav>
  47. <a href="/index/user/myScores.html">
  48. <nav class="navItem">
  49. <div class="navItemFlex">
  50. <img src="/assets/index/asstes/icon/jf.png" alt="">
  51. <h2 class="navTitle">My points</h2>
  52. </div>
  53. </nav>
  54. </a>
  55. </div>
  56. <!-- 页面内容 -->
  57. <div class="pageConten">
  58. <div class="odTitleBox">
  59. <img src="/assets/index/asstes/icon/fjt.png" alt="">
  60. <h4 class="odTitle">Order Information</h4>
  61. </div>
  62. <!-- <div class="odMenuBox">
  63. <div class="odMenuItem">
  64. <img src="/assets/index/asstes/icon/dy.png" alt="">
  65. <p>打印订单</p>
  66. </div>
  67. <div class="odMenuItem">
  68. <img src="/assets/index/asstes/icon/th.png" alt="">
  69. <p>退货退款</p>
  70. </div>
  71. </div>-->
  72. <div class="orderInfoBox">
  73. <!-- 左边内容 -->
  74. <div class="leftInfoBox">
  75. <!-- 订单名字 -->
  76. <div class="orderNameBox eleBox">
  77. <div class="orNameFlex">
  78. <h5 class="orName">#Order Information</h5>
  79. <p class="orTime">Created At:{$order['create_time']}</p>
  80. </div>
  81. <div class="orStList">
  82. {if $order['pay_status'] == 20}
  83. <div class="orStItem paid">
  84. <span></span>
  85. <p>Paid</p>
  86. </div>
  87. {/if}
  88. {if $order['delivery_status'] == 20}
  89. <div class="orStItem shipped">
  90. <span></span>
  91. <p>shipped</p>
  92. </div>
  93. {/if}
  94. </div>
  95. </div>
  96. <!-- 订单商品 -->
  97. <div class="orderGoodsBox eleBox">
  98. <div class="ogTeFlex">
  99. <p class="ogTitle">Listing</p>
  100. {if $order['pay_status'] == 10 }
  101. <div class="ogMarkButton" id="continuePayBtn">Pay With PayPal</div>
  102. <div class="ogCancelButton">Cancel</div>
  103. {/if}
  104. {if $order['delivery_status'] == 20 && $order['receipt_status'] == 10}
  105. <div class="receivedConfirmButton">Confirm receipt</div>
  106. {/if}
  107. </div>
  108. <p class="ogTips">
  109. Your goods will be shipped in 72 hours
  110. </p>
  111. {foreach $order['goods'] as $goods}
  112. <div class="ogGoodsInfo" data-id="{$goods['goods_id']}"
  113. order-goods-id="{$goods['order_goods_id']}">
  114. <div class="ogImgBox">
  115. <img src="{$goods['goods_image']}"
  116. alt="">
  117. </div>
  118. <div class="ogTitleBox">
  119. <p class="ogTitle">{$goods['goods_name']}</p>
  120. <p class="ogSpecs">
  121. {foreach $goods['remark_for_one'] as $key=>$flavor}
  122. <span>| {$key} × {$flavor}</span>
  123. {/foreach}
  124. </p>
  125. </div>
  126. <p class="ogPr">${$goods['goods_price']}x{$goods['total_num']}</p>
  127. <p class="ogToPr">${$goods['total_price']}</p>
  128. <!-- 评价 -->
  129. {eq name="order['receipt_status']" value="20"}
  130. <div class="evaluate">Preview</div>
  131. {/eq}
  132. </div>
  133. {/foreach}
  134. </div>
  135. <!-- 支付状态 -->
  136. <div class="paymentInfoBox eleBox">
  137. <div class="opTeFlex">
  138. <p class="opTitle">Bill</p>
  139. <!-- <div class="opMarkButton">标记为已付款</div>-->
  140. </div>
  141. <div class="opInfoBox">
  142. <div class="opInfoItem">
  143. <p class="opIKey">Express</p>
  144. <p class="opIValue">$0.00</p>
  145. </div>
  146. <div class="opInfoItem">
  147. <p class="opIKey">Tax</p>
  148. <p class="opIValue">$0.00</p>
  149. </div>
  150. <div class="opInfoItem">
  151. <p class="opIKey">Total</p>
  152. <p class="opIValue">${$order['total_price']}</p>
  153. </div>
  154. <div class="opInfoItem">
  155. <p class="opIKey">Paid</p>
  156. <p class="opIValue">${$order['pay_price']}</p>
  157. </div>
  158. </div>
  159. </div>
  160. <!-- 物流信息 -->
  161. <div class="logisticsBox eleBox">
  162. <div class="logsTeFlex">
  163. <p class="logsTitle">Logistics Tracks</p>
  164. <div class="openButton">
  165. <img src="/assets/index/asstes/icon/slt.png" alt="">
  166. </div>
  167. </div>
  168. <div class="logsInfo openBox">
  169. <div class="logList">
  170. <div class="logsLink"></div>
  171. <!-- 物流天数据 -->
  172. <div class="logItem">
  173. <!-- <p class="logTime">2024.03.11</p>-->
  174. <!-- 物流当天信息 -->
  175. {foreach $f1Track as $track}
  176. <div class="logSunItem">
  177. <p class="dic"></p>
  178. <p class="logSunText">
  179. <span class="sunTime">{$track['time']}</span>
  180. <span class="sunStTe">{$track['localtion']}</span>
  181. <span class="sunStTips">{$track['desc']}</span>
  182. </p>
  183. </div>
  184. {/foreach}
  185. </div>
  186. <div class="logItem">
  187. <!-- <p class="logTime">2024.03.11</p>-->
  188. <!-- 物流当天信息 -->
  189. {foreach $selfTrack as $track}
  190. <div class="logSunItem">
  191. <p class="dic"></p>
  192. <p class="logSunText">
  193. <span class="sunTime">{$track['time']}</span>
  194. <span class="sunStTe">{$track['text']}</span>
  195. <span class="sunStTips">{$track['desc']}</span>
  196. </p>
  197. </div>
  198. {/foreach}
  199. </div>
  200. </div>
  201. </div>
  202. </div>
  203. </div>
  204. <!-- 右边内容 -->
  205. <div class="rightInfoBox">
  206. <!-- 客户信息 -->
  207. <div class="customInfo eleBox">
  208. <div class="cusTeFlex">
  209. <p class="cusTeTitle">Recipient Information</p>
  210. <div class="openButton">
  211. <img src="/assets/index/asstes/icon/slt.png" alt="">
  212. </div>
  213. </div>
  214. <div class="cusInfoBox openBox">
  215. <div class="cusItem">
  216. <p class="cusKey">Name</p>
  217. <p class="cusValue">{$order['address']['name']} {$order['address']['last_name']}</p>
  218. </div>
  219. <!-- <div class="cusItem">
  220. <p class="cusKey">电子邮件地址</p>
  221. <p class="cusValue">124345213@163.com</p>
  222. </div>-->
  223. <div class="cusItem">
  224. <p class="cusKey">Phone Number</p>
  225. <p class="cusValue">{$order['address']['phone']}</p>
  226. </div>
  227. </div>
  228. </div>
  229. <!-- 送货地址 -->
  230. <div class="addressBox eleBox">
  231. <div class="addTeFlex">
  232. <p class="addTeTitle">Shipping address</p>
  233. <div class="openButton">
  234. <img src="/assets/index/asstes/icon/slt.png" alt="">
  235. </div>
  236. </div>
  237. <div class="addressInfo openBox">
  238. <div class="addInfoItem">
  239. <p class="aiKey">First Name</p>
  240. <p class="aiValue">{$orderAddress['name']}</p>
  241. </div>
  242. <div class="addInfoItem">
  243. <p class="aiKey">Last Name</p>
  244. <p class="aiValue">{$orderAddress['last_name']}</p>
  245. </div>
  246. <!-- <div class="addInfoItem">-->
  247. <!-- <p class="aiKey">公司</p>-->
  248. <!-- <p class="aiValue">亚马逊</p>-->
  249. <!-- </div>-->
  250. <div class="addInfoItem">
  251. <p class="aiKey">Phone Number</p>
  252. <p class="aiValue">{$orderAddress['phone']}</p>
  253. </div>
  254. <div class="addInfoItem">
  255. <p class="aiKey">Street</p>
  256. <p class="aiValue">{$orderAddress['detail']}</p>
  257. </div>
  258. <!-- <div class="addInfoItem">-->
  259. <!-- <p class="aiKey">公寓,别至</p>-->
  260. <!-- <p class="aiValue">XXXXXXXXXX</p>-->
  261. <!-- </div>-->
  262. <div class="addInfoItem">
  263. <p class="aiKey">City</p>
  264. <p class="aiValue">{$orderAddress['city']}</p>
  265. </div>
  266. <div class="addInfoItem">
  267. <p class="aiKey">State</p>
  268. <p class="aiValue">{$orderAddress['region']['region']}</p>
  269. </div>
  270. <div class="addInfoItem">
  271. <p class="aiKey">Country</p>
  272. <p class="aiValue">US</p>
  273. </div>
  274. <!-- <div class="addInfoItem">-->
  275. <!-- <p class="aiKey">区域</p>-->
  276. <!-- <p class="aiValue">XXXXXXXXXX</p>-->
  277. <!-- </div>-->
  278. <div class="addInfoItem">
  279. <p class="aiKey">Zip Code</p>
  280. <p class="aiValue">{$orderAddress['zip_code']}</p>
  281. </div>
  282. </div>
  283. </div>
  284. </div>
  285. </div>
  286. </div>
  287. </div>
  288. </section>
  289. {/block}
  290. {block name="components"}
  291. <div id="loadingModel">
  292. <div class="loadingBox">
  293. <img src="/assets/index/asstes/icon/loading.gif" alt="Jumping to paypal.">
  294. </div>
  295. </div>
  296. <!-- 评价弹窗 -->
  297. <div id="evaluateModal">
  298. <div class="evaluateBox">
  299. <div class="evaluateItem">
  300. <p class="evaluateTitle">Score:</p>
  301. <div class="starContainer">
  302. <div class="starItem">
  303. <img class="star" src="/assets/index/asstes/icon/star.png" alt="">
  304. <img class="selStar" src="/assets/index/asstes/icon/selStar.png" alt="">
  305. </div>
  306. <div class="starItem">
  307. <img class="star" src="/assets/index/asstes/icon/star.png" alt="">
  308. <img class="selStar" src="/assets/index/asstes/icon/selStar.png" alt="">
  309. </div>
  310. <div class="starItem">
  311. <img class="star" src="/assets/index/asstes/icon/star.png" alt="">
  312. <img class="selStar" src="/assets/index/asstes/icon/selStar.png" alt="">
  313. </div>
  314. <div class="starItem">
  315. <img class="star" src="/assets/index/asstes/icon/star.png" alt="">
  316. <img class="selStar" src="/assets/index/asstes/icon/selStar.png" alt="">
  317. </div>
  318. <div class="starItem">
  319. <img class="star" src="/assets/index/asstes/icon/star.png" alt="">
  320. <img class="selStar" src="/assets/index/asstes/icon/selStar.png" alt="">
  321. </div>
  322. </div>
  323. </div>
  324. <div class="evaluateItem">
  325. <div class="textareaBox">
  326. <textarea id="evaluateTextarea" placeholder="Review now"></textarea>
  327. </div>
  328. </div>
  329. <div class="evaluateBotBox">
  330. <div id="evaluateBot">submit</div>
  331. </div>
  332. </div>
  333. <div id="closeEvaluateModal"></div>
  334. </div>
  335. <div id="deleteAddressModal">
  336. <div class="deleteAddressBox">
  337. <p class="deteTips">Confirm receipt of goods </p>
  338. <input type="hidden" id="deleteAddInfoId" value="0">
  339. <div class="deteButtonBox">
  340. <div id="cancelDelete">Cancel</div>
  341. <div id="confirmDelete">Confirm</div>
  342. </div>
  343. </div>
  344. </div>
  345. {/block}
  346. {block name="scriptSrc"}
  347. <script>
  348. $(document).ready(function () {
  349. initNavState()
  350. var loadingModelEle= $("#loadingModel")
  351. //loadingModelEle.hide(0);
  352. var orderId = "{$order['order_id']}";
  353. //触屏事件 || 点击事件
  354. const tap = "ontouchstart" in window ? "touchstart" : "click";
  355. //返回
  356. $(".odTitleBox").on(tap, function () {
  357. if (window.history.length > 1) {
  358. // 返回上一页
  359. window.history.back();
  360. } else {
  361. //跳转首页
  362. window.location.replace('/index/index/index.html');
  363. }
  364. });
  365. $(".openButton").on(tap, function () {
  366. const parentEle = $(this).closest('.eleBox')
  367. const openBoxEle = parentEle.find(".openBox")
  368. openBoxEle.stop().slideToggle(80);
  369. });
  370. //初始化菜单选中状态
  371. function initNavState() {
  372. const url = window.location.href;
  373. const searchParams = new URLSearchParams(new URL(url).search);
  374. const orderType = searchParams.get("orderType");
  375. console.log(orderType)
  376. //订单中心菜单列表
  377. const orderNavItemList = $(".orderNavItem")
  378. //是否存在匹配项
  379. let exist = false
  380. if (orderNavItemList) {
  381. orderNavItemList.each(function (index, element) {
  382. const type = $(this).attr('data-type');
  383. if (type === orderType) {
  384. $(this).addClass("active")
  385. exist = true
  386. }
  387. })
  388. }
  389. //如果未匹配中默认选中待发货
  390. if (!exist) {
  391. $('#treat').addClass("active")
  392. }
  393. }
  394. //支付方法
  395. const orderPayment = (params) => {
  396. return new Promise(function (resolve, reject) {
  397. $.ajax({
  398. url: "/index/order/pay?payType=30&orderId=" + orderId,
  399. method: "POST",
  400. data: JSON.stringify(params),
  401. headers: {
  402. "Content-Type": "application/json",
  403. "storeId": "10001",
  404. "platform": "H5",
  405. // "Access-Token": vapesToken
  406. },
  407. dataType: "json",
  408. success: function (response) {
  409. resolve(response);
  410. },
  411. error: function (xhr, status, error) {
  412. reject(error);
  413. }
  414. });
  415. });
  416. }
  417. //支付按钮点击
  418. $("#continuePayBtn").on(tap, async function () {
  419. //popup new window to paypal
  420. // let left = (window.innerWidth - 600) / 2;
  421. // var importantStuff = window.open('', '_blank',
  422. // 'height=500,width=600,top=300,left=' + left + ',toolbar=no,menubar=no, scrollbars=no,resizable=no,location=no, status=no');
  423. // importantStuff.document.write('Preparing payment...');
  424. //
  425. // loadingModelEle.show(0)
  426. window.document.write('Preparing payment...');
  427. const params = {}
  428. const res = await orderPayment(params)
  429. const {status, message, data} = res || {}
  430. if (status === 200 || status === "200") {
  431. //popup new window to paypal
  432. //importantStuff.location.href = data.payment.approval_link;
  433. window.location.replace(data.payment.approval_link);
  434. var interId = setInterval(function () {
  435. fetchOrder(interId);
  436. }, 3000)
  437. } else if (status === 401 || status === "401") {
  438. window.location.replace('/index/passport/login.html');
  439. } else {
  440. showToast(message)
  441. }
  442. });
  443. // 创建超链接,不会被拦截
  444. function createSuperLabel(url, id)
  445. {
  446. let a = document.createElement("a");
  447. a.setAttribute("href", url);
  448. a.setAttribute("target", "_blank");
  449. a.setAttribute("id", id);
  450. // 防止反复添加
  451. if (!document.getElementById(id)) {
  452. document.body.appendChild(a);
  453. }
  454. a.click();
  455. }
  456. //取消未支付的订单
  457. $(".ogCancelButton").on(tap, async function () {
  458. const dp = {
  459. orderId: orderId
  460. };
  461. $.ajax({
  462. url: "/index/order/cancel",
  463. headers: {platform: 'H5'},
  464. dataType: 'json',
  465. data: JSON.stringify(dp),
  466. type: "POST",
  467. contentType: 'application/json',
  468. success: function (obj) {
  469. //注册成功后进入
  470. if (obj.status === 200 || obj.status === '200') {
  471. showToast("Successful")
  472. setTimeout(function () {
  473. window.location.replace('/index/user/order.html')
  474. }
  475. , 3000)
  476. } else if (obj.status === 401 || obj.status === '401') {
  477. window.location.replace('/index/passport/login.html');
  478. } else {
  479. showToast('Something wrong,please try again later')
  480. }
  481. }
  482. })
  483. });
  484. $(".receivedConfirmButton").on(tap, async function () {
  485. $("#deleteAddressModal").show(0)
  486. });
  487. //确认删除地址
  488. $("#confirmDelete").on(tap, function () {
  489. $.get('/index/order/receipt?orderId=' + orderId, function (res) {
  490. if (res.status === 200 || res.status === "200") {
  491. showToast('Success')
  492. setTimeout(function () {
  493. window.location.replace('/index/user/order.html')
  494. }
  495. , 3000)
  496. } else {
  497. showToast('Something wrong')
  498. }
  499. $("#deleteAddressModal").hide(0)
  500. })
  501. })
  502. //取消删除地址
  503. $("#cancelDelete").on(tap, function () {
  504. $("#deleteAddressModal").hide(0)
  505. })
  506. function fetchOrder(interId) {
  507. $.get('/index/order/detail?orderId=' + orderId, function (res) {
  508. if (res.status == 200 && res.data.order.pay_status == 20) {
  509. clearInterval(interId);
  510. $("#loadingModel").hide(0);
  511. window.location.replace('/index/user/orderDetails.html?orderId=' + orderId)
  512. }
  513. })
  514. }
  515. $(".orderNavItem").on(tap, function () {
  516. const type = $(this).attr('data-type');
  517. window.location.replace(`/index/user/order.html?orderType=${type}`)
  518. });
  519. //商品id(评价记录)
  520. let goodsId
  521. let orderGoodsId
  522. //商品评分
  523. let score = 0
  524. //商品评价点击
  525. $(".evaluate").on(tap, function (event) {
  526. event.preventDefault();
  527. const parentEle = $(this).closest('.ogGoodsInfo')
  528. goodsId = parentEle.attr("data-id")
  529. orderGoodsId = parentEle.attr("order-goods-id")
  530. $('#evaluateTextarea').val("")
  531. $(".starItem").removeClass('active');
  532. $("#evaluateModal").show(0)
  533. });
  534. $(".starItem").on(tap, function (event) {
  535. event.preventDefault();
  536. const _this = $(this)
  537. score = _this.index() + 1;
  538. _this.addClass('active');
  539. _this.prevAll().addClass('active');
  540. _this.nextAll().removeClass('active');
  541. });
  542. //输入框聚焦
  543. $('#evaluateTextarea').focus(function () {
  544. $(this).addClass('active');
  545. });
  546. //输入框失焦
  547. $('#evaluateTextarea').blur(function () {
  548. $(this).removeClass('active');
  549. });
  550. //关闭评价
  551. $('#closeEvaluateModal').on(tap, function () {
  552. $("#evaluateModal").hide(0)
  553. });
  554. //提交评价
  555. $('#evaluateBot').on(tap, function () {
  556. const evaluateTextareaEle = $('#evaluateTextarea')
  557. const textareaValue = evaluateTextareaEle.val()
  558. if (!textareaValue || textareaValue == "") {
  559. evaluateTextareaEle.focus()
  560. return
  561. }
  562. console.log("评价内容", textareaValue)
  563. console.log("商品id", goodsId)
  564. console.log("商品orderGoodsId", orderGoodsId)
  565. console.log("score", score)
  566. var dp = {
  567. orderId: orderId,
  568. form: [{
  569. order_goods_id: orderGoodsId,
  570. goods_id: goodsId,
  571. score: score * 10,
  572. content: textareaValue,
  573. }]
  574. }
  575. $.ajax({
  576. url: "/index/comment/submit",
  577. headers: {platform: 'H5'},
  578. dataType: 'json',
  579. data: JSON.stringify(dp),
  580. type: "POST",
  581. contentType: 'application/json',
  582. success: function (obj) {
  583. //注册成功后进入
  584. if (obj.status === 200 || obj.status === '200') {
  585. showToast("Successful")
  586. $("#evaluateModal").hide(0)
  587. goodsId = null
  588. } else if (obj.status === 401 || obj.status === '401') {
  589. window.location.replace('/index/passport/login.html');
  590. } else {
  591. showToast('Something wrong,please try again later')
  592. }
  593. }
  594. })
  595. });
  596. /**
  597. * 吐司提示
  598. * @param message 消息
  599. * @returns
  600. */
  601. function showToast(message) {
  602. var toastElement = $('#toastContainer');
  603. toastElement.text(message);
  604. toastElement.stop(true, true).fadeIn(200).delay(2000).fadeOut(200);
  605. }
  606. })
  607. </script>
  608. {/block}