Base.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <?php
  2. namespace addons\shopro\library\activity\provider;
  3. use addons\shopro\library\activity\Activity as ActivityManager;
  4. use addons\shopro\library\activity\contract\ActivityInterface;
  5. use addons\shopro\library\activity\traits\CheckActivity;
  6. use app\admin\model\shopro\activity\SkuPrice as ActivitySkuPriceModel;
  7. abstract class Base implements ActivityInterface
  8. {
  9. use CheckActivity;
  10. /**
  11. * ActivityManager
  12. *
  13. * @var ActivityManager
  14. */
  15. protected $manager = null;
  16. protected $rules = [];
  17. protected $message = [];
  18. protected $default = [];
  19. public function __construct(ActivityManager $activityManager)
  20. {
  21. $this->manager = $activityManager;
  22. }
  23. public function validate($data)
  24. {
  25. $data = array_merge($this->default, $data);
  26. $validate = (new \think\Validate)->message($this->message)->rule($this->rules);
  27. if (!$validate->check($data)) {
  28. error_stop($validate->getError());
  29. }
  30. return $data;
  31. }
  32. public function check($params)
  33. {
  34. if ((isset($params['start_time']) && $params['start_time'] > $params['end_time']) || $params['end_time'] < date('Y-m-d H:i:s')) {
  35. error_stop('请设置正确的活动时间');
  36. }
  37. if (isset($params['prehead_time']) && $params['prehead_time'] > $params['start_time']) {
  38. error_stop('预热时间必须小于活动开始时间');
  39. }
  40. $rules = $this->validate($params['rules']);
  41. // 存在折扣,将折扣按照从小到大排序
  42. if (isset($rules['discounts']) && $rules['discounts']) {
  43. // 处理展示优惠,full 从小到大
  44. $discounts = $rules['discounts'];
  45. $discountsKeys = array_column($discounts, null, 'full');
  46. ksort($discountsKeys);
  47. $rules['discounts'] = array_values($discountsKeys); // 优惠按照 full 从小到大排序
  48. }
  49. $params['rules'] = $rules;
  50. return $params;
  51. }
  52. /**
  53. * 附加活动信息
  54. *
  55. * @param string $type
  56. * @param array $rules
  57. * @return array
  58. */
  59. public function rulesInfo($type, $rules)
  60. {
  61. return $rules;
  62. }
  63. public function save($activity, $params = [])
  64. {
  65. }
  66. public function showSkuPrice($skuPrice)
  67. {
  68. return $skuPrice;
  69. }
  70. public function formatTags($rules, $type)
  71. {
  72. }
  73. public function formatTag($discountData)
  74. {
  75. }
  76. public function formatTexts($rules, $type)
  77. {
  78. }
  79. public function recoverSkuPrices($goods, $activity)
  80. {
  81. return $goods['sku_prices'];
  82. }
  83. public function buyCheck($buyInfo, $activity)
  84. {
  85. return $buyInfo;
  86. }
  87. public function buy($buyInfo, $activity)
  88. {
  89. return $buyInfo;
  90. }
  91. public function buyOk($order, $user)
  92. {
  93. return $order;
  94. }
  95. public function buyFail($order, $type)
  96. {
  97. return $order;
  98. }
  99. public function getPromoInfo($promo, array $data = [])
  100. {
  101. }
  102. protected function promoGoodsData($promo)
  103. {
  104. $promo_goods_amount = '0'; // 该活动中商品的总价
  105. $promo_goods_num = '0'; // 该活动商品总件数
  106. $goodsIds = []; // 该活动中所有的商品 id
  107. $promo_dispatch_amount = '0'; // 该活动中总运费
  108. // 活动中的商品总金额,总件数,所有商品 id
  109. foreach ($promo['goods'] as $buyInfo) {
  110. $promo_goods_amount = bcadd($promo_goods_amount, (string)$buyInfo['goods_amount'], 2);
  111. $promo_goods_num = bcadd($promo_goods_num, (string)$buyInfo['goods_num'], 2);
  112. $goodsIds[] = $buyInfo['goods_id'];
  113. $promo_dispatch_amount = bcadd($promo_dispatch_amount, (string)$buyInfo['dispatch_amount'], 2);
  114. }
  115. return compact(
  116. "promo_goods_amount",
  117. "promo_goods_num",
  118. "promo_dispatch_amount",
  119. "goodsIds"
  120. );
  121. }
  122. /**
  123. * 添加,编辑活动规格,type = stock 只编辑库存
  124. *
  125. * @param array $goodsList 商品列表
  126. * @param int $activity_id 活动 id
  127. * @param string $type type = all 全部编辑,type = stock 只编辑库存
  128. * @return void
  129. */
  130. protected function saveSkuPrice($goodsList, $activity, \Closure $extCb = null)
  131. {
  132. //如果是编辑 先下架所有的规格产品,防止丢失历史销量数据;
  133. $type = 'all';
  134. if (request()->isPut() && $activity->status == 'ing') {
  135. // 修改并且是进行中的活动,只能改库存
  136. $type = 'stock';
  137. }
  138. ActivitySkuPriceModel::where('activity_id', $activity->id)->update(['status' => 'down']);
  139. foreach ($goodsList as $key => $goods) {
  140. $actSkuPrice[$key] = $goods['activity_sku_prices'];
  141. foreach ($actSkuPrice[$key] as $ke => $skuPrice) {
  142. if ($type == 'all') {
  143. $current = $skuPrice;
  144. // 处理 ext 回调
  145. if ($extCb) {
  146. $current = $extCb($current);
  147. }
  148. } else {
  149. $current = [
  150. 'id' => $skuPrice['id'],
  151. 'stock' => $skuPrice['stock'],
  152. 'status' => $skuPrice['status'] // 这个要去掉,不能改参与状态
  153. ];
  154. }
  155. if ($current['id'] == 0) {
  156. unset($current['id']);
  157. }
  158. unset($current['sales']);
  159. $current['activity_id'] = $activity->id;
  160. $current['goods_id'] = $goods['id'];
  161. $actSkuPriceModel = new ActivitySkuPriceModel();
  162. if (isset($current['id'])) {
  163. // type == 'edit'
  164. $actSkuPriceModel = $actSkuPriceModel->find($current['id']);
  165. }
  166. if ($actSkuPriceModel) {
  167. unset($current['createtime'], $current['updatetime']);
  168. $actSkuPriceModel->allowField(true)->save($current);
  169. }
  170. }
  171. }
  172. }
  173. }