'json', 'created_at' => 'timestamp', 'updated_at' => 'timestamp' ]; protected $json = ['config']; /** * 关联佣金规则 */ public function rules() { return $this->hasMany('CommissionRules', 'goods_id', 'goods_id') ->where('status', 1) ->order('agent_level asc, level asc'); } /** * 获取商品分销配置 * @return array|null */ public function getCommissionConfig() { if ($this->rule_type === self::RULE_TYPE_CUSTOM && !empty($this->config)) { return $this->config; } return null; } /** * 获取商品佣金规则 * @param int $skuId SKU ID * @return array */ public function getCommissionRules($skuId = 0) { if ($this->rule_type === self::RULE_TYPE_DEFAULT) { return false; // 使用默认规则 } $query = $this->rules(); if ($this->rule_type === self::RULE_TYPE_CUSTOM) { // 独立规则:查询指定SKU的规则 $query->where('sku_id', $skuId); } else { // 批量规则:查询通用规则 $query->where('sku_id', 0); } $rules = $query->select(); if ($rules->isEmpty()) { return false; } // 转换为嵌套数组格式 $result = []; foreach ($rules as $rule) { $result[$rule['agent_level']][$rule['level']] = [ 'type' => $rule['type'], 'value' => $rule['value'], 'rate' => $rule['type'] === 'rate' ? $rule['value'] : '', 'money' => $rule['type'] === 'money' ? $rule['value'] : '' ]; } return $result; } /** * 获取指定层级的佣金规则 * @param int $agentLevel 分销商等级 * @param int $commissionLevel 分销层级 * @param int $skuId SKU ID * @return array|false */ public function getCommissionLevelRule($agentLevel, $commissionLevel, $skuId = 0) { $rules = $this->getCommissionRules($skuId); if ($rules && isset($rules[$agentLevel][$commissionLevel])) { return $rules[$agentLevel][$commissionLevel]; } return false; } /** * 计算佣金 * @param array $rule 佣金规则 * @param string $amount 结算金额 * @param int $quantity 商品数量 * @return string */ public function calculateCommission($rule, $amount, $quantity = 1) { if (empty($rule) || !isset($rule['type'], $rule['value'])) { return '0.00'; } if ($rule['type'] === 'rate' && bccomp($rule['value'], '0', 4) > 0) { // 比例佣金:金额 * 比例 / 100 return bcmul( bcmul($amount, $rule['value'], 4), '0.01', 2 ); } if ($rule['type'] === 'money' && bccomp($rule['value'], '0', 2) > 0) { // 固定金额:金额 * 数量 return bcmul($rule['value'], $quantity, 2); } return '0.00'; } /** * 设置商品佣金规则 * @param array $rulesData 规则数据 * @param int $skuId SKU ID * @return bool */ public function setCommissionRules($rulesData, $skuId = 0) { // 删除现有规则 CommissionRules::where([ 'goods_id' => $this->goods_id, 'sku_id' => $skuId ])->delete(); // 批量插入新规则 $insertData = []; foreach ($rulesData as $agentLevel => $levelRules) { foreach ($levelRules as $level => $rule) { if (!empty($rule['value']) && bccomp($rule['value'], '0', 4) > 0) { $insertData[] = [ 'goods_id' => $this->goods_id, 'sku_id' => $skuId, 'agent_level' => $agentLevel, 'level' => $level, 'type' => $rule['type'], 'value' => $rule['value'], 'status' => 1 ]; } } } if (!empty($insertData)) { return CommissionRules::insertAll($insertData); } return true; } /** * 检查商品是否参与分销 * @return bool */ public function isCommissionEnabled() { return $this->status === self::STATUS_ENABLED; } /** * 检查是否计入业绩 * @return bool */ public function isOrderStatusEnabled() { return $this->order_status === 1; } }