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

  1. 
  2. namespace CounsellorBL
  3. {
  4. using MonumentDefine;
  5. using Newtonsoft.Json.Linq;
  6. using OT.COM.ArsenalDB;
  7. using OT.COM.SignalerMessage;
  8. using SoldierData.EnterprizeV4;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. /// <summary>
  13. /// For simple detail table, edit(create, update, delete) also update master's update column
  14. /// </summary>
  15. /// <typeparam name="TEntityDtl"></typeparam>
  16. /// <typeparam name="TEntityMst"></typeparam>
  17. public abstract class DetailDataTableTemplate<TEntityDtl, TEntityMst> : ModelDataTemplate<TEntityDtl>
  18. where TEntityDtl : EntityBase, new()
  19. where TEntityMst : EntityBase, new()
  20. {
  21. protected abstract string DetailColumnNameToMasterUID { get; }
  22. /// <summary>
  23. /// Key is detail column, value is mater column
  24. /// </summary>
  25. protected virtual Dictionary<string, string> generateMasterDetailJoinCondition()
  26. {
  27. return new Dictionary<string, string>() { { DetailColumnNameToMasterUID, BLWording.UID } };
  28. }
  29. protected virtual string fetchMasterUIDFromCommand(Dictionary<string, object> i_dicData)
  30. {
  31. string sRes = null;
  32. if (i_dicData != null && i_dicData.ContainsKey(DetailColumnNameToMasterUID))
  33. {
  34. sRes = i_dicData[DetailColumnNameToMasterUID].ToString();
  35. }
  36. return sRes;
  37. }
  38. protected DetailDataTableTemplate()
  39. {
  40. dgCreateCommandGenerator = createDetailCommandGeneratorDefault;
  41. dgReadCommandGenerator = readCommandGeneratorDefault;
  42. dgUpdateCommandGenerator = updateDetailCommandGeneratorDefault;
  43. dgDeleteCommandGenerator = deleteDetailCommandGeneratorDefault;
  44. dgCopyCommandGenerator = copyCommandGeneratorDefault;
  45. }
  46. protected string getMasterUpdate(JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lcCmds)
  47. {
  48. string sMsg = null;
  49. List<Command> lCmds = new List<Command>();
  50. do
  51. {
  52. List<string> lsDetailColumnUID = new List<string>();
  53. List<string> lsMasterColumnUID = new List<string>();
  54. if(i_jaData == null)
  55. {
  56. sMsg = MessageWording.PARAM_NOT_EXPECTED;
  57. break;
  58. }
  59. foreach (JToken jtkItem in i_jaData)
  60. {
  61. Dictionary<string, object> dicItem = jtkItem.ToObject<Dictionary<string, object>>();
  62. if (dicItem.ContainsKey(BLWording.WHEREDATA))
  63. {
  64. Dictionary<string, object> dicWheredata = (dicItem[BLWording.WHEREDATA] as JToken).ToObject<Dictionary<string, object>>();
  65. if (!dicWheredata.ContainsKey(BLWording.UID))
  66. {
  67. sMsg = MessageWording.PARAM_NOT_EXPECTED;
  68. break;
  69. }
  70. lsDetailColumnUID.Add(dicWheredata[BLWording.UID].ToString());
  71. }
  72. else if (dicItem.ContainsKey(BLWording.DATA))
  73. {
  74. Dictionary<string, object> dicData = (dicItem[BLWording.DATA] as JToken).ToObject<Dictionary<string, object>>();
  75. if (dicData != null)
  76. {
  77. string sMasterUID = fetchMasterUIDFromCommand(dicData);
  78. if (sMasterUID != null)
  79. {
  80. lsMasterColumnUID.Add(sMasterUID);
  81. }
  82. }
  83. }
  84. }
  85. if (lsDetailColumnUID.Any())
  86. {
  87. WhereNode wnCond = new WhereNode(BLWording.UID, WhereNode.EColumnOperation.EOT_IN, typeof(TEntityDtl), lsDetailColumnUID.ToArray());
  88. QueryJsonElementCollection qjecBlocks = new QueryJsonElementCollection();
  89. QueryJsonElement qjeA = qjecBlocks.GetInst();
  90. qjeA.table = typeof(TEntityMst).GetField("TABLENAME").GetValue(null).ToString();
  91. qjeA.displaycols = new List<string>() { BLWording.UID };
  92. qjeA.isdistinct = true;
  93. qjecBlocks.Add(qjeA);
  94. QueryJsonElement qjeB = qjecBlocks.GetInst();
  95. qjeB.table = typeof(TEntityDtl).GetField("TABLENAME").GetValue(null).ToString();
  96. qjeB.jointype = QueryJsonElement.RIGHT_JOIN;
  97. qjeB.jointable = qjeA;
  98. qjeB.joincols = generateMasterDetailJoinCondition();
  99. qjeB.wherecols = wnCond;
  100. qjecBlocks.Add(qjeB);
  101. sMsg = MakeSelectJoinByBlocks(qjecBlocks, out Command cSelect);
  102. if (sMsg != null)
  103. {
  104. break;
  105. }
  106. ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
  107. List<TEntityMst> laAPIs = ai.RunQueryList<TEntityMst>(cSelect);
  108. laAPIs.ForEach(a => { lsMasterColumnUID.Add(a.GetValue(BLWording.UID).ToString()); });
  109. }
  110. DateTime dtNow = DateTime.Now;
  111. lsMasterColumnUID.ForEach(sMstUID =>
  112. {
  113. TEntityMst aData = new TEntityMst();
  114. aData.SetValue(BLWording.UPDATE_DATE, dtNow);
  115. aData.SetValue(BLWording.UPDATE_USER_UID, i_sSessionUser.update_user_uid);
  116. aData.SetValue(BLWording.UPDATE_ORG_UID, i_sSessionUser.update_org_uid);
  117. TEntityMst aCond = new TEntityMst();
  118. aCond.SetValue(BLWording.UID, sMstUID);
  119. lCmds.Add(Command.SetupUpdateCmd(aData, aCond));
  120. });
  121. }
  122. while (false);
  123. o_lcCmds = lCmds;
  124. return sMsg;
  125. }
  126. private string _EditDetailCommandGeneratorDefault(
  127. DG_GenerateEditCommand i_dgEditor,
  128. CRequestMessage i_crmInput, JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lcCmds, List<string> i_saQryContainKeys)
  129. {
  130. string sMsg;
  131. List<Command> lCmds = new List<Command>();
  132. do
  133. {
  134. sMsg = i_dgEditor(i_crmInput, i_jaData, i_sSessionUser, out List<Command> lCmds1, i_saQryContainKeys);
  135. if (sMsg != null)
  136. {
  137. break;
  138. }
  139. sMsg = getMasterUpdate(i_jaData, i_sSessionUser, out List<Command> lCmds2);
  140. if (sMsg != null)
  141. {
  142. break;
  143. }
  144. lCmds.AddRange(lCmds1);
  145. lCmds.AddRange(lCmds2);
  146. }
  147. while (false);
  148. o_lcCmds = lCmds;
  149. return sMsg;
  150. }
  151. protected string createDetailCommandGeneratorDefault(CRequestMessage i_crmInput, JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lcCmds, List<string> i_saQryContainKeys,
  152. [System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
  153. [System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
  154. [System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
  155. {
  156. return _EditDetailCommandGeneratorDefault(createSingleCommandGeneratorDefault, i_crmInput, i_jaData, i_sSessionUser, out o_lcCmds, i_saQryContainKeys);
  157. }
  158. protected string updateDetailCommandGeneratorDefault(CRequestMessage i_crmInput, JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lcCmds, List<string> i_saQryContainKeys,
  159. [System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
  160. [System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
  161. [System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
  162. {
  163. return _EditDetailCommandGeneratorDefault(updateSingleCommandGeneratorDefault, i_crmInput, i_jaData, i_sSessionUser, out o_lcCmds, i_saQryContainKeys);
  164. }
  165. protected string deleteDetailCommandGeneratorDefault(CRequestMessage i_crmInput, JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lcCmds, List<string> i_saQryContainKeys,
  166. [System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
  167. [System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
  168. [System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
  169. {
  170. return _EditDetailCommandGeneratorDefault(deleteSingleCommandGeneratorDefault, i_crmInput, i_jaData, i_sSessionUser, out o_lcCmds, i_saQryContainKeys);
  171. }
  172. }
  173. }