Dashboard.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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. try {
  17. $limit = isset($request['LIMIT']) ? $request['LIMIT'] : null;
  18. $builder = $db->table('ITEM_ORDER_LIST D')
  19. ->select('D.*, I.NAME as ITEM_NAME, I.COMPANY_NUMBER, I.CONTACT_INF, U.NICK_NAME as INF_NICK_NAME, U.NAME as INF_NAME')
  20. ->join('ITEM_LIST I', 'D.ITEM_SEQ = I.SEQ', 'left')
  21. ->join('USER_LIST U', 'I.CONTACT_INF = U.SEQ', 'left')
  22. ->where('I.DEL_YN', 'N')
  23. ->orderBy('D.REG_DATE', 'DESC');
  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. }
  30. // elseif ($memberType === 'INFLUENCER' && !empty($memberSeq)) {
  31. // $builder->where('I.CONTACT_INF', $memberSeq);
  32. // }
  33. // 총 개수 먼저 구하기 (LIMIT 적용 전)
  34. $totalCount = $builder->countAllResults(false);
  35. // LIMIT이 있으면 적용
  36. if ($limit) {
  37. $builder->limit($limit);
  38. }
  39. $orders = $builder->get()->getResultArray();
  40. return $this->respond([
  41. 'data' => $orders,
  42. 'total' => $totalCount
  43. ], 200);
  44. } catch (\Exception $e) {
  45. return $this->respond([
  46. 'status' => 'fail',
  47. 'message' => 'DB 오류: ' . $e->getMessage()
  48. ], 500);
  49. }
  50. }
  51. // 진행중인 공동구매 리스트 조회
  52. public function activeItems()
  53. {
  54. $db = \Config\Database::connect();
  55. // POST JSON 파라미터 받기
  56. $request = $this->request->getJSON(true);
  57. $itemType = isset($request['TYPE']) ? $request['TYPE'] : null;
  58. $showYn = isset($request['SHOW_YN']) ? $request['SHOW_YN'] : null;
  59. $status = isset($request['STATUS']) ? $request['STATUS'] : null;
  60. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  61. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  62. $memberSeq = isset($request['MEMBER_SEQ']) ? $request['MEMBER_SEQ'] : null;
  63. $count = isset($request['LIMIT']) ? (int)$request['LIMIT'] : null;
  64. // 쿼리 빌더 (VENDOR_LIST, BRAND_LIST 조인 추가)
  65. $builder = $db->table('ITEM_LIST I')
  66. ->select('I.*, COALESCE(V.COMPANY_NAME, B.COMPANY_NAME) as COMPANY_NAME')
  67. ->join('VENDOR_LIST V', 'I.COMPANY_NUMBER = V.COMPANY_NUMBER', 'left')
  68. ->join('BRAND_LIST B', 'I.COMPANY_NUMBER = B.COMPANY_NUMBER', 'left')
  69. ->where('I.DEL_YN', 'N');
  70. // 노출중, 비노출 여부 확인
  71. $builder->where('I.SHOW_YN', $showYn);
  72. $builder->where('I.TYPE', $itemType);
  73. // 사용자 타입별 필터링
  74. if ($memberType === 'INFLUENCER' && !empty($memberSeq)) {
  75. // 인플루언서의 경우: 공동구매 담당 제품만
  76. $builder->where('I.CONTACT_INF', $memberSeq);
  77. } else {
  78. if($memberType === 'VENDOR'){
  79. // 벤더사의 경우: 자사 제품만 조회
  80. $builder->where('I.COMPANY_NUMBER', $companyNumber);
  81. } else {
  82. $builder->groupStart()
  83. ->where('I.COMPANY_NUMBER', $companyNumber)
  84. ->orWhere('I.CONTACT_BRD', $memberSeq)
  85. ->groupEnd();
  86. }
  87. }
  88. if($status !== null) {
  89. $builder->where('I.STATUS', $status);
  90. }
  91. // 업데이트 날짜 기준으로 정렬
  92. $builder->orderBy('I.REGDATE', 'DESC');
  93. // 총 개수 먼저 구하기 (LIMIT 적용 전)
  94. $totalCount = $builder->countAllResults(false);
  95. // 대시보드 - 진행중인 공동구매의 경우 limit 설정
  96. if ($count !== null && $count > 0) {
  97. $builder->limit($count);
  98. }
  99. $lists = $builder->get()->getResultArray();
  100. return $this->respond([
  101. 'data' => $lists,
  102. 'total' => $totalCount
  103. ], 200);
  104. }
  105. // 인플루언서별 판매된 주문 건수 통계
  106. public function influencerStats()
  107. {
  108. // 한국 시간으로 설정
  109. date_default_timezone_set('Asia/Seoul');
  110. $db = \Config\Database::connect();
  111. $request = $this->request->getJSON(true);
  112. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  113. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  114. $memberSeq = isset($request['MEMBER_SEQ']) ? $request['MEMBER_SEQ'] : null;
  115. $limit = isset($request['LIMIT']) ? $request['LIMIT'] : 10;
  116. try {
  117. $builder = $db->table('ITEM_ORDER_LIST D')
  118. ->select('I.CONTACT_INF as INF_SEQ, INF.NICK_NAME as INF_NAME, COUNT(D.SEQ) as ORDER_COUNT')
  119. ->join('ITEM_LIST I', 'D.ITEM_SEQ = I.SEQ', 'inner')
  120. ->join('USER_LIST INF', 'I.CONTACT_INF = INF.SEQ', 'left')
  121. ->where('I.DEL_YN', 'N')
  122. ->where('I.CONTACT_INF >', 0) // 인플루언서가 배정된 항목만
  123. ->groupBy('I.CONTACT_INF, INF.NICK_NAME')
  124. ->orderBy('ORDER_COUNT', 'DESC');
  125. // 사용자 타입별 필터링
  126. if ($memberType === 'VENDOR' && !empty($companyNumber)) {
  127. $builder->where('I.COMPANY_NUMBER', $companyNumber);
  128. } elseif ($memberType === 'BRAND' && !empty($memberSeq)) {
  129. $builder->where('I.CONTACT_BRD', $memberSeq);
  130. }
  131. // 총 개수 먼저 구하기 (LIMIT 적용 전)
  132. $totalCount = $builder->countAllResults(false);
  133. // LIMIT이 있으면 적용
  134. if ($limit) {
  135. $builder->limit($limit);
  136. }
  137. $stats = $builder->get()->getResultArray();
  138. return $this->respond([
  139. 'data' => $stats,
  140. 'total' => $totalCount
  141. ], 200);
  142. } catch (\Exception $e) {
  143. return $this->respond([
  144. 'status' => 'fail',
  145. 'message' => 'DB 오류: ' . $e->getMessage()
  146. ], 500);
  147. }
  148. }
  149. // 대시보드 전체 통계 요약
  150. public function summary()
  151. {
  152. // 한국 시간으로 설정
  153. date_default_timezone_set('Asia/Seoul');
  154. $db = \Config\Database::connect();
  155. $request = $this->request->getJSON(true);
  156. $companyNumber = isset($request['COMPANY_NUMBER']) ? $request['COMPANY_NUMBER'] : null;
  157. $memberType = isset($request['MEMBER_TYPE']) ? $request['MEMBER_TYPE'] : null;
  158. $memberSeq = isset($request['MEMBER_SEQ']) ? $request['MEMBER_SEQ'] : null;
  159. try {
  160. $today = date('Y-m-d');
  161. $weekAgo = date('Y-m-d', strtotime('-7 days'));
  162. // 기본 조건 설정
  163. $whereConditions = ['I.DEL_YN' => 'N'];
  164. if ($memberType === 'VENDOR' && !empty($companyNumber)) {
  165. $whereConditions['I.COMPANY_NUMBER'] = $companyNumber;
  166. } elseif ($memberType === 'BRAND' && !empty($memberSeq)) {
  167. $whereConditions['I.CONTACT_BRD'] = $memberSeq;
  168. } elseif ($memberType === 'INFLUENCER' && !empty($memberSeq)) {
  169. $whereConditions['I.CONTACT_INF'] = $memberSeq;
  170. }
  171. // 최근 7일 주문 수
  172. $recentOrdersCount = $db->table('ITEM_ORDER_LIST D')
  173. ->join('ITEM_LIST I', 'D.ITEM_SEQ = I.SEQ', 'inner')
  174. ->where('I.DEL_YN', 'N')
  175. ->where('D.REGDATE >=', $weekAgo . ' 00:00:00')
  176. ->where($whereConditions)
  177. ->countAllResults();
  178. // 진행중인 공동구매 수
  179. $activeItemsCount = $db->table('ITEM_LIST I')
  180. ->where('I.STATUS', 0)
  181. ->where('I.SHOW_YN', 'Y')
  182. ->where('I.TYPE', 'GROUP_BUY')
  183. ->where('I.ORDER_END_DATE >=', $today)
  184. ->where($whereConditions)
  185. ->countAllResults();
  186. // 총 주문 건수
  187. $totalSalesCount = $db->table('ITEM_ORDER_LIST D')
  188. ->join('ITEM_LIST I', 'D.ITEM_SEQ = I.SEQ', 'inner')
  189. ->where('I.DEL_YN', 'N')
  190. ->where($whereConditions)
  191. ->countAllResults();
  192. // 활성 인플루언서 수 (주문이 있는 인플루언서)
  193. $activeInfluencersCount = $db->table('ITEM_ORDER_LIST D')
  194. ->select('I.CONTACT_INF')
  195. ->join('ITEM_LIST I', 'D.ITEM_SEQ = I.SEQ', 'inner')
  196. ->where('I.DEL_YN', 'N')
  197. ->where('I.CONTACT_INF >', 0)
  198. ->where($whereConditions)
  199. ->distinct()
  200. ->countAllResults();
  201. $summary = [
  202. 'recent_orders_count' => $recentOrdersCount,
  203. 'active_items_count' => $activeItemsCount,
  204. 'total_sales_count' => $totalSalesCount,
  205. 'active_influencers_count' => $activeInfluencersCount
  206. ];
  207. return $this->respond($summary, 200);
  208. } catch (\Exception $e) {
  209. return $this->respond([
  210. 'status' => 'fail',
  211. 'message' => 'DB 오류: ' . $e->getMessage()
  212. ], 500);
  213. }
  214. }
  215. }