feat: Implement RekapGarduDistribusi resource and related DTOs
- Added RekapGarduDistribusiResource for handling data retrieval and synchronization. - Created RekapGarduDistribusiDTO to represent the data structure for distribution records. - Developed RekapGarduDistribusiResponse to encapsulate the response from the external API. - Introduced RekapGarduDistribusi entity to map to the database table. - Implemented GarduService for synchronizing data with external API. - Enhanced error handling and logging during data synchronization.
This commit is contained in:
20152
sampel.json
Normal file
20152
sampel.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -317,7 +317,6 @@ public class DataII09Resource {
|
|||||||
return data309;
|
return data309;
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
|
||||||
return null; // Or handle as needed
|
return null; // Or handle as needed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -0,0 +1,136 @@
|
|||||||
|
package id.co.iconpln.apkt.data309.boundary;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
|
||||||
|
import id.co.iconpln.apkt.data309.dto.Data309;
|
||||||
|
import id.co.iconpln.apkt.data309.dto.RekapGarduDistribusiResponse;
|
||||||
|
import id.co.iconpln.apkt.data309.dto.ReportData;
|
||||||
|
import id.co.iconpln.apkt.data309.dto.ResponseModel;
|
||||||
|
import id.co.iconpln.apkt.data309.dto.Row;
|
||||||
|
import id.co.iconpln.apkt.data309.entity.RekapGarduDistribusi;
|
||||||
|
import id.co.iconpln.apkt.data309.entity.SS309;
|
||||||
|
import id.co.iconpln.apkt.data309.entity.Ulp;
|
||||||
|
import id.co.iconpln.apkt.data309.service.Data309Service;
|
||||||
|
import id.co.iconpln.apkt.data309.utils.XmlToJsonConverter;
|
||||||
|
import jakarta.enterprise.context.ApplicationScoped;
|
||||||
|
import jakarta.inject.Inject;
|
||||||
|
import jakarta.persistence.EntityManager;
|
||||||
|
import jakarta.transaction.Transactional;
|
||||||
|
import jakarta.ws.rs.GET;
|
||||||
|
import jakarta.ws.rs.Path;
|
||||||
|
import jakarta.ws.rs.QueryParam;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.http.HttpClient;
|
||||||
|
import java.net.http.HttpRequest;
|
||||||
|
import java.net.http.HttpResponse;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@ApplicationScoped
|
||||||
|
@Path("/rekapGarduDistribusi")
|
||||||
|
public class RekapGarduDistribusiResource {
|
||||||
|
@GET
|
||||||
|
@Path("/getData")
|
||||||
|
@Transactional
|
||||||
|
public Data309 getPojo(@QueryParam("unit") String unit, @QueryParam("thnbln") String thnbln)
|
||||||
|
throws IOException, InterruptedException {
|
||||||
|
|
||||||
|
HttpClient client = HttpClient.newHttpClient();
|
||||||
|
HttpRequest request = HttpRequest.newBuilder()
|
||||||
|
.uri(URI.create("http://10.1.81.64:8021/api/ap2t/eam/gardu/get-rekap-dil-gardu?blth=" + thnbln
|
||||||
|
+ "&unitup="
|
||||||
|
+ unit))
|
||||||
|
.GET()
|
||||||
|
.build();
|
||||||
|
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
|
||||||
|
String jsonString = response.body();
|
||||||
|
|
||||||
|
try {
|
||||||
|
ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||||
|
objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
|
||||||
|
objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
|
||||||
|
objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
|
||||||
|
objectMapper.configure(DeserializationFeature.FAIL_ON_TRAILING_TOKENS, true);
|
||||||
|
objectMapper.configure(DeserializationFeature.FAIL_ON_MISSING_EXTERNAL_TYPE_ID_PROPERTY, true);
|
||||||
|
ReportData reportData = objectMapper.readValue(jsonString, ReportData.class);
|
||||||
|
String data = reportData.getData();
|
||||||
|
RekapGarduDistribusiResponse dil = objectMapper.readValue(data, RekapGarduDistribusiResponse.class);
|
||||||
|
if (dil.getData() != null) {
|
||||||
|
for (RekapGarduDistribusiDTO newData : dil.getData()) {
|
||||||
|
RekapGarduDistribusi rekapGarduDistribusi = RekapGarduDistribusi
|
||||||
|
.find("unitUp = ?1 and unitAp = ?2 and unitUpi= ?3 and thbllap = ?3",
|
||||||
|
newData.getUnitup(),
|
||||||
|
newData.getUnitap(), newData.getUnitupi(), newData.getThbllap())
|
||||||
|
.firstResult();
|
||||||
|
if (rekapGarduDistribusi == null) {
|
||||||
|
rekapGarduDistribusi = new RekapGarduDistribusi();
|
||||||
|
}
|
||||||
|
|
||||||
|
rekapGarduDistribusi.setJmlplg1Fasa(newData.getJmlplg1Fasa());
|
||||||
|
rekapGarduDistribusi.setUnitupi(newData.getUnitupi());
|
||||||
|
rekapGarduDistribusi.setNamaupi(newData.getNamaupi());
|
||||||
|
rekapGarduDistribusi.setKdgardu(newData.getKdgardu());
|
||||||
|
rekapGarduDistribusi.setJmlplg3Fasa(newData.getJmlplg3Fasa());
|
||||||
|
rekapGarduDistribusi.setNamaAp(newData.getNamaap());
|
||||||
|
rekapGarduDistribusi.setKeteranganKdPembMeter(newData.getKeterangan_kdpembmeter());
|
||||||
|
rekapGarduDistribusi.setUnitAp(newData.getUnitap());
|
||||||
|
rekapGarduDistribusi.setJmlPlg(newData.getJmlplg());
|
||||||
|
rekapGarduDistribusi.setJmlplg(newData.getJmlplg());
|
||||||
|
rekapGarduDistribusi.setUnitup(newData.getUnitup());
|
||||||
|
rekapGarduDistribusi.setKdpembmeter(newData.getKdpembmeter());
|
||||||
|
rekapGarduDistribusi.setJmldaya(newData.getJmldaya());
|
||||||
|
rekapGarduDistribusi.setNamaup(newData.getNamaup());
|
||||||
|
rekapGarduDistribusi.setThbllap(newData.getThbllap());
|
||||||
|
rekapGarduDistribusi.setNama_gardu(newData.getNama_gardu());
|
||||||
|
rekapGarduDistribusi.persist();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rekapGarduDistribusi;
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
return null; // Or handle as needed
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/sinkron")
|
||||||
|
@Transactional
|
||||||
|
public void sinkron() throws IOException, InterruptedException {
|
||||||
|
System.out.println("SINKRON DATA REKAP GARDU DISTRIBUSI");
|
||||||
|
String thnbln = String.valueOf(LocalDate.now().getYear())
|
||||||
|
+ String.format("%02d", LocalDate.now().getMonthValue() - 1);
|
||||||
|
// string pad left 0
|
||||||
|
|
||||||
|
if (LocalDate.now().getMonthValue() == 1) {
|
||||||
|
thnbln = String.valueOf(LocalDate.now().getYear() - 1) + "12";
|
||||||
|
}
|
||||||
|
List<Ulp> ulps = Ulp.find("unit_ap2t NOT IN ('PLN.PST') OR unit_ap2t is not null").list();
|
||||||
|
for (Ulp getUlp : ulps) {
|
||||||
|
String unit = getUlp.getUnit_ap2t();
|
||||||
|
HttpClient client = HttpClient.newHttpClient();
|
||||||
|
HttpRequest request = HttpRequest.newBuilder()
|
||||||
|
.uri(URI.create("http://10.14.212.9:32184/RekapGarduDistribusi/getData?unit=" + unit +
|
||||||
|
"&thnbln=" + thnbln))
|
||||||
|
.GET()
|
||||||
|
.build();
|
||||||
|
client.send(request, HttpResponse.BodyHandlers.ofString());
|
||||||
|
data309Service.syncronize(unit, thnbln);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,22 @@
|
|||||||
|
package id.co.iconpln.apkt.data309.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class RekapGarduDistribusiDTO {
|
||||||
|
private Integer jmlplg_1_fasa;
|
||||||
|
private String unitupi;
|
||||||
|
private String namaupi;
|
||||||
|
private String kdgardu;
|
||||||
|
private Integer jmlplg_3_fasa;
|
||||||
|
private String namaap;
|
||||||
|
private String keterangan_kdpembmeter;
|
||||||
|
private String unitap;
|
||||||
|
private Integer jmlplg;
|
||||||
|
private String unitup;
|
||||||
|
private String kdpembmeter;
|
||||||
|
private Integer jmldaya;
|
||||||
|
private String namaup;
|
||||||
|
private String thbllap;
|
||||||
|
private String nama_gardu;
|
||||||
|
}
|
@@ -0,0 +1,12 @@
|
|||||||
|
package id.co.iconpln.apkt.data309.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class RekapGarduDistribusiResponse {
|
||||||
|
private boolean success;
|
||||||
|
private int status;
|
||||||
|
private String message;
|
||||||
|
private List<RekapGarduDistribusiDTO> data;
|
||||||
|
}
|
@@ -0,0 +1,64 @@
|
|||||||
|
package id.co.iconpln.apkt.data309.entity;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.*;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Table(name = "rekap_gardu_distribusi", schema = "apkt_transactional")
|
||||||
|
public class RekapGarduDistribusi extends PanacheEntityBase {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
@Column(name = "id") // karena table tidak punya PK, kamu bisa tambahkan kolom id (serial) di DB
|
||||||
|
public Long id;
|
||||||
|
|
||||||
|
@Column(name = "jmlplg_1_fasa")
|
||||||
|
public Integer jmlplg1Fasa;
|
||||||
|
|
||||||
|
@Column(name = "unitupi")
|
||||||
|
public String unitUpi;
|
||||||
|
|
||||||
|
@Column(name = "namaupi")
|
||||||
|
public String namaUpi;
|
||||||
|
|
||||||
|
@Column(name = "kdgardu")
|
||||||
|
public String kdGardu;
|
||||||
|
|
||||||
|
@Column(name = "jmlplg_3_fasa")
|
||||||
|
public Integer jmlplg3Fasa;
|
||||||
|
|
||||||
|
@Column(name = "namaap")
|
||||||
|
public String namaAp;
|
||||||
|
|
||||||
|
@Column(name = "keterangan_kdpembmeter")
|
||||||
|
public String keteranganKdPembMeter;
|
||||||
|
|
||||||
|
@Column(name = "unitap")
|
||||||
|
public String unitAp;
|
||||||
|
|
||||||
|
@Column(name = "jmlplg")
|
||||||
|
public Integer jmlPlg;
|
||||||
|
|
||||||
|
@Column(name = "unitup")
|
||||||
|
public String unitUp;
|
||||||
|
|
||||||
|
@Column(name = "kdpembmeter")
|
||||||
|
public String kdPembMeter;
|
||||||
|
|
||||||
|
@Column(name = "jmldaya")
|
||||||
|
public Integer jmlDaya;
|
||||||
|
|
||||||
|
@Column(name = "namaup")
|
||||||
|
public String namaUp;
|
||||||
|
|
||||||
|
@Column(name = "thbllap")
|
||||||
|
public String thblLap;
|
||||||
|
|
||||||
|
@Column(name = "nama_gardu")
|
||||||
|
public String namaGardu;
|
||||||
|
}
|
@@ -4,7 +4,6 @@ import java.net.URI;
|
|||||||
import java.net.http.HttpClient;
|
import java.net.http.HttpClient;
|
||||||
import java.net.http.HttpRequest;
|
import java.net.http.HttpRequest;
|
||||||
import java.net.http.HttpResponse;
|
import java.net.http.HttpResponse;
|
||||||
import java.util.Base64;
|
|
||||||
import io.quarkus.scheduler.Scheduled;
|
import io.quarkus.scheduler.Scheduled;
|
||||||
import jakarta.enterprise.context.ApplicationScoped;
|
import jakarta.enterprise.context.ApplicationScoped;
|
||||||
|
|
||||||
@@ -35,4 +34,16 @@ public class MyScheduledBean {
|
|||||||
client.send(request, HttpResponse.BodyHandlers.ofString());
|
client.send(request, HttpResponse.BodyHandlers.ofString());
|
||||||
System.out.println("Scheduled task executed successfully");
|
System.out.println("Scheduled task executed successfully");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Scheduled(cron = "0 59 23 1 * ?")
|
||||||
|
void scheduleCronGardu() throws Exception {
|
||||||
|
HttpClient client = HttpClient.newHttpClient();
|
||||||
|
HttpRequest request = HttpRequest.newBuilder()
|
||||||
|
.uri(URI.create("http://10.14.212.9:32184/rekapGarduDistribusi/sinkron"))
|
||||||
|
.GET()
|
||||||
|
.build();
|
||||||
|
|
||||||
|
client.send(request, HttpResponse.BodyHandlers.ofString());
|
||||||
|
System.out.println("Scheduled Rekap Gardu task executed successfully");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,86 @@
|
|||||||
|
package id.co.iconpln.apkt.data309.service;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
|
||||||
|
import id.co.iconpln.apkt.data309.dto.Data309;
|
||||||
|
import id.co.iconpln.apkt.data309.dto.Row;
|
||||||
|
import id.co.iconpln.apkt.data309.entity.SS309;
|
||||||
|
import id.co.iconpln.apkt.data309.entity.Ulp;
|
||||||
|
import id.co.iconpln.apkt.data309.utils.XmlToJsonConverter;
|
||||||
|
import jakarta.enterprise.context.ApplicationScoped;
|
||||||
|
|
||||||
|
@ApplicationScoped
|
||||||
|
public class GarduService {
|
||||||
|
|
||||||
|
public void syncronize(String unit, String thnbln) throws IOException, InterruptedException {
|
||||||
|
HttpClient client = HttpClient.newHttpClient();
|
||||||
|
HttpRequest request = HttpRequest.newBuilder()
|
||||||
|
.uri(URI.create("http://10.1.81.64:8021/api/ap2t/eam/gardu/get-rekap-dil-gardu?blth=" + thnbln
|
||||||
|
+ "&unitup="
|
||||||
|
+ unit))
|
||||||
|
.GET()
|
||||||
|
.build();
|
||||||
|
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
|
||||||
|
String jsonString = response.body();
|
||||||
|
|
||||||
|
try {
|
||||||
|
ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||||
|
objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
|
||||||
|
objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
|
||||||
|
objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
|
||||||
|
objectMapper.configure(DeserializationFeature.FAIL_ON_TRAILING_TOKENS, true);
|
||||||
|
objectMapper.configure(DeserializationFeature.FAIL_ON_MISSING_EXTERNAL_TYPE_ID_PROPERTY, true);
|
||||||
|
ReportData reportData = objectMapper.readValue(jsonString, ReportData.class);
|
||||||
|
String data = reportData.getData();
|
||||||
|
RekapGarduDistribusiResponse dil = objectMapper.readValue(data, RekapGarduDistribusiResponse.class);
|
||||||
|
if (dil.getData() != null) {
|
||||||
|
for (RekapGarduDistribusiDTO newData : dil.getData()) {
|
||||||
|
RekapGarduDistribusi rekapGarduDistribusi = RekapGarduDistribusi
|
||||||
|
.find("unitUp = ?1 and unitAp = ?2 and unitUpi= ?3 and thbllap = ?3",
|
||||||
|
newData.getUnitup(),
|
||||||
|
newData.getUnitap(), newData.getUnitupi(), newData.getThbllap())
|
||||||
|
.firstResult();
|
||||||
|
if (rekapGarduDistribusi == null) {
|
||||||
|
rekapGarduDistribusi = new RekapGarduDistribusi();
|
||||||
|
}
|
||||||
|
|
||||||
|
rekapGarduDistribusi.setJmlplg1Fasa(newData.getJmlplg1Fasa());
|
||||||
|
rekapGarduDistribusi.setUnitupi(newData.getUnitupi());
|
||||||
|
rekapGarduDistribusi.setNamaupi(newData.getNamaupi());
|
||||||
|
rekapGarduDistribusi.setKdgardu(newData.getKdgardu());
|
||||||
|
rekapGarduDistribusi.setJmlplg3Fasa(newData.getJmlplg3Fasa());
|
||||||
|
rekapGarduDistribusi.setNamaAp(newData.getNamaap());
|
||||||
|
rekapGarduDistribusi.setKeteranganKdPembMeter(newData.getKeterangan_kdpembmeter());
|
||||||
|
rekapGarduDistribusi.setUnitAp(newData.getUnitap());
|
||||||
|
rekapGarduDistribusi.setJmlPlg(newData.getJmlplg());
|
||||||
|
rekapGarduDistribusi.setJmlplg(newData.getJmlplg());
|
||||||
|
rekapGarduDistribusi.setUnitup(newData.getUnitup());
|
||||||
|
rekapGarduDistribusi.setKdpembmeter(newData.getKdpembmeter());
|
||||||
|
rekapGarduDistribusi.setJmldaya(newData.getJmldaya());
|
||||||
|
rekapGarduDistribusi.setNamaup(newData.getNamaup());
|
||||||
|
rekapGarduDistribusi.setThbllap(newData.getThbllap());
|
||||||
|
rekapGarduDistribusi.setNama_gardu(newData.getNama_gardu());
|
||||||
|
|
||||||
|
rekapGarduDistribusi.persist();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.error("Error during synchronization: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user