BasicPanel.php 82 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545
  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. /**
  990. * 违规公司平台占比
  991. * @author 唐远望
  992. * @version 1.0
  993. * @date 2026-03-23
  994. *
  995. */
  996. public function get_violation_company_platform_proportion(request $request, ViolationProductModel $violationProductModel)
  997. {
  998. $request->scene('get_violation_company_platform_proportion')->validate();
  999. $admin_company_id = request('admin_company_id', '0');
  1000. $company_id = request('access_token.company_id', '0');
  1001. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  1002. //终端类型B端、C端、OTO
  1003. $terminal_type = request('terminal_type', '');
  1004. $product_name = request('product_name', ''); //商品名称
  1005. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  1006. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  1007. $start_time_string = request('start_time', '');
  1008. $end_time_string = request('end_time', '');
  1009. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  1010. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  1011. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  1012. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  1013. // 时间条件
  1014. $map = [];
  1015. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  1016. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  1017. // 权限判断
  1018. if ($is_admin != 1 && $company_id != 0) {
  1019. $map[] = ['company_id', '=', $company_id];
  1020. } else {
  1021. $map[] = ['company_id', '=', $admin_company_id];
  1022. }
  1023. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  1024. // 禁止挂网平台分布统计
  1025. $violationProductModel = $violationProductModel->query();
  1026. if ($terminal_type) {
  1027. $platform = [];
  1028. switch ($terminal_type) {
  1029. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  1030. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  1031. break;
  1032. case '2': //C端:美团、拼多多、天猫、京东
  1033. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  1034. break;
  1035. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  1036. $platform = ['0'];
  1037. break;
  1038. default:
  1039. # code...
  1040. break;
  1041. }
  1042. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  1043. }
  1044. try {
  1045. // 假设 LowPriceGoodsModel 中有 platform 字段,表示平台信息
  1046. // 查询指定时间范围内的数据,并按 platform 分组统计数量
  1047. $result = $violationProductModel->where($map)->where('status', 0)
  1048. ->select(['platform', DB::raw('count(platform) as count')])
  1049. ->distinct('company_name')
  1050. ->groupby('platform')
  1051. ->orderby('count', 'desc')
  1052. ->get()->toArray();
  1053. $platform_totle_count = 0;
  1054. if (!empty($result)) {
  1055. $platform_totle_count = array_sum(array_column($result, 'count'));
  1056. foreach ($result as $key => $value) {
  1057. $result[$key]['percent'] = round(($value['count'] / $platform_totle_count) * 100, 2);
  1058. }
  1059. }
  1060. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  1061. } catch (\Exception $e) {
  1062. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  1063. }
  1064. }
  1065. /**
  1066. * 违规店铺平台占比
  1067. * @author 唐远望
  1068. * @version 1.0
  1069. * @date 2026-03-23
  1070. *
  1071. */
  1072. public function get_violation_store_platform_proportion(request $request, ViolationStoreModel $ViolationStoreModel)
  1073. {
  1074. $request->scene('get_violation_store_platform_proportion')->validate();
  1075. $admin_company_id = request('admin_company_id', '0');
  1076. $company_id = request('access_token.company_id', '0');
  1077. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  1078. //终端类型B端、C端、OTO
  1079. $terminal_type = request('terminal_type', '');
  1080. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  1081. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  1082. $start_time_string = request('start_time', '');
  1083. $end_time_string = request('end_time', '');
  1084. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  1085. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  1086. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  1087. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  1088. // 时间条件
  1089. $map = [];
  1090. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  1091. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  1092. // 权限判断
  1093. if ($is_admin != 1 && $company_id != 0) {
  1094. $map[] = ['company_id', '=', $company_id];
  1095. } else {
  1096. $map[] = ['company_id', '=', $admin_company_id];
  1097. }
  1098. // 禁止挂网平台分布统计
  1099. $ViolationStoreModel = $ViolationStoreModel->query();
  1100. if ($terminal_type) {
  1101. $platform = [];
  1102. switch ($terminal_type) {
  1103. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  1104. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  1105. break;
  1106. case '2': //C端:美团、拼多多、天猫、京东
  1107. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  1108. break;
  1109. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  1110. $platform = ['0'];
  1111. break;
  1112. default:
  1113. # code...
  1114. break;
  1115. }
  1116. $ViolationStoreModel = $ViolationStoreModel->whereIn('platform', $platform);
  1117. }
  1118. try {
  1119. // 假设 LowPriceGoodsModel 中有 platform 字段,表示平台信息
  1120. // 查询指定时间范围内的数据,并按 platform 分组统计数量
  1121. $result = $ViolationStoreModel->where($map)->where('status', 0)
  1122. ->select(['platform', DB::raw('count(platform) as count')])
  1123. ->groupby('platform')
  1124. ->orderby('count', 'desc')
  1125. ->get()->toArray();
  1126. $platform_totle_count = 0;
  1127. if (!empty($result)) {
  1128. $platform_totle_count = array_sum(array_column($result, 'count'));
  1129. foreach ($result as $key => $value) {
  1130. $result[$key]['percent'] = round(($value['count'] / $platform_totle_count) * 100, 2);
  1131. }
  1132. }
  1133. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  1134. } catch (\Exception $e) {
  1135. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  1136. }
  1137. }
  1138. /**
  1139. * 违规店铺平台省份分布
  1140. * @author 唐远望
  1141. * @version 1.0
  1142. * @date 2026-03-23
  1143. *
  1144. */
  1145. public function get_violation_store_province_count(request $request, ViolationStoreModel $ViolationStoreModel)
  1146. {
  1147. $request->scene('get_violation_store_province_count')->validate();
  1148. $admin_company_id = request('admin_company_id', '0');
  1149. $company_id = request('access_token.company_id', '0');
  1150. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  1151. //终端类型B端、C端、OTO
  1152. $terminal_type = request('terminal_type', '');
  1153. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  1154. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  1155. $start_time_string = request('start_time', '');
  1156. $end_time_string = request('end_time', '');
  1157. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  1158. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  1159. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  1160. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  1161. // 时间条件
  1162. $map = [];
  1163. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  1164. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  1165. // 权限判断
  1166. if ($is_admin != 1 && $company_id != 0) {
  1167. $map[] = ['company_id', '=', $company_id];
  1168. } else {
  1169. $map[] = ['company_id', '=', $admin_company_id];
  1170. }
  1171. // 违规公司平台分布统计
  1172. $ViolationStoreModel = $ViolationStoreModel->query();
  1173. if ($terminal_type) {
  1174. $platform = [];
  1175. switch ($terminal_type) {
  1176. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  1177. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  1178. break;
  1179. case '2': //C端:美团、拼多多、天猫、京东
  1180. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  1181. break;
  1182. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  1183. $platform = ['0'];
  1184. break;
  1185. default:
  1186. # code...
  1187. break;
  1188. }
  1189. $ViolationStoreModel = $ViolationStoreModel->whereIn('platform', $platform);
  1190. }
  1191. try {
  1192. // 假设 $violationProductModel 中有 province 字段,表示省份信息
  1193. // 查询指定时间范围内的数据,并按 province 分组统计数量
  1194. $result = $ViolationStoreModel->where($map)->where('status', 0)
  1195. ->select(['province_name', DB::raw('count(province_name) as count')])
  1196. ->groupby('province_name')
  1197. ->orderby('count', 'desc')
  1198. ->get();
  1199. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  1200. } catch (\Exception $e) {
  1201. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  1202. }
  1203. }
  1204. /**
  1205. * 违规店铺省份统计占比
  1206. * @author 唐远望
  1207. * @version 1.0
  1208. * @date 2026-03-23
  1209. *
  1210. */
  1211. public function get_violation_store_province_proportion(request $request, ViolationStoreModel $ViolationStoreModel)
  1212. {
  1213. $request->scene('get_violation_store_province_proportion')->validate();
  1214. $admin_company_id = request('admin_company_id', '0');
  1215. $company_id = request('access_token.company_id', '0');
  1216. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  1217. //终端类型B端、C端、OTO
  1218. $terminal_type = request('terminal_type', '');
  1219. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  1220. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  1221. $start_time_string = request('start_time', '');
  1222. $end_time_string = request('end_time', '');
  1223. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  1224. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  1225. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  1226. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  1227. // 时间条件
  1228. $map = [];
  1229. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  1230. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  1231. // 权限判断
  1232. if ($is_admin != 1 && $company_id != 0) {
  1233. $map[] = ['company_id', '=', $company_id];
  1234. } else {
  1235. $map[] = ['company_id', '=', $admin_company_id];
  1236. }
  1237. // 违规店铺省份统计
  1238. $ViolationStoreModel = $ViolationStoreModel->query();
  1239. if ($terminal_type) {
  1240. $platform = [];
  1241. switch ($terminal_type) {
  1242. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  1243. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  1244. break;
  1245. case '2': //C端:美团、拼多多、天猫、京东
  1246. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  1247. break;
  1248. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  1249. $platform = ['0'];
  1250. break;
  1251. default:
  1252. # code...
  1253. break;
  1254. }
  1255. $ViolationStoreModel = $ViolationStoreModel->whereIn('platform', $platform);
  1256. }
  1257. try {
  1258. // 假设 $ViolationStoreModel 中有 province 字段,表示省份信息
  1259. // 查询指定时间范围内的数据,并按 province 分组统计数量
  1260. $result = $ViolationStoreModel->where($map)->where('status', 0)
  1261. ->select(['province_name', DB::raw('count(province_name) as count')])
  1262. ->groupby('province_name')
  1263. ->orderby('count', 'desc')
  1264. ->get()->toArray();
  1265. $province_totle_count = 0;
  1266. if (!empty($result)) {
  1267. $province_totle_count = array_sum(array_column($result, 'count'));
  1268. //计算占比
  1269. foreach ($result as $key => $value) {
  1270. $result[$key]['percent'] = round(($value['count'] / $province_totle_count) * 100, 2);
  1271. }
  1272. }
  1273. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  1274. } catch (\Exception $e) {
  1275. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  1276. }
  1277. }
  1278. /**
  1279. * 违规店铺城市统计占比
  1280. * @author 唐远望
  1281. * @version 1.0
  1282. * @date 2026-03-23
  1283. *
  1284. */
  1285. public function get_violation_store_city_proportion(request $request, ViolationStoreModel $ViolationStoreModel)
  1286. {
  1287. $request->scene('get_violation_store_city_proportion')->validate();
  1288. $admin_company_id = request('admin_company_id', '0');
  1289. $company_id = request('access_token.company_id', '0');
  1290. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  1291. //终端类型B端、C端、OTO
  1292. $province_id = request('province_id', ''); //省份id
  1293. $terminal_type = request('terminal_type', '');
  1294. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  1295. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  1296. $start_time_string = request('start_time', '');
  1297. $end_time_string = request('end_time', '');
  1298. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  1299. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  1300. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  1301. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  1302. // 时间条件
  1303. $map = [];
  1304. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  1305. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  1306. if ($province_id) $map[] = ['province_id', '=', $province_id];
  1307. // 权限判断
  1308. if ($is_admin != 1 && $company_id != 0) {
  1309. $map[] = ['company_id', '=', $company_id];
  1310. } else {
  1311. $map[] = ['company_id', '=', $admin_company_id];
  1312. }
  1313. // 违规店铺省份统计
  1314. $ViolationStoreModel = $ViolationStoreModel->query();
  1315. if ($terminal_type) {
  1316. $platform = [];
  1317. switch ($terminal_type) {
  1318. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  1319. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  1320. break;
  1321. case '2': //C端:美团、拼多多、天猫、京东
  1322. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  1323. break;
  1324. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  1325. $platform = ['0'];
  1326. break;
  1327. default:
  1328. # code...
  1329. break;
  1330. }
  1331. $ViolationStoreModel = $ViolationStoreModel->whereIn('platform', $platform);
  1332. }
  1333. try {
  1334. // 假设 $ViolationStoreModel 中有 province 字段,表示省份信息
  1335. // 查询指定时间范围内的数据,并按 province 分组统计数量
  1336. $result = $ViolationStoreModel->where($map)->where('status', 0)
  1337. ->select(['city_name', DB::raw('count(city_name) as count')])
  1338. ->distinct('company_name')
  1339. ->groupby('city_name')
  1340. ->orderby('count', 'desc')
  1341. ->get()->toArray();
  1342. $province_totle_count = 0;
  1343. if (!empty($result)) {
  1344. $province_totle_count = array_sum(array_column($result, 'count'));
  1345. //计算占比
  1346. foreach ($result as $key => $value) {
  1347. $result[$key]['percent'] = round(($value['count'] / $province_totle_count) * 100, 2);
  1348. }
  1349. }
  1350. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  1351. } catch (\Exception $e) {
  1352. return json_send(['code' => 'error', 'msg' => '获取失败:' . $e->getMessage()]);
  1353. }
  1354. }
  1355. /*
  1356. * 低价挂网商品规格数统计排行
  1357. * @author 唐远望
  1358. * @version 1.0
  1359. * @date 2026-03-24
  1360. *
  1361. */
  1362. public function get_low_price_product_spec_count(request $request, LowPriceGoodsModel $LowPriceGoodsModel)
  1363. {
  1364. $request->scene('get_low_price_product_spec_count')->validate();
  1365. $admin_company_id = request('admin_company_id', '0');
  1366. $company_id = request('access_token.company_id', '0');
  1367. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  1368. //终端类型B端、C端、OTO
  1369. $terminal_type = request('terminal_type', '');
  1370. $limit = request('limit', config('page_num', 10));
  1371. $product_name = request('product_name', ''); //商品名称
  1372. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  1373. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  1374. $start_time_string = request('start_time', '');
  1375. $end_time_string = request('end_time', '');
  1376. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  1377. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  1378. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  1379. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  1380. // 时间条件
  1381. $map = [];
  1382. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  1383. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  1384. // 权限判断
  1385. if ($is_admin != 1 && $company_id != 0) {
  1386. $map[] = ['company_id', '=', $company_id];
  1387. } else {
  1388. $map[] = ['company_id', '=', $admin_company_id];
  1389. }
  1390. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  1391. $LowPriceGoodsModel = $LowPriceGoodsModel->query();
  1392. if ($terminal_type) {
  1393. $platform = [];
  1394. switch ($terminal_type) {
  1395. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  1396. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  1397. break;
  1398. case '2': //C端:美团、拼多多、天猫、京东
  1399. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  1400. break;
  1401. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  1402. $platform = ['0'];
  1403. break;
  1404. default:
  1405. # code...
  1406. break;
  1407. }
  1408. $LowPriceGoodsModel = $LowPriceGoodsModel->whereIn('platform', $platform);
  1409. }
  1410. $result = $LowPriceGoodsModel->where($map)->where('status', 0)
  1411. ->select(['product_name', 'product_specs', DB::raw('count(*) as count')])
  1412. ->groupby('product_name', 'product_specs')
  1413. ->orderby('count', 'desc')
  1414. ->paginate($limit);
  1415. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  1416. }
  1417. /**
  1418. * 禁止挂网商品规格数统计排行
  1419. * @author 唐远望
  1420. * @version 1.0
  1421. * @date 2026-03-24
  1422. *
  1423. */
  1424. public function get_violation_product_spec_count(request $request, ViolationProductModel $violationProductModel)
  1425. {
  1426. $request->scene('get_violation_product_spec_count')->validate();
  1427. $admin_company_id = request('admin_company_id', '0');
  1428. $company_id = request('access_token.company_id', '0');
  1429. //终端类型B端、C端、OTO
  1430. $terminal_type = request('terminal_type', '');
  1431. $product_name = request('product_name', ''); //商品名称
  1432. $is_admin = request('access_token.is_admin', '0'); //是否管理员操作 0=是1=否
  1433. $limit = request('limit', config('page_num', 10));
  1434. $yesterdayStart = Carbon::yesterday()->startOfDay()->getTimestamp(); // 昨天开始时间 00:00:00
  1435. $yesterdayEnd = Carbon::yesterday()->endOfDay()->getTimestamp(); // 昨天结束时间 23:59:59
  1436. $start_time_string = request('start_time', '');
  1437. $end_time_string = request('end_time', '');
  1438. $start_time = $start_time_string ? strtotime($start_time_string . ' 00:00:00') : $yesterdayStart;
  1439. $end_time = $end_time_string ? strtotime($end_time_string . ' 23:59:59') : $yesterdayEnd;
  1440. $todayStart = Carbon::today()->startOfDay()->getTimestamp(); // 今天开始时间 00:00:00
  1441. // if ($start_time > $todayStart || $end_time > $todayStart) return json_send(['code' => 'error', 'msg' => '不支持查询今天或以后时间', 'data' => '']);
  1442. // 时间条件
  1443. $map = [];
  1444. if ($start_time) $map[] = ['insert_time', '>=', $start_time];
  1445. if ($end_time) $map[] = ['insert_time', '<=', $end_time];
  1446. // 权限判断
  1447. if ($is_admin != 1 && $company_id != 0) {
  1448. $map[] = ['company_id', '=', $company_id];
  1449. } else {
  1450. $map[] = ['company_id', '=', $admin_company_id];
  1451. }
  1452. if ($product_name) $map[] = ['product_name', 'like', '%' . $product_name . '%'];
  1453. $violationProductModel = $violationProductModel->query();
  1454. if ($terminal_type) {
  1455. $platform = [];
  1456. switch ($terminal_type) {
  1457. case '1': //B端:药师帮、1药城、药久久、药易购、药帮忙、熊猫药药
  1458. $platform = ['0', '5', '6', '7', '8', '9', '10']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  1459. break;
  1460. case '2': //C端:美团、拼多多、天猫、京东
  1461. $platform = ['0', '1', '2', '3', '4']; //平台0=全部,1=淘宝,2=京东,3=拼多多,4=美团,5=药师帮,6=1药城,7=药久久,8=药易购,9=药帮忙,10=熊猫药药
  1462. break;
  1463. case '3': //OTO:美团买药、淘宝闪送、京东秒送
  1464. $platform = ['0'];
  1465. break;
  1466. default:
  1467. # code...
  1468. break;
  1469. }
  1470. $violationProductModel = $violationProductModel->whereIn('platform', $platform);
  1471. }
  1472. $result = $violationProductModel->where($map)->where('status', 0)
  1473. ->select(['product_name', 'product_specs', DB::raw('count(*) as count')])
  1474. ->groupby('product_name', 'product_specs')
  1475. ->orderby('count', 'desc')
  1476. ->paginate($limit);
  1477. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  1478. }
  1479. }