装箱区扫码.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. using ServiceCenter.Extensions;
  2. using ServiceCenter.Logs;
  3. using ServiceCenter.SqlSugars;
  4. using System;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. using System.ComponentModel;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using WCS.Core;
  12. using WCS.Entity;
  13. using WCS.WorkEngineering.Extensions;
  14. using WCS.WorkEngineering.Protocol.BCR;
  15. using WCS.WorkEngineering.Protocol.SRM;
  16. using WCS.WorkEngineering.Protocol.Station;
  17. using WCS.WorkEngineering.WebApi.Controllers;
  18. using WCS.WorkEngineering.Worlds;
  19. using static System.Runtime.InteropServices.JavaScript.JSType;
  20. using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
  21. namespace WCS.WorkEngineering.Systems
  22. {
  23. /// <summary>
  24. /// 装箱区扫码
  25. /// </summary>
  26. [BelongTo(typeof(MainWorld))]
  27. [Description("装箱区扫码")]
  28. public class 装箱区扫码 : DeviceSystem<Device<IStation520, IStation521, IStation523, IStation91, IBCR81>>
  29. {
  30. protected override bool ParallelDo => true;
  31. protected override bool SaveLogsToFile => true;
  32. private List<Station> devs = new List<Station>();
  33. private List<SRM> srms = new List<SRM>();
  34. public override void Do(Device<IStation520, IStation521, IStation523, IStation91, IBCR81> obj)
  35. {
  36. obj.入库站点是否被禁止();
  37. obj.库前入库站点是否满足执行条件();
  38. string bcr = "";
  39. //开始读取条码
  40. bcr = obj.Data5.GetBCRCode();
  41. if (bcr == null) throw new KnownException("未读取到条码", LogLevelEnum.High);
  42. World.Log($"扫码记录:设备号{obj.Entity.Code}-" +
  43. $"bcr{bcr},521任务号:{obj.Data2.TaskNumber}");
  44. WCS_TaskInfo task = null;
  45. SqlSugarHelper.Do(_db =>
  46. {
  47. var db = _db.Default;
  48. //找到对应任务
  49. if (obj.Entity.Code == "8050")
  50. {
  51. var taskInfo = db.Queryable<WCS_TaskInfo>().First(x => (x.AddrFrom == "8050" || x.BusType == "间隔板出库") && x.Status == Entity.TaskStatus.WaitingToExecute);
  52. if (taskInfo == null)
  53. {
  54. return;
  55. //向WMS申请入库任务
  56. //var res = WmsApi.I_WCS_GetInTask(bcr, obj.Entity.Code);
  57. //return;
  58. //throw new KnownException($"未找到条码{bcr}对应WCS任务", LogLevelEnum.High);
  59. }
  60. if (taskInfo.Status == Entity.TaskStatus.WaitingToExecute)
  61. {
  62. if (taskInfo.Type == TaskType.Delivery)
  63. {
  64. taskInfo.AddrNext = "8058";
  65. }
  66. else if (taskInfo.Type == TaskType.OutDepot && taskInfo.BusType == "间隔板出库")
  67. {
  68. taskInfo.AddrNext = taskInfo.AddrTo;
  69. }
  70. taskInfo.Status = Entity.TaskStatus.ConveyorExecution;
  71. taskInfo.EditWho = "WCS";
  72. taskInfo.EditTime = DateTime.Now;
  73. db.Updateable(taskInfo).ExecuteCommand();
  74. taskInfo.AddWCS_TASK_DTL(_db, obj.Entity.Code, taskInfo.AddrNext, $"8050扫码");
  75. //taskInfo.updateRedisHash();
  76. task = taskInfo;
  77. }
  78. }
  79. else
  80. {
  81. var taskInfo = db.Queryable<WCS_TaskInfo>().First(x => x.ID == obj.Data2.TaskNumber);
  82. if (taskInfo == null && obj.Data2.TaskNumber > 0)
  83. {
  84. obj.Data.TaskNumber = obj.Data2.TaskNumber;
  85. obj.Data.GoodsStart = obj.Entity.Code.ToShort();
  86. obj.Data.GoodsEnd = 8148;
  87. obj.Data.VoucherNo++;
  88. throw new KnownException($"未找到对应WCS任务{obj.Data2.TaskNumber}", LogLevelEnum.High);
  89. }
  90. else if (string.IsNullOrEmpty(taskInfo.BarCode))
  91. {
  92. if (db.Queryable<WCS_TaskInfo>().Any(x => x.BarCode == bcr))
  93. {
  94. throw new KnownException($"一条托盘码不允许绑定两个任务{obj.Data2.TaskNumber}托盘码{bcr}", LogLevelEnum.High);
  95. }
  96. taskInfo.EditWho = "WCS";
  97. taskInfo.EditTime = DateTime.Now;
  98. taskInfo.BarCode = bcr;
  99. if (obj.Data4.Weight == 0)
  100. {
  101. obj.Data.TaskNumber = obj.Data2.TaskNumber;
  102. obj.Data.GoodsStart = obj.Entity.Code.ToShort();
  103. obj.Data.GoodsEnd = 8148;
  104. obj.Data.VoucherNo++;
  105. //taskInfo.AddWCS_TASK_DTL(_db, obj.Entity.Code, "8148", $"称重信息是0,排出到异常口");
  106. throw new KnownException($"任务{obj.Data2.TaskNumber}称重信息是0,排出到异常口,起始地址{obj.Data.GoodsStart}-目标地址{obj.Data.GoodsEnd}", LogLevelEnum.High);
  107. }
  108. taskInfo.AddrNext = taskInfo.AddrTo;
  109. taskInfo.Weight = (float)Math.Round(obj.Data4.Weight, 2);
  110. db.Updateable(taskInfo).ExecuteCommand();
  111. WCS_TaskOld taskOld = db.Queryable<WCS_TaskOld>().SplitTable(tabs => tabs.Take(2)).Where(v => v.ID == taskInfo.ID).OrderByDescending(v => v.AddTime).First();
  112. if (taskOld != null)
  113. {
  114. taskOld.BarCode = taskInfo.BarCode;
  115. db.Updateable(taskOld).SplitTable(tas => tas.Take(2)).ExecuteCommand();
  116. }
  117. taskInfo.AddWCS_TASK_DTL(_db, obj.Entity.Code, taskInfo.AddrNext, $"8058扫码完成");
  118. //taskInfo.updateRedisHash();
  119. task = taskInfo;
  120. }
  121. else if (taskInfo.BarCode != bcr)
  122. {
  123. obj.Data.TaskNumber = obj.Data2.TaskNumber;
  124. obj.Data.GoodsStart = obj.Entity.Code.ToShort();
  125. obj.Data.GoodsEnd = 8148;
  126. obj.Data.VoucherNo++;
  127. throw new KnownException($"任务{obj.Data2.TaskNumber}绑定的托盘条码与实际扫描条码不一致,排出到异常口,起始地址{obj.Data.GoodsStart}-目标地址{obj.Data.GoodsEnd}", LogLevelEnum.High);
  128. }
  129. else if (taskInfo.BarCode == bcr)
  130. {
  131. if (taskInfo.Type == TaskType.Delivery || (taskInfo.Type == TaskType.OutDepot && taskInfo.BusType == "间隔板出库"))
  132. {
  133. taskInfo.AddrNext = taskInfo.AddrTo;
  134. taskInfo.EditWho = "WCS";
  135. taskInfo.EditTime = DateTime.Now;
  136. taskInfo.Weight = (float)Math.Round(obj.Data4.Weight, 2);
  137. try { WmsApi.WcsUploadInfo(taskInfo.ID, (decimal)taskInfo.Weight, ""); }
  138. catch (Exception ex) { throw new KnownException(ex.Message, LogLevelEnum.Mid); }
  139. db.Updateable(taskInfo).ExecuteCommand();
  140. taskInfo.AddWCS_TASK_DTL(_db, obj.Entity.Code, taskInfo.AddrNext, $"8058重复扫码完成");
  141. task = taskInfo;
  142. }
  143. else if (taskInfo.Type == TaskType.OutDepot && taskInfo.BusType == "砝码出库")
  144. {
  145. var weightBefore = taskInfo.Weight;
  146. var weightNow = (decimal)Math.Round(obj.Data4.Weight, 2);
  147. //上抛重量信息并记录
  148. //try { WmsApi.WcsUploadInfo(taskInfo.ID, weightNow, ""); }
  149. //catch (Exception ex) { throw new KnownException(ex.Message, LogLevelEnum.Mid); }
  150. //把状态变更为入库任务并且需要从库前执行入库,固定分配至5巷道 砝码入库
  151. taskInfo.AddrNext = "8161"; //TODO:目标地址改为库前入库相关路径
  152. taskInfo.EditWho = "WCS";
  153. taskInfo.EditTime = DateTime.Now;
  154. taskInfo.Weight = (float)weightNow;
  155. taskInfo.Type = TaskType.EnterDepot;
  156. taskInfo.Status = Entity.TaskStatus.ConveyorExecution;
  157. taskInfo.BusType = "砝码出库";
  158. db.Updateable(taskInfo).ExecuteCommand();
  159. taskInfo.AddWCS_TASK_DTL1(_db, obj.Entity.Code, taskInfo.AddrNext, $"8058重复扫码完成,已称重,前{weightBefore}-后{weightNow}");
  160. task = taskInfo;
  161. }
  162. else
  163. {
  164. //taskInfo.AddrNext = string.IsNullOrEmpty(taskInfo.AddrTo) ? "8128" : "8161";
  165. taskInfo.AddrNext = string.IsNullOrEmpty(taskInfo.AddrTo) ? "8128" : "8300";
  166. taskInfo.EditWho = "WCS";
  167. taskInfo.EditTime = DateTime.Now;
  168. taskInfo.Weight = (float)Math.Round(obj.Data4.Weight, 2);
  169. //上抛重量
  170. try { WmsApi.WcsUploadInfo(taskInfo.ID, (decimal)taskInfo.Weight, taskInfo.BarCode); }
  171. catch (Exception ex) { throw new KnownException(ex.Message, LogLevelEnum.Mid); }
  172. db.Updateable(taskInfo).ExecuteCommand();
  173. taskInfo.AddWCS_TASK_DTL(_db, obj.Entity.Code, taskInfo.AddrNext, $"8058扫码完成");
  174. //taskInfo.updateRedisHash();
  175. task = taskInfo;
  176. }
  177. }
  178. }
  179. });
  180. if (task == null) return;
  181. obj.Data.TaskNumber = task.ID;
  182. obj.Data.GoodsStart = obj.Entity.Code.ToShort();
  183. obj.Data.GoodsEnd = task.AddrNext.ToShort();
  184. obj.Data.VoucherNo++;
  185. World.Log($"设备号{obj.Entity.Code},任务号{task.ID},起始地址{obj.Data.GoodsStart},目标地址{obj.Data.GoodsEnd}");
  186. }
  187. public override bool Select(Device dev)
  188. {
  189. return dev.Code == "8050" || dev.Code == "8058";
  190. }
  191. }
  192. }