SignInService.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <?php
  2. namespace addons\BusinessActivity\common\service;
  3. use addons\BusinessActivity\common\enums\BusinessActivityEnum;
  4. use addons\BusinessActivity\common\enums\ConfigEnum;
  5. use addons\BusinessActivity\common\models\AddonsBusinessActivityModel;
  6. use addons\BusinessActivity\common\models\AddonsBusinessActivitySigninModel;
  7. use common\enums\StatusEnum;
  8. use Yii;
  9. class SignInService
  10. {
  11. /**
  12. * @param int $mall_id
  13. * @param int $user_id
  14. * @return array|mixed|string
  15. */
  16. public function page(int $mall_id, int $user_id)
  17. {
  18. $ret = AddonsBusinessActivitySigninModel::listPage([
  19. 'where' => [
  20. ['or', ['venue_user_id' => $user_id], ['merchants_user_id' => $user_id]],
  21. ['status' => [StatusEnum::ENABLED, ConfigEnum::STATUS_EXPIRED]],
  22. ['mall_id' => $mall_id]
  23. ],
  24. 'select' => 'id, created_at, user_id, activity_id',
  25. 'order' => 'id desc',
  26. 'with' => ['user', 'activity' => function($query) {
  27. $query->select('id, name');
  28. }]
  29. ]);
  30. if (!empty(AddonsBusinessActivitySigninModel::getStaticError())) return AddonsBusinessActivitySigninModel::getStaticError();
  31. $ret['total_participate_num'] = 0;
  32. $ret['today_participate_num'] = 0;
  33. if (!empty($ret['list'])) {
  34. $ret['total_participate_num'] = AddonsBusinessActivitySigninModel::find()->where(['mall_id' => $mall_id])
  35. ->andWhere(['or', ['venue_user_id' => $user_id], ['merchants_user_id' => $user_id]])
  36. ->andWhere(['status' => StatusEnum::ENABLED])
  37. ->count();
  38. $ret['today_participate_num'] = AddonsBusinessActivitySigninModel::find()->where(['mall_id' => $mall_id])
  39. ->andWhere(['or', ['venue_user_id' => $user_id], ['merchants_user_id' => $user_id]])
  40. ->andWhere(['status' => StatusEnum::ENABLED])
  41. ->andWhere(['between', 'created_at', strtotime(date('Y-m-d')), strtotime(date('Y-m-d')) + 86400])
  42. ->count();
  43. foreach ($ret['list'] as &$item) {
  44. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  45. }
  46. unset($item);
  47. }
  48. return $ret;
  49. }
  50. /**
  51. * 签到关系绑定过期
  52. * @return void
  53. */
  54. public function expired()
  55. {
  56. AddonsBusinessActivitySigninModel::updateAll(['status' => ConfigEnum::STATUS_EXPIRED],
  57. ['and', ['status' => StatusEnum::ENABLED], ['<=', 'expire_at', time()]]);
  58. }
  59. /**
  60. * 参会
  61. * @param int $mall_id
  62. * @param int $activity_id
  63. * @param int $user_id
  64. * @return string|true
  65. */
  66. public function create(int $mall_id, int $activity_id, int $user_id)
  67. {
  68. try {
  69. // 判断活动是否存在
  70. $activity = AddonsBusinessActivityModel::find()->where(['mall_id' => $mall_id])
  71. ->andWhere(['id' => $activity_id])
  72. ->andWhere(['status' => StatusEnum::ENABLED])
  73. ->andWhere(['activity_status' => StatusEnum::ENABLED])
  74. ->one();
  75. if (empty($activity)) throw new \Exception('活动不存在或已过期');
  76. // 判断是否已经签过到
  77. if (AddonsBusinessActivitySigninModel::find()->where(['mall_id' => $mall_id])
  78. ->andWhere(['activity_id' => $activity_id])
  79. ->andWhere(['user_id' => $user_id])
  80. ->andWhere(['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])
  81. ->count() > 0) {
  82. throw new \Exception('已经参与过该活动');
  83. }
  84. // 累加参会人数
  85. $activity->participate_num++;
  86. if (!$activity->save()) throw new \Exception($activity->getErrorMessage());
  87. $t = Yii::$app->db->beginTransaction();
  88. $expire_day = Yii::$app->services->setting->addons->get($mall_id, BusinessActivityEnum::ADDONS_NAME, 'basic.valid_duration');
  89. $expire_day = intval($expire_day);
  90. $model = new AddonsBusinessActivitySigninModel();
  91. $model->user_id = $user_id;
  92. $model->mall_id = $mall_id;
  93. $model->activity_id = $activity_id;
  94. $model->merchants_user_id = $activity->merchants_user_id;
  95. $model->venue_user_id = $activity->venue_user_id;
  96. $model->expire_at = time() + ($expire_day * 86400); // 绑定关系时长
  97. if (!$model->save()) throw new \Exception($model->getErrorMessage());
  98. $t->commit();
  99. return true;
  100. } catch (\Exception $e) {
  101. if (!empty($t)) $t->rollBack();
  102. return $e->getMessage();
  103. }
  104. }
  105. /**
  106. * 通过负责人进行统计
  107. * @param int $mall_id
  108. * @param int $user_id
  109. * @return bool|int|string|null
  110. */
  111. public function totalByUserId(int $mall_id, int $user_id)
  112. {
  113. return AddonsBusinessActivitySigninModel::find()
  114. ->where(['mall_id' => $mall_id])
  115. ->andWhere(['status' => StatusEnum::ENABLED])
  116. ->andWhere(['or', ['merchants_user_id' => $user_id], ['venue_user_id' => $user_id]])
  117. ->count();
  118. }
  119. }