CommissionGoods.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <?php
  2. namespace app\common\model\commission;
  3. use think\Model;
  4. /**
  5. * 分销商品模型(全新设计)
  6. */
  7. class CommissionGoods extends Model
  8. {
  9. protected $name = 'shop_commission_goods';
  10. // 规则类型常量
  11. const RULE_TYPE_DEFAULT = 0; // 默认规则(使用分销商等级规则)
  12. const RULE_TYPE_CUSTOM = 1; // 独立规则(每个SKU独立设置)
  13. const RULE_TYPE_BATCH = 2; // 批量规则(所有SKU相同)
  14. // 状态常量
  15. const STATUS_DISABLED = 0; // 不参与分销
  16. const STATUS_ENABLED = 1; // 参与分销
  17. protected $type = [
  18. 'config' => 'json',
  19. 'created_at' => 'timestamp',
  20. 'updated_at' => 'timestamp'
  21. ];
  22. protected $json = ['config'];
  23. /**
  24. * 关联佣金规则
  25. */
  26. public function rules()
  27. {
  28. return $this->hasMany('CommissionRules', 'goods_id', 'goods_id')
  29. ->where('status', 1)
  30. ->order('agent_level asc, level asc');
  31. }
  32. /**
  33. * 获取商品分销配置
  34. * @return array|null
  35. */
  36. public function getCommissionConfig()
  37. {
  38. if ($this->rule_type === self::RULE_TYPE_CUSTOM && !empty($this->config)) {
  39. return $this->config;
  40. }
  41. return null;
  42. }
  43. /**
  44. * 获取商品佣金规则
  45. * @param int $skuId SKU ID
  46. * @return array
  47. */
  48. public function getCommissionRules($skuId = 0)
  49. {
  50. if ($this->rule_type === self::RULE_TYPE_DEFAULT) {
  51. return false; // 使用默认规则
  52. }
  53. $query = $this->rules();
  54. if ($this->rule_type === self::RULE_TYPE_CUSTOM) {
  55. // 独立规则:查询指定SKU的规则
  56. $query->where('sku_id', $skuId);
  57. } else {
  58. // 批量规则:查询通用规则
  59. $query->where('sku_id', 0);
  60. }
  61. $rules = $query->select();
  62. if ($rules->isEmpty()) {
  63. return false;
  64. }
  65. // 转换为嵌套数组格式
  66. $result = [];
  67. foreach ($rules as $rule) {
  68. $result[$rule['agent_level']][$rule['level']] = [
  69. 'type' => $rule['type'],
  70. 'value' => $rule['value'],
  71. 'rate' => $rule['type'] === 'rate' ? $rule['value'] : '',
  72. 'money' => $rule['type'] === 'money' ? $rule['value'] : ''
  73. ];
  74. }
  75. return $result;
  76. }
  77. /**
  78. * 获取指定层级的佣金规则
  79. * @param int $agentLevel 分销商等级
  80. * @param int $commissionLevel 分销层级
  81. * @param int $skuId SKU ID
  82. * @return array|false
  83. */
  84. public function getCommissionLevelRule($agentLevel, $commissionLevel, $skuId = 0)
  85. {
  86. $rules = $this->getCommissionRules($skuId);
  87. if ($rules && isset($rules[$agentLevel][$commissionLevel])) {
  88. return $rules[$agentLevel][$commissionLevel];
  89. }
  90. return false;
  91. }
  92. /**
  93. * 计算佣金
  94. * @param array $rule 佣金规则
  95. * @param string $amount 结算金额
  96. * @param int $quantity 商品数量
  97. * @return string
  98. */
  99. public function calculateCommission($rule, $amount, $quantity = 1)
  100. {
  101. if (empty($rule) || !isset($rule['type'], $rule['value'])) {
  102. return '0.00';
  103. }
  104. if ($rule['type'] === 'rate' && bccomp($rule['value'], '0', 4) > 0) {
  105. // 比例佣金:金额 * 比例 / 100
  106. return bcmul(
  107. bcmul($amount, $rule['value'], 4),
  108. '0.01',
  109. 2
  110. );
  111. }
  112. if ($rule['type'] === 'money' && bccomp($rule['value'], '0', 2) > 0) {
  113. // 固定金额:金额 * 数量
  114. return bcmul($rule['value'], $quantity, 2);
  115. }
  116. return '0.00';
  117. }
  118. /**
  119. * 设置商品佣金规则
  120. * @param array $rulesData 规则数据
  121. * @param int $skuId SKU ID
  122. * @return bool
  123. */
  124. public function setCommissionRules($rulesData, $skuId = 0)
  125. {
  126. // 删除现有规则
  127. CommissionRules::where([
  128. 'goods_id' => $this->goods_id,
  129. 'sku_id' => $skuId
  130. ])->delete();
  131. // 批量插入新规则
  132. $insertData = [];
  133. foreach ($rulesData as $agentLevel => $levelRules) {
  134. foreach ($levelRules as $level => $rule) {
  135. if (!empty($rule['value']) && bccomp($rule['value'], '0', 4) > 0) {
  136. $insertData[] = [
  137. 'goods_id' => $this->goods_id,
  138. 'sku_id' => $skuId,
  139. 'agent_level' => $agentLevel,
  140. 'level' => $level,
  141. 'type' => $rule['type'],
  142. 'value' => $rule['value'],
  143. 'status' => 1
  144. ];
  145. }
  146. }
  147. }
  148. if (!empty($insertData)) {
  149. return CommissionRules::insertAll($insertData);
  150. }
  151. return true;
  152. }
  153. /**
  154. * 检查商品是否参与分销
  155. * @return bool
  156. */
  157. public function isCommissionEnabled()
  158. {
  159. return $this->status === self::STATUS_ENABLED;
  160. }
  161. /**
  162. * 检查是否计入业绩
  163. * @return bool
  164. */
  165. public function isOrderStatusEnabled()
  166. {
  167. return $this->order_status === 1;
  168. }
  169. }