255], [['presale_rules'], 'string'], [['minimum_purchase','purchase_limit_num'], 'number','min' => 0], [['minimum_purchase','purchase_limit_num'], 'default', 'value' => 0], [['virtual_payment_num', 'virtual_paid_num'], 'number','min' => 0], [['virtual_payment_num','virtual_paid_num'], 'default', 'value' => 0], ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'id' => '定金预售商品活动id', 'mall_id' => '商城id', 'cate_id' => '定金预售分类', 'goods_id' => '商品id;对应goods主表', 'start_at' => '开始时间', 'end_at' => '结束时间', 'deposit_start_at' => '定金开始时间', 'deposit_end_at' => '定金结束时间', 'final_payment_start_at' => '尾款开始时间', 'final_payment_end_at' => '尾款结束时间', 'send_goods_start_at' => '发货开始时间', 'send_goods_end_at' => '发货结束时间', 'effective_time' => '定金预售有效时间(分钟)', 'group_size' => '成团人数', 'give_score' => '团长赠送积分', 'give_balance' => '团长赠送余额', 'virtual_group_type' => '虚拟成团类型【1全部 2定金预售人数大于】', 'virtual_group_size' => '虚拟成团人数', 'gt_group_size' => '定金预售人数大于N,则虚拟成团', 'goods_stock' => '定金预售库存', 'limit_buy_num' => '限制购买数量', 'commander_level_limit' => '团长等级限制', 'user_level_limit' => '团员等级限制', 'is_virtual' => '是否开启虚拟成团', 'group_status' => '定金预售商品状态;0未开始;1开团中;已结束2', 'status' => '状态[-1:删除;0:禁用;1启用]', 'created_at' => 'Created At', 'updated_at' => 'Update At', 'presale_name' => '活动名称', 'presale_price' => '预售价', 'deposit_price' => '定金', 'virtual_payment_num' => '虚拟付款人数', 'virtual_paid_num' => '虚拟已付款人数', 'purchase_limit_num' => '限购', 'presale_rules' => '预售规则', 'presale_total' => '预定人数', 'minimum_purchase' => '最低起购', 'activity_end_at' => '活动结束时间', 'activity_start_at' => '活动开始时间', 'sales_num' => '销量', ]; } // 关联模型 public function getGoods() { return $this->hasOne(Goods::class, ['id' => 'goods_id']); } public function getActiveGoodsAttr() { return $this->hasMany(DepositPresaleActiveGoodsAttr::class, ['deposit_presale_active_id' => 'id'])->andWhere(['status' => [StatusEnum::ENABLED]]); } public function getCollect() { return $this->hasOne(GoodsCollect::class, ['goods_id' => 'goods_id'])->andWhere(['status' => [StatusEnum::ENABLED]]); } public function getCategory() { return $this->hasOne(DepositPresaleCate::class, ['id' => 'cate_id'])->andWhere(['status' => [StatusEnum::ENABLED]]); } public static function setData(array $params) { $t = Yii::$app->db->beginTransaction(); try { $param = $params['deposit_presale_goods']; $param['mall_id'] = $params['mall_id']; if (empty($param['id'])) { $model = new self(); } else { $model = self::findOne(['id' => $param['id'], ['mall_id' => $params['mall_id']]]); if (!$model) throw new Exception('活动不存在'); } $model->loadDefaultValues(); if (!empty($param['start_at'])) $param['start_at'] = strtotime($param['start_at']); if (!empty($param['end_at'])) $param['end_at'] = strtotime($param['end_at']); if (!empty($param['deposit_start_at'])) $param['deposit_start_at'] = strtotime($param['deposit_start_at']); if (!empty($param['deposit_end_at'])) $param['deposit_end_at'] = strtotime($param['deposit_end_at']); if (!empty($param['final_payment_start_at'])) $param['final_payment_start_at'] = strtotime($param['final_payment_start_at']); if (!empty($param['final_payment_end_at'])) $param['final_payment_end_at'] = strtotime($param['final_payment_end_at']); if (!empty($param['send_goods_start_at'])) $param['send_goods_start_at'] = strtotime($param['send_goods_start_at']); if (!empty($param['send_goods_end_at'])) $param['send_goods_end_at'] = strtotime($param['send_goods_end_at']); if (!empty($param['activity_start_at'])) $param['activity_start_at'] = strtotime($param['activity_start_at']); if (!empty($param['activity_end_at'])) $param['activity_end_at'] = strtotime($param['activity_end_at']); if ($param['is_attr'] == 1) { $param['presale_price'] = $params['form']['select_attr_groups'][0]['deposit_presale_price']; $param['deposit_price'] = $params['form']['select_attr_groups'][0]['deposit_price']; $param['goods_stock'] = array_sum(array_column($params['form']['select_attr_groups'], 'deposit_stock')); } if (!$model->load($param, '')) throw new \Exception($model->getErrorMessage()); //可能问题出在这里,没有加载进去 if ($model->deposit_start_at <= time()) $model->group_status = DepositPresaleEnum::OPEN_GROUP; if ($model->deposit_start_at > time()) $model->group_status = DepositPresaleEnum::NOT_STARTED; if ($model->final_payment_end_at < time()) $model->group_status = DepositPresaleEnum::GROUP_FINISH; if ($param['is_virtual']) { if ($param['virtual_group_type'] == 1) { $model->virtual_group_size = $param['group_size'] - 1; } else { $model->virtual_group_size = $param['group_size'] - $param['gt_group_size']; } } // if(isset($params['form']['is_attr']) && $params['form']['is_attr']) $model->goods_stock = array_sum(array_column($params['form']['attr'],'stock')); if (!$model->save()) throw new \Exception($model->getErrorMessage()); $params['deposit_presale_active_id'] = $model->id; $res = DepositPresaleActiveGoodsAttr::setData($params); if ($res == false) throw new \Exception(DepositPresaleActiveGoodsAttr::getStaticError()); $param['marketing_id'] = $model->id; $param['marketing_type'] = DepositPresaleEnum::ADDONS_NAME; $res = GoodsMarketing::setData($param); if ($res == false) throw new \Exception(GoodsMarketing::getStaticError()); $t->commit(); return $model; } catch (\Exception $e) { $t->rollBack(); self::$static_error = $e->getMessage(); return false; } } public static function delData($params) { $t = Yii::$app->db->beginTransaction(); try { $res = DepositPresaleOrder::findOne(['deposit_presale_active_id' => $params['id'], 'order_status' => [DepositPresaleEnum::JOINING], 'status' => StatusEnum::ENABLED]); if ($res) throw new \Exception('该预售活动有用户未付尾款'); $res = self::updateAll(['status' => StatusEnum::DELETE], ['mall_id' => $params['mall_id'], 'id' => $params['id']]); if ($res === false) throw new \Exception(self::getStaticError()); $res = DepositPresaleActiveGoodsAttr::updateAll(['status' => StatusEnum::DELETE], ['mall_id' => $params['mall_id'], 'deposit_presale_active_id' => $params['id']]); if ($res === false) throw new \Exception(DepositPresaleActiveGoodsAttr::getStaticError()); $params['marketing_id'] = $params['id']; $params['marketing_type'] = DepositPresaleEnum::ADDONS_NAME; $params['status'] = StatusEnum::DELETE; $res = GoodsMarketing::setData($params); if ($res === false) throw new \Exception(GoodsMarketing::getStaticError()); $result = self::delDiyGoods($params); if ($result === false) throw new \Exception(self::getStaticError()); $t->commit(); return true; } catch (\Exception $e) { $t->rollBack(); self::$static_error = $e->getMessage(); return false; } } public static function delDiyGoods($params) { try { $setting = AddonsMarketingSetting::findOne(['mall_id' => $params['mall_id'], 'addons_name' => 'DepositPresale']); if (!$setting) return true; $content = json_decode($setting->content, true); $is_update = 0; foreach ($content as &$item) { if (!isset($item['data']['goods'])) continue; $all_goods = $item['data']['goods']; foreach ($all_goods as $k => $goods) { if ($goods['params']['id'] == $params['id']) { unset($all_goods[$k]); $is_update += 1; } } $all_goods = array_values($all_goods); $item['data']['goods'] = $all_goods ?? []; } if ($is_update <= 0) return true; $setting->content = json_encode($content); $result = $setting->save(); if (!$result) throw new Exception($setting->getErrorMessage()); return true; } catch (\Exception $e) { self::$static_error = $e->getMessage(); return false; } } public static function getActiveListByDiy($mall_id, $post) { $where[] = ['mall_id' => $mall_id]; $where[] = ['status' => StatusEnum::ENABLED]; if (!empty($post['keyword'])) { $goods_list = Goods::lists(['where' => [['mall_id' => $mall_id], ['like', 'goods_name', trim($post['keyword']) . '%', false], ['status' => StatusEnum::ENABLED]], 'select' => 'id']); $goods_id_arr = array_column($goods_list, 'id'); $where[] = ['goods_id' => $goods_id_arr]; } $params['where'] = $where; $params['order'] = 'id DESC'; $params['with'] = ['goods' => function ($query) { $query->where(['status' => StatusEnum::ENABLED]); }]; $params['limit'] = 10; $params['select'] = 'id,goods_id,created_at,presale_price,deposit_price,presale_total,deposit_start_at,deposit_end_at,total_num,virtual_payment_num,virtual_paid_num'; $list = DepositPresaleActive::listPage($params, false, true); if (!empty($list['list'])) { foreach ($list['list'] as &$item) { $item['img'] = $item['goods']['cover_pic']; $item['title'] = $item['goods']['goods_name']; $item['sales_num'] = $item['goods']['sales_num']; $item['deposit_start_at'] = date('Y-m-d h:i:s', $item['deposit_start_at']); $item['deposit_end_at'] = date('Y-m-d h:i:s', $item['deposit_end_at']); $item['price'] = $item['goods']['price']; $item['original_price'] = ''; $item['subtitle'] = ''; $item['total_num'] = $item['presale_total']; unset($item['goods']); unset($item['goods_id']); } } return $list; } public static function checkActive($id, $mall_id) { $active = self::findOne(['mall_id' => $mall_id, 'id' => $id]); if ($active->deposit_start_at < time()) $active->group_status = DepositPresaleEnum::OPEN_GROUP; if ($active->deposit_end_at < time()) $active->group_status = DepositPresaleEnum::GROUP_FINISH; $active->save(); } /** * @desc:活动列表 * @Author: hua * @Date: 2021/12/22 * @Time: 18:41 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $where * @param false $is_page * @return array|mixed|void */ public static function getActiveList($where, $is_page = false) { $params['where'] = $where; $params['order'] = 'id DESC'; $params['select'] = 'id,goods_id,start_at,end_at,group_size,total_num,group_status,presale_price, deposit_price,deposit_start_at,deposit_end_at,virtual_payment_num,virtual_paid_num'; $params['with'] = [ 'goods' => function ($query) { $query->where(['status' => StatusEnum::ENABLED])->select('id,goods_name,cover_pic'); }, 'activeGoodsAttr' => function ($query) { $query->where(['status' => StatusEnum::ENABLED])->select('attr_id,deposit_presale_active_id,deposit_presale_price,deposit_price,goods_id') ->with(['goodsAttr']); } ]; $function = function (&$item) { $item['deposit_presale_price'] = $item['activeGoodsAttr'][0]['deposit_presale_price']; $item['deposit_price'] = $item['activeGoodsAttr'][0]['deposit_price']; $item['price'] = $item['activeGoodsAttr'][0]['goodsAttr']['price']; $item['sheng'] = $item['price'] > $item['deposit_presale_price'] ? $item['price'] - $item['deposit_presale_price'] : 0; $item['goods_name'] = $item['goods']['goods_name']; $item['cover_pic'] = $item['goods']['cover_pic']; $item['goods_id'] = $item['goods']['id']; $item['time_distance'] = ['days' => 0, 'hours' => 0, 'minutes' => 0, 'seconds' => 0]; if ($item['group_status'] == 0) { $item['time_distance'] = TimeHelper::getTwoTimeDistance(time(), $item['deposit_start_at']); } if ($item['group_status'] == 1) { $item['time_distance'] = TimeHelper::getTwoTimeDistance(time(), $item['deposit_end_at']); } $item['deposit_start_at'] = date('Y-m-d h:i:s', $item['deposit_start_at']); $item['deposit_end_at'] = date('Y-m-d h:i:s', $item['deposit_end_at']); unset($item['activeGoodsAttr']); unset($item['goods']); return $item; }; if ($is_page) { $list = DepositPresaleActive::listPage($params, false); if ($list === false) return []; if (!empty($list['list'])) { foreach ($list['list'] as &$item) { $function($item); } } } else { // $params['index']= 'id'; $list = DepositPresaleActive::lists($params); if ($list === false) return []; if (!empty($list)) { foreach ($list as &$item) { $function($item); } } } return $list; } /** * @Description: 更新装修页商品预定人数 * @Author: observer3 * @DateTime 2022-05-27 10:06:05 * @param [type] $params * @return void */ public static function updateDiyGoods($params) { try { $setting = AddonsMarketingSetting::findOne(['mall_id' => $params['mall_id'], 'addons_name' => 'DepositPresale']); if (!$setting) return true; $content = json_decode($setting->content, true); $is_update = 0; foreach ($content as &$item) { if (!isset($item['data']['goods'])) continue; $all_goods = $item['data']['goods']; foreach ($all_goods as $k => &$goods) { if ($goods['params']['id'] == $params['id']) { $goods['params']['total_num'] = $params['presale_total']; $goods['params']['presale_total'] = $params['presale_total']; $is_update += 1; } } $item['data']['goods'] = $all_goods ?? []; } if ($is_update <= 0) return true; $setting->content = json_encode($content); $result = $setting->save(); if (!$result) throw new Exception($setting->getErrorMessage()); return true; } catch (\Exception $e) { self::$static_error = $e->getMessage(); return false; } } public static function getAcitvityStatistics($mall_id){ $all_activity_number = 0; $not_start_activity_number = 0; $doing_activity_number = 0; $end_activity_number = 0; $all_activity = DepositPresaleActive::find() ->where(['and', ['mall_id' => $mall_id], ['status' => StatusEnum::ENABLED]]) ->select('id, group_status') ->asArray() ->all(); foreach($all_activity as $item) { $all_activity_number += 1; if($item['group_status'] == DepositPresaleEnum::NOT_STARTED){ $not_start_activity_number += 1; } if($item['group_status'] == DepositPresaleEnum::OPEN_GROUP){ $doing_activity_number += 1; } if($item['group_status'] == DepositPresaleEnum::GROUP_FINISH){ $end_activity_number += 1; } } return compact('all_activity_number', 'not_start_activity_number', 'doing_activity_number', 'end_activity_number'); } }