'ID', 'mall_id' => '商城ID', 'user_id' => '用户ID', 'freeze_scale' => '冻结比例', 'freeze_cap' => '冻结上限', 'freeze_amount' => '冻结佣金', 'status' => '状态[-1删除; 0禁用; 1正常]', 'created_at' => '创建时间', 'updated_at' => '更新时间', ]; } /** * @Description: 存储数据 * @Author: zsan * @DateTime 2024-03-08 18:55:26 * @param array $data * @return self|bool */ public static function setData(array $data) { try { $model = self::findOne(['user_id' => $data['user_id'], 'mall_id' => $data['mall_id'], 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]); if (empty($model)) { $model = new self(); $model->loadDefaultValues(); } if (!$model->load($data, '') || !$model->save()) { throw new \Exception($model->getErrorMessage()); } return $model; } catch (\Exception $e) { self::setStaticError($e->getMessage()); return false; } } public static function getSwitchStatus($mall_id) { return (int)Yii::$app->services->setting->mall->get($mall_id, 'user.is_freeze_commission'); } /** * @Description: 记录新增的冻结佣金 * @Author: zsan * @DateTime 2024-03-09 11:49:26 * @param integer $user_id * @param array $data * @return boolean */ public static function setLogData($user_id, $data) { try { $freeze_setting = self::findOne(['user_id' => $user_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]); if (empty($freeze_setting) || empty($freeze_setting['freeze_scale'])) return true; $switch_status = self::getSwitchStatus($freeze_setting->mall_id); if (empty($switch_status)) return true; $logs = []; $wallet_type = UserWalletService::WALLET_TYPE_COMMISSION; $user_wallet = null; $isset_over = false; $over_amount = 0; $freeze_scale = $freeze_setting->freeze_scale; // echo __METHOD__.' data:'.json_encode($data); foreach ($data as $value) { if ($value['wallet_type'] != $wallet_type || $value['is_frozen'] == true) continue; $value['change_type'] = $value['money'] > 0 ? CapitalLog::CHANGE_TYPE_ADD : CapitalLog::CHANGE_TYPE_SUB; $amount = abs($value['money']); $freeze_amount = bcmul($value['money'], bcdiv($freeze_setting['freeze_scale'], 100, 6), 2); if ($value['change_type'] == CapitalLog::CHANGE_TYPE_ADD) { //提现驳回,不冻结 if($value['capital_type'] == UserWalletEnum::WITHDRAWAL_REFUND) continue; $arrive_freeze_amount = $amount - $freeze_amount; $tmp_freeze_amount = $freeze_setting->freeze_amount + $freeze_amount; $extra_desc = ""; if ($freeze_setting->freeze_cap > 0 && $tmp_freeze_amount > $freeze_setting->freeze_cap) { $over_freeze_amount = $tmp_freeze_amount - $freeze_setting->freeze_cap; $freeze_amount -= $over_freeze_amount; $arrive_freeze_amount += $over_freeze_amount; $extra_desc = "; 达到冻结上限: {$freeze_setting->freeze_cap}"; } $desc = "应到账可提现金额: {$amount}, 实际到账可提现金额: {$arrive_freeze_amount}, 增加冻结可提现金额: {$freeze_amount} {$extra_desc}"; } else if ($value['change_type'] == CapitalLog::CHANGE_TYPE_SUB) { if(!in_array($value['capital_type'], [UserWalletEnum::RECHARGE_PLATFORM, UserWalletEnum::BACKEND_DEDUCT])) continue; empty($user_wallet) && $user_wallet = UserWallet::findOne(['user_id' => $user_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]); if ($freeze_setting->freeze_amount > ($user_wallet[$wallet_type] ?? 0)) { if (empty($isset_over)) { $isset_over = true; $over_amount = bcsub($freeze_setting->freeze_amount, $user_wallet[$wallet_type], 2); } if ($over_amount <= 0) continue; $freeze_amount = $amount; if ($over_amount >= $freeze_amount) { $over_amount -= $freeze_amount; } else { $freeze_amount = $over_amount; $over_amount = 0; } $desc = "后台操作人员执行扣除, 扣除冻结可提现金额: {$freeze_amount}, 冻结比例: 100%"; $freeze_scale = 100; } } $logs[] = [ 'mall_id' => $value['mall_id'], 'user_id' => $value['user_id'], 'change_type' => $value['change_type'], 'freeze_scale' => $freeze_scale, 'amount' => $amount, 'freeze_amount' => $freeze_amount, 'desc' => $desc ?? '', 'status' => StatusEnum::ENABLED, 'created_at' => time(), 'updated_at' => time(), ]; if ($value['change_type'] == CapitalLog::CHANGE_TYPE_SUB) { $freeze_setting->freeze_amount -= $freeze_amount; } else if ($value['change_type'] == CapitalLog::CHANGE_TYPE_ADD) { $freeze_setting->freeze_amount += $freeze_amount; } } if (empty($logs)) return true; // echo __METHOD__.' logs:'.json_encode($logs); if (!$freeze_setting->save()) throw new \Exception($freeze_setting->getErrorMessage()); \Yii::$app->db->createCommand()->batchInsert(UserFreezeCommissionLog::tableName(), array_keys($logs[0]), $logs)->execute(); return true; } catch (\Exception $e) { self::setStaticError($e->getMessage()); return false; } } /** * @Description: 清理单个用户或者整个商城用户的冻结佣金 * @Author: zsan * @DateTime 2024-03-09 11:47:55 * @param integer $mall_id * @param integer $user_id * @return boolean */ public static function clearUserData($mall_id, $user_id = 0) { try { $users_freeze = []; if (!empty($user_id)) { $freeze_setting = self::findOne(['user_id' => $user_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]); !empty($freeze_setting) && $users_freeze[] = $freeze_setting; } else { $users_freeze = self::findAll(['mall_id' => $mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]); } if (empty($users_freeze)) return true; $admin = Yii::$app->getUser()->identity; $logs = []; /** @var self $user_freeze */ foreach ($users_freeze as $user_freeze) { if ($user_freeze->freeze_amount <= 0) continue; $amount = $user_freeze->freeze_amount; $desc = "后台操作人员:{$admin->username},清空冻结佣金:{$amount}"; $logs[] = [ 'mall_id' => $user_freeze->mall_id, 'user_id' => $user_freeze->user_id, 'amount' => $amount, 'freeze_amount' => $amount, 'freeze_scale' => $user_freeze->freeze_scale, 'change_type' => CapitalLog::CHANGE_TYPE_SUB, 'status' => StatusEnum::ENABLED, 'desc' => $desc, 'created_at' => time(), 'updated_at' => time(), ]; $user_freeze->freeze_amount = 0; } if (empty($logs)) return true; $trans = \Yii::$app->db->beginTransaction(); try { /** @var self $user_freeze */ foreach ($users_freeze as $user_freeze) { if (!$user_freeze->save()) throw new \Exception($user_freeze->getErrorMessage()); } \Yii::$app->db->createCommand()->batchInsert(UserFreezeCommissionLog::tableName(), array_keys($logs[0]), $logs)->execute(); $trans->commit(); } catch (\Exception $ex) { $trans->rollback(); throw $ex; } return true; } catch (\Exception $e) { self::setStaticError($e->getMessage()); return false; } } public static function handlePromotionCenter($mall_id, $user_id) { $is_freeze_commission = self::getSwitchStatus($mall_id); $freeze_amount = (float)self::find()->where(['and', ['user_id' => $user_id], ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]]) ->select('freeze_amount') ->asArray() ->scalar(); return compact('is_freeze_commission', 'freeze_amount'); } }