Files
BeWoPlaner/Service/ai/AiPromptFactory.cs

302 lines
9.4 KiB
C#

using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.DCEntityMapper;
using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
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.AI
{
public static class AiPromptFactory
{
public static string CreateSystemInstructions(int uicontext, Dictionary<TableID, long[]> bewoobjects)
{
if (bewoobjects is null || bewoobjects.Count == 0)
return getSystemPrompt(3);
var data = getContextData(uicontext, bewoobjects);
var text = JsonConvert.SerializeObject(data);
var system_prompt = getSystemPrompt(2);
var result = system_prompt + text;
return result;
}
/// <summary>
/// SupportConcept = 0,
/// Customer = 1,
/// Person = 2,
/// Employee = 3,
/// Organisation = 4,
/// Team = 5,
/// Dokumente = 6,
/// User = 7,
/// UserGroup = 8,
/// Report = 9,
/// Scheduler = 10,
/// Wohnheim = 11,
/// Vertretungen = 12,
/// CustomerTeam = 13,
/// Scheduling = 14,
/// Finance = 15,
/// Administration = 16,
/// AiConversation = 17,
/// AiConversationPopup = 18,
/// // Nur für AI Conversation Zuweisung
/// ServiceRecord = 19,
/// CustomerSingle = 20,
/// PersonSingle = 21,
/// EmployeeSingle = 22,
/// </summary>
/// <param name="uicontext"></param>
/// <param name="bewoobjects"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
private static Dictionary<string, object> getContextData(int uicontext, Dictionary<TableID, long[]> bewoobjects)
{
switch (uicontext)
{
case 0: return createSupportConceptNavigationContext(bewoobjects);
case 1: return createCustomerNavigationContext(bewoobjects);
case 2: return createPersonNavigationContext(bewoobjects);
case 3: return createEmployeeNavigationContext(bewoobjects);
case 4: return createOrganisationNavigationContext(bewoobjects);
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;
case 19: return createServiceRecordContext(bewoobjects);
case 20: return createCustomerContext(bewoobjects);
case 21: break;
case 22: break;
}
throw new NotImplementedException("UI Context unknown");
}
#region Navigation
private static Dictionary<string, object> createSupportConceptNavigationContext(Dictionary<TableID, long[]> bewoobjects)
{
var supports = LoadEntities(bewoobjects, TableID.SupportConcept, MapperFactory.CompactSupportConceptDC_SupportConcept);
var dict = new Dictionary<string, object>
{
{ "Aktuelle Ansicht", "Hilfeplan Navigation" },
{ "Aktueller Ansichtsfilter", "Funktion noch nicht verfügbar" },
{ "Hilfeplanliste", (object)supports ?? "keine Hilfepläne sichtbar" }
};
return dict;
}
private static Dictionary<string, object> createCustomerNavigationContext(Dictionary<TableID, long[]> bewoobjects)
{
var klienten = LoadEntities(bewoobjects, TableID.Customer, MapperFactory.CompactCustomerDC_Customer);
var dict = new Dictionary<string, object>
{
{ "Aktuelle Ansicht", "Klienten Navigation" },
{ "Aktueller Ansichtsfilter", "Funktion noch nicht verfügbar" },
{ "Klientenliste", (object)klienten ?? "keine Klienten sichtbar" }
};
return dict;
}
private static Dictionary<string, object> createPersonNavigationContext(Dictionary<TableID, long[]> bewoobjects)
{
var personen = LoadEntities(bewoobjects, TableID.Person, MapperFactory.CompactPersonDC_Person);
var dict = new Dictionary<string, object>
{
{ "Aktuelle Ansicht", "Personen Navigation" },
{ "Aktueller Ansichtsfilter", "Funktion noch nicht verfügbar" },
{ "Personenliste", (object)personen ?? "keine Personen sichtbar" }
};
return dict;
}
private static Dictionary<string, object> createEmployeeNavigationContext(Dictionary<TableID, long[]> bewoobjects)
{
var mitarbeiter = LoadEntities(bewoobjects, TableID.Employee, MapperFactory.CompactEmployeeDC_Employee);
var dict = new Dictionary<string, object>
{
{ "Aktuelle Ansicht", "Mitarbeiter Navigation" },
{ "Aktueller Ansichtsfilter", "Funktion noch nicht verfügbar" },
{ "Mitarbeiterliste", (object)mitarbeiter ?? "keine Mitarbeiter sichtbar" }
};
return dict;
}
private static Dictionary<string, object> createOrganisationNavigationContext(Dictionary<TableID, long[]> bewoobjects)
{
Action<Organisation, CompactOrganisationDC> loadAddress = (entity, dc) =>
{
if (entity.Address != null)
{
dc.AddressLine1 = entity.Address.AddressLine1;
dc.Street = entity.Address.Street;
dc.PostalCode = entity.Address.PostalCode;
dc.Town = entity.Address.Town;
}
};
var orgas = LoadEntities(bewoobjects, TableID.Organisation, MapperFactory.CompactOrganisationDC_Organisation, loadAddress);
var dict = new Dictionary<string, object>
{
{ "Aktuelle Ansicht", "Organisation Navigation" },
{ "Aktueller Ansichtsfilter", "Funktion noch nicht verfügbar" },
{ "Organisationsliste", (object)orgas ?? "keine Organisationen sichtbar" }
};
return dict;
}
private static Dictionary<string, object> createServiceRecordContext(Dictionary<TableID, long[]> bewoobjects)
{
var customer = LoadEntity(bewoobjects, TableID.Customer, MapperFactory.CompactCustomerDC_Customer);
var costbearer = LoadProperty(bewoobjects, TableID.CostBearer, MapperFactory.CompactOrganisationDC_Organisation, dc => dc.Name);
var supportconcept = LoadProperty(bewoobjects, TableID.SupportConcept, MapperFactory.CompactSupportConceptDC_SupportConcept, dc => $"{dc.StartDate?.Date} - {dc.EndDate?.Date}");
var records = LoadEntities(bewoobjects, TableID.ServiceRecord, MapperFactory.ServiceRecordDC_ServiceRecord);
var sub_dict = new Dictionary<string, object>()
{
{ "Klient", customer },
{ "Kostenträger", costbearer },
{ "Hilfeplan", supportconcept }
};
var dict = new Dictionary<string, object>
{
{ "Aktuelle Ansicht", "Zeiterfassung" },
{ "Aktueller Ansichtsfilter", "Funktion noch nicht verfügbar" },
{ "Selected", sub_dict},
{ "Zeiterfassungen", records }
};
return dict;
}
#endregion
#region SinglePage
private static Dictionary<string, object> createCustomerContext(Dictionary<TableID, long[]> bewoobjects)
{
var klient = LoadEntity(bewoobjects, TableID.Customer, MapperFactory.CustomerDC_Customer);
var dict = new Dictionary<string, object>
{
{ "Aktuelle Ansicht", "Klienten Daten" },
{ "Klient", klient }
};
return dict;
}
#endregion
#region LOAD Methods
private static object LoadProperty<TEntity, TDC>
(Dictionary<TableID, long[]> bewoobjects, TableID tid, AbstractIDCEntityMapper<TEntity, TDC> mapper, Func<TDC, object> getPropertyFunc)
where TDC : class, new() where TEntity : BeWoEntityBase, new()
{
if (!bewoobjects.TryGetValue(tid, out long[] oids) || (oids?.Length ?? 0) == 0)
return null;
var entity = DAOFactory.GenericDAO.GetByID<TEntity>(oids[0]);
var dc = mapper.MapToNewDC(entity);
var property = getPropertyFunc(dc);
return property;
}
private static Dictionary<string, object> LoadEntity<TEntity, TDC>
(Dictionary<TableID, long[]> bewoobjects, TableID tid, AbstractIDCEntityMapper<TEntity, TDC> mapper)
where TDC : class, new() where TEntity : BeWoEntityBase, new()
{
if (!bewoobjects.TryGetValue(tid, out long[] oids) || (oids?.Length ?? 0) == 0)
return null;
var entity = DAOFactory.GenericDAO.GetByID<TEntity>(oids[0]);
var dict = mapper.ToJsonDictionary(entity);
return dict;
}
private static IList<Dictionary<string, object>> LoadEntities<TEntity, TDC>
(Dictionary<TableID, long[]> bewoobjects, TableID tid, AbstractIDCEntityMapper<TEntity, TDC> mapper)
where TDC : class, new() where TEntity : BeWoEntityBase, new()
{
if (!bewoobjects.TryGetValue(tid, out long[] oids) || (oids?.Length ?? 0) == 0)
return null;
var entities = DAOFactory.GenericDAO.GetByIDs<TEntity>(oids);
var dcs = mapper.MapToNewDCs(entities);
var dict = mapper.ToJsonDictionary(dcs);
return dict;
}
private static IList<Dictionary<string, object>> LoadEntities<TEntity, TDC>
(Dictionary<TableID, long[]> bewoobjects, TableID tid, AbstractIDCEntityMapper<TEntity, TDC> mapper, Action<TEntity, TDC> afterDC)
where TDC : class, new() where TEntity : BeWoEntityBase, new()
{
if (!bewoobjects.TryGetValue(tid, out long[] oids) || (oids?.Length ?? 0) == 0)
return null;
var entities = DAOFactory.GenericDAO.GetByIDs<TEntity>(oids);
var dcs = new List<TDC>();
foreach (var entity in entities)
{
var dc = mapper.MapToNewDC(entity);
afterDC(entity, dc);
dcs.Add(dc);
}
var dict = mapper.ToJsonDictionary(dcs);
return dict;
}
#endregion
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;
}
}
}
}