Révision f128e34e

Voir les différences:

GES_PAC/App.xaml.cs
1 1
using GES_PAC.Model;
2 2
using GES_PAC.Services;
3
using GES_PAC.ViewModel;
4 3
using Microsoft.EntityFrameworkCore;
5 4

  
5

  
6 6
namespace GES_PAC
7 7
{
8 8
    public partial class App : Application
9 9
    {
10 10
        public static AppDbContext? Db { get; private set; }
11 11
        public static SicpaService? Sicpa { get; private set; }
12
        public static ConnexionService Connexion { get; private set; }
12 13
        public App()
13 14
        {
14 15
            //to delete database
......
23 24
            Db = new AppDbContext();
24 25
            Db.Database.EnsureCreated();
25 26
            _ = InitSmartEnumsAsync();
26

  
27 27
            Sicpa = new SicpaService();
28 28
            Sicpa.CreateToken();
29

  
30
            HandlerChanged += App_HandlerChanged;
29 31
        }
30 32

  
31 33
        protected override Window CreateWindow(IActivationState? activationState)
......
54 56
            }
55 57
            await Db.SaveChangesAsync();
56 58
        }
59
        private void App_HandlerChanged(object sender, EventArgs e)
60
        {
61
            if (Connexion == null && Handler?.MauiContext?.Services != null)
62
            {
63
                Connexion = Handler.MauiContext.Services.GetService<ConnexionService>();
64
            }
65
        }
57 66
    }
58 67
}
GES_PAC/Helpers/JourneeToCSV.cs
20 20
                {
21 21
                    foreach (var mesure in serieAnimal.Mesures)
22 22
                    {
23
                        sbMesure.AppendLine($"{journee.Elevage.Nom};{journee.Elevage.Client};{journee.Responsable.Nom};{journee.Elevage.Espece};{journee.Regime};{serie.MiseAJeun.ToString("yyyy-MM-dd HH:mm")};{serie.Temperature};{serie.Humidite};{serie.Pression};{serieAnimal.NumeroBoite};{serieAnimal.Poids};{serieAnimal.DatePesee.ToString("yyyy-MM-dd")};{serieAnimal.RFID};{mesure.Time.ToString("HH:mm:ss")};{mesure.Conc_O2};{mesure.Conc_CO2};{mesure.Conc_CH4}");
23
                        sbMesure.AppendLine($"{journee.Elevage.Nom};{journee.Elevage.Client};{journee.Responsable.Nom};{journee.Elevage.Espece};{journee.Regime};{serie.MiseAJeun.ToString("yyyy-MM-dd HH:mm")};{serie.Temperature};{serie.Humidite};{serie.Pression};{serieAnimal.NumeroBoite};{serieAnimal.Poids};{serieAnimal.DatePesee.ToString("yyyy-MM-dd")};{serieAnimal.RFID};{mesure.Time.ToString()};{mesure.Conc_O2};{mesure.Conc_CO2};{mesure.Conc_CH4}");
24 24
                    }
25 25
                    foreach (var comportement in serieAnimal.Comportements)
26 26
                    {
27
                        sbComportement.AppendLine($"{journee.Elevage.Nom};{journee.Elevage.Client};{journee.Responsable.Nom};{journee.Elevage.Espece};{journee.Regime};{serie.MiseAJeun.ToString("yyyy-MM-dd HH:mm")};{serie.Temperature};{serie.Humidite};{serie.Pression};{serieAnimal.NumeroBoite};{serieAnimal.Poids};{serieAnimal.DatePesee.ToString("yyyy-MM-dd")};{serieAnimal.RFID};{comportement.Time.ToString("HH:mm:ss")};{comportement.Type.ToString()};{comportement.Commentaire}");
27
                        sbComportement.AppendLine($"{journee.Elevage.Nom};{journee.Elevage.Client};{journee.Responsable.Nom};{journee.Elevage.Espece};{journee.Regime};{serie.MiseAJeun.ToString("yyyy-MM-dd HH:mm")};{serie.Temperature};{serie.Humidite};{serie.Pression};{serieAnimal.NumeroBoite};{serieAnimal.Poids};{serieAnimal.DatePesee.ToString("yyyy-MM-dd")};{serieAnimal.RFID};{comportement.Time.ToString()};{comportement.Type.ToString()};{comportement.Commentaire}");
28 28
                    }
29 29
                }
