From 4f39dcc195f28fa275fc2d065fbf1bf6a46c21b7 Mon Sep 17 00:00:00 2001
From: dengjunjie <dengjunjie@hnkhzn.com>
Date: 星期二, 17 六月 2025 00:41:18 +0800
Subject: [PATCH] 优化出入库逻辑

---
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/PartialTaskService_AGV.cs |  329 ++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 255 insertions(+), 74 deletions(-)

diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/PartialTaskService_AGV.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/PartialTaskService_AGV.cs"
index dee5622..38b8cf7 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/PartialTaskService_AGV.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/PartialTaskService_AGV.cs"
@@ -1,6 +1,7 @@
 锘縰sing System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Reflection.Metadata;
 using System.Text;
 using System.Threading.Tasks;
 using WIDESEA_Common;
@@ -20,29 +21,93 @@
         /// <returns></returns>
         public WebResponseContent ShelfOutboundCarry(Dt_Task outTask)
         {
-            Dt_CachePoint cachePoint = GetCachePointByStartPoint(outTask.TargetAddress);
+            //鍒ゆ柇鏄惁涓虹數鑺簱锛岃緟鏂欏簱浜哄伐澶勭悊(绔嬪簱鐩爣鍦板潃杞崲鎴怉GV绔欑偣鍦板潃)
+            if (!outTask.Roadway.Contains("CP")) return WebResponseContent.Instance.OK();
+            Dt_RoadwayInfo dt_RoadwayInfo = _basicService.RoadwayInfoService.Repository.QueryFirst(x => x.OutSCStationCode == outTask.TargetAddress);
+            if (dt_RoadwayInfo == null) return WebResponseContent.Instance.OK();
+            Dt_CachePoint startcachePoint = new Dt_CachePoint();
+            Dt_CachePoint cachePoint = GetCachePointByStartPoint(dt_RoadwayInfo.OutStationCode, ref startcachePoint);
 
             Dt_Task task = new()
             {
-                CurrentAddress = outTask.TargetAddress,
+                CurrentAddress = startcachePoint.PointCode,
                 Grade = 0,
                 NextAddress = cachePoint.PointCode,
                 OrderNo = outTask.OrderNo,
                 PalletCode = outTask.PalletCode + "-AGV",
                 Roadway = "",
-                SourceAddress = outTask.TargetAddress,
+                SourceAddress = startcachePoint.PointCode,
                 TargetAddress = cachePoint.PointCode,
                 SourceKey = outTask.TaskId,
-                //TaskNum = outTask.TaskNum,
                 TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
-                TaskStatus = AGVTaskStatusEnum.AGV_New.ObjToInt(),
+                TaskStatus = AGVTaskStatusEnum.Create.ObjToInt(),
                 TaskType = TaskTypeEnum.AGVCarry.ObjToInt(),
+                CreateDate = DateTime.Now,
+                Creater = App.User.UserId > 0 ? App.User.UserName : "System",
             };
             cachePoint.PointStatus = LocationStatusEnum.Lock.ObjToInt();
+            startcachePoint.PointStatus = LocationStatusEnum.Lock.ObjToInt();
 
             _basicService.CachePointService.Repository.UpdateData(cachePoint);
+            _basicService.CachePointService.Repository.UpdateData(startcachePoint);
             Repository.AddData(task);
+            SendAGVTask(task, cachePoint);
             return WebResponseContent.Instance.OK();
+        }
+
+        /// <summary>
+        /// 璐т綅缁戝畾
+        /// </summary>
+        /// <param name="qty"></param>
+        /// <param name="Point"></param>
+        /// <returns></returns>
+        public WebResponseContent Bind(string qty, string point)
+        {
+            try
+            {
+                if (Repository.QueryFirst(x => x.SourceAddress == point &&
+                x.TaskStatus < AGVTaskStatusEnum.DoneFetch.ObjToInt() ||
+                x.TargetAddress == point) != null)
+                    throw new Exception($"绔欑偣銆恵point}銆戝瓨鍦ㄤ换鍔★紒");
+                Dt_CachePoint? cachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == point);
+                if (cachePoint == null) throw new Exception("鏈壘鍒扮紦瀛樼偣!");
+                if (cachePoint.AreaId != 4) throw new Exception("褰撳墠缂撳瓨鐐瑰尯鍩熸棤缁戝畾鏉冮檺!");
+                cachePoint.PointStatus = LocationStatusEnum.InStock.ObjToInt();
+                cachePoint.Remark = qty;
+                cachePoint.Modifier = App.User.UserName;
+                _basicService.CachePointService.Repository.UpdateData(cachePoint);
+                return WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
+        /// <summary>
+        /// 閲婃斁缂撳瓨鐐�
+        /// </summary>
+        /// <param name="point"></param>
+        /// <returns></returns>
+        public WebResponseContent AcrossFloorCallMat(string point)
+        {
+            try
+            {
+                if (Repository.QueryFirst(x => x.SourceAddress == point &&
+                x.TaskStatus < AGVTaskStatusEnum.DoneFetch.ObjToInt() ||
+                x.TargetAddress == point) != null)
+                    throw new Exception($"绔欑偣銆恵point}銆戝瓨鍦ㄤ换鍔★紒");
+                Dt_CachePoint? cachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == point);
+                if (cachePoint == null) throw new Exception("鏈壘鍒扮紦瀛樼偣!");
+                if (cachePoint.AreaId != 2 && cachePoint.AreaId != 5 && cachePoint.AreaId != 8)
+                    throw new Exception("褰撳墠缂撳瓨鐐瑰尯鍩熸棤閲婃斁鏉冮檺!");
+                cachePoint.PointStatus = LocationStatusEnum.Free.ObjToInt();
+                _basicService.CachePointService.Repository.UpdateData(cachePoint);
+                return WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
         }
 
         /// <summary>
@@ -50,11 +115,14 @@
         /// </summary>
         /// <param name="endPoint"></param>
         /// <returns></returns>
-        public WebResponseContent CallMateriel(SaveModel saveModel)
+        public WebResponseContent CallMateriel(string endPoint)
         {
             try
             {
-                string endPoint = saveModel.MainData["endPoint"].ToString();
+                if (Repository.QueryFirst(x => x.SourceAddress == endPoint &&
+                x.TaskStatus < AGVTaskStatusEnum.DoneFetch.ObjToInt() ||
+                x.TargetAddress == endPoint) != null)
+                    throw new Exception($"绔欑偣銆恵endPoint}銆戝瓨鍦ㄤ换鍔★紒");
 
                 Dt_CachePoint cachePoint = GetCachePointByEndPoint(endPoint);
 
@@ -70,20 +138,29 @@
                     TargetAddress = endPoint,
                     SourceKey = 0,
                     TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
-                    TaskStatus = AGVTaskStatusEnum.AGV_New.ObjToInt(),
+                    TaskStatus = AGVTaskStatusEnum.Create.ObjToInt(),
                     TaskType = TaskTypeEnum.AGVCarry.ObjToInt(),
                 };
                 cachePoint.PointStatus = LocationStatusEnum.Lock.ObjToInt();
 
+                Db.Ado.BeginTran();
+                var response = SendAGVTask(task, cachePoint);
+                if (!response.Status)
+                {
+                    _unitOfWorkManage.RollbackTran();
+                    return WebResponseContent.Instance.Error($"{response.Message}");
+                }
                 _basicService.CachePointService.Repository.UpdateData(cachePoint);
                 Repository.AddData(task);
+                Db.Ado.CommitTran();
                 return WebResponseContent.Instance.OK();
             }
             catch (Exception ex)
             {
+                Db.Ado.RollbackTran();
                 return WebResponseContent.Instance.Error(ex.Message);
             }
-            
+
         }
 
         /// <summary>
