BasicPanel.php 91 KB

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