placeOrder.js 36 KB

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