BalanceAwardService.php 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: 宝佳
  5. * Date: 2018/1/17
  6. * Time: 16:24
  7. */
  8. namespace app\common\services\finance;
  9. use app\common\events\order\AfterOrderReceivedEvent;
  10. use app\common\exceptions\ShopException;
  11. use app\common\services\credit\ConstService;
  12. class BalanceAwardService
  13. {
  14. private $orderModel;
  15. public function awardBalance(AfterOrderReceivedEvent $event)
  16. {
  17. $this->orderModel = $event->getOrderModel();
  18. $change_value = $this->getChangeValue();
  19. if ($change_value > 0) {
  20. $data = $this->getChangeData();
  21. $data['change_value'] = $change_value;
  22. $result = (new BalanceChange())->award($data);
  23. if ($result !== true) {
  24. throw new ShopException('购物赠送余额失败,请重试!');
  25. }
  26. }
  27. }
  28. private function getChangeData()
  29. {
  30. return [
  31. 'member_id' => $this->getUid(),
  32. 'remark' => "购物赠送余额",
  33. 'relation' => $this->orderModel->order_sn,
  34. 'operator' => ConstService::OPERATOR_MEMBER,
  35. 'operator_id' => $this->orderModel->uid,
  36. //'change_value' => $this->getChangeValue(),
  37. ];
  38. }
  39. private function getChangeValue()
  40. {
  41. $orderGoods = $this->orderModel->hasManyOrderGoods;
  42. $change_value = 0;
  43. foreach ($orderGoods as $goodsModel)
  44. {
  45. $goodsSaleModel = $goodsModel->hasOneGoods->hasOneSale;
  46. if (!$goodsSaleModel || empty($goodsSaleModel->award_balance)) {
  47. continue;
  48. }
  49. $change_value += $this->proportionMath($goodsModel->payment_amount, $goodsSaleModel->award_balance, $goodsModel->total);
  50. }
  51. return $change_value;
  52. }
  53. private function getUid()
  54. {
  55. $orderGoods = $this->orderModel->hasManyOrderGoods;
  56. foreach ($orderGoods as $goodsModel)
  57. {
  58. $uid = $goodsModel->uid ?: $this->orderModel->uid;
  59. }
  60. return $uid;
  61. }
  62. private function proportionMath($price, $proportion, $total)
  63. {
  64. if (strexists($proportion, '%')) {
  65. $proportion = str_replace('%', '', $proportion);
  66. return bcdiv(bcmul($price,$proportion,4),100,2);
  67. }
  68. return bcmul($proportion,$total,2);
  69. }
  70. }