wesmiler преди 1 седмица
родител
ревизия
633f5fa09e

+ 25 - 36
app/Console/Commands/SwooleTask.php

@@ -3,6 +3,8 @@
 namespace App\Console\Commands;
 
 use App\Services\Api\OrderService;
+use App\Services\Api\PriceService;
+use App\Services\ConfigService;
 use App\Services\RedisService;
 use Illuminate\Console\Command;
 use Illuminate\Support\Facades\DB;
@@ -250,32 +252,27 @@ class SwooleTask extends Command
             }
         });
 
-        // 订单自动分账处理
-        \swoole_timer_tick(86400, function ($timer) use ($serv, &$time) { // 启用定时器,每天执行一次
+        \swoole_timer_tick(5000, function ($timer) use ($serv, &$time) { // 启用定时器,每5秒执行一次
             $date = date('Y-m-d H:i:s');
-            $orders = OrderService::make()->getRevenueOrderList();
-            if($orders){
-                foreach ($orders as $k => $item){
-                    $orderNo = isset($item['order_no'])?$item['order_no'] : '';
-                    if(!RedisService::get('caches:task:lock:order_revenue_loaded_'.$orderNo)){
-                        $taskData = [
-                            'taskName' => 'revenueOrder',
-                            'name' => "购物订单自动分账处理",
-                            'date' => date('Y-m-d'),
-                            'params'=> $item,
-                        ];
-                        $res = $serv->task($taskData);
-                        RedisService::set('caches:task:lock:order_complete_loaded_'.$k, true, rand(3,5));
-                        echo "[Task revenueOrder {$date}] 购物订单【{$orderNo}】自动分账处理结果:{$res}\n";
-                    }else{
-                        echo "[Task revenueOrder {$date}] 购物订单【{$orderNo}】自动分账处理间隔时间调用\n";
-                    }
-                }
-            }else{
-                echo "[Task revenueOrder {$date}] 暂无可自动分账的购物订单\n";
+            $updatePriceTime = ConfigService::make()->getConfigByCode('update_price_time','');
+            $updatePriceTime = $updatePriceTime? $updatePriceTime : '00:00';
+            $updatePriceTime = strtotime("Y-m-d {$updatePriceTime}");
+            $updatePriceDate = date("Y-m-d H:i",$updatePriceTime);
+            $updatePriceEndDate = date("Y-m-d H:i",$updatePriceTime+300);
+            $currentTime = time();
+            if($currentTime < $updatePriceTime || $currentTime > $updatePriceTime + 300){
+                echo "[Task updatePrice {$date}] 未在更新时间[{$updatePriceDate}~{$updatePriceEndDate}]范围内\n";
+                return false;
             }
-        });
 
+            $taskData = [
+                'taskName' => 'updatePrice',
+                'name' => "更新每日数字资产价格",
+                'date' => date('Y-m-d'),
+            ];
+            $res = $serv->task($taskData);
+            echo "[Task updatePrice {$date}] 更新每日数字资产价格处理结果:{$res}\n";
+        });
     }
 
     //监听连接进入事件
@@ -326,23 +323,15 @@ class SwooleTask extends Command
                         echo "[Task {$taskName} {$date}][{$task_id}] 购物订单【{$orderNo}】自动收货处理结果:{$error}\n";
                     }
                     break;
-                case 'revenueOrder': // 自动分账
-                    $orderId = isset($params['id'])? $params['id'] : 0;
-                    $orderNo = isset($params['order_no'])? $params['order_no'] : '';
-                    $userId = isset($params['user_id'])? $params['user_id'] : 0;
-                    if($orderId<=0 || $userId<=0){
-                        echo "[Task {$taskName} {$date}][{$task_id}] 该购物订单参数错误\n";
-                        return false;
-                    }
-
+                case 'updatePrice': // 更新每日数字资产价格
                     // 调用处理
-                    if($res = OrderService::make()->revenue($orderId)){
+                    if($res = PriceService::make()->updatePrice(1)){
                         $res = is_array($res) && $res? json_encode($res, 256) : 'success';
-                        echo "[Task {$taskName} {$date}][{$task_id}] 购物订单【{$orderNo}】自动分账处理结果:{$res}\n";
+                        echo "[Task {$taskName} {$date}][{$task_id}] 更新每日数字资产价格处理结果:{$res}\n";
                     }else{
-                        $error = OrderService::make()->getError();
+                        $error = PriceService::make()->getError();
                         $error = $error? lang($error) : 'failed';
-                        echo "[Task {$taskName} {$date}][{$task_id}] 购物订单【{$orderNo}】自动分账处理结果:{$error}\n";
+                        echo "[Task {$taskName} {$date}][{$task_id}] 更新每日数字资产价格处理结果:{$error}\n";
                     }
                     break;
             }

