wesmiler 2 недель назад
Родитель
Сommit
90f176fb4e
1 измененных файлов с 138 добавлено и 73 удалено
  1. 138 73
      app/Services/Api/OrderService.php

+ 138 - 73
app/Services/Api/OrderService.php

@@ -119,20 +119,20 @@ class OrderService extends BaseService
      */
     public function getCommissionBill($userId, $params)
     {
-        $pageSize = isset($params['pageSize'])&&$params['pageSize']?$params['pageSize']:10;
-        $query = OrderCommissionModel::where(['user_id'=>$userId])
-            ->with(['user','order'])
-            ->where(function($query) use($params){
+        $pageSize = isset($params['pageSize']) && $params['pageSize'] ? $params['pageSize'] : 10;
+        $query = OrderCommissionModel::where(['user_id' => $userId])
+            ->with(['user', 'order'])
+            ->where(function ($query) use ($params) {
                 // 日期
                 $date = isset($params['date']) ? $params['date'] : [];
-                $start = isset($date[0]) && $date[0]? $date[0] : date('Y-m-d 00:00:00', time() - 30 *3 *86400);
-                $end = isset($date[1]) && $date[1]? $date[1] : date('Y-m-d 23:59:59');
-                $end = $start>=$end? '' : $end;
+                $start = isset($date[0]) && $date[0] ? $date[0] : date('Y-m-d 00:00:00', time() - 30 * 3 * 86400);
+                $end = isset($date[1]) && $date[1] ? $date[1] : date('Y-m-d 23:59:59');
+                $end = $start >= $end ? '' : $end;
                 if ($start) {
-                    $query->where('created_at','>=', $start);
+                    $query->where('created_at', '>=', $start);
                 }
-                if($end){
-                    $query->where('created_at','<=', $end);
+                if ($end) {
+                    $query->where('created_at', '<=', $end);
                 }
             });
 
@@ -146,7 +146,7 @@ class OrderService extends BaseService
 
         return [
             'pageSize' => $pageSize,
-            'amount'=>$amount,
+            'amount' => $amount,
             'total' => isset($list['total']) ? $list['total'] : 0,
             'list' => isset($list['data']) ? $list['data'] : []
         ];
@@ -232,6 +232,7 @@ class OrderService extends BaseService
      */
     public function createOrder($userId, $params)
     {
+        $type = isset($params['type']) && $params['type'] ? $params['type'] : 1;
         $addressId = isset($params['address_id']) && $params['address_id'] ? $params['address_id'] : 0;
         $goods = isset($params['goods']) && $params['goods'] ? $params['goods'] : [];
         $ids = $goods ? array_column($goods, 'id') : [];
@@ -256,10 +257,12 @@ class OrderService extends BaseService
         // 用户信息
         RedisService::set($cacheLockKey, ['params' => $params, 'user_id' => $userId], rand(3, 5));
         $userInfo = MemberModel::where(['id' => $userId, 'mark' => 1])
-            ->select(['id', 'openid', 'discount_point', 'status'])
+            ->select(['id', 'openid', 'buy_type','parent_id','', 'bd_score', 'status'])
             ->first();
         $status = isset($userInfo['status']) ? $userInfo['status'] : 0;
         $openid = isset($userInfo['openid']) ? $userInfo['openid'] : 0;
+        $buyType = isset($userInfo['buy_type']) ? $userInfo['buy_type'] : 0;
+        $bdScore = isset($userInfo['bd_score']) ? $userInfo['bd_score'] : 0;
         $discountPoint = isset($userInfo['discount_point']) ? $userInfo['discount_point'] : 0; // 折扣
         if (empty($userInfo) || $status != 1) {
             $this->error = 1045;
@@ -273,7 +276,7 @@ class OrderService extends BaseService
 
         // 商品数据
         $orderNo = get_order_num('JK');
-        $result = GoodsService::make()->getOrderGoods($ids, $goods, $userId, $orderNo,$discountPoint);
+        $result = GoodsService::make()->getOrderGoods($ids, $goods, $userId, $orderNo, $discountPoint);
         if (empty($result)) {
             RedisService::clear($cacheLockKey);
             $this->error = GoodsService::make()->getError();
@@ -283,6 +286,8 @@ class OrderService extends BaseService
         $orderGoods = isset($result['goods']) ? $result['goods'] : [];
         $goodsTotal = isset($result['goods_total']) ? $result['goods_total'] : 0; // 商品总价
         $orderTotal = isset($result['order_total']) ? $result['order_total'] : 0; // 订单结算金额(折后)
+        $bdScoreTotal = isset($result['bd_score_total']) ? $result['bd_score_total'] : 0; // 报单积分
+        $profitTotal = isset($result['profit_total']) ? $result['profit_total'] : 0; // 利润
         $discountTotal = isset($result['discount_total']) ? $result['discount_total'] : 0; // 折扣金额
         $orderCount = isset($result['count']) ? $result['count'] : 0;
         $deliveryFee = isset($result['delivery_fee']) ? $result['delivery_fee'] : 0; // 运费
@@ -305,6 +310,31 @@ class OrderService extends BaseService
             return false;
         }
 
+        // 创业大礼包
+        $goodsId = isset($ids[0]) ? $ids[0] : 0;
+        if ($type == 2) {
+            if ($buyType != $goodsId) {
+                RedisService::clear($cacheLockKey);
+                $this->error = '该礼包您暂时不满足购买条件';
+                return false;
+            }
+
+            // 报单积分是否够
+            if ($bdScore < $bdScoreTotal) {
+                RedisService::clear($cacheLockKey);
+                $this->error = '抱歉,您的报单积分不足';
+                return false;
+            }
+
+            // 是否购买过
+            $checkOrder = $this->checkBusinessOrder($userId, $goodsId);
+            if ($checkOrder) {
+                RedisService::clear($cacheLockKey);
+                $this->error = '抱歉,您已经购买过该礼包';
+                return false;
+            }
+        }
+
         // 收货地址信息
         $addressInfo = MemberAddressService::make()->getBindInfo($userId, $addressId);
         $realname = isset($addressInfo['realname']) ? $addressInfo['realname'] : '';
@@ -317,37 +347,20 @@ class OrderService extends BaseService
             return false;
         }
 
-        // 商家佣金
-        $storeInfo = StoreModel::where(['id' => $storeId])->first();
-        $bonusRate = isset($storeInfo['bonus_rate']) ? floatval($storeInfo['bonus_rate']) : 0;
-        $storeBonusRate = ConfigService::make()->getConfigByCode('store_bonus_rate', 0);
-        $storeBonusRate = $storeBonusRate > 0 && $storeBonusRate <= 100 ? $storeBonusRate : 0;
-        $bonusRate = $bonusRate > 0 && $bonusRate <= 100 ? $bonusRate : $storeBonusRate;
-        $bonus = moneyFormat($orderTotal * $bonusRate / 100, 2);
-
-        // 检查是否关联为会议订单,先签到的会议先关联
-        $record = MeetingRecordsModel::with(['meeting'])->where(['user_id'=>$userId,'mark'=>1])
-            ->where('expired_at','>=', date('Y-m-d H:i:s'))
-            ->orderBy('create_time', 'desc')
-            ->first();
-        $recordMeetingId = isset($record['meeting_id'])? $record['meeting_id'] : 0;
-        $meeting = isset($record['meeting'])?$record['meeting'] : [];
-        $meetingBonusRate = isset($meeting['bonus_rate'])?$meeting['bonus_rate'] : 0;
-        $meetingUserBonusRate = isset($meeting['user_bonus_rate'])?$meeting['user_bonus_rate'] : 0;
-        $meetingBonusRate = $meetingBonusRate>0 && $meetingBonusRate<100? $meetingBonusRate : 0;
-        $meetingUserBonusRate = $meetingUserBonusRate>0 && $meetingUserBonusRate<100? $meetingUserBonusRate : 0;
-        $meetingBonus = moneyFormat($orderTotal * $meetingBonusRate / 100, 2);
-        $meetingUserBonus = moneyFormat($orderTotal * $meetingUserBonusRate / 100, 2);
-
+//        // 商家佣金
+//        $storeInfo = StoreModel::where(['id' => $storeId])->first();
+//        $bonusRate = isset($storeInfo['bonus_rate']) ? floatval($storeInfo['bonus_rate']) : 0;
+//        $storeBonusRate = ConfigService::make()->getConfigByCode('store_bonus_rate', 0);
+//        $storeBonusRate = $storeBonusRate > 0 && $storeBonusRate <= 100 ? $storeBonusRate : 0;
+//        $bonusRate = $bonusRate > 0 && $bonusRate <= 100 ? $bonusRate : $storeBonusRate;
+//        $bonus = moneyFormat($orderTotal * $bonusRate / 100, 2);
+//
+//        // 订单佣金数据
+//        $bonusData = SettleService::make()->orderBonus($orderNo,$userInfo);
 
         // 是否开启分账功能
         $payTotal = moneyFormat($orderTotal + $deliveryFee, 2); // 含运费支付金额
-        $revenueOpen = ConfigService::make()->getConfigByCode('order_revenue_open', 0);
-        $revenueRate = ConfigService::make()->getConfigByCode('order_revenue_rate', 30);
-        $revenueRate = $revenueRate>0 && $revenueRate<100? $revenueRate: 30;
-        $revenueAmount = moneyFormat($payTotal * $revenueRate/100,2);
         if (env('PAY_DEBUG')) {
-            $revenueAmount = 0.01;
             $payTotal = 0.01;
         }
 
@@ -356,9 +369,10 @@ class OrderService extends BaseService
             'order_no' => $orderNo,
             'user_id' => $userId,
             'store_id' => $storeId,
-            'meeting_id' => $recordMeetingId, // 关联会议
             'total' => $goodsTotal, // 商品总价
             'num' => $orderCount,
+            'bd_score' => $bdScoreTotal, // 折扣后商品总价(不含运费)
+            'profit_total' => $profitTotal, // 折扣后商品总价(不含运费)
             'pay_total' => $orderTotal, // 折扣后商品总价(不含运费)
             'discount_point' => $discountPoint,
             'discount_total' => $discountTotal, // 折扣金额
@@ -367,15 +381,6 @@ class OrderService extends BaseService
             'receiver_mobile' => $mobile,
             'receiver_area' => $area,
             'receiver_address' => $address,
-            'bonus' => $bonus,
-            'bonus_rate' => $bonusRate,
-            'is_revenue' => $revenueOpen==1?1: 2,
-            'revenue_no' => $revenueOpen==1?(str_replace('JK','RE',$orderNo)):'',
-            'revenue_amount' => $revenueOpen==1?$revenueAmount:0,
-            'meeting_bonus_rate' => $meetingBonusRate,
-            'meeting_bonus' => $meetingBonus,
-            'meeting_user_bonus' => $meetingUserBonus,
-            'meeting_user_bonus_rate' => $meetingUserBonusRate,
             'create_time' => time(),
             'update_time' => time(),
             'status' => 1,
@@ -399,6 +404,37 @@ class OrderService extends BaseService
             return false;
         }
 
+        // 创业礼包分单
+        if ($type == 2) {
+            $data = $order;
+            $data['total'] = moneyFormat($data['total'] / 6);
+            $data['bd_score'] = moneyFormat($bdScoreTotal / 6, 2);
+            $data['profit_total'] = moneyFormat($profitTotal / 6, 2);
+            $data['pay_total'] = moneyFormat($orderTotal / 6, 2);
+
+            $subOrders = [];
+            for ($i = 1; $i <= 6; $i++) {
+                $data['order_no'] = get_order_num('BS');
+                $data['main_no'] = $orderNo;
+                if ($i == 6) {
+                    $data['total'] = round($data['total'] / 6, 2);
+                    $data['bd_score'] = round($bdScoreTotal / 6, 2);
+                    $data['profit_total'] = round($profitTotal / 6, 2);
+                    $data['pay_total'] = round($orderTotal / 6, 2);
+                }
+
+                $subOrders[] = $data;
+            }
+
+            //
+            if ($subOrders && !$this->model->insert($subOrders)) {
+                DB::rollBack();
+                $this->error = '处理商品订单失败';
+                RedisService::clear($cacheLockKey);
+                return false;
+            }
+        }
+
         // 获取支付参数
         /* TODO 支付处理 */
         $payOrder = [
@@ -413,7 +449,7 @@ class OrderService extends BaseService
         // 调起支付
         $payment = PaymentService::make()->minPay($userInfo, $payOrder, 'store');
         if (empty($payment)) {
-//                DB::rollBack();
+            //DB::rollBack();
             RedisService::clear($cacheLockKey);
             $this->error = PaymentService::make()->getError();
             return false;
@@ -454,6 +490,35 @@ class OrderService extends BaseService
     }
 
     /**
+     * 创业大礼包验证
+     * @param $userId
+     * @param $goodsId
+     * @return array|mixed
+     */
+    public function checkBusinessOrder($userId, $goodsId)
+    {
+        $cacheKey = "caches:orders:check_order:{$goodsId}_{$userId}";
+        $data = RedisService::get($cacheKey);
+        if ($data) {
+            return $data;
+        }
+
+        $data = $this->model->from('orders as a')
+            ->leftJoin('orders_goods as b', 'b.order_no', '=', 'a.order_no')
+            ->where(['a.user_id' => $userId, 'b.goods_id' => $goodsId, 'a.mark' => 1])
+            ->where('a.status', '<=', 5)
+            ->select(['a.id', 'a.order_no', 'b.goods_id', 'a.status'])
+            ->orderBy('id', 'desc')
+            ->first();
+        $data = $data ? $data->toArray() : [];
+        if ($data) {
+            RedisService::set($cacheKey, $data, rand(5, 10));
+        }
+
+        return $data;
+    }
+
+    /**
      * 订单支付
      * @param $userId
      * @param $id
@@ -716,7 +781,7 @@ class OrderService extends BaseService
 
         // 订单信息
         $info = $this->model->with(['orderGoods'])->where(['id' => $id, 'mark' => 1])
-            ->select(['id', 'order_no','user_id', 'store_id','meeting_id', 'pay_total', 'bonus', 'delivery_no', 'delivery_company', 'delivery_code', 'status'])
+            ->select(['id', 'order_no', 'user_id', 'store_id', 'meeting_id', 'pay_total', 'bonus', 'delivery_no', 'delivery_company', 'delivery_code', 'status'])
             ->first();
         $orderNo = isset($info['order_no']) ? $info['order_no'] : '';
         $deliveryNo = isset($info['delivery_no']) ? $info['delivery_no'] : '';
@@ -785,14 +850,14 @@ class OrderService extends BaseService
         }
 
         // 关联会议统计
-        if($meetingId){
+        if ($meetingId) {
             // 会议成交统计
             $updateData = ['order_count' => DB::raw('order_count+1'), 'order_total' => DB::raw("order_total + {$orderTotal}")];
             MeetingModel::where(['id' => $meetingId])->update($updateData);
 
             // 签到用户成交统计
             $updateData = ['order_count' => DB::raw('order_count+1'), 'order_total' => DB::raw("order_total + {$orderTotal}")];
-            MeetingRecordsModel::where(['meeting_id' => $meetingId,'user_id'=>$orderUserId])->update($updateData);
+            MeetingRecordsModel::where(['meeting_id' => $meetingId, 'user_id' => $orderUserId])->update($updateData);
         }
 
 
@@ -991,7 +1056,7 @@ class OrderService extends BaseService
         $limitNum = ConfigService::make()->getConfigByCode('order_revenue_batch_num', 300);
         $limitNum = $limitNum > 10 && $limitNum < 2000 ? $limitNum : 300;
         $datas = $this->model->where(['status' => 4, 'is_revenue' => 1, 'revenue_status' => 2, 'mark' => 1])
-            ->select(['id', 'user_id','pay_total', 'order_no','revenue_no','transaction_id', 'status'])
+            ->select(['id', 'user_id', 'pay_total', 'order_no', 'revenue_no', 'transaction_id', 'status'])
             ->limit($limitNum)
             ->get();
         $datas = $datas ? $datas->toArray() : [];
@@ -1025,62 +1090,62 @@ class OrderService extends BaseService
 
         // 是否设置分账账户
         $revenueOpenid = ConfigService::make()->getConfigByCode('order_revenue_openid', '');
-        if(empty($revenueOpenid)){
+        if (empty($revenueOpenid)) {
             $this->error = '订单分账账户未配置';
             return false;
         }
 
         // 订单信息
-        RedisService::set($cacheLockKey, ['id'=>$id,'date'=>date('Y-m-d H:i:s')], 20);
+        RedisService::set($cacheLockKey, ['id' => $id, 'date' => date('Y-m-d H:i:s')], 20);
         $info = $this->model->where(['id' => $id, 'mark' => 1])
-            ->select(['id', 'order_no','revenue_no','user_id','transaction_id', 'pay_total','is_revenue','revenue_status','revenue_amount', 'status'])
+            ->select(['id', 'order_no', 'revenue_no', 'user_id', 'transaction_id', 'pay_total', 'is_revenue', 'revenue_status', 'revenue_amount', 'status'])
             ->first();
         $revenueOrderNo = isset($info['revenue_no']) ? $info['revenue_no'] : '';
         $revenueAmount = isset($info['revenue_amount']) ? $info['revenue_amount'] : 0;
         $status = isset($info['status']) ? $info['status'] : 0;
         $isRevenue = isset($info['is_revenue']) ? $info['is_revenue'] : 0;
         $revenueStatus = isset($info['revenue_status']) ? $info['revenue_status'] : 0;
-        if($status != 4){
+        if ($status != 4) {
             RedisService::clear($cacheLockKey);
             $this->error = '订单状态错误,未完成收货的订单无法分账';
             return false;
         }
 
-        if($isRevenue != 1){
+        if ($isRevenue != 1) {
             RedisService::clear($cacheLockKey);
             $this->error = '该订单不是分账订单';
             return false;
         }
 
-        if($revenueStatus != 2){
+        if ($revenueStatus != 2) {
             RedisService::clear($cacheLockKey);
             $this->error = '该订单分账已处理完成';
             return false;
         }
 
-        if($revenueAmount<=0){
+        if ($revenueAmount <= 0) {
             RedisService::clear($cacheLockKey);
             $this->error = '订单分账金额不足';
             return false;
         }
         $order = [
-            'transaction_id'=> $info['transaction_id'],
-            'out_order_no'=> $revenueOrderNo,
-            'body'=> '订单分账',
-            'amount'=> $revenueAmount,
-            'unsplit'=> true, // 只分一次
+            'transaction_id' => $info['transaction_id'],
+            'out_order_no' => $revenueOrderNo,
+            'body' => '订单分账',
+            'amount' => $revenueAmount,
+            'unsplit' => true, // 只分一次
         ];
         $result = PaymentService::make()->profitsharing($revenueOpenid, $order);
-        $state = isset($result->state)? $result->state : 0;
-        $message = isset($result->message)? $result->message : '分账失败';
-        $orderId = isset($result->order_id)? $result->order_id : '';
-        if($state == 'FINISHED'){
-            $this->model->where(['id'=>$id])->update(['revenue_status'=>1,'revenue_order_id'=>$orderId,'update_time'=>time()]);
+        $state = isset($result->state) ? $result->state : 0;
+        $message = isset($result->message) ? $result->message : '分账失败';
+        $orderId = isset($result->order_id) ? $result->order_id : '';
+        if ($state == 'FINISHED') {
+            $this->model->where(['id' => $id])->update(['revenue_status' => 1, 'revenue_order_id' => $orderId, 'update_time' => time()]);
             RedisService::clear($cacheLockKey);
             RedisService::clear("caches:orders:revenueList");
             $this->error = '分账处理成功';
             return true;
-        }else{
+        } else {
             RedisService::clear($cacheLockKey);
             $this->error = $message;
             return false;