桁架分流点.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. using Newtonsoft.Json;
  2. using PlcSiemens.Core.Extension;
  3. using ServiceCenter.Extensions;
  4. using ServiceCenter.Logs;
  5. using ServiceCenter.SqlSugars;
  6. using SqlSugar;
  7. using System.ComponentModel;
  8. using WCS.Core;
  9. using WCS.Entity;
  10. using WCS.Entity.Protocol.Station;
  11. using WCS.Entity.Protocol.Truss;
  12. using WCS.WorkEngineering.Extensions;
  13. using WCS.WorkEngineering.Worlds;
  14. using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
  15. using TaskStatus = WCS.Entity.TaskStatus;
  16. using WCS_CacheLine = WCS.Entity.WCS_CacheLine;
  17. using WCS_CacheLineLoc = WCS.Entity.WCS_CacheLineLoc;
  18. namespace WCS.WorkEngineering.Systems
  19. {
  20. /// <summary>
  21. /// 桁架分流点
  22. /// </summary>
  23. [BelongTo(typeof(SortingBranchWorld))]
  24. [Description("桁架分流点")]
  25. public class 桁架分流点 : DeviceSystem<Device<IStation520, IStation521, IStation523>>
  26. {
  27. protected override bool ParallelDo => true;
  28. protected override bool SaveLogsToFile => true;
  29. public override void Do(Device<IStation520, IStation521, IStation523> obj)
  30. {
  31. if (obj.Data.VoucherNo != obj.Data2.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}", LogLevelEnum.High);
  32. if (obj.Data3.Status.HasFlag(StationStatus.Run)) throw new KnownException("设备运行中", LogLevelEnum.Low);
  33. if (!obj.Data3.Status.HasFlag(StationStatus.OT_Status)) throw new KnownException("站台货物信息与实际占用不一致", LogLevelEnum.Low);
  34. if (obj.Data2.Request != 1) throw new KnownException("无请求", LogLevelEnum.Mid);
  35. WCS_TaskInfo taskInfo = null;
  36. SqlSugarHelper.Do(_db =>
  37. {
  38. var db = _db.Default;
  39. var task = db.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskNumber && v.Status == TaskStatus.WaitingToExecute) ?? throw new KnownException($"未找到对应的WCS任务{obj.Data2.TaskNumber}", LogLevelEnum.Mid);
  40. if (Allot(db, task, obj)) taskInfo = task;
  41. });
  42. if (taskInfo == null) return;
  43. obj.Data.TaskNumber = obj.Data2.TaskNumber;
  44. obj.Data.TaskNumber = obj.Data2.TaskNumber;
  45. obj.Data.GoodsStart = obj.Entity.Code.ToShort();
  46. obj.Data.GoodsStart = obj.Entity.Code.ToShort();
  47. obj.Data.GoodsEnd = taskInfo.AddrNext.ToShort();
  48. obj.Data.GoodsEnd = taskInfo.AddrNext.ToShort();
  49. obj.Data.VoucherNo++;
  50. World.Log($"执行记录:任务号[{obj.Data2.TaskNumber}][{obj.Data.VoucherNo}]");
  51. }
  52. public override bool Select(Device dev)
  53. {
  54. return dev.HasFlag(Extensions.DeviceFlags.桁架分流点);
  55. }
  56. /// <summary>
  57. /// 计算去向
  58. /// </summary>
  59. /// <param name="db"></param>
  60. /// <param name="taskInfo"></param>
  61. /// <param name="obj"></param>
  62. /// <returns></returns>
  63. public bool Allot(SqlSugarScopeProvider db, WCS_TaskInfo taskInfo, Device<IStation520, IStation521, IStation523> obj)
  64. {
  65. taskInfo.Device = obj.Entity.Code switch
  66. {
  67. "455" => "Truss1",
  68. "655" => "Truss1",
  69. "855" => "Truss2",
  70. "1055" => "Truss2",
  71. "1255" => "Truss3",
  72. "1455" => "Truss3",
  73. _ => "Error"
  74. };
  75. //获取当前货物类型可以到达的桁架缓存放行点信息
  76. var cacheLineDevList = obj.Entity.Targets.Where(x => x.HasFlag(DeviceFlags.桁架缓存放行点)); //当前地址可以到达的所有桁架缓存放行点信息
  77. switch (taskInfo.GoodsType)
  78. {
  79. case 9:
  80. //是异常工字轮
  81. cacheLineDevList = taskInfo.BarCode.Contains("Error") ? cacheLineDevList.Where(x => x.HasFlag(DeviceFlags.桁架09异常缓存放行点)) : cacheLineDevList.Where(x => x.HasFlag(DeviceFlags.桁架09缓存放行点));
  82. break;
  83. case 18:
  84. cacheLineDevList = cacheLineDevList.Where(x => x.HasFlag(DeviceFlags.桁架18缓存放行点));
  85. break;
  86. }
  87. var cacheLineCodes = cacheLineDevList.Select(x => x.Code.ToShort());
  88. var cacheLineList = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).ToList();
  89. #region 跟据缓存信息寻找可以到达的缓存点
  90. //找到当前任务可用的缓存线信息
  91. var cacheLine = cacheLineList.Where(x => x.Locations.Any(l => l is { InStock: false, IsEmpty: false })).FirstOrDefault(x => cacheLineCodes.Contains(x.LocationNo) && x.MatCodeList.Contains(taskInfo.MatCode) && !x.InStock);
  92. //这个任务可以直接去一条线体,不需要新建缓存信息
  93. //找到这条线体中序号最小的一条位信息 非空置且无货
  94. var cacheLoc = cacheLine?.Locations.Where(x => x is { InStock: false, IsEmpty: false }).MinBy(x => x.XYNo);
  95. if (cacheLoc != null)
  96. {
  97. cacheLoc = db.Queryable<WCS_CacheLineLoc>().Single(x => x.Id == cacheLoc.Id);
  98. cacheLoc.InStock = true;
  99. cacheLoc.TaskId = taskInfo.ID;
  100. cacheLoc.EditTime = DateTime.Now;
  101. db.UpdateableRowLock(cacheLoc).ExecuteCommand();
  102. //WCS任务相关信息
  103. taskInfo.Status = TaskStatus.FinishOfShunt;
  104. taskInfo.AddrNext = cacheLine.LocationNo.ToString();
  105. taskInfo.EditWho = "WCS";
  106. taskInfo.EditTime = DateTime.Now;
  107. db.UpdateableRowLock(taskInfo).ExecuteCommand();
  108. taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
  109. return true;
  110. }
  111. #endregion 跟据缓存信息寻找可以到达的缓存点
  112. #region 初始化一个信息的缓存信息
  113. //找到一个可以进行缓存的线体号
  114. var devCode = cacheLineDevList.Select(x => x.Code.ToShort()).FirstOrDefault(x => !cacheLineList.Select(s => s.LocationNo).Contains(x));
  115. if (devCode == 0)
  116. {
  117. World.Log($"无可用线体:{taskInfo.ID}");
  118. var endTime = DateTime.Now.AddMinutes(-25);
  119. //找一个当前时间最早且已超过25分钟未码垛的码垛信息半托入库
  120. //未结束且包含当前物料编号的垛形,按时间排序,创建时间早的优先分配,当前任务的仓库号必须要等于码垛信息绑定的仓库号
  121. var palletizing = db.Queryable<WCS_Palletizing>()
  122. .Includes(x => x.Layers, r => r.Rows, l => l.Locs)
  123. .Where(x => !x.Finish && x.WarehouseCode == taskInfo.WarehouseCode && x.Layers.Any(l => l.Rows.Any(r => r.Finish)))
  124. .Where(x => x.EditTime < endTime).ToList()
  125. .MinBy(x => x.AddTime);
  126. cacheLineList = db.Queryable<WCS.Entity.WCS_CacheLine>().Where(x => x.WarehouseCode == taskInfo.WarehouseCode && x.IsTruss).ToList();
  127. if (palletizing == null || cacheLineList.Any()) return false;
  128. {
  129. var dev = Device.All.Where(x => x.Code == palletizing.PalletizingStation).Select(x => new Device<ITruss530>(x, World)).FirstOrDefault();
  130. if (dev != null && (!dev.Data.CmdType.HasFlag(TrussCmdType.Two) && !dev.Data.CmdType.HasFlag(TrussCmdType.End1)))
  131. {
  132. //如果找到的最早的一个托盘超六小时了,就直接强制结盘
  133. dev.Data.CmdType = palletizing.AddTime < DateTime.Now.AddHours(-6) ? TrussCmdType.End1 : TrussCmdType.Two;
  134. }
  135. }
  136. return false;
  137. }
  138. var result = false;
  139. //未结束且包含当前物料编号的垛形,按时间排序,创建时间早的优先分配,当前任务的仓库号必须要等于码垛信息绑定的仓库号
  140. var palletizingList = db.Queryable<WCS_Palletizing>()
  141. .Includes(x => x.Layers, r => r.Rows, l => l.Locs)
  142. .Where(x => (!x.Finish || (x.Finish && x.isItHalf)) && x.MatCodeList.Contains(taskInfo.MatCode) && x.WarehouseCode == taskInfo.WarehouseCode)
  143. .OrderBy(x => x.AddTime)
  144. .ToList();
  145. foreach (var palletizing in palletizingList)
  146. {
  147. //当前任务已经分配结束,进入下一次迭代
  148. if (result) continue;
  149. //未结束且包含当前物料编号的层,按层号排序,层号小的优先分配
  150. var layer = palletizing.Layers.Where(x => x is { IsEmpty: false, Finish: false })
  151. .Where(x => x.MatCodeList.Contains(taskInfo.MatCode)).MinBy(x => x.LayerNo);
  152. //未找到可用层,进入下一次迭代
  153. if (layer == null) continue;
  154. // 当前任务已经分配结束,进入下一次迭代
  155. //未结束,未预分配缓存线信息且包含当前物料编号的行,行号小的优先分配
  156. var rows = layer.Rows.Where(x => x is { IsEmpty: false, Finish: false })
  157. .Where(x => x.CacheLineId == 0)
  158. .Where(x => x.MatCodeList.Contains(taskInfo.MatCode))
  159. .ToList();
  160. //未找到可用行,进入下一次迭代
  161. if (!rows.Any()) continue;
  162. var palletizingRow = rows.MinBy(x => x.RowNo);
  163. //开始初始化缓存位信息
  164. cacheLine = new WCS.Entity.WCS_CacheLine()
  165. {
  166. LocationNo = devCode,
  167. AddTime = DateTime.Now,
  168. PalletizingRowId = palletizingRow.Id,
  169. InStock = false,
  170. Put = false,
  171. IsTruss = false,
  172. MatCodeList = palletizingRow.MatCodeList,
  173. Quantity = palletizingRow.QtyMaxCount,
  174. WarehouseCode = taskInfo.WarehouseCode
  175. };
  176. if (palletizing.isItHalf) //当前任务被分配到了二次码垛托盘上了。
  177. {
  178. var twoDevCode = new List<string>();
  179. switch (obj.Entity.Code)
  180. {
  181. case "455":
  182. twoDevCode.AddRange(new List<string>() { "1670", "1671" });
  183. break;
  184. case "655":
  185. twoDevCode.AddRange(new List<string>() { "1685", "1686" });
  186. break;
  187. case "855":
  188. twoDevCode.AddRange(new List<string>() { "1700", "1701" });
  189. break;
  190. case "1055":
  191. twoDevCode.AddRange(new List<string>() { "1715", "1716" });
  192. break;
  193. case "1255":
  194. twoDevCode.AddRange(new List<string>() { "", "" });
  195. break;
  196. case "1455":
  197. twoDevCode.AddRange(new List<string>() { "", "" });
  198. break;
  199. }
  200. //找到一个对应的空置码垛位
  201. var twoDevs = Device.All.Where(x => twoDevCode.Contains(x.Code)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World)).Where(x => !x.Data3.Status.HasFlag(StationStatus.PH_Status)).Select(x => x.Entity.Code);
  202. if (twoDevs.Any())
  203. {
  204. World.Log("无可用的二次码垛工位");
  205. continue;
  206. }
  207. if (db.Queryable<WCS_Palletizing>().Any(x => !x.Finish && twoDevs.Contains(x.PalletizingStation)))
  208. {
  209. World.Log($"有正目标地址是{JsonConvert.SerializeObject(twoDevs)}的未结束二次码垛任务,无可用的二次码垛工位");
  210. continue;
  211. }
  212. palletizing.EditTime = DateTime.Now;
  213. palletizing.Finish = false;
  214. palletizing.PalletizingStation = twoDevs.FirstOrDefault();
  215. palletizing.TaskAddNext ??= devCode.ToString();
  216. db.UpdateableRowLock(palletizing).ExecuteCommand();
  217. }
  218. if (palletizing.TaskAddNext == null)
  219. {
  220. palletizing.TaskAddNext = devCode.ToString();
  221. db.Updateable(palletizing).ExecuteCommand();
  222. }
  223. var res = db.InsertableRowLock(cacheLine).ExecuteReturnEntity();
  224. palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).Single(x => x.Id == palletizingRow.Id);
  225. palletizingRow.Locs = palletizingRow.Locs.OrderBy(x => x.XYNo).ToList();
  226. palletizingRow.CacheLineId = res.Id;
  227. palletizingRow.EditTime = DateTime.Now;
  228. var createCacheLoc = palletizingRow.Locs.Select((t, i) => new WCS_CacheLineLoc()
  229. {
  230. XYNo = t.XYNo,
  231. InStock = i == 0,
  232. IsEmpty = t.IsEmpty,
  233. MatCode = t.MatCode,
  234. TaskId = i == 0 ? taskInfo.ID : 0,
  235. CacheLineId = res.Id,
  236. AddTime = DateTime.Now
  237. }).ToList();
  238. taskInfo.Status = TaskStatus.FinishOfShunt;
  239. taskInfo.AddrNext = devCode.ToString();
  240. taskInfo.EditWho = "WCS";
  241. taskInfo.EditTime = DateTime.Now;
  242. db.UpdateableRowLock(taskInfo).ExecuteCommand();
  243. taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
  244. db.UpdateableRowLock(palletizingRow).ExecuteCommand();
  245. db.InsertableRowLock(createCacheLoc).ExecuteCommand();
  246. result = true;
  247. }
  248. if (!result)
  249. {
  250. taskInfo.InitStackStructure(db,World);
  251. }
  252. return result;
  253. #endregion 初始化一个信息的缓存信息
  254. }
  255. ///// <summary>
  256. ///// 计算去向
  257. ///// </summary>
  258. ///// <param name="db"></param>
  259. ///// <param name="taskInfo"></param>
  260. ///// <param name="obj"></param>
  261. ///// <returns></returns>
  262. //public bool Allot(SqlSugarScopeProvider db, WCS_TaskInfo taskInfo, Device<IStation520, IStation521, IStation523> obj)
  263. //{
  264. // taskInfo.Device = obj.Entity.Code switch
  265. // {
  266. // "455" => "Truss1",
  267. // "655" => "Truss1",
  268. // "855" => "Truss2",
  269. // "1055" => "Truss2",
  270. // "1255" => "Truss3",
  271. // "1455" => "Truss3",
  272. // _ => "Error"
  273. // };
  274. // //获取当前货物类型可以到达的桁架缓存放行点信息
  275. // var cacheLineDevList = obj.Entity.Targets.Where(x => x.HasFlag(DeviceFlags.桁架缓存放行点)); //当前地址可以到达的所有桁架缓存放行点信息
  276. // switch (taskInfo.GoodsType)
  277. // {
  278. // case 9:
  279. // //是异常工字轮
  280. // cacheLineDevList = taskInfo.BarCode.Contains("Error") ? cacheLineDevList.Where(x => x.HasFlag(DeviceFlags.桁架09异常缓存放行点)) : cacheLineDevList.Where(x => x.HasFlag(DeviceFlags.桁架09缓存放行点));
  281. // break;
  282. // case 18:
  283. // cacheLineDevList = cacheLineDevList.Where(x => x.HasFlag(DeviceFlags.桁架18缓存放行点));
  284. // break;
  285. // }
  286. // var cacheLineCodes = cacheLineDevList.Select(x => x.Code.ToShort());
  287. // var cacheLineList = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).ToList();
  288. // #region 跟据缓存信息寻找可以到达的缓存点
  289. // //找到当前任务可用的缓存线信息
  290. // var cacheLine = cacheLineList.Where(x => x.Locations.Any(l => l is { InStock: false, IsEmpty: false })).FirstOrDefault(x => cacheLineCodes.Contains(x.LocationNo) && x.MatCodeList.Contains(taskInfo.MatCode) && !x.InStock);
  291. // //这个任务可以直接去一条线体,不需要新建缓存信息
  292. // //找到这条线体中序号最小的一条位信息 非空置且无货
  293. // var cacheLoc = cacheLine?.Locations.Where(x => x is { InStock: false, IsEmpty: false }).MinBy(x => x.XYNo);
  294. // if (cacheLoc != null)
  295. // {
  296. // cacheLoc = db.Queryable<WCS_CacheLineLoc>().Single(x => x.Id == cacheLoc.Id);
  297. // cacheLoc.InStock = true;
  298. // cacheLoc.TaskId = taskInfo.ID;
  299. // cacheLoc.EditTime = DateTime.Now;
  300. // db.Updateable(cacheLoc).ExecuteCommand();
  301. // //WCS任务相关信息
  302. // taskInfo.Status = TaskStatus.FinishOfShunt;
  303. // taskInfo.AddrNext = cacheLine.LocationNo.ToString();
  304. // taskInfo.EditWho = "WCS";
  305. // taskInfo.EditTime = DateTime.Now;
  306. // db.Updateable(taskInfo).ExecuteCommand();
  307. // taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
  308. // return true;
  309. // }
  310. // #endregion 跟据缓存信息寻找可以到达的缓存点
  311. // #region 初始化一个信息的缓存信息
  312. // //找到一个可以进行缓存的线体号
  313. // var devCode = cacheLineDevList.Select(x => x.Code.ToShort()).FirstOrDefault(x => !cacheLineList.Select(s => s.LocationNo).Contains(x));
  314. // if (devCode == 0)
  315. // {
  316. // World.Log($"无可用线体:{taskInfo.ID}");
  317. // //var endTime = DateTime.Now.AddMinutes(-10);
  318. // ////找一个当前时间最早且已超过25分钟未码垛的码垛信息半托入库
  319. // ////未结束且包含当前物料编号的垛形,按时间排序,创建时间早的优先分配,当前任务的仓库号必须要等于码垛信息绑定的仓库号
  320. // //var palletizing = db.Queryable<WCS_Palletizing>()
  321. // // .Includes(x => x.Layers, r => r.Rows, l => l.Locs)
  322. // // .Where(x => !x.Finish && x.WarehouseCode == taskInfo.WarehouseCode && x.Layers.Any(l => l.Rows.Any(r => r.Finish)))
  323. // // .Where(x => x.EditTime < endTime).ToList()
  324. // // .MinBy(x => x.AddTime);
  325. // //cacheLineList = db.Queryable<WCS.Entity.WCS_CacheLine>().Where(x => x.WarehouseCode == taskInfo.WarehouseCode && x.IsTruss).ToList();
  326. // //if (palletizing != null && !cacheLineList.Any())
  327. // //{
  328. // // var dev = Device.All.Where(x => x.Code == palletizing.PalletizingStation).Select(x => new Device<ITruss530>(x, World)).FirstOrDefault();
  329. // // if (dev != null && !dev.Data.CmdType.HasFlag(TrussCmdType.Two))
  330. // // {
  331. // // dev.Data.CmdType = TrussCmdType.Two;
  332. // // }
  333. // //}
  334. // return false;
  335. // }
  336. // var result = false;
  337. // //未结束且包含当前物料编号的垛形,按时间排序,创建时间早的优先分配,当前任务的仓库号必须要等于码垛信息绑定的仓库号
  338. // var palletizingList = db.Queryable<WCS_Palletizing>()
  339. // .Includes(x => x.Layers, r => r.Rows, l => l.Locs)
  340. // .Where(x => (!x.Finish || (x.Finish && x.isItHalf)) && x.MatCodeList.Contains(taskInfo.MatCode) && x.WarehouseCode == taskInfo.WarehouseCode)
  341. // .OrderBy(x => x.AddTime)
  342. // .ToList();
  343. // foreach (var palletizing in palletizingList)
  344. // {
  345. // //当前任务已经分配结束,进入下一次迭代
  346. // if (result) continue;
  347. // //未结束且包含当前物料编号的层,按层号排序,层号小的优先分配
  348. // var layer = palletizing.Layers.Where(x => x is { IsEmpty: false, Finish: false })
  349. // .Where(x => x.MatCodeList.Contains(taskInfo.MatCode)).MinBy(x => x.LayerNo);
  350. // //未找到可用层,进入下一次迭代
  351. // if (layer == null) continue;
  352. // // 当前任务已经分配结束,进入下一次迭代
  353. // //未结束,未预分配缓存线信息且包含当前物料编号的行,行号小的优先分配
  354. // var rows = layer.Rows.Where(x => x is { IsEmpty: false, Finish: false })
  355. // .Where(x => x.CacheLineId == 0)
  356. // .Where(x => x.MatCodeList.Contains(taskInfo.MatCode))
  357. // .ToList();
  358. // //未找到可用行,进入下一次迭代
  359. // if (!rows.Any()) continue;
  360. // var palletizingRow = rows.MinBy(x => x.RowNo);
  361. // //开始初始化缓存位信息
  362. // cacheLine = new WCS.Entity.WCS_CacheLine()
  363. // {
  364. // LocationNo = devCode,
  365. // AddTime = DateTime.Now,
  366. // PalletizingRowId = palletizingRow.Id,
  367. // InStock = false,
  368. // Put = false,
  369. // IsTruss = false,
  370. // MatCodeList = palletizingRow.MatCodeList,
  371. // Quantity = palletizingRow.QtyMaxCount,
  372. // WarehouseCode = taskInfo.WarehouseCode
  373. // };
  374. // if (palletizing.isItHalf) //当前任务被分配到了二次码垛托盘上了。
  375. // {
  376. // var twoDevCode = new List<string>();
  377. // switch (obj.Entity.Code)
  378. // {
  379. // case "455":
  380. // twoDevCode.AddRange(new List<string>() { "1674", "1675" });
  381. // break;
  382. // case "655":
  383. // twoDevCode.AddRange(new List<string>() { "", "" });
  384. // break;
  385. // case "855":
  386. // twoDevCode.AddRange(new List<string>() { "1700", "1701" });
  387. // break;
  388. // case "1055":
  389. // twoDevCode.AddRange(new List<string>() { "1715", "1716" });
  390. // break;
  391. // case "1255":
  392. // twoDevCode.AddRange(new List<string>() { "", "" });
  393. // break;
  394. // case "1455":
  395. // twoDevCode.AddRange(new List<string>() { "", "" });
  396. // break;
  397. // }
  398. // //找到一个对应的空置码垛位
  399. // var twoDevs = Device.All.Where(x => twoDevCode.Contains(x.Code)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World)).Where(x => !x.Data3.Status.HasFlag(StationStatus.PH_Status)).Select(x => x.Entity.Code);
  400. // if (twoDevs.Any())
  401. // {
  402. // World.Log("无可用的二次码垛工位");
  403. // continue;
  404. // }
  405. // if (db.Queryable<WCS_Palletizing>().Any(x => !x.Finish && twoDevs.Contains(x.PalletizingStation)))
  406. // {
  407. // World.Log($"有正目标地址是{JsonConvert.SerializeObject(twoDevs)}的未结束二次码垛任务,无可用的二次码垛工位");
  408. // continue;
  409. // }
  410. // palletizing.EditTime = DateTime.Now;
  411. // palletizing.Finish = false;
  412. // palletizing.PalletizingStation = twoDevs.FirstOrDefault();
  413. // palletizing.TaskAddNext ??= devCode.ToString();
  414. // db.Updateable(palletizing).ExecuteCommand();
  415. // }
  416. // if (palletizing.TaskAddNext == null)
  417. // {
  418. // palletizing.TaskAddNext = devCode.ToString();
  419. // db.Updateable(palletizing).ExecuteCommand();
  420. // }
  421. // var res = db.Insertable(cacheLine).ExecuteReturnEntity();
  422. // palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).Single(x => x.Id == palletizingRow.Id);
  423. // palletizingRow.Locs = palletizingRow.Locs.OrderBy(x => x.XYNo).ToList();
  424. // palletizingRow.CacheLineId = res.Id;
  425. // palletizingRow.EditTime = DateTime.Now;
  426. // var createCacheLoc = palletizingRow.Locs.Select((t, i) => new WCS_CacheLineLoc()
  427. // {
  428. // XYNo = t.XYNo,
  429. // InStock = i == 0,
  430. // IsEmpty = t.IsEmpty,
  431. // MatCode = t.MatCode,
  432. // TaskId = i == 0 ? taskInfo.ID : 0,
  433. // CacheLineId = res.Id
  434. // }).ToList();
  435. // taskInfo.Status = TaskStatus.FinishOfShunt;
  436. // taskInfo.AddrNext = devCode.ToString();
  437. // taskInfo.EditWho = "WCS";
  438. // taskInfo.EditTime = DateTime.Now;
  439. // db.Updateable(taskInfo).ExecuteCommand();
  440. // taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
  441. // db.Updateable(palletizingRow).ExecuteCommand();
  442. // db.Insertable(createCacheLoc).ExecuteCommand();
  443. // result = true;
  444. // }
  445. // if (!result)
  446. // {
  447. // taskInfo.InitStackStructure(db);
  448. // }
  449. // return result;
  450. // #endregion 初始化一个信息的缓存信息
  451. //}
  452. }
  453. }