Update service remunerasi

Pembuatan service hitung target skor dokter
This commit is contained in:
Salman Manoe 2021-12-24 08:12:56 +07:00
parent 18b3f5d7e2
commit 224b70647f
4 changed files with 115 additions and 2 deletions

View File

@ -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<IndeksKinerjaDokter, String> {
@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<Map<String, Object>> findAll(@Param("tahun") String tahun) throws JpaSystemException;
}

View File

@ -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<String, Object> savePirDanIku(List<SettingPirSdmVO> vo);
public void autoSaveTargetCapaianLayananJamKerja() throws ParseException;
public void autoSaveTargetCapaianLayananJamKerja(String strPeriode) throws ParseException;
public void saveTargetCapaianLayananKelompokKerja(TargetLayananJamKerjaVO vo, Date periodeHitung)

View File

@ -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<StrukHistoriVO, StrukHistori> strukHistoriConverter;
@ -155,6 +164,9 @@ public class IkiDanRemunerasiServiceImpl extends BaseVoServiceImpl implements Ik
@Autowired
private MapPegawaiLaboratRadiologiDao mapPegawaiLaboratRadiologiDao;
@Autowired
private IndeksKinerjaDokterDao indeksKinerjaDokterDao;
@Override
public Map<String, Object> loadData() {
Map<String, Object> result = new HashMap<>();
@ -485,6 +497,76 @@ public class IkiDanRemunerasiServiceImpl extends BaseVoServiceImpl implements Ik
return result;
}
@Override
public void autoSaveTargetCapaianLayananJamKerja() throws ParseException {
List<Map<String, Object>> listIkiDokter = new ArrayList<>();
Integer lastYear = LocalDate.now().minusYears(1).getYear();
List<Map<String, Object>> data = indeksKinerjaDokterDao.findAll(lastYear.toString());
List<SkorDokterVO> listSkorDokter = this.logbookKinerjaService
.hitungTargetSkorLogbookDokter(lastYear.toString());
for (Map<String, Object> 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<Map<String, Object>> 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<IndeksKinerjaDokter> models = new ArrayList<>();
for (Map<String, Object> 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<Map<String, Object>> dataLayananRaw = new ArrayList<>();

View File

@ -2147,4 +2147,22 @@ public class IkiDanRemunerasiController extends LocaleController<IkiDanRemuneras
}
}
@RequestMapping(value = "/hitung-target-skor-dokter", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Boolean> 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);
}
}
}