Update service absensi pegawai

Penerapan MinIO untuk penyimpanan object storage presensi pegawai
This commit is contained in:
Salman Manoe 2024-11-29 10:13:40 +07:00
parent 4ef46784b9
commit 337c4309f1
4 changed files with 120 additions and 43 deletions

View File

@ -283,6 +283,25 @@
<version>${commons-io.version}</version> <version>${commons-io.version}</version>
</dependency> </dependency>
<!-- End Lukman --> <!-- End Lukman -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.3.0</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.1</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0-jre</version>
</dependency>
</dependencies> </dependencies>
<organization> <organization>
<name>Jasa Medika</name> <name>Jasa Medika</name>

View File

@ -11,21 +11,25 @@ import com.jasamedika.medifirst2000.entities.AbsensiPegawai;
import com.jasamedika.medifirst2000.entities.Habsen; import com.jasamedika.medifirst2000.entities.Habsen;
import com.jasamedika.medifirst2000.entities.JadwalDokter; import com.jasamedika.medifirst2000.entities.JadwalDokter;
import com.jasamedika.medifirst2000.entities.ShiftKerja; import com.jasamedika.medifirst2000.entities.ShiftKerja;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.AbsensiPegawaiService; import com.jasamedika.medifirst2000.service.AbsensiPegawaiService;
import com.jasamedika.medifirst2000.service.LogAccService; import com.jasamedika.medifirst2000.service.LogAccService;
import com.jasamedika.medifirst2000.util.CommonUtil; import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.ImageUtil; import com.jasamedika.medifirst2000.util.ImageUtil;
import com.jasamedika.medifirst2000.util.minio.MinioClientUtil;
import com.jasamedika.medifirst2000.vo.AbsensiPegawaiVO; import com.jasamedika.medifirst2000.vo.AbsensiPegawaiVO;
import com.jasamedika.medifirst2000.vo.HabsenVO; import com.jasamedika.medifirst2000.vo.HabsenVO;
import io.minio.PutObjectArgs;
import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.file.Files;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -65,7 +69,7 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse
@Override @Override
public Map<String, Object> saveAbsensiPegawai(AbsensiPegawaiVO vo) { public Map<String, Object> saveAbsensiPegawai(AbsensiPegawaiVO vo) {
Map<String, Object> result = new HashMap<String, Object>(); Map<String, Object> result = new HashMap<>();
AbsensiPegawai model = new AbsensiPegawai(); AbsensiPegawai model = new AbsensiPegawai();
model = absensiPegawaiConverter.transferVOToModel(vo, model); model = absensiPegawaiConverter.transferVOToModel(vo, model);
@ -92,13 +96,7 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse
@Override @Override
public Map<String, Object> findByName(String nama) { public Map<String, Object> findByName(String nama) {
Map<String, Object> result = new HashMap<String, Object>(); return new HashMap<>();
try {
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
return result;
} }
@Override @Override
@ -114,7 +112,7 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse
@Override @Override
public Map<String, Object> saveHabsensiPegawai(HabsenVO vo) { public Map<String, Object> saveHabsensiPegawai(HabsenVO vo) {
Map<String, Object> result = new HashMap<String, Object>(); Map<String, Object> result = new HashMap<>();
Habsen model = presensiConverter.transferVOToModel(vo, new Habsen()); Habsen model = presensiConverter.transferVOToModel(vo, new Habsen());
@ -125,7 +123,7 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse
model.setRemoteno(Master.PresensiPegawai.SMART_REMOTE_NO); model.setRemoteno(Master.PresensiPegawai.SMART_REMOTE_NO);
model.setAcc_code(Master.PresensiPegawai.DEFAULT_ACC_CODE); model.setAcc_code(Master.PresensiPegawai.DEFAULT_ACC_CODE);
/** /*
* automatic reverse geocoding was disabled due to too many request to * automatic reverse geocoding was disabled due to too many request to
* nominatim.openstreetmap.org * nominatim.openstreetmap.org
*/ */
@ -169,28 +167,35 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse
} }
public void uploadPhotoCapture(String imageURLData, String idFinger, Date trDate, Date trTime, Integer trNo) { public void uploadPhotoCapture(String imageURLData, String idFinger, Date trDate, Date trTime, Integer trNo) {
DateFormat mf = new SimpleDateFormat("yyyyMM"); byte[] imageData = Base64.decodeBase64(imageURLData.substring(imageURLData.indexOf(",") + 1));
if (trDate.after(new Date(MinioClientUtil.CUTOFF_TIMESTAMP))) {
uploadToMinio(imageData, idFinger, trDate, trTime, trNo);
} else {
try {
DateFormat mf = new SimpleDateFormat("yyyyMM");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
DateFormat tf = new SimpleDateFormat("HH.mm.ss");
String directory = getDirPathPresensiPegawai(mf.format(trDate));
String filename = directory + idFinger + "_" + df.format(trDate) + "_" + tf.format(trTime) + "#" + trNo
+ ".jpg";
File outputFile = new File(filename);
OutputStream stream = Files.newOutputStream(outputFile.toPath());
stream.write(imageData);
stream.close();
} catch (IOException e) {
throw new ServiceVOException(e.getMessage());
}
}
}
private void uploadToMinio(byte[] imageData, String idFinger, Date trDate, Date trTime, Integer trNo) {
ByteArrayInputStream inputStream = new ByteArrayInputStream(imageData);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
DateFormat tf = new SimpleDateFormat("HH.mm.ss"); DateFormat tf = new SimpleDateFormat("HH.mm.ss");
String filename = idFinger + "_" + df.format(trDate) + "_" + tf.format(trTime) + "#" + trNo + ".jpg";
String directory = getDirPathPresensiPegawai(mf.format(trDate)); PutObjectArgs objectArgs = PutObjectArgs.builder().bucket("presensi-pegawai").object(filename)
String filename = directory + idFinger.toString() + "_" + df.format(trDate) + "_" + tf.format(trTime) + "#" .stream(inputStream, imageData.length, -1).contentType("image/jpeg").build();
+ trNo + ".jpg"; MinioClientUtil.upload(objectArgs);
String str = imageURLData;
byte[] imagedata = Base64.decodeBase64(str.substring(str.indexOf(",") + 1));
try {
File dire = new File(directory);
if (!dire.exists())
dire.mkdirs();
File outputFile = new File(filename);
OutputStream stream = new FileOutputStream(outputFile);
stream.write(imagedata);
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
private Double getDecimal(Double n) { private Double getDecimal(Double n) {
@ -207,13 +212,13 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse
nf.setMaximumFractionDigits(2); nf.setMaximumFractionDigits(2);
String latSecStr = nf.format(getDecimal(getDecimal(Math.abs(latitude)) * 60) * 60); String latSecStr = nf.format(getDecimal(getDecimal(Math.abs(latitude)) * 60) * 60);
String latStr = ""; String latStr;
if (latitude < 0) { if (latitude < 0) {
latStr = latDegStr + "\u00B0" + latMinStr + "\u2032" + latSecStr + "\u2033 LS"; latStr = latDegStr + "°" + latMinStr + "" + latSecStr + " LS";
} else if (latitude > 0) { } else if (latitude > 0) {
latStr = latDegStr + "\u00B0" + latMinStr + "\u2032" + latSecStr + "\u2033 LU"; latStr = latDegStr + "°" + latMinStr + "" + latSecStr + " LU";
} else { } else {
latStr = latDegStr + "\u00B0" + latMinStr + "\u2032" + latSecStr + "\u2033"; latStr = latDegStr + "°" + latMinStr + "" + latSecStr + "";
} }
nf.setMaximumFractionDigits(0); nf.setMaximumFractionDigits(0);
@ -223,13 +228,13 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse
nf.setMaximumFractionDigits(2); nf.setMaximumFractionDigits(2);
String longSecStr = nf.format(getDecimal(getDecimal(Math.abs(longitude)) * 60) * 60); String longSecStr = nf.format(getDecimal(getDecimal(Math.abs(longitude)) * 60) * 60);
String longStr = ""; String longStr;
if (longitude < 0) { if (longitude < 0) {
longStr = longDegStr + "\u00B0" + longMinStr + "\u2032" + longSecStr + "\u2033 BB"; longStr = longDegStr + "°" + longMinStr + "" + longSecStr + " BB";
} else if (longitude > 0) { } else if (longitude > 0) {
longStr = longDegStr + "\u00B0" + longMinStr + "\u2032" + longSecStr + "\u2033 BT"; longStr = longDegStr + "°" + longMinStr + "" + longSecStr + " BT";
} else { } else {
longStr = longDegStr + "\u00B0" + longMinStr + "\u2032" + longSecStr + "\u2033"; longStr = longDegStr + "°" + longMinStr + "" + longSecStr + "";
} }
return latStr + ", " + longStr; return latStr + ", " + longStr;
@ -298,7 +303,7 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse
@Override @Override
public Map<String, Object> findJadwalPegawai(Integer idPegawai) { public Map<String, Object> findJadwalPegawai(Integer idPegawai) {
Map<String, Object> result = new HashMap<>(); Map<String, Object> result;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String today = sdf.format(new Date()); String today = sdf.format(new Date());
result = habsensiDao.getPegawai(idPegawai); result = habsensiDao.getPegawai(idPegawai);
@ -332,7 +337,7 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse
@Override @Override
public List<Map<String, Object>> findHistoriPresensi(Integer idPegawai) { public List<Map<String, Object>> findHistoriPresensi(Integer idPegawai) {
List<Map<String, Object>> result = new ArrayList<>(); List<Map<String, Object>> result;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String today = sdf.format(new Date()); String today = sdf.format(new Date());
@ -348,7 +353,7 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse
} else { } else {
map.put("processtatus", "WFO"); map.put("processtatus", "WFO");
} }
if (vpnIPList.contains(map.get("ip_addr"))) { if (vpnIPList.contains(map.get("ip_addr").toString())) {
boolean isAksesLuar = false; boolean isAksesLuar = false;
for (String vpnIPX : vpnIPXList) for (String vpnIPX : vpnIPXList)
if (map.get("client_ip_addr").toString().startsWith(vpnIPX)) { if (map.get("client_ip_addr").toString().startsWith(vpnIPX)) {
@ -361,7 +366,7 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse
map.put("ip_addr", "menggunakan jaringan internet RSAB"); map.put("ip_addr", "menggunakan jaringan internet RSAB");
} else { } else {
if (listIp.contains(map.get("ip_addr"))) { if (listIp.contains(map.get("ip_addr").toString())) {
map.put("ip_addr", "menggunakan jaringan internet RSAB"); map.put("ip_addr", "menggunakan jaringan internet RSAB");
} else if (CommonUtil.isNullOrEmpty(map.get("ip_addr"))) { } else if (CommonUtil.isNullOrEmpty(map.get("ip_addr"))) {
map.put("ip_addr", "jaringan internet tidak terdeteksi"); map.put("ip_addr", "jaringan internet tidak terdeteksi");

View File

@ -0,0 +1,31 @@
package com.jasamedika.medifirst2000.util.minio;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.errors.MinioException;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
/**
* @author salmanoe
* @version 1.0.0
* @since 20/11/2024
*/
public final class MinioClientUtil {
public static final long CUTOFF_TIMESTAMP = 1732035599000L;
public static void upload(PutObjectArgs objectArgs) {
MinioClient minioClient;
try {
minioClient = MinioClientWrapper.minioClient();
minioClient.putObject(objectArgs);
} catch (IOException | MinioException | InvalidKeyException | NoSuchAlgorithmException e) {
throw new ServiceVOException(e.getMessage());
}
}
}

View File

@ -0,0 +1,22 @@
package com.jasamedika.medifirst2000.util.minio;
import io.minio.MinioClient;
import java.io.IOException;
/**
* @author salmanoe
* @version 1.0.0
* @since 19/11/2024
*/
public class MinioClientWrapper {
private static final String ENDPOINT = "https://minio-2.rsabhk.co.id:90";
private static final String ACCESS_KEY = "6QLQ3GNgQFf2ax8PJXuu";
private static final String SECRET_KEY = "nPrfuFezKLd36mI2qqGJ5djLiKxhNExIrPr3j4oq";
public static MinioClient minioClient() throws IOException {
return MinioClient.builder().endpoint(ENDPOINT).credentials(ACCESS_KEY, SECRET_KEY).build();
}
}