From 04102f7237efefa744090ed7c25f7b5d0807b679 Mon Sep 17 00:00:00 2001
From: quanwei <419654421@qq.com>
Date: Thu, 05 Feb 2026 18:11:57 +0800
Subject: [PATCH] 完成运营中心提现和运营中心权限管理

---
 admin/app/common/model/plus/operations/Order.php |  178 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 178 insertions(+), 0 deletions(-)

diff --git a/admin/app/common/model/plus/operations/Order.php b/admin/app/common/model/plus/operations/Order.php
new file mode 100644
index 0000000..9e0c29e
--- /dev/null
+++ b/admin/app/common/model/plus/operations/Order.php
@@ -0,0 +1,178 @@
+<?php
+
+namespace app\common\model\plus\operations;
+use app\common\enum\order\OrderTypeEnum;
+use app\common\model\BaseModel;
+use app\common\model\settings\Setting as SettingModel;
+use app\common\model\plus\operations\Operations as OperationsModel;
+/**
+ * 运营中心订单管理
+ */
+class Order extends BaseModel
+{
+    protected $name="operations_order";
+
+    /**
+     * 订单所属用户
+     * @return \think\model\relation\BelongsTo
+     */
+    public function user()
+    {
+        return $this->belongsTo('app\common\model\user\User');
+    }
+
+    /**
+     * 一级分销商用户
+     * @return \think\model\relation\BelongsTo
+     */
+    public function agentFirst()
+    {
+        return $this->belongsTo('app\common\model\user\User', 'first_user_id');
+    }
+
+    /**
+     * 二级分销商用户
+     * @return \think\model\relation\BelongsTo
+     */
+    public function agentSecond()
+    {
+        return $this->belongsTo('app\common\model\user\User', 'second_user_id');
+    }
+
+    /**
+     * 三级分销商用户
+     * @return \think\model\relation\BelongsTo
+     */
+    public function agentThird()
+    {
+        return $this->belongsTo('app\common\model\user\User', 'third_user_id');
+    }
+
+    /**
+     * 订单类型
+     * @param $value
+     * @return array
+     */
+    public function getOrderTypeAttr($value)
+    {
+        $types = OrderTypeEnum::getTypeName();
+        return ['text' => $types[$value], 'value' => $value];
+    }
+
+    /**
+     * 订单详情
+     */
+    public static function getDetailByOrderId($orderId, $orderType)
+    {
+        return (new static())->where('order_id', '=', $orderId)
+            ->where('order_type', '=', $orderType)
+            ->find();
+    }
+    public static function grantMoney($order, $orderType = OrderTypeEnum::MASTER)
+    {
+        // 订单是否已完成
+        if ($order['order_status']['value'] != 30) {
+            return false;
+        }
+        // 分销订单详情
+        $model = self::getDetailByOrderId($order['order_id'], $orderType);
+        if (!$model || $model['is_settled'] == 1) {
+            return false;
+        }
+        // 佣金结算天数
+        $settleDays = Setting::getItem('settlement', $order['app_id'])['settle_days'];
+        // 写入结算时间
+        $deadlineTime = $model['settle_end_time'];
+        if($deadlineTime == 0){
+            $deadlineTime = $order['receipt_time'] + $settleDays  * 86400;
+            $model->save([
+                'settle_end_time' => $deadlineTime
+            ]);
+        }
+        if ($deadlineTime > time()) {
+            return false;
+        }
+
+        // 重新计算分销佣金
+        $capital = $model->getCapitalByOrder($order);
+        // 发放一级分销商佣金
+        $model['first_user_id'] > 0 && OperationsModel::grantMoney($model['first_user_id'], $capital['first_money']);
+        // 发放二级分销商佣金
+        $model['second_user_id'] > 0 && OperationsModel::grantMoney($model['second_user_id'], $capital['second_money']);
+        // 发放三级分销商佣金
+        $model['third_user_id'] > 0 && OperationsModel::grantMoney($model['third_user_id'], $capital['third_money']);
+        // 更新分销订单记录
+        $model->save([
+            'order_price' => $capital['orderPrice'],
+            'first_money' => $model['first_user_id'] > 0? $capital['first_money']:0,
+            'second_money' => $model['second_user_id'] > 0? $capital['second_money']:0,
+            'third_money' => $model['third_user_id'] > 0? $capital['third_money']:0,
+            'is_settled' => 1,
+            'settle_time' => time()
+        ]);
+        event('AgentUserGrade', $model['first_user_id']);
+        event('AgentUserGrade', $model['second_user_id']);
+        event('AgentUserGrade', $model['third_user_id']);
+        // 更新队长等级 by lyzflash
+        event('TeamUserGrade', $model['first_user_id']);
+        event('TeamUserGrade', $model['second_user_id']);
+        event('TeamUserGrade', $model['third_user_id']);
+        // 更新股东等级 by lyzflash
+        event('ShareholderUserGrade', $model['first_user_id']);
+        event('ShareholderUserGrade', $model['second_user_id']);
+        event('ShareholderUserGrade', $model['third_user_id']);
+        return true;
+    }
+    /**
+     * 获取订单分销佣金数据
+     * @param $order
+     * @param string $source
+     * @param array $operations
+     * @return array
+     */
+    protected function getCapitalByOrder($order, $source = 'create',$operations=[])
+    {
+        $setting = Setting::getItem('bonus', $order['app_id']);
+        // 分销订单佣金数据
+        $capital = [
+            // 订单总金额(不含运费)
+            'orderPrice' => bcsub($order['pay_price'], $order['express_price'], 2),
+            // 一级分销佣金
+            'first_money' => 0.00,
+            // 二级分销佣金
+            'second_money' => 0.00,
+            // 三级分销佣金
+            'third_money' => 0.00,
+            // 是否记录
+            'is_record' => true
+        ];
+        $total_count = count($order['product']);
+        // 计算分销佣金
+        foreach ($order['product'] as $product) {
+            // 商品实付款金额
+            $productPrice = min($capital['orderPrice'], $product['total_pay_price']);
+            // 计算商品实际佣金
+            $productCapital = $this->calculateProductCapital($setting, $productPrice,$product);
+            // 累积分销佣金
+            $capital['first_money'] += $productCapital['first_money'];
+            $capital['second_money'] += $productCapital['second_money'];
+            $capital['third_money'] += $productCapital['third_money'];
+        }
+        return $capital;
+    }
+    /**
+     * 计算商品实际佣金 by yj
+     * @param $setting
+     * @param $productPrice
+     * @return float[]|int[]
+     */
+    private function calculateProductCapital($setting, $productPrice,$product)
+    {
+        $storeSetting=SettingModel::getItem('store', $product['app_id']);
+        $productMoney=bcmul($productPrice, bcdiv($storeSetting['commission_rate'],100,2), 2);
+        $capital['first_money'] = bcmul($productMoney, bcdiv($setting['province_ratio'],100,2), 2);
+        $capital['second_money'] = bcmul($productMoney, bcdiv($setting['city_ratio'],100,2), 2);
+        $capital['third_money'] = bcmul($productMoney, bcdiv($setting['area_ratio'],100,2), 2);
+        return $capital;
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.2