TaskBLL.cs 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. using SqlSugar;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Reflection;
  6. using WMS.Core._02Entity;
  7. using WMS.Core.ServiceCore;
  8. using WMS.Info;
  9. using WMS.Util;
  10. namespace WMS.Core.APPBLL
  11. {
  12. public class TaskBLL : AppCoreBLL
  13. {
  14. /// <summary>
  15. /// 发送待下发任务
  16. /// </summary>
  17. /// <param name="num"></param>
  18. /// <returns></returns>
  19. public ResInfo SendPreExecuteTasks(ETaskComType type, int num)
  20. {
  21. using (var ctx = SysDbCore.GetDbCtx())
  22. {
  23. try
  24. {
  25. ctx.BeginTran();
  26. IEnumerable<WMS_TASK> tasks;
  27. tasks = ctx.Queryable<WMS_TASK>().Where(task => task.F_priority == (int)EPriority.Urgent && (task.F_taskStatus == (int)ETaskStatus.NotIssued || task.F_taskStatus == (int)ETaskStatus.NotExecute || task.F_taskStatus == (int)ETaskStatus.Executing)).ToList();
  28. if (tasks.Any(a => a.F_taskStatus == (int)ETaskStatus.NotIssued))
  29. {
  30. tasks = tasks.Where(a => a.F_taskStatus == (int)ETaskStatus.NotIssued);
  31. }
  32. else if (tasks.Any(a => a.F_taskStatus == (int)ETaskStatus.NotExecute || a.F_taskStatus == (int)ETaskStatus.Executing))
  33. {
  34. return SysExCore.GetResSucc(); //有优先任务则不下发其他任务
  35. }
  36. else
  37. {
  38. tasks = ctx.Queryable<WMS_TASK>().Where(t => t.F_taskStatus == (int)ETaskStatus.NotIssued && t.F_taskType == (int)type).Take(num).ToList();
  39. }
  40. foreach (var task in tasks)
  41. {
  42. //如果当前拣选口有任务则不下发当前拣选口任务
  43. if (ctx.Queryable<WMS_TASK>().Any(a => a.F_pickPort == task.F_pickPort && (a.F_taskStatus == (int)ETaskStatus.Executing || a.F_taskStatus == (int)ETaskStatus.NotExecute)))
  44. continue;
  45. switch ((ETaskOrderType)System.Enum.Parse(typeof(ETaskOrderType), task.F_orderType.ToString()))
  46. {
  47. //入库绑定托盘后添加库存,此处只需更新货位状态
  48. case ETaskOrderType.EntryOrderTypeMaterial:
  49. case ETaskOrderType.EntryOrderTypeOther:
  50. case ETaskOrderType.EntryOrderTypeProduct:
  51. case ETaskOrderType.EntryOrderTypeTrayGroup:
  52. #region 入库任务更新
  53. ctx.Updateable<BILL_ENTRYORDER>().SetColumns(it => new BILL_ENTRYORDER()
  54. {
  55. F_editTime = DateTime.Now,
  56. F_editUserNo = "AutoTask",
  57. F_orderStatus = (int)EOrderState.Executing
  58. }).Where(w => w.F_no == task.F_posidTo).ExecuteCommand();
  59. #endregion
  60. break;
  61. //出库需要扣减库存并更新货位和单据状态
  62. case ETaskOrderType.StockOutOrderTypeEmptyTrayGroup:
  63. case ETaskOrderType.StockOutOrderTypeMaterial:
  64. case ETaskOrderType.StockOutOrderTypeProduct:
  65. case ETaskOrderType.StockOutOrderTypeOther:
  66. #region 出库任务更新
  67. ctx.Updateable<BILL_STOCKOUT>().SetColumns(it => new BILL_STOCKOUT()
  68. {
  69. F_editTime = DateTime.Now,
  70. F_editUserNo = "AutoTask",
  71. F_orderStatus = (int)EOrderState.Executing,
  72. }).Where(w => w.F_no == task.F_posidFrom).ExecuteCommand();
  73. #endregion
  74. break;
  75. case ETaskOrderType.CheckEntryOrderType:
  76. #region 盘点入库
  77. ctx.Updateable<BILL_InventoryReport>().SetColumns(it => new BILL_InventoryReport
  78. {
  79. F_editTime = DateTime.Now,
  80. F_editUserNo = "AutoTask",
  81. F_checkStatus = (int)ECheckStatus.Checking
  82. });
  83. #endregion
  84. break;
  85. case ETaskOrderType.CheckStockOutOrderType:
  86. break;
  87. default:
  88. break;
  89. }
  90. PolicyHelper.GetRetryTimesPolicy(3, ex =>
  91. {
  92. task.F_taskStatus = (int)ETaskStatus.TaskFail;
  93. task.F_wcsExecuteTime = DateTime.Now;
  94. task.F_wcsExecuteResult = ex.Message;
  95. }).Execute(() =>
  96. {
  97. SetProperties(task);
  98. var res = httpClinet.Post<WCSResponse>(task.ToJson(), "/api/Task/I_WMS_CreateTasks");
  99. if (res == null || !res.isSuccess)
  100. throw SysExCore.ThrowFailException($"调用wcs接口失败{res?.msg}!");
  101. else
  102. task.F_taskStatus = (int)ETaskStatus.NotExecute;
  103. });
  104. ctx.Updateable<WMS_TASK>().SetColumns(it => new WMS_TASK()
  105. {
  106. F_taskStatus = task.F_taskStatus
  107. }).Where(it => it.F_taskNo == task.F_taskNo).ExecuteCommand();
  108. }
  109. ctx.CommitTran();
  110. return SysExCore.GetResSucc("执行成功!");
  111. }
  112. catch (Exception e)
  113. {
  114. ctx.RollbackTran();
  115. throw e;
  116. }
  117. }
  118. }
  119. /// <summary>
  120. /// 创建wms任务
  121. /// </summary>
  122. /// <param name="newTask"></param>
  123. /// <returns></returns>
  124. public ResInfo CreateTask(WMS_TASK newTask)
  125. {
  126. using (var ctx = SysDbCore.GetDbCtx())
  127. {
  128. var task = ctx.Insertable(newTask).ExecuteReturnEntity();
  129. return SysExCore.GetResSucc("执行成功!", task);
  130. }
  131. }
  132. public ResInfo GetStockOutTasks(TaskQueryRequest request)
  133. {
  134. using (var ctx = SysDbCore.GetDbCtx())
  135. {
  136. var tasks = ctx.SqlQueryable<StockOutTaskDto>(@"SELECT s.F_no OrderNo,
  137. s.F_orderType OrderType,
  138. s.F_orderStatus Status,
  139. l.F_matNo MatNo,
  140. l.F_matName MatName,
  141. SUM(l.F_planQty) PlanQty,
  142. s.F_ADDTIME AddTime
  143. FROM dbo.BILL_STOCKOUT s
  144. JOIN dbo.BILL_STOCKOUTLINE l
  145. ON s.F_no = l.F_pNo WHERE s.F_orderStatus<4
  146. GROUP BY s.F_no,
  147. s.F_orderType,
  148. s.F_orderStatus,
  149. l.F_matNo,
  150. l.F_matName,
  151. s.F_ADDTIME").ToList();
  152. if (!string.IsNullOrWhiteSpace(request.StockOutType))
  153. tasks = tasks.FindAll(t => t.OrderType == (EStockOutOrderType)Enum.Parse(typeof(EStockOutOrderType), request.StockOutType));
  154. if (!string.IsNullOrWhiteSpace(request.KeyWord))
  155. tasks = tasks.FindAll(t => t.OrderNo.Contains(request.KeyWord));
  156. var list = tasks.Skip((request.pagination.page - 1) * request.pagination.rows).Take(request.pagination.rows).ToList();
  157. request.pagination.records = tasks.Count;
  158. return SysExCore.GetResSucc("查询成功", data: new { list = list, pageInfo = request.pagination });
  159. }
  160. }
  161. /// <summary>
  162. /// 创建出库单任务
  163. /// </summary>
  164. /// <param name="taskExecute"></param>
  165. /// <returns></returns>
  166. public ResInfo CreateTaskByStockOut(TaskExecuteRequest taskExecute)
  167. {
  168. using (var ctx = SysDbCore.GetDbCtx())
  169. {
  170. try
  171. {
  172. ctx.BeginTran();
  173. var orderLines = new FxStockOutOrderCore().GeSockOutOrderItem(taskExecute.OrderNo);
  174. foreach (var item in orderLines)
  175. {
  176. var stockDetail = ctx.Queryable<BILL_STOCKOUTLINEDETAIL>().Where(c => c.F_pNo == item.F_pNo && c.F_matNo == item.F_matNo).ToList();
  177. var tasks = new List<WMS_TASK>();
  178. //var needQty = item.F_planQty - item.F_actualQty;
  179. //var db = ctx.Queryable<BILL_INVENTORY, BASE_LOCATION>((ord, loc) => new object[] { JoinType.Inner, ord.F_trayNo == loc.F_trayNo, ord.F_no })
  180. // .Where((ord, loc) => ord.F_matNo == item.F_matNo && ord.F_matType == item.F_matType && loc.F_status == (int)EWareCellState.Out);
  181. //var matInventory = db.OrderBy((ord, loc) => new { loc.F_line, loc.F_cell, ord.F_editTime, ord.F_addTime }).Select<dynamic>().ToList();
  182. //if (matInventory.Sum(s => s.F_quantity) < needQty)
  183. // throw SysExCore.ThrowFailException($"物料编码:{item.F_matNo}库存不够!");
  184. foreach (var detail in stockDetail)
  185. {
  186. tasks.Add(new WMS_TASK
  187. {
  188. F_addTime = DateTime.Now,
  189. F_addUserNo = LoginUser.UserNo,
  190. F_editTime = DateTime.Now,
  191. F_orderNo = taskExecute.OrderNo,
  192. F_orderType = taskExecute.OrderType,
  193. F_posidcur = detail.F_locationNo,
  194. F_posidFrom = detail.F_locationNo,
  195. F_pickPort = AllotPickPort(stockDetail.IndexOf(detail) % 2 == 1, taskExecute.PickPort),
  196. F_posidTo = AllotPickPort(stockDetail.IndexOf(detail) % 2 == 1, taskExecute.PickPort),
  197. F_priority = (int)EPriority.NotUrgent,
  198. F_taskStatus = (int)ETaskStatus.NotIssued,
  199. F_taskType = taskExecute.OrderType,
  200. F_trayNo = detail.F_trayNo,
  201. F_posidNext = AllotPickPort(stockDetail.IndexOf(detail) % 2 == 1, taskExecute.PickPort),
  202. F_EquipmentType = (int)EEquipmentType.Convey
  203. });
  204. ctx.Updateable<BASE_LOCATION>().SetColumns(it =>
  205. new BASE_LOCATION()
  206. {
  207. F_addTime = DateTime.Now,
  208. F_editUserNo = LoginUser.UserNo,
  209. F_status = (int)EWareCellState.Out,
  210. }).Where(w => w.F_no == detail.F_locationNo).ExecuteCommand();
  211. }
  212. ctx.Saveable(tasks).ExecuteReturnList();
  213. }
  214. ctx.Updateable<BILL_STOCKOUT>().SetColumns(it =>
  215. new BILL_STOCKOUT
  216. {
  217. F_editTime = DateTime.Now,
  218. F_editUserNo = LoginUser.UserNo,
  219. F_orderStatus = (int)EOrderState.Executing
  220. });
  221. ctx.CommitTran();
  222. return SysExCore.GetResSucc("出库任务生成成功");
  223. }
  224. catch (Exception)
  225. {
  226. ctx.RollbackTran();
  227. throw;
  228. }
  229. }
  230. }
  231. /// <summary>
  232. /// 多个拣选口平均分配
  233. /// </summary>
  234. /// <param name="IsBaseNumber"></param>
  235. /// <param name="PickPorts"></param>
  236. /// <returns></returns>
  237. private string AllotPickPort(bool IsBaseNumber, List<string> PickPorts)
  238. {
  239. if (PickPorts.Count > 1)
  240. {
  241. return IsBaseNumber ? PickPorts[1] : PickPorts[0];
  242. }
  243. return PickPorts[0];
  244. }
  245. /// <summary>
  246. /// 更新货位高度并分配货位
  247. /// </summary>
  248. /// <param name="reqData"></param>
  249. /// <returns></returns>
  250. public ResInfo AllotLocation(AllotLocationRequest reqData)
  251. {
  252. using (var ctx = SysDbCore.GetDbCtx())
  253. {
  254. try
  255. {
  256. ctx.BeginTran();
  257. //根据托盘获取当前入库任务
  258. var order = ctx.Queryable<BILL_ENTRYORDER, BILL_ENTRYORDERLINEDETAIL>((ord, detail) => new object[] { JoinType.Inner, ord.F_no == detail.F_pNo })
  259. .Where((ord, detail) => detail.F_trayNo == reqData.TrayNo).Select<BILL_ENTRYORDER>().First();
  260. if (order == null)
  261. throw SysExCore.ThrowFailException($"获取托盘{reqData.TrayNo}入库单明细失败!");
  262. order.F_matHeight = reqData.Height;
  263. var assignLoc = ctx.Queryable<BASE_LOCATION>().First(f => f.F_trayNo == reqData.TrayNo && f.F_status == (int)EWareCellState.In);
  264. if (order.F_matHeight > 0 && assignLoc != null)
  265. {
  266. return SysExCore.GetResSucc("该托盘已分配货位!", assignLoc);
  267. }
  268. ctx.Updateable<BILL_ENTRYORDER>().SetColumns(it => new BILL_ENTRYORDER()
  269. {
  270. F_matHeight = reqData.Height
  271. }).Where(it => it.F_no == order.F_no).ExecuteCommand();
  272. if (!reqData.Layer.Any())
  273. {
  274. reqData.Layer = ctx.Queryable<BASE_LOCATION>().GroupBy(g => g.F_layer).Select(s => s.F_layer).ToList();
  275. }
  276. //string layerSqlStr = string.Join(",", reqData.Layer);
  277. //var disLayer = ctx.SqlQueryable<BASE_LOCATION>($@"SELECT TOP 1 * FROM V_DISLOCATION WHERE F_matType={order.F_orderType} and F_layer in({layerSqlStr}) ORDER BY cnt,F_layer").First();
  278. //var loc = ctx.Queryable<BASE_LOCATION>().Where(w => w.F_layer == disLayer.F_layer && w.F_height >= reqData.Height&& w.F_status== (int)EWareCellState.Empty).OrderBy("F_layer ASC, F_line DESC,F_cell asc").First();
  279. //if (loc == null)//立库第一次使用可能会为null 默认分配第一层
  280. var loc = ctx.Queryable<BASE_LOCATION>().Where(w => w.F_height >= reqData.Height && w.F_isDelete == 0 && w.F_status == (int)EWareCellState.Empty).WhereIF(reqData.Layer.Any(), w => reqData.Layer.Contains(w.F_layer)).OrderBy("F_layer ASC, F_line DESC,F_cell asc").First();
  281. if (loc == null)
  282. throw SysExCore.ThrowFailException($"没有可分配的货位!");
  283. ctx.Updateable<BASE_LOCATION>().SetColumns(it => new BASE_LOCATION()
  284. {
  285. F_editTime = DateTime.Now,
  286. F_editUserNo = "wcs",
  287. F_matHeight = reqData.Height,
  288. F_trayNo = order.F_trayNo,
  289. F_matType = order.F_orderType == (int)EEntryOrderType.EntryOrderTypeMaterial ? (int)EMatType.Mat : order.F_orderType == (int)EEntryOrderType.EntryOrderTypeProduct ? (int)EMatType.Product : (int)EMatType.Tary,
  290. F_status = (int)EWareCellState.In,
  291. F_isBonded = order.F_isBonded
  292. }).Where(it => it.F_no == loc.F_no).ExecuteCommand();
  293. ctx.Updateable<WMS_TASK>().SetColumns(it => new WMS_TASK()
  294. {
  295. F_editTime = DateTime.Now,
  296. F_posidTo = loc.F_no
  297. }).Where(w => w.F_trayNo == reqData.TrayNo && w.F_taskStatus < (int)ETaskStatus.TaskFinish).ExecuteCommand();
  298. ctx.BeginTran();
  299. return SysExCore.GetResSucc("高度更新成功并成功分配货位!", loc);
  300. }
  301. catch (Exception)
  302. {
  303. ctx.RollbackTran();
  304. throw;
  305. }
  306. }
  307. }
  308. /// <summary>
  309. /// wcs回传更新
  310. /// </summary>
  311. /// <param name="reqData"></param>
  312. /// <returns></returns>
  313. public ResInfo Callback(WcsCallBackRequest reqData, LoginUserInfo userInfo)
  314. {
  315. try
  316. {
  317. using (var ctx = SysDbCore.GetDbCtx())
  318. {
  319. var task = ctx.Queryable<WMS_TASK>().First(c => c.F_taskNo == reqData.TaskNo);
  320. if (task == null)
  321. throw SysExCore.ThrowFailException($"任务号{reqData.TaskNo}无效");
  322. if (task.F_taskStatus == (int)ETaskStatus.TaskFinish || task.F_taskStatus == (int)ETaskStatus.TaskManualFinish)
  323. return SysExCore.GetResSucc("任务已回传,请勿重复回传!");
  324. List<BILL_INVENTORY> lstInv = new List<BILL_INVENTORY>();
  325. if (reqData.State == 1)
  326. {
  327. #region 开始执行
  328. ctx.Updateable<WMS_TASK>().SetColumns(it => new WMS_TASK()
  329. {
  330. F_editTime = DateTime.Now,
  331. F_editUserNo = userInfo.UserNo,
  332. F_taskStatus = (int)ETaskStatus.Executing
  333. }).Where(w => w.F_taskNo == task.F_taskNo).ExecuteCommand();
  334. if (ctx.Queryable<BASE_POINT>().Any(c => c.F_agv == task.F_posidFrom && c.F_status == (int)EPointSatus.Occupied))
  335. {
  336. ctx.Updateable<BASE_POINT>().SetColumns(it => new BASE_POINT()
  337. {
  338. F_status = (int)EPointSatus.Idle
  339. }).Where(w => w.F_agv == task.F_posidFrom).ExecuteCommand();
  340. }
  341. if (!string.IsNullOrWhiteSpace(task.F_orderNo) && task.F_taskType == (int)ETaskComType.InStock)
  342. {
  343. ctx.Updateable<BILL_ENTRYORDER>().SetColumns(it => new BILL_ENTRYORDER()
  344. {
  345. F_editTime = DateTime.Now,
  346. F_editUserNo = userInfo.UserNo,
  347. F_orderStatus = (int)EOrderState.Executing
  348. }).Where(w => w.F_no == task.F_orderNo).ExecuteCommand();
  349. }
  350. if (!string.IsNullOrWhiteSpace(task.F_orderNo) && task.F_taskType == (int)ETaskComType.OutStock)
  351. {
  352. ctx.Updateable<BILL_STOCKOUT>().SetColumns(it => new BILL_STOCKOUT()
  353. {
  354. F_editTime = DateTime.Now,
  355. F_editUserNo = userInfo.UserNo,
  356. F_orderStatus = (int)EOrderState.Executing,
  357. }).Where(w => w.F_no == task.F_orderNo).ExecuteCommand();
  358. }
  359. #endregion
  360. }
  361. else
  362. {
  363. #region 执行结束
  364. switch ((ETaskOrderType)System.Enum.Parse(typeof(ETaskOrderType), task.F_orderType.ToString()))
  365. {
  366. //入库绑定托盘后添加库存,此处只需更新货位状态
  367. case ETaskOrderType.EntryOrderTypeMaterial:
  368. case ETaskOrderType.EntryOrderTypeProduct:
  369. case ETaskOrderType.EntryOrderTypeTrayGroup:
  370. #region 入库任务更新
  371. ctx.Updateable<BASE_LOCATION>().SetColumns(it => new BASE_LOCATION()
  372. {
  373. F_editTime = DateTime.Now,
  374. F_editUserNo = userInfo.UserNo,
  375. F_status = (int)EWareCellState.Stored,
  376. F_trayNo = task.F_trayNo
  377. }).Where(w => w.F_no == task.F_posidTo).ExecuteCommand();
  378. ctx.Updateable<BILL_ENTRYORDER>().SetColumns(it => new BILL_ENTRYORDER()
  379. {
  380. F_editTime = DateTime.Now,
  381. F_editUserNo = userInfo.UserNo,
  382. F_orderStatus = (int)EOrderState.Executed
  383. }).Where(w => w.F_no == task.F_orderNo).ExecuteCommand();
  384. #endregion
  385. break;
  386. //出库需要扣减库存并更新货位和单据状态
  387. case ETaskOrderType.StockOutOrderTypeEmptyTrayGroup:
  388. case ETaskOrderType.StockOutOrderTypeMaterial:
  389. case ETaskOrderType.StockOutOrderTypeProduct:
  390. case ETaskOrderType.StockOutOrderTypeTray:
  391. case ETaskOrderType.StockOutOrderTypeTransfer:
  392. #region 出库任务更新
  393. if (ctx.Queryable<BASE_POINT>().Any(a => a.F_no == task.F_posidTo && (a.F_type == (int)EPointType.CPCKJXK || a.F_type == (int)EPointType.YLCKJXK)))
  394. {
  395. }
  396. else
  397. {
  398. var stockOutDetail = ctx.Queryable<BILL_STOCKOUT, BILL_STOCKOUTLINEDETAIL>((ord, detail) => new object[] { JoinType.Inner, ord.F_no == detail.F_pNo }).Where(ord => ord.F_no == task.F_orderNo).Select<BILL_STOCKOUTLINEDETAIL>().ToList();
  399. foreach (var orderDetail in stockOutDetail)
  400. {
  401. var point = ctx.Queryable<BASE_POINT>().First(f => f.F_no == task.F_posidTo);
  402. if (point.F_type == (int)EPointType.ZPKCK)//整盘口出库需要扣减库存
  403. {
  404. var line = ctx.Queryable<BILL_STOCKOUTLINE>().First(f => f.F_matNo == orderDetail.F_matNo && f.F_pNo == orderDetail.F_pNo);
  405. lstInv.Add(new BILL_INVENTORY
  406. {
  407. F_matNo = orderDetail.F_matNo,
  408. F_matName = orderDetail.F_matName,
  409. F_matType = orderDetail.F_matType,
  410. F_boxNo = orderDetail.F_boxNo,
  411. F_trayNo = orderDetail.F_trayNo,
  412. F_quantity = -1 * orderDetail.F_quantity,
  413. });
  414. ctx.Updateable<BILL_STOCKOUTLINE>().SetColumns(it => new BILL_STOCKOUTLINE()
  415. {
  416. F_editTime = DateTime.Now,
  417. F_editUserNo = userInfo.UserNo,
  418. F_actualQty = line.F_actualQty + orderDetail.F_quantity,
  419. }).Where(w => w.F_rowNo == line.F_rowNo).ExecuteCommand();
  420. }
  421. //ctx.Updateable<BASE_LOCATION>().SetColumns(it => new BASE_LOCATION()
  422. //{
  423. // F_editTime = DateTime.Now,
  424. // F_editUserNo = userInfo.UserNo,
  425. // F_status = (int)EWareCellState.Empty,
  426. // F_trayNo = string.Empty,
  427. // F_matHeight = default,
  428. // F_matType = default
  429. //}).Where(w => w.F_no == task.F_posidTo).ExecuteCommand();
  430. }
  431. ctx.Updateable<BILL_STOCKOUT>().SetColumns(it => new BILL_STOCKOUT()
  432. {
  433. F_editTime = DateTime.Now,
  434. F_editUserNo = userInfo.UserNo,
  435. F_orderStatus = (int)EOrderState.Executed,
  436. }).Where(w => w.F_no == task.F_orderNo).ExecuteCommand();
  437. }
  438. ctx.Updateable<BASE_LOCATION>().SetColumns(it => new BASE_LOCATION()
  439. {
  440. F_editTime = DateTime.Now,
  441. F_editUserNo = userInfo.UserNo,
  442. F_status = (int)EWareCellState.Empty,
  443. F_trayNo = string.Empty,
  444. F_matType = default,
  445. F_matHeight = default
  446. }).Where(w => w.F_no == task.F_posidFrom).ExecuteCommand();
  447. #endregion
  448. break;
  449. case ETaskOrderType.StockOutOrderTypeHalfTray:
  450. ctx.Updateable<BASE_LOCATION>().SetColumns(it => new BASE_LOCATION()
  451. {
  452. F_editTime = DateTime.Now,
  453. F_editUserNo = userInfo.UserNo,
  454. F_status = (int)EWareCellState.Out,
  455. //F_trayNo = string.Empty,
  456. //F_matType = default,
  457. F_matHeight = default
  458. }).Where(w => w.F_no == task.F_posidFrom).ExecuteCommand();
  459. break;
  460. case ETaskOrderType.CheckEntryOrderType:
  461. #region 盘点入库
  462. ctx.Updateable<BASE_LOCATION>().SetColumns(it => new BASE_LOCATION()
  463. {
  464. F_editTime = DateTime.Now,
  465. F_editUserNo = userInfo.UserNo,
  466. F_status = (int)EWareCellState.Stored
  467. }).Where(w => w.F_no == task.F_posidTo).ExecuteCommand();
  468. int checkStatus = default;
  469. if (!ctx.Queryable<BILL_InventoryReportLine>().Any(c => c.F_pNo == task.F_orderNo && c.F_actualQty != c.F_quantity && c.F_actualQty > 0))
  470. {
  471. checkStatus = (int)ECheckStatus.Checkfinish;
  472. RedisCache.Remove("CheckInventory", ERedisCacheNo.System);
  473. }
  474. else
  475. {
  476. checkStatus = (int)ECheckStatus.Checking;
  477. }
  478. ctx.Updateable<BILL_InventoryReport>().SetColumns(it => new BILL_InventoryReport
  479. {
  480. F_editTime = DateTime.Now,
  481. F_editUserNo = userInfo.UserNo,
  482. F_checkStatus = checkStatus
  483. });
  484. #endregion
  485. break;
  486. case ETaskOrderType.CheckStockOutOrderType:
  487. #region 盘点出库
  488. var checkDetail = ctx.Queryable<BILL_InventoryReport, BILL_InventoryReportLine>((ord, detail) => new object[] { JoinType.Inner, ord.F_no == detail.F_pNo }).Where(ord => ord.F_no == task.F_orderNo).Select<BILL_InventoryReportLine>().ToList();
  489. foreach (var orderDetail in checkDetail)
  490. {
  491. var line = ctx.Queryable<BILL_STOCKOUTLINE>().First(f => f.F_matNo == orderDetail.F_matNo && f.F_pNo == orderDetail.F_pNo);
  492. lstInv.Add(new BILL_INVENTORY
  493. {
  494. F_matNo = orderDetail.F_matNo,
  495. F_matName = orderDetail.F_matName,
  496. F_matType = orderDetail.F_matType,
  497. F_boxNo = orderDetail.F_boxNo,
  498. F_trayNo = orderDetail.F_trayNo,
  499. });
  500. }
  501. #endregion
  502. break;
  503. ///agv搬运、空托盘入库无需更新单据
  504. case ETaskOrderType.StockOutOrderTypeOther:
  505. case ETaskOrderType.EntryOrderTypeTray:
  506. case ETaskOrderType.EntryOrderTypeOther:
  507. //ctx.Updateable<BASE_POINT>().SetColumns(it => new BASE_POINT()
  508. //{
  509. // F_editTime = DateTime.Now,
  510. // F_editUserNo = userInfo.UserNo,
  511. // F_status = (int)EPointSatus.Occupied,
  512. //}).Where(w => w.F_no == task.F_posidTo).ExecuteCommand();
  513. break;
  514. default:
  515. break;
  516. }
  517. //更新库存
  518. UpdateInventory(lstInv, ctx);
  519. ctx.Updateable<WMS_TASK>().SetColumns(it => new WMS_TASK()
  520. {
  521. F_editTime = DateTime.Now,
  522. F_editUserNo = userInfo.UserNo,
  523. F_taskStatus = (int)ETaskStatus.TaskFinish
  524. }).Where(w => w.F_taskNo == task.F_taskNo).ExecuteCommand();
  525. #endregion
  526. }
  527. ctx.CommitTran();
  528. }
  529. return SysExCore.GetResSucc("回传成功!");
  530. }
  531. catch (Exception)
  532. {
  533. throw;
  534. }
  535. }
  536. /// <summary>
  537. /// 初始化对象
  538. /// </summary>
  539. /// <typeparam name="T"></typeparam>
  540. /// <param name="t"></param>
  541. /// <param name="CelName"></param>
  542. /// <param name="CelVal"></param>
  543. public void SetProperties<T>(T t)
  544. {
  545. var properties = t.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
  546. if (properties == null)
  547. {
  548. return;
  549. }
  550. foreach (var item in properties)
  551. {
  552. var ts = item.GetValue(t, null);
  553. if (ts == null)
  554. {
  555. if (item.PropertyType.FullName.Contains("DateTime"))
  556. {
  557. item.SetValue(t, null);
  558. }
  559. else
  560. {
  561. item.SetValue(t, "");
  562. }
  563. }
  564. }
  565. }
  566. }
  567. }