TransferBLL.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. using SqlSugar;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using WMS.Info;
  8. using WMS.Info.Models;
  9. using WMS.Util;
  10. namespace WMS.Core.AppBll
  11. {
  12. public class TransferBLL : AppCoreBLL
  13. {
  14. public ResInfo TransferQueryByCode(TransferQueryRequest reqData)
  15. {
  16. if (string.IsNullOrWhiteSpace(reqData.TrayNo) || string.IsNullOrWhiteSpace(reqData.UidOrBoxNo))
  17. throw SysExCore.ThrowFailException("参数不能为空!");
  18. using (var ctx = SysDbCore.GetDbCtx())
  19. {
  20. var tranInfos = ctx.Queryable<BILL_TRANSFERORDER, BILL_TRANSFERORDERLINE>((ord, detail) => new object[] { JoinType.Inner, ord.F_no == detail.F_pNo })
  21. .Where((ord, detail) => ord.F_orderStatus != (int)EOrderState.Executed).Select<BILL_TRANSFERORDERLINE>().ToList();
  22. List<dynamic> resInfos = new List<dynamic>();
  23. foreach (var detail in tranInfos)
  24. {
  25. var mat = ctx.Queryable<BASE_ITEM>().First(f => f.F_matNo == detail.F_fromPart);
  26. resInfos.Add(new
  27. {
  28. MatNo = detail.F_fromPart,
  29. ProjectNo = mat.F_projectNo,
  30. Quantity = detail,
  31. });
  32. }
  33. return new ResInfo { code = EResponseCode.Success, data = resInfos };
  34. }
  35. }
  36. public ResInfo TransferSubmit(TransferSubmitRequest request)
  37. {
  38. using (var ctx = SysDbCore.GetDbCtx())
  39. {
  40. ctx.BeginTran();
  41. try
  42. {
  43. if (string.IsNullOrWhiteSpace(request?.TrayNo) || !request.TransferInfos.Any() || string.IsNullOrWhiteSpace(request.ToTrayNo))
  44. throw SysExCore.ThrowFailException("参数不能为空");
  45. //根据托盘码获取转仓单号
  46. var stockOutEntity = ctx.Queryable<BILL_TRANSFERORDER, BILL_TRANSFERORDERLINE>((ord, detail) => new object[] { JoinType.Inner, ord.F_no == detail.F_pNo })
  47. .Where((ord, detail) => detail.F_fromLoc == request.TrayNo && ord.F_orderStatus != (int)EOrderState.Executed).Select<BILL_TRANSFERORDER>().First();
  48. if(stockOutEntity==null)
  49. throw SysExCore.ThrowFailException("未找到该托盘没有转仓任务!");
  50. ctx.Updateable<BILL_STOCKOUTLINE>().SetColumns(it => new BILL_STOCKOUTLINE
  51. {
  52. F_editTime = DateTime.Now,
  53. F_editUserNo = LoginUser.UserNo,
  54. F_actualQty = request.TransferInfos.Sum(s => s.Quantity)
  55. }).Where(w => w.F_matNo == request.TransferInfos.FirstOrDefault().MatNo && w.F_pNo == stockOutEntity.F_relatedOrderNo).ExecuteCommand();
  56. var stockOutLineLst = ctx.Queryable<BILL_STOCKOUTLINE>().Where(w => w.F_pNo == stockOutEntity.F_relatedOrderNo).ToList();
  57. if (!stockOutLineLst.Any(a => a.F_actualQty != a.F_planQty))
  58. {
  59. ctx.Updateable<BILL_TRANSFERORDER>().SetColumns(it => new BILL_TRANSFERORDER
  60. {
  61. F_editTime = DateTime.Now,
  62. F_editUserNo = LoginUser.UserNo,
  63. F_orderStatus = (int)EOrderState.Executed
  64. }).Where(w => w.F_no == stockOutEntity.F_no).ExecuteCommand();
  65. ctx.Updateable<BILL_STOCKOUT>().SetColumns(it => new BILL_STOCKOUT
  66. {
  67. F_editTime = DateTime.Now,
  68. F_editUserNo = LoginUser.UserNo,
  69. F_orderStatus = (int)EOrderState.Executed
  70. }).Where(w => w.F_no == stockOutEntity.F_relatedOrderNo).ExecuteCommand();
  71. }
  72. List<BILL_INVENTORY> lstInv = new List<BILL_INVENTORY>();
  73. request.TransferInfos.ForEach(info =>
  74. {
  75. var inv = ctx.Queryable<BILL_INVENTORY>().WhereIF(!string.IsNullOrWhiteSpace(info.UidOrBoxNo),f=> (f.F_boxNo == info.UidOrBoxNo || f.F_uid == info.UidOrBoxNo))
  76. .Where(f => f.F_trayNo == request.TrayNo && f.F_matNo == request.TransferInfos.First().MatNo).First();
  77. inv.F_quantity = inv.F_quantity * -1;
  78. lstInv.Add(inv);
  79. ctx.Updateable<BILL_TRANSFERORDERLINE>().SetColumns(it => new BILL_TRANSFERORDERLINE
  80. {
  81. F_editTime = DateTime.Now,
  82. F_editUserNo = LoginUser.UserNo,
  83. F_toLoc = request.ToTrayNo,
  84. }).Where(w => w.F_pNo == stockOutEntity.F_no && w.F_fromPart == info.MatNo && (w.F_FromRef == info.UidOrBoxNo)).ExecuteCommand();
  85. });
  86. RequestFeixu(lstInv);
  87. //更新库存
  88. UpdateInventory(lstInv, ctx);
  89. ctx.CommitTran();
  90. return SysExCore.GetResSucc("出库成功!");
  91. }
  92. catch (Exception ex)
  93. {
  94. ctx.RollbackTran();
  95. throw ex;
  96. }
  97. finally
  98. {
  99. ctx.Dispose();
  100. }
  101. }
  102. }
  103. public void RequestFeixu(List<BILL_INVENTORY> invs)
  104. {
  105. /// 验证工单
  106. StringBuilder sb = new StringBuilder();
  107. sb.Append(@" <dsInventoryTransfer>");
  108. sb.Append("<inventoryTransfer>");
  109. sb.Append($"<part>{invs.First().F_matNo}</part>");
  110. foreach (var item in invs)
  111. {
  112. sb.Append("<inventoryDetail>");
  113. sb.Append($"<lotserialQty>{item.F_quantity}</lotserialQty>");
  114. sb.Append($" <siteFrom>SUZ</siteFrom>");
  115. sb.Append($"<nbr></nbr>");
  116. sb.Append($"<soJob></soJob>");
  117. sb.Append($"<rmks></rmks>");
  118. sb.Append($"<siteFrom>SUZ</siteFrom>");
  119. sb.Append($"<locFrom>{item.F_trayNo}</locFrom>");
  120. sb.Append($"<lotserFrom></lotserFrom>");
  121. sb.Append($"<lotrefFrom>{item.F_uid}</lotrefFrom>");
  122. sb.Append($" <siteTo>SUZ</siteTo>");
  123. sb.Append($"<locTo>{item.F_trayNo}</locTo>");
  124. sb.Append($"<lotserTo></lotserTo>");
  125. sb.Append($"<lotrefTo>{item.F_uid}</lotrefTo>");
  126. sb.Append(@"</inventoryDetail>");
  127. }
  128. sb.Append(@"</inventoryTransfer>");
  129. sb.Append(@" </dsInventoryTransfer>");
  130. var res = WebServiceCall.callWebService(SysSetCore.GetSysSet().FxWebServiceUrl, "transferInventory", sb.ToString());
  131. if (res.Contains("<ns1:result>error</ns1:result>"))
  132. throw SysExCore.ThrowFailException($"QAD验证转仓数据失败!{string.Join(",", WebSerciceResponse(res))}");
  133. }
  134. public List<string> WebSerciceResponse(string res)
  135. {
  136. try
  137. {
  138. var lstRes = new List<string>();
  139. if (string.IsNullOrWhiteSpace(res))
  140. return default;
  141. string str = res.Substring(res.IndexOf("<ns3:tt_msg_desc>"), res.Length - res.LastIndexOf("</ns3:tt_msg_desc>"));
  142. while (str.Contains("<ns3:tt_msg_desc>"))
  143. {
  144. string value = str.Substring(str.IndexOf("<ns3:tt_msg_desc>") + 17, str.IndexOf("</ns3:tt_msg_desc>") - 18);
  145. str = str.Substring(str.IndexOf("</ns3:tt_msg_desc>"), str.Length - str.IndexOf("</ns3:tt_msg_desc>") - 1);
  146. lstRes.Add(value);
  147. }
  148. return lstRes;
  149. }
  150. catch (Exception)
  151. {
  152. return default;
  153. }
  154. }
  155. }
  156. }