BasicPanel.php 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042
  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. $productModel = $productModel->where('company_id', $company_id);
  55. } else {
  56. $lowPriceGoodsModel = $lowPriceGoodsModel->where('company_id', $admin_company_id);
  57. $violationProductModel = $violationProductModel->where('company_id', $admin_company_id);
  58. $violationStoreModel = $violationStoreModel->where('company_id', $admin_company_id);
  59. $productModel = $productModel->where('company_id', $admin_company_id);
  60. }
  61. // 低价挂网商品数量查询
  62. $lowPriceGoodsCount = $lowPriceGoodsModel->where($map)
  63. ->where('status', 0)
  64. ->groupBy('product_name')
  65. ->select('product_name')
  66. ->get()->count();
  67. // 禁止挂网商品数量查询
  68. $violationProductCount = $violationProductModel->where($map)
  69. ->where('status', 0)
  70. ->groupBy('product_name')
  71. ->select('product_name')
  72. ->get()->count();
  73. $store_map = [];
  74. if ($start_time) $store_map[] = ['insert_time', '>=', $start_time];
  75. if ($end_time) $store_map[] = ['insert_time', '<=', $end_time];
  76. // 违规店铺数量查询
  77. $violationStoreCount = $violationStoreModel->where($store_map)
  78. ->where('status', 0)
  79. ->groupBy('company_name')
  80. ->select('company_name')
  81. ->get()->count();
  82. //获取终端类型B端、C端、OTO,配置品规数量
  83. $productModel = new ProductModel();
  84. $productModel_map = [];
  85. if ($start_time) $productModel_map[] = ['insert_time', '>=', $start_time];
  86. if ($end_time) $productModel_map[] = ['insert_time', '<=', $end_time];
  87. $productNames = $productModel
  88. ->where(function ($query) {
  89. $platforms = ['0', '5', '6', '7', '8', '9', '10'];
  90. foreach ($platforms as $platform) {
  91. $query->orWhereRaw("FIND_IN_SET(?, platform)", [$platform]);
  92. }
  93. })
  94. ->where('status', 0)
  95. ->where($productModel_map)
  96. ->distinct('product_name')
  97. ->pluck('product_name');
  98. $collect_b_product_count = $productModel
  99. ->whereIn('product_name', $productNames)
  100. ->where('status', 0)
  101. ->where($productModel_map)
  102. ->sum('product_specs_number');
  103. $productModel = new ProductModel();
  104. $productModel_map = [];
  105. if ($start_time) $productModel_map[] = ['insert_time', '>=', $start_time];
  106. if ($end_time) $productModel_map[] = ['insert_time', '<=', $end_time];
  107. $productNames = $productModel
  108. ->where(function ($query) {
  109. $platforms = ['0', '1', '2', '3', '4'];
  110. foreach ($platforms as $platform) {
  111. $query->orWhereRaw("FIND_IN_SET(?, platform)", [$platform]);
  112. }
  113. })
  114. ->where('status', 0)
  115. ->where($productModel_map)
  116. ->distinct('product_name')
  117. ->pluck('product_name');
  118. $collect_c_product_count = $productModel
  119. ->whereIn('product_name', $productNames)
  120. ->where('status', 0)
  121. ->where($productModel_map)
  122. ->sum('product_specs_number');
  123. $productModel = new ProductModel();
  124. $productModel_map = [];
  125. if ($start_time) $productModel_map[] = ['insert_time', '>=', $start_time];
  126. if ($end_time) $productModel_map[] = ['insert_time', '<=', $end_time];
  127. $productNames = $productModel
  128. ->where(function ($query) {
  129. $platforms = ['0'];
  130. foreach ($platforms as $platform) {
  131. $query->orWhereRaw("FIND_IN_SET(?, platform)", [$platform]);
  132. }
  133. })
  134. ->where('status', 0)
  135. ->where($productModel_map)
  136. ->distinct('product_name')
  137. ->pluck('product_name');
  138. $collect_oto_product_count = $productModel
  139. ->whereIn('product_name', $productNames)
  140. ->where('status', 0)
  141. ->where($productModel_map)
  142. ->sum('product_specs_number');
  143. // 所有终端品规数量
  144. $collect_totle_product_count = $collect_b_product_count + $collect_c_product_count + $collect_oto_product_count;
  145. $result_data = [
  146. 'low_price_goods_count' => $lowPriceGoodsCount, // 低价挂网商品数量
  147. 'violation_product_count' => $violationProductCount, // 禁止挂网商品数量
  148. 'violation_store_count' => $violationStoreCount, // 违规店铺数量
  149. 'totle_product_count' => $lowPriceGoodsCount + $violationProductCount, // 总商品数量
  150. 'collect_b_product_count' => $collect_b_product_count, // B端品规数量
  151. 'collect_c_product_count' => $collect_c_product_count, // C端品规数量
  152. 'collect_oto_product_count' => $collect_oto_product_count, // OTO品规数量
  153. 'collect_totle_product_count' => $collect_totle_product_count, // 所有终端品规数量
  154. ];
  155. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result_data]);
  156. }
  157. /**
  158. * 禁止挂网商品数统计
  159. * @author 唐远望
  160. * @version 1.0
  161. * @date 2026-02-10
  162. *
  163. */
  164. public function get_violation_product_count(request $request, ViolationProductModel $violationProductModel)
  165. {
  166. $request->scene('get_violation_product_count')->validate();
  167. $admin_company_id = request('admin_company_id', '0');
  168. $company_id = request('access_token.company_id', '0');
  169. //终端类型B端、C端、OTO
  170. $terminal_type = request('terminal_type', '');
  171. $product_name = request('product_name', ''); //商品名称
  172. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  173. $limit = request('limit', config('page_num', 10));
  174. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  175. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  176. $start_time_string = request('start_time', '');
  177. $end_time_string = request('end_time', '');
  178. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  179. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  180. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  181. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  182. // 时间条件
  183. $map = [];
  184. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  185. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  186. // 权限判断
  187. if ($is_admin != 1 && $company_id != 0) {
  188. $map[] = ['company_id', '=', $company_id];
  189. } else {
  190. $map[] = ['company_id', '=', $admin_company_id];
  191. }
  192. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  193. $violationProductModel = $violationProductModel->query();
  194. if ($terminal_type) {
  195. $platform = [];
  196. switch ($terminal_type) {
  197. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  198. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  199. break;
  200. case '2': //C端:美团、拼多多、天猫、京东
  201. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  202. break;
  203. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  204. $platform = ['0'];
  205. break;
  206. default:
  207. # code...
  208. break;
  209. }
  210. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  211. }
  212. $result = $violationProductModel->where($map)->where('status', 0)
  213. ->select(['product_name', DB::raw('count(product_name) as count')])->distinct('product_name')->orderby('count', 'desc')
  214. ->groupby('product_name')->paginate($limit);
  215. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  216. }
  217. /**
  218. * 禁止挂网省份统计
  219. * @author 唐远望
  220. * @version 1.0
  221. * @date 2026-02-10
  222. *
  223. */
  224. public function get_violation_province_count(request $request, ViolationProductModel $violationProductModel)
  225. {
  226. $request->scene('get_violation_province_count')->validate();
  227. $admin_company_id = request('admin_company_id', '0');
  228. $company_id = request('access_token.company_id', '0');
  229. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  230. //终端类型B端、C端、OTO
  231. $terminal_type = request('terminal_type', '');
  232. $product_name = request('product_name', ''); //商品名称
  233. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  234. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  235. $start_time_string = request('start_time', '');
  236. $end_time_string = request('end_time', '');
  237. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  238. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  239. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  240. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  241. // 时间条件
  242. $map = [];
  243. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  244. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  245. // 权限判断
  246. if ($is_admin != 1 && $company_id != 0) {
  247. $map[] = ['company_id', '=', $company_id];
  248. } else {
  249. $map[] = ['company_id', '=', $admin_company_id];
  250. }
  251. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  252. // 禁止挂网省份统计
  253. $violationProductModel = $violationProductModel->query();
  254. if ($terminal_type) {
  255. $platform = [];
  256. switch ($terminal_type) {
  257. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  258. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  259. break;
  260. case '2': //C端:美团、拼多多、天猫、京东
  261. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  262. break;
  263. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  264. $platform = ['0'];
  265. break;
  266. default:
  267. # code...
  268. break;
  269. }
  270. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  271. }
  272. try {
  273. // 假设 ViolationProductModel 中有 province 字段,表示省份信息
  274. // 查询指定时间范围内的数据,并按 province 分组统计数量
  275. $result = $violationProductModel->where($map)->where('status', 0)
  276. ->select(['province_name', DB::raw('count(province_name) as count')])
  277. ->groupby('province_name')
  278. ->orderby('count', 'desc')
  279. ->get()->toArray();
  280. $province_totle_count = 0;
  281. if (!empty($result)) {
  282. $province_totle_count = array_sum(array_column($result, 'count'));
  283. //计算占比
  284. foreach ($result as $key => $value) {
  285. $result[$key]['percent'] = round(($value['count'] / $province_totle_count) * 100, 2);
  286. }
  287. }
  288. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  289. } catch (\Exception $e) {
  290. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  291. }
  292. }
  293. /**
  294. * 禁止挂网城市统计
  295. * @author 唐远望
  296. * @version 1.0
  297. * @date 2026-02-10
  298. *
  299. */
  300. public function get_violation_city_count(request $request, ViolationProductModel $violationProductModel)
  301. {
  302. $request->scene('get_violation_city_count')->validate();
  303. $admin_company_id = request('admin_company_id', '0');
  304. $company_id = request('access_token.company_id', '0');
  305. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  306. //终端类型B端、C端、OTO
  307. $province_id = request('province_id', ''); //省份ID
  308. $terminal_type = request('terminal_type', '');
  309. $product_name = request('product_name', ''); //商品名称
  310. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  311. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  312. $start_time_string = request('start_time', '');
  313. $end_time_string = request('end_time', '');
  314. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  315. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  316. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  317. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  318. // 时间条件
  319. $map = [];
  320. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  321. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  322. // 权限判断
  323. if ($is_admin != 1 && $company_id != 0) {
  324. $map[] = ['company_id', '=', $company_id];
  325. } else {
  326. $map[] = ['company_id', '=', $admin_company_id];
  327. }
  328. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  329. if ($province_id) $map[] = ['province_id', '=', $province_id];
  330. // 禁止挂网城市统计
  331. $violationProductModel = $violationProductModel->query();
  332. if ($terminal_type) {
  333. $platform = [];
  334. switch ($terminal_type) {
  335. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  336. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  337. break;
  338. case '2': //C端:美团、拼多多、天猫、京东
  339. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  340. break;
  341. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  342. $platform = ['0'];
  343. break;
  344. default:
  345. # code...
  346. break;
  347. }
  348. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  349. }
  350. try {
  351. // 假设 ViolationProductModel 中有 city 字段,表示城市信息
  352. // 查询指定时间范围内的数据,并按 city 分组统计数量
  353. $result = $violationProductModel->where($map)->where('status', 0)
  354. ->select(['city_name', DB::raw('count(city_name) as count')])
  355. ->groupby('city_name')
  356. ->orderby('count', 'desc')
  357. ->get()->toArray();
  358. $city_totle_count = 0;
  359. if (!empty($result)) {
  360. $city_totle_count = array_sum(array_column($result, 'count'));
  361. //计算占比
  362. foreach ($result as $key => $value) {
  363. $result[$key]['percent'] = round(($value['count'] / $city_totle_count) * 100, 2);
  364. }
  365. }
  366. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  367. } catch (\Exception $e) {
  368. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  369. }
  370. }
  371. /**
  372. * 禁止挂网公司数统计
  373. * @author 唐远望
  374. * @version 1.0
  375. * @date 2026-02-10
  376. *
  377. */
  378. public function get_violation_company_count(request $request, ViolationProductModel $violationProductModel)
  379. {
  380. $request->scene('get_violation_company_count')->validate();
  381. $admin_company_id = request('admin_company_id', '0');
  382. $company_id = request('access_token.company_id', '0');
  383. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  384. //终端类型B端、C端、OTO
  385. $terminal_type = request('terminal_type', '');
  386. $limit = request('limit', config('page_num', 10));
  387. $product_name = request('product_name', ''); //商品名称
  388. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  389. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  390. $start_time_string = request('start_time', '');
  391. $end_time_string = request('end_time', '');
  392. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  393. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  394. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  395. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  396. // 时间条件
  397. $map = [];
  398. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  399. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  400. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  401. // 权限判断
  402. if ($is_admin != 1 && $company_id != 0) {
  403. $map[] = ['company_id', '=', $company_id];
  404. } else {
  405. $map[] = ['company_id', '=', $admin_company_id];
  406. }
  407. $violationProductModel = $violationProductModel->query();
  408. if ($terminal_type) {
  409. $platform = [];
  410. switch ($terminal_type) {
  411. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  412. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  413. break;
  414. case '2': //C端:美团、拼多多、天猫、京东
  415. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  416. break;
  417. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  418. $platform = ['0'];
  419. break;
  420. default:
  421. # code...
  422. break;
  423. }
  424. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  425. }
  426. $result = $violationProductModel->where($map)->where('status', 0)
  427. ->select(['company_name', DB::raw('count(company_name) as count')])->groupby('company_name')->orderby('count', 'desc')
  428. ->paginate($limit);
  429. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  430. }
  431. /*
  432. * 低价违规商品数统计
  433. * @author 唐远望
  434. * @version 1.0
  435. * @date 2026-02-10
  436. *
  437. */
  438. public function get_low_price_product_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  439. {
  440. $request->scene('get_low_price_product_count')->validate();
  441. $admin_company_id = request('admin_company_id', '0');
  442. $company_id = request('access_token.company_id', '0');
  443. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  444. //终端类型B端、C端、OTO
  445. $terminal_type = request('terminal_type', '');
  446. $limit = request('limit', config('page_num', 10));
  447. $product_name = request('product_name', ''); //商品名称
  448. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  449. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  450. $start_time_string = request('start_time', '');
  451. $end_time_string = request('end_time', '');
  452. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  453. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  454. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  455. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  456. // 时间条件
  457. $map = [];
  458. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  459. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  460. // 权限判断
  461. if ($is_admin != 1 && $company_id != 0) {
  462. $map[] = ['company_id', '=', $company_id];
  463. } else {
  464. $map[] = ['company_id', '=', $admin_company_id];
  465. }
  466. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  467. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  468. if ($terminal_type) {
  469. $platform = [];
  470. switch ($terminal_type) {
  471. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  472. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  473. break;
  474. case '2': //C端:美团、拼多多、天猫、京东
  475. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  476. break;
  477. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  478. $platform = ['0'];
  479. break;
  480. default:
  481. # code...
  482. break;
  483. }
  484. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  485. }
  486. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  487. ->select(['product_name', DB::raw('count(product_name) as count')])->distinct('product_name')->orderby('count', 'desc')
  488. ->groupby('product_name')->paginate($limit);
  489. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  490. }
  491. /*
  492. * 低价违规公司数统计
  493. * @author 唐远望
  494. * @version 1.0
  495. * @date 2026-02-10
  496. *
  497. */
  498. public function get_low_price_company_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  499. {
  500. $request->scene('get_low_price_company_count')->validate();
  501. $admin_company_id = request('admin_company_id', '0');
  502. $company_id = request('access_token.company_id', '0');
  503. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  504. //终端类型B端、C端、OTO
  505. $terminal_type = request('terminal_type', '');
  506. $limit = request('limit', config('page_num', 10));
  507. $product_name = request('product_name', ''); //商品名称
  508. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  509. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  510. $start_time_string = request('start_time', '');
  511. $end_time_string = request('end_time', '');
  512. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  513. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  514. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  515. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  516. // 时间条件
  517. $map = [];
  518. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  519. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  520. // 权限判断
  521. if ($is_admin != 1 && $company_id != 0) {
  522. $map[] = ['company_id', '=', $company_id];
  523. } else {
  524. $map[] = ['company_id', '=', $admin_company_id];
  525. }
  526. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  527. if ($terminal_type) {
  528. $platform = [];
  529. switch ($terminal_type) {
  530. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  531. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  532. break;
  533. case '2': //C端:美团、拼多多、天猫、京东
  534. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  535. break;
  536. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  537. $platform = ['0'];
  538. break;
  539. default:
  540. # code...
  541. break;
  542. }
  543. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  544. }
  545. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  546. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  547. ->select(['company_name', DB::raw('count(company_name) as count')])->groupby('company_name')->orderby('count', 'desc')
  548. ->paginate($limit);
  549. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  550. }
  551. /**
  552. * 低价挂网省份统计
  553. * @author 唐远望
  554. * @version 1.0
  555. * @date 2026-02-10
  556. *
  557. */
  558. public function get_low_price_province_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  559. {
  560. $request->scene('get_low_price_province_count')->validate();
  561. $admin_company_id = request('admin_company_id', '0');
  562. $company_id = request('access_token.company_id', '0');
  563. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  564. //终端类型B端、C端、OTO
  565. $terminal_type = request('terminal_type', '');
  566. $product_name = request('product_name', ''); //商品名称
  567. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  568. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  569. $start_time_string = request('start_time', '');
  570. $end_time_string = request('end_time', '');
  571. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  572. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  573. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  574. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  575. // 时间条件
  576. $map = [];
  577. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  578. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  579. // 权限判断
  580. if ($is_admin != 1 && $company_id != 0) {
  581. $map[] = ['company_id', '=', $company_id];
  582. } else {
  583. $map[] = ['company_id', '=', $admin_company_id];
  584. }
  585. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  586. // 禁止挂网省份统计
  587. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  588. if ($terminal_type) {
  589. $platform = [];
  590. switch ($terminal_type) {
  591. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  592. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  593. break;
  594. case '2': //C端:美团、拼多多、天猫、京东
  595. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  596. break;
  597. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  598. $platform = ['0'];
  599. break;
  600. default:
  601. # code...
  602. break;
  603. }
  604. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  605. }
  606. try {
  607. // 假设 LowPriceGoodsModel 中有 province 字段,表示省份信息
  608. // 查询指定时间范围内的数据,并按 province 分组统计数量
  609. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  610. ->select(['province_name', DB::raw('count(province_name) as count')])
  611. ->groupby('province_name')
  612. ->orderby('count', 'desc')
  613. ->get()->toArray();
  614. $province_totle_count = 0;
  615. if (!empty($result)) {
  616. $province_totle_count = array_sum(array_column($result, 'count'));
  617. foreach ($result as $key => $value) {
  618. $result[$key]['percent'] = round(($value['count'] / $province_totle_count) * 100, 2);
  619. }
  620. }
  621. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  622. } catch (\Exception $e) {
  623. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  624. }
  625. }
  626. /**
  627. * 低价挂网城市统计
  628. * @author 唐远望
  629. * @version 1.0
  630. * @date 2026-02-10
  631. *
  632. */
  633. public function get_low_price_city_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  634. {
  635. $request->scene('get_low_price_city_count')->validate();
  636. $admin_company_id = request('admin_company_id', '0');
  637. $company_id = request('access_token.company_id', '0');
  638. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  639. //终端类型B端、C端、OTO
  640. $province_id = request('province_id', ''); //省份id
  641. $terminal_type = request('terminal_type', '');
  642. $product_name = request('product_name', ''); //商品名称
  643. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  644. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  645. $start_time_string = request('start_time', '');
  646. $end_time_string = request('end_time', '');
  647. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  648. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  649. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  650. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  651. // 时间条件
  652. $map = [];
  653. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  654. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  655. // 权限判断
  656. if ($is_admin != 1 && $company_id != 0) {
  657. $map[] = ['company_id', '=', $company_id];
  658. } else {
  659. $map[] = ['company_id', '=', $admin_company_id];
  660. }
  661. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  662. if ($province_id) $map[] = ['province_id', '=', $province_id];
  663. // 禁止挂网城市统计
  664. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  665. if ($terminal_type) {
  666. $platform = [];
  667. switch ($terminal_type) {
  668. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  669. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  670. break;
  671. case '2': //C端:美团、拼多多、天猫、京东
  672. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  673. break;
  674. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  675. $platform = ['0'];
  676. break;
  677. default:
  678. # code...
  679. break;
  680. }
  681. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  682. }
  683. try {
  684. // 假设 LowPriceGoodsModel 中有 city 字段,表示城市信息
  685. // 查询指定时间范围内的数据,并按 city 分组统计数量
  686. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  687. ->select(['city_name', DB::raw('count(city_name) as count')])
  688. ->groupby('city_name')
  689. ->orderby('count', 'desc')
  690. ->get()->toArray();
  691. $city_totle_count = 0;
  692. if (!empty($result)) {
  693. $city_totle_count = array_sum(array_column($result, 'count'));
  694. foreach ($result as $key => $value) {
  695. $result[$key]['percent'] = round(($value['count'] / $city_totle_count) * 100, 2);
  696. }
  697. }
  698. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  699. } catch (\Exception $e) {
  700. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  701. }
  702. }
  703. /**
  704. * 低价挂网平台分布
  705. * @author 唐远望
  706. * @version 1.0
  707. * @date 2026-02-27
  708. *
  709. */
  710. public function get_low_price_platform_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  711. {
  712. $request->scene('get_low_price_platform_count')->validate();
  713. $admin_company_id = request('admin_company_id', '0');
  714. $company_id = request('access_token.company_id', '0');
  715. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  716. //终端类型B端、C端、OTO
  717. $terminal_type = request('terminal_type', '');
  718. $product_name = request('product_name', ''); //商品名称
  719. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  720. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  721. $start_time_string = request('start_time', '');
  722. $end_time_string = request('end_time', '');
  723. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  724. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  725. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  726. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  727. // 时间条件
  728. $map = [];
  729. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  730. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  731. // 权限判断
  732. if ($is_admin != 1 && $company_id != 0) {
  733. $map[] = ['company_id', '=', $company_id];
  734. } else {
  735. $map[] = ['company_id', '=', $admin_company_id];
  736. }
  737. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  738. // 禁止挂网平台分布统计
  739. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  740. if ($terminal_type) {
  741. $platform = [];
  742. switch ($terminal_type) {
  743. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  744. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  745. break;
  746. case '2': //C端:美团、拼多多、天猫、京东
  747. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  748. break;
  749. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  750. $platform = ['0'];
  751. break;
  752. default:
  753. # code...
  754. break;
  755. }
  756. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  757. }
  758. try {
  759. // 假设 LowPriceGoodsModel 中有 platform 字段,表示平台信息
  760. // 查询指定时间范围内的数据,并按 platform 分组统计数量
  761. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  762. ->select(['platform', DB::raw('count(platform) as count')])
  763. ->groupby('platform')
  764. ->orderby('count', 'desc')
  765. ->get()->toArray();
  766. $platform_totle_count = 0;
  767. if (!empty($result)) {
  768. $platform_totle_count = array_sum(array_column($result, 'count'));
  769. foreach ($result as $key => $value) {
  770. $result[$key]['percent'] = round(($value['count'] / $platform_totle_count) * 100, 2);
  771. }
  772. }
  773. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  774. } catch (\Exception $e) {
  775. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  776. }
  777. }
  778. /**
  779. * 低价挂网平台省份分布
  780. * @author 唐远望
  781. * @version 1.0
  782. * @date 2026-02-27
  783. *
  784. */
  785. public function get_low_price_platform_province_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  786. {
  787. $request->scene('get_low_price_platform_province_count')->validate();
  788. $admin_company_id = request('admin_company_id', '0');
  789. $company_id = request('access_token.company_id', '0');
  790. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  791. //终端类型B端、C端、OTO
  792. $terminal_type = request('terminal_type', '');
  793. $product_name = request('product_name', ''); //商品名称
  794. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  795. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  796. $start_time_string = request('start_time', '');
  797. $end_time_string = request('end_time', '');
  798. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  799. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  800. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  801. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  802. // 时间条件
  803. $map = [];
  804. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  805. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  806. // 权限判断
  807. if ($is_admin != 1 && $company_id != 0) {
  808. $map[] = ['company_id', '=', $company_id];
  809. } else {
  810. $map[] = ['company_id', '=', $admin_company_id];
  811. }
  812. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  813. // 禁止挂网平台分布统计
  814. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  815. if ($terminal_type) {
  816. $platform = [];
  817. switch ($terminal_type) {
  818. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  819. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  820. break;
  821. case '2': //C端:美团、拼多多、天猫、京东
  822. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  823. break;
  824. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  825. $platform = ['0'];
  826. break;
  827. default:
  828. # code...
  829. break;
  830. }
  831. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  832. }
  833. try {
  834. // 假设 LowPriceGoodsModel 中有 province 字段,表示省份信息
  835. // 查询指定时间范围内的数据,并按 province 分组统计数量
  836. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  837. ->select(['province_name', DB::raw('count(province_name) as count')])
  838. ->groupby('province_name')
  839. ->orderby('count', 'desc')
  840. ->get();
  841. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  842. } catch (\Exception $e) {
  843. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  844. }
  845. }
  846. /**
  847. * 禁止挂网平台分布
  848. * @author 唐远望
  849. * @version 1.0
  850. * @date 2026-02-27
  851. *
  852. */
  853. public function get_violation_platform_count(request $request, ViolationProductModel $violationProductModel)
  854. {
  855. $request->scene('get_violation_platform_count')->validate();
  856. $admin_company_id = request('admin_company_id', '0');
  857. $company_id = request('access_token.company_id', '0');
  858. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  859. //终端类型B端、C端、OTO
  860. $terminal_type = request('terminal_type', '');
  861. $product_name = request('product_name', ''); //商品名称
  862. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  863. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  864. $start_time_string = request('start_time', '');
  865. $end_time_string = request('end_time', '');
  866. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  867. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  868. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  869. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  870. // 时间条件
  871. $map = [];
  872. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  873. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  874. // 权限判断
  875. if ($is_admin != 1 && $company_id != 0) {
  876. $map[] = ['company_id', '=', $company_id];
  877. } else {
  878. $map[] = ['company_id', '=', $admin_company_id];
  879. }
  880. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  881. // 禁止挂网平台分布统计
  882. $violationProductModel = $violationProductModel->query();
  883. if ($terminal_type) {
  884. $platform = [];
  885. switch ($terminal_type) {
  886. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  887. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  888. break;
  889. case '2': //C端:美团、拼多多、天猫、京东
  890. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  891. break;
  892. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  893. $platform = ['0'];
  894. break;
  895. default:
  896. # code...
  897. break;
  898. }
  899. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  900. }
  901. try {
  902. // 假设 ViolationProductModel 中有 platform 字段,表示平台信息
  903. // 查询指定时间范围内的数据,并按 platform 分组统计数量
  904. $result = $violationProductModel->where($map)->where('status', 0)
  905. ->select(['platform', DB::raw('count(platform) as count')])
  906. ->groupby('platform')
  907. ->orderby('count', 'desc')
  908. ->get()->toArray();
  909. $platform_totle_count = 0;
  910. if (!empty($result)) {
  911. $platform_totle_count = array_sum(array_column($result, 'count'));
  912. foreach ($result as $key => $value) {
  913. $result[$key]['percent'] = round(($value['count'] / $platform_totle_count) * 100, 2);
  914. }
  915. }
  916. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  917. } catch (\Exception $e) {
  918. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  919. }
  920. }
  921. /**
  922. * 禁止挂网平台省份分布
  923. * @author 唐远望
  924. * @version 1.0
  925. * @date 2026-02-27
  926. *
  927. */
  928. public function get_violation_platform_province_count(request $request, ViolationProductModel $violationProductModel)
  929. {
  930. $request->scene('get_violation_platform_province_count')->validate();
  931. $admin_company_id = request('admin_company_id', '0');
  932. $company_id = request('access_token.company_id', '0');
  933. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  934. //终端类型B端、C端、OTO
  935. $terminal_type = request('terminal_type', '');
  936. $product_name = request('product_name', ''); //商品名称
  937. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  938. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  939. $start_time_string = request('start_time', '');
  940. $end_time_string = request('end_time', '');
  941. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  942. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  943. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  944. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  945. // 时间条件
  946. $map = [];
  947. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  948. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  949. // 权限判断
  950. if ($is_admin != 1 && $company_id != 0) {
  951. $map[] = ['company_id', '=', $company_id];
  952. } else {
  953. $map[] = ['company_id', '=', $admin_company_id];
  954. }
  955. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  956. // 禁止挂网平台分布统计
  957. $violationProductModel = $violationProductModel->query();
  958. if ($terminal_type) {
  959. $platform = [];
  960. switch ($terminal_type) {
  961. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  962. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  963. break;
  964. case '2': //C端:美团、拼多多、天猫、京东
  965. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  966. break;
  967. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  968. $platform = ['0'];
  969. break;
  970. default:
  971. # code...
  972. break;
  973. }
  974. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  975. }
  976. try {
  977. // 假设 ViolationProductModel 中有 platform 字段,表示平台信息
  978. // 查询指定时间范围内的数据,并按 platform 分组统计数量
  979. $result = $violationProductModel->where($map)->where('status', 0)
  980. ->select(['province_name', DB::raw('count(province_name) as count')])
  981. ->groupby(['province_name'])
  982. ->orderby('count', 'desc')
  983. ->get();
  984. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  985. } catch (\Exception $e) {
  986. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  987. }
  988. }
  989. }