db->close(); $lock_key = RedisKeyEnum::suffix('lock_commission_incr_'); $identification = uniqid(); if (!LockHelper::lock($lock_key, $identification, 300, 10)) throw new \Exception('收益增值服务进入处理阶段,当前访问过多'); $mall_list = Mall::getEnableMallList(true); $mall_ids = array_column($mall_list, 'id'); if (empty($mall_ids)) { echo '没有可用商城,不做处理 ... ' . PHP_EOL; return ExitCode::UNSPECIFIED_ERROR; } $today_start_time = strtotime(date('Y-m-d')); foreach ($mall_ids as $mall_id) { $exist = CommissionIncrementLog::find()->where(['mall_id' => $mall_id, 'wallet_type' => 'commission','status' => StatusEnum::ENABLED])->andWhere(['>', 'created_at', $today_start_time])->one(); if($exist) continue; //查询商城设置 $setting = \Yii::$app->services->setting->mall->get($mall_id, 'withdraw_income'); $is_enable_income_increment = $setting['is_enable_income_increment'] ?? 0; $income_increment = $setting['income_increment'] ?? 0; //添加记录 $incr_log = CommissionIncrementLog::setData([ 'mall_id' => $mall_id, 'wallet_type' => 'commission', 'enable' => $is_enable_income_increment, 'radio' => $income_increment, ]); if(!$is_enable_income_increment || !$income_increment){ continue; } //执行增值服务 $incr_log_id = $incr_log->id; $this->increment($mall_id,$income_increment, $incr_log_id); } LockHelper::uLock($lock_key,$identification); return ExitCode::OK; }catch (\Exception $e){ return ExitCode::UNSPECIFIED_ERROR; } } private function increment($mall_id,$radio, $incr_log_id) { //查询所有用户 $query = UserWallet::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED])->andWhere(['>', 'commission', 0]);; $total = $total_user_num = 0; foreach ($query->batch(200) as $list) { $insert_wallet = []; foreach ($list as $item) { $user_commission = $item['commission'] ?? 0; $incr = bcmul($user_commission, $radio / 100, 2); //除以365 $incr = bcdiv($incr, 365, 2); if ($incr < 0.01) continue; $insert_wallet[] = [ 'is_frozen' => false, 'user_id' => $item['user_id'], 'mall_id' => $mall_id, 'order_id' => 0, 'wallet_type' => 'commission', 'money' => $incr, 'source_table' => CommissionIncrementLog::tableName(), 'source_table_id' => $incr_log_id, 'from_type' => 'PromotionCenter', 'capital_type' => 'day_increment', 'order_no' => '', 'desc' => '用户当前持有的收益增值', ]; $total = bcadd($total, $incr, 2); $total_user_num++; } if($insert_wallet){ $res = UserWalletService::batchHandle($insert_wallet); if (empty($res)) throw new \Exception(UserWalletService::getStaticError()); } } CommissionIncrementLog::updateAll(['send_num' => $total, 'send_user_num' => $total_user_num], ['id' => $incr_log_id]); } }