123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- 'use strict';
- import BaseComponent from '../../prototype/baseComponent'
- import formidable from 'formidable'
- import OrderModel from '../../models/bos/order'
- import CartModel from '../../models/v1/cart'
- import dtime from 'time-formater'
- import AddressModel from '../../models/v1/address'
- class Order extends BaseComponent{
- constructor(){
- super()
- this.postOrder = this.postOrder.bind(this);
- }
- async postOrder(req, res, next){
- const form = new formidable.IncomingForm();
- form.parse(req, async (err, fields, files) => {
- if (err) {
- console.log('formidable解析出错', err);
- res.send({
- status: 1,
- message: '下单失败'
- })
- return
- }
- const {user_id, cart_id} = req.params;
- const {address_id, come_from = 'mobile_web', deliver_time = '', description, entities, geohash, paymethod_id = 1} = fields;
- try{
- if(!(entities instanceof Array) || !entities.length){
- throw new Error('entities参数错误')
- }else if(!(entities[0] instanceof Array) || !entities[0].length){
- throw new Error('entities参数错误')
- }else if(!address_id){
- throw new Error('address_id参数错误')
- }else if(!user_id || !Number(user_id)){
- throw new Error('user_id参数错误')
- }else if(!cart_id || !Number(cart_id)){
- throw new Error('cart_id参数错误')
- }else if(!user_id){
- throw new Error('未登录')
- }
- }catch(err){
- console.log(err.message, err);
- res.send({
- status: 0,
- type: 'ERROR_PARAMS',
- message: err.message
- })
- return
- }
- let cartDetail;
- let order_id;
- try{
- cartDetail = await CartModel.findOne({id: cart_id});
- order_id = await this.getId('order_id');
- }catch(err){
- console.log('获取数据失败', err);
- res.send({
- status: 0,
- type: 'ERROR_GET_DATA',
- message: '获取订单失败',
- })
- return
- }
- const deliver_fee = {price: cartDetail.cart.deliver_amount};
- const orderObj = {
- basket: {
- group: entities,
- packing_fee: {
- name: cartDetail.cart.extra[0].name,
- price: cartDetail.cart.extra[0].price,
- quantity: cartDetail.cart.extra[0].quantity,
- },
- deliver_fee,
- },
- restaurant_id: cartDetail.cart.restaurant_id,
- restaurant_image_url: cartDetail.cart.restaurant_info.image_path,
- restaurant_name: cartDetail.cart.restaurant_info.name,
- formatted_created_at: dtime().format('YYYY-MM-DD HH:mm'),
- order_time: new Date().getTime(),
- time_pass: 900,
- status_bar: {
- color: 'f60',
- image_type: '',
- sub_title: '15分钟内支付',
- title: '',
- },
- total_amount: cartDetail.cart.total,
- total_quantity: entities[0].length,
- unique_id: order_id,
- id: order_id,
- user_id,
- address_id,
- }
- try{
- await OrderModel.create(orderObj);
- res.send({
- status: 1,
- success: '下单成功,请及时付款',
- need_validation: false,
- })
- }catch(err){
- console.log('保存订单数据失败');
- res.send({
- status: 0,
- type: 'ERROR_SAVE_ORDER',
- message: '保存订单失败'
- })
- }
- })
- }
- async getOrders(req, res, next){
- const user_id = req.params.user_id;
- const {limit = 0, offset = 0} = req.query;
- try{
- if(!user_id || !Number(user_id)){
- throw new Error('user_id参数错误')
- }else if(!Number(limit)){
- throw new Error('limit参数错误')
- }else if(typeof Number(offset) !== 'number'){
- throw new Error('offset参数错误')
- }
- }catch(err){
- console.log(err.message, err);
- res.send({
- status: 0,
- type: 'ERROR_PARAMS',
- message: err.message
- })
- return
- }
- try{
- const orders = await OrderModel.find({user_id}).sort({id: -1}).limit(Number(limit)).skip(Number(offset));
- const timeNow = new Date().getTime();
- orders.map(item => {
- if (timeNow - item.order_time < 900000) {
- item.status_bar.title = '等待支付';
- }else{
- item.status_bar.title = '支付超时';
- }
- item.time_pass = Math.ceil((timeNow - item.order_time)/1000);
- item.save()
- return item
- })
- res.send(orders);
- }catch(err){
- console.log('获取订单列表失败', err);
- res.send({
- status: 0,
- type: 'ERROR_GET_ORDER_LIST',
- message: '获取订单列表失败'
- })
- }
- }
- async getDetail(req, res, next){
- const {user_id, order_id} = req.params;
- try{
- if (!user_id || !Number(user_id)) {
- throw new Error('user_id参数错误')
- }else if(!order_id || !Number(order_id)){
- throw new Error('order_id参数错误')
- }
- }catch(err){
- console.log(err.message);
- res.send({
- status: 0,
- type: 'GET_ERROR_PARAM',
- message: err.message,
- })
- return
- }
- try{
- const order = await OrderModel.findOne({id: order_id}, '-_id');
- const addressDetail = await AddressModel.findOne({id: order.address_id});
- const orderDetail = {...order, ...{addressDetail: addressDetail.address, consignee: addressDetail.name, deliver_time: '尽快送达', pay_method: '在线支付', phone: addressDetail.phone}};
- res.send(orderDetail)
- }catch(err){
- console.log('获取订单信息失败', err);
- res.send({
- status: 0,
- type: 'ERROR_TO_GET_ORDER_DETAIL',
- message: '获取订单信息失败'
- })
- }
- }
- async getAllOrders(req, res, next){
- const {restaurant_id, limit = 20, offset = 0} = req.query;
- try{
- let filter = {};
- if (restaurant_id && Number(restaurant_id)) {
- filter = {restaurant_id}
- }
- const orders = await OrderModel.find(filter).sort({id: -1}).limit(Number(limit)).skip(Number(offset));
- const timeNow = new Date().getTime();
- orders.map(item => {
- if (timeNow - item.order_time < 900000) {
- item.status_bar.title = '等待支付';
- }else{
- item.status_bar.title = '支付超时';
- }
- item.time_pass = Math.ceil((timeNow - item.order_time)/1000);
- item.save()
- return item
- })
- res.send(orders);
- }catch(err){
- console.log('获取订单数据失败', err);
- res.send({
- status: 0,
- type: 'GET_ORDER_DATA_ERROR',
- message: '获取订单数据失败'
- })
- }
- }
- async getOrdersCount(req, res, next){
- const restaurant_id = req.query.restaurant_id;
- try{
- let filter = {};
- if (restaurant_id && Number(restaurant_id)) {
- filter = {restaurant_id}
- }
- const count = await OrderModel.find(filter).count();
- res.send({
- status: 1,
- count,
- })
- }catch(err){
- console.log('获取订单数量失败', err);
- res.send({
- status: 0,
- type: 'ERROR_TO_GET_COUNT',
- message: '获取订单数量失败'
- })
- }
- }
- }
- export default new Order()
|