You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

211 lines
8.8 KiB

namespace CounsellorBL
{
using MonumentDefine;
using Newtonsoft.Json.Linq;
using OT.COM.ArsenalDB;
using OT.COM.SignalerMessage;
using SoldierData.EnterprizeV4;
using System;
using System.Collections.Generic;
using System.Linq;
/// <summary>
/// For simple detail table, edit(create, update, delete) also update master's update column
/// </summary>
/// <typeparam name="TEntityDtl"></typeparam>
/// <typeparam name="TEntityMst"></typeparam>
public abstract class DetailDataTableTemplate<TEntityDtl, TEntityMst> : ModelDataTemplate<TEntityDtl>
where TEntityDtl : EntityBase, new()
where TEntityMst : EntityBase, new()
{
protected abstract string DetailColumnNameToMasterUID { get; }
/// <summary>
/// Key is detail column, value is mater column
/// </summary>
protected virtual Dictionary<string, string> generateMasterDetailJoinCondition()
{
return new Dictionary<string, string>() { { DetailColumnNameToMasterUID, BLWording.UID } };
}
protected virtual string fetchMasterUIDFromCommand(Dictionary<string, object> i_dicData)
{
string sRes = null;
if (i_dicData != null && i_dicData.ContainsKey(DetailColumnNameToMasterUID))
{
sRes = i_dicData[DetailColumnNameToMasterUID].ToString();
}
return sRes;
}
protected DetailDataTableTemplate()
{
dgCreateCommandGenerator = createDetailCommandGeneratorDefault;
dgReadCommandGenerator = readCommandGeneratorDefault;
dgUpdateCommandGenerator = updateDetailCommandGeneratorDefault;
dgDeleteCommandGenerator = deleteDetailCommandGeneratorDefault;
dgCopyCommandGenerator = copyCommandGeneratorDefault;
}
protected string getMasterUpdate(JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lcCmds)
{
string sMsg = null;
List<Command> lCmds = new List<Command>();
do
{
List<string> lsDetailColumnUID = new List<string>();
List<string> lsMasterColumnUID = new List<string>();
if(i_jaData == null)
{
sMsg = MessageWording.PARAM_NOT_EXPECTED;
break;
}
foreach (JToken jtkItem in i_jaData)
{
Dictionary<string, object> dicItem = jtkItem.ToObject<Dictionary<string, object>>();
if (dicItem.ContainsKey(BLWording.WHEREDATA))
{
Dictionary<string, object> dicWheredata = (dicItem[BLWording.WHEREDATA] as JToken).ToObject<Dictionary<string, object>>();
if (!dicWheredata.ContainsKey(BLWording.UID))
{
sMsg = MessageWording.PARAM_NOT_EXPECTED;
break;
}
lsDetailColumnUID.Add(dicWheredata[BLWording.UID].ToString());
}
else if (dicItem.ContainsKey(BLWording.DATA))
{
Dictionary<string, object> dicData = (dicItem[BLWording.DATA] as JToken).ToObject<Dictionary<string, object>>();
if (dicData != null)
{
string sMasterUID = fetchMasterUIDFromCommand(dicData);
if (sMasterUID != null)
{
lsMasterColumnUID.Add(sMasterUID);
}
}
}
}
if (lsDetailColumnUID.Any())
{
WhereNode wnCond = new WhereNode(BLWording.UID, WhereNode.EColumnOperation.EOT_IN, typeof(TEntityDtl), lsDetailColumnUID.ToArray());
QueryJsonElementCollection qjecBlocks = new QueryJsonElementCollection();
QueryJsonElement qjeA = qjecBlocks.GetInst();
qjeA.table = typeof(TEntityMst).GetField("TABLENAME").GetValue(null).ToString();
qjeA.displaycols = new List<string>() { BLWording.UID };
qjeA.isdistinct = true;
qjecBlocks.Add(qjeA);
QueryJsonElement qjeB = qjecBlocks.GetInst();
qjeB.table = typeof(TEntityDtl).GetField("TABLENAME").GetValue(null).ToString();
qjeB.jointype = QueryJsonElement.RIGHT_JOIN;
qjeB.jointable = qjeA;
qjeB.joincols = generateMasterDetailJoinCondition();
qjeB.wherecols = wnCond;
qjecBlocks.Add(qjeB);
sMsg = MakeSelectJoinByBlocks(qjecBlocks, out Command cSelect);
if (sMsg != null)
{
break;
}
ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
List<TEntityMst> laAPIs = ai.RunQueryList<TEntityMst>(cSelect);
laAPIs.ForEach(a => { lsMasterColumnUID.Add(a.GetValue(BLWording.UID).ToString()); });
}
DateTime dtNow = DateTime.Now;
lsMasterColumnUID.ForEach(sMstUID =>
{
TEntityMst aData = new TEntityMst();
aData.SetValue(BLWording.UPDATE_DATE, dtNow);
aData.SetValue(BLWording.UPDATE_USER_UID, i_sSessionUser.update_user_uid);
aData.SetValue(BLWording.UPDATE_ORG_UID, i_sSessionUser.update_org_uid);
TEntityMst aCond = new TEntityMst();
aCond.SetValue(BLWording.UID, sMstUID);
lCmds.Add(Command.SetupUpdateCmd(aData, aCond));
});
}
while (false);
o_lcCmds = lCmds;
return sMsg;
}
private string _EditDetailCommandGeneratorDefault(
DG_GenerateEditCommand i_dgEditor,
CRequestMessage i_crmInput, JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lcCmds, List<string> i_saQryContainKeys)
{
string sMsg;
List<Command> lCmds = new List<Command>();
do
{
sMsg = i_dgEditor(i_crmInput, i_jaData, i_sSessionUser, out List<Command> lCmds1, i_saQryContainKeys);
if (sMsg != null)
{
break;
}
sMsg = getMasterUpdate(i_jaData, i_sSessionUser, out List<Command> lCmds2);
if (sMsg != null)
{
break;
}
lCmds.AddRange(lCmds1);
lCmds.AddRange(lCmds2);
}
while (false);
o_lcCmds = lCmds;
return sMsg;
}
protected string createDetailCommandGeneratorDefault(CRequestMessage i_crmInput, JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lcCmds, List<string> i_saQryContainKeys,
[System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
[System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
{
return _EditDetailCommandGeneratorDefault(createSingleCommandGeneratorDefault, i_crmInput, i_jaData, i_sSessionUser, out o_lcCmds, i_saQryContainKeys);
}
protected string updateDetailCommandGeneratorDefault(CRequestMessage i_crmInput, JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lcCmds, List<string> i_saQryContainKeys,
[System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
[System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
{
return _EditDetailCommandGeneratorDefault(updateSingleCommandGeneratorDefault, i_crmInput, i_jaData, i_sSessionUser, out o_lcCmds, i_saQryContainKeys);
}
protected string deleteDetailCommandGeneratorDefault(CRequestMessage i_crmInput, JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lcCmds, List<string> i_saQryContainKeys,
[System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
[System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
{
return _EditDetailCommandGeneratorDefault(deleteSingleCommandGeneratorDefault, i_crmInput, i_jaData, i_sSessionUser, out o_lcCmds, i_saQryContainKeys);
}
}
}