BasicPanel.php 84 KB

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