Ver Fonte

Wesmiler

wesmiler há 3 meses atrás
pai
commit
99327b0e92

+ 42 - 0
app/Http/Controllers/Api/v1/OrderController.php

@@ -124,4 +124,46 @@ class OrderController extends webApp
         }
     }
 
+    /**
+     * 取消
+     * @return array
+     */
+    public function cancel()
+    {
+        $params = request()->all();
+        $id = isset($params['id'])? $params['id'] : 0;
+        try {
+            if (!$result = OrderService::make()->cancel($this->userId, $id)) {
+                $error = OrderService::make()->getError();
+                return showJson($error, false, '', $error == 2206 ? '405' : -1);
+            } else {
+                return showJson(OrderService::make()->getError(), true, $result);
+            }
+        } catch (\Exception $exception) {
+            $error = ['data' => $exception->getTrace(), 'err' => $exception->getMessage()];
+            return showJson(1046, false, $error);
+        }
+    }
+
+    /**
+     * 收货
+     * @return array
+     */
+    public function complete()
+    {
+        $params = request()->all();
+        $id = isset($params['id'])? $params['id'] : 0;
+        try {
+            if (!$result = OrderService::make()->complete($this->userId, $id)) {
+                $error = OrderService::make()->getError();
+                return showJson($error, false, '', $error == 2206 ? '405' : -1);
+            } else {
+                return showJson(OrderService::make()->getError(), true, $result);
+            }
+        } catch (\Exception $exception) {
+            $error = ['data' => $exception->getTrace(), 'err' => $exception->getMessage()];
+            return showJson(1046, false, $error);
+        }
+    }
+
 }

+ 177 - 1
app/Services/Api/OrderService.php

@@ -259,7 +259,7 @@ class OrderService extends BaseService
         $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, 2);
+        $bonus = moneyFormat($orderTotal * $bonusRate/100, 2);
 
         $orderTotal = 0.1;
 
@@ -330,6 +330,12 @@ class OrderService extends BaseService
         ];
     }
 
