placeOrder.js 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126
  1. define(['$', 'template', 'product', 'order', 'cart', 'native', 'helper', 'user', 'api', 'config', 'address', 'IScroll'], function ($, template, product, order, cart ,native, helper, user, api, config, address, IScroll) {
  2. function checkScroll(pageData, callback) {
  3. if (pageData.scroll) {
  4. if (!pageData.scrollHeight) {
  5. pageData.scrollHeight = 0;
  6. }
  7. clearInterval(pageData.scrollCheck);
  8. clearTimeout(pageData.scrollCheckAutoCancel);
  9. pageData.scrollCheck = setInterval(function () {
  10. pageData.scroll.refresh();
  11. if ($.isFunction(callback)) {
  12. callback();
  13. }
  14. }, 50);
  15. pageData.scrollCheckAutoCancel = setTimeout(function () {
  16. clearInterval(pageData.scrollCheck);
  17. }, 500);
  18. }
  19. }
  20. function back(event) {
  21. event.preventDefault();
  22. $(document).trigger('spa:navigate', {
  23. hash: '',
  24. pushData: {
  25. dontNeedReload: true
  26. }
  27. });
  28. }
  29. function fixScroll (pageData) {
  30. if (pageData.scroll) {
  31. pageData.scroll.destroy();
  32. pageData.scroll = null;
  33. }
  34. var placeOrderScroll;
  35. setTimeout(function () {
  36. pageData.scroll = new IScroll('#placeOrderScroll');
  37. }, 50);
  38. }
  39. function suitable(me, doc, productID, type, petPrice, pay, pageData, extra, precedence) {
  40. extra = extra || 0;
  41. precedence = precedence || 0;
  42. // 获取该类型宠物 可用优惠券
  43. doc.trigger('spa:openloader');
  44. api.getCouponList({
  45. products: JSON.stringify([{
  46. product_id: productID,
  47. count: 1
  48. }]),
  49. type: type,
  50. user_id: user.id
  51. }, function (res) {
  52. doc.trigger('spa:closeloader');
  53. if (!res.success) {
  54. doc.trigger('spa:openpanel', ['simpleAlert', {
  55. message: res.message
  56. }]);
  57. } else {
  58. user.orderCoupons = res.data;
  59. // 优惠券数据更新
  60. var coupons = user.orderCoupons;
  61. var couponSelectVal = 0;
  62. if (coupons.length) {
  63. // 选取最大金额
  64. var selectCoupon = user.getMaxAvailableCoupon();
  65. // 缓存到购物车
  66. cart['products'][type]['couponName'] = coupons[selectCoupon.couponIndex].coupon.name;
  67. cart['products'][type]['couponVal'] = selectCoupon.couponSelectVal;
  68. cart['products'][type]['couponId'] = coupons[selectCoupon.couponIndex].id;
  69. cart['products'][type]['couponList'] = coupons;
  70. // dom 更新
  71. $('.coupon-selected-name', me).html(user.getCouponName(coupons[selectCoupon.couponIndex].id));
  72. $('.coupon-cost', me).html('-' + selectCoupon.couponSelectVal);
  73. $('.select-coupon', me).removeClass('hide');
  74. $('.order-cost', me).attr('data-coupon', selectCoupon.couponSelectVal);
  75. $('.order-list', me).removeClass('hide');
  76. $('.order-cost', me).attr('data-pay', parseFloat(petPrice) - parseFloat(selectCoupon.couponSelectVal) + extra);
  77. // 减去优惠
  78. petPrice = parseFloat(petPrice) - parseFloat(selectCoupon.couponSelectVal) + extra + precedence;
  79. } else {
  80. // 缓存到购物车
  81. cart['products'][type]['couponName'] = '';
  82. cart['products'][type]['couponVal'] = '';
  83. cart['products'][type]['couponId'] = '';
  84. cart['products'][type]['couponList'] = [];
  85. $('.coupon-selected-name', me).html('');
  86. $('.coupon-cost', me).html('- 0');
  87. $('.select-coupon', me).addClass('hide');
  88. $('.order-cost', me).attr('data-coupon', 0);
  89. petPrice = parseFloat(petPrice) + extra + precedence;
  90. }
  91. // 缓存到本地
  92. cart.setCache('products');
  93. // 更新dom总价
  94. $('.order-cost', me).attr('data-costs', pay);
  95. $('.order-cost', me).html('¥' + petPrice);
  96. $('.select-pet', me).removeClass('hide');
  97. if (pageData && pageData.scroll) {
  98. pageData.scroll.refresh();
  99. }
  100. }
  101. });
  102. }
  103. function setCoupon(me, pageData, extraServicePrice) {
  104. $(document).trigger('spa:openloader');
  105. var products = JSON.stringify([{
  106. product_id: order['productID'],
  107. count: order.productCount
  108. }]);
  109. var time = order.bookingDate + ' ' + order.bookingTime + ':00';
  110. user.getProductCoupon(products, time, cachePageData.productType, function(res){
  111. $(document).trigger('spa:closeloader');
  112. if (res.success) {
  113. var coupons = user.orderCoupons;
  114. // var coupons = [];
  115. var couponSelectVal = 0;
  116. var price = 0;
  117. if (coupons.length) {
  118. var selectCoupon = user.getMaxAvailableCoupon();
  119. cart['products'][cachePageData.productType]['couponName'] = coupons[selectCoupon.couponIndex].coupon.name;
  120. cart['products'][cachePageData.productType]['couponVal'] = selectCoupon.couponSelectVal;
  121. cart['products'][cachePageData.productType]['couponId'] = coupons[selectCoupon.couponIndex].id;
  122. cart['products'][cachePageData.productType]['couponList'] = coupons;
  123. $('.coupon-selected-name', me).html(user.getCouponName(coupons[selectCoupon.couponIndex].id));
  124. $('.coupon-cost', me).html('-' + selectCoupon.couponSelectVal);
  125. $('.select-coupon', me).removeClass('hide');
  126. $('.order-cost', me).attr('data-coupon', selectCoupon.couponSelectVal);
  127. $('.order-list', me).removeClass('hide');
  128. price = parseFloat(order.petPrice) * order.productCount - parseFloat(selectCoupon.couponSelectVal) + parseFloat(extraServicePrice);
  129. } else {
  130. price = parseFloat(order.petPrice) * order.productCount + parseFloat(extraServicePrice);
  131. $('.coupon-selected-name', me).html('');
  132. $('.select-coupon', me).addClass('hide');
  133. $('.order-cost', me).attr('data-coupon', '0');
  134. $('.order-cost', me).attr('data-pay', parseFloat(order.petPrice));
  135. cart['products'][cachePageData.productType]['couponName'] = '';
  136. cart['products'][cachePageData.productType]['couponVal'] = '';
  137. cart['products'][cachePageData.productType]['couponId'] = '';
  138. cart['products'][cachePageData.productType]['couponList'] = [];
  139. }
  140. // 加急
  141. if (order.precedence) {
  142. price = price + parseFloat(product.precedence);
  143. }
  144. $('.order-cost', me).attr('data-pay', price);
  145. $('.order-cost', me).attr('data-costs', order.petPrice);
  146. $('.order-cost', me).html('¥' + price);
  147. cart.setCache('products');
  148. pageData.scroll.refresh();
  149. } else {
  150. $(document).trigger('spa:openpanel', ['simpleAlert', {
  151. message: res.message
  152. }]);
  153. }
  154. });
  155. }
  156. // 筛选附加服务
  157. function suitExtraService(me, checkedName) {
  158. var newExtraService = product.getExtraServiceList(order.productType, order.petName, checkedName);
  159. var extraService = {
  160. extraService: newExtraService
  161. }
  162. var extraServiceTpl = template('placeOrder/list', extraService);
  163. var extraServiceTpl2 = template('placeOrder/list2', extraService);
  164. me.find('.extra-service-list').html(extraServiceTpl);
  165. me.find('.calc-items').html(extraServiceTpl2).addClass('hide');
  166. cachePageData.extraServicePrice = 0;
  167. cachePageData.extraServiceCount = 0;
  168. }
  169. function resetTech(me) {
  170. order.beautician.name = '请选择';
  171. order.beautician.id = '';
  172. $('.booking-people', me).html(order.beautician.name);
  173. }
  174. var cachePageData = {
  175. extraServicePrice: 0,
  176. extraServiceCount: 0,
  177. defaultExtraService: {
  178. 11: {
  179. serviceName: '体外驱虫',
  180. servicePrice: 40
  181. },
  182. 12: {
  183. serviceName: '药浴',
  184. servicePrice: 40
  185. },
  186. 13: {
  187. serviceName: '一次性局部染色',
  188. servicePrice: 28
  189. }
  190. },
  191. DW: {
  192. count: 1,
  193. price: 0
  194. }
  195. }; //page内部的数据传递
  196. return {
  197. title: '壹管家上门服务',
  198. body: '',
  199. init: function (pageData, dtd) {
  200. // var productType = cachePageData.productType;
  201. // var serviceType = cachePageData.serviceType;
  202. var $view = this;
  203. var $doc = $(document);
  204. function payCharge () {
  205. var $pay = $('.order-cost', $view);
  206. // 原价
  207. var cost = $pay.attr('data-costs');
  208. // 优惠
  209. var coupon = $pay.attr('data-coupon');
  210. // 加急
  211. var precedence = $pay.attr('data-precedence');
  212. // 额外服务
  213. var extra = $pay.attr('data-extra');
  214. // 结算
  215. var pay = $pay.attr('data-pay');
  216. pay = parseFloat(cost) - parseFloat(coupon) + parseFloat(precedence) + parseFloat(extra);
  217. $pay.attr('data-pay', pay);
  218. $pay.text('¥' + pay);
  219. }
  220. //返回
  221. $.newTouch('.back-button', function (event) {
  222. back.call(this, event);
  223. }, $view);
  224. $view.on('tapBackButton', function (event) {
  225. back.call(this, event);
  226. });
  227. //返回
  228. $view.on('swipeRight', function (event) {
  229. back.call(this, event);
  230. });
  231. // 查看详情
  232. $.newTouch('.product-pic', function(event) {
  233. $doc.trigger('spa:navigate', {
  234. hash: 'product',
  235. pushData: {
  236. type: cachePageData.serviceType,
  237. needReload: true
  238. }
  239. });
  240. }, $view);
  241. // 选择主服务
  242. $.newTouch('.btn-main-service', function(event) {
  243. if ($(this).hasClass('off')) return;
  244. if ($(this).hasClass('on')) return;
  245. $(this).addClass('on');
  246. $(this).parent().siblings().find('.btn').removeClass('on');
  247. var extraServiceType = $(this).attr('data-extra-type');
  248. extraServiceType = parseFloat(extraServiceType);
  249. cachePageData.extraServiceType = extraServiceType;
  250. // 默认选中额外服务名字
  251. var selectExtraServiceName = cachePageData.defaultExtraService[extraServiceType].serviceName;
  252. var selectExtraServicePrice = cachePageData.defaultExtraService[extraServiceType].servicePrice;
  253. $('.order-cost', $view).attr('data-extra', selectExtraServicePrice);
  254. cachePageData.extraServicePrice = selectExtraServicePrice;
  255. var serviceType = $(this).attr('data-type');
  256. cachePageData.productType = parseFloat(serviceType);
  257. $('.service-name', $view).html(product.getGroupFullName(cachePageData.productType))
  258. // 判断是否有相同宠物类型的服务
  259. var petName = cart['petInfo']['petName'];
  260. var petWeight = cart['petInfo']['petWeight'];
  261. var petMaxWeight = cart['petInfo']['petMaxWeight'];
  262. var petMinWeight = cart['petInfo']['petMinWeight'];
  263. var petPrice = 0;
  264. var productID = cart['petInfo']['productID'];
  265. var suitablePet = product.isSuitablePet(cachePageData.productType, petName, petMaxWeight, petMinWeight);
  266. if (!!suitablePet.petPrice) {
  267. order.petName = petName;
  268. order.petWeight = petWeight;
  269. order.petPrice = suitablePet.petPrice;
  270. order.productType = cachePageData.productType;
  271. $('.pet-info', $view).html(petName + ' (' + petWeight + ')');
  272. $('.pet-type', $view).html(petName + ' (' + petWeight + ')');
  273. $('.total-cost', $view).html('¥' + suitablePet.petPrice);
  274. petPrice = suitablePet.petPrice;
  275. pay = petPrice;
  276. productID = suitablePet.productID;
  277. order.set('productID', productID);
  278. var precedence;
  279. if (order.precedence) {
  280. precedence = product.precedence;
  281. } else {
  282. precedence = 0;
  283. }
  284. if (order['productID'] && order.bookingDate) {
  285. setCoupon($view, pageData, cachePageData.extraServicePrice);
  286. } else {
  287. $('.order-cost', $view).html('¥ ' + (parseFloat(order.petPrice) + cachePageData.extraServicePrice));
  288. $('.order-cost', $view).attr('data-pay', parseFloat(order.petPrice));
  289. $('.order-cost', $view).attr('data-costs', parseFloat(order.petPrice));
  290. }
  291. $('.select-pet', $view).removeClass('hide');
  292. // 筛选附加服务
  293. order.extraService = [];
  294. suitExtraService($view, selectExtraServiceName);
  295. $('.calc-items', $view).removeClass('hide');
  296. var extraServiceID = $('.extra-service-list', $view).find('.checked').attr('data-id');
  297. var extraServiceIndex = $('.extra-service-list', $view).find('.checked').parent().index();
  298. var serviceParam = {
  299. product_id: extraServiceID,
  300. count: 1
  301. }
  302. order.extraService[extraServiceIndex] = serviceParam;
  303. // pageData.scroll.refresh();
  304. } else {
  305. order.petName = '';
  306. order.petWeight = '';
  307. order.petPrice = '';
  308. order.productType = cachePageData.productType;
  309. $('.pet-info', $view).html('选择宠物类型');
  310. $('.select-pet', $view).addClass('hide');
  311. $('.select-coupon', $view).addClass('hide');
  312. $('.coupon-selected-name', $view).html('');
  313. $('.order-cost', $view).html('¥ 0');
  314. $('.order-cost', $view).attr('data-pay', '0');
  315. $('.order-cost', $view).attr('data-costs', '0');
  316. $('.order-cost', $view).attr('data-coupon', '0');
  317. order.set('productID', '');
  318. }
  319. // 重置保洁师选择
  320. resetTech($view);
  321. pageData.scroll.refresh();
  322. }, $view);
  323. // 选择附加服务
  324. $.newTouch('.item-checkbox', function (event) {
  325. event.preventDefault();
  326. if ($('.main-service', $view).length && !$('.main-service', $view).find('.btn-main-service').hasClass('on')) {
  327. $doc.trigger('spa:openpanel', ['simpleAlert', {
  328. message: '请选择服务类型'
  329. }]);
  330. return;
  331. }
  332. var select = $(this).data('select'),
  333. id = $(this).data('id'),
  334. index = $(this).parent().index(),
  335. price = $(this).data('price');
  336. extraType = $(this).data('servicetype');
  337. var extraCost = $('.order-cost', $view).attr('data-extra');
  338. if (!$(this).hasClass('checked')) {
  339. cachePageData.extraServiceCount ++;
  340. cachePageData.extraServicePrice += parseFloat(price);
  341. $(this).addClass('checked');
  342. var serviceParam = {
  343. product_id: id,
  344. count: 1
  345. }
  346. order.extraService[index] = serviceParam;
  347. $('.calc-items', $view).find('.select-extra-service').eq(index).addClass('on');
  348. extraCost = parseFloat(extraCost) + parseFloat(price);
  349. $('.order-cost', $view).attr('data-extra', extraCost);
  350. extraCost = price;
  351. } else {
  352. cachePageData.extraServiceCount --;
  353. cachePageData.extraServicePrice -= parseFloat(price);
  354. $(this).removeClass('checked');
  355. order.extraService[index] = {};
  356. $('.calc-items', $view).find('.select-extra-service').eq(index).removeClass('on');
  357. extraCost = parseFloat(extraCost) - parseFloat(price);
  358. $('.order-cost', $view).attr('data-extra', extraCost);
  359. }
  360. if (cachePageData.extraServiceCount > 0) {
  361. $('.calc-items', $view).removeClass('hide');
  362. } else {
  363. $('.calc-items', $view).addClass('hide');
  364. }
  365. if ($('.calc-items', $view).find('.select-extra-service').hasClass('on')) {
  366. $('.calc-items', $view).removeClass('hide');
  367. } else {
  368. $('.calc-items', $view).addClass('hide');
  369. }
  370. payCharge();
  371. // 重置保洁师选择
  372. resetTech($view);
  373. pageData.scroll.refresh();
  374. }, $view);
  375. // 选择地址
  376. $.newTouch('.select-address', function (event) {
  377. event.preventDefault();
  378. if (!config.isAndroid && !config.isIOS ) {
  379. $doc.trigger('spa:navigate', {
  380. hash: 'addressList',
  381. pushData: {
  382. needReload: true
  383. }
  384. });
  385. } else {
  386. native.selectAddress(function (res) {
  387. if (res.success) {
  388. var addressInfo = res.data;
  389. var addressMore = addressInfo.address;
  390. if (!addressMore.area) {
  391. addressMore.area = '';
  392. }
  393. $doc.trigger('spa:openloader');
  394. api.checkAddress({
  395. address_id: addressInfo.address_id
  396. }, function(resA) {
  397. $doc.trigger('spa:closeloader');
  398. if (resA.success) {
  399. $('.order-username', $view).html(addressInfo.name);
  400. $('.order-mobile', $view).html(addressInfo.mobile);
  401. var addressStr = '';
  402. if (addressMore.poi) {
  403. addressStr = addressMore.city + addressMore.area + addressMore.poi.name + addressMore.detail
  404. } else {
  405. addressStr = addressMore.province + addressMore.city + addressMore.area + addressMore.detail
  406. }
  407. $('.order-address', $view).html(addressStr);
  408. $('.select-address', $view).addClass('show-address');
  409. order.set('address', addressInfo, true);
  410. order.set('stationID', resA.data.station, true);
  411. resetTech($view);
  412. } else {
  413. $doc.trigger('spa:openpanel', ['simpleAlert', {
  414. message: resA.message
  415. }]);
  416. }
  417. })
  418. }
  419. });
  420. }
  421. }, $view);
  422. // 选择保洁师
  423. $.newTouch('.show-beautician-picker', function (event) {
  424. if (!order.address || !order.address.address_id) {
  425. $doc.trigger('spa:openpanel', ['simpleAlert', {
  426. message: '请选择地址'
  427. }]);
  428. return;
  429. }
  430. if (order.bookingDate == '' || order.bookingTime == '') {
  431. $doc.trigger('spa:openpanel', ['simpleAlert', {
  432. message: '请选择上门时间'
  433. }]);
  434. return;
  435. }
  436. if (!order.productType) {
  437. $doc.trigger('spa:openpanel', ['simpleAlert', {
  438. message: '请选择服务类型'
  439. }]);
  440. return;
  441. }
  442. var bookingTime = order.bookingDate + ' ' + order.bookingTime + ':00';
  443. var service_type_array = [];
  444. var mainServiceType = product.getPetServiceType(order.productType, order.productID);
  445. service_type_array.push(mainServiceType);
  446. // 筛选附加服务类型
  447. var extraServiceTypeTmp = [];
  448. $('.extra-service-list', $view).find('li').each(function(index, el) {
  449. var $a = $(el).find('a');
  450. if ($a.hasClass('checked')) {
  451. var petDerviceTypeTmp = $a.attr('data-servicetype');
  452. if (petDerviceTypeTmp !== '100') {
  453. extraServiceTypeTmp.push(parseInt(petDerviceTypeTmp, 10));
  454. }
  455. }
  456. });
  457. service_type_array = service_type_array.concat(extraServiceTypeTmp);
  458. var service_type = '[' + service_type_array.join(',') + ']';
  459. user.getTechList(
  460. service_type,
  461. bookingTime,
  462. order.address.address_id,
  463. function (res) {
  464. $doc.trigger('spa:navigate', {
  465. hash: 'beautician',
  466. pushData: {
  467. extraService: order.extraService
  468. }
  469. });
  470. }
  471. );
  472. }, $view);
  473. // 选择宠物
  474. $.newTouch('.show-product-picker', function () {
  475. if ($(this).hasClass('selected')) return;
  476. event.preventDefault();
  477. // 还未选择主服务
  478. if (cachePageData.productType > 10) {
  479. $doc.trigger('spa:openpanel', ['simpleAlert', {
  480. message: '请选择服务类型'
  481. }]);
  482. return;
  483. }
  484. $doc.trigger('spa:openpanel', ['productOption', {
  485. pets: product.productGroup[cachePageData.productType],
  486. productType: cachePageData.productType,
  487. callback: {
  488. onSelect: function(petName, petWeight, petPrice) {
  489. // set order info
  490. order.petName = petName;
  491. order.petWeight = petWeight;
  492. order.petPrice = petPrice;
  493. order.productType = cachePageData.productType;
  494. order.petID = cart['products'][cachePageData.productType]['petID'];
  495. order.productID = cart['products'][cachePageData.productType]['productID'];
  496. // user.orderCoupons = res.data;
  497. // 筛选附加服务
  498. if (cachePageData.extraServiceType > 10) {
  499. var selectExtraServiceName = cachePageData.defaultExtraService[cachePageData.extraServiceType].serviceName;
  500. var selectExtraServicePrice = cachePageData.defaultExtraService[cachePageData.extraServiceType].servicePrice;
  501. $('.order-cost', $view).attr('data-extra', selectExtraServicePrice);
  502. }
  503. suitExtraService($view, selectExtraServiceName);
  504. $('.pet-info', $view).html(petName + ' (' + petWeight + ')');
  505. $('.pet-type', $view).html(petName + ' (' + petWeight + ')');
  506. $('.total-cost', $view).html('¥' + petPrice);
  507. if ( $('.calc-items', $view).find('.select-extra-service').hasClass('on') ) {
  508. $('.calc-items', $view).removeClass('hide');
  509. petPrice = parseFloat(petPrice) + parseFloat(selectExtraServicePrice);
  510. }
  511. $('.order-cost', $view).attr('data-costs', order.petPrice);
  512. $('.order-cost', $view).attr('data-extra', cachePageData.extraServicePrice);
  513. $('.order-cost', $view).html('¥' + petPrice);
  514. $('.select-pet', $view).removeClass('hide');
  515. if (order['productID'] && order.bookingDate) {
  516. setCoupon($view, pageData, cachePageData.extraServicePrice);
  517. }
  518. pageData.scroll.refresh();
  519. resetTech($view);
  520. }
  521. }
  522. }]);
  523. }, $view);
  524. // 断尾
  525. $.newTouch('.btn-sub', function(event) {
  526. if (cachePageData.DW.count <= 1) return;
  527. cachePageData.DW.count --;
  528. order.productCount = cachePageData.DW.count;
  529. $('.total-cost', $view).html('¥' + order.petPrice * cachePageData.DW.count);
  530. $('.order-cost', $view).attr('data-costs', order.petPrice * cachePageData.DW.count);
  531. $('.service-count', $view).find('.num').html(cachePageData.DW.count);
  532. payCharge();
  533. setCoupon($view, pageData, cachePageData.extraServicePrice);
  534. }, $view);
  535. $.newTouch('.btn-add', function(event) {
  536. cachePageData.DW.count ++;
  537. order.productCount = cachePageData.DW.count;
  538. $('.total-cost', $view).html('¥' + order.petPrice * cachePageData.DW.count);
  539. $('.order-cost', $view).attr('data-costs', order.petPrice * cachePageData.DW.count);
  540. $('.service-count', $view).find('.num').html(cachePageData.DW.count);
  541. payCharge();
  542. setCoupon($view, pageData, cachePageData.extraServicePrice);
  543. }, $view);
  544. // 选择时间
  545. $.newTouch('.show-time-picker', function (event) {
  546. event.preventDefault();
  547. if (!order.productID) {
  548. $doc.trigger('spa:openpanel', ['simpleAlert', {
  549. message: '请选择宠物类型'
  550. }]);
  551. return;
  552. }
  553. //新版数据选择器
  554. var dayNamesA = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
  555. var dayNamesB = ['今天'];
  556. var columns = {
  557. columnDay: [],
  558. columnTime: []
  559. };
  560. var now = new Date().getHours();
  561. var daySelectIndex = 0;
  562. for (var i = 0; i < 9; i++) {
  563. var dd = new Date();
  564. dd.setDate(dd.getDate() + i);
  565. var month = dd.getMonth() + 1;
  566. var day = dd.getDate();
  567. var date = month + '月' + day + '日';
  568. var dayStr = helper.getDateStr({
  569. date: dd,
  570. separator: '-'
  571. });
  572. var dayStrSuffix;
  573. if (i < dayNamesB.length) {
  574. dayStrSuffix = dayNamesB[i];
  575. } else {
  576. dayStrSuffix = dayNamesA[dd.getDay()];
  577. }
  578. var selected = false;
  579. if (order.bookingDate) {
  580. selected = true;
  581. }
  582. if (dayStr == order.bookingDate) {
  583. daySelectIndex = i;
  584. } else {
  585. daySelectIndex = -1;
  586. }
  587. columns.columnDay.push({
  588. text: date, // 几月几日
  589. day: dayStrSuffix, // 周几
  590. value: dayStr,
  591. selected: selected,
  592. selectIndex: daySelectIndex
  593. });
  594. }
  595. var currentDate = new Date();
  596. var currentMonth = currentDate.getMonth() + 1;
  597. var currentDay = currentDate.getDate();
  598. var now = new Date().getHours();
  599. var min = new Date().getMinutes();
  600. var timeSelectIndex = 0;
  601. for (var i = 9; i <= 19; i++) {
  602. var hour = i + ':00';
  603. var selected = false;
  604. if (order.bookingTime) {
  605. selected = true;
  606. }
  607. if (hour == order.bookingTime) {
  608. timeSelectIndex = i;
  609. } else {
  610. timeSelectIndex = -1;
  611. }
  612. columns.columnTime.push({
  613. month: currentMonth,
  614. day: currentDay,
  615. min: min,
  616. num: i,
  617. now: now,
  618. text: hour,
  619. value: hour,
  620. selected: selected,
  621. selectIndex: timeSelectIndex
  622. })
  623. }
  624. $doc.trigger('spa:openpanel', ['dataPicker', {
  625. type: cachePageData.productType,
  626. columns: columns,
  627. selected: order.bookingDate,
  628. offDay: product.offDay,
  629. callback: {
  630. onSelect: function(values, texts, precedence){
  631. var couponValue = 0;
  632. var precedenceCost = product.precedence;
  633. if(order.couponID){
  634. couponValue = user.getCouponValue(order.couponID);
  635. }
  636. if(precedence) {
  637. $('.select-precedence', $view).removeClass('hide').find('.precedence-cost').html('¥' + precedenceCost);
  638. $('.order-cost', $view).attr('data-precedence', precedenceCost);
  639. } else {
  640. $('.select-precedence', $view).addClass('hide').find('.precedence-cost').html('¥ 0');
  641. $('.order-cost', $view).attr('data-precedence', '0');
  642. }
  643. // payCharge();
  644. // pageData.scroll.refresh();
  645. order.bookingDate = values[0];
  646. order.bookingTime = values[1];
  647. order.bookingTimeStr = texts[0] + ' ' + texts[1];
  648. order.precedence = precedence;
  649. $('.booking-time', $view).html(order.bookingTimeStr);
  650. setCoupon($view, pageData, cachePageData.extraServicePrice);
  651. resetTech($view);
  652. }
  653. }
  654. }]);
  655. }, $view);
  656. // 选择优惠
  657. $.newTouch('.show-coupon-picker', function (event) {
  658. if ($(this).hasClass('disabled')) return;
  659. event.preventDefault();
  660. if (!order.productID) {
  661. $doc.trigger('spa:openpanel', ['simpleAlert', {
  662. message: '请选择宠物类型'
  663. }]);
  664. return;
  665. }
  666. if (!order.bookingDate) {
  667. $doc.trigger('spa:openpanel', ['simpleAlert', {
  668. message: '请选择服务时间'
  669. }]);
  670. return;
  671. }
  672. var coupons = $.extend(true, [], user.orderCoupons);
  673. for (var i in coupons) {
  674. if (coupons[i]['id'] == order.couponID) {
  675. coupons[i]['selected'] = true;
  676. break;
  677. }
  678. }
  679. $doc.trigger('spa:navigate', {
  680. hash: 'picker',
  681. pushData: {
  682. options: coupons,
  683. unuseables: user.unuseable_coupons,
  684. temp: 'picker/coupon',
  685. title: '选择优惠券',
  686. backHash: 'placeOrder',
  687. pickType: 'coupon',
  688. products: JSON.stringify([{
  689. product_id: cart['products'][cachePageData.productType]['productID'],
  690. count: 1
  691. }]),
  692. type: cachePageData.productType,
  693. needReload: true
  694. },
  695. callback: {
  696. onSelect: function(pickValue) {
  697. order.couponID = pickValue;
  698. var precedenceTmp = 0;
  699. var couponValue = user.getCouponValue(pickValue);
  700. var $pay = $('.order-cost', $view);
  701. if (pickValue == '') {
  702. cart['products'][cachePageData.productType]['couponName'] = '';
  703. cart['products'][cachePageData.productType]['couponVal'] = '';
  704. cart['products'][cachePageData.productType]['couponId'] = '';
  705. $('.coupon-selected-name', $view).html('不使用');
  706. $('.select-coupon', $view).addClass('hide');
  707. $pay.attr('data-coupon', '0');
  708. } else {
  709. cart['products'][cachePageData.productType]['couponName'] = user.getCouponName(pickValue);
  710. cart['products'][cachePageData.productType]['couponVal'] = couponValue;
  711. cart['products'][cachePageData.productType]['couponId'] = pickValue;
  712. $('.coupon-selected-name', $view).html(user.getCouponName(pickValue));
  713. $('.select-coupon', $view).removeClass('hide').find('.coupon-cost').html('-&nbsp;' + couponValue);
  714. $pay.attr('data-coupon', couponValue);
  715. }
  716. payCharge();
  717. }
  718. }
  719. });
  720. }, $view);
  721. // 切换用户协议
  722. $.newTouch('.agreement-touch-area', function(event) {
  723. var agreementObj = $('.agreement-checkbox', $view);
  724. if (agreementObj.prop('checked')) {
  725. agreementObj.prop('checked', false);
  726. $('.btn-place').addClass('disable');
  727. } else {
  728. agreementObj.prop('checked', true);
  729. $('.btn-place').removeClass('disable');
  730. }
  731. }, $view);
  732. // 查看用户协议
  733. $.newTouch('.agreement', function(event) {
  734. $doc.trigger('spa:navigate', {
  735. hash: 'agreement'
  736. });
  737. }, $view);
  738. // 提交订单
  739. $.newTouch('.btn-place', function (event) {
  740. event.preventDefault();
  741. if ($(this).hasClass('disable')) {
  742. return false;
  743. }
  744. if (!order.address) {
  745. $doc.trigger('spa:openpanel', ['simpleAlert', {
  746. message: '请选择地址'
  747. }]);
  748. return;
  749. }
  750. if (order.bookingDate == '' || order.bookingTime == '') {
  751. $doc.trigger('spa:openpanel', ['simpleAlert', {
  752. message: '请选择上门时间'
  753. }]);
  754. return;
  755. }
  756. var payChannel = 'wz_app';
  757. if (config.isWX) {
  758. payChannel = 'wx_pub';
  759. } else if (config.isChubao) {
  760. payChannel = 'chubao';
  761. } else {
  762. payChannel = 'wz_app';
  763. }
  764. $('.order-memo', $view).blur();
  765. order.set('memo', $('.order-memo', $view).val());
  766. order.set('productType', cachePageData.productType);
  767. order.couponID = cart['products'][cachePageData.productType]['couponId'];
  768. $doc.trigger('spa:openloader');
  769. order.addOrder( user.id, payChannel, function (res) {
  770. $doc.trigger('spa:closeloader');
  771. if (res.success) {
  772. user.orders[1].data.push(res.data);
  773. var orderID = order.id;
  774. order.reset();
  775. $('.booking-time', $view).html('请选择');
  776. // 选择新的最大值优惠券
  777. var oldCouponList = cart['products'][cachePageData.productType]['couponList'];
  778. var oldCouponId = cart['products'][cachePageData.productType]['couponId'];
  779. var newCouponList = [];
  780. $.each(oldCouponList, function(index, val) {
  781. if (val.id !== oldCouponId) {
  782. newCouponList.push(oldCouponList[index])
  783. };
  784. });
  785. user.orderCoupons = newCouponList;
  786. cart['products'][cachePageData.productType]['couponList'] = newCouponList;
  787. if (newCouponList.length) {
  788. var newselectedCoupon = user.getMaxAvailableCoupon();
  789. cart['products'][cachePageData.productType]['couponName'] = newCouponList[newselectedCoupon.couponIndex].coupon.name || '';
  790. cart['products'][cachePageData.productType]['couponVal'] = newselectedCoupon.couponSelectVal || '';
  791. cart['products'][cachePageData.productType]['couponId'] = newCouponList[newselectedCoupon.couponIndex].id || '';
  792. } else {
  793. cart['products'][cachePageData.productType]['couponName'] = '';
  794. cart['products'][cachePageData.productType]['couponVal'] = '';
  795. cart['products'][cachePageData.productType]['couponId'] = '';
  796. }
  797. // cart.setCache('products');
  798. if (res.data.status == 1) {
  799. $doc.trigger('spa:navigate', {
  800. hash: 'paySuccess'
  801. });
  802. } else {
  803. $doc.trigger('spa:navigate', {
  804. hash: 'pay',
  805. pushData: {
  806. orderID: orderID,
  807. backHash: '',
  808. }
  809. });
  810. }
  811. } else {
  812. $doc.trigger('spa:openpanel', ['simpleAlert', {
  813. message: res.message
  814. }]);
  815. }
  816. });
  817. }, $view);
  818. dtd.resolve();
  819. },
  820. beforeopen: function (pageData, dtd) {
  821. var $view = this;
  822. var pushData = pageData.pushData;
  823. var productType = pushData.productType;
  824. var serviceType = pushData.serviceType;
  825. cachePageData.extraServiceCount = 0;
  826. if (pushData.hasOwnProperty('needReset') && pushData.needReset) {
  827. var $doc = $(document);
  828. pushData.needReset = false;
  829. cachePageData.DW.count = 1;
  830. cachePageData.productType = productType;
  831. cachePageData.serviceType = serviceType;
  832. var pay = order.cost;
  833. // 获取本地宠物信息
  834. var petName = cart['petInfo']['petName'];
  835. var petWeight = cart['petInfo']['petWeight'];
  836. var petMaxWeight = cart['petInfo']['petMaxWeight'];
  837. var petMinWeight = cart['petInfo']['petMinWeight'];
  838. var petPrice = 0;
  839. var productID = cart['petInfo']['productID'];
  840. var precedencePrice = 0;
  841. if (order.precedence) {
  842. precedencePrice = product.precedence;
  843. } else {
  844. precedencePrice = 0;
  845. }
  846. if (cachePageData.productType > 10) {
  847. var typeName = cachePageData.defaultExtraService[cachePageData.productType].serviceName;
  848. var tmpData = {
  849. env: config,
  850. productLists: product.suitableService(cachePageData.productType, typeName),
  851. prodcutTitle: product.getProductTitle(productType),
  852. extraService: '',
  853. extraServiceType: cachePageData.productType,
  854. extraServicePrice: cachePageData.defaultExtraService[cachePageData.productType].servicePrice,
  855. petName: '',
  856. petWeight: '',
  857. petPrice: '',
  858. beauticianName: order.beautician.name,
  859. bookingTimeStr: order.bookingTimeStr,
  860. address: order.address,
  861. showCoupon: '',
  862. couponName: '',
  863. couponVal: 0,
  864. precedence: precedencePrice,
  865. showNavBar: !config.isWX && !config.isChubao,
  866. productType: product.getGroupFullName(parseInt(productType)),
  867. totalCost: petPrice,
  868. pay: pay
  869. };
  870. var tpl = template('placeOrder/index', tmpData);
  871. $view.find('.spa-page-body').html(tpl);
  872. // $('.calc-items', $view).removeClass('hide');
  873. } else {
  874. var suitablePet = product.isSuitablePet(cachePageData.productType, petName, petMaxWeight, petMinWeight);
  875. order.productType = cachePageData.productType;
  876. if (!!suitablePet.petPrice) {
  877. petPrice = suitablePet.petPrice;
  878. pay = petPrice;
  879. order.set('productID', suitablePet.productID);
  880. order.petPrice = petPrice;
  881. } else {
  882. petName = '';
  883. petWeight = '';
  884. petMaxWeight = '';
  885. petMinWeight = '';
  886. petPrice = 0;
  887. productID = '';
  888. cart['products'][cachePageData.productType]['couponName'] = '';
  889. cart['products'][cachePageData.productType]['couponVal'] = '';
  890. cart['products'][cachePageData.productType]['couponId'] = '';
  891. }
  892. // 设置订单优惠券
  893. // order.set('couponID', cart['products'][cachePageData.productType]['couponId']);
  894. var extraService = product.getExtraServiceList(cachePageData.productType, petName);
  895. var tmpData = {
  896. env: config,
  897. prodcutTitle: product.getProductTitle(productType),
  898. extraService: extraService,
  899. extraServicePrice: 0,
  900. petName: petName,
  901. petWeight: petWeight,
  902. petPrice: petPrice,
  903. beauticianName: order.beautician.name,
  904. bookingTimeStr: order.bookingTimeStr,
  905. address: order.address,
  906. showCoupon: (user.orderCoupons.length > 0),
  907. couponName: '',
  908. couponVal: 0,
  909. precedence: precedencePrice,
  910. showNavBar: !config.isWX && !config.isChubao,
  911. productType: product.getGroupFullName(parseInt(productType)),
  912. type: productType,
  913. totalCost: petPrice,
  914. pay: pay
  915. };
  916. var tpl = template('placeOrder/index', tmpData);
  917. $view.find('.spa-page-body').html(tpl);
  918. }
  919. fixScroll(pageData);
  920. //弹出键盘 关闭键盘的时候刷新iscroll
  921. $('.order-memo', $view).focus(function (event) {
  922. var that = this;
  923. checkScroll(pageData, function () {
  924. if (pageData.scroll) {
  925. pageData.scroll.scrollToElement(that, 0);
  926. }
  927. });
  928. });
  929. // $('.show-coupon-picker').addClass('disabled').find('.coupon-selected-name').text('优惠券暂不可使用');
  930. $('.order-memo', $view).on('closeKeyboard', function (event) {
  931. checkScroll(pageData);
  932. $(this).blur();
  933. });
  934. $('.order-memo', $view).blur(function (event) {
  935. checkScroll(pageData);
  936. });
  937. //阻止form提交
  938. $('#order-form', $view).on('submit', function (event) {
  939. $(this).blur();
  940. return false;
  941. });
  942. if (productType == 6 || productType == 7) {
  943. var petInfo = product.productGroup[productType][0];
  944. $('.pet-info', $view).html(petInfo['pet_types'][0]['name']);
  945. $('.pet-type', $view).html(petInfo['pet_types'][0]['name']);
  946. $('.total-cost', $view).html('¥' + petInfo.price);
  947. $('.order-cost', $view).html('¥' + petInfo.price);
  948. $('.order-cost', $view).attr('data-pay', petInfo.price);
  949. $('.order-cost', $view).attr('data-costs', petInfo.price);
  950. order.petPrice = parseFloat(petInfo.price);
  951. order.productID = petInfo.id;
  952. $('.select-pet', $view).removeClass('hide');
  953. $('.extra-service-title', $view).addClass('hide');
  954. }
  955. if (order.productID && order.bookingDate && productType < 10) {
  956. setCoupon($view, pageData, cachePageData.extraServicePrice);
  957. }
  958. }
  959. if (order.address) {
  960. var addressStr = '';
  961. if (order.address.address.poi) {
  962. addressStr = order.address.address.city + order.address.address.area + order.address.address.poi.name + order.address.address.detail
  963. } else {
  964. addressStr = order.address.address.province + order.address.address.city + order.address.address.area + order.address.address.detail
  965. }
  966. $('.order-address', $view).html(addressStr);
  967. $('.select-address', $view).addClass('show-address');
  968. $('.order-username', $view).html(order.address.name);
  969. $('.order-mobile', $view).html(order.address.mobile);
  970. $('.booking-people', $view).html(order.beautician.name);
  971. }
  972. if (order.beautician.id) {
  973. $('.booking-people', $view).html(order.beautician.name);
  974. }
  975. dtd.resolve();
  976. },
  977. afteropen: function(pageData, dtd){
  978. var type = pageData.pushData.productType;
  979. native.registerEvent(true);
  980. dtd.resolve();
  981. if (config.isWX) {
  982. wx.ready(function(){
  983. wx.onMenuShareTimeline({
  984. title: '宠物上门' + product.getWXShare(type).name + ',首选壹管家APP',
  985. link: 'http://www.wozhua.mobi/o2o/web/index',
  986. imgUrl: product.getWXShare(type).className
  987. });
  988. wx.onMenuShareAppMessage({
  989. title: '宠物上门' + product.getWXShare(type).name + ',首选壹管家APP',
  990. desc: '足不出户,就能享受专业保洁师为您家爱宠提供的' + product.getWXShare(type).name + '服务!',
  991. link: 'http://www.wozhua.mobi/o2o/web/index',
  992. imgUrl: product.getWXShare(type).className
  993. });
  994. });
  995. }
  996. },
  997. afterclose: function(pageData){
  998. cachePageData.extraServicePrice = 0;
  999. order.productCount = 1;
  1000. order.extraService = []; // 离开下单页面 清空附加服务列表
  1001. order.beautician = {
  1002. name: '请选择',
  1003. id: ''
  1004. };
  1005. native.registerEvent(false);
  1006. }
  1007. }
  1008. })