c2cdf0b95d4c9214646c860609b8c838d6ffa779..fdf7bb595ee00e5fef7b4e110fbe32f637c069f6
6 天以前 wangxinhui
1
fdf7bb 对比 | 目录
6 天以前 wangxinhui
1
6abb60 对比 | 目录
6 天以前 wangxinhui
1
e719f3 对比 | 目录
已添加1个文件
已修改32个文件
1165 ■■■■■ 文件已修改
项目代码/WCS/WCSServices/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_DTO/Agv/AgvUpdateDTO.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Server/Controllers/Task/TaskController.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Server/appsettings.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs 101 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/原料库/ConveyorLineJob_YL1ndFloor.cs 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/原料库/StackerCraneJob_YLSC2.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/成品仓/AGV_CPExtend.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/成品仓/ConveyorLineJob_CPD.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/成品仓/StackerCraneJob_CP.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/basic/agvStationInfo.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/stock/stockInfo.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/CommonEnum/AGVStationAreaEnum.cs 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/StockEnum/StockStatusEmun.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/TaskEnum/TaskTypeEnum.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/WareHouseEnum/WarehouseEnum.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_ITaskInfoService/ITaskService.cs 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Basic/Dt_AGVStationInfo.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Completed.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs 318 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs 233 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Reloaction.cs 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/技术协议/利拓系统对龙利得二期系统的需求.docx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/技术协议/龙利得项目对接记录.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/MES.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/龙利德点位.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/原料库输送线通讯协议.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/成品输送线通讯协议_20250707.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/通信协议/龙利得软件计划表.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs
@@ -29,21 +29,25 @@
        /// </summary>
        [Description("质检出库")]
        OutQuality = 130,
        /// <summary>
        /// ç©ºç®±å‡ºåº“
        /// </summary>
        [Description("空箱出库")]
        OutEmpty = 140,
        /// <summary>
        /// è°ƒæ‹¨å‡ºåº“
        /// </summary>
        [Description("调拨出库")]
        OutAllocate = 150,
        /// <summary>
        /// å ç›˜å‡ºåº“
        /// è€åŽ‚å‡ºåº“
        /// </summary>
        [Description("叠盘出库")]
        StackingPlates = 160,
        [Description("老厂出库")]
        OldOutbound = 160,
        /// <summary>
        /// MES出库
        /// </summary>
@@ -72,7 +76,7 @@
        [Description("成品寄售出库")]
        OutSendProduct = 240,
        /// <summary>
        /// æˆå“MES出库/提库
        /// æˆå“MES提库
        /// </summary>
        [Description("成品MES提库")]
        OutMesRworkProduct = 250,
@@ -110,6 +114,12 @@
        MesMatReturn = 560,
        /// <summary>
        /// è°ƒæ‹¨å…¥åº“
        /// </summary>
        [Description("调拨入库")]
        InAllocate = 570,
        /// <summary>
        /// MES大空托退料
        /// </summary>
        [Description("MES大空托退料")]
@@ -122,27 +132,9 @@
        MesPalletSmallReturn = 585,
        /// <summary>
        /// è°ƒæ‹¨å…¥åº“
        /// æ‰‹åŠ¨å…¥åº“
        /// </summary>
        [Description("调拨入库")]
        InAllocate = 570,
        /// <summary>
        /// çº¿è¾¹ä»“入库
        /// </summary>
        [Description("线边仓入库")]
        InboundXB = 580,
        /// <summary>
        /// æœºå°å…¥åº“
        /// </summary>
        [Description("机台入库")]
        InboundJT = 590,
        /// <summary>
        /// ç©ºç®±å…¥åº“
        /// </summary>
        [Description("空箱入库")]
        [Description("手动入库")]
        InEmpty = 600,
        /// <summary>
@@ -157,9 +149,9 @@
        [Description("成品余料回库")]
        InProductBack = 620,
        /// <summary>
        /// æˆå“ç©ºæ¡†å›žåº“
        /// æˆå“ç©ºæ‰˜å›žåº“
        /// </summary>
        [Description("成品空框回库")]
        [Description("成品空托回库")]
        EmptyProductBack = 630,
        /// <summary>
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_DTO/Agv/AgvUpdateDTO.cs
@@ -25,6 +25,6 @@
        /// 1取货完成<br/>
        /// 2放货完成<br/>
        /// </summary>
        public int GoodsState { get; set; }
        public string GoodsState { get; set; }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -91,16 +91,6 @@
        //WebResponseContent RequestWMSTask(string palletCode, string sourceAddress, string roadway);
        /// <summary>
        ///
        /// </summary>
        /// <param name="sourceAddress"></param>
        /// <param name="palletCode"></param>
        /// <param name="heightType"></param>
        /// <param name="roadways"></param>
        /// <returns></returns>
        WebResponseContent RequestWMSTask(string palletCode, string sourceAddress, int heightType, List<string> roadways);
        /// <summary>
        /// å‘WMS申请分配货位
        /// </summary>
        /// <param name="taskNum">任务号</param>
@@ -275,10 +265,6 @@
        /// </summary>
        /// <returns></returns>
        WebResponseContent AgvBoxApplyPass(AgvCTUCancelDTO applyPassDTO, APIEnum SecureReply = APIEnum.AGV_CTUCancelTask);
        /// <summary>
        /// ç”Ÿæˆç©ºæ¡†ä»»åŠ¡
        /// </summary>
        WebResponseContent AgvCarrying(int row, int startColumn, int endColumn, int layer, int targetLayer);
        /// <summary>
        /// é¢„调度指令
        /// </summary>
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs
@@ -51,7 +51,7 @@
            {
                var task = _taskRepository.QueryFirst(x => secureApplyModel.ReceiveTaskID.ObjToInt() == x.TaskNum);
                if (task == null) throw new Exception("未找到任务");
                if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt())
                if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
                {
                    var content = TakeRequest(task.CurrentAddress);
                    if (!content.Status)
@@ -200,17 +200,18 @@
                if (task == null) throw new Exception($"未找到任务,任务号【{agvUpdateModel.ReceiveTaskID}】");
                switch (agvUpdateModel.GoodsState)
                {
                    //case 1://出库根据这个信号判断取货完成
                    //    if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt())
                    //    {
                    //        var content = TakeFinish(task.CurrentAddress);
                    //        if (!content.Status) throw new Exception(content.Message);
                    //        task.TaskState = TaskStatusEnum.AGV_Finish.ObjToInt();
                    //        var up = _taskRepository.DeleteAndMoveIntoHty(task, OperateTypeEnum.自动完成);
                    //        _taskService.TaskCompleted(task.TaskNum);
                    //    }
                    //    break;
                    case 2://入库根据这个信号判断放货完成
                    case "1"://出库根据这个信号判断取货完成
                        if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
                        {
                            var content = TakeFinish(task.CurrentAddress);
                            if (!content.Status)
                            {
                                throw new Exception(content.Message);
                            };
                            return agvResponse.OK("成功", "0");
                        }
                        break;
                    case "2"://入库根据这个信号判断放货完成
                        if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
                        {
                            Dt_StationManger dt_Station = _stationMangerRepository.QueryFirst(x => x.StationCode == task.NextAddress);
@@ -224,6 +225,11 @@
                            task.DeviceCode = dt_Station.StationDeviceCode;
                            var up = _taskRepository.UpdateData(task);
                            return agvResponse.OK("成功","0");
                        }
                        else if(task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
                        {
                            _taskService.TaskCompleted(task.TaskNum);
                            return agvResponse.OK("成功", "0");
                        }
                        break;
                    default:
@@ -321,45 +327,36 @@
        [HttpPost, HttpGet, Route("TakeRequest"), AllowAnonymous]
        public WebResponseContent TakeRequest(string code)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.AGVStationCode == code);
                Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == code);
                if (stationManger == null)
                {
                    return WebResponseContent.Instance.Error($"未找到站台配置");
                    return WebResponseContent.Instance.Error($"未找到站台配置{code}");
                }
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManger.StationDeviceCode);
                if (device == null)
                {
                    return WebResponseContent.Instance.Error($"未找到对应设备");
                    return WebResponseContent.Instance.Error($"未找到对应设备{stationManger.StationDeviceCode}");
                }
                OtherDevice otherDevice = (OtherDevice)device;
                bool canPut = otherDevice.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanTake, stationManger.StationCode);
                if (canPut)
                short Command = otherDevice.GetValue<R_ConveyorLineCPDB, short>(R_ConveyorLineCPDB.Command, stationManger.StationCode);
                if (Command == 2)
                {
                    otherDevice.SetValue(GroundStationDBName.W_TakeRequest, true, stationManger.StationCode);
                    return WebResponseContent.Instance.OK();
                    content.OK("允许取料");
                }
                else
                {
                    otherDevice.SetValue(GroundStationDBName.W_TakeRequest, true, stationManger.StationCode);
                    Thread.Sleep(1000);
                    canPut = otherDevice.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanTake, stationManger.StationCode);
                    if (canPut)
                    {
                        return WebResponseContent.Instance.OK();
                    }
                    else
                    {
                        return WebResponseContent.Instance.Error($"取货申请中");
                    }
                    return content.Error("禁止取料");
                }
                return content;
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
                return content.Error(ex.Message);
            }
        }
