FxTransferOrderCore.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  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.Core._02Entity;
  8. using WMS.Info;
  9. using WMS.Util;
  10. namespace WMS.Core.ServiceCore
  11. {
  12. public class FxTransferOrderCore
  13. {
  14. /// <summary>
  15. /// 获取分页数据
  16. /// <summary>
  17. /// <returns></returns>
  18. public IEnumerable<dynamic> GetPageList(Pagination pagination, string queryJson)
  19. {
  20. SqlSugarClient client = null;
  21. try
  22. {
  23. client = SysDbCore.GetDbCtx();
  24. int count = 0;
  25. var queryParam = queryJson.ToJObject();
  26. var db = client.Queryable<BILL_TRANSFERORDER>();
  27. //单据日期
  28. if (!queryParam["Btime"].IsEmpty() && !queryParam["Etime"].IsEmpty())
  29. {
  30. db.Where(ord => ord.F_editTime >= queryParam["Btime"].ToDate() && ord.F_editTime <= queryParam["Etime"].ToDate());
  31. }
  32. if (!queryParam["keyword"].IsEmpty())
  33. {
  34. db.Where(ord => ord.F_no.Contains(queryParam["keyword"].ToString()));
  35. }
  36. //if (!queryParam["F_trayNo"].IsEmpty())
  37. //{
  38. // string trayNo = queryParam["trayNo"].ToString();
  39. // db.Where(ord => ord.F_fromLoc.Contains(trayNo) || ord.F_toLoc.Contains(trayNo));
  40. //}
  41. //if (!queryParam["F_matNo"].IsEmpty())
  42. //{
  43. // string matNo = queryParam["F_matNo"].ToString();
  44. // db.Where(ord => ord.F_toPart.Contains(matNo) || ord.F_toPart.Contains(matNo));
  45. //}
  46. //if (!queryParam["F_matType"].IsEmpty())
  47. //{
  48. // string matType = queryParam["F_matType"].ToString();
  49. // db.Where(ord => ord.F_matType == FuncStr.NullToInt(matType));
  50. //}
  51. if (pagination.sord.ToUpper() != "ASC")
  52. {
  53. pagination.sidx = pagination.sidx + " DESC";
  54. }
  55. // (case when regexp_substr(ord.F_NO,'[^_]+',1,2) is null then ord.F_NO else regexp_substr(ord.F_NO,'[^_]+',1,2) end)
  56. var list = db.OrderBy(pagination.sidx).Select<BILL_TRANSFERORDER>(@"
  57. [F_no],
  58. [F_relatedOrderNo],
  59. [F_orderStatus],
  60. [F_totalOrderLines],
  61. [F_addTime],
  62. [F_addUserNo],
  63. [F_editTime],
  64. [F_editUserNo]").ToPageList(pagination.page, pagination.rows, ref count);
  65. pagination.records = count;
  66. return list;
  67. }
  68. catch (Exception ex)
  69. {
  70. throw ex;
  71. }
  72. finally
  73. {
  74. client.Dispose();
  75. }
  76. }
  77. /// <summary>
  78. /// 获取单据数据
  79. /// <summary>
  80. /// <returns></returns>
  81. public IEnumerable<BILL_TRANSFERORDERLINE> GeOrderItem(string OrderNo)
  82. {
  83. try
  84. {
  85. var lst = SysDbCore.GetDbCtx().Queryable<BILL_TRANSFERORDERLINE>().Where(it => it.F_pNo == OrderNo);
  86. var list = lst.Select<BILL_TRANSFERORDERLINE>(@" [F_no],
  87. [F_pNo],
  88. [F_fromLoc],
  89. [F_fromPart],
  90. [F_fromLot],
  91. [F_FromRef],
  92. [F_toLoc],
  93. [F_toPart],
  94. [F_toLot],
  95. [F_toRef],
  96. [F_trType],
  97. [F_task],
  98. [F_wLocGp],
  99. [F_issNbr],
  100. [F_qtyExp],
  101. [F_addTime],
  102. [F_addUserNo],
  103. [F_editTime],
  104. [F_editUserNo]").ToList();
  105. return list;
  106. }
  107. catch (Exception ex)
  108. {
  109. throw ex;
  110. }
  111. }
  112. /// <summary>
  113. /// 获取分页数据
  114. /// <summary>
  115. /// <returns></returns>
  116. public List<FX_TranD> GetHaveTask(string queryJson)
  117. {
  118. try
  119. {
  120. var queryParam = queryJson.ToJObject();
  121. StringBuilder sb = new StringBuilder();
  122. //单据日期
  123. if (!queryParam["Btime"].IsEmpty() && !queryParam["Etime"].IsEmpty())
  124. {
  125. sb.Append($" and createDate>'{queryParam["Btime"]}' and createDate<'{queryParam["Etime"]}'");
  126. }
  127. if (!queryParam["F_matNo"].IsEmpty())
  128. {
  129. string matNo = queryParam["F_matNo"].ToString();
  130. sb.Append($" and FromPart='{matNo}'");
  131. }
  132. var trands = FxDbCore.GetData<FX_TranD>($"select * from pub.TranD where FromSite='SUZ' and Task='TRANSFER' {sb}");
  133. trands.ForEach(t =>
  134. {
  135. t.pt_prod_line = CacheFacade.GetMatInfo(t.FromPart, string.IsNullOrEmpty(t.FromRef) ? EMatType.Product : EMatType.Mat)?.F_projectNo;
  136. });
  137. return trands;
  138. }
  139. catch (Exception ex)
  140. {
  141. throw ex;
  142. }
  143. }
  144. /// <summary>
  145. /// 无任务转仓保存
  146. /// <summary>
  147. /// <returns></returns>
  148. public void NotHavaTaskSave(StockOutRequest request, List<BILL_INVENTORY> invs, LoginUserInfo loginUserInfo)
  149. {
  150. //同步出库单明细
  151. using (var ctx = SysDbCore.GetDbCtx())
  152. {
  153. try
  154. {
  155. if (!invs.Any()) throw SysExCore.ThrowFailException($"请选择转仓数据行!");
  156. if (string.IsNullOrWhiteSpace(request.PickPort)) throw SysExCore.ThrowFailException($"请选择拣货口!");
  157. ctx.BeginTran();
  158. var order = new BILL_TRANSFERORDER
  159. {
  160. F_addTime = DateTime.Now,
  161. F_addUserNo = loginUserInfo.UserNo,
  162. F_no = SerialNumberProvider.Instance.OrderNumber("wms", "ZC"),
  163. F_orderStatus = (int)EOrderState.New,
  164. //F_relatedOrderNo = string.Join(",", trands.Select(s => s.IssNbr)),
  165. F_totalOrderLines = invs.Count,
  166. };
  167. var stockOut = new BILL_STOCKOUT
  168. {
  169. F_no = SerialNumberProvider.Instance.OrderNumber("wms", "CK"),
  170. F_editTime = DateTime.Now,
  171. F_addTime = DateTime.Now,
  172. F_addUserNo = loginUserInfo.UserNo,
  173. F_orderStatus = (int)EOrderState.New,
  174. F_orderType = (int)EStockOutOrderType.StockOutOrderTypeTransfer,
  175. F_relatedOrderNo = order.F_no,
  176. F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo,
  177. F_totalOrderLines = invs.Count
  178. };
  179. order.F_relatedOrderNo = stockOut.F_no;
  180. ctx.Insertable(order).ExecuteCommand();
  181. ctx.Insertable(stockOut).ExecuteCommand();
  182. //转仓明细
  183. var dicPort = new FxStockOutOrderCore().GetPickPort(ctx, request.PickPort);
  184. var stockOutDetailLst = new List<BILL_STOCKOUTLINEDETAIL>();
  185. foreach (var orderLine in invs)
  186. {
  187. var transferOrder = ctx.Queryable<BILL_TRANSFERORDER, BILL_TRANSFERORDERLINE>((ord, info) => new object[] { JoinType.Inner, ord.F_no == info.F_pNo })
  188. .Where((ord, info) => info.F_fromPart == orderLine.F_matNo && ord.F_orderStatus != (int)EOrderState.Executed).Select<BILL_TRANSFERORDER>();
  189. if (transferOrder.Any())
  190. throw SysExCore.ThrowFailException($"转仓物料{orderLine.F_matNo}已生成过转仓任务!");
  191. var line = new BILL_TRANSFERORDERLINE
  192. {
  193. F_addTime = DateTime.Now,
  194. F_editTime = DateTime.Now,
  195. F_fromLoc = orderLine.F_trayNo,
  196. F_fromPart = orderLine.F_matNo,
  197. F_FromRef = orderLine.F_uid,
  198. F_qtyExp = orderLine.F_quantity,
  199. F_pNo = order.F_no,
  200. F_addUserNo = loginUserInfo.UserNo
  201. };
  202. ctx.Insertable(line).ExecuteCommand();
  203. var location = ctx.Queryable<BASE_LOCATION>().First(f => f.F_trayNo == orderLine.F_trayNo && f.F_status == (int)EWareCellState.Stored);
  204. if (location == null)
  205. throw SysExCore.ThrowFailException($"托盘{ orderLine.F_trayNo}货位数据异常!");
  206. ctx.Insertable(new BILL_STOCKOUTLINEDETAIL
  207. {
  208. F_addTime = DateTime.Now,
  209. F_addUserNo = loginUserInfo.UserNo,
  210. F_boxNo = orderLine.F_boxNo,
  211. F_locationNo = location.F_no,
  212. F_trayNo = orderLine.F_trayNo,
  213. F_matName = orderLine.F_matName,
  214. F_matType = orderLine.F_matType,
  215. F_matNo = orderLine.F_matNo,
  216. F_pNo = stockOut.F_no,
  217. F_quantity = orderLine.F_quantity,
  218. }).ExecuteCommand();
  219. }
  220. //出库计划明细
  221. var matInfoGrp = invs.GroupBy(g => new { g.F_matNo, g.F_matType, g.F_matName }).Select(s => new { s.Key.F_matNo, s.Key.F_matType, s.Key.F_matName, qty = s.Sum(c => c.F_quantity) }).ToList();
  222. foreach (var orderLine in matInfoGrp)
  223. {
  224. var stockOutline = new BILL_STOCKOUTLINE
  225. {
  226. F_matName = orderLine.F_matName,
  227. F_addTime = DateTime.Now,
  228. F_matNo = orderLine.F_matNo,
  229. F_planQty = orderLine.qty,
  230. F_addUserNo = loginUserInfo.UserNo,
  231. F_matType = orderLine.F_matType,
  232. F_editTime = DateTime.Now,
  233. F_pNo = stockOut.F_no,
  234. F_orderLineNo = matInfoGrp.IndexOf(orderLine) + 1,
  235. F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
  236. };
  237. ctx.Insertable(stockOutline).ExecuteCommand();
  238. }
  239. //生成托盘任务
  240. var trayGroup = invs.GroupBy(g => new { g.F_trayNo }).Select(s => new { s.Key.F_trayNo, qty = s.Sum(c => c.F_quantity) }).ToList();
  241. trayGroup.ForEach(tray =>
  242. {
  243. var location = ctx.Queryable<BASE_LOCATION>().First(f => f.F_trayNo == tray.F_trayNo && f.F_status == (int)EWareCellState.Stored);
  244. var task = new WMS_TASK
  245. {
  246. F_addTime = DateTime.Now,
  247. F_addUserNo = loginUserInfo.UserNo,
  248. F_trayNo = tray.F_trayNo,
  249. F_priority = request.F_priority,
  250. F_taskStatus = (int)ETaskStatus.NotIssued,
  251. F_taskType = (int)ETaskComType.OutStock,
  252. F_orderType = (int)ETaskOrderType.StockOutOrderTypeTransfer,
  253. F_posidFrom = location.F_no,
  254. F_isBonded = location.F_isBonded,
  255. F_orderNo = order.F_no,
  256. F_posidcur = location.F_no,
  257. //F_posidNext = ctx.Queryable<BASE_POINT>().First(c => c.F_type == (int)EPointType.CKXYGDZ).F_no,
  258. F_EquipmentType = (int)EEquipmentType.RGV
  259. };
  260. //锁定出库库存
  261. ctx.Updateable<BASE_LOCATION>().SetColumns(it =>
  262. new BASE_LOCATION()
  263. {
  264. F_addTime = DateTime.Now,
  265. F_editUserNo = loginUserInfo.UserNo,
  266. F_status = (int)EWareCellState.Out,
  267. }).Where(w => w.F_no == location.F_no).ExecuteCommand();
  268. //分配出料口
  269. var curMatInv = ctx.Queryable<BILL_INVENTORY>().Where(c => c.F_trayNo == tray.F_trayNo);
  270. var matInvQty = curMatInv.Sum(s => s.F_quantity);
  271. if (tray.qty == matInvQty)
  272. {
  273. //当前托盘数量等于指定数量则整盘出
  274. task.F_posidNext = new AppCoreBLL().GetFreePointInfoByType((int)EPointType.ZPKCK).F_no;
  275. task.F_posidTo = new AppCoreBLL().GetFreePointInfoByType((int)EPointType.CPAGV).F_no;
  276. }
  277. else
  278. {
  279. var kvPort = dicPort.OrderBy(o => o.Value).FirstOrDefault();
  280. dicPort[kvPort.Key] += 1;
  281. task.F_posidTo = kvPort.Key;
  282. task.F_posidNext = kvPort.Key;
  283. task.F_pickPort = kvPort.Key;
  284. }
  285. ctx.Insertable(task).ExecuteCommand();
  286. });
  287. ctx.CommitTran();
  288. }
  289. catch (Exception ex)
  290. {
  291. ctx.RollbackTran();
  292. throw ex;
  293. }
  294. }
  295. }
  296. /// <summary>
  297. /// 有任务转仓保存
  298. /// <summary>
  299. /// <returns></returns>
  300. public void HavaTaskSave(StockOutRequest orderRequest, List<FX_TranD> sod_det, LoginUserInfo loginUserInfo)
  301. {
  302. //同步出库单明细
  303. using (var ctx = SysDbCore.GetDbCtx())
  304. {
  305. try
  306. {
  307. if (!sod_det.Any()) throw SysExCore.ThrowFailException($"明细不能为空!");
  308. if (ctx.Queryable<BILL_STOCKOUT>().Any(c => c.F_relatedOrderNo == orderRequest.F_no))
  309. throw SysExCore.ThrowFailException($"工单{orderRequest.F_no}已生成出库任务!");
  310. if (sod_det.Any(c => string.IsNullOrWhiteSpace(c.FromLoc))) throw SysExCore.ThrowFailException($"明细托盘号不能为空!");
  311. ctx.BeginTran();
  312. var bILL_STOCKOUT = new BILL_STOCKOUT
  313. {
  314. F_addTime = DateTime.Now,
  315. F_addUserNo = loginUserInfo.UserNo,
  316. F_no = SerialNumberProvider.Instance.OrderNumber("wms", "CK"),
  317. F_orderStatus = (int)EOrderState.New,
  318. F_orderType = (int)EStockOutOrderType.StockOutOrderTypeMaterial,
  319. F_relatedOrderNo = sod_det.FirstOrDefault().IssNbr,
  320. F_totalOrderLines = sod_det.Count,
  321. F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
  322. };
  323. ctx.Insertable(bILL_STOCKOUT).ExecuteCommand();
  324. //出库明细
  325. var matGrp = sod_det.GroupBy(g => new { g.FromPart, g.IssNbr }).Select(s => new FX_TranD { IssNbr = s.Key.IssNbr, FromPart = s.Key.FromPart, QtyExp = s.Sum(k => k.QtyExp) }).ToList();
  326. var dicPort = new FxStockOutOrderCore().GetPickPort(ctx, orderRequest.PickPort);
  327. foreach (var orderLine in matGrp)
  328. {
  329. var matInfo = ctx.Queryable<BASE_ITEM>().First(f => f.F_matNo == orderLine.FromPart);
  330. var line = new BILL_STOCKOUTLINE
  331. {
  332. F_addTime = DateTime.Now,
  333. //F_actualQty = orderLine.sod_qty_ship,
  334. F_planQty = orderLine.QtyExp,
  335. F_matNo = orderLine.FromPart,
  336. F_matName = matInfo.F_matName,
  337. F_matType = (int)EMatType.Product,
  338. F_orderLineNo = matGrp.IndexOf(orderLine) + 1,
  339. F_pNo = bILL_STOCKOUT.F_no,
  340. F_warehouseNo = bILL_STOCKOUT.F_warehouseNo,
  341. F_addUserNo = loginUserInfo.UserNo,
  342. F_editTime = DateTime.Now
  343. };
  344. ctx.Insertable(line).ExecuteCommand();
  345. }
  346. //出库实际明细
  347. var matInfoGrp = sod_det.GroupBy(g => new { g.FromPart, g.IssNbr, g.FromLoc }).Select(s => new FX_TranD { IssNbr = s.Key.IssNbr, FromPart = s.Key.FromPart, FromLoc = s.Key.FromLoc, QtyExp = s.Sum(k => k.QtyExp) }).ToList();
  348. foreach (var orderLine in matInfoGrp)
  349. {
  350. var inv = ctx.Queryable<BILL_INVENTORY>().First(f => f.F_trayNo == orderLine.FromLoc && f.F_matNo == orderLine.FromPart);
  351. if (inv == null || inv.F_quantity < orderLine.QtyExp)
  352. throw SysExCore.ThrowFailException($"托盘{ orderLine.FromLoc}物料{orderLine.FromPart}库存不够!");
  353. var location = ctx.Queryable<BASE_LOCATION>().First(f => f.F_trayNo == orderLine.FromLoc && f.F_status == (int)EWareCellState.Stored);
  354. if (location == null)
  355. throw SysExCore.ThrowFailException($"托盘{ orderLine.FromLoc}货位数据异常!");
  356. ctx.Insertable(new BILL_STOCKOUTLINEDETAIL
  357. {
  358. F_addTime = DateTime.Now,
  359. F_addUserNo = loginUserInfo.UserNo,
  360. //F_boxNo = item.F_boxNo,
  361. F_locationNo = location.F_no,
  362. F_matNo = orderLine.FromPart,
  363. F_matName = inv.F_matName,
  364. F_matType = inv.F_matType,
  365. F_pNo = bILL_STOCKOUT.F_no,
  366. F_quantity = orderLine.QtyExp,
  367. F_trayNo = orderLine.FromLoc,
  368. F_boxNo = inv.F_boxNo
  369. }).ExecuteCommand();
  370. var task = new WMS_TASK
  371. {
  372. F_addTime = DateTime.Now,
  373. F_addUserNo = loginUserInfo.UserNo,
  374. F_trayNo = orderLine.FromLoc,
  375. F_priority = orderRequest.F_priority,
  376. F_taskStatus = (int)ETaskStatus.NotIssued,
  377. F_taskType = (int)ETaskComType.OutStock,
  378. F_orderType = (int)ETaskOrderType.StockOutOrderTypeMaterial,
  379. F_posidFrom = location.F_no,
  380. F_isBonded = location.F_isBonded,
  381. F_orderNo = bILL_STOCKOUT.F_no,
  382. F_posidcur = location.F_no,
  383. //F_posidNext = ctx.Queryable<BASE_POINT>().First(c => c.F_type == (int)EPointType.CKXYGDZ).F_no,
  384. F_EquipmentType = (int)EEquipmentType.RGV
  385. };
  386. //分配出料口
  387. var curMatInv = ctx.Queryable<BILL_INVENTORY>().Where(c => c.F_trayNo == orderLine.FromLoc);
  388. var matInvQty = curMatInv.Sum(s => s.F_quantity);
  389. if (orderLine.QtyExp == matInvQty)
  390. {
  391. //当前托盘数量等于指定数量则整盘出
  392. task.F_posidNext = new AppCoreBLL().GetFreePointInfoByType((int)EPointType.ZPKCK).F_no;
  393. task.F_posidTo = new AppCoreBLL().GetFreePointInfoByType((int)EPointType.CPAGV).F_no;
  394. }
  395. else
  396. {
  397. var kvPort = dicPort.OrderBy(o => o.Value).FirstOrDefault();
  398. dicPort[kvPort.Key] += 1;
  399. task.F_posidTo = kvPort.Key;
  400. task.F_posidNext = kvPort.Key;
  401. task.F_pickPort = kvPort.Key;
  402. }
  403. ctx.Insertable(task).ExecuteCommand();
  404. //锁定出库库存
  405. ctx.Updateable<BASE_LOCATION>().SetColumns(it =>
  406. new BASE_LOCATION()
  407. {
  408. F_addTime = DateTime.Now,
  409. F_editUserNo = loginUserInfo.UserNo,
  410. F_status = (int)EWareCellState.Out,
  411. }).Where(w => w.F_no == location.F_no).ExecuteCommand();
  412. }
  413. sod_det.ForEach(det =>
  414. {
  415. det.AddTime = DateTime.Now;
  416. det.AddUserNo = loginUserInfo.UserNo;
  417. });
  418. ctx.Insertable(sod_det).ExecuteCommand();
  419. ctx.CommitTran();
  420. }
  421. catch (Exception ex)
  422. {
  423. ctx.RollbackTran();
  424. throw ex;
  425. }
  426. }
  427. }
  428. }
  429. }