+ 1 - 2
app/Http/Controllers/Admin/IndexController.php

@@ -106,8 +106,7 @@ class IndexController extends Backend
         RedisService::keyDel("caches:articles*");
         RedisService::keyDel("caches:member*");
         RedisService::keyDel("caches:config*");
-        RedisService::keyDel("caches:supervisors*");
-        RedisService::keyDel("caches:meeting*");
+        RedisService::keyDel("caches:prices*");
         RedisService::keyDel("caches:stores*");
         RedisService::keyDel("caches:order*");
         RedisService::keyDel(env('APP_NAME') . "_cache:*");

+ 4 - 2
app/Http/Controllers/Api/v1/TestController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers\Api\v1;
 use App\Http\Controllers\Api\webApp;
 use App\Services\Api\MemberService;
 use App\Services\Api\OrderService;
+use App\Services\Api\PriceService;
 use App\Services\MpService;
 
 /**
@@ -18,9 +19,10 @@ class TestController extends webApp
 
     public function check()
     {
-        $result = MemberService::make()->getPointParentId(1002);
+        echo 666;;
+        $result = PriceService::make()->updatePrice(1);
 dump($result);
-        return showJson('操作成功', true, $result);
+        return showJson(PriceService::make()->getError(), true, $result);
     }
 
 

+ 138 - 0
app/Models/OrderCommissionModel.php

@@ -21,4 +21,142 @@ class OrderCommissionModel extends BaseModel
 {
     // 设置数据表
     protected $table = 'orders_commissions';
+
+    //
+    public function getDirectBonusAttribute($value)
+    {
+        $value = $value ? json_encode($value,true) : [];
+        return $value;
+    }
+
+    public function getBonus1DataAttribute($value)
+    {
+        $value = $value ? json_encode($value,true) : [];
+        return $value;
+    }
+
+
+    public function getBonus2DataAttribute($value)
+    {
+        $value = $value ? json_encode($value,true) : [];
+        return $value;
+    }
+
+
+    public function getBonus3DataAttribute($value)
+    {
+        $value = $value ? json_encode($value,true) : [];
+        return $value;
+    }
+
+
+    public function getBonus4DataAttribute($value)
+    {
+        $value = $value ? json_encode($value,true) : [];
+        return $value;
+    }
+
+    public function getBonus5DataAttribute($value)
+    {
+        $value = $value ? json_encode($value,true) : [];
+        return $value;
+    }
+
+    public function getBonus6DataAttribute($value)
+    {
+        $value = $value ? json_encode($value,true) : [];
+        return $value;
+    }
+
+
+    /**
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function bonusUser1()
+    {
+        return $this->hasOne(MemberModel::class,'id','bonus_1_uid')
+            ->where(['mark'=>1])
+            ->select(['id','openid','balance','mobile','nickname','property','ls_score','status']);
+    }
+
+    /**
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function bonusUser2()
+    {
+        return $this->hasOne(MemberModel::class,'id','bonus_2_uid')
+            ->where(['mark'=>1])
+            ->select(['id','openid','balance','mobile','nickname','property','ls_score','status']);
+    }
+
+
+    /**
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function bonusUser3()
+    {
+        return $this->hasOne(MemberModel::class,'id','bonus_3_uid')
+            ->where(['mark'=>1])
+            ->select(['id','openid','balance','mobile','nickname','property','ls_score','status']);
+    }
+
+    /**
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function bonusUser4()
+    {
+        return $this->hasOne(MemberModel::class,'id','bonus_4_uid')
+            ->where(['mark'=>1])
+            ->select(['id','openid','balance','mobile','nickname','property','ls_score','status']);
+    }
+
+    /**
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function bonusUser5()
+    {
+        return $this->hasOne(MemberModel::class,'id','bonus_5_uid')
+            ->where(['mark'=>1])
+            ->select(['id','openid','balance','mobile','nickname','property','ls_score','status']);
+    }
+
+    /**
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function bonusUser6()
+    {
+        return $this->hasOne(MemberModel::class,'id','bonus_6_uid')
+            ->where(['mark'=>1])
+            ->select(['id','openid','balance','mobile','nickname','property','ls_score','status']);
+    }
+
+    /**
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function directUser()
+    {
+        return $this->hasOne(MemberModel::class,'id','direct_uid')
+            ->where(['mark'=>1])
+            ->select(['id','openid','balance','mobile','nickname','property','ls_score','status']);
+    }
+
+    /**
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function user()
+    {
+        return $this->hasOne(MemberModel::class,'id','user_id')
+            ->where(['mark'=>1])
+            ->select(['id','openid','balance','mobile','nickname','property','ls_score','status']);
+    }
+
+    /**
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function store()
+    {
+        return $this->hasOne(StoreModel::class,'id','store_id')
+            ->where(['mark'=>1])
+            ->select(['id','user_id','balance','mobile','name','status']);
+    }
 }

+ 2 - 1
app/Models/OrderModel.php

@@ -73,7 +73,8 @@ class OrderModel extends BaseModel
      */
     public function commission()
     {
-        return $this->hasOne(OrderCommissionModel::class, 'order_no', 'order_no');
+        return $this->hasOne(OrderCommissionModel::class, 'order_no', 'order_no')
+            ->with(['user','store','directUser']);
     }
 
 

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

