BasicPanel.php 75 KB

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