| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- <?php
- namespace common\models\user;
- use common\enums\StatusEnum;
- use common\enums\UserWalletEnum;
- use common\models\common\CapitalLog;
- use services\common\UserWalletService;
- use Yii;
- /**
- * This is the model class for table "{{%user_freeze_commission}}".
- *
- * @property int $id ID
- * @property int $mall_id 商城ID
- * @property int $user_id 用户ID
- * @property float $freeze_scale 冻结比例
- * @property float $freeze_cap 冻结上限
- * @property float $freeze_amount 冻结佣金
- * @property int $status 状态[-1删除; 0禁用; 1正常]
- * @property int $created_at 创建时间
- * @property int $updated_at 更新时间
- */
- class UserFreezeCommission extends \common\models\base\BaseActiveRecord
- {
- /**
- * {@inheritdoc}
- */
- public static function tableName()
- {
- return '{{%user_freeze_commission}}';
- }
- /**
- * {@inheritdoc}
- */
- public function rules()
- {
- return [
- [['mall_id', 'user_id', 'status', 'created_at', 'updated_at'], 'integer'],
- [['freeze_scale', 'freeze_cap', 'freeze_amount'], 'number'],
- ];
- }
- /**
- * {@inheritdoc}
- */
- public function attributeLabels()
- {
- return [
- 'id' => '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');
- }
- }
|