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; /// /// For simple detail table, edit(create, update, delete) also update master's update column /// /// /// public abstract class DetailDataTableTemplate : ModelDataTemplate where TEntityDtl : EntityBase, new() where TEntityMst : EntityBase, new() { protected abstract string DetailColumnNameToMasterUID { get; } /// /// Key is detail column, value is mater column /// protected virtual Dictionary generateMasterDetailJoinCondition() { return new Dictionary() { { DetailColumnNameToMasterUID, BLWording.UID } }; } protected virtual string fetchMasterUIDFromCommand(Dictionary 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 o_lcCmds) { string sMsg = null; List lCmds = new List(); do { List lsDetailColumnUID = new List(); List lsMasterColumnUID = new List(); if(i_jaData == null) { sMsg = MessageWording.PARAM_NOT_EXPECTED; break; } foreach (JToken jtkItem in i_jaData) { Dictionary dicItem = jtkItem.ToObject>(); if (dicItem.ContainsKey(BLWording.WHEREDATA)) { Dictionary dicWheredata = (dicItem[BLWording.WHEREDATA] as JToken).ToObject>(); if (!dicWheredata.ContainsKey(BLWording.UID)) { sMsg = MessageWording.PARAM_NOT_EXPECTED; break; } lsDetailColumnUID.Add(dicWheredata[BLWording.UID].ToString()); } else if (dicItem.ContainsKey(BLWording.DATA)) { Dictionary dicData = (dicItem[BLWording.DATA] as JToken).ToObject>(); 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() { 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 laAPIs = ai.RunQueryList(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 o_lcCmds, List i_saQryContainKeys) { string sMsg; List lCmds = new List(); do { sMsg = i_dgEditor(i_crmInput, i_jaData, i_sSessionUser, out List lCmds1, i_saQryContainKeys); if (sMsg != null) { break; } sMsg = getMasterUpdate(i_jaData, i_sSessionUser, out List 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 o_lcCmds, List 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 o_lcCmds, List 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 o_lcCmds, List 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); } } }