wangxinhui
2025-01-04 ca08d1f380987254814242e2fe3ea9de28228132
代码更新
已删除10个文件
已修改16个文件
已添加2个文件
408 ■■■■ 文件已修改
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/543d3d70-8433-4b19-aabd-dfd52610493b.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/7c7b1759-5019-4f27-bae4-4d1504711d68.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/AGVController.cs 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/Task/TaskController.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/HostedService/WarehouseHostedService.cs 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/AGV/AGVExtend.cs 96 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/测试架仓/GroundStationJob_CSJ.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/06b6ba59-2c2a-4213-bfcb-89a257c39dfa.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/3bdb0da1-c42c-4531-99e8-2d9f1d8c02e8.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/8c2e982d-ad7f-4e3a-9e0e-ad39ee70751d.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/aa4fa866-107a-485b-b7b2-6e3b1ee2a3e0.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/b53658fa-fd6e-4ffe-a47a-525d35036fa2.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/be46b995-1948-4e27-9de5-d740316e7adb.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/d09639a2-a943-4bea-b5bf-74c7d0c7ecaf.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/d8be537b-48e7-4c4e-b402-59d20119ef7a.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/e4d2b89c-c9d8-4512-858a-0ac416e979cb.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/f68413a2-ad64-418c-b6b3-1cbbe0a09b03.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IRecordService/ILocationStatusChangeRecordService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/WIDESEA_InboundService.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_RecordService/Service/LocationStatusChangeRecordService.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Inbound.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Reloaction.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/543d3d70-8433-4b19-aabd-dfd52610493b.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/7c7b1759-5019-4f27-bae4-4d1504711d68.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs
@@ -49,18 +49,18 @@
        AGV_Executing = 310,
        /// <summary>
        /// AGV完成
        /// </summary>
        [Description("AGV完成")]
        AGV_Finish = 330,
        /// <summary>
        /// AGV待继续执行
        /// </summary>
        [Description("AGV待继续执行")]
        AGV_WaitToExecute = 320,
        /// <summary>
        /// AGV完成
        /// </summary>
        [Description("AGV完成")]
        AGV_Finish = 330,
        /// <summary>
        /// ä»»åŠ¡å®Œæˆ
        /// </summary>
        [Description("任务完成")]
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -157,5 +157,7 @@
        /// <param name="agvUpdateModel"></param>
        /// <returns></returns>
        AgvResponseContent AgvUpdateTask(AgvUpdateDTO agvUpdateModel);
        WebResponseContent SendSecureReplyToAgv(int taskNum);
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/AGVController.cs
@@ -29,6 +29,9 @@
            _taskService = taskService;
            _taskRepository = taskRepository;
        }
        /// <summary>
        /// å®‰å…¨ä¿¡å·ç”³è¯· AGV-WCS
        /// </summary>
@@ -41,23 +44,23 @@
            agvResponseContent.ReqCode = secureApplyModel.ReqCode;
            try
            {
                var task = _taskRepository.QueryFirst(x => secureApplyModel.TaskCode== x.AgvTaskNum);
                var task = _taskRepository.QueryFirst(x => secureApplyModel.TaskCode == x.AgvTaskNum);
                if (task == null) throw new Exception("未找到任务");
                if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt())
                {
                    var content = TakeRequest(task.CurrentAddress);
                    if (!content.Status)
                    {
                        throw new Exception(content.Message);
                    }
                    //if (!content.Status)
                    //{
                    //    throw new Exception(content.Message);
                    //}
                }
                else
                {
                    var content = PutRequest(task.NextAddress, task.PalletType);
                    if (!content.Status)
                    {
                        throw new Exception(content.Message);
                    }
                    //if (!content.Status)
                    //{
                    //    throw new Exception(content.Message);
                    //}
                }
                task.TaskState = TaskStatusEnum.AGV_WaitToExecute.ObjToInt();
                var up = _taskRepository.UpdateData(task);