@@ -374,7 +371,7 @@
        {
            try
            {
                Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.AGVStationCode == code);
                Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == code);
                if (stationManger == null)
                {
                    return WebResponseContent.Instance.Error($"未找到站台配置");
@@ -386,9 +383,10 @@
                }
                OtherDevice otherDevice = (OtherDevice)device;
                otherDevice.SetValue(GroundStationDBName.W_TakeFinish, true, stationManger.StationCode);
                Thread.Sleep(1000);
                otherDevice.SetValue(GroundStationDBName.W_TakeFinish, false, stationManger.StationCode);
                if (device.DeviceCode.Contains("CP"))
                {
                    otherDevice.SetValue(W_ConveyorLineCPDB.W_Command, 2, stationManger.StationCode);
                }
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Server/Controllers/Task/TaskController.cs
@@ -80,11 +80,6 @@
        {
            return WebResponseContent.Instance.OK(data: _routerExtension.GetEndPoint(startPoint, routeType));
        }
        [HttpPost, HttpGet, Route("AgvCarrying"), AllowAnonymous]
        public WebResponseContent AgvCarrying(int row, int startColumn, int endColumn, int layer, int targetLayer)
        {
            return Service.AgvCarrying(row, startColumn, endColumn, layer, targetLayer);
        }
        /// <summary>
        /// æµ‹è¯•堆垛机出库
        /// </summary>
