Tablas de datos que requieren modificaciones
- w_ad_app // Almacena datos agregados de la alianza publicitaria
- w_ad_app_day_log // Registra estadísticas diarias por aplciación en la alianza
- w_ad_member_app_day_log // Captura datos diarios de la alianza por usuario
- w_ad_bill_[identificador_alianza] // Recopila facturas de la alianza específica
Alteraciones necesarias en el código fuente
- Añadir configuraciones predeterminadas para el control de riesgos en el archivo:
niucloud-master/niucloud/addon/w_ad/app/dict/ad/AdRiskDict.php
- Definir un diccionario para tipos de publicidad en:
niucloud-master/niucloud/addon/w_ad/app/dict/ad/AdTypeDict.php
- Incorporar mapeo de diccionario publicitario mediante el método
rewardMoney() en: niucloud/addon/w_ad/app/service/api/ad/AdLogService.php
- Agregar referencias de diccionario en los métodos
edit() y getPage() dentro de: niucloud/addon/w_ad/app/service/admin/ad/AdMemberAppDayLogService.php y niucloud/addon/w_ad/app/service/admin/ad/AdAppDayLogService.php
- Extender los campos de respuesta en
getInfo() y getPage() en: niucloud/addon/w_ad/app/service/admin/ad/AdAppService.php
- Modificar el mapeo de diccionario en
edit() y getPage() para la capa de API en: niucloud/addon/w_ad/app/service/api/ad/AdAppService.php
- Reforzar la lógica de retiro para cuentas congeladas en:
niucloud-master/niucloud/app/api/controller/member/MemberCashOut.php
Ejemplo modificado: solicitud de retiro con validaciones
public function apply(array $params) {
$withdrawal_config = (new CashOutService())->getConfigurations($params['account_type']);
$limit_count = 0;
foreach ($withdrawal_config as $config) {
if ($config['amount'] == $params['requested_amount']) {
$limit_count = $config['daily_limit'];
}
}
$current_count = (new MemberCashOut())->whereBetweenTime('created_at')->where([
['amount_requested', '=', $params['requested_amount']],
['status', 'in', [1, 2, 3]],
['user_id', '=', $this->user_id]
])->count();
if ($current_count >= $limit_count) {
throw new CommonException('Límite de retiros diarios para ' . $params['requested_amount'] . ' unidades alcanzado');
}
$user_data = (new Member())->where('user_id', $this->user_id)->field('account_status')->findOrEmpty();
if (!$user_data['account_status']) {
throw new CommonException('Cuenta bloqueada: retiro no permitido');
}
return (new CoreMemberCashOutService())->processWithdrawal($this->site_id, $this->user_id, $params);
}
- Ajustar terminología en los diccionarios de idioma, cambiando referencias a monedas virtuales en:
niucloud-master/niucloud/app/lang/zh-cn/dict.php
- Expandir la tabla de miembros con un campo para saldos en proceso de retiro, integrado en el modelo de datos
- Optimizar el flujo de aprobación automática basado en umbrales de monto en:
niucloud-master/niucloud/app/service/core/member/CoreMemberCashOutService.php, cerca de la línea 170
Lógica de aprobación automática revisada
if ($global_config['auto_approval_enabled']) {
$approval_service = new CoreMemberCashOutService();
$ecpm_average = (new CoreMemberBindingService())->calculateAverageEcpm($user_id);
$auto_approve = false;
if ($ecpm_average <= 0.3 && $params['requested_amount'] <= 3) {
$auto_approve = true;
}
$historical_total = (new MemberBinding())->where('user_id', $user_id)->field('total_withdrawn')->findOrEmpty();
if ($params['requested_amount'] <= 5 && $historical_total['total_withdrawn'] >= 50) {
$auto_approve = true;
}
if ($auto_approve) {
$approval_service->approveWithdrawal($site_id, $withdrawal->id, 'accepted');
}
}
- Habilitar ajustes de saldos virtuales desde el panel admniistrativo mediante:
- Definir tipos de cambio en cuentas para monedas y comisiones en:
niucloud-master/niucloud/app/dict/member/account_change_type.php
- Agregar términos localizados en los archivos de idioma del módulo correspondiente
- Implementar controladores y servicios para gestionar ajustes manuales, con rutas específicas en:
niucloud-master/niucloud/app/adminapi/route/member.php
- Geolocalización de direcciones IP para usuarios, extrayendo región y ciudad en el modelo:
niucloud-master/niucloud/app/model/member/Member.php
Implementación de mapeo IP a ubicación
public function resolveGeoLocationAttribute($value, $attributes): string {
$ip_address = $attributes['last_login_ip'];
try {
$db_path = app()->getRootPath() . 'addon/w_ad/app/extend/ip2region/ip2region.xdb';
$geo_searcher = \addon\w_ad\app\extend\ip2region\XdbSearcher::createFromFile($db_path);
$region_data = $geo_searcher->lookup($ip_address);
if ($region_data === null) {
return 'Ubicación no disponible';
}
$parts = explode('|', $region_data);
return $parts[2] . ', ' . $parts[3] . ', ' . $parts[4];
} catch (Exception $e) {
log_error('Error al procesar IP: ' . $e->getMessage());
return 'Error en geolocalización';
}
}