GiveScoreService.php 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. <?php
  2. namespace backend\modules\mall\services;
  3. use yii\helpers\Json;
  4. /**
  5. * 积分赠送服务
  6. */
  7. class GiveScoreService
  8. {
  9. /**
  10. * 设置商品积分营销信息
  11. * @param $form
  12. * @return mixed
  13. */
  14. public static function setGoodsMarketing($form)
  15. {
  16. $group_goods = $form['group_order_goods'];
  17. if (empty($group_goods)) return $form;
  18. if (!isset($form['sku']) || !isset($form['total_pay_money'])) {
  19. return $form;
  20. }
  21. $total_price = self::getTotalPrice($group_goods); // 总金额
  22. foreach ($group_goods as &$item) { // 循环商品组
  23. foreach ($item['goods'] as $goods_id => $goods) {
  24. if (empty($form['sku'][$goods['goods_id']]['goods']['extra']['score_give_setting'])) continue;
  25. $give_setting = $form['sku'][$goods['goods_id']]['goods']['extra']['score_give_setting'];
  26. $settingArr = Json::decode($give_setting, true);
  27. if (!is_array($settingArr)) {
  28. continue; // 确保 $settingArr 是数组
  29. }
  30. if (isset($settingArr['enable_give_score']) && empty($settingArr['enable_give_score'])) continue;
  31. if (empty($settingArr['code']) || $settingArr['code'] != 'score') continue;
  32. foreach ($goods['goods_details'] as $k => $goods_detail) {
  33. if (isset($item['goods'][$goods_id]['goods_details'][$k]['marketing']['give_' . $settingArr['code']])) {
  34. $give_marketing = $item['goods'][$goods_id]['goods_details'][$k]['marketing']['give_' . $settingArr['code']];
  35. if (!empty($give_marketing)) { // 当前订单存在积分赠送信息
  36. // 计算积分赠送数目
  37. $give_num = self::calculateGiveNum($goods_detail, $total_price, $settingArr, $form);
  38. if ($give_num >= 0 && $give_num != false) {
  39. $item['goods'][$goods_id]['goods_details'][$k]['marketing']['give_' . $settingArr['code']] = $give_num;
  40. }
  41. }
  42. }
  43. }
  44. }
  45. }
  46. unset($item);
  47. return $form;
  48. }
  49. /**
  50. * 获取商品总金额
  51. * @param $goods
  52. * @return float|int
  53. */
  54. private static function getTotalPrice($goods)
  55. {
  56. $total_price = 0;
  57. foreach ($goods as $item) {
  58. $total_price += array_sum(
  59. array_column($item['goods'], 'goods_price')
  60. );
  61. }
  62. return $total_price;
  63. }
  64. /**
  65. * 积分计算数目
  66. * @param $goods_detail
  67. * @param $total_price
  68. * @param $settingArr
  69. * @param $form
  70. * @return int|mixed
  71. */
  72. private static function calculateGiveNum($goods_detail, $total_price, $settingArr, $form)
  73. {
  74. // 判断积分赠送是否是百分比-并且赠送计算方式为订单支付
  75. if ($settingArr['give_type'] == 2 && !empty($settingArr['calculation_value'])) {
  76. $give_rate = $settingArr['give_num'] / 100; // 获取百分比
  77. $give_num = bcmul($give_rate, $goods_detail['goods_price'], 2); // 使用 bcmath 进行高精度计算
  78. return max($give_num, 0);
  79. }
  80. return false;
  81. }
  82. }