placeOrder.js 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951
  1. define(['$', 'template', 'order', 'native', 'helper', 'user', 'api', 'config', 'address', 'IScroll'], function ($, template, order, native, helper, user, api, config, address, IScroll) {
  2. /*
  3. * 这里对product和order做一个说明。
  4. * product前台写死。order沿用原模型,但只用其中几个字段。
  5. * 对应关系如下:
  6. * product.id == order.productID :产品ID
  7. * product.type == order.productType :产品类型,约定的数字
  8. * product.price == order.cost :订单原价,当product的extra字段为空
  9. * product.extra.price == order.cost :订单原价,当product的extra字段不为空
  10. * product.type_str == order.serviceName :服务名称
  11. * product.extra.type == order.appendID :服务的额外选项,当product的extra字段不为空
  12. */
  13. /* 从首页传来的产品数据 */
  14. var product;
  15. /* 软键盘弹出与消失时布局变动。 */
  16. function checkScroll(pageData, callback) {
  17. if (pageData.scroll) {
  18. if (!pageData.scrollHeight) {
  19. pageData.scrollHeight = 0;
  20. }
  21. clearInterval(pageData.scrollCheck);
  22. clearTimeout(pageData.scrollCheckAutoCancel);
  23. pageData.scrollCheck = setInterval(function () {
  24. pageData.scroll.refresh();
  25. if ($.isFunction(callback)) {
  26. callback();
  27. }
  28. }, 50);
  29. pageData.scrollCheckAutoCancel = setTimeout(function () {
  30. clearInterval(pageData.scrollCheck);
  31. }, 500);
  32. }
  33. }
  34. /* 返回上一级 */
  35. function back(event) {
  36. event.preventDefault();
  37. $(document).trigger('spa:navigate', {
  38. hash: '',
  39. pushData: {
  40. dontNeedReload: true
  41. }
  42. });
  43. }
  44. /* 重置页面时调用,重新生成IScroll */
  45. function fixScroll(pageData) {
  46. setInterval(function () {
  47. if (product.name == "双11虹口区日常保洁特价体验") {
  48. $('.show-time-picker').css('display', 'none');
  49. $('.show-coupon-picker').css('display', 'none');
  50. $('.table-link-label').css('display', 'none');
  51. $('.product-pic-o2o').css('display', 'none');
  52. $('.o2o-singles-day').css('display', 'inline');
  53. }
  54. }, 1000);
  55. if (pageData.scroll) {
  56. pageData.scroll.destroy();
  57. pageData.scroll = null;
  58. }
  59. var placeOrderScroll;
  60. setTimeout(function () {
  61. pageData.scroll = new IScroll('#placeOrderScroll');
  62. }, 1000);
  63. }
  64. /* 算账。 */
  65. function payCharge($orderCost) {
  66. order.payValue = order.cost - order.couponValue;
  67. $orderCost.text('¥' + order.payValue);
  68. }
  69. /* 也是自动选取最大优惠券的操作,只是与setCoupon策略不同
  70. function suitable(me, doc, productID, type, petPrice, pay, pageData, extra, precedence) {
  71. extra = extra || 0;
  72. precedence = precedence || 0;
  73. // 获取该类型宠物 可用优惠券
  74. doc.trigger('spa:openloader');
  75. api.getCouponList({
  76. products: JSON.stringify([{
  77. product_id: productID,
  78. count: 1
  79. }]),
  80. type: type,
  81. user_id: user.id
  82. }, function (res) {
  83. doc.trigger('spa:closeloader');
  84. if (!res.success) {
  85. doc.trigger('spa:openpanel', ['simpleAlert', {
  86. message: res.message
  87. }]);
  88. } else {
  89. user.orderCoupons = res.data;
  90. // 优惠券数据更新
  91. var coupons = user.orderCoupons;
  92. var couponSelectVal = 0;
  93. if (coupons.length) {
  94. // 选取最大金额
  95. var selectCoupon = user.getMaxAvailableCoupon();
  96. // 缓存到购物车
  97. cart['products'][type]['couponName'] = coupons[selectCoupon.couponIndex].coupon.name;
  98. cart['products'][type]['couponVal'] = selectCoupon.couponSelectVal;
  99. cart['products'][type]['couponId'] = coupons[selectCoupon.couponIndex].id;
  100. cart['products'][type]['couponList'] = coupons;
  101. // dom 更新
  102. $('.coupon-selected-name', me).html(user.getCouponName(coupons[selectCoupon.couponIndex].id));
  103. $('.coupon-cost', me).html('-' + selectCoupon.couponSelectVal);
  104. $('.select-coupon', me).removeClass('hide');
  105. $('.order-cost', me).attr('data-coupon', selectCoupon.couponSelectVal);
  106. $('.order-list', me).removeClass('hide');
  107. $('.order-cost', me).attr('data-pay', parseFloat(petPrice) - parseFloat(selectCoupon.couponSelectVal) + extra);
  108. // 减去优惠
  109. petPrice = parseFloat(petPrice) - parseFloat(selectCoupon.couponSelectVal) + extra + precedence;
  110. } else {
  111. // 缓存到购物车
  112. cart['products'][type]['couponName'] = '';
  113. cart['products'][type]['couponVal'] = '';
  114. cart['products'][type]['couponId'] = '';
  115. cart['products'][type]['couponList'] = [];
  116. $('.coupon-selected-name', me).html('');
  117. $('.coupon-cost', me).html('- 0');
  118. $('.select-coupon', me).addClass('hide');
  119. $('.order-cost', me).attr('data-coupon', 0);
  120. petPrice = parseFloat(petPrice) + extra + precedence;
  121. }
  122. // 缓存到本地
  123. cart.setCache('products');
  124. // 更新dom总价
  125. $('.order-cost', me).attr('data-costs', pay);
  126. $('.order-cost', me).html('¥' + petPrice);
  127. $('.select-pet', me).removeClass('hide');
  128. if (pageData && pageData.scroll) {
  129. pageData.scroll.refresh();
  130. }
  131. }
  132. });
  133. }
  134. */
  135. /* 优惠券取决于主服务、宠物、数量、时间,所以在这几个值改变后要调用这个方法,更新最大优惠
  136. function setCoupon(me, pageData, extraServicePrice) {
  137. $(document).trigger('spa:openloader');
  138. var products = JSON.stringify([{
  139. product_id: order['productID'],
  140. count: order.productCount
  141. }]);
  142. var time = order.bookingDate + ' ' + order.bookingTime + ':00';
  143. user.getProductCoupon(products, time, cachePageData.productType, function (res) {
  144. $(document).trigger('spa:closeloader');
  145. if (res.success) {
  146. var coupons = user.orderCoupons;
  147. var price = 0;
  148. if (coupons.length) {
  149. var selectCoupon = user.getMaxAvailableCoupon();
  150. cart['products'][cachePageData.productType]['couponName'] = coupons[selectCoupon.couponIndex].coupon.name;
  151. cart['products'][cachePageData.productType]['couponVal'] = selectCoupon.couponSelectVal;
  152. cart['products'][cachePageData.productType]['couponId'] = coupons[selectCoupon.couponIndex].id;
  153. cart['products'][cachePageData.productType]['couponList'] = coupons;
  154. $('.coupon-selected-name', me).html(user.getCouponName(coupons[selectCoupon.couponIndex].id));
  155. $('.coupon-cost', me).html('-' + selectCoupon.couponSelectVal);
  156. $('.select-coupon', me).removeClass('hide');
  157. $('.order-cost', me).attr('data-coupon', selectCoupon.couponSelectVal);
  158. $('.order-list', me).removeClass('hide');
  159. price = parseFloat(order.petPrice) * order.productCount - parseFloat(selectCoupon.couponSelectVal) + parseFloat(extraServicePrice);
  160. } else {
  161. price = parseFloat(order.petPrice) * order.productCount + parseFloat(extraServicePrice);
  162. $('.coupon-selected-name', me).html('');
  163. $('.select-coupon', me).addClass('hide');
  164. $('.order-cost', me).attr('data-coupon', '0');
  165. $('.order-cost', me).attr('data-pay', parseFloat(order.petPrice));
  166. cart['products'][cachePageData.productType]['couponName'] = '';
  167. cart['products'][cachePageData.productType]['couponVal'] = '';
  168. cart['products'][cachePageData.productType]['couponId'] = '';
  169. cart['products'][cachePageData.productType]['couponList'] = [];
  170. }
  171. // 加急
  172. if (order.precedence) {
  173. price = price + parseFloat(product.precedence);
  174. }
  175. $('.order-cost', me).attr('data-pay', price);
  176. $('.order-cost', me).attr('data-costs', order.petPrice);
  177. $('.order-cost', me).html('¥' + price);
  178. cart.setCache('products');
  179. pageData.scroll.refresh();
  180. } else {
  181. $(document).trigger('spa:openpanel', ['simpleAlert', {
  182. message: res.message
  183. }]);
  184. }
  185. });
  186. } */
  187. /* 在选择主服务或宠物后,筛选附加服务
  188. function suitExtraService(me, checkedName) {
  189. var newExtraService = product.getExtraServiceList(order.productType, order.petName, checkedName);
  190. var extraService = {
  191. extraService: newExtraService
  192. }
  193. var extraServiceTpl = template('placeOrder/list', extraService);
  194. var extraServiceTpl2 = template('placeOrder/list2', extraService);
  195. me.find('.extra-service-list').html(extraServiceTpl);
  196. me.find('.calc-items').html(extraServiceTpl2).addClass('hide');
  197. cachePageData.extraServicePrice = 0;
  198. cachePageData.extraServiceCount = 0;
  199. } */
  200. /* 在选择主服务、附加服务、宠物、时间、地点之后,重置保洁师
  201. function resetTech(me) {
  202. order.beautician.name = '请选择';
  203. order.beautician.id = '';
  204. $('.booking-people', me).html(order.beautician.name);
  205. } */
  206. return {
  207. title: '壹管家上门服务',
  208. body: '',
  209. init: function (pageData, dtd) {
  210. var $view = this;
  211. var $doc = $(document);
  212. /* 三个返回操作 */
  213. $.newTouch('.back-button', function (event) {
  214. back.call(this, event);
  215. // history.go(-1);
  216. }, $view);
  217. $view.on('tapBackButton', function (event) {
  218. back.call(this, event);
  219. // history.go(-1);
  220. });
  221. $view.on('swipeRight', function (event) {
  222. back.call(this, event);
  223. // history.go(-1);
  224. });
  225. /*setTimeOut*/
  226. /* 点击查看详情。跳转到product页面 */
  227. $.newTouch('.product-pic-o2o', function (event) {
  228. $doc.trigger('spa:navigate', {
  229. hash: 'product',
  230. pushData: {
  231. produc: product,
  232. needReload: true
  233. }
  234. });
  235. }, $view);
  236. /*特效*/
  237. setInterval(function run() {
  238. $('.product-img').fadeToggle();
  239. },500);
  240. /* 点击选择extra。 */
  241. $.newTouch('.btn-main-service', function (event) {
  242. /* on代表这一条的选中状态。如果已经选中了,就return。this的作用域是这一条extra。 */
  243. if ($(this).hasClass('on')) return;
  244. /* 如果没有on状态,加上on。 */
  245. $(this).addClass('on');
  246. /* 删掉其他选择框的on状态 */
  247. $(this).parent().siblings().find('.btn').removeClass('on');
  248. /* 填写order */
  249. order.appendID = $(this).attr('data-extra-type');
  250. order.price = $(this).attr('data-extra-price');
  251. order.cost = order.price * order.productCount;
  252. // 重置代金券
  253. $('.coupon-selected-name', $view).html('选择优惠券');
  254. order.couponValue = 0;
  255. order.couponID = '';
  256. payCharge($('.order-cost', $view));
  257. }, $view);
  258. /* 点击选择地址 */
  259. $.newTouch('.select-address', function (event) {
  260. event.preventDefault();
  261. /* 如果是微信客户端,跳转到addressList页面。 */
  262. if (!config.isAndroid && !config.isIOS) {
  263. $doc.trigger('spa:navigate', {
  264. hash: 'addressList',
  265. pushData: {
  266. backHash: 'placeOrder'
  267. },
  268. callback: {
  269. /* 在addressList页面挑选之后,回到这个页面时执行的回调。 */
  270. onSelect: function (address, station) {
  271. order.set('address', address, true);
  272. order.set('stationID', station, true);
  273. var addressStr = '';
  274. if (order.address.address.poi) {
  275. addressStr = order.address.address.city + order.address.address.area + order.address.address.poi.name + order.address.address.detail
  276. } else {
  277. addressStr = order.address.address.province + order.address.address.city + order.address.address.area + order.address.address.detail
  278. }
  279. $('.order-address', $view).html(addressStr);
  280. $('.order-username', $view).html(order.address.name);
  281. $('.order-mobile', $view).html(order.address.mobile);
  282. }
  283. }
  284. });
  285. }
  286. }, $view);
  287. /* 点击选择附加服务
  288. $.newTouch('.item-checkbox', function (event) {
  289. event.preventDefault();
  290. // 如果'.main-service'元素的子元素数目为正(也就是说出现了选择主服务那一栏,也就是说在前一页选择的是附加服务),且不处于on状态(也就是还没有选择主服务)
  291. if ($('.main-service', $view).length && !$('.main-service', $view).find('.btn-main-service').hasClass('on')) {
  292. // 弹出一个对话框
  293. $doc.trigger('spa:openpanel', ['simpleAlert', {
  294. message: '请选择服务类型'
  295. }]);
  296. return;
  297. }
  298. // $(this).data('xxx'):获取this中data-xxx的数据。
  299. // 获取这一条附加服务的相关的数据。select没用,估计是原来想用这个记录选中状态的。
  300. var select = $(this).data('select'),
  301. id = $(this).data('id'),
  302. index = $(this).parent().index(),
  303. price = $(this).data('price');
  304. extraType = $(this).data('servicetype');
  305. // 获取附加服务的总费用。
  306. var extraCost = $('.order-cost', $view).attr('data-extra');
  307. // 如果原来没有选中这一项,下面就是选中的操作
  308. if (!$(this).hasClass('checked')) {
  309. // 附加服务数量+1
  310. cachePageData.extraServiceCount++;
  311. // 保存附加服务的总价格
  312. cachePageData.extraServicePrice += parseFloat(price);
  313. // 添加checked状态
  314. $(this).addClass('checked');
  315. var serviceParam = {
  316. product_id: id,
  317. count: 1
  318. }
  319. // /为什么是个数组?
  320. order.extraService[index] = serviceParam;
  321. // 把订单详情中对应的项目添加on属性
  322. $('.calc-items', $view).find('.select-extra-service').eq(index).addClass('on');
  323. // 计算附加服务的总费用。
  324. extraCost = parseFloat(extraCost) + parseFloat(price);
  325. $('.order-cost', $view).attr('data-extra', extraCost);
  326. }
  327. // 如果原来选中了这一项,下面就是取消选中的操作
  328. else {
  329. // 附加服务数量-1
  330. cachePageData.extraServiceCount--;
  331. // 保存附加服务的总价格
  332. cachePageData.extraServicePrice -= parseFloat(price);
  333. // 删除checked属性
  334. $(this).removeClass('checked');
  335. order.extraService[index] = {};
  336. // 把订单详情中对应的项目删掉on属性
  337. $('.calc-items', $view).find('.select-extra-service').eq(index).removeClass('on');
  338. // 计算附加服务的总费用。
  339. extraCost = parseFloat(extraCost) - parseFloat(price);
  340. $('.order-cost', $view).attr('data-extra', extraCost);
  341. }
  342. // 根据附加服务的数量,更新订单详情中附加服务模块的显示与隐藏
  343. if (cachePageData.extraServiceCount > 0) {
  344. $('.calc-items', $view).removeClass('hide');
  345. } else {
  346. $('.calc-items', $view).addClass('hide');
  347. }
  348. // 更新订单详情中每一条附加服务的显示与隐藏
  349. if ($('.calc-items', $view).find('.select-extra-service').hasClass('on')) {
  350. $('.calc-items', $view).removeClass('hide');
  351. } else {
  352. $('.calc-items', $view).addClass('hide');
  353. }
  354. // 计算总价钱
  355. payCharge();
  356. // 刷新界面
  357. pageData.scroll.refresh();
  358. }, $view); */
  359. /* 点击选择保洁师
  360. $.newTouch('.show-beautician-picker', function (event) {
  361. // 如果订单的地址数据为空
  362. if (!order.address || !order.address.address_id) {
  363. // 弹出提示框
  364. $doc.trigger('spa:openpanel', ['simpleAlert', {
  365. message: '请选择地址'
  366. }]);
  367. return;
  368. }
  369. // 点击订单的预定时间为空
  370. if (order.bookingDate == '' || order.bookingTime == '') {
  371. // 弹出提示框
  372. $doc.trigger('spa:openpanel', ['simpleAlert', {
  373. message: '请选择上门时间'
  374. }]);
  375. return;
  376. }
  377. // 点击订单的主服务类型为空
  378. if (!order.productType) {
  379. // /弹出提示框
  380. $doc.trigger('spa:openpanel', ['simpleAlert', {
  381. message: '请选择服务类型'
  382. }]);
  383. return;
  384. }
  385. // 生成预定时间的字符串
  386. var bookingTime = order.bookingDate + ' ' + order.bookingTime + ':00';
  387. // 生成所有服务的字符串
  388. var service_type_array = [order.productType];
  389. var service_type = '[' + service_type_array.join(',') + ']';
  390. // 根据服务、时间、地址,向服务器请求保洁师列表
  391. user.getTechList(
  392. service_type,
  393. bookingTime,
  394. order.address.address_id,
  395. // 请求成功后跳转到beautician页面,在beautician页面展示保洁师列表
  396. function (res) {
  397. $doc.trigger('spa:navigate', {
  398. hash: 'beautician',
  399. pushData: {
  400. }
  401. });
  402. }
  403. );
  404. }, $view); */
  405. /* 点击选择宠物相关
  406. $.newTouch('.show-product-picker', function () {
  407. // 如果有了selected属性,就return
  408. if ($(this).hasClass('selected')) return;
  409. event.preventDefault();
  410. // 主服务>10是什么意思???
  411. if (cachePageData.productType > 10) {
  412. $doc.trigger('spa:openpanel', ['simpleAlert', {
  413. message: '请选择服务类型'
  414. }]);
  415. return;
  416. }
  417. // 弹出一个列表选择框。
  418. $doc.trigger('spa:openpanel', ['productOption', {
  419. pets: product.productGroup[cachePageData.productType],
  420. productType: cachePageData.productType,
  421. callback: {
  422. onSelect: function (petName, petWeight, petPrice) {
  423. // set order info
  424. order.petName = petName;
  425. order.petWeight = petWeight;
  426. order.petPrice = petPrice;
  427. order.productType = cachePageData.productType;
  428. order.petID = cart['products'][cachePageData.productType]['petID'];
  429. order.productID = cart['products'][cachePageData.productType]['productID'];
  430. // user.orderCoupons = res.data;
  431. // 筛选附加服务
  432. if (cachePageData.extraServiceType > 10) {
  433. var selectExtraServiceName = cachePageData.defaultExtraService[cachePageData.extraServiceType].serviceName;
  434. var selectExtraServicePrice = cachePageData.defaultExtraService[cachePageData.extraServiceType].servicePrice;
  435. $('.order-cost', $view).attr('data-extra', selectExtraServicePrice);
  436. }
  437. suitExtraService($view, selectExtraServiceName);
  438. $('.pet-info', $view).html(petName + ' (' + petWeight + ')');
  439. $('.pet-type', $view).html(petName + ' (' + petWeight + ')');
  440. $('.total-cost', $view).html('¥' + petPrice);
  441. if ($('.calc-items', $view).find('.select-extra-service').hasClass('on')) {
  442. $('.calc-items', $view).removeClass('hide');
  443. petPrice = parseFloat(petPrice) + parseFloat(selectExtraServicePrice);
  444. }
  445. $('.order-cost', $view).attr('data-costs', order.petPrice);
  446. $('.order-cost', $view).attr('data-extra', cachePageData.extraServicePrice);
  447. $('.order-cost', $view).html('¥' + petPrice);
  448. $('.select-pet', $view).removeClass('hide');
  449. if (order['productID'] && order.bookingDate) {
  450. setCoupon($view, pageData, cachePageData.extraServicePrice);
  451. }
  452. pageData.scroll.refresh();
  453. }
  454. }
  455. }]);
  456. }, $view); */
  457. /* 点击数量-1 */
  458. $.newTouch('.btn-sub', function (event) {
  459. if (order.productCount <= 1) return;
  460. if (order.price == 0) {
  461. $doc.trigger('spa:openpanel', ['simpleAlert', {
  462. message: '请选择服务'
  463. }]);
  464. return;
  465. }
  466. var inputNum = $('.service-count', $view).children('.input-num').val();
  467. if (isNaN(inputNum)) {
  468. $doc.trigger('spa:openpanel', ['simpleAlert', {
  469. message: '请输入数字'
  470. }]);
  471. return false;
  472. }
  473. order.productCount = inputNum;
  474. order.productCount--;
  475. order.cost = order.productCount * order.price;
  476. $('.service-count', $view).children('.input-num').val(order.productCount);
  477. /* 算账 */
  478. payCharge($('.order-cost', $view));
  479. }, $view);
  480. /*点击body重置金额*/
  481. $.newTouch('body', function (event) {
  482. //input输入
  483. var inputNum = $('.service-count', $view).children('.input-num').val();
  484. if (isNaN(inputNum)) {
  485. $doc.trigger('spa:openpanel', ['simpleAlert', {
  486. message: '请输入数字'
  487. }]);
  488. return false;
  489. }
  490. //与input输入框的文本的数据做交互;
  491. order.productCount = inputNum;
  492. order.cost = order.productCount * order.price;
  493. $('.service-count', $view).children('.input-num').val(order.productCount);
  494. })
  495. /* 点击数量+1 */
  496. $.newTouch('.btn-add', function (event) {
  497. if (order.productCount > 999) return;
  498. if (order.price == 0) {
  499. $doc.trigger('spa:openpanel', ['simpleAlert', {
  500. //message: '请选择extra'
  501. message: '请选择服务'
  502. }]);
  503. return;
  504. }
  505. var inputNum = $('.service-count', $view).children('.input-num').val();
  506. if (isNaN(inputNum)) {
  507. $doc.trigger('spa:openpanel', ['simpleAlert', {
  508. message: '请输入数字'
  509. }]);
  510. return false;
  511. }
  512. order.productCount = inputNum;
  513. order.productCount++;
  514. order.cost = order.productCount * order.price;
  515. $('.service-count', $view).children('.input-num').val(order.productCount);
  516. /* 算账 */
  517. payCharge($('.order-cost', $view));
  518. }, $view);
  519. /* 点击选择时间 */
  520. $.newTouch('.show-time-picker', function (event) {
  521. event.preventDefault();
  522. // 以下是构建时间选择器,不用管。直接看选完之后的回调。
  523. var dayNamesA = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
  524. var dayNamesB = ['今天'];
  525. var columns = {
  526. columnDay: [],
  527. columnTime: []
  528. };
  529. var now = new Date().getHours();
  530. var daySelectIndex = 0;
  531. for (var i = 1; i <= 9; i++) {
  532. var dd = new Date();
  533. dd.setDate(dd.getDate() + i);
  534. var month = dd.getMonth() + 1;
  535. var day = dd.getDate();
  536. var date = month + '月' + day + '日';
  537. var dayStr = helper.getDateStr({
  538. date: dd,
  539. separator: '-'
  540. });
  541. var dayStrSuffix;
  542. if (i < dayNamesB.length) {
  543. dayStrSuffix = dayNamesB[i];
  544. } else {
  545. dayStrSuffix = dayNamesA[dd.getDay()];
  546. }
  547. var selected = false;
  548. if (order.bookingDate) {
  549. selected = true;
  550. }
  551. if (dayStr == order.bookingDate) {
  552. daySelectIndex = i;
  553. } else {
  554. daySelectIndex = -1;
  555. }
  556. columns.columnDay.push({
  557. text: date, // 几月几日
  558. day: dayStrSuffix, // 周几
  559. value: dayStr,
  560. selected: selected,
  561. selectIndex: daySelectIndex
  562. });
  563. }
  564. var currentDate = new Date();
  565. var currentMonth = currentDate.getMonth() + 1;
  566. var currentDay = currentDate.getDate();
  567. var now = new Date().getHours();
  568. var min = new Date().getMinutes();
  569. var timeSelectIndex = 0;
  570. for (var i = 9; i <= 19; i++) {
  571. var hour = i + ':00';
  572. var selected = false;
  573. if (order.bookingTime) {
  574. selected = true;
  575. }
  576. if (hour == order.bookingTime) {
  577. timeSelectIndex = i;
  578. } else {
  579. timeSelectIndex = -1;
  580. }
  581. columns.columnTime.push({
  582. month: currentMonth,
  583. day: currentDay,
  584. min: min,
  585. num: i,
  586. now: now,
  587. text: hour,
  588. value: hour,
  589. selected: selected,
  590. selectIndex: timeSelectIndex
  591. })
  592. }
  593. $doc.trigger('spa:openpanel', ['dataPicker', {
  594. // type: cachePageData.productType,
  595. columns: columns,
  596. selected: order.bookingDate,
  597. // offDay: product.offDay,
  598. callback: {
  599. // 选完之后的回调。values:[日期,时间];texts:时间字符串;precedence:是否加急;
  600. onSelect: function (values, texts, precedence) {
  601. // 重置代金券
  602. $('.coupon-selected-name', $view).html('选择优惠券');
  603. order.couponValue = 0;
  604. order.couponID = '';
  605. payCharge($('.order-cost', $view));
  606. // 填写order
  607. order.bookingDate = values[0];
  608. order.bookingTime = values[1];
  609. order.bookingTimeStr = texts[0] + ' ' + texts[1];
  610. order.precedence = precedence;
  611. // 更新预定时间组件
  612. $('.booking-time', $view).html(order.bookingTimeStr);
  613. }
  614. }
  615. }]);
  616. }, $view);
  617. /* 点击选择优惠券 */
  618. $.newTouch('.show-coupon-picker', function (event) {
  619. if ($(this).hasClass('disabled')) return;
  620. event.preventDefault();
  621. var extraJson = '';
  622. if (product.extra && !order.appendID) {
  623. $doc.trigger('spa:openpanel', ['simpleAlert', {
  624. message: '请选择服务'
  625. }]);
  626. return;
  627. } else {
  628. extraJson = JSON.stringify([{type: order.appendID, price: order.price}]);
  629. }
  630. // 必须先选择时间
  631. if (!order.bookingDate) {
  632. $doc.trigger('spa:openpanel', ['simpleAlert', {
  633. message: '请选择服务时间'
  634. }]);
  635. return;
  636. }
  637. // 跳转到picker页面,展示优惠券
  638. $doc.trigger('spa:navigate', {
  639. hash: 'picker',
  640. pushData: {
  641. title: '选择优惠券',
  642. backHash: 'placeOrder',
  643. products: JSON.stringify([{
  644. product_id: order.productID,
  645. count: order.productCount
  646. }]),
  647. time: order.bookingDate + ' ' + order.bookingTime + ':00',
  648. type: order.productType,
  649. extraJson: extraJson
  650. },
  651. callback: {
  652. // 在picker页面挑选之后,回到这个页面时执行的回调。pickValue:选中的优惠券的ID;
  653. onSelect: function (pickValue) {
  654. if (pickValue == '') {
  655. $('.coupon-selected-name', $view).text('不使用');
  656. order.couponValue = 0;
  657. } else {
  658. for (var i in user.orderCoupons) {
  659. var couponInfo = user.orderCoupons[i];
  660. if (couponInfo.id == pickValue) {
  661. $('.coupon-selected-name', $view).text(couponInfo['coupon']['name']);
  662. order.couponValue = couponInfo['coupon']['value'];
  663. break;
  664. }
  665. }
  666. }
  667. // 填写order
  668. order.couponID = pickValue;
  669. // 计算总费用
  670. payCharge($('.order-cost', $view));
  671. }
  672. }
  673. });
  674. }, $view);
  675. /* 是否选中同意用户协议,关系到下订单按钮是否激活 */
  676. $.newTouch('.agreement-touch-area', function (event) {
  677. var agreementObj = $('.agreement-checkbox', $view);
  678. if (agreementObj.prop('checked')) {
  679. agreementObj.prop('checked', false);
  680. $('.btn-place').addClass('disable');
  681. } else {
  682. agreementObj.prop('checked', true);
  683. $('.btn-place').removeClass('disable');
  684. }
  685. }, $view);
  686. /* 跳转到agreement页面查看协议 */
  687. $.newTouch('.agreement', function (event) {
  688. $doc.trigger('spa:navigate', {
  689. hash: 'agreement'
  690. });
  691. }, $view);
  692. /* 点击下订单 */
  693. $.newTouch('.btn-place', function (event) {
  694. event.preventDefault();
  695. if ($(this).hasClass('disable')) {
  696. return false;
  697. }
  698. if (product.type_str == "擦玻璃" && order.productCount < 10) {
  699. $doc.trigger('spa:openpanel', ['simpleAlert', {
  700. message: '数量不少于10平米'
  701. }]);
  702. return;
  703. }
  704. if (product.type_str == "新居开荒" && order.productCount < 50) {
  705. $doc.trigger('spa:openpanel', ['simpleAlert', {
  706. message: '数量不少于50平米'
  707. }]);
  708. return;
  709. }
  710. if (product.extra && !order.appendID) {
  711. $doc.trigger('spa:openpanel', ['simpleAlert', {
  712. message: '请选择服务'
  713. }]);
  714. return;
  715. }
  716. if (!order.address) {
  717. $doc.trigger('spa:openpanel', ['simpleAlert', {
  718. message: '请选择地址'
  719. }]);
  720. return;
  721. }
  722. if (!order.bookingTimeStr&& product.name !== "双11虹口区日常保洁特价体验") {
  723. $doc.trigger('spa:openpanel', ['simpleAlert', {
  724. message: '请选择上门时间'
  725. }]);
  726. return;
  727. }
  728. var payChannel = 'wx_pub';
  729. /* 使备注输入框失去焦点,获取值 */
  730. $('.order-memo', $view).blur();
  731. order.set('memo', $('.order-memo', $view).val());
  732. /* 向服务器下订单 */
  733. $doc.trigger('spa:openloader');
  734. if (user.balance >= order.payValue) {
  735. order.balance = order.payValue;
  736. order.payValue = 0;
  737. } else {
  738. order.balance = user.balance;
  739. order.payValue = order.payValue - order.balance;
  740. }
  741. order.addOrder(user.id, payChannel, function (res) {
  742. console.log(res);
  743. $doc.trigger('spa:closeloader');
  744. if (res.success) {
  745. // 更新user的订单
  746. user.orders[1].data.push(res.data);
  747. // 更新user的优惠券
  748. var oldCouponList = user.orderCoupons;
  749. var oldCouponId = order.couponID;
  750. var newCouponList = [];
  751. $.each(oldCouponList, function (index, val) {
  752. if (val.id !== oldCouponId) {
  753. newCouponList.push(oldCouponList[index])
  754. }
  755. });
  756. user.orderCoupons = newCouponList;
  757. var orderID = order.id;
  758. order.reset();
  759. $('.booking-time', $view).html('请选择');
  760. if (res.data.status == 1) {
  761. if(res.data.products_str=='双11虹口区日常保洁特价体验'){
  762. $doc.trigger('spa:navigate', {
  763. hash: 'bargain'
  764. });
  765. }else {
  766. $doc.trigger('spa:navigate', {
  767. hash: 'paySuccess'
  768. });
  769. }
  770. } else {
  771. $doc.trigger('spa:navigate', {
  772. hash: 'pay',
  773. pushData: {
  774. orderID: orderID,
  775. backHash: ''
  776. }
  777. });
  778. }
  779. } else {
  780. $doc.trigger('spa:openpanel', ['simpleAlert', {
  781. message: res.message
  782. }]);
  783. }
  784. });
  785. }, $view);
  786. dtd.resolve();
  787. },
  788. beforeopen: function (pageData, dtd) {
  789. var $view = this;
  790. var pushData = pageData.pushData;
  791. /* 只有首页跳转来,才会带有needReset = true */
  792. if (pushData.hasOwnProperty('needReset') && pushData.needReset) {
  793. /* 接收首页传来的product,填写order的productType(产品类型)、productID(产品ID)两个字段 */
  794. pushData.needReset = false;
  795. product = pushData.product;
  796. order.productType = product.type;
  797. order.productID = product.id;
  798. order.productCount = 1;
  799. order.couponValue = 0;
  800. /* 根据product建立渲染页面的数据 */
  801. var tmpData = {
  802. /* 环境,目前只决定是否显示保洁师 */
  803. env: config,
  804. /* 环境 */
  805. showNavBar: !config.isWX && !config.isChubao,
  806. imgSrc: product.imgSrc,
  807. /* 标题栏的标题 */
  808. title: product.name,
  809. /* extra选择项 */
  810. extra: product.extra,
  811. /* 如果用户有优惠券,则显示优惠券的选择栏 */
  812. showCoupon: user.orderCoupons.length,
  813. /* 账户余额 */
  814. balance: user.balance
  815. };
  816. /* 渲染页面 */
  817. var tpl = template('placeOrder/index', tmpData);
  818. $view.find('.spa-page-body').html(tpl);
  819. /* 绑定费用数据 */
  820. if (product.extra) {
  821. order.price = 0;
  822. order.cost = 0;
  823. } else {
  824. order.price = product.price;
  825. order.cost = product.price * order.productCount;
  826. }
  827. payCharge($('.order-cost', $view));
  828. /* 软键盘相关操作时对IScroll的补偿 */
  829. fixScroll(pageData);
  830. $('.order-memo', $view).focus(function (event) {
  831. var that = this;
  832. checkScroll(pageData, function () {
  833. if (pageData.scroll) {
  834. pageData.scroll.scrollToElement(that, 0);
  835. }
  836. });
  837. });
  838. $('.order-memo', $view).on('closeKeyboard', function (event) {
  839. checkScroll(pageData);
  840. $(this).blur();
  841. });
  842. $('.order-memo', $view).blur(function (event) {
  843. checkScroll(pageData);
  844. });
  845. /* 填写备注时,提交按钮失焦 */
  846. $('#order-form', $view).on('submit', function (event) {
  847. $(this).blur();
  848. return false;
  849. });
  850. }
  851. dtd.resolve();
  852. },
  853. afteropen: function (pageData, dtd) {
  854. var type = pageData.pushData.productType;
  855. native.registerEvent(true);
  856. dtd.resolve();
  857. if (config.isWX) {
  858. wx.ready(function () {
  859. wx.onMenuShareTimeline({
  860. title: '家政服务' + product.desc[1].content + ',首选壹管家',
  861. link: 'http://www.yiguanjia.me/o2o/web/index',
  862. imgUrl: product.desc[0].content
  863. });
  864. wx.onMenuShareAppMessage({
  865. title: '家政服务' + product.desc[1].content + ',首选壹管家',
  866. desc: '全程管家,精心每一个细节',
  867. link: 'http://www.yiguanjia.me/o2o/web/index',
  868. imgUrl: product.desc[0].content
  869. });
  870. });
  871. }
  872. },
  873. afterclose: function (pageData) {
  874. native.registerEvent(false);
  875. }
  876. }
  877. })