Cs.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. <?php
  2. namespace App\Controllers;
  3. use CodeIgniter\RESTful\ResourceController;
  4. class Cs extends ResourceController
  5. {
  6. //문의 리스트
  7. public function csList()
  8. {
  9. $db = \Config\Database::connect();
  10. // POST JSON 파라미터 받기
  11. $request = $this->request->getJSON(true);
  12. $userSeq = isset($request['USER_SEQ']) ? $request['USER_SEQ'] : null;
  13. $builder = $db->table('CS_BOARD C')
  14. ->select('C.*, U.NICK_NAME, U.NAME, V.COMPANY_NAME, V.NAME')
  15. ->join('USER_LIST U', 'C.USER_SEQ = U.SEQ', 'left')
  16. ->join('VENDOR_LIST V', 'C.USER_SEQ = V.SEQ', 'left');
  17. //userSeq가 0이 아니면 본인이 쓴 글만 조회
  18. if( $userSeq !== 0 ){
  19. $builder->where('C.USER_SEQ', $userSeq);
  20. }
  21. $builder->orderBy('C.SEQ', 'DESC');
  22. $lists = $builder->get()->getResultArray();
  23. return $this->respond($lists, 200);
  24. }
  25. //문의 등록
  26. public function csRegister()
  27. {
  28. $db = \Config\Database::connect();
  29. $request = \Config\Services::request();
  30. date_default_timezone_set('Asia/Seoul');
  31. $regdate = date('Y-m-d H:i:s');
  32. // 기본 유효성 검사
  33. if (
  34. !$request->getPost('USER_SEQ') ||
  35. !$request->getPost('CATEGORY') ||
  36. !$request->getPost('TITLE') ||
  37. !$request->getPost('CONTENT')
  38. ) {
  39. return $this->respond([
  40. 'status' => 'fail',
  41. 'message' => '필수 값이 누락됐습니다.'
  42. ], 400);
  43. }
  44. $db->transBegin(); // 트랜잭션 시작
  45. try {
  46. // 첨부파일 처리
  47. $fileName = null;
  48. $fileNameOrigin = null;
  49. $files = $request->getFiles();
  50. if (isset($files['files']) && !empty($files['files'])) {
  51. $file = $files['files'][0]; // 첫 번째 파일만 처리
  52. if ($file && $file->isValid() && !$file->hasMoved()) {
  53. $fileNameOrigin = $file->getClientName(); // 원본 파일명
  54. $fileName = $file->getRandomName(); // 랜덤파일명 생성
  55. $file->move(WRITEPATH . 'uploads/cs/', $fileName); // 저장
  56. }
  57. }
  58. // CS_BOARD에 문의 정보 등록
  59. $csData = [
  60. 'USER_SEQ' => $request->getPost('USER_SEQ'),
  61. 'CATEGORY' => $request->getPost('CATEGORY'),
  62. 'TITLE' => $request->getPost('TITLE'),
  63. 'CONTENT' => $request->getPost('CONTENT'),
  64. 'STATUS' => '0', // 0: 대기중, 1: 답변완료
  65. 'REGDATE' => $regdate
  66. ];
  67. // 파일이 있으면 파일 정보도 추가
  68. if ($fileName) {
  69. $csData['FILE_NAME'] = $fileName;
  70. $csData['FILE_NAME_ORIGIN'] = $fileNameOrigin;
  71. }
  72. $insertResult = $db->table('CS_BOARD')->insert($csData);
  73. if (!$insertResult) {
  74. $error = $db->error();
  75. return $this->respond([
  76. 'status' => 'fail',
  77. 'message' => 'Insert 실패: ' . $error['message']
  78. ], 500);
  79. }
  80. $csSeq = $db->insertID(); // 생성된 문의 SEQ값
  81. $db->transCommit();
  82. return $this->respond([
  83. 'status' => 'success',
  84. 'success' => true,
  85. 'cs_seq' => $csSeq
  86. ], 201);
  87. } catch (\Exception $e) {
  88. $db->transRollback();
  89. return $this->respond([
  90. 'status' => 'fail',
  91. 'message' => 'DB 오류: ' . $e->getMessage()
  92. ], 500);
  93. }
  94. }
  95. //문의 상세
  96. public function csDetail($seq)
  97. {
  98. // DB 객체 얻기
  99. $db = \Config\Database::connect();
  100. $builder = $db->table('CS_BOARD C')
  101. ->select('C.*, U.NICK_NAME, U.NAME, V.COMPANY_NAME, V.NAME')
  102. ->join('USER_LIST U', 'C.USER_SEQ = U.SEQ', 'left')
  103. ->join('VENDOR_LIST V', 'C.USER_SEQ = V.SEQ', 'left');
  104. $item = $builder->where('C.seq', $seq)->get()->getRowArray();
  105. if($item){
  106. return $this->respond($item, 200);
  107. } else {
  108. return $this->respond([
  109. 'status' => 'fail',
  110. 'message' => '유효하지 않은 seq입니다.'
  111. ], 404);
  112. }
  113. }
  114. //답변 등록
  115. public function csAnswer()
  116. {
  117. $db = \Config\Database::connect();
  118. $request = $this->request->getJSON(true);
  119. date_default_timezone_set('Asia/Seoul');
  120. $answerDate = date('Y-m-d H:i:s');
  121. // 기본 유효성 검사
  122. if (
  123. !isset($request['CS_SEQ']) ||
  124. !isset($request['ANSWER']) ||
  125. !isset($request['ADMIN_SEQ'])
  126. ) {
  127. return $this->respond([
  128. 'status' => 'fail',
  129. 'message' => '필수 값이 누락됐습니다.'
  130. ], 400);
  131. }
  132. $db->transBegin(); // 트랜잭션 시작
  133. try {
  134. // CS_BOARD 업데이트
  135. $updateData = [
  136. 'ADMIN_ANSWER' => $request['ANSWER'],
  137. 'ANSWER_REGDATE' => $answerDate,
  138. 'ADMIN_SEQ' => $request['ADMIN_SEQ'],
  139. 'STATUS' => '1' // 답변완료 상태로 변경
  140. ];
  141. $updateResult = $db->table('CS_BOARD')
  142. ->where('SEQ', $request['CS_SEQ'])
  143. ->update($updateData);
  144. if (!$updateResult) {
  145. throw new \Exception('답변 등록에 실패했습니다.');
  146. }
  147. $db->transCommit();
  148. return $this->respond([
  149. 'status' => 'success',
  150. 'message' => '답변이 등록되었습니다.'
  151. ], 200);
  152. } catch (\Exception $e) {
  153. $db->transRollback();
  154. return $this->respond([
  155. 'status' => 'fail',
  156. 'message' => 'DB 오류: ' . $e->getMessage()
  157. ], 500);
  158. }
  159. }
  160. //상세 다운로드
  161. public function file($fileName)
  162. {
  163. helper('filesystem');
  164. $db = \Config\Database::connect();
  165. $path = WRITEPATH . 'uploads/cs/' . $fileName;
  166. if (!file_exists($path)) {
  167. return $this->failNotFound('파일을 찾을 수 없습니다.');
  168. }
  169. // DB에서 원본 파일명 조회
  170. $fileInfo = $db->table('CS_BOARD')
  171. ->select('FILE_NAME_ORIGIN')
  172. ->where('FILE_NAME', $fileName)
  173. ->get()
  174. ->getRowArray();
  175. $originalFileName = $fileInfo && $fileInfo['FILE_NAME_ORIGIN']
  176. ? $fileInfo['FILE_NAME_ORIGIN']
  177. : $fileName;
  178. return $this->response
  179. ->download($path, null)
  180. ->setFileName($originalFileName);
  181. }
  182. //문의 검색
  183. public function csSearch()
  184. {
  185. $db = \Config\Database::connect();
  186. // 요청 바디에서 filter와 keyword 추출
  187. $request = $this->request->getJSON(true);
  188. $userSeq = isset($request['USER_SEQ']) ? $request['USER_SEQ'] : null;
  189. $filter = isset($request['filter']) ? $request['filter'] : null;
  190. $keyword = isset($request['keyword']) ? $request['keyword'] : null;
  191. $startDate = isset($request['startDate']) ? $request['startDate'] : null;
  192. $endDate = isset($request['endDate']) ? $request['endDate'] : null;
  193. $filterMap = [
  194. 'title' => 'C.TITLE',
  195. 'content' => 'C.CONTENT',
  196. 'writer' => 'WRITER',
  197. ];
  198. // CS_BOARD 테이블 검색
  199. $builder = $db->table('CS_BOARD C')
  200. ->select('C.*, U.NICK_NAME, U.NAME, V.COMPANY_NAME, V.NAME')
  201. ->join('USER_LIST U', 'C.USER_SEQ = U.SEQ', 'left')
  202. ->join('VENDOR_LIST V', 'C.USER_SEQ = V.SEQ', 'left');
  203. // userSeq가 0이 아니면 본인이 쓴 글만 조회
  204. if ($userSeq !== 0) {
  205. $builder->where('C.USER_SEQ', $userSeq);
  206. }
  207. // 키워드 검색
  208. if (!empty($keyword)) {
  209. if (empty($filter) || $filter === '') {
  210. // 필터를 선택 안했으면 전체 검색 (제목 + 내용 + 작성자)
  211. $builder->groupStart()
  212. ->like('C.TITLE', $keyword)
  213. ->orLike('C.CONTENT', $keyword)
  214. ->orLike('U.NICK_NAME', $keyword)
  215. ->orLike('U.NAME', $keyword)
  216. ->orLike('V.COMPANY_NAME', $keyword)
  217. ->orLike('V.NAME', $keyword)
  218. ->groupEnd();
  219. } elseif (isset($filterMap[$filter])) {
  220. if ($filter === 'title') {
  221. // 제목 검색
  222. $builder->like($filterMap[$filter], $keyword);
  223. } elseif ($filter === 'content') {
  224. // 내용 검색
  225. $builder->like($filterMap[$filter], $keyword);
  226. } elseif ($filter === 'writer') {
  227. // 작성자 검색
  228. $builder->groupStart()
  229. ->like('U.NICK_NAME', $keyword)
  230. ->orLike('U.NAME', $keyword)
  231. ->orLike('V.COMPANY_NAME', $keyword)
  232. ->orLike('V.NAME', $keyword)
  233. ->groupEnd();
  234. }
  235. }
  236. }
  237. // 날짜 범위 검색
  238. if (!empty($startDate)) {
  239. $builder->where('DATE(C.REGDATE) >=', $startDate);
  240. }
  241. if (!empty($endDate)) {
  242. $builder->where('DATE(C.REGDATE) <=', $endDate);
  243. }
  244. // 정렬: 최신순
  245. $builder->orderBy('C.SEQ', 'DESC');
  246. // 조회
  247. $lists = $builder->get()->getResultArray();
  248. return $this->respond($lists, 200);
  249. }
  250. }