@@ -91,13 +168,16 @@
         /// </summary>
         /// <param name="startPoint"></param>
         /// <returns></returns>
-        public WebResponseContent MaterielCarry(SaveModel saveModel)
+        public WebResponseContent MaterielCarry(string startPoint)
         {
             try
             {
-                string startPoint = saveModel.MainData["startPoint"].ToString();
-
-                Dt_CachePoint cachePoint = GetCachePointByStartPoint(startPoint);
+                if (Repository.QueryFirst(x => x.SourceAddress == startPoint &&
+                x.TaskStatus < AGVTaskStatusEnum.DoneFetch.ObjToInt() ||
+                x.TargetAddress == startPoint) != null)
+                    throw new Exception($"绔欑偣銆恵startPoint}銆戝瓨鍦ㄤ换鍔★紒");
+                Dt_CachePoint startcachePoint = new Dt_CachePoint();
+                Dt_CachePoint cachePoint = GetCachePointByStartPoint(startPoint, ref startcachePoint);
 
                 Dt_Task task = new()
                 {
@@ -111,88 +191,189 @@
                     TargetAddress = cachePoint.PointCode,
                     SourceKey = 0,
                     TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
-                    TaskStatus = AGVTaskStatusEnum.AGV_New.ObjToInt(),
+                    TaskStatus = AGVTaskStatusEnum.Create.ObjToInt(),
                     TaskType = TaskTypeEnum.AGVCarry.ObjToInt(),
                 };
                 cachePoint.PointStatus = LocationStatusEnum.Lock.ObjToInt();
 
+                Db.Ado.BeginTran();
+                var response = SendAGVTask(task, cachePoint);
+                if (!response.Status)
+                {
+                    _unitOfWorkManage.RollbackTran();
+                    return WebResponseContent.Instance.Error($"{response.Message}");
+                }
                 _basicService.CachePointService.Repository.UpdateData(cachePoint);
                 Repository.AddData(task);
+                Db.Ado.CommitTran();
+                return WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                Db.Ado.RollbackTran();
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
+        /// <summary>
+        /// 鎼繍
+        /// </summary>
+        /// <param name="startPoint"></param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        private Dt_CachePoint GetCachePointByStartPoint(string startPoint, ref Dt_CachePoint startcachePoint)
+        {
+            #region MyRegion
+            Dt_CachePoint? StartcachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == startPoint);
+            if (StartcachePoint == null) throw new Exception("鏈壘鍒扮紦瀛樼偣!");
+            startcachePoint = StartcachePoint;
+            Dt_AreaRouter areaRouter = _basicService.AreaRouterService.Repository.QueryFirst(x => x.StartArea == StartcachePoint.AreaId.ToString());
+            if (areaRouter == null) throw new Exception("鏈壘鍒拌矾鐢变俊鎭�!");
+
+            Dt_CachePoint? cachePoint = _basicService.CachePointService.AssignCachePoint(areaRouter.NextArea.ObjToInt());
+            if (cachePoint == null)
+            {
+                throw new Exception("鏈壘鍒扮┖闂茬紦瀛樼偣!");
+            }
+            #endregion
+
+            return cachePoint;
+        }
+        /// <summary>
+        /// 鍙枡
+        /// </summary>
+        /// <param name="endPoint"></param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        private Dt_CachePoint GetCachePointByEndPoint(string endPoint)
+        {
+            #region MyRegion
+            Dt_CachePoint? StartcachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == endPoint);
+            if (StartcachePoint == null) throw new Exception("鏈壘鍒扮紦瀛樼偣!");
+
+            Dt_AreaRouter areaRouter = _basicService.AreaRouterService.Repository.QueryFirst(x => x.NextArea == StartcachePoint.AreaId.ToString());
+            if (areaRouter == null) throw new Exception("鏈壘鍒拌矾鐢变俊鎭�!");
+
+            Dt_CachePoint? cachePoint = _basicService.CachePointService.GetIbStockCachePoint(areaRouter.StartArea.ObjToInt());
+            if (cachePoint == null)
+            {
+                throw new Exception("鏈壘鍒版湁璐х紦瀛樼偣!");
+            }
+            #endregion
+            return cachePoint;
+        }
+
+        /// <summary>
+        /// 涓嬪彂AGV浠诲姟
+        /// </summary>
+        /// <param name="task"></param>
+        public WebResponseContent SendAGVTask(Dt_Task task, Dt_CachePoint? cachePoint = null)
+        {
+            try
+            {
+                AGVSendTaskModel aGVSendTask = new AGVSendTaskModel
+                {
+                    task_id = task.TaskNum.ToString(),
+                    src_pos = task.CurrentAddress,
+                    site_value_type = 1,
+                    dst_pos = task.NextAddress
+                };
+                if (cachePoint != null && cachePoint.AreaId == 4) aGVSendTask.src_level = cachePoint.Remark.ObjToInt() - 1;
+                var response = HttpHelper.Post<WebResponseContent>(AGVurl + "sendTask/", aGVSendTask, "鍙枡浠诲姟涓嬪彂");
+                if (response.Code != 200) throw new Exception(response.Message);
                 return WebResponseContent.Instance.OK();
             }
             catch (Exception ex)
             {
                 return WebResponseContent.Instance.Error(ex.Message);
             }
-}
-
-        private Dt_CachePoint GetCachePointByStartPoint(string startPoint)
-        {
-            Dt_AreaRouter areaRouter = _basicService.AreaRouterService.Repository.QueryFirst(x => x.StartArea == startPoint);
-            if (areaRouter == null)
-            {
-                throw new Exception("鏈壘鍒拌矾鐢变俊鎭�");
-            }
-            Dt_AreaInfo areaInfo = _basicService.AreaInfoService.Repository.QueryFirst(x => x.AreaCode == areaRouter.NextArea);
-            if (areaInfo == null)
-            {
-                throw new Exception("鏈壘鍒颁笅涓�鍖哄煙淇℃伅");
-            }
-
-            Dt_CachePoint? cachePoint = _basicService.CachePointService.AssignCachePoint(areaInfo.Id);
-            if (cachePoint == null)
-            {
-                throw new Exception("鏈壘鍒扮┖闂茬紦瀛樼偣");
-            }
-
-            return cachePoint;
         }
 
