modified function create hama in backend controller
This commit is contained in:
parent
151a3f055a
commit
213eb6273c
|
@ -52,30 +52,36 @@ exports.getHamaById = async (req, res) => {
|
|||
exports.createHama = async (req, res) => {
|
||||
try {
|
||||
const { nama, deskripsi, penanganan, nilai_pakar } = req.body;
|
||||
const file = req.file;
|
||||
const file = req.file;
|
||||
|
||||
// Cek kode terakhir
|
||||
// Generate kode otomatis
|
||||
const lastHama = await Hama.findOne({ order: [['id', 'DESC']] });
|
||||
let newKode = 'H01'; // Default kode awal
|
||||
let newKode = 'H01';
|
||||
if (lastHama) {
|
||||
const lastNumber = parseInt(lastHama.kode.substring(1)) + 1;
|
||||
newKode = `H${lastNumber.toString().padStart(2, '0')}`;
|
||||
}
|
||||
|
||||
// Cek kalau ada file yang diupload
|
||||
// Tangani upload file
|
||||
let fotoPath = '';
|
||||
if (file) {
|
||||
fotoPath = file.filename;
|
||||
fotoPath = file.filename;
|
||||
}
|
||||
|
||||
// Konversi nilai_pakar agar null jika kosong
|
||||
let nilaiPakar = null;
|
||||
if (nilai_pakar !== undefined && nilai_pakar !== '') {
|
||||
nilaiPakar = parseFloat(nilai_pakar);
|
||||
}
|
||||
|
||||
const newHama = await Hama.create({
|
||||
kode: newKode,
|
||||
nama,
|
||||
kategori: 'hama',
|
||||
kategori: 'hama',
|
||||
deskripsi,
|
||||
penanganan,
|
||||
foto: fotoPath,
|
||||
nilai_pakar
|
||||
foto: fotoPath,
|
||||
nilai_pakar: nilaiPakar
|
||||
});
|
||||
|
||||
res.status(201).json({ message: 'Hama berhasil ditambahkan', data: newHama });
|
||||
|
@ -85,6 +91,7 @@ exports.createHama = async (req, res) => {
|
|||
};
|
||||
|
||||
|
||||
|
||||
// 🔹 Fungsi untuk mengupdate hama berdasarkan ID
|
||||
exports.updateHama = async (req, res) => {
|
||||
try {
|
||||
|
|
|
@ -38,31 +38,36 @@ class _TambahHamaPageState extends State<TambahHamaPage> {
|
|||
}
|
||||
|
||||
Future<void> _simpanHama() async {
|
||||
if (namaController.text.isNotEmpty &&
|
||||
deskripsiController.text.isNotEmpty &&
|
||||
penangananController.text.isNotEmpty &&
|
||||
nilaiPakarController.text.isNotEmpty) {
|
||||
try {
|
||||
if (namaController.text.isNotEmpty &&
|
||||
deskripsiController.text.isNotEmpty &&
|
||||
penangananController.text.isNotEmpty) {
|
||||
try {
|
||||
double? nilaipakar;
|
||||
if (nilaiPakarController.text.isNotEmpty) {
|
||||
String nilaiInput = nilaiPakarController.text.replaceAll(',', '.');
|
||||
double nilaiPakar = double.parse(nilaiInput);
|
||||
await apiService.createHama(
|
||||
namaController.text,
|
||||
deskripsiController.text,
|
||||
penangananController.text,
|
||||
_pickedFile,
|
||||
nilaiPakar,
|
||||
);
|
||||
widget.onHamaAdded();
|
||||
Navigator.pop(context);
|
||||
_showDialog('Berhasil', 'Data hama berhasil ditambahkan.');
|
||||
} catch (e) {
|
||||
_showDialog('Gagal', 'Gagal menambahkan data hama.');
|
||||
print("Error adding hama: $e");
|
||||
nilaipakar = double.parse(nilaiInput);
|
||||
}
|
||||
} else {
|
||||
_showDialog('Error', 'Semua field harus diisi.');
|
||||
|
||||
await apiService.createHama(
|
||||
namaController.text,
|
||||
deskripsiController.text,
|
||||
penangananController.text,
|
||||
_pickedFile,
|
||||
nilaipakar, // boleh null
|
||||
);
|
||||
|
||||
widget.onHamaAdded();
|
||||
Navigator.pop(context);
|
||||
_showDialog('Berhasil', 'Data hama berhasil ditambahkan.');
|
||||
} catch (e) {
|
||||
_showDialog('Gagal', 'Gagal menambahkan data hama.');
|
||||
print("Error adding hama: $e");
|
||||
}
|
||||
} else {
|
||||
_showDialog('Error', 'Semua field harus diisi (kecuali nilai pakar).');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void _showDialog(String title, String message) {
|
||||
showDialog(
|
||||
|
@ -142,11 +147,11 @@ class _TambahHamaPageState extends State<TambahHamaPage> {
|
|||
maxLines: 3,
|
||||
),
|
||||
SizedBox(height: 15),
|
||||
TextField(
|
||||
controller: nilaiPakarController,
|
||||
decoration: InputDecoration(labelText: 'Nilai Pakar'),
|
||||
maxLines: 3,
|
||||
),
|
||||
// TextField(
|
||||
// controller: nilaiPakarController,
|
||||
// decoration: InputDecoration(labelText: 'Nilai Pakar'),
|
||||
// maxLines: 3,
|
||||
// ),
|
||||
SizedBox(height: 15),
|
||||
Text('Foto'),
|
||||
(_webImage != null)
|
||||
|
|
|
@ -596,7 +596,7 @@ Future<List<Map<String, dynamic>>> getAllHistori() async {
|
|||
String deskripsi,
|
||||
String penanganan,
|
||||
XFile? pickedFile,
|
||||
double nilai_pakar
|
||||
double? nilai_pakar
|
||||
) async {
|
||||
try {
|
||||
var uri = Uri.parse(hamaUrl);
|
||||
|
|
|
@ -57,10 +57,10 @@ class _DiagnosaPageState extends State<DiagnosaPage> {
|
|||
|
||||
void prosesHasilDiagnosa() async {
|
||||
// Validasi minimal 3 gejala
|
||||
if (gejalaTerpilihIds.length < 3) {
|
||||
if (gejalaTerpilihIds.length < 2) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text('Silakan pilih minimal 3 gejala untuk melakukan diagnosa'),
|
||||
content: Text('Silakan pilih minimal 2 gejala untuk melakukan diagnosa'),
|
||||
backgroundColor: Color(0xFF9DC08D),
|
||||
duration: Duration(seconds: 3),
|
||||
),
|
||||
|
@ -194,7 +194,7 @@ class _DiagnosaPageState extends State<DiagnosaPage> {
|
|||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
child: Text(
|
||||
"${gejalaTerpilihIds.length}/min 3",
|
||||
"${gejalaTerpilihIds.length}/min 2",
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 12,
|
||||
|
@ -227,16 +227,16 @@ class _DiagnosaPageState extends State<DiagnosaPage> {
|
|||
height: 30,
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: gejalaTerpilihIds.length >= 3 ? Colors.green : Colors.grey,
|
||||
backgroundColor: gejalaTerpilihIds.length >= 2 ? Colors.green : Colors.grey,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(15),
|
||||
),
|
||||
),
|
||||
onPressed: gejalaTerpilihIds.length >= 3 ? prosesHasilDiagnosa : null,
|
||||
onPressed: gejalaTerpilihIds.length >= 2 ? prosesHasilDiagnosa : null,
|
||||
child: Text(
|
||||
gejalaTerpilihIds.length >= 3
|
||||
gejalaTerpilihIds.length >= 2
|
||||
? "Lihat Hasil Diagnosa"
|
||||
: "Pilih minimal 3 gejala",
|
||||
: "Pilih minimal 2 gejala",
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 16,
|
||||
|
|
|
@ -913,7 +913,7 @@ class _HasilDiagnosaPageState extends State<HasilDiagnosaPage> {
|
|||
),
|
||||
child: Center(
|
||||
child: Text(
|
||||
'${(probabilitas * 100).toStringAsFixed(0)}%',
|
||||
'${(probabilitas * 100).toStringAsFixed(1)}%',
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontWeight: FontWeight.bold,
|
||||
|
|
|
@ -29,7 +29,7 @@ class _HomePageState extends State<HomePage> {
|
|||
void _startAutoLogoutTimer() {
|
||||
_logoutTimer?.cancel(); // Pastikan timer sebelumnya di-cancel
|
||||
|
||||
_logoutTimer = Timer(const Duration(minutes: 5), () async {
|
||||
_logoutTimer = Timer(const Duration(hours: 12), () async {
|
||||
// Hapus semua data login
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
await prefs.clear();
|
||||
|
|
Loading…
Reference in New Issue