BasicPanel.php 88 KB

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