love_php/app/Jobs/InsideUserMatch.php
2026-04-02 09:20:51 +08:00

316 lines
13 KiB
PHP

<?php
namespace App\Jobs;
use App\Models\Server\TouristOrder;
use App\Services\UserMatchService;
use Exception;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
class InsideUserMatch implements ShouldQueue
{
public $tries = 1;
public $timeout = 3600;
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $man_list;
public $women_list;
public $activity_id;
/**
* Create a new job instance.
*
* @param $man_list
* @param $women_list
* @param $activity_id
*/
public function __construct($man_list, $women_list, $activity_id)
{
$this->man_list = $man_list;
$this->women_list = $women_list;
$this->activity_id = $activity_id;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
try {
$man = [];
$women = [];
foreach ($this->man_list as $key => $val) {
$man[] = $val['user_id'];
$man_info[$val['user_id']] = $val;
$man_info[$val['user_id']]['member'] = $val['member'];
$man_age[$val['user_id']] = $this->getAge($val['birthday']);
}
foreach ($this->women_list as $key => $val) {
$women[] = $val['user_id'];
$women_info[$val['user_id']] = $val;
$women_info[$val['user_id']]['member'] = $val['member'];
$women_age[$val['user_id']] = $this->getAge($val['birthday']);
}
$sum = 0;
foreach ($man as $key => $val) {
$sum += $val;
}
foreach ($women as $key => $val) {
$sum += $val;
}
$total_array_num = intval(sizeof($women) / 3);
$remainder = sizeof($women) % 3;
asort($man_age);
asort($women_age);
$x = 0;
for ($i = 1; $i <= $total_array_num;) {
foreach ($man_age as $key => $val) {
if ($x % 3 == 0) {
if ($x >= 3) {
if ($i != $total_array_num) {
$i++;
}
}
$man_array[$i][$key] = $val;
$x = $x + 1;
} else {
$man_array[$i][$key] = $val;
$x = $x + 1;
if ($x >= sizeof($man_age)) {
$i += 1;
break;
}
}
}
}
$x = 0;
for ($i = 1; $i <= $total_array_num;) {
foreach ($women_age as $key => $val) {
if ($x % 3 == 0) {
if ($x >= 3) {
if ($i != $total_array_num) {
$i++;
}
}
$women_array[$i][$key] = $val;
$x = $x + 1;
} else {
$women_array[$i][$key] = $val;
$x = $x + 1;
if ($x >= sizeof($women_age)) {
$i += 1;
break;
}
}
}
}
$before_women_list = [];
$this_man_age = null;
$before_women = null;
$matach_man_1 = [];
foreach ($man_array as $key => $val) {
foreach ($val as $val_key => $val_val) {
$this_man_age = $val_val;
$before_diff_age = 100;
foreach ($matach_man_1 as $m2_key => $m2_val) {
$before_women_list[$m2_val] = $women_age[$m2_val];
}
if ($before_women || $before_women_list) {
$math_women_age = array_diff_key($women_array[$key], $before_women_list);
} else {
$math_women_age = $women_array[$key];
}
foreach ($math_women_age as $math_women_key => $math_women_val) {
$this_women_age = $math_women_val;
$diff_age = abs($this_man_age - $this_women_age);
if ($diff_age < $before_diff_age) {
$before_diff_age = $diff_age;
$before_women = $math_women_key;
//$recommend_women_age = $this_women_age;
}
}
if(!in_array($before_women,$matach_man_1)){
$matach_man_1[$val_key] = $before_women;
}
}
}
//第二次匹配
$before_women_list = [];
$this_man_age = null;
$before_women = null;
$matach_man_2 = [];
foreach ($man_array as $key => $val) {
foreach ($val as $val_key => $val_val) {
$this_man_age = $val_val;
$before_diff_age = 100;
$before_women_list[$matach_man_1[$val_key]] = $women_age[$matach_man_1[$val_key]];
foreach ($matach_man_2 as $m2_key => $m2_val) {
$before_women_list[$m2_val] = $women_age[$m2_val];
}
if ($before_women || $before_women_list) {
$math_women_age = array_diff_key($women_array[$key], $before_women_list);
} else {
$math_women_age = $women_array[$key];
}
foreach ($math_women_age as $math_women_key => $math_women_val) {
$this_women_age = $math_women_val;
$diff_age = abs($this_man_age - $this_women_age);
if ($diff_age < $before_diff_age) {
$before_diff_age = $diff_age;
$before_women = $math_women_key;
$recommend_women_age = $this_women_age;
}
}
if (in_array($before_women, $matach_man_2) && sizeof($matach_man_2) < sizeof($women)) {
foreach ($women_array[$key] as $x => $y) {
$compare_array[] = $x;
}
$diff_array = array_values(array_diff($compare_array, $matach_man_2));
$compare_array = [];
$user_age = $women_age[$diff_array[0]];
$match = 0;
$matach_man_2_temp = array_reverse($matach_man_2, true);
$matach_man_2_temp = array_intersect_key($matach_man_2_temp, $val);
foreach ($matach_man_2_temp as $key_temp => $val_temp) {
$man_age_temp = $man_age[$key_temp];
if ($matach_man_1[$key_temp] == $diff_array[0] || $matach_man_2[$key_temp] == $diff_array[0]) {
continue;
} else {
$temp = $matach_man_2[$key_temp];
if ($matach_man_1[$key_temp] == $temp) {
continue;
}
$matach_man_2[$key_temp] = $diff_array[0];
$matach_man_2[$val_key] = $temp;
$match = 1;
break;
}
}
if (!$match) {
$matach_man_2[$val_key] = $before_women;
}
} else {
if(!in_array($before_women,$matach_man_2)) {
$matach_man_2[$val_key] = $before_women;
}
}
$before_women_list = [];
}
}
//第三次匹配
$before_women_list = [];
$this_man_age = null;
$before_women = null;
$matach_man_3 = [];
foreach ($man_array as $key => $val) {
foreach ($val as $val_key => $val_val) {
$this_man_age = $val_val;
$before_diff_age = 100;
$before_women_list[$matach_man_1[$val_key]] = $women_age[$matach_man_1[$val_key]];
$before_women_list[$matach_man_2[$val_key]] = $women_age[$matach_man_2[$val_key]];
foreach ($matach_man_3 as $m3_key => $m3_val) {
$before_women_list[$m3_val] = $women_age[$m3_val];
}
if ($before_women || $before_women_list) {
$math_women_age = array_diff_key($women_array[$key], $before_women_list);
} else {
$math_women_age = $women_array[$key];
}
foreach ($math_women_age as $math_women_key => $math_women_val) {
$this_women_age = $math_women_val;
$diff_age = abs($this_man_age - $this_women_age);
if ($diff_age < $before_diff_age) {
$before_diff_age = $diff_age;
$before_women = $math_women_key;
//$recommend_women_age = $this_women_age;
}
}
if (in_array($before_women, $matach_man_3) && sizeof($matach_man_3) < sizeof($women)) {
foreach ($women_array[$key] as $x => $y) {
$compare_array[] = $x;
}
$diff_array = array_values(array_diff($compare_array, $matach_man_3));
$match = 0;
$matach_man_3_temp = array_reverse($matach_man_3, true);
$matach_man_3_temp = array_intersect_key($matach_man_3_temp, $val);
foreach ($matach_man_3_temp as $key_temp => $val_temp) {
if ($matach_man_2[$key_temp] == $diff_array[0] || $matach_man_1[$key_temp] == $diff_array[0] ||
$matach_man_3[$key_temp] == $diff_array[0]) {
continue;
} else {
$temp = $matach_man_3[$key_temp];
if ($matach_man_1[$key_temp] == $temp || $matach_man_2[$key_temp] == $temp) {
continue;
}
$matach_man_3[$key_temp] = $diff_array[0];
$matach_man_3[$val_key] = $temp;
$match = 1;
break;
}
}
if (!$match) {
$matach_man_3[$val_key] = $before_women;
}
} else {
if(!in_array($before_women,$matach_man_3)) {
$matach_man_3[$val_key] = $before_women;
}
}
$before_women_list = [];
}
}
foreach ($man_age as $key => $val) {
$match_return[$key][] = $matach_man_1[$key];
$match_return[$key][] = $matach_man_2[$key];
$match_return[$key][] = $matach_man_3[$key];
}
foreach ($match_return as $key => $val) {
foreach ($val as $val_key => $val_val) {
$user['send_user'] = $women_info[$val_val];
$user['receive'] = $man_info[$key];
$match_man[$key][$val_key] = $user;
}
}
$return_data = array_values($match_man);
Redis::setex('ai:recmd:score:inside:' . $this->activity_id . '_' . $sum, 60*60, json_encode($return_data));
} catch (\Exception $e) {
throw new \Exception($e);
}
}
public function getAge($birthday): int
{
if (empty($birthday)) {
return 0;
}
$age = strtotime($birthday);
if ($age === false) {
return 0;
}
list($y1, $m1, $d1) = explode("-", date("Y-m-d", $age));
$now = strtotime("now");
list($y2, $m2, $d2) = explode("-", date("Y-m-d", $now));
$age = $y2 - $y1;
if ((int)($m2 . $d2) < (int)($m1 . $d1))
$age -= 1;
return $age;
}
}