From e28f120d30b07b1958837f40c5fad8e71c1bc3f2 Mon Sep 17 00:00:00 2001 From: salmanoe Date: Fri, 26 Nov 2021 17:39:09 +0700 Subject: [PATCH] pembuatan perhitungan skor tindakan medis dokter anestesi menggunakan persentase klasifikasi asa berdasarkan surat keputusan the indonesian society of anesthesiology and intensive therapy tahun 2015 --- .../dao/IkiDanRemunerasiDao.java | 2 +- .../dao/PelayananPasienPetugasDao.java | 27 ++++- .../custom/SkoringTindakanMedisDaoCustom.java | 18 ++++ .../SkoringTindakanMedisDaoCustomImpl.java | 69 +++++++++++++ .../impl/LogbookKinerjaServiceImpl.java | 98 ++++++++++++++++++- .../vo/ReferensiSkorAnestesiVO.java | 77 +++++++++++++++ 6 files changed, 285 insertions(+), 6 deletions(-) create mode 100644 jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/custom/SkoringTindakanMedisDaoCustom.java create mode 100644 jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/custom/impl/SkoringTindakanMedisDaoCustomImpl.java create mode 100644 jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/vo/ReferensiSkorAnestesiVO.java diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/IkiDanRemunerasiDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/IkiDanRemunerasiDao.java index 70f8620a..9b3815d0 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/IkiDanRemunerasiDao.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/IkiDanRemunerasiDao.java @@ -170,7 +170,7 @@ public interface IkiDanRemunerasiDao extends PagingAndSortingRepository { - - + + @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 " + + "and ppp.ObjectJenisPetugasPeId in (4,6) " + "and ppp.pelayananPasienId in (:listPelayananId) " + + "group by ppp.pelayananPasienId " + "having count(ppp.pelayananPasienId) > 1") + List> countReferensiSkorPelayananAnestesi( + @Param("listPelayananId") List listPelayananId); + + @Query("select new Map(ppp.pelayananPasienId as pelayananId," + "ppp.ObjectJenisPetugasPeId as jenisPetugasId," + + "ppp.ObjectPegawaiId as petugasId," + "coalesce(ppp.asaId,1) as asaId," + + "mj.subUnitKerjaPegawaiId as kkId," + "pp.produkId as produkId) " + "from PelayananPasienPetugas ppp, " + + "MapPegawaiJabatanToUnitKerja mj " + "inner join ppp.pelayananPasien pp " + + "where ppp.ObjectPegawaiId = mj.pegawaiId " + "and ppp.statusEnabled is true " + + "and pp.statusEnabled is true " + "and mj.statusEnabled is true " + + "and ppp.ObjectJenisPetugasPeId in (4,6) " + "and ppp.pelayananPasienId in (:listPelayananId) " + + "and mj.unitKerjaPegawaiId in (:listKsmId) " + "order by ppp.pelayananPasienId") + List> findReferensiSkorPelayananAnestesi(@Param("listPelayananId") List listPelayananId, + @Param("listKsmId") List listKsmId); + } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/custom/SkoringTindakanMedisDaoCustom.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/custom/SkoringTindakanMedisDaoCustom.java new file mode 100644 index 00000000..ebc33df6 --- /dev/null +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/custom/SkoringTindakanMedisDaoCustom.java @@ -0,0 +1,18 @@ +package com.jasamedika.medifirst2000.dao.custom; + +import java.util.List; +import java.util.Map; + +import com.jasamedika.medifirst2000.dao.custom.base.CoreDao; +import com.jasamedika.medifirst2000.entities.SkoringTindakanMedis; +import com.jasamedika.medifirst2000.vo.ReferensiSkorAnestesiVO; + +/** + * @author ITI-14 + * @since Nov 23, 2021 + */ +public interface SkoringTindakanMedisDaoCustom extends CoreDao { + + List> findSkoringLogbookDokter(String bulan, List listReferensiSkor); + +} diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/custom/impl/SkoringTindakanMedisDaoCustomImpl.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/custom/impl/SkoringTindakanMedisDaoCustomImpl.java new file mode 100644 index 00000000..f7dba4c8 --- /dev/null +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/custom/impl/SkoringTindakanMedisDaoCustomImpl.java @@ -0,0 +1,69 @@ +package com.jasamedika.medifirst2000.dao.custom.impl; + +import java.util.List; +import java.util.Map; + +import javax.persistence.Query; + +import org.springframework.stereotype.Repository; + +import com.jasamedika.medifirst2000.dao.custom.SkoringTindakanMedisDaoCustom; +import com.jasamedika.medifirst2000.dao.custom.base.impl.CoreDaoImpl; +import com.jasamedika.medifirst2000.entities.SkoringTindakanMedis; +import com.jasamedika.medifirst2000.util.CommonUtil; +import com.jasamedika.medifirst2000.vo.ReferensiSkorAnestesiVO; + +/** + * @author ITI-14 + * @since Nov 23, 2021 + */ +@Repository +public class SkoringTindakanMedisDaoCustomImpl extends CoreDaoImpl + implements SkoringTindakanMedisDaoCustom { + + public SkoringTindakanMedisDaoCustomImpl() { + super(SkoringTindakanMedis.class); + } + + @Override + public List> findSkoringLogbookDokter(String bulan, + List listReferensiSkor) { + StringBuffer buffer = new StringBuffer(); + buffer.append( + "select distinct new Map(" + "mj.subUnitKerjaPegawaiId as kelompokKerjaId,mj.pegawaiId as pegawaiId," + + "pr.id as produkId,pr.namaProduk as namaProduk," + + "stm.skor as skor,stm.tanggalMulaiBerlaku as tglMulaiBerlaku,stm.tanggalPembaharuanData as tglPembaharuanData) " + + "from SkoringTindakanMedis stm, " + "MapPegawaiJabatanToUnitKerja mj " + + "inner join stm.produk pr " + "where stm.kelompokKerjaId = mj.subUnitKerjaPegawaiId " + + "and stm.statusEnabled is true " + "and stm.statusVerifikasi is true " + + "and pr.statusEnabled is true " + "and mj.statusEnabled is true " + + "and to_char(stm.tanggalMulaiBerlaku,'yyyy-MM') <= '" + bulan + "' and "); + + if (CommonUtil.isNotNullOrEmpty(listReferensiSkor)) { + String appendData = ""; + for (ReferensiSkorAnestesiVO ref : listReferensiSkor) { + if (appendData.isEmpty()) { + appendData += "((mj.pegawaiId = " + ref.getDokterPemeriksaId() + " and mj.subUnitKerjaPegawaiId = " + + ref.getKelompokKerjaId() + " and pr.id = " + ref.getProdukId() + ")"; + } else { + appendData += " or (mj.pegawaiId = " + ref.getDokterPemeriksaId() + + " and mj.subUnitKerjaPegawaiId = " + ref.getKelompokKerjaId() + " and pr.id = " + + ref.getProdukId() + ")"; + } + + } + appendData += ") "; + buffer.append(appendData); + } + + buffer.append(" order by pr.namaProduk, stm.skor desc, stm.tanggalPembaharuanData desc"); + + Query query = em.createQuery(buffer.toString()); + + @SuppressWarnings("unchecked") + List> result = query.getResultList(); + + return result; + } + +} diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/LogbookKinerjaServiceImpl.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/LogbookKinerjaServiceImpl.java index 6d51b429..b2f94dbd 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/LogbookKinerjaServiceImpl.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/LogbookKinerjaServiceImpl.java @@ -39,9 +39,11 @@ import com.jasamedika.medifirst2000.dao.LogbookKinerjaDokterDao; import com.jasamedika.medifirst2000.dao.MapPegawaiJabatanToUnitKerjaDao; import com.jasamedika.medifirst2000.dao.MapPegawaiLaboratRadiologiDao; import com.jasamedika.medifirst2000.dao.PegawaiDao; +import com.jasamedika.medifirst2000.dao.PelayananPasienPetugasDao; import com.jasamedika.medifirst2000.dao.ShiftKerjaDao; import com.jasamedika.medifirst2000.dao.SkoringTindakanMedisDao; import com.jasamedika.medifirst2000.dao.TabelAcuanIndeksIKIDao; +import com.jasamedika.medifirst2000.dao.custom.SkoringTindakanMedisDaoCustom; import com.jasamedika.medifirst2000.entities.IndikatorKinerja; import com.jasamedika.medifirst2000.entities.IndikatorKinerjaDetail; import com.jasamedika.medifirst2000.entities.Jabatan; @@ -58,6 +60,7 @@ import com.jasamedika.medifirst2000.vo.IndikatorKinerjaVO; import com.jasamedika.medifirst2000.vo.JabatanVO; import com.jasamedika.medifirst2000.vo.LogbookKinerjaVO; import com.jasamedika.medifirst2000.vo.PegawaiVO; +import com.jasamedika.medifirst2000.vo.ReferensiSkorAnestesiVO; import com.jasamedika.medifirst2000.vo.SatuanIndikatorVO; import com.jasamedika.medifirst2000.vo.SkorDokterVO; @@ -103,6 +106,9 @@ public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements Logb @Autowired private SkoringTindakanMedisDao skoringTindakanMedisDao; + @Autowired + private SkoringTindakanMedisDaoCustom skoringTindakanMedisDaoCustom; + @Autowired private IndikatorKinerjaDetailDao indikatorKinerjaDetailDao; @@ -130,6 +136,9 @@ public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements Logb @Autowired private CatatanPerkembanganPasienTerintegrasiService cpptService; + @Autowired + private PelayananPasienPetugasDao pelayananPasienPetugasDao; + @Override public LogbookKinerjaVO add(LogbookKinerjaVO vo) throws JpaSystemException, ServiceVOException { Pegawai pegawai = pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai()); @@ -640,12 +649,12 @@ public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements Logb // lainnya } } - + double capaian = 0.0; if (detailSize > 0) { capaian = persenCapaian / detailSize; } - + String fragCapaian = df.format(capaian * Double.valueOf(map.get("target").toString())); hasil += capaian * Double.valueOf(map.get("target").toString()) / 100 * Double.valueOf(map.get("bobot").toString()); @@ -858,13 +867,96 @@ public class LogbookKinerjaServiceImpl extends BaseVoServiceImpl implements Logb Arrays.asList(Master.JenisProduk.NONTINDAKAN), Arrays.asList(Master.KelompokPasien.KELOMPOK_BPJS), Master.KelompokPasien.ASURANSI_LAIN, Master.Rekanan.JAMINAN_KEMENKES, Master.Produk.KARCIS); + /** + * Menghitung skor asa dokter anestesi + */ + List listIdPelayananAnestesi = new ArrayList<>(); + { + List> dataLayananAnestesi = new ArrayList<>(); + List listRefSkor = new ArrayList<>(); + + for (Map map : dataLayanan) { + if (map.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.DOKTER_ANASTESI)) { + listIdPelayananAnestesi.add(map.get("noRec").toString()); + dataLayananAnestesi.add(map); + } + } + List> listCountReferensiSkor = pelayananPasienPetugasDao + .countReferensiSkorPelayananAnestesi(listIdPelayananAnestesi); + + List listIdRefSkor = new ArrayList<>(); + for (Map map : listCountReferensiSkor) { + listIdRefSkor.add(map.get("pelayananId").toString()); + } + List> listDataReferensiSkor = pelayananPasienPetugasDao + .findReferensiSkorPelayananAnestesi(listIdRefSkor, Arrays.asList(Master.UnitKerja.KSM)); + + for (String idRefSkor : listIdRefSkor) { + ReferensiSkorAnestesiVO ref = new ReferensiSkorAnestesiVO(); + for (Map map : listDataReferensiSkor) { + if (idRefSkor.equals(map.get("pelayananId"))) { + ref.setPelayananId(map.get("pelayananId").toString()); + ref.setProdukId(Integer.valueOf(map.get("produkId").toString())); + if (map.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.DOKTER_PEMERIKSA)) { + ref.setDokterPemeriksaId(Integer.valueOf(map.get("petugasId").toString())); + ref.setKelompokKerjaId(Integer.valueOf(map.get("kkId").toString())); + } else if (map.get("jenisPetugasId").equals(Master.JenisPetugasPelaksana.DOKTER_ANASTESI)) { + ref.setDokterAnestesiId(Integer.valueOf(map.get("petugasId").toString())); + ref.setAsaId(Byte.valueOf(map.get("asaId").toString())); + } + } + } + listRefSkor.add(ref); + } + + List> dataSkorAnestesi = skoringTindakanMedisDaoCustom + .findSkoringLogbookDokter(mf.format(new Date(bulan)), listRefSkor); + + /** + * Skor dokter anestesi (bukan tindakan mandiri) + */ + for (ReferensiSkorAnestesiVO refSkor : listRefSkor) { + for (Map mapLayanan : dataLayananAnestesi) { + for (Map mapSkor : dataSkorAnestesi) { + if (refSkor.getPelayananId().equals(mapLayanan.get("noRec").toString()) + && refSkor.getAsaId().equals(Byte.valueOf(mapLayanan.get("asaId").toString())) + && refSkor.getProdukId().equals(Integer.valueOf(mapLayanan.get("produkId").toString())) + && refSkor.getProdukId().equals(Integer.valueOf(mapSkor.get("produkId").toString())) + && Integer.valueOf(mapLayanan.get("produkId").toString()) + .equals(Integer.valueOf(mapSkor.get("produkId").toString())) + && refSkor.getDokterAnestesiId() + .equals(Integer.valueOf(mapLayanan.get("pegawaiId").toString())) + && refSkor.getDokterPemeriksaId() + .equals(Integer.valueOf(mapSkor.get("pegawaiId").toString())) + && refSkor.getKelompokKerjaId() + .equals(Integer.valueOf(mapSkor.get("kelompokKerjaId").toString())) + && (((Date) mapLayanan.get("tglPelayanan")).after((Date) mapSkor.get("tglMulaiBerlaku")) + || ((Date) mapLayanan.get("tglPelayanan")) + .equals((Date) mapSkor.get("tglMulaiBerlaku")))) { + double skor = 0.0; + if (refSkor.getAsaId() >= 3) { + skor = 0.8 * Double.valueOf(mapSkor.get("skor").toString()); + } else if (refSkor.getAsaId() == 2) { + skor = 0.5 * Double.valueOf(mapSkor.get("skor").toString()); + } else { + skor = 0.4 * Double.valueOf(mapSkor.get("skor").toString()); + } + mapLayanan.put("skor", skor); + break; + } + } + } + } + } + List> dataSkor = skoringTindakanMedisDao.findSkoringLogbookDokter( mf.format(new Date(bulan)), Arrays.asList(idPegawai), Arrays.asList(Master.UnitKerja.KSM)); // SCORE for (Map mapLayanan : dataLayanan) { for (Map mapSkor : dataSkor) { - if (mapLayanan.get("produkId").equals(mapSkor.get("produkId")) + if (!listIdPelayananAnestesi.contains(mapLayanan.get("noRec")) + && mapLayanan.get("produkId").equals(mapSkor.get("produkId")) && (((Date) mapLayanan.get("tglPelayanan")).after((Date) mapSkor.get("tglMulaiBerlaku")) || ((Date) mapLayanan.get("tglPelayanan")) .equals((Date) mapSkor.get("tglMulaiBerlaku")))) { diff --git a/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/vo/ReferensiSkorAnestesiVO.java b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/vo/ReferensiSkorAnestesiVO.java new file mode 100644 index 00000000..86dea159 --- /dev/null +++ b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/vo/ReferensiSkorAnestesiVO.java @@ -0,0 +1,77 @@ +package com.jasamedika.medifirst2000.vo; + +import com.jasamedika.medifirst2000.helper.Caption; + +/** + * @author ITI-14 + * @since Nov 24, 2021 + */ +public class ReferensiSkorAnestesiVO { + + @Caption(value = "Kode Tindakan Dokter Anestesi") + private Integer produkId; + + @Caption(value = "Kode Pelayanan Pasien") + private String pelayananId; + + @Caption(value = "Kode Dokter Pemeriksa atau DPJP") + private Integer dokterPemeriksaId; + + @Caption(value = "Kode Kelompok Kerja Dokter Pemeriksa") + private Integer kelompokKerjaId; + + @Caption(value = "Kode Dokter Anestesi") + private Integer dokterAnestesiId; + + @Caption(value = "Kode Klasifikasi ASA") + private Byte asaId; + + public Integer getProdukId() { + return produkId; + } + + public void setProdukId(Integer produkId) { + this.produkId = produkId; + } + + public String getPelayananId() { + return pelayananId; + } + + public void setPelayananId(String pelayananId) { + this.pelayananId = pelayananId; + } + + public Integer getDokterPemeriksaId() { + return dokterPemeriksaId; + } + + public void setDokterPemeriksaId(Integer dokterPemeriksaId) { + this.dokterPemeriksaId = dokterPemeriksaId; + } + + public Integer getKelompokKerjaId() { + return kelompokKerjaId; + } + + public void setKelompokKerjaId(Integer kelompokKerjaId) { + this.kelompokKerjaId = kelompokKerjaId; + } + + public Integer getDokterAnestesiId() { + return dokterAnestesiId; + } + + public void setDokterAnestesiId(Integer dokterAnestesiId) { + this.dokterAnestesiId = dokterAnestesiId; + } + + public Byte getAsaId() { + return asaId; + } + + public void setAsaId(Byte asaId) { + this.asaId = asaId; + } + +}