@@ -459,7 +459,7 @@ class MemberService extends BaseService
         }
 
         $info = $this->model->where(['id' => $userId, 'mark' => 1])
-            ->select(['id', 'openid', 'mobile','area_id','buy_type', 'user_type', 'nickname', 'avatar', 'code', 'status', 'mark'])
+            ->select(['id', 'openid', 'mobile','balance','property','ls_score','area_id','buy_type', 'user_type', 'nickname', 'avatar', 'code', 'status', 'mark'])
             ->first();
         $info = $info?$info->toArray() : [];
         if($info){

+ 127 - 0
app/Services/Api/PriceService.php

@@ -11,10 +11,14 @@
 
 namespace App\Services\Api;
 
+use App\Models\AccountLogModel;
+use App\Models\MemberModel;
 use App\Models\NoticeModel;
 use App\Models\PriceModel;
+use App\Models\PtAccountModel;
 use App\Services\BaseService;
 use App\Services\RedisService;
+use Illuminate\Support\Facades\DB;
 
 /**
  * 价格服务-服务类
@@ -76,8 +80,131 @@ class PriceService extends BaseService
         return floatval($price);
     }
 
+    /**
+     * 是否已经更新过
+     * @param $date
+     * @param int $type
+     * @return array|bool
+     */
+    public function getPriceData($date,$type=1)
+    {
+        $cacheKey = "caches:prices:data_{$type}_{$date}";
+        if(RedisService::get($cacheKey)){
+            return true;
+        }
+
+        $data = $this->model->where(['date'=>$date,'type'=>$type,'status'=>1,'mark'=>1])
+            ->orderBy('date','desc')
+            ->first();
+        $data = $data?$data->toArray() : [];
+        $price = isset($data['price'])?$data['price']: '0.00';
+        if($data && $price){
+            RedisService::set($cacheKey, $data, rand(300,600));
+        }
+
+        return $data;
+    }
+
+    /**
+     * 更新价格
+     * @param int $type 1-资产
+     * @return array|false
+     */
     public function updatePrice($type=1)
     {
+        if($type==1){
+            $date = date('Y-m-d', strtotime(date('Y-m-d')) - 86400);
+            $lastDate = date('Y-m-d', strtotime($date) - 86400);
+            $cacheKey = "caches:prices:update_{$type}:".$date;
+            if(RedisService::get($cacheKey)){
+                $this->error = '价格已更新';
+                return false;
+            }
+
+            // 是否已经更新过
+            if($this->getPriceData($date, $type)){
+                $this->error = '价格已更新';
+                return false;
+            }
+
+            // 平台账户
+            $ptAccount = PtAccountModel::where(['mark'=>1])->first();
+            $accountId = isset($ptAccount['id'])?$ptAccount['id'] : 0;
+            if(empty($ptAccount) || $accountId<=0){
+                $ptAccount = ['balance'=>0,'property'=>10000,'pool_total'=>100,'create_time'=>time()];
+                $accountId = PtAccountModel::insertGetId($ptAccount);
+            }
+
+            // 昨日价格
+            $lastPriceData = $this->getPriceData($lastDate, $type);
+
+            // 昨日全网资产
+            $lastPropertyTotal = isset($ptAccount['last_property'])?$ptAccount['last_property']:0;
+            $ptProperty = isset($ptAccount['pt_property'])?$ptAccount['pt_property']:0; // 平台初始资产
+
+            // 今日新增资产
+            $todayProperty = AccountLogModel::where(['date'=>$date,'type'=>8,'account_type'=>2,'mark'=>1])->sum('money');
+            if($todayProperty>=0 && $lastPropertyTotal>0){
+                // 当日全网资产衰减后
+                $propertyTotalByReduce = moneyFormat($lastPropertyTotal * 0.99,6);
+
+                // 当日全网总资产
+                $todayPropertyTotal = moneyFormat($propertyTotalByReduce + $todayProperty, 6);
+            }else{
+                // 当日全网总资产
+                $todayPropertyTotal = $ptProperty;
+            }
+
+
+            // 平台底池总金额
+            $poolTotal = isset($ptAccount['pool_total'])?$ptAccount['pool_total']:0;
+            $todayPoolTotal = isset($ptAccount['today_pool'])?$ptAccount['today_pool']:0;
+
+            // 当日价格
+            $price = moneyFormat($poolTotal/$todayPropertyTotal, 6);
+            if($price>0){
+                $data = [
+                    'type'=>$type,
+                    'price'=> $price,
+                    'last_price'=> isset($lastPriceData['price'])?$lastPriceData['price'] : 0,
+                    'pool_total'=>$poolTotal,
+                    'today_pool'=>$todayPoolTotal,
+                    'last_property'=>$lastPropertyTotal,
+                    'today_property'=>$todayProperty,
+                    'date'=>$date,
+                    'create_time'=>time(),
+                    'status'=>1,
+                ];
+
+                DB::beginTransaction();
+                if(!$logId = $this->model->insertGetId($data)){
+                    DB::rollBack();
+                    $this->error = '更新资产价格失败';
+                    return false;
+                }
+
+                $updateData = [
+                    'property_price'=> $price,
+                    'last_property'=> $lastPropertyTotal,
+                    'today_property'=> 0,
+                    'today_pool'=> 0,
+                    'update_time'=>time()
+                ];
+                if(PtAccountModel::where(['id'=>$accountId])->update($updateData)){
+                    DB::rollBack();
+                    $this->error = '更新平台账户数据失败';
+                    return false;
+                }
+
+                $data['id'] = $logId;
+                RedisService::set($cacheKey, $data, 600);
+                RedisService::clear("caches:prices:data_{$type}_{$date}");
+                $this->error = '更新资产价格成功';
+                return ['date'=>$date,'price'=>$price,'pool_total'=>$poolTotal,'property'=>$todayPropertyTotal];
+            }
+        }
 
+        $this->error = '更新资产价格失败';
+        return false;
     }
 }

