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.

525 lines
28 KiB

  1. using CounsellorBL.BLStructure;
  2. using CounsellorBL.Helper;
  3. using MonumentDefine;
  4. using Newtonsoft.Json;
  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. using Util = OT.COM.LogisticsUtil.Util;
  13. namespace CounsellorBL.ORD
  14. {
  15. public class PaymentListService : SingleDataTableTemplate<tb_ord_purchase>
  16. {
  17. public PaymentListService()
  18. {
  19. dgReadCommandPostDataHandler = readCommandPostDataHandler;
  20. dgUpdateCommandGenerator = updateCommandGenerator;
  21. dgDeleteCommandGenerator = deleteCommandGenerator;
  22. }
  23. public new CResponseMessage Read(CRequestMessage i_crmInput) => base.Read(i_crmInput);
  24. protected string readCommandPostDataHandler(CRequestMessage i_crmInput, ArsenalInterface i_aiArsenal, Command i_cCmd, JArray i_jaData, tb_sys_session i_sSessionUser, out object o_oReault,
  25. [System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
  26. [System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
  27. [System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
  28. {
  29. string sMsg;
  30. Command cRes = null;
  31. object oResultData = null;
  32. try
  33. {
  34. do
  35. {
  36. Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput); // 取得condition
  37. var lsBranch = ProjectHelper.GetUserGroup(i_crmInput);
  38. QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
  39. QueryJsonElement qjePurchase = lBlocks.GetInst();
  40. qjePurchase.table = tb_ord_purchase.TABLENAME;
  41. qjePurchase.displaycols = new List<string>() {
  42. tb_ord_purchase.CN_UID,
  43. tb_ord_purchase.CN_AMOUNT,
  44. tb_ord_purchase.CN_CREATE_DATE,
  45. tb_ord_purchase.CN_MEMBER_UID,
  46. tb_ord_purchase.CN_CONFIRMED_PAID,
  47. tb_ord_purchase.CN_PURCHASE_NUMBER
  48. };
  49. List<WhereNode> lsWn = new List<WhereNode>();
  50. if (Convert.ToInt32(dicCondition["payee"]) == (int)Enums.PayeeOption.Self)
  51. {
  52. var user = i_crmInput.customparam[BLWording.SESSION_USER] as tb_sys_session;
  53. lsWn.Add(new WhereNode(tb_ord_purchase.CN_CREATE_USER_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_purchase), user.create_user_uid));
  54. }
  55. if (dicCondition.ContainsKey(tb_ord_purchase.CN_CONFIRMED_PAID))
  56. {
  57. lsWn.Add(new WhereNode(tb_ord_purchase.CN_CONFIRMED_PAID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_purchase), Convert.ToInt32(dicCondition[tb_ord_purchase.CN_CONFIRMED_PAID])));
  58. }
  59. if (dicCondition.ContainsKey(tb_ord_purchase.CN_CREATE_DATE + "_start"))
  60. {
  61. lsWn.Add(new WhereNode(tb_ord_purchase.CN_CREATE_DATE, WhereNode.EColumnOperation.EOT_GTEQ, typeof(tb_ord_purchase), dicCondition[tb_ord_purchase.CN_CREATE_DATE + "_start"]));
  62. }
  63. if (dicCondition.ContainsKey(tb_ord_purchase.CN_CREATE_DATE + "_end"))
  64. {
  65. var endDate = Convert.ToDateTime(dicCondition[tb_ord_purchase.CN_CREATE_DATE + "_end"]);
  66. lsWn.Add(new WhereNode(tb_ord_purchase.CN_CREATE_DATE, WhereNode.EColumnOperation.EOT_LT, typeof(tb_ord_purchase), endDate.AddDays(1)));
  67. }
  68. lsWn.Add(new WhereNode(tb_ord_purchase.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_purchase), (int)Enums.Flag.Enable));
  69. qjePurchase.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lsWn.ToArray());
  70. qjePurchase.ordercols = new List<Tuple<QueryJsonElement, string, string>>()
  71. {
  72. new Tuple<QueryJsonElement, string, string>(qjePurchase, tb_ord_purchase.CN_CREATE_DATE, BLWording.ORDER_DESC)
  73. };
  74. QueryJsonElement qjeEmp = lBlocks.GetInst();
  75. qjeEmp.table = tb_hr_employee.TABLENAME;
  76. qjeEmp.jointype = QueryJsonElement.LEFT_JOIN;
  77. qjeEmp.jointable = qjePurchase;
  78. qjeEmp.joincols = new Dictionary<string, string>() {
  79. { tb_hr_employee.CN_UID,tb_ord_purchase.CN_CREATE_USER_UID }};
  80. qjeEmp.displaycols = new List<string>() { tb_hr_employee.CN_NAME };
  81. qjeEmp.aliascols = new Dictionary<string, List<string>>
  82. {
  83. { tb_hr_employee.CN_NAME, new List<string>() { "payee" } }
  84. };
  85. QueryJsonElement qjeMember = lBlocks.GetInst();
  86. qjeMember.table = tb_meb_member.TABLENAME;
  87. qjeMember.jointype = QueryJsonElement.LEFT_JOIN;
  88. qjeMember.jointable = qjePurchase;
  89. qjeMember.joincols = new Dictionary<string, string>() {
  90. { tb_meb_member.CN_UID,tb_ord_purchase.CN_MEMBER_UID }};
  91. if (dicCondition.ContainsKey("member_name"))
  92. {
  93. qjeMember.wherecols = new WhereNode(tb_meb_member.CN_NAME, WhereNode.EColumnOperation.EOT_LIKE, typeof(tb_meb_member), "%" + dicCondition["member_name"] + "%");
  94. }
  95. qjeMember.aliascols = new Dictionary<string, List<string>>
  96. {
  97. { tb_meb_member.CN_NAME, new List<string>() { "member_name" } }
  98. };
  99. QueryJsonElement qjeGroup = lBlocks.GetInst();
  100. qjeGroup.table = tb_grp_group.TABLENAME;
  101. qjeGroup.jointype = QueryJsonElement.LEFT_JOIN;
  102. qjeGroup.jointable = qjeMember;
  103. qjeGroup.joincols = new Dictionary<string, string>() {
  104. { tb_grp_group.CN_FB_GROUP_ID,tb_meb_member.CN_GROUP_ID }};
  105. if (dicCondition.ContainsKey(tb_grp_article.CN_GROUP_UID))
  106. {
  107. qjeGroup.wherecols = new WhereNode(tb_grp_group.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group), dicCondition[tb_grp_article.CN_GROUP_UID]);
  108. }
  109. else
  110. {
  111. qjeGroup.wherecols = new WhereNode(tb_grp_group.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_grp_group), lsBranch.ToArray());
  112. }
  113. qjeGroup.aliascols = new Dictionary<string, List<string>>
  114. {
  115. { tb_grp_group.CN_NAME, new List<string>() { "group_name" } }
  116. };
  117. lBlocks.Add(qjePurchase);
  118. lBlocks.Add(qjeEmp);
  119. lBlocks.Add(qjeMember);
  120. lBlocks.Add(qjeGroup);
  121. sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
  122. if (sMsg != null)
  123. {
  124. break;
  125. }
  126. ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
  127. QueryDataSet qds;
  128. if (dicCondition.ContainsKey("topSearch"))// 取貨清單 > 收款清單, 快速顯示前幾筆結帳資訊
  129. {
  130. qds = ai.RunQueryDataSet(
  131. cRes,
  132. null,
  133. 0,
  134. Convert.ToInt32(dicCondition["topPayQuantity"])// 顯示筆數
  135. );
  136. }
  137. else
  138. {
  139. qds = ai.RunQueryDataSet(cRes);
  140. }
  141. if (cRes.IsSuccess == false)
  142. {
  143. sMsg = cRes.LastErrorCode;
  144. break;
  145. }
  146. oResultData = new QueryResponse(qds);
  147. }
  148. while (false);
  149. }
  150. catch (Exception ex)
  151. {
  152. LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_nCodeLine, i_sMemberName, i_sSourcePath);
  153. sMsg = $"{nameof(readCommandPostDataHandler)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine}).";
  154. #if DEBUG
  155. System.Diagnostics.Debug.WriteLine(sMsg);
  156. #endif
  157. }
  158. o_oReault = oResultData;
  159. return sMsg;
  160. }
  161. protected string deleteCommandGenerator(CRequestMessage i_crmInput, JArray i_jaItems, tb_sys_session i_sSessionUser, out List<Command> o_lcResult, List<string> i_saQryContainKeys,
  162. [System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
  163. [System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
  164. [System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
  165. {
  166. string sMsg = null;
  167. List<Command> lcCmds = new List<Command>();
  168. try
  169. {
  170. do
  171. {
  172. foreach (JToken jtkItem in i_jaItems)
  173. {
  174. Dictionary<string, object> dicItem = jtkItem.ToObject<Dictionary<string, object>>();
  175. sMsg = getManualLog(i_crmInput, dicItem, BLWording.LOG_ACTION_NAME_DELETESQL, out Command cLog);
  176. if (sMsg != null)
  177. {
  178. break;
  179. }
  180. if (cLog != null)
  181. {
  182. lcCmds.Add(cLog);
  183. }
  184. string sMstUID = null;
  185. if (dicItem.ContainsKey(BLWording.WHEREDATA) && dicItem[BLWording.WHEREDATA] is JObject wheredata)
  186. {
  187. Dictionary<string, object> wheredataDic = wheredata.ToObject<Dictionary<string, object>>();
  188. if (wheredataDic.ContainsKey(tb_ord_purchase.CN_UID))
  189. {
  190. sMstUID = wheredataDic[tb_ord_purchase.CN_UID].ToString();
  191. string memberUID = wheredataDic[tb_ord_purchase.CN_MEMBER_UID].ToString();
  192. // 刪除收款紀錄
  193. lcCmds.Add(Command.SetupUpdateCmd(new tb_ord_purchase() { status_flag = (int)Enums.Flag.Disable }, new tb_ord_purchase() { uid = sMstUID }));
  194. // 查詢相關購物金
  195. tb_meb_shopping_points_record cPoints = new tb_meb_shopping_points_record();
  196. cPoints.SetDirty(tb_meb_shopping_points_record.CN_UID, tb_meb_shopping_points_record.CN_AMOUNT);
  197. tb_meb_shopping_points_record cConPoints = new tb_meb_shopping_points_record()
  198. {
  199. purchase_uid = sMstUID,
  200. };
  201. Command pointsSelect = Command.SetupSelectCmd(cPoints, cConPoints);
  202. ArsenalInterface aiPoints = ArsenalDBMgr.GetInst(pointsSelect);
  203. var qdsPoints = aiPoints.RunQueryList<tb_meb_shopping_points_record>(pointsSelect);
  204. if (qdsPoints.Count > 0)
  205. {
  206. List<string> points_uid = new List<string>();
  207. foreach (var points in qdsPoints)
  208. {
  209. points_uid.Add(points.uid);
  210. }
  211. lcCmds.Add(Command.SetupDeleteCmd(new WhereNode(tb_meb_shopping_points_record.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_meb_shopping_points_record), points_uid.ToArray())));
  212. }
  213. tb_meb_member mPoints = new tb_meb_member();
  214. mPoints.SetDirty(tb_meb_member.CN_SHOPPING_ACCOUNT);
  215. tb_meb_member mConPoints = new tb_meb_member()
  216. {
  217. uid = memberUID
  218. };
  219. Command pointsMemberSelect = Command.SetupSelectCmd(mPoints, mConPoints);
  220. aiPoints = ArsenalDBMgr.GetInst(pointsMemberSelect);
  221. var qdsMebPoints = aiPoints.RunQueryList<tb_meb_member>(pointsMemberSelect);
  222. lcCmds.Add(Command.SetupUpdateCmd(new tb_meb_member()
  223. {
  224. shopping_account = qdsMebPoints[0].shopping_account - Convert.ToInt32(qdsPoints.Sum(x => x.amount))
  225. }
  226. , new tb_meb_member() { uid = memberUID }));
  227. // 查詢收款紀錄商品
  228. tb_ord_purchase_detail cDetail = new tb_ord_purchase_detail();
  229. cDetail.SetDirty(tb_ord_purchase_detail.CN_QTY, tb_ord_purchase_detail.CN_ORDER_DETAIL_UID, tb_ord_purchase_detail.CN_ARTICLE2PRODUCT_UID, tb_ord_purchase_detail.CN_BRANCH_UID);
  230. tb_ord_purchase_detail cDetailCon = new tb_ord_purchase_detail()
  231. {
  232. purchase_uid = sMstUID
  233. };
  234. Command cDetailSelect = Command.SetupSelectCmd(cDetail, cDetailCon);
  235. ArsenalInterface ai = ArsenalDBMgr.GetInst(cDetailSelect);
  236. List<tb_ord_purchase_detail> qdsDetail = ai.RunQueryList<tb_ord_purchase_detail>(cDetailSelect);
  237. foreach (var detail in qdsDetail)
  238. {
  239. if (detail.order_detail_uid != null)
  240. {
  241. var returnQty = detail.qty;
  242. // 查詢訂單
  243. tb_ord_order_detail cOrder = new tb_ord_order_detail();
  244. cOrder.SetDirty(tb_ord_order_detail.CN_UID, tb_ord_order_detail.CN_TAKE_QTY);
  245. tb_ord_order_detail cCon = new tb_ord_order_detail()
  246. {
  247. uid = detail.order_detail_uid
  248. };
  249. Command cSelect = Command.SetupSelectCmd(cOrder, cCon);
  250. ai = ArsenalDBMgr.GetInst(cSelect);
  251. List<tb_ord_order_detail> qdsOrder = ai.RunQueryList<tb_ord_order_detail>(cSelect);
  252. // tb_ord_order_detail.status改回未取貨
  253. foreach (var order in qdsOrder)
  254. {
  255. var qty = returnQty >= order.take_qty ? order.take_qty : returnQty;
  256. tb_ord_order_detail upCon = new tb_ord_order_detail() { uid = order.uid };
  257. tb_ord_order_detail upData = new tb_ord_order_detail() { status = (int)Enums.OrderStatus.NotTake, take_qty = order.take_qty - qty };
  258. lcCmds.Add(Command.SetupUpdateCmd(upData, upCon));
  259. returnQty -= qty;
  260. }
  261. }
  262. }
  263. }
  264. }
  265. }
  266. }
  267. while (false);
  268. }
  269. catch (Exception ex)
  270. {
  271. LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_crmInput);
  272. sMsg = $"{nameof(deleteCommandGenerator)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine}).";
  273. #if DEBUG
  274. System.Diagnostics.Debug.WriteLine(sMsg);
  275. #endif
  276. }
  277. o_lcResult = lcCmds;
  278. return sMsg;
  279. }
  280. private string updateCommandGenerator(CRequestMessage i_crmInput, JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lcCmds, List<string> i_saQryContainKeys,
  281. [System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
  282. [System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
  283. [System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
  284. {
  285. string sMsg = null;
  286. List<Command> lCmds = new List<Command>();
  287. try
  288. {
  289. do
  290. {
  291. foreach (JToken joData in i_jaData)
  292. {
  293. Dictionary<string, object> dicData = joData.ToObject<Dictionary<string, object>>();
  294. JObject jwheredata = dicData[BLWording.WHEREDATA] as JObject;
  295. JArray jaData = jwheredata[tb_ord_purchase.CN_UID] as JArray;
  296. foreach (var data in jaData)
  297. {
  298. string uid = data.ToString();
  299. // 更新purchase.confirmed_paid
  300. tb_ord_purchase upData = new tb_ord_purchase() { confirmed_paid = (int)Enums.Flag.Enable };
  301. tb_ord_purchase upCon = new tb_ord_purchase() { uid = uid };
  302. lCmds.Add(Command.SetupUpdateCmd(upData, upCon));
  303. }
  304. }
  305. if (sMsg != null)
  306. {
  307. break;
  308. }
  309. }
  310. while (false);
  311. }
  312. catch (Exception ex)
  313. {
  314. LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_nCodeLine, i_sMemberName, i_sSourcePath);
  315. sMsg = $"{nameof(updateCommandGenerator)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine}).";
  316. #if DEBUG
  317. System.Diagnostics.Debug.WriteLine(sMsg);
  318. #endif
  319. }
  320. o_lcCmds = lCmds;
  321. return sMsg;
  322. }
  323. public CResponseMessage GetPurchaseDetail(CRequestMessage i_crmInput)
  324. {
  325. string sMsg;
  326. Command cRes = null;
  327. CResponseMessage crmRes = null;
  328. try
  329. {
  330. do
  331. {
  332. Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput); // 取得condition
  333. QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
  334. QueryJsonElement qjeDetail = lBlocks.GetInst();
  335. qjeDetail.table = tb_ord_purchase_detail.TABLENAME;
  336. qjeDetail.displaycols = new List<string>() {
  337. tb_ord_purchase_detail.CN_ARTICLE2PRODUCT_UID,
  338. tb_ord_purchase_detail.CN_UID,
  339. tb_ord_purchase_detail.CN_SPECIFICATION
  340. };
  341. qjeDetail.aliascols = new Dictionary<string, List<string>>
  342. {
  343. { QueryJsonElement.SUM(tb_ord_purchase_detail.CN_QTY), new List<string>() { tb_ord_order_detail.CN_ORDER_QTY} }
  344. };
  345. qjeDetail.wherecols = new WhereNode(tb_ord_purchase_detail.CN_PURCHASE_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_purchase_detail), dicCondition[tb_ord_purchase.CN_UID]);
  346. QueryJsonElement qjeMain = lBlocks.GetInst();
  347. qjeMain.table = tb_ord_purchase.TABLENAME;
  348. qjeMain.jointype = QueryJsonElement.LEFT_JOIN;
  349. qjeMain.jointable = qjeDetail;
  350. qjeMain.joincols = new Dictionary<string, string>() {
  351. { tb_ord_purchase.CN_UID,tb_ord_purchase_detail.CN_PURCHASE_UID }};
  352. qjeMain.displaycols = new List<string>() { tb_ord_purchase.CN_MEMBER_UID };
  353. QueryJsonElement qjeMember = lBlocks.GetInst();
  354. qjeMember.table = tb_meb_member.TABLENAME;
  355. qjeMember.jointype = QueryJsonElement.LEFT_JOIN;
  356. qjeMember.jointable = qjeMain;
  357. qjeMember.joincols = new Dictionary<string, string>() {
  358. { tb_meb_member.CN_UID,tb_ord_purchase.CN_MEMBER_UID }};
  359. qjeMember.displaycols = new List<string>()
  360. {
  361. tb_meb_member.CN_WPRICE_PAYMENT,
  362. };
  363. qjeMember.aliascols = new Dictionary<string, List<string>>
  364. {
  365. {tb_meb_member.CN_NAME , new List<string>() { "member_name"} }
  366. };
  367. QueryJsonElement qjeBranch = lBlocks.GetInst();
  368. qjeBranch.table = tb_grp_branch.TABLENAME;
  369. qjeBranch.jointype = QueryJsonElement.LEFT_JOIN;
  370. qjeBranch.jointable = qjeDetail;
  371. qjeBranch.joincols = new Dictionary<string, string>() {
  372. { tb_grp_branch.CN_UID,tb_ord_purchase_detail.CN_BRANCH_UID }};
  373. qjeBranch.displaycols = new List<string>() { tb_grp_branch.CN_BRANCH_NAME };
  374. QueryJsonElement qjeProduct = lBlocks.GetInst();
  375. qjeProduct.table = tb_prd_article2product.TABLENAME;
  376. qjeProduct.jointype = QueryJsonElement.LEFT_JOIN;
  377. qjeProduct.jointable = qjeDetail;
  378. qjeProduct.joincols = new Dictionary<string, string>() {
  379. { tb_prd_article2product.CN_UID,tb_ord_purchase_detail.CN_ARTICLE2PRODUCT_UID }};
  380. qjeProduct.displaycols = new List<string>() { tb_prd_article2product.CN_SEQ, tb_prd_article2product.CN_NAME, tb_prd_article2product.CN_PRICE, tb_prd_article2product.CN_WHOLESALE_PRICE };
  381. QueryJsonElement qjeArticle = lBlocks.GetInst();
  382. qjeArticle.table = tb_grp_article.TABLENAME;
  383. qjeArticle.jointype = QueryJsonElement.LEFT_JOIN;
  384. qjeArticle.jointable = qjeProduct;
  385. qjeArticle.joincols = new Dictionary<string, string>() {
  386. { tb_grp_article.CN_UID,tb_prd_article2product.CN_ARTICLE_UID }};
  387. qjeArticle.displaycols = new List<string>() { tb_grp_article.CN_DUTYFREE, };
  388. QueryJsonElement qjeOrderDetail = lBlocks.GetInst();
  389. qjeOrderDetail.table = tb_ord_order_detail.TABLENAME;
  390. qjeOrderDetail.jointype = QueryJsonElement.LEFT_JOIN;
  391. qjeOrderDetail.jointable = qjeDetail;
  392. qjeOrderDetail.joincols = new Dictionary<string, string>() {
  393. { tb_ord_order_detail.CN_UID,tb_ord_purchase_detail.CN_ORDER_DETAIL_UID }};
  394. QueryJsonElement qjeOrder = lBlocks.GetInst();
  395. qjeOrder.table = tb_ord_order_master.TABLENAME;
  396. qjeOrder.jointype = QueryJsonElement.LEFT_JOIN;
  397. qjeOrder.jointable = qjeOrderDetail;
  398. qjeOrder.joincols = new Dictionary<string, string>() {
  399. { tb_ord_order_master.CN_UID,tb_ord_order_detail.CN_ORDER_UID }};
  400. qjeOrder.aliascols = new Dictionary<string, List<string>>
  401. {
  402. { tb_ord_order_master.CN_NAME, new List<string>() { "order_name" } },
  403. };
  404. qjeDetail.groupcols = new List<Tuple<QueryJsonElement, string>>
  405. {
  406. Tuple.Create(qjeDetail, tb_ord_purchase_detail.CN_ARTICLE2PRODUCT_UID),
  407. Tuple.Create(qjeDetail, tb_ord_purchase_detail.CN_UID),
  408. Tuple.Create(qjeDetail, tb_ord_purchase_detail.CN_BRANCH_UID),
  409. Tuple.Create(qjeDetail, tb_ord_purchase_detail.CN_SPECIFICATION),
  410. Tuple.Create(qjeMain, tb_ord_purchase.CN_MEMBER_UID),
  411. Tuple.Create(qjeMember, tb_meb_member.CN_NAME),
  412. Tuple.Create(qjeMember, tb_meb_member.CN_WPRICE_PAYMENT),
  413. Tuple.Create(qjeBranch, tb_grp_branch.CN_BRANCH_NAME),
  414. Tuple.Create(qjeProduct, tb_prd_article2product.CN_PRICE),
  415. Tuple.Create(qjeProduct, tb_prd_article2product.CN_WHOLESALE_PRICE),
  416. Tuple.Create(qjeProduct, tb_prd_article2product.CN_SEQ),
  417. Tuple.Create(qjeProduct, tb_prd_article2product.CN_NAME),
  418. Tuple.Create(qjeOrder, tb_ord_order_master.CN_NAME),
  419. Tuple.Create(qjeArticle, tb_grp_article.CN_DUTYFREE),
  420. };
  421. lBlocks.Add(qjeDetail);
  422. lBlocks.Add(qjeMain);
  423. lBlocks.Add(qjeMember);
  424. lBlocks.Add(qjeBranch);
  425. lBlocks.Add(qjeProduct);
  426. lBlocks.Add(qjeArticle);
  427. lBlocks.Add(qjeOrderDetail);
  428. lBlocks.Add(qjeOrder);
  429. sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
  430. if (sMsg != null)
  431. {
  432. break;
  433. }
  434. ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
  435. QueryDataSet qds = ai.RunQueryDataSet(cRes);
  436. if (cRes.IsSuccess == false)
  437. {
  438. sMsg = cRes.LastErrorCode;
  439. break;
  440. }
  441. // 判斷是否使用購物金
  442. QueryJsonElementCollection lBlocks2 = new QueryJsonElementCollection();
  443. QueryJsonElement qjePoints = lBlocks2.GetInst();
  444. qjePoints.table = tb_meb_shopping_points_record.TABLENAME;
  445. qjePoints.displaycols = new List<string>()
  446. {
  447. tb_meb_shopping_points_record.CN_AMOUNT
  448. };
  449. List<WhereNode> lsWn = new List<WhereNode>();
  450. lsWn.Add(new WhereNode(tb_meb_shopping_points_record.CN_AMOUNT, WhereNode.EColumnOperation.EOT_LT, typeof(tb_meb_shopping_points_record), 0));
  451. lsWn.Add(new WhereNode(tb_meb_shopping_points_record.CN_PURCHASE_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_shopping_points_record), dicCondition[tb_ord_purchase.CN_UID]));
  452. qjePoints.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lsWn.ToArray());
  453. lBlocks2.Add(qjePoints);
  454. sMsg = MakeSelectJoinByBlocks(lBlocks2, out cRes);
  455. ArsenalInterface aiPoints = ArsenalDBMgr.GetInst(cRes);
  456. QueryDataSet qdsPoints = aiPoints.RunQueryDataSet(cRes);
  457. if (cRes.IsSuccess == false)
  458. {
  459. sMsg = cRes.LastErrorCode;
  460. break;
  461. }
  462. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  463. crmRes.param.Add(BLWording.DATA, qds);
  464. crmRes.param.Add("points", qdsPoints);
  465. }
  466. while (false);
  467. }
  468. catch (Exception ex)
  469. {
  470. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  471. sMsg = $"{nameof(GetPurchaseDetail)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  472. #if DEBUG
  473. System.Diagnostics.Debug.WriteLine(sMsg);
  474. #endif
  475. }
  476. if (null != sMsg)
  477. {
  478. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  479. }
  480. return crmRes;
  481. }
  482. }
  483. }