Dashboard.php 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <?php
  2. namespace App\Controllers;
  3. use CodeIgniter\RESTful\ResourceController;
  4. class Dashboard extends ResourceController
  5. {
  6. // 최근 들어온 주문 현황 조회
  7. public function recentOrders()
  8. {
  9. // 한국 시간으로 설정
  10. date_default_timezone_set('Asia/Seoul');
  11. $db = \Config\Database::connect();
  12. $request = $this->request->getJSON(true);
  13. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  14. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  15. $memberSeq = isset($request['MEMBER_SEQ']) ? $request['MEMBER_SEQ'] : null;
  16. $limit = isset($request['LIMIT']) ? $request['LIMIT'] : 10;
  17. try {
  18. $builder = $db->table('DELI_LIST D')
  19. ->select('D.*, I.NAME as ITEM_NAME, I.COMPANY_NUMBER')
  20. ->join('ITEM_LIST I', 'D.ITEM_SEQ = I.SEQ', 'left')
  21. ->where('D.DEL_YN', 'N')
  22. ->orderBy('D.REGDATE', 'DESC')
  23. ->limit($limit);
  24. // 사용자 타입별 필터링
  25. if ($memberType === 'VENDOR' && !empty($companyNumber)) {
  26. $builder->where('I.COMPANY_NUMBER', $companyNumber);
  27. } elseif ($memberType === 'BRAND' && !empty($memberSeq)) {
  28. $builder->where('I.CONTACT_BRD', $memberSeq);
  29. } elseif ($memberType === 'INFLUENCER' && !empty($memberSeq)) {
  30. $builder->where('I.CONTACT_INF', $memberSeq);
  31. }
  32. $orders = $builder->get()->getResultArray();
  33. return $this->respond($orders, 200);
  34. } catch (\Exception $e) {
  35. return $this->respond([
  36. 'status' => 'fail',
  37. 'message' => 'DB 오류: ' . $e->getMessage()
  38. ], 500);
  39. }
  40. }
  41. // 진행중인 공동구매 리스트 조회
  42. public function activeItems()
  43. {
  44. // 한국 시간으로 설정
  45. date_default_timezone_set('Asia/Seoul');
  46. $db = \Config\Database::connect();
  47. $request = $this->request->getJSON(true);
  48. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  49. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  50. $memberSeq = isset($request['MEMBER_SEQ']) ? $request['MEMBER_SEQ'] : null;
  51. $limit = isset($request['LIMIT']) ? $request['LIMIT'] : 10;
  52. try {
  53. $today = date('Y-m-d');
  54. $builder = $db->table('ITEM_LIST I')
  55. ->select('I.*, COALESCE(V.COMPANY_NAME, B.COMPANY_NAME) as COMPANY_NAME,
  56. (SELECT COUNT(*) FROM DELI_LIST D WHERE D.ITEM_SEQ = I.SEQ AND D.DEL_YN = "N") as ORDER_COUNT')
  57. ->join('VENDOR_LIST V', 'I.COMPANY_NUMBER = V.COMPANY_NUMBER', 'left')
  58. ->join('BRAND_LIST B', 'I.COMPANY_NUMBER = B.COMPANY_NUMBER', 'left')
  59. ->where('I.DEL_YN', 'N')
  60. ->where('I.STATUS', 0) // 진행중
  61. ->where('I.SHOW_YN', 'Y')
  62. ->where('I.TYPE', 'GROUP_BUY') // 공동구매만
  63. ->where('I.ORDER_END_DATE >=', $today) // 마감일이 지나지 않은 것만
  64. ->orderBy('I.ORDER_END_DATE', 'ASC')
  65. ->limit($limit);
  66. // 사용자 타입별 필터링
  67. if ($memberType === 'VENDOR' && !empty($companyNumber)) {
  68. $builder->where('I.COMPANY_NUMBER', $companyNumber);
  69. } elseif ($memberType === 'BRAND' && !empty($memberSeq)) {
  70. $builder->where('I.CONTACT_BRD', $memberSeq);
  71. } elseif ($memberType === 'INFLUENCER' && !empty($memberSeq)) {
  72. $builder->where('I.CONTACT_INF', $memberSeq);
  73. }
  74. $items = $builder->get()->getResultArray();
  75. return $this->respond($items, 200);
  76. } catch (\Exception $e) {
  77. return $this->respond([
  78. 'status' => 'fail',
  79. 'message' => 'DB 오류: ' . $e->getMessage()
  80. ], 500);
  81. }
  82. }
  83. // 인플루언서별 판매된 주문 건수 통계
  84. public function influencerStats()
  85. {
  86. // 한국 시간으로 설정
  87. date_default_timezone_set('Asia/Seoul');
  88. $db = \Config\Database::connect();
  89. $request = $this->request->getJSON(true);
  90. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  91. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  92. $memberSeq = isset($request['MEMBER_SEQ']) ? $request['MEMBER_SEQ'] : null;
  93. $limit = isset($request['LIMIT']) ? $request['LIMIT'] : 10;
  94. try {
  95. $builder = $db->table('DELI_LIST D')
  96. ->select('I.CONTACT_INF as INF_SEQ, INF.NICK_NAME as INF_NAME, COUNT(D.SEQ) as ORDER_COUNT')
  97. ->join('ITEM_LIST I', 'D.ITEM_SEQ = I.SEQ', 'inner')
  98. ->join('INFLUENCER_LIST INF', 'I.CONTACT_INF = INF.SEQ', 'left')
  99. ->where('D.DEL_YN', 'N')
  100. ->where('I.DEL_YN', 'N')
  101. ->where('I.CONTACT_INF >', 0) // 인플루언서가 배정된 항목만
  102. ->groupBy('I.CONTACT_INF, INF.NICK_NAME')
  103. ->orderBy('ORDER_COUNT', 'DESC')
  104. ->limit($limit);
  105. // 사용자 타입별 필터링
  106. if ($memberType === 'VENDOR' && !empty($companyNumber)) {
  107. $builder->where('I.COMPANY_NUMBER', $companyNumber);
  108. } elseif ($memberType === 'BRAND' && !empty($memberSeq)) {
  109. $builder->where('I.CONTACT_BRD', $memberSeq);
  110. }
  111. $stats = $builder->get()->getResultArray();
  112. return $this->respond($stats, 200);
  113. } catch (\Exception $e) {
  114. return $this->respond([
  115. 'status' => 'fail',
  116. 'message' => 'DB 오류: ' . $e->getMessage()
  117. ], 500);
  118. }
  119. }
  120. // 대시보드 전체 통계 요약
  121. public function summary()
  122. {
  123. // 한국 시간으로 설정
  124. date_default_timezone_set('Asia/Seoul');
  125. $db = \Config\Database::connect();
  126. $request = $this->request->getJSON(true);
  127. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  128. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  129. $memberSeq = isset($request['MEMBER_SEQ']) ? $request['MEMBER_SEQ'] : null;
  130. try {
  131. $today = date('Y-m-d');
  132. $weekAgo = date('Y-m-d', strtotime('-7 days'));
  133. // 기본 조건 설정
  134. $whereConditions = ['I.DEL_YN' => 'N'];
  135. if ($memberType === 'VENDOR' && !empty($companyNumber)) {
  136. $whereConditions['I.COMPANY_NUMBER'] = $companyNumber;
  137. } elseif ($memberType === 'BRAND' && !empty($memberSeq)) {
  138. $whereConditions['I.CONTACT_BRD'] = $memberSeq;
  139. } elseif ($memberType === 'INFLUENCER' && !empty($memberSeq)) {
  140. $whereConditions['I.CONTACT_INF'] = $memberSeq;
  141. }
  142. // 최근 7일 주문 수
  143. $recentOrdersCount = $db->table('DELI_LIST D')
  144. ->join('ITEM_LIST I', 'D.ITEM_SEQ = I.SEQ', 'inner')
  145. ->where('D.DEL_YN', 'N')
  146. ->where('D.REGDATE >=', $weekAgo . ' 00:00:00')
  147. ->where($whereConditions)
  148. ->countAllResults();
  149. // 진행중인 공동구매 수
  150. $activeItemsCount = $db->table('ITEM_LIST I')
  151. ->where('I.STATUS', 0)
  152. ->where('I.SHOW_YN', 'Y')
  153. ->where('I.TYPE', 'GROUP_BUY')
  154. ->where('I.ORDER_END_DATE >=', $today)
  155. ->where($whereConditions)
  156. ->countAllResults();
  157. // 총 주문 건수
  158. $totalSalesCount = $db->table('DELI_LIST D')
  159. ->join('ITEM_LIST I', 'D.ITEM_SEQ = I.SEQ', 'inner')
  160. ->where('D.DEL_YN', 'N')
  161. ->where($whereConditions)
  162. ->countAllResults();
  163. // 활성 인플루언서 수 (주문이 있는 인플루언서)
  164. $activeInfluencersCount = $db->table('DELI_LIST D')
  165. ->select('I.CONTACT_INF')
  166. ->join('ITEM_LIST I', 'D.ITEM_SEQ = I.SEQ', 'inner')
  167. ->where('D.DEL_YN', 'N')
  168. ->where('I.CONTACT_INF >', 0)
  169. ->where($whereConditions)
  170. ->distinct()
  171. ->countAllResults();
  172. $summary = [
  173. 'recent_orders_count' => $recentOrdersCount,
  174. 'active_items_count' => $activeItemsCount,
  175. 'total_sales_count' => $totalSalesCount,
  176. 'active_influencers_count' => $activeInfluencersCount
  177. ];
  178. return $this->respond($summary, 200);
  179. } catch (\Exception $e) {
  180. return $this->respond([
  181. 'status' => 'fail',
  182. 'message' => 'DB 오류: ' . $e->getMessage()
  183. ], 500);
  184. }
  185. }
  186. }