Browse Source

Merge commit '665ffc5989b582b8977fb32500df0daaebfee834' into feature/laanc/sun-vaildation

pull/10/head
lkd9125(이경도) 11 months ago
parent
commit
a65588baff
  1. 36
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java
  2. 1
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRsModel.java
  3. 2
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtUserModel.java
  4. 1
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java
  5. 35
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java
  6. 5
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java
  7. 5
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfModel.java
  8. 5
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasOwnerModel.java
  9. 5
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupModel.java
  10. 27
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancAprvController.java
  11. 12
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvListRq.java
  12. 2
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvRs.java
  13. 8
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancAprvService.java
  14. 81
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java
  15. 12
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaBasModel.java
  16. 3
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaDetailRSModel.java
  17. 17
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertAnserRQModel.java
  18. 3
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java
  19. 3
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java
  20. 34
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaMapper.java
  21. 184
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java
  22. 11
      pav-server/src/main/java/com/palnet/biz/api/comn/file/controller/ComnFileController.java
  23. 27
      pav-server/src/main/java/com/palnet/biz/api/comn/file/model/ComnFileModel.java
  24. 23
      pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileMapper.java
  25. 71
      pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java
  26. 1
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnModel.java
  27. 4
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlWarnLogModel.java
  28. 43
      pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java
  29. 1
      pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCrtfyhpBas.java
  30. 13
      pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java
  31. 68
      pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java
  32. 5
      pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java
  33. 126
      pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java
  34. 25
      pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java
  35. 1
      pav-server/src/main/java/com/palnet/comn/code/RSErrorCode.java

36
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java

@ -1,32 +1,8 @@
package com.palnet.biz.api.acnt.jwt.controller;
import java.util.HashMap;
import java.util.Map;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.acnt.jwt.model.JwtProfileRsModel;
import com.palnet.biz.api.acnt.jwt.model.JwtRqModel;
import com.palnet.biz.api.acnt.jwt.model.JwtRsModel;
import com.palnet.biz.api.acnt.jwt.model.JwtUserModel;
import com.palnet.biz.api.acnt.jwt.service.JwtService;
import com.palnet.biz.api.acnt.jwt.service.JwtUserDetailsService;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
@ -35,10 +11,18 @@ import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.jpa.entity.PtyCstmrBas;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.utils.EncryptUtils;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@RequiredArgsConstructor

1
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRsModel.java

