BasicPanel.php 85 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585
  1. <?php
  2. namespace App\Http\Controllers\manager\Statistics;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Requests\Manager\Statistics\BasicPanel as request;
  5. use App\Models\Manager\Process\LowPriceGoods as LowPriceGoodsModel;
  6. use App\Models\Manager\Process\ViolationProduct as ViolationProductModel;
  7. use App\Models\Manager\Process\ViolationStore as ViolationStoreModel;
  8. use App\Models\Manager\Collect\Product as ProductModel;
  9. use Illuminate\Support\Facades\DB;
  10. use Illuminate\Support\Carbon;
  11. use App\Models\Manager\Collect\ProductTask as ProductTaskModel;
  12. use PhpParser\Node\Stmt\Foreach_;
  13. /**
  14. * 数据分析-基础概览面板
  15. * @author 唐远望
  16. * @version 1.0
  17. * @date 2026-02-10
  18. *
  19. */
  20. class BasicPanel extends Controller
  21. {
  22. /*
  23. * 挂网数据统计
  24. * @author 唐远望
  25. * @version 1.0
  26. * @date 2026-02-10
  27. *
  28. */
  29. public function get_online_goods_count(request $request, LowPriceGoodsModel $lowPriceGoodsModel, ViolationProductModel $violationProductModel, ViolationStoreModel $violationStoreModel, ProductModel $productModel)
  30. {
  31. $request->scene('get_online_goods_count')->validate();
  32. $admin_company_id = request('admin_company_id', '0');
  33. $company_id = request('access_token.company_id', '0');
  34. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  35. $product_name = request('product_name', ''); //商品名称
  36. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  37. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  38. $start_time_string = request('start_time', '');
  39. $end_time_string = request('end_time', '');
  40. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  41. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  42. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  43. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  44. // 时间条件
  45. $map = [];
  46. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  47. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  48. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  49. // 统计挂网商品数量=低价挂网商品数量(去重)+ 禁止挂网商品数量(去重)
  50. $lowPriceGoodsModel = $lowPriceGoodsModel->query();
  51. $violationProductModel = $violationProductModel->query();
  52. if ($is_admin != 1 && $company_id != 0) {
  53. $lowPriceGoodsModel = $lowPriceGoodsModel->where('company_id', $company_id);
  54. $violationProductModel = $violationProductModel->where('company_id', $company_id);
  55. $violationStoreModel = $violationStoreModel->where('company_id', $company_id);
  56. } else {
  57. $lowPriceGoodsModel = $lowPriceGoodsModel->where('company_id', $admin_company_id);
  58. $violationProductModel = $violationProductModel->where('company_id', $admin_company_id);
  59. $violationStoreModel = $violationStoreModel->where('company_id', $admin_company_id);
  60. }
  61. //获取采集商品数量
  62. $collect_statistics_data = $this->get_product_count($start_time, $end_time, $product_name, $is_admin, $company_id, $admin_company_id);
  63. // 低价挂网商品数量查询
  64. $lowPriceGoodsCount = $lowPriceGoodsModel->where($map)
  65. ->where('status', 0)
  66. ->get()->count();
  67. // 禁止挂网商品数量查询
  68. $violationProductCount = $violationProductModel->where($map)
  69. ->where('status', 0)
  70. ->get()->count();
  71. $store_map = [];
  72. if ($start_time) $store_map[] = ['insert_time', '>=', $start_time];
  73. if ($end_time) $store_map[] = ['insert_time', '<=', $end_time];
  74. // 违规店铺数量查询
  75. $violationStoreCount = $violationStoreModel->where($store_map)
  76. ->where('status', 0)
  77. ->groupBy('store_name')
  78. ->select('store_name')
  79. ->get()->count();
  80. $result_data = [
  81. 'low_price_goods_count' => $lowPriceGoodsCount, // 低价挂网商品数量
  82. 'violation_product_count' => $violationProductCount, // 禁止挂网商品数量
  83. 'violation_store_count' => $violationStoreCount, // 违规店铺数量
  84. 'totle_product_count' => $lowPriceGoodsCount + $violationProductCount, // 总商品数量
  85. ];
  86. $result_data = array_merge($result_data, $collect_statistics_data);
  87. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result_data]);
  88. }
  89. /**
  90. * 品规数量统计
  91. * @author 唐远望
  92. * @version 1.0
  93. * @date 2026-02-10
  94. *
  95. */
  96. private function get_product_count($start_time, $end_time, $product_name, $is_admin, $company_id, $admin_company_id)
  97. {
  98. $ProductTaskModel = new ProductTaskModel();
  99. $select_company_id = 0;
  100. if ($is_admin != 1 && $company_id != 0) {
  101. $select_company_id = $company_id;
  102. } else {
  103. $select_company_id = $admin_company_id;
  104. }
  105. $map = [];
  106. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  107. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  108. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  109. //获取B端品规数量
  110. //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  111. $collect_b_product_count = 0;
  112. $collect_b_product_list_data = $ProductTaskModel
  113. ->whereIn('platform',['0', '5', '6', '7', '8', '9', '10'])//1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  114. ->where('company_id', $select_company_id)
  115. ->where($map)
  116. ->get()->toarray();
  117. $collect_b_product_list =[];
  118. if(!empty($collect_b_product_list_data)){
  119. foreach ($collect_b_product_list_data as $key => $value) {
  120. $collect_b_product_name =trim($value['product_brand'].'_'. $value['product_name']);
  121. $collect_b_product_specs = $value['product_specs'] !='' ? explode(',', $value['product_specs']) : [];
  122. if(isset($collect_b_product_list[$collect_b_product_name])){
  123. $collect_b_product_list[$collect_b_product_name] = array_merge($collect_b_product_list[$collect_b_product_name],$collect_b_product_specs);
  124. }else{
  125. $collect_b_product_list[$collect_b_product_name] = $collect_b_product_specs;
  126. }
  127. //去重$collect_b_product_list[$collect_b_product_name]数据
  128. $collect_b_product_list[$collect_b_product_name] =count($collect_b_product_list[$collect_b_product_name]) > 0 ? array_unique($collect_b_product_list[$collect_b_product_name]):[];
  129. }
  130. }
  131. //计算B端品规数量
  132. if(!empty($collect_b_product_list)){
  133. foreach ($collect_b_product_list as $key => $value) {
  134. if(empty($value)) $value = ['全量采集'];
  135. $collect_b_product_count = $collect_b_product_count + count($value);
  136. }
  137. }
  138. //获取C端品规数量
  139. //C端:美团、拼多多、天猫、京东、药房网
  140. $collect_c_product_count = 0;
  141. $collect_c_product_list_data = $ProductTaskModel
  142. ->whereIn('platform',['0', '1', '2', '3', '4', '11'])//1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  143. ->where('company_id', $select_company_id)
  144. ->where($map)
  145. ->get()->toarray();
  146. $collect_c_product_list =[];
  147. if(!empty($collect_c_product_list_data)){
  148. foreach ($collect_c_product_list_data as $key => $value) {
  149. $collect_c_product_name = trim($value['product_brand'].'_'. $value['product_name']);
  150. $collect_c_product_specs = $value['product_specs'] !='' ? explode(',', $value['product_specs']) : [];
  151. if(isset($collect_c_product_list[$collect_c_product_name])){
  152. $collect_c_product_list[$collect_c_product_name] = array_merge($collect_c_product_list[$collect_c_product_name],$collect_c_product_specs);
  153. }else{
  154. $collect_c_product_list[$collect_c_product_name] = $collect_c_product_specs;
  155. }
  156. //去重$collect_c_product_list[$collect_c_product_name]数据
  157. $collect_c_product_list[$collect_c_product_name] = count($collect_c_product_list[$collect_c_product_name]) > 0 ? array_unique($collect_c_product_list[$collect_c_product_name]):[];
  158. }
  159. }
  160. //计算C端品规数量
  161. if(!empty($collect_c_product_list)){
  162. foreach ($collect_c_product_list as $key => $value) {
  163. if(empty($value)) $value = ['全量采集'];
  164. $collect_c_product_count = $collect_c_product_count + count($value);
  165. }
  166. }
  167. //获取所有终端品规数量
  168. $collect_totle_product_count = $collect_b_product_count + $collect_c_product_count;
  169. //合并去重C端品规,以及B端品规数据
  170. $collect_product_list_data =[];
  171. if(count($collect_c_product_list) > 0){
  172. foreach ($collect_c_product_list as $key => $value) {
  173. $product_specs_name =$key;
  174. if(count($value)){
  175. foreach ($value as $k => $v) {
  176. $product_specs_name = $product_specs_name .'_'. $v;
  177. $collect_product_list_data[$product_specs_name] ='1';
  178. }
  179. }else{
  180. $collect_product_list_data[$key] ='1';
  181. }
  182. }
  183. }
  184. if(count($collect_b_product_list) > 0){
  185. foreach ($collect_b_product_list as $key => $value) {
  186. $product_specs_name =$key;
  187. if(count($value)){
  188. foreach ($value as $k => $v) {
  189. $product_specs_name = $product_specs_name .'_'. $v;
  190. $collect_product_list_data[$product_specs_name] ='1';
  191. }
  192. }else{
  193. $collect_product_list_data[$key] ='1';
  194. }
  195. }
  196. }
  197. //显示去重后的数量
  198. $collect_totle_product_count = count($collect_product_list_data);
  199. $result_data = [
  200. 'collect_b_product_count' => $collect_b_product_count, // B端品规数量
  201. 'collect_c_product_count' => $collect_c_product_count, // C端品规数量
  202. 'collect_oto_product_count' => 0, // OTO品规数量
  203. 'collect_totle_product_count' => $collect_totle_product_count, // 所有终端品规数量
  204. 'collect_c_product_data' => $collect_c_product_list, // C端品规数据
  205. 'collect_b_product_data' => $collect_b_product_list, // B端品规数据
  206. 'collect_product_list_data' => $collect_product_list_data, // 所有终端品规数据
  207. ];
  208. return $result_data;
  209. }
  210. /**
  211. * 禁止挂网商品数统计
  212. * @author 唐远望
  213. * @version 1.0
  214. * @date 2026-02-10
  215. *
  216. */
  217. public function get_violation_product_count(request $request, ViolationProductModel $violationProductModel)
  218. {
  219. $request->scene('get_violation_product_count')->validate();
  220. $admin_company_id = request('admin_company_id', '0');
  221. $company_id = request('access_token.company_id', '0');
  222. //终端类型B端、C端、OTO
  223. $terminal_type = request('terminal_type', '');
  224. $product_name = request('product_name', ''); //商品名称
  225. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  226. $limit = request('limit', config('page_num', 10));
  227. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  228. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  229. $start_time_string = request('start_time', '');
  230. $end_time_string = request('end_time', '');
  231. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  232. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  233. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  234. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  235. // 时间条件
  236. $map = [];
  237. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  238. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  239. // 权限判断
  240. if ($is_admin != 1 && $company_id != 0) {
  241. $map[] = ['company_id', '=', $company_id];
  242. } else {
  243. $map[] = ['company_id', '=', $admin_company_id];
  244. }
  245. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  246. $violationProductModel = $violationProductModel->query();
  247. if ($terminal_type) {
  248. $platform = [];
  249. switch ($terminal_type) {
  250. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  251. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  252. break;
  253. case '2': //C端:美团、拼多多、天猫、京东、药房网
  254. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  255. break;
  256. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  257. $platform = ['0'];
  258. break;
  259. default:
  260. # code...
  261. break;
  262. }
  263. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  264. }
  265. $result = $violationProductModel->where($map)->where('status', 0)
  266. ->select(['product_name', DB::raw('count(product_name) as count')])->distinct('product_name')->orderby('count', 'desc')
  267. ->groupby('product_name')->paginate($limit);
  268. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  269. }
  270. /**
  271. * 禁止挂网省份统计
  272. * @author 唐远望
  273. * @version 1.0
  274. * @date 2026-02-10
  275. *
  276. */
  277. public function get_violation_province_count(request $request, ViolationProductModel $violationProductModel)
  278. {
  279. $request->scene('get_violation_province_count')->validate();
  280. $admin_company_id = request('admin_company_id', '0');
  281. $company_id = request('access_token.company_id', '0');
  282. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  283. //终端类型B端、C端、OTO
  284. $terminal_type = request('terminal_type', '');
  285. $product_name = request('product_name', ''); //商品名称
  286. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  287. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  288. $start_time_string = request('start_time', '');
  289. $end_time_string = request('end_time', '');
  290. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  291. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  292. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  293. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  294. // 时间条件
  295. $map = [];
  296. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  297. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  298. // 权限判断
  299. if ($is_admin != 1 && $company_id != 0) {
  300. $map[] = ['company_id', '=', $company_id];
  301. } else {
  302. $map[] = ['company_id', '=', $admin_company_id];
  303. }
  304. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  305. // 禁止挂网省份统计
  306. $violationProductModel = $violationProductModel->query();
  307. if ($terminal_type) {
  308. $platform = [];
  309. switch ($terminal_type) {
  310. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  311. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  312. break;
  313. case '2': //C端:美团、拼多多、天猫、京东、药房网
  314. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  315. break;
  316. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  317. $platform = ['0'];
  318. break;
  319. default:
  320. # code...
  321. break;
  322. }
  323. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  324. }
  325. try {
  326. // 假设 ViolationProductModel 中有 province 字段,表示省份信息
  327. // 查询指定时间范围内的数据,并按 province 分组统计数量
  328. $result = $violationProductModel->where($map)->where('status', 0)
  329. ->select(['province_name', DB::raw('count(province_name) as count')])
  330. ->groupby('province_name')
  331. ->orderby('count', 'desc')
  332. ->get()->toArray();
  333. $province_totle_count = 0;
  334. if (!empty($result)) {
  335. $province_totle_count = array_sum(array_column($result, 'count'));
  336. //计算占比
  337. foreach ($result as $key => $value) {
  338. $result[$key]['percent'] = round(($value['count'] / $province_totle_count) * 100, 2);
  339. }
  340. }
  341. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  342. } catch (\Exception $e) {
  343. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  344. }
  345. }
  346. /**
  347. * 禁止挂网城市统计
  348. * @author 唐远望
  349. * @version 1.0
  350. * @date 2026-02-10
  351. *
  352. */
  353. public function get_violation_city_count(request $request, ViolationProductModel $violationProductModel)
  354. {
  355. $request->scene('get_violation_city_count')->validate();
  356. $admin_company_id = request('admin_company_id', '0');
  357. $company_id = request('access_token.company_id', '0');
  358. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  359. //终端类型B端、C端、OTO
  360. $province_id = request('province_id', ''); //省份ID
  361. $terminal_type = request('terminal_type', '');
  362. $product_name = request('product_name', ''); //商品名称
  363. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  364. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  365. $start_time_string = request('start_time', '');
  366. $end_time_string = request('end_time', '');
  367. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  368. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  369. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  370. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  371. // 时间条件
  372. $map = [];
  373. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  374. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  375. // 权限判断
  376. if ($is_admin != 1 && $company_id != 0) {
  377. $map[] = ['company_id', '=', $company_id];
  378. } else {
  379. $map[] = ['company_id', '=', $admin_company_id];
  380. }
  381. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  382. if ($province_id) $map[] = ['province_id', '=', $province_id];
  383. // 禁止挂网城市统计
  384. $violationProductModel = $violationProductModel->query();
  385. if ($terminal_type) {
  386. $platform = [];
  387. switch ($terminal_type) {
  388. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  389. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  390. break;
  391. case '2': //C端:美团、拼多多、天猫、京东、药房网
  392. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  393. break;
  394. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  395. $platform = ['0'];
  396. break;
  397. default:
  398. # code...
  399. break;
  400. }
  401. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  402. }
  403. try {
  404. // 假设 ViolationProductModel 中有 city 字段,表示城市信息
  405. // 查询指定时间范围内的数据,并按 city 分组统计数量
  406. $result = $violationProductModel->where($map)->where('status', 0)
  407. ->select(['city_name', DB::raw('count(city_name) as count')])
  408. ->groupby('city_name')
  409. ->orderby('count', 'desc')
  410. ->get()->toArray();
  411. $city_totle_count = 0;
  412. if (!empty($result)) {
  413. $city_totle_count = array_sum(array_column($result, 'count'));
  414. //计算占比
  415. foreach ($result as $key => $value) {
  416. $result[$key]['percent'] = round(($value['count'] / $city_totle_count) * 100, 2);
  417. }
  418. }
  419. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  420. } catch (\Exception $e) {
  421. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  422. }
  423. }
  424. /**
  425. * 禁止挂网公司数统计
  426. * @author 唐远望
  427. * @version 1.0
  428. * @date 2026-02-10
  429. *
  430. */
  431. public function get_violation_company_count(request $request, ViolationProductModel $violationProductModel)
  432. {
  433. $request->scene('get_violation_company_count')->validate();
  434. $admin_company_id = request('admin_company_id', '0');
  435. $company_id = request('access_token.company_id', '0');
  436. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  437. //终端类型B端、C端、OTO
  438. $terminal_type = request('terminal_type', '');
  439. $limit = request('limit', config('page_num', 10));
  440. $product_name = request('product_name', ''); //商品名称
  441. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  442. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  443. $start_time_string = request('start_time', '');
  444. $end_time_string = request('end_time', '');
  445. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  446. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  447. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  448. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  449. // 时间条件
  450. $map = [];
  451. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  452. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  453. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  454. // 权限判断
  455. if ($is_admin != 1 && $company_id != 0) {
  456. $map[] = ['company_id', '=', $company_id];
  457. } else {
  458. $map[] = ['company_id', '=', $admin_company_id];
  459. }
  460. $violationProductModel = $violationProductModel->query();
  461. if ($terminal_type) {
  462. $platform = [];
  463. switch ($terminal_type) {
  464. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  465. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  466. break;
  467. case '2': //C端:美团、拼多多、天猫、京东、药房网
  468. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  469. break;
  470. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  471. $platform = ['0'];
  472. break;
  473. default:
  474. # code...
  475. break;
  476. }
  477. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  478. }
  479. $result = $violationProductModel->where($map)->where('status', 0)
  480. ->select(['company_name', DB::raw('count(company_name) as count')])->groupby('company_name')->orderby('count', 'desc')
  481. ->paginate($limit);
  482. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  483. }
  484. /*
  485. * 低价违规商品数统计
  486. * @author 唐远望
  487. * @version 1.0
  488. * @date 2026-02-10
  489. *
  490. */
  491. public function get_low_price_product_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  492. {
  493. $request->scene('get_low_price_product_count')->validate();
  494. $admin_company_id = request('admin_company_id', '0');
  495. $company_id = request('access_token.company_id', '0');
  496. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  497. //终端类型B端、C端、OTO
  498. $terminal_type = request('terminal_type', '');
  499. $limit = request('limit', config('page_num', 10));
  500. $product_name = request('product_name', ''); //商品名称
  501. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  502. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  503. $start_time_string = request('start_time', '');
  504. $end_time_string = request('end_time', '');
  505. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  506. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  507. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  508. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  509. // 时间条件
  510. $map = [];
  511. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  512. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  513. // 权限判断
  514. if ($is_admin != 1 && $company_id != 0) {
  515. $map[] = ['company_id', '=', $company_id];
  516. } else {
  517. $map[] = ['company_id', '=', $admin_company_id];
  518. }
  519. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  520. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  521. if ($terminal_type) {
  522. $platform = [];
  523. switch ($terminal_type) {
  524. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  525. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  526. break;
  527. case '2': //C端:美团、拼多多、天猫、京东、药房网
  528. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  529. break;
  530. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  531. $platform = ['0'];
  532. break;
  533. default:
  534. # code...
  535. break;
  536. }
  537. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  538. }
  539. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  540. ->select(['product_name', DB::raw('count(product_name) as count')])->distinct('product_name')->orderby('count', 'desc')
  541. ->groupby('product_name')->paginate($limit);
  542. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  543. }
  544. /*
  545. * 低价违规公司数统计
  546. * @author 唐远望
  547. * @version 1.0
  548. * @date 2026-02-10
  549. *
  550. */
  551. public function get_low_price_company_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  552. {
  553. $request->scene('get_low_price_company_count')->validate();
  554. $admin_company_id = request('admin_company_id', '0');
  555. $company_id = request('access_token.company_id', '0');
  556. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  557. //终端类型B端、C端、OTO
  558. $terminal_type = request('terminal_type', '');
  559. $limit = request('limit', config('page_num', 10));
  560. $product_name = request('product_name', ''); //商品名称
  561. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  562. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  563. $start_time_string = request('start_time', '');
  564. $end_time_string = request('end_time', '');
  565. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  566. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  567. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  568. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  569. // 时间条件
  570. $map = [];
  571. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  572. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  573. // 权限判断
  574. if ($is_admin != 1 && $company_id != 0) {
  575. $map[] = ['company_id', '=', $company_id];
  576. } else {
  577. $map[] = ['company_id', '=', $admin_company_id];
  578. }
  579. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  580. if ($terminal_type) {
  581. $platform = [];
  582. switch ($terminal_type) {
  583. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  584. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  585. break;
  586. case '2': //C端:美团、拼多多、天猫、京东、药房网
  587. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  588. break;
  589. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  590. $platform = ['0'];
  591. break;
  592. default:
  593. # code...
  594. break;
  595. }
  596. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  597. }
  598. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  599. $map[] = ['company_name', '!=', ''];
  600. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  601. ->select(['company_name', DB::raw('count(company_name) as count')])->groupby('company_name')->orderby('count', 'desc')
  602. ->paginate($limit);
  603. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  604. }
  605. /**
  606. * 低价挂网省份统计
  607. * @author 唐远望
  608. * @version 1.0
  609. * @date 2026-02-10
  610. *
  611. */
  612. public function get_low_price_province_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  613. {
  614. $request->scene('get_low_price_province_count')->validate();
  615. $admin_company_id = request('admin_company_id', '0');
  616. $company_id = request('access_token.company_id', '0');
  617. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  618. //终端类型B端、C端、OTO
  619. $terminal_type = request('terminal_type', '');
  620. $product_name = request('product_name', ''); //商品名称
  621. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  622. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  623. $start_time_string = request('start_time', '');
  624. $end_time_string = request('end_time', '');
  625. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  626. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  627. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  628. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  629. // 时间条件
  630. $map = [];
  631. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  632. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  633. // 权限判断
  634. if ($is_admin != 1 && $company_id != 0) {
  635. $map[] = ['company_id', '=', $company_id];
  636. } else {
  637. $map[] = ['company_id', '=', $admin_company_id];
  638. }
  639. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  640. // 禁止挂网省份统计
  641. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  642. if ($terminal_type) {
  643. $platform = [];
  644. switch ($terminal_type) {
  645. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  646. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  647. break;
  648. case '2': //C端:美团、拼多多、天猫、京东、药房网
  649. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  650. break;
  651. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  652. $platform = ['0'];
  653. break;
  654. default:
  655. # code...
  656. break;
  657. }
  658. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  659. }
  660. try {
  661. // 假设 LowPriceGoodsModel 中有 province 字段,表示省份信息
  662. // 查询指定时间范围内的数据,并按 province 分组统计数量
  663. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  664. ->select(['province_name', DB::raw('count(province_name) as count')])
  665. ->groupby('province_name')
  666. ->orderby('count', 'desc')
  667. ->get()->toArray();
  668. $province_totle_count = 0;
  669. if (!empty($result)) {
  670. $province_totle_count = array_sum(array_column($result, 'count'));
  671. foreach ($result as $key => $value) {
  672. $result[$key]['percent'] = round(($value['count'] / $province_totle_count) * 100, 2);
  673. }
  674. }
  675. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  676. } catch (\Exception $e) {
  677. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  678. }
  679. }
  680. /**
  681. * 低价挂网城市统计
  682. * @author 唐远望
  683. * @version 1.0
  684. * @date 2026-02-10
  685. *
  686. */
  687. public function get_low_price_city_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  688. {
  689. $request->scene('get_low_price_city_count')->validate();
  690. $admin_company_id = request('admin_company_id', '0');
  691. $company_id = request('access_token.company_id', '0');
  692. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  693. //终端类型B端、C端、OTO
  694. $province_id = request('province_id', ''); //省份id
  695. $terminal_type = request('terminal_type', '');
  696. $product_name = request('product_name', ''); //商品名称
  697. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  698. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  699. $start_time_string = request('start_time', '');
  700. $end_time_string = request('end_time', '');
  701. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  702. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  703. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  704. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  705. // 时间条件
  706. $map = [];
  707. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  708. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  709. // 权限判断
  710. if ($is_admin != 1 && $company_id != 0) {
  711. $map[] = ['company_id', '=', $company_id];
  712. } else {
  713. $map[] = ['company_id', '=', $admin_company_id];
  714. }
  715. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  716. if ($province_id) $map[] = ['province_id', '=', $province_id];
  717. // 禁止挂网城市统计
  718. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  719. if ($terminal_type) {
  720. $platform = [];
  721. switch ($terminal_type) {
  722. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  723. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  724. break;
  725. case '2': //C端:美团、拼多多、天猫、京东、药房网
  726. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  727. break;
  728. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  729. $platform = ['0'];
  730. break;
  731. default:
  732. # code...
  733. break;
  734. }
  735. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  736. }
  737. try {
  738. // 假设 LowPriceGoodsModel 中有 city 字段,表示城市信息
  739. // 查询指定时间范围内的数据,并按 city 分组统计数量
  740. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  741. ->select(['city_name', DB::raw('count(city_name) as count')])
  742. ->groupby('city_name')
  743. ->orderby('count', 'desc')
  744. ->get()->toArray();
  745. $city_totle_count = 0;
  746. if (!empty($result)) {
  747. $city_totle_count = array_sum(array_column($result, 'count'));
  748. foreach ($result as $key => $value) {
  749. $result[$key]['percent'] = round(($value['count'] / $city_totle_count) * 100, 2);
  750. }
  751. }
  752. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  753. } catch (\Exception $e) {
  754. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  755. }
  756. }
  757. /**
  758. * 低价挂网平台分布
  759. * @author 唐远望
  760. * @version 1.0
  761. * @date 2026-02-27
  762. *
  763. */
  764. public function get_low_price_platform_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  765. {
  766. $request->scene('get_low_price_platform_count')->validate();
  767. $admin_company_id = request('admin_company_id', '0');
  768. $company_id = request('access_token.company_id', '0');
  769. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  770. //终端类型B端、C端、OTO
  771. $terminal_type = request('terminal_type', '');
  772. $product_name = request('product_name', ''); //商品名称
  773. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  774. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  775. $start_time_string = request('start_time', '');
  776. $end_time_string = request('end_time', '');
  777. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  778. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  779. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  780. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  781. // 时间条件
  782. $map = [];
  783. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  784. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  785. // 权限判断
  786. if ($is_admin != 1 && $company_id != 0) {
  787. $map[] = ['company_id', '=', $company_id];
  788. } else {
  789. $map[] = ['company_id', '=', $admin_company_id];
  790. }
  791. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  792. // 禁止挂网平台分布统计
  793. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  794. if ($terminal_type) {
  795. $platform = [];
  796. switch ($terminal_type) {
  797. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  798. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  799. break;
  800. case '2': //C端:美团、拼多多、天猫、京东、药房网
  801. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  802. break;
  803. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  804. $platform = ['0'];
  805. break;
  806. default:
  807. # code...
  808. break;
  809. }
  810. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  811. }
  812. try {
  813. // 假设 LowPriceGoodsModel 中有 platform 字段,表示平台信息
  814. // 查询指定时间范围内的数据,并按 platform 分组统计数量
  815. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  816. ->select(['platform', DB::raw('count(platform) as count')])
  817. ->groupby('platform')
  818. ->orderby('count', 'desc')
  819. ->get()->toArray();
  820. $platform_totle_count = 0;
  821. if (!empty($result)) {
  822. $platform_totle_count = array_sum(array_column($result, 'count'));
  823. foreach ($result as $key => $value) {
  824. $result[$key]['percent'] = round(($value['count'] / $platform_totle_count) * 100, 2);
  825. }
  826. }
  827. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  828. } catch (\Exception $e) {
  829. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  830. }
  831. }
  832. /**
  833. * 低价挂网平台省份分布
  834. * @author 唐远望
  835. * @version 1.0
  836. * @date 2026-02-27
  837. *
  838. */
  839. public function get_low_price_platform_province_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  840. {
  841. $request->scene('get_low_price_platform_province_count')->validate();
  842. $admin_company_id = request('admin_company_id', '0');
  843. $company_id = request('access_token.company_id', '0');
  844. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  845. //终端类型B端、C端、OTO
  846. $terminal_type = request('terminal_type', '');
  847. $product_name = request('product_name', ''); //商品名称
  848. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  849. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  850. $start_time_string = request('start_time', '');
  851. $end_time_string = request('end_time', '');
  852. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  853. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  854. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  855. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  856. // 时间条件
  857. $map = [];
  858. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  859. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  860. // 权限判断
  861. if ($is_admin != 1 && $company_id != 0) {
  862. $map[] = ['company_id', '=', $company_id];
  863. } else {
  864. $map[] = ['company_id', '=', $admin_company_id];
  865. }
  866. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  867. // 禁止挂网平台分布统计
  868. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  869. if ($terminal_type) {
  870. $platform = [];
  871. switch ($terminal_type) {
  872. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  873. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  874. break;
  875. case '2': //C端:美团、拼多多、天猫、京东、药房网
  876. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  877. break;
  878. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  879. $platform = ['0'];
  880. break;
  881. default:
  882. # code...
  883. break;
  884. }
  885. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  886. }
  887. try {
  888. // 假设 LowPriceGoodsModel 中有 province 字段,表示省份信息
  889. // 查询指定时间范围内的数据,并按 province 分组统计数量
  890. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  891. ->select(['province_name', DB::raw('count(province_name) as count')])
  892. ->groupby('province_name')
  893. ->orderby('count', 'desc')
  894. ->get();
  895. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  896. } catch (\Exception $e) {
  897. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  898. }
  899. }
  900. /**
  901. * 禁止挂网平台分布
  902. * @author 唐远望
  903. * @version 1.0
  904. * @date 2026-02-27
  905. *
  906. */
  907. public function get_violation_platform_count(request $request, ViolationProductModel $violationProductModel)
  908. {
  909. $request->scene('get_violation_platform_count')->validate();
  910. $admin_company_id = request('admin_company_id', '0');
  911. $company_id = request('access_token.company_id', '0');
  912. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  913. //终端类型B端、C端、OTO
  914. $terminal_type = request('terminal_type', '');
  915. $product_name = request('product_name', ''); //商品名称
  916. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  917. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  918. $start_time_string = request('start_time', '');
  919. $end_time_string = request('end_time', '');
  920. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  921. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  922. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  923. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  924. // 时间条件
  925. $map = [];
  926. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  927. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  928. // 权限判断
  929. if ($is_admin != 1 && $company_id != 0) {
  930. $map[] = ['company_id', '=', $company_id];
  931. } else {
  932. $map[] = ['company_id', '=', $admin_company_id];
  933. }
  934. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  935. // 禁止挂网平台分布统计
  936. $violationProductModel = $violationProductModel->query();
  937. if ($terminal_type) {
  938. $platform = [];
  939. switch ($terminal_type) {
  940. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  941. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  942. break;
  943. case '2': //C端:美团、拼多多、天猫、京东、药房网
  944. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  945. break;
  946. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  947. $platform = ['0'];
  948. break;
  949. default:
  950. # code...
  951. break;
  952. }
  953. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  954. }
  955. try {
  956. // 假设 ViolationProductModel 中有 platform 字段,表示平台信息
  957. // 查询指定时间范围内的数据,并按 platform 分组统计数量
  958. $result = $violationProductModel->where($map)->where('status', 0)
  959. ->select(['platform', DB::raw('count(platform) as count')])
  960. ->groupby('platform')
  961. ->orderby('count', 'desc')
  962. ->get()->toArray();
  963. $platform_totle_count = 0;
  964. if (!empty($result)) {
  965. $platform_totle_count = array_sum(array_column($result, 'count'));
  966. foreach ($result as $key => $value) {
  967. $result[$key]['percent'] = round(($value['count'] / $platform_totle_count) * 100, 2);
  968. }
  969. }
  970. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  971. } catch (\Exception $e) {
  972. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  973. }
  974. }
  975. /**
  976. * 禁止挂网平台省份分布
  977. * @author 唐远望
  978. * @version 1.0
  979. * @date 2026-02-27
  980. *
  981. */
  982. public function get_violation_platform_province_count(request $request, ViolationProductModel $violationProductModel)
  983. {
  984. $request->scene('get_violation_platform_province_count')->validate();
  985. $admin_company_id = request('admin_company_id', '0');
  986. $company_id = request('access_token.company_id', '0');
  987. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  988. //终端类型B端、C端、OTO
  989. $terminal_type = request('terminal_type', '');
  990. $product_name = request('product_name', ''); //商品名称
  991. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  992. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  993. $start_time_string = request('start_time', '');
  994. $end_time_string = request('end_time', '');
  995. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  996. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  997. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  998. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  999. // 时间条件
  1000. $map = [];
  1001. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  1002. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  1003. // 权限判断
  1004. if ($is_admin != 1 && $company_id != 0) {
  1005. $map[] = ['company_id', '=', $company_id];
  1006. } else {
  1007. $map[] = ['company_id', '=', $admin_company_id];
  1008. }
  1009. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  1010. // 禁止挂网平台分布统计
  1011. $violationProductModel = $violationProductModel->query();
  1012. if ($terminal_type) {
  1013. $platform = [];
  1014. switch ($terminal_type) {
  1015. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  1016. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  1017. break;
  1018. case '2': //C端:美团、拼多多、天猫、京东、药房网
  1019. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  1020. break;
  1021. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  1022. $platform = ['0'];
  1023. break;
  1024. default:
  1025. # code...
  1026. break;
  1027. }
  1028. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  1029. }
  1030. try {
  1031. // 假设 ViolationProductModel 中有 platform 字段,表示平台信息
  1032. // 查询指定时间范围内的数据,并按 platform 分组统计数量
  1033. $result = $violationProductModel->where($map)->where('status', 0)
  1034. ->select(['province_name', DB::raw('count(province_name) as count')])
  1035. ->groupby(['province_name'])
  1036. ->orderby('count', 'desc')
  1037. ->get();
  1038. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  1039. } catch (\Exception $e) {
  1040. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  1041. }
  1042. }
  1043. /**
  1044. * 违规公司平台占比
  1045. * @author 唐远望
  1046. * @version 1.0
  1047. * @date 2026-03-23
  1048. *
  1049. */
  1050. public function get_violation_company_platform_proportion(request $request, ViolationProductModel $violationProductModel)
  1051. {
  1052. $request->scene('get_violation_company_platform_proportion')->validate();
  1053. $admin_company_id = request('admin_company_id', '0');
  1054. $company_id = request('access_token.company_id', '0');
  1055. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  1056. //终端类型B端、C端、OTO
  1057. $terminal_type = request('terminal_type', '');
  1058. $product_name = request('product_name', ''); //商品名称
  1059. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  1060. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  1061. $start_time_string = request('start_time', '');
  1062. $end_time_string = request('end_time', '');
  1063. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  1064. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  1065. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  1066. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  1067. // 时间条件
  1068. $map = [];
  1069. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  1070. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  1071. // 权限判断
  1072. if ($is_admin != 1 && $company_id != 0) {
  1073. $map[] = ['company_id', '=', $company_id];
  1074. } else {
  1075. $map[] = ['company_id', '=', $admin_company_id];
  1076. }
  1077. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  1078. // 禁止挂网平台分布统计
  1079. $violationProductModel = $violationProductModel->query();
  1080. if ($terminal_type) {
  1081. $platform = [];
  1082. switch ($terminal_type) {
  1083. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  1084. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  1085. break;
  1086. case '2': //C端:美团、拼多多、天猫、京东、药房网
  1087. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  1088. break;
  1089. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  1090. $platform = ['0'];
  1091. break;
  1092. default:
  1093. # code...
  1094. break;
  1095. }
  1096. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  1097. }
  1098. try {
  1099. // 假设 LowPriceGoodsModel 中有 platform 字段,表示平台信息
  1100. // 查询指定时间范围内的数据,并按 platform 分组统计数量
  1101. $result = $violationProductModel->where($map)->where('status', 0)
  1102. ->select(['platform', DB::raw('count(platform) as count')])
  1103. ->distinct('company_name')
  1104. ->groupby('platform')
  1105. ->orderby('count', 'desc')
  1106. ->get()->toArray();
  1107. $platform_totle_count = 0;
  1108. if (!empty($result)) {
  1109. $platform_totle_count = array_sum(array_column($result, 'count'));
  1110. foreach ($result as $key => $value) {
  1111. $result[$key]['percent'] = round(($value['count'] / $platform_totle_count) * 100, 2);
  1112. }
  1113. }
  1114. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  1115. } catch (\Exception $e) {
  1116. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  1117. }
  1118. }
  1119. /**
  1120. * 违规店铺平台占比
  1121. * @author 唐远望
  1122. * @version 1.0
  1123. * @date 2026-03-23
  1124. *
  1125. */
  1126. public function get_violation_store_platform_proportion(request $request, ViolationStoreModel $ViolationStoreModel)
  1127. {
  1128. $request->scene('get_violation_store_platform_proportion')->validate();
  1129. $admin_company_id = request('admin_company_id', '0');
  1130. $company_id = request('access_token.company_id', '0');
  1131. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  1132. //终端类型B端、C端、OTO
  1133. $terminal_type = request('terminal_type', '');
  1134. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  1135. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  1136. $start_time_string = request('start_time', '');
  1137. $end_time_string = request('end_time', '');
  1138. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  1139. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  1140. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  1141. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  1142. // 时间条件
  1143. $map = [];
  1144. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  1145. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  1146. // 权限判断
  1147. if ($is_admin != 1 && $company_id != 0) {
  1148. $map[] = ['company_id', '=', $company_id];
  1149. } else {
  1150. $map[] = ['company_id', '=', $admin_company_id];
  1151. }
  1152. // 禁止挂网平台分布统计
  1153. $ViolationStoreModel = $ViolationStoreModel->query();
  1154. if ($terminal_type) {
  1155. $platform = [];
  1156. switch ($terminal_type) {
  1157. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  1158. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  1159. break;
  1160. case '2': //C端:美团、拼多多、天猫、京东、药房网
  1161. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  1162. break;
  1163. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  1164. $platform = ['0'];
  1165. break;
  1166. default:
  1167. # code...
  1168. break;
  1169. }
  1170. $ViolationStoreModel = $ViolationStoreModel->whereIn('platform', $platform);
  1171. }
  1172. try {
  1173. // 假设 LowPriceGoodsModel 中有 platform 字段,表示平台信息
  1174. // 查询指定时间范围内的数据,并按 platform 分组统计数量
  1175. $result = $ViolationStoreModel->where($map)->where('status', 0)
  1176. ->select(['platform', DB::raw('count(platform) as count')])
  1177. ->groupby('platform')
  1178. ->orderby('count', 'desc')
  1179. ->get()->toArray();
  1180. $platform_totle_count = 0;
  1181. if (!empty($result)) {
  1182. $platform_totle_count = array_sum(array_column($result, 'count'));
  1183. foreach ($result as $key => $value) {
  1184. $result[$key]['percent'] = round(($value['count'] / $platform_totle_count) * 100, 2);
  1185. }
  1186. }
  1187. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  1188. } catch (\Exception $e) {
  1189. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  1190. }
  1191. }
  1192. /**
  1193. * 违规店铺平台省份分布
  1194. * @author 唐远望
  1195. * @version 1.0
  1196. * @date 2026-03-23
  1197. *
  1198. */
  1199. public function get_violation_store_province_count(request $request, ViolationStoreModel $ViolationStoreModel)
  1200. {
  1201. $request->scene('get_violation_store_province_count')->validate();
  1202. $admin_company_id = request('admin_company_id', '0');
  1203. $company_id = request('access_token.company_id', '0');
  1204. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  1205. //终端类型B端、C端、OTO
  1206. $terminal_type = request('terminal_type', '');
  1207. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  1208. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  1209. $start_time_string = request('start_time', '');
  1210. $end_time_string = request('end_time', '');
  1211. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  1212. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  1213. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  1214. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  1215. // 时间条件
  1216. $map = [];
  1217. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  1218. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  1219. // 权限判断
  1220. if ($is_admin != 1 && $company_id != 0) {
  1221. $map[] = ['company_id', '=', $company_id];
  1222. } else {
  1223. $map[] = ['company_id', '=', $admin_company_id];
  1224. }
  1225. // 违规公司平台分布统计
  1226. $ViolationStoreModel = $ViolationStoreModel->query();
  1227. if ($terminal_type) {
  1228. $platform = [];
  1229. switch ($terminal_type) {
  1230. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  1231. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  1232. break;
  1233. case '2': //C端:美团、拼多多、天猫、京东、药房网
  1234. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  1235. break;
  1236. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  1237. $platform = ['0'];
  1238. break;
  1239. default:
  1240. # code...
  1241. break;
  1242. }
  1243. $ViolationStoreModel = $ViolationStoreModel->whereIn('platform', $platform);
  1244. }
  1245. try {
  1246. // 假设 $violationProductModel 中有 province 字段,表示省份信息
  1247. // 查询指定时间范围内的数据,并按 province 分组统计数量
  1248. $result = $ViolationStoreModel->where($map)->where('status', 0)
  1249. ->select(['province_name', DB::raw('count(province_name) as count')])
  1250. ->groupby('province_name')
  1251. ->orderby('count', 'desc')
  1252. ->get();
  1253. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  1254. } catch (\Exception $e) {
  1255. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  1256. }
  1257. }
  1258. /**
  1259. * 违规店铺省份统计占比
  1260. * @author 唐远望
  1261. * @version 1.0
  1262. * @date 2026-03-23
  1263. *
  1264. */
  1265. public function get_violation_store_province_proportion(request $request, ViolationStoreModel $ViolationStoreModel)
  1266. {
  1267. $request->scene('get_violation_store_province_proportion')->validate();
  1268. $admin_company_id = request('admin_company_id', '0');
  1269. $company_id = request('access_token.company_id', '0');
  1270. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  1271. //终端类型B端、C端、OTO
  1272. $terminal_type = request('terminal_type', '');
  1273. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  1274. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  1275. $start_time_string = request('start_time', '');
  1276. $end_time_string = request('end_time', '');
  1277. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  1278. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  1279. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  1280. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  1281. // 时间条件
  1282. $map = [];
  1283. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  1284. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  1285. // 权限判断
  1286. if ($is_admin != 1 && $company_id != 0) {
  1287. $map[] = ['company_id', '=', $company_id];
  1288. } else {
  1289. $map[] = ['company_id', '=', $admin_company_id];
  1290. }
  1291. // 违规店铺省份统计
  1292. $ViolationStoreModel = $ViolationStoreModel->query();
  1293. if ($terminal_type) {
  1294. $platform = [];
  1295. switch ($terminal_type) {
  1296. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  1297. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  1298. break;
  1299. case '2': //C端:美团、拼多多、天猫、京东、药房网
  1300. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  1301. break;
  1302. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  1303. $platform = ['0'];
  1304. break;
  1305. default:
  1306. # code...
  1307. break;
  1308. }
  1309. $ViolationStoreModel = $ViolationStoreModel->whereIn('platform', $platform);
  1310. }
  1311. try {
  1312. // 假设 $ViolationStoreModel 中有 province 字段,表示省份信息
  1313. // 查询指定时间范围内的数据,并按 province 分组统计数量
  1314. $result = $ViolationStoreModel->where($map)->where('status', 0)
  1315. ->select(['province_name', DB::raw('count(province_name) as count')])
  1316. ->groupby('province_name')
  1317. ->orderby('count', 'desc')
  1318. ->get()->toArray();
  1319. $province_totle_count = 0;
  1320. if (!empty($result)) {
  1321. $province_totle_count = array_sum(array_column($result, 'count'));
  1322. //计算占比
  1323. foreach ($result as $key => $value) {
  1324. $result[$key]['percent'] = round(($value['count'] / $province_totle_count) * 100, 2);
  1325. }
  1326. }
  1327. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  1328. } catch (\Exception $e) {
  1329. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  1330. }
  1331. }
  1332. /**
  1333. * 违规店铺城市统计占比
  1334. * @author 唐远望
  1335. * @version 1.0
  1336. * @date 2026-03-23
  1337. *
  1338. */
  1339. public function get_violation_store_city_proportion(request $request, ViolationStoreModel $ViolationStoreModel)
  1340. {
  1341. $request->scene('get_violation_store_city_proportion')->validate();
  1342. $admin_company_id = request('admin_company_id', '0');
  1343. $company_id = request('access_token.company_id', '0');
  1344. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  1345. //终端类型B端、C端、OTO
  1346. $province_id = request('province_id', ''); //省份id
  1347. $terminal_type = request('terminal_type', '');
  1348. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  1349. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  1350. $start_time_string = request('start_time', '');
  1351. $end_time_string = request('end_time', '');
  1352. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  1353. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  1354. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  1355. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  1356. // 时间条件
  1357. $map = [];
  1358. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  1359. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  1360. if ($province_id) $map[] = ['province_id', '=', $province_id];
  1361. // 权限判断
  1362. if ($is_admin != 1 && $company_id != 0) {
  1363. $map[] = ['company_id', '=', $company_id];
  1364. } else {
  1365. $map[] = ['company_id', '=', $admin_company_id];
  1366. }
  1367. // 违规店铺省份统计
  1368. $ViolationStoreModel = $ViolationStoreModel->query();
  1369. if ($terminal_type) {
  1370. $platform = [];
  1371. switch ($terminal_type) {
  1372. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  1373. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  1374. break;
  1375. case '2': //C端:美团、拼多多、天猫、京东、药房网
  1376. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  1377. break;
  1378. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  1379. $platform = ['0'];
  1380. break;
  1381. default:
  1382. # code...
  1383. break;
  1384. }
  1385. $ViolationStoreModel = $ViolationStoreModel->whereIn('platform', $platform);
  1386. }
  1387. try {
  1388. // 假设 $ViolationStoreModel 中有 province 字段,表示省份信息
  1389. // 查询指定时间范围内的数据,并按 province 分组统计数量
  1390. $result = $ViolationStoreModel->where($map)->where('status', 0)
  1391. ->select(['city_name', DB::raw('count(city_name) as count')])
  1392. ->distinct('company_name')
  1393. ->groupby('city_name')
  1394. ->orderby('count', 'desc')
  1395. ->get()->toArray();
  1396. $province_totle_count = 0;
  1397. if (!empty($result)) {
  1398. $province_totle_count = array_sum(array_column($result, 'count'));
  1399. //计算占比
  1400. foreach ($result as $key => $value) {
  1401. $result[$key]['percent'] = round(($value['count'] / $province_totle_count) * 100, 2);
  1402. }
  1403. }
  1404. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  1405. } catch (\Exception $e) {
  1406. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  1407. }
  1408. }
  1409. /*
  1410. * 低价挂网商品规格数统计排行
  1411. * @author 唐远望
  1412. * @version 1.0
  1413. * @date 2026-03-24
  1414. *
  1415. */
  1416. public function get_low_price_product_spec_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  1417. {
  1418. $request->scene('get_low_price_product_spec_count')->validate();
  1419. $admin_company_id = request('admin_company_id', '0');
  1420. $company_id = request('access_token.company_id', '0');
  1421. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  1422. //终端类型B端、C端、OTO
  1423. $terminal_type = request('terminal_type', '');
  1424. $limit = request('limit', config('page_num', 10));
  1425. $product_name = request('product_name', ''); //商品名称
  1426. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  1427. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  1428. $start_time_string = request('start_time', '');
  1429. $end_time_string = request('end_time', '');
  1430. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  1431. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  1432. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  1433. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  1434. // 时间条件
  1435. $map = [];
  1436. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  1437. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  1438. // 权限判断
  1439. if ($is_admin != 1 && $company_id != 0) {
  1440. $map[] = ['company_id', '=', $company_id];
  1441. } else {
  1442. $map[] = ['company_id', '=', $admin_company_id];
  1443. }
  1444. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  1445. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  1446. if ($terminal_type) {
  1447. $platform = [];
  1448. switch ($terminal_type) {
  1449. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  1450. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  1451. break;
  1452. case '2': //C端:美团、拼多多、天猫、京东、药房网
  1453. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  1454. break;
  1455. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  1456. $platform = ['0'];
  1457. break;
  1458. default:
  1459. # code...
  1460. break;
  1461. }
  1462. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  1463. }
  1464. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  1465. ->select(['product_name', 'product_specs', DB::raw('count(*) as count')])
  1466. ->groupby('product_name', 'product_specs')
  1467. ->orderby('count', 'desc')
  1468. ->paginate($limit);
  1469. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  1470. }
  1471. /**
  1472. * 禁止挂网商品规格数统计排行
  1473. * @author 唐远望
  1474. * @version 1.0
  1475. * @date 2026-03-24
  1476. *
  1477. */
  1478. public function get_violation_product_spec_count(request $request, ViolationProductModel $violationProductModel)
  1479. {
  1480. $request->scene('get_violation_product_spec_count')->validate();
  1481. $admin_company_id = request('admin_company_id', '0');
  1482. $company_id = request('access_token.company_id', '0');
  1483. //终端类型B端、C端、OTO
  1484. $terminal_type = request('terminal_type', '');
  1485. $product_name = request('product_name', ''); //商品名称
  1486. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  1487. $limit = request('limit', config('page_num', 10));
  1488. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  1489. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  1490. $start_time_string = request('start_time', '');
  1491. $end_time_string = request('end_time', '');
  1492. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  1493. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  1494. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  1495. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  1496. // 时间条件
  1497. $map = [];
  1498. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  1499. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  1500. // 权限判断
  1501. if ($is_admin != 1 && $company_id != 0) {
  1502. $map[] = ['company_id', '=', $company_id];
  1503. } else {
  1504. $map[] = ['company_id', '=', $admin_company_id];
  1505. }
  1506. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  1507. $violationProductModel = $violationProductModel->query();
  1508. if ($terminal_type) {
  1509. $platform = [];
  1510. switch ($terminal_type) {
  1511. case '1': //B端:药师帮、1药城、药九九、药易购、药帮忙、熊猫药药
  1512. $platform = ['0', '5', '6', '7', '8', '9', '10']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  1513. break;
  1514. case '2': //C端:美团、拼多多、天猫、京东、药房网
  1515. $platform = ['0', '1', '2', '3', '4', '11']; //1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药九九,8=药易购,9=药帮忙,10=熊猫药药11=药房网
  1516. break;
  1517. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  1518. $platform = ['0'];
  1519. break;
  1520. default:
  1521. # code...
  1522. break;
  1523. }
  1524. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  1525. }
  1526. $result = $violationProductModel->where($map)->where('status', 0)
  1527. ->select(['product_name', 'product_specs', DB::raw('count(*) as count')])
  1528. ->groupby('product_name', 'product_specs')
  1529. ->orderby('count', 'desc')
  1530. ->paginate($limit);
  1531. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  1532. }
  1533. }