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; using static CounsellorBL.Common.EntityBaseExtension; public class ModelDataTemplate : DataServiceBase where TEntity : EntityBase, new() { protected delegate string DG_Copy_ModifyInstance(TEntity i_oTrage, JObject data, JObject wheredata, string i_sNewGUID); protected DG_Copy_ModifyInstance dgCopy_ModifyInstance { get; set; } protected List ldgCopy_ModifyEachCopyItemCommand { get; } = new List(); public DG_GenerateReadCommand dgReadCommandGenerator { get; set; } public DG_PostHandleReadData dgReadCommandPostDataHandler { get; set; } public DG_GenerateEditCommand dgCopyCommandGenerator { get; set; } public DG_GenerateEditCommand dgCreateCommandGenerator { get; set; } public DG_GenerateEditCommand dgUpdateCommandGenerator { get; set; } public DG_GenerateEditCommand dgDeleteCommandGenerator { get; set; } public override string MainTable => GetMainTableName(typeof(TEntity)); public override CResponseMessage Read(CRequestMessage i_crmInput) { return simpleRead(i_crmInput, dgReadCommandGenerator, dgReadCommandPostDataHandler); } public override CResponseMessage Copy(CRequestMessage i_crmInput) { return commonEditor(i_crmInput, BLWording.CPY_MASTER, dgCopyCommandGenerator); } public override CResponseMessage Create(CRequestMessage i_crmInput) { return commonEditor(i_crmInput, BLWording.ADD_MASTER, dgCreateCommandGenerator); } public override CResponseMessage Update(CRequestMessage i_crmInput) { return commonEditor(i_crmInput, BLWording.UPD_MASTER, dgUpdateCommandGenerator); } public override CResponseMessage Delete(CRequestMessage i_crmInput) { return commonEditor(i_crmInput, BLWording.DEL_MASTER, dgDeleteCommandGenerator); } protected string createSingleCommandGeneratorDefault(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 = "") { o_lcCmds = getAddListCommand(i_crmInput, i_jaData, typeof(TEntity).GetField("TABLENAME").GetValue(null).ToString(), out string sMsg); return sMsg; } protected string updateSingleCommandGeneratorDefault(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 = "") { o_lcCmds = getUpdListCommand(i_crmInput, i_jaData, typeof(TEntity).GetField("TABLENAME").GetValue(null).ToString(), i_saQryContainKeys, out string sMsg); return sMsg; } protected string deleteSingleCommandGeneratorDefault(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 = "") { o_lcCmds = getDelListCommand(i_crmInput, i_jaData, typeof(TEntity).GetField("TABLENAME").GetValue(null).ToString(), i_saQryContainKeys, out string sMsg); return sMsg; } protected string readCommandGeneratorDefault(CRequestMessage i_crmInput, JArray i_jaDataArray, tb_sys_session i_sSessionUser, out Command o_cCmd, [System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0, [System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "", [System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "") { o_cCmd = getQryListCommand(i_jaDataArray, typeof(TEntity).GetField("TABLENAME").GetValue(null).ToString(), out string sMsg, i_bUseFullSelect: true, i_ecfFilter: getQueryCustomerFilter(i_crmInput))[0]; return sMsg; } /// /// Would use dgCopyFlowModifyInstance/dgCopyFlowCopyPostCommand to custmize /// /// /// /// /// /// /// protected string copyCommandGeneratorDefault(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 = "") { string sMsg = null; List lCmds = new List(); string sTbName = typeof(TEntity).GetField("TABLENAME").GetValue(null).ToString(); do { if (i_jaData == null) { sMsg = MessageWording.PARAM_NOT_EXPECTED; break; } List lsUID = new List(); // 強化檢核 foreach (JToken joItem in i_jaData) { Dictionary dicItem = joItem.ToObject>(); if (dicItem == null) { continue; } if (!(dicItem[BLWording.WHEREDATA] is JObject joCond)) { sMsg = MessageWording.PARAM_NOT_EXPECTED; break; } IDictionary dicCondProperty = joCond; bool bQryContainKeys = true; i_saQryContainKeys?.ForEach(f => { if (bQryContainKeys && !dicCondProperty.ContainsKey(f)) { bQryContainKeys = false; } }); if (!bQryContainKeys) { sMsg = MessageWording.PARAM_NOT_EXPECTED; break; } lsUID.Add(dicCondProperty[BLWording.UID].ToString()); } if (sMsg != null) { break; } sMsg = getEntity(sTbName, out object oSelect); EntityBase ebSelect = oSelect as EntityBase; ebSelect.SetFullDirtyEx(EColumnFilter.ES_NO_SYSTEMCOLUMN); Command cSelectOriginData = Command.SetupSelectCmd(ebSelect, new WhereNode(BLWording.UID, WhereNode.EColumnOperation.EOT_IN, ebSelect.GetType(), lsUID.ToArray())); ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelectOriginData); List qdsOrigin = ai.RunQueryList(cSelectOriginData); if (!cSelectOriginData.IsSuccess) { sMsg = GetLastErrorCode(cSelectOriginData); break; } if (qdsOrigin.Count != lsUID.Count) { sMsg = MessageWording.PARAM_NOT_EXPECTED; break; } foreach (JToken jtkProg in i_jaData) { Dictionary dicItem = jtkProg.ToObject>(); string sParamCatalogUID = null; if (dicItem.ContainsKey(BLWording.DATA) && dicItem[BLWording.DATA] is JObject data && dicItem.ContainsKey(BLWording.WHEREDATA) && dicItem[BLWording.WHEREDATA] is JObject wheredata) { Dictionary wheredataDic = wheredata.ToObject>(); // Get all prgram if (wheredataDic != null && wheredataDic.ContainsKey(BLWording.UID)) { string sNewMstGUID = Guid.NewGuid().ToString(); sParamCatalogUID = wheredataDic[BLWording.UID].ToString(); TEntity teMstNew = qdsOrigin.Find(f => { return f.GetValue(BLWording.UID).ToString() == sParamCatalogUID; }); TEntity teMstOriginClone = teMstNew.Clone() as TEntity; sMsg = valueAssignment(i_crmInput, teMstNew, dicItem[BLWording.DATA] as JObject, out List o_lcAddInsert, i_bIsCreate: true); if (sMsg != null) { break; } if (dgCopy_ModifyInstance != null) { sMsg = dgCopy_ModifyInstance(teMstNew, data, wheredata, sNewMstGUID); if (sMsg != null) { break; } } else { teMstNew.SetValue(BLWording.UID, sNewMstGUID); } if (o_lcAddInsert != null && o_lcAddInsert.Count > 0) { lCmds.AddRange(o_lcAddInsert); } lCmds.Add(Command.SetupInsertCmd(teMstNew)); if (ldgCopy_ModifyEachCopyItemCommand.Any()) { foreach (DG_EditPostCommand dgCopy_PostCommand in ldgCopy_ModifyEachCopyItemCommand) { if (dgCopy_PostCommand != null) { sMsg = dgCopy_PostCommand(ai, teMstOriginClone, teMstNew, out List o_lcAddition); if (sMsg != null) { break; } if (o_lcAddition != null) { lCmds.AddRange(o_lcAddition); } } } } } } if (sMsg != null) { break; } } } while (false); o_lcCmds = lCmds; return sMsg; } } }