From 224b70647f7c04627865479e556662dc8080cda5 Mon Sep 17 00:00:00 2001 From: Salman Manoe Date: Fri, 24 Dec 2021 08:12:56 +0700 Subject: [PATCH] Update service remunerasi Pembuatan service hitung target skor dokter --- .../dao/IndeksKinerjaDokterDao.java | 14 +++- .../service/IkiDanRemunerasiService.java | 3 +- .../impl/IkiDanRemunerasiServiceImpl.java | 82 +++++++++++++++++++ .../IkiDanRemunerasiController.java | 18 ++++ 4 files changed, 115 insertions(+), 2 deletions(-) diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/IndeksKinerjaDokterDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/IndeksKinerjaDokterDao.java index 53549215..a6a06ebe 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/IndeksKinerjaDokterDao.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/IndeksKinerjaDokterDao.java @@ -1,15 +1,27 @@ package com.jasamedika.medifirst2000.dao; +import java.util.List; +import java.util.Map; + +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.orm.jpa.JpaSystemException; import org.springframework.stereotype.Repository; import com.jasamedika.medifirst2000.entities.IndeksKinerjaDokter; /** - * @author ITI-14 + * @author salmanoe * @since Nov 29, 2021 */ @Repository("indeksKinerjaDokterDao") public interface IndeksKinerjaDokterDao extends PagingAndSortingRepository { + @Query("select new Map(pkd.noRec as noRec," + "pkd.bulan as bulan," + "pkd.unitKerjaId as unitKerjaId," + + "pkd.subunitKerjaId as subunitKerjaId," + "pkd.pegawaiId as pegawaiId," + "pkd.iki as iki," + + "pkd.skor as skor," + "pkd.skorDasar as skorDasar) " + "from IndeksKinerjaDokter pkd " + + "where pkd.statusEnabled is true " + "and to_char(pkd.bulan,'yyyy') = :tahun") + List> findAll(@Param("tahun") String tahun) throws JpaSystemException; + } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/IkiDanRemunerasiService.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/IkiDanRemunerasiService.java index 55034f7e..9f79b5e6 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/IkiDanRemunerasiService.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/IkiDanRemunerasiService.java @@ -5,7 +5,6 @@ import java.util.Date; import java.util.List; import java.util.Map; -import com.jasamedika.medifirst2000.vo.LogbookKinerjaDokterVO; import com.jasamedika.medifirst2000.vo.SettingPirSdmVO; import com.jasamedika.medifirst2000.vo.StrukHistoriVO; import com.jasamedika.medifirst2000.vo.custom.TargetLayananJamKerjaVO; @@ -33,6 +32,8 @@ public interface IkiDanRemunerasiService { public Map savePirDanIku(List vo); + public void autoSaveTargetCapaianLayananJamKerja() throws ParseException; + public void autoSaveTargetCapaianLayananJamKerja(String strPeriode) throws ParseException; public void saveTargetCapaianLayananKelompokKerja(TargetLayananJamKerjaVO vo, Date periodeHitung) diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/IkiDanRemunerasiServiceImpl.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/IkiDanRemunerasiServiceImpl.java index 6b251a91..3edb0528 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/IkiDanRemunerasiServiceImpl.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/IkiDanRemunerasiServiceImpl.java @@ -2,12 +2,14 @@ package com.jasamedika.medifirst2000.service.impl; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -24,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional; import com.jasamedika.medifirst2000.constants.Master; import com.jasamedika.medifirst2000.converter.BaseConverterImpl; import com.jasamedika.medifirst2000.dao.IkiDanRemunerasiDao; +import com.jasamedika.medifirst2000.dao.IndeksKinerjaDokterDao; import com.jasamedika.medifirst2000.dao.IndikatorKinerjaDetailDao; import com.jasamedika.medifirst2000.dao.JabatanDao; import com.jasamedika.medifirst2000.dao.LogbookKinerjaDokterDao; @@ -41,6 +44,7 @@ import com.jasamedika.medifirst2000.dao.SubUnitKerjaDao; import com.jasamedika.medifirst2000.dao.TargetLayananDao; import com.jasamedika.medifirst2000.entities.EvaluasiJabatan; import com.jasamedika.medifirst2000.entities.IkiDanRemunerasi; +import com.jasamedika.medifirst2000.entities.IndeksKinerjaDokter; import com.jasamedika.medifirst2000.entities.IndikatorKinerjaDetail; import com.jasamedika.medifirst2000.entities.Jabatan; import com.jasamedika.medifirst2000.entities.KelompokTransaksi; @@ -57,6 +61,7 @@ import com.jasamedika.medifirst2000.entities.SuratKeputusan; import com.jasamedika.medifirst2000.entities.TargetLayanan; import com.jasamedika.medifirst2000.entities.UnitKerjaPegawai; import com.jasamedika.medifirst2000.service.IkiDanRemunerasiService; +import com.jasamedika.medifirst2000.service.LogbookKinerjaService; import com.jasamedika.medifirst2000.util.CommonUtil; import com.jasamedika.medifirst2000.util.CurrencyUtil; import com.jasamedika.medifirst2000.util.StringUtil; @@ -68,6 +73,7 @@ import com.jasamedika.medifirst2000.vo.KelompokTransaksiVO; import com.jasamedika.medifirst2000.vo.PegawaiVO; import com.jasamedika.medifirst2000.vo.RuanganVO; import com.jasamedika.medifirst2000.vo.SettingPirSdmVO; +import com.jasamedika.medifirst2000.vo.SkorDokterVO; import com.jasamedika.medifirst2000.vo.StrukHistoriVO; import com.jasamedika.medifirst2000.vo.SubUnitKerjaPegawaiVO; import com.jasamedika.medifirst2000.vo.SuratKeputusanVO; @@ -80,6 +86,9 @@ import com.jasamedika.medifirst2000.vo.custom.TargetLayananLuarJamKerjaVO; @Service("IkiDanRemunerasiService") public class IkiDanRemunerasiServiceImpl extends BaseVoServiceImpl implements IkiDanRemunerasiService { + @Autowired + private LogbookKinerjaService logbookKinerjaService; + @Autowired private BaseConverterImpl strukHistoriConverter; @@ -155,6 +164,9 @@ public class IkiDanRemunerasiServiceImpl extends BaseVoServiceImpl implements Ik @Autowired private MapPegawaiLaboratRadiologiDao mapPegawaiLaboratRadiologiDao; + @Autowired + private IndeksKinerjaDokterDao indeksKinerjaDokterDao; + @Override public Map loadData() { Map result = new HashMap<>(); @@ -485,6 +497,76 @@ public class IkiDanRemunerasiServiceImpl extends BaseVoServiceImpl implements Ik return result; } + @Override + public void autoSaveTargetCapaianLayananJamKerja() throws ParseException { + List> listIkiDokter = new ArrayList<>(); + + Integer lastYear = LocalDate.now().minusYears(1).getYear(); + + List> data = indeksKinerjaDokterDao.findAll(lastYear.toString()); + List listSkorDokter = this.logbookKinerjaService + .hitungTargetSkorLogbookDokter(lastYear.toString()); + + for (Map map : data) { + for (SkorDokterVO skorDokter : listSkorDokter) { + if (CommonUtil.isNullOrEmpty(map.get("skor")) && skorDokter.getIdPegawai().equals(map.get("pegawaiId")) + && skorDokter.getBulan().equals(map.get("bulan"))) { + map.put("skor", skorDokter.getSkor()); + } + } + } + + if (CommonUtil.isNotNullOrEmpty(data)) { + data.stream() + .filter(ikiDokter -> ikiDokter.get("iki") != null && ikiDokter.get("skor") != null + && !Double.valueOf(0.0).equals(ikiDokter.get("skor"))) + .collect(Collectors.groupingBy(ikiDokter -> ikiDokter.get("subunitKerjaId"), + Collectors.groupingBy(ikiDokter -> ikiDokter.get("iki")))) + .forEach((o1, objectListMap) -> objectListMap.forEach((o2, maps) -> { + List> sortedCollectMap = maps.stream() + .sorted(Comparator.comparing(o3 -> Double.valueOf(o3.get("skor").toString()))) + .collect(Collectors.toList()); + + int listMapSize = sortedCollectMap.size(); + boolean isIkiMax = Double.valueOf(3.0).equals(sortedCollectMap.get(0).get("iki")); + double score; + if (isIkiMax) { + // min + score = Double.parseDouble(sortedCollectMap.get(0).get("skor").toString()); + } else if (listMapSize % 2 == 0) { + // med for even + int center1 = listMapSize / 2 - 1; + int center2 = listMapSize / 2; + score = (Double.parseDouble(sortedCollectMap.get(center1).get("skor").toString()) + + Double.parseDouble(sortedCollectMap.get(center2).get("skor").toString())) / 2; + } else { + // med for odd + int center = listMapSize / 2; + score = Double.parseDouble(sortedCollectMap.get(center).get("skor").toString()); + } + + sortedCollectMap.forEach(collectMap -> { + double skorDasar = score / Double.parseDouble(collectMap.get("iki").toString()); + + collectMap.put("skorDasar", skorDasar); + }); + + listIkiDokter.addAll(sortedCollectMap); + })); + } + + List models = new ArrayList<>(); + for (Map ikiDokter : listIkiDokter) { + IndeksKinerjaDokter model = indeksKinerjaDokterDao.findOne(ikiDokter.get("noRec").toString()); + model.setSkor(Double.parseDouble(ikiDokter.get("skor").toString())); + model.setSkorDasar(Double.parseDouble(ikiDokter.get("skorDasar").toString())); + + models.add(model); + } + + indeksKinerjaDokterDao.save(models); + } + @Override public void autoSaveTargetCapaianLayananJamKerja(String strPeriode) throws ParseException { List> dataLayananRaw = new ArrayList<>(); diff --git a/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/controller/IkiDanRemunerasiController.java b/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/controller/IkiDanRemunerasiController.java index 33b4b335..4e063d08 100644 --- a/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/controller/IkiDanRemunerasiController.java +++ b/jasamedika-sdm/src/main/java/com/jasamedika/medifirst2000/controller/IkiDanRemunerasiController.java @@ -2147,4 +2147,22 @@ public class IkiDanRemunerasiController extends LocaleController hitungTargetSkorDokter(HttpServletRequest request) throws ParseException { + try { + service.autoSaveTargetCapaianLayananJamKerja(); + mapHeaderMessage.put(WebConstants.HttpHeaderInfo.LABEL_SUCCESS, + getMessage(MessageResource.LABEL_SUCCESS, request)); + return RestUtil.getJsonResponse(true, HttpStatus.CREATED, mapHeaderMessage); + } catch (ServiceVOException sve) { + LOGGER.error("Got exception {} when hitung target skor dokter", sve.getMessage()); + addHeaderMessage(Constants.MessageInfo.ERROR_MESSAGE, sve.getMessage()); + return RestUtil.getJsonHttptatus(HttpStatus.INTERNAL_SERVER_ERROR, mapHeaderMessage); + } catch (JpaSystemException jse) { + LOGGER.error("Got exception {} when hitung target skor dokter", jse.getMessage()); + addHeaderMessage(Constants.MessageInfo.ERROR_MESSAGE, jse.getMessage()); + return RestUtil.getJsonHttptatus(HttpStatus.CONFLICT, mapHeaderMessage); + } + } + }