@@ -109,12 +112,12 @@
                            if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt())
                            {
                                var content = TakeRequest(task.CurrentAddress);
                                if (!content.Status) throw new Exception(content.Message);
                                //if (!content.Status) throw new Exception(content.Message);
                            }
                            else
                            {
                                var content = PutRequest(task.NextAddress, task.PalletType);
                                if (!content.Status) throw new Exception(content.Message);
                                //if (!content.Status) throw new Exception(content.Message);
                            }
                            task.TaskState = TaskStatusEnum.AGV_WaitToExecute.ObjToInt();
                            var up = _taskRepository.UpdateData(task);
@@ -127,14 +130,14 @@
                        {
                            var content = PutFinish(task.NextAddress);
                            if (!content.Status) throw new Exception(content.Message);
                            Dt_StationManger dt_Station=_stationMangerRepository.QueryFirst(x=>x.AGVStationCode== task.NextAddress);
                            if (dt_Station==null)
                            Dt_StationManger dt_Station = _stationMangerRepository.QueryFirst(x => x.AGVStationCode == task.NextAddress);
                            if (dt_Station == null)
                            {
                                throw new Exception($"{task.NextAddress}AGV站台未定义");
                            }
                            task.CurrentAddress = dt_Station.StationCode;
                            task.NextAddress = "";
                            task.TaskState = TaskStatusEnum.SC_Execute.ObjToInt();
                            task.TaskState = TaskStatusEnum.AGV_Finish.ObjToInt();
                            task.DeviceCode = "SC01_CSJ";
                            var up = _taskRepository.UpdateData(task);
                            agvResponseContent.Code = up ? "0" : "1";
@@ -188,6 +191,7 @@
                bool canPut = otherDevice.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanPut, stationManger.StationCode);
                if (canPut)
                {
                    otherDevice.SetValue(GroundStationDBName.W_PutRequest, true, stationManger.StationCode);
                    return WebResponseContent.Instance.OK();
                }
                else
