BasicPanel.php 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  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. $collect_b_product_count = $productModel->where(function ($query) {
  88. $platforms = ['0', '5', '6', '7', '8', '9', '10'];
  89. foreach ($platforms as $platform) {
  90. $query->orWhereRaw("FIND_IN_SET(?, platform)", [$platform]);
  91. }
  92. })->where('status', 0)->where($productModel_map)->groupby('product_name')->sum('product_specs_number');
  93. $productModel = new ProductModel();
  94. $productModel_map = [];
  95. if ($start_time) $productModel_map[] = ['insert_time', '>=', $start_time];
  96. if ($end_time) $productModel_map[] = ['insert_time', '<=', $end_time];
  97. $collect_c_product_count = $productModel->where(function ($query) {
  98. $platforms = ['0', '1', '2', '3', '4'];
  99. foreach ($platforms as $platform) {
  100. $query->orWhereRaw("FIND_IN_SET(?, platform)", [$platform]);
  101. }
  102. })->where('status', 0)->where($productModel_map)->groupby('product_name')->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. $collect_oto_product_count = $productModel->where(function ($query) {
  108. $platforms = ['0'];
  109. foreach ($platforms as $platform) {
  110. $query->orWhereRaw("FIND_IN_SET(?, platform)", [$platform]);
  111. }
  112. })->where('status', 0)->where($productModel_map)->groupby('product_name')->sum('product_specs_number');
  113. // 所有终端品规数量
  114. $collect_totle_product_count = $collect_b_product_count + $collect_c_product_count + $collect_oto_product_count;
  115. $result_data = [
  116. 'low_price_goods_count' => $lowPriceGoodsCount, // 低价挂网商品数量
  117. 'violation_product_count' => $violationProductCount, // 禁止挂网商品数量
  118. 'violation_store_count' => $violationStoreCount, // 违规店铺数量
  119. 'totle_product_count' => $lowPriceGoodsCount + $violationProductCount, // 总商品数量
  120. 'collect_b_product_count' => $collect_b_product_count, // B端品规数量
  121. 'collect_c_product_count' => $collect_c_product_count, // C端品规数量
  122. 'collect_oto_product_count' => $collect_oto_product_count, // OTO品规数量
  123. 'collect_totle_product_count' => $collect_totle_product_count, // 所有终端品规数量
  124. ];
  125. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result_data]);
  126. }
  127. /**
  128. * 禁止挂网商品数统计
  129. * @author 唐远望
  130. * @version 1.0
  131. * @date 2026-02-10
  132. *
  133. */
  134. public function get_violation_product_count(request $request, ViolationProductModel $violationProductModel)
  135. {
  136. $request->scene('get_violation_product_count')->validate();
  137. $admin_company_id = request('admin_company_id', '0');
  138. $company_id = request('access_token.company_id', '0');
  139. //终端类型B端、C端、OTO
  140. $terminal_type = request('terminal_type', '');
  141. $product_name = request('product_name', ''); //商品名称
  142. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  143. $limit = request('limit', config('page_num', 10));
  144. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  145. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  146. $start_time_string = request('start_time', '');
  147. $end_time_string = request('end_time', '');
  148. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  149. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  150. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  151. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  152. // 时间条件
  153. $map = [];
  154. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  155. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  156. // 权限判断
  157. if ($is_admin != 1 && $company_id != 0) {
  158. $map[] = ['company_id', '=', $company_id];
  159. } else {
  160. $map[] = ['company_id', '=', $admin_company_id];
  161. }
  162. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  163. $violationProductModel = $violationProductModel->query();
  164. if ($terminal_type) {
  165. $platform = [];
  166. switch ($terminal_type) {
  167. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  168. $platform = ['0','5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  169. break;
  170. case '2': //C端:美团、拼多多、天猫、京东
  171. $platform = ['0','1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  172. break;
  173. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  174. $platform = ['0'];
  175. break;
  176. default:
  177. # code...
  178. break;
  179. }
  180. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  181. }
  182. $result = $violationProductModel->where($map)->where('status', 0)
  183. ->select(['product_name', DB::raw('count(product_name) as count')])->distinct('product_name')->orderby('count', 'desc')
  184. ->groupby('product_name')->paginate($limit);
  185. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  186. }
  187. /**
  188. * 禁止挂网省份统计
  189. * @author 唐远望
  190. * @version 1.0
  191. * @date 2026-02-10
  192. *
  193. */
  194. public function get_violation_province_count(request $request, ViolationProductModel $violationProductModel)
  195. {
  196. $request->scene('get_violation_province_count')->validate();
  197. $admin_company_id = request('admin_company_id', '0');
  198. $company_id = request('access_token.company_id', '0');
  199. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  200. //终端类型B端、C端、OTO
  201. $terminal_type = request('terminal_type', '');
  202. $product_name = request('product_name', ''); //商品名称
  203. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  204. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  205. $start_time_string = request('start_time', '');
  206. $end_time_string = request('end_time', '');
  207. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  208. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  209. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  210. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  211. // 时间条件
  212. $map = [];
  213. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  214. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  215. // 权限判断
  216. if ($is_admin != 1 && $company_id != 0) {
  217. $map[] = ['company_id', '=', $company_id];
  218. } else {
  219. $map[] = ['company_id', '=', $admin_company_id];
  220. }
  221. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  222. // 禁止挂网省份统计
  223. $violationProductModel = $violationProductModel->query();
  224. if ($terminal_type) {
  225. $platform = [];
  226. switch ($terminal_type) {
  227. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  228. $platform = ['0','5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  229. break;
  230. case '2': //C端:美团、拼多多、天猫、京东
  231. $platform = ['0','1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  232. break;
  233. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  234. $platform = ['0'];
  235. break;
  236. default:
  237. # code...
  238. break;
  239. }
  240. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  241. }
  242. try {
  243. // 假设 ViolationProductModel 中有 province 字段,表示省份信息
  244. // 查询指定时间范围内的数据,并按 province 分组统计数量
  245. $result = $violationProductModel->where($map)->where('status', 0)
  246. ->select(['province_name', DB::raw('count(province_name) as count')])
  247. ->groupby('province_name')
  248. ->orderby('count', 'desc')
  249. ->get();
  250. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  251. } catch (\Exception $e) {
  252. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  253. }
  254. }
  255. /**
  256. * 禁止挂网城市统计
  257. * @author 唐远望
  258. * @version 1.0
  259. * @date 2026-02-10
  260. *
  261. */
  262. public function get_violation_city_count(request $request, ViolationProductModel $violationProductModel)
  263. {
  264. $request->scene('get_violation_city_count')->validate();
  265. $admin_company_id = request('admin_company_id', '0');
  266. $company_id = request('access_token.company_id', '0');
  267. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  268. //终端类型B端、C端、OTO
  269. $terminal_type = request('terminal_type', '');
  270. $product_name = request('product_name', ''); //商品名称
  271. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  272. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  273. $start_time_string = request('start_time', '');
  274. $end_time_string = request('end_time', '');
  275. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  276. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  277. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  278. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  279. // 时间条件
  280. $map = [];
  281. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  282. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  283. // 权限判断
  284. if ($is_admin != 1 && $company_id != 0) {
  285. $map[] = ['company_id', '=', $company_id];
  286. } else {
  287. $map[] = ['company_id', '=', $admin_company_id];
  288. }
  289. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  290. // 禁止挂网城市统计
  291. $violationProductModel = $violationProductModel->query();
  292. if ($terminal_type) {
  293. $platform = [];
  294. switch ($terminal_type) {
  295. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  296. $platform = ['0','5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  297. break;
  298. case '2': //C端:美团、拼多多、天猫、京东
  299. $platform = ['0','1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  300. break;
  301. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  302. $platform = ['0'];
  303. break;
  304. default:
  305. # code...
  306. break;
  307. }
  308. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  309. }
  310. try {
  311. // 假设 ViolationProductModel 中有 city 字段,表示城市信息
  312. // 查询指定时间范围内的数据,并按 city 分组统计数量
  313. $result = $violationProductModel->where($map)->where('status', 0)
  314. ->select(['city_name', DB::raw('count(city_name) as count')])
  315. ->groupby('city_name')
  316. ->orderby('count', 'desc')
  317. ->get();
  318. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  319. } catch (\Exception $e) {
  320. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  321. }
  322. }
  323. /**
  324. * 禁止挂网公司数统计
  325. * @author 唐远望
  326. * @version 1.0
  327. * @date 2026-02-10
  328. *
  329. */
  330. public function get_violation_company_count(request $request, ViolationProductModel $violationProductModel)
  331. {
  332. $request->scene('get_violation_company_count')->validate();
  333. $admin_company_id = request('admin_company_id', '0');
  334. $company_id = request('access_token.company_id', '0');
  335. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  336. //终端类型B端、C端、OTO
  337. $terminal_type = request('terminal_type', '');
  338. $limit = request('limit', config('page_num', 10));
  339. $product_name = request('product_name', ''); //商品名称
  340. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  341. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  342. $start_time_string = request('start_time', '');
  343. $end_time_string = request('end_time', '');
  344. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  345. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  346. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  347. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  348. // 时间条件
  349. $map = [];
  350. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  351. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  352. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  353. // 权限判断
  354. if ($is_admin != 1 && $company_id != 0) {
  355. $map[] = ['company_id', '=', $company_id];
  356. } else {
  357. $map[] = ['company_id', '=', $admin_company_id];
  358. }
  359. $violationProductModel = $violationProductModel->query();
  360. if ($terminal_type) {
  361. $platform = [];
  362. switch ($terminal_type) {
  363. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  364. $platform = ['0','5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  365. break;
  366. case '2': //C端:美团、拼多多、天猫、京东
  367. $platform = ['0','1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  368. break;
  369. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  370. $platform = ['0'];
  371. break;
  372. default:
  373. # code...
  374. break;
  375. }
  376. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  377. }
  378. $result = $violationProductModel->where($map)->where('status', 0)
  379. ->select(['company_name', DB::raw('count(company_name) as count')])->groupby('company_name')->orderby('count', 'desc')
  380. ->paginate($limit);
  381. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  382. }
  383. /*
  384. * 低价违规商品数统计
  385. * @author 唐远望
  386. * @version 1.0
  387. * @date 2026-02-10
  388. *
  389. */
  390. public function get_low_price_product_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  391. {
  392. $request->scene('get_low_price_product_count')->validate();
  393. $admin_company_id = request('admin_company_id', '0');
  394. $company_id = request('access_token.company_id', '0');
  395. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  396. //终端类型B端、C端、OTO
  397. $terminal_type = request('terminal_type', '');
  398. $limit = request('limit', config('page_num', 10));
  399. $product_name = request('product_name', ''); //商品名称
  400. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  401. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  402. $start_time_string = request('start_time', '');
  403. $end_time_string = request('end_time', '');
  404. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  405. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  406. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  407. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  408. // 时间条件
  409. $map = [];
  410. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  411. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  412. // 权限判断
  413. if ($is_admin != 1 && $company_id != 0) {
  414. $map[] = ['company_id', '=', $company_id];
  415. } else {
  416. $map[] = ['company_id', '=', $admin_company_id];
  417. }
  418. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  419. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  420. if ($terminal_type) {
  421. $platform = [];
  422. switch ($terminal_type) {
  423. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  424. $platform = ['0','5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  425. break;
  426. case '2': //C端:美团、拼多多、天猫、京东
  427. $platform = ['0','1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  428. break;
  429. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  430. $platform = ['0'];
  431. break;
  432. default:
  433. # code...
  434. break;
  435. }
  436. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  437. }
  438. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  439. ->select(['product_name', DB::raw('count(product_name) as count')])->distinct('product_name')->orderby('count', 'desc')
  440. ->groupby('product_name')->paginate($limit);
  441. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  442. }
  443. /*
  444. * 低价违规公司数统计
  445. * @author 唐远望
  446. * @version 1.0
  447. * @date 2026-02-10
  448. *
  449. */
  450. public function get_low_price_company_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  451. {
  452. $request->scene('get_low_price_company_count')->validate();
  453. $admin_company_id = request('admin_company_id', '0');
  454. $company_id = request('access_token.company_id', '0');
  455. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  456. //终端类型B端、C端、OTO
  457. $terminal_type = request('terminal_type', '');
  458. $limit = request('limit', config('page_num', 10));
  459. $product_name = request('product_name', ''); //商品名称
  460. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  461. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  462. $start_time_string = request('start_time', '');
  463. $end_time_string = request('end_time', '');
  464. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  465. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  466. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  467. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  468. // 时间条件
  469. $map = [];
  470. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  471. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  472. // 权限判断
  473. if ($is_admin != 1 && $company_id != 0) {
  474. $map[] = ['company_id', '=', $company_id];
  475. } else {
  476. $map[] = ['company_id', '=', $admin_company_id];
  477. }
  478. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  479. if ($terminal_type) {
  480. $platform = [];
  481. switch ($terminal_type) {
  482. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  483. $platform = ['0','5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  484. break;
  485. case '2': //C端:美团、拼多多、天猫、京东
  486. $platform = ['0','1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  487. break;
  488. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  489. $platform = ['0'];
  490. break;
  491. default:
  492. # code...
  493. break;
  494. }
  495. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  496. }
  497. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  498. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  499. ->select(['company_name', DB::raw('count(company_name) as count')])->groupby('company_name')->orderby('count', 'desc')
  500. ->paginate($limit);
  501. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  502. }
  503. /**
  504. * 低价挂网省份统计
  505. * @author 唐远望
  506. * @version 1.0
  507. * @date 2026-02-10
  508. *
  509. */
  510. public function get_low_price_province_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  511. {
  512. $request->scene('get_low_price_province_count')->validate();
  513. $admin_company_id = request('admin_company_id', '0');
  514. $company_id = request('access_token.company_id', '0');
  515. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  516. //终端类型B端、C端、OTO
  517. $terminal_type = request('terminal_type', '');
  518. $product_name = request('product_name', ''); //商品名称
  519. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  520. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  521. $start_time_string = request('start_time', '');
  522. $end_time_string = request('end_time', '');
  523. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  524. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  525. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  526. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  527. // 时间条件
  528. $map = [];
  529. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  530. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  531. // 权限判断
  532. if ($is_admin != 1 && $company_id != 0) {
  533. $map[] = ['company_id', '=', $company_id];
  534. } else {
  535. $map[] = ['company_id', '=', $admin_company_id];
  536. }
  537. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  538. // 禁止挂网省份统计
  539. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  540. if ($terminal_type) {
  541. $platform = [];
  542. switch ($terminal_type) {
  543. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  544. $platform = ['0','5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  545. break;
  546. case '2': //C端:美团、拼多多、天猫、京东
  547. $platform = ['0','1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  548. break;
  549. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  550. $platform = ['0'];
  551. break;
  552. default:
  553. # code...
  554. break;
  555. }
  556. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  557. }
  558. try {
  559. // 假设 LowPriceGoodsModel 中有 province 字段,表示省份信息
  560. // 查询指定时间范围内的数据,并按 province 分组统计数量
  561. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  562. ->select(['province_name', DB::raw('count(province_name) as count')])
  563. ->groupby('province_name')
  564. ->orderby('count', 'desc')
  565. ->get();
  566. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  567. } catch (\Exception $e) {
  568. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  569. }
  570. }
  571. /**
  572. * 低价挂网城市统计
  573. * @author 唐远望
  574. * @version 1.0
  575. * @date 2026-02-10
  576. *
  577. */
  578. public function get_low_price_city_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  579. {
  580. $request->scene('get_low_price_city_count')->validate();
  581. $admin_company_id = request('admin_company_id', '0');
  582. $company_id = request('access_token.company_id', '0');
  583. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  584. //终端类型B端、C端、OTO
  585. $terminal_type = request('terminal_type', '');
  586. $product_name = request('product_name', ''); //商品名称
  587. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  588. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  589. $start_time_string = request('start_time', '');
  590. $end_time_string = request('end_time', '');
  591. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  592. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  593. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  594. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  595. // 时间条件
  596. $map = [];
  597. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  598. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  599. // 权限判断
  600. if ($is_admin != 1 && $company_id != 0) {
  601. $map[] = ['company_id', '=', $company_id];
  602. } else {
  603. $map[] = ['company_id', '=', $admin_company_id];
  604. }
  605. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  606. // 禁止挂网城市统计
  607. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  608. if ($terminal_type) {
  609. $platform = [];
  610. switch ($terminal_type) {
  611. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  612. $platform = ['0','5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  613. break;
  614. case '2': //C端:美团、拼多多、天猫、京东
  615. $platform = ['0','1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  616. break;
  617. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  618. $platform = ['0'];
  619. break;
  620. default:
  621. # code...
  622. break;
  623. }
  624. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  625. }
  626. try {
  627. // 假设 LowPriceGoodsModel 中有 city 字段,表示城市信息
  628. // 查询指定时间范围内的数据,并按 city 分组统计数量
  629. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  630. ->select(['city_name', DB::raw('count(city_name) as count')])
  631. ->groupby('city_name')
  632. ->orderby('count', 'desc')
  633. ->get();
  634. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  635. } catch (\Exception $e) {
  636. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  637. }
  638. }
  639. }