|
|
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); } } }
|