MaterialBLL.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. using SqlSugar;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using WMS.Core._02Entity;
  6. using WMS.Core.ServiceCore;
  7. using WMS.Info;
  8. using WMS.Util;
  9. namespace WMS.Core.APPBLL
  10. {
  11. public class MaterialBLL : AppCoreBLL
  12. {
  13. public ResInfo Entry(ScanCodeRequest reqData)
  14. {
  15. using (var ctx = SysDbCore.GetDbCtx())
  16. {
  17. try
  18. {
  19. if (string.IsNullOrWhiteSpace(reqData?.LocationNo) || string.IsNullOrWhiteSpace(reqData.TrayNo))
  20. throw SysExCore.ThrowFailException("参数不能为空");
  21. ctx.BeginTran();
  22. //获取当前点位信息
  23. var location = GetPointInfo(reqData.LocationNo);
  24. if (location == null)
  25. throw SysExCore.ThrowFailException("请输入有效的位置码!");
  26. if (location.F_type == (int)EPointType.YCK)//异常口处理逻辑
  27. {
  28. var curTask = ctx.Queryable<WMS_TASK>().Where(f => f.F_taskStatus < (int)ETaskStatus.TaskFinish && f.F_trayNo == reqData.TrayNo).First();
  29. if (curTask == null)
  30. throw SysExCore.ThrowFailException("当前异常任务找不到对应的入库任务!");
  31. ctx.Updateable<WMS_TASK>().SetColumns(it => new WMS_TASK()
  32. {
  33. F_editTime = DateTime.Now,
  34. F_editUserNo = LoginUser.UserNo,
  35. F_posidFrom = reqData.LocationNo,
  36. F_posidcur = reqData.LocationNo,
  37. F_taskStatus = (int)ETaskStatus.NotIssued,
  38. F_posidNext = "1036"
  39. }).Where(w => w.F_taskNo == curTask.F_taskNo).ExecuteCommand();
  40. ctx.CommitTran();
  41. return SysExCore.GetResSucc("异常口任务生成成功"); ;
  42. }
  43. var trayLocation = new FxBaseLocationCore().GetLociotnByTrayNo(reqData.TrayNo);
  44. if (trayLocation != null && trayLocation.F_status != (int)EWareCellState.Empty)
  45. throw SysExCore.ThrowFailException("当前托盘号已存在货位数据");
  46. var task = new WMS_TASK
  47. {
  48. F_addTime = DateTime.Now,
  49. F_addUserNo = LoginUser.UserNo,
  50. F_editTime = DateTime.Now,
  51. F_posidNext = GetFreePointInfoByType((int)EPointType.RKDFPHWDW).F_no,
  52. F_priority = (int)EPriority.NotUrgent,
  53. F_taskStatus = (int)ETaskStatus.NotIssued,
  54. F_taskType = (int)ETaskComType.InStock,
  55. F_orderType = (int)ETaskOrderType.EntryOrderTypeMaterial,
  56. F_posidFrom = reqData.LocationNo,
  57. F_posidcur = reqData.LocationNo,
  58. F_EquipmentType = (int)EEquipmentType.Convey,
  59. F_trayNo=reqData.TrayNo
  60. };
  61. var entryOrder = new BILL_ENTRYORDER
  62. {
  63. F_no = SerialNumberProvider.Instance.OrderNumber("wms", "RK"),
  64. F_addTime = DateTime.Now,
  65. F_addUserNo = LoginUser.UserNo,
  66. F_locationNo = reqData.LocationNo,
  67. F_orderStatus = (int)EOrderState.New,
  68. F_orderType = (int)EEntryOrderType.EntryOrderTypeMaterial,
  69. F_trayNo = reqData.TrayNo,
  70. F_isBonded = reqData.TrayNo.StartsWith("B"),
  71. F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo,
  72. };
  73. task.F_orderNo = entryOrder.F_no;
  74. //if (location.F_type == (int)EPointType.YLCKJXK)
  75. //{
  76. // #region 拣选入库
  77. // var invs = ctx.Queryable<BILL_INVENTORY>().Where(i => i.F_trayNo == reqData.TrayNo && i.F_quantity > 0).ToList();
  78. // if (!invs.Any())
  79. // throw SysExCore.ThrowFailException("当前托盘信息为空!");
  80. // invs.ForEach(inv =>
  81. // {
  82. // ctx.Insertable(new BILL_ENTRYORDERLINEDETAIL
  83. // {
  84. // F_addTime = DateTime.Now,
  85. // F_addUserNo = LoginUser.UserNo,
  86. // F_batchNo = inv.F_batchNo,
  87. // F_matNo = inv.F_matNo,
  88. // F_matName = inv.F_matName,
  89. // F_matType = (int)EMatType.Mat,
  90. // F_quantity = inv.F_quantity,
  91. // F_pNo = entryOrder.F_no,
  92. // F_trayNo = inv.F_trayNo,
  93. // F_UID = inv.F_UID,
  94. // F_boxNo = inv.F_boxNo
  95. // }).ExecuteCommand();
  96. // });
  97. // entryOrder.F_totalOrderLines = invs.Count();
  98. // entryOrder.F_memo = "拣选入库";
  99. // #endregion
  100. //}
  101. //if (location.F_type == (int)EPointType.YLRKJXK)
  102. //{
  103. #region 组盘入库
  104. List<BILL_INVENTORY> lstInv = new List<BILL_INVENTORY>();
  105. var fxMats = FxDbCore.GetData<FX_ld_det>($"select ld_domain,ld_site,ld_loc,ld_part,ld_ref,ld_lot,ld_qty_oh from pub.ld_det where ld_domain='AFCN' and ld_site='SUZ' and ld_loc='{reqData.TrayNo}'");
  106. if (fxMats.Count < 1)
  107. throw SysExCore.ThrowFailException($"未获取到托盘号{reqData.TrayNo}组盘信息");
  108. fxMats.ToList().ForEach(orderLine =>
  109. {
  110. var mat = CacheFacade.GetMatInfo(orderLine.ld_part, EMatType.Mat);
  111. ctx.Insertable(new BILL_ENTRYORDERLINEDETAIL
  112. {
  113. F_addTime = DateTime.Now,
  114. F_addUserNo = LoginUser.UserNo,
  115. F_batchNo = orderLine.ld_lot,
  116. F_matNo = orderLine.ld_part,
  117. F_matName = mat?.F_matName,
  118. F_matType = (int)EMatType.Mat,
  119. F_quantity = orderLine.ld_qty_oh,
  120. F_pNo = entryOrder.F_no,
  121. F_trayNo = reqData.TrayNo,
  122. F_UID = orderLine.ld_ref
  123. }).ExecuteCommand();
  124. lstInv.Add(new BILL_INVENTORY
  125. {
  126. F_addTime = DateTime.Now,
  127. F_addUserNo = LoginUser.UserNo,
  128. F_editTime = DateTime.Now,
  129. F_matNo = orderLine.ld_part,
  130. F_matType = (int)EMatType.Mat,
  131. F_projectNo = mat.F_projectNo,
  132. F_quantity = orderLine.ld_qty_oh,
  133. F_batchNo = orderLine.ld_lot,
  134. F_uid = orderLine.ld_ref,
  135. F_unit = mat.F_unit,
  136. F_matName = mat?.F_matName,
  137. F_trayNo = reqData.TrayNo,
  138. F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
  139. });
  140. });
  141. #region 原料入库直接覆盖当前托盘库存,不存在则清理
  142. var trayInv = ctx.Queryable<BILL_INVENTORY>().Where(a => a.F_trayNo == reqData.TrayNo).ToList();
  143. if (trayInv.Any())
  144. {
  145. trayInv.ForEach(inv =>
  146. {
  147. if (!fxMats.Any(orderLine => inv.F_trayNo == orderLine.ld_loc && inv.F_uid == orderLine.ld_ref && inv.F_matNo == orderLine.ld_part && inv.F_batchNo == orderLine.ld_lot))
  148. {
  149. ctx.Deleteable<BILL_INVENTORY>().Where(c => c.F_no == inv.F_no).ExecuteCommand();
  150. ctx.Insertable(new BILL_INVENTORYTRANSACTION
  151. {
  152. F_addTime = DateTime.Now,
  153. F_addUserNo = LoginUser.UserNo,
  154. F_batchNo = inv.F_batchNo,
  155. F_boxNo = inv.F_boxNo,
  156. F_matName = inv.F_matName,
  157. F_matNo = inv.F_matNo,
  158. F_matType = inv.F_matType,
  159. F_sourceLockQty = inv.F_lockQty,
  160. F_targetLockQty = 0,
  161. F_memo = inv.F_memo,
  162. F_projectNo = inv.F_projectNo,
  163. F_sourceTrayNo = inv.F_trayNo,
  164. F_targetTrayNo = string.Empty,
  165. F_warehouseNo = inv.F_warehouseNo,
  166. F_UID = string.Empty,
  167. F_sourceQuantity = inv.F_quantity,
  168. F_targetQuantity = 0
  169. }).ExecuteCommand();
  170. }
  171. });
  172. }
  173. #endregion
  174. #endregion
  175. entryOrder.F_totalOrderLines = fxMats.Count;
  176. //entryOrder.F_relatedOrderNo = string.Join(",", fxMats.Select(s => s.ld_ref));
  177. UpdateInventory(lstInv, ctx);
  178. //}
  179. ctx.Insertable(entryOrder).ExecuteCommand();
  180. var taskReturn = ctx.Insertable(task).ExecuteReturnEntity();
  181. return SysExCore.GetResSucc("原料入库任务生成成功");
  182. }
  183. catch (Exception ex)
  184. {
  185. ctx.RollbackTran();
  186. throw ex;
  187. }
  188. }
  189. }
  190. public ResInfo StockOut(MatWorkOrderSubmitRequest req)
  191. {
  192. StockOutRequest stockOut = new StockOutRequest
  193. {
  194. F_no = req.IssNbr,
  195. F_priority = req.Priority,
  196. PickPort = string.Join(",", req.PickPort)
  197. };
  198. FxStockOutOrderCore orderCore = new FxStockOutOrderCore();
  199. orderCore.SoMatSave(stockOut, req.tranDs, LoginUser);
  200. return SysExCore.GetResSucc("原料出库任务生成成功");
  201. }
  202. }
  203. }