@@ -271,6 +275,7 @@
                bool canPut = otherDevice.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanTake, stationManger.StationCode);
                if (canPut)
                {
                    otherDevice.SetValue(GroundStationDBName.W_TakeRequest, true, stationManger.StationCode);
                    return WebResponseContent.Instance.OK();
                }
                else
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/Task/TaskController.cs
@@ -54,5 +54,16 @@
        {
            return Service.RollbackTaskStatusToLast(taskNum);
        }
        /// <summary>
        /// å›žå¤AGV安全信号
        /// </summary>
        /// <param name="taskNum"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("SendSecureReplyToAgv")]
        public WebResponseContent SendSecureReplyToAgv(int taskNum)
        {
            return Service.SendSecureReplyToAgv(taskNum);
        }
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/HostedService/WarehouseHostedService.cs
@@ -21,34 +21,40 @@
        public Task StartAsync(CancellationToken cancellationToken)
        {
            string connStr = AppSettings.GetValue("WMSConnectionStrings");
            if (string.IsNullOrEmpty(connStr))
            try
            {
                throw new Exception("WMS连接字符串错误");
                string connStr = AppSettings.GetValue("WMSConnectionStrings");
                if (string.IsNullOrEmpty(connStr))
                {
                    throw new Exception("WMS连接字符串错误");
                }
                SqlSugarClient sugarClient = new(new ConnectionConfig()
                {
                    ConnectionString = connStr,
                    IsAutoCloseConnection = true,
                    DbType = DbType.SqlServer
                });
                //List<Dt_Warehouse> warehouses = sugarClient.Queryable<Dt_Warehouse>().ToList();
                //_dbContext.Db.Deleteable<Dt_Warehouse>().ExecuteCommand();
                //_dbContext.Db.Insertable(warehouses).ExecuteCommand();
                List<Dt_ApiInfo> apiInfos = _dbContext.Db.Queryable<Dt_ApiInfo>().ToList();
                _cacheService.AddOrUpdate(nameof(apiInfos), apiInfos);
            }
            SqlSugarClient sugarClient = new(new ConnectionConfig()
            catch (Exception ex)
            {
                ConnectionString = connStr,
                IsAutoCloseConnection = true,
                DbType = DbType.SqlServer
            });
            List<Dt_Warehouse> warehouses = sugarClient.Queryable<Dt_Warehouse>().ToList();
            _dbContext.Db.Deleteable<Dt_Warehouse>().ExecuteCommand();
            _dbContext.Db.Insertable(warehouses).ExecuteCommand();
            List<Dt_ApiInfo> apiInfos = _dbContext.Db.Queryable<Dt_ApiInfo>().ToList();
            _cacheService.AddOrUpdate(nameof(apiInfos), apiInfos);
                Console.WriteLine(ex.ToString());
            }
            return Task.CompletedTask;
        }
        public Task StopAsync(CancellationToken cancellationToken)
        {
            throw new NotImplementedException();
            return Task.CompletedTask;
        }
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -27,6 +27,7 @@
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_DTO.Agv;
using WIDESEAWCS_Common.APIEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
@@ -44,6 +45,7 @@
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Repository;
using WIDESEAWCS_QuartzJob.Service;
using WIDESEAWCS_TaskInfoRepository;
using ICacheService = WIDESEAWCS_Core.Caches.ICacheService;
namespace WIDESEAWCS_TaskInfoService
@@ -231,7 +233,7 @@
                _taskExecuteDetailService.AddTaskExecuteDetail(tasks.Select(x => x.TaskNum).ToList(), "接收WMS任务");
                content = WebResponseContent.Instance.OK("成功");
                content = tasks.Count > 0 ? WebResponseContent.Instance.OK("成功") : WebResponseContent.Instance.Error("失败");
            }
            catch (Exception ex)
            {
@@ -469,5 +471,35 @@
            }
            return content;
        }
        public WebResponseContent SendSecureReplyToAgv(int taskNum)
        {
            try
            {
                Dt_Task WaitToTask = BaseDal.QueryFirst(x => x.TaskState == TaskStatusEnum.AGV_WaitToExecute.ObjToInt() && x.TaskNum == taskNum);
                AgvSecureReplyDTO replyDTO = new AgvSecureReplyDTO()
                {
                    ReqCode = Guid.NewGuid().ToString().Replace("-", ""), //WaitToTask.TaskNum.ToString(),
                    taskCode = WaitToTask.AgvTaskNum,
                };
                WebResponseContent content = AgvSecureReply(replyDTO);
                if (content.Status)
                {
                    WaitToTask.TaskState = TaskStatusEnum.AGV_Executing.ObjToInt();
                }
                else
                {
                    WaitToTask.TaskState = TaskStatusEnum.Exception.ObjToInt();
                    WaitToTask.ExceptionMessage = content.Message;
                }
                UpdateData(WaitToTask);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/AGV/AGVExtend.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_DTO.Agv;
@@ -8,6 +9,8 @@
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Model.Models;
using static Dm.net.buffer.ByteArrayBuffer;
using WIDESEAWCS_QuartzJob;
namespace WIDESEAWCS_Tasks
{
@@ -23,11 +26,13 @@
                var newTasks = _taskService.Db.Queryable<Dt_Task>().Where(x => x.TaskState == TaskStatusEnum.AGV_Execute.ObjToInt()).ToList().OrderBy(x => x.Grade).ThenBy(x => x.CreateDate).ToList();
                foreach (var agvTask in newTasks)
                {
                    AgvTaskDTO taskDTO = new AgvTaskDTO()
                    try
                    {
                        ReqCode = Guid.NewGuid().ToString().Replace("-", ""),
                        TaskTyp = AgvTaskType(agvTask.TaskType, agvTask.DeviceCode),
                        PositionCodePath = new List<CodePath>()
                        AgvTaskDTO taskDTO = new AgvTaskDTO()
                        {
                            ReqCode = Guid.NewGuid().ToString().Replace("-", ""),
                            TaskTyp = AgvTaskType(agvTask.TaskType, agvTask.DeviceCode),
                            PositionCodePath = new List<CodePath>()
                        {
                            new CodePath()
                            {
@@ -40,27 +45,35 @@
                                positionCode=agvTask.NextAddress
                            }
                        },
                        TaskCode = agvTask.AgvTaskNum,
                        PodTyp = agvTask.PalletType < 3 ? "XX" : "DD",
                    };
                    WebResponseContent content = _taskService.AgvSendTask(taskDTO);
                    if (content.Status)
                    {
                        agvTask.TaskState = TaskStatusEnum.AGV_Executing.ObjToInt();
                        //agvTask.Remark = content.Data.ObjToString();
                            TaskCode = agvTask.AgvTaskNum,
                            PodTyp = agvTask.PalletType < 3 ? "XX" : "DD",
                        };
                        WebResponseContent content = _taskService.AgvSendTask(taskDTO);
                        if (content.Status)
                        {
                            agvTask.TaskState = TaskStatusEnum.AGV_Executing.ObjToInt();
                            //agvTask.Remark = content.Data.ObjToString();
                        }
                        else
                        {
                            agvTask.TaskState = TaskStatusEnum.Exception.ObjToInt();
                            //agvTask.Remark = content.Data.ObjToString();
                            agvTask.ExceptionMessage = content.Message;
                        }
                    }
                    else
                    catch (Exception ex)
                    {
                        agvTask.TaskState = TaskStatusEnum.Exception.ObjToInt();
                        //agvTask.Remark = content.Data.ObjToString();
                        agvTask.ExceptionMessage = content.Message;
                        agvTask.ExceptionMessage = ex.Message;
                        WriteError(nameof(AGVJob), ex.Message, ex);
                    }
                }
                _taskService.UpdateData(newTasks);
            }
            catch (Exception ex)
            {
                Console.Out.WriteLine(nameof(AGVJob) + ":" + ex.Message);
                WriteError(nameof(AGVJob), ex.Message, ex);
            }
        }
        /// <summary>
@@ -73,6 +86,57 @@
                var WaitToTasks = _taskService.Db.Queryable<Dt_Task>().Where(x => x.TaskState == TaskStatusEnum.AGV_WaitToExecute.ObjToInt()).ToList().OrderBy(x => x.Grade).ThenBy(x => x.CreateDate).ToList();
                foreach (var WaitToTask in WaitToTasks)
                {
                    if(WaitToTask.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
                    {
                        Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.AGVStationCode == WaitToTask.NextAddress);
                        if (stationManger == null)
                        {
                            continue;
                        }
                        IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManger.StationDeviceCode);
                        if (device == null)
                        {
                            continue;
                        }
                        OtherDevice otherDevice = (OtherDevice)device;
                        bool canPut = otherDevice.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanPut, stationManger.StationCode);
                        bool requestPut = otherDevice.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_PutRequest, stationManger.StationCode);
                        if(!requestPut)
                        {
                            otherDevice.SetValue(GroundStationDBName.W_PutRequest, true, stationManger.StationCode);
                            continue;
                        }
                        else if (!canPut)
                        {
                            continue;
                        }
                    }
                    else
                    {
                        Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.AGVStationCode == WaitToTask.CurrentAddress);
                        if (stationManger == null)
                        {
                            continue;
                        }
                        IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManger.StationDeviceCode);
                        if (device == null)
                        {
                            continue;
                        }
                        OtherDevice otherDevice = (OtherDevice)device;
                        bool canTake = otherDevice.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanTake, stationManger.StationCode);
                        bool requestTake = otherDevice.GetValue<GroundStationDBName, bool>(GroundStationDBName.W_TakeRequest, stationManger.StationCode);
                        if (!requestTake)
                        {
                            otherDevice.SetValue(GroundStationDBName.W_TakeRequest, true, stationManger.StationCode);
                            continue;
                        }
                        else if (!canTake)
                        {
                            continue;
                        }
                    }
                    AgvSecureReplyDTO replyDTO = new AgvSecureReplyDTO()
                    {
                        ReqCode = Guid.NewGuid().ToString().Replace("-", ""), //WaitToTask.TaskNum.ToString(),
@@ -114,7 +178,7 @@
                        else return "22";
                    }
                default:
                    throw new NotImplementedException();
                    throw new Exception($"设备编号错误");
            }
        }
    }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/²âÊԼܲÖ/GroundStationJob_CSJ.cs
