|  | @@ -18,43 +18,43 @@ namespace WCS.Service.Works.Station
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              var timer = new Stopwatch();
 | 
	
		
			
				|  |  |              timer.Start();
 | 
	
		
			
				|  |  | -            obj.EX(obj =>
 | 
	
		
			
				|  |  | +            obj.EX(stationDeviceGroup =>
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
 | 
	
		
			
				|  |  | -                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
 | 
	
		
			
				|  |  | +                if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
 | 
	
		
			
				|  |  | +                if (stationDeviceGroup.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  //成功处理的任务
 | 
	
		
			
				|  |  |                  var finishTaskList = new List<FinishTaskList<int>>();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  DB.Do(db =>
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    var devs = new List<FinishTaskList<string>>();
 | 
	
		
			
				|  |  | -                    foreach (var dev in obj.Items)
 | 
	
		
			
				|  |  | +                    var devise = new List<FinishTaskList<string>>();
 | 
	
		
			
				|  |  | +                    foreach (var dev in stationDeviceGroup.Items)
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          //没有请求
 | 
	
		
			
				|  |  |                          if (dev.Data2.Request != IstationRequest.堆垛机放货完成请求目标地址)
 | 
	
		
			
				|  |  |                          {
 | 
	
		
			
				|  |  | -                            InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-堆垛机放货完成请求--4");
 | 
	
		
			
				|  |  | +                            InfoLog.INFO_INFO($"{stationDeviceGroup.Entity.CODE}无请求-堆垛机放货完成请求--4");
 | 
	
		
			
				|  |  |                              continue;
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  |                          //没有光电
 | 
	
		
			
				|  |  |                          if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
 | 
	
		
			
				|  |  |                          {
 | 
	
		
			
				|  |  | -                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
 | 
	
		
			
				|  |  | +                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
 | 
	
		
			
				|  |  |                              continue;
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  | -                        devs.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
 | 
	
		
			
				|  |  | +                        devise.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | -                    if (!devs.Any()) return;
 | 
	
		
			
				|  |  | -                    foreach (var dev in devs)
 | 
	
		
			
				|  |  | +                    if (!devise.Any()) return;
 | 
	
		
			
				|  |  | +                    foreach (var dev in devise)
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.TYPE == TaskType.出库 && v.SRMSTATION == dev.FinishCode && v.STATUS == TaskStatus.堆垛机完成) ?? throw new WarnException("无任务");
 | 
	
		
			
				|  |  |                          var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TaskGroupKey == task.TaskGroupKey);
 | 
	
		
			
				|  |  | -                        if (tasks.Count() != devs.Count) throw new WarnException($"可执行任务数{devs.Count},实际任务数{tasks.Count()}");
 | 
	
		
			
				|  |  | +                        if (tasks.Count() != devise.Count) throw new WarnException($"可执行任务数{devise.Count},实际任务数{tasks.Count()}");
 | 
	
		
			
				|  |  |                          if (tasks.Any(v => v.STATUS != TaskStatus.堆垛机完成 && v.STATUS != TaskStatus.执行中)) throw new WarnException("任务异常,同组任务状态不为堆垛机完成或执行中");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                          task.STATUS = TaskStatus.执行中;
 | 
	
		
			
				|  |  | -                        task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{obj.Entity.Code}", this.GetType());
 | 
	
		
			
				|  |  | +                        task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{stationDeviceGroup.Entity.CODE}", GetType());
 | 
	
		
			
				|  |  |                          finishTaskList.Add(new FinishTaskList<int>(task.ID, dev.Station));
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      db.Default.SaveChanges();
 | 
	
	
		
			
				|  | @@ -73,22 +73,21 @@ namespace WCS.Service.Works.Station
 | 
	
		
			
				|  |  |                          finish.Station.Data.CmdType = IstationCmdType.堆垛机放货完成请求目标地址;
 | 
	
		
			
				|  |  |                          finish.Station.Data.VoucherNo++;
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | -                    if (finishTaskList.Any())
 | 
	
		
			
				|  |  | -                    {
 | 
	
		
			
				|  |  | -                        timer.Stop();
 | 
	
		
			
				|  |  | -                        InfoLog.INFO_TIMING($"{obj.Entity.CODE}--分配目标地址,耗时{timer.ElapsedMilliseconds}");
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    if (!finishTaskList.Any()) return;
 | 
	
		
			
				|  |  | +                    timer.Stop();
 | 
	
		
			
				|  |  | +                    InfoLog.INFO_TIMING($"{stationDeviceGroup.Entity.CODE}--分配目标地址,耗时{timer.ElapsedMilliseconds}");
 | 
	
		
			
				|  |  |                  });
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          protected override bool SelectDevice(WCS_DEVICE dev)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            return devCodes.Contains(dev.CODE);
 | 
	
		
			
				|  |  | +            return _devCodes.Contains(dev.CODE);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          //月台堆垛机放货设备组
 | 
	
		
			
				|  |  | -        private List<string> devCodes = new List<string>() { "G1473", "G1474", "G1493", "G1491", "G1520", "G1522", "G1545", "G1451" };
 | 
	
		
			
				|  |  | +        private readonly List<string> _devCodes = new() { "G1473", "G1474", "G1493", "G1491", "G1520", "G1522", "G1545", "G1451" };
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      [WorkTitle(typeof(ProductHandler), "月台出货口完成任务")]
 | 
	
	
		
			
				|  | @@ -99,39 +98,39 @@ namespace WCS.Service.Works.Station
 | 
	
		
			
				|  |  |              var timer = new Stopwatch();
 | 
	
		
			
				|  |  |              timer.Start();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            obj.EX(obj =>
 | 
	
		
			
				|  |  | +            obj.EX(stationDeviceGroup =>
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  //当前组有一个运行的设备就停止执行
 | 
	
		
			
				|  |  | -                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("设备运行中");
 | 
	
		
			
				|  |  | -                if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new DoException("设备停止运行,但有光电");
 | 
	
		
			
				|  |  | +                if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("设备运行中");
 | 
	
		
			
				|  |  | +                if (stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new DoException("设备停止运行,但有光电");
 | 
	
		
			
				|  |  |                  //此处逻辑为货物离开后报完成
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  //成功处理的任务
 | 
	
		
			
				|  |  |                  var finishTaskList = new List<FinishTaskList<int>>();
 | 
	
		
			
				|  |  |                  DB.Do(db =>
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    var devs = new List<FinishTaskList<string>>();
 | 
	
		
			
				|  |  | -                    foreach (var dev in obj.Items)
 | 
	
		
			
				|  |  | +                    var devise = new List<FinishTaskList<string>>();
 | 
	
		
			
				|  |  | +                    foreach (var dev in stationDeviceGroup.Items)
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          if (dev.Data2.Request != IstationRequest.月台出库口任务完成)
 | 
	
		
			
				|  |  |                          {
 | 
	
		
			
				|  |  | -                            InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-月台出库口任务完成--3");
 | 
	
		
			
				|  |  | +                            InfoLog.INFO_INFO($"{stationDeviceGroup.Entity.CODE}无请求-月台出库口任务完成--3");
 | 
	
		
			
				|  |  |                              continue;
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  |                          if (dev.Data2.Tasknum < 10000)
 | 
	
		
			
				|  |  |                          {
 | 
	
		
			
				|  |  | -                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无任务号", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
 | 
	
		
			
				|  |  | +                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无任务号", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
 | 
	
		
			
				|  |  |                              continue;
 | 
	
		
			
				|  |  |                          };
 | 
	
		
			
				|  |  | -                        devs.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
 | 
	
		
			
				|  |  | +                        devise.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                    foreach (var dev in devs)
 | 
	
		
			
				|  |  | +                    foreach (var dev in devise)
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  | -                        var task = db.Default.Set<WCS_TASK>().Where(v => v.ID == dev.Station.Data2.Tasknum).FirstOrDefault();
 | 
	
		
			
				|  |  | -                        if (task.STATUS == TaskStatus.新建) throw new WarnException($"{task.ID}任务状态错误");
 | 
	
		
			
				|  |  | +                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Station.Data2.Tasknum);
 | 
	
		
			
				|  |  | +                        if (task?.STATUS == TaskStatus.新建) throw new WarnException($"{task.ID}任务状态错误");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                        task.STATUS = TaskStatus.已完成;
 | 
	
		
			
				|  |  | +                        task!.STATUS = TaskStatus.已完成;
 | 
	
		
			
				|  |  |                          task.ENDTIME = System.DateTime.Now;
 | 
	
		
			
				|  |  |                          task.UPDATEUSER = "WCS";
 | 
	
		
			
				|  |  |                          task.CreateStatusLog(db, $"状态由[{TaskStatus.执行中}]变更为[{task.STATUS}]-{dev.FinishCode}", this.GetType());
 | 
	
	
		
			
				|  | @@ -141,27 +140,25 @@ namespace WCS.Service.Works.Station
 | 
	
		
			
				|  |  |                  });
 | 
	
		
			
				|  |  |                  DB.Do(db =>
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    foreach (var finish in finishTaskList)
 | 
	
		
			
				|  |  | +                    foreach (var finish in from finish in finishTaskList let task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == finish.FinishCode) select finish)
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  | -                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == finish.FinishCode);
 | 
	
		
			
				|  |  |                          finish.Station.Data.CmdType = IstationCmdType.月台出库口任务完成;
 | 
	
		
			
				|  |  |                          finish.Station.Data.VoucherNo++;
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | -                    if (finishTaskList.Any())
 | 
	
		
			
				|  |  | -                    {
 | 
	
		
			
				|  |  | -                        timer.Stop();
 | 
	
		
			
				|  |  | -                        InfoLog.INFO_TIMING($"{obj.Entity.CODE}--处理请求到反馈完成信号耗时{timer.ElapsedMilliseconds}");
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    if (!finishTaskList.Any()) return;
 | 
	
		
			
				|  |  | +                    timer.Stop();
 | 
	
		
			
				|  |  | +                    InfoLog.INFO_TIMING($"{stationDeviceGroup.Entity.CODE}--处理请求到反馈完成信号耗时{timer.ElapsedMilliseconds}");
 | 
	
		
			
				|  |  |                  });
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          protected override bool SelectDevice(WCS_DEVICE dev)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            return devCodes.Contains(dev.CODE);
 | 
	
		
			
				|  |  | +            return _devCodes.Contains(dev.CODE);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private List<string> devCodes = new List<string>() { "G1469", "G1561", "G1538", "G1574", "G1509" };
 | 
	
		
			
				|  |  | +        private readonly List<string> _devCodes = new() { "G1469", "G1561", "G1538", "G1574", "G1509" };
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      [WorkTitle(typeof(ProductHandler), "转圈交互点分配目标地址")]
 | 
	
	
		
			
				|  | @@ -169,45 +166,45 @@ namespace WCS.Service.Works.Station
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          protected override void Do(StationDeviceGroup obj)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            obj.EX(obj =>
 | 
	
		
			
				|  |  | +            obj.EX(stationDeviceGroup =>
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
 | 
	
		
			
				|  |  | -                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
 | 
	
		
			
				|  |  | +                if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
 | 
	
		
			
				|  |  | +                if (stationDeviceGroup.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  DB.Do(db =>
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    var devs = new List<FinishTaskList<string>>();
 | 
	
		
			
				|  |  | -                    foreach (var dev in obj.Items)
 | 
	
		
			
				|  |  | +                    var devise = new List<FinishTaskList<string>>();
 | 
	
		
			
				|  |  | +                    foreach (var dev in stationDeviceGroup.Items)
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          //没有请求
 | 
	
		
			
				|  |  |                          if (dev.Data2.Request != IstationRequest.请求分配目标地址)
 | 
	
		
			
				|  |  |                          {
 | 
	
		
			
				|  |  | -                            InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-分配目标地址--2");
 | 
	
		
			
				|  |  | +                            InfoLog.INFO_INFO($"{stationDeviceGroup.Entity.CODE}无请求-分配目标地址--2");
 | 
	
		
			
				|  |  |                              continue;
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  |                          //没有光电
 | 
	
		
			
				|  |  |                          if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
 | 
	
		
			
				|  |  |                          {
 | 
	
		
			
				|  |  | -                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
 | 
	
		
			
				|  |  | +                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
 | 
	
		
			
				|  |  |                              continue;
 | 
	
		
			
				|  |  |                          };
 | 
	
		
			
				|  |  |                          if (dev.Data2.Tasknum < 10000)
 | 
	
		
			
				|  |  |                          {
 | 
	
		
			
				|  |  | -                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求有光电无任务", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
 | 
	
		
			
				|  |  | +                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求有光电无任务", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
 | 
	
		
			
				|  |  |                              continue;
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  | -                        devs.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
 | 
	
		
			
				|  |  | +                        devise.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                    foreach (var dev in devs)
 | 
	
		
			
				|  |  | +                    foreach (var dev in devise)
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Station.Data2.Tasknum) ?? throw new WarnException("无任务");
 | 
	
		
			
				|  |  |                          var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TaskGroupKey == task.TaskGroupKey);
 | 
	
		
			
				|  |  | -                        if (devs.Count != tasks.Count()) throw new WarnException($"可执行任务数{devs.Count},实际任务数{tasks.Count()}");
 | 
	
		
			
				|  |  | +                        if (devise.Count != tasks.Count()) throw new WarnException($"可执行任务数{devise.Count},实际任务数{tasks.Count()}");
 | 
	
		
			
				|  |  |                          dev.Station.Data.Tasknum = task.ID;
 | 
	
		
			
				|  |  |                          dev.Station.Data.Goodsstart = dev.Station.Entity.CODE.ToShort();
 | 
	
		
			
				|  |  |                          dev.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
 | 
	
		
			
				|  |  | -                        dev.Station.Data.Goodsnum = devs.Count.ToShort();
 | 
	
		
			
				|  |  | +                        dev.Station.Data.Goodsnum = devise.Count.ToShort();
 | 
	
		
			
				|  |  |                          dev.Station.Data.CmdType = IstationCmdType.分配目标地址;
 | 
	
		
			
				|  |  |                          dev.Station.Data.VoucherNo++;
 | 
	
		
			
				|  |  |                      }
 | 
	
	
		
			
				|  | @@ -220,4 +217,4 @@ namespace WCS.Service.Works.Station
 | 
	
		
			
				|  |  |              return dev.CODE == "G1589";
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +}
 |