Cs.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  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. $regdate = date('Y-m-d H:i:s');
  31. // 기본 유효성 검사
  32. if (
  33. !$request->getPost('USER_SEQ') ||
  34. !$request->getPost('CATEGORY') ||
  35. !$request->getPost('TITLE') ||
  36. !$request->getPost('CONTENT')
  37. ) {
  38. return $this->respond([
  39. 'status' => 'fail',
  40. 'message' => '필수 값이 누락됐습니다.'
  41. ], 400);
  42. }
  43. $db->transBegin(); // 트랜잭션 시작
  44. try {
  45. // 첨부파일 처리
  46. $fileName = null;
  47. $fileNameOrigin = null;
  48. $files = $request->getFiles();
  49. if (isset($files['files']) && !empty($files['files'])) {
  50. $file = $files['files'][0]; // 첫 번째 파일만 처리
  51. if ($file && $file->isValid() && !$file->hasMoved()) {
  52. $fileNameOrigin = $file->getClientName(); // 원본 파일명
  53. $fileName = $file->getRandomName(); // 랜덤파일명 생성
  54. $file->move(WRITEPATH . 'uploads/cs/', $fileName); // 저장
  55. }
  56. }
  57. // CS_BOARD에 문의 정보 등록
  58. $csData = [
  59. 'USER_SEQ' => $request->getPost('USER_SEQ'),
  60. 'CATEGORY' => $request->getPost('CATEGORY'),
  61. 'TITLE' => $request->getPost('TITLE'),
  62. 'CONTENT' => $request->getPost('CONTENT'),
  63. 'STATUS' => '0', // 0: 대기중, 1: 답변완료
  64. 'REGDATE' => $regdate
  65. ];
  66. // 파일이 있으면 파일 정보도 추가
  67. if ($fileName) {
  68. $csData['FILE_NAME'] = $fileName;
  69. $csData['FILE_NAME_ORIGIN'] = $fileNameOrigin;
  70. }
  71. $insertResult = $db->table('CS_BOARD')->insert($csData);
  72. if (!$insertResult) {
  73. $error = $db->error();
  74. return $this->respond([
  75. 'status' => 'fail',
  76. 'message' => 'Insert 실패: ' . $error['message']
  77. ], 500);
  78. }
  79. $csSeq = $db->insertID(); // 생성된 문의 SEQ값
  80. $db->transCommit();
  81. return $this->respond([
  82. 'status' => 'success',
  83. 'success' => true,
  84. 'cs_seq' => $csSeq
  85. ], 201);
  86. } catch (\Exception $e) {
  87. $db->transRollback();
  88. return $this->respond([
  89. 'status' => 'fail',
  90. 'message' => 'DB 오류: ' . $e->getMessage()
  91. ], 500);
  92. }
  93. }
  94. //문의 상세
  95. public function csDetail($seq)
  96. {
  97. // DB 객체 얻기
  98. $db = \Config\Database::connect();
  99. $builder = $db->table('CS_BOARD C')
  100. ->select('C.*, U.NICK_NAME, U.NAME, V.COMPANY_NAME, V.NAME')
  101. ->join('USER_LIST U', 'C.USER_SEQ = U.SEQ', 'left')
  102. ->join('VENDOR_LIST V', 'C.USER_SEQ = V.SEQ', 'left');
  103. $item = $builder->where('C.seq', $seq)->get()->getRowArray();
  104. if($item){
  105. return $this->respond($item, 200);
  106. } else {
  107. return $this->respond([
  108. 'status' => 'fail',
  109. 'message' => '유효하지 않은 seq입니다.'
  110. ], 404);
  111. }
  112. }
  113. //답변 등록
  114. public function csAnswer()
  115. {
  116. $db = \Config\Database::connect();
  117. $request = $this->request->getJSON(true);
  118. $answerDate = date('Y-m-d H:i:s');
  119. // 기본 유효성 검사
  120. if (
  121. !isset($request['CS_SEQ']) ||
  122. !isset($request['ANSWER']) ||
  123. !isset($request['ADMIN_SEQ'])
  124. ) {
  125. return $this->respond([
  126. 'status' => 'fail',
  127. 'message' => '필수 값이 누락됐습니다.'
  128. ], 400);
  129. }
  130. $db->transBegin(); // 트랜잭션 시작
  131. try {
  132. // CS_BOARD 업데이트
  133. $updateData = [
  134. 'ADMIN_ANSWER' => $request['ANSWER'],
  135. 'ANSWER_REGDATE' => $answerDate,
  136. 'ADMIN_SEQ' => $request['ADMIN_SEQ'],
  137. 'STATUS' => '1' // 답변완료 상태로 변경
  138. ];
  139. $updateResult = $db->table('CS_BOARD')
  140. ->where('SEQ', $request['CS_SEQ'])
  141. ->update($updateData);
  142. if (!$updateResult) {
  143. throw new \Exception('답변 등록에 실패했습니다.');
  144. }
  145. $db->transCommit();
  146. return $this->respond([
  147. 'status' => 'success',
  148. 'message' => '답변이 등록되었습니다.'
  149. ], 200);
  150. } catch (\Exception $e) {
  151. $db->transRollback();
  152. return $this->respond([
  153. 'status' => 'fail',
  154. 'message' => 'DB 오류: ' . $e->getMessage()
  155. ], 500);
  156. }
  157. }
  158. //상세 다운로드
  159. public function file($fileName)
  160. {
  161. helper('filesystem');
  162. $db = \Config\Database::connect();
  163. $path = WRITEPATH . 'uploads/cs/' . $fileName;
  164. if (!file_exists($path)) {
  165. return $this->failNotFound('파일을 찾을 수 없습니다.');
  166. }
  167. // DB에서 원본 파일명 조회
  168. $fileInfo = $db->table('CS_BOARD')
  169. ->select('FILE_NAME_ORIGIN')
  170. ->where('FILE_NAME', $fileName)
  171. ->get()
  172. ->getRowArray();
  173. $originalFileName = $fileInfo && $fileInfo['FILE_NAME_ORIGIN']
  174. ? $fileInfo['FILE_NAME_ORIGIN']
  175. : $fileName;
  176. return $this->response
  177. ->download($path, null)
  178. ->setFileName($originalFileName);
  179. }
  180. }