BasicPanel.php 86 KB

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