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.

228 lines
12 KiB

  1. using MonumentDefine;
  2. using Newtonsoft.Json.Linq;
  3. using OT.COM.ArsenalDB;
  4. using OT.COM.ArsenalDB.SQL;
  5. using OT.COM.SignalerMessage;
  6. using SoldierData.EnterprizeV4;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. namespace CounsellorBL.ORD.ConstDefinition
  11. {
  12. internal class SQLLib : DirectSQLLibBase
  13. {
  14. public SQLLib(ADirectSQLHelper i_sqlLibBase) : base(i_sqlLibBase) { }
  15. public virtual string GetMessageLogRecordSuccessCount(string message_log_uid_, string record_status_flag_, out Command command_)
  16. {
  17. ADirectCmdParameter cp = GetParamter();
  18. string sql = $@"SELECT COUNT({tb_ord_message_log_record.CN_STATUS_FLAG}) {tb_ord_message_log_record.CN_STATUS_FLAG} FROM {nameof(tb_ord_message_log_record)}
  19. WHERE {tb_ord_message_log_record.CN_LOG_UID} = {cp.Add(message_log_uid_)}
  20. AND {tb_ord_message_log_record.CN_STATUS_FLAG} = {cp.Add(record_status_flag_)}
  21. AND {tb_ord_message_log_record.CN_ERROR_CODE} IS NULL
  22. ";
  23. return GenerateCommand<tb_ord_message_log_record>(sql, cp, out command_);
  24. }
  25. /// <summary>
  26. /// readCommandPostDataHandler, 替代原本查詢方法用來排序 receivable & received
  27. /// </summary>
  28. public string readCommandPostDataHandlerQueryDetailSortGuid(CRequestMessage i_crmInput, Dictionary<string, string> dicCondition, List<string> lsBranch, List<string> userBranch, bool IsTotalQuery, int nPageIdx, int nPageNum, out Command command_)
  29. {
  30. ADirectCmdParameter cp = GetParamter();
  31. bool isGroup = false;
  32. const string received = "received";
  33. const string receivable = "receivable";
  34. string selectColumn = IsTotalQuery ?
  35. $"COUNT(a.{ tb_ord_order_master.CN_UID})" :
  36. $@"a.{ tb_ord_order_master.CN_UID},
  37. a.{received},
  38. a.{receivable},
  39. art.{tb_grp_article.CN_REMARK},
  40. aa.{ tb_ord_order_master.CN_TYPE},
  41. aa.{ tb_ord_order_master.CN_ORDER_CODE},
  42. aa.{ tb_ord_order_master.CN_STATUS},
  43. aa.{ tb_ord_order_master.CN_CREATE_DATE},
  44. aa.{ tb_ord_order_master.CN_GROUP_UID},
  45. aa.{ tb_ord_order_master.CN_BRANCH_UID},
  46. aa.{ tb_ord_order_master.CN_ARRIVED_DATE},
  47. aa.{ tb_ord_order_master.CN_ARTICLE_UID},
  48. aa.{ tb_ord_order_master.CN_NAME}
  49. ";
  50. string sql = $@"
  51. SELECT {selectColumn} FROM
  52. (
  53. select
  54. a.{tb_ord_order_master.CN_UID},
  55. --sum (case when b.status = 2 then b.take_qty * c.price else 0 end) received,
  56. --sum (case when b.status = 2 then b.take_qty * (d.amount / d.qty)else 0 end) received,-- take_qty為實際拿取數量, d.amount / d.qty計算實際購買金額
  57. ---- sum (case when b.status = 2 then d.amount else 0 end) received,-- d.amount Total
  58. --sum ((b.price /b.order_qty) * take_qty) received,
  59. --sum(b.price) receivable
  60. --sum (case when e.wprice_payment = 1 and c.wholesale_price != 0 then b.order_qty * c.wholesale_price else b.price end) receivable
  61. ---- sum (case when b.status = 2 then d.amount else b.price end) receivable
  62. (case max(a.type) when '1' then sum (case when b.status = 2 then d.amount else 0 end)
  63. when '2' then sum(ee.amount) else 0 end ) received,-- d.amount Total
  64. (case max(a.type) when '1' then sum (case when b.status = 2 then d.amount else b.price end)
  65. when '2' then sum(ee.amount) else 0 end ) receivable
  66. from {nameof(tb_ord_order_master)} a
  67. LEFT JOIN {nameof(tb_ord_order_detail)} b on b.{tb_ord_order_detail.CN_ORDER_UID} = a.{tb_ord_order_master.CN_UID}
  68. --LEFT JOIN {nameof(tb_prd_article2product)} c on c.{tb_prd_article2product.CN_UID} = b.{tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID}
  69. --LEFT JOIN {nameof(tb_ord_purchase_detail)} d on d.{tb_ord_purchase_detail.CN_ORDER_DETAIL_UID} = b.{tb_ord_order_detail.CN_UID}
  70. LEFT JOIN (SELECT {tb_ord_purchase_detail.CN_ORDER_DETAIL_UID}, SUM({tb_ord_purchase_detail.CN_AMOUNT}) amount FROM {nameof(tb_ord_purchase_detail)} GROUP BY {tb_ord_purchase_detail.CN_ORDER_DETAIL_UID}) d on d.{tb_ord_purchase_detail.CN_ORDER_DETAIL_UID} = b.uid -- Make sure is only one
  71. --LEFT JOIN {nameof(tb_meb_member)} e on e.{tb_meb_member.CN_UID} = b.{tb_ord_order_detail.CN_MEMBER_UID}
  72. LEFT JOIN (SELECT sum(x.{tb_prd_article2product.CN_PRICE}* z.{tb_ord_purchase_detail.CN_QTY}) amount ,x.{tb_prd_article2product.CN_ORDER_UID}
  73. FROM {nameof(tb_prd_article2product)} x
  74. LEFT JOIN {nameof(tb_ord_order_master)} y on y.{tb_ord_order_master.CN_UID}=x.{tb_prd_article2product.CN_ORDER_UID}
  75. LEFT JOIN {nameof(tb_ord_purchase_detail)} z on z.{tb_ord_purchase_detail.CN_ARTICLE2PRODUCT_UID}=x.{tb_prd_article2product.CN_UID}
  76. GROUP BY x.{tb_prd_article2product.CN_ORDER_UID}
  77. ) as ee on ee.{tb_prd_article2product.CN_ORDER_UID} = a.{tb_ord_order_master.CN_UID}
  78. GROUP BY a.{tb_ord_order_master.CN_UID}
  79. ) a
  80. LEFT JOIN {nameof(tb_ord_order_master)} aa on aa.{tb_ord_order_master.CN_UID} = a.{tb_ord_order_master.CN_UID} -- Get full column
  81. LEFT JOIN {nameof(tb_grp_article)} art on art.uid = aa.article_uid -- Get remark
  82. WHERE 1=1
  83. ";
  84. sql += $"AND aa.{tb_ord_order_master.CN_TYPE} != {cp.Add((int)Enums.ArticleType.Purchase)} ";
  85. sql += $"AND aa.{tb_ord_order_master.CN_STATUS_FLAG} = {cp.Add(BLWording.STATUS_FLAG_ON)} ";
  86. if (dicCondition.ContainsKey(tb_ord_order_master.CN_CREATE_DATE + "_start"))
  87. {
  88. sql += $"AND aa.{tb_ord_order_master.CN_CREATE_DATE} >= {cp.Add(dicCondition[tb_ord_order_master.CN_CREATE_DATE + "_start"])} ";
  89. }
  90. if (dicCondition.ContainsKey(tb_ord_order_master.CN_CREATE_DATE + "_end"))
  91. {
  92. sql += $"AND aa.{tb_ord_order_master.CN_CREATE_DATE} < { cp.Add(Convert.ToDateTime(dicCondition[tb_ord_order_master.CN_CREATE_DATE + "_end"]).AddDays(1))} ";
  93. }
  94. if (dicCondition.ContainsKey(tb_ord_order_master.CN_STATUS))
  95. {
  96. sql += $"AND aa.{tb_ord_order_master.CN_STATUS} = {cp.Add(dicCondition[tb_ord_order_master.CN_STATUS])} ";
  97. }
  98. else
  99. {
  100. sql += $"AND aa.{tb_ord_order_master.CN_STATUS} != {cp.Add((int)Enums.OrderMainStatus.Archive)} ";
  101. }
  102. if (dicCondition.ContainsKey(tb_ord_order_master.CN_ORDER_CODE))
  103. {
  104. sql += $"AND {tb_ord_order_master.CN_ORDER_CODE} = {cp.Add(dicCondition[tb_ord_order_master.CN_ORDER_CODE])} ";
  105. }
  106. if (dicCondition.ContainsKey(tb_ord_order_master.CN_ARRIVED_DATE + "_start"))
  107. {
  108. sql += $"AND {tb_ord_order_master.CN_ARRIVED_DATE} >= {cp.Add(dicCondition[tb_ord_order_master.CN_ARRIVED_DATE + "_start"])} ";
  109. }
  110. if (dicCondition.ContainsKey(tb_ord_order_master.CN_ARRIVED_DATE + "_end"))
  111. {
  112. sql += $"AND {tb_ord_order_master.CN_ARRIVED_DATE} < {cp.Add(Convert.ToDateTime(dicCondition[tb_ord_order_master.CN_ARRIVED_DATE + "_end"]).AddDays(1))} ";
  113. }
  114. if (dicCondition.ContainsKey(tb_ord_order_master.CN_UID))
  115. {
  116. sql += $"AND {tb_ord_order_master.CN_UID} = {dicCondition[tb_ord_order_master.CN_UID]}";
  117. }
  118. if (dicCondition.ContainsKey(tb_ord_order_master.CN_GROUP_UID))
  119. {
  120. sql += $"AND aa.{tb_ord_order_master.CN_GROUP_UID} = {cp.Add(dicCondition[tb_ord_order_master.CN_GROUP_UID])} ";
  121. }
  122. else if (dicCondition.ContainsKey("GroupOrBranch_uid")) // 處理shopping list 搜尋選項 uid 有可能是branch or group
  123. {
  124. tb_grp_group cGroup = new tb_grp_group();
  125. cGroup.SetFullDirty();
  126. WhereNode wnGroup = new WhereNode(tb_grp_group.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group), dicCondition["GroupOrBranch_uid"].ToString());
  127. Command gSelect = Command.SetupSelectCmd(cGroup, wnGroup);
  128. ArsenalInterface aiGroup = ArsenalDBMgr.GetInst(gSelect);
  129. var qdsGroup = aiGroup.RunQueryList<tb_grp_group>(gSelect);
  130. if (qdsGroup.Any())
  131. {
  132. sql += $"AND aa.{tb_ord_order_master.CN_GROUP_UID} = {cp.Add(dicCondition["GroupOrBranch_uid"].ToString())} ";
  133. isGroup = true;
  134. }
  135. }
  136. sql += $"AND aa.{tb_ord_order_master.CN_GROUP_UID} IN ({string.Join(',', lsBranch.Select(x => $"'{x}'").ToArray())}) ";
  137. if (dicCondition.ContainsKey(tb_ord_order_master.CN_BRANCH_UID))
  138. {
  139. sql += $"AND {tb_ord_order_master.CN_BRANCH_UID} = {cp.Add(dicCondition[tb_ord_order_master.CN_BRANCH_UID].ToString())} ";
  140. }
  141. else if (dicCondition.ContainsKey("GroupOrBranch_uid") && !isGroup)
  142. {
  143. sql += $"AND {tb_ord_order_master.CN_BRANCH_UID} = {cp.Add(dicCondition["GroupOrBranch_uid"].ToString())} ";
  144. }
  145. else
  146. {
  147. sql += $"AND {tb_ord_order_master.CN_BRANCH_UID} IN ({string.Join(',', userBranch.Select(x=> $"'{x}'").ToArray())}) "; ;
  148. }
  149. Dictionary<string, string> mainOrderData = null;
  150. string mainFullTextPattern = null;
  151. if (i_crmInput != null && i_crmInput.param != null && i_crmInput.param.ContainsKey(BLWording.QRY_MASTER))
  152. {
  153. JArray joData = i_crmInput.param[BLWording.QRY_MASTER] as JArray;
  154. if (joData.Any() && joData[0][BLWording.ORDERDATA] != null)
  155. {
  156. JArray jaData = joData[0][BLWording.ORDERDATA] as JArray;
  157. mainOrderData = jaData[0].ToObject<Dictionary<string, string>>();
  158. }
  159. if (joData.Any() && joData[0][BLWording.FULLTEXT_PATTERN] != null)
  160. {
  161. mainFullTextPattern = joData[0][BLWording.FULLTEXT_PATTERN].ToString();
  162. sql +=
  163. $@"
  164. AND
  165. (
  166. aa.{tb_ord_order_master.CN_ORDER_CODE} LIKE {cp.Add($"%{mainFullTextPattern}%")}
  167. OR aa.{tb_ord_order_master.CN_NAME} LIKE {cp.Add($"%{mainFullTextPattern}%")}
  168. )
  169. ";
  170. }
  171. }
  172. // 如果不是查詢總Total, Join Sort And Offset
  173. if (!IsTotalQuery)
  174. {
  175. if (mainOrderData != null && mainOrderData.First().Key != tb_grp_branch.CN_BRANCH_NAME)
  176. {
  177. sql += $"ORDER BY {mainOrderData.First().Key} {mainOrderData.First().Value} ";
  178. }
  179. else
  180. {
  181. sql += $"ORDER BY {tb_grp_branch.CN_CREATE_DATE} DESC ";
  182. }
  183. sql += $"OFFSET {nPageIdx * nPageNum} ROW FETCH FIRST {nPageNum} ROW ONLY ";//配合上面語法
  184. }
  185. return GenerateCommand<tb_ord_message_log_record>(sql, cp, out command_);
  186. }
  187. public Command IsMemberOrderCheckedOut(string member_uid, string branch_uid)
  188. {
  189. Command command = null;
  190. ADirectCmdParameter cp = GetParamter();
  191. var sql = $@"
  192. SELECT dtl.{tb_ord_order_detail.CN_UID} FROM {nameof(tb_ord_order_detail)} dtl
  193. LEFT JOIN {nameof(tb_meb_member)} meb
  194. ON meb.{tb_meb_member.CN_UID} = dtl.{tb_ord_order_detail.CN_MEMBER_UID}
  195. LEFT JOIN {nameof(tb_grp_branch)} branch
  196. ON branch.{tb_grp_branch.CN_UID} = meb.{tb_meb_member.CN_DEFAULT_BRANCH}
  197. WHERE 1=1
  198. AND dtl.{tb_ord_order_detail.CN_STATUS} = {cp.Add((int)Enums.OrderStatus.NotTake)}
  199. AND meb.{tb_meb_member.CN_UID} = {cp.Add(member_uid)}
  200. AND branch.{tb_grp_branch.CN_UID} = {cp.Add(branch_uid)}
  201. ";
  202. GenerateCommand<tb_ord_message_log_record>(sql, cp, out command);
  203. return command;
  204. }
  205. }
  206. }