123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- <?php
- namespace app\common\model\commission;
- use think\Model;
- /**
- * 分销商品模型(全新设计)
- */
- class CommissionGoods extends Model
- {
- protected $name = 'shop_commission_goods';
- // 规则类型常量
- const RULE_TYPE_DEFAULT = 0; // 默认规则(使用分销商等级规则)
- const RULE_TYPE_CUSTOM = 1; // 独立规则(每个SKU独立设置)
- const RULE_TYPE_BATCH = 2; // 批量规则(所有SKU相同)
- // 状态常量
- const STATUS_DISABLED = 0; // 不参与分销
- const STATUS_ENABLED = 1; // 参与分销
- protected $type = [
- 'config' => '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;
- }
- }
|