@@ -119,19 +114,6 @@
        {
            return Service.RequestWMSTaskSimple(palletCode,sourceAddress, roadWay, taskType);
        }
        //[HttpPost, HttpGet, Route("WebSocketPushMessage"), AllowAnonymous]
        //public WebResponseContent WebSocketPushMessage(string message)
        //{
        //    try
        //    {
        //         _webSocketServer.PublishAllClientPayload(message);
        //        return WebResponseContent.Instance.OK();
        //    }
        //    catch(Exception ex)
        //    {
        //        return WebResponseContent.Instance.Error(ex.Message);
        //    }
        //}
        [HttpPost, HttpGet, Route("RecWMSTaskCompleted"), AllowAnonymous]
        public WebResponseContent RecWMSTaskCompleted(int taskNum)
        {
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Server/appsettings.json
@@ -14,7 +14,7 @@
  //连接字符串
  //"ConnectionString": "HTI6FB1H05Krd07mNm9yBCNhofW6edA5zLs9TY~MNthRYW3kn0qKbMIsGp~3yyPDF1YZUCPBQx8U0Jfk4PH~ajNFXVIwlH85M3F~v_qKYQ3CeAz3q1mLVDn8O5uWt1~3Ut2V3KRkEwYHvW2oMDN~QIDXPxDgXN0R2oTIhc9dNu7QNaLEknblqmHhjaNSSpERdDVZIgHnMKejU_SL49tralBkZmDNi0hmkbL~837j1NWe37u9fJKmv91QPb~16JsuI9uu0EvNZ06g6PuZfOSAeFH9GMMIZiketdcJG3tHelo=",
  "ConnectionString": "Data Source=.;Initial Catalog=WIDESEA_WCSLLD;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //"ConnectionString": "Data Source=10.30.4.92;Initial Catalog=TestWCS_TC;User ID=sa;Password=duo123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //"ConnectionString": "Data Source=192.168.35.3;Initial Catalog=TestWCS_TC;User ID=sa;Password=Sa123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //"ConnectionString": "Data Source=10.30.4.92;Initial Catalog=TESTWCSCP_WCS;User ID=sa;Password=duo123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  "WMSConnectionStrings": "Data Source=.;Initial Catalog=WIDESEA_WMSLLD;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //"WMSConnectionStrings": "Data Source=10.30.4.92;Initial Catalog=WIDESEAWMS_HUAIAN;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -139,53 +139,6 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent AgvCarrying(int row,int startColumn, int endColumn, int startlayer,int targetLayer)
        {
            try
            {
                List<Dt_Task> tasks = new List<Dt_Task>();
                for (int i = startColumn; i <= endColumn; i++)
                {
                    string column = i.ToString();
                    if (i<10)
                    {
                        column = "0" + i.ToString();
                    }
                    string layer = targetLayer.ToString();
                    if (targetLayer<10)
                    {
                        layer = "0"+targetLayer.ToString();
                    }
                    Dt_Task task = new Dt_Task()
                    {
                        WarehouseId = 7,
                        TaskNum = DateTime.Now.ToString("yyMMddHHmm").ObjToInt() + i,
                        PalletCode= DateTime.Now.ToString("yyMMddHHmm") +i,
                        PalletType=0,
                        DeviceCode="AGV_CP",
                        Roadway= "AGV_CP",
                        TaskType =999,
                        SourceAddress=string.Format($"AGV_CP-00{row}-0{column}-00{startlayer}-01"),
                        CurrentAddress=string.Format($"AGV_CP-00{row}-0{column}-00{startlayer}-01"),
                        TargetAddress= string.Format($"AGV_CP-00{row}-0{column}-00{layer}-01"),
                        NextAddress= string.Format($"AGV_CP-00{row}-0{column}-00{layer}-01"),
                        Grade=0,
                        WMSId=0,
                        AgvTaskNum = "CP" + DateTime.Now.ToString("yyMMddHHmm").ObjToInt() + i,
                        TaskState = TaskStatusEnum.New.ObjToInt(),
                        Remark= "测试空框"
                    };
                    tasks.Add(task);
                }
                BaseDal.AddData(tasks);
                return WebResponseContent.Instance.OK("");
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// æŽ¥æ”¶WMS任务信息
        /// </summary>
@@ -211,10 +164,18 @@
                    task.CurrentAddress = item.SourceAddress;
                    Dt_Router? router;
                    if (task.TaskType==TaskTypeEnum.Relocation.ObjToInt())
                    {
                        task.DeviceCode = task.Roadway;
                        task.NextAddress = task.TargetAddress;
                        task.TaskState = TaskStatusEnum.SC_Execute.ObjToInt();
                        tasks.Add(task);
                        break;
                    }
                    TaskTypeGroup taskTypeGroup = item.TaskType.GetTaskTypeGroup();
                    if (string.IsNullOrEmpty(item.AGVArea))
                    {
                        Dt_StationManger stationManger;
                        //获取站台信息
                        if (taskTypeGroup == TaskTypeGroup.InboundGroup)
@@ -239,27 +200,30 @@
                        if (routers.Count == 1)
                        {
                            //入库
                            if (taskTypeGroup == TaskTypeGroup.InboundGroup)
                            {
                                task.CurrentAddress = router.StartPosi;
                                task.NextAddress = router.NextPosi;
                                task.DeviceCode = router.ChildPosiDeviceCode;
                            }
                            else
                            else //出库
                            {
                                task.DeviceCode = stationManger.StackerCraneCode;
                                task.NextAddress = router.NextPosi;
                                task.TaskState = (int)TaskStatusEnum.SC_Execute;
                            }
                        }
                        else
                        {
                            //成品码垛任务生成
                            if (taskTypeGroup == TaskTypeGroup.InboundGroup && !task.Roadway.Contains("YL"))
                            {
                                task.CurrentAddress = router.StartPosi;
                                task.NextAddress = "";
                                task.DeviceCode = router.ChildPosiDeviceCode;
                            }
                            else
                            else if(taskTypeGroup == TaskTypeGroup.InboundGroup && task.Roadway.Contains("YL")) //原料入库
                            {
                                router = routers.FirstOrDefault(x=>x.ChildPosiDeviceCode==task.Roadway);
                                task.CurrentAddress = router.StartPosi;
@@ -270,6 +234,7 @@
                    }
                    else
                    {
                        //成品入库
                        List<Dt_Router> routers = _routerRepository.QueryData(x => x.InOutType == item.TaskType && x.StartPosi=="AGV" && x.ChildPosiDeviceCode==item.RoadWay);
                        router = routers.FirstOrDefault();
                        if (routers.Count == 1)
@@ -461,42 +426,6 @@
        //    return content;
        //}
        /// <summary>
        ///
        /// </summary>
        /// <param name="sourceAddress"></param>
        /// <param name="palletCode"></param>
        /// <param name="heightType"></param>
        /// <param name="roadways"></param>
        /// <returns></returns>
        public WebResponseContent RequestWMSTask(string palletCode, string sourceAddress,  int heightType, List<string> roadways)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string address = AppSettings.Get("WMSApiAddress");
                if (string.IsNullOrEmpty(address))
                {
                    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                }
                string responseStr = HttpHelper.Post($"{address}/api/Task/DeviceRequestInboundTaskByRoadways?stationCode={sourceAddress}&palletCode={palletCode}&heightType={heightType}", roadways.Serialize());
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
                if (responseContent != null && responseContent.Status && responseContent.Data != null)
                {
                    WMSTaskDTO? taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(responseContent.Data.ToString());
                    if (taskDTO != null)
                    {
                        content = ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
                    }
                }
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// åˆ†é…å··é“
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/Ô­ÁÏ¿â/ConveyorLineJob_YL1ndFloor.cs
@@ -126,29 +126,18 @@
                                
                            }
                        }
                        else if (conveyorLineInfoRead != null && item.StationType == StationTypeEnum.StationType_OnlyOutbound.ObjToInt() && conveyorLineInfoRead.WR_ToHode <= 0 && conveyorLineInfoRead.WR_Request == 99 && !string.IsNullOrEmpty(conveyorLineInfoRead.WR_TMID) && conveyorLineInfoRead.WR_Task <= 0) //出站台分配目标点
                        else if (conveyorLineInfoRead != null && item.StationType == StationTypeEnum.StationType_OnlyOutbound.ObjToInt() && conveyorLineInfoRead.WR_ToHode <= 0 && conveyorLineInfoRead.WR_Request == 99 && conveyorLineInfoRead.WR_Task <= 0) //出站台分配目标点
                        {
                            Dt_Task task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && _taskService.TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == TaskStatusEnum.Line_Execute.ObjToInt() && x.DeviceCode == device.DeviceCode);
                            if (task != null)
                            {
                                List<Dt_Router> routers = _routerRepository.QueryData(x => x.InOutType == task.TaskType && task.CurrentAddress == x.StartPosi);
                                Dt_Router? router = routers.FirstOrDefault();
                                if (routers == null || routers.Count == 0 || router == null)
                                {
                                    WriteError(item.StationName, $"未找到对应路由信息,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                    continue;
                                }
                                if (routers.Count > 1)
                                {
                                    WriteError(item.StationName, $"路由信息配置错误,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                    continue;
                                }
                                //发送目标点
                                device.SetValue(WR_CLineYLDB.WR_Task, task.TaskNum, item.StationCode);
                                device.SetValue(WR_CLineYLDB.WR_Width, task.TaskLength, item.StationCode);
                                device.SetValue(WR_CLineYLDB.WR_TMID, task.PalletCode, item.StationCode);
                                device.SetValue(WR_CLineYLDB.WR_ToHode, router.NextPosi, item.StationCode);
                                device.SetValue(WR_CLineYLDB.WR_ToHode, task.NextAddress, item.StationCode);
                                device.SetValue(WR_CLineYLDB.WR_Reresult, 86, item.StationCode);
                                _taskService.UpdateTask(task,TaskStatusEnum.Line_Executing,nextAddress: router.NextPosi);
                                _taskService.UpdateTask(task,TaskStatusEnum.Line_Executing);
                            }
                        }
                        else if (conveyorLineInfoRead != null && item.StationType == StationTypeEnum.StationType_InboundAndOutbound.ObjToInt() && conveyorLineInfoRead.WR_Task > 0 && conveyorLineInfoRead.WR_Request == 98) //一楼老厂出库口完成
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/Ô­ÁÏ¿â/StackerCraneJob_YLSC2.cs
@@ -132,16 +132,10 @@
                            return WebResponseContent.Instance.Error($"未找到路由信息,{task.NextAddress}");
                        }
                        int oldStatus = task.TaskState;
                        task.DeviceCode = stationManger.StationDeviceCode;
                        task.TaskState = TaskStatusEnum.Line_Execute.ObjToInt();
                        task.CurrentAddress = stationManger.StationCode;
                        task.NextAddress = router.NextPosi;
                        task.TargetAddress = router.NextPosi;
                        _taskRepository.UpdateData(task);
                        //todo å †åž›æœºå®Œæˆå®Œæˆ
                        //_taskService.UpdateTask(task, TaskStatusEnum.Line_Execute, deviceCode: stationManger.StationDeviceCode, currentAddress: stationManger.StationCode, nextAddress: router.NextPosi, targetAddress: router.NextPosi);
                        _taskService.UpdateTask(task, TaskStatusEnum.Line_Execute, deviceCode: stationManger.StationDeviceCode, currentAddress: stationManger.StationCode, nextAddress: router.NextPosi);
                        _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"系统自动流程,任务状态从【{oldStatus}】转到【{task.TaskState}】");
                        WriteInfo(deviceCode, $"堆垛机任务完成,任务号:{taskNum}");
                        WriteInfo(deviceCode, $"堆垛机出库任务完成,任务号:{taskNum}");
                    }
                    else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup || task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
                    {
@@ -203,28 +197,28 @@
                }
            }
            //if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
            //{
            //    if (OutTaskStationIsOccupied(task) == null)
            //    {
            //        bool flag = false;
            //        List<string> otherOutStaionCodes = _routerService.QueryNextRoutes(commonStackerCrane.DeviceCode, task.NextAddress, task.TaskType).Select(x => x.ChildPosi).ToList();
            //        List<Dt_Task> tasks = _taskService.QueryStackerCraneOutTasks(commonStackerCrane.DeviceCode, otherOutStaionCodes);
            //        foreach (var item in tasks)
            //        {
            //            if (OutTaskStationIsOccupied(task) != null)
            //            {
            //                flag = true;
            //                break;
            //            }
            //        }
            //        if (!flag)
            //        {
            //            task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
            //        }
            //    }
            //}
            if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
            {
                if (OutTaskStationIsOccupied(task) == null)
                {
                    bool flag = false;
                    List<string> otherOutStaionCodes = _routerService.QueryNextRoutes(commonStackerCrane.DeviceCode, task.NextAddress, task.TaskType).Select(x => x.ChildPosi).ToList();
                    List<Dt_Task> tasks = _taskService.QueryStackerCraneOutTasks(commonStackerCrane.DeviceCode, otherOutStaionCodes);
                    foreach (var item in tasks)
                    {
                        if (OutTaskStationIsOccupied(task) != null)
                        {
                            flag = true;
                            break;
                        }
                    }
                    if (!flag)
                    {
                        task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
                    }
                }
            }
            task = _taskService.QueryStackerCraneTask(commonStackerCrane.DeviceCode);
            return task;
        }
