|
@@ -10,455 +10,455 @@ using WCS.Service.Extensions;
|
|
|
|
|
|
namespace WCS.Service.WebApi
|
|
|
{
|
|
|
- [ApiController]
|
|
|
- [Route("[controller]/[action]")]
|
|
|
- public class WCSApi : ControllerBase
|
|
|
- {
|
|
|
- [HttpPost]
|
|
|
- public WcsContractApiResponse I_WMS_CreateTasks(List<PushCreateWcsTaskRequest> list)
|
|
|
- {
|
|
|
- var res = new WcsContractApiResponse();
|
|
|
- try
|
|
|
- {
|
|
|
- DB.Do(db =>
|
|
|
- {
|
|
|
- foreach (var obj in list)
|
|
|
- {
|
|
|
- if (obj.TaskType == "1") //入库任务
|
|
|
- {
|
|
|
- var wmstaskid = int.Parse(obj.WMSTaskNo);
|
|
|
- if (db.Default.Set<WCS_TASK>().Any(v => v.WMSTASK == wmstaskid))
|
|
|
- throw new Exception("任务号" + wmstaskid + "重复下发");
|
|
|
-
|
|
|
- if (obj.StartLocation.Contains("_Back_"))
|
|
|
- {
|
|
|
- //生成AGV入库任务
|
|
|
- var ws = int.Parse(obj.StartLocation.Split('_')[1]);
|
|
|
- var agvtask = new WCS_AGVTask
|
|
|
- {
|
|
|
- AGVStatus = AGVTaskStatus.新建,
|
|
|
- Status = AGVTaskStatus.新建,
|
|
|
- Position = obj.StartLocation,
|
|
|
- TaskType = AGVTaskType.入库,
|
|
|
- CreateTime = DateTime.Now,
|
|
|
- UpdateTime = DateTime.Now,
|
|
|
- Workshop = ws,
|
|
|
- };
|
|
|
- if (ws == 13 || ws == 14)
|
|
|
- {
|
|
|
- agvtask.Station = "2088";
|
|
|
- agvtask.Workshop = 1314;
|
|
|
- }
|
|
|
- else if (ws == 1)
|
|
|
- {
|
|
|
- agvtask.Station = "2122";
|
|
|
- }
|
|
|
- else if (ws == 2)
|
|
|
- agvtask.Station = "2131";
|
|
|
- else if (ws == 3)
|
|
|
- agvtask.Station = "2143";
|
|
|
-
|
|
|
- db.Default.Set<WCS_AGVTask>().Add(agvtask);
|
|
|
- db.Default.SaveChanges();
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- var task = new WCS_TASK
|
|
|
- {
|
|
|
- TYPE = TaskType.入库,
|
|
|
- STATUS = WCS.Entity.TaskStatus.新建,
|
|
|
- BARCODE = obj.PalletCode,
|
|
|
- ADDRFROM = obj.StartLocation,
|
|
|
- ADDRTO = obj.EndLocation,
|
|
|
- UPDATETIME = DateTime.Now,
|
|
|
- UPDATEUSER = "WMS",
|
|
|
- WMSTASK = int.Parse(obj.WMSTaskNo)
|
|
|
- };
|
|
|
- db.Default.Add(task);
|
|
|
- }
|
|
|
- }
|
|
|
- else if (obj.TaskType == "2")//出库任务
|
|
|
- {
|
|
|
- var wmsTaskId = int.Parse(obj.WMSTaskNo);
|
|
|
- if (db.Default.Set<WCS_TASK>().Any(v => v.WMSTASK == wmsTaskId))
|
|
|
- throw new Exception("任务号" + wmsTaskId + "重复下发");
|
|
|
-
|
|
|
- var tunnel = "TY" + obj.SRMNo.Last();
|
|
|
-
|
|
|
- var task = new WCS_TASK
|
|
|
- {
|
|
|
- TYPE = TaskType.出库,
|
|
|
- STATUS = TaskStatus.新建,
|
|
|
- DEVICE = "SRM" + obj.SRMNo.Last(),
|
|
|
- BARCODE = obj.PalletCode,
|
|
|
- ADDRFROM = $"{obj.StartRow}-{obj.StartCol}-{obj.StartLayer}",
|
|
|
- ADDRTO = obj.EndLocation,
|
|
|
- UPDATETIME = DateTime.Now,
|
|
|
- UPDATEUSER = "WMS",
|
|
|
- TUNNEL = tunnel,
|
|
|
- WMSTASK = int.Parse(obj.WMSTaskNo),
|
|
|
- ADDRNEXT = obj.EndLocation,
|
|
|
- Length = obj.Length,
|
|
|
- MaterialCode = obj.MaterialCode,
|
|
|
- FLOOR = obj.EndLocation == "G1340" ? 1 : 2
|
|
|
- };
|
|
|
-
|
|
|
- task.TaskGetSrmStation();
|
|
|
- db.Default.Add(task);
|
|
|
- }
|
|
|
- else if (obj.TaskType == "3") //移库任务
|
|
|
- {
|
|
|
- var wmstaskid = int.Parse(obj.WMSTaskNo);
|
|
|
- if (db.Default.Set<WCS_TASK>().Any(v => v.WMSTASK == wmstaskid))
|
|
|
- throw new Exception("任务号" + wmstaskid + "重复下发");
|
|
|
-
|
|
|
- var scid = int.Parse(obj.SRMNo.Last().ToString());
|
|
|
- var tunnel = "TY" + obj.StartTunnel;
|
|
|
- var task = new WCS_TASK
|
|
|
- {
|
|
|
- TYPE = TaskType.移库,
|
|
|
- STATUS = WCS.Entity.TaskStatus.新建,
|
|
|
- DEVICE = "SRM" + obj.SRMNo.Last(),
|
|
|
- BARCODE = obj.PalletCode,
|
|
|
- ADDRFROM = $"{obj.StartRow}-{obj.StartCol}-{obj.StartLayer}",
|
|
|
- ADDRTO = $"{obj.EndRow}-{obj.EndCol}-{obj.EndLayer}",
|
|
|
- UPDATETIME = DateTime.Now,
|
|
|
- UPDATEUSER = "WMS",
|
|
|
- TUNNEL = tunnel,
|
|
|
- WMSTASK = int.Parse(obj.WMSTaskNo),
|
|
|
- TaskGroupKey = obj.TaskGroupKey
|
|
|
- };
|
|
|
- db.Default.Add(task);
|
|
|
- }
|
|
|
- else if (obj.TaskType == "6") //倒库任务
|
|
|
- {
|
|
|
- var wmsTaskId = int.Parse(obj.WMSTaskNo);
|
|
|
- if (db.Default.Set<WCS_TASK>().Any(v => v.WMSTASK == wmsTaskId))
|
|
|
- throw new Exception("任务号" + wmsTaskId + "重复下发");
|
|
|
-
|
|
|
- var srmNo = obj.SRMNo.Last();
|
|
|
- var endSrmNo = obj.EndSRMNo.Last();
|
|
|
-
|
|
|
- var task = new WCS_TASK
|
|
|
- {
|
|
|
- TYPE = TaskType.倒库,
|
|
|
- STATUS = TaskStatus.新建,
|
|
|
- BARCODE = obj.PalletCode,
|
|
|
- ADDRFROM = $"{obj.StartRow}-{obj.StartCol}-{obj.StartLayer}",
|
|
|
- ADDRTO = $"{obj.EndRow}-{obj.EndCol}-{obj.EndLayer}",
|
|
|
- UPDATETIME = DateTime.Now,
|
|
|
- UPDATEUSER = "WMS",
|
|
|
- TUNNEL = $"TY{srmNo}",
|
|
|
- DEVICE = $"SRM{srmNo}",
|
|
|
- TUNNELDL = $"TY{endSrmNo}",
|
|
|
- DEVICEDL = $"SRM{endSrmNo}",
|
|
|
- WMSTASK = int.Parse(obj.WMSTaskNo),
|
|
|
- ADDRNEXT = obj.EndLocation,
|
|
|
- Length = obj.Length,
|
|
|
- MaterialCode = obj.MaterialCode,
|
|
|
- FLOOR = obj.EndLocation == "G1340" ? 1 : 2,
|
|
|
- TaskGroupKey = obj.TaskGroupKey
|
|
|
- };
|
|
|
-
|
|
|
- task.TaskGetSrmStation();
|
|
|
- db.Default.Add(task);
|
|
|
- }
|
|
|
- }
|
|
|
- db.Default.SaveChanges();
|
|
|
- });
|
|
|
- res.ResType = true;
|
|
|
- }
|
|
|
- catch (Exception ex)
|
|
|
- {
|
|
|
- res.ResMessage = ex.GetBaseException().Message;
|
|
|
- }
|
|
|
- return res;
|
|
|
- }
|
|
|
-
|
|
|
- [HttpPost]
|
|
|
- public WcsContractApiResponse I_WMS_CreateAGVTask(PushCreateAGVTaskRequest obj)
|
|
|
- {
|
|
|
- var res = new WcsContractApiResponse();
|
|
|
- try
|
|
|
- {
|
|
|
- DB.Do(db =>
|
|
|
- {
|
|
|
- if (obj.Type == 1)
|
|
|
- {
|
|
|
- var ws = int.Parse(obj.StartPos.Split('_')[1]);
|
|
|
- var agvtask = new WCS_AGVTask
|
|
|
- {
|
|
|
- AGVStatus = AGVTaskStatus.新建,
|
|
|
- Status = AGVTaskStatus.新建,
|
|
|
- Position = obj.StartPos,
|
|
|
- TaskType = AGVTaskType.入库,
|
|
|
- CreateTime = DateTime.Now,
|
|
|
- UpdateTime = DateTime.Now,
|
|
|
- Workshop = ws,
|
|
|
- };
|
|
|
- if (ws == 13 || ws == 14)
|
|
|
- {
|
|
|
- agvtask.Station = "2088";
|
|
|
- agvtask.Workshop = 1314;
|
|
|
- }
|
|
|
- else if (ws == 1)
|
|
|
- {
|
|
|
- agvtask.Station = "2122";
|
|
|
- }
|
|
|
- else if (ws == 2)
|
|
|
- agvtask.Station = "2131";
|
|
|
- else if (ws == 3)
|
|
|
- agvtask.Station = "2143";
|
|
|
-
|
|
|
- db.Default.Set<WCS_AGVTask>().Add(agvtask);
|
|
|
- db.Default.SaveChanges();
|
|
|
- }
|
|
|
- else
|
|
|
- throw new Exception($"类型{obj.Type}不支持");
|
|
|
- });
|
|
|
-
|
|
|
- res.ResType = true;
|
|
|
- }
|
|
|
- catch (Exception ex)
|
|
|
- {
|
|
|
- res.ResMessage = ex.GetBaseException().Message;
|
|
|
- }
|
|
|
- return res;
|
|
|
- }
|
|
|
-
|
|
|
- [HttpPost]
|
|
|
- public WcsContractApiResponse I_CancelWCSTaskByCode(string code)
|
|
|
- {
|
|
|
- var res = new WcsContractApiResponse();
|
|
|
- try
|
|
|
- {
|
|
|
- DB.Do(db =>
|
|
|
- {
|
|
|
- var task = db.Default.Set<WCS_TASK>().Where(v => v.BARCODE == code && v.STATUS < WCS.Entity.TaskStatus.已完成 && v.TYPE == TaskType.组盘).FirstOrDefault();
|
|
|
- if (task == null)
|
|
|
- throw new Exception("WCS任务不存在");
|
|
|
- task.STATUS = WCS.Entity.TaskStatus.已取消;
|
|
|
- task.UPDATETIME = DateTime.Now;
|
|
|
- task.UPDATEUSER = "RF";
|
|
|
- db.Default.SaveChanges();
|
|
|
- });
|
|
|
- res.ResType = true;
|
|
|
- }
|
|
|
- catch (Exception ex)
|
|
|
- {
|
|
|
- res.ResMessage = ex.GetBaseException().Message;
|
|
|
- }
|
|
|
- return res;
|
|
|
- }
|
|
|
-
|
|
|
- [HttpPost]
|
|
|
- public WcsContractApiResponse I_CancelWCSTaskByID(int wmstaskId)
|
|
|
- {
|
|
|
- var res = new WcsContractApiResponse();
|
|
|
- try
|
|
|
- {
|
|
|
- DB.Do(db =>
|
|
|
- {
|
|
|
- var task = db.Default.Set<WCS_TASK>().Where(v => v.WMSTASK == wmstaskId).FirstOrDefault();
|
|
|
- if (task == null)
|
|
|
- throw new Exception("WCS任务不存在");
|
|
|
- if (task.STATUS != WCS.Entity.TaskStatus.新建)
|
|
|
- throw new Exception("WCS任务当前状态不允许取消");
|
|
|
- task.STATUS = WCS.Entity.TaskStatus.已取消;
|
|
|
- task.UPDATETIME = DateTime.Now;
|
|
|
- task.UPDATEUSER = "WMS";
|
|
|
- db.Default.SaveChanges();
|
|
|
- if (task.TYPE == TaskType.出库 && task.AgvTask > 0)
|
|
|
- {
|
|
|
- var agvtask = db.Default.Set<WCS_AGVTask>().Find(task.AgvTask);
|
|
|
- agvtask.Status = AGVTaskStatus.取消;
|
|
|
- agvtask.UpdateTime = DateTime.Now;
|
|
|
- db.Default.SaveChanges();
|
|
|
- }
|
|
|
- });
|
|
|
- res.ResType = true;
|
|
|
- }
|
|
|
- catch (Exception ex)
|
|
|
- {
|
|
|
- res.ResMessage = ex.GetBaseException().Message;
|
|
|
- }
|
|
|
- return res;
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// 通过该接口获取指定条件设备信息
|
|
|
- /// </summary>
|
|
|
- /// <param name="model">筛选条件</param>
|
|
|
- /// <returns></returns>
|
|
|
- //[HttpGet]
|
|
|
- //public List<DeviceStatusViewModel> GetDeviceStatus([FromQuery] DeviceStatusViewModel model)
|
|
|
- //{
|
|
|
- // var result = new List<DeviceStatusViewModel>();
|
|
|
- // //找到所有设备的读取协议
|
|
|
- // var rgv = Device.Where(v => v.IsRGV()).Select(v => v.Device<IRGV521>());
|
|
|
- // var sc = Device.Where(v => v.IsSC()).Select(v => v.Device<ISRM521>());
|
|
|
- // var conv = Device.Where(v => v.IsConv()).Select(v => v.Device<IStation521>());
|
|
|
-
|
|
|
- // #region 检索分两部分,设备、任务(数据库)
|
|
|
-
|
|
|
- // #region 设备信息
|
|
|
-
|
|
|
- // if (!string.IsNullOrEmpty(model.CODE))
|
|
|
- // {
|
|
|
- // result.AddRange(GetDeviceStatusWhere(rgv, v => v.Entity.CODE == model.CODE));
|
|
|
- // result.AddRange(GetDeviceStatusWhere(sc, v => v.Entity.CODE == model.CODE));
|
|
|
- // result.AddRange(GetDeviceStatusWhere(conv, v => v.Entity.CODE == model.CODE));
|
|
|
- // }
|
|
|
-
|
|
|
- // if (model.TASKNUM > 10000)
|
|
|
- // {
|
|
|
- // result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.TaskID_1 == model.TASKNUM));
|
|
|
- // result.AddRange(GetDeviceStatusWhere(sc, v => v.Data.TaskID_1 == model.TASKNUM));
|
|
|
- // result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.Tasknum == model.TASKNUM));
|
|
|
- // }
|
|
|
-
|
|
|
- // if (model.PH_STATUS != null)
|
|
|
- // {
|
|
|
- // result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.TaskID_1 == model.TASKNUM));
|
|
|
- // }
|
|
|
-
|
|
|
- // if (!string.IsNullOrEmpty(model.ADDRFROM))
|
|
|
- // {
|
|
|
- // result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.StartPosition_1 == short.Parse(model.ADDRFROM)));
|
|
|
- // result.AddRange(GetDeviceStatusWhere(sc, v => model.ADDRFROM.Contains(v.Data.SLine_1.ToString())
|
|
|
- // || model.ADDRFROM.Contains(v.Data.SCol_1.ToString())
|
|
|
- // || model.ADDRFROM.Contains(v.Data.SLayer_1.ToString())));
|
|
|
- // result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.Goodsstart ==short.Parse(model.ADDRFROM)));
|
|
|
- // }
|
|
|
-
|
|
|
- // if (!string.IsNullOrEmpty(model.ADDRTO))
|
|
|
- // {
|
|
|
- // result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.DestPosition_1 == short.Parse(model.ADDRTO)));
|
|
|
- // result.AddRange(GetDeviceStatusWhere(sc, v => model.ADDRTO.Contains(v.Data.ELine_1.ToString())
|
|
|
- // || model.ADDRTO.Contains(v.Data.ECol_1.ToString())
|
|
|
- // || model.ADDRTO.Contains(v.Data.ELayer_1.ToString())));
|
|
|
- // result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.Goodsend == short.Parse(model.ADDRTO)));
|
|
|
- // }
|
|
|
-
|
|
|
- // #endregion 设备信息
|
|
|
-
|
|
|
- // #region 任务信息
|
|
|
-
|
|
|
- // //获取所有设备上的任务信息
|
|
|
- // if (model.TYPE != null || !string.IsNullOrEmpty(model.BARCODE))
|
|
|
- // {
|
|
|
- // var info = new List<DeviceStatusViewModel>();
|
|
|
- // var ids = result.Select(v => v.TASKNUM);
|
|
|
- // info.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.TaskID_1 > 10000));
|
|
|
- // info.AddRange(GetDeviceStatusWhere(sc, v => v.Data.TaskID_1 > 10000));
|
|
|
- // info.AddRange(GetDeviceStatusWhere(conv, v => v.Data.Tasknum > 10000));
|
|
|
- // result.AddRange(info.Where(v => !ids.Any(b => b == v.TASKNUM)));
|
|
|
- // }
|
|
|
-
|
|
|
- // DB.Do(db =>
|
|
|
- // {
|
|
|
- // var ids = result.Select(v => v.TASKNUM);
|
|
|
- // var tasks = db.Default.Set<WCS_TASK>().AsNoTracking().Where(v => ids.Any(b => b == v.ID)).ToList();
|
|
|
- // tasks.ForEach(task =>
|
|
|
- // {
|
|
|
- // var info = result.Find(v => v.TASKNUM == task.ID);
|
|
|
- // info.TYPE = task.TYPE;
|
|
|
- // info.BARCODE = task.BARCODE;
|
|
|
- // });
|
|
|
- // });
|
|
|
-
|
|
|
- // if (model.TYPE != null)
|
|
|
- // {
|
|
|
- // result = result.Where(v => v.TYPE == model.TYPE).ToList();
|
|
|
- // }
|
|
|
- // if (!string.IsNullOrEmpty(model.BARCODE))
|
|
|
- // {
|
|
|
- // result = result.Where(v => v.BARCODE != null && v.BARCODE.Contains(model.BARCODE)).ToList();
|
|
|
- // }
|
|
|
-
|
|
|
- // #endregion 任务信息
|
|
|
-
|
|
|
- // #endregion 检索分两部分,设备、任务(数据库)
|
|
|
-
|
|
|
- // return result;
|
|
|
- //}
|
|
|
-
|
|
|
- #region 静态方法
|
|
|
-
|
|
|
- ///// <summary>
|
|
|
- ///// 获取RGV设备信息
|
|
|
- ///// </summary>
|
|
|
- ///// <param name="soue"></param>
|
|
|
- ///// <param name="func"></param>
|
|
|
- ///// <returns></returns>
|
|
|
- //public static List<DeviceStatusViewModel> GetDeviceStatusWhere(IEnumerable<Device<IRGV521>> soue, Func<Device<IRGV521>, bool> func)
|
|
|
- //{
|
|
|
- // var result = new List<DeviceStatusViewModel>();
|
|
|
- // result.AddRange(soue.Where(func).Select(device =>
|
|
|
- // {
|
|
|
- // return new DeviceStatusViewModel
|
|
|
- // {
|
|
|
- // CODE = device.Entity.CODE,
|
|
|
- // TASKNUM = device.Data.TaskID_1 ,
|
|
|
- // PH_STATUS = device.Data.SystemStatus.HasFlag(RGVStatus.光电),
|
|
|
- // ADDRFROM = device.Data.StartPosition_1.ToString(),
|
|
|
- // ADDRTO = device.Data.DestPosition_1.ToString(),
|
|
|
- // };
|
|
|
- // }));
|
|
|
- // return result;
|
|
|
- //}
|
|
|
-
|
|
|
- ///// <summary>
|
|
|
- ///// 获取堆垛机设备信息
|
|
|
- ///// </summary>
|
|
|
- ///// <param name="soue"></param>
|
|
|
- ///// <param name="func"></param>
|
|
|
- ///// <returns></returns>
|
|
|
- //public static List<DeviceStatusViewModel> GetDeviceStatusWhere(IEnumerable<Device<ISRM521>> soue, Func<Device<ISRM521>, bool> func)
|
|
|
- //{
|
|
|
- // var result = new List<DeviceStatusViewModel>();
|
|
|
-
|
|
|
- // result.AddRange(soue.Where(func).Select(device =>
|
|
|
- // {
|
|
|
- // var info = new DeviceStatusViewModel
|
|
|
- // {
|
|
|
- // CODE = device.Entity.CODE,
|
|
|
- // TASKNUM = device.Data.TaskID_1,
|
|
|
- // ADDRFROM = $"{device.Data.SLine_1}-{device.Data.SCol_1}-{device.Data.SLayer_1}",
|
|
|
- // ADDRTO = device.Data.ELine_1.ToString(),
|
|
|
- // };
|
|
|
- // if (device.Data.ECol_1 != 0 && device.Data.ELayer_1 != 0)
|
|
|
- // info.ADDRTO = $"{device.Data.ELine_1}-{device.Data.ECol_1}-{device.Data.ELayer_1}";
|
|
|
- // return info;
|
|
|
- // }));
|
|
|
-
|
|
|
- // return result;
|
|
|
- //}
|
|
|
-
|
|
|
- ///// <summary>
|
|
|
- ///// 获取输送机设备信息
|
|
|
- ///// </summary>
|
|
|
- ///// <param name="soue"></param>
|
|
|
- ///// <param name="func"></param>
|
|
|
- ///// <returns></returns>
|
|
|
- //public static List<DeviceStatusViewModel> GetDeviceStatusWhere(IEnumerable<Device<IStation521>> soue, Func<Device<IStation521>, bool> func)
|
|
|
- //{
|
|
|
- // var result = new List<DeviceStatusViewModel>();
|
|
|
-
|
|
|
- // result.AddRange(soue.Where(func).Select(device =>
|
|
|
- // {
|
|
|
- // return new DeviceStatusViewModel
|
|
|
- // {
|
|
|
- // CODE = device.Entity.CODE,
|
|
|
- // TASKNUM = device.Data.Tasknum,
|
|
|
- // ADDRFROM =device.Data.Goodsstart.ToString(),
|
|
|
- // ADDRTO = device.Data.Goodsend.ToString(),
|
|
|
- // };
|
|
|
- // }));
|
|
|
-
|
|
|
- // return result;
|
|
|
- //}
|
|
|
-
|
|
|
- #endregion 静态方法
|
|
|
- }
|
|
|
+ //[ApiController]
|
|
|
+ //[Route("[controller]/[action]")]
|
|
|
+ //public class WCSApi : ControllerBase
|
|
|
+ //{
|
|
|
+ // [HttpPost]
|
|
|
+ // public WcsContractApiResponse I_WMS_CreateTasks(List<PushCreateWcsTaskRequest> list)
|
|
|
+ // {
|
|
|
+ // var res = new WcsContractApiResponse();
|
|
|
+ // try
|
|
|
+ // {
|
|
|
+ // DB.Do(db =>
|
|
|
+ // {
|
|
|
+ // foreach (var obj in list)
|
|
|
+ // {
|
|
|
+ // if (obj.TaskType == "1") //入库任务
|
|
|
+ // {
|
|
|
+ // var wmstaskid = int.Parse(obj.WMSTaskNo);
|
|
|
+ // if (db.Default.Set<WCS_TASK>().Any(v => v.WMSTASK == wmstaskid))
|
|
|
+ // throw new Exception("任务号" + wmstaskid + "重复下发");
|
|
|
+
|
|
|
+ // if (obj.StartLocation.Contains("_Back_"))
|
|
|
+ // {
|
|
|
+ // //生成AGV入库任务
|
|
|
+ // var ws = int.Parse(obj.StartLocation.Split('_')[1]);
|
|
|
+ // var agvtask = new WCS_AGVTask
|
|
|
+ // {
|
|
|
+ // AGVStatus = AGVTaskStatus.新建,
|
|
|
+ // Status = AGVTaskStatus.新建,
|
|
|
+ // Position = obj.StartLocation,
|
|
|
+ // TaskType = AGVTaskType.入库,
|
|
|
+ // CreateTime = DateTime.Now,
|
|
|
+ // UpdateTime = DateTime.Now,
|
|
|
+ // Workshop = ws,
|
|
|
+ // };
|
|
|
+ // if (ws == 13 || ws == 14)
|
|
|
+ // {
|
|
|
+ // agvtask.Station = "2088";
|
|
|
+ // agvtask.Workshop = 1314;
|
|
|
+ // }
|
|
|
+ // else if (ws == 1)
|
|
|
+ // {
|
|
|
+ // agvtask.Station = "2122";
|
|
|
+ // }
|
|
|
+ // else if (ws == 2)
|
|
|
+ // agvtask.Station = "2131";
|
|
|
+ // else if (ws == 3)
|
|
|
+ // agvtask.Station = "2143";
|
|
|
+
|
|
|
+ // db.Default.Set<WCS_AGVTask>().Add(agvtask);
|
|
|
+ // db.Default.SaveChanges();
|
|
|
+ // }
|
|
|
+ // else
|
|
|
+ // {
|
|
|
+ // var task = new WCS_TASK
|
|
|
+ // {
|
|
|
+ // TYPE = TaskType.入库,
|
|
|
+ // STATUS = WCS.Entity.TaskStatus.新建,
|
|
|
+ // BARCODE = obj.PalletCode,
|
|
|
+ // ADDRFROM = obj.StartLocation,
|
|
|
+ // ADDRTO = obj.EndLocation,
|
|
|
+ // UPDATETIME = DateTime.Now,
|
|
|
+ // UPDATEUSER = "WMS",
|
|
|
+ // WMSTASK = int.Parse(obj.WMSTaskNo)
|
|
|
+ // };
|
|
|
+ // db.Default.Add(task);
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // else if (obj.TaskType == "2")//出库任务
|
|
|
+ // {
|
|
|
+ // var wmsTaskId = int.Parse(obj.WMSTaskNo);
|
|
|
+ // if (db.Default.Set<WCS_TASK>().Any(v => v.WMSTASK == wmsTaskId))
|
|
|
+ // throw new Exception("任务号" + wmsTaskId + "重复下发");
|
|
|
+
|
|
|
+ // var tunnel = "TY" + obj.SRMNo.Last();
|
|
|
+
|
|
|
+ // var task = new WCS_TASK
|
|
|
+ // {
|
|
|
+ // TYPE = TaskType.出库,
|
|
|
+ // STATUS = TaskStatus.新建,
|
|
|
+ // DEVICE = "SRM" + obj.SRMNo.Last(),
|
|
|
+ // BARCODE = obj.PalletCode,
|
|
|
+ // ADDRFROM = $"{obj.StartRow}-{obj.StartCol}-{obj.StartLayer}",
|
|
|
+ // ADDRTO = obj.EndLocation,
|
|
|
+ // UPDATETIME = DateTime.Now,
|
|
|
+ // UPDATEUSER = "WMS",
|
|
|
+ // TUNNEL = tunnel,
|
|
|
+ // WMSTASK = int.Parse(obj.WMSTaskNo),
|
|
|
+ // ADDRNEXT = obj.EndLocation,
|
|
|
+ // Length = obj.Length,
|
|
|
+ // MaterialCode = obj.MaterialCode,
|
|
|
+ // FLOOR = obj.EndLocation == "G1340" ? 1 : 2
|
|
|
+ // };
|
|
|
+
|
|
|
+ // task.TaskGetSrmStation();
|
|
|
+ // db.Default.Add(task);
|
|
|
+ // }
|
|
|
+ // else if (obj.TaskType == "3") //移库任务
|
|
|
+ // {
|
|
|
+ // var wmstaskid = int.Parse(obj.WMSTaskNo);
|
|
|
+ // if (db.Default.Set<WCS_TASK>().Any(v => v.WMSTASK == wmstaskid))
|
|
|
+ // throw new Exception("任务号" + wmstaskid + "重复下发");
|
|
|
+
|
|
|
+ // var scid = int.Parse(obj.SRMNo.Last().ToString());
|
|
|
+ // var tunnel = "TY" + obj.StartTunnel;
|
|
|
+ // var task = new WCS_TASK
|
|
|
+ // {
|
|
|
+ // TYPE = TaskType.移库,
|
|
|
+ // STATUS = WCS.Entity.TaskStatus.新建,
|
|
|
+ // DEVICE = "SRM" + obj.SRMNo.Last(),
|
|
|
+ // BARCODE = obj.PalletCode,
|
|
|
+ // ADDRFROM = $"{obj.StartRow}-{obj.StartCol}-{obj.StartLayer}",
|
|
|
+ // ADDRTO = $"{obj.EndRow}-{obj.EndCol}-{obj.EndLayer}",
|
|
|
+ // UPDATETIME = DateTime.Now,
|
|
|
+ // UPDATEUSER = "WMS",
|
|
|
+ // TUNNEL = tunnel,
|
|
|
+ // WMSTASK = int.Parse(obj.WMSTaskNo),
|
|
|
+ // TaskGroupKey = obj.TaskGroupKey
|
|
|
+ // };
|
|
|
+ // db.Default.Add(task);
|
|
|
+ // }
|
|
|
+ // else if (obj.TaskType == "6") //倒库任务
|
|
|
+ // {
|
|
|
+ // var wmsTaskId = int.Parse(obj.WMSTaskNo);
|
|
|
+ // if (db.Default.Set<WCS_TASK>().Any(v => v.WMSTASK == wmsTaskId))
|
|
|
+ // throw new Exception("任务号" + wmsTaskId + "重复下发");
|
|
|
+
|
|
|
+ // var srmNo = obj.SRMNo.Last();
|
|
|
+ // var endSrmNo = obj.EndSRMNo.Last();
|
|
|
+
|
|
|
+ // var task = new WCS_TASK
|
|
|
+ // {
|
|
|
+ // TYPE = TaskType.倒库,
|
|
|
+ // STATUS = TaskStatus.新建,
|
|
|
+ // BARCODE = obj.PalletCode,
|
|
|
+ // ADDRFROM = $"{obj.StartRow}-{obj.StartCol}-{obj.StartLayer}",
|
|
|
+ // ADDRTO = $"{obj.EndRow}-{obj.EndCol}-{obj.EndLayer}",
|
|
|
+ // UPDATETIME = DateTime.Now,
|
|
|
+ // UPDATEUSER = "WMS",
|
|
|
+ // TUNNEL = $"TY{srmNo}",
|
|
|
+ // DEVICE = $"SRM{srmNo}",
|
|
|
+ // TUNNELDL = $"TY{endSrmNo}",
|
|
|
+ // DEVICEDL = $"SRM{endSrmNo}",
|
|
|
+ // WMSTASK = int.Parse(obj.WMSTaskNo),
|
|
|
+ // ADDRNEXT = obj.EndLocation,
|
|
|
+ // Length = obj.Length,
|
|
|
+ // MaterialCode = obj.MaterialCode,
|
|
|
+ // FLOOR = obj.EndLocation == "G1340" ? 1 : 2,
|
|
|
+ // TaskGroupKey = obj.TaskGroupKey
|
|
|
+ // };
|
|
|
+
|
|
|
+ // task.TaskGetSrmStation();
|
|
|
+ // db.Default.Add(task);
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // db.Default.SaveChanges();
|
|
|
+ // });
|
|
|
+ // res.ResType = true;
|
|
|
+ // }
|
|
|
+ // catch (Exception ex)
|
|
|
+ // {
|
|
|
+ // res.ResMessage = ex.GetBaseException().Message;
|
|
|
+ // }
|
|
|
+ // return res;
|
|
|
+ // }
|
|
|
+
|
|
|
+ // [HttpPost]
|
|
|
+ // public WcsContractApiResponse I_WMS_CreateAGVTask(PushCreateAGVTaskRequest obj)
|
|
|
+ // {
|
|
|
+ // var res = new WcsContractApiResponse();
|
|
|
+ // try
|
|
|
+ // {
|
|
|
+ // DB.Do(db =>
|
|
|
+ // {
|
|
|
+ // if (obj.Type == 1)
|
|
|
+ // {
|
|
|
+ // var ws = int.Parse(obj.StartPos.Split('_')[1]);
|
|
|
+ // var agvtask = new WCS_AGVTask
|
|
|
+ // {
|
|
|
+ // AGVStatus = AGVTaskStatus.新建,
|
|
|
+ // Status = AGVTaskStatus.新建,
|
|
|
+ // Position = obj.StartPos,
|
|
|
+ // TaskType = AGVTaskType.入库,
|
|
|
+ // CreateTime = DateTime.Now,
|
|
|
+ // UpdateTime = DateTime.Now,
|
|
|
+ // Workshop = ws,
|
|
|
+ // };
|
|
|
+ // if (ws == 13 || ws == 14)
|
|
|
+ // {
|
|
|
+ // agvtask.Station = "2088";
|
|
|
+ // agvtask.Workshop = 1314;
|
|
|
+ // }
|
|
|
+ // else if (ws == 1)
|
|
|
+ // {
|
|
|
+ // agvtask.Station = "2122";
|
|
|
+ // }
|
|
|
+ // else if (ws == 2)
|
|
|
+ // agvtask.Station = "2131";
|
|
|
+ // else if (ws == 3)
|
|
|
+ // agvtask.Station = "2143";
|
|
|
+
|
|
|
+ // db.Default.Set<WCS_AGVTask>().Add(agvtask);
|
|
|
+ // db.Default.SaveChanges();
|
|
|
+ // }
|
|
|
+ // else
|
|
|
+ // throw new Exception($"类型{obj.Type}不支持");
|
|
|
+ // });
|
|
|
+
|
|
|
+ // res.ResType = true;
|
|
|
+ // }
|
|
|
+ // catch (Exception ex)
|
|
|
+ // {
|
|
|
+ // res.ResMessage = ex.GetBaseException().Message;
|
|
|
+ // }
|
|
|
+ // return res;
|
|
|
+ // }
|
|
|
+
|
|
|
+ // [HttpPost]
|
|
|
+ // public WcsContractApiResponse I_CancelWCSTaskByCode(string code)
|
|
|
+ // {
|
|
|
+ // var res = new WcsContractApiResponse();
|
|
|
+ // try
|
|
|
+ // {
|
|
|
+ // DB.Do(db =>
|
|
|
+ // {
|
|
|
+ // var task = db.Default.Set<WCS_TASK>().Where(v => v.BARCODE == code && v.STATUS < WCS.Entity.TaskStatus.已完成 && v.TYPE == TaskType.组盘).FirstOrDefault();
|
|
|
+ // if (task == null)
|
|
|
+ // throw new Exception("WCS任务不存在");
|
|
|
+ // task.STATUS = WCS.Entity.TaskStatus.已取消;
|
|
|
+ // task.UPDATETIME = DateTime.Now;
|
|
|
+ // task.UPDATEUSER = "RF";
|
|
|
+ // db.Default.SaveChanges();
|
|
|
+ // });
|
|
|
+ // res.ResType = true;
|
|
|
+ // }
|
|
|
+ // catch (Exception ex)
|
|
|
+ // {
|
|
|
+ // res.ResMessage = ex.GetBaseException().Message;
|
|
|
+ // }
|
|
|
+ // return res;
|
|
|
+ // }
|
|
|
+
|
|
|
+ // [HttpPost]
|
|
|
+ // public WcsContractApiResponse I_CancelWCSTaskByID(int wmstaskId)
|
|
|
+ // {
|
|
|
+ // var res = new WcsContractApiResponse();
|
|
|
+ // try
|
|
|
+ // {
|
|
|
+ // DB.Do(db =>
|
|
|
+ // {
|
|
|
+ // var task = db.Default.Set<WCS_TASK>().Where(v => v.WMSTASK == wmstaskId).FirstOrDefault();
|
|
|
+ // if (task == null)
|
|
|
+ // throw new Exception("WCS任务不存在");
|
|
|
+ // if (task.STATUS != WCS.Entity.TaskStatus.新建)
|
|
|
+ // throw new Exception("WCS任务当前状态不允许取消");
|
|
|
+ // task.STATUS = WCS.Entity.TaskStatus.已取消;
|
|
|
+ // task.UPDATETIME = DateTime.Now;
|
|
|
+ // task.UPDATEUSER = "WMS";
|
|
|
+ // db.Default.SaveChanges();
|
|
|
+ // if (task.TYPE == TaskType.出库 && task.AgvTask > 0)
|
|
|
+ // {
|
|
|
+ // var agvtask = db.Default.Set<WCS_AGVTask>().Find(task.AgvTask);
|
|
|
+ // agvtask.Status = AGVTaskStatus.取消;
|
|
|
+ // agvtask.UpdateTime = DateTime.Now;
|
|
|
+ // db.Default.SaveChanges();
|
|
|
+ // }
|
|
|
+ // });
|
|
|
+ // res.ResType = true;
|
|
|
+ // }
|
|
|
+ // catch (Exception ex)
|
|
|
+ // {
|
|
|
+ // res.ResMessage = ex.GetBaseException().Message;
|
|
|
+ // }
|
|
|
+ // return res;
|
|
|
+ // }
|
|
|
+
|
|
|
+ // /// <summary>
|
|
|
+ // /// 通过该接口获取指定条件设备信息
|
|
|
+ // /// </summary>
|
|
|
+ // /// <param name="model">筛选条件</param>
|
|
|
+ // /// <returns></returns>
|
|
|
+ // //[HttpGet]
|
|
|
+ // //public List<DeviceStatusViewModel> GetDeviceStatus([FromQuery] DeviceStatusViewModel model)
|
|
|
+ // //{
|
|
|
+ // // var result = new List<DeviceStatusViewModel>();
|
|
|
+ // // //找到所有设备的读取协议
|
|
|
+ // // var rgv = Device.Where(v => v.IsRGV()).Select(v => v.Device<IRGV521>());
|
|
|
+ // // var sc = Device.Where(v => v.IsSC()).Select(v => v.Device<ISRM521>());
|
|
|
+ // // var conv = Device.Where(v => v.IsConv()).Select(v => v.Device<IStation521>());
|
|
|
+
|
|
|
+ // // #region 检索分两部分,设备、任务(数据库)
|
|
|
+
|
|
|
+ // // #region 设备信息
|
|
|
+
|
|
|
+ // // if (!string.IsNullOrEmpty(model.CODE))
|
|
|
+ // // {
|
|
|
+ // // result.AddRange(GetDeviceStatusWhere(rgv, v => v.Entity.CODE == model.CODE));
|
|
|
+ // // result.AddRange(GetDeviceStatusWhere(sc, v => v.Entity.CODE == model.CODE));
|
|
|
+ // // result.AddRange(GetDeviceStatusWhere(conv, v => v.Entity.CODE == model.CODE));
|
|
|
+ // // }
|
|
|
+
|
|
|
+ // // if (model.TASKNUM > 10000)
|
|
|
+ // // {
|
|
|
+ // // result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.TaskID_1 == model.TASKNUM));
|
|
|
+ // // result.AddRange(GetDeviceStatusWhere(sc, v => v.Data.TaskID_1 == model.TASKNUM));
|
|
|
+ // // result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.Tasknum == model.TASKNUM));
|
|
|
+ // // }
|
|
|
+
|
|
|
+ // // if (model.PH_STATUS != null)
|
|
|
+ // // {
|
|
|
+ // // result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.TaskID_1 == model.TASKNUM));
|
|
|
+ // // }
|
|
|
+
|
|
|
+ // // if (!string.IsNullOrEmpty(model.ADDRFROM))
|
|
|
+ // // {
|
|
|
+ // // result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.StartPosition_1 == short.Parse(model.ADDRFROM)));
|
|
|
+ // // result.AddRange(GetDeviceStatusWhere(sc, v => model.ADDRFROM.Contains(v.Data.SLine_1.ToString())
|
|
|
+ // // || model.ADDRFROM.Contains(v.Data.SCol_1.ToString())
|
|
|
+ // // || model.ADDRFROM.Contains(v.Data.SLayer_1.ToString())));
|
|
|
+ // // result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.Goodsstart ==short.Parse(model.ADDRFROM)));
|
|
|
+ // // }
|
|
|
+
|
|
|
+ // // if (!string.IsNullOrEmpty(model.ADDRTO))
|
|
|
+ // // {
|
|
|
+ // // result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.DestPosition_1 == short.Parse(model.ADDRTO)));
|
|
|
+ // // result.AddRange(GetDeviceStatusWhere(sc, v => model.ADDRTO.Contains(v.Data.ELine_1.ToString())
|
|
|
+ // // || model.ADDRTO.Contains(v.Data.ECol_1.ToString())
|
|
|
+ // // || model.ADDRTO.Contains(v.Data.ELayer_1.ToString())));
|
|
|
+ // // result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.Goodsend == short.Parse(model.ADDRTO)));
|
|
|
+ // // }
|
|
|
+
|
|
|
+ // // #endregion 设备信息
|
|
|
+
|
|
|
+ // // #region 任务信息
|
|
|
+
|
|
|
+ // // //获取所有设备上的任务信息
|
|
|
+ // // if (model.TYPE != null || !string.IsNullOrEmpty(model.BARCODE))
|
|
|
+ // // {
|
|
|
+ // // var info = new List<DeviceStatusViewModel>();
|
|
|
+ // // var ids = result.Select(v => v.TASKNUM);
|
|
|
+ // // info.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.TaskID_1 > 10000));
|
|
|
+ // // info.AddRange(GetDeviceStatusWhere(sc, v => v.Data.TaskID_1 > 10000));
|
|
|
+ // // info.AddRange(GetDeviceStatusWhere(conv, v => v.Data.Tasknum > 10000));
|
|
|
+ // // result.AddRange(info.Where(v => !ids.Any(b => b == v.TASKNUM)));
|
|
|
+ // // }
|
|
|
+
|
|
|
+ // // DB.Do(db =>
|
|
|
+ // // {
|
|
|
+ // // var ids = result.Select(v => v.TASKNUM);
|
|
|
+ // // var tasks = db.Default.Set<WCS_TASK>().AsNoTracking().Where(v => ids.Any(b => b == v.ID)).ToList();
|
|
|
+ // // tasks.ForEach(task =>
|
|
|
+ // // {
|
|
|
+ // // var info = result.Find(v => v.TASKNUM == task.ID);
|
|
|
+ // // info.TYPE = task.TYPE;
|
|
|
+ // // info.BARCODE = task.BARCODE;
|
|
|
+ // // });
|
|
|
+ // // });
|
|
|
+
|
|
|
+ // // if (model.TYPE != null)
|
|
|
+ // // {
|
|
|
+ // // result = result.Where(v => v.TYPE == model.TYPE).ToList();
|
|
|
+ // // }
|
|
|
+ // // if (!string.IsNullOrEmpty(model.BARCODE))
|
|
|
+ // // {
|
|
|
+ // // result = result.Where(v => v.BARCODE != null && v.BARCODE.Contains(model.BARCODE)).ToList();
|
|
|
+ // // }
|
|
|
+
|
|
|
+ // // #endregion 任务信息
|
|
|
+
|
|
|
+ // // #endregion 检索分两部分,设备、任务(数据库)
|
|
|
+
|
|
|
+ // // return result;
|
|
|
+ // //}
|
|
|
+
|
|
|
+ // #region 静态方法
|
|
|
+
|
|
|
+ // ///// <summary>
|
|
|
+ // ///// 获取RGV设备信息
|
|
|
+ // ///// </summary>
|
|
|
+ // ///// <param name="soue"></param>
|
|
|
+ // ///// <param name="func"></param>
|
|
|
+ // ///// <returns></returns>
|
|
|
+ // //public static List<DeviceStatusViewModel> GetDeviceStatusWhere(IEnumerable<Device<IRGV521>> soue, Func<Device<IRGV521>, bool> func)
|
|
|
+ // //{
|
|
|
+ // // var result = new List<DeviceStatusViewModel>();
|
|
|
+ // // result.AddRange(soue.Where(func).Select(device =>
|
|
|
+ // // {
|
|
|
+ // // return new DeviceStatusViewModel
|
|
|
+ // // {
|
|
|
+ // // CODE = device.Entity.CODE,
|
|
|
+ // // TASKNUM = device.Data.TaskID_1 ,
|
|
|
+ // // PH_STATUS = device.Data.SystemStatus.HasFlag(RGVStatus.光电),
|
|
|
+ // // ADDRFROM = device.Data.StartPosition_1.ToString(),
|
|
|
+ // // ADDRTO = device.Data.DestPosition_1.ToString(),
|
|
|
+ // // };
|
|
|
+ // // }));
|
|
|
+ // // return result;
|
|
|
+ // //}
|
|
|
+
|
|
|
+ // ///// <summary>
|
|
|
+ // ///// 获取堆垛机设备信息
|
|
|
+ // ///// </summary>
|
|
|
+ // ///// <param name="soue"></param>
|
|
|
+ // ///// <param name="func"></param>
|
|
|
+ // ///// <returns></returns>
|
|
|
+ // //public static List<DeviceStatusViewModel> GetDeviceStatusWhere(IEnumerable<Device<ISRM521>> soue, Func<Device<ISRM521>, bool> func)
|
|
|
+ // //{
|
|
|
+ // // var result = new List<DeviceStatusViewModel>();
|
|
|
+
|
|
|
+ // // result.AddRange(soue.Where(func).Select(device =>
|
|
|
+ // // {
|
|
|
+ // // var info = new DeviceStatusViewModel
|
|
|
+ // // {
|
|
|
+ // // CODE = device.Entity.CODE,
|
|
|
+ // // TASKNUM = device.Data.TaskID_1,
|
|
|
+ // // ADDRFROM = $"{device.Data.SLine_1}-{device.Data.SCol_1}-{device.Data.SLayer_1}",
|
|
|
+ // // ADDRTO = device.Data.ELine_1.ToString(),
|
|
|
+ // // };
|
|
|
+ // // if (device.Data.ECol_1 != 0 && device.Data.ELayer_1 != 0)
|
|
|
+ // // info.ADDRTO = $"{device.Data.ELine_1}-{device.Data.ECol_1}-{device.Data.ELayer_1}";
|
|
|
+ // // return info;
|
|
|
+ // // }));
|
|
|
+
|
|
|
+ // // return result;
|
|
|
+ // //}
|
|
|
+
|
|
|
+ // ///// <summary>
|
|
|
+ // ///// 获取输送机设备信息
|
|
|
+ // ///// </summary>
|
|
|
+ // ///// <param name="soue"></param>
|
|
|
+ // ///// <param name="func"></param>
|
|
|
+ // ///// <returns></returns>
|
|
|
+ // //public static List<DeviceStatusViewModel> GetDeviceStatusWhere(IEnumerable<Device<IStation521>> soue, Func<Device<IStation521>, bool> func)
|
|
|
+ // //{
|
|
|
+ // // var result = new List<DeviceStatusViewModel>();
|
|
|
+
|
|
|
+ // // result.AddRange(soue.Where(func).Select(device =>
|
|
|
+ // // {
|
|
|
+ // // return new DeviceStatusViewModel
|
|
|
+ // // {
|
|
|
+ // // CODE = device.Entity.CODE,
|
|
|
+ // // TASKNUM = device.Data.Tasknum,
|
|
|
+ // // ADDRFROM =device.Data.Goodsstart.ToString(),
|
|
|
+ // // ADDRTO = device.Data.Goodsend.ToString(),
|
|
|
+ // // };
|
|
|
+ // // }));
|
|
|
+
|
|
|
+ // // return result;
|
|
|
+ // //}
|
|
|
+
|
|
|
+ // #endregion 静态方法
|
|
|
+ //}
|
|
|
}
|