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.

5042 lines
273 KiB

  1. using CounsellorBL.BLStructure;
  2. using CounsellorBL.Common;
  3. using CounsellorBL.GROUP;
  4. using CounsellorBL.Helper;
  5. using CounsellorBL.ORD.ConstDefinition;
  6. using MonumentDefine;
  7. using Newtonsoft.Json;
  8. using Newtonsoft.Json.Linq;
  9. using NPOI.SS.UserModel;
  10. using NPOI.SS.Util;
  11. using NPOI.XSSF.UserModel;
  12. using OT.COM.ArsenalDB;
  13. using OT.COM.ArsenalDB.SQL;
  14. using OT.COM.SignalerMessage;
  15. using SoldierData.EnterprizeV4;
  16. using System;
  17. using System.Collections.Generic;
  18. using System.Data;
  19. using System.Diagnostics;
  20. using System.IO;
  21. using System.Linq;
  22. using System.Text;
  23. using WebMvcEF.Extensions;
  24. using static MonumentDefine.Enums;
  25. using Util = OT.COM.LogisticsUtil.Util;
  26. namespace CounsellorBL.ORD
  27. {
  28. public class OrderService : SingleDataTableTemplate<tb_ord_order_detail>
  29. {
  30. public OrderService()
  31. {
  32. dgReadCommandPostDataHandler = readCommandPostDataHandler;
  33. dgUpdateCommandGenerator = updateCommandGenerator;
  34. dgDeleteCommandGenerator = deleteCommandGenerator;
  35. }
  36. public new CResponseMessage Read(CRequestMessage i_crmInput) => base.Read(i_crmInput);
  37. public new CResponseMessage Update(CRequestMessage i_crmInput) => base.Update(i_crmInput);
  38. private class OrderDetail
  39. {
  40. public string name { get; set; }
  41. public string article_name { get; set; }
  42. public string uid { get; set; }
  43. public string order_uid { get; set; }
  44. public string article2product_uid { get; set; }
  45. public string member_uid { get; set; }
  46. public string member_name { get; set; }
  47. public int order_qty { get; set; }
  48. public int take_qty { get; set; }
  49. public int price { get; set; }
  50. public int wholesale_price { get; set; }
  51. public int status { get; set; }
  52. public string branch_name { get; set; }
  53. public int qty { get; set; }
  54. public string branch_uid { get; set; }
  55. public int seq { get; set; }
  56. public string memo { get; set; }
  57. public DateTime comment_time { get; set; }
  58. public int wprice_payment { get; set; }
  59. public string order_name { get; set; }
  60. public int purchase_amount { get; set; }
  61. public string purchase_order_uid { get; set; }
  62. public DateTime purchase_create_date { get; set; }
  63. public string specification { get; set; }
  64. public DateTime create_date { get; set; }
  65. public string dutyfree{ get; set; }
  66. public int branch_seq { get; set; }
  67. }
  68. private class GroupBranch
  69. {
  70. /// <summary>
  71. /// 社團名稱
  72. /// </summary>
  73. public string name { get; set; }
  74. public string branch_name { get; set; }
  75. /// <summary>
  76. /// 分店uid
  77. /// </summary>
  78. public string uid { get; set; }
  79. public string address { get; set;}
  80. public string phone_number { get; set; }
  81. public string contact_person { get; set; }
  82. }
  83. private class OrderResultData
  84. {
  85. public List<OrderMaster> records { get; set; }
  86. public int totalCount { get; set; }
  87. };
  88. [Auth(false)]
  89. public CResponseMessage ReadDetail(CRequestMessage i_crmInput)
  90. {
  91. string sMsg = null;
  92. Command cRes = null;
  93. CResponseMessage crmRes = null;
  94. try
  95. {
  96. do
  97. {
  98. var command = Command.SetupSelectCmd(new tb_meb_member(), new tb_meb_member());
  99. Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput); // 取得condition
  100. string[] aMemberUID = new string[0];
  101. List<OrderDetail> allData = new List<OrderDetail>();
  102. if (dicCondition.ContainsKey(tb_meb_member.CN_UID))
  103. {
  104. if (dicCondition[tb_meb_member.CN_UID] != null)
  105. {
  106. var jaMemberUID = dicCondition[tb_meb_member.CN_UID] as JArray;
  107. aMemberUID = jaMemberUID.Select(x => x.ToString()).ToArray();
  108. }
  109. }
  110. string[] slicedArray = aMemberUID.ToArray();
  111. QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
  112. QueryJsonElement qjeA = lBlocks.GetInst();
  113. qjeA.table = tb_ord_order_detail.TABLENAME;
  114. qjeA.displaycols = new List<string>()
  115. {
  116. tb_ord_order_detail.CN_ORDER_QTY,
  117. tb_ord_order_detail.CN_TAKE_QTY,
  118. tb_ord_order_detail.CN_STATUS,
  119. tb_ord_order_detail.CN_MEMBER_UID,
  120. tb_ord_order_detail.CN_SPECIFICATION,
  121. tb_ord_order_detail.CN_COMMENT_TIME,
  122. tb_ord_order_detail.CN_MEMO,
  123. tb_ord_order_detail.CN_ORDER_UID
  124. };
  125. List<WhereNode> lswnMain = new List<WhereNode>();
  126. if (dicCondition.ContainsKey(tb_ord_order_detail.CN_ORDER_UID))
  127. {
  128. var jaOrderUID = dicCondition[tb_ord_order_detail.CN_ORDER_UID] as JArray;
  129. var aOrderUID = jaOrderUID.Select(x => x.ToString()).ToArray();
  130. lswnMain.Add(new WhereNode(tb_ord_order_detail.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_master), aOrderUID));
  131. }
  132. if (dicCondition.ContainsKey(tb_ord_order_detail.CN_STATUS))
  133. {
  134. lswnMain.Add(new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.NotTake));
  135. }
  136. if (lswnMain.Any())
  137. {
  138. qjeA.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMain.ToArray());
  139. }
  140. QueryJsonElement qjeMain = lBlocks.GetInst();
  141. qjeMain.table = tb_ord_order_master.TABLENAME;
  142. qjeMain.jointype = QueryJsonElement.JOIN;
  143. qjeMain.jointable = qjeA;
  144. qjeMain.joincols = new Dictionary<string, string>() {
  145. { tb_ord_order_master.CN_UID,tb_ord_order_detail.CN_ORDER_UID }};
  146. qjeMain.displaycols = new List<string>()
  147. {
  148. tb_ord_order_master.CN_BRANCH_UID,
  149. tb_ord_order_master.CN_ORDER_CODE
  150. };
  151. qjeMain.aliascols = new Dictionary<string, List<string>>
  152. {
  153. { tb_ord_order_master.CN_NAME, new List<string>() { "order_name" } }
  154. };
  155. if (!dicCondition.ContainsKey(tb_ord_order_detail.CN_ORDER_UID))
  156. {
  157. qjeMain.wherecols = new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Archive);
  158. }
  159. QueryJsonElement qjeB = lBlocks.GetInst();
  160. qjeB.table = tb_meb_member.TABLENAME;
  161. qjeB.jointype = QueryJsonElement.LEFT_JOIN;
  162. qjeB.jointable = qjeA;
  163. qjeB.joincols = new Dictionary<string, string>() {
  164. { tb_meb_member.CN_UID,tb_ord_order_detail.CN_MEMBER_UID }};
  165. qjeB.displaycols = new List<string>()
  166. {
  167. tb_meb_member.CN_WPRICE_PAYMENT,
  168. };
  169. qjeB.aliascols = new Dictionary<string, List<string>>
  170. {
  171. { tb_meb_member.CN_NAME, new List<string>() { "member_name" } }
  172. };
  173. List<WhereNode> lswnMainMeb = new List<WhereNode>();
  174. if (dicCondition.ContainsKey(tb_meb_member.CN_GROUP_USER_ID) && dicCondition.ContainsKey(tb_meb_member.CN_GROUP_ID))
  175. {
  176. lswnMainMeb.Add(new WhereNode(tb_meb_member.CN_GROUP_USER_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), dicCondition[tb_meb_member.CN_GROUP_USER_ID]));
  177. lswnMainMeb.Add(new WhereNode(tb_meb_member.CN_GROUP_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), dicCondition[tb_meb_member.CN_GROUP_ID]));
  178. qjeB.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMainMeb.ToArray());
  179. }
  180. if (dicCondition.ContainsKey(tb_meb_member.CN_UID) && dicCondition[tb_meb_member.CN_UID] != null)
  181. {
  182. var dbTYpe = GetMasterDBTableInfo(typeof(tb_meb_member));
  183. dbTYpe.ConnectString = command.ConnectString;
  184. var existSql = Command.SetupDirectSelect(dbTYpe, $"select value from STRING_SPLIT('{string.Join(",", slicedArray)}', ',') where value = c.uid");
  185. qjeB.wherecols = new WhereNode(null, WhereNode.EColumnOperation.EOT_EXISTS, typeof(tb_meb_member), existSql);
  186. }
  187. QueryJsonElement qjeC = lBlocks.GetInst();
  188. qjeC.table = tb_grp_branch.TABLENAME;
  189. qjeC.jointype = QueryJsonElement.LEFT_JOIN;
  190. qjeC.jointable = qjeMain;
  191. qjeC.joincols = new Dictionary<string, string>() {
  192. { tb_grp_branch.CN_UID,tb_ord_order_master.CN_BRANCH_UID }};
  193. qjeC.displaycols = new List<string>() { tb_grp_branch.CN_BRANCH_NAME };
  194. QueryJsonElement qjeD = lBlocks.GetInst();
  195. qjeD.table = tb_prd_article2product.TABLENAME;
  196. qjeD.jointype = QueryJsonElement.LEFT_JOIN;
  197. qjeD.jointable = qjeA;
  198. qjeD.joincols = new Dictionary<string, string>() {
  199. { tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
  200. qjeD.displaycols = new List<string>() {
  201. tb_prd_article2product.CN_NAME,
  202. tb_prd_article2product.CN_PRICE,
  203. tb_prd_article2product.CN_WHOLESALE_PRICE,
  204. tb_prd_article2product.CN_UID,
  205. tb_prd_article2product.CN_SEQ
  206. };
  207. QueryJsonElement qjeE = lBlocks.GetInst();
  208. qjeE.table = tb_grp_article.TABLENAME;
  209. qjeE.jointype = QueryJsonElement.LEFT_JOIN;
  210. qjeE.jointable = qjeD;
  211. qjeE.joincols = new Dictionary<string, string>() {
  212. { tb_grp_article.CN_UID,tb_prd_article2product.CN_ARTICLE_UID }};
  213. qjeE.displaycols = new List<string>() { tb_grp_article.CN_DUTYFREE };
  214. qjeE.aliascols = new Dictionary<string, List<string>>
  215. {
  216. { tb_grp_article.CN_NAME, new List<string>() { "article_name" } }
  217. };
  218. QueryJsonElement qjeF = lBlocks.GetInst();
  219. qjeF.table = tb_ord_purchase_detail.TABLENAME;
  220. qjeF.jointype = QueryJsonElement.LEFT_JOIN;
  221. qjeF.jointable = qjeA;
  222. qjeF.joincols = new Dictionary<string, string>() {
  223. { tb_ord_purchase_detail.CN_ORDER_DETAIL_UID,tb_ord_order_detail.CN_UID }};
  224. qjeF.aliascols = new Dictionary<string, List<string>>
  225. {
  226. { tb_ord_purchase_detail.CN_AMOUNT, new List<string>() { "purchase_amount" } },
  227. { tb_ord_purchase_detail.CN_ORDER_DETAIL_UID, new List<string>() { "purchase_order_uid" } }
  228. };
  229. lBlocks.Add(qjeA);
  230. lBlocks.Add(qjeMain);
  231. lBlocks.Add(qjeB);
  232. lBlocks.Add(qjeC);
  233. lBlocks.Add(qjeD);
  234. lBlocks.Add(qjeE);
  235. lBlocks.Add(qjeF);
  236. sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
  237. if (sMsg != null)
  238. {
  239. break;
  240. }
  241. Stopwatch stopWatch = new Stopwatch();
  242. stopWatch.Start();
  243. ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
  244. cRes.ReadLevel = Command.EReadLevel.ERL_DIRTY;
  245. var qds = ai.RunQueryList<OrderDetail>(cRes);
  246. stopWatch.Stop();
  247. TimeSpan ts = stopWatch.Elapsed;
  248. // Format and display the TimeSpan value.
  249. string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
  250. ts.Hours, ts.Minutes, ts.Seconds,
  251. ts.Milliseconds / 10);
  252. Logger.Info("單次查詢耗時:" + elapsedTime);
  253. if (cRes.IsSuccess == false)
  254. {
  255. sMsg = cRes.LastErrorCode;
  256. break;
  257. }
  258. allData.AddRange(qds);
  259. var groupData = allData.GroupBy(x => new { x.member_uid, x.member_name });
  260. var oResultData = new List<List<OrderDetail>>();
  261. foreach (var data in groupData)
  262. {
  263. var takedDataList = new List<OrderDetail>();
  264. var arrivedGroup = data.GroupBy(x => x.purchase_order_uid);
  265. foreach (var takedData in arrivedGroup)
  266. {
  267. if (takedData.Key == null)
  268. {
  269. takedDataList.AddRange(takedData);
  270. }
  271. else
  272. {
  273. takedDataList.Add(takedData.FirstOrDefault());
  274. }
  275. }
  276. var pro = takedDataList.GroupBy(x => new { x.uid, x.order_uid, x.branch_uid, x.branch_name, x.status, x.specification})
  277. .Select(x => new OrderDetail
  278. {
  279. order_qty = x.Sum(c => c.order_qty),
  280. take_qty = x.Sum(c => c.take_qty),
  281. price = x.Key.status == (int)Enums.OrderStatus.Taked ?
  282. (
  283. (x.FirstOrDefault() == null ? 0 : x.FirstOrDefault().purchase_amount) /
  284. (x.FirstOrDefault() == null ? 0 : x.FirstOrDefault().take_qty)
  285. ) :
  286. x.FirstOrDefault() == null ? 0 : x.FirstOrDefault().price,
  287. wholesale_price = x.FirstOrDefault() == null ? 0 : x.FirstOrDefault().wholesale_price,
  288. specification = x.Key.specification,
  289. uid = x.Key.uid,
  290. order_uid = x.Key.order_uid,
  291. seq = x.FirstOrDefault() == null ? 0 : x.FirstOrDefault().seq,
  292. name = x.FirstOrDefault()?.name,
  293. member_uid = x.FirstOrDefault()?.member_uid,
  294. member_name = x.FirstOrDefault()?.member_name,
  295. status = x.Key.status,
  296. article_name = x.FirstOrDefault()?.article_name,
  297. order_name = x.FirstOrDefault()?.order_name,
  298. memo = x.FirstOrDefault()?.memo,
  299. branch_uid = x.Key.branch_uid,
  300. branch_name = x.Key.branch_name,
  301. comment_time = x.FirstOrDefault() == null ? DateTime.MinValue : x.FirstOrDefault().comment_time,
  302. wprice_payment = x.FirstOrDefault() == null ? 0 : x.FirstOrDefault().wprice_payment,
  303. dutyfree = x.FirstOrDefault()?.dutyfree
  304. })
  305. .OrderBy(x => x.status).ToList();
  306. oResultData.Add(pro);
  307. }
  308. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  309. crmRes.param.Add(BLWording.DATA, oResultData);
  310. }
  311. while (false);
  312. }
  313. catch (Exception ex)
  314. {
  315. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  316. sMsg = $"{nameof(ReadDetail)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  317. #if DEBUG
  318. System.Diagnostics.Debug.WriteLine(sMsg);
  319. #endif
  320. }
  321. if (null != sMsg)
  322. {
  323. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  324. }
  325. return crmRes;
  326. }
  327. public CResponseMessage GetOrderRecord(CRequestMessage i_crmInput)
  328. {
  329. string sMsg;
  330. Command cRes = null;
  331. CResponseMessage crmRes = null;
  332. try
  333. {
  334. do
  335. {
  336. Dictionary<string, string> dicCondition = GetQueryMasterFirstQJEDicwherecols(i_crmInput); // 取得condition
  337. QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
  338. QueryJsonElement qjeOrder = lBlocks.GetInst();
  339. qjeOrder.table = tb_ord_order_detail.TABLENAME;
  340. qjeOrder.displaycols = new List<string>()
  341. {
  342. tb_ord_order_detail.CN_ORDER_QTY,
  343. tb_ord_order_detail.CN_TAKE_QTY,
  344. tb_ord_order_detail.CN_STATUS,
  345. tb_ord_order_detail.CN_CREATE_DATE,
  346. tb_ord_order_detail.CN_OPERATE_DATE,
  347. tb_ord_order_detail.CN_SPECIFICATION
  348. };
  349. qjeOrder.wherecols = new WhereNode(tb_ord_order_detail.CN_MEMBER_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), dicCondition[tb_ord_order_detail.CN_MEMBER_UID]);
  350. QueryJsonElement qjeMain = lBlocks.GetInst();
  351. qjeMain.table = tb_ord_order_master.TABLENAME;
  352. qjeMain.jointype = QueryJsonElement.JOIN;
  353. qjeMain.jointable = qjeOrder;
  354. qjeMain.joincols = new Dictionary<string, string>() {
  355. { tb_ord_order_master.CN_UID,tb_ord_order_detail.CN_ORDER_UID }};
  356. qjeMain.displaycols = new List<string>() { tb_ord_order_master.CN_BRANCH_UID };
  357. qjeMain.aliascols = new Dictionary<string, List<string>>
  358. {
  359. { tb_ord_order_master.CN_NAME, new List<string>() { "order_name" } }
  360. };
  361. QueryJsonElement qjeBranch = lBlocks.GetInst();
  362. qjeBranch.table = tb_grp_branch.TABLENAME;
  363. qjeBranch.jointype = QueryJsonElement.LEFT_JOIN;
  364. qjeBranch.jointable = qjeMain;
  365. qjeBranch.joincols = new Dictionary<string, string>() {
  366. { tb_grp_branch.CN_UID,tb_ord_order_master.CN_BRANCH_UID }};
  367. qjeBranch.displaycols = new List<string>() { tb_grp_branch.CN_BRANCH_NAME };
  368. QueryJsonElement qjeArticle2Product = lBlocks.GetInst();
  369. qjeArticle2Product.table = tb_prd_article2product.TABLENAME;
  370. qjeArticle2Product.jointype = QueryJsonElement.LEFT_JOIN;
  371. qjeArticle2Product.jointable = qjeOrder;
  372. qjeArticle2Product.joincols = new Dictionary<string, string>() {
  373. { tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
  374. qjeArticle2Product.displaycols = new List<string>() {
  375. tb_prd_article2product.CN_NAME,
  376. tb_prd_article2product.CN_PRICE,
  377. tb_prd_article2product.CN_UID,
  378. tb_prd_article2product.CN_SEQ,
  379. };
  380. QueryJsonElement qjeArticle = lBlocks.GetInst();
  381. qjeArticle.table = tb_grp_article.TABLENAME;
  382. qjeArticle.jointype = QueryJsonElement.LEFT_JOIN;
  383. qjeArticle.jointable = qjeArticle2Product;
  384. qjeArticle.joincols = new Dictionary<string, string>() {
  385. { tb_grp_article.CN_UID,tb_prd_article2product.CN_ARTICLE_UID }};
  386. qjeArticle.aliascols = new Dictionary<string, List<string>>
  387. {
  388. { tb_grp_article.CN_NAME, new List<string>() { "article_name" } }
  389. };
  390. lBlocks.Add(qjeOrder);
  391. lBlocks.Add(qjeMain);
  392. lBlocks.Add(qjeBranch);
  393. lBlocks.Add(qjeArticle2Product);
  394. lBlocks.Add(qjeArticle);
  395. sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
  396. if (sMsg != null)
  397. {
  398. break;
  399. }
  400. ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
  401. var qds = ai.RunQueryList<OrderDetailEx>(cRes);
  402. var groupData = qds.GroupBy(x => new { x.branch_uid, x.uid, x.specification });
  403. var res = new List<OrderDetailEx>();
  404. var processStatus = new List<int>() { (int)Enums.OrderStatus.Taked, (int)Enums.OrderStatus.Return, (int)Enums.OrderStatus.Abandon };
  405. foreach (var row in groupData)
  406. {
  407. var dic = row.FirstOrDefault();
  408. dic.order_qty = row.Sum(x => Convert.ToInt32(x.order_qty));
  409. dic.take_qty = row.Sum(x => Convert.ToInt32(x.take_qty));
  410. res.Add(dic);
  411. }
  412. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  413. crmRes.param.Add(BLWording.DATA, res);
  414. }
  415. while (false);
  416. }
  417. catch (Exception ex)
  418. {
  419. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  420. sMsg = $"{nameof(GetOrderRecord)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  421. #if DEBUG
  422. System.Diagnostics.Debug.WriteLine(sMsg);
  423. #endif
  424. }
  425. if (null != sMsg)
  426. {
  427. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  428. }
  429. return crmRes;
  430. }
  431. private class OrderMasterPage
  432. {
  433. public string uid { get; set; }
  434. public int count { get; set; }
  435. }
  436. private class OrderMaster
  437. {
  438. public string uid { get; set; }
  439. public string article_uid { get; set; }
  440. public int sn { get; set; }
  441. public string order_code { get; set; }
  442. public string group_uid { get; set; }
  443. public string branch_uid { get; set; }
  444. public string branch_name { get; set; }
  445. public string name { get; set; }
  446. public int received { get; set; }
  447. public int receivable { get; set; }
  448. public int receivedOld { get; set; }
  449. public int receivableOld { get; set; }
  450. public string progress { get; set; }
  451. public DateTime? create_date { get; set; }
  452. public DateTime? arrived_date { get; set; }
  453. public int status { get; set; }
  454. public int type { get; set; }
  455. public string remark { get; set; }
  456. public string isSame { get; set; }
  457. }
  458. private class OrderDetailEx : OrderDetail
  459. {
  460. public string group_uid { get; set; }
  461. public string article_uid { get; set; }
  462. public string order_code { get; set; }
  463. public int type { get; set; }
  464. public int detail_status { get; set; }
  465. public DateTime? arrived_date { get; set; }
  466. public DateTime? operate_date { get; set; }
  467. public int received { get; set; }
  468. public int receivable { get; set; }
  469. public string remark { get; set; }
  470. }
  471. protected string readCommandPostDataHandler(CRequestMessage i_crmInput, ArsenalInterface i_aiArsenal, Command i_cCmd, JArray i_jaData, tb_sys_session i_sSessionUser, out object o_oReault,
  472. [System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
  473. [System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
  474. [System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
  475. {
  476. int nPageIdx = -1;
  477. int nPageNum = -1;
  478. string sMsg = "";
  479. object oResultData = null;
  480. try
  481. {
  482. do
  483. {
  484. sMsg = getCommonParameter(i_crmInput, BLWording.QRY_MASTER, out JArray jaDataArray, out tb_sys_session sUserSession, false);
  485. if (sMsg != null)
  486. {
  487. break;
  488. }
  489. if (i_crmInput != null)
  490. {
  491. if (i_crmInput.param.ContainsKey(BLWording.QRY_PAGE_IDX)
  492. && Int32.TryParse(i_crmInput.param[BLWording.QRY_PAGE_IDX].ToString(), out int nPageIdxFromUI)
  493. && nPageIdxFromUI >= 0)
  494. {
  495. nPageIdx = nPageIdxFromUI;
  496. }
  497. if (i_crmInput.param.ContainsKey(BLWording.QRY_PAGE_NUM)
  498. && Int32.TryParse(i_crmInput.param[BLWording.QRY_PAGE_NUM].ToString(), out int nPageNumFromUI)
  499. && nPageNumFromUI >= 0)
  500. {
  501. nPageNum = nPageNumFromUI;
  502. }
  503. }
  504. Dictionary<string, string> dicCondition = GetQueryMasterFirstQJEDicwherecols(i_crmInput); // 取得condition
  505. var lsBranch = ProjectHelper.GetUserGroup(i_crmInput);
  506. var userBranch = ProjectHelper.GetUserBranch(i_crmInput);
  507. var result = readCommandPostDataHandlerRefactor(i_crmInput, dicCondition, lsBranch, userBranch, nPageIdx, nPageNum);
  508. //// 新舊資料比對
  509. //readCommandPostDataHandlerOld(i_crmInput, i_aiArsenal, i_cCmd, i_jaData, i_sSessionUser, out object oldOrderResult);
  510. //string json = JsonConvert.SerializeObject(oldOrderResult);
  511. //OrderResultData re = JsonConvert.DeserializeObject<OrderResultData>(json);
  512. ////var OrderResultDataRecords = (oldOrderResult as OrderResultData).records;
  513. //var OrderResultDataRecords = re.records;
  514. //foreach (var entity in result.records)
  515. //{
  516. // if (OrderResultDataRecords.Select(x => x.uid).Contains(entity.uid))
  517. // {
  518. // entity.receivedOld = OrderResultDataRecords.Find(x => x.uid == entity.uid).received;
  519. // entity.receivableOld = OrderResultDataRecords.Find(x => x.uid == entity.uid).receivable;
  520. // entity.isSame = entity.receivedOld == entity.received && entity.receivableOld == entity.receivableOld ? "" : "failed";
  521. // }
  522. //}
  523. oResultData = new { records = result.records, TotalCount = result.TotalCount };
  524. }
  525. while (false);
  526. }
  527. catch (Exception ex)
  528. {
  529. LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_nCodeLine, i_sMemberName, i_sSourcePath);
  530. sMsg = $"{nameof(readCommandPostDataHandler)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine}).";
  531. #if DEBUG
  532. System.Diagnostics.Debug.WriteLine(sMsg);
  533. #endif
  534. }
  535. o_oReault = oResultData;
  536. return sMsg;
  537. }
  538. /// <summary>
  539. /// 保留舊版, 測試用
  540. /// </summary>
  541. /// <returns></returns>
  542. protected string readCommandPostDataHandlerOld(CRequestMessage i_crmInput, ArsenalInterface i_aiArsenal, Command i_cCmd, JArray i_jaData, tb_sys_session i_sSessionUser, out object o_oReault,
  543. [System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
  544. [System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
  545. [System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
  546. {
  547. string sMsg;
  548. Command cRes = null;
  549. Command cResOrderMst = null;
  550. object oResultData = null;
  551. try
  552. {
  553. do
  554. {
  555. sMsg = getCommonParameter(i_crmInput, BLWording.QRY_MASTER, out JArray jaDataArray, out tb_sys_session sUserSession, false);
  556. if (sMsg != null)
  557. {
  558. break;
  559. }
  560. int nPageIdx = -1;
  561. int nPageNum = -1;
  562. if (i_crmInput != null)
  563. {
  564. if (i_crmInput.param.ContainsKey(BLWording.QRY_PAGE_IDX)
  565. && Int32.TryParse(i_crmInput.param[BLWording.QRY_PAGE_IDX].ToString(), out int nPageIdxFromUI)
  566. && nPageIdxFromUI >= 0)
  567. {
  568. nPageIdx = nPageIdxFromUI;
  569. }
  570. if (i_crmInput.param.ContainsKey(BLWording.QRY_PAGE_NUM)
  571. && Int32.TryParse(i_crmInput.param[BLWording.QRY_PAGE_NUM].ToString(), out int nPageNumFromUI)
  572. && nPageNumFromUI >= 0)
  573. {
  574. nPageNum = nPageNumFromUI;
  575. }
  576. }
  577. tb_ord_order_master om = new tb_ord_order_master();
  578. om.SetFullDirty();
  579. JObject jtDataItem = (JObject)jaDataArray[0];
  580. List<Tuple<string, string>> ordercols = null;
  581. if (jtDataItem.ContainsKey(BLWording.ORDERDATA))
  582. {
  583. List<Dictionary<string, string>> lDic = jtDataItem[BLWording.ORDERDATA].ToObject<List<Dictionary<string, string>>>();
  584. List<Tuple<string, string>> ltss = new List<Tuple<string, string>>();
  585. lDic.ForEach(f =>
  586. {
  587. string sKey = f.Keys.First();
  588. ltss.Add(Tuple.Create(sKey, f[sKey]));
  589. });
  590. ordercols = ltss;
  591. }
  592. Command cOrder = Command.SetupSelectCmdByParam(om, null, i_ordercols: ordercols);
  593. Dictionary<string, string> dicCondition = GetQueryMasterFirstQJEDicwherecols(i_crmInput); // 取得condition
  594. var lsBranch = ProjectHelper.GetUserGroup(i_crmInput);
  595. var userBranch = ProjectHelper.GetUserBranch(i_crmInput);
  596. QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
  597. bool isGroup = false;
  598. QueryJsonElement qjeMain = lBlocks.GetInst();
  599. qjeMain.table = tb_ord_order_master.TABLENAME;
  600. qjeMain.displaycols = new List<string>() {
  601. tb_ord_order_master.CN_UID
  602. };
  603. List<WhereNode> lswnMain = new List<WhereNode>();
  604. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_TYPE, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.ArticleType.Purchase));
  605. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), BLWording.STATUS_FLAG_ON));
  606. if (dicCondition.ContainsKey(tb_ord_order_master.CN_CREATE_DATE + "_start"))
  607. {
  608. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_CREATE_DATE, WhereNode.EColumnOperation.EOT_GTEQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_CREATE_DATE + "_start"]));
  609. }
  610. if (dicCondition.ContainsKey(tb_ord_order_master.CN_CREATE_DATE + "_end"))
  611. {
  612. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_CREATE_DATE, WhereNode.EColumnOperation.EOT_LT, typeof(tb_ord_order_master), Convert.ToDateTime(dicCondition[tb_ord_order_master.CN_CREATE_DATE + "_end"]).AddDays(1)));
  613. }
  614. if (dicCondition.ContainsKey(tb_ord_order_master.CN_STATUS))
  615. {
  616. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_STATUS]));
  617. }
  618. else
  619. {
  620. // 扣除封存訂單
  621. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Archive));
  622. }
  623. if (dicCondition.ContainsKey(tb_ord_order_master.CN_ORDER_CODE))
  624. {
  625. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_ORDER_CODE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_ORDER_CODE]));
  626. }
  627. if (dicCondition.ContainsKey(tb_ord_order_master.CN_ARRIVED_DATE + "_start"))
  628. {
  629. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_ARRIVED_DATE, WhereNode.EColumnOperation.EOT_GTEQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_ARRIVED_DATE + "_start"]));
  630. }
  631. if (dicCondition.ContainsKey(tb_ord_order_master.CN_ARRIVED_DATE + "_end"))
  632. {
  633. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_ARRIVED_DATE, WhereNode.EColumnOperation.EOT_LT, typeof(tb_ord_order_master), Convert.ToDateTime(dicCondition[tb_ord_order_master.CN_ARRIVED_DATE + "_end"]).AddDays(1)));
  634. }
  635. if (dicCondition.ContainsKey(tb_ord_order_master.CN_UID))
  636. {
  637. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_UID]));
  638. }
  639. List<WhereNode> lswnGroup = new List<WhereNode>();
  640. if (dicCondition.ContainsKey(tb_ord_order_master.CN_GROUP_UID))
  641. {
  642. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_GROUP_UID]));
  643. }
  644. else if (dicCondition.ContainsKey("GroupOrBranch_uid")) // 處理shopping list 搜尋選項 uid 有可能是branch or group
  645. {
  646. tb_grp_group cGroup = new tb_grp_group();
  647. cGroup.SetFullDirty();
  648. WhereNode wnGroup = new WhereNode(tb_grp_group.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group), dicCondition["GroupOrBranch_uid"].ToString());
  649. Command gSelect = Command.SetupSelectCmd(cGroup, wnGroup);
  650. ArsenalInterface aiGroup = ArsenalDBMgr.GetInst(gSelect);
  651. var qdsGroup = aiGroup.RunQueryList<tb_grp_group>(gSelect);
  652. if (qdsGroup.Any())
  653. {
  654. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition["GroupOrBranch_uid"].ToString()));
  655. isGroup = true;
  656. }
  657. }
  658. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_master), lsBranch.ToArray()));
  659. if (dicCondition.ContainsKey(tb_ord_order_master.CN_BRANCH_UID))
  660. {
  661. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_BRANCH_UID].ToString()));
  662. }
  663. else if (dicCondition.ContainsKey("GroupOrBranch_uid") && !isGroup)
  664. {
  665. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition["GroupOrBranch_uid"].ToString()));
  666. }
  667. else
  668. {
  669. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_master), userBranch.ToArray()));
  670. }
  671. QueryJsonElement qjeBranch = lBlocks.GetInst();
  672. qjeBranch.table = tb_grp_branch.TABLENAME;
  673. qjeBranch.jointype = QueryJsonElement.LEFT_JOIN;
  674. qjeBranch.jointable = qjeMain;
  675. qjeBranch.joincols = new Dictionary<string, string>() {
  676. { tb_grp_branch.CN_UID,tb_ord_order_master.CN_BRANCH_UID }};
  677. qjeBranch.displaycols = new List<string>() { tb_grp_branch.CN_BRANCH_NAME };
  678. Dictionary<string, string> mainOrderData = null;
  679. string mainFullTextPattern = null;
  680. if (i_crmInput != null && i_crmInput.param != null && i_crmInput.param.ContainsKey(BLWording.QRY_MASTER))
  681. {
  682. JArray joData = i_crmInput.param[BLWording.QRY_MASTER] as JArray;
  683. if (joData.Any() && joData[0][BLWording.ORDERDATA] != null)
  684. {
  685. JArray jaData = joData[0][BLWording.ORDERDATA] as JArray;
  686. mainOrderData = jaData[0].ToObject<Dictionary<string, string>>();
  687. }
  688. if (joData.Any() && joData[0][BLWording.FULLTEXT_PATTERN] != null)
  689. {
  690. mainFullTextPattern = joData[0][BLWording.FULLTEXT_PATTERN].ToString();
  691. lswnMain.Add(new WhereNode(WhereNode.ENodeOperation.ENO_OR, new WhereNode[] { new WhereNode(tb_ord_order_master.CN_ORDER_CODE, WhereNode.EColumnOperation.EOT_LIKE, typeof(tb_ord_order_master), mainFullTextPattern),
  692. new WhereNode(tb_ord_order_master.CN_NAME, WhereNode.EColumnOperation.EOT_LIKE, typeof(tb_ord_order_master), mainFullTextPattern) }));
  693. }
  694. }
  695. if (lswnMain.Any())
  696. {
  697. qjeMain.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMain.ToArray());
  698. }
  699. List<Tuple<QueryJsonElement, string, string>> mainOrder = new List<Tuple<QueryJsonElement, string, string>>();
  700. if (mainOrderData != null &&
  701. (
  702. mainOrderData.First().Key != "received" ||
  703. mainOrderData.First().Key != "receivable"
  704. )
  705. )
  706. {
  707. if (mainOrderData.First().Key == tb_grp_branch.CN_BRANCH_NAME)
  708. {
  709. mainOrder.Add(Tuple.Create(qjeBranch, mainOrderData.First().Key, mainOrderData.First().Value));
  710. }
  711. else
  712. {
  713. mainOrder.Add(Tuple.Create(qjeMain, mainOrderData.First().Key, mainOrderData.First().Value));
  714. }
  715. }
  716. else
  717. {
  718. mainOrder.Add(Tuple.Create(qjeMain, tb_ord_order_master.CN_CREATE_DATE, BLWording.ORDER_DESC));
  719. }
  720. qjeMain.ordercols = mainOrder;
  721. lBlocks.Add(qjeMain);
  722. sMsg = MakeSelectJoinByBlocks(lBlocks, out cResOrderMst);
  723. cResOrderMst.NeedCount = true;
  724. ArsenalInterface ai = ArsenalDBMgr.GetInst(cResOrderMst);
  725. var qdsOrderMst = ai.RunQueryDataSet(cResOrderMst, i_nPageIdx: nPageIdx, i_nNumOfPage: nPageNum);
  726. List<string> orderMstArray = new List<string>();
  727. foreach (DataRow data in qdsOrderMst.DATA.Tables[0].Rows)
  728. {
  729. orderMstArray.Add(data[tb_ord_order_master.CN_UID].ToString());
  730. }
  731. lBlocks = new QueryJsonElementCollection();
  732. qjeMain = lBlocks.GetInst();
  733. qjeMain.table = tb_ord_order_master.TABLENAME;
  734. qjeMain.displaycols = new List<string>() {
  735. tb_ord_order_master.CN_UID,
  736. tb_ord_order_master.CN_TYPE,
  737. tb_ord_order_master.CN_ORDER_CODE,
  738. tb_ord_order_master.CN_STATUS,
  739. tb_ord_order_master.CN_CREATE_DATE,
  740. tb_ord_order_master.CN_GROUP_UID,
  741. tb_ord_order_master.CN_BRANCH_UID,
  742. tb_ord_order_master.CN_ARRIVED_DATE,
  743. tb_ord_order_master.CN_ARTICLE_UID,
  744. tb_ord_order_master.CN_NAME
  745. };
  746. qjeMain.wherecols = new WhereNode(tb_ord_order_master.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_master), orderMstArray.ToArray());
  747. QueryJsonElement qjeOrder = lBlocks.GetInst();
  748. qjeOrder.table = tb_ord_order_detail.TABLENAME;
  749. qjeOrder.jointype = QueryJsonElement.LEFT_JOIN;
  750. qjeOrder.jointable = qjeMain;
  751. qjeOrder.joincols = new Dictionary<string, string>() {
  752. { tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
  753. qjeOrder.displaycols = new List<string>() {
  754. tb_ord_order_detail.CN_ORDER_QTY,
  755. tb_ord_order_detail.CN_TAKE_QTY,
  756. };
  757. qjeOrder.aliascols = new Dictionary<string, List<string>>
  758. {
  759. { tb_ord_order_detail.CN_STATUS, new List<string>() { "detail_status" } },
  760. //{ QueryJsonElement.SUM(tb_ord_order_detail.CN_ORDER_QTY), new List<string>() { "count" } },
  761. //{ QueryJsonElement.SUM(tb_ord_order_detail.CN_TAKE_QTY), new List<string>() { "soldCount" } },
  762. };
  763. QueryJsonElement qjeGroup = lBlocks.GetInst();
  764. qjeGroup.table = tb_grp_group.TABLENAME;
  765. qjeGroup.jointype = QueryJsonElement.LEFT_JOIN;
  766. qjeGroup.jointable = qjeMain;
  767. qjeGroup.joincols = new Dictionary<string, string>() {
  768. { tb_grp_group.CN_UID,tb_ord_order_master.CN_GROUP_UID }};
  769. qjeBranch = lBlocks.GetInst();
  770. qjeBranch.table = tb_grp_branch.TABLENAME;
  771. qjeBranch.jointype = QueryJsonElement.LEFT_JOIN;
  772. qjeBranch.jointable = qjeMain;
  773. qjeBranch.joincols = new Dictionary<string, string>() {
  774. { tb_grp_branch.CN_UID,tb_ord_order_master.CN_BRANCH_UID }};
  775. qjeBranch.displaycols = new List<string>() { tb_grp_branch.CN_BRANCH_NAME };
  776. QueryJsonElement qjeArticleProduct = lBlocks.GetInst();
  777. qjeArticleProduct.table = tb_prd_article2product.TABLENAME;
  778. qjeArticleProduct.jointype = QueryJsonElement.LEFT_JOIN;
  779. qjeArticleProduct.jointable = qjeOrder;
  780. qjeArticleProduct.joincols = new Dictionary<string, string>() {
  781. { tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
  782. qjeArticleProduct.displaycols = new List<string>() {
  783. tb_prd_article2product.CN_PRICE
  784. };
  785. if (dicCondition.ContainsKey(tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID))
  786. {
  787. qjeArticleProduct.wherecols = new WhereNode(tb_prd_article2product.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_prd_article2product), dicCondition[tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID].ToString());
  788. }
  789. QueryJsonElement qjePurchase = lBlocks.GetInst();
  790. qjePurchase.table = tb_ord_purchase_detail.TABLENAME;
  791. qjePurchase.jointype = QueryJsonElement.LEFT_JOIN;
  792. qjePurchase.jointable = qjeOrder;
  793. qjePurchase.joincols = new Dictionary<string, string>() {
  794. { tb_ord_purchase_detail.CN_ORDER_DETAIL_UID,tb_ord_order_detail.CN_UID }};
  795. qjePurchase.aliascols = new Dictionary<string, List<string>>
  796. {
  797. { tb_ord_purchase_detail.CN_AMOUNT, new List<string>() { "purchase_amount" } },
  798. { tb_ord_purchase_detail.CN_ORDER_DETAIL_UID, new List<string>() { "purchase_order_uid" } },
  799. { tb_ord_purchase_detail.CN_CREATE_DATE, new List<string>() { "purchase_create_date" } }
  800. };
  801. //qjeArticleProduct.groupcols = new List<Tuple<QueryJsonElement, string>>
  802. //{
  803. // Tuple.Create(qjeMain, tb_ord_order_master.CN_UID),
  804. // Tuple.Create(qjeMain, tb_ord_order_master.CN_ARTICLE_UID),
  805. // Tuple.Create(qjeMain, tb_ord_order_master.CN_TYPE),
  806. // Tuple.Create(qjeMain,tb_ord_order_master.CN_STATUS),
  807. // Tuple.Create(qjeMain, tb_ord_order_master.CN_CREATE_DATE),
  808. // Tuple.Create(qjeMain, tb_ord_order_master.CN_ORDER_CODE),
  809. // Tuple.Create(qjeMain, tb_ord_order_master.CN_BRANCH_UID),
  810. // Tuple.Create(qjeMain, tb_ord_order_master.CN_ARRIVED_DATE),
  811. // Tuple.Create(qjeMain, tb_grp_branch.CN_GROUP_UID),
  812. // Tuple.Create(qjeMain, tb_grp_article.CN_NAME),
  813. // Tuple.Create(qjeBranch, tb_grp_branch.CN_BRANCH_NAME),
  814. // Tuple.Create(qjeArticleProduct, tb_prd_article2product.CN_PRICE)
  815. //};
  816. lBlocks.Add(qjeMain);
  817. lBlocks.Add(qjeOrder);
  818. lBlocks.Add(qjeGroup);
  819. lBlocks.Add(qjeBranch);
  820. lBlocks.Add(qjeArticleProduct);
  821. lBlocks.Add(qjePurchase);
  822. sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
  823. if (sMsg != null)
  824. {
  825. break;
  826. }
  827. ai = ArsenalDBMgr.GetInst(cRes);
  828. var qds = ai.RunQueryList<OrderDetailEx>(cRes);
  829. var takedDataList = new List<OrderDetailEx>();
  830. var arrivedGroup = qds.GroupBy(x => x.purchase_order_uid).ToList();
  831. foreach (var takedData in arrivedGroup)
  832. {
  833. if (takedData.Key == null)
  834. {
  835. takedDataList.AddRange(takedData);
  836. }
  837. else
  838. {
  839. takedDataList.Add(takedData.OrderByDescending(x => x.purchase_create_date).FirstOrDefault());
  840. }
  841. }
  842. var groupData = takedDataList.GroupBy(x => x.uid).ToList();
  843. var res = new List<OrderMaster>();
  844. foreach (var data in groupData)
  845. {
  846. //var received = string.IsNullOrEmpty(data["soldCount"]?.ToString()) || string.IsNullOrEmpty(data[tb_prd_article2product.CN_PRICE]?.ToString()) ? 0 : (int)data["soldCount"] * (int)data[tb_prd_article2product.CN_PRICE];
  847. //var receivable = string.IsNullOrEmpty(?.ToString()) || string.IsNullOrEmpty(data[tb_prd_article2product.CN_PRICE]?.ToString()) ? 0 : (int)data["count"] * (int)data[tb_prd_article2product.CN_PRICE];
  848. var received = 0;
  849. var receivable = 0;
  850. foreach (var detail in data)
  851. {
  852. if (detail.detail_status == (int)Enums.OrderStatus.Taked)
  853. {
  854. if (detail.take_qty != 0)
  855. {
  856. received += detail.purchase_amount;
  857. receivable += detail.order_qty * detail.purchase_amount / detail.take_qty;
  858. }
  859. }
  860. else
  861. {
  862. received += detail.take_qty * detail.price;
  863. receivable += detail.order_qty * detail.price;
  864. }
  865. }
  866. var orderDetail = data.FirstOrDefault();
  867. var model = new OrderMaster()
  868. {
  869. uid = data.Key,
  870. received = received,
  871. receivable = receivable,
  872. progress = receivable == 0 || received == 0 ? "0%" : Math.Round((decimal)received / receivable * 100, 0, MidpointRounding.AwayFromZero).ToString() + "%",
  873. article_uid = orderDetail?.article_uid,
  874. order_code = orderDetail?.order_code,
  875. group_uid = orderDetail?.group_uid,
  876. branch_uid = orderDetail?.branch_uid,
  877. branch_name = orderDetail?.branch_name,
  878. create_date = orderDetail?.create_date,
  879. arrived_date = orderDetail?.arrived_date,
  880. status = orderDetail == null ? 0 : orderDetail.status,
  881. type = orderDetail == null ? 0 : orderDetail.type,
  882. name = orderDetail.type == (int)Enums.ArticleType.Stock ? string.Format("【現貨】{0}", orderDetail?.name) : orderDetail?.name,
  883. };
  884. res.Add(model);
  885. }
  886. var orderData = res.OrderByDescending(x => x.create_date).ToList();
  887. //var orderData = res.GroupBy(x => new
  888. //{
  889. // x.uid,
  890. // x.article_uid,
  891. // x.order_code,
  892. // x.group_uid,
  893. // x.branch_uid,
  894. // x.branch_name,
  895. // x.name,
  896. // x.create_date,
  897. // x.arrived_date,
  898. // x.status,
  899. // x.type
  900. //}).Select(x => new OrderMaster
  901. //{
  902. // uid = x.Key.uid,
  903. // article_uid = x.Key.article_uid,
  904. // order_code = x.Key.order_code,
  905. // group_uid = x.Key.group_uid,
  906. // branch_uid = x.Key.branch_uid,
  907. // branch_name = x.Key.branch_name,
  908. // name = x.Key.name,
  909. // received = x.Sum(c => c.received),
  910. // receivable = x.Sum(c => c.receivable),
  911. // progress = x.Sum(c => c.received) == 0 || x.Sum(c => c.receivable) == 0 ? "0%" : Math.Round((decimal)x.Sum(c => c.received) / x.Sum(c => c.receivable), 0, MidpointRounding.AwayFromZero).ToString() + "%",
  912. // create_date = x.Key.create_date,
  913. // arrived_date = x.Key.arrived_date,
  914. // status = x.Key.status,
  915. // type = x.Key.type
  916. //}).OrderByDescending(x => x.create_date).ToList();
  917. int sn = nPageIdx * nPageNum;
  918. foreach (var d in orderData)
  919. {
  920. d.sn = ++sn;
  921. }
  922. oResultData = new { records = orderData, totalCount = qdsOrderMst.Total };
  923. }
  924. while (false);
  925. }
  926. catch (Exception ex)
  927. {
  928. LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_nCodeLine, i_sMemberName, i_sSourcePath);
  929. sMsg = $"{nameof(readCommandPostDataHandlerOld)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine}).";
  930. #if DEBUG
  931. System.Diagnostics.Debug.WriteLine(sMsg);
  932. #endif
  933. }
  934. o_oReault = oResultData;
  935. return sMsg;
  936. }
  937. private string updateCommandGenerator(CRequestMessage i_crmInput, JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lcCmds, List<string> i_saQryContainKeys,
  938. [System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
  939. [System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
  940. [System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
  941. {
  942. string sMsg = null;
  943. List<Command> lCmds = new List<Command>();
  944. ArsenalInterface ai = null;
  945. try
  946. {
  947. do
  948. {
  949. var now = DateTime.Now;
  950. foreach (JToken joData in i_jaData)
  951. {
  952. Dictionary<string, object> dicData = joData.ToObject<Dictionary<string, object>>();
  953. if (!dicData.ContainsKey(tb_ord_order_master.CN_STATUS))
  954. {
  955. sMsg = "狀態錯誤";
  956. break;
  957. }
  958. var status = Convert.ToInt32(dicData[tb_ord_order_master.CN_STATUS]);
  959. JArray jwheredata = dicData[BLWording.WHEREDATA] as JArray;
  960. foreach (JObject data in jwheredata)
  961. {
  962. var oData = data.ToObject<Dictionary<string, string>>();
  963. string orderUID = oData[tb_ord_order_master.CN_UID];
  964. string articleUID = oData.ContainsKey(tb_ord_order_master.CN_ARTICLE_UID) ? oData[tb_ord_order_master.CN_ARTICLE_UID] : null;
  965. string branchUID = oData[tb_ord_incoming_return_record.CN_BRANCH_UID];
  966. // 判斷現貨訂單到貨(現貨訂單沒有article_uid)
  967. if (string.IsNullOrEmpty(articleUID))
  968. {
  969. if (status == (int)Enums.OrderMainStatus.Arrived)
  970. {
  971. // 查詢現貨數
  972. tb_prd_article2product cPro = new tb_prd_article2product();
  973. cPro.SetDirty(tb_prd_article2product.CN_UID, tb_prd_article2product.CN_QTY);
  974. tb_prd_article2product cCon = new tb_prd_article2product() { order_uid = orderUID };
  975. Command cSelect = Command.SetupSelectCmd(cPro, cCon);
  976. ai = ArsenalDBMgr.GetInst(cSelect);
  977. List<tb_prd_article2product> qdsPro = ai.RunQueryList<tb_prd_article2product>(cSelect);
  978. foreach (var product in qdsPro)
  979. {
  980. int productQty = GetOrderProductStock(orderUID, product.uid, product.specification);
  981. if (product.qty > productQty)
  982. {
  983. // 新增進貨紀錄(訂單數量-已進貨量)
  984. tb_ord_incoming_return_record cNew = new tb_ord_incoming_return_record()
  985. {
  986. article2product_uid = product.uid,
  987. operating = (int)Enums.IncomingReturnOperating.Incoming,
  988. qty = product.qty - productQty,
  989. order_uid = orderUID,
  990. };
  991. lCmds.Add(Command.SetupInsertCmd(cNew));
  992. }
  993. // 更新到貨日期及狀態
  994. tb_ord_order_master cArrived = new tb_ord_order_master() { arrived_date = DateTime.Now, status = (int)Enums.OrderMainStatus.Arrived };
  995. tb_ord_order_master cArrivedCon = new tb_ord_order_master() { uid = orderUID };
  996. lCmds.Add(Command.SetupUpdateCmd(cArrived, cArrivedCon));
  997. }
  998. }
  999. else
  1000. {
  1001. tb_ord_order_master upData = new tb_ord_order_master() { status = status };
  1002. tb_ord_order_master upCon = new tb_ord_order_master() { uid = orderUID };
  1003. lCmds.Add(Command.SetupUpdateCmd(upData, upCon));
  1004. }
  1005. }
  1006. else
  1007. {
  1008. // 查詢訂單品項及數量
  1009. tb_ord_order_detail cOrder = new tb_ord_order_detail();
  1010. cOrder.SetDirty(tb_ord_order_detail.CN_UID, tb_ord_order_detail.CN_ORDER_QTY, tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID,
  1011. tb_ord_order_detail.CN_TAKE_QTY, tb_ord_order_detail.CN_ORDER_QTY, tb_ord_order_detail.CN_STATUS,
  1012. tb_ord_order_detail.CN_PRICE, tb_ord_order_detail.CN_MEMBER_UID, tb_ord_order_detail.CN_COMMENT_UID, tb_ord_order_detail.CN_COMMENT_TIME, tb_ord_order_detail.CN_SPECIFICATION);
  1013. tb_ord_order_detail cCon = new tb_ord_order_detail() { order_uid = orderUID };
  1014. Command cSelect = Command.SetupSelectCmd(cOrder, cCon);
  1015. ai = ArsenalDBMgr.GetInst(cSelect);
  1016. List<tb_ord_order_detail> qdsOrder = ai.RunQueryList<tb_ord_order_detail>(cSelect);
  1017. if (status == (int)Enums.OrderMainStatus.Arrived)
  1018. {
  1019. foreach (var product in qdsOrder.GroupBy(x => new { x.article2product_uid, x.specification }))
  1020. {
  1021. var orderQty = product.Sum(x => x.order_qty);
  1022. // 查詢商品已進貨數量
  1023. int productQty = GetOrderProductStock(orderUID, product.Key.article2product_uid, product.Key.specification);
  1024. if (orderQty > productQty)
  1025. {
  1026. // 新增進貨紀錄(訂單數量-已進貨量)
  1027. tb_ord_incoming_return_record cNew = new tb_ord_incoming_return_record()
  1028. {
  1029. article2product_uid = product.Key.article2product_uid,
  1030. operating = (int)Enums.IncomingReturnOperating.Incoming,
  1031. qty = orderQty - productQty,
  1032. order_uid = orderUID,
  1033. specification = product.Key.specification
  1034. };
  1035. lCmds.Add(Command.SetupInsertCmd(cNew));
  1036. }
  1037. // 更新order_detail.status
  1038. lCmds.AddRange(UpdateOrderIncomeReturnCmds(orderUID, product.Key.article2product_uid, product.Key.specification, (int)Enums.IncomingReturnOperating.Incoming, orderQty));
  1039. }
  1040. // 更新到貨日期及狀態
  1041. tb_ord_order_master cArrived = new tb_ord_order_master() { arrived_date = DateTime.Now, status = (int)Enums.OrderMainStatus.Arrived };
  1042. tb_ord_order_master cArrivedCon = new tb_ord_order_master() { uid = orderUID };
  1043. lCmds.Add(Command.SetupUpdateCmd(cArrived, cArrivedCon));
  1044. }
  1045. else // 封存
  1046. {
  1047. tb_ord_order_master upData = new tb_ord_order_master() { status = status };
  1048. tb_ord_order_master upCon = new tb_ord_order_master() { uid = orderUID };
  1049. lCmds.Add(Command.SetupUpdateCmd(upData, upCon));
  1050. foreach (var order in qdsOrder)
  1051. {
  1052. if (order.status == 1)
  1053. {
  1054. var indPrice = order.price / order.order_qty;
  1055. // 將原本訂單轉已收款 且數量為已收的數量
  1056. if (order.take_qty == 0)
  1057. {
  1058. tb_ord_order_detail upOrderDetail = new tb_ord_order_detail()
  1059. {
  1060. status = (int)Enums.OrderStatus.Return,
  1061. operate_date = now
  1062. };
  1063. tb_ord_order_detail upOrderDetailCon = new tb_ord_order_detail() { uid = order.uid };
  1064. lCmds.Add(Command.SetupUpdateCmd(upOrderDetail, upOrderDetailCon));
  1065. }
  1066. else if (order.take_qty > 0)
  1067. {
  1068. tb_ord_order_detail upOrderDetail = new tb_ord_order_detail()
  1069. {
  1070. status = (int)Enums.OrderStatus.Taked,
  1071. order_qty = order.take_qty,
  1072. take_qty = order.take_qty,
  1073. price = order.take_qty * indPrice,
  1074. operate_date = now
  1075. };
  1076. tb_ord_order_detail upOrderDetailCon = new tb_ord_order_detail() { uid = order.uid };
  1077. lCmds.Add(Command.SetupUpdateCmd(upOrderDetail, upOrderDetailCon));
  1078. string sNewArticleUid = Guid.NewGuid().ToString();
  1079. // 新增封存的Oder_detail 數量為剩下未收的數量
  1080. tb_ord_order_detail cNew = new tb_ord_order_detail()
  1081. {
  1082. uid = sNewArticleUid,
  1083. order_uid = orderUID,
  1084. article2product_uid = order.article2product_uid,
  1085. status = (int)Enums.OrderStatus.Return,
  1086. member_uid = order.member_uid,
  1087. order_qty = order.order_qty - order.take_qty,
  1088. take_qty = 0,
  1089. price = (order.order_qty - order.take_qty) * indPrice,
  1090. comment_uid = order.comment_uid,
  1091. comment_time = order.comment_time,
  1092. specification = order.specification,
  1093. operate_date = now
  1094. };
  1095. lCmds.Add(Command.SetupInsertCmd(cNew));
  1096. }
  1097. sMsg = getUpdateReturnCountCmd(order.member_uid, 1);
  1098. if (sMsg != null)
  1099. {
  1100. break;
  1101. }
  1102. }
  1103. }
  1104. }
  1105. }
  1106. }
  1107. }
  1108. if (sMsg != null)
  1109. {
  1110. break;
  1111. }
  1112. }
  1113. while (false);
  1114. }
  1115. catch (Exception ex)
  1116. {
  1117. LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_nCodeLine, i_sMemberName, i_sSourcePath);
  1118. Logger.Error(ex);
  1119. sMsg = $"{nameof(updateCommandGenerator)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine}).";
  1120. #if DEBUG
  1121. System.Diagnostics.Debug.WriteLine(sMsg);
  1122. #endif
  1123. }
  1124. if (!string.IsNullOrWhiteSpace(sMsg))
  1125. {
  1126. Logger.Error(sMsg);
  1127. }
  1128. o_lcCmds = lCmds;
  1129. return sMsg;
  1130. }
  1131. /// <summary>
  1132. /// 訂單彈窗內取得訂單數量及庫存
  1133. /// </summary>
  1134. /// <param name="i_crmInput"></param>
  1135. /// <returns></returns>
  1136. public CResponseMessage GetProduct(CRequestMessage i_crmInput)
  1137. {
  1138. string sMsg;
  1139. Command cRes = null;
  1140. CResponseMessage crmRes = null;
  1141. try
  1142. {
  1143. do
  1144. {
  1145. Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput); // 取得condition
  1146. QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
  1147. QueryJsonElement qjeA = lBlocks.GetInst();
  1148. qjeA.table = tb_ord_order_detail.TABLENAME;
  1149. qjeA.displaycols = new List<string>() {
  1150. tb_ord_order_detail.CN_SPECIFICATION,
  1151. };
  1152. qjeA.aliascols = new Dictionary<string, List<string>>
  1153. {
  1154. { QueryJsonElement.SUM(tb_ord_order_detail.CN_ORDER_QTY), new List<string>() { "count" } },
  1155. { QueryJsonElement.SUM(tb_ord_order_detail.CN_TAKE_QTY), new List<string>() { "soldCount" } },
  1156. { "' '", new List<string>() { "qty" } },
  1157. };
  1158. var orderUID = dicCondition[tb_ord_order_master.CN_UID].ToString();
  1159. qjeA.wherecols = new WhereNode(tb_ord_order_detail.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), orderUID);
  1160. QueryJsonElement qjeD = lBlocks.GetInst();
  1161. qjeD.table = tb_prd_article2product.TABLENAME;
  1162. qjeD.jointype = QueryJsonElement.LEFT_JOIN;
  1163. qjeD.jointable = qjeA;
  1164. qjeD.joincols = new Dictionary<string, string>() {
  1165. { tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
  1166. qjeD.displaycols = new List<string>() {
  1167. tb_prd_article2product.CN_UID,
  1168. tb_prd_article2product.CN_NAME,
  1169. tb_prd_article2product.CN_PRICE,
  1170. tb_prd_article2product.CN_SEQ
  1171. };
  1172. qjeD.groupcols = new List<Tuple<QueryJsonElement, string>>
  1173. {
  1174. Tuple.Create(qjeA, tb_ord_order_detail.CN_SPECIFICATION),
  1175. Tuple.Create(qjeD, tb_prd_article2product.CN_UID),
  1176. Tuple.Create(qjeD, tb_prd_article2product.CN_NAME),
  1177. Tuple.Create(qjeD, tb_prd_article2product.CN_PRICE),
  1178. Tuple.Create(qjeD, tb_prd_article2product.CN_SEQ)
  1179. };
  1180. qjeD.ordercols = new List<Tuple<QueryJsonElement, string, string>>()
  1181. {
  1182. Tuple.Create(qjeD, tb_prd_article2product.CN_SEQ,BLWording.ORDER_ASC)
  1183. };
  1184. lBlocks.Add(qjeA);
  1185. lBlocks.Add(qjeD);
  1186. sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
  1187. if (sMsg != null)
  1188. {
  1189. break;
  1190. }
  1191. ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
  1192. QueryDataSet qds = ai.RunQueryDataSet(cRes);
  1193. // 查詢進退貨紀錄
  1194. tb_ord_incoming_return_record cRecord = new tb_ord_incoming_return_record();
  1195. cRecord.SetFullDirty();
  1196. tb_ord_incoming_return_record cCon = new tb_ord_incoming_return_record()
  1197. {
  1198. order_uid = orderUID
  1199. };
  1200. Command cSelect = Command.SetupSelectCmd(cRecord, cCon);
  1201. ai = ArsenalDBMgr.GetInst(cSelect);
  1202. List<tb_ord_incoming_return_record> qdsRecord = ai.RunQueryList<tb_ord_incoming_return_record>(cSelect);
  1203. if (qds.DATA.Tables.Count > 0)
  1204. {
  1205. foreach (DataRow data in qds.DATA.Tables[0].Rows)
  1206. {
  1207. var incomeQty = qdsRecord.Where(x => x.operating == (int)Enums.IncomingReturnOperating.Incoming && x.article2product_uid == data[tb_prd_article2product.CN_UID].ToString() && x.specification == data[tb_ord_order_detail.CN_SPECIFICATION].ToString()).Sum(x => x.qty);
  1208. var returnQty = qdsRecord.Where(x => x.operating == (int)Enums.IncomingReturnOperating.Return && x.article2product_uid == data[tb_prd_article2product.CN_UID].ToString() && x.specification == data[tb_ord_order_detail.CN_SPECIFICATION].ToString()).Sum(x => x.qty);
  1209. data["qty"] = incomeQty - returnQty;
  1210. }
  1211. }
  1212. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  1213. crmRes.param.Add(BLWording.DATA, qds);
  1214. }
  1215. while (false);
  1216. }
  1217. catch (Exception ex)
  1218. {
  1219. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  1220. sMsg = $"{nameof(GetProduct)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  1221. #if DEBUG
  1222. System.Diagnostics.Debug.WriteLine(sMsg);
  1223. #endif
  1224. }
  1225. if (null != sMsg)
  1226. {
  1227. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  1228. }
  1229. return crmRes;
  1230. }
  1231. /// <summary>
  1232. /// 現貨訂單已結團編輯頁顯示品項訂單數量及庫存量
  1233. /// </summary>
  1234. /// <param name="i_crmInput"></param>
  1235. /// <returns></returns>
  1236. public CResponseMessage GetStockOrderProduct(CRequestMessage i_crmInput)
  1237. {
  1238. string sMsg;
  1239. Command cRes = null;
  1240. CResponseMessage crmRes = null;
  1241. try
  1242. {
  1243. do
  1244. {
  1245. Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput); // 取得condition
  1246. QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
  1247. QueryJsonElement qjeA = lBlocks.GetInst();
  1248. qjeA.table = tb_ord_order_master.TABLENAME;
  1249. var orderUID = dicCondition[tb_ord_order_master.CN_UID].ToString();
  1250. qjeA.wherecols = new WhereNode(tb_ord_order_master.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), orderUID);
  1251. QueryJsonElement qjeProduct = lBlocks.GetInst();
  1252. qjeProduct.table = tb_prd_article2product.TABLENAME;
  1253. qjeProduct.jointype = QueryJsonElement.LEFT_JOIN;
  1254. qjeProduct.jointable = qjeA;
  1255. qjeProduct.joincols = new Dictionary<string, string>() {
  1256. { tb_prd_article2product.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
  1257. qjeProduct.displaycols = new List<string>() {
  1258. tb_prd_article2product.CN_UID,
  1259. tb_prd_article2product.CN_SEQ,
  1260. tb_prd_article2product.CN_NAME,
  1261. tb_prd_article2product.CN_PRICE
  1262. };
  1263. QueryJsonElement qjeDetail = lBlocks.GetInst();
  1264. qjeDetail.table = tb_ord_purchase_detail.TABLENAME;
  1265. qjeDetail.jointype = QueryJsonElement.LEFT_JOIN;
  1266. qjeDetail.jointable = qjeProduct;
  1267. qjeDetail.joincols = new Dictionary<string, string>() {
  1268. { tb_ord_purchase_detail.CN_ARTICLE2PRODUCT_UID,tb_prd_article2product.CN_UID }};
  1269. qjeDetail.aliascols = new Dictionary<string, List<string>>
  1270. {
  1271. { QueryJsonElement.SUM(tb_ord_purchase_detail.CN_QTY), new List<string>() { "count"} },
  1272. { "' '", new List<string>() { "qty"} }
  1273. };
  1274. qjeProduct.groupcols = new List<Tuple<QueryJsonElement, string>>
  1275. {
  1276. Tuple.Create(qjeProduct, tb_prd_article2product.CN_UID),
  1277. Tuple.Create(qjeProduct, tb_prd_article2product.CN_NAME),
  1278. Tuple.Create(qjeProduct, tb_prd_article2product.CN_PRICE),
  1279. Tuple.Create(qjeProduct, tb_prd_article2product.CN_SEQ)
  1280. };
  1281. qjeProduct.ordercols = new List<Tuple<QueryJsonElement, string, string>>()
  1282. {
  1283. Tuple.Create(qjeProduct, tb_prd_article2product.CN_SEQ,BLWording.ORDER_ASC)
  1284. };
  1285. lBlocks.Add(qjeA);
  1286. lBlocks.Add(qjeProduct);
  1287. lBlocks.Add(qjeDetail);
  1288. sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
  1289. if (sMsg != null)
  1290. {
  1291. break;
  1292. }
  1293. ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
  1294. QueryDataSet qds = ai.RunQueryDataSet(cRes);
  1295. tb_ord_incoming_return_record cRecord = new tb_ord_incoming_return_record();
  1296. cRecord.SetFullDirty();
  1297. tb_ord_incoming_return_record cCon = new tb_ord_incoming_return_record()
  1298. {
  1299. order_uid = orderUID
  1300. };
  1301. Command cSelect = Command.SetupSelectCmd(cRecord, cCon);
  1302. ai = ArsenalDBMgr.GetInst(cSelect);
  1303. List<tb_ord_incoming_return_record> qdsRecord = ai.RunQueryList<tb_ord_incoming_return_record>(cSelect);
  1304. if (qds.DATA.Tables.Count > 0)
  1305. {
  1306. foreach (DataRow data in qds.DATA.Tables[0].Rows)
  1307. {
  1308. var incomeQty = qdsRecord.Where(x => x.operating == (int)Enums.IncomingReturnOperating.Incoming && x.article2product_uid == data[tb_prd_article2product.CN_UID].ToString()).Sum(x => x.qty);
  1309. var returnQty = qdsRecord.Where(x => x.operating == (int)Enums.IncomingReturnOperating.Return && x.article2product_uid == data[tb_prd_article2product.CN_UID].ToString()).Sum(x => x.qty);
  1310. data["count"] = string.IsNullOrEmpty(data["count"]?.ToString()) ? 0 : data["count"];
  1311. data["qty"] = incomeQty - returnQty;
  1312. }
  1313. }
  1314. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  1315. crmRes.param.Add(BLWording.DATA, qds);
  1316. }
  1317. while (false);
  1318. }
  1319. catch (Exception ex)
  1320. {
  1321. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  1322. sMsg = $"{nameof(GetProduct)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  1323. #if DEBUG
  1324. System.Diagnostics.Debug.WriteLine(sMsg);
  1325. #endif
  1326. }
  1327. if (null != sMsg)
  1328. {
  1329. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  1330. }
  1331. return crmRes;
  1332. }
  1333. private class ProductModel
  1334. {
  1335. public string article2product_uid { get; set; }
  1336. public int price { get; set; }
  1337. public bool isArticleName { get; set; }
  1338. public string specification { get; set; }
  1339. }
  1340. #region 列印功能
  1341. /// <summary>
  1342. /// 列印報表
  1343. /// </summary>
  1344. /// <param name="i_crmInput"></param>
  1345. /// <returns></returns>
  1346. public CResponseMessage Print(CRequestMessage i_crmInput)
  1347. {
  1348. string sMsg;
  1349. CResponseMessage crmRes = null;
  1350. try
  1351. {
  1352. do
  1353. {
  1354. // 填入報表
  1355. var printType = Convert.ToInt32(i_crmInput.param["printType"]);
  1356. var sPath = string.Empty;
  1357. switch (printType)
  1358. {
  1359. // 訂單統計報表
  1360. case 1:
  1361. sPath = GetStatisticalReportByPersonPath(i_crmInput);
  1362. break;
  1363. // 分店數量統計表
  1364. case 2:
  1365. sPath = GetStatisticalReportByBranchPath(i_crmInput);
  1366. break;
  1367. // 送單報表
  1368. case 3:
  1369. sPath = GetStatisticalReportBySendPath(i_crmInput);
  1370. break;
  1371. default:
  1372. break;
  1373. }
  1374. // 列印
  1375. sMsg = ReportExtension.ConvertToPdf(30, Path.Combine(AppDomain.CurrentDomain.BaseDirectory, sPath), out string sPdfPath);
  1376. if (sMsg != null)
  1377. {
  1378. break;
  1379. }
  1380. // 上傳檔案
  1381. FileUploadHelper fuh = new FileUploadHelper(GetFileUploadInfo(), i_crmInput);
  1382. sMsg = fuh.UploadLocalFile(sPdfPath, out tb_sys_uploadlog ulRes);
  1383. if (sMsg != null)
  1384. {
  1385. break;
  1386. }
  1387. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  1388. crmRes.param.Add(BLWording.DATA, new List<tb_sys_uploadlog>() { ulRes });
  1389. }
  1390. while (false);
  1391. }
  1392. catch (Exception ex)
  1393. {
  1394. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  1395. sMsg = $"{nameof(Print)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  1396. #if DEBUG
  1397. System.Diagnostics.Debug.WriteLine(sMsg);
  1398. #endif
  1399. }
  1400. if (null != sMsg)
  1401. {
  1402. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  1403. }
  1404. return crmRes;
  1405. }
  1406. public class ReportDataModel
  1407. {
  1408. public string article2product_uid { get; set; }
  1409. public string specification { get; set; }
  1410. public int seq { get; set; }
  1411. }
  1412. /// <summary>
  1413. /// 取得統計報表資料
  1414. /// </summary>
  1415. /// <param name="i_crmInput"></param>
  1416. /// <param name="lsOrderDetail"></param>
  1417. /// <param name="dicQueryArrivedQty"></param>
  1418. /// <returns></returns>
  1419. private string GetStatisticalReportData(CRequestMessage i_crmInput, out List<OrderDetail> lsOrderDetail, out Dictionary<ReportDataModel, int> dicQueryArrivedQty)
  1420. {
  1421. string sMsg = null;
  1422. lsOrderDetail = new List<OrderDetail>();
  1423. dicQueryArrivedQty = new Dictionary<ReportDataModel, int>();
  1424. // 查詢資料
  1425. JArray jaData = i_crmInput.param[BLWording.QRY_MASTER] as JArray;
  1426. JArray jaWhereData = jaData[0][BLWording.WHEREDATA] as JArray;
  1427. string[] orderUIDs = jaWhereData.OfType<JObject>().Select(x => (x.TryGetValue(tb_ord_order_master.CN_UID, out JToken value) ? value : null)?.ToString()).Where(x => !string.IsNullOrEmpty(x)).ToArray();
  1428. // 查詢全部的訂單資訊
  1429. sMsg = GetOrderDetails(orderUIDs, false, out List<OrderDetail> allOrderDetail);
  1430. if (sMsg != null)
  1431. {
  1432. return sMsg;
  1433. }
  1434. // 查詢無訂單子表的訂單
  1435. var noDetailUIDs = allOrderDetail.Where(d => d.article2product_uid == null).Select(d => d.uid).ToArray();
  1436. List<OrderDetail> noDetailOrderDetail = new List<OrderDetail>();
  1437. if (noDetailUIDs.Count() > 0) {//添加此處防呆
  1438. sMsg = GetOrderDetails(noDetailUIDs, true, out noDetailOrderDetail);
  1439. if (sMsg != null)
  1440. {
  1441. return sMsg;
  1442. }
  1443. }
  1444. lsOrderDetail.AddRange(allOrderDetail.Where(d => d.article2product_uid != null));
  1445. lsOrderDetail.AddRange(noDetailOrderDetail.Where(d => d.article2product_uid != null));
  1446. // 紀錄分店商品的到貨數量
  1447. dicQueryArrivedQty = lsOrderDetail.GroupBy(x => new { x.uid, x.article2product_uid, x.specification, x.seq }).Select(g => new
  1448. {
  1449. g.Key.article2product_uid,
  1450. g.Key.specification,
  1451. g.Key.seq,
  1452. qty = GetOrderProductStock(g.Key.uid, g.Key.article2product_uid, g.Key.specification)
  1453. }).GroupBy(g => new { g.article2product_uid, g.specification, g.seq }).ToDictionary(g => new ReportDataModel() { article2product_uid = g.Key.article2product_uid, specification = g.Key.specification, seq = g.Key.seq }, g => g.Sum(x => x.qty));
  1454. return sMsg;
  1455. }
  1456. /// <summary>
  1457. /// 查詢訂單資訊,根據有沒有Detail查詢不同東西
  1458. /// </summary>
  1459. /// <param name="orderUIDs"></param>
  1460. /// <param name="isNoDetail"></param>
  1461. /// <param name="orderDetails"></param>
  1462. /// <returns></returns>
  1463. private string GetOrderDetails(string[] orderUIDs, bool isNoDetail, out List<OrderDetail> orderDetails)
  1464. {
  1465. orderDetails = new List<OrderDetail>();
  1466. // 撰寫QJE
  1467. QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
  1468. // 訂單主表資訊
  1469. QueryJsonElement qjeOrderMaster = lBlocks.GetInst();
  1470. qjeOrderMaster.table = tb_ord_order_master.TABLENAME;
  1471. qjeOrderMaster.displaycols = new List<string>()
  1472. {
  1473. tb_ord_order_master.CN_BRANCH_UID,
  1474. tb_ord_order_master.CN_UID,
  1475. tb_ord_order_master.CN_CREATE_DATE
  1476. };
  1477. qjeOrderMaster.wherecols = new WhereNode(tb_ord_order_master.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_master), orderUIDs);
  1478. qjeOrderMaster.aliascols = new Dictionary<string, List<string>>
  1479. {
  1480. { tb_ord_order_master.CN_NAME, new List<string>() { "article_name" } }
  1481. };
  1482. lBlocks.Add(qjeOrderMaster);
  1483. // 訂單社團
  1484. QueryJsonElement qjeBranch = lBlocks.GetInst();
  1485. qjeBranch.table = tb_grp_branch.TABLENAME;
  1486. qjeBranch.jointype = QueryJsonElement.LEFT_JOIN;
  1487. qjeBranch.jointable = qjeOrderMaster;
  1488. qjeBranch.joincols = new Dictionary<string, string>()
  1489. {
  1490. { tb_grp_branch.CN_UID,tb_ord_order_master.CN_BRANCH_UID }
  1491. };
  1492. qjeBranch.displaycols = new List<string>()
  1493. {
  1494. tb_grp_branch.CN_BRANCH_NAME
  1495. };
  1496. qjeBranch.aliascols = new Dictionary<string, List<string>>
  1497. {
  1498. { tb_grp_branch.CN_SEQ, new List<string>() { "branch_seq" } }
  1499. };
  1500. lBlocks.Add(qjeBranch);
  1501. // 若是沒有OrderDetail則直接查Article2Product
  1502. QueryJsonElement qjeOrderDetail = lBlocks.GetInst();
  1503. if (!isNoDetail)
  1504. {
  1505. // 訂單子表
  1506. qjeOrderDetail.table = tb_ord_order_detail.TABLENAME;
  1507. qjeOrderDetail.jointype = QueryJsonElement.LEFT_JOIN;
  1508. qjeOrderDetail.jointable = qjeOrderMaster;
  1509. qjeOrderDetail.joincols = new Dictionary<string, string>()
  1510. {
  1511. { tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }
  1512. };
  1513. qjeOrderDetail.displaycols = new List<string>()
  1514. {
  1515. tb_ord_order_detail.CN_ORDER_QTY,
  1516. tb_ord_order_detail.CN_TAKE_QTY,
  1517. tb_ord_order_detail.CN_STATUS,
  1518. tb_ord_order_detail.CN_MEMBER_UID,
  1519. tb_ord_order_detail.CN_SPECIFICATION,
  1520. tb_ord_order_detail.CN_CREATE_DATE
  1521. };
  1522. lBlocks.Add(qjeOrderDetail);
  1523. // 會員帳號
  1524. QueryJsonElement qjeMember = lBlocks.GetInst();
  1525. qjeMember.table = tb_meb_member.TABLENAME;
  1526. qjeMember.jointype = QueryJsonElement.LEFT_JOIN;
  1527. qjeMember.jointable = qjeOrderDetail;
  1528. qjeMember.joincols = new Dictionary<string, string>()
  1529. {
  1530. { tb_meb_member.CN_UID,tb_ord_order_detail.CN_MEMBER_UID }
  1531. };
  1532. qjeMember.aliascols = new Dictionary<string, List<string>>
  1533. {
  1534. { tb_meb_member.CN_NAME, new List<string>() { "member_name" } }
  1535. };
  1536. lBlocks.Add(qjeMember);
  1537. }
  1538. // 留言商品
  1539. QueryJsonElement qjeArticle2Product = lBlocks.GetInst();
  1540. var article2ProductJoincols = new Dictionary<string, string>();
  1541. if (isNoDetail)
  1542. {
  1543. article2ProductJoincols.Add(tb_prd_article2product.CN_ORDER_UID, tb_ord_order_master.CN_UID);
  1544. }
  1545. else
  1546. {
  1547. article2ProductJoincols.Add(tb_prd_article2product.CN_UID, tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID);
  1548. }
  1549. qjeArticle2Product.table = tb_prd_article2product.TABLENAME;
  1550. qjeArticle2Product.jointype = QueryJsonElement.LEFT_JOIN;
  1551. qjeArticle2Product.jointable = isNoDetail ? qjeOrderMaster : qjeOrderDetail;
  1552. qjeArticle2Product.joincols = article2ProductJoincols;
  1553. qjeArticle2Product.displaycols = new List<string>()
  1554. {
  1555. tb_prd_article2product.CN_NAME,
  1556. tb_prd_article2product.CN_PRICE,
  1557. tb_prd_article2product.CN_QTY,
  1558. tb_prd_article2product.CN_SEQ
  1559. };
  1560. qjeArticle2Product.aliascols = new Dictionary<string, List<string>>
  1561. {
  1562. { tb_prd_article2product.CN_UID, new List<string>() { "article2product_uid" } }
  1563. };
  1564. lBlocks.Add(qjeArticle2Product);
  1565. string sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRes);
  1566. if (sMsg != null)
  1567. {
  1568. return sMsg;
  1569. }
  1570. ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
  1571. orderDetails = ai.RunQueryList<OrderDetail>(cRes).OrderBy(x => x.create_date).ThenBy(x => x.seq).ToList();
  1572. return sMsg;
  1573. }
  1574. /// <summary>
  1575. /// 訂單統計報表
  1576. /// </summary>
  1577. /// <param name="i_crmInput"></param>
  1578. /// <returns></returns>
  1579. private string GetStatisticalReportByPersonPath(CRequestMessage i_crmInput)
  1580. {
  1581. // 取回資料並整理資料
  1582. _ = GetStatisticalReportData(i_crmInput, out List<OrderDetail> lsOrderDetail, out Dictionary<ReportDataModel, int> dicQueryArrivedQty);
  1583. var groupData = lsOrderDetail.GroupBy(x => new { x.member_uid, x.member_name, x.branch_uid }).ToList();
  1584. // 套表
  1585. var sb = new StringBuilder();
  1586. string sPath = NpoiExtension.Report("訂單統計報表", (sheet) =>
  1587. {
  1588. var check = "R";
  1589. var uncheck = "£";
  1590. // 特殊符號字型
  1591. var Wingdings2Font = (XSSFFont)sheet.Workbook.CreateFont();
  1592. Wingdings2Font.FontName = "Wingdings 2";
  1593. Wingdings2Font.FontHeightInPoints = 12;
  1594. // 開始撰寫Excel
  1595. var row = 1;
  1596. var titleRow = row;
  1597. sheet.Cell(row++, 0).SetCellValue(""); // 商品名稱
  1598. row++; // 標題列
  1599. // 複製Row,因為現貨訂單若未有人訂貨則不會有order_detail且不會有member_uid,故在畫面上濾掉
  1600. var addRowCount = groupData.Count(g => !string.IsNullOrEmpty(g.Key.member_uid)) - 1;
  1601. sheet.InsertRow(row, 1, addRowCount);
  1602. // 撰寫商品列表,用foreach的原因是因為在這個情形計算index會比用for迴圈正確
  1603. var dicProductItem = new Dictionary<string, ProductModel>(); // 商品列表(名稱、{商品uid,單價})
  1604. var productIndex = 0;
  1605. foreach (var groupMember in groupData)
  1606. {
  1607. sb.Clear();
  1608. // 登記品項
  1609. var total = 0;
  1610. var itemNo = 1;
  1611. var liPosition = new List<int>();
  1612. var groupProduct = groupMember.GroupBy(x => new { x.article2product_uid, x.article_name, x.name, x.price, x.specification });
  1613. var itemCount = groupProduct.Count(); // 會員有幾項商品
  1614. foreach (var p in groupProduct)
  1615. {
  1616. bool isArticleName = string.IsNullOrEmpty(p.Key.name);
  1617. var specification = p.Key.specification == null ? "" : p.Key.specification;
  1618. var itemName = isArticleName ? p.Key.article_name : p.Key.article_name + "(" + p.Key.name + " " + specification + ")";
  1619. if (!dicProductItem.ContainsKey(itemName))
  1620. {
  1621. dicProductItem.Add(itemName, new ProductModel
  1622. {
  1623. article2product_uid = p.Key.article2product_uid,
  1624. price = p.Key.price,
  1625. isArticleName = isArticleName,
  1626. specification = p.Key.specification
  1627. });
  1628. }
  1629. liPosition.Add(sb.Length);
  1630. var orderQty = p.Sum(x => x.order_qty);
  1631. var takeQty = p.Sum(x => x.take_qty);
  1632. sb.AppendFormat("{0}{1} x {2}{3}", orderQty == takeQty ? check : uncheck, itemName, orderQty, itemNo < itemCount ? "\r\n" : "");
  1633. total += p.Key.price * orderQty;
  1634. itemNo++;
  1635. }
  1636. var richText = new XSSFRichTextString(sb.ToString());
  1637. foreach (var index in liPosition)
  1638. {
  1639. richText.ApplyFont(index, index + 1, Wingdings2Font);
  1640. }
  1641. // 填入EXCEL
  1642. var cell = 0;
  1643. if (!string.IsNullOrEmpty(groupMember.Key.member_uid))
  1644. {
  1645. sheet.Cell(row, cell++).SetCellValue(productIndex += 1); // NO
  1646. sheet.Cell(row, cell++).SetCellValue(groupMember.Select(x => x.branch_name).FirstOrDefault()); // 分區
  1647. sheet.Cell(row, cell++).SetCellValue(groupMember.Key.member_name); // 臉書帳號名
  1648. sheet.Cell(row, cell++).SetCellValue(richText);
  1649. sheet.Cell(row, cell++).SetCellValue(string.Format("{0}元", total)); // 金額
  1650. sheet.Cell(row, cell).SetCellValue(groupMember.Any(x => x.status == (int)Enums.OrderStatus.NotArrived) ? "N" : "Y"); // 到貨
  1651. sheet.AutoHeight(row++);
  1652. }
  1653. }
  1654. // 計算訂單數量、剩餘庫存數量、實際到貨數量總計
  1655. var lsOrder = new List<string>();
  1656. var orderTotal = 0;
  1657. var lsStock = new List<string>();
  1658. var stockTotal = 0;
  1659. var lsArrivedCount = new List<string>();
  1660. var arriverTotal = 0;
  1661. foreach (var item in dicProductItem)
  1662. {
  1663. string specification = item.Value.specification;
  1664. var orderCount = lsOrderDetail.Where(x => x.article2product_uid == item.Value.article2product_uid && x.specification == item.Value.specification).Sum(x => x.order_qty);
  1665. var arriverCount = dicQueryArrivedQty.Where(x => x.Key.article2product_uid == dicProductItem[item.Key].article2product_uid && x.Key.specification == dicProductItem[item.Key].specification).Sum(x => x.Value);
  1666. var stockCount = arriverCount - lsOrderDetail.Where(x => x.article2product_uid == item.Value.article2product_uid).Sum(x => x.take_qty);
  1667. lsOrder.Add(string.Format("{0} x {1}", item.Key, orderCount));
  1668. orderTotal += orderCount * dicProductItem[item.Key].price;
  1669. lsStock.Add(string.Format("{0} x {1}", item.Key, stockCount)); //item.Key? itemName?
  1670. stockTotal += stockCount * dicProductItem[item.Key].price;
  1671. lsArrivedCount.Add(string.Format("{0} x {1}", item.Key, arriverCount));
  1672. arriverTotal += arriverCount * dicProductItem[item.Key].price;
  1673. }
  1674. // 訂單數量、金額
  1675. string order = string.Join("\r\n", lsOrder);
  1676. ICell orderCell = sheet.Cell(row, 3);
  1677. orderCell.SetCellValue(order);
  1678. orderCell.CellStyle.WrapText = true;
  1679. sheet.Cell(row, 4).SetCellValue(string.Format("{0}元", orderTotal));
  1680. sheet.AutoHeight(row++);
  1681. // 剩餘庫存量、金額
  1682. string stock = string.Join("\r\n", lsStock);
  1683. ICell stockCell = sheet.Cell(row, 3);
  1684. stockCell.SetCellValue(stock);
  1685. stockCell.CellStyle.WrapText = true;
  1686. sheet.Cell(row, 4).SetCellValue(string.Format("{0}元", stockTotal));
  1687. sheet.AutoHeight(row++);
  1688. // 實際到貨數量、金額
  1689. string arrivedCount = string.Join("\r\n", lsArrivedCount);
  1690. ICell arrivedCountCell = sheet.Cell(row, 3);
  1691. arrivedCountCell.SetCellValue(arrivedCount);
  1692. arrivedCountCell.CellStyle.WrapText = true;
  1693. sheet.Cell(row, 4).SetCellValue(string.Format("{0}元", arriverTotal));
  1694. sheet.AutoHeight(row);
  1695. // 如果為同商品則顯示商品名稱,否則刪除名稱列
  1696. if (lsOrderDetail.GroupBy(x => x.article_name).Count() == 1)
  1697. {
  1698. sheet.Cell(titleRow, 0).SetCellValue(lsOrderDetail.GroupBy(x => x.article_name).Select(x => x.Key).FirstOrDefault());
  1699. }
  1700. else
  1701. {
  1702. sheet.ClearRow(titleRow, 1, true);
  1703. }
  1704. });
  1705. return sPath;
  1706. }
  1707. /// <summary>
  1708. /// 分店數量統計表
  1709. /// </summary>
  1710. /// <param name="i_crmInput"></param>
  1711. /// <returns></returns>
  1712. private string GetStatisticalReportByBranchPath(CRequestMessage i_crmInput)
  1713. {
  1714. // 取回資料並整理資料
  1715. _ = GetStatisticalReportData(i_crmInput, out List<OrderDetail> lsOrderDetail, out Dictionary<ReportDataModel, int> dicQueryArrivedQty);
  1716. var branchProducts = lsOrderDetail.GroupBy(x => new { x.branch_uid, x.branch_name, x.article2product_uid, x.article_name, x.name, x.specification, x.seq }).Select(g =>
  1717. {
  1718. var qty = g.Sum(x => x.order_qty);
  1719. var specification = g.Key.specification == null ? "" : g.Key.specification;
  1720. return new
  1721. {
  1722. g.Key.branch_uid,
  1723. g.Key.branch_name,
  1724. g.Key.article2product_uid,
  1725. g.Key.seq,
  1726. article_name = string.IsNullOrEmpty(g.Key.name) ? g.Key.article_name : string.Format("{0}({1})", g.Key.article_name, g.Key.name + " " + specification),
  1727. qty,
  1728. };
  1729. });
  1730. var allBranchs = branchProducts.GroupBy(x => new { x.branch_uid, x.branch_name }).ToArray();
  1731. var totalProducts = branchProducts.GroupBy(x => new { x.article2product_uid, x.article_name, x.seq }).Select(g => new
  1732. {
  1733. g.Key.article_name,
  1734. g.Key.seq,
  1735. qty = g.Sum(x => (int?)x.qty) ?? 0,
  1736. }).ToArray();
  1737. // 套表
  1738. string sPath = NpoiExtension.Report("分店數量統計表", (sheet) =>
  1739. {
  1740. var rowNumber = 1;
  1741. int firstRowNumber, lastRowNumber;
  1742. IRow row;
  1743. // 分店處理
  1744. sheet.InsertRow(rowNumber, count: allBranchs.Count() - 1);
  1745. foreach (var branch in allBranchs)
  1746. {
  1747. firstRowNumber = rowNumber;
  1748. // 寫入分店商品資料
  1749. sheet.InsertRow(rowNumber, count: branch.Count() - 1);
  1750. foreach (var product in branch)
  1751. {
  1752. row = sheet.GetRow(rowNumber);
  1753. row.GetCell(1).SetCellValue(product.article_name);
  1754. row.GetCell(2).SetCellValue(product.qty);
  1755. sheet.AutoHeight(rowNumber++);
  1756. }
  1757. // 寫入分店資訊
  1758. row = sheet.GetRow(firstRowNumber);
  1759. row.GetCell(0).SetCellValue(string.Format("【{0}】", branch.Key.branch_name));
  1760. // 合併儲存格
  1761. lastRowNumber = rowNumber - 1;
  1762. sheet.AddMergedRegion(new CellRangeAddress(firstRowNumber, lastRowNumber, 0, 0));
  1763. }
  1764. // 總計資料
  1765. firstRowNumber = rowNumber;
  1766. // 寫入總計商品資料
  1767. sheet.InsertRow(rowNumber, count: totalProducts.Count() - 1);
  1768. foreach (var product in totalProducts.OrderBy(x => x.seq))
  1769. {
  1770. row = sheet.GetRow(rowNumber);
  1771. row.GetCell(1).SetCellValue(product.article_name);
  1772. row.GetCell(2).SetCellValue(product.qty);
  1773. sheet.AutoHeight(rowNumber++);
  1774. }
  1775. // 合併儲存格
  1776. lastRowNumber = rowNumber - 1;
  1777. sheet.AddMergedRegion(new CellRangeAddress(firstRowNumber, lastRowNumber, 0, 0));
  1778. });
  1779. return sPath;
  1780. }
  1781. /// <summary>
  1782. /// 送單報表
  1783. /// </summary>
  1784. /// <param name="i_crmInput"></param>
  1785. /// <returns></returns>
  1786. private string GetStatisticalReportBySendPath(CRequestMessage i_crmInput)
  1787. {
  1788. // 取回資料並整理資料
  1789. _ = GetStatisticalReportData(i_crmInput, out List<OrderDetail> lsOrderDetail, out Dictionary<ReportDataModel, int> dicQueryArrivedQty);
  1790. var BranchGroupList = GetBranchGroupList();// 取回分店與社團的對應
  1791. var branchProducts = lsOrderDetail.GroupBy(x => new { x.branch_uid, x.branch_name, x.article2product_uid, x.article_name, x.name, x.specification, x.seq, x.branch_seq }).Select(g =>
  1792. {
  1793. var qty = g.Sum(x => x.order_qty);
  1794. var specification = g.Key.specification == null ? "" : g.Key.specification;
  1795. return new
  1796. {
  1797. g.Key.branch_uid,
  1798. g.Key.branch_name,
  1799. g.Key.article2product_uid,
  1800. g.Key.seq,
  1801. article_name = string.IsNullOrEmpty(g.Key.name) ? g.Key.article_name : string.Format("{0}({1})", g.Key.article_name, g.Key.name + " " + specification),
  1802. qty,
  1803. group_name = BranchGroupList.Find(item => item.uid == g.Key.branch_uid)?.name,
  1804. branch_seq = g.Key.branch_seq
  1805. };
  1806. }).OrderBy(g => g.group_name).ThenBy(g => g.branch_seq).ThenBy(item => item.branch_uid);
  1807. var totalProducts = branchProducts.GroupBy(x => new { x.article_name, x.seq }).Select(g => new
  1808. {
  1809. g.Key.article_name,
  1810. g.Key.seq,
  1811. qty = g.Sum(x => (int?)x.qty) ?? 0,
  1812. }).OrderBy(x => x.article_name).ToArray();
  1813. // 所有商品的社團總數
  1814. var GroupCount = branchProducts.GroupBy(x => new { x.group_name }).Count();
  1815. // 所有商品的分店總數
  1816. var BranchCount = branchProducts.GroupBy(x => new { x.branch_uid }).Count();
  1817. // 套表
  1818. string sPath = NpoiExtension.Report("送單報表", (sheet) =>
  1819. {
  1820. var rowNumber = 0;
  1821. IRow row;
  1822. // 分店商品資料
  1823. sheet.InsertRow(rowNumber, count: branchProducts.Count() + GroupCount + (BranchCount * 3));// 總行數
  1824. var previousGroupName = "";// 上一個社團名稱
  1825. var previousBranchGuid = "";// 上一個分店uid
  1826. var firstData = true;// 是第一筆資料
  1827. foreach (var product in branchProducts)
  1828. {
  1829. if (!firstData && !product.branch_uid.Equals(previousBranchGuid))// 分店分隔符號
  1830. {
  1831. row = sheet.GetRow(rowNumber++);
  1832. row.GetCell(0).SetCellValue(new string('-', 30 * 2));
  1833. row = sheet.GetRow(rowNumber++);
  1834. }
  1835. //insert group title name
  1836. if (!product.group_name.Equals(previousGroupName))
  1837. {
  1838. row = sheet.GetRow(rowNumber++);
  1839. row.GetCell(0).SetCellValue(string.Format("【{0}】", product.group_name));
  1840. }
  1841. //insert branch divider and address
  1842. if (!product.branch_uid.Equals(previousBranchGuid))
  1843. {
  1844. row = sheet.GetRow(rowNumber++);
  1845. var currentBranch = BranchGroupList.Find(x => x.uid == product.branch_uid);
  1846. row.GetCell(0).SetCellValue(string.Format("【聯絡方式】{0} {1} {2}", currentBranch?.address, $"{currentBranch?.phone_number}", $"{currentBranch?.contact_person}"));
  1847. }
  1848. previousGroupName = product.group_name;
  1849. previousBranchGuid = product.branch_uid;
  1850. firstData = false;
  1851. row = sheet.GetRow(rowNumber++);
  1852. row.GetCell(0).SetCellValue(string.Format("【{0}】{1} x {2}", product.branch_name, product.article_name, product.qty));
  1853. }
  1854. // 分店分隔符號
  1855. row = sheet.GetRow(rowNumber++);
  1856. row.GetCell(0).SetCellValue(new string('-', 30 * 2));
  1857. row = sheet.GetRow(rowNumber++);
  1858. // 寫入總計商品資料
  1859. sheet.InsertRow(rowNumber, count: totalProducts.Count());
  1860. foreach (var product in totalProducts)
  1861. {
  1862. row = sheet.GetRow(rowNumber++);
  1863. row.GetCell(0).SetCellValue(string.Format("【總計】{0} x {1}", product.article_name, product.qty));
  1864. }
  1865. });
  1866. return sPath;
  1867. }
  1868. #endregion 列印功能
  1869. protected string deleteCommandGenerator(CRequestMessage i_crmInput, JArray i_jaItems, tb_sys_session i_sSessionUser, out List<Command> o_lcResult, List<string> i_saQryContainKeys,
  1870. [System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
  1871. [System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
  1872. [System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
  1873. {
  1874. string sMsg = null;
  1875. List<Command> lcCmds = new List<Command>();
  1876. Command cRes = null;
  1877. try
  1878. {
  1879. do
  1880. {
  1881. foreach (JToken jtkItem in i_jaItems)
  1882. {
  1883. Dictionary<string, object> dicItem = jtkItem.ToObject<Dictionary<string, object>>();
  1884. sMsg = getManualLog(i_crmInput, dicItem, BLWording.LOG_ACTION_NAME_DELETESQL, out Command cLog);
  1885. if (sMsg != null)
  1886. {
  1887. break;
  1888. }
  1889. if (cLog != null)
  1890. {
  1891. lcCmds.Add(cLog);
  1892. }
  1893. string sMstUID = null;
  1894. if (dicItem.ContainsKey(BLWording.WHEREDATA) && dicItem[BLWording.WHEREDATA] is JObject wheredata)
  1895. {
  1896. Dictionary<string, object> wheredataDic = wheredata.ToObject<Dictionary<string, object>>();
  1897. if (wheredataDic.ContainsKey(tb_ord_order_master.CN_UID))
  1898. {
  1899. sMstUID = wheredataDic[tb_ord_order_master.CN_UID].ToString();
  1900. // 查詢orderdeatil
  1901. tb_ord_order_detail cOrder = new tb_ord_order_detail();
  1902. cOrder.SetDirty(tb_ord_order_detail.CN_COMMENT_UID, tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID);
  1903. tb_ord_order_detail cOrderCon = new tb_ord_order_detail() { order_uid = sMstUID };
  1904. Command cSelect = Command.SetupSelectCmd(cOrder, cOrderCon);
  1905. ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
  1906. List<tb_ord_order_detail> qdsOrder = ai.RunQueryList<tb_ord_order_detail>(cSelect);
  1907. tb_ord_order_master cOrderMasterMain = new tb_ord_order_master();
  1908. cOrderMasterMain.SetDirty(tb_ord_order_master.CN_TYPE);
  1909. tb_ord_order_master cConMaster = new tb_ord_order_master()
  1910. {
  1911. uid = sMstUID,
  1912. };
  1913. Command cSelectMaster = Command.SetupSelectCmd(cOrderMasterMain, cConMaster);
  1914. ArsenalInterface aiMaster = ArsenalDBMgr.GetInst(cSelectMaster);
  1915. List<tb_ord_order_master> qdsOrderMasterMain = aiMaster.RunQueryList<tb_ord_order_master>(cSelectMaster);
  1916. // 判斷是否為現貨訂單
  1917. if (qdsOrderMasterMain[0].type == (int)Enums.ArticleType.Stock)
  1918. {
  1919. tb_prd_article2product cOrderProduct = new tb_prd_article2product();
  1920. cOrderProduct.SetDirty(tb_prd_article2product.CN_UID);
  1921. tb_prd_article2product cConProduct = new tb_prd_article2product()
  1922. {
  1923. order_uid = sMstUID,
  1924. };
  1925. Command cSelectProduct = Command.SetupSelectCmd(cOrderProduct, cConProduct);
  1926. ArsenalInterface aiProduct = ArsenalDBMgr.GetInst(cSelectProduct);
  1927. List<tb_prd_article2product> qdsProduct = aiProduct.RunQueryList<tb_prd_article2product>(cSelectProduct);
  1928. List<string> productUid = new List<string>();
  1929. foreach (var product in qdsProduct)
  1930. {
  1931. productUid.Add(product.uid);
  1932. }
  1933. QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
  1934. QueryJsonElement qjeA = lBlocks.GetInst();
  1935. qjeA.table = tb_ord_order_master.TABLENAME;
  1936. qjeA.displaycols = new List<string>() {
  1937. tb_ord_order_master.CN_UID
  1938. };
  1939. QueryJsonElement qjeDetail = lBlocks.GetInst();
  1940. qjeDetail.table = tb_ord_order_detail.TABLENAME;
  1941. qjeDetail.jointype = QueryJsonElement.LEFT_JOIN;
  1942. qjeDetail.jointable = qjeA;
  1943. qjeDetail.joincols = new Dictionary<string, string>() {
  1944. { tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
  1945. QueryJsonElement qjeProduct = lBlocks.GetInst();
  1946. qjeProduct.table = tb_prd_article2product.TABLENAME;
  1947. qjeProduct.jointype = QueryJsonElement.LEFT_JOIN;
  1948. qjeProduct.jointable = qjeDetail;
  1949. qjeProduct.joincols = new Dictionary<string, string>() {
  1950. { tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
  1951. qjeProduct.wherecols = new WhereNode(tb_prd_article2product.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_prd_article2product), productUid.ToArray());
  1952. lBlocks.Add(qjeA);
  1953. lBlocks.Add(qjeDetail);
  1954. lBlocks.Add(qjeProduct);
  1955. sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
  1956. if (sMsg != null)
  1957. {
  1958. break;
  1959. }
  1960. ArsenalInterface ai2 = ArsenalDBMgr.GetInst(cRes);
  1961. List<tb_ord_order_master> qdsMaster = aiProduct.RunQueryList<tb_ord_order_master>(cRes);
  1962. foreach (var master in qdsMaster)
  1963. {
  1964. tb_ord_order_master updateMaster1 = new tb_ord_order_master { status_flag = BLWording.STATUS_FLAG_OFF };
  1965. tb_ord_order_master updateMasterCond1 = new tb_ord_order_master { uid = master.uid };
  1966. lcCmds.Add(Command.SetupUpdateCmd(updateMaster1, updateMasterCond1));
  1967. }
  1968. tb_ord_order_master updateMaster = new tb_ord_order_master { status_flag = BLWording.STATUS_FLAG_OFF };
  1969. tb_ord_order_master updateMasterCond = new tb_ord_order_master { uid = sMstUID };
  1970. lcCmds.Add(Command.SetupUpdateCmd(updateMaster, updateMasterCond));
  1971. continue;
  1972. }
  1973. // 刪除order
  1974. lcCmds.Add(Command.SetupDeleteCmd(new tb_ord_order_master() { uid = sMstUID }));
  1975. // 刪除comment
  1976. foreach (var c in qdsOrder)
  1977. {
  1978. lcCmds.Add(Command.SetupDeleteCmd(new tb_grp_comment() { uid = c.comment_uid }));
  1979. }
  1980. // 得到該article_uid
  1981. tb_prd_article2product aOrder = new tb_prd_article2product();
  1982. aOrder.SetDirty(tb_prd_article2product.CN_ARTICLE_UID);
  1983. tb_prd_article2product aCon = new tb_prd_article2product()
  1984. {
  1985. uid = qdsOrder[0].article2product_uid
  1986. };
  1987. Command aSelect = Command.SetupSelectCmd(aOrder, aCon);
  1988. ArsenalInterface aiArticle = ArsenalDBMgr.GetInst(aSelect);
  1989. List<tb_prd_article2product> qdsArticle = aiArticle.RunQueryList<tb_prd_article2product>(aSelect);
  1990. // 查詢order master 該article有幾筆
  1991. tb_ord_order_master cOrderMaster = new tb_ord_order_master();
  1992. cOrderMaster.SetDirty(tb_ord_order_master.CN_UID, tb_ord_order_master.CN_STATUS);
  1993. tb_ord_order_master cOrderMasterCon = new tb_ord_order_master() { article_uid = qdsArticle[0].article_uid };
  1994. Command oSelect = Command.SetupSelectCmd(cOrderMaster, cOrderMasterCon);
  1995. ArsenalInterface aiO = ArsenalDBMgr.GetInst(oSelect);
  1996. List<tb_ord_order_master> qdsOrderMaster = aiO.RunQueryList<tb_ord_order_master>(oSelect);
  1997. if (qdsOrderMaster.Count == 1)
  1998. {
  1999. // 將 post_status 更改回 貼文完成
  2000. tb_grp_article updateArticle = new tb_grp_article { post_status = (int)EPostStatus.EPS_ORDER };
  2001. tb_grp_article updateArticleCond = new tb_grp_article { uid = qdsArticle[0].article_uid };
  2002. lcCmds.Add(Command.SetupUpdateCmd(updateArticle, updateArticleCond));
  2003. }
  2004. else
  2005. {
  2006. // 判斷除此訂單外是否有已到貨訂單
  2007. var arrivedCount = qdsOrderMaster.Where(x => x.status == 2 && x.uid != sMstUID).ToList().Count;
  2008. // 將post_status 改回已結單
  2009. if (arrivedCount < 1)
  2010. {
  2011. tb_grp_article updateArticle = new tb_grp_article { post_status = (int)EPostStatus.EPS_ORDER };
  2012. tb_grp_article updateArticleCond = new tb_grp_article { uid = qdsArticle[0].article_uid };
  2013. lcCmds.Add(Command.SetupUpdateCmd(updateArticle, updateArticleCond));
  2014. }
  2015. }
  2016. }
  2017. }
  2018. }
  2019. }
  2020. while (false);
  2021. }
  2022. catch (Exception ex)
  2023. {
  2024. LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_crmInput);
  2025. sMsg = $"{nameof(deleteCommandGenerator)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine}).";
  2026. #if DEBUG
  2027. System.Diagnostics.Debug.WriteLine(sMsg);
  2028. #endif
  2029. }
  2030. o_lcResult = lcCmds;
  2031. return sMsg;
  2032. }
  2033. /// <summary>
  2034. /// 新增現貨訂單
  2035. /// </summary>
  2036. /// <param name="i_crmInput"></param>
  2037. /// <returns></returns>
  2038. public CResponseMessage CreateStockOrder(CRequestMessage i_crmInput)
  2039. {
  2040. string sMsg = null;
  2041. List<Command> lCmds = new List<Command>();
  2042. CResponseMessage crmRes = null;
  2043. try
  2044. {
  2045. do
  2046. {
  2047. JArray jaData = i_crmInput.param[BLWording.ADD_MASTER] as JArray;
  2048. JObject joData = jaData[0][BLWording.DATA] as JObject;
  2049. Dictionary<string, object> dicInput = joData.ToObject<Dictionary<string, object>>();
  2050. // 判斷為社團ID還是分店ID
  2051. tb_grp_branch cBranch = new tb_grp_branch();
  2052. cBranch.SetDirty(tb_grp_branch.CN_GROUP_UID);
  2053. tb_grp_branch cCon = new tb_grp_branch() { uid = dicInput[tb_ord_order_master.CN_BRANCH_UID].ToString() };
  2054. Command cSelect = Command.SetupSelectCmd(cBranch, cCon);
  2055. ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
  2056. tb_grp_branch qds = ai.RunQuerySingleORM<tb_grp_branch>(cSelect);
  2057. string sNewArticleUid = Guid.NewGuid().ToString();
  2058. // 新增現貨訂單
  2059. tb_ord_order_master cNew = new tb_ord_order_master()
  2060. {
  2061. uid = sNewArticleUid,
  2062. name = dicInput[tb_ord_order_master.CN_NAME].ToString(),
  2063. type = (int)Enums.ArticleType.Stock,
  2064. status = (int)Enums.OrderMainStatus.NotArrived,
  2065. order_code = new GROUP.Helper.FbHelper().GetOrderCode()
  2066. };
  2067. var uid = dicInput[tb_ord_order_master.CN_BRANCH_UID].ToString();
  2068. var groupUID = qds == null ? uid : qds.group_uid;
  2069. if (qds == null)
  2070. {
  2071. cNew.group_uid = uid;
  2072. }
  2073. else
  2074. {
  2075. cNew.branch_uid = uid;
  2076. cNew.group_uid = groupUID;
  2077. }
  2078. lCmds.Add(Command.SetupInsertCmd(cNew));
  2079. string sProductKey = nameof(tb_prd_article2product);
  2080. if (!joData.ContainsKey(sProductKey))
  2081. {
  2082. sMsg = "grp.no_product";
  2083. break;
  2084. }
  2085. List<tb_prd_article2product> la2pProducts = joData[sProductKey].ToObject<List<tb_prd_article2product>>();
  2086. List<tb_prd_article2product> products = new List<tb_prd_article2product>();
  2087. foreach (var f in la2pProducts)
  2088. {
  2089. string sProductUid = f.prd_uid;
  2090. if (sProductUid == null)
  2091. {
  2092. sProductUid = Guid.NewGuid().ToString();
  2093. // Create Product first
  2094. lCmds.Add(Command.SetupInsertCmd(new tb_prd_product()
  2095. {
  2096. uid = sProductUid,
  2097. name = f.name,
  2098. group_id = groupUID,
  2099. price = f.price,
  2100. wholesale_price = f.wholesale_price,
  2101. cost_price = f.cost_price
  2102. // todo:預設商品碼
  2103. }));
  2104. }
  2105. tb_prd_article2product cNewProduct = new tb_prd_article2product()
  2106. {
  2107. uid = Guid.NewGuid().ToString(),
  2108. price = f.price,
  2109. wholesale_price = f.wholesale_price,
  2110. name = f.name,
  2111. prd_uid = sProductUid,
  2112. seq = f.seq,
  2113. qty = f.qty,
  2114. specification = f.specification?.ToUpper(),
  2115. cost_price = f.cost_price
  2116. };
  2117. cNewProduct.order_uid = sNewArticleUid;
  2118. products.Add(cNewProduct);
  2119. lCmds.Add(Command.SetupInsertCmd(cNewProduct));
  2120. }
  2121. foreach (var item in products)
  2122. {
  2123. tb_ord_incoming_return_record cNewRecord = new tb_ord_incoming_return_record();
  2124. cNewRecord.uid = Guid.NewGuid().ToString();
  2125. cNewRecord.order_uid = sNewArticleUid;
  2126. cNewRecord.article2product_uid = item.uid;
  2127. cNewRecord.operating = 1;
  2128. cNewRecord.qty = item.qty;
  2129. lCmds.Add(Command.SetupInsertCmd(cNewRecord));
  2130. }
  2131. ai = ArsenalDBMgr.GetInst(lCmds[0], GetDefaultSystemColumnInfo());
  2132. ai.RunEditCmds(lCmds);
  2133. string sErrorCode = GetLastErrorCode(lCmds);
  2134. if (sErrorCode != null)
  2135. {
  2136. sMsg = sErrorCode;
  2137. break;
  2138. }
  2139. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  2140. }
  2141. while (false);
  2142. }
  2143. catch (Exception ex)
  2144. {
  2145. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  2146. sMsg = $"{nameof(CreateStockOrder)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  2147. #if DEBUG
  2148. System.Diagnostics.Debug.WriteLine(sMsg);
  2149. #endif
  2150. }
  2151. if (null != sMsg)
  2152. {
  2153. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  2154. }
  2155. return crmRes;
  2156. }
  2157. private int GetOrderProductStock(string i_sOrderUID, string i_sarticle2productUID, string specification)
  2158. {
  2159. tb_ord_incoming_return_record cRecord = new tb_ord_incoming_return_record();
  2160. cRecord.SetFullDirty();
  2161. tb_ord_incoming_return_record cCon = new tb_ord_incoming_return_record() { order_uid = i_sOrderUID, article2product_uid = i_sarticle2productUID };
  2162. if (specification != null)
  2163. {
  2164. cCon.specification = specification;
  2165. }
  2166. Command cSelect = Command.SetupSelectCmd(cRecord, cCon);
  2167. ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
  2168. List<tb_ord_incoming_return_record> qdsRecord = ai.RunQueryList<tb_ord_incoming_return_record>(cSelect);
  2169. var incomeQty = qdsRecord.Where(x => x.operating == (int)Enums.IncomingReturnOperating.Incoming).Sum(x => x.qty);
  2170. var returnQty = qdsRecord.Where(x => x.operating == (int)Enums.IncomingReturnOperating.Return).Sum(x => x.qty);
  2171. return incomeQty - returnQty;
  2172. }
  2173. private int GetProductStock(string i_sArticle2ProductUID, string i_sbranchUID = null)
  2174. {
  2175. tb_ord_incoming_return_record cRecord = new tb_ord_incoming_return_record();
  2176. cRecord.SetFullDirty();
  2177. tb_ord_incoming_return_record cCon = new tb_ord_incoming_return_record() { article2product_uid = i_sArticle2ProductUID };
  2178. if (!string.IsNullOrEmpty(i_sbranchUID))
  2179. {
  2180. cCon.branch_uid = i_sbranchUID;
  2181. }
  2182. Command cSelect = Command.SetupSelectCmd(cRecord, cCon);
  2183. ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
  2184. List<tb_ord_incoming_return_record> qdsRecord = ai.RunQueryList<tb_ord_incoming_return_record>(cSelect);
  2185. var incomeQty = qdsRecord.Where(x => x.operating == (int)Enums.IncomingReturnOperating.Incoming).Sum(x => x.qty);
  2186. var returnQty = qdsRecord.Where(x => x.operating == (int)Enums.IncomingReturnOperating.Return).Sum(x => x.qty);
  2187. return incomeQty - returnQty;
  2188. }
  2189. /// <summary>
  2190. /// 當進退貨所造成存貨改變時,更新訂單到貨狀態
  2191. /// </summary>
  2192. /// <param name="i_sArticle2ProductUID"></param>
  2193. /// <param name="i_sBranchUID"></param>
  2194. /// <param name="i_iType"></param>
  2195. /// <param name="i_iQty"></param>
  2196. /// <returns></returns>
  2197. private List<Command> UpdateOrderIncomeReturnCmds(string i_sOrderUID, string i_sarticle2productUID, string specification, int i_iType, int i_iQty)
  2198. {
  2199. List<Command> lCmds = new List<Command>();
  2200. tb_ord_order_master cOrderMasterMain = new tb_ord_order_master();
  2201. cOrderMasterMain.SetDirty(tb_ord_order_master.CN_TYPE);
  2202. tb_ord_order_master cConMaster = new tb_ord_order_master()
  2203. {
  2204. uid = i_sOrderUID,
  2205. };
  2206. Command cSelectMaster = Command.SetupSelectCmd(cOrderMasterMain, cConMaster);
  2207. ArsenalInterface aiMaster = ArsenalDBMgr.GetInst(cSelectMaster);
  2208. List<tb_ord_order_master> qdsOrderMasterMain = aiMaster.RunQueryList<tb_ord_order_master>(cSelectMaster);
  2209. // 查詢訂單
  2210. tb_ord_order_detail cOrder = new tb_ord_order_detail();
  2211. cOrder.SetDirty(tb_ord_order_detail.CN_UID, tb_ord_order_detail.CN_ORDER_QTY, tb_ord_order_detail.CN_COMMENT_TIME, tb_ord_order_detail.CN_STATUS, tb_ord_order_detail.CN_TAKE_QTY);
  2212. tb_ord_order_detail cCon = new tb_ord_order_detail()
  2213. {
  2214. order_uid = i_sOrderUID,
  2215. article2product_uid = i_sarticle2productUID,
  2216. };
  2217. if (specification != null)
  2218. {
  2219. cCon.specification = specification;
  2220. }
  2221. Command cSelect = Command.SetupSelectCmd(cOrder, cCon);
  2222. ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
  2223. List<tb_ord_order_detail> qdsOrder = ai.RunQueryList<tb_ord_order_detail>(cSelect);
  2224. // 查詢目前存貨
  2225. var stockQty = GetOrderProductStock(i_sOrderUID, i_sarticle2productUID, specification);
  2226. // 更新訂單到貨狀態
  2227. // 進貨
  2228. // 得到該article_uid
  2229. tb_prd_article2product aOrder = new tb_prd_article2product();
  2230. aOrder.SetDirty(tb_prd_article2product.CN_ARTICLE_UID, tb_prd_article2product.CN_QTY);
  2231. tb_prd_article2product aCon = new tb_prd_article2product()
  2232. {
  2233. uid = i_sarticle2productUID
  2234. };
  2235. Command aSelect = Command.SetupSelectCmd(aOrder, aCon);
  2236. ArsenalInterface aiArticle = ArsenalDBMgr.GetInst(aSelect);
  2237. List<tb_prd_article2product> qdsArticle = aiArticle.RunQueryList<tb_prd_article2product>(aSelect);
  2238. var articleUid = qdsArticle[0].article_uid;
  2239. var qty = qdsArticle[0].qty;
  2240. if(qdsOrderMasterMain == null || qdsOrderMasterMain.Count < 1)
  2241. {
  2242. Logger.Error($@"{nameof(UpdateOrderIncomeReturnCmds)} Exception, {nameof(qdsOrderMasterMain)} is null,
  2243. {nameof(i_sOrderUID)}= {i_sOrderUID},
  2244. {nameof(i_sarticle2productUID)}= {i_sarticle2productUID},
  2245. {nameof(specification)}= {specification},
  2246. {nameof(i_iType)}= {i_iType},
  2247. {nameof(i_iQty)}= {i_iQty} ");
  2248. throw new Exception("Order Msater not found, 更新進退貨資料失敗");
  2249. }
  2250. // 判斷是否為現貨訂單
  2251. if (qdsOrderMasterMain[0].type == (int)Enums.ArticleType.Stock)
  2252. {
  2253. // 將 post_status 更改成 已到貨
  2254. tb_prd_article2product updateProduct = new tb_prd_article2product { qty = i_iType == (int)Enums.IncomingReturnOperating.Incoming ? qty + i_iQty : qty - i_iQty };
  2255. tb_prd_article2product updateProductCon = new tb_prd_article2product { uid = i_sarticle2productUID };
  2256. lCmds.Add(Command.SetupUpdateCmd(updateProduct, updateProductCon));
  2257. }
  2258. if (i_iType == (int)Enums.IncomingReturnOperating.Incoming)
  2259. {
  2260. stockQty = stockQty + i_iQty;
  2261. var takedQty = qdsOrder.Where(x => x.status == (int)Enums.OrderStatus.Taked).Sum(x => x.take_qty);
  2262. if (stockQty > 0)
  2263. {
  2264. tb_ord_order_master cUpCon = new tb_ord_order_master() { uid = i_sOrderUID };
  2265. tb_ord_order_master cUpData = new tb_ord_order_master() { status = (int)Enums.OrderMainStatus.Arrived };
  2266. lCmds.Add(Command.SetupUpdateCmd(cUpData, cUpCon));
  2267. // 將 post_status 更改成 已到貨
  2268. tb_grp_article updateArticle = new tb_grp_article { post_status = (int)EPostStatus.EPS_ARRIVED };
  2269. tb_grp_article updateArticleCond = new tb_grp_article { uid = articleUid };
  2270. lCmds.Add(Command.SetupUpdateCmd(updateArticle, updateArticleCond));
  2271. }
  2272. // 處理detail
  2273. stockQty = i_iQty;
  2274. foreach (var order in qdsOrder.Where(x => x.status == (int)Enums.OrderStatus.NotArrived).OrderBy(x => x.comment_time))
  2275. {
  2276. if (stockQty >= order.order_qty)
  2277. {
  2278. tb_ord_order_detail cUpCon = new tb_ord_order_detail() { uid = order.uid };
  2279. tb_ord_order_detail cUpData = new tb_ord_order_detail() { status = (int)Enums.OrderStatus.NotTake };
  2280. lCmds.Add(Command.SetupUpdateCmd(cUpData, cUpCon));
  2281. stockQty -= order.order_qty;
  2282. }
  2283. }
  2284. }
  2285. // 退貨
  2286. else
  2287. {
  2288. stockQty = stockQty - i_iQty;
  2289. var takedQty = qdsOrder.Where(x => x.status == (int)Enums.OrderStatus.Taked).Sum(x => x.take_qty);
  2290. if (stockQty < takedQty)
  2291. {
  2292. return null;
  2293. }
  2294. var notTakedCount = qdsOrder.Where(x => x.status == (int)Enums.OrderStatus.NotTake).ToList().Count;
  2295. if (stockQty > 0)
  2296. {
  2297. tb_ord_order_master cUpCon = new tb_ord_order_master() { uid = i_sOrderUID };
  2298. tb_ord_order_master cUpData = new tb_ord_order_master() { status = (int)Enums.OrderMainStatus.Arrived };
  2299. lCmds.Add(Command.SetupUpdateCmd(cUpData, cUpCon));
  2300. }
  2301. else
  2302. {
  2303. tb_ord_order_master cUpCon = new tb_ord_order_master() { uid = i_sOrderUID };
  2304. tb_ord_order_master cUpData = new tb_ord_order_master() { status = (int)Enums.OrderMainStatus.NotArrived };
  2305. lCmds.Add(Command.SetupUpdateCmd(cUpData, cUpCon));
  2306. if (notTakedCount == 0)
  2307. {
  2308. // 查詢order master 該article有幾筆
  2309. tb_ord_order_master cOrderMaster = new tb_ord_order_master();
  2310. cOrder.SetDirty(tb_ord_order_master.CN_UID);
  2311. tb_ord_order_master cOrderMasterCon = new tb_ord_order_master() { article_uid = articleUid };
  2312. Command oSelect = Command.SetupSelectCmd(cOrderMaster, cOrderMasterCon);
  2313. ArsenalInterface aiO = ArsenalDBMgr.GetInst(oSelect);
  2314. List<tb_ord_order_master> qdsOrderMaster = aiO.RunQueryList<tb_ord_order_master>(oSelect);
  2315. // 判斷除此訂單外是否有已到貨訂單
  2316. var arrivedCount = qdsOrderMaster.Where(x => x.status == 2 && x.uid != i_sOrderUID).ToList().Count;
  2317. // 將post_status 改回已結單
  2318. if (arrivedCount < 1)
  2319. {
  2320. tb_grp_article updateArticle = new tb_grp_article { post_status = (int)EPostStatus.EPS_ORDER };
  2321. tb_grp_article updateArticleCond = new tb_grp_article { uid = qdsArticle[0].article_uid };
  2322. lCmds.Add(Command.SetupUpdateCmd(updateArticle, updateArticleCond));
  2323. }
  2324. }
  2325. }
  2326. // 處理 detail
  2327. stockQty = stockQty - takedQty;
  2328. foreach (var order in qdsOrder.Where(x => x.status == (int)Enums.OrderStatus.NotTake).OrderBy(x => x.comment_time))
  2329. {
  2330. if (stockQty < order.order_qty)
  2331. {
  2332. tb_ord_order_detail cUpCon = new tb_ord_order_detail() { uid = order.uid };
  2333. tb_ord_order_detail cUpData = new tb_ord_order_detail() { status = (int)Enums.OrderStatus.NotArrived };
  2334. lCmds.Add(Command.SetupUpdateCmd(cUpData, cUpCon));
  2335. }
  2336. stockQty -= order.order_qty;
  2337. }
  2338. }
  2339. return lCmds;
  2340. }
  2341. /// <summary>
  2342. /// 新增進退貨資料
  2343. /// </summary>
  2344. /// <param name="i_crmInput"></param>
  2345. /// <returns></returns>
  2346. public CResponseMessage IncomeReturnRecord(CRequestMessage i_crmInput)
  2347. {
  2348. string sMsg = null;
  2349. List<Command> lCmds = new List<Command>();
  2350. CResponseMessage crmRes = null;
  2351. try
  2352. {
  2353. do
  2354. {
  2355. JArray jaData = i_crmInput.param[BLWording.ADD_MASTER] as JArray;
  2356. JObject joData = jaData[0] as JObject;
  2357. Dictionary<string, object> dicInput = joData.ToObject<Dictionary<string, object>>();
  2358. // 新增進退貨記錄
  2359. tb_ord_incoming_return_record cNew = new tb_ord_incoming_return_record();
  2360. cNew.FillData(dicInput);
  2361. lCmds.Add(Command.SetupInsertCmd(cNew));
  2362. var specification = dicInput[tb_ord_incoming_return_record.CN_SPECIFICATION] == null ? null : dicInput[tb_ord_incoming_return_record.CN_SPECIFICATION].ToString();
  2363. List<Command> lCmds2 = UpdateOrderIncomeReturnCmds(dicInput[tb_ord_incoming_return_record.CN_ORDER_UID].ToString(), dicInput[tb_ord_incoming_return_record.CN_ARTICLE2PRODUCT_UID].ToString(), specification, Convert.ToInt32(dicInput[tb_ord_incoming_return_record.CN_OPERATING]), Convert.ToInt32(dicInput[tb_ord_incoming_return_record.CN_QTY]));
  2364. if (lCmds2 == null)
  2365. {
  2366. sMsg = "退貨數量";
  2367. break;
  2368. }
  2369. // 更新訂單到貨狀態
  2370. lCmds.AddRange(lCmds2);
  2371. ArsenalInterface ai = ArsenalDBMgr.GetInst(lCmds[0], GetDefaultSystemColumnInfo());
  2372. ai.RunEditCmds(lCmds);
  2373. string sErrorCode = GetLastErrorCode(lCmds);
  2374. if (sErrorCode != null)
  2375. {
  2376. sMsg = sErrorCode;
  2377. break;
  2378. }
  2379. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  2380. }
  2381. while (false);
  2382. }
  2383. catch (Exception ex)
  2384. {
  2385. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  2386. sMsg = $"{nameof(IncomeReturnRecord)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  2387. #if DEBUG
  2388. System.Diagnostics.Debug.WriteLine(sMsg);
  2389. #endif
  2390. }
  2391. if (null != sMsg)
  2392. {
  2393. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  2394. }
  2395. return crmRes;
  2396. }
  2397. public CResponseMessage GetIncomeReturnRecord(CRequestMessage i_crmInput)
  2398. {
  2399. string sMsg;
  2400. Command cRes = null;
  2401. CResponseMessage crmRes = null;
  2402. try
  2403. {
  2404. do
  2405. {
  2406. Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput); // 取得condition
  2407. QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
  2408. QueryJsonElement qjeRecord = lBlocks.GetInst();
  2409. qjeRecord.table = tb_ord_incoming_return_record.TABLENAME;
  2410. qjeRecord.displaycols = new List<string>() {
  2411. tb_ord_incoming_return_record.CN_OPERATING,
  2412. tb_ord_incoming_return_record.CN_QTY,
  2413. tb_ord_incoming_return_record.CN_MEMO,
  2414. tb_ord_incoming_return_record.CN_CREATE_DATE
  2415. };
  2416. qjeRecord.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND,
  2417. new WhereNode(tb_ord_incoming_return_record.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_incoming_return_record), dicCondition[tb_ord_incoming_return_record.CN_BRANCH_UID]),
  2418. new WhereNode(tb_ord_incoming_return_record.CN_ARTICLE2PRODUCT_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_incoming_return_record), dicCondition[tb_ord_incoming_return_record.CN_UID]));
  2419. QueryJsonElement qjeEmp = lBlocks.GetInst();
  2420. qjeEmp.table = tb_hr_employee.TABLENAME;
  2421. qjeEmp.jointype = QueryJsonElement.LEFT_JOIN;
  2422. qjeEmp.jointable = qjeRecord;
  2423. qjeEmp.joincols = new Dictionary<string, string>() {
  2424. { tb_hr_employee.CN_UID,tb_ord_incoming_return_record.CN_CREATE_USER_UID }};
  2425. qjeEmp.displaycols = new List<string>() { tb_hr_employee.CN_NAME };
  2426. QueryJsonElement qjeProduct = lBlocks.GetInst();
  2427. qjeProduct.table = tb_prd_article2product.TABLENAME;
  2428. qjeProduct.jointype = QueryJsonElement.LEFT_JOIN;
  2429. qjeProduct.jointable = qjeRecord;
  2430. qjeProduct.joincols = new Dictionary<string, string>() {
  2431. { tb_prd_article2product.CN_UID,tb_ord_incoming_return_record.CN_ARTICLE2PRODUCT_UID }};
  2432. qjeProduct.displaycols = new List<string>() { tb_prd_article2product.CN_SEQ };
  2433. qjeProduct.aliascols = new Dictionary<string, List<string>>
  2434. {
  2435. { tb_prd_article2product.CN_NAME, new List<string>() { "product_name" } }
  2436. };
  2437. lBlocks.Add(qjeRecord);
  2438. lBlocks.Add(qjeEmp);
  2439. lBlocks.Add(qjeProduct);
  2440. sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
  2441. if (sMsg != null)
  2442. {
  2443. break;
  2444. }
  2445. ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
  2446. QueryDataSet qds = ai.RunQueryDataSet(cRes);
  2447. if (cRes.IsSuccess == false)
  2448. {
  2449. sMsg = cRes.LastErrorCode;
  2450. break;
  2451. }
  2452. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  2453. crmRes.param.Add(BLWording.DATA, qds);
  2454. }
  2455. while (false);
  2456. }
  2457. catch (Exception ex)
  2458. {
  2459. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  2460. sMsg = $"{nameof(GetIncomeReturnRecord)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  2461. #if DEBUG
  2462. System.Diagnostics.Debug.WriteLine(sMsg);
  2463. #endif
  2464. }
  2465. if (null != sMsg)
  2466. {
  2467. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  2468. }
  2469. return crmRes;
  2470. }
  2471. public CResponseMessage CheckOut(CRequestMessage i_crmInput)
  2472. {
  2473. string sMsg = null;
  2474. List<Command> lCmds = new List<Command>();
  2475. List<Command> lCmdsDetail = new List<Command>();
  2476. CResponseMessage crmRes = null;
  2477. ArsenalInterface ai = null;
  2478. try
  2479. {
  2480. do
  2481. {
  2482. JObject oData = i_crmInput.param[BLWording.ADD_MASTER] as JObject;
  2483. Dictionary<string, object> joData = oData.ToObject<Dictionary<string, object>>();
  2484. JArray jaData = joData[BLWording.DATA] as JArray;
  2485. Dictionary<string, int> dicPoints = new Dictionary<string, int>();
  2486. if (joData.ContainsKey("shoppingPoints")) // 判斷是否使用購物金 並驗證金額大小
  2487. {
  2488. JArray jaPoints = joData["shoppingPoints"] as JArray;
  2489. foreach (var points in jaPoints)
  2490. {
  2491. var member_uid = points[tb_meb_member.CN_UID].ToString();
  2492. tb_meb_member cPoints = new tb_meb_member();
  2493. cPoints.SetDirty(tb_meb_member.CN_SHOPPING_ACCOUNT);
  2494. tb_meb_member cConPoints = new tb_meb_member()
  2495. {
  2496. uid = member_uid
  2497. };
  2498. Command pointsSelect = Command.SetupSelectCmd(cPoints, cConPoints);
  2499. ArsenalInterface aiPoints = ArsenalDBMgr.GetInst(pointsSelect);
  2500. var qdsPoints = aiPoints.RunQueryList<tb_meb_member>(pointsSelect);
  2501. if (Convert.ToDecimal(points[tb_meb_member.CN_SHOPPING_ACCOUNT]) > qdsPoints[0].shopping_account)
  2502. {
  2503. sMsg = "Shopping Points Wrong";
  2504. break;
  2505. }
  2506. else
  2507. {
  2508. dicPoints[member_uid] = Convert.ToInt32(points[tb_meb_member.CN_SHOPPING_ACCOUNT]);
  2509. }
  2510. }
  2511. }
  2512. if (sMsg != null)
  2513. {
  2514. break;
  2515. }
  2516. var addMainData = new List<tb_ord_purchase>();
  2517. var addPointsData = new List<tb_meb_shopping_points_record>();
  2518. var now = DateTime.Now;
  2519. // get create_uesr_id
  2520. var token = i_crmInput.token;
  2521. tb_sys_session cSession = new tb_sys_session();
  2522. cSession.SetDirty(tb_sys_session.CN_CREATE_USER_UID);
  2523. tb_sys_session cCon = new tb_sys_session()
  2524. {
  2525. uid = token
  2526. };
  2527. Command sessionSelect = Command.SetupSelectCmd(cSession, cCon);
  2528. ArsenalInterface aiSession = ArsenalDBMgr.GetInst(sessionSelect);
  2529. tb_sys_session qdsSession = aiSession.RunQuerySingleORM<tb_sys_session>(sessionSelect);
  2530. if (qdsSession != null && !string.IsNullOrEmpty(qdsSession.create_user_uid))
  2531. {
  2532. // get receive_branch_uid
  2533. tb_hr_employee cEmployee = new tb_hr_employee();
  2534. cEmployee.SetDirty(tb_hr_employee.CN_RECEIVE_BRANCH_UID);
  2535. tb_hr_employee eCon = new tb_hr_employee()
  2536. {
  2537. uid = qdsSession.create_user_uid
  2538. };
  2539. Command employeeSelect = Command.SetupSelectCmd(cEmployee, eCon);
  2540. ArsenalInterface aiEmployee = ArsenalDBMgr.GetInst(employeeSelect);
  2541. tb_hr_employee qdsEmployee = aiEmployee.RunQuerySingleORM<tb_hr_employee>(employeeSelect);
  2542. if (qdsEmployee != null) // 目前 receive_branch_uid 可以為null 後期須改為 != null
  2543. {
  2544. foreach (JObject row in jaData)
  2545. {
  2546. Dictionary<string, object> dicInput = row.ToObject<Dictionary<string, object>>();
  2547. string article2productUID = dicInput[tb_prd_article2product.CN_UID].ToString();
  2548. JArray orderUID = dicInput[tb_ord_order_detail.CN_ORDER_UID] as JArray;
  2549. var aOrderUid = orderUID.Select(x => x.ToString()).ToArray();
  2550. string specification = dicInput.ContainsKey(tb_ord_order_detail.CN_SPECIFICATION) ? dicInput[tb_ord_order_detail.CN_SPECIFICATION].ToString() : null;
  2551. dicInput.Remove(tb_prd_article2product.CN_UID);
  2552. // 用article2product_uid + member_uid + order_uid 查詢order_detail
  2553. tb_ord_order_detail cOrder = new tb_ord_order_detail();
  2554. cOrder.SetFullDirty();
  2555. List<WhereNode> lwWhereData = new List<WhereNode>();
  2556. lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), article2productUID));
  2557. lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_detail), aOrderUid));
  2558. if (specification != null)
  2559. {
  2560. lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_SPECIFICATION, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), specification));
  2561. }
  2562. lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.NotTake));
  2563. var jaMember = dicInput["member"] as JArray;
  2564. var aMember = jaMember.Select(x => x.ToString()).ToArray();
  2565. if (aMember[0] != "")
  2566. {
  2567. lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_MEMBER_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_detail), aMember));
  2568. }
  2569. else
  2570. {
  2571. lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_MEMBER_UID, WhereNode.EColumnOperation.EOT_ISNULL, typeof(tb_ord_order_detail)));
  2572. }
  2573. Command cSelect = Command.SetupSelectCmd(cOrder, new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwWhereData.ToArray()));
  2574. ai = ArsenalDBMgr.GetInst(cSelect);
  2575. List<tb_ord_order_detail> qdsOrder = ai.RunQueryList<tb_ord_order_detail>(cSelect);
  2576. var takeQty = Convert.ToInt32(dicInput[tb_ord_order_detail.CN_ORDER_QTY]);
  2577. int type = 0;
  2578. if (dicInput.ContainsKey("type"))
  2579. {
  2580. type = Convert.ToInt32(dicInput["type"]);
  2581. }
  2582. foreach (var memberOrder in qdsOrder.GroupBy(x => x.member_uid))
  2583. {
  2584. var memberUID = memberOrder.Key;
  2585. var purchaseUID = addMainData.Any(x => x.member_uid == memberUID) ?
  2586. addMainData.Where(x => x.member_uid == memberUID).Select(x => x.uid).SingleOrDefault() : Guid.NewGuid().ToString();
  2587. var amount = 0;
  2588. var returnCount = 0; // 計算退貨次數
  2589. foreach (var order in memberOrder)
  2590. {
  2591. var detailNum = order.order_qty - order.take_qty;
  2592. var updateDetailNum = takeQty >= detailNum ? detailNum : takeQty;
  2593. if (takeQty != 0) // 數量 = 0 不新增purchase
  2594. {
  2595. tb_ord_purchase_detail cDeatil = new tb_ord_purchase_detail()
  2596. {
  2597. purchase_uid = purchaseUID,
  2598. branch_uid = dicInput[tb_ord_purchase_detail.CN_BRANCH_UID].ToString(),
  2599. order_detail_uid = order.uid,
  2600. article2product_uid = article2productUID,
  2601. specification = order.specification != "" ? order.specification : null,
  2602. qty = updateDetailNum,
  2603. amount = updateDetailNum * Convert.ToInt32(dicInput[tb_prd_article2product.CN_PRICE])
  2604. };
  2605. lCmdsDetail.Add(Command.SetupInsertCmd(cDeatil));
  2606. amount += cDeatil.amount;
  2607. }
  2608. // 新增收款明細
  2609. // 調整訂單狀態、take_qty type = 1 為退貨 已取貨, = 2 為保留 未取貨
  2610. if (takeQty != 0)
  2611. {
  2612. if (takeQty >= detailNum) // 該筆detail 全拿
  2613. {
  2614. lCmds.Add(Command.SetupUpdateCmd(new tb_ord_order_detail()
  2615. {
  2616. status = (int)Enums.OrderStatus.Taked,
  2617. take_qty = updateDetailNum + order.take_qty,
  2618. operate_date = now
  2619. }
  2620. , new tb_ord_order_detail() { uid = order.uid }));
  2621. takeQty -= updateDetailNum;
  2622. }
  2623. else
  2624. {
  2625. if (type == 1) // 退貨
  2626. {
  2627. lCmds.Add(Command.SetupUpdateCmd(new tb_ord_order_detail()
  2628. {
  2629. status = (int)Enums.OrderStatus.Taked,
  2630. take_qty = updateDetailNum + order.take_qty,
  2631. order_qty = updateDetailNum + order.take_qty,
  2632. price = (updateDetailNum + order.take_qty) * order.price / order.order_qty,
  2633. operate_date = now
  2634. }
  2635. , new tb_ord_order_detail() { uid = order.uid }));
  2636. // 新增退貨訂單order
  2637. string sNewArticleUid = Guid.NewGuid().ToString();
  2638. tb_ord_order_detail cNew = new tb_ord_order_detail()
  2639. {
  2640. uid = sNewArticleUid,
  2641. order_uid = order.order_uid,
  2642. article2product_uid = order.article2product_uid,
  2643. member_uid = order.member_uid,
  2644. order_qty = order.order_qty - updateDetailNum - order.take_qty,
  2645. take_qty = 0,
  2646. price = (order.order_qty - updateDetailNum - order.take_qty) * order.price / order.order_qty,
  2647. status = (int)Enums.OrderStatus.Return,
  2648. comment_uid = order.comment_uid,
  2649. comment_time = order.comment_time,
  2650. operate_date = now,
  2651. specification = order.specification
  2652. };
  2653. lCmds.Add(Command.SetupInsertCmd(cNew));
  2654. returnCount += 1;
  2655. }
  2656. else // 保留
  2657. {
  2658. lCmds.Add(Command.SetupUpdateCmd(new tb_ord_order_detail()
  2659. {
  2660. status = (int)Enums.OrderStatus.NotTake,
  2661. take_qty = updateDetailNum + order.take_qty
  2662. }
  2663. , new tb_ord_order_detail() { uid = order.uid }));
  2664. }
  2665. takeQty -= updateDetailNum;
  2666. }
  2667. }
  2668. else
  2669. {
  2670. lCmds.Add(Command.SetupUpdateCmd(new tb_ord_order_detail()
  2671. {
  2672. status = type == 1 ? (int)Enums.OrderStatus.Return : (int)Enums.OrderStatus.NotTake,
  2673. take_qty = updateDetailNum,
  2674. operate_date = now
  2675. }
  2676. , new tb_ord_order_detail() { uid = order.uid }));
  2677. returnCount += type == 1 ? 1 : 0;
  2678. takeQty -= updateDetailNum;
  2679. }
  2680. }
  2681. if (Convert.ToInt32(dicInput[tb_ord_order_detail.CN_ORDER_QTY]) != 0) // 數量為零不新增
  2682. {
  2683. if (addMainData.Any(x => x.member_uid == memberUID))
  2684. {
  2685. var model = addMainData.Where(x => x.member_uid == memberUID).SingleOrDefault();
  2686. model.amount += amount;
  2687. }
  2688. else
  2689. {
  2690. if (dicPoints.ContainsKey(memberUID)) // 新增purchase時 檢查是否需要扣購物金
  2691. {
  2692. amount -= dicPoints[memberUID];
  2693. // 新增一筆扣款購物金
  2694. tb_meb_shopping_points_record cPointsNew = new tb_meb_shopping_points_record()
  2695. {
  2696. uid = Guid.NewGuid().ToString(),
  2697. member_uid = memberUID,
  2698. amount = -dicPoints[memberUID],
  2699. purchase_uid = purchaseUID
  2700. };
  2701. addPointsData.Add(cPointsNew);
  2702. }
  2703. tb_ord_purchase cNew = new tb_ord_purchase()
  2704. {
  2705. uid = purchaseUID,
  2706. member_uid = memberUID,
  2707. amount = amount,
  2708. receive_branch_uid = qdsEmployee.receive_branch_uid
  2709. };
  2710. addMainData.Add(cNew);
  2711. }
  2712. }
  2713. if (returnCount > 0)
  2714. {
  2715. sMsg = getUpdateReturnCountCmd(memberUID, returnCount);
  2716. if (sMsg != null)
  2717. {
  2718. break;
  2719. }
  2720. }
  2721. }
  2722. }
  2723. // 新增收款記錄 與新增點數
  2724. foreach (var mainData in addMainData)
  2725. {
  2726. lCmds.Add(Command.SetupInsertCmd(mainData));
  2727. // 新增一筆點數
  2728. tb_meb_shopping_points_record cPointsNew = new tb_meb_shopping_points_record()
  2729. {
  2730. uid = Guid.NewGuid().ToString(),
  2731. member_uid = mainData.member_uid,
  2732. amount = (int)(mainData.amount / 100),
  2733. purchase_uid = mainData.uid
  2734. };
  2735. addPointsData.Add(cPointsNew);
  2736. }
  2737. // 新增購物金扣款
  2738. foreach (var pointsData in addPointsData)
  2739. {
  2740. lCmds.Add(Command.SetupInsertCmd(pointsData));
  2741. }
  2742. lCmds.AddRange(lCmdsDetail);
  2743. var groupPointsData = addPointsData.GroupBy(x => x.member_uid);
  2744. foreach (var memberPointsData in groupPointsData)
  2745. {
  2746. tb_meb_member cPoints = new tb_meb_member();
  2747. cPoints.SetDirty(tb_meb_member.CN_SHOPPING_ACCOUNT);
  2748. tb_meb_member cConPoints = new tb_meb_member()
  2749. {
  2750. uid = memberPointsData.Key
  2751. };
  2752. Command pointsSelect = Command.SetupSelectCmd(cPoints, cConPoints);
  2753. ArsenalInterface aiPoints = ArsenalDBMgr.GetInst(pointsSelect);
  2754. var qdsPoints = aiPoints.RunQueryList<tb_meb_member>(pointsSelect);
  2755. lCmds.Add(Command.SetupUpdateCmd(new tb_meb_member()
  2756. {
  2757. shopping_account = qdsPoints[0].shopping_account + Convert.ToInt32(memberPointsData.Sum(x => x.amount))
  2758. }
  2759. , new tb_meb_member() { uid = memberPointsData.Key }));
  2760. }
  2761. if (lCmds.Any())
  2762. {
  2763. ai = ArsenalDBMgr.GetInst(lCmds[0], GetDefaultSystemColumnInfo());
  2764. ai.RunEditCmds(lCmds);
  2765. string sErrorCode = GetLastErrorCode(lCmds);
  2766. if (sErrorCode != null)
  2767. {
  2768. sMsg = sErrorCode;
  2769. break;
  2770. }
  2771. }
  2772. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  2773. }
  2774. }
  2775. }
  2776. while (false);
  2777. }
  2778. catch (Exception ex)
  2779. {
  2780. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  2781. sMsg = $"{nameof(CheckOut)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  2782. #if DEBUG
  2783. System.Diagnostics.Debug.WriteLine(sMsg);
  2784. #endif
  2785. }
  2786. if (null != sMsg)
  2787. {
  2788. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  2789. }
  2790. return crmRes;
  2791. }
  2792. public CResponseMessage SetMemo(CRequestMessage i_crmInput)
  2793. {
  2794. string sMsg = null;
  2795. List<Command> lCmds = new List<Command>();
  2796. Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput);
  2797. CResponseMessage crmRes = null;
  2798. try
  2799. {
  2800. do
  2801. {
  2802. foreach (var joData in dicCondition)
  2803. {
  2804. string memberUID = (joData.Value as dynamic).member_uid.ToString();
  2805. string memo = (joData.Value as dynamic).memo.ToString();
  2806. tb_ord_order_detail upData = new tb_ord_order_detail() { member_uid = memberUID, status = (int)Enums.OrderStatus.NotTake };
  2807. tb_ord_order_detail upCon = new tb_ord_order_detail();
  2808. upCon.memo = memo;
  2809. lCmds.Add(Command.SetupUpdateCmd(upCon, upData));
  2810. }
  2811. if (lCmds.Any())
  2812. {
  2813. ArsenalInterface ai = ArsenalDBMgr.GetInst(lCmds[0], GetDefaultSystemColumnInfo());
  2814. ai.RunEditCmds(lCmds);
  2815. string sErrorCode = GetLastErrorCode(lCmds);
  2816. if (sErrorCode != null)
  2817. {
  2818. sMsg = sErrorCode;
  2819. break;
  2820. }
  2821. }
  2822. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  2823. }
  2824. while (false);
  2825. }
  2826. catch (Exception ex)
  2827. {
  2828. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  2829. sMsg = $"{nameof(SetMemo)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  2830. #if DEBUG
  2831. System.Diagnostics.Debug.WriteLine(sMsg);
  2832. #endif
  2833. }
  2834. if (null != sMsg)
  2835. {
  2836. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  2837. }
  2838. return crmRes;
  2839. }
  2840. public class StockModel
  2841. {
  2842. public string uid { get; set; }
  2843. public string article2product_uid { get; set; }
  2844. public string article_name { get; set; }
  2845. public string name { get; set; }
  2846. public int price { get; set; }
  2847. public int qty { get; set; }
  2848. public int seq { get; set; }
  2849. public string specification { get; set; }
  2850. }
  2851. /// <summary>
  2852. /// 取得現貨區商品(現貨訂單、訂單已封存)
  2853. /// </summary>
  2854. /// <param name="i_crmInput"></param>
  2855. /// <returns></returns>
  2856. public CResponseMessage GetStockList(CRequestMessage i_crmInput)
  2857. {
  2858. string sMsg = null;
  2859. CResponseMessage crmRes = null;
  2860. try
  2861. {
  2862. do
  2863. {
  2864. Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput);
  2865. var session = ProjectHelper.GetLoginUser(i_crmInput);
  2866. if (session == null)
  2867. {
  2868. sMsg = "Session error!!";
  2869. Logger.Error($"Session error!! i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ");
  2870. }
  2871. sMsg = GetFinalData(dicCondition, session.receive_branch_uid, out List<StockModel> finalData, out List<tb_grp_group> qdsGroup);
  2872. if (null != sMsg)
  2873. {
  2874. break;
  2875. }
  2876. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  2877. crmRes.param.Add(BLWording.DATA, finalData);
  2878. if (qdsGroup.Any())
  2879. {
  2880. crmRes.param.Add("groupData", qdsGroup[0]);
  2881. }
  2882. else
  2883. {
  2884. tb_grp_branch branch = new tb_grp_branch();
  2885. branch.SetDirty(tb_grp_branch.CN_BRANCH_NAME, tb_grp_branch.CN_GROUP_UID, tb_grp_branch.CN_UID);
  2886. tb_grp_branch branchCon = new tb_grp_branch()
  2887. {
  2888. uid = dicCondition[tb_ord_order_master.CN_BRANCH_UID].ToString()
  2889. };
  2890. Command aSelect = Command.SetupSelectCmd(branch, branchCon);
  2891. ArsenalInterface aiBranch = ArsenalDBMgr.GetInst(aSelect);
  2892. List<tb_grp_branch> qdsBranch = aiBranch.RunQueryList<tb_grp_branch>(aSelect);
  2893. crmRes.param.Add("branchData", qdsBranch[0]);
  2894. }
  2895. }
  2896. while (false);
  2897. }
  2898. catch (Exception ex)
  2899. {
  2900. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  2901. sMsg = $"{nameof(GetStockList)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  2902. #if DEBUG
  2903. System.Diagnostics.Debug.WriteLine(sMsg);
  2904. #endif
  2905. }
  2906. if (null != sMsg)
  2907. {
  2908. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  2909. }
  2910. return crmRes;
  2911. }
  2912. private string GetFinalData(Dictionary<string, object> dicCondition, string branch_uid, out List<StockModel> finalData, out List<tb_grp_group> qdsGroup)
  2913. {
  2914. string sMsg = null;
  2915. finalData = new List<StockModel>();
  2916. do
  2917. {
  2918. var isGroup = false;
  2919. string groupUid = "";
  2920. qdsGroup = new List<tb_grp_group>();
  2921. if (dicCondition.ContainsKey(tb_ord_order_master.CN_BRANCH_UID))
  2922. {
  2923. tb_grp_group cGroup = new tb_grp_group();
  2924. cGroup.SetFullDirty();
  2925. WhereNode wnGroup = new WhereNode(tb_grp_group.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group), dicCondition[tb_ord_order_master.CN_BRANCH_UID].ToString());
  2926. Command gSelect = Command.SetupSelectCmd(cGroup, wnGroup);
  2927. ArsenalInterface aiGroup = ArsenalDBMgr.GetInst(gSelect);
  2928. qdsGroup = aiGroup.RunQueryList<tb_grp_group>(gSelect);
  2929. if (qdsGroup.Any())
  2930. {
  2931. isGroup = true;
  2932. }
  2933. groupUid = dicCondition[tb_ord_order_master.CN_BRANCH_UID].ToString();
  2934. }
  2935. else
  2936. {
  2937. dicCondition[tb_ord_order_master.CN_BRANCH_UID] = branch_uid;
  2938. }
  2939. // 查詢條件 : 社團uid、分店uid?
  2940. QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
  2941. QueryJsonElement qjeMain = lBlocks.GetInst();
  2942. qjeMain.table = tb_ord_order_master.TABLENAME;
  2943. qjeMain.aliascols = new Dictionary<string, List<string>>
  2944. {
  2945. { tb_ord_order_master.CN_NAME, new List<string>() { "article_name"} },
  2946. };
  2947. qjeMain.displaycols = new List<string>() { tb_ord_order_master.CN_UID, tb_ord_order_master.CN_BRANCH_UID };
  2948. // 現貨訂單
  2949. List<WhereNode> lwMain = new List<WhereNode>();
  2950. lwMain.Add(new WhereNode(tb_ord_order_master.CN_TYPE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), (int)Enums.ArticleType.Stock));
  2951. lwMain.Add(new WhereNode(tb_ord_order_master.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), BLWording.STATUS_FLAG_ON));
  2952. lwMain.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Archive));
  2953. if (isGroup)
  2954. {
  2955. lwMain.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), groupUid));
  2956. }
  2957. else
  2958. {
  2959. lwMain.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_BRANCH_UID]));
  2960. }
  2961. qjeMain.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwMain.ToArray());
  2962. QueryJsonElement qjeProduct = lBlocks.GetInst();
  2963. qjeProduct.table = tb_prd_article2product.TABLENAME;
  2964. qjeProduct.jointype = QueryJsonElement.JOIN;
  2965. qjeProduct.jointable = qjeMain;
  2966. qjeProduct.joincols = new Dictionary<string, string>() {
  2967. { tb_prd_article2product.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
  2968. qjeProduct.displaycols = new List<string>() {
  2969. tb_prd_article2product.CN_QTY,
  2970. tb_prd_article2product.CN_NAME,
  2971. tb_prd_article2product.CN_PRICE,
  2972. tb_prd_article2product.CN_SEQ
  2973. };
  2974. qjeProduct.aliascols = new Dictionary<string, List<string>>
  2975. {
  2976. { tb_prd_article2product.CN_UID, new List<string>() { tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID } },
  2977. };
  2978. lBlocks.Add(qjeMain);
  2979. lBlocks.Add(qjeProduct);
  2980. sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRes);
  2981. if (sMsg != null)
  2982. {
  2983. break;
  2984. }
  2985. ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
  2986. List<StockModel> qds = ai.RunQueryList<StockModel>(cRes);
  2987. foreach (var order in qds)
  2988. {
  2989. order.specification = "";
  2990. }
  2991. // 封存訂單(訂單未取貨、退貨則視為現貨)
  2992. //List<WhereNode> lwMain2 = new List<WhereNode>();
  2993. //lwMain2.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Archive));
  2994. //if (isGroup)
  2995. //{
  2996. // lwMain2.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), groupUid));
  2997. //}
  2998. //else
  2999. //{
  3000. // lwMain2.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_BRANCH_UID]));
  3001. //}
  3002. //qjeMain2.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwMain2.ToArray());
  3003. //qjeMain2.displaycols = new List<string>() { tb_ord_order_master.CN_UID };
  3004. //QueryJsonElement qjeOrder = lBlocks.GetInst();
  3005. //qjeOrder.table = tb_ord_order_detail.TABLENAME;
  3006. //qjeOrder.jointype = QueryJsonElement.LEFT_JOIN;
  3007. //qjeOrder.jointable = qjeMain2;
  3008. //qjeOrder.joincols = new Dictionary<string, string>() {
  3009. // { tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
  3010. //qjeOrder.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_OR,
  3011. // new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.NotTake),
  3012. // new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.Taked),
  3013. // new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.Return),
  3014. // new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.Abandon));
  3015. //qjeOrder.displaycols = new List<string>() { tb_ord_order_detail.CN_SPECIFICATION };
  3016. //qjeOrder.aliascols = new Dictionary<string, List<string>>
  3017. // {
  3018. // { QueryJsonElement.SUM(tb_ord_order_detail.CN_ORDER_QTY), new List<string>() { "count" } },
  3019. // { QueryJsonElement.SUM(tb_ord_order_detail.CN_TAKE_QTY), new List<string>() { "soldCount" } }
  3020. // };
  3021. //QueryJsonElement qjeProduct2 = lBlocks.GetInst();
  3022. //qjeProduct2.table = tb_prd_article2product.TABLENAME;
  3023. //qjeProduct2.jointype = QueryJsonElement.LEFT_JOIN;
  3024. //qjeProduct2.jointable = qjeOrder;
  3025. //qjeProduct2.joincols = new Dictionary<string, string>() {
  3026. // { tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
  3027. //qjeProduct2.displaycols = new List<string>() {
  3028. // tb_prd_article2product.CN_NAME,
  3029. // tb_prd_article2product.CN_PRICE,
  3030. // tb_prd_article2product.CN_SEQ
  3031. // };
  3032. //qjeProduct2.aliascols = new Dictionary<string, List<string>>
  3033. // {
  3034. // { tb_prd_article2product.CN_UID, new List<string>() { tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID } },
  3035. // };
  3036. //qjeMain2.groupcols = new List<Tuple<QueryJsonElement, string>>
  3037. // {
  3038. // Tuple.Create(qjeMain2, tb_ord_order_master.CN_NAME),
  3039. // Tuple.Create(qjeMain2, tb_ord_order_master.CN_UID),
  3040. // Tuple.Create(qjeOrder, tb_ord_order_detail.CN_SPECIFICATION),
  3041. // Tuple.Create(qjeProduct2, tb_prd_article2product.CN_NAME),
  3042. // Tuple.Create(qjeProduct2, tb_prd_article2product.CN_PRICE),
  3043. // Tuple.Create(qjeProduct2, tb_prd_article2product.CN_UID),
  3044. // Tuple.Create(qjeProduct2, tb_prd_article2product.CN_SEQ)
  3045. // };
  3046. //lBlocks.Add(qjeMain2);
  3047. //lBlocks.Add(qjeOrder);
  3048. //lBlocks.Add(qjeProduct2);
  3049. //sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
  3050. //if (sMsg != null)
  3051. //{
  3052. // break;
  3053. //}
  3054. //ai = ArsenalDBMgr.GetInst(cRes);
  3055. //QueryDataSet qds2 = ai.RunQueryDataSet(cRes);
  3056. var qds2Model = new List<StockModel>() { };
  3057. //foreach (DataRow row in qds2.DATA.Tables[0].Rows)
  3058. //{
  3059. // var orderCount = Convert.ToInt32(row["count"]);
  3060. // var takeCount = Convert.ToInt32(row["soldCount"]);
  3061. // if (orderCount - takeCount > 0)
  3062. // {
  3063. // qds2Model.Add(new StockModel
  3064. // {
  3065. // uid = row[tb_ord_order_master.CN_UID].ToString(),
  3066. // article2product_uid = row[tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID].ToString(),
  3067. // article_name = row["article_name"].ToString(),
  3068. // name = row[tb_prd_article2product.CN_NAME].ToString(),
  3069. // price = Convert.ToInt32(row[tb_prd_article2product.CN_PRICE]),
  3070. // qty = Convert.ToInt32(row["count"]) - Convert.ToInt32(row["soldCount"]),
  3071. // seq = Convert.ToInt32(row[tb_prd_article2product.CN_SEQ]),
  3072. // specification = row[tb_ord_order_detail.CN_SPECIFICATION].ToString()
  3073. // });
  3074. // }
  3075. //}
  3076. // 進貨量 > 訂購量
  3077. lBlocks.Clear();
  3078. cRes = null;
  3079. QueryJsonElement qjeMain3 = lBlocks.GetInst();
  3080. qjeMain3.table = tb_ord_order_master.TABLENAME;
  3081. qjeMain3.displaycols = new List<string>() { tb_ord_order_master.CN_UID };
  3082. qjeMain3.aliascols = new Dictionary<string, List<string>>
  3083. {
  3084. { tb_ord_order_master.CN_NAME, new List<string>() { "article_name"} },
  3085. };
  3086. List<WhereNode> lwMain3 = new List<WhereNode>();
  3087. lwMain3.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Archive));
  3088. lwMain3.Add(new WhereNode(tb_ord_order_master.CN_TYPE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), (int)Enums.ArticleType.Article));
  3089. if (isGroup)
  3090. {
  3091. lwMain3.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), groupUid));
  3092. }
  3093. else
  3094. {
  3095. lwMain3.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_BRANCH_UID]?.ToString()));
  3096. }
  3097. qjeMain3.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwMain3.ToArray());
  3098. QueryJsonElement qjeDetail = lBlocks.GetInst();
  3099. qjeDetail.table = tb_ord_order_detail.TABLENAME;
  3100. qjeDetail.jointype = QueryJsonElement.LEFT_JOIN;
  3101. qjeDetail.jointable = qjeMain3;
  3102. qjeDetail.joincols = new Dictionary<string, string>() {
  3103. { tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
  3104. qjeDetail.displaycols = new List<string>() { tb_ord_order_detail.CN_SPECIFICATION };
  3105. qjeDetail.aliascols = new Dictionary<string, List<string>>
  3106. {
  3107. { QueryJsonElement.SUM(tb_ord_order_detail.CN_ORDER_QTY), new List<string>() { "count" } }
  3108. };
  3109. QueryJsonElement qjeProduct3 = lBlocks.GetInst();
  3110. qjeProduct3.table = tb_prd_article2product.TABLENAME;
  3111. qjeProduct3.jointype = QueryJsonElement.JOIN;
  3112. qjeProduct3.jointable = qjeDetail;
  3113. qjeProduct3.joincols = new Dictionary<string, string>() {
  3114. { tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
  3115. qjeProduct3.displaycols = new List<string>() {
  3116. tb_prd_article2product.CN_NAME,
  3117. tb_prd_article2product.CN_PRICE,
  3118. tb_prd_article2product.CN_SEQ
  3119. };
  3120. qjeProduct3.aliascols = new Dictionary<string, List<string>>
  3121. {
  3122. { tb_prd_article2product.CN_UID, new List<string>() { tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID } },
  3123. };
  3124. qjeMain3.groupcols = new List<Tuple<QueryJsonElement, string>>
  3125. {
  3126. Tuple.Create(qjeMain3, tb_ord_order_master.CN_NAME),
  3127. Tuple.Create(qjeMain3, tb_ord_order_master.CN_UID),
  3128. Tuple.Create(qjeDetail, tb_ord_order_detail.CN_SPECIFICATION),
  3129. Tuple.Create(qjeProduct3, tb_prd_article2product.CN_NAME),
  3130. Tuple.Create(qjeProduct3, tb_prd_article2product.CN_PRICE),
  3131. Tuple.Create(qjeProduct3, tb_prd_article2product.CN_UID),
  3132. Tuple.Create(qjeProduct3, tb_prd_article2product.CN_SEQ)
  3133. };
  3134. lBlocks.Add(qjeMain3);
  3135. lBlocks.Add(qjeDetail);
  3136. lBlocks.Add(qjeProduct3);
  3137. sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
  3138. if (sMsg != null)
  3139. {
  3140. break;
  3141. }
  3142. ai = ArsenalDBMgr.GetInst(cRes);
  3143. QueryDataSet qds3 = ai.RunQueryDataSet(cRes);
  3144. //List<string> lsOrderUID = new List<string>();
  3145. //foreach (DataRow row in qds3.DATA.Tables[0].Rows)
  3146. //{
  3147. // lsOrderUID.Add(row[tb_ord_order_master.CN_UID].ToString());
  3148. //}
  3149. //List<tb_ord_incoming_return_record> qdsRecord = new List<tb_ord_incoming_return_record>();
  3150. //var arrayCount = lsOrderUID.Count / 1500;
  3151. //for (var i = 0; i <= arrayCount; i++)
  3152. //{
  3153. // string[] slicedArray = lsOrderUID.Skip(i * 1500).Take(1500).ToArray();
  3154. // // 查詢進貨數量
  3155. // tb_ord_incoming_return_record cRecord = new tb_ord_incoming_return_record();
  3156. // cRecord.SetFullDirty();
  3157. // WhereNode wn = new WhereNode(tb_ord_incoming_return_record.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_incoming_return_record), slicedArray);
  3158. // Command cSelect = Command.SetupSelectCmd(cRecord, wn);
  3159. // ai = ArsenalDBMgr.GetInst(cSelect);
  3160. // qdsRecord.AddRange(ai.RunQueryList<tb_ord_incoming_return_record>(cSelect));
  3161. //}
  3162. List<tb_ord_incoming_return_record> qdsRecord = new List<tb_ord_incoming_return_record>();
  3163. {
  3164. lBlocks.Clear();
  3165. Command cInner = null;
  3166. QueryJsonElement qjeMain3_1 = lBlocks.GetInst();
  3167. qjeMain3_1.table = tb_ord_order_master.TABLENAME;
  3168. qjeMain3_1.displaycols = new List<string>() { tb_ord_order_master.CN_UID };
  3169. //qjeMain3_1.aliascols = new Dictionary<string, List<string>>
  3170. //{
  3171. // { tb_ord_order_master.CN_NAME, new List<string>() { "article_name"} },
  3172. //};
  3173. List<WhereNode> lwMain3_1 = new List<WhereNode>();
  3174. lwMain3_1.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Archive));
  3175. lwMain3_1.Add(new WhereNode(tb_ord_order_master.CN_TYPE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), (int)Enums.ArticleType.Article));
  3176. if (isGroup)
  3177. {
  3178. lwMain3_1.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), groupUid));
  3179. }
  3180. else
  3181. {
  3182. lwMain3_1.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_BRANCH_UID]?.ToString()));
  3183. }
  3184. qjeMain3_1.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwMain3_1.ToArray());
  3185. QueryJsonElement qjeDetail3_1 = lBlocks.GetInst();
  3186. qjeDetail3_1.table = tb_ord_order_detail.TABLENAME;
  3187. qjeDetail3_1.jointype = QueryJsonElement.LEFT_JOIN;
  3188. qjeDetail3_1.jointable = qjeMain3_1;
  3189. qjeDetail3_1.joincols = new Dictionary<string, string>() {
  3190. { tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
  3191. //qjeDetail3_1.displaycols = new List<string>() { tb_ord_order_detail.CN_SPECIFICATION };
  3192. //qjeDetail3_1.aliascols = new Dictionary<string, List<string>>
  3193. //{
  3194. // { QueryJsonElement.SUM(tb_ord_order_detail.CN_ORDER_QTY), new List<string>() { "count" } }
  3195. //};
  3196. QueryJsonElement qjeProduct3_1 = lBlocks.GetInst();
  3197. qjeProduct3_1.table = tb_prd_article2product.TABLENAME;
  3198. qjeProduct3_1.jointype = QueryJsonElement.JOIN;
  3199. qjeProduct3_1.jointable = qjeDetail3_1;
  3200. qjeProduct3_1.joincols = new Dictionary<string, string>() {
  3201. { tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
  3202. //qjeProduct3_1.displaycols = new List<string>() {
  3203. // tb_prd_article2product.CN_NAME,
  3204. // tb_prd_article2product.CN_PRICE,
  3205. // tb_prd_article2product.CN_SEQ
  3206. //};
  3207. //qjeProduct3_1.aliascols = new Dictionary<string, List<string>>
  3208. //{
  3209. // { tb_prd_article2product.CN_UID, new List<string>() { tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID } },
  3210. //};
  3211. qjeMain3_1.groupcols = new List<Tuple<QueryJsonElement, string>>
  3212. {
  3213. Tuple.Create(qjeMain3_1, tb_ord_order_master.CN_NAME),
  3214. Tuple.Create(qjeMain3_1, tb_ord_order_master.CN_UID),
  3215. Tuple.Create(qjeDetail3_1, tb_ord_order_detail.CN_SPECIFICATION),
  3216. Tuple.Create(qjeProduct3_1, tb_prd_article2product.CN_NAME),
  3217. Tuple.Create(qjeProduct3_1, tb_prd_article2product.CN_PRICE),
  3218. Tuple.Create(qjeProduct3_1, tb_prd_article2product.CN_UID),
  3219. Tuple.Create(qjeProduct3_1, tb_prd_article2product.CN_SEQ)
  3220. };
  3221. lBlocks.Add(qjeMain3_1);
  3222. lBlocks.Add(qjeDetail3_1);
  3223. lBlocks.Add(qjeProduct3_1);
  3224. sMsg = MakeSelectJoinByBlocks(lBlocks, out cInner);
  3225. if (sMsg != null)
  3226. {
  3227. break;
  3228. }
  3229. tb_ord_incoming_return_record cRecord = new tb_ord_incoming_return_record();
  3230. cRecord.SetFullDirty();
  3231. WhereNode wn = new WhereNode(tb_ord_incoming_return_record.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_INSQL, typeof(tb_ord_incoming_return_record), cInner);
  3232. Command cSelect = Command.SetupSelectCmd(cRecord, wn);
  3233. ai = ArsenalDBMgr.GetInst(cSelect);
  3234. qdsRecord.AddRange(ai.RunQueryList<tb_ord_incoming_return_record>(cSelect));
  3235. }
  3236. var groupItem = qdsRecord.GroupBy(x => new { x.article2product_uid, x.order_uid, x.operating, x.specification }).Select(x => new { order_uid = x.Key.order_uid, rticle2product_uid = x.Key.article2product_uid, specification = x.Key.specification, operating = x.Key.operating, qty = x.Sum(x => x.qty) }).ToDictionary(x=>Tuple.Create(x.operating,x.order_uid,x.rticle2product_uid,x.specification),x=>x);
  3237. qdsRecord = null;
  3238. foreach (DataRow row in qds3.DATA.Tables[0].Rows)
  3239. {
  3240. var article2productUID = row[tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID].ToString();
  3241. var specification = row[tb_ord_order_detail.CN_SPECIFICATION].ToString() == "" ? null : row[tb_ord_order_detail.CN_SPECIFICATION].ToString();
  3242. int incomeQty = 0, returnQty = 0;
  3243. var keyIncome = Tuple.Create((int)Enums.IncomingReturnOperating.Incoming, row[tb_ord_order_master.CN_UID].ToString(), article2productUID, specification);
  3244. var keyReturn = Tuple.Create((int)Enums.IncomingReturnOperating.Return, row[tb_ord_order_master.CN_UID].ToString(), article2productUID, specification);
  3245. if (groupItem.ContainsKey(keyIncome))
  3246. {
  3247. incomeQty = groupItem[keyIncome].qty;
  3248. }
  3249. if (groupItem.ContainsKey(keyReturn))
  3250. {
  3251. returnQty = groupItem[keyReturn].qty;
  3252. }
  3253. var orderCount = row["count"] is DBNull ? 0 : Convert.ToInt32(row["count"]);
  3254. if (incomeQty - returnQty - orderCount > 0)
  3255. {
  3256. qds2Model.Add(new StockModel
  3257. {
  3258. uid = row[tb_ord_order_master.CN_UID].ToString(),
  3259. article2product_uid = article2productUID,
  3260. article_name = row["article_name"].ToString(),
  3261. name = row[tb_prd_article2product.CN_NAME].ToString(),
  3262. price = Convert.ToInt32(row[tb_prd_article2product.CN_PRICE]),
  3263. qty = incomeQty - returnQty - orderCount,
  3264. seq = Convert.ToInt32(row[tb_prd_article2product.CN_SEQ]),
  3265. specification = row[tb_ord_order_detail.CN_SPECIFICATION].ToString()
  3266. });
  3267. }
  3268. }
  3269. lBlocks.Clear();
  3270. cRes = null;
  3271. QueryJsonElement qjeMain4 = lBlocks.GetInst();
  3272. qjeMain4.table = tb_ord_order_master.TABLENAME;
  3273. qjeMain4.aliascols = new Dictionary<string, List<string>>
  3274. {
  3275. { tb_ord_order_master.CN_NAME, new List<string>() { "article_name"} },
  3276. };
  3277. qjeMain4.displaycols = new List<string>() { tb_ord_order_master.CN_UID };
  3278. // 已到貨訂單 已取貨與退貨 order_qty > take_qty 當現貨
  3279. List<WhereNode> lwMain4 = new List<WhereNode>();
  3280. lwMain4.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Arrived));
  3281. lwMain4.Add(new WhereNode(tb_ord_order_master.CN_TYPE, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.ArticleType.Purchase));
  3282. if (isGroup)
  3283. {
  3284. lwMain4.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), groupUid));
  3285. }
  3286. else
  3287. {
  3288. lwMain4.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_BRANCH_UID]));
  3289. }
  3290. qjeMain4.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwMain4.ToArray());
  3291. QueryJsonElement qjeOrder2 = lBlocks.GetInst();
  3292. qjeOrder2.table = tb_ord_order_detail.TABLENAME;
  3293. qjeOrder2.jointype = QueryJsonElement.LEFT_JOIN;
  3294. qjeOrder2.jointable = qjeMain4;
  3295. qjeOrder2.joincols = new Dictionary<string, string>() {
  3296. { tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
  3297. qjeOrder2.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_OR,
  3298. new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.Taked),
  3299. new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.Return),
  3300. new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.Abandon));
  3301. qjeOrder2.aliascols = new Dictionary<string, List<string>>
  3302. {
  3303. { QueryJsonElement.SUM(tb_ord_order_detail.CN_ORDER_QTY), new List<string>() { "count" } },
  3304. { QueryJsonElement.SUM(tb_ord_order_detail.CN_TAKE_QTY), new List<string>() { "soldCount" } }
  3305. };
  3306. qjeOrder2.displaycols = new List<string>() { tb_ord_order_detail.CN_SPECIFICATION };
  3307. QueryJsonElement qjeProduct4 = lBlocks.GetInst();
  3308. qjeProduct4.table = tb_prd_article2product.TABLENAME;
  3309. qjeProduct4.jointype = QueryJsonElement.JOIN;
  3310. qjeProduct4.jointable = qjeOrder2;
  3311. qjeProduct4.joincols = new Dictionary<string, string>() {
  3312. { tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
  3313. qjeProduct4.displaycols = new List<string>() {
  3314. tb_prd_article2product.CN_NAME,
  3315. tb_prd_article2product.CN_PRICE,
  3316. tb_prd_article2product.CN_SEQ
  3317. };
  3318. qjeProduct4.aliascols = new Dictionary<string, List<string>>
  3319. {
  3320. { tb_prd_article2product.CN_UID, new List<string>() { tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID } },
  3321. };
  3322. qjeMain4.groupcols = new List<Tuple<QueryJsonElement, string>>
  3323. {
  3324. Tuple.Create(qjeMain4, tb_ord_order_master.CN_NAME),
  3325. Tuple.Create(qjeMain4, tb_ord_order_master.CN_UID),
  3326. Tuple.Create(qjeOrder2, tb_ord_order_detail.CN_SPECIFICATION),
  3327. Tuple.Create(qjeProduct4, tb_prd_article2product.CN_NAME),
  3328. Tuple.Create(qjeProduct4, tb_prd_article2product.CN_PRICE),
  3329. Tuple.Create(qjeProduct4, tb_prd_article2product.CN_UID),
  3330. Tuple.Create(qjeProduct4, tb_prd_article2product.CN_SEQ)
  3331. };
  3332. lBlocks.Add(qjeMain4);
  3333. lBlocks.Add(qjeOrder2);
  3334. lBlocks.Add(qjeProduct4);
  3335. sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
  3336. if (sMsg != null)
  3337. {
  3338. break;
  3339. }
  3340. ai = ArsenalDBMgr.GetInst(cRes);
  3341. QueryDataSet qds4 = ai.RunQueryDataSet(cRes);
  3342. foreach (DataRow row in qds4.DATA.Tables[0].Rows)
  3343. {
  3344. var orderCount = Convert.ToInt32(row["count"]);
  3345. var takeCount = Convert.ToInt32(row["soldCount"]);
  3346. if (orderCount - takeCount > 0)
  3347. {
  3348. qds2Model.Add(new StockModel
  3349. {
  3350. uid = row[tb_ord_order_master.CN_UID].ToString(),
  3351. article2product_uid = row[tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID].ToString(),
  3352. article_name = row["article_name"].ToString(),
  3353. name = row[tb_prd_article2product.CN_NAME].ToString(),
  3354. price = Convert.ToInt32(row[tb_prd_article2product.CN_PRICE]),
  3355. qty = Convert.ToInt32(row["count"]) - Convert.ToInt32(row["soldCount"]),
  3356. seq = Convert.ToInt32(row[tb_prd_article2product.CN_SEQ]),
  3357. specification = row[tb_ord_order_detail.CN_SPECIFICATION].ToString()
  3358. });
  3359. }
  3360. }
  3361. // 扣掉現場銷貨的現貨order_detail qty
  3362. lBlocks.Clear();
  3363. cRes = null;
  3364. QueryJsonElement qjeMain5 = lBlocks.GetInst();
  3365. qjeMain5.table = tb_ord_order_master.TABLENAME;
  3366. qjeMain5.aliascols = new Dictionary<string, List<string>>
  3367. {
  3368. { tb_ord_order_master.CN_NAME, new List<string>() { "article_name"} },
  3369. };
  3370. qjeMain5.displaycols = new List<string>() { tb_ord_order_master.CN_UID };
  3371. List<WhereNode> lwMain5 = new List<WhereNode>();
  3372. lwMain5.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Arrived));
  3373. lwMain5.Add(new WhereNode(tb_ord_order_master.CN_TYPE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), (int)Enums.ArticleType.Purchase));
  3374. if (isGroup)
  3375. {
  3376. lwMain5.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), groupUid));
  3377. }
  3378. else
  3379. {
  3380. lwMain5.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_BRANCH_UID]));
  3381. }
  3382. qjeMain5.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwMain5.ToArray());
  3383. QueryJsonElement qjeOrder5 = lBlocks.GetInst();
  3384. qjeOrder5.table = tb_ord_order_detail.TABLENAME;
  3385. qjeOrder5.jointype = QueryJsonElement.LEFT_JOIN;
  3386. qjeOrder5.jointable = qjeMain5;
  3387. qjeOrder5.joincols = new Dictionary<string, string>() {
  3388. { tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
  3389. qjeOrder5.aliascols = new Dictionary<string, List<string>>
  3390. {
  3391. { QueryJsonElement.SUM(tb_ord_order_detail.CN_ORDER_QTY), new List<string>() { "count" } },
  3392. { QueryJsonElement.SUM(tb_ord_order_detail.CN_TAKE_QTY), new List<string>() { "soldCount" } }
  3393. };
  3394. qjeOrder5.displaycols = new List<string>() { tb_ord_order_detail.CN_SPECIFICATION };
  3395. List<WhereNode> lwDetail5 = new List<WhereNode>();
  3396. lwDetail5.Add(new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.NotTake));
  3397. lwDetail5.Add(new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.Taked));
  3398. qjeOrder5.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_OR, lwDetail5.ToArray());
  3399. QueryJsonElement qjeProduct5 = lBlocks.GetInst();
  3400. qjeProduct5.table = tb_prd_article2product.TABLENAME;
  3401. qjeProduct5.jointype = QueryJsonElement.JOIN;
  3402. qjeProduct5.jointable = qjeOrder5;
  3403. qjeProduct5.joincols = new Dictionary<string, string>() {
  3404. { tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
  3405. qjeProduct5.displaycols = new List<string>() {
  3406. tb_prd_article2product.CN_NAME,
  3407. tb_prd_article2product.CN_PRICE,
  3408. tb_prd_article2product.CN_SEQ
  3409. };
  3410. qjeProduct5.aliascols = new Dictionary<string, List<string>>
  3411. {
  3412. { tb_prd_article2product.CN_UID, new List<string>() { tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID } },
  3413. };
  3414. qjeMain5.groupcols = new List<Tuple<QueryJsonElement, string>>
  3415. {
  3416. Tuple.Create(qjeMain5, tb_ord_order_master.CN_NAME),
  3417. Tuple.Create(qjeMain5, tb_ord_order_master.CN_UID),
  3418. Tuple.Create(qjeOrder5, tb_ord_order_detail.CN_SPECIFICATION),
  3419. Tuple.Create(qjeProduct5, tb_prd_article2product.CN_NAME),
  3420. Tuple.Create(qjeProduct5, tb_prd_article2product.CN_PRICE),
  3421. Tuple.Create(qjeProduct5, tb_prd_article2product.CN_UID),
  3422. Tuple.Create(qjeProduct5, tb_prd_article2product.CN_SEQ)
  3423. };
  3424. lBlocks.Add(qjeMain5);
  3425. lBlocks.Add(qjeOrder5);
  3426. lBlocks.Add(qjeProduct5);
  3427. sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
  3428. if (sMsg != null)
  3429. {
  3430. break;
  3431. }
  3432. ai = ArsenalDBMgr.GetInst(cRes);
  3433. QueryDataSet qds5 = ai.RunQueryDataSet(cRes);
  3434. foreach (DataRow row in qds5.DATA.Tables[0].Rows)
  3435. {
  3436. var orderCount = Convert.ToInt32(row["count"]);
  3437. if (orderCount > 0)
  3438. {
  3439. qds2Model.Add(new StockModel
  3440. {
  3441. uid = row[tb_ord_order_master.CN_UID].ToString(),
  3442. article2product_uid = row[tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID].ToString(),
  3443. article_name = row["article_name"].ToString(),
  3444. name = row[tb_prd_article2product.CN_NAME].ToString(),
  3445. price = Convert.ToInt32(row[tb_prd_article2product.CN_PRICE]),
  3446. qty = -Convert.ToInt32(row["count"]),
  3447. seq = Convert.ToInt32(row[tb_prd_article2product.CN_SEQ]),
  3448. specification = row[tb_ord_order_detail.CN_SPECIFICATION].ToString(),
  3449. });
  3450. }
  3451. }
  3452. var Data = from x in qds.Concat(qds2Model).GroupBy(x => new { x.article2product_uid, x.specification })
  3453. select new StockModel
  3454. {
  3455. uid = x.FirstOrDefault().uid,
  3456. article2product_uid = x.Key.article2product_uid,
  3457. specification = x.Key.specification,
  3458. article_name = x.Select(x => x.article_name).FirstOrDefault(),
  3459. name = x.Select(x => x.name).FirstOrDefault(),
  3460. price = x.FirstOrDefault().price,
  3461. qty = x.Sum(c => c.qty),
  3462. seq = x.FirstOrDefault().seq
  3463. };
  3464. finalData = Data.Where(x => x.qty > 0).ToList<StockModel>();
  3465. }
  3466. while (false);
  3467. return sMsg;
  3468. }
  3469. public CResponseMessage UpdateDetail(CRequestMessage i_crmInput)
  3470. {
  3471. string sMsg = null;
  3472. List<Command> lCmdUpdate = new List<Command>();
  3473. CResponseMessage crmRes = null;
  3474. ArsenalInterface ai = null;
  3475. try
  3476. {
  3477. do
  3478. {
  3479. JArray jaData = i_crmInput.param[BLWording.UPD_MASTER] as JArray;
  3480. var now = DateTime.Now;
  3481. foreach (JToken joData in jaData)
  3482. {
  3483. Dictionary<string, object> dicData = joData.ToObject<Dictionary<string, object>>();
  3484. var orderQty = Convert.ToInt32(dicData[tb_ord_order_detail.CN_ORDER_QTY]); // 為 detail.order_qty - detail.take_qty
  3485. var returnQty = Convert.ToInt32(dicData[tb_ord_order_detail.CN_ORDER_QTY + "_copy"]);
  3486. var isEaqual = orderQty == returnQty;
  3487. var jaMember = dicData["member"] as JArray;
  3488. var aMember = jaMember.Select(x => x.ToString()).ToArray();
  3489. JArray orderUID = dicData[tb_ord_order_detail.CN_ORDER_UID] as JArray;
  3490. var aOrderUid = orderUID.Select(x => x.ToString()).ToArray();
  3491. // 用article2product_uid + member_uid + order_uid 查詢order_detail
  3492. tb_ord_order_detail cOrder = new tb_ord_order_detail();
  3493. cOrder.SetDirty(tb_ord_order_detail.CN_UID, tb_ord_order_detail.CN_ORDER_UID, tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID, tb_ord_order_detail.CN_ORDER_QTY, tb_ord_order_detail.CN_MEMBER_UID,
  3494. tb_ord_order_detail.CN_TAKE_QTY, tb_ord_order_detail.CN_PRICE, tb_ord_order_detail.CN_COMMENT_UID, tb_ord_order_detail.CN_COMMENT_TIME, tb_ord_order_detail.CN_STATUS, tb_ord_order_detail.CN_SPECIFICATION);
  3495. List<WhereNode> lwWhereData = new List<WhereNode>();
  3496. lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), dicData[tb_ord_order_detail.CN_UID]));
  3497. lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.NotTake));
  3498. if (dicData.ContainsKey(tb_ord_order_detail.CN_SPECIFICATION))
  3499. {
  3500. if (dicData[tb_ord_order_detail.CN_SPECIFICATION] != "" && dicData[tb_ord_order_detail.CN_UID] != null)
  3501. {
  3502. lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_SPECIFICATION, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), dicData[tb_ord_order_detail.CN_SPECIFICATION]));
  3503. }
  3504. }
  3505. lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_detail), aOrderUid));
  3506. lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_MEMBER_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_detail), aMember));
  3507. Command cSelect = Command.SetupSelectCmd(cOrder, new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwWhereData.ToArray()));
  3508. ai = ArsenalDBMgr.GetInst(cSelect);
  3509. List<tb_ord_order_detail> qdsOrder = ai.RunQueryList<tb_ord_order_detail>(cSelect);
  3510. foreach (var order in qdsOrder.OrderBy(x => x.comment_time))
  3511. {
  3512. // 判斷數量
  3513. if (returnQty > 0)
  3514. {
  3515. var orderDetailQty = order.order_qty - order.take_qty;
  3516. var updateNum = returnQty >= orderDetailQty ? orderDetailQty : returnQty;
  3517. tb_ord_order_detail cDetail = new tb_ord_order_detail();
  3518. if (orderDetailQty == updateNum)
  3519. {
  3520. // 如果已經收過款退貨改新增一筆退貨 原訂單改已收款
  3521. if (order.take_qty > 0 && order.status == (int)Enums.OrderStatus.NotTake)
  3522. {
  3523. // 新增退貨訂單order
  3524. string sNewArticleUid = Guid.NewGuid().ToString();
  3525. tb_ord_order_detail cNew = new tb_ord_order_detail()
  3526. {
  3527. uid = sNewArticleUid,
  3528. order_uid = order.order_uid,
  3529. article2product_uid = order.article2product_uid,
  3530. member_uid = order.member_uid,
  3531. order_qty = updateNum,
  3532. take_qty = 0,
  3533. price = updateNum * order.price / order.order_qty,
  3534. status = (int)Enums.OrderStatus.Return,
  3535. comment_uid = order.comment_uid,
  3536. comment_time = order.comment_time,
  3537. operate_date = now,
  3538. specification = order.specification
  3539. };
  3540. cDetail.order_qty = order.order_qty - updateNum;
  3541. cDetail.price = (order.order_qty - updateNum) * order.price / order.order_qty;
  3542. cDetail.status = (int)Enums.OrderStatus.Taked;
  3543. cDetail.operate_date = now;
  3544. lCmdUpdate.Add(Command.SetupInsertCmd(cNew));
  3545. }
  3546. else
  3547. {
  3548. cDetail.status = (int)Enums.OrderStatus.Return;
  3549. cDetail.operate_date = now;
  3550. }
  3551. }
  3552. else
  3553. {
  3554. // 部分退則改變訂單量
  3555. cDetail.order_qty = order.order_qty - updateNum;
  3556. cDetail.price = (order.order_qty - updateNum) * order.price / order.order_qty;
  3557. // 新增退貨訂單order
  3558. string sNewArticleUid = Guid.NewGuid().ToString();
  3559. tb_ord_order_detail cNew = new tb_ord_order_detail()
  3560. {
  3561. uid = sNewArticleUid,
  3562. order_uid = order.order_uid,
  3563. article2product_uid = order.article2product_uid,
  3564. member_uid = order.member_uid,
  3565. order_qty = updateNum,
  3566. take_qty = 0,
  3567. price = updateNum * order.price / order.order_qty,
  3568. status = (int)Enums.OrderStatus.Return,
  3569. comment_uid = order.comment_uid,
  3570. comment_time = order.comment_time,
  3571. operate_date = now,
  3572. specification = order.specification
  3573. };
  3574. lCmdUpdate.Add(Command.SetupInsertCmd(cNew));
  3575. }
  3576. tb_ord_order_detail cDetailCon = new tb_ord_order_detail() { uid = order.uid };
  3577. lCmdUpdate.Add(Command.SetupUpdateCmd(cDetail, cDetailCon));
  3578. // 更新退貨次數
  3579. sMsg = getUpdateReturnCountCmd(order.member_uid, 1);
  3580. if (sMsg != null)
  3581. {
  3582. break;
  3583. }
  3584. returnQty -= updateNum;
  3585. }
  3586. }
  3587. }
  3588. if (lCmdUpdate.Any())
  3589. {
  3590. ai = ArsenalDBMgr.GetInst(lCmdUpdate[0], GetDefaultSystemColumnInfo());
  3591. ai.RunEditCmds(lCmdUpdate);
  3592. string sErrorCode = GetLastErrorCode(lCmdUpdate);
  3593. if (sErrorCode != null)
  3594. {
  3595. sMsg = sErrorCode;
  3596. break;
  3597. }
  3598. }
  3599. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  3600. }
  3601. while (false);
  3602. }
  3603. catch (Exception ex)
  3604. {
  3605. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  3606. sMsg = $"{nameof(UpdateDetail)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  3607. #if DEBUG
  3608. System.Diagnostics.Debug.WriteLine(sMsg);
  3609. #endif
  3610. }
  3611. if (null != sMsg)
  3612. {
  3613. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  3614. }
  3615. return crmRes;
  3616. }
  3617. public CResponseMessage GetStockPurchase(CRequestMessage i_crmInput)
  3618. {
  3619. string sMsg = null;
  3620. CResponseMessage crmRes = null;
  3621. ArsenalInterface ai = null;
  3622. try
  3623. {
  3624. do
  3625. {
  3626. Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput);
  3627. QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
  3628. QueryJsonElement qjeProduct = lBlocks.GetInst();
  3629. qjeProduct.table = tb_prd_article2product.TABLENAME;
  3630. qjeProduct.displaycols = new List<string>() {
  3631. tb_prd_article2product.CN_UID,
  3632. tb_prd_article2product.CN_SEQ,
  3633. tb_prd_article2product.CN_NAME,
  3634. tb_prd_article2product.CN_PRICE
  3635. };
  3636. qjeProduct.wherecols = new WhereNode(tb_prd_article2product.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_prd_article2product), dicCondition[tb_ord_order_master.CN_UID]);
  3637. QueryJsonElement qjeA = lBlocks.GetInst();
  3638. qjeA.table = tb_ord_order_master.TABLENAME;
  3639. qjeA.jointype = QueryJsonElement.JOIN;
  3640. qjeA.jointable = qjeProduct;
  3641. qjeA.joincols = new Dictionary<string, string>() {
  3642. { tb_ord_order_master.CN_UID,tb_prd_article2product.CN_ORDER_UID }};
  3643. qjeA.aliascols = new Dictionary<string, List<string>>
  3644. {
  3645. { tb_ord_order_master.CN_NAME, new List<string>() { "order_name"} }
  3646. };
  3647. QueryJsonElement qjeDetail = lBlocks.GetInst();
  3648. qjeDetail.table = tb_ord_purchase_detail.TABLENAME;
  3649. qjeDetail.jointype = QueryJsonElement.JOIN;
  3650. qjeDetail.jointable = qjeProduct;
  3651. qjeDetail.joincols = new Dictionary<string, string>() {
  3652. { tb_ord_purchase_detail.CN_ARTICLE2PRODUCT_UID,tb_prd_article2product.CN_UID }};
  3653. qjeDetail.aliascols = new Dictionary<string, List<string>>
  3654. {
  3655. { tb_ord_purchase_detail.CN_QTY, new List<string>() { tb_ord_order_detail.CN_ORDER_QTY} }
  3656. };
  3657. qjeDetail.displaycols = new List<string>() { tb_ord_purchase_detail.CN_QTY };
  3658. QueryJsonElement qjeMain = lBlocks.GetInst();
  3659. qjeMain.table = tb_ord_purchase.TABLENAME;
  3660. qjeMain.jointype = QueryJsonElement.JOIN;
  3661. qjeMain.jointable = qjeDetail;
  3662. qjeMain.joincols = new Dictionary<string, string>() {
  3663. { tb_ord_purchase.CN_UID,tb_ord_purchase_detail.CN_PURCHASE_UID }};
  3664. qjeMain.displaycols = new List<string>() { tb_ord_purchase.CN_MEMBER_UID };
  3665. QueryJsonElement qjeMember = lBlocks.GetInst();
  3666. qjeMember.table = tb_meb_member.TABLENAME;
  3667. qjeMember.jointype = QueryJsonElement.JOIN;
  3668. qjeMember.jointable = qjeMain;
  3669. qjeMember.joincols = new Dictionary<string, string>() {
  3670. { tb_meb_member.CN_UID,tb_ord_purchase.CN_MEMBER_UID }};
  3671. qjeMember.aliascols = new Dictionary<string, List<string>>
  3672. {
  3673. {tb_meb_member.CN_NAME , new List<string>() { "member_name"} }
  3674. };
  3675. lBlocks.Add(qjeProduct);
  3676. lBlocks.Add(qjeA);
  3677. lBlocks.Add(qjeDetail);
  3678. lBlocks.Add(qjeMain);
  3679. lBlocks.Add(qjeMember);
  3680. sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRes);
  3681. if (sMsg != null)
  3682. {
  3683. break;
  3684. }
  3685. ai = ArsenalDBMgr.GetInst(cRes);
  3686. List<OrderDetail> qds = ai.RunQueryList<OrderDetail>(cRes);
  3687. foreach (var data in qds)
  3688. {
  3689. data.status = (int)Enums.OrderStatus.Taked;
  3690. }
  3691. var groupData = qds.GroupBy(x => new { x.member_uid, x.member_name }).ToList();
  3692. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  3693. crmRes.param.Add(BLWording.DATA, groupData);
  3694. }
  3695. while (false);
  3696. }
  3697. catch (Exception ex)
  3698. {
  3699. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  3700. sMsg = $"{nameof(GetStockPurchase)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  3701. #if DEBUG
  3702. System.Diagnostics.Debug.WriteLine(sMsg);
  3703. #endif
  3704. }
  3705. if (null != sMsg)
  3706. {
  3707. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  3708. }
  3709. return crmRes;
  3710. }
  3711. public CResponseMessage AbandonOrder(CRequestMessage i_crmInput)
  3712. {
  3713. string sMsg = null;
  3714. List<Command> lCmdUpdate = new List<Command>();
  3715. CResponseMessage crmRes = null;
  3716. ArsenalInterface ai = null;
  3717. try
  3718. {
  3719. do
  3720. {
  3721. JArray jaData = i_crmInput.param[BLWording.UPD_MASTER] as JArray;
  3722. var abandonReason = i_crmInput.param.ContainsKey(tb_ord_order_detail.CN_ABANDON_REASON) ? i_crmInput.param[tb_ord_order_detail.CN_ABANDON_REASON]?.ToString() : null;
  3723. foreach (JToken joData in jaData)
  3724. {
  3725. Dictionary<string, object> dicData = joData.ToObject<Dictionary<string, object>>();
  3726. var orderQty = Convert.ToInt32(dicData[tb_ord_order_detail.CN_ORDER_QTY]); // 為 detail.order_qty - detail.take_qty
  3727. var returnQty = Convert.ToInt32(dicData[tb_ord_order_detail.CN_ORDER_QTY + "_copy"]);
  3728. var isEaqual = orderQty == returnQty;
  3729. var jaMember = dicData["member"] as JArray;
  3730. var aMember = jaMember.Select(x => x.ToString()).ToArray();
  3731. JArray orderUID = dicData[tb_ord_order_detail.CN_ORDER_UID] as JArray;
  3732. var aOrderUid = orderUID.Select(x => x.ToString()).ToArray();
  3733. // 用article2product_uid + member_uid + order_uid 查詢order_detail
  3734. tb_ord_order_detail cOrder = new tb_ord_order_detail();
  3735. cOrder.SetDirty(tb_ord_order_detail.CN_UID, tb_ord_order_detail.CN_ORDER_UID, tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID, tb_ord_order_detail.CN_ORDER_QTY, tb_ord_order_detail.CN_MEMBER_UID,
  3736. tb_ord_order_detail.CN_TAKE_QTY, tb_ord_order_detail.CN_PRICE, tb_ord_order_detail.CN_COMMENT_UID, tb_ord_order_detail.CN_COMMENT_TIME, tb_ord_order_detail.CN_SPECIFICATION);
  3737. List<WhereNode> lwWhereData = new List<WhereNode>();
  3738. lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), dicData[tb_ord_order_detail.CN_UID]));
  3739. lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.NotTake));
  3740. if (dicData.ContainsKey(tb_ord_order_detail.CN_SPECIFICATION))
  3741. {
  3742. if (dicData[tb_ord_order_detail.CN_SPECIFICATION] != "" && dicData[tb_ord_order_detail.CN_UID] != null)
  3743. {
  3744. lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_SPECIFICATION, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), dicData[tb_ord_order_detail.CN_SPECIFICATION]));
  3745. }
  3746. }
  3747. lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_detail), aOrderUid));
  3748. lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_MEMBER_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_detail), aMember));
  3749. Command cSelect = Command.SetupSelectCmd(cOrder, new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwWhereData.ToArray()));
  3750. ai = ArsenalDBMgr.GetInst(cSelect);
  3751. List<tb_ord_order_detail> qdsOrder = ai.RunQueryList<tb_ord_order_detail>(cSelect);
  3752. var now = DateTime.Now;
  3753. foreach (var order in qdsOrder.OrderBy(x => x.comment_time))
  3754. {
  3755. if (isEaqual)
  3756. {
  3757. // 全部棄單 => 將訂單狀態更改為棄單
  3758. tb_ord_order_detail orderDetail = new tb_ord_order_detail()
  3759. {
  3760. status = (int)Enums.OrderStatus.Abandon,
  3761. abandon_reason = abandonReason,
  3762. operate_date = now
  3763. };
  3764. tb_ord_order_detail orderDetailCon = new tb_ord_order_detail() { uid = order.uid };
  3765. lCmdUpdate.Add(Command.SetupUpdateCmd(orderDetail, orderDetailCon));
  3766. }
  3767. else
  3768. {
  3769. // 判斷數量
  3770. if (returnQty > 0)
  3771. {
  3772. var orderDetailQty = order.order_qty - order.take_qty;
  3773. var updateNum = returnQty >= orderDetailQty ? orderDetailQty : returnQty;
  3774. tb_ord_order_detail cDetail = new tb_ord_order_detail();
  3775. if (orderDetailQty == updateNum)
  3776. {
  3777. // 棄單量>=訂購量 => 全部棄
  3778. cDetail.status = (int)Enums.OrderStatus.Abandon;
  3779. cDetail.abandon_reason = abandonReason;
  3780. cDetail.operate_date = now;
  3781. }
  3782. else
  3783. {
  3784. // 更新原本訂單
  3785. cDetail.order_qty = order.order_qty - updateNum;
  3786. cDetail.price = (order.order_qty - updateNum) * order.price / order.order_qty;
  3787. // 新增棄單訂單order
  3788. string sNewArticleUid = Guid.NewGuid().ToString();
  3789. tb_ord_order_detail cNew = new tb_ord_order_detail()
  3790. {
  3791. uid = sNewArticleUid,
  3792. order_uid = order.order_uid,
  3793. article2product_uid = order.article2product_uid,
  3794. member_uid = order.member_uid,
  3795. order_qty = updateNum,
  3796. take_qty = 0,
  3797. price = updateNum * order.price / order.order_qty,
  3798. status = (int)Enums.OrderStatus.Abandon,
  3799. comment_uid = order.comment_uid,
  3800. comment_time = order.comment_time,
  3801. abandon_reason = abandonReason,
  3802. operate_date = now,
  3803. specification = order.specification
  3804. };
  3805. lCmdUpdate.Add(Command.SetupInsertCmd(cNew));
  3806. }
  3807. tb_ord_order_detail cDetailCon = new tb_ord_order_detail() { uid = order.uid };
  3808. lCmdUpdate.Add(Command.SetupUpdateCmd(cDetail, cDetailCon));
  3809. returnQty -= updateNum;
  3810. }
  3811. }
  3812. // 更新退貨次數
  3813. sMsg = getUpdateReturnCountCmd(order.member_uid, 1);
  3814. if (sMsg != null)
  3815. {
  3816. break;
  3817. }
  3818. }
  3819. }
  3820. if (lCmdUpdate.Any())
  3821. {
  3822. ai = ArsenalDBMgr.GetInst(lCmdUpdate[0], GetDefaultSystemColumnInfo());
  3823. ai.RunEditCmds(lCmdUpdate);
  3824. string sErrorCode = GetLastErrorCode(lCmdUpdate);
  3825. if (sErrorCode != null)
  3826. {
  3827. sMsg = sErrorCode;
  3828. break;
  3829. }
  3830. }
  3831. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  3832. }
  3833. while (false);
  3834. }
  3835. catch (Exception ex)
  3836. {
  3837. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  3838. sMsg = $"{nameof(AbandonOrder)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  3839. #if DEBUG
  3840. System.Diagnostics.Debug.WriteLine(sMsg);
  3841. #endif
  3842. }
  3843. if (null != sMsg)
  3844. {
  3845. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  3846. }
  3847. return crmRes;
  3848. }
  3849. public CResponseMessage CheckOutToOrder(CRequestMessage i_crmInput)
  3850. {
  3851. string sMsg = null;
  3852. List<Command> lCmdInsert = new List<Command>();
  3853. CResponseMessage crmRes = null;
  3854. ArsenalInterface ai = null;
  3855. try
  3856. {
  3857. do
  3858. {
  3859. JArray jaData = i_crmInput.param[BLWording.QRY_MASTER] as JArray;
  3860. Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput);
  3861. Dictionary<string, object> dicData = jaData[0][BLWording.DATA].ToObject<Dictionary<string, object>>();
  3862. JObject orderData = dicData["orderData"] as JObject;
  3863. JObject memberData = dicData["memberData"] as JObject;
  3864. var session = ProjectHelper.GetLoginUser(i_crmInput);
  3865. if (session == null)
  3866. {
  3867. sMsg = "Session error!!";
  3868. Logger.Error($"Session error!! i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ");
  3869. }
  3870. string receiveBranchUid = session.receive_branch_uid;
  3871. JArray detailData = dicData[BLWording.DATA] as JArray;
  3872. if (orderData.ContainsKey(tb_ord_order_master.CN_GROUP_UID))
  3873. {
  3874. if (orderData[tb_grp_branch.CN_UID].ToString() != receiveBranchUid)
  3875. {
  3876. sMsg = "請勿跨分店購買現貨";
  3877. break;
  3878. }
  3879. }
  3880. // 獲得該分店之現貨狀況
  3881. sMsg = GetFinalData(dicCondition, receiveBranchUid, out List<StockModel> finalData, out List<tb_grp_group> qdsGroup);
  3882. tb_grp_group cGroup = new tb_grp_group();
  3883. cGroup.SetDirty(tb_grp_group.CN_FB_GROUP_ID);
  3884. tb_grp_group cCon = new tb_grp_group()
  3885. {
  3886. uid = orderData[tb_ord_order_master.CN_GROUP_UID].ToString(),
  3887. };
  3888. Command cSelect = Command.SetupSelectCmd(cGroup, cCon);
  3889. ArsenalInterface ai2 = ArsenalDBMgr.GetInst(cSelect);
  3890. List<tb_grp_group> qdsGroupFBData = ai2.RunQueryList<tb_grp_group>(cSelect);
  3891. string memberUid = memberData != null ? memberData[tb_meb_member.CN_UID].ToString() : getAdditionalPurchaseMemberId(qdsGroupFBData[0].fb_group_id);
  3892. List<string> MasterUid = new List<string>();
  3893. foreach (JObject row in detailData)
  3894. {
  3895. Dictionary<string, object> dicInput = row.ToObject<Dictionary<string, object>>();
  3896. string article2productUid = dicInput[tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID].ToString();
  3897. int takeQty = Convert.ToInt32(dicInput[tb_ord_order_detail.CN_TAKE_QTY]);
  3898. int price = Convert.ToInt32(dicInput[tb_ord_order_detail.CN_PRICE]);
  3899. string specification = dicInput.ContainsKey(tb_ord_order_detail.CN_SPECIFICATION) ? dicInput[tb_ord_order_detail.CN_SPECIFICATION].ToString() : null;
  3900. // 比較該分店之現貨與欲購買現貨的數量
  3901. var comparedData = finalData.Where(x => x.article2product_uid == article2productUid && x.specification == specification);
  3902. if (!comparedData.Any())
  3903. {
  3904. Logger.Debug("商品uid =" + article2productUid + " 規格:" + specification);
  3905. sMsg = "分店無此現貨商品";
  3906. break;
  3907. }
  3908. if (takeQty > comparedData.FirstOrDefault().qty)
  3909. {
  3910. sMsg = "分店現貨商品的數量數量不足";
  3911. break;
  3912. }
  3913. string sNewOrderMasterUid = Guid.NewGuid().ToString();
  3914. MasterUid.Add(sNewOrderMasterUid);
  3915. tb_ord_order_master cMasterNew = new tb_ord_order_master()
  3916. {
  3917. uid = sNewOrderMasterUid,
  3918. type = 3,
  3919. name = dicInput["article_name"].ToString(),
  3920. order_code = new GROUP.Helper.FbHelper().GetOrderCode(),
  3921. group_uid = orderData.ContainsKey(tb_ord_order_master.CN_GROUP_UID) ? orderData[tb_ord_order_master.CN_GROUP_UID].ToString() : orderData[tb_grp_group.CN_UID].ToString(),
  3922. branch_uid = session.receive_branch_uid,
  3923. status = (int)OrderMainStatus.Arrived,
  3924. };
  3925. lCmdInsert.Add(Command.SetupInsertCmd(cMasterNew));
  3926. string sNewOrderDetailUid = Guid.NewGuid().ToString();
  3927. tb_ord_order_detail cNew = new tb_ord_order_detail()
  3928. {
  3929. uid = sNewOrderDetailUid,
  3930. order_uid = sNewOrderMasterUid,
  3931. article2product_uid = article2productUid,
  3932. member_uid = memberUid,
  3933. order_qty = takeQty,
  3934. take_qty = 0,
  3935. price = takeQty * price,
  3936. specification = specification == "" ? null : specification,
  3937. status = (int)Enums.OrderStatus.NotTake,
  3938. comment_time = DateTime.Now,
  3939. };
  3940. lCmdInsert.Add(Command.SetupInsertCmd(cNew));
  3941. }
  3942. if (sMsg != null)
  3943. {
  3944. break;
  3945. }
  3946. if (lCmdInsert.Any())
  3947. {
  3948. ai = ArsenalDBMgr.GetInst(lCmdInsert[0], GetDefaultSystemColumnInfo());
  3949. ai.RunEditCmds(lCmdInsert);
  3950. string sErrorCode = GetLastErrorCode(lCmdInsert);
  3951. if (sErrorCode != null)
  3952. {
  3953. sMsg = sErrorCode;
  3954. break;
  3955. }
  3956. }
  3957. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  3958. crmRes.param[BLWording.DATA] = MasterUid;
  3959. crmRes.param.Add("memberUid", memberUid);
  3960. }
  3961. while (false);
  3962. }
  3963. catch (Exception ex)
  3964. {
  3965. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  3966. sMsg = $"{nameof(CheckOutToOrder)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  3967. #if DEBUG
  3968. System.Diagnostics.Debug.WriteLine(sMsg);
  3969. #endif
  3970. }
  3971. if (null != sMsg)
  3972. {
  3973. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  3974. }
  3975. return crmRes;
  3976. }
  3977. public CResponseMessage QrcodeToPurchase(CRequestMessage i_crmInput)
  3978. {
  3979. string sMsg = null;
  3980. List<Command> lCmdInsert = new List<Command>();
  3981. List<Command> lCmdsDetail = new List<Command>();
  3982. List<Command> lCmdsUpdate = new List<Command>();
  3983. Command cRes = null;
  3984. CResponseMessage crmRes = null;
  3985. ArsenalInterface ai = null;
  3986. try
  3987. {
  3988. do
  3989. {
  3990. JArray jaData = i_crmInput.param[BLWording.UPD_MASTER] as JArray;
  3991. Dictionary<string, object> dicData = jaData[0][BLWording.DATA].ToObject<Dictionary<string, object>>();
  3992. JObject memberData = dicData["memberData"] as JObject;
  3993. string memberUid = memberData["member_uid"].ToString();
  3994. var addMainData = new List<tb_ord_purchase>();
  3995. var session = ProjectHelper.GetLoginUser(i_crmInput);
  3996. if (session == null)
  3997. {
  3998. sMsg = "Session error!!";
  3999. Logger.Error($"Session error!! i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ");
  4000. }
  4001. string receive_branch_uid = session.receive_branch_uid;
  4002. QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
  4003. QueryJsonElement qjeA = lBlocks.GetInst();
  4004. qjeA.table = tb_ord_order_detail.TABLENAME;
  4005. qjeA.displaycols = new List<string>()
  4006. {
  4007. tb_ord_order_detail.CN_UID,
  4008. tb_ord_order_detail.CN_ORDER_QTY,
  4009. tb_ord_order_detail.CN_TAKE_QTY,
  4010. tb_ord_order_detail.CN_STATUS,
  4011. tb_ord_order_detail.CN_MEMBER_UID,
  4012. tb_ord_order_detail.CN_SPECIFICATION,
  4013. tb_ord_order_detail.CN_COMMENT_TIME,
  4014. tb_ord_order_detail.CN_MEMO,
  4015. tb_ord_order_detail.CN_ORDER_UID
  4016. };
  4017. List<WhereNode> lswnMain = new List<WhereNode>();
  4018. lswnMain.Add(new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), (int)Enums.OrderStatus.NotTake));
  4019. if (lswnMain.Any())
  4020. {
  4021. qjeA.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMain.ToArray());
  4022. }
  4023. QueryJsonElement qjeMain = lBlocks.GetInst();
  4024. qjeMain.table = tb_ord_order_master.TABLENAME;
  4025. qjeMain.jointype = QueryJsonElement.LEFT_JOIN;
  4026. qjeMain.jointable = qjeA;
  4027. qjeMain.joincols = new Dictionary<string, string>() {
  4028. { tb_ord_order_master.CN_UID,tb_ord_order_detail.CN_ORDER_UID }};
  4029. qjeMain.displaycols = new List<string>()
  4030. {
  4031. tb_ord_order_master.CN_BRANCH_UID,
  4032. tb_ord_order_master.CN_ORDER_CODE
  4033. };
  4034. qjeMain.aliascols = new Dictionary<string, List<string>>
  4035. {
  4036. { tb_ord_order_master.CN_NAME, new List<string>() { "order_name" } }
  4037. };
  4038. QueryJsonElement qjeB = lBlocks.GetInst();
  4039. qjeB.table = tb_meb_member.TABLENAME;
  4040. qjeB.jointype = QueryJsonElement.LEFT_JOIN;
  4041. qjeB.jointable = qjeA;
  4042. qjeB.joincols = new Dictionary<string, string>() {
  4043. { tb_meb_member.CN_UID,tb_ord_order_detail.CN_MEMBER_UID }};
  4044. qjeB.displaycols = new List<string>()
  4045. {
  4046. tb_meb_member.CN_WPRICE_PAYMENT,
  4047. };
  4048. qjeB.aliascols = new Dictionary<string, List<string>>
  4049. {
  4050. { tb_meb_member.CN_NAME, new List<string>() { "member_name" } },
  4051. };
  4052. qjeB.wherecols = new WhereNode(tb_meb_member.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), memberUid);
  4053. QueryJsonElement qjeC = lBlocks.GetInst();
  4054. qjeC.table = tb_grp_branch.TABLENAME;
  4055. qjeC.jointype = QueryJsonElement.LEFT_JOIN;
  4056. qjeC.jointable = qjeMain;
  4057. qjeC.joincols = new Dictionary<string, string>() {
  4058. { tb_grp_branch.CN_UID,tb_ord_order_master.CN_BRANCH_UID }};
  4059. qjeC.displaycols = new List<string>() { tb_grp_branch.CN_BRANCH_NAME };
  4060. qjeC.wherecols = new WhereNode(tb_grp_branch.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_branch), receive_branch_uid);
  4061. QueryJsonElement qjeD = lBlocks.GetInst();
  4062. qjeD.table = tb_prd_article2product.TABLENAME;
  4063. qjeD.jointype = QueryJsonElement.JOIN;
  4064. qjeD.jointable = qjeA;
  4065. qjeD.joincols = new Dictionary<string, string>() {
  4066. { tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
  4067. qjeD.displaycols = new List<string>() {
  4068. tb_prd_article2product.CN_NAME,
  4069. tb_prd_article2product.CN_PRICE,
  4070. tb_prd_article2product.CN_WHOLESALE_PRICE,
  4071. tb_prd_article2product.CN_SEQ
  4072. };
  4073. qjeD.aliascols = new Dictionary<string, List<string>>
  4074. {
  4075. { tb_prd_article2product.CN_UID, new List<string>() { "article2product_uid" } },
  4076. };
  4077. QueryJsonElement qjeE = lBlocks.GetInst();
  4078. qjeE.table = tb_grp_article.TABLENAME;
  4079. qjeE.jointype = QueryJsonElement.LEFT_JOIN;
  4080. qjeE.jointable = qjeD;
  4081. qjeE.joincols = new Dictionary<string, string>() {
  4082. { tb_grp_article.CN_UID,tb_prd_article2product.CN_ARTICLE_UID }};
  4083. qjeE.aliascols = new Dictionary<string, List<string>>
  4084. {
  4085. { tb_grp_article.CN_NAME, new List<string>() { "article_name" } },
  4086. };
  4087. qjeE.displaycols = new List<string>() { tb_grp_article.CN_DUTYFREE, };
  4088. lBlocks.Add(qjeA);
  4089. lBlocks.Add(qjeMain);
  4090. lBlocks.Add(qjeB);
  4091. lBlocks.Add(qjeC);
  4092. lBlocks.Add(qjeD);
  4093. lBlocks.Add(qjeE);
  4094. sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
  4095. if (sMsg != null)
  4096. {
  4097. break;
  4098. }
  4099. ai = ArsenalDBMgr.GetInst(cRes);
  4100. var qds = ai.RunQueryList<OrderDetail>(cRes);
  4101. var pro = qds.GroupBy(x => new { x.uid, x.order_uid, x.branch_uid, x.branch_name, x.status, x.specification })
  4102. .Select(x => new OrderDetail
  4103. {
  4104. order_qty = x.Sum(c => c.order_qty),
  4105. take_qty = x.Sum(c => c.take_qty),
  4106. price = x.Select(x => x.price).FirstOrDefault(),
  4107. wholesale_price = x.Select(x => x.wholesale_price).FirstOrDefault(),
  4108. specification = x.Key.specification,
  4109. uid = x.Key.uid,
  4110. order_uid = x.Key.order_uid,
  4111. seq = x.Select(x => x.seq).FirstOrDefault(),
  4112. name = x.Select(x => x.name).FirstOrDefault(),
  4113. member_uid = x.Select(x => x.member_uid).FirstOrDefault(),
  4114. member_name = x.Select(x => x.member_name).FirstOrDefault(),
  4115. status = x.Key.status,
  4116. article_name = x.Select(x => x.article_name).FirstOrDefault(),
  4117. order_name = x.Select(x => x.order_name).FirstOrDefault(),
  4118. memo = x.Select(x => x.memo).FirstOrDefault(),
  4119. branch_uid = x.Key.branch_uid,
  4120. branch_name = x.Key.branch_name,
  4121. comment_time = x.Select(x => x.comment_time).FirstOrDefault(),
  4122. wprice_payment = x.Select(x => x.wprice_payment).FirstOrDefault(),
  4123. article2product_uid = x.FirstOrDefault().article2product_uid,
  4124. dutyfree = x.FirstOrDefault()?.dutyfree
  4125. });
  4126. var memberUID = memberUid;
  4127. var purchaseUID = addMainData.Any() ? addMainData.Select(x => x.uid).SingleOrDefault() : Guid.NewGuid().ToString();
  4128. var amount = 0;
  4129. foreach (var detail in pro)
  4130. {
  4131. // 新增收款明細
  4132. var price = detail.wprice_payment == 0 ? detail.price : detail.wholesale_price;
  4133. tb_ord_purchase_detail cDeatil = new tb_ord_purchase_detail()
  4134. {
  4135. purchase_uid = purchaseUID,
  4136. branch_uid = receive_branch_uid,
  4137. order_detail_uid = detail.uid,
  4138. article2product_uid = detail.article2product_uid,
  4139. qty = detail.order_qty - detail.take_qty,
  4140. amount = (detail.order_qty - detail.take_qty) * price,
  4141. specification = detail.specification
  4142. };
  4143. lCmdsDetail.Add(Command.SetupInsertCmd(cDeatil));
  4144. amount = cDeatil.amount;
  4145. lCmdsUpdate.Add(Command.SetupUpdateCmd(new tb_ord_order_detail()
  4146. {
  4147. status = (int)Enums.OrderStatus.Taked,
  4148. take_qty = cDeatil.qty + detail.take_qty,
  4149. operate_date = DateTime.Now
  4150. }
  4151. , new tb_ord_order_detail() { uid = detail.uid }));
  4152. if (addMainData.Any(x => x.member_uid == memberUID))
  4153. {
  4154. var model = addMainData.Where(x => x.member_uid == memberUID).SingleOrDefault();
  4155. model.amount += amount;
  4156. }
  4157. else
  4158. {
  4159. tb_ord_purchase cNew = new tb_ord_purchase()
  4160. {
  4161. uid = purchaseUID,
  4162. member_uid = memberUID,
  4163. amount = amount,
  4164. receive_branch_uid = receive_branch_uid
  4165. };
  4166. addMainData.Add(cNew);
  4167. }
  4168. }
  4169. foreach (var mainData in addMainData)
  4170. {
  4171. lCmdInsert.Add(Command.SetupInsertCmd(mainData));
  4172. tb_meb_shopping_points_record cPointsNew = new tb_meb_shopping_points_record()
  4173. {
  4174. uid = Guid.NewGuid().ToString(),
  4175. member_uid = mainData.member_uid,
  4176. amount = (int)(mainData.amount / 100),
  4177. purchase_uid = mainData.uid
  4178. };
  4179. lCmdInsert.Add(Command.SetupInsertCmd(cPointsNew));
  4180. }
  4181. lCmdInsert.AddRange(lCmdsDetail);
  4182. lCmdInsert.AddRange(lCmdsUpdate);
  4183. if (lCmdInsert.Any())
  4184. {
  4185. ArsenalInterface ai2 = ArsenalDBMgr.GetInst(lCmdInsert[0], GetDefaultSystemColumnInfo());
  4186. ai2.RunEditCmds(lCmdInsert);
  4187. string sErrorCode = GetLastErrorCode(lCmdInsert);
  4188. if (sErrorCode != null)
  4189. {
  4190. sMsg = sErrorCode;
  4191. break;
  4192. }
  4193. }
  4194. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  4195. crmRes.param.Add(BLWording.DATA, pro);
  4196. }
  4197. while (false);
  4198. }
  4199. catch (Exception ex)
  4200. {
  4201. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  4202. sMsg = $"{nameof(CheckOutToOrder)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  4203. #if DEBUG
  4204. System.Diagnostics.Debug.WriteLine(sMsg);
  4205. #endif
  4206. }
  4207. if (null != sMsg)
  4208. {
  4209. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  4210. }
  4211. return crmRes;
  4212. }
  4213. public CResponseMessage ReturnArchiveOrder(CRequestMessage i_crmInput)
  4214. {
  4215. string sMsg = null;
  4216. List<Command> lCmdUpdate = new List<Command>();
  4217. CResponseMessage crmRes = null;
  4218. ArsenalInterface ai = null;
  4219. try
  4220. {
  4221. do
  4222. {
  4223. sMsg = getCommonParameter(i_crmInput, BLWording.UPD_MASTER, out JArray jaDataArray, out tb_sys_session sUserSession);
  4224. JArray dataArray = jaDataArray[0]["data"] as JArray;
  4225. foreach (JToken joData in dataArray)
  4226. {
  4227. Dictionary<string, object> dicData = joData.ToObject<Dictionary<string, object>>();
  4228. string orderUID = dicData[tb_ord_order_master.CN_UID].ToString();
  4229. // 用article2product_uid + member_uid + order_uid 查詢order_detail
  4230. tb_ord_order_detail cOrder = new tb_ord_order_detail();
  4231. cOrder.SetFullDirty();
  4232. List<WhereNode> lwWhereData = new List<WhereNode>();
  4233. lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), orderUID));
  4234. Command cSelect = Command.SetupSelectCmd(cOrder, new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwWhereData.ToArray()));
  4235. ai = ArsenalDBMgr.GetInst(cSelect);
  4236. List<tb_ord_order_detail> qdsOrder = ai.RunQueryList<tb_ord_order_detail>(cSelect);
  4237. bool isArrived = false;
  4238. foreach (var order in qdsOrder)
  4239. {
  4240. int stock = GetOrderProductStock(order.order_uid, order.article2product_uid, order.specification);
  4241. if (stock > 0)
  4242. {
  4243. isArrived = true;
  4244. }
  4245. // 將原本轉退貨的訂單轉回已到貨
  4246. if (order.status == (int)Enums.OrderStatus.Return && order.take_qty == 0)
  4247. {
  4248. tb_ord_order_detail upOrderDetail = new tb_ord_order_detail()
  4249. {
  4250. status = (int)Enums.OrderStatus.NotTake,
  4251. operate_date = null
  4252. };
  4253. tb_ord_order_detail upOrderDetailCon = new tb_ord_order_detail() { uid = order.uid };
  4254. lCmdUpdate.Add(Command.SetupUpdateCmd(upOrderDetail, upOrderDetailCon));
  4255. sMsg = getUpdateReturnCountCmd(order.member_uid, -1);
  4256. if (sMsg != null)
  4257. {
  4258. break;
  4259. }
  4260. }
  4261. }
  4262. tb_ord_order_master upData = new tb_ord_order_master() { status = isArrived ? (int)Enums.OrderMainStatus.Arrived : (int)Enums.OrderMainStatus.NotArrived };
  4263. tb_ord_order_master upCon = new tb_ord_order_master() { uid = orderUID };
  4264. lCmdUpdate.Add(Command.SetupUpdateCmd(upData, upCon));
  4265. }
  4266. if (lCmdUpdate.Any())
  4267. {
  4268. ai = ArsenalDBMgr.GetInst(lCmdUpdate[0], GetDefaultSystemColumnInfo());
  4269. ai.RunEditCmds(lCmdUpdate);
  4270. string sErrorCode = GetLastErrorCode(lCmdUpdate);
  4271. if (sErrorCode != null)
  4272. {
  4273. sMsg = sErrorCode;
  4274. break;
  4275. }
  4276. }
  4277. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  4278. }
  4279. while (false);
  4280. }
  4281. catch (Exception ex)
  4282. {
  4283. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  4284. sMsg = $"{nameof(ReturnArchiveOrder)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  4285. #if DEBUG
  4286. System.Diagnostics.Debug.WriteLine(sMsg);
  4287. #endif
  4288. }
  4289. if (null != sMsg)
  4290. {
  4291. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  4292. }
  4293. return crmRes;
  4294. }
  4295. public static string getAdditionalPurchaseMemberId(string groupId)
  4296. {
  4297. tb_meb_member cMember = new tb_meb_member();
  4298. cMember.SetDirty(tb_meb_member.CN_UID);
  4299. tb_meb_member cCon = new tb_meb_member()
  4300. {
  4301. name = "現貨銷售",
  4302. group_id = groupId
  4303. };
  4304. Command cSelect = Command.SetupSelectCmd(cMember, cCon);
  4305. ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
  4306. List<tb_meb_member> qdsMember = ai.RunQueryList<tb_meb_member>(cSelect);
  4307. return qdsMember[0].uid;
  4308. }
  4309. public string getUpdateReturnCountCmd(string memberUid, int count)
  4310. {
  4311. string sMsg = null;
  4312. tb_meb_member cMember = new tb_meb_member();
  4313. cMember.SetDirty(tb_meb_member.CN_RETURN_COUNT);
  4314. tb_meb_member cCon = new tb_meb_member()
  4315. {
  4316. uid = memberUid
  4317. };
  4318. Command cSelect = Command.SetupSelectCmd(cMember, cCon);
  4319. ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
  4320. List<tb_meb_member> qdsMember = ai.RunQueryList<tb_meb_member>(cSelect);
  4321. if (qdsMember.Count < 1)
  4322. {
  4323. return null;
  4324. }
  4325. Command cCmd = Command.SetupUpdateCmd(new tb_meb_member()
  4326. {
  4327. return_count = qdsMember[0].return_count + count
  4328. }
  4329. , new tb_meb_member() { uid = memberUid });
  4330. ai = ArsenalDBMgr.GetInst(cCmd, GetDefaultSystemColumnInfo());
  4331. ai.RunEditSingleCmd(cCmd);
  4332. string sErrorCode = GetLastErrorCode(cCmd);
  4333. if (sErrorCode != null)
  4334. {
  4335. sMsg = sErrorCode;
  4336. }
  4337. return sMsg;
  4338. }
  4339. public CResponseMessage GetOrders(CRequestMessage i_crmInput)
  4340. {
  4341. string sMsg;
  4342. Command cRes = null;
  4343. CResponseMessage crmRes = null;
  4344. try
  4345. {
  4346. do
  4347. {
  4348. sMsg = getCommonParameter(i_crmInput, BLWording.QRY_MASTER, out JArray jaDataArray, out tb_sys_session sUserSession, false);
  4349. if (sMsg != null)
  4350. {
  4351. break;
  4352. }
  4353. Dictionary<string, string> dicCondition = GetQueryMasterFirstQJEDicwherecols(i_crmInput); // 取得condition
  4354. var lsBranch = ProjectHelper.GetUserGroup(i_crmInput);
  4355. var userBranch = ProjectHelper.GetUserBranch(i_crmInput);
  4356. QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
  4357. bool isGroup = false;
  4358. QueryJsonElement qjeMain = lBlocks.GetInst();
  4359. qjeMain.table = tb_ord_order_master.TABLENAME;
  4360. qjeMain.displaycols = new List<string>() {
  4361. tb_ord_order_master.CN_UID,
  4362. tb_ord_order_master.CN_TYPE,
  4363. tb_ord_order_master.CN_ORDER_CODE,
  4364. tb_ord_order_master.CN_STATUS,
  4365. tb_ord_order_master.CN_CREATE_DATE,
  4366. tb_ord_order_master.CN_GROUP_UID,
  4367. tb_ord_order_master.CN_BRANCH_UID,
  4368. tb_ord_order_master.CN_ARRIVED_DATE,
  4369. tb_ord_order_master.CN_ARTICLE_UID,
  4370. tb_ord_order_master.CN_NAME
  4371. };
  4372. List<WhereNode> lswnMain = new List<WhereNode>();
  4373. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_TYPE, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.ArticleType.Purchase));
  4374. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), BLWording.STATUS_FLAG_ON));
  4375. if (dicCondition.ContainsKey(tb_ord_order_master.CN_CREATE_DATE + "_start"))
  4376. {
  4377. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_CREATE_DATE, WhereNode.EColumnOperation.EOT_GTEQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_CREATE_DATE + "_start"]));
  4378. }
  4379. if (dicCondition.ContainsKey(tb_ord_order_master.CN_CREATE_DATE + "_end"))
  4380. {
  4381. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_CREATE_DATE, WhereNode.EColumnOperation.EOT_LT, typeof(tb_ord_order_master), Convert.ToDateTime(dicCondition[tb_ord_order_master.CN_CREATE_DATE + "_end"]).AddDays(1)));
  4382. }
  4383. if (dicCondition.ContainsKey(tb_ord_order_master.CN_STATUS))
  4384. {
  4385. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_STATUS]));
  4386. }
  4387. else
  4388. {
  4389. // 扣除封存訂單
  4390. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Archive));
  4391. }
  4392. if (dicCondition.ContainsKey(tb_ord_order_master.CN_ORDER_CODE))
  4393. {
  4394. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_ORDER_CODE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_ORDER_CODE]));
  4395. }
  4396. if (dicCondition.ContainsKey(tb_ord_order_master.CN_ARRIVED_DATE + "_start"))
  4397. {
  4398. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_ARRIVED_DATE, WhereNode.EColumnOperation.EOT_GTEQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_ARRIVED_DATE + "_start"]));
  4399. }
  4400. if (dicCondition.ContainsKey(tb_ord_order_master.CN_ARRIVED_DATE + "_end"))
  4401. {
  4402. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_ARRIVED_DATE, WhereNode.EColumnOperation.EOT_LT, typeof(tb_ord_order_master), Convert.ToDateTime(dicCondition[tb_ord_order_master.CN_ARRIVED_DATE + "_end"]).AddDays(1)));
  4403. }
  4404. if (dicCondition.ContainsKey(tb_ord_order_master.CN_UID))
  4405. {
  4406. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_UID]));
  4407. }
  4408. List<WhereNode> lswnGroup = new List<WhereNode>();
  4409. if (dicCondition.ContainsKey(tb_ord_order_master.CN_GROUP_UID))
  4410. {
  4411. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_GROUP_UID]));
  4412. }
  4413. else if (dicCondition.ContainsKey("GroupOrBranch_uid")) // 處理shopping list 搜尋選項 uid 有可能是branch or group
  4414. {
  4415. tb_grp_group cGroup = new tb_grp_group();
  4416. cGroup.SetFullDirty();
  4417. WhereNode wnGroup = new WhereNode(tb_grp_group.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group), dicCondition["GroupOrBranch_uid"].ToString());
  4418. Command gSelect = Command.SetupSelectCmd(cGroup, wnGroup);
  4419. ArsenalInterface aiGroup = ArsenalDBMgr.GetInst(gSelect);
  4420. var qdsGroup = aiGroup.RunQueryList<tb_grp_group>(gSelect);
  4421. if (qdsGroup.Any())
  4422. {
  4423. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition["GroupOrBranch_uid"].ToString()));
  4424. isGroup = true;
  4425. }
  4426. }
  4427. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_master), lsBranch.ToArray()));
  4428. if (dicCondition.ContainsKey(tb_ord_order_master.CN_BRANCH_UID))
  4429. {
  4430. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_BRANCH_UID].ToString()));
  4431. }
  4432. else if (dicCondition.ContainsKey("GroupOrBranch_uid") && !isGroup)
  4433. {
  4434. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition["GroupOrBranch_uid"].ToString()));
  4435. }
  4436. else
  4437. {
  4438. lswnMain.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_master), userBranch.ToArray()));
  4439. }
  4440. if (lswnMain.Any())
  4441. {
  4442. qjeMain.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMain.ToArray());
  4443. }
  4444. QueryJsonElement qjeOrder = lBlocks.GetInst();
  4445. qjeOrder.table = tb_ord_order_detail.TABLENAME;
  4446. qjeOrder.jointype = QueryJsonElement.LEFT_JOIN;
  4447. qjeOrder.jointable = qjeMain;
  4448. qjeOrder.joincols = new Dictionary<string, string>() {
  4449. { tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
  4450. qjeOrder.displaycols = new List<string>() {
  4451. tb_ord_order_detail.CN_ORDER_QTY,
  4452. tb_ord_order_detail.CN_TAKE_QTY,
  4453. };
  4454. qjeOrder.aliascols = new Dictionary<string, List<string>>
  4455. {
  4456. { tb_ord_order_detail.CN_STATUS, new List<string>() { "detail_status" } },
  4457. //{ QueryJsonElement.SUM(tb_ord_order_detail.CN_ORDER_QTY), new List<string>() { "count" } },
  4458. //{ QueryJsonElement.SUM(tb_ord_order_detail.CN_TAKE_QTY), new List<string>() { "soldCount" } },
  4459. };
  4460. QueryJsonElement qjeGroup = lBlocks.GetInst();
  4461. qjeGroup.table = tb_grp_group.TABLENAME;
  4462. qjeGroup.jointype = QueryJsonElement.LEFT_JOIN;
  4463. qjeGroup.jointable = qjeMain;
  4464. qjeGroup.joincols = new Dictionary<string, string>() {
  4465. { tb_grp_group.CN_UID,tb_ord_order_master.CN_GROUP_UID }};
  4466. QueryJsonElement qjeBranch = lBlocks.GetInst();
  4467. qjeBranch = lBlocks.GetInst();
  4468. qjeBranch.table = tb_grp_branch.TABLENAME;
  4469. qjeBranch.jointype = QueryJsonElement.LEFT_JOIN;
  4470. qjeBranch.jointable = qjeMain;
  4471. qjeBranch.joincols = new Dictionary<string, string>() {
  4472. { tb_grp_branch.CN_UID,tb_ord_order_master.CN_BRANCH_UID }};
  4473. qjeBranch.displaycols = new List<string>() { tb_grp_branch.CN_BRANCH_NAME };
  4474. QueryJsonElement qjeArticleProduct = lBlocks.GetInst();
  4475. qjeArticleProduct.table = tb_prd_article2product.TABLENAME;
  4476. qjeArticleProduct.jointype = QueryJsonElement.LEFT_JOIN;
  4477. qjeArticleProduct.jointable = qjeOrder;
  4478. qjeArticleProduct.joincols = new Dictionary<string, string>() {
  4479. { tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
  4480. qjeArticleProduct.displaycols = new List<string>() {
  4481. tb_prd_article2product.CN_PRICE
  4482. };
  4483. if (dicCondition.ContainsKey(tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID))
  4484. {
  4485. qjeArticleProduct.wherecols = new WhereNode(tb_prd_article2product.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_prd_article2product), dicCondition[tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID].ToString());
  4486. }
  4487. //qjeArticleProduct.groupcols = new List<Tuple<QueryJsonElement, string>>
  4488. //{
  4489. // Tuple.Create(qjeMain, tb_ord_order_master.CN_UID),
  4490. // Tuple.Create(qjeMain, tb_ord_order_master.CN_ARTICLE_UID),
  4491. // Tuple.Create(qjeMain, tb_ord_order_master.CN_TYPE),
  4492. // Tuple.Create(qjeMain,tb_ord_order_master.CN_STATUS),
  4493. // Tuple.Create(qjeMain, tb_ord_order_master.CN_CREATE_DATE),
  4494. // Tuple.Create(qjeMain, tb_ord_order_master.CN_ORDER_CODE),
  4495. // Tuple.Create(qjeMain, tb_ord_order_master.CN_BRANCH_UID),
  4496. // Tuple.Create(qjeMain, tb_ord_order_master.CN_ARRIVED_DATE),
  4497. // Tuple.Create(qjeMain, tb_grp_branch.CN_GROUP_UID),
  4498. // Tuple.Create(qjeMain, tb_grp_article.CN_NAME),
  4499. // Tuple.Create(qjeBranch, tb_grp_branch.CN_BRANCH_NAME),
  4500. // Tuple.Create(qjeArticleProduct, tb_prd_article2product.CN_PRICE)
  4501. //};
  4502. lBlocks.Add(qjeMain);
  4503. lBlocks.Add(qjeOrder);
  4504. lBlocks.Add(qjeGroup);
  4505. lBlocks.Add(qjeBranch);
  4506. lBlocks.Add(qjeArticleProduct);
  4507. sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
  4508. if (sMsg != null)
  4509. {
  4510. break;
  4511. }
  4512. ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
  4513. var qds = ai.RunQueryList<OrderDetailEx>(cRes);
  4514. var groupData = qds.GroupBy(x => x.uid).ToList();
  4515. var res = new List<OrderMaster>();
  4516. foreach (var data in groupData)
  4517. {
  4518. var model = new OrderMaster()
  4519. {
  4520. uid = data.Key,
  4521. article_uid = data.Select(x => x.article_uid).FirstOrDefault(),
  4522. order_code = data.Select(x => x.order_code).FirstOrDefault(),
  4523. group_uid = data.Select(x => x.group_uid).FirstOrDefault(),
  4524. branch_uid = data.Select(x => x.branch_uid).FirstOrDefault(),
  4525. branch_name = data.Select(x => x.branch_name).FirstOrDefault(),
  4526. name = data.Select(x => x.type).FirstOrDefault() == (int)Enums.ArticleType.Stock ? string.Format("【現貨】{0}", data.Select(x => x.name).FirstOrDefault()) : data.Select(x => x.name).FirstOrDefault(),
  4527. create_date = data.Select(x => x.create_date).FirstOrDefault(),
  4528. arrived_date = data.Select(x => x.arrived_date).FirstOrDefault(),
  4529. status = data.Select(x => x.status).FirstOrDefault(),
  4530. type = data.Select(x => x.type).FirstOrDefault()
  4531. };
  4532. res.Add(model);
  4533. }
  4534. var orderData = res.OrderByDescending(x => x.create_date).ToList();
  4535. crmRes = new CSuccessResponseMessage(null, i_crmInput);
  4536. crmRes.param[BLWording.DATA] = orderData;
  4537. }
  4538. while (false);
  4539. }
  4540. catch (Exception ex)
  4541. {
  4542. LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
  4543. sMsg = $"{nameof(GetProduct)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
  4544. #if DEBUG
  4545. System.Diagnostics.Debug.WriteLine(sMsg);
  4546. #endif
  4547. }
  4548. if (null != sMsg)
  4549. {
  4550. crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
  4551. }
  4552. return crmRes;
  4553. }
  4554. /// <summary>
  4555. /// 取得所有分店跟分店所屬社團的資訊
  4556. /// </summary>
  4557. /// <returns></returns>
  4558. private List<GroupBranch> GetBranchGroupList()
  4559. {
  4560. QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
  4561. string sMsg = "";
  4562. QueryJsonElement branch = lBlocks.GetInst();
  4563. branch.table = tb_grp_branch.TABLENAME;
  4564. branch.displaycols = new List<string>() {
  4565. tb_grp_branch.CN_BRANCH_NAME ,
  4566. tb_grp_branch.CN_UID,
  4567. tb_grp_branch.CN_ADDRESS,
  4568. tb_grp_branch.CN_PHONE_NUMBER,
  4569. tb_grp_branch.CN_CONTACT_PERSON,
  4570. tb_grp_branch.CN_SEQ
  4571. };
  4572. QueryJsonElement group = lBlocks.GetInst();
  4573. group.table = tb_grp_group.TABLENAME;
  4574. group.displaycols = new List<string>() { tb_grp_group.CN_NAME};
  4575. group.jointype = QueryJsonElement.JOIN;
  4576. group.jointable = branch;
  4577. group.joincols = new Dictionary<string, string>() {{ tb_grp_group.CN_UID,tb_grp_branch.CN_GROUP_UID }};
  4578. lBlocks.Add(branch);
  4579. lBlocks.Add(group);
  4580. sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRes);
  4581. if (sMsg != null)
  4582. {
  4583. throw new Exception(sMsg);
  4584. }
  4585. ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
  4586. return ai.RunQueryList<GroupBranch>(cRes);
  4587. }
  4588. private (List<OrderMaster> records, int TotalCount) readCommandPostDataHandlerRefactor(CRequestMessage i_crmInput, Dictionary<string, string > dicCondition, List<string> lsBranch, List<string> userBranch, int nPageIdx, int nPageNum)
  4589. {
  4590. var records = new List<OrderMaster>();
  4591. var branchName = ProjectHelper.GetUserBranchAndName(i_crmInput);
  4592. // 查詢前10筆資料
  4593. var error = new SQLLib(new MSSQLDirectSQLHelper()).readCommandPostDataHandlerQueryDetailSortGuid(i_crmInput, dicCondition, lsBranch, userBranch, false, nPageIdx, nPageNum, out Command command_);
  4594. ArsenalInterface ai = ArsenalDBMgr.GetInst(command_);
  4595. var qdsOrderMst = ai.RunQueryList<OrderDetailEx>(command_);
  4596. if (!string.IsNullOrWhiteSpace(command_.LastErrorCode))
  4597. {
  4598. throw new Exception(command_.LastErrorCode);
  4599. }
  4600. // 查詢total數量
  4601. error = new SQLLib(new MSSQLDirectSQLHelper()).readCommandPostDataHandlerQueryDetailSortGuid(i_crmInput, dicCondition, lsBranch, userBranch, true, nPageIdx, nPageNum, out Command commandTotal_);
  4602. ai = ArsenalDBMgr.GetInst(commandTotal_);
  4603. var qdsOrderMstTotal = ai.RunQueryDataSet(commandTotal_, i_nPageIdx: nPageIdx, i_nNumOfPage: nPageNum);
  4604. if (!string.IsNullOrWhiteSpace(command_.LastErrorCode))
  4605. {
  4606. throw new Exception(command_.LastErrorCode);
  4607. }
  4608. Int32.TryParse(qdsOrderMstTotal.DATA.Tables[0].Rows[0]?[0]?.ToString(), out int TotalCount);
  4609. int sn = nPageIdx * nPageNum + 1;// 0 => 1
  4610. int received = 0;
  4611. int receivable = 0;
  4612. foreach (var detail in qdsOrderMst)
  4613. {
  4614. received = detail.received;
  4615. receivable = detail.receivable;
  4616. records.Add(new OrderMaster()
  4617. {
  4618. uid = detail.uid,
  4619. article_uid = detail.article_uid,
  4620. order_code = detail.order_code,
  4621. group_uid = detail.group_uid,
  4622. branch_uid = detail.branch_uid,
  4623. create_date = detail.create_date,
  4624. arrived_date = detail.arrived_date,
  4625. status = detail.status,
  4626. type = detail.type,
  4627. name = detail.name,
  4628. branch_name = branchName.Find(x => x.Uid == detail.branch_uid).BranchName,
  4629. received = received,
  4630. receivable = receivable,
  4631. progress = received == 0 || receivable == 0 ? "0%" : Math.Round((decimal)received / receivable * 100, 0, MidpointRounding.AwayFromZero).ToString() + "%",
  4632. remark = detail.remark,
  4633. sn = sn++,
  4634. });
  4635. }
  4636. return (records, TotalCount);
  4637. }
  4638. }
  4639. }