-        private Dt_CachePoint GetCachePointByEndPoint(string endPoint)
-        {
-            Dt_AreaRouter areaRouter = _basicService.AreaRouterService.Repository.QueryFirst(x => x.NextArea == endPoint);
-            if (areaRouter == null)
-            {
-                throw new Exception("鏈壘鍒拌矾鐢变俊鎭�");
-            }
-            Dt_AreaInfo areaInfo = _basicService.AreaInfoService.Repository.QueryFirst(x => x.AreaCode == areaRouter.StartArea);
-            if (areaInfo == null)
-            {
-                throw new Exception("鏈壘鍒拌捣鐐圭紦瀛樺尯鍩熶俊鎭�");
-            }
-
-            Dt_CachePoint? cachePoint = _basicService.CachePointService.GetIbStockCachePoint(areaInfo.Id);
-            if (cachePoint == null)
-            {
-                throw new Exception("鏈壘鍒版湁璐х紦瀛樼偣");
-            }
-            return cachePoint;
-        }
-
+        /// <summary>
+        /// 浠诲姟鐘舵�佷笂鎶�
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
         public object AGVTaskFeedBack(AGVTaskFeedBackModel model)
         {
-            Dt_Task task = BaseDal.QueryFirst(x => x.TaskId == Convert.ToInt32(model.Task_id));
+            Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == Convert.ToInt32(model.Task_id));
             if (task == null)
             {
-                return new { code = 404, message = "鏈壘鍒拌浠诲姟" };
+                return new { code = 404, message = "鏈壘鍒拌浠诲姟!" };
             }