30 30
                foreach (var calibration in journee.Calibrations)
GES_PAC/Services/SicpaService.cs
8 8
using System.Threading.Tasks;
9 9
using GES_PAC.Model;
10 10
using GES_PAC.ViewModel;
11
using Microsoft.EntityFrameworkCore;
11 12
using SicpaJWT.Managers;
12 13
using SicpaJWT.Models;
13 14

  
......
40 41
            {
41 42
                Token = token;
42 43
                Date = DateTime.Now.ToString("dd-MM-yyyy");
43
                Console.WriteLine("token " + token);
44 44
            }
45 45
        }
46 46

  
47
        public async Task<List<Elevage>> GetAllElevageByEspece(int especeId)
47
        public async Task GetAllElevageByEspece(int especeId)
48 48
        {
49 49
            if (string.IsNullOrEmpty(Token))
50 50
                CreateToken();
......
58 58
            var json = await response.Content.ReadAsStringAsync();
59 59
            using var doc = JsonDocument.Parse(json);
60 60

  
61
            var result = new List<Elevage>();
61
            var elevages = new List<Elevage>();
62 62

  
63 63
            foreach (var element in doc.RootElement.EnumerateArray())
64 64
            {
......
66 66
                {
67 67
                    var idParts = element.GetProperty("idBD").GetString()?.Split(';') ?? [];
68 68

  
69
                    result.Add(new Elevage
69
                    elevages.Add(new Elevage
70 70
                    {
71 71
                        Id = element.GetProperty("id").GetInt32(),
72 72
                        Nom = element.GetProperty("nom").GetString() ?? "",
......
77 77
                        Espece = element.GetProperty("espece").GetProperty("nom").GetString() ?? ""
78 78
                    });
79 79
                }
80

  
81
                foreach (var elevage in elevages)
82
                {
83
                    var exists = await App.Db.Elevage.AsNoTracking().AnyAsync(e => e.Id == elevage.Id);
84
                    if (!exists)
85
                        App.Db.Elevage.Add(elevage);
86
                }
87
                await App.Db.SaveChangesAsync();
80 88
            }
81
            return result;
89
            return;
82 90
        }
83
        public async Task LoadAnimalInDb(Elevage elevage)
91
        public async Task<bool> LoadAnimalInDb(Elevage elevage)
84 92
        {
85
            using var httpClient = new HttpClient();
86
            var response = await httpClient.GetAsync($"{OvinCaprinUrl}/OvinCaprinService/getAnimauxByElevage/{elevage.ElvProd}/{elevage.Prod}/{elevage.EspeceId}");
93
            try
94
            {
95
                using var httpClient = new HttpClient();
96
                var response = await httpClient.GetAsync($"{OvinCaprinUrl}/OvinCaprinService/getAnimauxByElevage/{elevage.ElvProd}/{elevage.Prod}/{elevage.EspeceId}");
87 97

  
88
            var json = await response.Content.ReadAsStringAsync();
89
            using var doc = JsonDocument.Parse(json);
98
                var json = await response.Content.ReadAsStringAsync();
99
                using var doc = JsonDocument.Parse(json);
90 100

  
91
            var animaux = new List<Animal>();
101
                var animaux = new List<Animal>();
92 102

  
93
            foreach (var element in doc.RootElement.EnumerateArray())
94
            {
95
                if (element.TryGetProperty("idAnimal", out var idAnimalProperty) && idAnimalProperty.ValueKind == JsonValueKind.String)
103
                foreach (var element in doc.RootElement.EnumerateArray())
96 104
                {
97
                    animaux.Add(new Animal
105
                    if (element.TryGetProperty("idAnimal", out var idAnimalProperty) && idAnimalProperty.ValueKind == JsonValueKind.String)
98 106
                    {
99
                        IdAnimal = int.Parse(idAnimalProperty.GetString()),
100
                        ElvNe = int.Parse(element.GetProperty("elvNe").GetString()),
101
                        EspeceId = int.Parse(element.GetProperty("espece").GetString()),
102
                        Rfid = element.GetProperty("rfid").GetString(),
103
                        Sexe = int.Parse(element.GetProperty("sexe").GetString()),
104
                        Poids = element.GetProperty("poids").GetDouble(),
105
                        DateDernierePesee = element.TryGetProperty("dateDernierePesee", out var dateDernierePeseeProp) &&
106
                            dateDernierePeseeProp.ValueKind == JsonValueKind.String
107
                            ? DateTime.ParseExact(dateDernierePeseeProp.GetString(), "MMM d, yyyy", CultureInfo.InvariantCulture).Date
108
                            : null,
109
                    });
107
                        animaux.Add(new Animal
108
                        {
109
                            IdAnimal = int.Parse(idAnimalProperty.GetString()),
110
                            ElvNe = int.Parse(element.GetProperty("elvNe").GetString()),
111
                            EspeceId = int.Parse(element.GetProperty("espece").GetString()),
112
                            Rfid = element.GetProperty("rfid").GetString(),
113
                            Sexe = int.Parse(element.GetProperty("sexe").GetString()),
114
                            Poids = element.GetProperty("poids").GetDouble(),
115
                            DateDernierePesee = element.TryGetProperty("dateDernierePesee", out var dateDernierePeseeProp) &&
116
                                dateDernierePeseeProp.ValueKind == JsonValueKind.String
117
                                ? DateTime.ParseExact(dateDernierePeseeProp.GetString(), "MMM d, yyyy", CultureInfo.InvariantCulture).Date
118
                                : null,
119
                        });
120
                    }
110 121
                }
111
            }
112
            App.Db.Animal.RemoveRange(App.Db.Animal.Where(a => a.ElvNe == elevage.ElvProd));
122
                App.Db.Animal.RemoveRange(App.Db.Animal);
113 123

  
114
            App.Db.Animal.AddRange(animaux);
115
            await App.Db.SaveChangesAsync();
124
                App.Db.Animal.AddRange(animaux);
125
                await App.Db.SaveChangesAsync();
126
                return true;
127
            }
128
            catch (Exception ex)
129
            {
130
                return false;
131
            }
116 132
        }
