diff --git a/addon/futures/api/controller/Ordercreate.php b/addon/futures/api/controller/Ordercreate.php new file mode 100644 index 00000000..6ae591a1 --- /dev/null +++ b/addon/futures/api/controller/Ordercreate.php @@ -0,0 +1,141 @@ +checkToken(); + if ($token[ 'code' ] < 0) return $this->response($token); + $order_create = new OrderCreateModel(); + $data = [ + 'futures_id' => $this->params[ 'futures_id' ] ?? 0, + 'member_id' => $this->member_id, + 'site_id' => $this->site_id,//站点id + 'order_from' => $this->params[ 'app_type' ], + 'order_from_name' => $this->params[ 'app_type_name' ], + 'is_balance' => $this->params[ 'is_balance' ] ?? 0,//是否使用余额 + 'buyer_message' => $this->params[ 'buyer_message' ] ?? '', + 'delivery' => isset($this->params[ 'delivery' ]) && !empty($this->params[ 'delivery' ]) ? json_decode($this->params[ 'delivery' ], true) : [], + 'coupon' => isset($this->params[ 'coupon' ]) && !empty($this->params[ 'coupon' ]) ? json_decode($this->params[ 'coupon' ], true) : [], + 'member_address' => isset($this->params[ 'member_address' ]) && !empty($this->params[ 'member_address' ]) ? json_decode($this->params[ 'member_address' ], true) : [], + + 'latitude' => $this->params[ 'latitude' ] ?? '', + 'longitude' => $this->params[ 'longitude' ] ?? '', + + 'is_invoice' => $this->params[ 'is_invoice' ] ?? 0, + 'invoice_type' => $this->params[ 'invoice_type' ] ?? 0, + 'invoice_title' => $this->params[ 'invoice_title' ] ?? '', + 'taxpayer_number' => $this->params[ 'taxpayer_number' ] ?? '', + 'invoice_content' => $this->params[ 'invoice_content' ] ?? '', + 'invoice_full_address' => $this->params[ 'invoice_full_address' ] ?? '', + 'is_tax_invoice' => $this->params[ 'is_tax_invoice' ] ?? 0, + 'invoice_email' => $this->params[ 'invoice_email' ] ?? '', + 'invoice_title_type' => $this->params[ 'invoice_title_type' ] ?? 0, + 'buyer_ask_delivery_time' => $this->params[ 'buyer_ask_delivery_time' ] ?? '', + 'form_data' => isset($this->params['form_data']) && !empty($this->params['form_data']) ? json_decode($this->params['form_data'], true) : [], + 'goods_sku_list' => !empty($this->params['goods_sku_list']) ? json_decode($this->params['goods_sku_list'], true) : [], + 'sku_id' => isset($this->params['sku_id']) ? $this->params['sku_id'] : '', + ]; + if ($data[ 'futures_id' ] == 0) { + return $this->response($this->error('', '缺少必填参数商品数据')); + } + $res = $order_create->create($data); + return $this->response($res); + } + + /** + * 计算信息 + */ + public function calculate() + { + $token = $this->checkToken(); + if ($token[ 'code' ] < 0) return $this->response($token); + $order_create = new OrderCreateModel(); + $data = [ + 'futures_id' => $this->params[ 'futures_id' ] ?? 0, + 'member_id' => $this->member_id, + 'site_id' => $this->site_id,//站点id + 'order_from' => $this->params[ 'app_type' ], + 'order_from_name' => $this->params[ 'app_type_name' ], + 'is_balance' => $this->params[ 'is_balance' ] ?? 0,//是否使用余额 + 'delivery' => isset($this->params[ 'delivery' ]) && !empty($this->params[ 'delivery' ]) ? json_decode($this->params[ 'delivery' ], true) : [], + 'coupon' => isset($this->params[ 'coupon' ]) && !empty($this->params[ 'coupon' ]) ? json_decode($this->params[ 'coupon' ], true) : [], + 'member_address' => isset($this->params[ 'member_address' ]) && !empty($this->params[ 'member_address' ]) ? json_decode($this->params[ 'member_address' ], true) : [], + + 'latitude' => $this->params[ 'latitude' ] ?? '', + 'longitude' => $this->params[ 'longitude' ] ?? '', + + 'is_invoice' => $this->params[ 'is_invoice' ] ?? 0, + 'invoice_type' => $this->params[ 'invoice_type' ] ?? 0, + 'invoice_title' => $this->params[ 'invoice_title' ] ?? '', + 'taxpayer_number' => $this->params[ 'taxpayer_number' ] ?? '', + 'invoice_content' => $this->params[ 'invoice_content' ] ?? '', + 'invoice_full_address' => $this->params[ 'invoice_full_address' ] ?? '', + 'is_tax_invoice' => $this->params[ 'is_tax_invoice' ] ?? 0, + 'invoice_email' => $this->params[ 'invoice_email' ] ?? '', + 'invoice_title_type' => $this->params[ 'invoice_title_type' ] ?? 0, + 'buyer_ask_delivery_time' => $this->params[ 'buyer_ask_delivery_time' ] ?? '', + 'goods_sku_list' => !empty($this->params['goods_sku_list']) ? json_decode($this->params['goods_sku_list'], true) : [], + 'sku_id' => isset($this->params['sku_id']) ? $this->params['sku_id'] : '', + ]; + if ($data[ 'futures_id' ] == 0) { + return $this->response($this->error('', '缺少必填参数商品数据')); + } + $res = $order_create->calculate($data); + return $this->response($res); + } + + /** + * 待支付订单 数据初始化 + * @return string + */ + public function payment() + { + $token = $this->checkToken(); + if ($token[ 'code' ] < 0) return $this->response($token); + $order_create = new OrderCreateModel(); + $data = [ + 'futures_id' => $this->params[ 'futures_id' ] ?? 0, + 'member_id' => $this->member_id, + 'site_id' => $this->site_id,//站点id + 'order_from' => $this->params[ 'app_type' ], + 'is_balance' => $this->params[ 'is_balance' ] ?? 0,//是否使用余额 + 'order_from_name' => $this->params[ 'app_type_name' ], + + 'latitude' => $this->params[ 'latitude' ] ?? '', + 'longitude' => $this->params[ 'longitude' ] ?? '', + 'default_store_id' => $this->params[ 'default_store_id' ] ?? 0, + 'goods_sku_list' => !empty($this->params['goods_sku_list']) ? json_decode($this->params['goods_sku_list'], true) : [], + 'sku_id' => isset($this->params['sku_id']) ? $this->params['sku_id'] : '', + ]; + if ($data[ 'futures_id' ] == 0) { + return $this->response($this->error('', '缺少必填参数商品数据')); + } + + $res = $order_create->orderPayment($data); + return $this->response($res); + } + +} \ No newline at end of file diff --git a/addon/futures/config/event.php b/addon/futures/config/event.php index 383f7bad..55b55c2b 100644 --- a/addon/futures/config/event.php +++ b/addon/futures/config/event.php @@ -14,6 +14,12 @@ return [ 'MemberRegister' => [ 'addon\futures\event\MemberRegister', ], + 'OrderPay' => [ + 'addon\futures\event\OrderPay', + ], + 'OrderClose' => [ + 'addon\futures\event\OrderClose', + ] diff --git a/addon/futures/event/OrderClose.php b/addon/futures/event/OrderClose.php new file mode 100644 index 00000000..c6bf5d91 --- /dev/null +++ b/addon/futures/event/OrderClose.php @@ -0,0 +1,29 @@ +orderClose($param['promotion_id']); + return $result; + }else{ + return success(); + } + } +} \ No newline at end of file diff --git a/addon/futures/event/OrderPay.php b/addon/futures/event/OrderPay.php new file mode 100644 index 00000000..292cf0c4 --- /dev/null +++ b/addon/futures/event/OrderPay.php @@ -0,0 +1,29 @@ +orderComplete($param['promotion_id']); + return $result; + }else{ + return success(); + } + } +} \ No newline at end of file diff --git a/addon/futures/model/Futures.php b/addon/futures/model/Futures.php index df0b2e3b..787f302a 100644 --- a/addon/futures/model/Futures.php +++ b/addon/futures/model/Futures.php @@ -65,8 +65,8 @@ class Futures extends BaseModel{ */ public function orderCreate($id, $order_id, $member_id){ $date = model('futures')->getInfo([['id', '=', $id]]); - if(empty($date) || $date['status'] !== 2 || $date['status'] !== 7){ - return $this->error('','下单失败'); + if(empty($date) || ($date['status'] !== 2 && $date['status'] !== 7)){ + return $this->error($date,'下单失败'); } if(!Cache::store('redis_concurrent')->delete('addon_futures_'.$id)){ return $this->error('','下单失败'); @@ -77,6 +77,7 @@ class Futures extends BaseModel{ 'order_id' => $order_id, 'member_id' => $member_id ], [['id', '=', $id]]); + Cache::store('redis_concurrent')->set('addon_futures_pay_'.$id,'1'); return $this->success(); } @@ -85,13 +86,22 @@ class Futures extends BaseModel{ * @return array */ public function orderComplete($id){ + $date = model('futures')->getInfo([['id', '=', $id]]); + if(empty($date) || $date['status'] !== 6){ + return $this->error($date,'完成失败'); + } + if(!Cache::store('redis_concurrent')->delete('addon_futures_pay_'.$id)){ + return $this->error('','完成失败'); + } $date = model('futures')->getInfo([['id', '=', $id]]); model('futures')->update([ 'status' => 3, + 'sell_time' => time() ], [['id', '=', $id]]); - model('')->add([ + model('futures')->add([ 'site_id' => $date['site_id'], 'seller_uid' => $date['member_id'], + 'old_futures_id' => $id, 'goods_id' => (int)$date['goods_id'], 'total' => (int)$date['total'], 'unit_price' => $date['price'], @@ -105,8 +115,15 @@ class Futures extends BaseModel{ * @return array */ public function orderClose($id){ + $date = model('futures')->getInfo([['id', '=', $id]]); + if(empty($date) || $date['status'] !== 6){ + return $this->error($date,'取消失败'); + } + if(!Cache::store('redis_concurrent')->delete('addon_futures_pay_'.$id)){ + return $this->error('','取消失败'); + } model('futures')->update([ - 'status' => 1, + 'status' => 7, ], [['id', '=', $id]]); Cache::store('redis_concurrent')->set('addon_futures_'.$id,'1'); return $this->success(); diff --git a/addon/futures/model/order/FuturesOrderCreate.php b/addon/futures/model/order/FuturesOrderCreate.php new file mode 100644 index 00000000..493576b9 --- /dev/null +++ b/addon/futures/model/order/FuturesOrderCreate.php @@ -0,0 +1,691 @@ +calculate($data); + if ($calculate_data[ 'code' ] < 0) + return $calculate_data; + + $calculate_data = $calculate_data['data']; + if ($this->error > 0) { + return $this->error([ 'error_code' => $this->error ], $this->error_msg); + } + + if (!empty($calculate_data[ 'invoice_type' ])) { + if ($calculate_data[ 'invoice_type' ] == 1 && $calculate_data[ 'invoice_full_address' ] == '') { + //物流,同城 + if ($calculate_data[ 'shop_goods_list' ][ 'delivery' ][ 'delivery_type' ] == 'express' || $calculate_data[ 'shop_goods_list' ][ 'delivery' ][ 'delivery_type' ] == 'local') { + $calculate_data[ 'invoice_full_address' ] = $calculate_data[ 'member_address' ][ 'full_address' ] . $calculate_data[ 'member_address' ][ 'address' ]; + $calculate_data[ 'shop_goods_list' ][ 'invoice_full_address' ] = $calculate_data[ 'member_address' ][ 'full_address' ] . $calculate_data[ 'member_address' ][ 'address' ]; + } + //门店 + if ($calculate_data[ 'shop_goods_list' ][ 'delivery' ][ 'delivery_type' ] == 'store') { + $delivery_store_info = json_decode($calculate_data[ 'shop_goods_list' ][ 'delivery_store_info' ], true); + $calculate_data[ 'invoice_full_address' ] = $delivery_store_info[ 'full_address' ]; + $calculate_data[ 'shop_goods_list' ][ 'invoice_full_address' ] = $delivery_store_info[ 'full_address' ]; + } + } + } + + $pay = new Pay(); + $out_trade_no = $pay->createOutTradeNo($data[ 'member_id' ]); + model('order')->startTrans(); + //循环生成多个订单 + try { + $pay_money = 0; + $goods_stock_model = new GoodsStock(); + $shop_goods_list = $calculate_data[ 'shop_goods_list' ]; + $item_delivery = $shop_goods_list[ 'delivery' ] ?? []; + $delivery_type = $item_delivery[ 'delivery_type' ] ?? ''; + + $site_id = $data['site_id']; + $member_id = $data['member_id']; + $express_type_list = (new \app\model\express\Config())->getExpressTypeList($site_id); + $delivery_type_name = $express_type_list[$delivery_type] ?? ''; + //订单主表 + $order_type = $this->orderType($shop_goods_list, $calculate_data); + $order_no = $this->createOrderNo($shop_goods_list[ 'site_id' ], $data[ 'member_id' ]); + $member_address = $calculate_data[ 'member_address' ]; + $data_order = [ + 'order_no' => $order_no, + 'site_id' => $site_id, + 'site_name' => $shop_goods_list[ 'site_name' ], + 'order_from' => $data[ 'order_from' ], + 'order_from_name' => $data[ 'order_from_name' ], + 'order_type' => $order_type[ 'order_type_id' ], + 'order_type_name' => $order_type[ 'order_type_name' ], + 'order_status_name' => $order_type[ 'order_status' ][ 'name' ], + 'order_status_action' => json_encode($order_type[ 'order_status' ], JSON_UNESCAPED_UNICODE), + 'out_trade_no' => $out_trade_no, + 'member_id' => $member_id, + 'name' => $member_address[ 'name' ] ?? '', + 'mobile' => $member_address[ 'mobile' ] ?? '', + 'telephone' => $member_address[ 'telephone' ] ?? '', + 'province_id' => $member_address[ 'province_id' ] ?? '', + 'city_id' => $member_address[ 'city_id' ] ?? '', + 'district_id' => $member_address[ 'district_id' ] ?? '', + 'community_id' => $member_address[ 'community_id' ] ?? '', + 'address' => $member_address[ 'address' ] ?? '', + 'full_address' => $member_address[ 'full_address' ] ?? '', + 'longitude' => $member_address[ 'longitude' ] ?? '', + 'latitude' => $member_address[ 'latitude' ] ?? '', + 'buyer_ip' => request()->ip(), + 'goods_money' => $shop_goods_list[ 'goods_money' ], + 'delivery_money' => $shop_goods_list[ 'delivery_money' ], + 'coupon_id' => $shop_goods_list[ 'coupon_id' ] ?? 0, + 'coupon_money' => $shop_goods_list[ 'coupon_money' ] ?? 0, + 'adjust_money' => $shop_goods_list[ 'adjust_money' ], + 'invoice_money' => $shop_goods_list[ 'invoice_money' ], + 'promotion_money' => $shop_goods_list[ 'promotion_money' ], + 'order_money' => $shop_goods_list[ 'order_money' ], + 'balance_money' => $shop_goods_list[ 'balance_money' ], + 'pay_money' => $shop_goods_list[ 'pay_money' ], + 'create_time' => time(), + 'is_enable_refund' => 0, + 'order_name' => $shop_goods_list[ 'order_name' ], + 'goods_num' => $shop_goods_list[ 'goods_num' ], + 'delivery_type' => $delivery_type, + 'delivery_type_name' => $delivery_type_name, + 'delivery_store_id' => $shop_goods_list[ 'delivery_store_id' ] ?? 0, + 'delivery_store_name' => $shop_goods_list[ 'delivery_store_name' ] ?? '', + 'delivery_store_info' => $shop_goods_list[ 'delivery_store_info' ] ?? '', + 'buyer_message' => $data[ 'buyer_message' ], + 'promotion_type' => 'futures', + 'promotion_type_name' => '秒杀订单', + 'promotion_status_name' => '', + 'invoice_delivery_money' => $shop_goods_list[ 'invoice_delivery_money' ] ?? 0, + 'taxpayer_number' => $shop_goods_list[ 'taxpayer_number' ] ?? '', + 'invoice_rate' => $shop_goods_list[ 'invoice_rate' ] ?? 0, + 'invoice_content' => $shop_goods_list[ 'invoice_content' ] ?? '', + 'invoice_full_address' => $shop_goods_list[ 'invoice_full_address' ] ?? '', + 'is_invoice' => $shop_goods_list[ 'is_invoice' ] ?? 0, + 'invoice_type' => $shop_goods_list[ 'invoice_type' ] ?? 0, + 'invoice_title' => $shop_goods_list[ 'invoice_title' ] ?? '', + 'is_tax_invoice' => $shop_goods_list[ 'is_tax_invoice' ] ?? '', + 'invoice_email' => $shop_goods_list[ 'invoice_email' ] ?? '', + 'invoice_title_type' => $shop_goods_list[ 'invoice_title_type' ] ?? 0, + 'buyer_ask_delivery_time' => $shop_goods_list[ 'buyer_ask_delivery_time' ] ?? '', + 'store_id' => $shop_goods_list['store_id'], + 'promotion_id' => $data[ 'futures_id' ] + ]; + + $order_id = model('order')->add($data_order); + $pay_money += $shop_goods_list[ 'pay_money' ]; + + //订单项目表 + $card_use_params = []; + foreach ($shop_goods_list[ 'goods_list' ] as $k_order_goods => $order_goods) { + $data_order_goods = array ( + 'order_id' => $order_id, + 'site_id' => $site_id, + 'order_no' => $order_no, + 'member_id' => $member_id, + 'sku_id' => $order_goods[ 'sku_id' ], + 'sku_name' => $order_goods[ 'sku_name' ], + 'sku_image' => $order_goods[ 'sku_image' ], + 'sku_no' => $order_goods[ 'sku_no' ], + 'is_virtual' => $order_goods[ 'is_virtual' ], + 'goods_class' => $order_goods[ 'goods_class' ], + 'goods_class_name' => $order_goods[ 'goods_class_name' ], + 'price' => $order_goods[ 'price' ], + 'cost_price' => $order_goods[ 'cost_price' ], + 'num' => $order_goods[ 'num' ], + 'goods_money' => $order_goods[ 'goods_money' ], + 'cost_money' => $order_goods[ 'cost_price' ] * $order_goods[ 'num' ], + 'goods_id' => $order_goods[ 'goods_id' ], + 'delivery_status' => 0, + 'delivery_status_name' => '未发货', + 'real_goods_money' => $order_goods[ 'real_goods_money' ], + 'coupon_money' => $order_goods[ 'coupon_money' ] ?? 0, + 'promotion_money' => $order_goods[ 'promotion_money' ], + 'goods_name' => $order_goods[ 'goods_name' ], + 'sku_spec_format' => $order_goods[ 'sku_spec_format' ], + 'store_id' => $shop_goods_list['store_id'] + ); + $order_goods_id = model('order_goods')->add($data_order_goods); + $calculate_data[ 'shop_goods_list' ][ 'goods_list' ][ $k_order_goods ][ 'order_goods_id' ] = $order_goods_id; + + //库存变化 + // $stock_result = $this->skuDecStock($order_goods); + // if ($stock_result[ 'code' ] != 0) { + // model('order')->rollback(); + // return $stock_result; + // } + + // $card_use_params[] = [ + // 'item_id' => $order_goods['item_id'], + // 'num' => $order_goods[ 'num' ], + // 'type' => 'order', + // 'relation_id' => $order_goods_id, + // 'store_id' => $shop_goods_list['store_id'] + // ]; + } + + // $member_card = new MemberCard(); + // $use_result = $member_card->cardUse($card_use_params); + $futures_model = new Futures; + $futures_info = $futures_model->orderCreate($data['futures_id'],$order_id,$data['member_id']); + if ($futures_info[ 'code' ] != 0) { + model('order')->rollback(); + return $futures_info; + } + + $result_list = event('OrderCreate', [ 'order_id' => $order_id, 'site_id' => $shop_goods_list[ 'site_id' ],'create_data' => $calculate_data ]); + if (!empty($result_list)) { + foreach ($result_list as $k => $v) { + if (!empty($v) && $v[ 'code' ] < 0) { + model('order')->rollback(); + return $v; + } + } + } + //生成整体支付单据 + $pay->addPay($shop_goods_list[ 'site_id' ], $out_trade_no, $this->pay_type, $this->order_name, $this->order_name, $this->pay_money, '', 'OrderPayNotify', '/pages/order/detail?order_id=' . $order_id); + $this->addOrderCronClose($order_id, $shop_goods_list[ 'site_id' ]);//增加关闭订单自动事件 + model('order')->commit(); + return $this->success($out_trade_no); + + } catch (\Exception $e) { + model('order')->rollback(); + return $this->error('', $e->getMessage() . $e->getFile() . $e->getLine()); + } + + } + + /** + * 订单计算 + * @param array $data + */ + public function calculate($data) + { + $data = $this->initMemberAddress($data); + $data = $this->initMemberAccount($data);//初始化会员账户 + //余额付款 + if ($data[ 'is_balance' ] > 0) { + $this->member_balance_money = $data[ 'member_account' ][ 'balance_total' ] ?? 0; + } + $member_id = $data['member_id']; + $futures_id = $data['futures_id']; + $futures_model = new Futures(); + $site_id = $data['site_id']; + $condition = array( + ['site_id', '=', $site_id], + ['id', '=', $futures_id], + // ['member_id', '=', $member_id], + ['status', 'in', [2,7] ], + ['release_time', '>', strtotime('-3 day') ], + ); + $futures_info = model('futures')->getInfo($condition) ?? []; + if(empty($futures_info)) + return $this->error([], '该秒杀不存在!'); + + $futures_id = $futures_info['id']; + $data['futures_id'] = $futures_id; + $data['futures_info'] = $futures_info; + $data['sku_id'] = $futures_info['goods_id']; + $data['num'] = $futures_info['total']; + //商品列表信息 + $shop_goods_list = $this->getOrderGoodsCalculate($data); + $data[ 'shop_goods_list' ] = $this->shopOrderCalculate($shop_goods_list, $data); + if (empty($data[ 'shop_goods_list' ]['goods_list'])) return $this->error([], '卡项中没有可以提货的商品!'); + + $data[ 'shop_goods_list' ]['goods_list'][0]['price'] = number_format($futures_info['price']/$futures_info['total'], 2); + //总结计算 + $data[ 'delivery_money' ] = $this->delivery_money; + $data[ 'coupon_money' ] = $this->coupon_money; + $data[ 'adjust_money' ] = $this->adjust_money; + $data[ 'invoice_money' ] = $this->invoice_money; + $data[ 'invoice_delivery_money' ] = $this->invoice_delivery_money; + $data[ 'promotion_money' ] = 0; + // $data[ 'promotion_money' ] = $this->promotion_money; + $data[ 'order_money' ] = $this->order_money; + $data[ 'balance_money' ] = $this->balance_money; + $data[ 'pay_money' ] = $this->pay_money; + $data[ 'goods_money' ] = $this->goods_money; + $data[ 'goods_num' ] = $this->goods_num; + $data[ 'is_virtual' ] = $this->is_virtual; + + $this->goods_money = $futures_info['price']; + $this->order_money = $futures_info['price']; + $this->pay_money = $futures_info['price']; + $this->promotion_money = 0; + $data[ 'shop_goods_list' ]['goods_money'] = $futures_info['price']; + $data[ 'shop_goods_list' ]['order_money'] = $futures_info['price']; + $data[ 'shop_goods_list' ]['pay_money'] = $futures_info['price']; + $data[ 'shop_goods_list' ]['promotion_money'] = $futures_info['price']; + $data[ 'goods_money' ] = $futures_info['price']; + $data[ 'order_money' ] = $futures_info['price']; + $data[ 'pay_money' ] = $futures_info['price']; + return $this->success($data); + } + + /** + * 待付款订单 + * @param array $data + */ + public function orderPayment($data) + { + $calculate_data = $this->calculate($data); + if ($calculate_data[ 'code' ] < 0) + return $calculate_data; + + $calculate_data = $calculate_data['data']; + //1、查询会员优惠券 + $calculate_data[ 'shop_goods_list' ][ 'coupon_list' ] = []; + $express_type = []; + if ($this->is_virtual == 0) { + foreach ($calculate_data[ 'shop_goods_list' ][ 'deliver_sort' ] as $type) { + // 物流 + if ($type == 'express' && $calculate_data[ 'shop_goods_list' ][ 'express_config' ][ 'is_use' ] == 1) { + $title = $calculate_data[ 'shop_goods_list' ][ 'express_config' ][ 'value' ][ 'express_name' ]; + if ($title == '') { + $title = Express::express_type[ 'express' ][ 'title' ]; + } + $express_type[] = [ 'title' => $title, 'name' => 'express' ]; + } + // 自提 + if ($type == 'store' && $calculate_data[ 'shop_goods_list' ][ 'store_config' ][ 'is_use' ] == 1) { + //根据坐标查询门店 + $store_model = new Store(); + $store_condition = array ( + [ 'site_id', '=', $data[ 'site_id' ] ], + [ 'is_pickup', '=', 1 ], + [ 'status', '=', 1 ], + [ 'is_frozen', '=', 0 ], + ); + + $latlng = array ( + 'lat' => $data[ 'latitude' ], + 'lng' => $data[ 'longitude' ], + ); + $store_list_result = $store_model->getLocationStoreList($store_condition, '*', $latlng); + $store_list = $store_list_result[ 'data' ]; + $title = $calculate_data[ 'shop_goods_list' ][ 'store_config' ][ 'value' ][ 'store_name' ]; + if ($title == '') { + $title = Express::express_type[ 'store' ][ 'title' ]; + } + $express_type[] = [ 'title' => $title, 'name' => 'store', 'store_list' => $store_list ]; + } + // 外卖 + if ($type == 'local' && $calculate_data[ 'shop_goods_list' ][ 'local_config' ][ 'is_use' ] == 1) { + //查询本店的通讯地址 + $title = $calculate_data[ 'shop_goods_list' ][ 'local_config' ][ 'value' ][ 'local_name' ]; + if ($title == '') { + $title = '外卖配送'; + } + $store_model = new Store(); + $store_condition = array ( + [ 'site_id', '=', $data[ 'site_id' ] ] + ); + if (addon_is_exit('store', $data[ 'site_id' ])) { + $store_condition[] = [ 'is_o2o', '=', 1 ]; + $store_condition[] = [ 'status', '=', 1 ]; + $store_condition[] = [ 'is_frozen', '=', 0 ]; + } else { + $store_condition[] = ['is_default', '=', 1]; + } + $latlng = array ( + 'lat' => $data[ 'latitude' ], + 'lng' => $data[ 'longitude' ], + ); + $store_list_result = $store_model->getLocationStoreList($store_condition, '*', $latlng); + $store_list = $store_list_result[ 'data' ]; + + $express_type[] = [ 'title' => $title, 'name' => 'local', 'store_list' => $store_list ]; + } + } + } + + $calculate_data[ 'shop_goods_list' ][ 'express_type' ] = $express_type; + $payment_event_data = event('OrderPayment', $calculate_data); + + if (!empty($payment_event_data)) { + $calculate_data = array_merge($calculate_data, ...$payment_event_data); + } + + return $this->success($calculate_data); + + } + + /** + * 获取商品的计算信息 + * @param array $data + */ + public function getOrderGoodsCalculate($data) + { + + $goods_list = $this->getShopGoodsList($data); + + $this->promotion_money = 0; + $goods_list[ 'promotion_money' ] = 0; + $shop_goods_list = $goods_list; + return $shop_goods_list; + } + + /** + * 获取组合套餐商品列表信息 + * @param array $card_id + */ + public function getCardGoodsList($data) + { + $shop_goods_list = []; + $card_info = $data['card_info']; + $card_type = $card_info['card_type']; + foreach ($data['member_card_item'] as $item) { + $join = [ + [ 'goods_sku ngs', 'mgci.sku_id = ngs.sku_id', 'inner' ], + [ 'site ns', 'mgci.site_id = ns.site_id', 'inner' ] + ]; + $condition = [ + [ 'mgci.item_id', '=', $item['item_id'] ], + [ 'mgci.site_id', '=', $data['site_id'] ], + [ 'mgci.card_id', '=', $data['member_card_id'] ], + [ 'ngs.goods_state', '=', 1 ], + [ 'ngs.is_virtual', '=', 0 ] + ]; + $field = 'mgci.item_id,mgci.num as total_num,mgci.use_num,ngs.sku_id,ngs.sku_name, ngs.sku_no,ngs.price, ngs.discount_price, ngs.cost_price, ngs.stock, ngs.weight, ngs.volume, ngs.sku_image,ngs.site_id, ngs.goods_state, ngs.is_virtual,ngs.is_free_shipping, ngs.shipping_template, ngs.goods_class, ngs.goods_class_name, ngs.goods_id,ngs.sku_spec_format,ngs.goods_name,ns.site_name,ngs.support_trade_type'; + $goods_info = model('member_goods_card_item')->getInfo($condition, $field, 'mgci', $join); + if (!empty($goods_info)) { + if ($card_type == 'oncecard') { + $item['num'] = $item['num'] > $goods_info['total_num'] - $goods_info['use_num'] ? $goods_info['total_num'] - $goods_info['use_num'] : $item['num']; + } else if ($card_type == 'commoncard') { + $item['num'] = $item['num'] > $card_info['total_num'] - $card_info['total_use_num'] ? $card_info['total_num'] - $card_info['total_use_num'] : $item['num']; + $card_info['total_use_num'] += $item['num']; + } + if ($item['num'] < 1) continue; + $goods_info['num'] = $item['num']; + $price = $goods_info['discount_price']; + $goods_info['price'] = $price; + $goods_money = $price * $goods_info['num']; + $goods_info['goods_money'] = $goods_money; + $promotion_money = 0; + $goods_info['real_goods_money'] = $goods_money; + $goods_info['coupon_money'] = 0;//优惠券金额 + $goods_info['promotion_money'] = $promotion_money;//优惠金额 + + if (!empty($shop_goods_list)) { + $shop_goods_list['goods_list'][] = $goods_info; + $shop_goods_list['order_name'] = string_split($shop_goods_list['order_name'], ',', $goods_info['sku_name']); + $shop_goods_list['goods_num'] += $goods_info['num']; + $shop_goods_list['goods_money'] += $goods_info['goods_money']; + $shop_goods_list['goods_list_str'] = $shop_goods_list['goods_list_str'] . ';' . $goods_info['sku_id'] . ':' . $goods_info['num']; + } else { + $shop_goods_list['site_id'] = $data['site_id']; + $shop_goods_list['site_name'] = $goods_info['site_name']; + $shop_goods_list['goods_money'] = $goods_info['goods_money']; + $shop_goods_list['goods_list_str'] = $goods_info['sku_id'] . ':' . $goods_info['num']; + $shop_goods_list['order_name'] = string_split('', ',', $goods_info['sku_name']); + $shop_goods_list['goods_num'] = $goods_info['num']; + $shop_goods_list['goods_list'][] = $goods_info; + } + + if (isset($data[ 'delivery' ][ 'delivery_type' ]) && !empty($data[ 'delivery' ][ 'delivery_type' ]) && strpos($goods_info['support_trade_type'], $data[ 'delivery' ][ 'delivery_type' ]) === false) { + $delivery_type_name = $express_type_list[ $data[ 'delivery' ][ 'delivery_type' ] ] ?? ''; + $this->setError(1, '有商品不支持'.$delivery_type_name); + } + } + } + return $shop_goods_list; + } + + /** + * 获取店铺订单计算 + * @param int $site_id 店铺id + * @param string $site_name 店铺名称 + * @param float $goods_money 商品总价 + * @param array $goods_list 店铺商品列表 + * @param array $data 传输生成订单数据 + */ + public function shopOrderCalculate($shop_goods, $data) + { + $site_id = $shop_goods[ 'site_id' ]; + + //交易配置 + $config_model = new Config(); + $order_config_result = $config_model->getOrderEventTimeConfig($site_id); + $order_config = $order_config_result[ 'data' ]; + + $shop_goods[ 'order_config' ] = $order_config[ 'value' ] ?? []; + + + $promotion_money = 0; + foreach ($shop_goods[ 'goods_list' ] as $k => $v) { + $item_goods_money = $v['goods_money']; + $item_promotion_money = $item_goods_money; + $real_goods_money = $item_goods_money - $item_promotion_money; + $shop_goods[ 'goods_list' ][ $k ][ 'real_goods_money' ] = $real_goods_money; + $shop_goods[ 'goods_list' ][ $k ][ 'promotion_money' ] = $item_promotion_money; + $promotion_money += $item_promotion_money; + } + $goods_money = $shop_goods['goods_money']; + $shop_goods['promotion_money'] = $promotion_money; + $shop_goods[ 'is_free_delivery' ] = true;// + + //定义计算金额 + $delivery_money = 0; //配送费用 + $promotion_money = $shop_goods[ 'promotion_money' ]; //优惠费用(满减) + $coupon_money = 0; //优惠券费用 + $adjust_money = 0; //调整金额 + $invoice_money = 0; //发票金额 + $order_money = 0; //订单金额 + $balance_money = 0; //会员余额 + $pay_money = 0; //应付金额 + $store_id = 0; + + //计算邮费 + if ($this->is_virtual == 1) { + //虚拟订单 运费为0 + $shop_goods[ 'delivery' ][ 'delivery_type' ] = ''; + } else { + $express_config_model = new ExpressConfig(); + $deliver_type = $express_config_model->getDeliverTypeSort($site_id); + $deliver_type = $deliver_type[ 'data' ]; + $shop_goods[ 'deliver_sort' ] = explode(',', $deliver_type[ 'value' ][ 'deliver_type' ]); + //查询店铺是否开启快递配送 + $express_config_result = $express_config_model->getExpressConfig($site_id); + $express_config = $express_config_result[ 'data' ]; + $shop_goods[ 'express_config' ] = $express_config; + //查询店铺是否开启门店自提 + $store_config_result = $express_config_model->getStoreConfig($site_id); + $store_config = $store_config_result[ 'data' ]; + $shop_goods[ 'store_config' ] = $store_config; + //查询店铺是否开启外卖配送 + $local_config_result = $express_config_model->getLocalDeliveryConfig($site_id); + $local_config = $local_config_result[ 'data' ]; + $shop_goods[ 'local_config' ] = $local_config; + + //如果本地配送开启, 则查询出本地配送的配置 + if ($shop_goods[ 'local_config' ][ 'is_use' ] == 1 && isset($data[ 'delivery' ][ 'store_id' ])) { + $local_model = new Local(); + $local_info_result = $local_model->getLocalInfo([ [ 'site_id', '=', $site_id ], ['store_id', '=', $data[ 'delivery' ][ 'store_id' ] ] ]); + $local_info = $local_info_result[ 'data' ]; + $shop_goods[ 'local_config' ][ 'info' ] = $local_info; + } else{ + $shop_goods[ 'local_config' ][ 'info' ] = []; + } + $delivery_array = $data[ 'delivery' ] ?? []; + $delivery_type = $delivery_array[ 'delivery_type' ] ?? 'express'; + if ($delivery_type == 'store') { + if (isset($data[ 'delivery' ][ 'delivery_type' ]) && $data[ 'delivery' ][ 'delivery_type' ] == 'store') { + //门店自提 + $shop_goods[ 'delivery' ][ 'delivery_type' ] = 'store'; + if ($shop_goods[ 'store_config' ][ 'is_use' ] == 0) { + $this->error = 1; + $this->error_msg = '门店自提方式未开启!'; + } + if (empty($data[ 'delivery' ][ 'store_id' ])) { + $this->error = 1; + $this->error_msg = '门店未选择!'; + } + $shop_goods[ 'delivery' ][ 'store_id' ] = $data[ 'delivery' ][ 'store_id' ]; + $shop_goods[ 'buyer_ask_delivery_time' ] = $data[ 'buyer_ask_delivery_time' ]; + $shop_goods = $this->storeOrderData($shop_goods, $data); + $store_id = $data[ 'delivery' ][ 'store_id' ] ?? 0; + } + } else { + if (empty($data[ 'member_address' ])) { + $shop_goods[ 'delivery' ][ 'delivery_type' ] = 'express'; + + $this->error = 1; + $this->error_msg = '未配置默认收货地址!'; + } else { + if (!isset($data[ 'delivery' ][ 'delivery_type' ]) || $data[ 'delivery' ][ 'delivery_type' ] == 'express') { + if ($shop_goods[ 'express_config' ][ 'is_use' ] == 1) { + //物流配送 + $express = new Express(); + $express_fee_result = $express->calculate($shop_goods, $data); + if ($express_fee_result[ 'code' ] < 0) { + $this->error = 1; + $this->error_msg = $express_fee_result[ 'message' ]; + $delivery_fee = 0; + } else { + $delivery_fee = $express_fee_result[ 'data' ][ 'delivery_fee' ]; + } + } else { + $this->error = 1; + $this->error_msg = '物流配送方式未开启!'; + $delivery_fee = 0; + } + $shop_goods[ 'delivery' ][ 'delivery_type' ] = 'express'; + } else if ($data[ 'delivery' ][ 'delivery_type' ] == 'local') { + if (empty($data[ 'delivery' ][ 'store_id' ])) { + $this->setError(1, '门店未选择!'); + } + //外卖配送 + $shop_goods[ 'delivery' ][ 'delivery_type' ] = 'local'; + if ($shop_goods[ 'local_config' ][ 'is_use' ] == 0) { + $this->error = 1; + $this->error_msg = '外卖配送方式未开启!'; + } else { + if (empty($data[ 'delivery' ][ 'store_id' ])) { + $this->setError(1, '门店未选择!'); + } + $local_delivery_time = 0; + if (!empty($data[ 'buyer_ask_delivery_time' ])) { + $local_delivery_time = $data[ 'buyer_ask_delivery_time' ]; + } + $shop_goods[ 'buyer_ask_delivery_time' ] = $local_delivery_time; + + $local_model = new Local(); + $data['unlimited_start_money'] = 1; // 不限制起送价 + $local_result = $local_model->calculate($shop_goods, $data); + + $shop_goods[ 'delivery' ][ 'start_money' ] = 0; + if ($local_result[ 'code' ] < 0) { + $this->error = $local_result[ 'data' ][ 'code' ]; + $this->error_msg = $local_result[ 'message' ]; + $shop_goods[ 'delivery' ][ 'start_money' ] = $local_result[ 'data' ][ 'start_money_array' ][ 0 ] ?? 0; + } else { + if (!empty($local_result[ 'data' ][ 'error_code' ])) { + $this->error = $local_result[ 'data' ][ 'code' ]; + $this->error_msg = $local_result[ 'data' ][ 'error' ]; + } + } + + $shop_goods[ 'delivery' ][ 'error' ] = $this->error; + $shop_goods[ 'delivery' ][ 'error_msg' ] = $this->error_msg; + $store_id = $data[ 'delivery' ][ 'store_id' ] ?? 0; + } + } + } + } + } + + //是否符合免邮 + $is_free_delivery = $shop_goods[ 'is_free_delivery' ] ?? false; + if ($is_free_delivery) { + $delivery_money = 0; + } + + //发票相关 + $shop_goods = $this->invoice($shop_goods, $data); + + $order_money = $goods_money + $delivery_money - $promotion_money + $shop_goods[ 'invoice_money' ] + $shop_goods[ 'invoice_delivery_money' ]; + $shop_goods[ 'order_money' ] = $order_money; + if ($order_money < 0) { + $order_money = 0; + } + $balance_money = 0; + $pay_money = $order_money - $balance_money;//计算出实际支付金额 + $this->member_balance_money -= $balance_money;//预减少账户余额 + $this->balance_money += $balance_money;//累计余额 + + //总结计算 + $shop_goods[ 'store_id' ] = $store_id; + $shop_goods[ 'goods_money' ] = $goods_money; + $shop_goods[ 'delivery_money' ] = $delivery_money; + $shop_goods[ 'coupon_money' ] = $coupon_money; + $shop_goods[ 'adjust_money' ] = $adjust_money; + $shop_goods[ 'promotion_money' ] = $promotion_money; + $shop_goods[ 'order_money' ] = $order_money; + $shop_goods[ 'balance_money' ] = $balance_money; + $shop_goods[ 'pay_money' ] = $pay_money; + + $this->goods_money += $goods_money; + $this->delivery_money += $delivery_money; + $this->coupon_money += $coupon_money; + $this->adjust_money += $adjust_money; + $this->invoice_money += $shop_goods[ 'invoice_money' ]; + $this->invoice_delivery_money += $shop_goods[ 'invoice_delivery_money' ]; + $this->promotion_money += $promotion_money; + $this->order_money += $order_money; + $this->pay_money += $pay_money; + + $this->goods_num += $shop_goods[ 'goods_num' ]; + $this->order_name = string_split($this->order_name, ',', $shop_goods[ 'order_name' ]); + return $shop_goods; + } + +} \ No newline at end of file