order.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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 dtime from 'time-formater'
  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 deliver_fee = {price: cartDetail.cart.deliver_amount};
  64. const orderObj = {
  65. basket: {
  66. group: entities,
  67. packing_fee: {
  68. name: cartDetail.cart.extra[0].name,
  69. price: cartDetail.cart.extra[0].price,
  70. quantity: cartDetail.cart.extra[0].quantity,
  71. },
  72. deliver_fee,
  73. },
  74. restaurant_id: cartDetail.cart.restaurant_id,
  75. restaurant_image_url: cartDetail.cart.restaurant_info.image_path,
  76. restaurant_name: cartDetail.cart.restaurant_info.name,
  77. formatted_created_at: dtime().format('YYYY-MM-DD HH:mm'),
  78. order_time: new Date().getTime(),
  79. time_pass: 900,
  80. status_bar: {
  81. color: 'f60',
  82. image_type: '',
  83. sub_title: '15分钟内支付',
  84. title: '',
  85. },
  86. total_amount: cartDetail.cart.total,
  87. total_quantity: entities[0].length,
  88. unique_id: order_id,
  89. id: order_id,
  90. user_id,
  91. address_id,
  92. }
  93. try{
  94. await OrderModel.create(orderObj);
  95. res.send({
  96. status: 1,
  97. success: '下单成功,请及时付款',
  98. need_validation: false,
  99. })
  100. }catch(err){
  101. console.log('保存订单数据失败');
  102. res.send({
  103. status: 0,
  104. type: 'ERROR_SAVE_ORDER',
  105. message: '保存订单失败'
  106. })
  107. }
  108. })
  109. }
  110. async getOrders(req, res, next){
  111. const user_id = req.params.user_id;
  112. const {limit = 0, offset = 0} = req.query;
  113. try{
  114. if(!user_id || !Number(user_id)){
  115. throw new Error('user_id参数错误')
  116. }else if(!Number(limit)){
  117. throw new Error('limit参数错误')
  118. }else if(typeof Number(offset) !== 'number'){
  119. throw new Error('offset参数错误')
  120. }
  121. }catch(err){
  122. console.log(err.message, err);
  123. res.send({
  124. status: 0,
  125. type: 'ERROR_PARAMS',
  126. message: err.message
  127. })
  128. return
  129. }
  130. try{
  131. const orders = await OrderModel.find({user_id}).sort({id: -1}).limit(Number(limit)).skip(Number(offset));
  132. const timeNow = new Date().getTime();
  133. orders.map(item => {
  134. if (timeNow - item.order_time < 900000) {
  135. item.status_bar.title = '等待支付';
  136. }else{
  137. item.status_bar.title = '支付超时';
  138. }
  139. item.time_pass = Math.ceil((timeNow - item.order_time)/1000);
  140. item.save()
  141. return item
  142. })
  143. res.send(orders);
  144. }catch(err){
  145. console.log('获取订单列表失败', err);
  146. res.send({
  147. status: 0,
  148. type: 'ERROR_GET_ORDER_LIST',
  149. message: '获取订单列表失败'
  150. })
  151. }
  152. }
  153. async getDetail(req, res, next){
  154. const {user_id, order_id} = req.params;
  155. try{
  156. if (!user_id || !Number(user_id)) {
  157. throw new Error('user_id参数错误')
  158. }else if(!order_id || !Number(order_id)){
  159. throw new Error('order_id参数错误')
  160. }
  161. }catch(err){
  162. console.log(err.message);
  163. res.send({
  164. status: 0,
  165. type: 'GET_ERROR_PARAM',
  166. message: err.message,
  167. })
  168. return
  169. }
  170. try{
  171. const order = await OrderModel.findOne({id: order_id}, '-_id');
  172. const addressDetail = await AddressModel.findOne({id: order.address_id});
  173. const orderDetail = {...order, ...{addressDetail: addressDetail.address, consignee: addressDetail.name, deliver_time: '尽快送达', pay_method: '在线支付', phone: addressDetail.phone}};
  174. res.send(orderDetail)
  175. }catch(err){
  176. console.log('获取订单信息失败', err);
  177. res.send({
  178. status: 0,
  179. type: 'ERROR_TO_GET_ORDER_DETAIL',
  180. message: '获取订单信息失败'
  181. })
  182. }
  183. }
  184. async getAllOrders(req, res, next){
  185. const {restaurant_id, limit = 20, offset = 0} = req.query;
  186. try{
  187. let filter = {};
  188. if (restaurant_id && Number(restaurant_id)) {
  189. filter = {restaurant_id}
  190. }
  191. const orders = await OrderModel.find(filter).sort({id: -1}).limit(Number(limit)).skip(Number(offset));
  192. const timeNow = new Date().getTime();
  193. orders.map(item => {
  194. if (timeNow - item.order_time < 900000) {
  195. item.status_bar.title = '等待支付';
  196. }else{
  197. item.status_bar.title = '支付超时';
  198. }
  199. item.time_pass = Math.ceil((timeNow - item.order_time)/1000);
  200. item.save()
  201. return item
  202. })
  203. res.send(orders);
  204. }catch(err){
  205. console.log('获取订单数据失败', err);
  206. res.send({
  207. status: 0,
  208. type: 'GET_ORDER_DATA_ERROR',
  209. message: '获取订单数据失败'
  210. })
  211. }
  212. }
  213. async getOrdersCount(req, res, next){
  214. const restaurant_id = req.query.restaurant_id;
  215. try{
  216. let filter = {};
  217. if (restaurant_id && Number(restaurant_id)) {
  218. filter = {restaurant_id}
  219. }
  220. const count = await OrderModel.find(filter).count();
  221. res.send({
  222. status: 1,
  223. count,
  224. })
  225. }catch(err){
  226. console.log('获取订单数量失败', err);
  227. res.send({
  228. status: 0,
  229. type: 'ERROR_TO_GET_COUNT',
  230. message: '获取订单数量失败'
  231. })
  232. }
  233. }
  234. }
  235. export default new Order()