order.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. 'use strict';
  2. import BaseComponent from '../../prototype/baseComponent'
  3. import formidable from 'formidable'
  4. import OrderModel from '../../models/bos/order'
  5. import CartModel from '../../models/v1/cart'
  6. import timestamp from 'time-stamp'
  7. import AddressModel from '../../models/v1/address'
  8. class Order extends BaseComponent{
  9. constructor(){
  10. super()
  11. this.postOrder = this.postOrder.bind(this);
  12. }
  13. async postOrder(req, res, next){
  14. const form = new formidable.IncomingForm();
  15. form.parse(req, async (err, fields, files) => {
  16. if (err) {
  17. console.log('formidable解析出错', err);
  18. res.send({
  19. status: 1,
  20. message: '下单失败'
  21. })
  22. return
  23. }
  24. const {user_id, cart_id} = req.params;
  25. const {address_id, come_from = 'mobile_web', deliver_time = '', description, entities, geohash, paymethod_id = 1} = fields;
  26. try{
  27. if(!(entities instanceof Array) || !entities.length){
  28. throw new Error('entities参数错误')
  29. }else if(!(entities[0] instanceof Array) || !entities[0].length){
  30. throw new Error('entities参数错误')
  31. }else if(!address_id){
  32. throw new Error('address_id参数错误')
  33. }else if(!user_id || !Number(user_id)){
  34. throw new Error('user_id参数错误')
  35. }else if(!cart_id || !Number(cart_id)){
  36. throw new Error('cart_id参数错误')
  37. }else if(!user_id){
  38. throw new Error('未登录')
  39. }
  40. }catch(err){
  41. console.log(err.message, err);
  42. res.send({
  43. status: 0,
  44. type: 'ERROR_PARAMS',
  45. message: err.message
  46. })
  47. return
  48. }
  49. let cartDetail;
  50. let order_id;
  51. try{
  52. cartDetail = await CartModel.findOne({id: cart_id});
  53. order_id = await this.getId('order_id');
  54. }catch(err){
  55. console.log('获取数据失败', err);
  56. res.send({
  57. status: 0,
  58. type: 'ERROR_GET_DATA',
  59. message: '获取订单失败',
  60. })
  61. return
  62. }
  63. const orderObj = {
  64. basket: {
  65. group: entities,
  66. packing_fee: {
  67. name: cartDetail.cart.extra[0].name,
  68. price: cartDetail.cart.extra[0].price,
  69. quantity: cartDetail.cart.extra[0].quantity,
  70. }
  71. },
  72. restaurant_id: cartDetail.cart.restaurant_id,
  73. restaurant_image_url: cartDetail.cart.restaurant_info.image_path,
  74. restaurant_name: cartDetail.cart.restaurant_info.name,
  75. formatted_created_at: timestamp('YYYY-MM-DD mm:ss'),
  76. order_time: new Date().getTime(),
  77. time_pass: 900,
  78. status_bar: {
  79. color: 'f60',
  80. image_type: '',
  81. sub_title: '15分钟内支付',
  82. title: '',
  83. },
  84. total_amount: cartDetail.cart.total,
  85. total_quantity: entities[0].length,
  86. unique_id: order_id,
  87. id: order_id,
  88. user_id,
  89. address_id,
  90. }
  91. try{
  92. await OrderModel.create(orderObj);
  93. res.send({
  94. status: 1,
  95. success: '下单成功,请及时付款',
  96. need_validation: false,
  97. })
  98. }catch(err){
  99. console.log('保存订单数据失败');
  100. res.send({
  101. status: 0,
  102. type: 'ERROR_SAVE_ORDER',
  103. message: '保存订单失败'
  104. })
  105. }
  106. })
  107. }
  108. async getOrders(req, res, next){
  109. const user_id = req.params.user_id;
  110. const {limit = 0, offset = 0} = req.query;
  111. try{
  112. if(!user_id || !Number(user_id)){
  113. throw new Error('user_id参数错误')
  114. }else if(!Number(limit)){
  115. throw new Error('limit参数错误')
  116. }else if(typeof Number(offset) !== 'number'){
  117. throw new Error('offset参数错误')
  118. }
  119. }catch(err){
  120. console.log(err.message, err);
  121. res.send({
  122. status: 0,
  123. type: 'ERROR_PARAMS',
  124. message: err.message
  125. })
  126. return
  127. }
  128. try{
  129. const orders = await OrderModel.find({user_id}).limit(Number(limit)).skip(Number(offset));
  130. const timeNow = new Date().getTime();
  131. orders.map(item => {
  132. if (timeNow - item.order_time < 900000) {
  133. item.status_bar.title = '等待支付';
  134. }else{
  135. item.status_bar.title = '支付超时';
  136. }
  137. item.time_pass = Math.ceil((timeNow - item.order_time)/1000);
  138. item.save()
  139. return item
  140. })
  141. res.send(orders);
  142. }catch(err){
  143. console.log('获取订单列表失败', err);
  144. res.send({
  145. status: 0,
  146. type: 'ERROR_GET_ORDER_LIST',
  147. message: '获取订单列表失败'
  148. })
  149. }
  150. }
  151. async getDetail(req, res, next){
  152. const {user_id, order_id} = req.params;
  153. try{
  154. if (!user_id || !Number(user_id)) {
  155. throw new Error('user_id参数错误')
  156. }else if(!order_id || !Number(order_id)){
  157. throw new Error('order_id参数错误')
  158. }
  159. }catch(err){
  160. console.log(err.message);
  161. res.send({
  162. status: 0,
  163. type: 'GET_ERROR_PARAM',
  164. message: err.message,
  165. })
  166. return
  167. }
  168. try{
  169. const order = await OrderModel.findOne({id: order_id}, '-_id');
  170. const addressDetail = await AddressModel.findOne({id: order.address_id});
  171. const orderDetail = {...order, ...{addressDetail: addressDetail.address, consignee: addressDetail.name, deliver_time: '尽快送达', pay_method: '在线支付', phone: addressDetail.phone}};
  172. res.send(orderDetail)
  173. }catch(err){
  174. console.log('获取订单信息失败', err);
  175. res.send({
  176. status: 0,
  177. type: 'ERROR_TO_GET_ORDER_DETAIL',
  178. message: '获取订单信息失败'
  179. })
  180. }
  181. }
  182. }
  183. export default new Order()