桁架码垛区补空托盘任务生成.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using PlcSiemens.Core.Extension;
  2. using ServiceCenter.Extensions;
  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.Worlds;
  9. using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
  10. using TaskStatus = WCS.Entity.TaskStatus;
  11. namespace WCS.WorkEngineering.Systems
  12. {
  13. /// <summary>
  14. /// 桁架码垛区补空托盘任务生成
  15. /// </summary>
  16. [BelongTo(typeof(SortingPalletizingWorld))]
  17. [Description("桁架码垛区补空托盘任务生成")]
  18. public class 桁架码垛区补空托盘任务生成 : DeviceSystem<Device<IStation520>>
  19. {
  20. protected override bool ParallelDo => true;
  21. protected override bool SaveLogsToFile => true;
  22. public override void Do(Device<IStation520> obj)
  23. {
  24. WCS_Palletizing palletizing = null;
  25. SqlSugarHelper.Do(_db =>
  26. {
  27. var db = _db.Default;
  28. //取一个时间最靠前的,没有绑定码垛工位的码垛记录
  29. var palletizingInfo = db.Queryable<WCS_Palletizing>().OrderBy(x => x.AddTime).First(x => x.DeviceCode != "Truss1" && x.PalletizingStation == null && !x.Finish);
  30. if (palletizingInfo == null) throw new Exception($"没有可用码垛信息");
  31. var palleTask = db.Queryable<WCS_TaskInfo>().First(x => x.ID == palletizingInfo.TaskId && (x.Status == TaskStatus.FinishOfShunt || x.Status == TaskStatus.ConveyorExecution));
  32. if (palleTask == null) throw new Exception($"未找到任务{palleTask.ID}");
  33. //获取可以使用的放货站台信息
  34. var taskAddNext = Device.All.FirstOrDefault(x => x.Code == palleTask.AddrNext).Targets.FirstOrDefault().Targets.Where(x => x.HasFlag(DeviceFlags.桁架码垛位));
  35. if (taskAddNext == null) throw new Exception($"未找到{palleTask.AddrNext}可去的码垛工位");
  36. var devs = Device.All.Where(x => taskAddNext.Contains(x)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World)).ToList();
  37. //获取所有的未结束且有码垛工位的码垛记录
  38. var palletizingStation = db.Queryable<WCS_Palletizing>().Where(x => !x.Finish && x.PalletizingStation != null).Select(x => x.PalletizingStation).ToList();
  39. //取一个可用用于码垛的地方
  40. var dev = devs.Where(x => !palletizingStation.Contains(x.Entity.Code)).FirstOrDefault(x => !x.Data3.Status.HasFlag(StationStatus.PH_Status));
  41. if (dev == null) throw new Exception($"没有可用码垛工位");
  42. var addrFromCode = palletizingInfo.WarehouseCode switch
  43. {
  44. "1N" => "1606",
  45. "1S" => "1616",
  46. "2N" => "1626",
  47. "2S" => "1636",
  48. "3N" => "1646",
  49. "3S" => "1656",
  50. _ => "9999"
  51. };
  52. var endDev = Device.All.Where(x => x.Code == addrFromCode).Select(x => new Device<IStation520>(x, World)).FirstOrDefault();
  53. if (endDev.Data.TaskNumber != 0 || endDev.Data.GoodsEnd != 0) throw new Exception($"{endDev.Entity.Code}有残留任务信息,请处理!");
  54. palletizingInfo.PalletizingStation = dev.Entity.Code;
  55. db.Updateable(palletizingInfo).ExecuteCommand();
  56. palletizing = palletizingInfo;
  57. });
  58. if (palletizing == null) return;
  59. var addrFromCode = palletizing.WarehouseCode switch
  60. {
  61. "1N" => "1606",
  62. "1S" => "1616",
  63. "2N" => "1626",
  64. "2S" => "1636",
  65. "3N" => "1646",
  66. "3S" => "1656",
  67. _ => "9999"
  68. };
  69. var dev = Device.All.Where(x => x.Code == addrFromCode).Select(x => new Device<IStation520>(x, World)).FirstOrDefault();
  70. dev.Data.TaskNumber = palletizing.Id;
  71. dev.Data.GoodsEnd = palletizing.PalletizingStation!.ToShort();
  72. }
  73. public override bool Select(Device dev)
  74. {
  75. return dev.Code == nameof(桁架码垛区补空托盘任务生成);
  76. }
  77. }
  78. }