wesmiler il y a 3 semaines
Parent
commit
1ffe647b23

+ 8 - 0
app/Http/Controllers/Admin/OrderController.php

@@ -68,6 +68,14 @@ class OrderController extends Backend
     }
 
     /**
+     * 订单结算
+     */
+    public function settle()
+    {
+        return $this->service->settleOrder();
+    }
+
+    /**
      * 订单完成
      */
     public function complete()

+ 8 - 0
app/Http/Controllers/Admin/PayOrdersController.php

@@ -48,4 +48,12 @@ class PayOrdersController extends Backend
         $result = $service->deleteAll();
         return showJson($result['msg'], $result['code'] == 0);
     }
+
+    /**
+     * 订单结算
+     */
+    public function settle()
+    {
+        return $this->service->settleOrder();
+    }
 }

+ 1 - 1
app/Services/Api/AccountService.php

@@ -435,7 +435,7 @@ class AccountService extends BaseService
             'rec_bonus_id' => $parentId,
             'rec_bonus_rate' => $agentDirectBonusRate,
             'rec_bonus' => $recBonus,
-            'rec_bonus_settle' => 2,
+            'bonus_settle' => 2,
             'id_card_no' => $idCardNo,
             'create_time' => time(),
             'remark' => $remark,

+ 2 - 2
app/Services/Api/OrderService.php

@@ -309,7 +309,7 @@ class OrderService extends BaseService
             'rec_bonus_id' => $parentId,
             'rec_bonus_rate' => $agentDirectBonusRate,
             'rec_bonus' => $recBonus,
-            'rec_bonus_settle' => 2,
+            'bonus_settle' => 2,
             'create_time' => time(),
             'update_time' => time(),
             'status' => 1,
@@ -618,7 +618,7 @@ class OrderService extends BaseService
 
         // 订单信息
         $info = $this->model->with(['orderGoods'])->where(['id' => $id, 'mark' => 1])
-            ->select(['id', 'order_no', 'store_id', 'pay_total', 'bonus','rec_bonus_id','rec_bonus','rec_bonus_settle', 'delivery_no', 'delivery_company', 'delivery_code', 'status'])
+            ->select(['id', 'order_no', 'store_id', 'pay_total', 'bonus','rec_bonus_id','rec_bonus','bonus_settle', 'delivery_no', 'delivery_company', 'delivery_code', 'status'])
             ->first();
         $orderNo = isset($info['order_no']) ? $info['order_no'] : '';
         $deliveryNo = isset($info['delivery_no']) ? $info['delivery_no'] : '';

+ 16 - 5
app/Services/Api/SettleService.php