@@ -242,7 +236,7 @@
                if (device != null)
                {
                    OtherDevice client = (OtherDevice)device;
                    if (client.GetValue<R_ConveyorLineCPDB, short>(R_ConveyorLineCPDB.Command, stationManger.StationCode) == 3)//出库站台未被占用
                    if (client.GetValue<WR_CLineYLDB, short>(WR_CLineYLDB.WR_Request, stationManger.StationCode) != 99)//出库站台未被占用
                    {
                        task.NextAddress = stationManger.StackerCraneStationCode;
                        _taskRepository.UpdateData(task);
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/³ÉÆ·²Ö/AGV_CPExtend.cs
@@ -90,6 +90,10 @@
                            {
                                throw new Exception("未找到AGV站点");
                            }
                            if (!stationMangerStart.StationCode.Contains("PNT") && stationMangerEnd.StationCode.Contains("PNT"))
                            {
                                agvTaskSend.TaskCode = "DUIGAO2";
                            }
                            //发送AGV任务
                            WebResponseContent content = _taskService.AgvSendTask(agvTaskSend, APIEnum.AgvSendTask);
                            if (!content.Status)
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/³ÉÆ·²Ö/ConveyorLineJob_CPD.cs
@@ -100,12 +100,31 @@
                                //更新任务信息
                                task.CurrentAddress = item.StationCode;
                                task.NextAddress = router.NextPosi;
                                task.PalletType = 1;
                                task.PalletCode = conveyorLineInfoRead.PalletCode;
                                _taskService.UpdateTask(task, TaskStatusEnum.Line_Executing);
                                WriteInfo(item.StationName, $"任务号{conveyorLineInfoRead.TaskNo}下一步");
                            }
                        }
                        else if (conveyorLineInfoRead != null && conveyorLineInfoRead.Command == 2 && conveyorLineInfoRead.TaskNo > 0)
                        {
                            Dt_Task task = _taskRepository.QueryFirst(x =>x.TaskNum== conveyorLineInfoRead.TaskNo &&  x.NextAddress == item.StationCode && _taskService.TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == TaskStatusEnum.Line_Executing.ObjToInt() && x.DeviceCode == device.DeviceCode);
                            if (task != null)
                            {
                                //分配巷道 å­˜å…¥æ‰˜ç›˜æ•°æ®
                                List<Dt_Router> routers = _routerRepository.QueryData(x => x.InOutType == task.TaskType && task.NextAddress == x.StartPosi);
                                Dt_Router router = routers.FirstOrDefault();
                                if (router == null)
                                {
                                    WriteError(item.StationName, $"任务号:{task.TaskNum}未找到路由配置信息");
                                    return Task.CompletedTask;
                                }
                                //更新任务信息
                                task.CurrentAddress = router.StartPosi;
                                task.NextAddress = task.TargetAddress;
                                task.DeviceCode = router.NextPosi;
                                _taskService.UpdateTask(task, TaskStatusEnum.AGV_Execute);
                                WriteInfo(item.StationName, $"任务号{conveyorLineInfoRead.TaskNo}下一步");
                            }
                        }
                    }
                    else if (item.StationType == StationTypeEnum.StationType_OnlyInbound.ObjToInt() && deviceProRead != null)
                    {
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/³ÉÆ·²Ö/StackerCraneJob_CP.cs
@@ -136,8 +136,7 @@
                        task.TaskState = TaskStatusEnum.Line_Execute.ObjToInt();
                        task.CurrentAddress = stationManger.StationCode;
                        task.NextAddress = router.NextPosi;
                        task.TargetAddress = router.NextPosi;
                        _taskRepository.UpdateData(task);
                        _taskService.UpdateTask(task, TaskStatusEnum.Line_Execute);
                        //todo å †åž›æœºå®Œæˆå®Œæˆ
                        //_taskService.UpdateTask(task, TaskStatusEnum.Line_Execute, deviceCode: stationManger.StationDeviceCode, currentAddress: stationManger.StationCode, nextAddress: router.NextPosi, targetAddress: router.NextPosi);
                        _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"系统自动流程,任务状态从【{oldStatus}】转到【{task.TaskState}】");
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/basic/agvStationInfo.vue
@@ -84,6 +84,7 @@
                       {field:'agvStationHeight',title:'取放高度',type:'float',width:110,require:true,align:'left'},
                       {field:'agvFrontCode',title:'AGV前置点',type:'string',width:110,require:true,align:'left'},
                       {field:'stationArea',title:'AGV区域',type:'string',width:110,require:true,align:'left',bind: { key: "agvStationAreaEnum", data: [] }},
                       {field:'isOccupied',title:'是否占用',type:'string',width:110,require:true,align:'left',bind: { key: "enable", data: [] }},
                       {field:'creater',title:'创建者',type:'string',width:110,require:true,align:'left'},
                       {field:'createDate',title:'创建时间',type:'datetime',width:150,require:true,align:'left'},
                       {field:'modifier',title:'修改人',type:'string',width:100,align:'left'},
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/stock/stockInfo.vue
@@ -48,8 +48,10 @@
      });
      const searchFormOptions = ref([
        [
          { title: "托盘编号", field: "palletCode" },
          { title: "货位编号", field: "locationCode" },
          { title: "托盘编号", field: "palletCode",type:"like" },
          { title: "货位编号", field: "locationCode",type:"like" },
          {title: "库存组织", field:"materielInvOrgId",type:"select",dataKey:"materielInvOrgEnum",data:[]},
          {title: "物料编号", field:"materielCode",type:"like"},
        ],
      ]);
      const columns = ref([
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/CommonEnum/AGVStationAreaEnum.cs
@@ -12,49 +12,73 @@
        /// <summary>
        /// æœˆå°åŒº
        /// </summary>
        [Description("月台码头")]
        AreaA = 0,
        /// <summary>
        /// æˆå“åŒº
        /// </summary>
        [Description("成品库内")]
        AreaB = 1,
        [Description("月台区")]
        AreaA = 1,
        /// <summary>
        /// å…¥åº“区
        /// </summary>
        [Description("入库区")]
        AreaC = 2,
        /// <summary>
        /// æ·‹è†œåŒº
        /// </summary>
        [Description("淋膜区")]
        AreaD = 3,
        AreaB = 2,
        /// <summary>
        /// ç»‡å¸ƒåŒº
        /// </summary>
        [Description("织布区")]
        AreaE = 4,
        AreaC = 3,
        /// <summary>
        /// æ·‹è†œåŒº
        /// </summary>
        [Description("淋膜区")]
        AreaD = 4,
        /// <summary>
        /// æš‚存区
        /// </summary>
        [Description("织布区")]
        AreaF = 5,
        [Description("暂存区")]
        AreaE = 5,
        /// <summary>
        /// å°åˆ·åŒº
        /// </summary>
        [Description("印刷区")]
        AreaG = 6,
        AreaF = 6,
        /// <summary>
        /// å†²åˆ‡åŒº
        /// </summary>
        [Description("冲切区")]
        AreaH = 7
        AreaG = 7,
        /// <summary>
        /// åŽŸæ–™åŒº
        /// </summary>
        [Description("原料区")]
        AreaH = 8,
        /// <summary>
        /// çº¸è¢‹åŒº
        /// </summary>
        [Description("纸袋区")]
        AreaI = 9,
        /// <summary>
        /// å¸ƒè¢‹åŒº
        /// </summary>
        [Description("布袋区")]
        AreaJ = 10,
        /// <summary>
        /// çº¸æ¯åŒº
        /// </summary>
        [Description("纸杯区")]
        AreaK = 11,
        /// <summary>
        /// é›¾åŒ–区
        /// </summary>
        [Description("雾化区")]
        AreaL = 12
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/StockEnum/StockStatusEmun.cs
@@ -84,12 +84,12 @@
    {
        [Description("成品")]
        æˆå“ =1,
        [Description("尾数")]
        å°¾æ•° =2,
        [Description("研发")]
        ç ”发 =3,
        [Description("研发")]
        è¾…æ–™ = 4,
        [Description("半成品")]
        åŠæˆå“ = 2,
        [Description("原材料")]
        åŽŸææ–™ = 3,
        [Description("辅料备件")]
        è¾…料备件 = 4,
        [Description("空托")]
        ç©ºæ‰˜ = 5,
    }
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/TaskEnum/TaskTypeEnum.cs
@@ -43,6 +43,12 @@
        OutAllocate = 150,
        /// <summary>
        /// è€åŽ‚å‡ºåº“
        /// </summary>
        [Description("老厂出库")]
        OldOutbound = 160,
        /// <summary>
        /// MES出库
        /// </summary>
        [Description("MES出库")]
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/WareHouseEnum/WarehouseEnum.cs
@@ -77,6 +77,11 @@
        /// </summary>
        [Description("成品库")]
        LLDCP,
        /// <summary>
        /// åŽŸæ–™åº“
        /// </summary>
        [Description("原料库")]
        LLDYL,
    }
    public enum WarehouseTypEnum
    {
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_ITaskInfoService/ITaskService.cs
@@ -72,7 +72,7 @@
        WebResponseContent RequestYLWMSTaskSimple(string stationCode, string palletCode);
        /// <summary>
        /// åˆ†é…å··é“
        /// åˆ†é…åŽŸæ–™å··é“
        /// </summary>
        /// <returns></returns>
        string AssignYLRoadwayNo(string palletCode);
@@ -152,13 +152,7 @@
        /// </summary>
        /// <returns></returns>
        WebResponseContent ShipmentOrderSync(MesShipmentOrderSync model);
        /// <summary>
        /// æˆå“ä½™æ–™é€€åº“入仓
        /// </summary>
        /// <param name="barCode"></param>
        /// <param name="startPoint"></param>
        /// <returns></returns>
        WebResponseContent BackProductTask(string barCode, string startPoint);
        /// <summary>
        /// æˆå“ç©ºæ¡†å›žåº“
        /// </summary>
@@ -166,5 +160,22 @@
        /// <param name="startPoint"></param>
        /// <returns></returns>
        WebResponseContent EmptyBackTask(string barCode, string startPoint);
        /// <summary>
        /// æˆå“å‡ºåº“
        /// </summary>
        /// <param name="Count"></param>
        /// <returns></returns>
        WebResponseContent RequestCPWMSTaskOut(int Count);
        /// <summary>
        /// åŽŸæ–™å‡ºåº“ä»»åŠ¡
        /// </summary>
        /// <param name="materielCode">物料代码</param>
        /// <param name="materielWide">物料幅宽</param>
        /// <param name="Count">卷数</param>
        /// <returns></returns>
        WebResponseContent RequestYLWMSTaskOut(string materielCode, int materielWide, int Count);
        WebResponseContent IsRelocation(string startAddress, string endAddress, string roadWay);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Basic/Dt_AGVStationInfo.cs
@@ -40,6 +40,11 @@
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "区域")]
        public int StationArea { get; set; }
        /// <summary>
        /// æ˜¯å¦å ç”¨
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "是否占用")]
        public int IsOccupied { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "备注")]
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService.cs
@@ -72,9 +72,9 @@
                {nameof(Dt_Task.CreateDate),OrderByType.Asc},
            };
        public List<int> TaskTypes => typeof(TaskTypeEnum).GetEnumIndexList();
        public List<int> TaskInboundTypes => typeof(TaskTypeEnum).GetEnumIndexList().Where(x => x >= 500 && x < 900).ToList();
        public List<int> TaskOutboundTypes => typeof(TaskTypeEnum).GetEnumIndexList();
        public List<int> TaskOutboundTypes => typeof(TaskTypeEnum).GetEnumIndexList().Where(x => x >= 100 && x < 500).ToList();
        public TaskService(ITaskRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IStockRepository stockRepository, IBasicService basicService, IRecordService recordService, IStockService stockService, IBasicRepository basicRepository, IApiInfoRepository apiInfoRepository, IInvokeERPService invokeERPService, IPalletTypeInfoRepository palletTypeInfoRepository, IAGVStationInfoRepository agvStationInfoRepository) : base(BaseDal)
        {
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Completed.cs
@@ -34,7 +34,7 @@
                }
                else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
                {
                    return await Task.FromResult(RelocationTaskCompleted(task));
                    return await Task.FromResult(OutboundTaskCompleted(task));
                }
                else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
                {
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs
@@ -4,6 +4,7 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
@@ -189,15 +190,15 @@
                }
                string roadwayNo = "";
                if (stockInfo.MaterielWide < 2200 && stockInfo.MaterielThickness > 800)
                if (stockInfo.MaterielThickness > 800)
                {
                    List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationType == LocationTypeEnum.Undefined.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("SC01_YL")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                    roadwayNo = locationCounts.OrderBy(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                }
                else if (stockInfo.MaterielWide>2200 && stockInfo.MaterielThickness>800)
                {
                    List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationType == LocationTypeEnum.Undefined.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && !x.RoadwayNo.Contains("SC01_YL")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                    roadwayNo = locationCounts.OrderBy(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                    List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationType == LocationTypeEnum.Undefined.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("YL")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                    roadwayNo = locationCounts.OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                    if (stockInfo.MaterielWide > 2200)
                    {
                        locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationType == LocationTypeEnum.Undefined.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && !x.RoadwayNo.Contains("SC01_YL")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                        roadwayNo = locationCounts.OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                    }
                }
                return !string.IsNullOrEmpty(roadwayNo) ? (roadwayNo) : throw new Exception("未找到可分配巷道");
            }
@@ -207,6 +208,80 @@
                throw new Exception(ex.Message);
            }
        }
        /// <summary>
        /// å…¥åº“完成
        /// </summary>
        public WebResponseContent InboundTaskCompleted(Dt_Task task)
        {
            try
            {
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == task.WarehouseId);
                if (warehouse.WarehouseCode == WarehouseEnum.LLDCP.ToString()) //成品完成
                {
                    Dt_LocationInfo locationInfoEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                    if (locationInfoEnd == null)
                    {
                        return WebResponseContent.Instance.Error($"未找到对应的终点货位信息");
                    }
                    Dt_AGVStationInfo agvstation = _agvStationInfoRepository.QueryFirst(x => x.AGVStationCode == task.SourceAddress && x.StationArea == AGVStationAreaEnum.AreaA.ObjToInt());
                    if (agvstation != null)
                    {
                        agvstation.IsOccupied = WhetherEnum.False.ObjToInt();
                    }
                    Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == task.PalletCode);
                    if (proStockInfo != null && proStockInfo.StockStatus == StockStatusEmun.MES空托退库.ObjToInt())
                    {
                        task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                        _unitOfWorkManage.BeginTran();
                        if (agvstation != null)
                        {
                            _agvStationInfoRepository.UpdateData(agvstation);
                        }
                        proStockInfo.LocationCode = locationInfoEnd.LocationCode;
                        proStockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                        _stockRepository.ProStockInfoRepository.UpdateData(proStockInfo);
                        _basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, proStockInfo.PalletType, LocationStatusEnum.InStock, proStockInfo.WarehouseId);
                        BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                        _unitOfWorkManage.CommitTran();
                    }
                    else
                    {
                        return WebResponseContent.Instance.Error($"未找到对应库存信息");
                    }
                }
                else//原料库完成
                {
                    Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.PalletCode == task.PalletCode);
                    if (stockInfo == null)
                    {
                        return WebResponseContent.Instance.Error($"未找到对应库存信息");
                    }
                    Dt_LocationInfo locationInfoEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                    if (locationInfoEnd == null)
                    {
                        return WebResponseContent.Instance.Error($"未找到对应的终点货位信息");
                    }
                    task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                    _unitOfWorkManage.BeginTran();
                    stockInfo.LocationCode = locationInfoEnd.LocationCode;
                    stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                    _stockService.StockInfoService.Repository.UpdateData(stockInfo);
                    _basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
                    BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                    _unitOfWorkManage.CommitTran();
                }
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// åˆ†é…æˆå“å··é“
        /// </summary>
        /// <returns></returns>
        public string AssignCPRoadwayNo()
        {
            try
@@ -219,7 +294,20 @@
                string roadwayNo = "";
                List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationType == LocationTypeEnum.Undefined.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("CP")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                roadwayNo = locationCounts.OrderBy(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                //获取当前入库任务中已分配巷道任务数量
                List<LocationCount> useLocationCounts = Db.Queryable<Dt_Task>().Where(x => x.WarehouseId == warehouse.WarehouseId
                && locationCounts.Select(j=>j.RoadwayNo).Contains(x.Roadway)
                && TaskInboundTypes.Contains(x.TaskType)).GroupBy(x => x.Roadway).Select(x => new LocationCount { RoadwayNo = x.Roadway, Count = SqlFunc.AggregateCount(x) }).ToList();
                foreach (var item in locationCounts)
                {
                    LocationCount? count = useLocationCounts.FirstOrDefault(x => x.RoadwayNo == item.RoadwayNo);
                    if (count!=null)
                    {
                        item.Count -= count.Count;
                    }
                }
                roadwayNo = locationCounts.OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                return !string.IsNullOrEmpty(roadwayNo) ? (roadwayNo) : throw new Exception("未找到可分配巷道");
            }
            catch (Exception ex)
@@ -337,112 +425,112 @@
        /// <param name="barCode"></param>
        /// <param name="startPoint"></param>
        /// <returns></returns>
        public WebResponseContent BackProductTask(string barCode, string startPoint)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string palletCode = @"^C\d{5}$";  // æ­£åˆ™è¡¨è¾¾å¼
                bool isValid = Regex.IsMatch(barCode, palletCode);
                if (!isValid)
                {
                    return content.Error($"框码格式错误{barCode}");
                }
                if (!OutStartPonits.Contains(startPoint))
                {
                    return content.Error($"起点错误{startPoint}");
                }
                //判断当前点位是否重复
                Dt_Task taskOldPoint = BaseDal.QueryFirst(x=>x.SourceAddress==startPoint && (x.TaskStatus == TaskStatusEnum.New.ObjToInt()||x.TaskStatus==TaskStatusEnum.Line_Execute.ObjToInt()|| x.TaskStatus == TaskStatusEnum.Line_Executing.ObjToInt() || x.TaskStatus == TaskStatusEnum.AGV_Takeing.ObjToInt()));
                if (taskOldPoint != null)
                {
                    return content.Error($"站点{startPoint}已存在任务");
                }
                Dt_Task taskOld = BaseDal.QueryFirst(x => x.PalletCode == barCode);
                if (taskOld != null)
                {
                    return content.Error($"胶框{barCode}任务已存在");
                }
                //获取胶框余料
                Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x=>x.PalletCode== barCode).Includes(x=>x.proStockInfoDetails).First();
                if (proStockInfo==null)
                {
                    return content.Error($"未找到{barCode}胶框信息");
                }
                if (proStockInfo.proStockInfoDetails==null || proStockInfo.proStockInfoDetails.Count<=0)
                {
                    return content.Error($"{barCode}胶框信息为空");
                }
                if (proStockInfo.StockStatus!=StockStatusEmun.出库完成.ObjToInt())
                {
                    return content.Error($"{barCode}胶框信息状态异常");
                }
                //获取成品平库
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
                if (proStockInfo.WarehouseId != warehouse.WarehouseId && proStockInfo.LocationCode!= "成品包装拣货区")
                {
                    return content.Error($"{barCode}胶框信息不在拣货区");
                }
                //获取当前的库存属性
                Dt_Warehouse? warePoint = null;
                switch (proStockInfo.ProStockAttribute)
                {
                    case (int)ProStockAttributeEnum.成品:
                        warePoint = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA71.ToString());
                        break;
                    case (int)ProStockAttributeEnum.尾数:
                        warePoint = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA72.ToString());
                        break;
                    case (int)ProStockAttributeEnum.研发:
                        warePoint = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA73.ToString());
                        break;
                    default:
                        throw new Exception($"未找到{barCode}胶框信息库存属性");
                }
                Dt_Warehouse warehouseLocation = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA71.ToString());
                Dt_LocationInfo locationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.WarehouseId == warehouseLocation.WarehouseId);
                if (locationInfo == null)
                {
                    return content.Error($"未找到{warehouse.WarehouseCode}货位信息");
                }
                proStockInfo.StockStatus = StockStatusEmun.成品余料回库.ObjToInt();
                proStockInfo.proStockInfoDetails.ForEach(x =>
                {
                    x.ProOutDetailStatus = StockStatusEmun.成品余料回库.ObjToInt();
                });
                Dt_Task newTask = new Dt_Task()
                {
                    CurrentAddress = startPoint,
                    Grade = 0,
                    NextAddress = "",
                    PalletCode = proStockInfo.PalletCode,
                    Roadway = locationInfo.RoadwayNo,
                    SourceAddress = startPoint,
                    TargetAddress = "",
                    TaskType = TaskTypeEnum.InProductBack.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = warePoint.WarehouseId,
                    PalletType = proStockInfo.PalletType,
                    MaterielCode = proStockInfo.proStockInfoDetails.Where(x => x.ProStockId == proStockInfo.Id).FirstOrDefault()?.ProductCode,
                    Quantity = (float)proStockInfo.proStockInfoDetails.Where(x => x.ProStockId == proStockInfo.Id).Sum(x => x.StockPcsQty)
                };
                _unitOfWorkManage.BeginTran();
                int taskId = BaseDal.AddData(newTask);
                newTask.TaskId = taskId;
                _stockRepository.ProStockInfoRepository.UpdateData(proStockInfo);
                _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfo.proStockInfoDetails);
                _unitOfWorkManage.CommitTran();
                //推送任务
                PushTasksToWCS(new List<Dt_Task> { newTask });
                content.OK("发送成功");
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
        //public WebResponseContent BackProductTask(string barCode, string startPoint)
        //{
        //    WebResponseContent content = new WebResponseContent();
        //    try
        //    {
        //        string palletCode = @"^C\d{5}$";  // æ­£åˆ™è¡¨è¾¾å¼
        //        bool isValid = Regex.IsMatch(barCode, palletCode);
        //        if (!isValid)
        //        {
        //            return content.Error($"框码格式错误{barCode}");
        //        }
        //        if (!OutStartPonits.Contains(startPoint))
        //        {
        //            return content.Error($"起点错误{startPoint}");
        //        }
        //        //判断当前点位是否重复
        //        Dt_Task taskOldPoint = BaseDal.QueryFirst(x=>x.SourceAddress==startPoint && (x.TaskStatus == TaskStatusEnum.New.ObjToInt()||x.TaskStatus==TaskStatusEnum.Line_Execute.ObjToInt()|| x.TaskStatus == TaskStatusEnum.Line_Executing.ObjToInt() || x.TaskStatus == TaskStatusEnum.AGV_Takeing.ObjToInt()));
        //        if (taskOldPoint != null)
        //        {
        //            return content.Error($"站点{startPoint}已存在任务");
        //        }
        //        Dt_Task taskOld = BaseDal.QueryFirst(x => x.PalletCode == barCode);
        //        if (taskOld != null)
        //        {
        //            return content.Error($"胶框{barCode}任务已存在");
        //        }
        //        //获取胶框余料
        //        Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x=>x.PalletCode== barCode).Includes(x=>x.proStockInfoDetails).First();
        //        if (proStockInfo==null)
        //        {
        //            return content.Error($"未找到{barCode}胶框信息");
        //        }
        //        if (proStockInfo.proStockInfoDetails==null || proStockInfo.proStockInfoDetails.Count<=0)
        //        {
        //            return content.Error($"{barCode}胶框信息为空");
        //        }
        //        if (proStockInfo.StockStatus!=StockStatusEmun.出库完成.ObjToInt())
        //        {
        //            return content.Error($"{barCode}胶框信息状态异常");
        //        }
        //        //获取成品平库
        //        Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
        //        if (proStockInfo.WarehouseId != warehouse.WarehouseId && proStockInfo.LocationCode!= "成品包装拣货区")
        //        {
        //            return content.Error($"{barCode}胶框信息不在拣货区");
        //        }
        //        //获取当前的库存属性
        //        Dt_Warehouse? warePoint = null;
        //        switch (proStockInfo.ProStockAttribute)
        //        {
        //            case (int)ProStockAttributeEnum.成品:
        //                warePoint = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA71.ToString());
        //                break;
        //            case (int)ProStockAttributeEnum.尾数:
        //                warePoint = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA72.ToString());
        //                break;
        //            case (int)ProStockAttributeEnum.研发:
        //                warePoint = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA73.ToString());
        //                break;
        //            default:
        //                throw new Exception($"未找到{barCode}胶框信息库存属性");
        //        }
        //        Dt_Warehouse warehouseLocation = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA71.ToString());
        //        Dt_LocationInfo locationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.WarehouseId == warehouseLocation.WarehouseId);
        //        if (locationInfo == null)
        //        {
        //            return content.Error($"未找到{warehouse.WarehouseCode}货位信息");
        //        }
        //        proStockInfo.StockStatus = StockStatusEmun.成品余料回库.ObjToInt();
        //        proStockInfo.proStockInfoDetails.ForEach(x =>
        //        {
        //            x.ProOutDetailStatus = StockStatusEmun.成品余料回库.ObjToInt();
        //        });
        //        Dt_Task newTask = new Dt_Task()
        //        {
        //            CurrentAddress = startPoint,
        //            Grade = 0,
        //            NextAddress = "",
        //            PalletCode = proStockInfo.PalletCode,
        //            Roadway = locationInfo.RoadwayNo,
        //            SourceAddress = startPoint,
        //            TargetAddress = "",
        //            TaskType = TaskTypeEnum.InProductBack.ObjToInt(),
        //            TaskStatus = TaskStatusEnum.New.ObjToInt(),
        //            WarehouseId = warePoint.WarehouseId,
        //            PalletType = proStockInfo.PalletType,
        //            MaterielCode = proStockInfo.proStockInfoDetails.Where(x => x.ProStockId == proStockInfo.Id).FirstOrDefault()?.ProductCode,
        //            Quantity = (float)proStockInfo.proStockInfoDetails.Where(x => x.ProStockId == proStockInfo.Id).Sum(x => x.StockPcsQty)
        //        };
        //        _unitOfWorkManage.BeginTran();
        //        int taskId = BaseDal.AddData(newTask);
        //        newTask.TaskId = taskId;
        //        _stockRepository.ProStockInfoRepository.UpdateData(proStockInfo);
        //        _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfo.proStockInfoDetails);
        //        _unitOfWorkManage.CommitTran();
        //        //推送任务
        //        PushTasksToWCS(new List<Dt_Task> { newTask });
        //        content.OK("发送成功");
        //    }
        //    catch (Exception ex)
        //    {
        //        _unitOfWorkManage.RollbackTran();
        //        content.Error(ex.Message);
        //    }
        //    return content;
        //}
        /// <summary>
        /// ç©ºæ¡†å›žåº“
        /// </summary>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs
