From 5831ba4ac2d89824656b7d1266fc47e701f1ce46 Mon Sep 17 00:00:00 2001 From: yanzai Date: Tue, 1 Oct 2024 15:44:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=A5=97=E9=A4=90=E6=8E=A8?= =?UTF-8?q?=E8=8D=90=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/API/H5/ComboController.php | 51 +++++++++++++++++-- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/Laravel/app/Http/Controllers/API/H5/ComboController.php b/Laravel/app/Http/Controllers/API/H5/ComboController.php index ceaa1a0..651bb0e 100644 --- a/Laravel/app/Http/Controllers/API/H5/ComboController.php +++ b/Laravel/app/Http/Controllers/API/H5/ComboController.php @@ -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); + } }