BasicPanel.php 83 KB

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