StoreActivityServices.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <?php
  2. namespace app\services\activity;
  3. use app\dao\activity\StoreActivityDao;
  4. use app\services\activity\seckill\StoreSeckillServices;
  5. use app\services\BaseServices;
  6. use app\services\product\product\StoreProductServices;
  7. use app\services\product\sku\StoreProductAttrValueServices;
  8. use crmeb\exceptions\AdminException;
  9. use crmeb\services\CacheService;
  10. class StoreActivityServices extends BaseServices
  11. {
  12. public function __construct(StoreActivityDao $dao)
  13. {
  14. $this->dao = $dao;
  15. }
  16. public function activityList($where)
  17. {
  18. [$page, $limit] = $this->getPageValue();
  19. $list = $this->dao->activityList($where, '*', $page, $limit, ['seckill' => function ($query) {
  20. $query->field('id,activity_id');
  21. }]);
  22. $seckillTimesData = sys_data('routine_seckill_time');
  23. $resultArray = [];
  24. foreach ($seckillTimesData as $timesData) {
  25. $id = $timesData['id'];
  26. $time = intval($timesData['time']);
  27. $continued = intval($timesData['continued']);
  28. // 格式化时间,加上 ":00"
  29. $startTime = sprintf("%02d:00", $time);
  30. $endTime = sprintf("%02d:00", $time + $continued);
  31. $resultArray[$id] = $startTime . '-' . $endTime;
  32. }
  33. foreach ($list as &$item) {
  34. $item['start_day'] = date('Y-m-d H:i:s', $item['start_day']);
  35. $item['end_day'] = date('Y-m-d 23:59:59', $item['end_day']);
  36. $item['add_time'] = date('Y-m-d H:i:s', $item['add_time']);
  37. $item['product_count'] = count($item['seckill']);
  38. foreach (explode(',', $item['time_ids']) as $timeId) {
  39. $item['times_list'][] = $resultArray[$timeId];
  40. }
  41. }
  42. $count = $this->dao->activityCount($where);
  43. return compact('list', 'count');
  44. }
  45. public function activityInfo($id)
  46. {
  47. $info = $this->dao->get(['id' => $id]);
  48. if (!$info) throw new AdminException('数据不存在');
  49. $info = $info->toArray();
  50. /** @var StoreSeckillServices $seckillServices */
  51. $seckillServices = app()->make(StoreSeckillServices::class);
  52. $seckill = $seckillServices->getList(['activity_id' => $id, 'is_del' => 0], 0, 0);
  53. $info['section_time'] = [date('Y-m-d', $info['start_day']), date('Y-m-d', $info['end_day'])];
  54. $info['time_ids'] = array_map('intval', explode(',', $info['time_ids']));
  55. $productList = [];
  56. if ($seckill) {
  57. /** @var StoreProductServices $productServices */
  58. $productServices = app()->make(StoreProductServices::class);
  59. $productList = $productServices->searchList(['id' => array_column($seckill, 'product_id'), 'is_del' => 0]);
  60. $productList = $productList['list'] ?? [];
  61. $seckill = array_combine(array_column($seckill, 'product_id'), $seckill);
  62. //放入秒杀商品价格
  63. foreach ($productList as &$product) {
  64. $product['product_price'] = $product['price'];
  65. $seckillInfo = $seckill[$product['id']] ?? [];
  66. $attrValue = $product['attrs'] ?? [];
  67. if ($seckillInfo && $attrValue) {
  68. $product['status'] = $seckillInfo['status'];
  69. $seckillAttrValue = $seckillInfo['attrs'] ?? [];
  70. if ($seckillAttrValue) {
  71. $seckillAttrValue = array_combine(array_column($seckillAttrValue, 'suk'), $seckillAttrValue);
  72. foreach ($attrValue as &$value) {
  73. $value['status'] = 0;
  74. if (isset($seckillAttrValue[$value['suk']])) {
  75. $value['status'] = 1;
  76. }
  77. $value['product_price'] = $value['price'];
  78. if ($value['status']) {
  79. $value['quota'] = $seckillAttrValue[$value['suk']]['quota'] ?? 0;
  80. $value['quota_show'] = $seckillAttrValue[$value['suk']]['quota_show'] ?? 0;
  81. $value['price'] = $seckillAttrValue[$value['suk']]['price'] ?? 0;
  82. $value['cost'] = $seckillAttrValue[$value['suk']]['cost'] ?? 0;
  83. $value['ot_price'] = $seckillAttrValue[$value['suk']]['ot_price'] ?? 0;
  84. }
  85. }
  86. $product['attrs'] = $attrValue;
  87. }
  88. }
  89. }
  90. }
  91. $info['product_infos'] = $productList;
  92. return $info;
  93. }
  94. public function activityDel($id, $type)
  95. {
  96. if (!$id) throw new AdminException('缺少参数');
  97. $this->dao->update($id, ['is_del' => 1]);
  98. if ($type == 1) {
  99. /** @var StoreSeckillServices $storeSeckillServices */
  100. $storeSeckillServices = app()->make(StoreSeckillServices::class);
  101. $ids = $storeSeckillServices->getColumn(['activity_id' => $id], 'id');
  102. /** @var StoreProductAttrValueServices $storeProductAttrValueServices */
  103. $storeProductAttrValueServices = app()->make(StoreProductAttrValueServices::class);
  104. foreach ($ids as $sid) {
  105. $storeSeckillServices->update($sid, ['is_del' => 1]);
  106. $unique = $storeProductAttrValueServices->value(['product_id' => $id, 'type' => 1], 'unique');
  107. if ($unique) {
  108. CacheService::delete('seckill_' . $unique . '_1');
  109. }
  110. }
  111. }
  112. return true;
  113. }
  114. public function activityStatus($id, $status, $type)
  115. {
  116. if (!$id) throw new AdminException('缺少参数');
  117. $this->dao->update($id, ['status' => $status]);
  118. if ($type == 1) {
  119. /** @var StoreSeckillServices $storeSeckillServices */
  120. $storeSeckillServices = app()->make(StoreSeckillServices::class);
  121. $ids = $storeSeckillServices->getColumn(['activity_id' => $id], 'id');
  122. foreach ($ids as $sid) {
  123. $storeSeckillServices->update($sid, ['status' => $status]);
  124. }
  125. }
  126. return true;
  127. }
  128. }