@@ -20,6 +20,8 @@
using WIDESEA_Core.CodeConfigEnum;
using Microsoft.AspNetCore.Mvc;
using WIDESEA_DTO.ERP;
using WIDESEA_Common.MaterielEnum;
using WIDESEA_Common.WareHouseEnum;
namespace WIDESEA_TaskInfoService
{
@@ -78,6 +80,68 @@
            return content;
        }
        /// <summary>
        /// å‡ºåº“任务完成
        /// </summary>
        public WebResponseContent OutboundTaskCompleted(Dt_Task task)
        {
            try
            {
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == task.WarehouseId);
                if (warehouse.WarehouseCode == WarehouseEnum.LLDCP.ToString()) //成品完成
                {
                    Dt_LocationInfo locationInfoStart = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                    if (locationInfoStart == null)
                    {
                        return WebResponseContent.Instance.Error($"未找到对应的起点货位信息");
                    }
                    Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == task.PalletCode);
                    if (proStockInfo != null && proStockInfo.StockStatus==StockStatusEmun.出库锁定.ObjToInt())
                    {
                        task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                        _unitOfWorkManage.BeginTran();
                        proStockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                        _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfo,App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                        _basicService.LocationInfoService.UpdateLocationStatus(locationInfoStart, proStockInfo.PalletType, LocationStatusEnum.Free, proStockInfo.WarehouseId);
                        BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                        _unitOfWorkManage.CommitTran();
                    }
                    else
                    {
                        return WebResponseContent.Instance.Error($"未找到对应库存信息");
                    }
                }
                else//原料库完成
                {
                    Dt_LocationInfo locationInfoStart = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                    if (locationInfoStart == null)
                    {
                        return WebResponseContent.Instance.Error($"未找到对应的起点货位信息");
                    }
                    Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == task.PalletCode);
                    if (stockInfo != null && stockInfo.StockStatus == StockStatusEmun.出库锁定.ObjToInt())
                    {
                        task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                        _unitOfWorkManage.BeginTran();
                        stockInfo.StockStatus = StockStatusEmun.出库完成.ObjToInt();
                        _stockRepository.StockInfoRepository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                        _basicService.LocationInfoService.UpdateLocationStatus(locationInfoStart, stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
                        BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                        _unitOfWorkManage.CommitTran();
                    }
                    else
                    {
                        return WebResponseContent.Instance.Error($"未找到对应库存信息");
                    }
                }
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// åº“存数据转出库任务
        /// </summary>
        /// <param name="stockInfos"></param>