@@ -74,7 +74,7 @@
                        }
                        if (item.StationType == StationTypeEnum.StationType_OnlyInbound.ObjToInt())
                        {
                            Dt_Task task = _taskRepository.QueryFirst(x => (x.TargetAddress == item.StackerCraneCode || string.IsNullOrEmpty(x.TargetAddress) || x.NextAddress == item.StackerCraneCode || string.IsNullOrEmpty(x.NextAddress)) && (x.TaskState == TaskStatusEnum.New.ObjToInt() || x.TaskState == TaskStatusEnum.SC_Execute.ObjToInt()) && x.SourceAddress == item.StationCode || x.CurrentAddress==item.AGVStationCode);
                            Dt_Task task = _taskRepository.QueryFirst(x => (x.TargetAddress == item.StackerCraneCode || string.IsNullOrEmpty(x.TargetAddress) || x.NextAddress == item.StackerCraneCode || string.IsNullOrEmpty(x.NextAddress)) && (x.TaskState == TaskStatusEnum.New.ObjToInt() || x.TaskState == TaskStatusEnum.AGV_Finish.ObjToInt()) && (x.SourceAddress == item.StationCode || x.CurrentAddress == item.AGVStationCode || x.CurrentAddress == item.StationCode));
                            if (task != null)
                            {
                                string oldAddress = task.NextAddress;
@@ -91,6 +91,7 @@
                                    WriteInfo(item.StationName, $"请求分配货位返回信息错误,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                    break;
                                }
                                task.TaskState = TaskStatusEnum.SC_Execute.ObjToInt();
                                task.CurrentAddress = stationManger.StackerCraneStationCode;
                                task.TargetAddress = locationCode;
                                task.NextAddress = locationCode;
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/06b6ba59-2c2a-4213-bfcb-89a257c39dfa.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/3bdb0da1-c42c-4531-99e8-2d9f1d8c02e8.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/8c2e982d-ad7f-4e3a-9e0e-ad39ee70751d.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/aa4fa866-107a-485b-b7b2-6e3b1ee2a3e0.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/b53658fa-fd6e-4ffe-a47a-525d35036fa2.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/be46b995-1948-4e27-9de5-d740316e7adb.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/d09639a2-a943-4bea-b5bf-74c7d0c7ecaf.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/d8be537b-48e7-4c4e-b402-59d20119ef7a.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/e4d2b89c-c9d8-4512-858a-0ac416e979cb.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/f68413a2-ad64-418c-b6b3-1cbbe0a09b03.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IRecordService/ILocationStatusChangeRecordService.cs
@@ -15,7 +15,7 @@
    {
        ILocationStatusChangeRecordRepository Repository { get; }
        void AddLocationStatusChangeRecord(Dt_LocationInfo locationInfo, LocationStatusEnum lastStatus, LocationChangeType changeType, string? orderNo = null, int? taskNum = null);
        void AddLocationStatusChangeRecord(Dt_LocationInfo locationInfo, LocationStatusEnum lastStatus, LocationStatusEnum newStatus, LocationChangeType changeType, string? orderNo = null, int? taskNum = null);
        void AddLocationStatusChangeRecord(List<Dt_LocationInfo> locationInfos, LocationStatusEnum newStatus, LocationChangeType changeType, string? orderNo = null, List<int>? taskNums = null);
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs
@@ -25,6 +25,7 @@
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.ERP;
using WIDESEA_DTO.Inbound;
using WIDESEA_DTO.MES;
using WIDESEA_External.ERPService;
using WIDESEA_External.Model;
using WIDESEA_IBasicRepository;
@@ -35,6 +36,7 @@
using WIDESEA_IStockRepository;
using WIDESEA_IStockService;
using WIDESEA_ITaskInfoRepository;
using WIDESEA_ITaskInfoService;
using WIDESEA_Model.Models;
using WIDESEA_StockRepository;
@@ -414,6 +416,14 @@
                _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
                _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.MaterielGroup);
                _unitOfWorkManage.CommitTran();
                //if (warehouse.WarehouseCode==WarehouseEnum.HA153.ToString())
                //{
                //    //同步测试架信息
                //    foreach (var model in models)
                //    {
                //        _taskService.TestSynStock(new TestToolSynInfo() { ToolCode = model.LotNo, Life = Initiallife });
                //    }
                //}
                content.OK();
            }
            catch (Exception ex)
@@ -526,6 +536,11 @@
                }
                _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.MaterielGroup);
                _unitOfWorkManage.CommitTran();
                //同步测试架信息
                //foreach (var model in models)
                //{
                //    _taskService.TestSynStock(new TestToolSynInfo() { ToolCode = model.LotNo, Life = Initiallife });
                //}
                content.OK();
            }
            catch (Exception ex)
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/WIDESEA_InboundService.csproj
@@ -14,6 +14,7 @@
    <ProjectReference Include="..\WIDESEA_IRecordService\WIDESEA_IRecordService.csproj" />
    <ProjectReference Include="..\WIDESEA_IStockService\WIDESEA_IStockService.csproj" />
    <ProjectReference Include="..\WIDESEA_ITaskInfoRepository\WIDESEA_ITaskInfoRepository.csproj" />
    <ProjectReference Include="..\WIDESEA_ITaskInfoService\WIDESEA_ITaskInfoService.csproj" />
  </ItemGroup>