@ -13,6 +13,7 @@ public class JwtRsModel implements Serializable {
private String refreshToken;
private String userId;
private String userNm;
private Integer cstmrSno;

2
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtUserModel.java

@ -36,6 +36,8 @@ public class JwtUserModel implements UserDetails {
@Column(name = "CSTMR_STATUS_CD")
private String cstmrStatusCd;
@Transient
private String userNm;
@Transient
private List<JwtGroupModel> group;

1
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java

@ -113,6 +113,7 @@ public class JwtService {
result.setRefreshToken(refreshToken);
result.setAuth(userDetails.getAuth());
result.setUserId(userDetails.getUserId());
result.setUserNm(userDetails.getUserNm());
result.setCstmrSno(userDetails.getCstmrSno());
ptyCstmrDtlRepository.findById(userDetails.getCstmrSno()).ifPresent(ptyCstmrDtl -> {

35
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java

@ -14,7 +14,6 @@ import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.time.Instant;
import java.util.*;
import java.util.function.Function;
@ -25,8 +24,8 @@ public class JwtTokenUtil implements Serializable {
private static final long serialVersionUID = -2550185165626007488L;
public static final long JWT_TOKEN_VALIDITY = 5 * 60 * 60; // 5시간
// public static final long JWT_TOKEN_VALIDITY = 10; // 10초
public static final long JWT_REFRESH_TOKEN_VALIDTY = 21* 24 * 60 * 60; //21일
// public static final long JWT_TOKEN_VALIDITY = 10; // 10초
public static final long JWT_REFRESH_TOKEN_VALIDTY = 21 * 24 * 60 * 60; //21일
@Value("${spring.jwt.secret}")
@ -50,6 +49,7 @@ public class JwtTokenUtil implements Serializable {
final Claims claims = getAllClaimsFromToken(token);
return claimsResolver.apply(claims);
}
//for retrieveing any information from token we will need the secret key
private Claims getAllClaimsFromToken(String token) {
return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
@ -71,6 +71,7 @@ public class JwtTokenUtil implements Serializable {
claims.put("cstmrSno", userDetails.getCstmrSno());
claims.put("auth", userDetails.getAuth());
claims.put("group", userDetails.getGroup());
claims.put("userNm", userDetails.getUserNm());
return doGenerateToken(claims, userDetails.getUsername());
}
@ -95,7 +96,7 @@ public class JwtTokenUtil implements Serializable {
.signWith(SignatureAlgorithm.HS512, secret).compact();
}
private String doGenerateRefreshToken(Map<String , Object> claims , String subject) {
private String doGenerateRefreshToken(Map<String, Object> claims, String subject) {
return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + JWT_REFRESH_TOKEN_VALIDTY * 1000))
.signWith(SignatureAlgorithm.HS512, secret).compact();
@ -111,22 +112,34 @@ public class JwtTokenUtil implements Serializable {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization");
if(token == null || "".equals(token)) return null;
if (token == null || "".equals(token)) return null;
token = token.substring(JWT_PREFIX.length()).trim();
String userId = getUsernameFromToken(token);
return userId;
}
public String getUserNmByToken() {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization");
if (token == null || "".equals(token)) return null;
token = token.substring(JWT_PREFIX.length()).trim();
Claims payload = getAllClaimsFromToken(token);
return payload.get("userNm", String.class);
}
public Integer getCstmrSnoByToken() {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization");
if(token == null || "".equals(token)) return null;
if (token == null || "".equals(token)) return null;
token = token.substring(JWT_PREFIX.length()).trim();
Claims payload = getAllClaimsFromToken(token);
Integer cstmrSno = payload.get("cstmrSno",Integer.class);
Integer cstmrSno = payload.get("cstmrSno", Integer.class);
return cstmrSno;
}
@ -135,15 +148,15 @@ public class JwtTokenUtil implements Serializable {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization");
if(token == null || "".equals(token)) return null;
if (token == null || "".equals(token)) return null;
token = token.substring(JWT_PREFIX.length()).trim();
Claims payload = getAllClaimsFromToken(token);
List<LinkedHashMap> groupList = payload.get("group", ArrayList.class);
List<JwtGroupModel> r = new ArrayList<>();
if(groupList!=null) {
for(LinkedHashMap<String, String> map : groupList){
if (groupList != null) {
for (LinkedHashMap<String, String> map : groupList) {
JwtGroupModel model = new JwtGroupModel();
model.setGroupId(map.get("groupId"));
model.setGroupAuthCd(map.get("groupAuthCd"));
@ -157,7 +170,7 @@ public class JwtTokenUtil implements Serializable {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization");
if(token == null || "".equals(token)) return null;
if (token == null || "".equals(token)) return null;
token = token.substring(JWT_PREFIX.length()).trim();
Claims payload = getAllClaimsFromToken(token);

5
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java

@ -1,12 +1,11 @@
package com.palnet.biz.api.bas.dron.model;
import java.time.Instant;
import java.util.Date;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.palnet.biz.config.convert.InstantDateStrSerializer;
import lombok.Data;
import java.time.Instant;
@Data
public class BasDronModel {

5
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfModel.java

@ -1,10 +1,9 @@
package com.palnet.biz.api.bas.dron.model;
import java.time.Instant;
import java.util.Date;
import lombok.Data;
import java.time.Instant;
@Data
public class BasIdntfModel {

5
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasOwnerModel.java

@ -1,10 +1,9 @@
package com.palnet.biz.api.bas.dron.model;
import java.time.Instant;
import java.util.Date;
import lombok.Data;
import java.time.Instant;
@Data
public class BasOwnerModel {

5
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupModel.java

@ -1,10 +1,9 @@
package com.palnet.biz.api.bas.group.model;
import java.time.Instant;
import java.util.Date;
import lombok.Data;
import java.time.Instant;
@Data
public class BasGroupModel {

27
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/controller/BasLaancAprvController.java

@ -21,6 +21,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@ -78,6 +79,32 @@ public class BasLaancAprvController {
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
@ApiOperation(value = "LAANC 승인 목록")
@Tag(name = "LAANC 승인", description = "LAANC 승인 관련 API")
@GetMapping("/list2")
public ResponseEntity<? extends BasicResponse> getLaancAprvList2(BasLaancAprvListRq rq) {
List<BasLaancAprvRs> rs = null;
try {
log.debug(">>> rq : {}", rq);
rs = basLaancAprvService.getLaancAprvList2(rq);
} catch (CustomException e) {
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
/**
* laanc 승인 상세
* @param planSno

12
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvListRq.java

@ -29,12 +29,12 @@ public class BasLaancAprvListRq {
@ApiParam(name = "작성자 이름", example = "팔")
private String memberName;
// @ApiParam(name = "등록시작일자", example = "2023-12-12")
// @JsonSerialize(using = InstantDateStrSerializer.class)
// private Instant createStDate;
// @ApiParam(name = "등록종료일자", example = "2023-12-12")
// @JsonSerialize(using = InstantDateStrSerializer.class)
// private Instant createEndDate;
@ApiParam(name = "신청(등록)시작일자", example = "2023-12-12")
@JsonSerialize(using = InstantDateStrSerializer.class)
private Instant createStDate;
@ApiParam(name = "신청(등록)종료일자", example = "2023-12-12")
@JsonSerialize(using = InstantDateStrSerializer.class)
private Instant createEndDate;
@ApiParam(name = "비행시작일자", example = "2023-12-12")
@JsonSerialize(using = InstantDateStrSerializer.class)
private Instant schFltStDate;

2
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAprvRs.java

@ -66,6 +66,7 @@ public class BasLaancAprvRs {
private String aprvlYn;
@ApiParam(name = "승인일자")
private Instant aprvlDt;
// @ApiParam(name = "삭제여부")
// private String delYn;
@ApiParam(name = "등록자ID")
private String createUserId;
@ -85,7 +86,6 @@ public class BasLaancAprvRs {
public String getArcrftWght() {
if (arcrftList == null || arcrftList.isEmpty()) return null;
List<ArcrftWghtCd> arcrftWghtCdList = arcrftList.stream().map(BasLaancArcrftModel::getArcrftWghtCd).distinct().filter(Objects::nonNull).collect(Collectors.toList());
System.out.println(arcrftWghtCdList);
String ArcrftWghtType = arcrftWghtCdList.stream().map(ArcrftWghtCd::getValue).collect(Collectors.joining(","));
return ArcrftWghtType;
}

8
pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancAprvService.java

@ -14,6 +14,8 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* packageName : com.palnet.biz.api.bas.laanc.service
* fileName : BasLaancAprvService
@ -44,6 +46,12 @@ public class BasLaancAprvService {
Page<BasLaancAprvRs> rs = PageUtils.convert(result, BasLaancAprvMapper.MAPPER.toRsList(result.getContent()));
return rs;
}
public List<BasLaancAprvRs> getLaancAprvList2(BasLaancAprvListRq rq) {
LaancAprvSearchDto searchDto = BasLaancAprvMapper.MAPPER.toDto(rq);
List<LaancPlanDto> result = fltPlanQueryRepository.findAllAprvListBySearch2(searchDto);
List<BasLaancAprvRs> rs = BasLaancAprvMapper.MAPPER.toRsList(result);
return rs;
}
/**
* laanc 승인 상세

81
pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java

@ -1,13 +1,12 @@
package com.palnet.biz.api.cns.qna.controller;
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.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.cns.qna.model.*;
import com.palnet.biz.api.cns.qna.service.CnsQnaService;
import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -17,6 +16,7 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.naming.AuthenticationException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -30,13 +30,13 @@ import java.util.Map;
public class CnsQnaController {
private final CnsQnaService cnsQnaService;
private final JwtTokenUtil jwtTokenUtil;
// TODO json 가능 여부
@PostMapping(consumes = "multipart/form-data")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 등록[답변추가]")
public ResponseEntity<? extends BasicResponse> insertQna(QnaInsertRQModel rq){
@ApiOperation(value = "QnA 등록 - 사용자")
public ResponseEntity<? extends BasicResponse> insertQna(QnaInsertRQModel rq) {
boolean result = false;
try {
result = cnsQnaService.insertQna(rq);
@ -58,8 +58,8 @@ public class CnsQnaController {
@GetMapping
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 리스트 조회")
public ResponseEntity<? extends BasicResponse> selectQna(QnaSelectListRQ rq){
@ApiOperation(value = "QnA 리스트 조회-관리자")
public ResponseEntity<? extends BasicResponse> selectQna(QnaSelectListRQ rq) {
List<QnaBasModel> result = new ArrayList<>();
try {
@ -81,11 +81,36 @@ public class CnsQnaController {
}
@GetMapping("/user")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 리스트 조회-사용자")
public ResponseEntity<? extends BasicResponse> selectQnaForUser(QnaSelectListRQ rq) {
List<QnaBasModel> result = new ArrayList<>();
try {
result = cnsQnaService.selectQnaForUser(rq);
} catch (CustomException e) {
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
resultMap.put("errorMessage", e.getMessage());
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
} catch (Exception e) {
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
@GetMapping("/{qnaSno}")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 상세보기")
public ResponseEntity<? extends BasicResponse> detailQna(@PathVariable int qnaSno){
List<QnaDetailRSModel> result = null;
public ResponseEntity<? extends BasicResponse> detailQna(@PathVariable int qnaSno) {
QnaDetailRSModel result = null;
try {
result = cnsQnaService.getQnaDetail(qnaSno);
} catch (CustomException e) {
@ -106,8 +131,8 @@ public class CnsQnaController {
@PutMapping
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 업데이트")
public ResponseEntity<? extends BasicResponse> updateQna(QnaInsertRQModel rq){
@ApiOperation(value = "QnA 수정 - 사용자")
public ResponseEntity<? extends BasicResponse> updateQna(QnaInsertRQModel rq) {
boolean result = false;
try {
result = cnsQnaService.updateQna(rq);
@ -127,11 +152,13 @@ public class CnsQnaController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
@DeleteMapping("/{qnaSno}")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 삭제하기")
public ResponseEntity<? extends BasicResponse> deleteQna(@PathVariable int qnaSno){
public ResponseEntity<? extends BasicResponse> deleteQna(@PathVariable int qnaSno) {
// TODO 관리자만 삭제 가능 여부인지 확인 필요
boolean result = false;
try {
result = cnsQnaService.deleteQna(qnaSno);
@ -151,21 +178,19 @@ public class CnsQnaController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/**
* Qna Files 개별삭제 TODO:: 파일 업데이트의 기획이 어떻게 되는지 모름
* @param qnaSno
* @param fileSno
* @return
*/
@DeleteMapping("/file/{qnaSno}/{fileSno}")
@PutMapping("/answer")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 파일 개별삭제")
public ResponseEntity<? extends BasicResponse> deleteQnaFile(@PathVariable int qnaSno, @PathVariable int fileSno){
log.warn("CnsQnaController - deleteQnaFile()");
@ApiOperation(value = "QnA 답변 등록 - 관리자")
public ResponseEntity<? extends BasicResponse> insertAnswer(@RequestBody QnaInsertAnserRQModel rq) {
// TODO 추후 auth -> role 체크로 변경
boolean result = false;
try {
result = cnsQnaService.deleteQnaFile(fileSno);
String userAuthByToken = jwtTokenUtil.getUserAuthByToken();
if (!"SUPER".equals(userAuthByToken)) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(new ErrorResponse(RSErrorCode.AUTH_ERROR));
}
result = cnsQnaService.insertAnswer(rq);
} catch (CustomException e) {
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
@ -180,6 +205,6 @@ public class CnsQnaController {
}
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
}

12
pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaBasModel.java

@ -1,9 +1,9 @@
package com.palnet.biz.api.cns.qna.model;
import java.time.Instant;
import lombok.Data;
import java.time.Instant;
@Data
public class QnaBasModel {
@ -17,6 +17,14 @@ public class QnaBasModel {
private String content;
private String anserContent;
private String anserUserNm;
private Instant anserProcDt;
private String anserStatus;
private int fileGroupNo;
private String expsrYn;

3
pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaDetailRSModel.java

@ -3,6 +3,7 @@ package com.palnet.biz.api.cns.qna.model;
import java.time.Instant;
import java.util.List;
import com.palnet.biz.api.comn.file.model.ComnFileModel;
import com.palnet.biz.jpa.entity.ComFileBas;
import lombok.Data;
@ -30,5 +31,5 @@ public class QnaDetailRSModel {
private Instant updateDt;
private List<ComFileBas> files;
private List<ComnFileModel> files;
}

17
pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertAnserRQModel.java

@ -0,0 +1,17 @@
package com.palnet.biz.api.cns.qna.model;
import lombok.Data;
@Data
public class QnaInsertAnserRQModel {
private Integer qnaSno;
// private Integer targetSno; // 상위 Qna 번호
private String anserContent;
// private String anserUserNm;
// private Instant anserProcDt;
private String anserStatus;
}

3
pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java

@ -2,6 +2,7 @@ package com.palnet.biz.api.cns.qna.model;
import java.util.List;
import com.palnet.biz.api.comn.file.model.ComnFileModel;
import org.springframework.web.multipart.MultipartFile;
import lombok.Data;
@ -19,5 +20,7 @@ public class QnaInsertRQModel {
private String content;
private List<ComnFileModel> fileInfos;
private List<MultipartFile> files;
}

3
pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java

@ -5,7 +5,8 @@ import lombok.Data;
@Data
public class QnaSelectListRQ {
private String searchType;
private String word;
private String category;
}

34
pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaMapper.java

@ -0,0 +1,34 @@
package com.palnet.biz.api.cns.qna.service;
import com.palnet.biz.api.cns.qna.model.QnaDetailRSModel;
import com.palnet.biz.api.cns.qna.model.QnaInsertAnserRQModel;
import com.palnet.biz.api.cns.qna.model.QnaInsertRQModel;
import com.palnet.biz.jpa.entity.CnsQnaBas;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.NullValuePropertyMappingStrategy;
import org.mapstruct.ReportingPolicy;
import org.mapstruct.factory.Mappers;
/**
* packageName : com.palnet.biz.api.cns.qna.service
* fileName : CnsQnaMapper
* author : dhji
* date : 2023-10-17(017)
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2023-10-17(017) dhji 최초 생성
*/
@Mapper(unmappedSourcePolicy = ReportingPolicy.IGNORE, unmappedTargetPolicy = ReportingPolicy.IGNORE, nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
public interface CnsQnaMapper {
CnsQnaMapper MAPPER = Mappers.getMapper(CnsQnaMapper.class);
CnsQnaBas toEntity(QnaInsertRQModel rq);
QnaDetailRSModel toModel(CnsQnaBas qnaBasModel);
void merge(@MappingTarget CnsQnaBas entity, QnaInsertRQModel rq);
void merge(@MappingTarget CnsQnaBas entity, QnaInsertAnserRQModel rq);
}

184
pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java

@ -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();
}
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 result;
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;
}
}

11
pav-server/src/main/java/com/palnet/biz/api/comn/file/controller/ComnFileController.java

@ -4,6 +4,7 @@ import com.palnet.biz.api.comn.file.service.ComnFileService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -26,6 +27,7 @@ public class ComnFileController {
private final ComnFileService comnFileService;
@Deprecated
@GetMapping("/download")
public void downloadPDF(int fileSno) {
try {
@ -34,4 +36,13 @@ public class ComnFileController {
log.error("ERROR: ", e);
}
}
@GetMapping("/download/{fileSno}")
public void download(@PathVariable("fileSno") int fileSno) {
try {
comnFileService.fileDownload(fileSno);
} catch (Exception e) {
log.error("ERROR: ", e);
}
}
}

27
pav-server/src/main/java/com/palnet/biz/api/comn/file/model/ComnFileModel.java

@ -0,0 +1,27 @@
package com.palnet.biz.api.comn.file.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* packageName : com.palnet.biz.api.comn.file.model
* fileName : ComnFileModel
* author : dhji
* date : 2023-10-17(017)
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2023-10-17(017) dhji 최초 생성
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ComnFileModel {
private Integer fileSno;
private String downloadUrl;
private String fileName;
}

23
pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileMapper.java

@ -0,0 +1,23 @@
package com.palnet.biz.api.comn.file.service;
import org.mapstruct.Mapper;
import org.mapstruct.NullValuePropertyMappingStrategy;
import org.mapstruct.ReportingPolicy;
import org.mapstruct.factory.Mappers;
/**
* packageName : com.palnet.biz.api.comn.file.service
* fileName : ComnFileMapper
* author : dhji
* date : 2023-10-17(017)
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2023-10-17(017) dhji 최초 생성
*/
@Mapper(unmappedSourcePolicy = ReportingPolicy.IGNORE, unmappedTargetPolicy = ReportingPolicy.IGNORE, nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
public class ComnFileMapper {
ComnFileMapper MAPPER = Mappers.getMapper(ComnFileMapper.class);
}

71
pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java

@ -19,6 +19,7 @@ import java.util.Objects;
import javax.servlet.http.HttpServletResponse;
import javax.transaction.Transactional;
import com.palnet.biz.api.comn.file.model.ComnFileModel;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
@ -51,7 +52,7 @@ public class ComnFileService {
@Value("${base-url}")
private String BASE_PATH;
private final String DOWNLOAD_URL = "/api/comn/file/download";
private final String NORMAL_FORDER_PATH = "normal/";
/**
@ -131,12 +132,13 @@ public class ComnFileService {
/**
* 다건 DB 인서트, 최신데이터 가져온 Group NO 1추가함
*
* @param comFileBas
* @return
*/
public List<ComFileBas> saveAll(List<ComFileBas> comFileBas, Integer fileGroupNo){
public List<ComFileBas> saveAll(List<ComFileBas> comFileBas, Integer fileGroupNo) {
for(ComFileBas fileBas : comFileBas){
for (ComFileBas fileBas : comFileBas) {
fileBas.setFileGroupNo(fileGroupNo);
}
@ -200,17 +202,17 @@ public class ComnFileService {
}
public Integer fileUpload(List<MultipartFile> files, Integer fileGroupNo){
public Integer fileUpload(List<MultipartFile> files, Integer fileGroupNo) {
if(!this.validCheck(files)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
if (!this.validCheck(files)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
if(fileGroupNo == null || fileGroupNo == 0) fileGroupNo = lastFileGroupNo();
if (fileGroupNo == null || fileGroupNo == 0) fileGroupNo = lastFileGroupNo();
// TODO : 절대경로
String absPath = "/Users/igyeongdo/WokrSpace/";
// String absPath = "/Users/igyeongdo/WokrSpace/";
String fileUrl = new StringBuilder()
.append(absPath)
// .append(absPath)
.append(this.BASE_PATH)
.append(this.NORMAL_FORDER_PATH)
.append(InstantUtils.toDateStringByFormat(Instant.now(), "yyyyMMdd"))
@ -219,7 +221,7 @@ public class ComnFileService {
List<ComFileBas> comFileBas = new ArrayList<>();
for(MultipartFile file : files){
for (MultipartFile file : files) {
String oriNm = file.getOriginalFilename();
String extension = oriNm.substring(oriNm.lastIndexOf("."));
String etc = String.valueOf(System.currentTimeMillis()); // 동명이인 방지
@ -265,12 +267,13 @@ public class ComnFileService {
/**
* 정해진 확장자만 있도록 validation처리,
* TODO :: 혹시 mime 타입으로 확인하여 처리해야 할까요?
*
* @param files
* @return
*/
private boolean validCheck(List<MultipartFile> files){
private boolean validCheck(List<MultipartFile> files) {
for(MultipartFile file : files){
for (MultipartFile file : files) {
try {
String oriNm = file.getOriginalFilename();
@ -279,7 +282,7 @@ public class ComnFileService {
ExtensionConstant constants = ExtensionConstant.fromExtension(extension);
// 허락된 확장자가 아닐 경우 return false
if(constants == null) return false;
if (constants == null) return false;
} catch (Exception e) {
@ -303,7 +306,7 @@ public class ComnFileService {
ext = path.substring(lastIndex + 1);
}
try (InputStream is = resource.getInputStream();){
try (InputStream is = resource.getInputStream();) {
byte[] imageBytes = IOUtils.toByteArray(is);
String encodedString = java.util.Base64.getEncoder().encodeToString(imageBytes);
str
@ -319,9 +322,10 @@ public class ComnFileService {
/**
* 마지막 fileGroupNo 가져와 +1 반환
*
* @return
*/
private Integer lastFileGroupNo(){
private Integer lastFileGroupNo() {
ComFileBas lastComFileBas = comFileBasRepository.findFirstByOrderByFileGroupNoDesc();
int fileGroupNo = (lastComFileBas == null) ? 1 : lastComFileBas.getFileGroupNo() + 1;
@ -329,7 +333,7 @@ public class ComnFileService {
}
@Transactional
public boolean deleteFiles(int fileGroupNo){
public boolean deleteFilesByFileGroupNo(int fileGroupNo) {
List<ComFileBas> files = comFileBasRepository.findByFileGroupNoAndDelYn(fileGroupNo, "N");
@ -337,7 +341,26 @@ public class ComnFileService {
if (userId == null) userId = "NONE";
for(ComFileBas file : files){
for (ComFileBas file : files) {
file.setDelYn("Y");
file.setDelUserId(userId);
file.setDelDt(Instant.now());
}
comFileBasRepository.saveAll(files);
return true;
}
@Transactional
public boolean deleteFiles(List<Integer> fileSnoList){
List<ComFileBas> files = comFileBasRepository.findByFileSnoInAndDelYn(fileSnoList, "N");
String userId = jwtTokenUtil.getUserIdByToken();
if (userId == null) userId = "NONE";
for (ComFileBas file : files) {
file.setDelYn("Y");
file.setDelUserId(userId);
file.setDelDt(Instant.now());
@ -349,7 +372,7 @@ public class ComnFileService {
}
@Transactional
public boolean deleteFile(int fileSno){
public boolean deleteFile(int fileSno) {
ComFileBas file = comFileBasRepository.findByFileSnoAndDelYn(fileSno, "N");
@ -366,4 +389,18 @@ public class ComnFileService {
return true;
}
public List<ComnFileModel> getNormalFileListByGroupNo(Integer fileGroupNo) {
List<ComFileBas> files = comFileBasRepository.findByFileGroupNoAndDelYn(fileGroupNo, "N");
List<ComnFileModel> result = new ArrayList<>();
for (ComFileBas file : files) {
result.add(ComnFileModel.builder()
.fileSno(file.getFileSno())
.fileName(file.getFileOriNm())
.downloadUrl(DOWNLOAD_URL + "/" + file.getFileSno())
.build());
}
return result;
}
}

1
pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnModel.java

@ -3,7 +3,6 @@ package com.palnet.biz.api.ctr.cntrl.model;
import lombok.Data;
import java.time.Instant;
import java.util.Date;
@Data
public class CtrCntrlArcrftWarnModel {

4
pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlWarnLogModel.java

@ -3,10 +3,6 @@ package com.palnet.biz.api.ctr.cntrl.model;
import lombok.Data;
import java.time.Instant;
import java.util.Date;
import java.util.List;
import com.palnet.biz.jpa.entity.CtrCntrlWarnLog;
@Data
public class CtrCntrlWarnLogModel {

43
pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java

@ -10,53 +10,66 @@ import java.time.Instant;
@Entity
@Data
@Table(name="CNS_QNA_BAS")
@NamedQuery(name="CnsQnaBas.findAll", query="SELECT c FROM CnsQnaBas c")
@Table(name = "CNS_QNA_BAS")
@NamedQuery(name = "CnsQnaBas.findAll", query = "SELECT c FROM CnsQnaBas c")
public class CnsQnaBas implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="QNA_SNO")
@Column(name = "QNA_SNO")
private int qnaSno;
@Column(name="TARGET_SNO")
// 안쓸거 같음
@Column(name = "TARGET_SNO")
private int targetSno;
@Column(name="CATEGORY")
@Column(name = "CATEGORY")
private String category;
@Column(name="TITLE")
@Column(name = "TITLE")
private String title;
@Column(name="CONTENT")
@Column(name = "CONTENT")
private String content;
@Column(name="FILE_GROUP_NO")
@Column(name = "ANSER_CONTENT")
private String anserContent;
@Column(name = "ANSER_USER_NM")
private String anserUserNm;
@Column(name = "ANSER_PROC_DT", columnDefinition = "TIMESTAMP")
private Instant anserProcDt;
@Column(name = "ANSER_STATUS")
private String anserStatus;
@Column(name = "FILE_GROUP_NO")
private Integer fileGroupNo;
@Column(name="EXPSR_YN")
@Column(name = "EXPSR_YN")
private String expsrYn = "N";
@Column(name="DEL_YN")
@Column(name = "DEL_YN")
private String delYn = "N";
@Column(name="VIEW_CNT")
@Column(name = "VIEW_CNT")
private int viewCnt = 0;
@Column(name="CREATE_USER_ID")
@Column(name = "CREATE_USER_ID")
private String createUserId;
@CreationTimestamp
@Column(name="CREATE_DT", columnDefinition = "TIMESTAMP", updatable = false)
@Column(name = "CREATE_DT", columnDefinition = "TIMESTAMP", updatable = false)
private Instant createDt;
@Column(name="UPDATE_USER_ID")
@Column(name = "UPDATE_USER_ID")
private String updateUserId;
@UpdateTimestamp
@Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP")
@Column(name = "UPDATE_DT", columnDefinition = "TIMESTAMP")
private Instant updateDt;
}

1
pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCrtfyhpBas.java

@ -6,7 +6,6 @@ import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.io.Serializable;
import java.time.Instant;
import java.util.Date;
/**

13
pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java

@ -1,17 +1,15 @@
package com.palnet.biz.jpa.repository.cns;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.palnet.biz.api.cns.faq.model.FaqListModel;
import com.palnet.biz.jpa.entity.QCnsFaqBas;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;
import java.util.List;
@Slf4j
@Repository
@ -28,11 +26,11 @@ public class CnsFaqQueryRepository {
builder.and(bas.delYn.eq("N"));
builder.and(bas.expsrYn.eq("Y"));
if(category != null) {
if (category != null) {
builder.and(bas.category.eq(category));
}
if(word != null) {
if (word != null) {
builder.and(bas.title.contains(word));
}
@ -52,6 +50,7 @@ public class CnsFaqQueryRepository {
))
.from(bas)
.where(builder)
.orderBy(bas.createDt.desc())
.fetch();

68
pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java

@ -2,12 +2,11 @@ package com.palnet.biz.jpa.repository.cns;
import java.util.List;
import com.palnet.biz.api.cns.qna.model.QnaSelectListRQ;
import org.springframework.stereotype.Repository;
import com.palnet.biz.api.cns.qna.model.QnaBasModel;
import com.palnet.biz.jpa.entity.QCnsQnaBas;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
@ -24,23 +23,73 @@ public class CnsQnaQueryRepository {
/**
* 카테고리와 글로 게시글 검색, 만약 조건 없으면 전체검색
* @param category
* @param word
*
* @param rq
* @return
*/
public List<QnaBasModel> getQnaList(String category, String word) {
public List<QnaBasModel> getQnaList(QnaSelectListRQ rq) {
QCnsQnaBas bas = QCnsQnaBas.cnsQnaBas;
BooleanBuilder builder = new BooleanBuilder();
builder.and(bas.delYn.eq("N"));
builder.and(bas.expsrYn.eq("Y"));
if(category != null) {
builder.and(bas.category.eq(category));
if (rq != null) {
if (rq.getCategory() != null) {
builder.and(bas.category.eq(rq.getCategory()));
}
if(word != null) {
builder.and(bas.title.contains(word));
if (rq.getWord() != null) {
if ("TITLE".equals(rq.getSearchType())) builder.and(bas.title.contains(rq.getWord()));
else if ("CONTENT".equals(rq.getSearchType())) builder.and(bas.content.contains(rq.getWord()));
else builder.and(bas.title.contains(rq.getWord()).or(bas.content.contains(rq.getWord())));
}
}
List<QnaBasModel> r = query
.select(Projections.bean(
QnaBasModel.class,
bas.qnaSno,
bas.category,
bas.title,
bas.content,
bas.fileGroupNo,
bas.viewCnt,
bas.expsrYn,
bas.delYn,
bas.createUserId,
bas.createDt,
bas.updateUserId,
bas.updateDt
))
.from(bas)
.where(builder)
.orderBy(bas.createDt.desc())
.fetch();
return r;
}
public List<QnaBasModel> getQnaListForUser(QnaSelectListRQ rq, String userId) {
QCnsQnaBas bas = QCnsQnaBas.cnsQnaBas;
BooleanBuilder builder = new BooleanBuilder();
builder.and(bas.delYn.eq("N"));
builder.and(bas.expsrYn.eq("Y"));
builder.and(bas.createUserId.eq(userId));
if (rq != null) {
if (rq.getCategory() != null) {
builder.and(bas.category.eq(rq.getCategory()));
}
if (rq.getWord() != null) {
if ("TITLE".equals(rq.getSearchType())) builder.and(bas.title.contains(rq.getWord()));
else if ("CONTENT".equals(rq.getSearchType())) builder.and(bas.content.contains(rq.getWord()));
else builder.and(bas.title.contains(rq.getWord()).or(bas.content.contains(rq.getWord())));
}
}
List<QnaBasModel> r = query
@ -61,6 +110,7 @@ public class CnsQnaQueryRepository {
))
.from(bas)
.where(builder)
.orderBy(bas.createDt.desc())
.fetch();
return r;

5
pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java

@ -1,13 +1,14 @@
package com.palnet.biz.jpa.repository.com;
import java.util.List;
import com.palnet.biz.jpa.entity.ComFileBas;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface ComFileBasRepository extends JpaRepository<ComFileBas, Integer>{
List<ComFileBas> findByFileSnoInAndDelYn(List<Integer> fileSnos, String delYn);
ComFileBas findFirstByOrderByFileSnoDesc();

126
pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java

@ -753,7 +753,8 @@ public class FltPlanQueryRepository {
.on(bas.planSno.eq(area.planSno))
.leftJoin(arcrft)
.on(bas.planSno.eq(arcrft.planSno))
.where(builder);
.where(builder)
.orderBy(bas.createDt.desc());
JPAQuery<?> countQuery = jpaQuery.clone();
@ -850,6 +851,129 @@ public class FltPlanQueryRepository {
return laancPlanDtos;
}
public List<LaancPlanDto> findAllAprvListBySearch2(LaancAprvSearchDto search) {
QFltPlanBas bas = QFltPlanBas.fltPlanBas;
QFltPlanArea area = QFltPlanArea.fltPlanArea;
QFltPlanArcrft arcrft = QFltPlanArcrft.fltPlanArcrft;
// serach
BooleanBuilder builder = new BooleanBuilder();
if(search != null){
if(StringUtils.hasText(search.getMemberName())){
builder.and(bas.memberName.contains(search.getMemberName()));
}
if(search.getCreateDate() != null){
Instant createStDate = InstantUtils.toDate(search.getCreateDate());
Instant createEndDate = createStDate.plus(Duration.ofDays(1));
builder.and(bas.createDt.goe(createStDate).and(bas.createDt.lt(createEndDate)));
}
if(search.getCreateStDate() != null) {
Instant createStDate = InstantUtils.toDate(search.getCreateStDate());
builder.and(bas.createDt.goe(createStDate));
}
if(search.getCreateEndDate() != null){
Instant createEndDate = InstantUtils.toDate(search.getCreateEndDate()).plus(Duration.ofDays(1));
builder.and(bas.createDt.lt(createEndDate));
}
if(search.getSchFltStDate() != null){
Instant schFltStDate = InstantUtils.toDate(search.getSchFltStDate());
builder.and(bas.schFltStDt.goe(schFltStDate));
}
if(search.getSchFltEndDate() != null){
Instant schFltEndDate = InstantUtils.toDate(search.getSchFltEndDate()).plus(Duration.ofDays(1));
builder.and(bas.schFltEndDt.lt(schFltEndDate));
}
}
JPAQuery<?> jpaQuery = query.from(bas)
.leftJoin(area)
.on(bas.planSno.eq(area.planSno))
.leftJoin(arcrft)
.on(bas.planSno.eq(arcrft.planSno))
.where(builder)
.orderBy(bas.createDt.desc());
List<LaancPlanDto> list = jpaQuery.transform(
GroupBy.groupBy(bas.planSno)
.list(Projections.bean(
LaancPlanDto.class,
bas.planSno,
bas.groupId,
bas.cstmrSno,
bas.memberName,
bas.email,
bas.hpno,
bas.clncd,
bas.addr,
bas.addrDtlCn,
bas.zip,
bas.schFltStDt,
bas.schFltEndDt,
bas.fltPurpose,
bas.aprvlYn,
bas.delYn,
bas.createUserId,
bas.createDt,
bas.updateUserId,
bas.updateDt,
bas.corpRegYn,
bas.serviceType,
GroupBy.list(Projections.bean(
LaancPlanAreaDto.class,
area.planAreaSno,
area.planSno,
area.areaType,
area.fltMethod,
area.fltAreaAddr,
area.bufferZone,
area.fltElev,
area.createUserId,
area.createDt,
area.updateUserId,
area.updateDt,
area.fltMothoeRm
).skipNulls()).as("areaList"),
GroupBy.list(Projections.bean(
LaancPlanArcrftDto.class,
arcrft.planArcrftSno,
arcrft.planSno,
arcrft.arcrftSno,
arcrft.idntfNum,
arcrft.groupNm,
arcrft.prdctNum,
arcrft.arcrftTypeCd,
arcrft.arcrftModelNm,
arcrft.prdctCmpnNm,
arcrft.prdctDate,
arcrft.arcrftLngth,
arcrft.arcrftWdth,
arcrft.arcrftHght,
arcrft.arcrftWght,
arcrft.arcrftWghtCd,
arcrft.wghtTypeCd,
arcrft.imageUrl,
arcrft.takeoffWght,
arcrft.useYn,
arcrft.cameraYn,
arcrft.insrncYn,
arcrft.ownerNm,
arcrft.createUserId,
arcrft.createDt,
arcrft.updateUserId,
arcrft.updateDt,
arcrft.acrftInsuranceYn,
arcrft.insuranceExperiod,
arcrft.corporationNm
).skipNulls()).as("arcrftList")
).skipNulls())
);
return list;
}
// laanc 승인 상세
public LaancPlanDto findAprvById(Integer planSno) {
QFltPlanBas bas = QFltPlanBas.fltPlanBas;

25
pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java

@ -128,25 +128,31 @@ public class PtyCstmrQueryRepository {
}
public JwtUserModel findUserPassword(String userId) {
QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas;
QPtyCstmrGroup groupEntity = QPtyCstmrGroup.ptyCstmrGroup;
QPtyCstmrBas bas = QPtyCstmrBas.ptyCstmrBas;
QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl;
QPtyCstmrGroup group = QPtyCstmrGroup.ptyCstmrGroup;
BooleanBuilder builder = new BooleanBuilder();
builder.and(basEntity.userId.eq(userId));
builder.and(bas.userId.eq(userId));
PtyCstmrBas entity = query.select(basEntity)
.from(basEntity)
PtyCstmrBas entity = query.select(bas)
.from(bas)
.where(builder)
.fetchFirst();
PtyCstmrDtl dtlEntity = query.select(dtl)
.from(dtl)
.where(dtl.cstmrSno.eq(entity.getCstmrSno()))
.fetchFirst();
List<PtyCstmrGroup> pcgEntityList = null;
if (entity != null) {
BooleanBuilder groupBuilder = new BooleanBuilder();
groupBuilder.and(groupEntity.cstmrSno.eq(entity.getCstmrSno())
.and(groupEntity.joinYn.eq("Y")));
groupBuilder.and(group.cstmrSno.eq(entity.getCstmrSno())
.and(group.joinYn.eq("Y")));
pcgEntityList = query.select(groupEntity)
.from(groupEntity)
pcgEntityList = query.select(group)
.from(group)
.where(groupBuilder)
.fetch();
}
@ -169,6 +175,7 @@ public class PtyCstmrQueryRepository {
}
model.setGroup(groupModelList);
}
model.setUserNm(dtlEntity.getMemberName());
return model;

1
pav-server/src/main/java/com/palnet/comn/code/RSErrorCode.java

@ -8,6 +8,7 @@ public enum RSErrorCode {
PSWD_NOTMATCH("-102" , "Password does not match"),
ACNT_UNAVAIL("-103","Account is unavailable"),
AUTH_ERROR("-401", "auth error"),
INTERNAL_SERVER_ERROR("-500", "Internal system error"),
DATA_DUPLICATE("-104","Duplicate data exists");

Loading…
Cancel
Save