BasicPanel.php 85 KB

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