环形库分配货位.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. using ServiceCenter.Extensions;
  2. using ServiceCenter.Logs;
  3. using ServiceCenter.SqlSugars;
  4. using System.ComponentModel;
  5. using WCS.Core;
  6. using WCS.Entity;
  7. using WCS.Entity.Protocol.Station;
  8. using WCS.WorkEngineering.Extensions;
  9. using WCS.WorkEngineering.Model.WMS;
  10. using WCS.WorkEngineering.WebApi.Controllers;
  11. using WCS.WorkEngineering.WebApi.Models.WMS.Response;
  12. using WCS.WorkEngineering.Worlds;
  13. using TaskStatus = WCS.Entity.TaskStatus;
  14. namespace WCS.WorkEngineering.Systems.环形库
  15. {
  16. /// <summary>
  17. /// 环形库分配货位
  18. /// </summary>
  19. [BelongTo(typeof(SortingBranchWorld))]
  20. [Description("环形库分配货位")]
  21. public class 环形库分配货位 : DeviceSystem<Device<IStation520, IStation521, IStation523>>
  22. {
  23. protected override bool ParallelDo => true;
  24. public override void Do(Device<IStation520, IStation521, IStation523> obj)
  25. {
  26. if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
  27. {
  28. World.Log($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}");
  29. return;
  30. }
  31. if (obj.Data3.Status.HasFlag(StationStatus.Run))
  32. {
  33. World.Log("设备运行中");
  34. return;
  35. }
  36. ;
  37. if (!obj.Data3.Status.HasFlag(StationStatus.OT_Status))
  38. {
  39. World.Log("站台货物信息与实际占用不一致");
  40. return;
  41. }
  42. if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status))
  43. {
  44. }
  45. ;
  46. if (obj.Data2.Request != 1)
  47. {
  48. World.Log("无请求");
  49. return;
  50. }
  51. WCS_TaskInfo taskInfo = null;
  52. int sideNum = 0;
  53. //开始获取货位号
  54. SqlSugarHelper.Do(db =>
  55. {
  56. var task = db.Default.Queryable<WCS_TaskInfo>().First(v => obj.Data2.TaskNumber == v.ID);
  57. if (task == null)
  58. {
  59. World.Log($"未找到任务[{obj.Data2.TaskNumber}],请人工接入处理!!!!");
  60. return;
  61. }
  62. if (task.Type != TaskType.SetPlate)
  63. {
  64. World.Log($"任务[{obj.Data2.TaskNumber}]任务类型错误,应该是组盘任务,请人工接入处理!!!!");
  65. return;
  66. }
  67. if (task.Status != TaskStatus.FinishOfShunt)
  68. {
  69. World.Log($"任务[{obj.Data2.TaskNumber}]任务状态错误,当前状态应该市分流结束,,请人工接入处理!!!!");
  70. return;
  71. }
  72. var robot = GetRobotDevice(obj.Entity);
  73. if (robot == null)
  74. {
  75. World.Log($"未检索到对应的机械臂设备号", LogLevelEnum.High);
  76. return;
  77. }
  78. if (robot.GetIsDirectPalletizing(db.Default))
  79. {
  80. //获取对应的码垛信息
  81. var ringPalletizingInfo = db.Default.Queryable<BillRingPalletizingInfo>().Single(x => x.Id == task.TaskGroupKey.ToLong());
  82. // 获取对应码垛工位所有的码垛信息
  83. var ringPalletizingInfos = db.Default.Queryable<BillRingPalletizingInfo>().Where(x => x.MaDuoGongWei == ringPalletizingInfo.MaDuoGongWei && x.Out == false).ToList();
  84. if (ringPalletizingInfos.Count > 1) //有多条需判断是否能进行放行
  85. {
  86. //获取所有此码垛工位所有已经分配的任务
  87. var ringPalletizingMaDuoGongWeilList = ringPalletizingInfos.Select(x => x.Id.ToString()).ToList();
  88. var tasks = db.Default.Queryable<WCS_TaskInfo>().Where(x => ringPalletizingMaDuoGongWeilList.Contains(x.TaskGroupKey) && x.Status < TaskStatus.Finish && x.ProdLine == 1).ToList();
  89. //暂时不考虑同一个码垛工位,会有出现第一条信息还没被放行,第二条码垛信息就被创建的情况
  90. if (tasks.GroupBy(x => x.TaskGroupKey).Count() != 1)
  91. {
  92. World.Log($"同时有两组未结束的码垛信息被放行,请检查码垛工位{ringPalletizingInfo.MaDuoGongWei}的实际情况,是否存在上组任务未结束或任务乱等情况", LogLevelEnum.High);
  93. return;
  94. }
  95. if (tasks.First().TaskGroupKey == ringPalletizingInfo.Id.ToString())
  96. {
  97. task.LastInteractionPoint = obj.Entity.Code;
  98. task.AddrTo = ringPalletizingInfo.MaDuoGongWei;
  99. task.Device = obj.Entity.Code;
  100. task.ProdLine = 1; //标识放行
  101. task.EditWho = "WCS";
  102. db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.AddrTo, x.LastInteractionPoint, x.ProdLine, x.Device, x.EditWho }).ExecuteCommand();
  103. task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, task.AddrTo, $"直接码垛放行{task.AddrTo}");
  104. //var invNow = db.Default.Queryable<BillInvnow>().NoLock().First(x => x.ContGrpBarCode == task.BarCode);
  105. //默认信息
  106. sideNum = 1;
  107. taskInfo = task;
  108. }
  109. else
  110. {
  111. World.Log($"同时有两组未结束的码垛信息被放行,请检查码垛工位{ringPalletizingInfo.MaDuoGongWei}的实际情况,是否存在上组任务未结束或任务乱等情况", LogLevelEnum.High);
  112. return;
  113. }
  114. }
  115. else
  116. {
  117. task.LastInteractionPoint = obj.Entity.Code;
  118. task.AddrTo = ringPalletizingInfo.MaDuoGongWei;
  119. task.Device = obj.Entity.Code;
  120. task.ProdLine = 1; //标识放行
  121. task.EditWho = "WCS";
  122. db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.AddrTo, x.LastInteractionPoint, x.ProdLine, x.Device, x.EditWho }).ExecuteCommand();
  123. task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, task.AddrTo, $"直接码垛放行{task.AddrTo}");
  124. //var invNow = db.Default.Queryable<BillInvnow>().NoLock().First(x => x.ContGrpBarCode == task.BarCode);
  125. //默认信息
  126. sideNum = 1;
  127. taskInfo = task;
  128. }
  129. }
  130. else
  131. {
  132. var res = WmsApi.RingApplyStockInLoc(task.ID, task.Device, obj.Entity.Code, task.GoodsType);
  133. if (res.ResCode != ResponseStatusCodeEnum.Sucess)
  134. {
  135. World.Log(res.ResMsg, ServiceCenter.Logs.LogLevelEnum.High);
  136. return;
  137. }
  138. task.AddrTo = res.ResData.CellNo;
  139. task.Line = res.ResData.Row;
  140. task.Col = res.ResData.Colomn;
  141. task.Layer = res.ResData.Layer;
  142. task.Depth = res.ResData.Row;
  143. task.LastInteractionPoint = obj.Entity.Code;
  144. task.Device = obj.Entity.Code;
  145. task.EditWho = "WCS";
  146. db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.AddrTo, x.Line, x.Col, x.Layer, x.Depth, x.LastInteractionPoint, x.Device, x.EditWho }).ExecuteCommand();
  147. task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, task.AddrTo, $"任务分配货位{task.AddrTo}");
  148. var invNow = db.Default.Queryable<BillInvnow>().NoLock().First(x => x.ContGrpBarCode == task.BarCode);
  149. sideNum = invNow.SideNum;
  150. taskInfo = task;
  151. }
  152. });
  153. if (taskInfo == null) return;
  154. var next = (taskInfo.AddrNext.ToShort() - 2).ToShort();
  155. obj.Data.TaskNumber = taskInfo.ID;
  156. obj.Data.TaskNumber = taskInfo.ID;
  157. obj.Data.GoodsStart = obj.Entity.Code.ToShort();
  158. obj.Data.GoodsStart = obj.Entity.Code.ToShort();
  159. obj.Data.GoodsEnd = next;
  160. if (sideNum == 2) //反面
  161. {
  162. obj.Data.CmdType = StationCmd.Res6;
  163. obj.Data.CmdType = StationCmd.Res6;
  164. }
  165. obj.Data.GoodsEnd = next;
  166. obj.Data.SetVoucherNo();
  167. }
  168. public override bool Select(Device dev)
  169. {
  170. var codes = new List<string>()
  171. {
  172. "444","644","844","1044","1244","1444",
  173. "426","626","826","1026","1226","1426",
  174. "435","635","835","1035","1235","1435"
  175. };
  176. return codes.Any(x => x == dev.Code);
  177. }
  178. public Device? GetRobotDevice(Device dev)
  179. {
  180. var robotCode = dev.Code switch
  181. {
  182. "435" => "Robot1",
  183. "635" => "Robot2",
  184. "835" => "Robot3",
  185. "1035" => "Robot4",
  186. "1235" => "Robot5",
  187. "1435" => "Robot6",
  188. "444" => "Robot1",
  189. "644" => "Robot2",
  190. "844" => "Robot3",
  191. "1044" => "Robot4",
  192. "1244" => "Robot5",
  193. "1444" => "Robot6",
  194. "426" => "Robot1",
  195. "626" => "Robot2",
  196. "826" => "Robot3",
  197. "1026" => "Robot4",
  198. "1226" => "Robot5",
  199. "1426" => "Robot6",
  200. _ => "99999"
  201. };
  202. return Device.All.FirstOrDefault(v => v.Code == robotCode);
  203. }
  204. }
  205. }