EmptyTrayBLL.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. using System;
  2. using System.Collections.Generic;
  3. using WMS.Core._02Entity;
  4. using WMS.Info;
  5. using WMS.Info.Models;
  6. using WMS.Util;
  7. namespace WMS.Core.APPBLL
  8. {
  9. public class EmptyTrayBLL : AppCoreBLL
  10. {
  11. public EmptyTrayBLL(bool isSkipOauth = false) : base(isSkipOauth)
  12. {
  13. }
  14. public ResInfo StockOut(EmptyTrayRequestDto reqData)
  15. {
  16. using (var ctx = SysDbCore.GetDbCtx())
  17. {
  18. ctx.BeginTran();
  19. try
  20. {
  21. if (string.IsNullOrWhiteSpace(reqData?.LocationNo))
  22. throw SysExCore.ThrowFailException("参数不能为空");
  23. var task = new WMS_TASK
  24. {
  25. F_addTime = DateTime.Now,
  26. F_addUserNo = LoginUser.UserNo,
  27. F_editTime = DateTime.Now,
  28. F_isBonded = reqData.IsBonded,
  29. F_posidTo = reqData.LocationNo,
  30. F_priority = (int)EPriority.NotUrgent,
  31. F_taskStatus = (int)ETaskStatus.NotIssued,
  32. F_taskType = (int)ETaskComType.OutStock
  33. };
  34. if (reqData.IsGroup)//空托盘组需要生成出库单和出库任务
  35. {
  36. if (ctx.Queryable<WMS_TASK>().Any(c => c.F_posidTo == reqData.LocationNo && c.F_taskStatus < (int)ETaskStatus.TaskFinish))
  37. return SysExCore.GetResSucc("请勿重复创建任务");
  38. var inventoryEntity = ctx.Queryable<BILL_INVENTORY>().Where(it => it.F_matType == (int)EMatType.Tary && it.F_isBonded == reqData.IsBonded).First();
  39. if (inventoryEntity == null)
  40. throw SysExCore.ThrowFailException("没有可用的空托盘组库存");
  41. var loctionEntity = ctx.Queryable<BASE_LOCATION>().Where(it => it.F_trayNo == inventoryEntity.F_trayNo).First();
  42. if (loctionEntity == null)
  43. throw SysExCore.ThrowFailException($"托盘{inventoryEntity.F_trayNo}货位数据状态异常!");
  44. if (loctionEntity.F_status != (int)EWareCellState.Stored)
  45. throw SysExCore.ThrowFailException($"当前已存在空托盘组出库任务!");
  46. var point = ctx.Queryable<BASE_POINT>().Where(c => c.F_no == reqData.LocationNo || c.F_agv == reqData.LocationNo).First();
  47. if (point == null)
  48. throw SysExCore.ThrowFailException($"当前点位信息无效!");
  49. if (point.F_type == (int)EPointType.BSCPJ || point.F_type == (int)EPointType.CPJ)
  50. task.F_posidNext = reqData.LocationNo;
  51. else
  52. task.F_posidNext = GetFreePointInfoByType((int)EPointType.YCK)?.F_no;//目标地址为agv点位从整盘口出
  53. var stockOut = new BILL_STOCKOUT
  54. {
  55. F_no = SerialNumberProvider.Instance.OrderNumber("wms", "CK"),
  56. F_addTime = DateTime.Now,
  57. F_addUserNo = LoginUser.UserNo,
  58. F_editTime = DateTime.Now,
  59. //F_locationNo = loctionEntity.F_no,
  60. F_orderStatus = (int)EOrderState.New,
  61. F_totalOrderLines = 0,
  62. F_orderType = (int)EStockOutOrderType.StockOutOrderTypeTray,
  63. F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
  64. };
  65. ctx.Insertable(stockOut).ExecuteReturnEntity();
  66. var stockOutLine = new BILL_STOCKOUTLINE
  67. {
  68. F_addTime = DateTime.Now,
  69. F_actualQty = 1,
  70. F_addUserNo = LoginUser.UserNo,
  71. F_matNo = inventoryEntity.F_matNo,
  72. F_matName = inventoryEntity.F_matName,
  73. F_matType = inventoryEntity.F_matType,
  74. F_orderLineNo = 1,
  75. F_pNo = stockOut.F_no,
  76. F_planQty = 1,
  77. F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
  78. };
  79. ctx.Insertable(stockOutLine).ExecuteReturnEntity();
  80. var stockOutLineDetail = new BILL_STOCKOUTLINEDETAIL
  81. {
  82. F_addTime = DateTime.Now,
  83. F_addUserNo = LoginUser.UserNo,
  84. F_locationNo = reqData.LocationNo,
  85. F_boxNo = inventoryEntity.F_boxNo,
  86. F_matName = SysSetCore.GetSysSet().DefaultEmptyTrayGroupName,
  87. F_matNo = SysSetCore.GetSysSet().DefaultEmptyTrayGroupNo,
  88. F_matType = (int)EMatType.Tary,
  89. F_quantity = 1,
  90. F_pNo = stockOut.F_no
  91. };
  92. ctx.Insertable(stockOutLine).ExecuteReturnEntity();
  93. task.F_orderNo = stockOut?.F_no;
  94. task.F_posidFrom = loctionEntity.F_no;
  95. task.F_posidcur = loctionEntity.F_no;
  96. task.F_orderType = (int)ETaskOrderType.StockOutOrderTypeEmptyTrayGroup;
  97. task.F_trayNo = inventoryEntity.F_trayNo;
  98. task.F_EquipmentType = (int)EEquipmentType.RGV;
  99. var upd = ctx.Updateable<BASE_LOCATION>().SetColumns(it => new BASE_LOCATION()
  100. {
  101. F_status = (int)EWareCellState.Out,
  102. F_editTime = DateTime.Now,
  103. F_editUserNo = LoginUser.UserNo,
  104. //F_isBonded = reqData.IsBonded
  105. }).Where(w => w.F_no == loctionEntity.F_no).ExecuteCommand();
  106. if (upd <= 0)
  107. throw SysExCore.ThrowFailException("更新货位状态失败,请重试。");
  108. }
  109. else
  110. {
  111. //验证拆盘机是否还有托盘
  112. var pointEntiry = GetFreePointInfoByType(reqData.IsBonded ? (int)EPointType.BSCPJ : (int)EPointType.CPJ);
  113. if (pointEntiry == null)
  114. throw SysExCore.ThrowFailException("获取拆盘机信息异常");
  115. PolicyHelper.GetRetryTimesPolicy(3, ex =>
  116. {
  117. throw ex;
  118. }).Execute(() =>
  119. {
  120. var resStr = httpClinet.Get(null, $"/api/Equipment/CheckState?equNo={ pointEntiry.F_no}");
  121. var result = resStr.ToObject<WCSResponse>();
  122. if (result == null || !result.isSuccess)
  123. throw SysExCore.ThrowFailException($"调用wcs接口失败{result?.msg}!");
  124. if ((bool)result.data == true)
  125. throw SysExCore.ThrowFailException($"任务创建失败,没有托盘库存!");
  126. });
  127. task.F_orderType = (int)ETaskOrderType.StockOutOrderTypeTray;
  128. task.F_posidFrom = pointEntiry.F_no;
  129. task.F_posidcur = pointEntiry.F_no;
  130. task.F_EquipmentType = (int)EEquipmentType.Convey;
  131. }
  132. ctx.Insertable(task).ExecuteReturnEntity();
  133. ctx.CommitTran();
  134. return SysExCore.GetResSucc();
  135. }
  136. catch (Exception ex)
  137. {
  138. ctx.RollbackTran();
  139. throw ex;
  140. }
  141. finally
  142. {
  143. ctx.Dispose();
  144. }
  145. }
  146. }
  147. public ResInfo TrayEntry(ScanCodeRequest reqData)
  148. {
  149. using (var ctx = SysDbCore.GetDbCtx())
  150. {
  151. try
  152. {
  153. if (string.IsNullOrWhiteSpace(reqData?.LocationNo) || string.IsNullOrWhiteSpace(reqData.TrayNo))
  154. throw SysExCore.ThrowFailException("参数不能为空!");
  155. var point = ctx.Queryable<BASE_POINT>().First(p => p.F_no == reqData.LocationNo);
  156. if (point == null || !(point.F_type >= (int)EPointType.YLCKJXK && point.F_type <= (int)EPointType.YLRKJXK))
  157. throw SysExCore.ThrowFailException("请扫码正确的位置码!");
  158. if (ctx.Queryable<BILL_INVENTORY>().Any(a => a.F_trayNo == reqData.TrayNo))
  159. throw SysExCore.ThrowFailException("当前托盘存在货位信息,无法生成空托盘入库任务!");
  160. var task = new WMS_TASK
  161. {
  162. F_addTime = DateTime.Now,
  163. F_addUserNo = LoginUser.UserNo,
  164. F_editTime = DateTime.Now,
  165. F_trayNo = reqData.TrayNo,
  166. F_posidTo = GetFreePointInfoByType(reqData.TrayNo.StartsWith("B") ? (int)EPointType.BSDPJ : (int)EPointType.DPJ).F_no,
  167. F_isBonded = reqData.TrayNo.StartsWith("B"),
  168. F_priority = (int)EPriority.NotUrgent,
  169. F_taskStatus = (int)ETaskStatus.NotIssued,
  170. F_taskType = (int)ETaskComType.InStock,
  171. F_EquipmentType = (int)EEquipmentType.Convey,
  172. F_posidFrom = reqData.LocationNo,
  173. F_posidcur = reqData.LocationNo,
  174. F_orderType = (int)ETaskOrderType.EntryOrderTypeTray,
  175. };
  176. task.F_posidNext = task.F_posidTo;
  177. ctx.Insertable(task).ExecuteReturnEntity();
  178. return SysExCore.GetResSucc("空托盘入库任务生成成功");
  179. }
  180. catch (Exception ex)
  181. {
  182. throw ex;
  183. }
  184. }
  185. }
  186. public ResInfo TrayGroupEntry(ScanCodeRequest reqData, bool IsBonded = false)
  187. {
  188. using (var ctx = SysDbCore.GetDbCtx())
  189. {
  190. try
  191. {
  192. if (string.IsNullOrWhiteSpace(reqData?.LocationNo))
  193. throw SysExCore.ThrowFailException("参数不能为空");
  194. if (ctx.Queryable<WMS_TASK>().Any(c => c.F_posidFrom == reqData.LocationNo && c.F_taskStatus < (int)ETaskStatus.TaskFinish))
  195. return SysExCore.GetResSucc("请勿重复创建任务");
  196. if (!string.IsNullOrWhiteSpace(reqData.TrayNo) && !IsBonded)
  197. IsBonded = reqData.TrayNo.StartsWith("B");
  198. reqData.TrayNo = string.IsNullOrWhiteSpace(reqData.TrayNo) ? Guid.NewGuid().ToString() : reqData.TrayNo;//界面传入托盘码只为了区分是否保税,托盘组默认生成guid以便存库操作
  199. var point = ctx.Queryable<BASE_POINT>().First(p => p.F_no == reqData.LocationNo && p.F_status == (int)EPointSatus.Idle);
  200. if (point.F_type == (int)EPointType.YCK)//异常口处理逻辑
  201. {
  202. var curTask = ctx.Queryable<WMS_TASK>().Where(f => f.F_taskStatus < (int)ETaskStatus.TaskFinish && f.F_trayNo == reqData.TrayNo).First();
  203. if (curTask == null)
  204. throw SysExCore.ThrowFailException("当前异常任务找不到对应的入库任务!");
  205. ctx.Updateable<WMS_TASK>().SetColumns(it => new WMS_TASK()
  206. {
  207. F_editTime = DateTime.Now,
  208. F_editUserNo = LoginUser.UserNo,
  209. F_posidFrom = reqData.LocationNo,
  210. F_posidcur = reqData.LocationNo,
  211. F_taskStatus = (int)ETaskStatus.NotIssued,
  212. F_posidNext = "1036"
  213. }).Where(w => w.F_taskNo == curTask.F_taskNo).ExecuteCommand();
  214. ctx.CommitTran();
  215. return SysExCore.GetResSucc("异常口任务生成成功"); ;
  216. }
  217. if (point == null || (point.F_type != (int)EPointType.DPJ && point.F_type != (int)EPointType.CPAGV && point.F_type != (int)EPointType.BSDPJ))
  218. throw SysExCore.ThrowFailException("点位信息无效!");
  219. ctx.BeginTran();
  220. var task = new WMS_TASK
  221. {
  222. F_addTime = DateTime.Now,
  223. F_addUserNo = LoginUser.UserNo,
  224. F_editTime = DateTime.Now,
  225. F_trayNo = reqData.TrayNo,
  226. F_isBonded = IsBonded,
  227. //F_posidNext = GetFreePointInfoByType((int)EPointType.RKDFPHWDW).F_no,
  228. F_priority = (int)EPriority.NotUrgent,
  229. F_taskStatus = (int)ETaskStatus.NotIssued,
  230. F_taskType = (int)ETaskComType.InStock,
  231. F_posidFrom = reqData.LocationNo,
  232. F_posidcur = reqData.LocationNo,
  233. F_orderType = (int)ETaskOrderType.EntryOrderTypeTrayGroup
  234. };
  235. //task.F_posidFrom = GetFreePointInfoByType(reqData.TrayNo.StartsWith("B") ? (int)EPointType.BSDPJ : (int)EPointType.DPJ).F_no;
  236. var entryorder = ctx.Insertable(new BILL_ENTRYORDER
  237. {
  238. F_addTime = DateTime.Now,
  239. F_addUserNo = LoginUser.UserNo,
  240. F_isBonded = IsBonded,
  241. F_orderStatus = (int)EOrderState.New,
  242. F_orderType = (int)EEntryOrderType.EntryOrderTypeTray,
  243. F_no = SerialNumberProvider.Instance.OrderNumber("wms", "RK"),
  244. F_totalOrderLines = 0,
  245. F_trayNo = reqData.TrayNo,
  246. F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
  247. }).ExecuteReturnEntity();
  248. task.F_orderNo = entryorder.F_no;
  249. //添加空托盘库存
  250. List<BILL_INVENTORY> lstInv = new List<BILL_INVENTORY>();
  251. lstInv.Add(new BILL_INVENTORY
  252. {
  253. F_addTime = DateTime.Now,
  254. F_addUserNo = LoginUser.UserNo,
  255. F_editTime = DateTime.Now,
  256. F_matNo = SysSetCore.GetSysSet().DefaultEmptyTrayGroupNo,
  257. F_matType = (int)EMatType.Tary,
  258. F_quantity = 1,
  259. F_trayNo = reqData.TrayNo,
  260. F_boxNo = Guid.NewGuid().ToString(),
  261. F_matName = SysSetCore.GetSysSet().DefaultEmptyTrayGroupName,
  262. F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
  263. });
  264. //更新库存
  265. UpdateInventory(lstInv, ctx);
  266. if (point.F_type == (int)EPointType.CPAGV)
  267. {
  268. var p = GetFreePointInfoByType((int)EPointType.SSXRK);
  269. task.F_EquipmentType = (int)EEquipmentType.AGV;
  270. task.F_posidNext = p.F_no;
  271. }
  272. else
  273. {
  274. var loc = ctx.Queryable<BASE_LOCATION>().OrderBy("F_layer ASC, F_line DESC,F_cell asc").First(f => f.F_status == (int)EWareCellState.Empty);
  275. if (loc == null)
  276. throw SysExCore.ThrowFailException($"没有可分配的货位!");
  277. ctx.Updateable<BASE_LOCATION>().SetColumns(it => new BASE_LOCATION()
  278. {
  279. F_editTime = DateTime.Now,
  280. F_editUserNo = LoginUser.UserNo,
  281. F_status = (int)EWareCellState.In,
  282. F_isBonded = IsBonded,
  283. F_trayNo = reqData.TrayNo
  284. }).Where(it => it.F_no == loc.F_no).ExecuteCommand();
  285. task.F_EquipmentType = (int)EEquipmentType.Convey;
  286. task.F_posidNext = loc.F_no;
  287. task.F_posidTo = loc.F_no;
  288. }
  289. ctx.Insertable(task).ExecuteReturnEntity();
  290. ctx.CommitTran();
  291. return SysExCore.GetResSucc("空托盘组入库任务生成成功");
  292. }
  293. catch (Exception ex)
  294. {
  295. ctx.RollbackTran();
  296. throw ex;
  297. }
  298. }
  299. }
  300. }
  301. }