117

  
118 133
    }
119 134
}
GES_PAC/ViewModel/CreateDayViewModel.cs
8 8
{
9 9
    public class CreateDayViewModel : BaseViewModel
10 10
    {
11

  
12 11
        #region Attributs
13 12
        private Personne _selectedPerson;
14 13
        private Elevage _selectedElevage;
......
85 84
        {
86 85
            if (IsBusy) return;
87 86
            IsBusy = true;
88
            await App.Sicpa.LoadAnimalInDb(SelectedElevage);
87

  
88
            var success = await App.Sicpa.LoadAnimalInDb(SelectedElevage);
89

  
90
            if (!success)
91
            {
92
                bool continuer = await Shell.Current.DisplayAlert(
93
                    "Erreur de connexion aux serveurs INRAE",
94
                    "Les données animales n'ont pas pu être chargées. Continuer quand même ?",
95
                    "Oui",
96
                    "Non"
97
                );
98
                if (!continuer)
99
                {
100
                    IsBusy = false;
101
                    return;
102
                }
103
                    
104
            }
105

  
89 106
            var date = DateTime.Now;
90 107
            var newDay = new Journee(date, SelectedPerson, SelectedElevage, Regime);
91 108

  
......
94 111
                App.Db.Attach(SelectedElevage);
95 112
            else
96 113
                App.Db.Elevage.Add(SelectedElevage);
114

  
97 115
            App.Db.Journee.Add(newDay);
98 116
            await App.Db.SaveChangesAsync();
99 117

  
GES_PAC/ViewModel/ElevageViewModel.cs
25 25
            if (Elevages.Count != 0)
26 26
                return;
27 27

  
28
            var especeIds = new[] { 1, 2 };
29
            List<Elevage> allElevages = new();
30

  
31
            foreach (var especeId in especeIds)
32
            {
33
                var elevages = await App.Sicpa.GetAllElevageByEspece(especeId);
34
                allElevages.AddRange(elevages);
35
            }
36

  
37
            foreach (var elevage in allElevages.OrderBy(e => e.Nom))
28
            try
38 29
            {
39
                bool alreadyTracked = App.Db.ChangeTracker.Entries<Elevage>()
40
                    .Any(e => e.Entity.Id == elevage.Id);
30
                var especeIds = new[] { 1, 2 };
41 31

  
42
                if (!alreadyTracked)
32
                foreach (var especeId in especeIds)
43 33
                {
44
                    Elevages.Add(elevage);
34
                    await App.Sicpa.GetAllElevageByEspece(especeId);
45 35
                }
46
                else
36
                var allElevages = App.Db.Elevage;
37

  
38
                foreach (var elevage in allElevages.OrderBy(e => e.Nom))
47 39
                {
48
                    var trackedElevage = App.Db.ChangeTracker.Entries<Elevage>()
49
                        .First(e => e.Entity.Id == elevage.Id).Entity;
50
                    Elevages.Add(trackedElevage);
40
                    bool alreadyTracked = App.Db.ChangeTracker.Entries<Elevage>()
41
                        .Any(e => e.Entity.Id == elevage.Id);
42

  
43
                    if (!alreadyTracked)
44
                    {
45
                        Elevages.Add(elevage);
46
                    }
47
                    else
48
                    {
49
                        var trackedElevage = App.Db.ChangeTracker.Entries<Elevage>()
50
                            .First(e => e.Entity.Id == elevage.Id).Entity;
51
                        Elevages.Add(trackedElevage);
52
                    }
51 53
                }
52 54
            }
53

  
55
            catch (Exception ex)
56
            {
57
                await Shell.Current.DisplayAlert("Erreur de connexion aux serveurs INRAE", "Les élevages n'ont pas pu être synchronisés.", "OK");
58
                foreach (Elevage elevage in App.Db.Elevage.OrderBy(e => e.Nom))
59
                    Elevages.Add(elevage);
60
            }
54 61
        }
55

  
56 62
        #endregion
57 63
    }
58 64
}
GES_PAC/ViewModel/ExportDataViewModel.cs
82 82
            var lastDay = DayList.Last();
83 83
            string folderName = lastDay.Date.ToString();
84 84
            string[] csv = JourneeToCSV.ConvertToCSV(lastDay);
85
            Console.WriteLine(csv[0]);
86 85
            AndroidFileHelper.SaveCSVToDownloads(folderName, csv);
87 86
            IsBusy = false;
88 87
#endif
GES_PAC/ViewModel/MainViewModel.cs
1 1
using GES_PAC.Model;
2
using GES_PAC.Services;
2 3
using GES_PAC.View;
3 4
using System.Windows.Input;
4 5

  
......
51 52
        #region Constructeur
52 53
        public MainViewModel()
53 54
        {
54

  
55 55
            GoToCreateDayCommand = new Command(async () => await GoToCreateDayPage());
56 56
            ResumeDayCommand = new Command(async () => await ResumeDay());
57 57
            ExportDataCommand = new Command(async () => await ExportData());
......
73 73
        {
74 74
            if (IsBusy) return;
75 75
            IsBusy = true;
76

  
76 77
            await Shell.Current.GoToAsync(nameof(CreateDayView));
78

  
77 79
            IsBusy = false;
78 80
        }
79 81

  

Formats disponibles : Unified diff