| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- <?php
- namespace app\utils;
- use app\models\Option;
- use app\models\Order;
- use app\models\ShareHolder;
- use app\models\ShareHolderFugouFrostLog;
- use app\models\User;
- use app\models\ShareDetail;
- // 链动2+1 复购相关
- class FuGou
- {
- public static function getSetting($store_id)
- {
- $default = \json_encode([
- 'fugou_switch' => 0,
- 'fugou_type' => 1,
- 'fugou_day' => 0,
- 'fugou_price' => 0,
- 'fugou_where_num' => 0,
- 'fugou_where_price' => 0,
- 'fugou_goods' => [],
- 'fugou_freeze_level' => '0',
- 'fugou_freeze_rand' => [1, 1],
- ]);
- $fugouSetting = Option::get('fugou', $store_id, 'bonus_pool', 'null')['value'];
- if (empty($fugouSetting) || $fugouSetting == 'null') {
- $fugouSetting = $default;
- }
- return \json_decode($fugouSetting, true);
- }
- // 距离复购剩余天数, 0 不需要复购,< 0 需要复购, > 0 复购剩余天数
- public static function cycleByDay($user_id, $store_id, $setting = null)
- {
- if ($setting === null) {
- $setting = self::getSetting($store_id);
- }
- // 查找是否有复购订单
- $fugouOrder = Order::find()->where([
- 'user_id' => $user_id,
- 'store_id' => $store_id,
- 'is_fugou' => 1,
- 'is_sale' => 1,
- ])->orderBy('id DESC')->one();
- $startTime = null;
- if ($fugouOrder) {
- $startTime = $fugouOrder->created_at;
- }
- if (empty($startTime)) {
- $shareHolder = ShareHolder::findOne(['user_id' => $user_id, 'store_id' => $store_id, 'is_delete' => 0, 'status' => 1]);
- if ($shareHolder) {
- $startTime = $shareHolder->created_at;
- }
- }
- if (empty($startTime)) {
- return 0;
- }
- $settingDay = $setting['fugou_day'];
- // 计算剩余天数
- $day = ceil((time() - $startTime) / 86400);
- return $settingDay - $day;
- }
- // 剩余冻结金额,<=0 需要复购,> 0 不需要复购,剩余金额
- public static function cycleByPrice($user_id, $store_id, $setting = null, $frost_price = null)
- {
- if ($setting === null) {
- $setting = self::getSetting($store_id);
- }
- if ($frost_price === null) {
- $frost_price = self::getUserFrostPrice($user_id);
- }
- return $setting['fugou_price'] > 0 ? $setting['fugou_price'] - ($frost_price ?: 0) : 0;
- }
- // 是否需要复购
- public static function isFugou($user_id, $store_id, $setting = null)
- {
- if ($setting === null) {
- $setting = self::getSetting($store_id);
- }
- $cycle_day = self::cycleByDay($user_id, $store_id, $setting);
- $cycle_price = self::cycleByPrice($user_id, $store_id, $setting);
- if ($setting['fugou_type'] == 1 || $setting['fugou_type'] == 3) {
- if ($cycle_day < 0) {
- return true;
- }
- }
- if ($setting['fugou_type'] == 2 || $setting['fugou_type'] == 3) {
- if ($cycle_price <= 0) {
- return true;
- }
- }
- return false;
- }
- // 获取用户冻结金额
- public static function getUserFrostPrice($user_id)
- {
- $price = ShareHolderFugouFrostLog::find()->where(['user_id' => $user_id, 'status' => 0])->sum('amount');
- return $price ?: 0;
- }
- // 发放复购冻结佣金
- public static function sendFrostPrice($user_id)
- {
- $t = \Yii::$app->db->beginTransaction();
- try {
- $totalPrice = static::getUserFrostPrice($user_id);
- if ($totalPrice <= 0) {
- throw new \Exception('没有冻结佣金');
- }
- $user = User::findOne($user_id);
- $user->updateCounters(['price' => $totalPrice, 'total_price' => $totalPrice]);
- ShareHolderFugouFrostLog::updateAll(['status' => 1, 'updated_at' => time()], ['user_id' => $user_id]);
- ShareDetail::updateAll(['is_send' => 1, 'send_time' => time()], ['user_id' => $user_id, 'is_fugou' => 1]);
- $t->commit();
- return true;
- } catch (\Exception $e) {
- $t->rollBack();
- return false;
- }
- }
- }
|