You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

StorePromotionsAuxiliaryServices.php 5.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. namespace app\services\activity\promotions;
  3. use app\dao\activity\promotions\StorePromotionsAuxiliaryDao;
  4. use app\services\product\sku\StoreProductAttrValueServices;
  5. use app\services\BaseServices;
  6. /**
  7. * 优惠活动辅助表
  8. * Class StorePromotionsAuxiliaryServices
  9. * @package app\services\activity\promotions
  10. */
  11. class StorePromotionsAuxiliaryServices extends BaseServices
  12. {
  13. /**
  14. * @param StorePromotionsAuxiliaryDao $dao
  15. */
  16. public function __construct(StorePromotionsAuxiliaryDao $dao)
  17. {
  18. $this->dao = $dao;
  19. }
  20. /**
  21. * 优惠活动关联保存
  22. * @param int $promotionsId
  23. * @param int $type
  24. * @param array $productData
  25. * @param array $couponData
  26. * @param array $giveProductData
  27. * @return bool
  28. */
  29. public function savePromotionsRelation(int $promotionsId, int $type, array $productData, array $couponData, array $giveProductData)
  30. {
  31. $this->dao->delete(['promotions_id' => $promotionsId]);
  32. $this->savePromotionsProducts($promotionsId, $type, $productData);
  33. $this->savePromotionsGiveCoupon($promotionsId, $couponData);
  34. $this->savePromotionsGiveProducts($promotionsId, $giveProductData);
  35. return true;
  36. }
  37. /**
  38. * 设置活动关联商品
  39. * @param int $promotionsId
  40. * @param int $type
  41. * @param array $productIds
  42. * @return bool
  43. */
  44. public function savePromotionsProducts(int $promotionsId, int $type, array $productData)
  45. {
  46. if ($productData) {
  47. $data = [];
  48. $productIds = array_column($productData, 'product_id');
  49. $productData = array_combine($productIds, $productData);
  50. /** @var StoreProductAttrValueServices $skuValueServices */
  51. $skuValueServices = app()->make(StoreProductAttrValueServices::class);
  52. foreach ($productIds as $productId) {
  53. $unique = $productData[$productId]['unique'] ?? [];
  54. $skuCount = $skuValueServices->count(['product_id' => $productId, 'type' => 0]);
  55. $data[] = [
  56. 'type' => 1,
  57. 'product_partake_type' => $type,
  58. 'promotions_id' => $promotionsId,
  59. 'product_id' => $productId,
  60. 'is_all' => count($unique) >= $skuCount ? 1 : 0,
  61. 'unique' => implode(',', $unique)
  62. ];
  63. }
  64. $this->dao->saveAll($data);
  65. }
  66. return true;
  67. }
  68. /**
  69. * 设置活动关联赠送优惠券
  70. * @param int $promotionsId
  71. * @param array $couponData
  72. * @return bool
  73. */
  74. public function savePromotionsGiveCoupon(int $promotionsId, array $couponData)
  75. {
  76. if ($couponData) {
  77. $data = [];
  78. $couponIds = array_column($couponData, 'give_coupon_id');
  79. $couponData = array_combine($couponIds, $couponData);
  80. foreach ($couponIds as $couponId) {
  81. $data[] = [
  82. 'type' => 2,
  83. 'promotions_id' => $promotionsId,
  84. 'coupon_id' => $couponId,
  85. 'limit_num' => $couponData[$couponId]['give_coupon_num'] ?? 0,
  86. 'surplus_num' => $couponData[$couponId]['give_coupon_num'] ?? 0
  87. ];
  88. }
  89. $this->dao->saveAll($data);
  90. }
  91. return true;
  92. }
  93. /**
  94. * 设置活动关联赠送商品
  95. * @param int $promotionsId
  96. * @param array $giveProductData
  97. * @return bool
  98. */
  99. public function savePromotionsGiveProducts(int $promotionsId, array $giveProductData)
  100. {
  101. if ($giveProductData) {
  102. $data = [];
  103. foreach ($giveProductData as $product) {
  104. $data[] = [
  105. 'type' => 3,
  106. 'promotions_id' => $promotionsId,
  107. 'product_id' => $product['give_product_id'],
  108. 'limit_num' => $product['give_product_num'] ?? 0,
  109. 'surplus_num' => $product['give_product_num'] ?? 0,
  110. 'unique' => $product['unique'] ?? ''
  111. ];
  112. }
  113. $this->dao->saveAll($data);
  114. }
  115. return true;
  116. }
  117. /**
  118. * 优惠活动关联赠品限量处理
  119. * @param array $promotions_id
  120. * @param int $type
  121. * @param int $id
  122. * @param bool $is_dec
  123. * @param string $unique
  124. * @param int $num
  125. * @return bool
  126. */
  127. public function updateLimit(array $promotions_id, int $type, int $id, bool $is_dec = true, string $unique = '', int $num = 1)
  128. {
  129. if (!$promotions_id) return true;
  130. $where = ['promotions_id' => $promotions_id, 'type' => $type];
  131. if ($type == 2) {
  132. $where['coupon_id'] = $id;
  133. } else {
  134. $where['product_id'] = $id;
  135. $where['unique'] = $unique;
  136. }
  137. $info = $this->dao->get($where);
  138. if ($info) {
  139. if ($is_dec) {
  140. if ($info['surplus_num'] < $num) {
  141. $surplus_num = 0;
  142. } else {
  143. $surplus_num = bcsub((string)$info['surplus_num'], (string)$num, 0);
  144. }
  145. } else {
  146. $surplus_num = bcadd((string)$info['surplus_num'], (string)$num, 0);
  147. }
  148. $this->dao->update($info['id'], ['surplus_num' => $surplus_num]);
  149. }
  150. return true;
  151. }
  152. }