getList($order_mode); } /** * 新增订单 */ public function add(array $order,$coupon_user_id) { $order['order_no'] = order_no(); $order['activity_price'] = $order['activity_price'] + $order['vip_price'];//卡券优惠+会员优惠 $order['total_price'] = $order['order_total_price']; $order['pay_price'] = $order['order_pay_price']; //实付金额 // 开启事务 Db::startTrans(); try { // 记录订单信息 $this->save($order); // 订单商品列表 $goodsList = []; foreach ($order['goods_list'] as $goods) { /* @var Goods $goods */ $goodsList[] = [ 'user_id' => $order['user_id'], 'applet_id' => $order['applet_id'], 'goods_id' => $goods['goods_id'], 'goods_name' => $goods['goods_name'], 'image_id' => isset($goods['goods_sku']['image']['url'])?$goods['goods_sku']['image_id']:$goods['image'][0]['image_id'], 'spec_type' => $goods['spec_type'], 'spec_sku_id' => $goods['goods_sku']['spec_sku_id'], 'goods_spec_id' => $goods['goods_sku']['goods_spec_id'], 'goods_attr' => $goods['goods_sku']['goods_attr'], 'content' => $goods['content'], 'goods_price' => $goods['goods_sku']['goods_price'], 'line_price' => $goods['goods_sku']['line_price'], 'total_num' => $goods['total_num'], 'total_price' => $goods['total_price'], ]; } //核销优惠券 if($coupon_user_id){ $coupon = CouponUser::get($coupon_user_id,['coupon']); //满赠券 if($coupon['type']['value'] == 30){ //3满赠 = { condition=满足数值条件 {10金额 20数量} num = 数值 type = 赠品类型 {10优惠券 20商品} gift = 礼物{ id=编号 name=名称 image=图片 } if($coupon['coupon']['values']['type'] == 10){ //优惠券 $quan[0] = Coupon::get($coupon['coupon']['values']['gift']['id']); $model = new CouponUser; $model->add($quan,$order['user_id']); } if($coupon['coupon']['values']['type'] == 20){ //商品 $goods = Goods::detail($coupon['coupon']['values']['gift']['id']); $goodsList[] = [ 'user_id' => $order['user_id'], 'applet_id' => $order['applet_id'], 'goods_id' => $goods['goods_id'], 'goods_name' => $goods['goods_name'], 'spec_type' => $goods['spec_type'], 'total_num' => 1, 'total_price' => 0.00, 'content' => $goods['content'], 'image_id' => $goods['image'][0]['image_id'], 'spec_sku_id' => $goods['spec'][0]['spec_sku_id'], 'goods_spec_id' => $goods['spec'][0]['goods_spec_id'], 'goods_attr' => '赠品', 'goods_price' => $goods['spec'][0]['goods_price'], 'line_price' => $goods['spec'][0]['line_price'], ]; } } $coupon->remove(); } // 保存订单商品信息 $this->goods()->saveAll($goodsList); //如果是外卖,记录收货地址 if($order['order_mode']==20){ $this->address()->save([ 'user_id' => $order['user_id'], 'applet_id' => $order['applet_id'], 'name' => $order['address']['name'], 'gender' => $order['address']['gender']['value'], 'phone' => $order['address']['phone'], 'location' => $order['address']['location'], 'province' => $order['address']['province'], 'city' => $order['address']['city'], 'district' => $order['address']['district'], 'detail' => $order['address']['detail'], ]); } Db::commit(); return true; } catch (\Exception $e) { Db::rollback(); } return false; } /** * 订单详情 */ public static function getUserOrderDetail($order_id, $user_id) { if (!$order = self::get(['order_id' => $order_id,'user_id' => $user_id], ['goods' => ['spec', 'goods','image'], 'address', 'shop', 'table','delivery'])) { $this->error = '订单不存在'; return false; } return $order; } /** * 用户支付 */ public function userPay($pay_mode,$mp) { // 发起微信支付 if($pay_mode==0){ $divide = false;//分账状态 //验证外卖订单是否要分账配送费 if($this->order_mode['value'] == 20){ $dv = new Delivery(); if($company = $dv->company()){ foreach ($company as $item){ if($item['name'] != 'sf' AND $item['config']['pay_mode'] == 1){ $divide = true; break; } } } } //获取小程序配置的支付参数 $wxpay = new WxPay(SettingModel::getItem('wxpay',self::$applet_id)); if($mp == 'h5'){ if(!$result = $wxpay->h5($this->order_no,$this->pay_price,'api/food.notify/order/appletid/'.self::$applet_id,'订单支付')){ $this->error = $wxpay->getError(); return false; } }else{ if(!$result = $wxpay->jsapi($this->order_no,$this->pay_price,$this->user['open_id'],'api/food.notify/order/appletid/'.self::$applet_id,'订单支付')){ $this->error = $wxpay->getError(); return false; } } $this->pay_mode = 0;//微信 $this->save(); return [ 'payment' => $result, 'order_id' => $this->order_id ]; } //支付宝小程序支付 if($pay_mode == 3){ $alipay = new AlipayPay(self::$applet_id); if($mp == 'h5'){ if(!$result = $alipay->tradeWapPay($this->order_no,$this->pay_price,'api/food.notify/alipayOrder/appletid/'.self::$applet_id,'h5/food/#/pages/order/detail?id='.$this->order_id,'订单支付')){ $this->error = $alipay->getError(); return false; } }else{ if(!$result = $alipay->tradeCreate($this->order_no,$this->pay_price,$this->user['open_id'],'api/food.notify/alipayOrder/appletid/'.self::$applet_id,'订单支付')){ $this->error = $alipay->getError(); return false; } } $this->pay_mode = 3;//支付宝 $this->save(); return [ 'payment' => $result, 'order_id' => $this->order_id ]; } //发起余额支付 if($pay_mode==1){ $user = User::get($this->user_id); if($user['money'] < $this->pay_price){ $this->error = '余额不足!'; return false; } $user->money = ['dec',$this->pay_price];//扣除余额 $user->pay = ['inc', $this->pay_price];//增加消费金额 $this->pay_mode = 1;// 余额支付 $this->pay_status = 20;// 支付状态 //开通会员才有积分 if($user['v']['value'] > 0){ $score = intval($this->pay_price); $user->score = ['inc', $score];//增加消费积分 $model = new Record; $model->save([ 'order_no' => $this['order_no'], 'money' => $score, 'user_id' => $this['user_id'], 'shop_id' => $this['shop_id'], 'applet_id' => $this['applet_id'], 'mode' => 40,//赠送 'type' => 90,//积分 'remark' => '订单支付' ]); } $user->save(); } //发起后付款 if($pay_mode==2){ $this->pay_status = 30;// 支付状态 } $this->pay_time = time();//付款时间 $this->save(); $other = Setting::getItem('other'); //是否启用库存 if($other['is_stock'] == 1){ $stock = true; }else{ $stock = false; } // 更新商品库存、销量 $goods = new Goods; $goods->updateStockSales($this->goods,$stock); Device::push($this->shop_id,'new');//新订单提醒 Device::print($this);//打印订单 sand_new_order_msg($this);//发送模板消息 - 使用公众号 //商家是否自动接单 if($this->shop['is_order']['value'] == 1){ $this->setShopStatus(); //外卖自动推送订单 if($this->order_mode['value']==20 AND $this->shop['is_delivery']['value'] == 1){ if(!$this->setDelivery($this->shop['delivery'])){ $this->error = '外卖自动派单失败!' . $this->getError(); return false; } } } return [ 'order_id' => $this->order_id ]; } /** * 退款订单 */ public function userRefund(array $data) { $order = Cache::get('refund_' . $this->order_id . '_' . $this->user_id . '_' . $this->shop_id); $order['refund_desc'] = $data['desc']; $goods = []; if($data['mode']==1){ //全单退 $order['refund_price'] = $order['pay_price']; for($n=0;$nsave([ 'refund_price' => $order['refund_price'],//退款金额 'refund_desc' => $order['refund_desc'],//退款理由 'order_status' => 40,//退款状态 'refund_time' => time(),//退款时间 ]); foreach ($goods as $value) { OrderGoods::where('order_goods_id',$value['order_goods_id'])->update($value); } Db::commit(); sand_refund_msg($order);//给管理和店长发送退款申请模板消息 Device::print($order,1);//打印退款商品订单 return true; } catch (\Exception $e) { Db::rollback(); } return false; } /** * 待支付订单详情 - 支付回调 */ public function payDetail($order_no) { return self::with(['goods','shop','table','address'])->where(['order_no' => $order_no, 'pay_status' => 10])->find(); } /** * 更新付款状态 - 支付回调 */ public function updatePayStatus($transaction_id) { if($this['pay_status']['value']==20){ //避免重复回调 return true; } $other = Setting::getItem('other',$this['applet_id']); //是否启用库存 if($other['is_stock'] == 1){ $stock = true; }else{ $stock = false; } // 更新商品库存、销量 $GoodsModel = new Goods; $GoodsModel->updateStockSales($this->goods,$stock); //更新用户信息 $user = User::get($this->user_id); $user->pay = ['inc', $this->pay_price];//增加消费金额 $type = 30;//支付方式默认为微信 $this->pay_mode['value'] == 3 && $type = 40;//支付宝 //开通会员才有积分 if($user['v']['value'] > 0){ $score = intval($this->pay_price); $user->score = ['inc', $score];//增加消费积分 $record = new Record; $record->save([ 'order_no' => $this['order_no'], 'money' => $score, 'user_id' => $this['user_id'], 'shop_id' => $this['shop_id'], 'applet_id' => $this['applet_id'], 'mode' => 40,//赠送 'type' => 90,//积分 'remark' => '订单支付' ]); } $user->save(); // 更新订单状态 $this->save([ 'pay_status' => 20, 'pay_time' => time(), 'transaction_id' => $transaction_id, ]); //发送新订单提醒,管理员,店长 sand_new_order_msg($this); Device::print($this);//打印订单 Device::push($this->shop_id,'pay',$this->pay_price);//收款提醒 //商家是否自动接单 if($this['shop']['is_order']['value'] == 1){ $this->setShopStatus(); //外卖自动推送订单 if($this['order_mode']['value']==20 AND $this['shop']['is_delivery']['value'] == 1){ $this->setDelivery($this['shop']['delivery']); } } return true; } /** * 待退款订单详情 - 微信退款回调 */ public function refundDetail($order_no) { return self::get(['order_no' => $order_no, 'order_status' => 40, 'refund_status' => 10], ['goods']); } /** * 更新退款款状态 - 微信退款回调 */ public function updateRefundStatus($refund_id) { if(!empty($this->refund_id)){ //避免重复回调 return true; } $other = Setting::getItem('other',$this['applet_id']); //是否启用库存 if($other['is_stock'] == 1){ $stock = true; }else{ $stock = false; } //更新商品库存、销量 $GoodsModel = new Goods; $GoodsModel->updateStockSales($this['goods'],$stock,false); //更新用户信息 $user = User::get($this->user_id); $user->pay = ['dec', $this->refund_price];//扣减消费金额 $type = 30;//支付方式默认为微信 $this->pay_mode['value'] == 3 && $type = 40;//支付宝 //开通会员才有积分 if($user['v']['value'] > 0){ $score = intval($this->refund_price); $user->score = ['dec', $score];//扣减积分 $record = new Record; $record->save([ 'order_no' => $this['order_no'], 'money' => $score, 'user_id' => $this['user_id'], 'shop_id' => $this['shop_id'], 'applet_id' => $this['applet_id'], 'mode' => 50,//扣减 'type' => 90,//积分 'remark' => '订单退款' ]); } $user->save(); // 更新订单状态 $this->save([ 'refund_status' => 20, 'refund_time' => time(), 'refund_id' => $refund_id, ]); return true; } /** * 更新第三方配送状态 */ public function updateDeliveryStatus($data,$mode) { $dev['delivery_time'] = time(); if($mode == 'dada'){ //待接单=1,待取货=2,配送中=3,已完成=4,已取消=5, 指派单=8,妥投异常之物品返回中=9, 妥投异常之物品返回完成=10, 骑士到店=100,创建达达运单失败=1000 switch ((string)$data['order_status']) { case '2': //已接单 - 骑手正赶往商家 $dev = [ 'delivery_status' => 20, 'linkman' => $data['dm_name'], 'phone' => $data['dm_mobile'] ]; break; case '100': //已到店 - 骑手已到店 $dev = [ 'delivery_status' => 30 ]; break; case '3': //已取件 - 骑手开始配送 $dev = [ 'delivery_status' => 40 ]; break; case '4';//到达目的地 - 骑手已送达 $dev = [ 'delivery_status' => 50, 'status' => 30 ]; $this->save([ 'delivery_status' => 30, 'delivery_time' => time() ]); break; case '5': //订单被取消 $dev = [ 'delivery_status' => 10, 'shop_status' => 20 ]; $this->save($dev); OrderDelivery::where('order_id',$this->order_id)->delete(); return true; break; default: return true; } } if($mode == 'sf'){ switch ((string)$data['order_status']) { case '10': //已接单 - 骑手正赶往商家 $dev = [ 'delivery_status' => 20, 'linkman' => $data['operator_name'], 'phone' => $data['operator_phone'] ]; break; case '12': //到店 - 骑手已到店 $dev = [ 'delivery_status' => 30 ]; break; case '15': //已取件 - 骑手开始配送 $dev = [ 'delivery_status' => 40 ]; break; case '17';//到达目的地 - 骑手已送达 $dev = [ 'delivery_status' => 50, 'status' => 30 ]; $this->save([ 'delivery_status' => 30, 'delivery_time' => time() ]); break; case '22': //订单被取消 - 配送员撤单 $dev = [ 'delivery_status' => 10, 'shop_status' => 20 ]; $this->save($dev); OrderDelivery::where('order_id',$this->order_id)->delete(); return true; break; case '2': //订单被取消 - 顺丰原因 $dev = [ 'delivery_status' => 10, 'shop_status' => 20 ]; $this->save($dev); OrderDelivery::where('order_id',$this->order_id)->delete(); return true; break; default: return true; } } if($mode == 'uu'){ //当前状态1下单成功 3跑男抢单 4已到达 5已取件 6到达目的地 10收件人已收货 -1订单取消 switch ((string)$data['state']) { case '3': //已接单 - 骑手正赶往商家 $dev = [ 'delivery_status' => 20, 'linkman' => $data['driver_name'], 'phone' => $data['driver_mobile'] ]; break; case '4': //已到店 - 骑手已到店 $dev = [ 'delivery_status' => 30 ]; break; case '5': //已取件 - 骑手开始配送 $dev = [ 'delivery_status' => 40 ]; break; case '6';//到达目的地 - 骑手已送达 $dev = [ 'delivery_status' => 50, 'status' => 30 ]; $this->save([ 'delivery_status' => 30, 'delivery_time' => time() ]); break; case '-1': //订单被取消 $dev = [ 'delivery_status' => 10, 'shop_status' => 20 ]; $this->save($dev); OrderDelivery::where('order_id',$this->order_id)->delete(); return true; break; default: return true; } } if($mode == 'make'){ //loading = 待付款', cancel='订单已取消', payed='待接单',wait_to_shop='待到店', accepted='待取件', geted='待收件',gotoed= '待评价', completed='订单已完成'); switch ($data['status']) { case 'accepted': //已接单 - 骑手正赶往商家 $dev = [ 'delivery_status' => 20, 'linkman' => $data['rider_name'], 'phone' => $data['rider_mobile'] ]; break; case 'wait_to_shop': //已到店 - 骑手已到店 $dev = [ 'delivery_status' => 30 ]; break; case 'geted': //已取件 - 骑手开始配送 $dev = [ 'delivery_status' => 40 ]; break; case 'gotoed';//到达目的地 - 骑手已送达 $dev = [ 'delivery_status' => 50, 'status' => 30 ]; $this->save([ 'delivery_status' => 30, 'delivery_time' => time() ]); break; case 'payed': //订单被取消 $dev = [ 'delivery_status' => 10, 'shop_status' => 20 ]; $this->save($dev); OrderDelivery::where('order_id',$this->order_id)->delete(); return true; break; default: return true; } } if($mode == 'shansong'){ switch ($data['status']) { case '30': //已接单 if($data['subStatus']==1){ $dev = [ 'delivery_status' => 20,//待取货 'linkman' => $data['rider_name'], 'phone' => $data['rider_mobile'] ]; }else{ $dev = [ 'delivery_status' => 30//已到店 ]; } break; case '40': //已取件 if($data['subStatus']==1){ $dev = [ 'delivery_status' => 40//骑手开始配送 ]; }else{ return true; } break; case '50';//到达目的地 - 骑手已送达 $dev = [ 'delivery_status' => 50, 'status' => 30 ]; $this->save([ 'delivery_status' => 30, 'delivery_time' => time() ]); break; case '60': //订单被取消 $dev = [ 'delivery_status' => 10, 'shop_status' => 20 ]; $this->save($dev); OrderDelivery::where('order_id',$this->order_id)->delete(); return true; break; default: return true; } } if($dev['delivery_status'] == 20){ //骑手接单提醒 $this->sendMessage('horseman',$this->order_id); } OrderDelivery::where('order_id',$this->order_id)->update($dev); return true; } }