+ 361 - 11
app/Services/Api/SettleService.php

@@ -16,6 +16,8 @@ use App\Models\CouponModel;
 use App\Models\MemberCouponModel;
 use App\Models\MemberModel;
 use App\Models\OrderCommissionModel;
+use App\Models\OrderModel;
+use App\Models\PtAccountModel;
 use App\Models\StoreModel;
 use App\Services\BaseService;
 use App\Services\Common\MemberLevelService;
@@ -106,16 +108,6 @@ class SettleService extends BaseService
         return $result;
     }
 
-    public function businessBonus($userId, $total, $commission, $order)
-    {
-
-    }
-
-    public function shopBonus($userId, $total, $commission, $order)
-    {
-
-    }
-
     /**
      * @param $order
      * @param int $orderType
@@ -244,7 +236,10 @@ class SettleService extends BaseService
                     if($profitTotal>0 && $lsScoreRate>0){
                         $lsScoreTotal += moneyFormat($profitTotal * $lsScoreRate/100,2);
                     }
-                    $data['ls_score_rates'][$goods['goods_id']] = $lsScoreRate;
+                    $data['ls_score_rates'][$goods['goods_id']] = [
+                        'goods_id'=> $goods['goods_id'],
+                        'score'=>$lsScoreRate
+                    ];
                 }
             }
             $data['ls_score'] = $lsScoreTotal;
@@ -276,6 +271,351 @@ class SettleService extends BaseService
         return $data;
     }
 
+    public function commissionSettle($orderId)
+    {
+        $info = OrderModel::with(['commission'])
+            ->where(['id'=>$orderId,'mark'=>1])
+            ->select(['id','order_no','type','user_id','total','pay_total','bd_score','pay_status','status','refund_status'])
+            ->first();
+        if(empty($info)){
+            $this->error = '结算订单不存在';
+            return false;
+        }
+
+        if($info['status']<=1 || $info['pay_status'] == 10){
+            $this->error = '订单未支付';
+            return false;
+        }
+
+        if(in_array($info['refund_status'],[1,2,3])){
+            $this->error = '订单已退款';
+            return false;
+        }
+
+        $orderType = isset($info['type'])?$info['type'] : 1;
+        $orderNo = isset($info['order_no'])?$info['order_no'] : '';
+        $orderUserId = isset($info['user_id'])?$info['user_id'] : 0;
+        $commission = isset($info['commission'])?$info['commission'] : [];
+        $commissionId = isset($commission['id'])?$commission['id'] : 0;
+        if(empty($commission) || $commissionId<=0){
+            $this->error = '结算订单收益参数错误';
+            return false;
+        }
+
+        if($commission['status'] == 1){
+            $this->error = '订单收益已结算';
+            return false;
+        }
+
+        $cacheKey = "caches:ordersCommission:{$orderNo}_{$orderUserId}:";
+        if(RedisService::get("{$cacheKey}lock")){
+            $this->error = '订单结算中';
+            return false;
+        }
+
+        //  创业订单
+        $logs = [];
+        RedisService::set("{$cacheKey}lock", $info, 300);
+        DB::beginTransaction();
+        if($orderType == 2){
+            // TODO 结算直推奖
+            $directData = isset($commission['direct_bonus'])? $commission['direct_bonus'] : [];
+            $directUserId = isset($commission['direct_uid'])? $commission['direct_uid'] : 0;
+            $directBonus = isset($directData['bonus'])? $directData['bonus'] : 0;
+            if($directUserId>0 && $directBonus>0){
+                $directUser = isset($commission['direct_user'])? $commission['direct_user'] : [];
+                $directUserBalance = isset($directUser['balance'])?$directUser['balance'] : 0;
+                if($directUser){
+                    $updateData = [
+                        'balance'=>DB::raw("balance + {$directBonus}"),
+                        'bonus_total'=>DB::raw("bonus_total + {$directBonus}"),
+                        'update_time'=>time()
+                    ];
+                    if(!MemberModel::where(['id'=>$directUserId])->update($updateData)){
+                        DB::rollBack();
+                        $this->error = '直推奖励结算错误';
+                        return false;
+                    }
+
+                    $data = [
+                        'user_id'=> $directUserId,
+                        'source_order_no'=> $orderNo,
+                        'user_type'=> 1,
+                        'account_type'=> 1, // 余额
+                        'type'=> 8,
+                        'bonus_type'=> 1,
+                        'money'=> $directBonus,
+                        'after_money'=>moneyFormat($directUserBalance + $directBonus,2),
+                        'date'=>date('Y-m-d'),
+                        'create_time'=>time(),
+                        'remark'=> '直推奖',
+                        'remark1'=> "用户ID:{$orderUserId}购买礼包直推奖励",
+                        'status'=>1,
+                        'mark'=>1
+                    ];
+
+                    $logs[] = $data;
+                }
+            }
+
+            // TODO 结算见单奖+分红
+            $bonusUids = [];
+            for($i=1; $i<=6; $i++){
+                $uid = isset($commission["bonus_{$i}_uid"])? $commission["bonus_{$i}_uid"]:0;
+                if($uid){
+                    $bonusUids[] = $uid;
+                }
+            }
+
+            $bonusUsers = MemberModel::whereIn('id', $bonusUids)
+                ->select(['id','openid','balance','mobile','nickname','property','ls_score','status'])
+                ->get()
+                ->keyBy('id');
+            $bonusUsers = $bonusUsers? $bonusUsers->toArray() : [];
+            for($i=1; $i<=6; $i++){
+               $uid = isset($commission["bonus_{$i}_uid"])? $commission["bonus_{$i}_uid"]:0;
+               $bonusData = isset($commission["bonus_{$i}_data"])? $commission["bonus_{$i}_data"]:0;
+               $jdBonus = isset($bonusData['jd_bonus'])?$bonusData['jd_bonus']:0;
+               $levelBonus = isset($bonusData['level_bonus'])?$bonusData['level_bonus']:0;
+               $bonusUser = isset($bonusUsers[$uid])?$bonusUsers[$uid] : [];
+               $bonusUserBalance = isset($bonusUser['balance'])?$bonusUser['balance'] : 0;
+               $bonusTotal = moneyFormat($jdBonus + $levelBonus,2);
+               if($uid && $bonusUser && $bonusTotal>0){
+                   $updateData = [
+                       'balance'=>DB::raw("balance + {$bonusTotal}"),
+                       'bonus_total'=>DB::raw("bonus_total + {$bonusTotal}"),
+                       'update_time'=>time()
+                   ];
+                   if(!MemberModel::where(['id'=> $uid])->update($updateData)){
+                       DB::rollBack();
+                       $this->error = '见单和分红奖励结算错误';
+                       return false;
+                   }
+
+                   if($jdBonus>0){
+                       $bonusUserBalance = moneyFormat($bonusUserBalance + $jdBonus,2);
+                       $data = [
+                           'user_id'=> $uid,
+                           'source_order_no'=> $orderNo,
+                           'user_type'=> 1,
+                           'account_type'=> 1, // 余额
+                           'type'=> 8,
+                           'bonus_type'=> 2,
+                           'money'=> $jdBonus,
+                           'after_money'=> $bonusUserBalance,
+                           'date'=>date('Y-m-d'),
+                           'create_time'=>time()+$i,
+                           'remark'=> '见单奖',
+                           'remark1'=> "下{$i}级用户ID:{$orderUserId}购买礼包见单奖",
+                           'status'=>1,
+                           'mark'=>1
+                       ];
+
+                       $logs[] = $data;
+                   }
+
+                   if($levelBonus>0){
+                       $bonusUserBalance = moneyFormat($bonusUserBalance + $levelBonus,2);
+                       $data = [
+                           'user_id'=> $uid,
+                           'source_order_no'=> $orderNo,
+                           'user_type'=> 1,
+                           'account_type'=> 1, // 余额
+                           'type'=> 8,
+                           'bonus_type'=> 3,
+                           'money'=> $levelBonus,
+                           'after_money'=> $bonusUserBalance,
+                           'date'=>date('Y-m-d'),
+                           'create_time'=>time()+$i,
+                           'remark'=> '分红收益',
+                           'remark1'=> "下{$i}级用户ID:{$orderUserId}购买礼包分红收益",
+                           'status'=>1,
+                           'mark'=>1
+                       ];
+
+                       $logs[] = $data;
+                   }
+               }
+            }
+        }
+        // 商城订单
+        else {
+            // TODO 商家结算
+            $storeInfo = isset($commission['store'])?$commission['store'] : [];
+            $storeId = isset($commission['store_id'])?$commission['store_id'] : 0;
+            $storeBonus = isset($commission['bonus'])?$commission['bonus'] : 0;
+            $storeUserId = isset($storeInfo['user_id'])?$storeInfo['user_id'] : 0;
+            $storeBalance = isset($storeInfo['balance'])?$storeInfo['balance'] : 0;
+            if($storeId>0 && $storeInfo && $storeBonus>0){
+                $updateData = [
+                    'balance'=>DB::raw("balance + {$storeBonus}"),
+                    'income'=>DB::raw("income + {$storeBonus}"),
+                    'update_time'=>time()
+                ];
+                if(!StoreModel::where(['id'=> $storeId])->update($updateData)){
+                    DB::rollBack();
+                    $this->error = '商家提成结算失败';
+                    return false;
+                }
+
+                $storeBalance = moneyFormat($storeBalance + $storeBonus,2);
+                $data = [
+                    'user_id'=> $storeUserId,
+                    'store_id'=> $storeId,
+                    'source_order_no'=> $orderNo,
+                    'user_type'=> 2,
+                    'account_type'=> 1, // 余额
+                    'type'=> 7,
+                    'bonus_type'=> 0,
+                    'money'=> $storeBonus,
+                    'after_money'=> $storeBalance,
+                    'date'=>date('Y-m-d'),
+                    'create_time'=>time(),
+                    'remark'=> '商家提成结算',
+                    'remark1'=> "用户ID:{$orderUserId}购买商品提成结算",
+                    'status'=>1,
+                    'mark'=>1
+                ];
+
+                $logs[] = $data;
+            }
+
+            // TODO 绿色积分结算
+            $userInfo = isset($commission['user'])?$commission['user']:[];
+            $userId = isset($commission['user_id'])?$commission['user_id']:0;
+            $userLsScore = isset($userInfo['ls_score'])?$userInfo['ls_score']:0;
+            $lsScore = isset($commission['ls_score'])?$commission['ls_score']:0;
+            if($userId>0 && $userInfo && $lsScore>0){
+                $updateData = [
+                    'ls_score'=>DB::raw("ls_score + {$lsScore}"),
+                    'ls_score_total'=>DB::raw("ls_score_total + {$lsScore}"),
+                    'update_time'=>time()
+                ];
+                if(!MemberModel::where(['id'=>$userId])->update($updateData)){
+                    DB::rollBack();
+                    $this->error = '绿色积分奖励结算错误';
+                    return false;
+                }
+
+                $data = [
+                    'user_id'=> $userId,
+                    'source_order_no'=> $orderNo,
+                    'user_type'=> 1,
+                    'account_type'=> 4, // 绿色积分
+                    'type'=> 8,
+                    'bonus_type'=> 4,
+                    'money'=> $lsScore,
+                    'after_money'=>moneyFormat($userLsScore + $lsScore,2),
+                    'date'=>date('Y-m-d'),
+                    'create_time'=>time(),
+                    'remark'=> '绿色积分奖励',
+                    'remark1'=> "用户ID:{$orderUserId}购买商品绿色积分奖励",
+                    'status'=>1,
+                    'mark'=>1
+                ];
+
+                $logs[] = $data;
+            }
+
+
+            // TODO 数字资产和底池
+            $property = isset($commission['property'])?$commission['property']:0;
+            $userProperty = isset($userInfo['property'])?$userInfo['property']:0;
+            if($userId>0 && $userInfo && $property>0){
+                $updateData = [
+                    'property'=>DB::raw("property + {$property}"),
+                    'property_total'=>DB::raw("property_total + {$property}"),
+                    'update_time'=>time()
+                ];
+                if(!MemberModel::where(['id'=>$userId])->update($updateData)){
+                    DB::rollBack();
+                    $this->error = '数字资产奖励结算错误';
+                    return false;
+                }
+
+                $data = [
+                    'user_id'=> $userId,
+                    'source_order_no'=> $orderNo,
+                    'user_type'=> 1,
+                    'account_type'=> 2, // 数字资产
+                    'type'=> 8,
+                    'bonus_type'=> 5,
+                    'money'=> $property,
+                    'after_money'=>moneyFormat($userProperty + $property,2),
+                    'date'=>date('Y-m-d'),
+                    'create_time'=>time(),
+                    'remark'=> '数字资产奖励',
+                    'remark1'=> "用户ID:{$orderUserId}购买商品数字资产奖励",
+                    'status'=>1,
+                    'mark'=>1
+                ];
+
+                $logs[] = $data;
+            }
+
+            // 平台底池结算
+            $ptAccount = PtAccountModel::where(['mark'=>1])->first();
+            $accountId = isset($ptAccount['id'])?$ptAccount['id'] : 0;
+            $poolTotal = isset($ptAccount['pool_total'])?$ptAccount['pool_total'] : 0;
+            $ptPool = isset($commission['pt_pool'])?$commission['pt_pool'] : 0;
+            if($ptAccount && ($ptPool>0 || $property>0)){
+                $updateData = [
+                    'pool_total'=>DB::raw("pool_total + {$ptPool}"),
+                    'today_pool'=>DB::raw("today_pool + {$ptPool}"),
+                    'today_property'=>DB::raw("today_property + {$property}"),
+                    'update_time'=>time()
+                ];
+                if(!PtAccountModel::where(['id'=>$accountId])->update($updateData)){
+                    DB::rollBack();
+                    $this->error = '平台底池和资产结算错误';
+                    return false;
+                }
+
+                // 底池明细
+                if($ptPool>0){
+                    $data = [
+                        'user_id'=> 0,
+                        'source_order_no'=> $orderNo,
+                        'user_type'=> 0,
+                        'account_type'=> 5, // 平台账户
+                        'type'=> 10,
+                        'bonus_type'=> 6,
+                        'money'=> $ptPool,
+                        'after_money'=>moneyFormat($poolTotal + $ptPool,2),
+                        'date'=>date('Y-m-d'),
+                        'create_time'=>time(),
+                        'remark'=> '返回底池',
+                        'remark1'=> "用户ID:{$orderUserId}购买商品返回底池",
+                        'status'=>1,
+                        'mark'=>1
+                    ];
+
+                    $logs[] = $data;
+                }
+            }
+        }
+
+        // TODO 明细入表
+        RedisService::set("{$cacheKey}logs", $logs, 3600);
+        if($logs && !AccountLogModel::insert($logs)){
+            DB::rollBack();
+            $this->error = '奖励明细结算处理错误';
+            return false;
+        }
+
+        // 订单结算状态更新
+        if(!OrderCommissionModel::where(['id'=>$commissionId])->update(['status'=>1,'arrival_at'=>date('Y-m-d H:i:s'),'update_time'=>time()])){
+            DB::rollBack();
+            $this->error = '订单结算状态更新失败';
+            return false;
+        }
+
+        DB::commit();
+        $this->error = '订单结算完成';
+        RedisService::set("{$cacheKey}result", $info, 3600);
+        return ['id'=>$orderId,'user_id'=>$orderUserId,'commission'=>$commission];
+    }
+
     /**
      * 新人注册奖励
      * @param $userId
@@ -330,3 +670,13 @@ class SettleService extends BaseService
         return $data;
     }
 }
+
+
+
+
+
+
+
+
+
+

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

@@ -15,6 +15,7 @@ use App\Models\AccountLogModel;
 use App\Models\ActionLogModel;
 use App\Models\MemberModel;
 use App\Models\OrderModel;
+use App\Services\Api\SettleService;
 use App\Services\BaseService;
 use App\Services\MpService;
 use App\Services\RedisService;
@@ -387,6 +388,10 @@ class OrderService extends BaseService
         $result = $this->model->where('id', $id)->update($updateData);
 
         if ($result) {
+
+            // 订单支付成功结算
+            SettleService::make()->commissionSettle($id);
+
             ActionLogModel::setTitle("订单完成支付");
             ActionLogModel::record();
             RedisService::keyDel("caches:orders:*");

+ 5 - 5
app/Services/PaymentService.php

@@ -15,6 +15,7 @@ use App\Models\AccountLogModel;
 use App\Models\AccountStatisticsModel;
 use App\Models\OrderModel;
 use App\Models\PaymentModel;
+use App\Services\Api\SettleService;
 use Illuminate\Support\Facades\DB;
 use Yansongda\Pay\Pay;
 use Yansongda\Pay\Plugin\Wechat\Fund\Profitsharing\AddReceiverPlugin;
@@ -558,12 +559,11 @@ class PaymentService extends BaseService
             $this->saveLog("caches:payments:notify_{$scene}:catch_{$orderNo}_{$orderUserId}", ['order' => $orderInfo, 'notify' => $data]);
             switch ($scene) {
                 case 'store': //
-                    $userInfo = isset($orderInfo['user'])?$orderInfo['user']:[];
+                    $orderId = isset($orderInfo['id'])?$orderInfo['id']:0;
                     $orderGoods = isset($orderInfo['orderGoods'])?$orderInfo['orderGoods']:[];
-                    $bdScore = isset($userInfo['bd_score'])? $userInfo['bd_score'] : 0;
-                    $goodsName = isset($orderGoods[0]['goods_name'])?$orderGoods[0]['goods_name']:'';
-                    $orderType = isset($orderInfo['type']) ? $orderInfo['type'] : 0;
-                    $orderBdScore = isset($orderInfo['bd_score']) ? $orderInfo['bd_score'] : 0;
+
+                    // 订单支付成功结算
+                    SettleService::make()->commissionSettle($orderId);
 
                     break;
                 default:

+ 0 - 13
routes/api.php

@@ -54,8 +54,6 @@ Route::prefix('v1')->middleware('web.login')->group(function() {
     // 配置和首页数据
     Route::get('/config', [\App\Http\Controllers\Api\v1\IndexController::class, 'config']);
     Route::get('/index/data', [\App\Http\Controllers\Api\v1\IndexController::class, 'data']);
-    Route::get('/index/industry', [\App\Http\Controllers\Api\v1\IndexController::class, 'industry']);
-    Route::post('/article/consult', [\App\Http\Controllers\Api\v1\ArticleController::class, 'consult']);
 
 
     // 用户信息
@@ -114,17 +112,6 @@ Route::prefix('v1')->middleware('web.login')->group(function() {
     Route::post('/address/save', [\App\Http\Controllers\Api\v1\AddressController::class, 'save']);
     Route::post('/address/delete', [\App\Http\Controllers\Api\v1\AddressController::class, 'delete']);
 
-    // 导师
-    Route::post('/supervisor/consult', [\App\Http\Controllers\Api\v1\SupervisorsController::class, 'consult']);
-
-    // 会议
-    Route::post('/meeting/index', [\App\Http\Controllers\Api\v1\MeetingController::class, 'index']);
-    Route::post('/meeting/info', [\App\Http\Controllers\Api\v1\MeetingController::class, 'info']);
-    Route::post('/meeting/getLink', [\App\Http\Controllers\Api\v1\MeetingController::class, 'getLink']);
-    Route::post('/meeting/books', [\App\Http\Controllers\Api\v1\MeetingController::class, 'books']);
-    Route::post('/meeting/record/list', [\App\Http\Controllers\Api\v1\MeetingController::class, 'records']);
-
-
     // 举报
     Route::post('/complaint/submit', [\App\Http\Controllers\Api\v1\ComplaintController::class, 'submit']);