| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- <?php
- namespace App\Servers;
- use App\Models\Config;
- use App\Models\ErrorRecord;
- use App\Models\Goods;
- use App\Models\Main\MainShopOrder;
- use App\Models\Main\MainShopSet;
- use App\Models\Member;
- use App\Models\Order;
- use App\Models\OrderItem;
- use Carbon\Carbon;
- use Illuminate\Support\Facades\DB;
- /**
- * 外卖订单管理
- */
- class OrderServer
- {
- static private $server = null;
- private function __construct()
- {
- }
- /**
- * 创建对象
- * @return OrderServer
- */
- static function creatServer()
- {
- if (empty(self::$server)) self::$server = new OrderServer();
- return self::$server;
- }
- function createOrder($m_id,$shop_id,$order_type,$table_number,$diner_number,$note,$goods_data)
- {
- DB::beginTransaction();
- try {
- //手续费比例
- $service_num = CommonServer::creatServer()->getConfigValue('service_num');
- if (empty($service_num)) {
- $service_num = 0.6;
- }
- //商品金额
- $goods_money = $goods_data['total_goods_money'];//商品总价
- $goods_number = $goods_data['total_num'];//商品总数
- $pack_price = $goods_data['pack_price'];//打包费
- if ($order_type == 1){//堂食不算打包费
- $order_money = $goods_money;
- }else{//打包
- $order_money = bcadd($goods_money, $pack_price, 2);//订单金额 =(商品金额 + 打包费)
- }
- //预留优惠卷金额
- $coupon_money = 0;
- //用户支付金额=订单金额 - 优惠卷金额
- $pay_money = bcsub($order_money,$coupon_money,2);
- $service_money = bcdiv(bcmul($pay_money,$service_num,2),100,2);//交易支付手续费
- //商家到账金额 = 订单金额-交易支付手续费
- $shop_money = bcsub($order_money,$service_money,2);
- //信息入库
- $order_info = [
- 'order_sn' => CommonServer::creatServer()->createOrderNo('WDO'),
- 'order_type' => $order_type,
- 'm_id' => $m_id,
- 'shop_id' => $shop_id,
- 'order_money' => $order_money,
- 'pay_money' => $pay_money,
- 'goods_number' => $goods_number,
- 'table_number' => $table_number,
- 'diner_number' => $diner_number,
- 'note' => $note,
- 'service_num' => $service_num,
- 'service_money' => $service_money,
- 'pack_price' => $pack_price,
- 'shop_money' => $shop_money,
- ];
- //主表信息入库
- $order = Order::create($order_info);
- $order_id = $order->{'id'};
- if (empty($order_id)){
- DB::rollBack();
- return ['code' => 0, 'msg' => '订单创建失败'];
- }
- //商品信息入库
- $goods_total_money = 0;//商品总金额
- foreach ($goods_data['goods_list'] as $goods){
- if ($shop_id != $goods['shop_id']){
- DB::rollBack();
- return ['code' => 0, 'msg' => '商品与商家不符'];
- }
- $goods_info = [
- 'm_id' => $m_id,
- 'shop_id' => $shop_id,
- 'order_id' => $order_id,
- 'goods_id' => $goods['goods_id'],
- 'goods_spec_list' => empty($goods['spec_list']) ? '' : $goods['spec_list'],
- 'goods_name' => $goods['goods_name'],
- 'goods_img' => $goods['goods_image'],
- 'goods_attr' => trim($goods['goods_attr'],','),
- 'goods_price' => $goods['price'],
- 'goods_number' => $goods['goods_number'],
- 'goods_money' => $goods['goods_money'],
- ];
- //总商品金额
- $goods_total_money = bcadd($goods_total_money,$goods_info['goods_money'],2);
- OrderItem::create($goods_info);
- }
- //删除购物车
- $shopping = ShoppingCartServer::creatServer()->delShopping($m_id,$shop_id);
- if ($shopping['code'] == 0){
- DB::rollBack();
- return ['code' => 0, 'msg' => '下单失败'];
- }
- DB::commit();
- return ['code' => 1, 'msg' => '成功', 'data' => ['order_id'=>$order_id]];
- }catch (\Exception $e){
- DB::rollBack();
- return ['code'=>0,'msg'=>'下单出错'.$e->getMessage()];
- }
- }
- /**
- * 支付回调
- * @param $pay_type
- * @param $order_sn
- * @param $pay_code
- * @param $pay_money
- * @param $notify_info
- * @return bool
- */
- function NotifyPay($pay_type,$order_sn, $pay_code, $pay_money, $notify_info)
- {
- $order_info = Order::where('order_sn', $order_sn)->where('order_status', 1)->first();
- if (empty($order_info)) {
- ErrorRecord::create(['msg' => $order_sn . '订单支付状态错误', 'data' => serialize($notify_info)]);
- return false;
- }
- // $is_test = env('TEST_SERVE', false);
- $is_test=config('weixin.test_serve',false);
- if ($order_info->{'pay_money'} != $pay_money && !$is_test) {
- Order::where('id', $order_info->{'id'})->update(['pay_code' => $pay_code]);
- ErrorRecord::create(['msg' => $order_info->{'order_sn'} . '支付金额不匹配', 'data' => serialize($notify_info)]);
- return false;
- }
- $date = date('Y-m-d H:i:s');
- $shop_id = $order_info->{'shop_id'};
- //店铺订单序号生成
- $key = $shop_id . '_number';
- $total_count = RedisDataServer::creatServer()->getData($key);
- if (empty($total_count)){
- $total_count = '1';
- // 获取当前时间戳
- $now = time();
- // 获取今天结束的时间戳
- $endOfDay = strtotime("tomorrow") - 1;
- // 计算剩余时间(秒)
- $secondsLeft = bcsub($endOfDay,$now,1);
- RedisDataServer::creatServer()->setData($key,$total_count,'str',$secondsLeft);
- }
- RedisDataServer::creatServer()->setIncr($key);
- //订单更新信息
- $update['pay_type'] = $pay_type;
- $update['pay_time'] = $date;
- $update['pay_code'] = $pay_code;
- $update['number'] = $total_count;
- $update['order_status'] = 2;
- //更新订单信息
- Order::where('id', $order_info->{'id'})->update($update);
- // 投递打印消息
- JobServer::creatServer()->shopOrderPrintJob($order_info->{'id'},$order_info->{'shop_id'});
- return true;
- }
- function syncOrder($orderId)
- {
- //todo 需要加条件,必须为支付成功的
- $order=Order::where('id', $orderId)->first();
- if (empty($order)){
- return false;
- }
- $sMid=Member::where('id',$order->{'m_id'})->value('main_id');
- //获取店铺配置
- $shop_set = MainShopSet::where('shop_id', $order->{'shop_id'})->select(['id', 'shop_id', 'discount', 'province_num', 'city_num', 'area_num', 'sales_num', 'shop_num', 'member_num', 'purchases_num', 'member_cash', 'service_num','is_bean'])->first();
- if (empty($shop_set)){
- $discount = 0;
- }else{
- $discount = $shop_set->{'discount'};
- }
- $pay_info = [
- 'shop_id' => $order->{'shop_id'},
- 'm_id' => $sMid,
- 'rs_sn' => $order->{'order_sn'},
- 'pay_sn' => $order->{'pay_code'},
- 'pay_type' => $order->{'pay_type'},
- 'pay_money' => $order->{'pay_money'},
- 'status' => 2,
- 'discount' => $discount,
- 'is_clearing' => 0,
- 'pay_code_source'=>1,
- 'is_bank'=>0,
- 'food_id'=>$order->{'id'},
- ];
- return MainShopOrder::create($pay_info);
- }
- }
|