BasicPanel.php 84 KB

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