Compare commits

...

6 Commits

@ -1,14 +1,12 @@
package go.kr.project.biz.common.controller;
import go.kr.project.biz.common.dto.CommonDto;
import go.kr.project.biz.common.dto.WebClientCallDto;
import go.kr.project.biz.common.service.CommonService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@ -40,6 +38,20 @@ public class CommonContorller {
return ResponseEntity.ok(commonService.findCarInfo(mmCarno, mmDate));
}
/**
*
*/
@PutMapping("/common/car/info/{mmCode}/update.ajax")
public ResponseEntity<?> updateCarInfo(@PathVariable String mmCode, @RequestBody WebClientCallDto.CarInfoResponse.CarInfoIfBody carInfoIfBody) {
commonService.updateCarInfoFromCpMain(mmCode, carInfoIfBody);
return ResponseEntity.ok("Success");
}
/**
*
*/

@ -99,259 +99,261 @@ public class WebClientCallDto {
public static class CarInfoIfBody {
@JsonProperty("VHRNO")
private String vhrno;
private String vhrno; // 차량번호
@JsonProperty("ATMB_NM")
private String atmbNm;
// ===== 상단 (연식 / 등록정보 / 사용본거지) =====
@JsonProperty("PRYE")
private String prye; // 연식
@JsonProperty("RPRS_OWNR_NM")
private String rprsOwnrNm;
@JsonProperty("REGIST_DE")
private String registDe; // 등록일(변경일)
@JsonProperty("RPRSV_OWNR_IDECNO")
private String rprsvOwnrIdecno;
@JsonProperty("ERSR_REGIST_SE_CODE")
private String ersrRegistSeCode; // 말소등록구분코드
@JsonProperty("ERSR_REG_YMD")
private String ersrRegYmd;
@JsonProperty("ERSR_REGIST_SE_NM")
private String ersrRegistSeNm; // 말소등록구분명
@JsonProperty("PRCS_IMPRTY_RSN_CD")
private String prcsImprtyRsnCd;
@JsonProperty("ERSR_REGIST_DE")
private String ersrRegistDe; // 말소등록일
@JsonProperty("PRCS_IMPRTY_RSN_DTLS")
private String prcsImprtyRsnDtls;
@JsonProperty("REGIST_DETAIL_CODE")
private String registDetailCode; // 등록상세코드
@JsonProperty("YRIDNW")
private String yridnw;
@JsonProperty("DSPLVL")
private String dsplvl; // 배기량
@JsonProperty("VIN")
private String vin;
@JsonProperty("USE_STRNGHLD_LEGALDONG_CODE")
private String useStrnghldLegaldongCode; // 사용본거지법정동코드
@JsonProperty("CNM")
private String cnm;
@JsonProperty("USE_STRNGHLD_ADSTRD_CODE")
private String useStrnghldAdstrdCode; // 사용본거지행정동코드
@JsonProperty("CARMDL_ASORT_NM")
private String carmdlAsortNm;
@JsonProperty("USE_STRNGHLD_MNTN")
private String useStrnghldMntn; // 사용본거지산
@JsonProperty("FRST_REG_YMD")
private String frstRegYmd;
@JsonProperty("USE_STRNGHLD_LNBR")
private String useStrnghldLnbr; // 사용본거지번지
@JsonProperty("COLOR_NM")
private String colorNm;
@JsonProperty("USE_STRNGHLD_HO")
private String useStrnghldHo; // 사용본거지호
@JsonProperty("STRCT_CHG_CNT")
private String strctChgCnt;
@JsonProperty("USE_STRNGHLD_ADRES_NM")
private String useStrnghldAdresNm; // 사용본거지상세주소
@JsonProperty("NOPLT_CSDY_YN")
private String nopltCsdyYn;
@JsonProperty("USE_STRNGHLD_ROAD_NM_CODE")
private String useStrnghldRoadNmCode; // 사용본거지도로명코드
@JsonProperty("NOPLT_CSDY_AVTSMT_YMD")
private String nopltCsdyAvtsmtYmd;
@JsonProperty("USGSRHLD_UNDGRND_BULD_SE_CODE")
private String usgsrhldUndgrndBuldSeCode; // 사용본거지지하건물구분코드
@JsonProperty("INSP_VLD_PD_BGNG_YMD")
private String inspVldPdBgngYmd;
@JsonProperty("USE_STRNGHLD_BULD_MAIN_NO")
private String useStrnghldBuldMainNo; // 사용본거지건물주요번호
@JsonProperty("INSP_VLD_PD_END_YMD")
private String inspVldPdEndYmd;
@JsonProperty("USE_STRNGHLD_BULD_SUB_NO")
private String useStrnghldBuldSubNo; // 사용본거지건물부번호
@JsonProperty("SPMNNO")
private String spmnno;
@JsonProperty("USGSRHLD_ADRES_FULL")
private String usgsrhldAdresFull; // 사용본거지전체주소
@JsonProperty("DRVNG_DSTNC")
private String drvngDstnc;
// ===== 대표소유자/소유자 정보 =====
@JsonProperty("MBER_SE_CODE")
private String mberSeCode; // 대표소유자회원구분코드
@JsonProperty("FOM_NM")
private String fomNm;
@JsonProperty("MBER_NM")
private String mberNm; // 대표소유자성명
@JsonProperty("DSPLVL")
private String dsplvl;
@JsonProperty("MBER_SE_NO")
private String mberSeNo; // 대표소유자회원번호
@JsonProperty("CARMDL_CLSF_NM")
private String carmdlClsfNm;
@JsonProperty("TELNO")
private String telno; // 대표소유자전화번호
@JsonProperty("FBCTN_YMD")
private String fbctnYmd;
@JsonProperty("OWNER_LEGALDONG_CODE")
private String ownerLegaldongCode; // 소유자법정동코드
@JsonProperty("USGSRHLD_ADDR_NM")
private String usgsrhldAddrNm;
@JsonProperty("OWNER_ADSTRD_CODE")
private String ownerAdstrdCode; // 소유자행정동코드
@JsonProperty("MTRS_FOM_NM")
private String mtrsFomNm;
@JsonProperty("OWNER_MNTN")
private String ownerMntn; // 소유자산
@JsonProperty("RDCPCT_CNT")
private String rdcpctCnt;
@JsonProperty("OWNER_LNBR")
private String ownerLnbr; // 소유자번지
@JsonProperty("FRST_REG_APLY_RCPT_NO")
private String frstRegAplyRcptNo;
@JsonProperty("OWNER_HO")
private String ownerHo; // 소유자호
@JsonProperty("OGNZ_NM")
private String ognzNm;
@JsonProperty("OWNER_ADRES_NM")
private String ownerAdresNm; // 소유자상세주소
@JsonProperty("ERSR_REG_SE_NM")
private String ersrRegSeNm;
@JsonProperty("OWNER_ROAD_NM_CODE")
private String ownerRoadNmCode; // 소유자도로명코드
@JsonProperty("BFR_VHRNO")
private String bfrVhrno;
@JsonProperty("OWNER_UNDGRND_BULD_SE_CODE")
private String ownerUndgrndBuldSeCode; // 소유자지하건물구분코드
@JsonProperty("USE_FUEL_CD")
private String useFuelCd;
@JsonProperty("OWNER_BULD_MAIN_NO")
private String ownerBuldMainNo; // 소유자건물주요번호
@JsonProperty("RPRS_OWNR_MBR_SE_CD")
private String rprsOwnrMbrSeCd;
@JsonProperty("OWNER_BULD_SUB_NO")
private String ownerBuldSubNo; // 소유자건물부번호
@JsonProperty("RPRS_OWNR_TELNO")
private String rprsOwnrTelno;
@JsonProperty("OWNER_ADRES_FULL")
private String ownerAdresFull; // 소유자전체주소
@JsonProperty("OWNR_STDG_CD")
private String ownrStdgCd;
// ===== 차량번호/차량 기본 =====
@JsonProperty("AFTR_VHRNO")
private String aftrVhrno; // 신차량번호
@JsonProperty("OWNR_WHOL_ADDR")
private String ownrWholAddr;
@JsonProperty("FRNT_VHRNO")
private String frntVhrno; // 이전차량번호
@JsonProperty("VHCL_TOTL_WT")
private String vhclTotlWt;
@JsonProperty("VIN")
private String vin; // 차대번호
@JsonProperty("MXMM_LDG")
private String mxmmLdg;
@JsonProperty("CNM")
private String cnm; // 차명
@JsonProperty("CBD_LT")
private String cbdLt;
@JsonProperty("VHCTLE_TOT_WT")
private String vhctleTotWt; // 차량총중량
@JsonProperty("CBD_BT")
private String cbdBt;
@JsonProperty("CAAG_ENDDE")
private String caagEndde; // 차량만료일자
@JsonProperty("CBD_HG")
private String cbdHg;
@JsonProperty("CARMDL_ASORT_CD")
private String carmdlAsortCd;
@JsonProperty("CHANGE_DE")
private String changeDe; // 차변변경시기
@JsonProperty("CARMDL_TYPE_CD")
private String carmdlTypeCd;
@JsonProperty("USE_FUEL_CODE")
private String useFuelCode; // 사용연료코드
@JsonProperty("FUEL_CNSMPRT")
private String fuelCnsmprt;
@JsonProperty("PRPOS_SE_CODE")
private String prposSeCode; // 용도구분코드
@JsonProperty("ERSR_REG_SE_CD")
private String ersrRegSeCd;
@JsonProperty("MTRS_FOM_NM")
private String mtrsFomNm; // 원동기형식명
@JsonProperty("REG_DTL_CD")
private String regDtlCd;
// ===== 차종/제원 =====
@JsonProperty("VHCTY_ASORT_CODE")
private String vhctyAsortCode; // 차종종별코드
@JsonProperty("USGSRHLD_STDG_CD")
private String usgsrhldStdgCd;
@JsonProperty("VHCTY_TY_CODE")
private String vhctyTyCode; // 차종유형코드
@JsonProperty("USGSRHLD_DONG_CD")
private String usgsrhldDongCd;
@JsonProperty("VHCTY_SE_CODE")
private String vhctySeCode; // 차종분류코드
@JsonProperty("USGSRHLD_MTN_YN")
private String usgsrhldMtnYn;
@JsonProperty("MXMM_LDG")
private String mxmmLdg; // 최대적재량
@JsonProperty("USGSRHLD_LNBR")
private String usgsrhldLnbr;
@JsonProperty("VHCTY_ASORT_NM")
private String vhctyAsortNm; // 차종종별명
@JsonProperty("USGSRHLD_HO")
private String usgsrhldHo;
@JsonProperty("VHCTY_TY_NM")
private String vhctyTyNm; // 차종유형명
@JsonProperty("USGSRHLD_ROAD_NM_CD")
private String usgsrhldRoadNmCd;
@JsonProperty("VHCTY_SE_NM")
private String vhctySeNm; // 차종분류명
@JsonProperty("USGSRHLD_UDGD_BLDG_SE_CD")
private String usgsrhldUdgdBldgSeCd;
@JsonProperty("FRST_REGIST_DE")
private String frstRegistDe; // 최초등록일
@JsonProperty("USGSRHLD_BMNO")
private String usgsrhldBmno;
@JsonProperty("FOM_NM")
private String fomNm; // 형식
@JsonProperty("USGSRHLD_BSNO")
private String usgsrhldBsno;
@JsonProperty("ACQS_DE")
private String acqsDe; // 취득일자
@JsonProperty("OWNR_DONG_CD")
private String ownrDongCd;
@JsonProperty("ACQS_END_DE")
private String acqsEndDe; // 취득종료일자
@JsonProperty("OWNR_MTN_YN")
private String ownrMtnYn;
@JsonProperty("YBL_MD")
private String yblMd; // 제작년월일
@JsonProperty("OWNR_LNBR")
private String ownrLnbr;
@JsonProperty("TRANSR_REGIST_DE")
private String transrRegistDe; // 이전등록일(양수일)
@JsonProperty("OWNR_HO")
private String ownrHo;
// ===== 상태 / 검사 / 금액 =====
@JsonProperty("SPCF_REGIST_STTUS_CODE")
private String spcfRegistSttusCode; // 제원등록상태코드
@JsonProperty("OWNR_ADDR_NM")
private String ownrAddrNm;
@JsonProperty("COLOR_NM")
private String colorNm; // 색상명
@JsonProperty("OWNR_ROAD_NM_CD")
private String ownrRoadNmCd;
@JsonProperty("MRTG_CO")
private String mrtgCo; // 저당수
@JsonProperty("OWNR_UDGD_BLDG_SE_CD")
private String ownrUdgdBldgSeCd;
@JsonProperty("SEIZR_CO")
private String seizrCo; // 압류건수
@JsonProperty("OWNR_BMNO")
private String ownrBmno;
@JsonProperty("STMD_CO")
private String stmdCo; // 구조변경수
@JsonProperty("OWNR_BSNO")
private String ownrBsno;
@JsonProperty("NMPL_CSDY_AT")
private String nmplCsdyAt; // 번호판영치여부
@JsonProperty("REAR_VHRNO")
private String rearVhrno;
@JsonProperty("NMPL_CSDY_REMNR_DE")
private String nmplCsdyRemnrDe; // 번호판영치최고일
@JsonProperty("USG_SE_CD")
private String usgSeCd;
@JsonProperty("ORIGIN_SE_CODE")
private String originSeCode; // 출처구분코드
@JsonProperty("VEAG_END_YMD")
private String veagEndYmd;
@JsonProperty("NMPL_STNDRD_CODE")
private String nmplStndrdCode; // 번호판규격코드
@JsonProperty("CHG_YMD")
private String chgYmd;
@JsonProperty("ACQS_AMOUNT")
private String acqsAmount; // 취득금액(최종/최초)
@JsonProperty("CARMDL_SE_CD")
private String carmdlSeCd;
@JsonProperty("INSPT_VALID_PD_BGNDE")
private String insptValidPdBgnde; // 검사유효기간시작일
@JsonProperty("CARMDL_TYPE_NM")
private String carmdlTypeNm;
@JsonProperty("INSPT_VALID_PD_ENDDE")
private String insptValidPdEndde; // 검사유효기간종료일
@JsonProperty("ACQS_YMD")
private String acqsYmd;
@JsonProperty("USE_STRNGHLD_GRC_CODE")
private String useStrnghldGrcCode; // 사용본거지관청코드
@JsonProperty("ACQS_END_YMD")
private String acqsEndYmd;
@JsonProperty("TKCAR_PSCAP_CO")
private String tkcarPscapCo; // 승차정원수
@JsonProperty("TRANSR_REG_YMD")
private String transrRegYmd;
@JsonProperty("SPMNNO")
private String spmnno; // 제원관리번호
@JsonProperty("SPCF_REG_STTS_CD")
private String spcfRegSttsCd;
@JsonProperty("TRVL_DSTNC")
private String trvlDstnc; // 주행거리
@JsonProperty("SRC_SE_CD")
private String srcSeCd;
@JsonProperty("FRST_REGIST_RQRCNO")
private String frstRegistRqrcno; // 최초등록접수번호
@JsonProperty("NOPLT_SPCFCT_CD")
private String nopltSpcfctCd;
@JsonProperty("VLNT_ERSR_PRVNTC_NTICE_DE")
private String vlntErsrPrvntcNticeDe; // 예고통지일
@JsonProperty("ACQS_AMT")
private String acqsAmt;
@JsonProperty("REGIST_INSTT_NM")
private String registInsttNm; // 등록기관명
@JsonProperty("USGSRHLD_GRC_CD")
private String usgsrhldGrcCd;
@JsonProperty("PROCESS_IMPRTY_RESN_CODE")
private String processImprtyResnCode; // 처리불가사유코드
@JsonProperty("VLNT_ERSR_PRVNTC_AVTSMT_YMD")
private String vlntErsrPrvntcAvtsmtYmd;
@JsonProperty("PROCESS_IMPRTY_RESN_DTLS")
private String processImprtyResnDtls; // 처리불가사유명세
@JsonProperty("FRST_MXMM_LDG")
private String frstMxmmLdg;
@JsonProperty("CBD_LT")
private String cbdLt; // 차체길이
@JsonProperty("REG_YMD")
private String regYmd;
@JsonProperty("CBD_BT")
private String cbdBt; // 차체너비
@JsonProperty("ELCTY_CMPND_FUEL_CNSMPRT")
private String elctyCmpndFuelCnsmprt;
@JsonProperty("CBD_HG")
private String cbdHg; // 차체높이
@JsonProperty("USGSRHLD_WHOL_ADDR")
private String usgsrhldWholAddr;
@JsonProperty("FRST_MXMM_LDG")
private String frstMxmmLdg; // 최초최대적재량
@JsonProperty("MRTG_CNT")
private String mrtgCnt;
@JsonProperty("FUEL_CNSMP_RT")
private String fuelCnsmpRt; // 연료소비율
@JsonProperty("SZR_CNT")
private String szrCnt;
@JsonProperty("ELCTY_CMPND_FUEL_CNSMP_RT")
private String elctyCmpndFuelCnsmpRt; // 전기복합연료소비율
}

@ -3,16 +3,21 @@ package go.kr.project.biz.common.repository;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import go.kr.project.biz.common.dto.CommonDto;
import go.kr.project.biz.common.dto.WebClientCallDto;
import go.kr.project.domain.entity.CpOwner;
import go.kr.project.vo.CpBdongVO;
import go.kr.project.vo.CpCancelAnswerVO;
import go.kr.project.vo.CpViolationVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import javax.persistence.LockModeType;
import java.util.List;
import static go.kr.project.domain.entity.QCpBdong.cpBdong;
import static go.kr.project.domain.entity.QCpCancelAnswer.cpCancelAnswer;
import static go.kr.project.domain.entity.QCpMain.cpMain;
import static go.kr.project.domain.entity.QCpOwner.cpOwner;
import static go.kr.project.domain.entity.QCpSetinfo.cpSetinfo;
import static go.kr.project.domain.entity.QCpViolation.cpViolation;
@ -97,6 +102,30 @@ public class CommonQueryDslRepository {
return result;
}
/** CpMain 차적조회 결과 업데이트 */
public void updateCarinfoFromCpMain(String mmCode, CpOwner cpOwner, WebClientCallDto.CarInfoResponse.CarInfoIfBody carInfoIfBody) {
queryFactory.update(cpMain)
.set(cpMain.mmCarno, carInfoIfBody.getVhrno())
.set(cpMain.mmVhmno, "")
.set(cpMain.mmCargb, "")
.set(cpMain.mmCarkind, "")
.set(cpMain.mmOmcode, cpOwner.getOmCode())
.set(cpMain.mmCarkind, "")
.set(cpMain.mmState, "")
.set(cpMain.mmStateDt, "")
.set(cpMain.mmViorcnt, "")
.set(cpMain.mmCarname, "")
.where(
cpMain.mmCode.eq(mmCode)
)
.execute();
}
public Boolean isGateWay() {
String result = queryFactory
.select(
@ -128,4 +157,12 @@ public class CommonQueryDslRepository {
}
public String findMaxOmCode() {
return queryFactory
.select(cpOwner.omCode.max())
.from(cpOwner)
.setLockMode(LockModeType.PESSIMISTIC_WRITE)
.fetchOne();
}
}

@ -10,4 +10,6 @@ public interface CommonService {
CommonDto.Response.CodeResult findCode(CommonDto.Request commonDto);
WebClientCallDto.CarInfoResponse findCarInfo(String carNo, String mmDate);
void updateCarInfoFromCpMain(String mmCode, WebClientCallDto.CarInfoResponse.CarInfoIfBody carInfoIfBody);
}

@ -4,17 +4,24 @@ import go.kr.project.biz.common.dto.CommonDto;
import go.kr.project.biz.common.dto.WebClientCallDto;
import go.kr.project.biz.common.repository.CommonQueryDslRepository;
import go.kr.project.biz.common.service.CommonService;
import go.kr.project.domain.entity.CpOwner;
import go.kr.project.domain.repo.cp.CpOwnerRepository;
import go.kr.project.domain.repo.cp.CpSetinfoRepository;
import go.kr.project.vo.mapper.EntityVoMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
@Service
@RequiredArgsConstructor
public class CommonServiceImpl implements CommonService {
private final EntityVoMapper mapper;
private final WebClientCall webClientCall;
private final CpOwnerRepository cpOwnerRepository;
private final CommonQueryDslRepository commonQueryDslRepository;
private final CpSetinfoRepository cpSetinfoRepository;
@ -33,28 +40,46 @@ public class CommonServiceImpl implements CommonService {
//게이트웨이 여부 조회
boolean isGateWay = commonQueryDslRepository.isGateWay();
//게이트웨이가 아니라면 해당 변수에 null이 들어간다.
String pairProjectIp = commonQueryDslRepository.pairProjectIp();
WebClientCallDto.CarInfoResponse resBody = new WebClientCallDto.CarInfoResponse();
//if 게이트웨이라면 자망호출
if(isGateWay) {
resBody = webClientCall.carInfoCall(mmCarno, mmDate);
} else {
//else 게이트웨이 아니라면 페어 프로젝트 호출
String pairProjectIp = commonQueryDslRepository.pairProjectIp();
return webClientCall.carInfoCall(mmCarno, mmDate, pairProjectIp);
}
@Override
@Transactional
public void updateCarInfoFromCpMain(String mmCode, WebClientCallDto.CarInfoResponse.CarInfoIfBody carInfoIfBody) {
// owner 인서트
CpOwner cpOwner = CpOwner.builder()
.omCode(commonQueryDslRepository.findMaxOmCode() + 1)
// .omSggcode()
.omName(carInfoIfBody.getMberNm())
.omNo1(carInfoIfBody.getMberSeNo().substring(0,6))
.omJno(carInfoIfBody.getMberSeNo())
.omNOGb(carInfoIfBody.getMberSeCode())
.omJuso(carInfoIfBody.getUsgsrhldAdresFull())
.omBunji(carInfoIfBody.getOwnerLnbr())
.omZip(carInfoIfBody.getUseStrnghldBuldMainNo())
.omDoroCode(carInfoIfBody.getOwnerRoadNmCode())
.omBldPosition(carInfoIfBody.getUsgsrhldUndgrndBuldSeCode())
.omBldNo1(carInfoIfBody.getUseStrnghldBuldMainNo())
.omBldNo2(carInfoIfBody.getUseStrnghldBuldSubNo())
// .omBldAdmno()
.omIngb(carInfoIfBody.getErsrRegistSeCode())
.omIndt(carInfoIfBody.getTransrRegistDe())
.build();
cpOwnerRepository.save(cpOwner);
}
// main 업데이트
commonQueryDslRepository.updateCarinfoFromCpMain(mmCode, cpOwner, carInfoIfBody);
// main hist 인서트
//결과받아서 후처리
return resBody;
}
}

@ -19,7 +19,7 @@ public class WebClientCall {
private final Environment env;
private final WebClient webClient;
public WebClientCallDto.CarInfoResponse carInfoCall(String mmCarno, String mmDate) {
public WebClientCallDto.CarInfoResponse carInfoCall(String mmCarno, String mmDate, String pairProjectIp) {
WebClientCallDto.CarInfoRequest.BodyWrapper reqBody = WebClientCallDto.CarInfoRequest.BodyWrapper.builder()
@ -44,10 +44,11 @@ public class WebClientCall {
)
.build();
String PROTOCOL = env.getProperty("car-info.protocol");;
String DOMAIN = env.getProperty("car-info.domain");
String PORT = env.getProperty("car-info.port");
String DIR = env.getProperty("car-info.path.basic");
// pair or gateway set
String PROTOCOL = env.getProperty("car-info.protocol");
String DOMAIN = pairProjectIp == null ? env.getProperty("car-info.domain") : pairProjectIp;
String PORT = pairProjectIp == null ? env.getProperty("car-info.port") : "";
String DIR = pairProjectIp == null ? env.getProperty("car-info.path.basic") : "/common/car/info/find.ajax";
Mono<WebClientCallDto.CarInfoResponse> carInfoMono = webClient.post()
.uri(PROTOCOL + DOMAIN + PORT + DIR)

@ -10,14 +10,15 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.*;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
@Slf4j
@ -55,4 +56,18 @@ public class MinwonWaitController {
return ApiResponseUtil.successWithGrid(result, waitDto);
}
@PostMapping("/minwon/wait/waitanswerupdate.ajax")
@ResponseBody
public Map<String, Object> updateWaitAnswer(@RequestBody MinwonWaitDto.Request.cpAnswerasTextUpdate dto) {
Map<String, Object> result = new HashMap<>();
try {
minwonWaitService.answerastextUpdateMybatis(dto);
result.put("status", "success");
} catch (Exception e) {
e.printStackTrace();
result.put("status", "fail");
result.put("message", e.getMessage());
}
return result;
}
}

@ -2,6 +2,7 @@ package go.kr.project.biz.minwon.wait.dto;
import go.kr.project.system.common.model.PagingVO;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@ -14,6 +15,12 @@ public class MinwonWaitDto {
private String mmDlgb;
}
@Data
public static class cpAnswerasTextUpdate {
private String asMmcode;
private String asText;
}
}
public static class Response {
@ -27,7 +34,7 @@ public class MinwonWaitDto {
private String mmSgtel;
private String mmDate;
private String asLimitDt;
private String mmIndt;
private String asJsdate;
private String asJsno;
private String mmCarno;
private String ccCause;

@ -8,4 +8,6 @@ import java.util.List;
@Mapper
public interface MinwonWaitMapper {
List<MinwonWaitDto.Response.cpMainAnswerCancel> findminwonwaitSearchMybatis(MinwonWaitDto.Request.Search waitDto, String searchKeyword);
void answerastextUpdateMybatis(MinwonWaitDto.Request.cpAnswerasTextUpdate dto);
}

@ -8,4 +8,6 @@ import java.util.List;
public interface MinwonWaitService {
List<MinwonWaitDto.Response.cpMainAnswerCancel> findminwonwaitSearchMybatis(MinwonWaitDto.Request.Search waitDto, String searchKeyword);
void answerastextUpdateMybatis(MinwonWaitDto.Request.cpAnswerasTextUpdate dto);
}

@ -12,6 +12,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.util.List;
@Service
@ -37,4 +38,10 @@ public class MinwonWaitServiceImpl implements MinwonWaitService {
return result;
}
@Override
@Transactional
public void answerastextUpdateMybatis(MinwonWaitDto.Request.cpAnswerasTextUpdate dto) {
minwonWaitMapper.answerastextUpdateMybatis(dto);
}
}

@ -13,9 +13,9 @@
, answer.AS_BBS_NO
, main.MM_SGNM
, main.MM_SGTEL
, answer.AS_JSDATE
, main.MM_DATE
, answer.AS_LIMIT_DT
, main.MM_INDT
, answer.AS_JSNO
, main.MM_CARNO
, cancel.CC_CAUSE
@ -34,5 +34,12 @@
</select>
<update id="answerastextUpdateMybatis"
parameterType="go.kr.project.biz.minwon.wait.dto.MinwonWaitDto$Request$cpAnswerasTextUpdate">
UPDATE cp_answer
SET AS_TEXT = #{asText},
AS_STATE_DT = DATE_FORMAT(NOW(), '%Y%m%d%H%i%s')
WHERE AS_MMCODE = #{asMmcode}
</update>
</mapper>

@ -147,7 +147,7 @@
<div class="field-group">
<div class="lbl">시군구</div>
<div class="fld">
<input type="text" name="cpAnswer" data-field="asJsno" id="asJsno" value="" readonly>
<input type="text" name="cpAnswer" data-field="" id="" value="" readonly>
</div>
</div>
<div class="field-group">
@ -237,7 +237,7 @@
<div class="field-group">
<div class="lbl">소유주</div>
<div class="fld">
<input type="text" data-field="" value="" >
<input type="text" data-field="MBER_NM" id="MBER_NM" value="" >
</div>
</div>
<div class="field-group">
@ -253,13 +253,13 @@
<div class="field-group">
<div class="lbl">주민번호</div>
<div class="fld">
<input type="text" data-field="" value="" >
<input type="text" data-field="MBER_SE_NO" id="MBER_SE_NO" value="" >
</div>
</div>
<div class="field-group">
<div class="lbl">우편번호</div>
<div class="fld">
<input type="text" data-field="" value="" >
<input type="text" data-field="USE_STRNGHLD_BULD_MAIN_NO" id ="USE_STRNGHLD_BULD_MAIN_NO" value="" >
</div>
</div>
</div>
@ -269,7 +269,7 @@
<div class="field-group full">
<div class="lbl">주소</div>
<div class="fld">
<input type="text" data-field="" value="" >
<input type="text" data-field="USE_STRNGHLD_ADRES_NM" id="USE_STRNGHLD_ADRES_NM" value="" >
</div>
</div>
</div>
@ -279,13 +279,13 @@
<div class="field-group">
<div class="lbl">번지</div>
<div class="fld">
<input type="text" data-field="" value="" >
<input type="text" data-field="USE_STRNGHLD_LNBR" id="USE_STRNGHLD_LNBR" value="" >
</div>
</div>
<div class="field-group">
<div class="lbl">차대번호</div>
<div class="fld">
<input type="text" data-field="" value="" >
<input type="text" data-field="VIN" id="VIN" value="" >
</div>
</div>
</div>
@ -295,7 +295,7 @@
<div class="field-group">
<div class="lbl">도로코드</div>
<div class="fld">
<input type="text" data-field="" value="" >
<input type="text" data-field="USE_STRNGHLD_ROAD_NM_CODE" id="USE_STRNGHLD_ROAD_NM_CODE" value="" >
</div>
</div>
<div class="field-group empty"></div>
@ -320,16 +320,21 @@
</div>
</div>
<div id="btn-area">
<button type="button" class="btn btn-light" name="changeSt" id="non-target" value="81">미부과처리</button>
<button type="button" class="btn btn-light" name="changeSt" id="guide" value="">계도처리</button>
<button type="button" class="btn btn-light" name="changeSt" id="return" value="">회수처리</button>
<button type="button" class="btn btn-light" name="changeSt" id="copy" value="">자료복사</button>
<button type="button" class="btn btn-light" id="delay">처리보류</button>
<button type="button" class="btn btn-light" id="init">되돌리기</button>
<button type="button" class="btn btn-light" id="lavyTarget">되돌리기</button>
<button type="button" class="btn btn-light" id="stateChange" hidden>처리상태 변경</button>
<div class="left btn btn-light">
<div class="btn-align">
<div class="align-left">
<button type="button" class="btn btn-light" name="changeSt" id="non-target" value="81">미부과처리</button>
<button type="button" class="btn btn-light" name="changeSt" id="guide" value="">계도처리</button>
<button type="button" class="btn btn-light" name="changeSt" id="return" value="">회수처리</button>
<button type="button" class="btn btn-light" name="changeSt" id="copy" value="">자료복사</button>
<button type="button" class="btn btn-light" id="delay">처리보류</button>
<button type="button" class="btn btn-light" id="init">되돌리기</button>
<button type="button" class="btn btn-light" id="lavyTarget">되돌리기</button>
</div>
<div class="align-right">
<button type="button" class="btn btn-light" id="save" value="21">저장</button>
</div>
</div>
</div>
</div>
@ -350,6 +355,10 @@
<%--<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>--%>
<%--<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js"></script>--%>
<script type="text/javascript">
let CAR_INFO_YN = false;
let CAR_INFO = {};
window.INIT_POP_API = {
search: () => {
const { cursor, mmCodes } = JSON.parse(localStorage.getItem("TOTAL_INFO_STATE"));
@ -379,7 +388,7 @@
$("#asState").val(response.data.cpAnswer.asState);
$("#asStateDt").val(response.data.cpAnswer.asStateDt);
$("#asCell").val(response.data.cpAnswer.asCell);
$("#asJsno").val(response.data.cpAnswer.asJsno);
// $("#asJsno").val(response.data.cpAnswer.asJsno);
$("#asJsdate").val(response.data.cpAnswer.asJsdate);
$("#asLimitDt").val(response.data.cpAnswer.asLimitDt);
@ -474,9 +483,22 @@
alert("조회결과가 없습니다.")
return;
};
$("#MTRS_FOM_NM").val(response.record[0].MTRS_FOM_NM)
$("#CNM").val(response.record[0].CNM)
$("#COLOR_NM").val(response.record[0].COLOR_NM)
$("#MTRS_FOM_NM").val(response.record[0].MTRS_FOM_NM);
$("#CNM").val(response.record[0].CNM);
$("#COLOR_NM").val(response.record[0].COLOR_NM);
$("#MBER_NM").val(response.record[0].MBER_NM);
$("#MBER_SE_NO").val(response.record[0].MBER_SE_NO);
$("#USE_STRNGHLD_ADRES_NM").val(response.record[0].USE_STRNGHLD_ADRES_NM);
$("#USE_STRNGHLD_BULD_MAIN_NO").val(response.record[0].USE_STRNGHLD_BULD_MAIN_NO);
$("#VIN").val(response.record[0].VIN);
$("#USE_STRNGHLD_LNBR").val(response.record[0].USE_STRNGHLD_LNBR);
$("#USE_STRNGHLD_ROAD_NM_CODE").val(response.record[0].USE_STRNGHLD_ROAD_NM_CODE);
CAR_INFO = true;
},
error: function(xhr, status, error) {
$("#result").text("조회 실패");
@ -506,6 +528,10 @@
},
saveOnwer: () => {
},
changeState: (e) => {
let state = e.target.value;
const { cursor, mmCodes } = JSON.parse(localStorage.getItem("TOTAL_INFO_STATE"));
@ -590,6 +616,27 @@
})
/** 저장 */
$("#save").on("click", (e) => {
//차량번호 유무 확인
if(!CAR_INFO) {
alert("차량조회가 필요합니다.")
return false;
}
// 오너 테이블 인서트
// 차량조회가 완료되었으면 스테이트 변경
fnBiz.changeState()
})
}
}

@ -60,7 +60,10 @@
</div>
</div>
</div>
<div id="popupDiv" style="display:none;">
<!-- 민원 내용 보기 -->
<div id="popup_Minwon_View_Div" style="display:none;">
<ul style="background-color:rgb(173,216,115); border-style:solid; border-width:1px; width:100%; height:60px">
<table style="width:100%; height:60px;">
<tr>
@ -76,15 +79,15 @@
<tr style="width:100%; height:50%;">
<td style="width: 50px;">&nbsp;</td>
<td style="width: 60px; font-size:12px; text-align:right;">목록번호&nbsp;&nbsp;</td>
<td style="width:140px;">
<td style="width:200px;">
<input type="text" name="m_BbsNo" id="m_BbsNo" style="width:140px; height:20px; font-size:13px; border-style:none;" readonly>
</td>
<td style="width: 60px; font-size:12px; text-align:right;">신청자&nbsp;&nbsp;</td>
<td style="width:140px;">
<td style="width:200px;">
<input type="text" name="m_Sgnm" id="m_Sgnm" style="width:140px; height:20px; font-size:13px; border-style:none;" readonly>
</td>
<td style="width: 60px; font-size:12px; text-align:right;">전화번호&nbsp;&nbsp;</td>
<td style="width:140px;">
<td style="width:200px;">
<input type="text" name="m_Tel" id="m_Tel" style="width:140px; height:20px; font-size:13px; border-style:none;" readonly>
</td>
<td style="width: 50px;">&nbsp;</td>
@ -110,7 +113,58 @@
<ul style="border-style:solid; border-width:1px; width:100%; height:400px;" >
<textarea id="minwon_view" name="minwon_view" style="font-size:12px; width:100%; height:100%; border-style:none;" readonly></textarea>
</ul>
<ul style="background-color:rgb(226,230,233); border-style:solid; border-width:1px; height:30px;" >
<table style="width:100%; height:100%;">
<tr style="height:100%;">
<td style="width: 50px;">&nbsp;</td>
<td style="width: 60px; height:100%; text-align:right; font-size:12px;">접수경로&nbsp;&nbsp;</td>
<td style="width:790px;">
<input type="text" name="m_Ingb" id="m_Ingb" style="width:140px; height:20px; background-color:rgb(239,248,139); font-size:13px; border-style:none;" readonly>
</td>
</tr>
</table>
</ul>
</div>
<!-- 민원 내용 보기 끝-->
<!-- 답변 미리보기 -->
<div id="popup_Answer_Preview_Div" id="popup_Minwon_View_Div" style="display:none;">
<ul style="background-color:rgb(173,216,115); border-style:solid; border-width:1px; width:100%; height:60px">
<table style="width:100%; height:60px;">
<tr>
<td id="variable_td" style="width:80%; height:100%; text-align:center; font-weight: bold; font-size:20px">민원 답변내용</td>
<td style="width:20%; text-align:center;">
<button type="button" id="preview_close_btn" class="newbtnss bg1">닫기</button>
<input type="hidden" id="preview_mmCode" name="preview_mmCode" value="">
</td>
</tr>
</table>
</ul>
<ul style="background-color:rgb(226,230,233); border-style:solid; border-width:1px; width:100%; height:20px; font-size:14px;">민원내용</ul>
<ul style="border-style:solid; border-width:1px; width:100%; height:240px;">
<textarea id="preview_minwon_mmText" name="preview_minwon_mmText" style="font-size:12px; width:100%; height:100%; border-style:none;" readonly></textarea>
</ul>
<ul style="background-color:rgb(226,230,233); border-style:solid; border-width:1px; width:100%; height:20px; font-size:14px;">
답변내용
</ul>
<ul style="border-style:solid; border-width:1px; width:100%; height:240px;">
<textarea id="preview_answer_asText" name="preview_answer_asText" maxlength="1000" style="font-size:12px; width:100%; height:100%; border-style:none;"></textarea>
</ul>
<ul style="background-color:rgb(226,230,233); border-style:none; border-width:1px; width:100%; height:50px">
<table style="width:100%; height:100%;">
<tr style="height:100%;">
<td style="width: 50px;">&nbsp;</td>
<td style="width:200px; height:100%; text-align:left; font-size:13px;">변경 할 내용이 있으면 수정하시오.</td>
<td style="width:150px;">
<button type="button" id="answer_save_btn" class="newbtnss bg1">내용 수정</button>
</td>
</tr>
</table>
</ul>
</div>
<!-- 답변 미리보기 끝 -->
<!-- /Main body -->
<script type="text/javascript">
@ -131,6 +185,9 @@
let selectRow_Jsno = null;
let selectRow_mmText = null;
let selectRow_asText = null;
let selectRow_asIngb = null;
let dataRow = null;
// 검색정보 셋팅
let setSearchCond = function() {
@ -141,7 +198,6 @@
const fnBiz = {
init: () => {
initGrid();
},
@ -184,7 +240,7 @@
{header: '번호', name: 'asBbsNo', sortable: true, width: 50,},
{header: '신고자', name: 'mmSgnm', sortable: true, width: 80,},
{header: '전화번호', name: 'asTel', width: 100,},
{header: '접수일자', name: 'mmDate', sortable: true, width: 70,},
{header: '접수일자', name: 'asJsdate', sortable: true, width: 70,},
{header: '처리기한', name: 'asLimitDt', sortable: true, width: 70,},
{header: '위반일자', name: 'mmDate', sortable: true, width: 120,},
{header: '접수번호', name: 'asJsno', sortable: true, width: 150,},
@ -215,7 +271,7 @@
const gridOptions = {
el: 'grid',
rowHeaders: ['checkbox'],
rowHeaders: [{ type: 'rowNum', header: 'NO' }],
columns: gridColumns,
noData: "조회된 대기자료가 없습니다.",
pageOptions: {
@ -225,7 +281,6 @@
};
GRID = TuiGrid.of(gridOptions, gridDatasource, (res) => {
GRID.on("dblclick", (e) => {
var popUrl = '/total/info.do';
var popTitle = "TotaInfo";
@ -250,13 +305,25 @@
});
GRID.on("click", (e) => {
selectRow_mmCode = null;
selectRow_BbsNo = null;
selectRow_Sgnm = null;
selectRow_Tel = null;
selectRow_Jsdate = null;
selectRow_LimitDt = null;
selectRow_Jsno = null;
selectRow_asIngb = null;
selectRow_mmText = null;
selectRow_asText = null;
selectRow_mmCode = e.instance.getValue(e.rowKey, 'mmCode');
selectRow_BbsNo = e.instance.getValue(e.rowKey, 'asBbsNo');
selectRow_Sgnm = e.instance.getValue(e.rowKey, 'mmSgnm');
selectRow_Tel = e.instance.getValue(e.rowKey, 'asTel');
selectRow_Jsdate = e.instance.getValue(e.rowKey, 'mmDate');
selectRow_Jsdate = e.instance.getValue(e.rowKey, 'asJsdate');
selectRow_LimitDt = e.instance.getValue(e.rowKey, 'asLimitDt');
selectRow_Jsno = e.instance.getValue(e.rowKey, 'asJsno');
selectRow_asIngb = e.instance.getValue(e.rowKey, 'asIngb');
selectRow_mmText = e.instance.getValue(e.rowKey, 'mmText');
selectRow_asText = e.instance.getValue(e.rowKey, 'asText');
});
@ -266,10 +333,8 @@
// 레디펑션
$(function () {
fnBiz.init();
fnBiz.eventListener();
});
$('#view_btn').on('click', function() {
@ -281,28 +346,64 @@
document.getElementById('m_LimitDt').value = selectRow_LimitDt;
document.getElementById('m_Jsno').value = selectRow_Jsno;
document.getElementById('minwon_view').value = selectRow_mmText;
document.getElementById('m_Ingb').value = selectRow_asIngb;
var popupDiv = document.getElementById('popupDiv');
popupDiv.style = 'display:inline-block; position:absolute; top:200px; left:350px; z-index:999999; background-color:rgb(226,230,233); width:900px; height:400px;';
var popup_Minwon_View_Div = document.getElementById('popup_Minwon_View_Div');
popup_Minwon_View_Div.style = 'display:inline-block; position:absolute; top:100px; left:350px; z-index:999999; background-color:rgb(226,230,233); width:900px; height:400px;';
}
});
$('#view_close_btn').on('click', function() {
var popupDiv = document.getElementById('popupDiv');
popupDiv.style = 'display:none;';
var popup_Minwon_View_Div = document.getElementById('popup_Minwon_View_Div');
popup_Minwon_View_Div.style = 'display:none;';
});
$('#preview_btn').on('click', function() {
if (selectRow_mmCode != null && selectRow_mmCode != '') {
document.getElementById('variable_td').innerHTML = '민원 답변내용 (' + selectRow_Jsno + ')';
document.getElementById('preview_mmCode').value = selectRow_mmCode;
document.getElementById('preview_minwon_mmText').value = selectRow_mmText;
document.getElementById('preview_answer_asText').value = selectRow_asText;
var popup_Answer_Preview_Div = document.getElementById('popup_Answer_Preview_Div');
popup_Answer_Preview_Div.style = 'display:inline-block; position:absolute; top:100px; left:350px; z-index:999999; background-color:rgb(226,230,233); width:900px; height:400px;';;
}
});
$('#preview_btn').on('click', function() {
alert('답변내용 미리보기 클릭')
/*
const popUrl = '${pageContext.request.contextPath}/minwon/dayanswer/dayanswerregister.do';
const popTitle = '자료 등록';
const popOption = 'width=700,height=600,resizable=yes,scrollbars=yes';
window.open(popUrl, popTitle, popOption);
*/
$('#preview_close_btn').on('click', function() {
var popup_Answer_Preview_Div = document.getElementById('popup_Answer_Preview_Div');
popup_Answer_Preview_Div.style = 'display:none;';
});
$('#answer_save_btn').on('click', function() {
if (confirm('답변 내용을 저장 하시겠습니까?')){
var answer_save_Data = {
asMmcode: $('#preview_mmCode').val(),
asText: $('#preview_answer_asText').val()
};
$.ajax(
{
url: '/minwon/wait/waitanswerupdate.ajax',
type: 'POST',
contentType: 'application/json; charset=UTF-8',
data: JSON.stringify(answer_save_Data),
success: function (data) {
document.getElementById('search_btn').click();
document.getElementById('preview_close_btn').click();
alert('답변 내용이 수정 되였습니다.');
},
error: function (data) {
console.log('답변 수정 실패 : ', data.responseText);
alert('답변 수정에 실패하였습니다.')
}
}
)
} else {
alert('저장을 취소했습니다.');
}
});
</script>

@ -372,3 +372,27 @@
/** totalInfo End */
/** btn area */
.btn-align {display: flex; width: 100%}
.btn-align > .align-left {display: flex; justify-content: flex-start;}
.btn-align > .align-center {display: flex; justify-content: center;}
.btn-align > .align-right {display: flex; justify-content: flex-end; margin-left: auto;}
/** 정렬 common start */
.btn-align-left {
text-align: left;
}
.btn-align-right {
text-align: right;
}
/** 정렬 common end */

@ -0,0 +1,54 @@
package go.kr.project.domain.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Entity
@Table(name = "cp_mainhist")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CpMainhist {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MH_CODE", columnDefinition = "bigint unsigned")
private Long mhCode;
// CP_MAIN.MM_CODE
@Column(name = "MH_MMCODE", length = 16)
private String mhMmcode;
// 이전 상태
@Column(name = "MH_STATE_OLD", length = 2)
private String mhStateOld;
// 변경 후 상태
@Column(name = "MH_STATE_NEW", length = 2)
private String mhStateNew;
// 이전 상태 일시 (YYYYMMDDHH24MISS)
@Column(name = "MH_STATE_OLD_DT", length = 14)
private String mhStateOldDt;
// 사용 여부
@Column(name = "MH_ENABLE", length = 1)
private String mhEnable;
// 비고
@Column(name = "MH_ETC", length = 50)
private String mhEtc;
// 등록일시 (YYYYMMDDHH24MISS)
@Column(name = "MH_INDT", length = 14)
private String mhIndt;
// 등록자
@Column(name = "MH_INUSER")
private Integer mhInuser;
}

@ -0,0 +1,55 @@
package go.kr.project.domain.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Entity
@Table(name = "cp_mainhist")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CpMainhist {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CRDN_LOG_ID", columnDefinition = "bigint unsigned")
private Long mhCode;
// CP_MAIN.MM_CODE
@Column(name = "CRDN_ID", length = 16)
private String mhMmcode;
// 이전 상태
@Column(name = "BFR_PRCS_STTS", length = 2)
private String mhStateOld;
// 변경 후 상태
@Column(name = "CHG_PRCS_STTS", length = 2)
private String mhStateNew;
// 이전 상태 일시 (YYYYMMDDHH24MISS)
@Column(name = "BFR_REG_DT", length = 14)
private String mhStateOldDt;
// 사용 여부
@Column(name = "USE_YN", length = 1)
private String mhEnable;
// 비고
@Column(name = "EXCPTNMTTR", length = 50)
private String mhEtc;
// 등록일시 (YYYYMMDDHH24MISS)
@Column(name = "REG_DT", length = 14)
private String mhIndt;
// 등록자
@Column(name = "PIC_CD")
private Integer mhInuser;
}

@ -0,0 +1,7 @@
package go.kr.project.domain.repo.cp;
import go.kr.project.domain.entity.CpOwner;
import org.springframework.data.jpa.repository.JpaRepository;
public interface CpOwnerRepository extends JpaRepository<CpOwner, String> {
}

@ -0,0 +1,7 @@
package go.kr.project.domain.repo.cp;
import go.kr.project.domain.entity.CpOwner;
import org.springframework.data.jpa.repository.JpaRepository;
public interface CpOwnerRepository extends JpaRepository<CpOwner, String> {
}
Loading…
Cancel
Save