ActivityManagementService.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. <?php
  2. namespace App\Module\Activity\Services;
  3. use App\Module\Activity\Dtos\ActivityConfigDto;
  4. use App\Module\Activity\Enums\ACTIVITY_STATUS;
  5. use App\Module\Activity\Models\ActivityConfig;
  6. use App\Module\Activity\Models\ActivityCondition;
  7. use Carbon\Carbon;
  8. use Exception;
  9. use Illuminate\Support\Facades\DB;
  10. use Illuminate\Support\Facades\Log;
  11. /**
  12. * 活动管理服务类
  13. */
  14. class ActivityManagementService
  15. {
  16. /**
  17. * 创建活动
  18. *
  19. * @param array $data 活动数据
  20. * @return array
  21. */
  22. public static function createActivity(array $data): array
  23. {
  24. try {
  25. // 开始事务
  26. DB::beginTransaction();
  27. // 创建活动
  28. $activity = new ActivityConfig();
  29. $activity->name = $data['name'];
  30. $activity->type = $data['type'];
  31. $activity->description = $data['description'] ?? '';
  32. $activity->start_time = Carbon::parse($data['start_time']);
  33. $activity->end_time = Carbon::parse($data['end_time']);
  34. $activity->status = $data['status'] ?? ACTIVITY_STATUS::NOT_STARTED;
  35. $activity->display_order = $data['display_order'] ?? 0;
  36. $activity->icon = $data['icon'] ?? '';
  37. $activity->banner = $data['banner'] ?? '';
  38. $activity->reward_group_id = $data['reward_group_id'] ?? null;
  39. $activity->reward_group_code = $data['reward_group_code'] ?? null;
  40. $activity->config_params = $data['config_params'] ?? [];
  41. $activity->save();
  42. // 创建活动条件
  43. if (!empty($data['conditions']) && is_array($data['conditions'])) {
  44. foreach ($data['conditions'] as $conditionData) {
  45. $condition = new ActivityCondition();
  46. $condition->activity_id = $activity->id;
  47. $condition->condition_type = $conditionData['condition_type'];
  48. $condition->condition_params = $conditionData['condition_params'] ?? [];
  49. $condition->is_participation_condition = $conditionData['is_participation_condition'] ?? false;
  50. $condition->is_completion_condition = $conditionData['is_completion_condition'] ?? false;
  51. $condition->display_order = $conditionData['display_order'] ?? 0;
  52. $condition->save();
  53. }
  54. }
  55. // 提交事务
  56. DB::commit();
  57. return [
  58. 'success' => true,
  59. 'message' => '创建活动成功',
  60. 'activity_id' => $activity->id
  61. ];
  62. } catch (Exception $e) {
  63. // 回滚事务
  64. DB::rollBack();
  65. Log::error('创建活动失败', [
  66. 'data' => $data,
  67. 'error' => $e->getMessage()
  68. ]);
  69. return [
  70. 'success' => false,
  71. 'message' => $e->getMessage()
  72. ];
  73. }
  74. }
  75. /**
  76. * 更新活动
  77. *
  78. * @param int $activityId 活动ID
  79. * @param array $data 活动数据
  80. * @return array
  81. */
  82. public static function updateActivity(int $activityId, array $data): array
  83. {
  84. try {
  85. // 获取活动
  86. $activity = ActivityConfig::findOrFail($activityId);
  87. // 开始事务
  88. DB::beginTransaction();
  89. // 更新活动
  90. if (isset($data['name'])) {
  91. $activity->name = $data['name'];
  92. }
  93. if (isset($data['type'])) {
  94. $activity->type = $data['type'];
  95. }
  96. if (isset($data['description'])) {
  97. $activity->description = $data['description'];
  98. }
  99. if (isset($data['start_time'])) {
  100. $activity->start_time = Carbon::parse($data['start_time']);
  101. }
  102. if (isset($data['end_time'])) {
  103. $activity->end_time = Carbon::parse($data['end_time']);
  104. }
  105. if (isset($data['status'])) {
  106. $activity->status = $data['status'];
  107. }
  108. if (isset($data['display_order'])) {
  109. $activity->display_order = $data['display_order'];
  110. }
  111. if (isset($data['icon'])) {
  112. $activity->icon = $data['icon'];
  113. }
  114. if (isset($data['banner'])) {
  115. $activity->banner = $data['banner'];
  116. }
  117. if (isset($data['reward_group_id'])) {
  118. $activity->reward_group_id = $data['reward_group_id'];
  119. }
  120. if (isset($data['reward_group_code'])) {
  121. $activity->reward_group_code = $data['reward_group_code'];
  122. }
  123. if (isset($data['config_params'])) {
  124. $activity->config_params = $data['config_params'];
  125. }
  126. $activity->save();
  127. // 更新活动条件
  128. if (!empty($data['conditions']) && is_array($data['conditions'])) {
  129. // 删除旧条件
  130. ActivityCondition::where('activity_id', $activityId)->delete();
  131. // 创建新条件
  132. foreach ($data['conditions'] as $conditionData) {
  133. $condition = new ActivityCondition();
  134. $condition->activity_id = $activity->id;
  135. $condition->condition_type = $conditionData['condition_type'];
  136. $condition->condition_params = $conditionData['condition_params'] ?? [];
  137. $condition->is_participation_condition = $conditionData['is_participation_condition'] ?? false;
  138. $condition->is_completion_condition = $conditionData['is_completion_condition'] ?? false;
  139. $condition->display_order = $conditionData['display_order'] ?? 0;
  140. $condition->save();
  141. }
  142. }
  143. // 提交事务
  144. DB::commit();
  145. return [
  146. 'success' => true,
  147. 'message' => '更新活动成功'
  148. ];
  149. } catch (Exception $e) {
  150. // 回滚事务
  151. DB::rollBack();
  152. Log::error('更新活动失败', [
  153. 'activity_id' => $activityId,
  154. 'data' => $data,
  155. 'error' => $e->getMessage()
  156. ]);
  157. return [
  158. 'success' => false,
  159. 'message' => $e->getMessage()
  160. ];
  161. }
  162. }
  163. /**
  164. * 删除活动
  165. *
  166. * @param int $activityId 活动ID
  167. * @return array
  168. */
  169. public static function deleteActivity(int $activityId): array
  170. {
  171. try {
  172. // 开始事务
  173. DB::beginTransaction();
  174. // 删除活动条件
  175. ActivityCondition::where('activity_id', $activityId)->delete();
  176. // 删除活动
  177. ActivityConfig::where('id', $activityId)->delete();
  178. // 提交事务
  179. DB::commit();
  180. return [
  181. 'success' => true,
  182. 'message' => '删除活动成功'
  183. ];
  184. } catch (Exception $e) {
  185. // 回滚事务
  186. DB::rollBack();
  187. Log::error('删除活动失败', [
  188. 'activity_id' => $activityId,
  189. 'error' => $e->getMessage()
  190. ]);
  191. return [
  192. 'success' => false,
  193. 'message' => $e->getMessage()
  194. ];
  195. }
  196. }
  197. /**
  198. * 更新活动状态
  199. *
  200. * @param int $activityId 活动ID
  201. * @param int $status 状态
  202. * @return array
  203. */
  204. public static function updateActivityStatus(int $activityId, int $status): array
  205. {
  206. try {
  207. // 获取活动
  208. $activity = ActivityConfig::findOrFail($activityId);
  209. // 更新状态
  210. $activity->status = $status;
  211. $activity->save();
  212. return [
  213. 'success' => true,
  214. 'message' => '更新活动状态成功'
  215. ];
  216. } catch (Exception $e) {
  217. Log::error('更新活动状态失败', [
  218. 'activity_id' => $activityId,
  219. 'status' => $status,
  220. 'error' => $e->getMessage()
  221. ]);
  222. return [
  223. 'success' => false,
  224. 'message' => $e->getMessage()
  225. ];
  226. }
  227. }
  228. /**
  229. * 获取所有活动
  230. *
  231. * @param array $filters 过滤条件
  232. * @return array
  233. */
  234. public static function getAllActivities(array $filters = []): array
  235. {
  236. try {
  237. $query = ActivityConfig::query();
  238. // 应用过滤条件
  239. if (!empty($filters['status'])) {
  240. $query->where('status', $filters['status']);
  241. }
  242. if (!empty($filters['type'])) {
  243. $query->where('type', $filters['type']);
  244. }
  245. if (!empty($filters['name'])) {
  246. $query->where('name', 'like', "%{$filters['name']}%");
  247. }
  248. if (!empty($filters['start_time'])) {
  249. $query->where('start_time', '>=', Carbon::parse($filters['start_time']));
  250. }
  251. if (!empty($filters['end_time'])) {
  252. $query->where('end_time', '<=', Carbon::parse($filters['end_time']));
  253. }
  254. // 排序
  255. $query->orderBy('display_order', 'desc')
  256. ->orderBy('id', 'desc');
  257. // 获取活动列表
  258. $activities = $query->get();
  259. $result = [];
  260. foreach ($activities as $activity) {
  261. $result[] = ActivityConfigDto::fromModel($activity);
  262. }
  263. return $result;
  264. } catch (Exception $e) {
  265. Log::error('获取所有活动失败', [
  266. 'filters' => $filters,
  267. 'error' => $e->getMessage()
  268. ]);
  269. return [];
  270. }
  271. }
  272. /**
  273. * 自动更新活动状态
  274. *
  275. * @return array
  276. */
  277. public static function autoUpdateActivityStatus(): array
  278. {
  279. try {
  280. $now = Carbon::now();
  281. $updated = 0;
  282. // 更新未开始的活动
  283. $notStartedActivities = ActivityConfig::where('status', ACTIVITY_STATUS::NOT_STARTED)
  284. ->where('start_time', '<=', $now)
  285. ->get();
  286. foreach ($notStartedActivities as $activity) {
  287. $activity->status = ACTIVITY_STATUS::IN_PROGRESS;
  288. $activity->save();
  289. $updated++;
  290. }
  291. // 更新进行中的活动
  292. $inProgressActivities = ActivityConfig::where('status', ACTIVITY_STATUS::IN_PROGRESS)
  293. ->where('end_time', '<', $now)
  294. ->get();
  295. foreach ($inProgressActivities as $activity) {
  296. $activity->status = ACTIVITY_STATUS::ENDED;
  297. $activity->save();
  298. $updated++;
  299. }
  300. return [
  301. 'success' => true,
  302. 'message' => "自动更新活动状态成功,共更新 {$updated} 个活动"
  303. ];
  304. } catch (Exception $e) {
  305. Log::error('自动更新活动状态失败', [
  306. 'error' => $e->getMessage()
  307. ]);
  308. return [
  309. 'success' => false,
  310. 'message' => $e->getMessage()
  311. ];
  312. }
  313. }
  314. }