@@ -64,9 +64,15 @@ class SettleService extends BaseService
     public function storeBonus($storeId, $money, $order)
     {
         $orderNo = isset($order['order_no'])? $order['order_no'] : '';
+        $bonusSettle = isset($order['bonus_settle']) && $order['bonus_settle']? $order['bonus_settle'] : 2;
         if($money<=0 && $storeId<=0){
             $this->error = '无商家佣金可结算';
-            return false;
+            return 0;
+        }
+
+        if($bonusSettle == 1){
+            $this->error = '佣金已结算';
+            return 0;
         }
 
         $storeInfo = StoreModel::where(['id'=> $storeId,'mark'=>1])->first();
@@ -74,7 +80,12 @@ class SettleService extends BaseService
         $storeUserId = isset($storeInfo['user_id'])? $storeInfo['user_id'] : 0;
         if($storeUserId<=0){
             $this->error = '商家账号错误';
-            return false;
+            return 0;
+        }
+
+        if(AccountLogModel::where(['source_order_no'=>$orderNo,'status'=>1,'mark'=>1])->value('id')){
+            $this->error = '该订单已结算商家佣金';
+            return 0;
         }
 
         if(!StoreModel::where(['id'=> $storeId])->update(['balance'=>DB::raw("balance + {$money}"),'income'=>DB::raw("income + {$money}"),'update_time'=>time()])){
@@ -119,13 +130,13 @@ class SettleService extends BaseService
     {
         $orderId = isset($order['id'])? $order['id'] : 0;
         $total = isset($order['pay_total'])? $order['pay_total'] : 0;
-        $recBonusSettle = isset($order['order_no']) && $order['rec_bonus_settle']? $order['rec_bonus_settle'] : 2;
+        $bonusSettle = isset($order['bonus_settle']) && $order['bonus_settle']? $order['bonus_settle'] : 2;
         if($orderId<=0 || $bonus<=0 || $userId<=0 || $recBonusId<=0){
             $this->error = '无收益可结算';
             return false;
         }
 
-        if($recBonusSettle == 1){
+        if($bonusSettle == 1){
             $this->error = '收益已结算';
             return 0;
         }
@@ -240,7 +251,7 @@ class SettleService extends BaseService
 
         // 更新订单结算状态
         $model = $type>0? new PayOrdersModel() : new OrderModel();
-        if(!$model::where(['id'=>$orderId])->update(['rec_bonus_settle'=>1,'update_time'=>time()])){
+        if(!$model::where(['id'=>$orderId])->update(['bonus_settle'=>1,'update_time'=>time()])){
             $this->error = '收益结算状态更新失败';
             return -1;
         }

+ 61 - 0
app/Services/Common/OrderService.php

@@ -19,6 +19,7 @@ use App\Models\MessageModel;
 use App\Models\OrderModel;
 use App\Models\OrderGoodsModel;
 use App\Models\StoreModel;
+use App\Services\Api\SettleService;
 use App\Services\BaseService;
 use App\Services\RedisService;
 use Illuminate\Support\Facades\DB;
@@ -430,6 +431,66 @@ class OrderService extends BaseService
     /**
      * 取消订单
      */
+    public function settleOrder()
+    {
+        $id = request()->post('id');
+
+        if (!$id) {
+            return ['code' => 1, 'msg' => '参数错误'];
+        }
+
+        $cacheLockKey = "caches:orders:settle_".$id.'_lock';
+        if(RedisService::get($cacheLockKey)){
+            return ['code' => 1, 'msg' => '结算中'];
+        }
+
+        $order = $this->model->find($id);
+        $orderNo = isset($order['order_no'])?$order['order_no']:'';
+        $storeId = isset($order['store_id'])?$order['store_id']:0;
+        $userId = isset($order['user_id'])?$order['user_id']:0;
+        if (!$order) {
+            return ['code' => 1, 'msg' => '订单不存在'];
+        }
+
+        if ($order->bonus_settle != 1) {
+            return ['code' => 1, 'msg' => '佣金收益已结算'];
+        }
+
+        RedisService::set($cacheLockKey, $order, rand(10,20));
+        DB::beginTransaction();
+        // 结算商家收益
+        $result = SettleService::make()->storeBonus($storeId, $order['bonus'], $order);
+        if ($result < 0) {
+            DB::rollBack();
+            $this->error = SettleService::make()->getError();
+            RedisService::clear($cacheLockKey);
+            \App\Services\Api\OrderService::make()->saveLog("caches:settle:{$orderNo}:store_{$storeId}_error",SettleService::make()->getError());
+            return false;
+        }
+        \App\Services\Api\OrderService::make()->saveLog("caches:settle:{$orderNo}:store_{$storeId}",$result);
+
+
+        // 代理佣金结算
+        $result = SettleService::make()->agentBonus($userId, $order['rec_bonus'], $order, $order['rec_bonus_id']);
+        if ($result < 0) {
+            DB::rollBack();
+            $this->error = SettleService::make()->getError();
+            RedisService::clear($cacheLockKey);
+            \App\Services\Api\OrderService::make()->saveLog("caches:settle:{$orderNo}:agent_{$userId}_error",SettleService::make()->getError());
+            return false;
+        }
+        \App\Services\Api\OrderService::make()->saveLog("caches:settle:{$orderNo}:agent_{$userId}",$result);
+
+        DB::commit();
+        ActionLogModel::setTitle("订单结算");
+        ActionLogModel::record();
+        RedisService::keyDel("caches:orders:*");
+        return ['code' => 0, 'msg' => '订单结算'];
+    }
+
+    /**
+     * 取消订单
+     */
     public function cancelOrder()
     {
         $id = request()->post('id');

+ 51 - 0
app/Services/Common/PayOrdersService.php

@@ -2,11 +2,14 @@
 
 namespace App\Services\Common;
 
+use App\Models\ActionLogModel;
 use App\Models\PayOrdersModel;
+use App\Services\Api\SettleService;
 use App\Services\BaseService;
 use App\Services\DyrPayService;
 use App\Services\PaymentService;
 use App\Services\RedisService;
+use Illuminate\Support\Facades\DB;
 
 /**
  * 充值缴费订单服务
@@ -345,4 +348,52 @@ class PayOrdersService extends BaseService
         $this->error = '订单状态验证处理成功';
         return ['success' => $success, 'errors' => $errors];
     }
+
+    /**
+     * 取消订单
+     */
+    public function settleOrder()
+    {
+        $id = request()->post('id');
+
+        if (!$id) {
+            return ['code' => 1, 'msg' => '参数错误'];
+        }
+
+        $cacheLockKey = "caches:orders:pay_settle_".$id.'_lock';
+        if(RedisService::get($cacheLockKey)){
+            return ['code' => 1, 'msg' => '结算中'];
+        }
+
+        $order = $this->model->find($id);
+        $orderNo = isset($order['order_no'])?$order['order_no']:'';
+        $userId = isset($order['user_id'])?$order['user_id']:0;
+        if (!$order) {
+            return ['code' => 1, 'msg' => '订单不存在'];
+        }
+
+        if ($order->bonus_settle != 1) {
+            return ['code' => 1, 'msg' => '佣金收益已结算'];
+        }
+
+        RedisService::set($cacheLockKey, $order, rand(10,20));
+        DB::beginTransaction();
+
+        // 代理佣金结算
+        $result = SettleService::make()->agentBonus($userId, $order['rec_bonus'], $order, $order['rec_bonus_id']);
+        if ($result < 0) {
+            DB::rollBack();
+            $this->error = SettleService::make()->getError();
+            RedisService::clear($cacheLockKey);
+            \App\Services\Api\OrderService::make()->saveLog("caches:settle:{$orderNo}:agent_{$userId}_error",SettleService::make()->getError());
+            return false;
+        }
+        \App\Services\Api\OrderService::make()->saveLog("caches:settle:{$orderNo}:agent_{$userId}",$result);
+
+        DB::commit();
+        ActionLogModel::setTitle("订单结算");
+        ActionLogModel::record();
+        RedisService::keyDel("caches:orders:*");
+        return ['code' => 0, 'msg' => '订单结算'];
+    }
 }

+ 2 - 10
routes/web.php

@@ -140,6 +140,7 @@ Route::post('/order/status', [\App\Http\Controllers\Admin\OrderController::class
 Route::post('/order/completePay', [\App\Http\Controllers\Admin\OrderController::class, 'completePay']);
 Route::post('/order/deliver', [\App\Http\Controllers\Admin\OrderController::class, 'deliver']);
 Route::post('/order/complete', [\App\Http\Controllers\Admin\OrderController::class, 'complete']);
+Route::post('/order/settle', [\App\Http\Controllers\Admin\OrderController::class, 'settle']);
 Route::post('/order/cancel', [\App\Http\Controllers\Admin\OrderController::class, 'cancel']);
 Route::post('/order/applyRefund', [\App\Http\Controllers\Admin\OrderController::class, 'applyRefund']);
 Route::post('/order/agreeRefund', [\App\Http\Controllers\Admin\OrderController::class, 'agreeRefund']);
@@ -220,16 +221,6 @@ Route::post('/goods/category/delete', [\App\Http\Controllers\Admin\GoodsCategory
 Route::post('/goods/category/dall', [\App\Http\Controllers\Admin\GoodsCategoryController::class, 'deleteAll']);
 Route::get('/goods/category/options', [\App\Http\Controllers\Admin\GoodsCategoryController::class, 'options']);
 
-// 订单
-Route::get('/order/index', [\App\Http\Controllers\Admin\OrderController::class, 'index']);
-Route::post('/order/edit', [\App\Http\Controllers\Admin\OrderController::class, 'edit']);
-Route::post('/order/status', [\App\Http\Controllers\Admin\OrderController::class, 'status']);
-Route::post('/order/confirm', [\App\Http\Controllers\Admin\OrderController::class, 'confirm']);
-Route::post('/order/cancel', [\App\Http\Controllers\Admin\OrderController::class, 'cancel']);
-Route::post('/order/complete', [\App\Http\Controllers\Admin\OrderController::class, 'complete']);
-Route::post('/order/count', [\App\Http\Controllers\Admin\OrderController::class, 'count']);
-Route::post('/order/delete', [\App\Http\Controllers\Admin\OrderController::class, 'delete']);
-
 // 财务明细(账户明细)
 Route::get('/account/index', [\App\Http\Controllers\Admin\AccountController::class, 'index']);
 Route::get('/account/read', [\App\Http\Controllers\Admin\AccountController::class, 'read']);
@@ -277,6 +268,7 @@ Route::get('/pay/orders/index', [\App\Http\Controllers\Admin\PayOrdersController
 Route::get('/pay/orders/read', [\App\Http\Controllers\Admin\PayOrdersController::class, 'read']);
 Route::post('/pay/orders/delete', [\App\Http\Controllers\Admin\PayOrdersController::class, 'delete']);
 Route::post('/pay/orders/dall', [\App\Http\Controllers\Admin\PayOrdersController::class, 'dall']);
+Route::post('/pay/orders/settle', [\App\Http\Controllers\Admin\PayOrdersController::class, 'settle']);
 
 // 投诉建议管理
 Route::get('/complaint/index', [\App\Http\Controllers\Admin\ComplaintController::class, 'index']);