-
-            Dt_CachePoint startCachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == task.SourceAddress);
-            if (startCachePoint != null)
+            if (task.TaskStatus == ((AGVTaskStatusEnum)Enum.Parse(typeof(AGVTaskStatusEnum), model.Task_status)).ObjToInt())
+                return new { code = 200, message = "鎴愬姛" };
+            switch ((AGVTaskStatusEnum)Enum.Parse(typeof(AGVTaskStatusEnum), model.Task_status))
             {
-                startCachePoint.PointStatus = LocationStatusEnum.Free.ObjToInt();
-                _basicService.CachePointService.Repository.UpdateData(startCachePoint);
+                case AGVTaskStatusEnum.Create:
+                    break;
+                case AGVTaskStatusEnum.Queuing:
+                    task.TaskStatus = AGVTaskStatusEnum.Queuing.ObjToInt();
+                    break;
+                case AGVTaskStatusEnum.Running:
+                    task.TaskStatus = AGVTaskStatusEnum.Running.ObjToInt();
+                    break;
+                case AGVTaskStatusEnum.DoneFetch:
+                    {
+                        task.TaskStatus = AGVTaskStatusEnum.DoneFetch.ObjToInt();
+                        Dt_CachePoint startCachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == task.SourceAddress);
+                        if (startCachePoint != null)
+                        {
+                            startCachePoint.PointStatus = LocationStatusEnum.Free.ObjToInt();
+                            if (startCachePoint.AreaId == 4)//鍒ゆ柇鏄惁涓烘ā缁勭┖鏍堟澘鍖哄煙
+                            {
+                                var qty = (startCachePoint.Remark.ObjToInt() - 1);
+                                if (qty > 0) startCachePoint.PointStatus = LocationStatusEnum.InStock.ObjToInt();
+                                startCachePoint.Remark = qty.ToString();
+                            }
+                            else if (startCachePoint.AreaId == 1)
+                            {
+                                startCachePoint.PointStatus = LocationStatusEnum.PalletLock.ObjToInt();
+                            }
+                            _basicService.CachePointService.Repository.UpdateData(startCachePoint);
+                        }
+                    }
+                    break;
+                case AGVTaskStatusEnum.DonePut:
+                    {
+                        task.TaskStatus = AGVTaskStatusEnum.DonePut.ObjToInt();
+                        Dt_CachePoint endCachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == task.TargetAddress);
+                        if (endCachePoint != null)
+                        {
+                            endCachePoint.PointStatus = LocationStatusEnum.InStock.ObjToInt();
+                            _basicService.CachePointService.Repository.UpdateData(endCachePoint);
+                        }
+                    }
+                    break;
+                case AGVTaskStatusEnum.Finish:
+                    {
+                        task.TaskStatus = AGVTaskStatusEnum.Finish.ObjToInt();
+                        BaseDal.DeleteAndMoveIntoHty(task, /*App.User.UserId == 0 ?*/ OperateType.鑷姩瀹屾垚 /*: OperateType.浜哄伐瀹屾垚*/);
+                        return new { code = 200, message = "鎴愬姛" };
+                    }
+                case AGVTaskStatusEnum.Cancel:
+                case AGVTaskStatusEnum.Terminate:
+                case AGVTaskStatusEnum.Error:
+                    {
+                        if (task.TaskStatus < AGVTaskStatusEnum.DoneFetch.ObjToInt())
+                        {
+                            Dt_CachePoint startCachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == task.SourceAddress);
+                            startCachePoint.PointStatus = LocationStatusEnum.InStock.ObjToInt();
+                            _basicService.CachePointService.Repository.UpdateData(startCachePoint);
+                        }
+                        task.TaskStatus = AGVTaskStatusEnum.Cancel.ObjToInt();
+                        BaseDal.DeleteAndMoveIntoHty(task, OperateType.鑷姩鍒犻櫎);
+                        return new { code = 200, message = "鎴愬姛" };
+                    }
+                //case AGVTaskStatusEnum.Terminate:
+                //    task.TaskStatus = AGVTaskStatusEnum.Terminate.ObjToInt();
+                //    break;
+                //case AGVTaskStatusEnum.Error:
+                //    task.TaskStatus = AGVTaskStatusEnum.Error.ObjToInt();
+                //    break;
+                default:
+                    return new { code = 404, message = "鏈畾涔変换鍔$被鍨�!" };
             }
-
-            Dt_CachePoint endCachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == task.TargetAddress);
-            if (endCachePoint != null)
-            {
-                endCachePoint.PointStatus = LocationStatusEnum.InStock.ObjToInt();
-                _basicService.CachePointService.Repository.UpdateData(endCachePoint);
-            }
-            BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.鑷姩瀹屾垚 : OperateType.浜哄伐瀹屾垚);
-            //BaseDal.DeleteData(task);
-
+            BaseDal.UpdateData(task);
             return new { code = 200, message = "鎴愬姛" };
         }
     }

--
Gitblit v1.9.3