diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java new file mode 100644 index 0000000000000000000000000000000000000000..3f7f265c3344377f8f41ec36a0870817e7e5e2dc --- /dev/null +++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java @@ -0,0 +1,34 @@ +package spring.TK.SpringTkApap.user.controller; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import spring.TK.SpringTkApap.appointment.AppointmentRestController; +import spring.TK.SpringTkApap.user.model.DokterDTO; +import spring.TK.SpringTkApap.user.service.DokterService; + +import java.util.List; + +@RestController +@CrossOrigin(origins = "*") +@RequestMapping("/api/doktor") +@Slf4j +public class DokterRestController { + + Logger logger = LoggerFactory.getLogger(DokterRestController.class); + + @Autowired + private DokterService dokterService; + + @GetMapping(value = "/all") + public List<DokterDTO> getAllDoktor() { + logger.info("Berhasil mengambil data seluruh dokter yang ada"); + return dokterService.getAll(); + } + +} diff --git a/SpringTkApap/src/main/java/spring/tk/springtkapap/appointment/AppointmentServiceImpl.java b/SpringTkApap/src/main/java/spring/tk/springtkapap/appointment/AppointmentServiceImpl.java index fe12341954572a67dba668e4a405629c6f02d2e1..a95004bfd6fd3c8bdd5aaaefb7431548cc88106f 100644 --- a/SpringTkApap/src/main/java/spring/tk/springtkapap/appointment/AppointmentServiceImpl.java +++ b/SpringTkApap/src/main/java/spring/tk/springtkapap/appointment/AppointmentServiceImpl.java @@ -1,7 +1,7 @@ package spring.tk.springtkapap.appointment; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Service;<< import spring.tk.springtkapap.appointment.model.AppointmentModel; import spring.tk.springtkapap.user.model.DokterModel; diff --git a/SpringTkApap/src/main/java/spring/tk/springtkapap/user/controller/DokterController.java b/SpringTkApap/src/main/java/spring/tk/springtkapap/user/controller/DokterController.java index 4f8fb40883f42e6234e4648afeb0c0309c0340af..1a26d1a1e48046cc3b637015e45bab7a3eba8430 100644 --- a/SpringTkApap/src/main/java/spring/tk/springtkapap/user/controller/DokterController.java +++ b/SpringTkApap/src/main/java/spring/tk/springtkapap/user/controller/DokterController.java @@ -1,6 +1,8 @@ package spring.tk.springtkapap.user.controller; import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -11,89 +13,72 @@ import spring.tk.springtkapap.user.model.DokterModel; import spring.tk.springtkapap.user.model.DokterRevDTO; import spring.tk.springtkapap.user.service.DokterService; -import java.time.LocalDate; + +import java.time.LocalDateTime; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; + @Controller @RequestMapping("/dokter") @Slf4j public class DokterController { + Logger logger = LoggerFactory.getLogger(DokterRestController.class); + @Autowired DokterService dokterService; @Autowired AppointmentService appointmentService; - private static final String LISTDOKTER = "listDokter"; - @GetMapping("/choose") public String chooseDokter(Model model) { - model.addAttribute(LISTDOKTER, dokterService.retrieveAll()); + model.addAttribute("listDokter", dokterService.retrieveAll()); return "dokter/choose-dokter"; } - @PostMapping("/choose") - public String getchart(@ModelAttribute List<DokterModel> list, Model model) { - List<DokterModel> listDokter = dokterService.retrieveAll(); - var dokterRevDTO = new DokterRevDTO(); - List<String> listLabels = new ArrayList<>(); - List<Long> listRevenue = new ArrayList<>(); - List<Integer> listBanyakApt = new ArrayList<>(); - for (DokterModel dokterModel : listDokter) { - List<AppointmentModel> listApt = appointmentService.findAllByDokter(dokterModel); - listLabels.add(dokterModel.getUsername()); - long rev = 0; - var banyakApt = 0; - var i = 0; - while (i < listApt.size()) { - rev += dokterModel.getTarif(); - banyakApt += 1; - i++; - } - listRevenue.add(rev); - listBanyakApt.add(banyakApt); - } - dokterRevDTO.setNama(listLabels); - dokterRevDTO.setRevenue(listRevenue); - dokterRevDTO.setBanyakAppointment(listBanyakApt); - model.addAttribute(LISTDOKTER, dokterRevDTO); - return "dokter/dokter-chart"; - } - @PostMapping("/chart") public String chart(@RequestParam(value = "choosed") String[] choosed, Model model) { - List<String> listString = Arrays.stream(choosed).collect(Collectors.toList()); - var dokterRevDTO = new DokterRevDTO(); - List<String> listLabels = new ArrayList<>(); - List<Long> listRevenue = new ArrayList<>(); - List<Integer> listBanyakApt = new ArrayList<>(); - List<List<LocalDate>> listTanggal = new ArrayList<>(); - for (String usernameDokter : listString) { - var dokterModel = dokterService.getDokterByUsername(usernameDokter); - List<AppointmentModel> listApt = appointmentService.findAllByDokter(dokterModel); - listLabels.add(dokterModel.getUsername()); - long rev = 0; - var banyakApt = 0; - List<LocalDate> tanggal = new ArrayList<>(); + int[] rev = new int[choosed.length]; + int[] banyakApt = new int[choosed.length]; + List<int[]> monthlyRev= new ArrayList<>(); + List<String> month = new ArrayList<>(); + List<String> day = new ArrayList<>(); + List<int[]> dailyRev = new ArrayList<>(); + + for (int i = 0; i < rev.length; i++) { + DokterModel dokter = dokterService.getDokterByUsername(choosed[i]); + List<AppointmentModel> listApt = appointmentService.findAllByDokter(dokter); + banyakApt[i] = listApt.size(); + rev[i] = listApt.size() * dokter.getTarif(); + + int[] dataMonthly = new int[12]; + int[] dataDaily = new int[31]; for (AppointmentModel apt : listApt) { - log.info(apt.getWaktuAwal().toString()); - rev += dokterModel.getTarif(); - banyakApt += 1; - tanggal.add(apt.getWaktuAwal().toLocalDate()); + dataMonthly[apt.getWaktuAwal().getMonthValue()-1] += dokter.getTarif(); + dataDaily[apt.getWaktuAwal().getDayOfMonth()-1] += dokter.getTarif(); } - listRevenue.add(rev); - listBanyakApt.add(banyakApt); - listTanggal.add(tanggal); + monthlyRev.add(dataMonthly); + dailyRev.add(dataDaily); + } + + for (int i = 0; i < 12; i++) { + month.add(LocalDateTime.of(LocalDateTime.now().getYear(), 1, 1, 0, 0).plusMonths(i).getMonth().toString() + " " + LocalDateTime.now().getYear()); + } + + for (int i = 0; i < 31; i++) { + day.add(LocalDateTime.of(LocalDateTime.now().getYear(), LocalDateTime.now().getMonth(), 1, 0, 0).plusDays(i).getDayOfWeek().toString()); } - dokterRevDTO.setNama(listLabels); - dokterRevDTO.setRevenue(listRevenue); - dokterRevDTO.setBanyakAppointment(listBanyakApt); - dokterRevDTO.setTanggal(listTanggal); - model.addAttribute(LISTDOKTER, dokterRevDTO); + System.out.println(day); + model.addAttribute("label", choosed); + model.addAttribute("rev", rev); + model.addAttribute("banyakApt", banyakApt); + model.addAttribute("bulan", month); + model.addAttribute("day", day); + model.addAttribute("monthlyRev", monthlyRev); + model.addAttribute("dailyRev", dailyRev); + return "dokter/dokter-chart"; } } diff --git a/SpringTkApap/src/main/java/spring/tk/springtkapap/user/controller/DokterRestController.java b/SpringTkApap/src/main/java/spring/tk/springtkapap/user/controller/DokterRestController.java deleted file mode 100644 index 9cc803a5681bcd972c75c2e34997596c4db430d5..0000000000000000000000000000000000000000 --- a/SpringTkApap/src/main/java/spring/tk/springtkapap/user/controller/DokterRestController.java +++ /dev/null @@ -1,64 +0,0 @@ -package spring.tk.springtkapap.user.controller; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import spring.tk.springtkapap.appointment.AppointmentService; -import spring.tk.springtkapap.appointment.model.AppointmentModel; -import spring.tk.springtkapap.user.model.DokterDTO; -import spring.tk.springtkapap.user.model.DokterModel; -import spring.tk.springtkapap.user.model.DokterRevDTO; -import spring.tk.springtkapap.user.service.DokterService; - -import java.util.ArrayList; -import java.util.List; - -@RestController -@CrossOrigin(origins = "apap-tk-53.cs.ui.ac.id") -@RequestMapping("/api/doktor") -@Slf4j -public class DokterRestController { - - @Autowired - private DokterService dokterService; - - @Autowired - private AppointmentService appointmentService; - - @GetMapping(value = "/all") - public List<DokterDTO> getAllDoktor() { - log.info("Berhasil mengambil data seluruh dokter yang ada"); - return dokterService.getAll(); - } - - @GetMapping(value = "/rev") - public DokterRevDTO getDokterRev() { - List<DokterModel> listDokter = dokterService.retrieveAll(); - var dokterRevDTO = new DokterRevDTO(); - List<String> listLabels = new ArrayList<>(); - List<Long> listRevenue = new ArrayList<>(); - List<Integer> listBanyakApt = new ArrayList<>(); - for (DokterModel dokterModel : listDokter) { - List<AppointmentModel> listApt = appointmentService.findAllByDokter(dokterModel); - listLabels.add(dokterModel.getUsername()); - long rev = 0; - var banyakApt = 0; - var i = 0; - while (i < listApt.size()) { - rev += dokterModel.getTarif(); - banyakApt += 1; - i++; - } - listRevenue.add(rev); - listBanyakApt.add(banyakApt); - } - dokterRevDTO.setNama(listLabels); - dokterRevDTO.setRevenue(listRevenue); - dokterRevDTO.setBanyakAppointment(listBanyakApt); - return dokterRevDTO; - } - -} diff --git a/SpringTkApap/src/main/java/spring/tk/springtkapap/user/model/DokterRevDTO.java b/SpringTkApap/src/main/java/spring/tk/springtkapap/user/model/DokterRevDTO.java index 44cc5b40e116758b9942e6564acd3eea14af156b..33bfa1b1a739fec4cc5fab49250214fbd4ada019 100644 --- a/SpringTkApap/src/main/java/spring/tk/springtkapap/user/model/DokterRevDTO.java +++ b/SpringTkApap/src/main/java/spring/tk/springtkapap/user/model/DokterRevDTO.java @@ -14,8 +14,9 @@ import java.util.List; @AllArgsConstructor @NoArgsConstructor public class DokterRevDTO implements Serializable { - private List<String> nama; - private List<Long> revenue; - private List<Integer> banyakAppointment; - private List<List<LocalDate>> tanggal; + private int[] month = new int[12]; + private String nama; + private Long revenue = 0L; + private Integer banyakAppointment = 0; + private List<LocalDate> tanggal; } diff --git a/SpringTkApap/src/main/java/spring/tk/springtkapap/user/repository/DokterDB.java b/SpringTkApap/src/main/java/spring/tk/springtkapap/user/repository/DokterDB.java index 63a9982c4eee9d57495aaa7b4a591b275160d61b..7f06613727add92b13468538d56c6d464a44c766 100644 --- a/SpringTkApap/src/main/java/spring/tk/springtkapap/user/repository/DokterDB.java +++ b/SpringTkApap/src/main/java/spring/tk/springtkapap/user/repository/DokterDB.java @@ -4,6 +4,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import spring.tk.springtkapap.user.model.DokterModel; +import java.util.List; import java.util.Optional; @Repository diff --git a/SpringTkApap/src/main/resources/templates/dokter/dokter-chart.html b/SpringTkApap/src/main/resources/templates/dokter/dokter-chart.html index 33a4224855966957340d1b7101d24a5466ebd43b..4d4ace46daf29b2215767b59235cb675350baf0e 100644 --- a/SpringTkApap/src/main/resources/templates/dokter/dokter-chart.html +++ b/SpringTkApap/src/main/resources/templates/dokter/dokter-chart.html @@ -28,10 +28,12 @@ </div> <div id="line-chart"> <canvas id="yourChart" height="700" width="500"></canvas> - <input type="date" onchange="filterData()" id="startDate"></input> - <input type="date" onchange="filterData()" id="endDate"></input> + <button type="button" class="btn btn-outline-danger" onclick="changesType('monthly')">monthly + </button> + <button type="button" class="btn btn-outline-danger" onclick="changesType('daily')">daily</button> </div> - <button type="button" id="changes" onclick="changes()" class="btn btn-outline-success">Changes Style</button> + <button type="button" id="changes" onclick="changes()" class="btn btn-outline-success">Changes Style + </button> <a class="btn btn-primary" href="/">Home</a> </div> </div> @@ -41,9 +43,10 @@ <script th:inline="javascript"> - getData(); - var newChart; - var data; + getData('revenue'); + getDataLines('monthly'); + var barChart; + var lineChart; function changes() { const lineDiv = document.getElementById('line-chart'); @@ -60,43 +63,81 @@ } } - async function getDataLines() { - data = [[${listDokter}]] - newChart = new Chart(document.getElementById('yourChart'), { - type: 'line', - data: { - labels: data.tanggal, - datasets: [ - { - labels: data.name, - data: data.revenue + async function getDataLines(types) { + if (types === 'monthly') { + let listDokter = [[${label}]] + let monthly = [[${monthlyRev}]] + let dataset = [] + + for (let i = 0; i < listDokter.length; i++) { + let data = { + label: listDokter[i], + data: monthly[i] + } + dataset.push(data); + } + + const data = { + labels: [[${bulan}]], + datasets: dataset + } + lineChart = new Chart(document.getElementById('yourChart'), { + type: 'line', + data: data, + options: { + legend: {display: false}, + title: { + display: true, + text: "Revenue Dokter" + } } - ] - }, options: { - legend: {display: false}, - title: { - display: true, - text: "Revenue Dokter" } + ) + } else { + let listDokter = [[${label}]] + let daily = [[${dailyRev}]] + let dataset = [] + + for (let i = 0; i < listDokter.length; i++) { + let data = { + label: listDokter[i], + data: daily[i] + } + dataset.push(data); + } + const data = { + labels: [[${day}]], + datasets: dataset } - }) + lineChart = new Chart(document.getElementById('yourChart'), { + type: 'line', + data: data, + options: { + legend: {display: false}, + title: { + display: true, + text: "Revenue Dokter" + } + } + }) + } } async function getData(types) { if (types === "revenue") { - data = [[${listDokter}]] - console.log(data); - newChart = new Chart(document.getElementById('myChart'), { + const data = { + labels: [[${label}]], + datasets: [{ + label: "Revenue", + data: [[${rev}]], + borderWidth: 2 + }] + } + + barChart = new Chart(document.getElementById('myChart'), { type: 'bar', - data: { - labels: data.nama, - datasets: [ - { - label: "revenue", - data: data.revenue - } - ] - }, options: { + data: data, + options: { legend: {display: false}, title: { display: true, @@ -105,37 +146,45 @@ } }) } else { - data = [[${listDokter}]] - console.log(data); - newChart = new Chart(document.getElementById('myChart'), { + const data = { + labels: [[${label}]], + datasets: [{ + label: "Banyak Appointment", + data: [[${banyakApt}]], + borderWidth: 2 + }] + } + + barChart = new Chart(document.getElementById('myChart'), { type: 'bar', - data: { - labels: data.nama, - datasets: [ - { - label: "banyakAppointment", - data: data.banyakAppointment - } - ] - }, options: { + data: data, + options: { legend: {display: false}, title: { display: true, - text: "Banyak appointment dokter" + text: "Banyak Appointment" } } }) } } + function changesType(type) { + if (type === 'monthly') { + lineChart.destroy(); + getDataLines('monthly') + } else { + lineChart.destroy(); + getDataLines('daily') + } + } + function dataType(type) { - var newDataset - newChart.destroy() if (type === "revenue") { - console.log(data.revenue); + barChart.destroy(); getData("revenue") } else { - console.log(data.banyakAppointment); + barChart.destroy(); getData("banyak Appointment") } }