Create service scheduler rekap logbook dokter

This commit is contained in:
Salman Manoe 2023-11-07 21:08:29 +07:00
parent 6d7caee0c7
commit f9f6a5a75a
5 changed files with 287 additions and 4 deletions

View File

@ -2,21 +2,21 @@ package com.jasamedika.medifirst2000.dao;
import com.jasamedika.medifirst2000.entities.PelayananPasienPetugas;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Repository class for PelayananPasien
*
* @author Generator
*/
@Repository("PelayananPasienPetugasDao")
public interface PelayananPasienPetugasDao extends PagingAndSortingRepository<PelayananPasienPetugas, String> {
public interface PelayananPasienPetugasDao extends JpaRepository<PelayananPasienPetugas, String> {
@Query("select new Map(ppp.pelayananPasienId as pelayananId, count(ppp.pelayananPasienId) as sumPelayananId) "
+ "from PelayananPasienPetugas ppp " + "inner join ppp.pelayananPasien pp "
+ "where ppp.statusEnabled is true " + "and pp.statusEnabled is true "
@ -55,4 +55,8 @@ public interface PelayananPasienPetugasDao extends PagingAndSortingRepository<Pe
+ "where pp.noRec in (:listNoRecPelayanan)")
List<Map<String, Object>> findAllByPelayananPasienNoRecIn(
@Param("listNoRecPelayanan") List<String> listNoRecPelayanan);
@Query("select ppp.ObjectPegawaiId " + "from PelayananPasienPetugas ppp " + "inner join ppp.pelayananPasien pp "
+ "where pp.tglPelayanan between :tglAwal and :tglAkhir")
Set<Integer> findPegawaiByTglPelayanan(@Param("tglAwal") Date tglAwal, @Param("tglAkhir") Date tglAkhir);
}

View File

@ -0,0 +1,12 @@
package com.jasamedika.medifirst2000.dao;
import com.jasamedika.medifirst2000.entities.RekapLogbookDokter;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* @author salmanoe
* @version 1.0.0
* @since 07/11/2023
*/
public interface RekapLogbookDokterDao extends JpaRepository<RekapLogbookDokter, String> {
}

View File

@ -0,0 +1,66 @@
package com.jasamedika.medifirst2000.entities;
import com.jasamedika.medifirst2000.base.BaseTransaction;
import com.jasamedika.medifirst2000.helper.Caption;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.validator.constraints.NotBlank;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Date;
import static javax.persistence.FetchType.LAZY;
import static javax.persistence.TemporalType.DATE;
/**
* @author salmanoe
* @version 1.0.0
* @since 07/11/2023
*/
@Getter
@Setter
@Entity
@Table(name = "rekaplogbookdokter_t")
public class RekapLogbookDokter extends BaseTransaction {
private static final long serialVersionUID = -3729381313810208723L;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "pegawaifk")
@NotNull(message = "Pegawai tidak boleh kosong")
@Caption(value = "Pegawai")
private Pegawai pegawai;
@Column(name = "pegawaifk", insertable = false, updatable = false, nullable = false)
private Integer pegawaiId;
@Column(length = 16, nullable = false)
@NotBlank(message = "Jenis logbook tidak boleh kosong")
@Size(max = 16, message = "Jenis logbook maksimal {max} karaketer")
private String jenisLogbook;
@Column(length = 16)
@Size(max = 16, message = "Jenis ruangan maksimal {max} karaketer")
private String jenisRuangan;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "kelompokpasienfk")
@NotNull(message = "Kelompok pasien tidak boleh kosong")
@Caption(value = "Kelompok Pasien")
private KelompokPasien kelompokPasien;
@Column(name = "kelompokpasienfk", insertable = false, updatable = false, nullable = false)
private Integer kelompokPasienId;
@Column(nullable = false)
@NotNull(message = "Bulan logbook tidak boleh kosong")
@Temporal(DATE)
private Date bulan;
@Column(columnDefinition = "float default 0")
private Double jumlah;
@Column(columnDefinition = "float default 0")
private Double capaian;
}

View File