</Project>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_RecordService/Service/LocationStatusChangeRecordService.cs
@@ -19,13 +19,13 @@
{
    public partial class LocationStatusChangeRecordService : ServiceBase<Dt_LocationStatusChangeRecord, ILocationStatusChangeRecordRepository>, ILocationStatusChangeRecordService
    {
        public void AddLocationStatusChangeRecord(Dt_LocationInfo locationInfo, LocationStatusEnum lastStatus, LocationChangeType changeType, string? orderNo = null, int? taskNum = null)
        public void AddLocationStatusChangeRecord(Dt_LocationInfo locationInfo, LocationStatusEnum lastStatus, LocationStatusEnum newStatus, LocationChangeType changeType, string? orderNo = null, int? taskNum = null)
        {
            try
            {
                Dt_LocationStatusChangeRecord locationStatusChangeRecord = new Dt_LocationStatusChangeRecord()
                {
                    AfterStatus = locationInfo.LocationStatus,
                    AfterStatus = newStatus.ObjToInt(),
                    BeforeStatus = lastStatus.ObjToInt(),
                    ChangeType = changeType.ObjToInt(),
                    LocationCode = locationInfo.LocationCode,
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs
@@ -28,6 +28,8 @@
{
    public partial class TaskService
    {
        static object lock_out = new object();
        /// <summary>
        /// æµ‹è¯•架出仓
        /// </summary>
@@ -35,67 +37,82 @@
        /// <returns></returns>
        public MesResponseContent TestToolOut(TestToolOutModel model)
        {
            MesResponseContent responseContent = new MesResponseContent();
            try
            lock (lock_out)
            {
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA64.ToString());
                //获取库存记录
                List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x =>
                  x.WarehouseId == warehouse.WarehouseId &&
                  x.StockStatus == (int)StockStatusEmun.入库完成).Includes(x => x.Details).ToList();
                Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == model.ToolCode));
                if (stockInfo == null)
                MesResponseContent responseContent = new MesResponseContent();
                try
                {
                    return responseContent.Error($"测试架:{model.ToolCode}无可用库存");
                    Dt_Task exsit = Repository.QueryFirst(x => x.TargetAddress == model.TargetAddressCode);
                    if(exsit != null)
                    {
                        return responseContent.Error($"目标地址重复");
                    }
                    Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA64.ToString());
                    //获取库存记录
                    List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x =>
                      x.WarehouseId == warehouse.WarehouseId &&
                      x.StockStatus == (int)StockStatusEmun.入库完成).Includes(x => x.Details).ToList();
                    Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == model.ToolCode));
                    if (stockInfo == null)
                    {
                        return responseContent.Error($"测试架:{model.ToolCode}无可用库存");
                    }
                    Dt_Task exsit2 = Repository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
                    if (exsit2 != null)
                    {
                        return responseContent.Error($"测试架批次号重复");
                    }
                    Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode &&
                      x.WarehouseId == stockInfo.WarehouseId &&
                      x.LocationStatus == (int)LocationStatusEnum.InStock &&
                      (x.EnableStatus == (int)EnableStatusEnum.Normal || x.EnableStatus == (int)EnableStatusEnum.OnlyOut));
                    if (locationInfo == null)
                    {
                        return responseContent.Error($"测试架货位:{stockInfo.LocationCode}出库条件不满足");
                    }
                    //生成测试架出库任务 é”å®šåº“å­˜ æ›´æ”¹è´§ä½çŠ¶æ€
                    Dt_Task taskOut = new()
                    {
                        CurrentAddress = stockInfo.LocationCode,
                        Grade = 0,
                        PalletCode = stockInfo.PalletCode,
                        NextAddress = "",
                        Roadway = locationInfo.RoadwayNo,
                        SourceAddress = stockInfo.LocationCode,
                        TargetAddress = model.TargetAddressCode,
                        TaskStatus = (int)TaskStatusEnum.New,
                        TaskType = (int)TaskTypeEnum.Outbound,
                        TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                        PalletType = stockInfo.PalletType,
                        WarehouseId = stockInfo.WarehouseId,
                    };
                    stockInfo.StockStatus = (int)StockStatusEmun.出库锁定;
                    LocationStatusEnum locationStatus = (LocationStatusEnum)locationInfo.LocationStatus;
                    locationInfo.LocationStatus = (int)LocationStatusEnum.Lock;
                    //判断是否有出库单信息
                    _unitOfWorkManage.BeginTran();
                    //更新库存状态
                    _stockRepository.StockInfoRepository.UpdateData(stockInfo);
                    //更新货位状态
                    _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, (PalletTypeEnum)stockInfo.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
                    //新建任务
                    BaseDal.AddData(taskOut);
                    //加入货位变动记录
                    _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, locationStatus, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", taskOut.TaskNum);
                    _unitOfWorkManage.CommitTran();
                    //将任务推送到WCS
                    PushTasksToWCS(new List<Dt_Task>() { taskOut }, "AGV");
                    responseContent.OK();
                }
                Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode &&
                  x.WarehouseId == stockInfo.WarehouseId &&
                  x.LocationStatus == (int)LocationStatusEnum.InStock &&
                  (x.EnableStatus == (int)EnableStatusEnum.Normal || x.EnableStatus == (int)EnableStatusEnum.OnlyOut));
                if (locationInfo == null)
                catch (Exception ex)
                {
                    return responseContent.Error($"测试架货位:{stockInfo.LocationCode}出库条件不满足");
                    _unitOfWorkManage.RollbackTran();
                    responseContent.Error(ex.Message);
                }
                //生成测试架出库任务 é”å®šåº“å­˜ æ›´æ”¹è´§ä½çŠ¶æ€
                Dt_Task taskOut = new()
                {
                    CurrentAddress = stockInfo.LocationCode,
                    Grade = 0,
                    PalletCode = stockInfo.PalletCode,
                    NextAddress = "",
                    Roadway = locationInfo.RoadwayNo,
                    SourceAddress = stockInfo.LocationCode,
                    TargetAddress = model.TargetAddressCode,
                    TaskStatus = (int)TaskStatusEnum.New,
                    TaskType = (int)TaskTypeEnum.Outbound,
                    TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                    PalletType = stockInfo.PalletType,
                    WarehouseId = stockInfo.WarehouseId,
                };
                stockInfo.StockStatus = (int)StockStatusEmun.出库锁定;
                LocationStatusEnum locationStatus = (LocationStatusEnum)locationInfo.LocationStatus;
                locationInfo.LocationStatus = (int)LocationStatusEnum.Lock;
                //判断是否有出库单信息
                _unitOfWorkManage.BeginTran();
                //更新库存状态
                _stockRepository.StockInfoRepository.UpdateData(stockInfo);
                //更新货位状态
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, (PalletTypeEnum)stockInfo.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
                //新建任务
                BaseDal.AddData(taskOut);
                //加入货位变动记录
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, locationStatus, LocationChangeType.OutboundAssignLocation, stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", taskOut.TaskNum);
                _unitOfWorkManage.CommitTran();
                //将任务推送到WCS
                PushTasksToWCS(new List<Dt_Task>() { taskOut }, "AGV");
                responseContent.OK();
                return responseContent;
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                responseContent.Error(ex.Message);
            }
            return responseContent;
        }
        /// <summary>
        /// æµ‹è¯•架退库
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -32,6 +32,7 @@
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.Inbound;
using WIDESEA_DTO.MES;
using WIDESEA_DTO.Stock;
using WIDESEA_DTO.Task;
using WIDESEA_External.ERPService;
@@ -218,6 +219,15 @@
                        return WebResponseContent.Instance.Error($"入库同步Erp失败");
                    }
                }
                if ((stockInfo.StockStatus == StockStatusEmun.入库确认.ObjToInt() || stockInfo.StockStatus == StockStatusEmun.手动组盘入库确认.ObjToInt()) && warehouse.WarehouseCode == WarehouseEnum.HA64.ToString())
                {
                    foreach (var model in stockInfo.Details)
                    {
                        TestSynStock(new TestToolSynInfo() { ToolCode = model.BatchNo, Life = int.TryParse(model.Remark, out int val) ? val : 1000 });
                    }
                }
                //测试架入库库存状态
                if (task.TaskType == TaskTypeEnum.Inbound.ObjToInt() && warehouse.WarehouseCode == WarehouseEnum.HA64.ToString() && stockInfo.StockStatus != StockStatusEmun.手动组盘入库确认.ObjToInt())
                {
@@ -237,7 +247,7 @@
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, (PalletTypeEnum)stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
                _stockRepository.StockInfoRepository.UpdateData(stockInfo);
                _stockRepository.StockInfoDetailRepository.UpdateData(stockInfo.Details);
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationChangeType.InboundCompleted);
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationStatusEnum.InStock, LocationChangeType.InboundCompleted);
                _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, stockInfo.Details.Sum(x => x.StockQuantity), stockInfo.Details.Sum(x => x.StockQuantity), StockChangeTypeEnum.Inbound, taskNum);
                if (inboundOrder != null)
                {
@@ -305,7 +315,7 @@
                    }
                }
                _unitOfWorkManage.BeginTran();
                if (outboundOrderDetails.Count > 0)
                {
@@ -319,7 +329,7 @@
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, (PalletTypeEnum)stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, (LocationStatusEnum)beforeStatus, LocationChangeType.OutboundCompleted, stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum);
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, (LocationStatusEnum)beforeStatus, LocationStatusEnum.Free, LocationChangeType.OutboundCompleted, stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum);
                _unitOfWorkManage.CommitTran();
                if (warehouse.WarehouseCode != WarehouseEnum.HA64.ToString())
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Inbound.cs
@@ -202,7 +202,7 @@
                LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
                _unitOfWorkManage.BeginTran();
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationChangeType.InboundAssignLocation);
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationStatusEnum.Lock, LocationChangeType.InboundAssignLocation);
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, (PalletTypeEnum)task.PalletType, LocationStatusEnum.Lock, task.WarehouseId);
                BaseDal.UpdateData(task);
                _unitOfWorkManage.CommitTran();
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Reloaction.cs
@@ -86,12 +86,12 @@
                        {
                            LocationStatusEnum lastStatus = (LocationStatusEnum)newLocation.LocationStatus;
                            _basicService.LocationInfoService.UpdateLocationStatus(newLocation, (PalletTypeEnum)task.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
                            _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(newLocation, lastStatus, LocationChangeType.RelocationAssignLocation, taskNum: newTask.TaskNum);
                            _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(newLocation, lastStatus, LocationStatusEnum.Lock, LocationChangeType.RelocationAssignLocation, taskNum: newTask.TaskNum);
                        }
                        {
                            LocationStatusEnum lastStatus = (LocationStatusEnum)needRelocationItem.LocationStatus;
                            _basicService.LocationInfoService.UpdateLocationStatus(needRelocationItem, (PalletTypeEnum)task.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
                            _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(needRelocationItem, lastStatus, LocationChangeType.RelocationAssignLocation, taskNum: newTask.TaskNum);
                            _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(needRelocationItem, lastStatus, LocationStatusEnum.Lock, LocationChangeType.RelocationAssignLocation, taskNum: newTask.TaskNum);
                        }
                        stockInfo.StockStatus = StockStatusEmun.移库锁定.ObjToInt();
                        _stockRepository.StockInfoRepository.UpdateData(stockInfo);