+    /**
+     * 订单支付
+     * @param $userId
+     * @param $id
+     * @return array|false
+     */
     public function pay($userId, $id)
     {
         if ($id <= 0) {
@@ -416,6 +422,176 @@ class OrderService extends BaseService
     }
 
     /**
+     * 订单取消
+     * @param $userId
+     * @param $id
+     * @return array|false
+     */
+    public function cancel($userId, $id)
+    {
+        if ($id <= 0) {
+            $this->error = '请选择订单';
+            return false;
+        }
+
+        // 缓存锁
+        $cacheLockKey = "caches:orders:cancel_lock:{$userId}_{$id}";
+        if (RedisService::get($cacheLockKey)) {
+            $this->error = '订单处理中~';
+            return false;
+        }
+
+        // 商品数据
+        RedisService::set($cacheLockKey, ['order_id' => $id, 'user_id' => $userId], rand(3, 5));
+
+        // 用户信息
+        $userInfo = MemberModel::where(['id' => $userId, 'mark' => 1])
+            ->select(['id', 'openid', 'mobile', 'nickname', 'realname', 'balance', 'status'])
+            ->first();
+        $status = isset($userInfo['status']) ? $userInfo['status'] : 0;
+        if (empty($userInfo) || $status != 1) {
+            $this->error = 1045;
+            RedisService::clear($cacheLockKey);
+            return false;
+        }
+
+        // 订单信息
+        $info = $this->model->where(['id'=> $id,'mark'=>1])
+            ->select(['id','order_no','pay_total','status'])
+            ->first();
+        $orderNo = isset($info['order_no'])? $info['order_no'] : '';
+        $status = isset($info['status'])? $info['status'] : 0;
+        if(empty($info) || empty($orderNo)){
+            $this->error = '订单信息不存在';
+            RedisService::clear($cacheLockKey);
+            return false;
+        }
+
+        if($status != 1){
+            $this->error = '订单已支付';
+            RedisService::clear($cacheLockKey);
+            return false;
+        }
+
+        $this->model->where(['user_id'=> $userId,'mark'=>0])->where('update_time','<=', time() - 300)->delete();
+        $this->model->where(['id'=> $id])->update(['mark'=>0,'update_time'=>time()]);
+        return ['id'=> $id];
+    }
+
+    /**
+     * 订单完成
+     * @param $userId 订单用户ID
+     * @param $id 订单ID
+     * @return array|false
+     */
+    public function complete($userId, $id)
+    {
+        if ($id <= 0) {
+            $this->error = '请选择订单';
+            return false;
+        }
+
+        // 缓存锁
+        $cacheLockKey = "caches:orders:complete_lock:{$userId}_{$id}";
+        if (RedisService::get($cacheLockKey)) {
+            $this->error = '订单处理中~';
+            return false;
+        }
+
+        // 商品数据
+        RedisService::set($cacheLockKey, ['order_id' => $id, 'user_id' => $userId], rand(3, 5));
+
+        // 用户信息
+        $userInfo = MemberModel::where(['id' => $userId, 'mark' => 1])
+            ->select(['id', 'openid', 'mobile','parent_id', 'nickname', 'realname', 'balance', 'status'])
+            ->first();
+        $status = isset($userInfo['status']) ? $userInfo['status'] : 0;
+        $parentId = isset($userInfo['parent_id']) ? $userInfo['parent_id'] : 0;
+        if (empty($userInfo) || $status != 1) {
+            $this->error = 1045;
+            RedisService::clear($cacheLockKey);
+            return false;
+        }
+
+        // 订单信息
+        $info = $this->model->with(['orderGoods'])->where(['id'=> $id,'mark'=>1])
+            ->select(['id','order_no','store_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'] : '';
+        $deliverCompany = isset($info['delivery_company'])? $info['delivery_company'] : '';
+        $deliverCode = isset($info['delivery_code'])? $info['delivery_code'] : '';
+        $storeId = isset($info['store_id'])? $info['store_id'] : 0;
+        $orderTotal = isset($info['pay_total'])? $info['pay_total'] : 0;
+        $bonus = isset($info['bonus'])? $info['bonus'] : 0;
+        $status = isset($info['status'])? $info['status'] : 0;
+        $orderGoods = isset($info['order_goods'])? $info['order_goods'] : [];
+        if(empty($info) || empty($orderNo)){
+            $this->error = '订单信息不存在';
+            RedisService::clear($cacheLockKey);
+            return false;
+        }
+
+        if($status != 3 || (empty($deliveryNo) || empty($deliverCompany) || empty($deliverCode))){
+            $this->error = '订单未发货';
+            RedisService::clear($cacheLockKey);
+            return false;
+        }
+
+        if(empty($deliveryNo) || empty($deliverCompany) || empty($deliverCode)){
+            $this->error = '订单发货信息错误,请联系客服';
+            RedisService::clear($cacheLockKey);
+            return false;
+        }
+
+        DB::beginTransaction();
+        $this->model->where(['id'=> $id])->update(['status'=> '4','update_time'=>time()]);
+
+        // 商家订单数据统计
+        $updateData = ['order_count'=>DB::raw('order_count+1'),'order_total'=>DB::raw("order_total + {$orderTotal}")];
+        StoreModel::where(['id'=> $storeId])->update($updateData);
+
+
+        // 商品销量数据
+        if($orderGoods){
+            $counts = [];
+            foreach($orderGoods as $item){
+                $counts[$item['goods_id']] = isset($counts[$item['goods_id']])? $counts[$item['goods_id']] : 0;
+                $counts[$item['goods_id']] += $item['num'];
+            }
+
+            if($counts){
+                foreach ($counts as $id => $v){
+                    GoodsModel::where(['id'=> $id])->update(['sales'=>DB::raw("sales + {$v}"),'update_time'=>time()]);
+                }
+            }
+        }
+
+        // 结算商家收益
+        if(SettleService::make()->storeBonus($storeId, $bonus, $info) < 0){
+            DB::rollBack();
+            $this->error = SettleService::make()->getError();
+            RedisService::clear($cacheLockKey);
+            return false;
+        }
+
+
+
+
+        // 代理佣金结算
+        if(SettleService::make()->agentBonus($userId, $orderTotal, $info, $parentId) < 0){
+            DB::rollBack();
+            $this->error = SettleService::make()->getError();
+            RedisService::clear($cacheLockKey);
+            return false;
+        }
+
+        DB::commit();
+
+        return ['id'=> $id];
+    }
+
+    /**
      * 今日数量统计数据
      * @param $userId
      * @param int $type

+ 228 - 0
app/Services/Api/SettleService.php

@@ -0,0 +1,228 @@
+<?php
+// +----------------------------------------------------------------------
+// | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
+// +----------------------------------------------------------------------
+// | 版权所有 2017~2021 LARAVEL研发中心
+// +----------------------------------------------------------------------
+// | 官方网站: http://www.laravel.cn
+// +----------------------------------------------------------------------
+// | Author: laravel开发员 <laravel.qq.com>
+// +----------------------------------------------------------------------
+
+namespace App\Services\Api;
+
+use App\Models\AccountLogModel;
+use App\Models\AgentModel;
+use App\Models\MemberModel;
+use App\Models\StoreCategoryModel;
+use App\Models\StoreModel;
+use App\Services\BaseService;
+use App\Services\ConfigService;
+use App\Services\RedisService;
+use Illuminate\Support\Facades\DB;
+
+/**
+ * 结算管理-服务类
+ * @author laravel开发员
+ * @since 2020/11/11
+ * @package App\Services\Common
+ */
+class SettleService extends BaseService
+{
+    /**
+     * 构造函数
+     * @author laravel开发员
+     * @since 2020/11/11
+     */
+    public function __construct()
+    {
+        $this->model = new AccountLogModel();
+    }
+
+    /**
+     * 静态入口
+     * @return static|null
+     */
+    public static function make()
+    {
+        if (!self::$instance) {
+            self::$instance = (new static());
+        }
+        return self::$instance;
+    }
+
+
+    /**
+     * 商家收益结算
+     * @param $storeId
+     * @param $money 收益
+     * @param $order 订单数据
+     * @return array|false|int
+     */
+    public function storeBonus($storeId, $money, $order)
+    {
+        $orderNo = isset($order['order_no'])? $order['order_no'] : '';
+        if($money<=0 && $storeId<=0){
+            $this->error = '无商家佣金可结算';
+            return false;
+        }
+
+        $storeInfo = StoreModel::where(['id'=> $storeId,'mark'=>1])->first();
+        $balance = isset($storeInfo['balance'])? $storeInfo['balance'] : 0;
+        $storeUserId = isset($storeInfo['user_id'])? $storeInfo['user_id'] : 0;
+        if($storeUserId<=0){
+            $this->error = '商家账号错误';
+            return false;
+        }
+
+        if(!StoreModel::where(['id'=> $storeId])->update(['balance'=>DB::raw("balance + {$money}"),'income'=>DB::raw("income + {$money}"),'update_time'=>time()])){
+            $this->error = '收货错误,商家结算错误,请联系客服处理';
+            return -1;
+        }
+
+        $log = [
+            'user_id'=> $storeUserId,
+            'source_order_no'=> isset($order['order_no'])? $order['order_no'] : '',
+            'type'=> 7,
+            'money'=> $money,
+            'before_money'=> $balance,
+            'date'=>date('Y-m-d'),
+            'create_time'=>time(),
+            'remark'=> '商家收益',
+            'status'=>1
+        ];
+        if(!$id = $this->model->insertGetId($log)){
+            $this->error = '商家收益结算失败,请联系客服处理';
+            return -1;
+        }
+
+        $result = ['id'=>$id,'store_id'=>$storeId,'bonus'=>$money];
+        if(env('APP_DEBUG')){
+            RedisService::set("caches:settle:{$orderNo}:store_{$storeId}", $result, 7200);
+        }
+
+        return $result;
+    }
+
+    public function agentBonus($userId, $money, $order, $parentId)
+    {
+        $orderNo = isset($order['order_no'])? $order['order_no'] : '';
+        if($money<=0 || $userId<=0 || $parentId<=0){
+            $this->error = '无收益可结算';
+            return false;
+        }
+
+        $parent = AgentModel::with(['user'])->where(['user_id'=> $parentId,'status'=>1,'mark'=>1])
+            ->select(['id','balance','income','status'])
+            ->first();
+        $agentId = isset($parent['id'])? $parent['id'] : 0;
+        $balance = isset($parent['balance'])? $parent['balance'] : 0;
+        $parentInfo = isset($parent['user'])? $parent['user'] : [];
+        $parentOneId = isset($parentInfo['parent_id'])? $parentInfo['parent_id'] :0;
+
+
+        // 推荐消费者的佣金
+        $logs = [];
+        $agentDirectBonusRate = ConfigService::make()->getConfigByCode('agent_direct_bonus_rate', 0);
+        $agentDirectBonusRate = $agentDirectBonusRate>0 && $agentDirectBonusRate<100? $agentDirectBonusRate : 0;
+        $bonus = moneyFormat($agentDirectBonusRate * $money/100, 2);
+        if(empty($parent) || $bonus<=0 || $agentId<=0){
+            $this->error = '上级代理无效';
+            return 0;
+        }
+
+        if(!AgentModel::where(['id'=> $agentId])->update(['balance'=>DB::raw("balance + {$bonus}"),'income'=>DB::raw("income + {$bonus}"),'order_count'=>DB::raw("order_count + 1"),'update_time'=>time()])){
+            $this->error = '推荐消费者收益结算错误,请联系客服处理';
+            return -1;
+        }
+
+        $logs[] = [
+            'user_id'=> $parentId,
+            'source_order_no'=> isset($order['order_no'])? $order['order_no'] : '',
+            'type'=> 9,
+            'money'=> $bonus,
+            'before_money'=> $balance,
+            'date'=>date('Y-m-d'),
+            'create_time'=>time(),
+            'remark'=> '推广收益',
+            'status'=>1
+        ];
+
+
+        // 一级代理收益
+        $parentTwoId = 0;
+        $oneBonus = 0;
+        if($bonus>0 && $parentOneId){
+            $parentOne = AgentModel::with(['user'])->where(['user_id'=> $parentOneId,'status'=>1,'mark'=>1])
+                ->select(['id','balance','income','status'])
+                ->first();
+            $oneId = isset($parentOne['id'])? $parentOne['id'] : 0;
+            $oneBalance = isset($parentOne['balance'])? $parentOne['balance'] : 0;
+            $oneInfo = isset($parentOne['user'])? $parentOne['user'] : [];
+            $parentTwoId = isset($oneInfo['parent_id'])? $oneInfo['parent_id'] :0;
+
+            $agentBonusLevel1Rate = ConfigService::make()->getConfigByCode('agent_bonus_level1_rate', 0);
+            $agentBonusLevel1Rate = $agentBonusLevel1Rate>0 && $agentBonusLevel1Rate<100? $agentBonusLevel1Rate : 0;
+            $oneBonus = moneyFormat($agentBonusLevel1Rate * $bonus/100, 2);
+            if(!AgentModel::where(['id'=> $oneId])->update(['balance'=>DB::raw("balance + {$oneBonus}"),'income'=>DB::raw("income + {$oneBonus}"),'order_count'=>DB::raw("order_count + 1"),'update_time'=>time()])){
+                $this->error = '推荐代理收益结算错误,请联系客服处理';
+                return -1;
+            }
+
+            $logs[] = [
+                'user_id'=> $parentOneId,
+                'source_order_no'=> isset($order['order_no'])? $order['order_no'] : '',
+                'type'=> 8,
+                'money'=> $oneBonus,
+                'before_money'=> $oneBalance,
+                'date'=>date('Y-m-d'),
+                'create_time'=>time()+1,
+                'remark'=> '一级代理收益',
+                'status'=>1
+            ];
+        }
+
+        // 二级代理收益
+        $twoBonus = 0;
+        if($bonus>0 && $parentTwoId){
+            $parentTwo = AgentModel::with(['user'])->where(['user_id'=> $parentTwoId,'status'=>1,'mark'=>1])
+                ->select(['id','balance','income','status'])
+                ->first();
+            $twoId = isset($parentTwo['id'])? $parentTwo['id'] : 0;
+            $twoBalance = isset($parentTwo['balance'])? $parentTwo['balance'] : 0;
+
+            $agentBonusLevel2Rate = ConfigService::make()->getConfigByCode('agent_bonus_level2_rate', 0);
+            $agentBonusLevel2Rate = $agentBonusLevel2Rate>0 && $agentBonusLevel2Rate<100? $agentBonusLevel2Rate : 0;
+            $twoBonus = moneyFormat($agentBonusLevel2Rate * $bonus/100, 2);
+            if(!AgentModel::where(['id'=> $twoId])->update(['balance'=>DB::raw("balance + {$twoBonus}"),'income'=>DB::raw("income + {$twoBonus}"),'order_count'=>DB::raw("order_count + 1"),'update_time'=>time()])){
+                $this->error = '推荐代理收益结算错误,请联系客服处理';
+                return -1;
+            }
+
+            $logs[] = [
+                'user_id'=> $parentTwoId,
+                'source_order_no'=> isset($order['order_no'])? $order['order_no'] : '',
+                'type'=> 8,
+                'money'=> $twoBonus,
+                'before_money'=> $twoBalance,
+                'date'=>date('Y-m-d'),
+                'create_time'=>time()+2,
+                'remark'=> '二级代理收益',
+                'status'=>1
+            ];
+        }
+
+        if($logs && !$this->model->insert($logs)){
+            $this->error = '推荐代理收益结算错误,请联系客服处理';
+            return -1;
+        }
+
+        $result = ['user_id'=>$userId,'total'=> $money,'bonus'=>$bonus,'parent_id'=>$parentId,'oneId'=>$parentOneId,'oneBonus'=>$oneBonus,'twoId'=>$parentTwoId,'twoBonus'=>$twoBonus];
+        if(env('APP_DEBUG')){
+            RedisService::set("caches:settle:{$orderNo}:agent_{$userId}", $result, 7200);
+        }
+
+        return $result;
+    }
+
+}

+ 7 - 1
app/Services/Api/StoreService.php

@@ -13,8 +13,11 @@ namespace App\Services\Api;
 
 use App\Models\StoreCategoryModel;
 use App\Models\StoreModel;
+use App\Models\UserModel;
 use App\Services\BaseService;
+use App\Services\Common\UserRoleService;
 use App\Services\RedisService;
+use Illuminate\Support\Facades\DB;
 
 /**
  * 商家管理-服务类
@@ -225,11 +228,12 @@ class StoreService extends BaseService
             'mark' => 1,
         ];
 
-
+        DB::beginTransaction();
         if($id = $this->model->where(['user_id'=>$userId])->value('id')){
             $this->model->where(['id'=>$id])->update($data);
         }else{
             if (!$id = $this->model->insertGetId($data)) {
+                DB::rollBack();
                 $this->error = '申请入驻失败';
                 return false;
             }
@@ -288,4 +292,6 @@ class StoreService extends BaseService
 
         return $info;
     }
+
+
 }

+ 1 - 0
app/Services/Common/UserService.php

@@ -152,6 +152,7 @@ class UserService extends BaseService
         if (isset($data['store_id'])) {
             $this->updateStoreRelation($result, $data['store_id']);
         }
+
         // 删除已存在的用户角色关系数据
         $userRoleService = new UserRoleService();
         $userRoleService->deleteUserRole($result);

+ 1 - 0
routes/api.php

@@ -67,6 +67,7 @@ Route::prefix('v1')->middleware('web.login')->group(function() {
     Route::post('/order/count', [\App\Http\Controllers\Api\v1\OrderController::class, 'count']);
     Route::post('/order/submit', [\App\Http\Controllers\Api\v1\OrderController::class, 'submit']);
     Route::post('/order/pay', [\App\Http\Controllers\Api\v1\OrderController::class, 'pay']);
+    Route::post('/order/cancel', [\App\Http\Controllers\Api\v1\OrderController::class, 'cancel']);
 
     // 购物车
     Route::post('/cart/index', [\App\Http\Controllers\Api\v1\CartController::class, 'index']);