@ -0,0 +1,44 @@
package com.jasamedika.medifirst2000.vo;
import com.jasamedika.medifirst2000.base.vo.BaseTransactionVO;
import com.jasamedika.medifirst2000.helper.Caption;
import lombok.*;
import org.hibernate.validator.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Date;
/**
* @author salmanoe
* @version 1.0.0
* @since 07/11/2023
*/
@Getter
@Setter
public class RekapLogbookDokterVO extends BaseTransactionVO {
@NotNull(message = "Pegawai tidak boleh kosong")
@Caption(value = "Pegawai")
private PegawaiVO pegawai;
private Integer pegawaiId;
@NotBlank(message = "Jenis logbook tidak boleh kosong")
@Size(max = 16, message = "Jenis logbook maksimal {max} karaketer")
private String jenisLogbook;
@Size(max = 16, message = "Jenis ruangan maksimal {max} karaketer")
private String jenisRuangan;
@NotNull(message = "Kelompok pasien tidak boleh kosong")
@Caption(value = "Kelompok Pasien")
private KelompokPasienVO kelompokPasien;
private Integer kelompokPasienId;
private Date bulan;
private Double jumlah;
private Double capaian;
}

View File

@ -0,0 +1,157 @@
package com.jasamedika.medifirst2000.task.schedule;
import com.jasamedika.medifirst2000.dao.PelayananPasienPetugasDao;
import com.jasamedika.medifirst2000.dao.RekapLogbookDokterDao;
import com.jasamedika.medifirst2000.entities.KelompokPasien;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.RekapLogbookDokter;
import com.jasamedika.medifirst2000.service.PelayananPasienService;
import com.jasamedika.medifirst2000.util.DateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.*;
/**
* @author salmanoe
* @version 1.0.0
* @since 07/11/2023
*/
@Component
public class LogbookTask {
private static final Logger LOGGER = LoggerFactory.getLogger(PasienTask.class);
@Autowired
private PelayananPasienPetugasDao pelayananPasienPetugasDao;
@Autowired
private RekapLogbookDokterDao rekapLogbookDokterDao;
@Autowired
private PelayananPasienService pelayananPasienService;
@Scheduled(cron = "0 0 0 6 * ?")
public void saveRekapLogbookDokter() {
LOGGER.info("Simpan rekapitulasi logbook dokter");
LocalDate localDate = LocalDate.now().minusMonths(1);
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Date tglAwal = DateUtil.startMonth(date);
Date tglAkhir = DateUtil.endMonth(date);
Set<Integer> idPegawaiByTglPelayanan = pelayananPasienPetugasDao.findPegawaiByTglPelayanan(tglAwal, tglAkhir);
DateFormat df = new SimpleDateFormat("yyyy-MM");
String bulan = df.format(date);
List<RekapLogbookDokter> models = new ArrayList<>();
idPegawaiByTglPelayanan.forEach(id -> {
{
Map<String, Object> kinerjaDokter = pelayananPasienService.logbookRemunTarifDokter(id, bulan);
List<Map<String, Object>> remun = (List<Map<String, Object>>) kinerjaDokter.get("data");
List<Integer> listIdKelompokPasien = new ArrayList<>();
remun.forEach(r -> {
if (!listIdKelompokPasien.contains(Integer.parseInt(r.get("idKelompokPasien").toString())))
listIdKelompokPasien.add(Integer.parseInt(r.get("idKelompokPasien").toString()));
});
listIdKelompokPasien.forEach(idKelompokPasien -> {
double jumlah = remun.stream().filter(r -> idKelompokPasien.equals(r.get("idKelompokPasien")))
.mapToDouble(r -> Double.parseDouble(r.get("jumlah").toString())).sum();
double hargaJasa = remun.stream().filter(r -> idKelompokPasien.equals(r.get("idKelompokPasien")))
.mapToDouble(r -> Double.parseDouble(r.get("jumlahHargaJasa").toString())).sum();
RekapLogbookDokter rekapLogbookDokter = new RekapLogbookDokter();
rekapLogbookDokter.setKdProfile((short) 0);
rekapLogbookDokter.setStatusEnabled(true);
Pegawai pegawai = new Pegawai();
pegawai.setId(id);
rekapLogbookDokter.setPegawai(pegawai);
rekapLogbookDokter.setJenisLogbook("JKN");
KelompokPasien kelompokPasien = new KelompokPasien();
kelompokPasien.setId(idKelompokPasien);
rekapLogbookDokter.setKelompokPasien(kelompokPasien);
rekapLogbookDokter.setBulan(date);
rekapLogbookDokter.setJumlah(jumlah);
rekapLogbookDokter.setCapaian(hargaJasa);
models.add(rekapLogbookDokter);
});
}
{
List<Map<String, Object>> ffs = pelayananPasienService.logbookFfsTarifDokter(id, bulan);
List<String> listJenisRuangan = new ArrayList<>();
List<Integer> listIdKelompokPasien = new ArrayList<>();
ffs.forEach(r -> {
if (!listJenisRuangan.contains(r.get("jenisRuangan").toString()))
listJenisRuangan.add(r.get("jenisRuangan").toString());
if (!listIdKelompokPasien.contains(Integer.parseInt(r.get("idKelompokPasien").toString())))
listIdKelompokPasien.add(Integer.parseInt(r.get("idKelompokPasien").toString()));
});
listJenisRuangan.forEach(jenisRuangan -> listIdKelompokPasien.forEach(idKelompokPasien -> {
double jumlah = ffs.stream()
.filter(r -> jenisRuangan.equals(r.get("jenisRuangan"))
&& idKelompokPasien.equals(r.get("idKelompokPasien")))
.mapToDouble(r -> Double.parseDouble(r.get("jumlah").toString())).sum();
double hargaJasa = ffs.stream()
.filter(r -> jenisRuangan.equals(r.get("jenisRuangan"))
&& idKelompokPasien.equals(r.get("idKelompokPasien")))
.mapToDouble(r -> Double.parseDouble(r.get("jumlahHargaJasa").toString())).sum();
RekapLogbookDokter rekapLogbookDokter = new RekapLogbookDokter();
rekapLogbookDokter.setKdProfile((short) 0);
rekapLogbookDokter.setStatusEnabled(true);
Pegawai pegawai = new Pegawai();
pegawai.setId(id);
rekapLogbookDokter.setPegawai(pegawai);
rekapLogbookDokter.setJenisLogbook("NON_JKN");
rekapLogbookDokter.setJenisRuangan(jenisRuangan);
KelompokPasien kelompokPasien = new KelompokPasien();
kelompokPasien.setId(idKelompokPasien);
rekapLogbookDokter.setKelompokPasien(kelompokPasien);
rekapLogbookDokter.setBulan(date);
rekapLogbookDokter.setJumlah(jumlah);
rekapLogbookDokter.setCapaian(hargaJasa);
models.add(rekapLogbookDokter);
}));
}
{
List<Map<String, Object>> fixedPay = pelayananPasienService.logbookFixedPayDokter(id, bulan);
List<String> listJenisRuangan = new ArrayList<>();
List<Integer> listIdKelompokPasien = new ArrayList<>();
fixedPay.forEach(r -> {
if (!listJenisRuangan.contains(r.get("jenisRuangan").toString()))
listJenisRuangan.add(r.get("jenisRuangan").toString());
if (!listIdKelompokPasien.contains(Integer.parseInt(r.get("idKelompokPasien").toString())))
listIdKelompokPasien.add(Integer.parseInt(r.get("idKelompokPasien").toString()));
});
listJenisRuangan.forEach(jenisRuangan -> listIdKelompokPasien.forEach(idKelompokPasien -> {
double jumlah = fixedPay.stream()
.filter(r -> jenisRuangan.equals(r.get("jenisRuangan"))
&& idKelompokPasien.equals(r.get("idKelompokPasien")))
.mapToDouble(r -> Double.parseDouble(r.get("jumlah").toString())).sum();
double hargaJasa = fixedPay.stream()
.filter(r -> jenisRuangan.equals(r.get("jenisRuangan"))
&& idKelompokPasien.equals(r.get("idKelompokPasien")))
.mapToDouble(r -> Double.parseDouble(r.get("jumlahHargaJasa").toString())).sum();
RekapLogbookDokter rekapLogbookDokter = new RekapLogbookDokter();
rekapLogbookDokter.setKdProfile((short) 0);
rekapLogbookDokter.setStatusEnabled(true);
Pegawai pegawai = new Pegawai();
pegawai.setId(id);
rekapLogbookDokter.setPegawai(pegawai);
rekapLogbookDokter.setJenisLogbook("FIXED_PAY");
rekapLogbookDokter.setJenisRuangan(jenisRuangan);
KelompokPasien kelompokPasien = new KelompokPasien();
kelompokPasien.setId(idKelompokPasien);
rekapLogbookDokter.setKelompokPasien(kelompokPasien);
rekapLogbookDokter.setBulan(date);
rekapLogbookDokter.setJumlah(jumlah);
rekapLogbookDokter.setCapaian(hargaJasa);
models.add(rekapLogbookDokter);
}));
}
});
rekapLogbookDokterDao.save(models);
}
}