'ID', 'mall_id' => '商城id', 'user_id' => '会员id', 'redpack' => '激活红包', 'frozen_redpack' => '冻结红包', 'total_redpack' => '总激活红包', 'total_frozen_redpack' => '总冻结红包', 'total_use_redpack' => '已使用激活红包', 'total_use_frozen_redpack' => '已使用冻结红包', 'status' => '状态[-1:删除;0:禁用;1启用]', 'created_at' => 'Created At', 'updated_at' => 'Updated At', ]; } /** * 保存数据 * $params数组参数如下 * mall_id 必填 商城id * user_id 必填 用户id * is_frozen 必填 是否是冻结,值为[true,false] * is_deduct 非必填 余额不足是否扣减至0元(money必须为负数),值为[true,false] * money 必填 增加或扣减的金额 * source_table 非必填 来源表,如 addons_redpack * source_table_id 非必填 来源表id * from_type 来源 值请参考 RedpackEnum::getFromType() * desc 非必填 变动说明 * @Author: lun * @DateTime: 2022/3/22 0022 10:29 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $params * @param $is_log 是否生成红包日志 * @return array|bool */ public static function setData($params, $is_log = true) { $trans = Yii::$app->db->beginTransaction(); // 加锁 $lock_key = RedisKeyEnum::suffix(RedpackEnum::LOCK_WALLET , $params['user_id']); $identification = uniqid(); try { if ($params['money'] == 0) throw new \Exception("变动红包金额不能为0"); // 判断是否有被锁住 if (!LockHelper::lock($lock_key, $identification, 100, 100)) { throw new \Exception("红包被锁定请稍后进行操作"); } $model = self::findOne(['user_id' => $params['user_id'], 'status' => StatusEnum::ENABLED]); if (empty($model)) { $model = new self(); $model->mall_id = $params['mall_id']; $model->user_id = $params['user_id']; $model->loadDefaultValues(); } // 红包变动字段处理 $field = $params['is_frozen'] == false ? 'redpack' : 'frozen_redpack'; $use_field = $params['is_frozen'] == false ? 'total_use_redpack' : 'total_use_frozen_redpack'; $total_field = $params['is_frozen'] == false ? 'total_redpack' : 'total_frozen_redpack'; $redpack_wallet_type = $params['is_frozen'] == false ? RedpackEnum::WALLET_REDPACK : RedpackEnum::WALLET_REDPACK_FROZEN; if ($params['money'] < 0) { if (($model[$field] + $params['money']) < 0) { if (isset($params['is_deduct']) && $params['is_deduct'] == true) { $params['money'] = -$model[$field]; if ($params['money'] == 0) { throw new \Exception(RedpackEnum::getRedpackText($redpack_wallet_type, $params['mall_id']) . "余额不足"); } } else { throw new \Exception(RedpackEnum::getRedpackText($redpack_wallet_type, $params['mall_id']) . "余额不足"); } } $model[$use_field] = $model[$use_field] + abs($params['money']); } $model[$field] = $model[$field] + $params['money']; $after_num = $model[$field];// 变动后余额 $params['money'] > 0 && empty($params['no_icr_total']) && $model[$total_field] = $model[$total_field] + $params['money']; if (!$model->save()) throw new Exception($model->getErrorMessage()); // 增加余额变动记录 if ($is_log) { $res = RedpackWalletLog::setData([ 'mall_id' => $params['mall_id'], 'user_id' => $params['user_id'], 'redpack_wallet_type' => $redpack_wallet_type, 'change_type' => $params['money'] > 0 ? RedpackEnum::CHANGE_TYPE_ADD : RedpackEnum::CHANGE_TYPE_SUB, 'change_num' => abs($params['money']), 'after_num' => $after_num, 'desc' => $params['desc'] ?? '', 'source_table' => $params['source_table'] ?? '', 'source_table_id' => $params['source_table_id'] ?? 0, 'from_type' => $params['from_type'], ]); if ($res == false) throw new \Exception(RedpackWalletLog::getStaticError()); } $trans->commit(); // 解锁 LockHelper::uLock($lock_key, $identification); return ['redpack' => $model->toArray(), 'money' => abs($params['money'])]; } catch (\Exception $e) { self::setStaticError($e->getMessage()); $trans->rollBack(); // 解锁 LockHelper::uLock($lock_key, $identification); return false; } } }