FxStockOutOrderCore.cs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636
  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.Core._02Entity.FeiXu;
  9. using WMS.Info;
  10. using WMS.Info.Dto;
  11. using WMS.Util;
  12. namespace WMS.Core.ServiceCore
  13. {
  14. public class FxStockOutOrderCore
  15. {
  16. /// <summary>
  17. /// 获取分页数据
  18. /// <summary>
  19. /// <returns></returns>
  20. public IEnumerable<dynamic> GetStockOutOrderPageList(Pagination pagination, string queryJson)
  21. {
  22. SqlSugarClient client = null;
  23. try
  24. {
  25. client = SysDbCore.GetDbCtx();
  26. int count = 0;
  27. var queryParam = queryJson.ToJObject();
  28. var db = client.Queryable<BILL_STOCKOUT>().Where(ord => ord.F_isDelete == 0);
  29. //单据日期
  30. if (!queryParam["Btime"].IsEmpty() && !queryParam["Etime"].IsEmpty())
  31. {
  32. db.Where(ord => ord.F_addTime >= queryParam["Btime"].ToDate() && ord.F_addTime <= queryParam["Etime"].ToDate());
  33. }
  34. if (!queryParam["keyword"].IsEmpty())
  35. {
  36. string kw = queryParam["keyword"].ToString();
  37. db.Where(ord => ord.F_no.Contains(kw) || ord.F_relatedOrderNo.Contains(kw));
  38. }
  39. if (pagination.sord.ToUpper() != "ASC")
  40. {
  41. pagination.sidx = pagination.sidx + " DESC";
  42. }
  43. var list = db.OrderBy(pagination.sidx).Select<dynamic>(@"
  44. [F_warehouseNo],
  45. [F_no],
  46. [F_relatedOrderNo],
  47. [F_totalOrderLines],
  48. [F_orderType],
  49. [F_orderStatus],
  50. [F_memo],
  51. [F_addTime],
  52. [F_addUserNo],
  53. [F_editTime],
  54. [F_editUserNo],
  55. [F_canceledTime],
  56. [F_canceledUserNo],
  57. [F_canceledReason],
  58. [F_ISDELETE]").ToPageList(pagination.page, pagination.rows, ref count);
  59. pagination.records = count;
  60. return list;
  61. }
  62. catch (Exception ex)
  63. {
  64. throw ex;
  65. }
  66. finally
  67. {
  68. client.Dispose();
  69. }
  70. }
  71. /// <summary>
  72. /// 获取单据数据
  73. /// <summary>
  74. /// <returns></returns>
  75. public IEnumerable<BILL_STOCKOUTLINE> GeSockOutOrderItem(string OrderNo)
  76. {
  77. try
  78. {
  79. var lst = SysDbCore.GetDbCtx().Queryable<BILL_STOCKOUTLINE>().Where(it => it.F_pNo == OrderNo);
  80. var list = lst.Select<BILL_STOCKOUTLINE>(@" [F_rowNo],
  81. [F_pNo],
  82. [F_warehouseNo],
  83. [F_orderLineNo],
  84. [F_matNo],
  85. [F_matName],
  86. [F_matType],
  87. [F_planQty],
  88. [F_actualQty],
  89. [F_batchNo],
  90. [F_unit],
  91. [F_addTime],
  92. [F_addUserNo],
  93. [F_editTime],
  94. [F_editUserNo] ").ToList();
  95. return list;
  96. }
  97. catch (Exception ex)
  98. {
  99. throw ex;
  100. }
  101. }
  102. /// <summary>
  103. /// 获取单据数据
  104. /// <summary>
  105. /// <returns></returns>
  106. public dynamic GetAssignFormData(string pNo)
  107. {
  108. try
  109. {
  110. var lst = SysDbCore.GetDbCtx().SqlQueryable<dynamic>($@"SELECT ord.F_no,ord.F_relatedOrderNo,SUM(line.F_planQty) planSum,SUM(line.F_actualQty) actualSum FROM dbo.BILL_STOCKOUT ord JOIN dbo.BILL_STOCKOUTLINE line ON ord.F_no=line.F_pNo
  111. WHERE ord.F_no='{pNo}' GROUP BY ord.F_no,ord.F_relatedOrderNo");
  112. return lst.First();
  113. }
  114. catch (Exception ex)
  115. {
  116. throw ex;
  117. }
  118. }
  119. /// <summary>
  120. /// 获取实际出库数据
  121. /// <summary>
  122. /// <returns></returns>
  123. public IEnumerable<BILL_STOCKOUTLINEDETAIL> GetStockOutDetail(string pNo, string keyword)
  124. {
  125. try
  126. {
  127. var lst = SysDbCore.GetDbCtx().Queryable<BILL_STOCKOUTLINEDETAIL>().Where(w => w.F_pNo == pNo);
  128. if (!string.IsNullOrWhiteSpace(keyword))
  129. lst = lst.Where(w => w.F_matNo.Contains(keyword));
  130. var list = lst.Select<BILL_STOCKOUTLINEDETAIL>(@" [F_rowNo],
  131. [F_pNo],
  132. [F_trayNo],
  133. [F_boxNo],
  134. [F_locationNo],
  135. [F_quantity],
  136. [F_addUserNo],
  137. [F_addTime],
  138. [F_matType],
  139. [F_matNo] ");
  140. return list.ToList();
  141. }
  142. catch (Exception ex)
  143. {
  144. throw ex;
  145. }
  146. }
  147. public IEnumerable<BILL_INVENTORY> GetMatInventory(string pno)
  148. {
  149. try
  150. {
  151. //@" inv.[F_no],
  152. // inv.[F_warehouseNo],
  153. // inv.[F_matNo],
  154. // inv.[F_matName],
  155. // inv.[F_matType],
  156. // inv.[F_quantity],
  157. // inv.[F_lockQty],
  158. // inv.[F_trayNo],
  159. // inv.[F_batchNo],
  160. // inv.[F_memo],
  161. // inv.[F_addUserNo],
  162. // inv.[F_addTime] "
  163. var lst = SysDbCore.GetDbCtx().Queryable<BILL_INVENTORY, BILL_STOCKOUTLINE>((inv, ord) => new object[] { JoinType.Inner, inv.F_matNo == ord.F_matNo && inv.F_matType == ord.F_matType }).Where((inv, ord) => ord.F_pNo == pno && inv.F_quantity > 0);
  164. var list = lst.Select((inv, ord) => new BILL_INVENTORY
  165. {
  166. F_addTime = inv.F_addTime,
  167. F_addUserNo = inv.F_addUserNo,
  168. F_batchNo = inv.F_batchNo,
  169. F_boxNo = inv.F_boxNo,
  170. F_editTime = inv.F_editTime,
  171. F_editUserNo = inv.F_editUserNo,
  172. F_isBonded = inv.F_isBonded,
  173. F_matNo = inv.F_matNo,
  174. F_matName = inv.F_matName,
  175. F_matType = inv.F_matType,
  176. F_trayNo = inv.F_trayNo,
  177. F_projectNo = inv.F_projectNo,
  178. F_quantity = inv.F_quantity
  179. }).ToList();
  180. return list;
  181. }
  182. catch (Exception ex)
  183. {
  184. throw ex;
  185. }
  186. }
  187. /// <summary>
  188. /// 作废
  189. /// </summary>
  190. /// <param name="keyValue">主键</param>
  191. public void CanelEntity(LoginUserInfo loginUserInfo, string _F_No)
  192. {
  193. SqlSugarClient client = null;
  194. try
  195. {
  196. client = SysDbCore.GetDbCtx();
  197. var db = client.Queryable<BILL_STOCKOUT>().Where(it => it.F_no == _F_No).First();
  198. if (db == null)
  199. throw new Exception("出库单不存在");
  200. if (db.F_isDelete == 1)
  201. throw new Exception("明细已删除");
  202. if (db.F_orderStatus > 1)
  203. throw new Exception("单据已经执行中,不可删除");
  204. db.F_canceledUserNo = loginUserInfo.UserNo;
  205. db.F_canceledTime = DateTime.Now;
  206. db.F_orderStatus = 6;
  207. SysDbCore.GetDbCtx().Updateable(db).UpdateColumns(it => new { it.F_canceledUserNo, it.F_canceledTime, it.F_orderStatus }).ExecuteCommand();
  208. }
  209. catch (Exception ex)
  210. {
  211. throw ex;
  212. }
  213. }
  214. /// <summary>
  215. /// 保存成品销售出库单
  216. /// <summary>
  217. /// <returns></returns>
  218. public void SoSave(List<FX_sod_det> sod_det, LoginUserInfo loginUserInfo)
  219. {
  220. #region 验证工单
  221. //验证工单
  222. //StringBuilder sb = new StringBuilder();
  223. //sb.Append(@" <dsWorkOrderReceipt>");
  224. //foreach (var item in fX_Sod)
  225. //{
  226. // sb.Append(@"<workOrderReceipt>");
  227. // sb.Append($@"<woLot>{item.sod_nbr}</woLot>");
  228. // sb.Append($@"<lotserialQty>{item.sod_qty_ord}</lotserialQty> ");
  229. // //<workOrderReceipt>
  230. // // <woLot>10636304</woLot>
  231. // // <lotserialQty>200</lotserialQty>
  232. // // <lotserial>text</lotserial>
  233. // // <location>text</location>
  234. // //</workOrderReceipt>
  235. // //<workOrderReceipt>
  236. // // <woLot>16373107</woLot>
  237. // // <lotserialQty>1000</lotserialQty>
  238. // // <lotserial>text</lotserial>
  239. // // <location>text</location>
  240. // //</workOrderReceipt>
  241. // sb.Append(@"<workOrderReceipt>");
  242. //}
  243. //sb.Append(@" </dsWorkOrderReceipt>");
  244. //var res = WebServiceCall.callWebService(SysSetCore.GetSysSet().FxWebServiceUrl, "processQdocMessage", sb.ToString());
  245. //if (res.Contains("<ns1:result>error</ns1:result>"))
  246. // throw SysExCore.ThrowFailException("工单验证失败!");
  247. #endregion
  248. //同步出库单明细
  249. using (var ctx = SysDbCore.GetDbCtx())
  250. {
  251. try
  252. {
  253. if (ctx.Queryable<BILL_STOCKOUT>().Any(c => c.F_relatedOrderNo == sod_det.FirstOrDefault().sod_nbr))
  254. throw SysExCore.ThrowFailException($"工单{sod_det.FirstOrDefault().sod_nbr}已生成出库任务!");
  255. ctx.BeginTran();
  256. var bILL_STOCKOUT = new BILL_STOCKOUT
  257. {
  258. F_addTime = DateTime.Now,
  259. F_addUserNo = loginUserInfo.UserNo,
  260. F_no = SerialNumberProvider.Instance.OrderNumber("wms", "CK"),
  261. F_orderStatus = (int)EOrderState.New,
  262. F_orderType = (int)EStockOutOrderType.StockOutOrderTypeProduct,
  263. F_relatedOrderNo = sod_det.FirstOrDefault()?.sod_nbr,
  264. F_totalOrderLines = sod_det.Count,
  265. F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
  266. };
  267. ctx.Insertable(bILL_STOCKOUT).ExecuteCommand();
  268. foreach (var orderLine in sod_det)
  269. {
  270. orderLine.add_time = DateTime.Now;
  271. orderLine.add_user_no = loginUserInfo.UserNo;
  272. ctx.Insertable(orderLine).ExecuteCommand();
  273. var line = new BILL_STOCKOUTLINE
  274. {
  275. F_addTime = DateTime.Now,
  276. F_actualQty = orderLine.sod_qty_ship,
  277. F_planQty = orderLine.sod_qty_ord,
  278. F_matNo = orderLine.sod_part,
  279. F_matName = CacheFacade.GetMatInfo(orderLine.sod_part, EMatType.Product)?.F_matName,
  280. F_matType = (int)EMatType.Product,
  281. F_orderLineNo = sod_det.IndexOf(orderLine) + 1,
  282. F_pNo = bILL_STOCKOUT.F_no,
  283. F_warehouseNo = bILL_STOCKOUT.F_warehouseNo,
  284. F_addUserNo = loginUserInfo.UserNo
  285. };
  286. ctx.Insertable(line).ExecuteCommand();
  287. }
  288. ctx.CommitTran();
  289. }
  290. catch (Exception ex)
  291. {
  292. ctx.RollbackTran();
  293. throw ex;
  294. }
  295. }
  296. }
  297. /// <summary>
  298. /// 指定出库
  299. /// </summary>
  300. /// <param name="orderRequest"></param>
  301. /// <param name="lineDetailsRequest"></param>
  302. /// <param name="LoginUser"></param>
  303. public void AssignCreate(StockOutRequest orderRequest, List<StockLineDetailRequest> lineDetailsRequest, LoginUserInfo LoginUser)
  304. {
  305. using (var ctx = SysDbCore.GetDbCtx())
  306. {
  307. try
  308. {
  309. var matInfo = ctx.Queryable<BILL_STOCKOUTLINE>().Where(c => c.F_pNo == orderRequest.F_no && c.F_matNo == lineDetailsRequest.FirstOrDefault().F_matNo).First();
  310. if (matInfo.F_planQty != lineDetailsRequest.Sum(s => s.F_AssignQty))
  311. SysExCore.ThrowFailException("不允许部分指定!");
  312. ctx.BeginTran();
  313. var tasks = new List<WMS_TASK>();
  314. var dicPort = GetPickPort(ctx, orderRequest.PickPort);
  315. foreach (var item in lineDetailsRequest)
  316. {
  317. var location = ctx.Queryable<BASE_LOCATION>().First(f => f.F_trayNo == item.F_trayNo && f.F_status == (int)EWareCellState.Stored);
  318. if (location == null)
  319. throw SysExCore.ThrowFailException($"托盘{item.F_trayNo}货位数据异常!");
  320. ctx.Insertable(new BILL_STOCKOUTLINEDETAIL
  321. {
  322. F_addTime = DateTime.Now,
  323. F_addUserNo = LoginUser.UserNo,
  324. F_boxNo = item.F_boxNo,
  325. F_locationNo = location.F_no,
  326. F_matNo = item.F_matNo,
  327. F_matName = item.F_matName,
  328. F_matType = item.F_matType,
  329. F_pNo = orderRequest.F_no,
  330. F_quantity = item.F_AssignQty,
  331. F_trayNo = item.F_trayNo,
  332. F_projectNo = item.F_projectNo
  333. }).ExecuteCommand();
  334. var stockOutLine = ctx.Queryable<BILL_STOCKOUTLINE>().Where(c => c.F_matNo == item.F_matNo && c.F_pNo == orderRequest.F_no).First();
  335. ctx.Updateable<BILL_STOCKOUTLINE>().SetColumns(it => new BILL_STOCKOUTLINE
  336. {
  337. F_actualQty = stockOutLine.F_actualQty + item.F_AssignQty,
  338. F_editUserNo = LoginUser.UserNo,
  339. F_editTime = DateTime.Now,
  340. }).Where(w => w.F_rowNo == stockOutLine.F_rowNo).ExecuteCommand();
  341. }
  342. //生成托盘任务
  343. var trayGroup = lineDetailsRequest.GroupBy(g => new { g.F_trayNo }).Select(s => new { s.Key.F_trayNo, qty = s.Sum(c => c.F_AssignQty) }).ToList();
  344. trayGroup.ForEach(tray =>
  345. {
  346. var location = ctx.Queryable<BASE_LOCATION>().First(f => f.F_trayNo == tray.F_trayNo && f.F_status == (int)EWareCellState.Stored);
  347. var task = new WMS_TASK
  348. {
  349. F_addTime = DateTime.Now,
  350. F_addUserNo = LoginUser.UserNo,
  351. F_trayNo = tray.F_trayNo,
  352. F_priority = (int)EPriority.NotUrgent,
  353. F_taskStatus = (int)ETaskStatus.NotIssued,
  354. F_taskType = (int)ETaskComType.OutStock,
  355. F_orderType = (int)ETaskOrderType.StockOutOrderTypeProduct,
  356. F_posidFrom = location.F_no,
  357. //F_boxNo = item.F_boxNo,
  358. F_isBonded = location.F_isBonded,
  359. F_orderNo = orderRequest.F_no,
  360. F_posidcur = location.F_no,
  361. //F_posidNext = location.F_no,
  362. F_EquipmentType = (int)EEquipmentType.RGV
  363. };
  364. //分配出料口
  365. var curMatInv = ctx.Queryable<BILL_INVENTORY>().Where(c => c.F_trayNo == tray.F_trayNo);
  366. if (tray.qty == curMatInv.Sum(s => s.F_quantity))
  367. {
  368. //当前托盘数量等于指定数量则整盘出
  369. task.F_posidTo = new AppCoreBLL().GetFreePointInfoByType((int)EPointType.ZPKCK).F_no;
  370. task.F_posidNext = task.F_posidTo;
  371. }
  372. else
  373. {
  374. if(string.IsNullOrWhiteSpace(orderRequest.PickPort))
  375. throw SysExCore.ThrowFailException($"该托不满足整盘出请选择拣选口!");
  376. var kvPort = dicPort.OrderBy(o => o.Value).FirstOrDefault();
  377. dicPort[kvPort.Key] += 1;
  378. task.F_posidTo = kvPort.Key;
  379. task.F_pickPort = kvPort.Key;
  380. task.F_posidNext = kvPort.Key;
  381. }
  382. ctx.Insertable(task).ExecuteCommand();
  383. //锁定货位
  384. ctx.Updateable<BASE_LOCATION>().SetColumns(it => new BASE_LOCATION
  385. {
  386. F_editTime = DateTime.Now,
  387. F_editUserNo = LoginUser.UserNo,
  388. F_status = (int)EWareCellState.Out,
  389. }).Where(w => w.F_no == location.F_no).ExecuteCommand();
  390. });
  391. ctx.Updateable<BILL_STOCKOUT>().SetColumns(it => new BILL_STOCKOUT
  392. {
  393. F_editTime = DateTime.Now,
  394. F_editUserNo = LoginUser.UserNo,
  395. F_orderStatus = (int)EOrderState.Executing,
  396. }).Where(w => w.F_no == orderRequest.F_no).ExecuteCommand();
  397. ctx.CommitTran();
  398. }
  399. catch (Exception e)
  400. {
  401. ctx.RollbackTran();
  402. throw e;
  403. }
  404. }
  405. }
  406. /// <summary>
  407. /// 保存原料出库单
  408. /// <summary>
  409. /// <returns></returns>
  410. public void SoMatSave(StockOutRequest orderRequest, List<FX_TranD> sod_det, LoginUserInfo loginUserInfo)
  411. {
  412. //同步出库单明细
  413. using (var ctx = SysDbCore.GetDbCtx())
  414. {
  415. try
  416. {
  417. if (!sod_det.Any()) throw SysExCore.ThrowFailException($"明细不能为空!");
  418. if (ctx.Queryable<BILL_STOCKOUT>().Any(c => c.F_relatedOrderNo == orderRequest.F_no))
  419. throw SysExCore.ThrowFailException($"工单{orderRequest.F_no}已生成出库任务!");
  420. if (sod_det.Any(c => string.IsNullOrWhiteSpace(c.FromLoc))) throw SysExCore.ThrowFailException($"明细托盘号不能为空!");
  421. ctx.BeginTran();
  422. var bILL_STOCKOUT = new BILL_STOCKOUT
  423. {
  424. F_addTime = DateTime.Now,
  425. F_addUserNo = loginUserInfo.UserNo,
  426. F_no = SerialNumberProvider.Instance.OrderNumber("wms", "CK"),
  427. F_orderStatus = (int)EOrderState.New,
  428. F_orderType = (int)EStockOutOrderType.StockOutOrderTypeMaterial,
  429. F_relatedOrderNo = sod_det.FirstOrDefault().IssNbr,
  430. F_totalOrderLines = sod_det.Count,
  431. F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
  432. };
  433. ctx.Insertable(bILL_STOCKOUT).ExecuteCommand();
  434. //出库明细
  435. 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();
  436. var dicPort = GetPickPort(ctx, orderRequest.PickPort);
  437. foreach (var orderLine in matGrp)
  438. {
  439. var line = new BILL_STOCKOUTLINE
  440. {
  441. F_addTime = DateTime.Now,
  442. //F_actualQty = orderLine.sod_qty_ship,
  443. F_planQty = orderLine.QtyExp,
  444. F_matNo = orderLine.FromPart,
  445. F_matName = CacheFacade.GetMatInfo(orderLine.FromPart, EMatType.Mat)?.F_matName,
  446. F_matType = (int)EMatType.Product,
  447. F_orderLineNo = matGrp.IndexOf(orderLine) + 1,
  448. F_pNo = bILL_STOCKOUT.F_no,
  449. F_warehouseNo = bILL_STOCKOUT.F_warehouseNo,
  450. F_addUserNo = loginUserInfo.UserNo
  451. };
  452. ctx.Insertable(line).ExecuteCommand();
  453. }
  454. //出库实际明细
  455. 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();
  456. foreach (var orderLine in matInfoGrp)
  457. {
  458. var inv = ctx.Queryable<BILL_INVENTORY>().First(f => f.F_trayNo == orderLine.FromLoc && f.F_matNo == orderLine.FromPart);
  459. if (inv == null || inv.F_quantity < orderLine.QtyExp)
  460. throw SysExCore.ThrowFailException($"托盘{ orderLine.FromLoc}物料{orderLine.FromPart}库存不够!");
  461. var location = ctx.Queryable<BASE_LOCATION>().First(f => f.F_trayNo == orderLine.FromLoc && f.F_status == (int)EWareCellState.Stored);
  462. if (location == null)
  463. throw SysExCore.ThrowFailException($"托盘{ orderLine.FromLoc}货位数据异常!");
  464. ctx.Insertable(new BILL_STOCKOUTLINEDETAIL
  465. {
  466. F_addTime = DateTime.Now,
  467. F_addUserNo = loginUserInfo.UserNo,
  468. //F_boxNo = item.F_boxNo,
  469. F_locationNo = location.F_no,
  470. F_matNo = orderLine.FromPart,
  471. F_matName = CacheFacade.GetMatInfo(orderLine.FromPart, EMatType.Mat)?.F_matName,
  472. F_matType = (int)EMatType.Mat,
  473. F_pNo = bILL_STOCKOUT.F_no,
  474. F_quantity = orderLine.QtyExp,
  475. F_trayNo = orderLine.FromLoc
  476. }).ExecuteCommand();
  477. var task = new WMS_TASK
  478. {
  479. F_addTime = DateTime.Now,
  480. F_addUserNo = loginUserInfo.UserNo,
  481. F_trayNo = orderLine.FromLoc,
  482. F_priority = orderRequest.F_priority,
  483. F_taskStatus = (int)ETaskStatus.NotIssued,
  484. F_taskType = (int)ETaskComType.OutStock,
  485. F_orderType = (int)ETaskOrderType.StockOutOrderTypeMaterial,
  486. F_posidFrom = location.F_no,
  487. F_isBonded = location.F_isBonded,
  488. F_orderNo = bILL_STOCKOUT.F_no,
  489. F_posidcur = location.F_no,
  490. //F_posidNext = ctx.Queryable<BASE_POINT>().First(c => c.F_type == (int)EPointType.CKXYGDZ).F_no,
  491. F_EquipmentType = (int)EEquipmentType.RGV
  492. };
  493. //分配出料口
  494. var curMatInv = ctx.Queryable<BILL_INVENTORY>().Where(c => c.F_trayNo == orderLine.FromLoc);
  495. var matInvQty = curMatInv.Sum(s => s.F_quantity);
  496. if (orderLine.QtyExp == matInvQty)
  497. {
  498. //当前托盘数量等于指定数量则整盘出
  499. task.F_posidNext = new AppCoreBLL().GetFreePointInfoByType((int)EPointType.ZPKCK).F_no;
  500. task.F_posidTo = new AppCoreBLL().GetFreePointInfoByType((int)EPointType.CPAGV).F_no;
  501. }
  502. else
  503. {
  504. var kvPort = dicPort.OrderBy(o => o.Value).FirstOrDefault();
  505. dicPort[kvPort.Key] += 1;
  506. task.F_posidTo = kvPort.Key;
  507. task.F_posidNext = kvPort.Key;
  508. task.F_pickPort = kvPort.Key;
  509. }
  510. ctx.Insertable(task).ExecuteCommand();
  511. //锁定出库库存
  512. ctx.Updateable<BASE_LOCATION>().SetColumns(it =>
  513. new BASE_LOCATION()
  514. {
  515. F_addTime = DateTime.Now,
  516. F_editUserNo = loginUserInfo.UserNo,
  517. F_status = (int)EWareCellState.Out,
  518. }).Where(w => w.F_no == location.F_no).ExecuteCommand();
  519. }
  520. sod_det.ForEach(det =>
  521. {
  522. det.AddTime = DateTime.Now;
  523. det.AddUserNo = loginUserInfo.UserNo;
  524. });
  525. ctx.Insertable(sod_det).ExecuteCommand();
  526. ctx.CommitTran();
  527. }
  528. catch (Exception ex)
  529. {
  530. ctx.RollbackTran();
  531. throw ex;
  532. }
  533. }
  534. }
  535. /// <summary>
  536. /// 系统推荐出库
  537. /// </summary>
  538. /// <param name="orderRequest"></param>
  539. /// <param name="lineDetailsRequest"></param>
  540. /// <param name="LoginUser"></param>
  541. public void SystemAssignCreate(string no, LoginUserInfo LoginUser)
  542. {
  543. using (var ctx = SysDbCore.GetDbCtx())
  544. {
  545. try
  546. {
  547. //根据出库单获取明细》根据物料查询库存》推荐库存(先进先出)》生成任务》更新货位状态、新增出库明细
  548. //var matInfo = ctx.Queryable<BILL_STOCKOUTLINE>().Where(c => c.F_pNo == no && c.F_matNo == lineDetailsRequest.FirstOrDefault().F_matNo).First();
  549. //if (matInfo.F_planQty != lineDetailsRequest.Sum(s => s.F_quantity))
  550. // SysExCore.ThrowFailException("不允许部分指定!");
  551. //ctx.BeginTran();
  552. //ctx.Insertable(lineDetailsRequest);
  553. //ctx.Updateable<BILL_STOCKOUTLINE>().SetColumns(it => new BILL_STOCKOUTLINE
  554. //{
  555. // F_actualQty = lineDetailsRequest.Sum(s => s.F_quantity),
  556. // F_editUserNo = LoginUser.UserNo,
  557. // F_editTime = DateTime.Now,
  558. //}).Where(w => w.F_rowNo == matInfo.F_rowNo).ExecuteCommand();
  559. ////var dicPort = new Dictionary<string, int>(orderRequest.DicPickPort);
  560. //foreach (var item in lineDetailsRequest)
  561. //{
  562. // var location = ctx.Queryable<BASE_LOCATION>().First(f => f.F_trayNo == item.F_trayNo && f.F_status == (int)EWareCellState.Stored);
  563. // if (location == null)
  564. // throw SysExCore.ThrowFailException($"托盘{item.F_trayNo}货位数据异常!");
  565. // ctx.Insertable(new BILL_STOCKOUTLINEDETAIL
  566. // {
  567. // F_addTime = DateTime.Now,
  568. // F_addUserNo = LoginUser.UserNo,
  569. // F_boxNo = item.F_boxNo,
  570. // F_locationNo = location.F_no,
  571. // F_matNo = item.F_matNo,
  572. // F_matType = item.F_matType,
  573. // F_pNo = no,
  574. // F_quantity = item.F_AssignQty,
  575. // F_trayNo = item.F_trayNo
  576. // }).ExecuteCommand();
  577. // ctx.Updateable<BILL_STOCKOUT>().SetColumns(it => new BILL_STOCKOUT
  578. // {
  579. // F_editTime = DateTime.Now,
  580. // F_editUserNo = LoginUser.UserNo,
  581. // F_orderStatus = (int)EOrderState.NotExecute,
  582. // }).Where(w => w.F_no == orderRequest.F_pNo).ExecuteCommand();
  583. //}
  584. }
  585. catch (Exception e)
  586. {
  587. ctx.RollbackTran();
  588. throw e;
  589. }
  590. }
  591. }
  592. /// <summary>
  593. /// 获取拣选口
  594. /// </summary>
  595. /// <param name="ctx"></param>
  596. /// <param name="pickPortArrayStr"></param>
  597. /// <returns></returns>
  598. public Dictionary<string, int> GetPickPort(SqlSugarClient ctx, string pickPortArrayStr)
  599. {
  600. string[] pickPortArray = pickPortArrayStr.Split(',');
  601. var pickPortDic = pickPortArrayStr.Split(',').ToDictionary(d => d, d => 0);
  602. var cachePortLst = ctx.Queryable<BASE_POINT>().Where(p => SqlFunc.ContainsArray(pickPortArray, p.F_no)).ToList();
  603. foreach (var item in cachePortLst)
  604. {
  605. if (!string.IsNullOrWhiteSpace(item.F_cachePoint))
  606. pickPortDic.Add(item.F_cachePoint, 0);
  607. }
  608. return pickPortDic;
  609. }
  610. }
  611. }