ActivityService.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  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\AddonsBusinessActivityGoodsModel;
  6. use addons\BusinessActivity\common\models\AddonsBusinessActivityModel;
  7. use addons\BusinessActivity\common\models\AddonsBusinessActivitySigninModel;
  8. use common\enums\DiyEnum;
  9. use common\enums\StatusEnum;
  10. use common\models\common\PosterCode;
  11. use common\traits\ErrorTrait;
  12. use Exception;
  13. use Yii;
  14. use yii\helpers\Json;
  15. class ActivityService
  16. {
  17. use ErrorTrait;
  18. public function page(int $mall_id, array $params, array $mall)
  19. {
  20. $where = [];
  21. $where[]['mall_id'] = $mall_id;
  22. $where[]['status'] = [StatusEnum::ENABLED, StatusEnum::DISABLED];
  23. if (!empty($params['title'])) $where[] = ['like', 'name', $params['title']];
  24. if (!empty($params['venue_user_id'])) $where[] = ['venue_user_id' => $params['venue_user_id']];
  25. if (!empty($params['merchants_user_id'])) $where[] = ['merchants_user_id' => $params['merchants_user_id']];
  26. if (!empty($params['start_time'])) $where[] = ['>=', 'start_at', strtotime($params['start_time'])];
  27. if (!empty($params['end_time'])) $where[] = ['<=', 'end_at', strtotime($params['end_time'])];
  28. $data = AddonsBusinessActivityModel::listPage([
  29. 'where' => $where,
  30. 'with' => ['merchants', 'venue'],
  31. 'page' => $params['page'],
  32. 'limit' => $params['pagesize'],
  33. 'order' => 'id desc'
  34. ]);
  35. $data['poster'] = Yii::$app->services->setting->addons->get($mall_id, BusinessActivityEnum::ADDONS_NAME, 'basic.poster');
  36. if (!empty($data['poster'])) {
  37. $data['poster'] = Json::decode($data['poster']);
  38. }
  39. $data['h5_url'] = sprintf("%s/#/pages/index/index?sign=%s", Yii::$app->services->setting->platform->get('system.h5_url') ?? '', $mall['mall_sign']);
  40. return $data;
  41. }
  42. public function detail($mall_id, $id)
  43. {
  44. $activity = AddonsBusinessActivityModel::getOne([
  45. ['mall_id' => $mall_id], ['id' => $id], ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]
  46. ], true, [
  47. 'merchants' => function ($query) {
  48. return $query->select('id, nickname, avatar_url, mobile');
  49. },
  50. 'venue' => function ($query) {
  51. return $query->select('id, nickname, avatar_url, mobile');
  52. },
  53. ]);
  54. if (!$activity) return [];
  55. $activity['start_at'] = date('Y-m-d H:i:s', $activity['start_at']);
  56. $activity['end_at'] = date('Y-m-d H:i:s', $activity['end_at']);
  57. $activity['activityTime'] = [$activity['start_at'], $activity['end_at']];
  58. $merchants = $activity['merchants'];
  59. $venue = $activity['venue'];
  60. $activity['merchants'] = [$merchants];
  61. $activity['venue'] = [$venue];
  62. $goods_info = [];
  63. $goods_data = AddonsBusinessActivityGoodsModel::lists([
  64. 'where' => [
  65. ['mall_id' => $mall_id], ['activity_id' => $id], ['status' => StatusEnum::ENABLED]
  66. ],
  67. 'with' => [
  68. 'goods' => function ($query) {
  69. return $query->select('id, goods_name, price, stock, cover_pic');
  70. },
  71. ]
  72. ]);
  73. $commission_type = -1;
  74. $is_alone_commission = -1;
  75. foreach ($goods_data as $v) {
  76. if ($commission_type <= -1) $commission_type = $v['commission_type'];
  77. if ($is_alone_commission <= -1) $is_alone_commission = $v['is_alone_commission'];
  78. $temp = $v['goods'];
  79. $temp['merchants_commission'] = $v['merchants_commission'];
  80. $temp['merchants_parent_commission'] = $v['merchants_parent_commission'];
  81. $temp['venue_commission'] = $v['venue_commission'];
  82. $temp['venue_parent_commission'] = $v['venue_parent_commission'];
  83. $goods_info[] = $temp;
  84. }
  85. $activity['commission_type'] = $commission_type;
  86. $activity['is_alone_commission'] = $is_alone_commission;
  87. $activity['goods_info'] = $goods_info;
  88. return $activity;
  89. }
  90. public function write($params)
  91. {
  92. $t = Yii::$app->db->beginTransaction();
  93. try {
  94. $mall_id = $params['mall_id'];
  95. $goods_info = $params['goods_info'];
  96. $goods_ids = array_column($goods_info, 'id');
  97. // 查询是否有在活动中的商品
  98. $gModel = AddonsBusinessActivityGoodsModel::find()->where(['mall_id' => $mall_id])
  99. ->andWhere(['status' => StatusEnum::ENABLED])
  100. ->andWhere(['goods_id' => $goods_ids]);
  101. if (!empty($params['id'])) {
  102. $gModel->andWhere(['!=', 'activity_id', $params['id']]);
  103. }
  104. $n_goods_ids = $gModel->select('goods_id')->column();
  105. if (!empty($n_goods_ids)) {
  106. throw new Exception("商品ID为 [{$n_goods_ids[0]}] 的商品已包含在其他活动中");
  107. }
  108. $params['merchants_user_id'] = $params['merchants'][0]['id'];
  109. $params['venue_user_id'] = $params['venue'][0]['id'];
  110. if ($params['start_at'] <= time()) { // 如果开始时间小于等于当前时间,那么就改为活动进行中
  111. $params['activity_status'] = StatusEnum::ENABLED;
  112. }
  113. $params['start_at'] = strtotime($params['start_at']);
  114. $params['end_at'] = strtotime($params['end_at']);
  115. $activity_model = AddonsBusinessActivityModel::setData($params);
  116. if ($activity_model === false) throw new Exception(AddonsBusinessActivityModel::getStaticError());
  117. $activity_goods_models = AddonsBusinessActivityGoodsModel::findAll([
  118. 'mall_id' => $mall_id, 'activity_id' => $activity_model->id, 'status' => StatusEnum::ENABLED
  119. ]);
  120. foreach ($activity_goods_models as $model) {
  121. $model->status = StatusEnum::DELETE;
  122. $model->save();
  123. }
  124. foreach ($goods_info as &$v) {
  125. $v['activity_id'] = $activity_model->id;
  126. $v['is_alone_commission'] = $params['is_alone_commission'];
  127. $v['goods_id'] = $v['id'];
  128. $v['commission_type'] = $params['commission_type'];
  129. $v['mall_id'] = $mall_id;
  130. unset($v['id']);
  131. }
  132. unset($v);
  133. foreach ($goods_info as $value) {
  134. $res = AddonsBusinessActivityGoodsModel::setData($value);
  135. if ($res === false) throw new Exception(AddonsBusinessActivityGoodsModel::getStaticError());
  136. }
  137. $t->commit();
  138. return true;
  139. } catch (\Exception $e) {
  140. $t->rollBack();
  141. $this->error = $e->getMessage();
  142. return false;
  143. }
  144. }
  145. public function del($mall_id, $id)
  146. {
  147. $t = Yii::$app->db->beginTransaction();
  148. try {
  149. $activity_model = AddonsBusinessActivityModel::findOne(['mall_id' => $mall_id, 'id' => $id, 'status' => StatusEnum::ENABLED]);
  150. if (!$activity_model) throw new Exception(AddonsBusinessActivityModel::getStaticError());
  151. $activity_model->status = StatusEnum::DELETE;
  152. if (!$activity_model->save()) throw new Exception($activity_model->getErrorMessage());
  153. AddonsBusinessActivityGoodsModel::updateAll(['status' => StatusEnum::DELETE], ['activity_id' => $id, 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED]);
  154. $t->commit();
  155. return true;
  156. } catch (\Exception $e) {
  157. $t->rollBack();
  158. $this->error = $e->getMessage();
  159. return false;
  160. }
  161. }
  162. public function switch($mall_id, $id, $status)
  163. {
  164. try {
  165. $activity_model = AddonsBusinessActivityModel::findOne(['mall_id' => $mall_id, 'id' => $id]);
  166. if (!$activity_model) throw new Exception(AddonsBusinessActivityModel::getStaticError());
  167. $activity_model->status = $status;
  168. if (!$activity_model->save()) throw new Exception($activity_model->getErrorMessage());
  169. return true;
  170. } catch (\Exception $e) {
  171. $this->error = $e->getMessage();
  172. return false;
  173. }
  174. }
  175. public function getSigninList($params)
  176. {
  177. $where = [
  178. ['mall_id' => $params['mall_id']],
  179. ['>', 'status', StatusEnum::DISABLED],
  180. ['activity_id' => $params['activity_id']]
  181. ];
  182. if (!empty($params['user_id'])) $where[] = ['user_id' => $params['user_id']];
  183. $list = AddonsBusinessActivitySigninModel::listPage(
  184. [
  185. 'where' => $where,
  186. 'order' => 'id desc',
  187. 'with' => [
  188. 'user' => function ($query) {
  189. return $query->select('id, nickname, avatar_url, mobile');
  190. }
  191. ],
  192. 'page' => $params['page'],
  193. 'limit' => $params['limit'] ?? 10
  194. ]
  195. );
  196. if ($list == false) throw new Exception(AddonsBusinessActivitySigninModel::getStaticError());
  197. return $list;
  198. }
  199. public function getGoodsIds($params)
  200. {
  201. $where = [
  202. ['mall_id' => $params['mall_id']],
  203. ['status' => StatusEnum::ENABLED],
  204. ['!=', 'activity_id', $params['activity_id']]
  205. ];
  206. $goods_ids_list = AddonsBusinessActivityGoodsModel::lists([
  207. 'where' => $where,
  208. 'select' => 'goods_id'
  209. ]);
  210. $goods_ids = array_column($goods_ids_list, 'goods_id') ?? [];
  211. return $goods_ids;
  212. }
  213. /**
  214. * 活动结束/完成
  215. * @return void
  216. */
  217. public function finish()
  218. {
  219. // 查询结束ID
  220. $expired_ids = AddonsBusinessActivityModel::find()->where(['status' => StatusEnum::ENABLED])
  221. ->andWhere(['activity_status' => StatusEnum::ENABLED])
  222. ->andWhere(['<=', 'end_at', time()])
  223. ->select('id')
  224. ->column();
  225. if (!empty($expired_ids)) {
  226. // 结束
  227. // AddonsBusinessActivityModel::updateAll(['activity_status' => ConfigEnum::STATUS_COMPLETE], ['and',
  228. // ['status' => StatusEnum::ENABLED, 'activity_status' => StatusEnum::ENABLED], ['<=', 'end_at', time()]]);
  229. AddonsBusinessActivityModel::updateAll(['activity_status' => ConfigEnum::STATUS_COMPLETE], ['id' => $expired_ids]);
  230. // 将结束中活动的商品设置为禁用状态
  231. AddonsBusinessActivityGoodsModel::updateAll(['status' => StatusEnum::DISABLED], ['activity_id' => $expired_ids]);
  232. }
  233. // 开始
  234. AddonsBusinessActivityModel::updateAll(['activity_status' => StatusEnum::ENABLED], ['and',
  235. ['status' => StatusEnum::ENABLED, 'activity_status' => StatusEnum::DISABLED],
  236. ['<=', 'start_at', time()]]);
  237. }
  238. /**
  239. * 获取定制数据
  240. * @param int $mall_id
  241. * @param int $user_id
  242. * @return array
  243. */
  244. public function getActivityCustomByUserId(int $mall_id, int $user_id)
  245. {
  246. $list = AddonsBusinessActivityModel::find()->where(['mall_id' => $mall_id])
  247. ->andWhere(['status' => [StatusEnum::DISABLED, StatusEnum::ENABLED]])
  248. ->andWhere(['or', ['merchants_user_id' => $user_id], ['venue_user_id' => $user_id]])
  249. ->select('id, name, merchants_user_id, venue_user_id')->asArray()->all();
  250. $ret = [
  251. 'role' => [
  252. 'is_merchants' => StatusEnum::DISABLED,
  253. 'is_venue' => StatusEnum::DISABLED,
  254. ],
  255. 'activity' => []
  256. ];
  257. if (!empty($list)) {
  258. foreach ($list as $item) {
  259. if ($item['merchants_user_id'] == $user_id) { // 招商负责人
  260. $ret['role']['is_merchants'] = StatusEnum::ENABLED;
  261. }
  262. if ($item['venue_user_id'] == $user_id) { // 场地负责人
  263. $ret['role']['is_venue'] = StatusEnum::ENABLED;
  264. }
  265. $ret['activity'][$item['id']] = $item['name'];
  266. }
  267. }
  268. return $ret;
  269. }
  270. /**
  271. * @throws Exception
  272. */
  273. public function getPosterQrCodeUrl(array $mall, int $id): array
  274. {
  275. $poster = PosterCode::setData($mall['id'], 0, 30, [
  276. 'item_id' => $id,
  277. 'mall_id' => $mall['id'],
  278. 'source' => 30, // 招商活动来源
  279. 'pid' => 0
  280. ]);
  281. if (!$poster) throw new Exception(PosterCode::getStaticError());
  282. return [
  283. 'url' => (Yii::$app->services->setting->platform->get('system.h5_url') ?? '') . '/#' . DiyEnum::HOME_PAGE_PATH . "?sign={$mall['mall_sign']}&scene={$poster['code']}"
  284. ];
  285. }
  286. }