完成套餐推荐接口

wenjuan
yanzai 1 year ago
parent 683dba44c4
commit 5831ba4ac2

@ -386,10 +386,41 @@ select combo_id as c_id,count(*) as sale_count from orders where status in(2,4)
{
$item_ids = request('item_ids'); //购买的套餐id
$person_id = request('person_id'); //就诊人id
$person=DB::table('web_user_person')->where(['id' => $person_id,'is_del'=>0])->first();
if(!$person) return \Yz::echoError1("用户不存在");
//统计勾选的项目总额
$item_all_price=DB::table('items')->whereIn('item_id',$item_ids)->where(['status' => 1])->sum('price');
$allCombos = DB::table('combos as a')->leftJoin('combo_items as b','a.combo_id','=','b.combo_id')->whereIn('a.sex',[$person->sex,0])->where(['a.status'=>1])->get();
$combo_temp=[];
foreach ($allCombos as $key => $combo) {
$c_id=$combo->combo_id;
if (!isset($combo_temp[$c_id])) {
$groupedData[$c_id] = [];
}
$combo_temp[$c_id][] = $combo->item_id;
}
// 用于存储每个数组及其与目标数组的相似度
$similarities = [];
foreach ($combo_temp as $index => $array) {
$similarity = $this->jaccard_similarity($item_ids, $array);
$similarities[$index] = $similarity;
}
// 对相似度进行排序,保持索引关联
arsort($similarities);
// 获取最相似的前两个数组
$topTwoIndexes = array_keys($similarities, current($similarities), true); // 第一个最大值
next($similarities);
$topTwoIndexes[] = key($similarities); // 第二个最大值
$ids= "'" . implode("','", $topTwoIndexes) . "'";
$combos = DB::select("select * from combos as a LEFT JOIN (
select combo_id as c_id,count(*) as count from orders where status in(2,4) group by combo_id
) as b on a.combo_id=b.c_id where a.status=1 and a.combo_id in ('2053','1135')");
) as b on a.combo_id=b.c_id where a.status=1 and a.combo_id in (".$ids.")");
foreach ($combos as $key => $combo) {
$tags = json_decode($combo->tags, true);
@ -407,12 +438,24 @@ select combo_id as c_id,count(*) as count from orders where status in(2,4) group
'color' => '#E9F8F3',
];
$combo->recommend = [
'xiangsidu' => '80%',
'count' => "-5",
'money' => "-150"
'xiangsidu' => (string)(number_format($similarities[$combo->combo_id],2)*100).'%',
'count' => $combo->item_count-count($item_ids),
'money' => number_format($combo->price - $item_all_price,2)
];
}
return \Yz::Return(true, "查询完成", ['combos' => $combos]);
}
function jaccard_similarity($set1, $set2) {
// 计算交集
$intersection = array_intersect($set1, $set2);
// 计算并集
$union = array_unique(array_merge($set1, $set2));
// 避免除数为0的情况
if (count($union) == 0) return 0;
// 返回Jaccard相似度
return count($intersection) / count($union);
}
}

Loading…
Cancel
Save