BasicPanel.php 84 KB

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