环形库分配货位.cs 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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.Device = obj.Entity.Code;
  99. task.ProdLine = 1; //标识放行
  100. task.EditWho = "WCS";
  101. db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.LastInteractionPoint, x.ProdLine, x.Device, x.EditWho }).ExecuteCommand();
  102. task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, task.AddrTo, $"直接码垛放行{task.AddrTo}");
  103. var invNow = db.Default.Queryable<BillInvnow>().NoLock().First(x => x.ContGrpBarCode == task.BarCode);
  104. sideNum = invNow.SideNum;
  105. taskInfo = task;
  106. }
  107. else
  108. {
  109. World.Log($"同时有两组未结束的码垛信息被放行,请检查码垛工位{ringPalletizingInfo.MaDuoGongWei}的实际情况,是否存在上组任务未结束或任务乱等情况", LogLevelEnum.High);
  110. return;
  111. }
  112. }
  113. else
  114. {
  115. task.LastInteractionPoint = obj.Entity.Code;
  116. task.Device = obj.Entity.Code;
  117. task.ProdLine = 1; //标识放行
  118. task.EditWho = "WCS";
  119. db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.LastInteractionPoint, x.ProdLine, x.Device, x.EditWho }).ExecuteCommand();
  120. task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, task.AddrTo, $"直接码垛放行{task.AddrTo}");
  121. var invNow = db.Default.Queryable<BillInvnow>().NoLock().First(x => x.ContGrpBarCode == task.BarCode);
  122. sideNum = invNow.SideNum;
  123. taskInfo = task;
  124. }
  125. }
  126. else
  127. {
  128. var res = WmsApi.RingApplyStockInLoc(task.ID, task.Device, obj.Entity.Code, task.GoodsType);
  129. if (res.ResCode != ResponseStatusCodeEnum.Sucess)
  130. {
  131. World.Log(res.ResMsg, ServiceCenter.Logs.LogLevelEnum.High);
  132. return;
  133. }
  134. task.AddrTo = res.ResData.CellNo;
  135. task.Line = res.ResData.Row;
  136. task.Col = res.ResData.Colomn;
  137. task.Layer = res.ResData.Layer;
  138. task.Depth = res.ResData.Row;
  139. task.LastInteractionPoint = obj.Entity.Code;
  140. task.Device = obj.Entity.Code;
  141. task.EditWho = "WCS";
  142. db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.AddrTo, x.Line, x.Col, x.Layer, x.Depth, x.LastInteractionPoint, x.Device, x.EditWho }).ExecuteCommand();
  143. task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, task.AddrTo, $"任务分配货位{task.AddrTo}");
  144. var invNow = db.Default.Queryable<BillInvnow>().NoLock().First(x => x.ContGrpBarCode == task.BarCode);
  145. sideNum = invNow.SideNum;
  146. taskInfo = task;
  147. }
  148. });
  149. if (taskInfo == null) return;
  150. var next = (taskInfo.AddrNext.ToShort() - 2).ToShort();
  151. obj.Data.TaskNumber = taskInfo.ID;
  152. obj.Data.TaskNumber = taskInfo.ID;
  153. obj.Data.GoodsStart = obj.Entity.Code.ToShort();
  154. obj.Data.GoodsStart = obj.Entity.Code.ToShort();
  155. obj.Data.GoodsEnd = next;
  156. if (sideNum == 2) //反面
  157. {
  158. obj.Data.CmdType = StationCmd.Res6;
  159. obj.Data.CmdType = StationCmd.Res6;
  160. }
  161. obj.Data.GoodsEnd = next;
  162. obj.Data.SetVoucherNo();
  163. }
  164. public override bool Select(Device dev)
  165. {
  166. var codes = new List<string>()
  167. {
  168. "444","644","844","1044","1244","1444",
  169. "426","626","826","1026","1226","1426",
  170. "435","635","835","1035","1235","1435"
  171. };
  172. return codes.Any(x => x == dev.Code);
  173. }
  174. public Device? GetRobotDevice(Device dev)
  175. {
  176. var robotCode = dev.Code switch
  177. {
  178. "433" => "Robot1",
  179. "633" => "Robot2",
  180. "833" => "Robot3",
  181. "1033" => "Robot4",
  182. "1233" => "Robot5",
  183. "1433" => "Robot6",
  184. "442" => "Robot1",
  185. "642" => "Robot2",
  186. "842" => "Robot3",
  187. "1042" => "Robot4",
  188. "1242" => "Robot5",
  189. "1442" => "Robot6",
  190. _ => "99999"
  191. };
  192. return Device.All.FirstOrDefault(v => v.Code == robotCode);
  193. }
  194. }
  195. }