placeOrder.js 39 KB

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