placeOrder.js 32 KB

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