@@ -111,9 +175,9 @@
                            MaterielCode = stockInfo.MaterielCode,
                            Quantity = 0,
                        };
                        if (stockInfo.StockLength>0)
                        if (stockInfo.MaterielWide>0)
                        {
                            task.TaskLength = stockInfo.StockLength;
                            task.TaskLength = (int)stockInfo.MaterielWide;
                        }
                        tasks.Add(task);
                    }
@@ -121,6 +185,171 @@
            }
            return tasks;
        }
        public List<Dt_Task> GetTasks(List<Dt_ProStockInfo> stockInfos, TaskTypeEnum taskType)
        {
            List<Dt_Task> tasks = new List<Dt_Task>();
            for (int i = 0; i < stockInfos.Count; i++)
            {
                Dt_ProStockInfo stockInfo = stockInfos[i];
                if (stockInfo != null)
                {
                    Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode);
                    if (!tasks.Exists(x => x.PalletCode == stockInfo.PalletCode))
                    {
                        Dt_Task task = new()
                        {
                            CurrentAddress = stockInfo.LocationCode,
                            Grade = 0,
                            PalletCode = stockInfo.PalletCode,
                            NextAddress = "",
                            Roadway = locationInfo.RoadwayNo,
                            SourceAddress = stockInfo.LocationCode,
                            TargetAddress = "",
                            TaskStatus = TaskStatusEnum.New.ObjToInt(),
                            TaskType = taskType.ObjToInt(),
                            TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                            PalletType = stockInfo.PalletType,
                            WarehouseId = stockInfo.WarehouseId,
                            Quantity = 0,
                        };
                        tasks.Add(task);
                    }
                }
            }
            return tasks;
        }
        /// <summary>
        /// æˆå“å‡ºåº“
        /// </summary>
        /// <param name="Count"></param>
        /// <returns></returns>
        public WebResponseContent RequestCPWMSTaskOut(int Count)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                List<Dt_AGVStationInfo> aGVStationInfos = _agvStationInfoRepository.QueryData(x=>x.StationArea==AGVStationAreaEnum.AreaA.ObjToInt() && x.IsOccupied==WhetherEnum.False.ObjToInt());
                if (aGVStationInfos.Count< Count)
                {
                    return content.Error($"可用缓存数不足");
                }
                List<Dt_ProStockInfo> stockInfos = _stockRepository.ProStockInfoRepository.QueryData(x => x.ProStockAttribute == ProStockAttributeEnum.空托.ObjToInt() && x.StockStatus == StockStatusEmun.入库完成.ObjToInt()).OrderBy(x=>x.CreateDate).Take(Count).ToList();
                List<Dt_LocationInfo> locationInfos = _basicRepository.LocationInfoRepository.QueryData(x => stockInfos.Select(x => x.LocationCode).Contains(x.LocationCode));
                if (stockInfos.Count < Count)
                {
                    return content.Error($"库存数量不足");
                }
                foreach (var item in stockInfos)
                {
                    Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == item.LocationCode);
                    if (locationInfo != null && (locationInfo.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || locationInfo.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
                    {
                        item.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                    }
                    else
                    {
                        return content.Error($"货位状态不正确");
                    }
                }
                List<Dt_Task> tasks = GetTasks(stockInfos, TaskTypeEnum.OutProduct);
                if (tasks == null || tasks.Count <= 0)
                {
                    return content.Error($"生成任务失败");
                }
                for (int i = 0; i < tasks.Count; i++)
                {
                    aGVStationInfos[i].IsOccupied = WhetherEnum.True.ObjToInt();
                    tasks[i].TargetAddress = aGVStationInfos[i].AGVStationCode;
                }
                //判断是否有出库单信息
                _unitOfWorkManage.BeginTran();
                //更新库存状态
                _stockRepository.ProStockInfoRepository.UpdateData(stockInfos);
                _agvStationInfoRepository.UpdateData(aGVStationInfos);
                //更新货位状态
                _basicRepository.LocationInfoRepository.UpdateLocationStatus(locationInfos, LocationStatusEnum.Lock);
                //加入货位变动记录
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, taskNums: tasks.Select(x => x.TaskNum).ToList());
                //新建任务
                BaseDal.AddData(tasks);
                _unitOfWorkManage.CommitTran();
                PushTasksToWCS(tasks);
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// åŽŸæ–™å‡ºåº“ä»»åŠ¡
        /// </summary>
        /// <param name="materielCode">物料代码</param>
        /// <param name="materielWide">物料幅宽</param>
        /// <param name="Count">卷数</param>
        /// <returns></returns>
        public WebResponseContent RequestYLWMSTaskOut(string materielCode, int materielWide, int Count)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取对应库存
                List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.QueryData(x=>x.MaterielCode==materielCode && x.MaterielWide== materielWide && x.StockStatus==StockStatusEmun.入库完成.ObjToInt()).OrderBy(x=>x.CreateDate).Take(Count).ToList();
                if (stockInfos.Count< Count)
                {
                    return content.Error($"库存{materielCode}数量不足");
                }
                //获取货位
                List<Dt_LocationInfo> locationInfos = _basicRepository.LocationInfoRepository.QueryData(x => stockInfos.Select(x => x.LocationCode).Contains(x.LocationCode));
                foreach (var item in stockInfos)
                {
                    Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x=>x.LocationCode==item.LocationCode);
                    if (locationInfo!=null && (locationInfo.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || locationInfo.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
                    {
                        item.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                    }
                    else
                    {
                        return content.Error($"货位状态不正确");
                    }
                }
                TaskTypeEnum taskTypeEnum = new();
                if (stockInfos.FirstOrDefault()?.MaterielInvOrgId==MaterielInvOrgEnum.老厂.ObjToInt())
                {
                    taskTypeEnum = TaskTypeEnum.OldOutbound;
                }
                else
                {
                    taskTypeEnum = TaskTypeEnum.Outbound;
                }
                List<Dt_Task> tasks = GetTasks(stockInfos, taskTypeEnum);
                if (tasks == null || tasks.Count <= 0)
                {
                    return content.Error($"生成任务失败");
                }
                //判断是否有出库单信息
                _unitOfWorkManage.BeginTran();
                //更新库存状态
                _stockRepository.StockInfoRepository.UpdateData(stockInfos);
                //更新货位状态
                _basicRepository.LocationInfoRepository.UpdateLocationStatus(locationInfos, LocationStatusEnum.Lock);
                //加入货位变动记录
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos,  LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation,taskNums:tasks.Select(x=>x.TaskNum).ToList());
                //新建任务
                BaseDal.AddData(tasks);
                _unitOfWorkManage.CommitTran();
                PushTasksToWCS(tasks);
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Reloaction.cs
@@ -8,8 +8,10 @@
using WIDESEA_Common.OtherEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.Task;
using WIDESEA_Model.Models;
@@ -126,37 +128,6 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent InboundTaskCompleted(Dt_Task task)
        {
            try
            {
                Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.PalletCode == task.PalletCode);
                if (stockInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到对应库存信息");
                }
                Dt_LocationInfo locationInfoEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                if (locationInfoEnd == null)
                {
                    return WebResponseContent.Instance.Error($"未找到对应的终点货位信息");
                }
                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                FeedBackWCSTaskCompleted(task.TaskNum);
                _unitOfWorkManage.BeginTran();
                stockInfo.LocationCode = locationInfoEnd.LocationCode;
                stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                _stockService.StockInfoService.Repository.UpdateData(stockInfo);
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                _unitOfWorkManage.CommitTran();
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent RelocationTaskCompleted(Dt_Task task)
        {
            try
@@ -196,5 +167,54 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent IsRelocation(string startAddress,string endAddress,string roadWay)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取货位
                Dt_LocationInfo startLocationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == startAddress);
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.LocationCode == startAddress);
                Dt_LocationInfo endLocationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == endAddress);
                if (startLocationInfo != null && startLocationInfo.LocationStatus==LocationStatusEnum.InStock.ObjToInt() && endLocationInfo != null && endLocationInfo.LocationStatus==LocationStatusEnum.Free.ObjToInt() && endLocationInfo.EnableStatus==EnableStatusEnum.Normal.ObjToInt() && stockInfo!=null)
                {
                    Dt_Task newTask = new Dt_Task()
                    {
                        Roadway = roadWay,
                        WarehouseId = stockInfo.WarehouseId,
                        CurrentAddress = startLocationInfo.LocationCode,
                        Grade = 99,
                        NextAddress = endLocationInfo.LocationCode,
                        OrderNo = "",
                        PalletCode = stockInfo.PalletCode,
                        PalletType = stockInfo.PalletType,
                        SourceAddress = startLocationInfo.LocationCode,
                        TargetAddress = endLocationInfo.LocationCode,
                        TaskNum = Repository.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                        TaskStatus = 0,
                        TaskType = TaskTypeEnum.Relocation.ObjToInt()
                    };
                    stockInfo.StockStatus = StockStatusEmun.移库锁定.ObjToInt();
                    _unitOfWorkManage.BeginTran();
                    Repository.AddData(newTask);
                    _basicService.LocationInfoService.UpdateLocationStatus(startLocationInfo, stockInfo.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
                    _basicService.LocationInfoService.UpdateLocationStatus(endLocationInfo, stockInfo.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
                    _stockService.StockInfoService.Repository.UpdateData(stockInfo);
                    _unitOfWorkManage.CommitTran();
                    PushTasksToWCS(new List<Dt_Task> { newTask });
                    content.OK("成功");
                }
                else
                {
                    content.Error("库存货位信息为空");
                }
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs
@@ -57,17 +57,7 @@
        {
            return Service.AssignInboundTaskLocationByHeight(taskNum, roadwayNo, heightType);
        }
        /// <summary>
        /// æˆå“ä½™æ–™é€€åº“入仓
        /// </summary>
        /// <param name="barCode"></param>
        /// <param name="startPoint"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("BackProductTask"), AllowAnonymous]
        public WebResponseContent BackProductTask(string barCode, string startPoint)
        {
            return Service.BackProductTask(barCode, startPoint);
        }
        /// <summary>
        /// æˆå“ç©ºæ¡†å›žåº“
        /// </summary>
@@ -182,5 +172,39 @@
        {
            return Service.RequestYLWMSTaskSimple(stationCode,palletCode);
        }
        /// <summary>
        /// æˆå“å‡ºåº“任务请求
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("RequestCPWMSTaskOut"), AllowAnonymous]
        public WebResponseContent RequestCPWMSTaskOut(int Count)
        {
            return Service.RequestCPWMSTaskOut(Count);
        }
        /// <summary>
        /// åŽŸæ–™å‡ºåº“ä»»åŠ¡
        /// </summary>
        /// <param name="materielCode">物料代码</param>
        /// <param name="materielWide">物料幅宽</param>
        /// <param name="Count">卷数</param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("RequestYLWMSTaskOut"), AllowAnonymous]
        public WebResponseContent RequestYLWMSTaskOut(string materielCode,int materielWide, int Count)
        {
            return Service.RequestYLWMSTaskOut(materielCode, materielWide, Count);
        }
        /// <summary>
        /// åŽŸæ–™ç§»åº“ä»»åŠ¡
        /// </summary>
        /// <param name="startAddress"></param>
        /// <param name="endAddress"></param>
        /// <param name="roadWay"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("Relocation"), AllowAnonymous]
        public WebResponseContent IsRelocation(string startAddress, string endAddress, string roadWay)
        {
            return Service.IsRelocation(startAddress, endAddress, roadWay);
        }
    }
}
ÏîÄ¿×ÊÁÏ/¼¼ÊõЭÒé/ÀûÍØÏµÍ³¶ÔÁúÀûµÃ¶þÆÚϵͳµÄÐèÇó.docx
Binary files differ
ÏîÄ¿×ÊÁÏ/¼¼ÊõЭÒé/ÁúÀûµÃÏîÄ¿¶Ô½Ó¼Ç¼.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/MES.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/ÁúÀûµÂµãλ.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/Ô­ÁÏ¿âÊäËÍÏßͨѶЭÒé.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/³ÉÆ·ÊäËÍÏßͨѶЭÒé_20250707.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/ͨÐÅЭÒé/ÁúÀûµÃÈí¼þ¼Æ»®±í.xlsx
Binary files differ