Files
BeWoPlaner/Service/ServiceUtils/AiSystemBuilder.cs

206 lines
5.4 KiB
C#

using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.DCEntityMapper;
using BS.Shared;
using DevExpress.PivotGrid.OLAP.Mdx;
using DevExpress.XtraRichEdit.Commands;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web;
namespace BeWo.Service.ServiceUtils
{
public static class AiSystemBuilder
{
public static string CreateSystemInstructions(int uicontext, List<Tuple<long, long>> bewoobjects)
{
var system_prompt = getSystemPrompt(2);
string data = string.Empty;
switch (uicontext)
{
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
case 9:
break;
case 10:
break;
case 11:
break;
case 12:
break;
case 13:
break;
case 14:
break;
case 15:
break;
case 16:
break;
case 17:
break;
case 18:
break;
// Service Record
case 19:
data = createServiceRecordContext(bewoobjects);
break;
default:
throw new NotImplementedException("UI Context unknown");
}
var result = system_prompt + data;
var escape = HttpUtility.JavaScriptStringEncode(result);
return escape;
}
private static string createServiceRecordContext(List<Tuple<long, long>> bewoobjects)
{
if (bewoobjects is null || !bewoobjects.Any())
return null;
// Sortiere Liste
var sorted = getDictionary(bewoobjects);
var selected = new Dictionary<string, object>();
if (tryGetSingleValue(sorted, TableID.Customer, out long coid))
{
var customer = DAOFactory.GenericDAO.GetByID<Customer>(coid);
var customer_dc = MapperFactory.CompactCustomerDC_Customer.MapToNewDC(customer);
selected.Add("CustomerName", customer_dc.LastNameFirstName);
}
if (tryGetSingleValue(sorted, TableID.CostBearer, out long cboid))
{
var costbearer = DAOFactory.GenericDAO.GetByID<Organisation>(cboid);
var costbearer_dc = MapperFactory.CompactOrganisationDC_Organisation.MapToNewDC(costbearer);
selected.Add("CostBearerName", costbearer_dc.Name);
}
if (tryGetSingleValue(sorted, TableID.SupportConcept, out long soid))
{
var supportconcept = DAOFactory.GenericDAO.GetByID<SupportConcept>(soid);
var supportconcept_dc = MapperFactory.CompactSupportConceptDC_SupportConcept.MapToNewDC(supportconcept);
selected.Add("SupportConceptDuration", $"{supportconcept_dc.StartDate?.Date} - {supportconcept_dc.EndDate?.Date}");
}
var records = new List<Dictionary<string, object>>();
if (tryGetMultipleValues(sorted, TableID.ServiceRecord, out List<long> oids))
{
var service_records = DAOFactory.GenericDAO.GetByIDs<ServiceRecord>(oids);
var service_records_dc = MapperFactory.ServiceRecordDC_ServiceRecord.MapToNewDCs(service_records);
foreach (var service_record in service_records_dc)
{
var record_dict = new Dictionary<string, object>
{
{ "StartDate", service_record.Start },
{ "EndDate", service_record.End },
{ "Duration (Std)", service_record.DurationInStunden },
{ "ServiceCategory", service_record.ServiceDescription.Category.Name },
{ "ServiceDescription", service_record.ServiceDescription.Name },
{ "Documentation", service_record.Notice
+ "\n\n" + service_record.Notice2
+ "\n\n" + service_record.Notice3
+ "\n\n" + service_record.Notice4
+ "\n\n" + service_record.Notice5},
{ "Distance (Meter)", service_record.DistanceInMeter ?? 0 },
{ "InsertedOn", service_record.InsertedOn },
{ "Betrag", service_record.Betrag },
{ "InsertUser", service_record.InsUser },
{ "Employee", service_record.Employee }
};
records.Add(record_dict);
}
}
var dict = new Dictionary<string, object>
{
{ "Aktuelle Ansicht", "Zeiterfassung" },
{ "Selected", selected },
{ "Zeiterfassungen", records }
};
var json = JsonConvert.SerializeObject(dict);
return json;
}
private static string getSystemPrompt(int i)
{
var assembly = Assembly.GetExecutingAssembly();
var resourceName = $"BeWo.Service.AI.system_prompt{i}.txt";
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
using (StreamReader reader = new StreamReader(stream))
{
string result = reader.ReadToEnd();
return result;
}
return null;
}
private static Dictionary<long, List<long>> getDictionary(List<Tuple<long, long>> tuples)
{
var seperate = new Dictionary<long, List<long>>();
foreach (var bewoobject in tuples)
{
var oid = bewoobject.Item1;
var tid = bewoobject.Item2;
if (seperate.TryGetValue(tid, out var list))
{
list.Add(oid);
}
else
{
seperate.Add(tid, new List<long>() { oid });
}
}
return seperate;
}
private static bool tryGetSingleValue(Dictionary<long, List<long>> sorted, TableID tid, out long oid)
{
oid = 0;
if (!tryGetMultipleValues(sorted, tid, out List<long> oids) || oids is null || oids.Count == 0)
return false;
oid = oids[0];
return true;
}
private static bool tryGetMultipleValues(Dictionary<long, List<long>> sorted, TableID tid, out List<long> oids)
{
return sorted.TryGetValue((long)tid, out oids);
}
}
}