diff --git a/src/main/doc/db/jcms_vpp_0.0.5.exerd b/src/main/doc/db/jcms_vpp_0.0.5.exerd index 2841edd..b99cc72 100644 Binary files a/src/main/doc/db/jcms_vpp_0.0.5.exerd and b/src/main/doc/db/jcms_vpp_0.0.5.exerd differ diff --git a/src/main/doc/db/jcms_vpp_0.0.6.exerd b/src/main/doc/db/jcms_vpp_0.0.6.exerd new file mode 100644 index 0000000..25fc1d6 Binary files /dev/null and b/src/main/doc/db/jcms_vpp_0.0.6.exerd differ diff --git a/src/main/java/net/jwsi/jcms/vpp/RatePlanDetailTime/RatePlanDetailTime.java b/src/main/java/net/jwsi/jcms/vpp/RatePlanDetailTime/RatePlanDetailTime.java new file mode 100644 index 0000000..37b3a60 --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/RatePlanDetailTime/RatePlanDetailTime.java @@ -0,0 +1,25 @@ +package net.jwsi.jcms.vpp.RatePlanDetailTime; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import net.jwsi.jcms.base.BaseStEntity; + +@NoArgsConstructor +@Setter +@Getter +@Entity(name="vpp_rate_plan_detail_time") +public class RatePlanDetailTime extends BaseStEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer detailTimeId; //상세 id (계시별 단가 기준)(pk) + private Integer ratePlanId; //요금제 id (fk) + private Integer detailCapacityId; //상세 id (충전용량 기준, fk) + private Integer timeSlotId; //시간대 id (fk: time_slots)(fk) + private Double price; //시간대별 단가 + private String seasonType; //계절 타입 +} diff --git a/src/main/java/net/jwsi/jcms/vpp/RatePlanDetailTime/RatePlanDetailTimeController.java b/src/main/java/net/jwsi/jcms/vpp/RatePlanDetailTime/RatePlanDetailTimeController.java new file mode 100644 index 0000000..94acc2e --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/RatePlanDetailTime/RatePlanDetailTimeController.java @@ -0,0 +1,28 @@ +package net.jwsi.jcms.vpp.RatePlanDetailTime; + +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.RequestMapping; + +import java.util.List; + +@Controller +@Slf4j +@RequestMapping("/cms/ratePlanDetailTime") +public class RatePlanDetailTimeController extends BaseController { + public RatePlanDetailTimeController(RatePlanDetailTimeService service) { + super(service); + } + + @Override + protected void chkSelectList(List list) throws JsonDataException { + + } + + @Override + protected void chkSelect(RatePlanDetailTime data) throws JsonDataException { + + } +} diff --git a/src/main/java/net/jwsi/jcms/vpp/RatePlanDetailTime/RatePlanDetailTimeRepository.java b/src/main/java/net/jwsi/jcms/vpp/RatePlanDetailTime/RatePlanDetailTimeRepository.java new file mode 100644 index 0000000..3a3c9a2 --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/RatePlanDetailTime/RatePlanDetailTimeRepository.java @@ -0,0 +1,13 @@ +package net.jwsi.jcms.vpp.RatePlanDetailTime; + + +import net.jwsi.jcms.base.BaseRecStRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface RatePlanDetailTimeRepository extends BaseRecStRepository { + void deleteByRatePlanId(Integer ratePlanId); + List findByRatePlanId(Integer ratePlanId); +} diff --git a/src/main/java/net/jwsi/jcms/vpp/RatePlanDetailTime/RatePlanDetailTimeService.java b/src/main/java/net/jwsi/jcms/vpp/RatePlanDetailTime/RatePlanDetailTimeService.java new file mode 100644 index 0000000..8db33e4 --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/RatePlanDetailTime/RatePlanDetailTimeService.java @@ -0,0 +1,55 @@ +package net.jwsi.jcms.vpp.RatePlanDetailTime; + +import lombok.extern.slf4j.Slf4j; +import net.jwsi.jcms.base.BaseService; +import net.jwsi.jcms.base.EnumSqlType; +import org.springframework.data.domain.Page; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@Slf4j +public class RatePlanDetailTimeService extends BaseService { + + + public RatePlanDetailTimeService(RatePlanDetailTimeRepository repository) { + super(repository); + } + + @Override + protected Integer getUserId() { + return null; + } + + @Override + protected String getUserName(Integer id) { + return null; + } + + @Override + protected RatePlanDetailTime newSearchParam(RatePlanDetailTime ratePlanDetailTime) { + return null; + } + + @Override + protected EnumSqlType useSqlTyp() { + return null; + } + + @Override + protected Specification getSpecification(RatePlanDetailTime ratePlanDetailTime) { + return null; + } + + @Override + protected Page _selectPage(RatePlanDetailTime ratePlanDetailTime) { + return null; + } + + @Override + protected List _selectList(RatePlanDetailTime ratePlanDetailTime) { + return null; + } +} diff --git a/src/main/java/net/jwsi/jcms/vpp/RatePlanDetailTime/SeasonTimeDetailDto.java b/src/main/java/net/jwsi/jcms/vpp/RatePlanDetailTime/SeasonTimeDetailDto.java new file mode 100644 index 0000000..2080557 --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/RatePlanDetailTime/SeasonTimeDetailDto.java @@ -0,0 +1,4 @@ +package net.jwsi.jcms.vpp.RatePlanDetailTime; + +public class SeasonTimeDetailDto { +} 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 5de7147..511baf3 100644 --- a/src/main/java/net/jwsi/jcms/vpp/api/ApiClient.java +++ b/src/main/java/net/jwsi/jcms/vpp/api/ApiClient.java @@ -5,6 +5,7 @@ import net.jwsi.jcms.vpp.chgr.ChgrResponseDto; import net.jwsi.jcms.vpp.chgrCurrState.ChgrCurrState; import net.jwsi.jcms.vpp.chgrHist.ChgrHistResponseDto; import net.jwsi.jcms.vpp.provider.ProviderDto; +import net.jwsi.jcms.vpp.ratePlan.RatePlanResponseDto; import net.jwsi.jcms.vpp.station.StationDto; import org.springframework.core.ParameterizedTypeReference; import org.springframework.stereotype.Component; @@ -56,12 +57,24 @@ public class ApiClient { .body(new ParameterizedTypeReference>>() {}); } - public ApiResponse> fetchChgrCurrState() { + public ApiResponse> fetchChgrCurrState(String pageSize) { + Map requestBody = Map.of( + "pageSize", pageSize + ); return externalApiClient.post() .uri("/api/charge/stateInfo") - .body(Collections.emptyMap()) + .body(requestBody) .retrieve() .body(new ParameterizedTypeReference>>() {}); } + + public ApiResponse> fetchRatePlan(){ + return externalApiClient.post() + .uri("/api/ratePlan/list") + .body(Collections.emptyMap()) + .retrieve() + .body(new ParameterizedTypeReference>>() { + }); + } } \ No newline at end of file diff --git a/src/main/java/net/jwsi/jcms/vpp/chargerRatePlan/ChargerRatePlan.java b/src/main/java/net/jwsi/jcms/vpp/chargerRatePlan/ChargerRatePlan.java new file mode 100644 index 0000000..a990033 --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/chargerRatePlan/ChargerRatePlan.java @@ -0,0 +1,26 @@ +package net.jwsi.jcms.vpp.chargerRatePlan; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import net.jwsi.jcms.base.BaseStEntity; + +@NoArgsConstructor +@Setter +@Getter +@Entity(name="vpp_charger_rate_plan") +public class ChargerRatePlan extends BaseStEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) // 🚨 무조건 추가! + private Integer id; //적용 이력 id(pk) + private String chargerCd; //충전기 코드 (사업자코드+충전소번호+충전기번호) + private Integer ratePlanId; //적용 요금제 id (fk) + private String applyStartDate; //적용 시작일 + private String applyEndDate; //적용 종료일 (null = 현재 적용중) + private String isActive; //활성화 여부 + private String notes; //비고 / 변경 이유 +} diff --git a/src/main/java/net/jwsi/jcms/vpp/chargerRatePlan/ChargerRatePlanController.java b/src/main/java/net/jwsi/jcms/vpp/chargerRatePlan/ChargerRatePlanController.java new file mode 100644 index 0000000..fb9d28b --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/chargerRatePlan/ChargerRatePlanController.java @@ -0,0 +1,28 @@ +package net.jwsi.jcms.vpp.chargerRatePlan; + +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.RequestMapping; + +import java.util.List; + +@Controller +@Slf4j +@RequestMapping("/cms/chargerRatePlan") +public class ChargerRatePlanController extends BaseController { + public ChargerRatePlanController(ChargerRatePlanService service) { + super(service); + } + + @Override + protected void chkSelectList(List list) throws JsonDataException { + + } + + @Override + protected void chkSelect(ChargerRatePlan data) throws JsonDataException { + + } +} diff --git a/src/main/java/net/jwsi/jcms/vpp/chargerRatePlan/ChargerRatePlanRepository.java b/src/main/java/net/jwsi/jcms/vpp/chargerRatePlan/ChargerRatePlanRepository.java new file mode 100644 index 0000000..2dc9df3 --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/chargerRatePlan/ChargerRatePlanRepository.java @@ -0,0 +1,12 @@ +package net.jwsi.jcms.vpp.chargerRatePlan; + +import net.jwsi.jcms.base.BaseRecStRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ChargerRatePlanRepository extends BaseRecStRepository { + void deleteByRatePlanId(Integer ratePlanId); + List findByRatePlanId(Integer ratePlanId); +} diff --git a/src/main/java/net/jwsi/jcms/vpp/chargerRatePlan/ChargerRatePlanService.java b/src/main/java/net/jwsi/jcms/vpp/chargerRatePlan/ChargerRatePlanService.java new file mode 100644 index 0000000..3310a19 --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/chargerRatePlan/ChargerRatePlanService.java @@ -0,0 +1,53 @@ +package net.jwsi.jcms.vpp.chargerRatePlan; + +import lombok.extern.slf4j.Slf4j; +import net.jwsi.jcms.base.BaseService; +import net.jwsi.jcms.base.EnumSqlType; +import org.springframework.data.domain.Page; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@Slf4j +public class ChargerRatePlanService extends BaseService { + public ChargerRatePlanService(ChargerRatePlanRepository repository) { + super(repository); + } + + @Override + protected Integer getUserId() { + return null; + } + + @Override + protected String getUserName(Integer id) { + return null; + } + + @Override + protected ChargerRatePlan newSearchParam(ChargerRatePlan chargerRatePlan) { + return null; + } + + @Override + protected EnumSqlType useSqlTyp() { + return null; + } + + @Override + protected Specification getSpecification(ChargerRatePlan chargerRatePlan) { + return null; + } + + @Override + protected Page _selectPage(ChargerRatePlan chargerRatePlan) { + return null; + } + + @Override + protected List _selectList(ChargerRatePlan chargerRatePlan) { + return null; + } +} diff --git a/src/main/java/net/jwsi/jcms/vpp/chgr/Chgr.java b/src/main/java/net/jwsi/jcms/vpp/chgr/Chgr.java index 1c8ebe3..51b2594 100644 --- a/src/main/java/net/jwsi/jcms/vpp/chgr/Chgr.java +++ b/src/main/java/net/jwsi/jcms/vpp/chgr/Chgr.java @@ -1,8 +1,6 @@ package net.jwsi.jcms.vpp.chgr; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; +import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -14,12 +12,20 @@ import net.jwsi.jcms.base.BaseStEntity; @Getter @ToString @Entity(name = "vpp_chgr") +@IdClass(ChgrId.class) public class Chgr extends BaseStEntity { + + @Transient + private ChgrId oldId__; + @Id @Column(name = "CHGR_ID") private String chgrId; //충전기 id(pk) + @Id @Column(name = "PROVIDER_ID") private String providerId; //충전사업자 id(pk) @Id + @Id + @Column(name = "ST_ID") private String stId; //충전소 id(pk) @Id private String stNm; //충전소 명 private String chgrNm; //충전기 명 diff --git a/src/main/java/net/jwsi/jcms/vpp/chgr/ChgrController.java b/src/main/java/net/jwsi/jcms/vpp/chgr/ChgrController.java index ba9bd82..9867fb4 100644 --- a/src/main/java/net/jwsi/jcms/vpp/chgr/ChgrController.java +++ b/src/main/java/net/jwsi/jcms/vpp/chgr/ChgrController.java @@ -28,6 +28,7 @@ public class ChgrController extends BaseController> response = apiClient.fetchChgrCurrState(); + ApiResponse> response = apiClient.fetchChgrCurrState("12"); if (response == null || !Integer.valueOf(200).equals(response.getCode())) { String msg = (response != null) ? response.getMessage() : "응답 없음"; diff --git a/src/main/java/net/jwsi/jcms/vpp/ratePlan/RatePlan.java b/src/main/java/net/jwsi/jcms/vpp/ratePlan/RatePlan.java new file mode 100644 index 0000000..4d63b8f --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/ratePlan/RatePlan.java @@ -0,0 +1,29 @@ +package net.jwsi.jcms.vpp.ratePlan; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import net.jwsi.jcms.base.BaseStEntity; + +@NoArgsConstructor +@Setter +@Getter +@Entity(name="vpp_rate_plan") +public class RatePlan extends BaseStEntity { + @Id + private Integer ratePlanId; //요금제 id(pk) + private String ratePlanName; //요금제명 + private String ratePlanType; //요금제 타입 (고정/계시별/충전용량별/계시+충전용량별) + private String seasonType; //계절 타입 (연중/봄/여름/가을/겨울) + private String applyStartDate; //적용 시작일 + private String applyEndDate; //적용 종료일 + private Double fixedPrice; //고정 단가 (rate_plan_type=fixed일 경우) + private String description; //요금제 설명 + private String approvalStatus; //승인 상태 + private String rejectionReason; //승인 거절 사유 + @Column(name = "IS_ACTIVE") + private String isActive; +} diff --git a/src/main/java/net/jwsi/jcms/vpp/ratePlan/RatePlanController.java b/src/main/java/net/jwsi/jcms/vpp/ratePlan/RatePlanController.java new file mode 100644 index 0000000..b4cf2f1 --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/ratePlan/RatePlanController.java @@ -0,0 +1,61 @@ +package net.jwsi.jcms.vpp.ratePlan; + +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.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +@Slf4j +@RequestMapping("/cms/ratePlan") +public class RatePlanController extends BaseController { + + private final String path = "/system/ratePlan/"; + private final RatePlanService ratePlanService; + + + public RatePlanController(RatePlanService service, RatePlanService ratePlanService) { + super(service); + this.ratePlanService = ratePlanService; + } + @GetMapping("list") + public String list(){ + ratePlanService.getRatePlan(); + return path+"list"; + } + @PostMapping("list.json") + @ResponseBody + public Map list(RatePlan ratePlan){ + if(ratePlan == null) ratePlan = new RatePlan(); + return svcSelectList(ratePlan); + } + @PostMapping("view.json") + @ResponseBody + public Map viewData(@RequestParam("ratePlanId") Integer ratePlanId) { + Map result = new HashMap<>(); + try { + RatePlanResponseDto detailData = ratePlanService.getRatePlanDetail(ratePlanId); + result.put("result", "success"); + result.put("data", detailData); + } catch (Exception e) { + result.put("result", "fail"); + result.put("message", e.getMessage()); + } + return result; + } + + @Override + protected void chkSelectList(List list) throws JsonDataException { + + } + + @Override + protected void chkSelect(RatePlan data) throws JsonDataException { + + } +} diff --git a/src/main/java/net/jwsi/jcms/vpp/ratePlan/RatePlanRepository.java b/src/main/java/net/jwsi/jcms/vpp/ratePlan/RatePlanRepository.java new file mode 100644 index 0000000..57b3a1c --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/ratePlan/RatePlanRepository.java @@ -0,0 +1,8 @@ +package net.jwsi.jcms.vpp.ratePlan; + +import net.jwsi.jcms.base.BaseRecStRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface RatePlanRepository extends BaseRecStRepository { +} diff --git a/src/main/java/net/jwsi/jcms/vpp/ratePlan/RatePlanResponseDto.java b/src/main/java/net/jwsi/jcms/vpp/ratePlan/RatePlanResponseDto.java new file mode 100644 index 0000000..2ca4571 --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/ratePlan/RatePlanResponseDto.java @@ -0,0 +1,117 @@ +package net.jwsi.jcms.vpp.ratePlan; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import net.jwsi.jcms.vpp.RatePlanDetailTime.RatePlanDetailTime; +import net.jwsi.jcms.vpp.chargerRatePlan.ChargerRatePlan; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@Setter +@ToString +public class RatePlanResponseDto { + + private Integer ratePlanId; + private String ratePlanName; + private String ratePlanType; + private String seasonType; + private String applyStartDate; + private String applyEndDate; + private Double fixedPrice; + private String isActive; + private String approvalStatus; + private String description; + + + // 계시별 단가 리스트 + private List detailsTime; + + // 적용 대상 충전기 리스트 + private List chargerList; + + public RatePlan toEntity() { + RatePlan ratePlan = new RatePlan(); + ratePlan.setRatePlanId(this.ratePlanId); + ratePlan.setRatePlanName(this.ratePlanName); + ratePlan.setRatePlanType(this.ratePlanType); + ratePlan.setSeasonType(this.seasonType); + ratePlan.setApplyStartDate(this.applyStartDate); + ratePlan.setApplyEndDate(this.applyEndDate); + ratePlan.setFixedPrice(this.fixedPrice); + ratePlan.setApprovalStatus(this.approvalStatus); + return ratePlan; + } + + public List toDetailTimeEntities() { + List detailTimeList = new ArrayList<>(); + if (this.detailsTime == null) return detailTimeList; + + for (DetailsTimeDto seasonDto : this.detailsTime) { + if (seasonDto.getTimeRates() == null) continue; + + for (TimeRateDto timeRateDto : seasonDto.getTimeRates()) { + RatePlanDetailTime detailTime = new RatePlanDetailTime(); + detailTime.setRatePlanId(this.ratePlanId); + detailTime.setSeasonType(seasonDto.getSeasonType()); + detailTime.setTimeSlotId(timeRateDto.getId()); + detailTime.setPrice(timeRateDto.getPrice()); + + detailTimeList.add(detailTime); + } + } + return detailTimeList; + } + + public List toChargerRatePlanEntities() { + List chargerRatePlanList = new ArrayList<>(); + if (this.chargerList == null) return chargerRatePlanList; + + for (ChargerListDto chargerDto : this.chargerList) { + ChargerRatePlan chargerRatePlan = new ChargerRatePlan(); + if (this.ratePlanId != null && chargerDto.getChargerCd() != null) { + chargerRatePlan.setRatePlanId((this.ratePlanId)); + } + chargerRatePlan.setChargerCd(chargerDto.getChargerCd()); + chargerRatePlan.setApplyStartDate(chargerDto.getApplyStartDate()); + chargerRatePlan.setApplyEndDate(chargerDto.getApplyEndDate()); + + if (chargerDto.getIsActive() != null) { + chargerRatePlan.setIsActive(chargerDto.getIsActive() ? "Y" : "N"); + } + + chargerRatePlanList.add(chargerRatePlan); + } + return chargerRatePlanList; + } + + @Getter + @Setter + @ToString + public static class DetailsTimeDto { + private String seasonType; + private List timeRates; + } + + @Getter + @Setter + @ToString + public static class TimeRateDto { + private Integer id; + private String startTime; + private String endTime; + private Double price; + } + + @Getter + @Setter + @ToString + public static class ChargerListDto { + private String chargerCd; + private String applyStartDate; + private String applyEndDate; + private Boolean isActive; + } +} \ No newline at end of file diff --git a/src/main/java/net/jwsi/jcms/vpp/ratePlan/RatePlanService.java b/src/main/java/net/jwsi/jcms/vpp/ratePlan/RatePlanService.java new file mode 100644 index 0000000..a60f299 --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/ratePlan/RatePlanService.java @@ -0,0 +1,200 @@ +package net.jwsi.jcms.vpp.ratePlan; + +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.RatePlanDetailTime.RatePlanDetailTime; +import net.jwsi.jcms.vpp.RatePlanDetailTime.RatePlanDetailTimeRepository; +import net.jwsi.jcms.vpp.api.ApiClient; +import net.jwsi.jcms.vpp.api.ApiResponse; +import net.jwsi.jcms.vpp.chargerRatePlan.ChargerRatePlan; +import net.jwsi.jcms.vpp.chargerRatePlan.ChargerRatePlanRepository; +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.*; +import java.util.stream.Collectors; + +@Service +@Slf4j +public class RatePlanService extends BaseService { + + private final ApiClient apiClient; + private final RatePlanRepository ratePlanRepository; + private final RatePlanDetailTimeRepository ratePlanDetailTimeRepository; + private final ChargerRatePlanRepository chargerRatePlanRepository; + + public RatePlanService(RatePlanRepository repository, ApiClient apiClient, RatePlanRepository ratePlanRepository, RatePlanDetailTimeRepository ratePlanDetailTimeRepository, ChargerRatePlanRepository chargerRatePlanRepository) { + super(repository); + this.apiClient = apiClient; + this.ratePlanRepository = ratePlanRepository; + this.ratePlanDetailTimeRepository = ratePlanDetailTimeRepository; + this.chargerRatePlanRepository = chargerRatePlanRepository; + } + + @Transactional + @Scheduled(cron = "0 0 0 * * *") + public void getRatePlan() { + ApiResponse> response = apiClient.fetchRatePlan(); + + 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("가져온 요금제 데이터가 없습니다."); + return; + } + + List ratePlanEntities = new ArrayList<>(); + List allDetailTimes = new ArrayList<>(); + List allChargerRatePlans = new ArrayList<>(); + + Set processedIds = new HashSet<>(); + + for (RatePlanResponseDto dto : dtoList) { + Integer currentRatePlanId = dto.getRatePlanId(); + + if (processedIds.contains(currentRatePlanId)) { + continue; + } + processedIds.add(currentRatePlanId); + + RatePlan entity = ratePlanRepository.findById(currentRatePlanId) + .orElseGet(() -> { + RatePlan newEntity = new RatePlan(); + newEntity.setRatePlanId(currentRatePlanId); + return newEntity; + }); + + entity.setRatePlanName(dto.getRatePlanName()); + entity.setRatePlanType(dto.getRatePlanType()); + entity.setSeasonType(dto.getSeasonType()); + entity.setApplyStartDate(dto.getApplyStartDate()); + entity.setApplyEndDate(dto.getApplyEndDate()); + entity.setFixedPrice(dto.getFixedPrice()); + entity.setApprovalStatus(dto.getApprovalStatus()); + entity.setIsActive(dto.getIsActive()); + + ratePlanEntities.add(entity); + + allDetailTimes.addAll(dto.toDetailTimeEntities()); + allChargerRatePlans.addAll(dto.toChargerRatePlanEntities()); + + ratePlanDetailTimeRepository.deleteByRatePlanId(currentRatePlanId); + chargerRatePlanRepository.deleteByRatePlanId(currentRatePlanId); + } + + ratePlanRepository.saveAll(ratePlanEntities); + + ratePlanDetailTimeRepository.flush(); + chargerRatePlanRepository.flush(); + + if (!allDetailTimes.isEmpty()) { + ratePlanDetailTimeRepository.saveAll(allDetailTimes); + } + if (!allChargerRatePlans.isEmpty()) { + chargerRatePlanRepository.saveAll(allChargerRatePlans); + } + + log.info("요금제 동기화 완료: 마스터 {}건, 상세단가 {}건, 충전기매핑 {}건", + ratePlanEntities.size(), allDetailTimes.size(), allChargerRatePlans.size()); + } + + public RatePlanResponseDto getRatePlanDetail(Integer ratePlanId) { + RatePlan ratePlan = ratePlanRepository.findById(ratePlanId) + .orElseThrow(() -> new RuntimeException("해당 요금제를 찾을 수 없습니다. ID: " + ratePlanId)); + + RatePlanResponseDto dto = new RatePlanResponseDto(); + dto.setRatePlanId(ratePlan.getRatePlanId()); + dto.setRatePlanName(ratePlan.getRatePlanName()); + dto.setRatePlanType(ratePlan.getRatePlanType()); + dto.setSeasonType(ratePlan.getSeasonType()); + dto.setApplyStartDate(ratePlan.getApplyStartDate()); + dto.setApplyEndDate(ratePlan.getApplyEndDate()); + dto.setFixedPrice(ratePlan.getFixedPrice()); + dto.setIsActive(ratePlan.getIsActive()); + dto.setApprovalStatus(ratePlan.getApprovalStatus()); + dto.setDescription(ratePlan.getDescription()); + + List detailTimes = ratePlanDetailTimeRepository.findByRatePlanId(ratePlanId); + Map> groupedBySeason = detailTimes.stream() + .collect(Collectors.groupingBy(RatePlanDetailTime::getSeasonType)); + + List detailsTimeDtos = new ArrayList<>(); + for (Map.Entry> entry : groupedBySeason.entrySet()) { + RatePlanResponseDto.DetailsTimeDto seasonDto = new RatePlanResponseDto.DetailsTimeDto(); + seasonDto.setSeasonType(entry.getKey()); + seasonDto.setTimeRates(entry.getValue().stream().map(dt -> { + RatePlanResponseDto.TimeRateDto tr = new RatePlanResponseDto.TimeRateDto(); + tr.setId(dt.getTimeSlotId()); + tr.setPrice(dt.getPrice()); + return tr; + }).collect(Collectors.toList())); + detailsTimeDtos.add(seasonDto); + } + dto.setDetailsTime(detailsTimeDtos); + + List chargerRatePlans = chargerRatePlanRepository.findByRatePlanId(ratePlanId); + + log.info("🚨 [디버깅] 조회된 충전기 매핑 개수: {}", chargerRatePlans.size()); + + List chargerListDtos = chargerRatePlans.stream().map(cp -> { + RatePlanResponseDto.ChargerListDto cpDto = new RatePlanResponseDto.ChargerListDto(); + cpDto.setChargerCd(cp.getChargerCd()); + cpDto.setApplyStartDate(cp.getApplyStartDate()); + cpDto.setApplyEndDate(cp.getApplyEndDate()); + cpDto.setIsActive("Y".equals(cp.getIsActive())); + return cpDto; + }).collect(Collectors.toList()); + + dto.setChargerList(chargerListDtos); + + return dto; + } + + @Override + protected Integer getUserId() { + return HttpUtil.getUserId(); + } + + @Override + protected String getUserName(Integer id) { + return LoginUtil.getUserName(id); + } + + @Override + protected RatePlan newSearchParam(RatePlan ratePlan) { + if (ratePlan == null) { + ratePlan = new RatePlan(); + } + return ratePlan; + } + + @Override + protected EnumSqlType useSqlTyp() { + return EnumSqlType.SPECIFICATION; + } + + @Override + protected Specification getSpecification(RatePlan ratePlan) { + return null; + } + + @Override + protected Page _selectPage(RatePlan ratePlan) { + return null; + } + + @Override + protected List _selectList(RatePlan ratePlan) { + return null; + } +} diff --git a/src/main/java/net/jwsi/jcms/vpp/timeslots/TimeSlots.java b/src/main/java/net/jwsi/jcms/vpp/timeslots/TimeSlots.java new file mode 100644 index 0000000..9f4deba --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/timeslots/TimeSlots.java @@ -0,0 +1,27 @@ +package net.jwsi.jcms.vpp.timeslots; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import net.jwsi.jcms.base.BaseStEntity; + +@NoArgsConstructor +@Setter +@Getter +@Entity(name="vpp_time_slots") +public class TimeSlots extends BaseStEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; //시간대 id(pk) + private String name; //시간대명 (예: 경부하, 최대부하, 09시) + private String slotType; //시간대 구분 (basic=계시별, hour=시간단위) + private Integer hourNumber; //시간 구분 (slot_type=hour일 경우 0~23) + private String startTime; //시작 시간 + private String endTime; //종료 시간 + private String description; //시간대 설명 + private String isActive; //활성화 여부 +} diff --git a/src/main/java/net/jwsi/jcms/vpp/timeslots/TimeSlotsController.java b/src/main/java/net/jwsi/jcms/vpp/timeslots/TimeSlotsController.java new file mode 100644 index 0000000..2a14b2e --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/timeslots/TimeSlotsController.java @@ -0,0 +1,28 @@ +package net.jwsi.jcms.vpp.timeslots; + +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.RequestMapping; + +import java.util.List; + +@Controller +@Slf4j +@RequestMapping("/cms/timeSlots") +public class TimeSlotsController extends BaseController { + public TimeSlotsController(TimeSlotsService service) { + super(service); + } + + @Override + protected void chkSelectList(List list) throws JsonDataException { + + } + + @Override + protected void chkSelect(TimeSlots data) throws JsonDataException { + + } +} diff --git a/src/main/java/net/jwsi/jcms/vpp/timeslots/TimeSlotsRepository.java b/src/main/java/net/jwsi/jcms/vpp/timeslots/TimeSlotsRepository.java new file mode 100644 index 0000000..2441ea9 --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/timeslots/TimeSlotsRepository.java @@ -0,0 +1,6 @@ +package net.jwsi.jcms.vpp.timeslots; + +import net.jwsi.jcms.base.BaseRecStRepository; + +public interface TimeSlotsRepository extends BaseRecStRepository { +} diff --git a/src/main/java/net/jwsi/jcms/vpp/timeslots/TimeSlotsService.java b/src/main/java/net/jwsi/jcms/vpp/timeslots/TimeSlotsService.java new file mode 100644 index 0000000..2329d65 --- /dev/null +++ b/src/main/java/net/jwsi/jcms/vpp/timeslots/TimeSlotsService.java @@ -0,0 +1,53 @@ +package net.jwsi.jcms.vpp.timeslots; + +import lombok.extern.slf4j.Slf4j; +import net.jwsi.jcms.base.BaseService; +import net.jwsi.jcms.base.EnumSqlType; +import org.springframework.data.domain.Page; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@Slf4j +public class TimeSlotsService extends BaseService { + public TimeSlotsService(TimeSlotsRepository repository) { + super(repository); + } + + @Override + protected Integer getUserId() { + return null; + } + + @Override + protected String getUserName(Integer id) { + return null; + } + + @Override + protected TimeSlots newSearchParam(TimeSlots timeSlots) { + return null; + } + + @Override + protected EnumSqlType useSqlTyp() { + return null; + } + + @Override + protected Specification getSpecification(TimeSlots timeSlots) { + return null; + } + + @Override + protected Page _selectPage(TimeSlots timeSlots) { + return null; + } + + @Override + protected List _selectList(TimeSlots timeSlots) { + return null; + } +} diff --git a/src/main/resources/templates/system/chgrCurrState/list.html b/src/main/resources/templates/system/chgrCurrState/list.html index 83fd8fd..4334bd0 100644 --- a/src/main/resources/templates/system/chgrCurrState/list.html +++ b/src/main/resources/templates/system/chgrCurrState/list.html @@ -6,12 +6,6 @@
-
-
- provider_id - -
-
st_id @@ -24,18 +18,6 @@
-
-
- 상태 일시 - -
-
-
-
- op_mode - -
-
ch1_rechg_state_cd @@ -54,8 +36,8 @@
-
-
+
+
@@ -67,9 +49,9 @@
- - - + + +
@@ -79,13 +61,6 @@
- - - + + + \ No newline at end of file