carts.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. 'use strict';
  2. import AddressComponent from '../../prototype/addressComponent'
  3. import formidable from 'formidable'
  4. import PaymentsModel from '../../models/v1/payments'
  5. import ShopModel from '../../models/shopping/shop'
  6. import CartModel from '../../models/v1/cart'
  7. class Carts extends AddressComponent{
  8. constructor(){
  9. super();
  10. this.extra = [{
  11. description: '',
  12. name: '餐盒',
  13. price: 0,
  14. quantity: 1,
  15. type: 0,
  16. }]
  17. this.checkout = this.checkout.bind(this);
  18. }
  19. async checkout(req, res, next){
  20. const UID = req.session.UID;
  21. const form = new formidable.IncomingForm();
  22. form.parse(req, async (err, fields, files) => {
  23. const {come_from, geohash, entities = [], restaurant_id} = fields;
  24. try{
  25. if(!(entities instanceof Array) || !entities.length){
  26. throw new Error('entities参数错误')
  27. }else if(!(entities[0] instanceof Array) || !entities[0].length){
  28. throw new Error('entities参数错误')
  29. }else if(!restaurant_id){
  30. throw new Error('restaurant_id参数错误')
  31. }
  32. }catch(err){
  33. console.log(err);
  34. res.send({
  35. status: 0,
  36. type: 'ERROR_PARAMS',
  37. message: err.message
  38. })
  39. return
  40. }
  41. let payments; //付款方式
  42. let cart_id; //购物车id
  43. let restaurant; //餐馆详情
  44. let deliver_time; //配送时间
  45. let delivery_reach_time; //到达时间
  46. let from = geohash.split(',')[0] + ',' + geohash.split(',')[1];
  47. try{
  48. payments = await PaymentsModel.find({}, '-_id');
  49. cart_id = await this.getId('cart_id');
  50. restaurant = await ShopModel.findOne({id: restaurant_id});
  51. const to = restaurant.latitude+ ',' + restaurant.longitude;
  52. deliver_time = await this.getDistance(from, to, 'tiemvalue');
  53. let time = new Date().getTime() + deliver_time*1000;
  54. let hour = ('0' + new Date(time).getHours()).substr(-2);
  55. let minute = ('0' + new Date(time).getMinutes()).substr(-2);
  56. delivery_reach_time = hour + ':' + minute;
  57. }catch(err){
  58. console.log('获取数据数据失败', err);
  59. res.send({
  60. status: 0,
  61. type: 'ERROR_DATA',
  62. message: '添加购物车失败',
  63. })
  64. return
  65. }
  66. const deliver_amount = 4;
  67. let price = 0; //食品价格
  68. entities[0].map(item => {
  69. price += item.price * item.quantity;
  70. if (item.packing_fee) {
  71. this.extra[0].price += item.packing_fee*item.quantity;
  72. }
  73. if (item.specs[0]) {
  74. return item.name = item.name + '-' + item.specs[0];
  75. }
  76. })
  77. //食品总价格
  78. const total = price + this.extra[0].price * this.extra[0].quantity + deliver_amount;
  79. //是否支持发票
  80. let invoice = {
  81. is_available: false,
  82. status_text: "商家不支持开发票",
  83. };
  84. restaurant.supports.forEach(item => {
  85. if (item.icon_name == '票') {
  86. invoice = {
  87. is_available: true,
  88. status_text: "不需要开发票",
  89. };
  90. }
  91. })
  92. const checkoutInfo = {
  93. id: cart_id,
  94. cart: {
  95. id: cart_id,
  96. groups: entities,
  97. extra: this.extra,
  98. deliver_amount,
  99. is_deliver_by_fengniao: !!restaurant.delivery_mode,
  100. original_total: total,
  101. phone: restaurant.phone,
  102. restaurant_id,
  103. restaurant_info: restaurant,
  104. restaurant_minimum_order_amount: restaurant.float_minimum_order_amount,
  105. total,
  106. user_id: UID,
  107. },
  108. delivery_reach_time,
  109. invoice,
  110. sig: Math.ceil(Math.random()*1000000).toString(),
  111. payments,
  112. }
  113. try{
  114. const newCart = new CartModel(checkoutInfo);
  115. const cart = await newCart.save();
  116. res.send(cart)
  117. }catch(err){
  118. console.log('保存购物车数据失败');
  119. res.send({
  120. status: 0,
  121. type: 'ERROR_TO_SAVE_CART',
  122. message: '加入购物车失败'
  123. })
  124. }
  125. })
  126. }
  127. }
  128. export default new Carts()