| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- <?php
- namespace addons\BusinessActivity\common\service;
- use addons\BusinessActivity\common\enums\BusinessActivityEnum;
- use addons\BusinessActivity\common\enums\ConfigEnum;
- use addons\BusinessActivity\common\models\AddonsBusinessActivityGoodsModel;
- use addons\BusinessActivity\common\models\AddonsBusinessActivityModel;
- use addons\BusinessActivity\common\models\AddonsBusinessActivitySigninModel;
- use common\enums\DiyEnum;
- use common\enums\StatusEnum;
- use common\models\common\PosterCode;
- use common\traits\ErrorTrait;
- use Exception;
- use Yii;
- use yii\helpers\Json;
- class ActivityService
- {
- use ErrorTrait;
- public function page(int $mall_id, array $params, array $mall)
- {
- $where = [];
- $where[]['mall_id'] = $mall_id;
- $where[]['status'] = [StatusEnum::ENABLED, StatusEnum::DISABLED];
- if (!empty($params['title'])) $where[] = ['like', 'name', $params['title']];
- if (!empty($params['venue_user_id'])) $where[] = ['venue_user_id' => $params['venue_user_id']];
- if (!empty($params['merchants_user_id'])) $where[] = ['merchants_user_id' => $params['merchants_user_id']];
- if (!empty($params['start_time'])) $where[] = ['>=', 'start_at', strtotime($params['start_time'])];
- if (!empty($params['end_time'])) $where[] = ['<=', 'end_at', strtotime($params['end_time'])];
- $data = AddonsBusinessActivityModel::listPage([
- 'where' => $where,
- 'with' => ['merchants', 'venue'],
- 'page' => $params['page'],
- 'limit' => $params['pagesize'],
- 'order' => 'id desc'
- ]);
- $data['poster'] = Yii::$app->services->setting->addons->get($mall_id, BusinessActivityEnum::ADDONS_NAME, 'basic.poster');
- if (!empty($data['poster'])) {
- $data['poster'] = Json::decode($data['poster']);
- }
- $data['h5_url'] = sprintf("%s/#/pages/index/index?sign=%s", Yii::$app->services->setting->platform->get('system.h5_url') ?? '', $mall['mall_sign']);
- return $data;
- }
- public function detail($mall_id, $id)
- {
- $activity = AddonsBusinessActivityModel::getOne([
- ['mall_id' => $mall_id], ['id' => $id], ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]
- ], true, [
- 'merchants' => function ($query) {
- return $query->select('id, nickname, avatar_url, mobile');
- },
- 'venue' => function ($query) {
- return $query->select('id, nickname, avatar_url, mobile');
- },
- ]);
- if (!$activity) return [];
- $activity['start_at'] = date('Y-m-d H:i:s', $activity['start_at']);
- $activity['end_at'] = date('Y-m-d H:i:s', $activity['end_at']);
- $activity['activityTime'] = [$activity['start_at'], $activity['end_at']];
- $merchants = $activity['merchants'];
- $venue = $activity['venue'];
- $activity['merchants'] = [$merchants];
- $activity['venue'] = [$venue];
- $goods_info = [];
- $goods_data = AddonsBusinessActivityGoodsModel::lists([
- 'where' => [
- ['mall_id' => $mall_id], ['activity_id' => $id], ['status' => StatusEnum::ENABLED]
- ],
- 'with' => [
- 'goods' => function ($query) {
- return $query->select('id, goods_name, price, stock, cover_pic');
- },
- ]
- ]);
- $commission_type = -1;
- $is_alone_commission = -1;
- foreach ($goods_data as $v) {
- if ($commission_type <= -1) $commission_type = $v['commission_type'];
- if ($is_alone_commission <= -1) $is_alone_commission = $v['is_alone_commission'];
- $temp = $v['goods'];
- $temp['merchants_commission'] = $v['merchants_commission'];
- $temp['merchants_parent_commission'] = $v['merchants_parent_commission'];
- $temp['venue_commission'] = $v['venue_commission'];
- $temp['venue_parent_commission'] = $v['venue_parent_commission'];
- $goods_info[] = $temp;
- }
- $activity['commission_type'] = $commission_type;
- $activity['is_alone_commission'] = $is_alone_commission;
- $activity['goods_info'] = $goods_info;
- return $activity;
- }
- public function write($params)
- {
- $t = Yii::$app->db->beginTransaction();
- try {
- $mall_id = $params['mall_id'];
- $goods_info = $params['goods_info'];
- $goods_ids = array_column($goods_info, 'id');
- // 查询是否有在活动中的商品
- $gModel = AddonsBusinessActivityGoodsModel::find()->where(['mall_id' => $mall_id])
- ->andWhere(['status' => StatusEnum::ENABLED])
- ->andWhere(['goods_id' => $goods_ids]);
- if (!empty($params['id'])) {
- $gModel->andWhere(['!=', 'activity_id', $params['id']]);
- }
- $n_goods_ids = $gModel->select('goods_id')->column();
- if (!empty($n_goods_ids)) {
- throw new Exception("商品ID为 [{$n_goods_ids[0]}] 的商品已包含在其他活动中");
- }
- $params['merchants_user_id'] = $params['merchants'][0]['id'];
- $params['venue_user_id'] = $params['venue'][0]['id'];
- if ($params['start_at'] <= time()) { // 如果开始时间小于等于当前时间,那么就改为活动进行中
- $params['activity_status'] = StatusEnum::ENABLED;
- }
- $params['start_at'] = strtotime($params['start_at']);
- $params['end_at'] = strtotime($params['end_at']);
- $activity_model = AddonsBusinessActivityModel::setData($params);
- if ($activity_model === false) throw new Exception(AddonsBusinessActivityModel::getStaticError());
- $activity_goods_models = AddonsBusinessActivityGoodsModel::findAll([
- 'mall_id' => $mall_id, 'activity_id' => $activity_model->id, 'status' => StatusEnum::ENABLED
- ]);
- foreach ($activity_goods_models as $model) {
- $model->status = StatusEnum::DELETE;
- $model->save();
- }
- foreach ($goods_info as &$v) {
- $v['activity_id'] = $activity_model->id;
- $v['is_alone_commission'] = $params['is_alone_commission'];
- $v['goods_id'] = $v['id'];
- $v['commission_type'] = $params['commission_type'];
- $v['mall_id'] = $mall_id;
- unset($v['id']);
- }
- unset($v);
- foreach ($goods_info as $value) {
- $res = AddonsBusinessActivityGoodsModel::setData($value);
- if ($res === false) throw new Exception(AddonsBusinessActivityGoodsModel::getStaticError());
- }
- $t->commit();
- return true;
- } catch (\Exception $e) {
- $t->rollBack();
- $this->error = $e->getMessage();
- return false;
- }
- }
- public function del($mall_id, $id)
- {
- $t = Yii::$app->db->beginTransaction();
- try {
- $activity_model = AddonsBusinessActivityModel::findOne(['mall_id' => $mall_id, 'id' => $id, 'status' => StatusEnum::ENABLED]);
- if (!$activity_model) throw new Exception(AddonsBusinessActivityModel::getStaticError());
- $activity_model->status = StatusEnum::DELETE;
- if (!$activity_model->save()) throw new Exception($activity_model->getErrorMessage());
- AddonsBusinessActivityGoodsModel::updateAll(['status' => StatusEnum::DELETE], ['activity_id' => $id, 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED]);
- $t->commit();
- return true;
- } catch (\Exception $e) {
- $t->rollBack();
- $this->error = $e->getMessage();
- return false;
- }
- }
- public function switch($mall_id, $id, $status)
- {
- try {
- $activity_model = AddonsBusinessActivityModel::findOne(['mall_id' => $mall_id, 'id' => $id]);
- if (!$activity_model) throw new Exception(AddonsBusinessActivityModel::getStaticError());
- $activity_model->status = $status;
- if (!$activity_model->save()) throw new Exception($activity_model->getErrorMessage());
- return true;
- } catch (\Exception $e) {
- $this->error = $e->getMessage();
- return false;
- }
- }
- public function getSigninList($params)
- {
- $where = [
- ['mall_id' => $params['mall_id']],
- ['>', 'status', StatusEnum::DISABLED],
- ['activity_id' => $params['activity_id']]
- ];
- if (!empty($params['user_id'])) $where[] = ['user_id' => $params['user_id']];
- $list = AddonsBusinessActivitySigninModel::listPage(
- [
- 'where' => $where,
- 'order' => 'id desc',
- 'with' => [
- 'user' => function ($query) {
- return $query->select('id, nickname, avatar_url, mobile');
- }
- ],
- 'page' => $params['page'],
- 'limit' => $params['limit'] ?? 10
- ]
- );
- if ($list == false) throw new Exception(AddonsBusinessActivitySigninModel::getStaticError());
- return $list;
- }
- public function getGoodsIds($params)
- {
- $where = [
- ['mall_id' => $params['mall_id']],
- ['status' => StatusEnum::ENABLED],
- ['!=', 'activity_id', $params['activity_id']]
- ];
- $goods_ids_list = AddonsBusinessActivityGoodsModel::lists([
- 'where' => $where,
- 'select' => 'goods_id'
- ]);
- $goods_ids = array_column($goods_ids_list, 'goods_id') ?? [];
- return $goods_ids;
- }
- /**
- * 活动结束/完成
- * @return void
- */
- public function finish()
- {
- // 查询结束ID
- $expired_ids = AddonsBusinessActivityModel::find()->where(['status' => StatusEnum::ENABLED])
- ->andWhere(['activity_status' => StatusEnum::ENABLED])
- ->andWhere(['<=', 'end_at', time()])
- ->select('id')
- ->column();
- if (!empty($expired_ids)) {
- // 结束
- // AddonsBusinessActivityModel::updateAll(['activity_status' => ConfigEnum::STATUS_COMPLETE], ['and',
- // ['status' => StatusEnum::ENABLED, 'activity_status' => StatusEnum::ENABLED], ['<=', 'end_at', time()]]);
- AddonsBusinessActivityModel::updateAll(['activity_status' => ConfigEnum::STATUS_COMPLETE], ['id' => $expired_ids]);
- // 将结束中活动的商品设置为禁用状态
- AddonsBusinessActivityGoodsModel::updateAll(['status' => StatusEnum::DISABLED], ['activity_id' => $expired_ids]);
- }
- // 开始
- AddonsBusinessActivityModel::updateAll(['activity_status' => StatusEnum::ENABLED], ['and',
- ['status' => StatusEnum::ENABLED, 'activity_status' => StatusEnum::DISABLED],
- ['<=', 'start_at', time()]]);
- }
- /**
- * 获取定制数据
- * @param int $mall_id
- * @param int $user_id
- * @return array
- */
- public function getActivityCustomByUserId(int $mall_id, int $user_id)
- {
- $list = AddonsBusinessActivityModel::find()->where(['mall_id' => $mall_id])
- ->andWhere(['status' => [StatusEnum::DISABLED, StatusEnum::ENABLED]])
- ->andWhere(['or', ['merchants_user_id' => $user_id], ['venue_user_id' => $user_id]])
- ->select('id, name, merchants_user_id, venue_user_id')->asArray()->all();
- $ret = [
- 'role' => [
- 'is_merchants' => StatusEnum::DISABLED,
- 'is_venue' => StatusEnum::DISABLED,
- ],
- 'activity' => []
- ];
- if (!empty($list)) {
- foreach ($list as $item) {
- if ($item['merchants_user_id'] == $user_id) { // 招商负责人
- $ret['role']['is_merchants'] = StatusEnum::ENABLED;
- }
- if ($item['venue_user_id'] == $user_id) { // 场地负责人
- $ret['role']['is_venue'] = StatusEnum::ENABLED;
- }
- $ret['activity'][$item['id']] = $item['name'];
- }
- }
- return $ret;
- }
- /**
- * @throws Exception
- */
- public function getPosterQrCodeUrl(array $mall, int $id): array
- {
- $poster = PosterCode::setData($mall['id'], 0, 30, [
- 'item_id' => $id,
- 'mall_id' => $mall['id'],
- 'source' => 30, // 招商活动来源
- 'pid' => 0
- ]);
- if (!$poster) throw new Exception(PosterCode::getStaticError());
- return [
- 'url' => (Yii::$app->services->setting->platform->get('system.h5_url') ?? '') . '/#' . DiyEnum::HOME_PAGE_PATH . "?sign={$mall['mall_sign']}&scene={$poster['code']}"
- ];
- }
- }
|