TrayBLL.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Configuration;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using SqlSugar;
  8. using WMS.Core._02Entity;
  9. using WMS.Core.APPBLL;
  10. using WMS.Info;
  11. using WMS.Info.Enum;
  12. using WMS.Info.Models;
  13. using WMS.Util;
  14. namespace WMS.Core
  15. {
  16. /// <summary>
  17. /// 托盘操作类
  18. /// </summary>
  19. public class TrayBLL : AppCoreBLL
  20. {
  21. /// <summary>
  22. /// 扫码托盘码
  23. /// </summary>
  24. /// <param name="reqData"></param>
  25. /// <returns></returns>
  26. public ResInfo ScanTrayNo(TrayNoRequest reqData)
  27. {
  28. try
  29. {
  30. if (string.IsNullOrWhiteSpace(reqData?.TrayNo))
  31. throw SysExCore.ThrowFailException("参数不能为空");
  32. //根据位置码盘点判断成品或原料
  33. var location = GetPointInfo(reqData.LocationNo);
  34. if (location == null)
  35. throw SysExCore.ThrowFailException("请扫描正确的货位码!");
  36. List<FX_sod_det> workOrders = new List<FX_sod_det>();
  37. //switch ((EPointType)location.F_type)
  38. //{
  39. // case EPointType.AGVM:
  40. // //todo:根据托盘号调用飞旭接口获取组盘信息
  41. // break;
  42. // case EPointType.AGVP:
  43. // workOrders = GetList(reqData.TrayNo);
  44. // break;
  45. // default:
  46. // throw SysExCore.ThrowFailException("请扫描正确的货位码!");
  47. //}
  48. //workOrders.Add(new FX_sod_det
  49. //{
  50. // sod_part = "三星",
  51. // sod_line = 1,
  52. // sod_nbr = "fx001",
  53. // sod_qty_ord = 100,
  54. // sod_qty_ship = 50
  55. //});
  56. return SysExCore.GetResSucc(data: workOrders);
  57. }
  58. catch (Exception ex)
  59. {
  60. throw ex;
  61. }
  62. }
  63. /// <summary>
  64. /// 根据托盘创建任务
  65. /// </summary>
  66. /// <param name="reqData"></param>
  67. /// <returns></returns>
  68. public ResInfo TrayTaskCreate(TrayCallRequest reqData)
  69. {
  70. using (var ctx = SysDbCore.GetDbCtx())
  71. {
  72. ctx.BeginTran();
  73. try
  74. {
  75. foreach (var item in reqData.LstInventoryNo.Distinct())
  76. {
  77. var invEntity = ctx.Queryable<BILL_INVENTORY>().First(i => i.F_trayNo == item);
  78. if (invEntity == null)
  79. throw SysExCore.ThrowFailException("获取库存数据异常");
  80. var invLocation = ctx.Queryable<BASE_LOCATION>().First(l => l.F_trayNo == invEntity.F_trayNo && l.F_status == (int)EWareCellState.Stored);
  81. if (invLocation == null)
  82. throw SysExCore.ThrowFailException($"获取托盘:{invEntity.F_trayNo}货位数据异常");
  83. if (invLocation.F_status == (int)EWareCellState.In && invLocation.F_status == (int)EWareCellState.Out)
  84. throw SysExCore.ThrowFailException($"托盘:{invEntity.F_trayNo}货位正在执行任务无法下架");
  85. var task = new WMS_TASK
  86. {
  87. F_addTime = DateTime.Now,
  88. F_addUserNo = LoginUser.UserNo,
  89. F_editTime = DateTime.Now,
  90. F_isBonded = invLocation.F_isBonded,
  91. F_posidTo = reqData.LocationNo,
  92. F_priority = (int)EPriority.NotUrgent,
  93. F_taskStatus = (int)ETaskStatus.NotIssued,
  94. F_taskType = (int)ETaskComType.OutStock,
  95. F_boxNo = invEntity.F_boxNo,
  96. F_trayNo = invEntity.F_trayNo,
  97. F_pickPort = reqData.LocationNo,
  98. F_posidFrom = invLocation.F_no,
  99. F_posidcur = invLocation.F_no,
  100. F_EquipmentType = (int)EEquipmentType.RGV,
  101. F_orderType = (int)EStockOutOrderType.StockOutOrderTypeHalfTray,
  102. F_memo = "呼叫半托"
  103. };
  104. var taskReturn = ctx.Insertable(task).ExecuteReturnEntity();
  105. var upd = ctx.Updateable<BASE_LOCATION>().SetColumns(it => new BASE_LOCATION()
  106. {
  107. F_status = (int)EWareCellState.Out,
  108. F_editTime = DateTime.Now,
  109. F_editUserNo = LoginUser.UserNo,
  110. }).Where(w => w.F_no == invLocation.F_no).ExecuteCommand();
  111. if (upd <= 0)
  112. throw SysExCore.ThrowFailException("更新货位状态失败,请重试。");
  113. }
  114. ctx.CommitTran();
  115. return SysExCore.GetResSucc("任务生成成功");
  116. }
  117. catch (Exception e)
  118. {
  119. ctx.RollbackTran();
  120. throw;
  121. }
  122. }
  123. }
  124. /// <summary>
  125. /// 托盘下架
  126. /// </summary>
  127. /// <param name="reqData"></param>
  128. /// <returns></returns>
  129. public ResInfo TrayTaskStockOutCreate(TrayCallRequest reqData)
  130. {
  131. using (var ctx = SysDbCore.GetDbCtx())
  132. {
  133. ctx.BeginTran();
  134. try
  135. {
  136. var point = ctx.Queryable<BASE_POINT>().First(a=>a.F_no==reqData.LocationNo);
  137. if(point==null)
  138. throw SysExCore.ThrowFailException("点位信息无效。");
  139. if(!(point.F_type==(int)EPointType.CPCKJXK || point.F_type==(int)EPointType.YLCKJXK))
  140. throw SysExCore.ThrowFailException("托盘下架只能从拣选口出。");
  141. foreach (var item in reqData.LstInventoryNo.Distinct())
  142. {
  143. //生成出库任务
  144. BILL_STOCKOUT order = new BILL_STOCKOUT()
  145. {
  146. F_addTime = DateTime.Now,
  147. F_addUserNo = LoginUser.UserNo,
  148. F_no = SerialNumberProvider.Instance.OrderNumber("wms", "CK"),
  149. F_orderStatus = (int)EOrderState.New,
  150. F_totalOrderLines = reqData.LstInventoryNo.Count,
  151. F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
  152. };
  153. List<BILL_STOCKOUTLINE> lstStockOutLines = new List<BILL_STOCKOUTLINE>();
  154. List<BILL_STOCKOUTLINEDETAIL> lstStockOutLineDetails = new List<BILL_STOCKOUTLINEDETAIL>();
  155. var invLst = ctx.Queryable<BILL_INVENTORY>().Where(i => i.F_trayNo == item).ToList();
  156. if (invLst == null)
  157. throw SysExCore.ThrowFailException("获取库存数据异常");
  158. var invLocation = ctx.Queryable<BASE_LOCATION>().First(l => l.F_trayNo == item && l.F_status == (int)EWareCellState.Stored);
  159. if (invLocation == null)
  160. throw SysExCore.ThrowFailException($"获取托盘:{item}货位数据异常");
  161. if (invLocation.F_status == (int)EWareCellState.In && invLocation.F_status == (int)EWareCellState.Out)
  162. throw SysExCore.ThrowFailException($"托盘:{item}货位正在执行任务无法下架");
  163. foreach (var invEntity in invLst)
  164. {
  165. lstStockOutLines.Add(new BILL_STOCKOUTLINE
  166. {
  167. //F_actualQty = invEntity.F_quantity,
  168. F_addTime = DateTime.Now,
  169. F_addUserNo = LoginUser.UserNo,
  170. F_editTime = DateTime.Now,
  171. F_batchNo = invEntity.F_batchNo,
  172. F_matType = invEntity.F_matType,
  173. F_planQty = invEntity.F_quantity,
  174. F_matNo = invEntity.F_matNo,
  175. F_orderLineNo = reqData.LstInventoryNo.IndexOf(item) + 1,
  176. F_matName = invEntity.F_matName,
  177. F_pNo = order.F_no,
  178. F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
  179. });
  180. lstStockOutLineDetails.Add(new BILL_STOCKOUTLINEDETAIL
  181. {
  182. F_addTime = DateTime.Now,
  183. F_addUserNo = LoginUser.UserNo,
  184. F_locationNo = invLocation.F_no,
  185. F_boxNo = invEntity.F_boxNo,
  186. F_matName = invEntity.F_matName,
  187. F_matNo = invEntity.F_matNo,
  188. F_matType = invEntity.F_matType,
  189. F_quantity = invEntity.F_quantity,
  190. F_pNo = order.F_no,
  191. F_projectNo = invEntity.F_projectNo,
  192. F_uid = invEntity.F_uid,
  193. F_trayNo = item
  194. });
  195. }
  196. var task = new WMS_TASK
  197. {
  198. F_addTime = DateTime.Now,
  199. F_addUserNo = LoginUser.UserNo,
  200. F_editTime = DateTime.Now,
  201. F_isBonded = invLocation.F_isBonded,
  202. F_posidTo = reqData.LocationNo,
  203. F_posidNext = reqData.LocationNo,
  204. F_priority = (int)EPriority.NotUrgent,
  205. F_taskStatus = (int)ETaskStatus.NotIssued,
  206. F_taskType = (int)ETaskComType.OutStock,
  207. F_trayNo = item,
  208. F_pickPort = reqData.LocationNo,
  209. F_posidFrom = invLocation.F_no,
  210. F_posidcur = invLocation.F_no,
  211. F_orderNo = order.F_no,
  212. F_EquipmentType = (int)EEquipmentType.RGV,
  213. };
  214. if (invLst.First().F_matType == (int)EMatType.Mat)
  215. {
  216. order.F_orderType = (int)EStockOutOrderType.StockOutOrderTypeMaterial;
  217. task.F_orderType = (int)ETaskOrderType.StockOutOrderTypeMaterial;
  218. }
  219. else if (invLst.First().F_matType == (int)EMatType.Product)
  220. {
  221. order.F_orderType = (int)EStockOutOrderType.StockOutOrderTypeMaterial;
  222. task.F_orderType = (int)ETaskOrderType.StockOutOrderTypeMaterial;
  223. }
  224. else
  225. {
  226. order.F_orderType = (int)EStockOutOrderType.StockOutOrderTypeTray;
  227. task.F_orderType = (int)ETaskOrderType.StockOutOrderTypeEmptyTrayGroup;
  228. }
  229. var taskReturn = ctx.Insertable(task).ExecuteReturnEntity();
  230. var upd = ctx.Updateable<BASE_LOCATION>().SetColumns(it => new BASE_LOCATION()
  231. {
  232. F_status = (int)EWareCellState.Out,
  233. F_editTime = DateTime.Now,
  234. F_editUserNo = LoginUser.UserNo,
  235. }).Where(w => w.F_no == invLocation.F_no).ExecuteCommand();
  236. if (upd <= 0)
  237. throw SysExCore.ThrowFailException("更新货位状态失败,请重试。");
  238. ctx.Insertable(order).ExecuteCommand();
  239. ctx.Insertable(lstStockOutLines).ExecuteCommand();
  240. ctx.Insertable(lstStockOutLineDetails).ExecuteCommand();
  241. }
  242. ctx.CommitTran();
  243. return SysExCore.GetResSucc("任务生成成功");
  244. }
  245. catch (Exception e)
  246. {
  247. ctx.RollbackTran();
  248. throw;
  249. }
  250. }
  251. }
  252. /// <summary>
  253. /// 半托查询
  254. /// </summary>
  255. /// <param name="reqData"></param>
  256. /// <returns></returns>
  257. public ResInfo HalfQuery(HalfTrayQueryRequest reqData)
  258. {
  259. using (var ctx = SysDbCore.GetDbCtx())
  260. {
  261. var invs = ctx.Queryable<BILL_INVENTORY, BASE_LOCATION>((inv, loc) => new object[] { JoinType.Inner, inv.F_trayNo == loc.F_trayNo })
  262. .Where((inv, loc) => loc.F_height > loc.F_matHeight && loc.F_status == (int)EWareCellState.Stored);
  263. if (reqData.Type == (int)EMatType.Mat)
  264. {
  265. invs = invs.Where(inv => inv.F_matType == (int)EMatType.Mat);
  266. if (!string.IsNullOrWhiteSpace(reqData.KeyWord))
  267. invs = invs.Where(inv => inv.F_uid == reqData.KeyWord);
  268. }
  269. if (reqData.Type == (int)EMatType.Product)
  270. {
  271. invs = invs.Where(inv => inv.F_matType == (int)EMatType.Product);
  272. if (!string.IsNullOrWhiteSpace(reqData.KeyWord))
  273. invs = invs.Where(inv => inv.F_matNo == reqData.KeyWord);
  274. }
  275. if (reqData.IsBonded)
  276. invs.Where((inv, loc) => loc.F_isBonded == reqData.IsBonded);
  277. if (FuncStr.NullToInt(reqData.SpaceNum.TrimEnd('%')) > 0)
  278. invs = invs.Where((inv, loc) => (loc.F_matHeight * 100) / loc.F_height >= FuncStr.NullToInt(reqData.SpaceNum.TrimEnd('%')));
  279. var invsReturn = invs.Select<dynamic>("inv.f_no,inv.F_trayNo,inv.F_matNo,inv.F_UID,cast(cast(IIF((F_matHeight*100)/F_height=0,100,(F_matHeight*100)/F_height) as int) as nvarchar(50))+'%' spaceNum");
  280. List<dynamic> list = null;
  281. int count = 0;
  282. list = invsReturn.OrderBy("inv.F_matNo asc").ToPageList(reqData.pagination.page, reqData.pagination.rows, ref count);
  283. reqData.pagination.records = count;
  284. return SysExCore.GetResSucc("查询成功", data: new { list = list, pageInfo = reqData.pagination });
  285. }
  286. }
  287. /// <summary>
  288. /// 托盘查询
  289. /// </summary>
  290. /// <param name="reqData"></param>
  291. /// <returns></returns>
  292. public ResInfo Query(TrayQueryRequest reqData)
  293. {
  294. using (var ctx = SysDbCore.GetDbCtx())
  295. {
  296. var invs = ctx.Queryable<BILL_INVENTORY, BASE_LOCATION>((inv, loc) => new object[] { JoinType.Inner, inv.F_trayNo == loc.F_trayNo })
  297. .Where((inv, loc) => loc.F_height > loc.F_matHeight && loc.F_status == (int)EWareCellState.Stored);
  298. if (!string.IsNullOrWhiteSpace(reqData.KeyWord))
  299. invs = invs.Where(inv => inv.F_matNo == reqData.KeyWord);
  300. if (FuncStr.NullToInt(reqData.SpaceNum.TrimEnd('%')) > 0)
  301. invs = invs.Where((inv, loc) => (loc.F_matHeight * 100) / loc.F_height >= FuncStr.NullToInt(reqData.SpaceNum.TrimEnd('%')));
  302. var invsReturn = invs.Select<dynamic>("inv.f_no,inv.F_trayNo,inv.F_matNo,inv.F_UID,cast(cast(IIF((F_matHeight*100)/F_height=0,100,(F_matHeight*100)/F_height) as int) as nvarchar(50))+'%' spaceNum");
  303. List<dynamic> list = null;
  304. int count = 0;
  305. list = invsReturn.OrderBy("inv.F_matNo asc").ToPageList(reqData.pagination.page, reqData.pagination.rows, ref count);
  306. reqData.pagination.records = count;
  307. return SysExCore.GetResSucc("查询成功", data: new { list = list, pageInfo = reqData.pagination });
  308. }
  309. }
  310. }
  311. }