diff --git a/src/main/doc/db/jcms_vpp_0.0.1.exerd b/src/main/doc/db/jcms_vpp_0.0.1.exerd index ba3f63c..60b237b 100644 Binary files a/src/main/doc/db/jcms_vpp_0.0.1.exerd and b/src/main/doc/db/jcms_vpp_0.0.1.exerd differ diff --git a/src/main/doc/db/jcms_vpp_0.0.2.exerd b/src/main/doc/db/jcms_vpp_0.0.2.exerd new file mode 100644 index 0000000..7f31955 Binary files /dev/null and b/src/main/doc/db/jcms_vpp_0.0.2.exerd differ diff --git a/src/main/doc/db/jcms_vpp_0.0.3.exerd b/src/main/doc/db/jcms_vpp_0.0.3.exerd new file mode 100644 index 0000000..32ee19b Binary files /dev/null and b/src/main/doc/db/jcms_vpp_0.0.3.exerd differ diff --git a/src/main/doc/db/jcms_vpp_0.0.4.exerd b/src/main/doc/db/jcms_vpp_0.0.4.exerd new file mode 100644 index 0000000..9656b05 Binary files /dev/null and b/src/main/doc/db/jcms_vpp_0.0.4.exerd differ diff --git a/src/main/java/net/jwsi/jcms/vpp/api/ApiClient.java b/src/main/java/net/jwsi/jcms/vpp/api/ApiClient.java index 96237e3..2ac3376 100644 --- a/src/main/java/net/jwsi/jcms/vpp/api/ApiClient.java +++ b/src/main/java/net/jwsi/jcms/vpp/api/ApiClient.java @@ -1,7 +1,8 @@ package net.jwsi.jcms.vpp.api; import lombok.RequiredArgsConstructor; -import net.jwsi.jcms.vpp.charger.ChgrResponseDto; +import net.jwsi.jcms.vpp.chgr.ChgrResponseDto; +import net.jwsi.jcms.vpp.chgrHist.ChgrHistResponseDto; import net.jwsi.jcms.vpp.provider.ProviderDto; import net.jwsi.jcms.vpp.station.StationDto; import org.springframework.core.ParameterizedTypeReference; @@ -12,6 +13,7 @@ import org.springframework.web.util.UriComponentsBuilder; import java.net.URI; import java.util.Collections; import java.util.List; +import java.util.Map; @Component @RequiredArgsConstructor @@ -59,4 +61,22 @@ public class ApiClient { .retrieve() .body(new ParameterizedTypeReference>>() {}); } + public ApiResponse> fetchChgrHist(String baseUrl, String token) { + URI uri = UriComponentsBuilder.fromUriString(baseUrl) + .path("/api/charge/hist") + .build() + .toUri(); + + Map requestBody = Map.of( + "startDt", "2026-07-29", + "pageSize","50" + ); + + return restClient.post() + .uri(uri) + .header("Authorization", "Bearer " + token) + .body(requestBody) + .retrieve() + .body(new ParameterizedTypeReference>>() {}); + } } \ No newline at end of file diff --git a/src/main/java/net/jwsi/jcms/vpp/api/RestClientConfig.java b/src/main/java/net/jwsi/jcms/vpp/api/RestClientConfig.java index 9a90cbd..e131163 100644 --- a/src/main/java/net/jwsi/jcms/vpp/api/RestClientConfig.java +++ b/src/main/java/net/jwsi/jcms/vpp/api/RestClientConfig.java @@ -14,7 +14,7 @@ public class RestClientConfig { public RestClient restClient() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setConnectTimeout((int) Duration.ofSeconds(5).toMillis()); - factory.setReadTimeout((int) Duration.ofSeconds(10).toMillis()); + factory.setReadTimeout((int) Duration.ofSeconds(30).toMillis()); return RestClient.builder() .requestFactory(factory) diff --git a/src/main/java/net/jwsi/jcms/vpp/charger/Chgr.java b/src/main/java/net/jwsi/jcms/vpp/chgr/Chgr.java similarity index 95% rename from src/main/java/net/jwsi/jcms/vpp/charger/Chgr.java rename to src/main/java/net/jwsi/jcms/vpp/chgr/Chgr.java index 78faa66..1c8ebe3 100644 --- a/src/main/java/net/jwsi/jcms/vpp/charger/Chgr.java +++ b/src/main/java/net/jwsi/jcms/vpp/chgr/Chgr.java @@ -1,4 +1,4 @@ -package net.jwsi.jcms.vpp.charger; +package net.jwsi.jcms.vpp.chgr; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/src/main/java/net/jwsi/jcms/vpp/charger/ChgrController.java b/src/main/java/net/jwsi/jcms/vpp/chgr/ChgrController.java similarity index 98% rename from src/main/java/net/jwsi/jcms/vpp/charger/ChgrController.java rename to src/main/java/net/jwsi/jcms/vpp/chgr/ChgrController.java index decdb85..ba9bd82 100644 --- a/src/main/java/net/jwsi/jcms/vpp/charger/ChgrController.java +++ b/src/main/java/net/jwsi/jcms/vpp/chgr/ChgrController.java @@ -1,4 +1,4 @@ -package net.jwsi.jcms.vpp.charger; +package net.jwsi.jcms.vpp.chgr; import lombok.extern.slf4j.Slf4j; import net.jwsi.jcms.base.BaseController; diff --git a/src/main/java/net/jwsi/jcms/vpp/charger/ChgrRepository.java b/src/main/java/net/jwsi/jcms/vpp/chgr/ChgrRepository.java similarity index 84% rename from src/main/java/net/jwsi/jcms/vpp/charger/ChgrRepository.java rename to src/main/java/net/jwsi/jcms/vpp/chgr/ChgrRepository.java index 32d9972..4dfbb2d 100644 --- a/src/main/java/net/jwsi/jcms/vpp/charger/ChgrRepository.java +++ b/src/main/java/net/jwsi/jcms/vpp/chgr/ChgrRepository.java @@ -1,4 +1,4 @@ -package net.jwsi.jcms.vpp.charger; +package net.jwsi.jcms.vpp.chgr; import net.jwsi.jcms.base.BaseRecStRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/net/jwsi/jcms/vpp/charger/ChgrResponseDto.java b/src/main/java/net/jwsi/jcms/vpp/chgr/ChgrResponseDto.java similarity index 96% rename from src/main/java/net/jwsi/jcms/vpp/charger/ChgrResponseDto.java rename to src/main/java/net/jwsi/jcms/vpp/chgr/ChgrResponseDto.java index 1eb8eb7..812ac7f 100644 --- a/src/main/java/net/jwsi/jcms/vpp/charger/ChgrResponseDto.java +++ b/src/main/java/net/jwsi/jcms/vpp/chgr/ChgrResponseDto.java @@ -1,4 +1,4 @@ -package net.jwsi.jcms.vpp.charger; +package net.jwsi.jcms.vpp.chgr; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/net/jwsi/jcms/vpp/charger/ChgrService.java b/src/main/java/net/jwsi/jcms/vpp/chgr/ChgrService.java similarity index 98% rename from src/main/java/net/jwsi/jcms/vpp/charger/ChgrService.java rename to src/main/java/net/jwsi/jcms/vpp/chgr/ChgrService.java index 2039473..4294408 100644 --- a/src/main/java/net/jwsi/jcms/vpp/charger/ChgrService.java +++ b/src/main/java/net/jwsi/jcms/vpp/chgr/ChgrService.java @@ -1,4 +1,4 @@ -package net.jwsi.jcms.vpp.charger; +package net.jwsi.jcms.vpp.chgr; import jakarta.transaction.Transactional; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/net/jwsi/jcms/vpp/charger/ChgrSpecification.java b/src/main/java/net/jwsi/jcms/vpp/chgr/ChgrSpecification.java similarity index 50% rename from src/main/java/net/jwsi/jcms/vpp/charger/ChgrSpecification.java rename to src/main/java/net/jwsi/jcms/vpp/chgr/ChgrSpecification.java index 5e55146..039cc82 100644 --- a/src/main/java/net/jwsi/jcms/vpp/charger/ChgrSpecification.java +++ b/src/main/java/net/jwsi/jcms/vpp/chgr/ChgrSpecification.java @@ -1,4 +1,4 @@ -package net.jwsi.jcms.vpp.charger; +package net.jwsi.jcms.vpp.chgr; public class ChgrSpecification { } diff --git a/src/main/java/net/jwsi/jcms/vpp/chgrHist/ChgrHist.java b/src/main/java/net/jwsi/jcms/vpp/chgrHist/ChgrHist.java new file mode 100644 index 0000000..a2796ea --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/chgrHist/ChgrHist.java @@ -0,0 +1,51 @@ +package net.jwsi.jcms.vpp.chgrHist; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import net.jwsi.jcms.base.BaseStEntity; + +@NoArgsConstructor +@Setter +@Getter +@ToString +@Entity(name="vpp_chgr_hist") +public class ChgrHist extends BaseStEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "CHGR_HIST_ID") + private Integer chgrHistId; // 충전이력 id + + @Column(name = "CHGR_ID", nullable = false) + private String chgrId; // 충전기 id + + @Column(name = "ST_ID", nullable = false) + private String stId; // 충전소 id + + @Column(name = "PAY_TP") + private String payTp; // 결제구분 + + @Column(name = "PLUG_TP") + private String plugTp; // 충전기타입 코드 + + @Column(name = "RECHG_S_DT") + private String rechgSDt; // 충전 시작일시 (rechgsdt -> RECHG_S_DT 매핑) + + @Column(name = "RECHG_E_DT") + private String rechgEDt; // 충전 종료일시 (rechgedt -> RECHG_E_DT 매핑) + + @Column(name = "RECHG_TIME") + private String rechgTime; // 충전시간 + + @Column(name = "RECH_GWH") + private Integer rechGwh; // 충전량 + + @Column(name = "RECHG_AMT") + private Integer rechgAmt; // 충전금액 + + @Column(name = "PAY_FNSH") + private String payFnsh; // 신용결제완료구분 +} \ No newline at end of file diff --git a/src/main/java/net/jwsi/jcms/vpp/chgrHist/ChgrHistController.java b/src/main/java/net/jwsi/jcms/vpp/chgrHist/ChgrHistController.java new file mode 100644 index 0000000..5c6027f --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/chgrHist/ChgrHistController.java @@ -0,0 +1,64 @@ +package net.jwsi.jcms.vpp.chgrHist; + +import lombok.extern.slf4j.Slf4j; +import net.jwsi.jcms.base.BaseController; +import net.jwsi.jcms.exception.JsonDataException; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +@Controller +@RequestMapping("/cms/chgrHist") +@Slf4j +public class ChgrHistController extends BaseController { + + private final String path = "/system/chgrHist/"; + private final ChgrHistService chgrHistService; + public ChgrHistController(ChgrHistService service, ChgrHistService chgrHistService) { + super(service); + this.chgrHistService = chgrHistService; + } + + @GetMapping("list") + public String list() throws IllegalAccessException { + return path+"list"; + } + + @PostMapping("list.json") + @ResponseBody + public Map list(ChgrHist chgrHist){ + return svcSelectList(chgrHist); + } + @PostMapping("insert.json") + @ResponseBody + public Map insert(ChgrHist chgrHist){ + return svcInsert(chgrHist); + } + @PostMapping("delete.json") + @ResponseBody + public Map delete(ChgrHist chgrHist){ + return svcDelete(chgrHist.getChgrHistId()); + } + @PostMapping("update.json") + @ResponseBody + public Map update(ChgrHist chgrHist){ + return svcUpdate(chgrHist); + } + @PostMapping("view.json") + @ResponseBody + public Map view(ChgrHist chgrHist){ + return svcSelectOne(chgrHist); + } + + @Override + protected void chkSelectList(List list) throws JsonDataException { + + } + + @Override + protected void chkSelect(ChgrHist data) throws JsonDataException { + + } +} diff --git a/src/main/java/net/jwsi/jcms/vpp/chgrHist/ChgrHistRepository.java b/src/main/java/net/jwsi/jcms/vpp/chgrHist/ChgrHistRepository.java new file mode 100644 index 0000000..a380f71 --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/chgrHist/ChgrHistRepository.java @@ -0,0 +1,8 @@ +package net.jwsi.jcms.vpp.chgrHist; + +import net.jwsi.jcms.base.BaseRecStRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ChgrHistRepository extends BaseRecStRepository { +} diff --git a/src/main/java/net/jwsi/jcms/vpp/chgrHist/ChgrHistResponseDto.java b/src/main/java/net/jwsi/jcms/vpp/chgrHist/ChgrHistResponseDto.java new file mode 100644 index 0000000..346951a --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/chgrHist/ChgrHistResponseDto.java @@ -0,0 +1,57 @@ +package net.jwsi.jcms.vpp.chgrHist; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ChgrHistResponseDto { + + private String providerId; // 충전사업자 ID (Length: 2) + private String stId; // 충전소 ID (Length: 6) + private String chgrId; // 충전기 ID (Length: 2) + private String speedTp; // 충전 속도 (급속, 완속) + private Integer chId; // 채널 ID + private String plugType; // 플러그 타입 + private String memAuthInputNo; // 회원카드번호 (Length: 16) + + private String creditPPayTrxNo; // 선결제 관련 신용카드 승인번호 (Length: 20) + private String creditPPayTrxDt; // 선결제 관련 신용카드 승인일시 (yyyy-MM-dd HH:mm:ss) + + private String rechgSdt; // 충전 시작일시 (yyyy-MM-dd HH:mm:ss) + private String rechgEdt; // 충전 종료일시 (yyyy-MM-dd HH:mm:ss) + private String rechgTime; // 충전시간 (Length: 10) + + private Integer rechgWh; // 충전량(wh) + private Integer rechgDemandAmt; // 선결제 금액 + private Integer rechgAmt; // 충전 금액 + private Integer cancelAmt; // 취소 금액 + + private String payType; // 결제 타입 (회원카드, 신용카드, 무과금) + private String rechgFnshTp; // 충전 완료 구분 + private String payFnsh; // 결제 완료 구분 (결제완료, 결제실패, 기타결제, 알수없음) + @JsonProperty("IntegratedWh") + private JsonNode integratedWh; + private Double dcPowerWh; // DC 적산량(wh) + private Double acPowerWh; // AC 적산량(wh) + + + public ChgrHist toEntity() { + ChgrHist chgrHist = new ChgrHist(); + chgrHist.setChgrId(this.chgrId); + chgrHist.setStId(this.stId); + chgrHist.setPayTp(this.payType); + chgrHist.setPlugTp(this.plugType); + chgrHist.setRechgSDt(this.rechgSdt); + chgrHist.setRechgEDt(this.rechgEdt); + chgrHist.setRechgTime(this.rechgTime); + chgrHist.setRechgAmt(this.rechgAmt); + chgrHist.setPayFnsh(this.payFnsh); + chgrHist.setRechGwh(this.rechgWh); + return chgrHist; + } +} \ No newline at end of file diff --git a/src/main/java/net/jwsi/jcms/vpp/chgrHist/ChgrHistService.java b/src/main/java/net/jwsi/jcms/vpp/chgrHist/ChgrHistService.java new file mode 100644 index 0000000..abd745e --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/chgrHist/ChgrHistService.java @@ -0,0 +1,103 @@ +package net.jwsi.jcms.vpp.chgrHist; + +import jakarta.transaction.Transactional; +import lombok.extern.slf4j.Slf4j; +import net.jwsi.jcms.base.BaseService; +import net.jwsi.jcms.base.EnumSqlType; +import net.jwsi.jcms.utils.HttpUtil; +import net.jwsi.jcms.utils.LoginUtil; +import net.jwsi.jcms.vpp.api.ApiClient; +import net.jwsi.jcms.vpp.api.ApiResponse; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Page; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@Service +public class ChgrHistService extends BaseService { + + + private final ApiClient apiClient; + @Value("${jcms.api.base-url}") + private String baseUrl; + + @Value("${jcms.api.token}") + private String apiToken; + + public ChgrHistService(ChgrHistRepository repository, ApiClient apiClient) { + super(repository); + this.apiClient = apiClient; + } + + @Transactional + @Scheduled(cron = "0 */10 * * * *") + public void getChgrHist() throws IllegalAccessException { + ApiResponse> response = apiClient.fetchChgrHist(baseUrl, apiToken); + + if (response == null || !Integer.valueOf(200).equals(response.getCode())) { + String msg = (response != null) ? response.getMessage() : "응답 없음"; + throw new RuntimeException("API 호출 실패: " + msg); + } + + List dtoList = response.getData(); + if (dtoList == null || dtoList.isEmpty()) { + log.info("가져온 충전소 데이터가 없습니다."); + } + + List entityList = dtoList.stream() + .map(ChgrHistResponseDto::toEntity) + .toList(); + + List updateList = new ArrayList<>(); + for (ChgrHist h : entityList) { + update(h); + updateList.add(h); + } + + log.info("총 {}건의 충전소 데이터가 DB에 동기화되었습니다.", updateList.size()); + + } + + @Override + protected Integer getUserId() { + return HttpUtil.getUserId(); + } + + @Override + protected String getUserName(Integer id) { + return LoginUtil.getUserName(id); + } + + @Override + protected ChgrHist newSearchParam(ChgrHist chgrHist) { + if (chgrHist == null) { + chgrHist = new ChgrHist(); + } + return chgrHist; + } + + @Override + protected EnumSqlType useSqlTyp() { + return EnumSqlType.SPECIFICATION; + } + + @Override + protected Specification getSpecification(ChgrHist chgrHist) { + return null; + } + + @Override + protected Page _selectPage(ChgrHist chgrHist) { + return null; + } + + @Override + protected List _selectList(ChgrHist chgrHist) { + return null; + } +} diff --git a/src/main/java/net/jwsi/jcms/vpp/station/Station.java b/src/main/java/net/jwsi/jcms/vpp/station/Station.java index 11ce609..cde0010 100644 --- a/src/main/java/net/jwsi/jcms/vpp/station/Station.java +++ b/src/main/java/net/jwsi/jcms/vpp/station/Station.java @@ -36,11 +36,11 @@ public class Station extends BaseStEntity { @Column(name = "ADDR_LD_D") private String addrLdD; - @Column(name = "ST_FACIL_TP_CD") - private String stFacilTpCd; + @Column(name = "ST_FACIL_TP") + private String stFacilTp; - @Column(name = "ST_FACIL_D_TP_CD") - private String stFacilDTpCd; + @Column(name = "ST_FACIL_D_TP") + private String stFacilDTp; @Column(name = "PARKING_FEE_YN") private String parkingFeeYn; diff --git a/src/main/java/net/jwsi/jcms/vpp/station/StationDto.java b/src/main/java/net/jwsi/jcms/vpp/station/StationDto.java index 01955d0..513b7bd 100644 --- a/src/main/java/net/jwsi/jcms/vpp/station/StationDto.java +++ b/src/main/java/net/jwsi/jcms/vpp/station/StationDto.java @@ -33,8 +33,8 @@ public class StationDto { station.setAddrLdM(ldParts[0]); station.setAddrLdD(ldParts[1]); - station.setStFacilTpCd(this.stFacilTp); - station.setStFacilDTpCd(this.stFacilDTp); + station.setStFacilTp(this.stFacilTp); + station.setStFacilDTp(this.stFacilDTp); station.setParkingFeeYn(this.parkingFee); station.setParkingFeeDetl(this.parkingFeeDetl != null ? this.parkingFeeDetl : ""); diff --git a/src/main/resources/templates/system/chgrHist/list.html b/src/main/resources/templates/system/chgrHist/list.html new file mode 100644 index 0000000..e9928b7 --- /dev/null +++ b/src/main/resources/templates/system/chgrHist/list.html @@ -0,0 +1,297 @@ + + + +
+
+
+
+
+
+
+ 충전소 명 + +
+
+
+
+ 충전기 명 + +
+
+
+
+ 결제구분 + +
+
+
+
+ 충전기타입 코드 + +
+
+
+
+ 충전 시작일시 + +
+
+
+
+ 충전 종료일시 + +
+
+
+
+ 충전시간 + +
+
+
+
+ 신용결제완료구분 + +
+
+
+
+
+
+
+ + + + + +
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+ +