|
|
|
@ -1,30 +1,23 @@
|
|
|
|
|
package com.palnet.biz.api.cns.qna.service; |
|
|
|
|
|
|
|
|
|
import java.time.Instant; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
|
|
import javax.transaction.Transactional; |
|
|
|
|
|
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
import org.springframework.web.multipart.MultipartFile; |
|
|
|
|
|
|
|
|
|
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; |
|
|
|
|
import com.palnet.biz.api.cns.qna.model.QnaBasModel; |
|
|
|
|
import com.palnet.biz.api.cns.qna.model.QnaDetailRSModel; |
|
|
|
|
import com.palnet.biz.api.cns.qna.model.QnaInsertRQModel; |
|
|
|
|
import com.palnet.biz.api.cns.qna.model.QnaSelectListRQ; |
|
|
|
|
import com.palnet.biz.api.cns.qna.model.*; |
|
|
|
|
import com.palnet.biz.api.comn.file.model.ComnFileModel; |
|
|
|
|
import com.palnet.biz.api.comn.file.service.ComnFileService; |
|
|
|
|
import com.palnet.biz.jpa.entity.CnsQnaBas; |
|
|
|
|
import com.palnet.biz.jpa.entity.ComFileBas; |
|
|
|
|
import com.palnet.biz.jpa.repository.cns.CnsQnaBasRepository; |
|
|
|
|
import com.palnet.biz.jpa.repository.cns.CnsQnaQueryRepository; |
|
|
|
|
import com.palnet.biz.jpa.repository.com.ComFileBasRepository; |
|
|
|
|
import com.palnet.comn.code.ErrorCode; |
|
|
|
|
import com.palnet.comn.exception.CustomException; |
|
|
|
|
|
|
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
import org.springframework.web.multipart.MultipartFile; |
|
|
|
|
|
|
|
|
|
import javax.transaction.Transactional; |
|
|
|
|
import java.time.Instant; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
|
|
@Service |
|
|
|
|
@Slf4j |
|
|
|
@ -35,81 +28,63 @@ public class CnsQnaService {
|
|
|
|
|
|
|
|
|
|
private final CnsQnaQueryRepository cnsQnaQueryRepository; |
|
|
|
|
|
|
|
|
|
private final ComFileBasRepository comFileBasRepository; |
|
|
|
|
|
|
|
|
|
private final ComnFileService comnFileService; |
|
|
|
|
|
|
|
|
|
private final JwtTokenUtil jwtTokenUtil; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public boolean deleteQnaFile(int fileSno){ |
|
|
|
|
|
|
|
|
|
comnFileService.deleteFile(fileSno); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Qna 삭제하기, file들도 모두 논리삭제함. |
|
|
|
|
* |
|
|
|
|
* @param qnaSno |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
@Transactional |
|
|
|
|
public boolean deleteQna(int qnaSno){ |
|
|
|
|
public boolean deleteQna(int qnaSno) { |
|
|
|
|
|
|
|
|
|
CnsQnaBas entity = cnsQnaBasRepository.findByQnaSnoAndDelYnAndExpsrYn(qnaSno, "N", "Y"); |
|
|
|
|
if(entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND); |
|
|
|
|
if (entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND); |
|
|
|
|
|
|
|
|
|
if(entity.getFileGroupNo() != null) comnFileService.deleteFiles(entity.getFileGroupNo()); |
|
|
|
|
if (entity.getFileGroupNo() != null) comnFileService.deleteFilesByFileGroupNo(entity.getFileGroupNo()); |
|
|
|
|
|
|
|
|
|
entity.setDelYn("Y"); |
|
|
|
|
|
|
|
|
|
List<CnsQnaBas> deleteList = new ArrayList<>(); |
|
|
|
|
deleteList.add(entity); |
|
|
|
|
|
|
|
|
|
int targetSno = qnaSno; |
|
|
|
|
|
|
|
|
|
// 대댓글 불러오기
|
|
|
|
|
while(true){ |
|
|
|
|
|
|
|
|
|
CnsQnaBas cnsQnaBas = cnsQnaBasRepository.findFirstByTargetSnoAndDelYnAndExpsrYn(targetSno, "N", "Y"); |
|
|
|
|
if(cnsQnaBas == null) break; |
|
|
|
|
|
|
|
|
|
cnsQnaBas.setDelYn("Y"); |
|
|
|
|
|
|
|
|
|
deleteList.add(cnsQnaBas); |
|
|
|
|
|
|
|
|
|
targetSno = cnsQnaBas.getQnaSno(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
deleteList = cnsQnaBasRepository.saveAll(deleteList); |
|
|
|
|
cnsQnaBasRepository.save(entity); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Qna 업데이트하기 TODO :: File 업데이트 기능 아직 구현안함 |
|
|
|
|
* |
|
|
|
|
* @param rq |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
@Transactional |
|
|
|
|
public boolean updateQna(QnaInsertRQModel rq){ |
|
|
|
|
public boolean updateQna(QnaInsertRQModel rq) { |
|
|
|
|
|
|
|
|
|
CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(rq.getQnaSno(), 0, "N", "Y"); |
|
|
|
|
if(entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND); |
|
|
|
|
if (entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND); |
|
|
|
|
|
|
|
|
|
// 파일 삭제(논리적 삭제)
|
|
|
|
|
List<ComnFileModel> prevFileInfos = comnFileService.getNormalFileListByGroupNo(entity.getFileGroupNo()); |
|
|
|
|
List<Integer> prevFileSnoList = prevFileInfos.stream().map(ComnFileModel::getFileSno).collect(Collectors.toList()); |
|
|
|
|
List<Integer> currentFileSnoList = rq.getFileInfos().stream().map(ComnFileModel::getFileSno).collect(Collectors.toList()); |
|
|
|
|
boolean isChange = prevFileSnoList.removeAll(currentFileSnoList); |
|
|
|
|
if (isChange) comnFileService.deleteFilesByFileGroupNo(entity.getFileGroupNo()); // File 삭제
|
|
|
|
|
|
|
|
|
|
List<MultipartFile> files = rq.getFiles(); |
|
|
|
|
if(files != null && files.size() > 0) comnFileService.fileUpload(files, entity.getFileGroupNo()); // File 업로드
|
|
|
|
|
if (files != null && !files.isEmpty()) comnFileService.fileUpload(files, entity.getFileGroupNo()); // File 업로드
|
|
|
|
|
|
|
|
|
|
// if(rq.getCategory() != null) entity.setCategory(rq.getCategory());
|
|
|
|
|
// if(rq.getContent() != null) entity.setContent(rq.getContent());
|
|
|
|
|
// if(rq.getTitle() != null) entity.setTitle(rq.getTitle());
|
|
|
|
|
|
|
|
|
|
if(rq.getCategory() != null) entity.setCategory(rq.getCategory()); |
|
|
|
|
if(rq.getContent() != null) entity.setContent(rq.getContent()); |
|
|
|
|
if(rq.getTitle() != null) entity.setTitle(rq.getTitle()); |
|
|
|
|
CnsQnaMapper.MAPPER.merge(entity, rq); |
|
|
|
|
|
|
|
|
|
String userId = jwtTokenUtil.getUserIdByToken(); |
|
|
|
|
|
|
|
|
|
if (userId == null) userId = "NONE"; |
|
|
|
|
|
|
|
|
|
entity.setUpdateDt(Instant.now()); |
|
|
|
|
entity.setUpdateUserId(userId); |
|
|
|
|
|
|
|
|
|
cnsQnaBasRepository.save(entity); |
|
|
|
@ -119,99 +94,68 @@ public class CnsQnaService {
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Qna 상세불러오기 |
|
|
|
|
* |
|
|
|
|
* @param qnaSno |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
@Transactional // 조회수 증가하기떄문
|
|
|
|
|
public List<QnaDetailRSModel> getQnaDetail(int qnaSno){ |
|
|
|
|
public QnaDetailRSModel getQnaDetail(int qnaSno) { |
|
|
|
|
|
|
|
|
|
cnsQnaBasRepository.pulsViewCount(qnaSno); |
|
|
|
|
|
|
|
|
|
CnsQnaBas qnaBasModel = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(qnaSno, 0, "N", "Y"); |
|
|
|
|
List<ComFileBas> files = null; |
|
|
|
|
if(qnaBasModel.getFileGroupNo() != 0) files = comFileBasRepository.findByFileGroupNoAndDelYn(qnaBasModel.getFileGroupNo(), "N"); |
|
|
|
|
|
|
|
|
|
QnaDetailRSModel node = new QnaDetailRSModel(); |
|
|
|
|
node.setQnaSno(qnaSno); |
|
|
|
|
node.setTargetSno(qnaBasModel.getTargetSno()); |
|
|
|
|
node.setCategory(qnaBasModel.getCategory()); |
|
|
|
|
node.setTitle(qnaBasModel.getTitle()); |
|
|
|
|
node.setContent(qnaBasModel.getContent()); |
|
|
|
|
node.setViewCnt(qnaBasModel.getViewCnt()); |
|
|
|
|
node.setCreateUserId(qnaBasModel.getCreateUserId()); |
|
|
|
|
node.setCreateDt(qnaBasModel.getCreateDt()); |
|
|
|
|
node.setUpdateUserId(qnaBasModel.getUpdateUserId()); |
|
|
|
|
node.setUpdateDt(qnaBasModel.getUpdateDt()); |
|
|
|
|
node.setFiles(files); |
|
|
|
|
|
|
|
|
|
List<QnaDetailRSModel> result = new ArrayList<>(); |
|
|
|
|
result.add(node); |
|
|
|
|
|
|
|
|
|
int targetSno = qnaSno; |
|
|
|
|
|
|
|
|
|
// 대댓글 불러오기
|
|
|
|
|
while(true){ |
|
|
|
|
|
|
|
|
|
CnsQnaBas cnsQnaBas = cnsQnaBasRepository.findFirstByTargetSnoAndDelYnAndExpsrYn(targetSno, "N", "Y"); |
|
|
|
|
if(cnsQnaBas == null) break; |
|
|
|
|
|
|
|
|
|
QnaDetailRSModel detailNode = new QnaDetailRSModel(); |
|
|
|
|
detailNode.setQnaSno(cnsQnaBas.getQnaSno()); |
|
|
|
|
detailNode.setTargetSno(cnsQnaBas.getTargetSno()); |
|
|
|
|
detailNode.setCategory(cnsQnaBas.getCategory()); |
|
|
|
|
detailNode.setTitle(cnsQnaBas.getTitle()); |
|
|
|
|
detailNode.setContent(cnsQnaBas.getContent()); |
|
|
|
|
detailNode.setCreateUserId(cnsQnaBas.getCreateUserId()); |
|
|
|
|
detailNode.setCreateDt(cnsQnaBas.getCreateDt()); |
|
|
|
|
detailNode.setUpdateUserId(cnsQnaBas.getUpdateUserId()); |
|
|
|
|
detailNode.setUpdateDt(cnsQnaBas.getUpdateDt()); |
|
|
|
|
|
|
|
|
|
result.add(detailNode); |
|
|
|
|
|
|
|
|
|
targetSno = cnsQnaBas.getQnaSno(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
|
List<ComnFileModel> files = null; |
|
|
|
|
if (qnaBasModel.getFileGroupNo() != null && qnaBasModel.getFileGroupNo() != 0) |
|
|
|
|
files = comnFileService.getNormalFileListByGroupNo(qnaBasModel.getFileGroupNo()); |
|
|
|
|
|
|
|
|
|
QnaDetailRSModel model = CnsQnaMapper.MAPPER.toModel(qnaBasModel); |
|
|
|
|
model.setFiles(files); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return model; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Qna리스트 조회 |
|
|
|
|
* |
|
|
|
|
* @param rq |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
public List<QnaBasModel> selectQnaList(QnaSelectListRQ rq){ |
|
|
|
|
public List<QnaBasModel> selectQnaList(QnaSelectListRQ rq) { |
|
|
|
|
return cnsQnaQueryRepository.getQnaList(rq); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return cnsQnaQueryRepository.getQnaList(rq.getCategory(), rq.getCategory()); |
|
|
|
|
public List<QnaBasModel> selectQnaForUser(QnaSelectListRQ rq) { |
|
|
|
|
String userId = jwtTokenUtil.getUserIdByToken(); |
|
|
|
|
return cnsQnaQueryRepository.getQnaListForUser(rq, userId); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* QnaInsert |
|
|
|
|
* |
|
|
|
|
* @param rq |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
@Transactional |
|
|
|
|
public boolean insertQna(QnaInsertRQModel rq){ |
|
|
|
|
public boolean insertQna(QnaInsertRQModel rq) { |
|
|
|
|
|
|
|
|
|
List<MultipartFile> files = rq.getFiles(); |
|
|
|
|
Integer fileGroupNo = null; |
|
|
|
|
if(files != null && files.size() > 0) fileGroupNo = comnFileService.fileUpload(files, null); // File 업로드
|
|
|
|
|
if (files != null && files.size() > 0) fileGroupNo = comnFileService.fileUpload(files, null); // File 업로드
|
|
|
|
|
|
|
|
|
|
String userId = jwtTokenUtil.getUserIdByToken(); |
|
|
|
|
|
|
|
|
|
if (userId == null) userId = "NONE"; |
|
|
|
|
|
|
|
|
|
CnsQnaBas cnsQnaBas = new CnsQnaBas(); |
|
|
|
|
cnsQnaBas.setCategory(rq.getCategory()); |
|
|
|
|
cnsQnaBas.setTitle(rq.getTitle()); |
|
|
|
|
cnsQnaBas.setContent(rq.getContent()); |
|
|
|
|
cnsQnaBas.setCreateDt(Instant.now()); |
|
|
|
|
CnsQnaBas cnsQnaBas = CnsQnaMapper.MAPPER.toEntity(rq); |
|
|
|
|
cnsQnaBas.setCreateUserId(userId); |
|
|
|
|
cnsQnaBas.setUpdateDt(Instant.now()); |
|
|
|
|
cnsQnaBas.setUpdateUserId(userId); |
|
|
|
|
cnsQnaBas.setExpsrYn("Y"); |
|
|
|
|
cnsQnaBas.setDelYn("N"); |
|
|
|
|
cnsQnaBas.setViewCnt(0); |
|
|
|
|
cnsQnaBas.setAnserStatus("N"); |
|
|
|
|
|
|
|
|
|
if(fileGroupNo != null) cnsQnaBas.setFileGroupNo(fileGroupNo); |
|
|
|
|
if(rq.getTargetSno() != null) cnsQnaBas.setTargetSno(rq.getTargetSno()); |
|
|
|
|
if (fileGroupNo != null) cnsQnaBas.setFileGroupNo(fileGroupNo); |
|
|
|
|
|
|
|
|
|
cnsQnaBasRepository.save(cnsQnaBas); |
|
|
|
|
|
|
|
|
@ -219,4 +163,22 @@ public class CnsQnaService {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public boolean insertAnswer(QnaInsertAnserRQModel rq) { |
|
|
|
|
CnsQnaBas entity = cnsQnaBasRepository.findByQnaSnoAndDelYnAndExpsrYn(rq.getQnaSno(), "N", "Y"); |
|
|
|
|
if (entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND); |
|
|
|
|
|
|
|
|
|
String userId = jwtTokenUtil.getUserIdByToken(); |
|
|
|
|
String userNm = jwtTokenUtil.getUserNmByToken(); |
|
|
|
|
|
|
|
|
|
CnsQnaMapper.MAPPER.merge(entity, rq); |
|
|
|
|
entity.setCreateUserId(userId); |
|
|
|
|
entity.setAnserUserNm(userNm); |
|
|
|
|
entity.setAnserProcDt(Instant.now()); |
|
|
|
|
entity.setAnserStatus("Y".equals(rq.getAnserStatus()) ? "Y" : "N"); |
|
|
|
|
|
|
|
|
|
cnsQnaBasRepository.save(entity); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|