Update PelayananPasienServiceImpl.java

Pembuatan alur pemisahan dan urutan logbook remun dan ffs
This commit is contained in:
Salman Manoe 2023-03-28 13:45:52 +07:00
parent e0641a1b2c
commit 09e5767a48

View File

@ -5,18 +5,22 @@ import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.stream.Collectors;
import org.joda.time.format.DateTimeFormat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -411,27 +415,95 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel
date = df.parse(bulan);
} catch (ParseException e) {
e.printStackTrace();
return result;
}
/*
* Mendapatkan daftar jadwal kerja, tanggal dan jam kerja
*/
Date tglAwal = DateUtil.startMonth(date);
Date tglAkhir = DateUtil.endMonth(date);
List<Map<String, Object>> listJadwalKerja = pegawaiJadwalKerjaDao.findJamMasukJamPulang(idPegawai, tglAwal,
tglAkhir);
Double targetRemun = 5_000_000.00;
/*
* Mendapatkan nominal target remunerasi
*/
Double targetRemun = 161_000_000.00;
/*
* Mendapatkan data mentah pelayanan pasien
*/
List<Map<String, Object>> listData = pelayananPasienDao.findPelayananPasienByPetugasAndTanggal(idPegawai,
tglAwal, tglAkhir);
/*
* Alokasi data diurutkan dulu untuk jam kerja. Asumsi jam kerja dokter
* nonshift
*/
List<Map<String, Object>> listDataJamKerja = new ArrayList<>();
for (Map<String, Object> d : listData) {
LocalDate tglPelayanan = ((Date) d.get("tglPelayanan")).toInstant().atZone(ZoneId.systemDefault())
.toLocalDate();
LocalDateTime tglJamPelayanan = ((Date) d.get("tglPelayanan")).toInstant().atZone(ZoneId.systemDefault())
.toLocalDateTime();
for (Map<String, Object> j : listJadwalKerja) {
if (CommonUtil.isNotNullOrEmpty(j.get("jamMasuk"))) {
LocalDate tglMasuk = ((Date) j.get("tanggal")).toInstant().atZone(ZoneId.systemDefault())
.toLocalDate();
LocalTime jamMasuk = LocalTime.from(jamFormat.parse(j.get("jamMasuk").toString()));
LocalTime jamPulang = LocalTime.from(jamFormat.parse(j.get("jamPulang").toString()));
LocalDateTime tglJamMasuk = LocalDateTime.of(tglMasuk, jamMasuk);
LocalDateTime tglJamPulang = LocalDateTime.of(tglMasuk, jamPulang);
if (tglPelayanan.isEqual(tglMasuk)
&& (tglJamMasuk.isBefore(tglJamPelayanan) || tglJamMasuk.isEqual(tglJamPelayanan))
&& (tglJamPelayanan.isEqual(tglJamPulang) || tglJamPelayanan.isBefore(tglJamPulang))) {
listDataJamKerja.add(d);
break;
}
}
listJadwalKerja.forEach(j -> {
LocalTime jamMasuk = LocalTime.from(jamFormat.parse(j.get("jamMasuk").toString()));
LocalTime jamPulang = LocalTime.from(jamFormat.parse(j.get("jamPulang").toString()));
listData.forEach(d -> {
Date tglPelayanan = (Date) d.get("tglPelayanan");
});
});
}
}
/*
* Setelah diurutkan jam kerja, alokasi urutan data di luar jam kerja.
* Asumsi jam kerja dokter nonshift
*/
List<Map<String, Object>> listDataLuarJamKerja = new ArrayList<>();
for (Map<String, Object> d : listData) {
LocalDate tglPelayanan = ((Date) d.get("tglPelayanan")).toInstant().atZone(ZoneId.systemDefault())
.toLocalDate();
LocalDateTime tglJamPelayanan = ((Date) d.get("tglPelayanan")).toInstant().atZone(ZoneId.systemDefault())
.toLocalDateTime();
for (Map<String, Object> j : listJadwalKerja) {
LocalDate tglMasuk = ((Date) j.get("tanggal")).toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
if (CommonUtil.isNullOrEmpty(j.get("jamMasuk"))) {
if (tglPelayanan.isEqual(tglMasuk)) {
listDataLuarJamKerja.add(d);
break;
}
} else {
LocalTime jamMasuk = LocalTime.from(jamFormat.parse(j.get("jamMasuk").toString()));
LocalTime jamPulang = LocalTime.from(jamFormat.parse(j.get("jamPulang").toString()));
LocalDateTime tglJamMasuk = LocalDateTime.of(tglMasuk, jamMasuk);
LocalDateTime tglJamPulang = LocalDateTime.of(tglMasuk, jamPulang);
if ((tglPelayanan.isEqual(tglMasuk) && tglJamPelayanan.isBefore(tglJamMasuk))
|| (tglPelayanan.isEqual(tglMasuk) && tglJamPelayanan.isAfter(tglJamPulang))) {
listDataLuarJamKerja.add(d);
break;
}
}
}
}
/*
* Offer data yang sudah diurutkan dalam queue
*/
Queue<Map<String, Object>> queuePelayanan = new ArrayDeque<>();
listData.forEach(pelayanan -> {
listDataJamKerja.forEach(pelayanan -> {
queuePelayanan.offer(pelayanan);
});
listDataLuarJamKerja.forEach(pelayanan -> {
queuePelayanan.offer(pelayanan);
});
/*
* Memisahkan data diurutkan menjadi logbook remun dan logbook ffs
*/
List<Map<String, Object>> listPelayananRemun = new ArrayList<>();
List<Map<String, Object>> listPelayananFfs = new ArrayList<>();
Double capaianRemun = 0.0;
@ -445,8 +517,22 @@ public class PelayananPasienServiceImpl extends BaseVoServiceImpl implements Pel
} else {
listPelayananFfs.add(next);
}
remun.put("remun", listPelayananRemun);
ffs.put("ffs", listPelayananFfs);
/*
* Sorting data remun diurutkan
*/
List<Map<String, Object>> remunSorted = listPelayananRemun.stream()
.sorted(Comparator.comparing(o1 -> o1.get("namaProduk").toString()))
.sorted(Comparator.comparing(o2 -> o2.get("namaKelas").toString()))
.sorted(Comparator.comparing(o3 -> (Date) o3.get("tglPelayanan"))).collect(Collectors.toList());
remun.put("remun", remunSorted);
/*
* Sorting data ffs diurutkan
*/
List<Map<String, Object>> ffsSorted = listPelayananFfs.stream()
.sorted(Comparator.comparing(o1 -> o1.get("namaProduk").toString()))
.sorted(Comparator.comparing(o2 -> o2.get("namaKelas").toString()))
.sorted(Comparator.comparing(o3 -> (Date) o3.get("tglPelayanan"))).collect(Collectors.toList());
ffs.put("ffs", ffsSorted);
result.add(remun);
result.add(ffs);
return result;