316 lines
13 KiB
PHP
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;
|
|
}
|
|
}
|