From 9f27cbd178b7f60975d388fa4c8a94f8b8e38117 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期六, 25 四月 2026 16:18:08 +0800
Subject: [PATCH] feat: 更新分容库出库地址并添加巷道号常量

---
 Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Outbound.cs                           |   15 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs                                |    9 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs                   |    2 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/TaskAddressConstants.cs                              |    7 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/LocationEnum/LocationTypeEnum.cs                               |   18 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotMessageHandler.cs                              |    2 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs                  |   12 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json                                            |    2 
 项目资料/设备协议/高常温堆垛机与输送线/WCS输送对接地址表_0420.xlsx                                                                |    0 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs                                   |    5 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ManualInbound/ManualInboundTaskHandler.cs |   23 
 项目资料/设备协议/分容柜接口协议/化成分容柜接口协议1.1.xls                                                                       |    0 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotJob.cs                                         |   10 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs               |   18 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs                               |  200 +++---
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Query.cs                   |    7 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs               |   14 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs            |   94 ++-
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs                                   |   13 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_GradingMachine.cs                         |   60 +
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs               |   40 +
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Helper/UtilConvert.cs                                         | 1125 +++++++++++++++++++-------------------
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineTargetAddressSelector.cs      |   10 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Status.cs                  |   37 +
 24 files changed, 944 insertions(+), 779 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Helper/UtilConvert.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Helper/UtilConvert.cs
index adb4432..d5b451a 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Helper/UtilConvert.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Helper/UtilConvert.cs
@@ -1,565 +1,562 @@
-锘縰sing Newtonsoft.Json;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Text.RegularExpressions;
-using System.Threading.Tasks;
-using WIDESEAWCS_Core.Const;
-using WIDESEAWCS_Core.Enums;
-
-namespace WIDESEAWCS_Core.Helper
-{
-    public static class UtilConvert
-    {
-        private static DateTime dateStart = new DateTime(1970, 1, 1, 8, 0, 0);
-
-        private static long longTime = 621355968000000000;
-
-        private static int samllTime = 10000000;
-        
-        /// <summary>
-        /// 灏嗘椂闂存埑杞崲涓烘湰鍦版棩鏈熸椂闂�
-        /// </summary>
-        /// <param name="timeStamp">瑕佽浆鎹㈢殑鏃堕棿鎴冲璞�</param>
-        /// <returns>杞崲鍚庣殑鏈湴DateTime瀵硅薄</returns>
-        /// <remarks>濡傛灉鍙傛暟涓簄ull锛屽垯杩斿洖榛樿璧峰鏃ユ湡</remarks>
-        public static DateTime GetTimeSpmpToDate(this object timeStamp)
-        {
-            if (timeStamp == null) return dateStart;
-            DateTime dateTime = new DateTime(longTime + Convert.ToInt64(timeStamp) * samllTime, DateTimeKind.Utc).ToLocalTime();
-            return dateTime;
-        }
-
-        /// <summary>
-        /// 灏嗗璞″簭鍒楀寲涓篔SON瀛楃涓�
-        /// </summary>
-        /// <param name="obj">瑕佸簭鍒楀寲鐨勫璞�</param>
-        /// <param name="formatDate">鏃ユ湡鏍煎紡鍖栬缃紝榛樿涓�"yyyy-MM-dd HH:mm:ss"鏍煎紡</param>
-        /// <returns>搴忓垪鍖栧悗鐨凧SON瀛楃涓诧紝濡傛灉瀵硅薄涓簄ull鍒欒繑鍥瀗ull</returns>
-        public static string Serialize(this object obj, JsonSerializerSettings formatDate = null)
-        {
-            if (obj == null) return null;
-            formatDate = formatDate ?? new JsonSerializerSettings
-            {
-                DateFormatString = "yyyy-MM-dd HH:mm:ss"
-            };
-            return JsonConvert.SerializeObject(obj, formatDate);
-        }
-
-        /// <summary>
-        /// 灏咼SON瀛楃涓插弽搴忓垪鍖栦负鎸囧畾绫诲瀷鐨勫璞�
-        /// </summary>
-        /// <typeparam name="T">鐩爣瀵硅薄绫诲瀷</typeparam>
-        /// <param name="json">瑕佸弽搴忓垪鍖栫殑JSON瀛楃涓�</param>
-        /// <returns>鍙嶅簭鍒楀寲鍚庣殑瀵硅薄瀹炰緥锛屽鏋滆緭鍏ヤ负绌哄垯杩斿洖榛樿鍊�</returns>
-        /// <remarks>
-        /// 褰撹緭鍏ヤ负"{}"鏃朵細鑷姩杞崲涓�"[]"澶勭悊
-        /// </remarks>
-        public static T DeserializeObject<T>(this string json)
-        {
-            if (string.IsNullOrEmpty(json))
-            {
-                return default(T);
-            }
-            if (json == "{}")
-            {
-                json = "[]";
-            }
-            return JsonConvert.DeserializeObject<T>(json);
-        }
-
-        /// <summary>
-        /// 灏嗗瓧绗︿覆鐨勯瀛楁瘝杞崲涓哄皬鍐�
-        /// </summary>
-        /// <param name="thisValue">瑕佸鐞嗙殑瀛楃涓�</param>
-        /// <returns>棣栧瓧姣嶅皬鍐欑殑瀛楃涓诧紝鑻ヨ緭鍏ヤ负绌哄垯杩斿洖绌哄瓧绗︿覆</returns>
-        public static string FirstLetterToLower(this string thisValue)
-        {
-            if (string.IsNullOrEmpty(thisValue)) return string.Empty;
-            string result = thisValue.Substring(0, 1).ToLower() + thisValue.Substring(1, thisValue.Length - 1);
-            return result;
-        }
-
-        /// <summary>
-        /// 灏嗗瓧绗︿覆鐨勯瀛楁瘝杞崲涓哄ぇ鍐�
-        /// </summary>
-        /// <param name="thisValue">瑕佸鐞嗙殑瀛楃涓�</param>
-        /// <returns>棣栧瓧姣嶅ぇ鍐欑殑瀛楃涓诧紝鑻ヨ緭鍏ヤ负绌哄垯杩斿洖绌哄瓧绗︿覆</returns>
-        public static string FirstLetterToUpper(this string thisValue)
-        {
-            if (string.IsNullOrEmpty(thisValue)) return string.Empty;
-            string result = thisValue.Substring(0, 1).ToUpper() + thisValue.Substring(1, thisValue.Length - 1);
-            return result;
-        }
-
-        /// <summary>
-        /// 灏嗗璞¤浆鎹负鏁村瀷鍊�
-        /// </summary>
-        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
-        /// <returns>杞崲鍚庣殑鏁村瀷鍊硷紝杞崲澶辫触杩斿洖0</returns>
-        /// <remarks>
-        /// 鏀寔澶勭悊null鍊笺�丏BNull.Value鍜屾灇涓剧被鍨�
-        /// </remarks>
-        public static int ObjToInt(this object thisValue)
-        {
-            int reval = 0;
-            if (thisValue == null) return 0;
-            if (thisValue is Enum && thisValue != DBNull.Value && Enum.TryParse(thisValue.GetType(), thisValue.ToString(), out var val))
-            {
-                return Convert.ToInt32(val.ChangeType(typeof(int)));
-            }
-            if (thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval))
-            {
-                return reval;
-            }
-
-            return reval;
-        }
-
-        /// <summary>
-        /// 灏嗗弻绮惧害娴偣鏁拌浆鎹负32浣嶆湁绗﹀彿鏁存暟
-        /// </summary>
-        /// <param name="thisValue">瑕佽浆鎹㈢殑鍙岀簿搴︽诞鐐规暟</param>
-        /// <returns>杞崲鍚庣殑32浣嶆湁绗﹀彿鏁存暟</returns>
-        public static int DoubleToInt(this double thisValue)
-        {
-            int reval = 0;
-
-            return Convert.ToInt32(thisValue);
-        }
-
-        /// <summary>
-        /// 灏嗗璞¤浆鎹负鏁存暟锛岃嫢杞崲澶辫触鍒欒繑鍥炴寚瀹氱殑閿欒鍊�
-        /// </summary>
-        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
-        /// <param name="errorValue">杞崲澶辫触鏃惰繑鍥炵殑閿欒鍊�</param>
-        /// <returns>杞崲鍚庣殑鏁存暟鍊兼垨鎸囧畾鐨勯敊璇��</returns>
-        public static int ObjToInt(this object thisValue, int errorValue)
-        {
-            int reval = 0;
-            if (thisValue != null && thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval))
-            {
-                return reval;
-            }
-
-            return errorValue;
-        }
-
-        /// <summary>
-        /// 灏嗗璞¤浆鎹负闀挎暣鍨�(long)
-        /// </summary>
-        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
-        /// <returns>杞崲鍚庣殑闀挎暣鍨嬪�硷紝杞崲澶辫触鎴栦负null鏃惰繑鍥�0</returns>
-        /// <remarks>
-        /// 澶勭悊DBNull.Value鎯呭喌锛屽苟灏濊瘯灏嗗璞¤浆鎹负long绫诲瀷
-        /// </remarks>
-        public static long ObjToLong(this object thisValue)
-        {
-            long reval = 0;
-            if (thisValue == null) return 0;
-            if (thisValue != DBNull.Value && long.TryParse(thisValue.ToString(), out reval))
-            {
-                return reval;
-            }
-
-            return reval;
-        }
-
-        /// <summary>
-        /// 灏嗗璞¤浆鎹负閲戦(double绫诲瀷)銆傝嫢杞崲澶辫触鍒欒繑鍥�0銆�
-        /// </summary>
-        /// <param name="thisValue">寰呰浆鎹㈢殑瀵硅薄</param>
-        /// <returns>杞崲鍚庣殑閲戦鍊硷紝澶辫触杩斿洖0</returns>
-        public static double ObjToMoney(this object thisValue)
-        {
-            double reval = 0;
-            if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval))
-            {
-                return reval;
-            }
-
-            return 0;
-        }
-
-        /// <summary>
-        /// 灏嗗璞¤浆鎹负閲戦(double)绫诲瀷锛岃浆鎹㈠け璐ユ椂杩斿洖鎸囧畾鐨勯敊璇��
-        /// </summary>
-        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
-        /// <param name="errorValue">杞崲澶辫触鏃惰繑鍥炵殑榛樿鍊�</param>
-        /// <returns>杞崲鎴愬姛鐨刣ouble鍊兼垨鎸囧畾鐨勯敊璇��</returns>
-        public static double ObjToMoney(this object thisValue, double errorValue)
-        {
-            double reval = 0;
-            if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval))
-            {
-                return reval;
-            }
-
-            return errorValue;
-        }
-
-        /// <summary>
-        /// 灏嗗璞¤浆鎹负瀛楃涓诧紝鑻ュ璞′负null鍒欒繑鍥炵┖瀛楃涓�
-        /// </summary>
-        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
-        /// <returns>鍘婚櫎鍓嶅悗绌烘牸鐨勫瓧绗︿覆缁撴灉</returns>
-        public static string ObjToString(this object thisValue)
-        {
-            if (thisValue != null) return thisValue.ToString().Trim();
-            return "";
-        }
-
-        /// <summary>
-        /// 鍒ゆ柇瀵硅薄鏄惁涓嶄负绌烘垨null鍊�
-        /// </summary>
-        /// <param name="thisValue">瑕佸垽鏂殑瀵硅薄</param>
-        /// <returns>褰撳璞′笉涓虹┖涓斾笉绛変簬"undefined"鎴�"null"瀛楃涓叉椂杩斿洖true锛屽惁鍒欒繑鍥瀎alse</returns>
-        public static bool IsNotEmptyOrNull(this object thisValue)
-        {
-            return ObjToString(thisValue) != "" && ObjToString(thisValue) != "undefined" && ObjToString(thisValue) != "null";
-        }
-
-        /// <summary>
-        /// 灏嗗璞¤浆鎹负瀛楃涓诧紝濡傛灉瀵硅薄涓簄ull鍒欒繑鍥炴寚瀹氱殑閿欒鍊�
-        /// </summary>
-        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
-        /// <param name="errorValue">褰撳璞′负null鏃惰繑鍥炵殑鍊�</param>
-        /// <returns>瀵硅薄鐨勫瓧绗︿覆琛ㄧず鎴栨寚瀹氱殑閿欒鍊�</returns>
-        public static string ObjToString(this object thisValue, string errorValue)
-        {
-            if (thisValue != null) return thisValue.ToString().Trim();
-            return errorValue;
-        }
-
-        /// <summary>
-        /// 鍒ゆ柇瀵硅薄鏄惁涓簄ull銆丏BNull鎴栫┖瀛楃涓�
-        /// </summary>
-        /// <param name="thisValue">瑕佹鏌ョ殑瀵硅薄</param>
-        /// <returns>濡傛灉瀵硅薄涓簄ull銆丏BNull鎴栫┖瀛楃涓插垯杩斿洖true锛屽惁鍒欒繑鍥瀎alse</returns>
-        public static bool IsNullOrEmpty(this object thisValue) => thisValue == null || thisValue == DBNull.Value || string.IsNullOrWhiteSpace(thisValue.ToString());
-
-        /// <summary>
-        /// 灏嗗璞¤浆鎹负Decimal绫诲瀷
-        /// </summary>
-        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
-        /// <returns>杞崲鍚庣殑Decimal鍊硷紝杞崲澶辫触杩斿洖0</returns>
-        public static Decimal ObjToDecimal(this object thisValue)
-        {
-            Decimal reval = 0;
-            if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval))
-            {
-                return reval;
-            }
-
-            return 0;
-        }
-
-        /// <summary>
-        /// 灏嗗璞¤浆鎹负Decimal绫诲瀷锛岃嫢杞崲澶辫触鍒欒繑鍥炴寚瀹氱殑榛樿鍊�
-        /// </summary>
-        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
-        /// <param name="errorValue">杞崲澶辫触鏃惰繑鍥炵殑榛樿鍊�</param>
-        /// <returns>杞崲鎴愬姛鐨凞ecimal鍊兼垨鎸囧畾鐨勯粯璁ゅ��</returns>
-        public static Decimal ObjToDecimal(this object thisValue, decimal errorValue)
-        {
-            Decimal reval = 0;
-            if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval))
-            {
-                return reval;
-            }
-
-            return errorValue;
-        }
-
-        /// <summary>
-        /// 灏嗗璞¤浆鎹负DateTime绫诲瀷
-        /// </summary>
-        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
-        /// <returns>杞崲鍚庣殑DateTime鍊硷紝杞崲澶辫触杩斿洖DateTime.MinValue</returns>
-        public static DateTime ObjToDate(this object thisValue)
-        {
-            DateTime reval = DateTime.MinValue;
-            if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval))
-            {
-                reval = Convert.ToDateTime(thisValue);
-            }
-
-            return reval;
-        }
-
-        /// <summary>
-        /// 灏嗗璞¤浆鎹负DateTime绫诲瀷锛岃浆鎹㈠け璐ユ椂杩斿洖鎸囧畾鐨勯粯璁ゅ��
-        /// </summary>
-        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
-        /// <param name="errorValue">杞崲澶辫触鏃惰繑鍥炵殑榛樿鍊�</param>
-        /// <returns>杞崲鎴愬姛鐨凞ateTime鍊兼垨鎸囧畾鐨勯粯璁ゅ��</returns>
-        public static DateTime ObjToDate(this object thisValue, DateTime errorValue)
-        {
-            DateTime reval = DateTime.MinValue;
-            if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval))
-            {
-                return reval;
-            }
-
-            return errorValue;
-        }
-
-        /// <summary>
-        /// 灏嗗璞¤浆鎹负甯冨皵鍊�
-        /// </summary>
-        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
-        /// <returns>杞崲鍚庣殑甯冨皵鍊硷紝杞崲澶辫触鏃惰繑鍥瀎alse</returns>
-        public static bool ObjToBool(this object thisValue)
-        {
-            bool reval = false;
-            if (thisValue != null && thisValue != DBNull.Value && bool.TryParse(thisValue.ToString(), out reval))
-            {
-                return reval;
-            }
-
-            return reval;
-        }
-
-        /// <summary>
-        /// 灏咲ateTime杞崲涓篣nix鏃堕棿鎴筹紙绉掔骇锛�
-        /// </summary>
-        /// <param name="thisValue">闇�瑕佽浆鎹㈢殑DateTime瀵硅薄</param>
-        /// <returns>杩斿洖琛ㄧずUnix鏃堕棿鎴崇殑瀛楃涓�</returns>
-        public static string DateToTimeStamp(this DateTime thisValue)
-        {
-            TimeSpan ts = thisValue - new DateTime(1970, 1, 1, 0, 0, 0, 0);
-            return Convert.ToInt64(ts.TotalSeconds).ToString();
-        }
-
-        /// <summary>
-        /// 灏嗗璞¤浆鎹负鎸囧畾绫诲瀷
-        /// </summary>
-        /// <param name="value">瑕佽浆鎹㈢殑瀵硅薄</param>
-        /// <param name="type">鐩爣绫诲瀷</param>
-        /// <returns>杞崲鍚庣殑瀵硅薄</returns>
-        /// <remarks>
-        /// 鏀寔澶勭悊null鍊笺�佹灇涓剧被鍨嬨�佹硾鍨嬬被鍨嬨�丟uid銆乂ersion绛夌壒娈婄被鍨嬬殑杞崲銆�
-        /// 濡傛灉杞崲澶辫触鎴栫被鍨嬩笉鍖归厤锛屽皢杩斿洖鍘熷鍊兼垨鎶涘嚭寮傚父銆�
-        /// </remarks>
-        public static object ChangeType(this object value, Type type)
-        {
-            if (value == null && type.IsGenericType) return Activator.CreateInstance(type);
-            if (value == null) return null;
-            if (type == value.GetType()) return value;
-            if (type.IsEnum)
-            {
-                if (value is string)
-                    return Enum.Parse(type, value as string);
-                else
-                    return Enum.ToObject(type, value);
-            }
-
-            if (!type.IsInterface && type.IsGenericType)
-            {
-                Type innerType = type.GetGenericArguments()[0];
-                object innerValue = ChangeType(value, innerType);
-                return Activator.CreateInstance(type, new object[] { innerValue });
-            }
-
-            if (value is string && type == typeof(Guid)) return new Guid(value as string);
-            if (value is string && type == typeof(Version)) return new Version(value as string);
-            if (!(value is IConvertible)) return value;
-            return Convert.ChangeType(value, type);
-        }
-
-        /// <summary>
-        /// 灏嗗璞″�艰浆鎹负鎸囧畾绫诲瀷鐨勬硾鍨嬪垪琛ㄣ��
-        /// </summary>
-        /// <param name="value">寰呰浆鎹㈢殑瀵硅薄鍊�</param>
-        /// <param name="type">鐩爣鍒楄〃鍏冪礌绫诲瀷</param>
-        /// <returns>杞崲鍚庣殑娉涘瀷鍒楄〃瀵硅薄锛岃嫢杈撳叆涓簄ull鍒欒繑鍥為粯璁ゅ��</returns>
-        /// <remarks>
-        /// 鏀寔澶勭悊浠ユ嫭鍙峰寘瑁圭殑瀛楃涓叉牸寮忥紙濡�"(1,2,3)"鎴�"("a","b")"锛夛紝
-        /// 鑷姩鍘婚櫎鍒嗛殧绗﹀苟灏嗗厓绱犺浆鎹负鐩爣绫诲瀷鍚庢坊鍔犲埌鍒楄〃銆�
-        /// </remarks>
-        public static object ChangeTypeList(this object value, Type type)
-        {
-            if (value == null) return default;
-
-            var gt = typeof(List<>).MakeGenericType(type);
-            dynamic lis = Activator.CreateInstance(gt);
-
-            var addMethod = gt.GetMethod("Add");
-            string values = value.ToString();
-            if (values != null && values.StartsWith("(") && values.EndsWith(")"))
-            {
-                string[] splits;
-                if (values.Contains("\",\""))
-                {
-                    splits = values.Remove(values.Length - 2, 2)
-                        .Remove(0, 2)
-                        .Split("\",\"");
-                }
-                else
-                {
-                    splits = values.Remove(0, 1)
-                        .Remove(values.Length - 2, 1)
-                        .Split(",");
-                }
-
-                foreach (var split in splits)
-                {
-                    var str = split;
-                    if (split.StartsWith("\"") && split.EndsWith("\""))
-                    {
-                        str = split.Remove(0, 1)
-                            .Remove(split.Length - 2, 1);
-                    }
-
-                    addMethod.Invoke(lis, new object[] { ChangeType(str, type) });
-                }
-            }
-
-            return lis;
-        }
-
-        /// <summary>
-        /// 灏嗗璞″簭鍒楀寲涓篔SON瀛楃涓�
-        /// </summary>
-        /// <param name="value">瑕佸簭鍒楀寲鐨勫璞�</param>
-        /// <returns>瀵硅薄鐨凧SON瀛楃涓茶〃绀�</returns>
-        public static string ToJson(this object value)
-        {
-            return JsonConvert.SerializeObject(value);
-        }
-
-        /// <summary>
-        /// 鍒ゆ柇瀵硅薄鏄惁鍙互杞崲涓烘暣鏁�
-        /// </summary>
-        /// <param name="obj">瑕佸垽鏂殑瀵硅薄</param>
-        /// <returns>濡傛灉鍙互杞崲涓烘暣鏁拌繑鍥瀟rue锛屽惁鍒欒繑鍥瀎alse</returns>
-        public static bool IsInt(this object obj)
-        {
-            if (obj == null)
-                return false;
-            bool reslut = Int32.TryParse(obj.ToString(), out int _number);
-            return reslut;
-
-        }
-        
-        /// <summary>
-        /// 鍒ゆ柇瀵硅薄鏄惁涓烘湁鏁堟棩鏈熸牸寮�
-        /// </summary>
-        /// <param name="str">寰呮娴嬬殑瀵硅薄</param>
-        /// <returns>true琛ㄧず鏄湁鏁堟棩鏈燂紝false鍒欎笉鏄�</returns>
-        /// <remarks>姝ゆ柟娉曟槸鎵╁睍鏂规硶锛岄�氳繃璋冪敤IsDate(out _)瀹炵幇</remarks>
-        public static bool IsDate(this object str)
-        {
-            return str.IsDate(out _);
-        }
-        
-        /// <summary>
-        /// 鍒ゆ柇瀵硅薄鏄惁鍙互杞崲涓烘湁鏁堢殑鏃ユ湡鏃堕棿
-        /// </summary>
-        /// <param name="str">瑕佸垽鏂殑瀵硅薄</param>
-        /// <param name="dateTime">杈撳嚭杞崲鍚庣殑鏃ユ湡鏃堕棿鍊�</param>
-        /// <returns>濡傛灉杞崲鎴愬姛杩斿洖true锛屽惁鍒欒繑鍥瀎alse</returns>
-        public static bool IsDate(this object str, out DateTime dateTime)
-        {
-            dateTime = DateTime.Now;
-            if (str == null || str.ToString() == "")
-            {
-                return false;
-            }
-            return DateTime.TryParse(str.ToString(), out dateTime);
-        }
-
-        /// <summary>
-        /// 鍒ゆ柇瀛楃涓叉槸鍚﹀彲浠ヨ浆鎹负鏁板瓧
-        /// </summary>
-        /// <param name="str">瑕佹鏌ョ殑瀛楃涓�</param>
-        /// <param name="formatString">鏍煎紡瀛楃涓诧紙鏈娇鐢級</param>
-        /// <returns>濡傛灉瀛楃涓插彲浠ヨ浆鎹负鏁板瓧鍒欒繑鍥瀟rue锛屽惁鍒欒繑鍥瀎alse</returns>
-        /// <remarks>
-        /// 浣跨敤姝e垯琛ㄨ揪寮忛獙璇佸瓧绗︿覆鏄惁涓烘暟瀛楁牸寮忥紝鏀寔姝h礋鍙峰拰灏忔暟鐐�
-        /// </remarks>
-        public static bool IsNumber(this string str, string formatString)
-        {
-            if (string.IsNullOrEmpty(str)) return false;
-
-            return Regex.IsMatch(str, @"^[+-]?\d*[.]?\d*$");
-        }
-
-        /// <summary>
-        /// 鍒ゆ柇瀛楃涓叉槸鍚︿负鏈夋晥鐨凣uid鏍煎紡
-        /// </summary>
-        /// <param name="guid">瑕侀獙璇佺殑瀛楃涓�</param>
-        /// <returns>濡傛灉瀛楃涓叉槸鏈夋晥鐨凣uid鏍煎紡鍒欒繑鍥瀟rue锛屽惁鍒欒繑鍥瀎alse</returns>
-        public static bool IsGuid(this string guid)
-        {
-            Guid newId;
-            return guid.GetGuid(out newId);
-        }
-
-        /// <summary>
-        /// 灏嗗瓧绗︿覆杞崲涓篏uid绫诲瀷
-        /// </summary>
-        /// <param name="guid">瑕佽浆鎹㈢殑瀛楃涓�</param>
-        /// <param name="outId">杈撳嚭杞崲鍚庣殑Guid</param>
-        /// <returns>杞崲鎴愬姛杩斿洖true锛屽惁鍒欒繑鍥瀎alse</returns>
-        public static bool GetGuid(this string guid, out Guid outId)
-        {
-            Guid emptyId = Guid.Empty;
-            return Guid.TryParse(guid, out outId);
-        }
-
-        /// <summary>
-        /// 灏嗗瓧绗︿覆绫诲瀷鐨勬潯浠惰浆鎹负瀵瑰簲鐨凩inq琛ㄨ揪寮忕被鍨�
-        /// </summary>
-        /// <param name="stringType">琛ㄧず鏉′欢鐨勫瓧绗︿覆</param>
-        /// <returns>瀵瑰簲鐨凩inq琛ㄨ揪寮忕被鍨嬫灇涓惧��</returns>
-        /// <remarks>
-        /// 璇ユ柟娉曠敤浜庡皢鍓嶇浼犻�掔殑鏉′欢瀛楃涓叉槧灏勪负鍚庣Linq鏌ヨ浣跨敤鐨勮〃杈惧紡绫诲瀷锛�
-        /// 鏀寔鍖呭惈銆佸ぇ浜庣瓑浜庛�佸皬浜庣瓑浜庛�佸ぇ浜庛�佸皬浜庛�佹ā绯婂尮閰嶇瓑甯歌鏉′欢绫诲瀷锛�
-        /// 榛樿杩斿洖绛変簬(Equal)绫诲瀷
-        /// </remarks>
-        public static LinqExpressionType GetLinqCondition(this string stringType)
-        {
-            LinqExpressionType linqExpression;
-            switch (stringType)
-            {
-                case HtmlElementType.Contains:
-                case HtmlElementType.selectlist:
-                case nameof(HtmlElementType.Contains):
-                    linqExpression = LinqExpressionType.In;
-                    break;
-                case HtmlElementType.ThanOrEqual:
-                case nameof(HtmlElementType.ThanOrEqual):
-                case HtmlElementType.thanorequal:
-                    linqExpression = LinqExpressionType.ThanOrEqual;
-                    break;
-                case HtmlElementType.LessOrEqual:
-                case nameof(HtmlElementType.LessOrEqual):
-                case HtmlElementType.lessorequal:
-                    linqExpression = LinqExpressionType.LessThanOrEqual;
-                    break;
-                case HtmlElementType.GT:
-                case nameof(HtmlElementType.GT):
-                    linqExpression = LinqExpressionType.GreaterThan;
-                    break;
-                case HtmlElementType.lt:
-                    linqExpression = LinqExpressionType.LessThan;
-                    break;
-                case HtmlElementType.like:
-                    linqExpression = LinqExpressionType.Contains;
+锘縰sing Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using WIDESEAWCS_Core.Const;
+using WIDESEAWCS_Core.Enums;
+
+namespace WIDESEAWCS_Core.Helper
+{
+    public static class UtilConvert
+    {
+        private static DateTime dateStart = new DateTime(1970, 1, 1, 8, 0, 0);
+
+        private static long longTime = 621355968000000000;
+
+        private static int samllTime = 10000000;
+        
+        /// <summary>
+        /// 灏嗘椂闂存埑杞崲涓烘湰鍦版棩鏈熸椂闂�
+        /// </summary>
+        /// <param name="timeStamp">瑕佽浆鎹㈢殑鏃堕棿鎴冲璞�</param>
+        /// <returns>杞崲鍚庣殑鏈湴DateTime瀵硅薄</returns>
+        /// <remarks>濡傛灉鍙傛暟涓簄ull锛屽垯杩斿洖榛樿璧峰鏃ユ湡</remarks>
+        public static DateTime GetTimeSpmpToDate(this object timeStamp)
+        {
+            if (timeStamp == null) return dateStart;
+            DateTime dateTime = new DateTime(longTime + Convert.ToInt64(timeStamp) * samllTime, DateTimeKind.Utc).ToLocalTime();
+            return dateTime;
+        }
+
+        /// <summary>
+        /// 灏嗗璞″簭鍒楀寲涓篔SON瀛楃涓�
+        /// </summary>
+        /// <param name="obj">瑕佸簭鍒楀寲鐨勫璞�</param>
+        /// <param name="formatDate">鏃ユ湡鏍煎紡鍖栬缃紝榛樿涓�"yyyy-MM-dd HH:mm:ss"鏍煎紡</param>
+        /// <returns>搴忓垪鍖栧悗鐨凧SON瀛楃涓诧紝濡傛灉瀵硅薄涓簄ull鍒欒繑鍥瀗ull</returns>
+        public static string Serialize(this object obj, JsonSerializerSettings formatDate = null)
+        {
+            if (obj == null) return null;
+            formatDate = formatDate ?? new JsonSerializerSettings
+            {
+                DateFormatString = "yyyy-MM-dd HH:mm:ss"
+            };
+            return JsonConvert.SerializeObject(obj, formatDate);
+        }
+
+        /// <summary>
+        /// 灏咼SON瀛楃涓插弽搴忓垪鍖栦负鎸囧畾绫诲瀷鐨勫璞�
+        /// </summary>
+        /// <typeparam name="T">鐩爣瀵硅薄绫诲瀷</typeparam>
+        /// <param name="json">瑕佸弽搴忓垪鍖栫殑JSON瀛楃涓�</param>
+        /// <returns>鍙嶅簭鍒楀寲鍚庣殑瀵硅薄瀹炰緥锛屽鏋滆緭鍏ヤ负绌哄垯杩斿洖榛樿鍊�</returns>
+        /// <remarks>
+        /// 褰撹緭鍏ヤ负"{}"鏃朵細鑷姩杞崲涓�"[]"澶勭悊
+        /// </remarks>
+        public static T DeserializeObject<T>(this string json)
+        {
+            if (string.IsNullOrEmpty(json))
+            {
+                return default(T);
+            }
+            if (json == "{}")
+            {
+                json = "[]";
+            }
+            return JsonConvert.DeserializeObject<T>(json);
+        }
+
+        /// <summary>
+        /// 灏嗗瓧绗︿覆鐨勯瀛楁瘝杞崲涓哄皬鍐�
+        /// </summary>
+        /// <param name="thisValue">瑕佸鐞嗙殑瀛楃涓�</param>
+        /// <returns>棣栧瓧姣嶅皬鍐欑殑瀛楃涓诧紝鑻ヨ緭鍏ヤ负绌哄垯杩斿洖绌哄瓧绗︿覆</returns>
+        public static string FirstLetterToLower(this string thisValue)
+        {
+            if (string.IsNullOrEmpty(thisValue)) return string.Empty;
+            string result = thisValue.Substring(0, 1).ToLower() + thisValue.Substring(1, thisValue.Length - 1);
+            return result;
+        }
+
+        /// <summary>
+        /// 灏嗗瓧绗︿覆鐨勯瀛楁瘝杞崲涓哄ぇ鍐�
+        /// </summary>
+        /// <param name="thisValue">瑕佸鐞嗙殑瀛楃涓�</param>
+        /// <returns>棣栧瓧姣嶅ぇ鍐欑殑瀛楃涓诧紝鑻ヨ緭鍏ヤ负绌哄垯杩斿洖绌哄瓧绗︿覆</returns>
+        public static string FirstLetterToUpper(this string thisValue)
+        {
+            if (string.IsNullOrEmpty(thisValue)) return string.Empty;
+            string result = thisValue.Substring(0, 1).ToUpper() + thisValue.Substring(1, thisValue.Length - 1);
+            return result;
+        }
+
+        /// <summary>
+        /// 灏嗗璞¤浆鎹负鏁村瀷鍊�
+        /// </summary>
+        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
+        /// <returns>杞崲鍚庣殑鏁村瀷鍊硷紝杞崲澶辫触杩斿洖0</returns>
+        /// <remarks>
+        /// 鏀寔澶勭悊null鍊笺�丏BNull.Value鍜屾灇涓剧被鍨�
+        /// </remarks>
+        public static int ObjToInt(this object thisValue)
+        {
+            int reval = 0;
+            if (thisValue == null) return 0;
+            if (thisValue is Enum && thisValue != DBNull.Value && Enum.TryParse(thisValue.GetType(), thisValue.ToString(), out var val))
+            {
+                return Convert.ToInt32(val.ChangeType(typeof(int)));
+            }
+            if (thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval))
+            {
+                return reval;
+            }
+
+            return reval;
+        }
+
+        /// <summary>
+        /// 灏嗗弻绮惧害娴偣鏁拌浆鎹负32浣嶆湁绗﹀彿鏁存暟
+        /// </summary>
+        /// <param name="thisValue">瑕佽浆鎹㈢殑鍙岀簿搴︽诞鐐规暟</param>
+        /// <returns>杞崲鍚庣殑32浣嶆湁绗﹀彿鏁存暟</returns>
+        public static int DoubleToInt(this double thisValue)
+        {
+            int reval = 0;
+
+            return Convert.ToInt32(thisValue);
+        }
+
+        /// <summary>
+        /// 灏嗗璞¤浆鎹负鏁存暟锛岃嫢杞崲澶辫触鍒欒繑鍥炴寚瀹氱殑閿欒鍊�
+        /// </summary>
+        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
+        /// <param name="errorValue">杞崲澶辫触鏃惰繑鍥炵殑閿欒鍊�</param>
+        /// <returns>杞崲鍚庣殑鏁存暟鍊兼垨鎸囧畾鐨勯敊璇��</returns>
+        public static int ObjToInt(this object thisValue, int errorValue)
+        {
+            int reval = 0;
+            if (thisValue != null && thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval))
+            {
+                return reval;
+            }
+
+            return errorValue;
+        }
+
+        /// <summary>
+        /// 灏嗗璞¤浆鎹负闀挎暣鍨�(long)
+        /// </summary>
+        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
+        /// <returns>杞崲鍚庣殑闀挎暣鍨嬪�硷紝杞崲澶辫触鎴栦负null鏃惰繑鍥�0</returns>
+        /// <remarks>
+        /// 澶勭悊DBNull.Value鎯呭喌锛屽苟灏濊瘯灏嗗璞¤浆鎹负long绫诲瀷
+        /// </remarks>
+        public static long ObjToLong(this object thisValue)
+        {
+            long reval = 0;
+            if (thisValue == null) return 0;
+            if (thisValue != DBNull.Value && long.TryParse(thisValue.ToString(), out reval))
+            {
+                return reval;
+            }
+
+            return reval;
+        }
+
+        /// <summary>
+        /// 灏嗗璞¤浆鎹负閲戦(double绫诲瀷)銆傝嫢杞崲澶辫触鍒欒繑鍥�0銆�
+        /// </summary>
+        /// <param name="thisValue">寰呰浆鎹㈢殑瀵硅薄</param>
+        /// <returns>杞崲鍚庣殑閲戦鍊硷紝澶辫触杩斿洖0</returns>
+        public static double ObjToMoney(this object thisValue)
+        {
+            double reval = 0;
+            if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval))
+            {
+                return reval;
+            }
+
+            return 0;
+        }
+
+        /// <summary>
+        /// 灏嗗璞¤浆鎹负閲戦(double)绫诲瀷锛岃浆鎹㈠け璐ユ椂杩斿洖鎸囧畾鐨勯敊璇��
+        /// </summary>
+        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
+        /// <param name="errorValue">杞崲澶辫触鏃惰繑鍥炵殑榛樿鍊�</param>
+        /// <returns>杞崲鎴愬姛鐨刣ouble鍊兼垨鎸囧畾鐨勯敊璇��</returns>
+        public static double ObjToMoney(this object thisValue, double errorValue)
+        {
+            double reval = 0;
+            if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval))
+            {
+                return reval;
+            }
+
+            return errorValue;
+        }
+
+        /// <summary>
+        /// 灏嗗璞¤浆鎹负瀛楃涓诧紝鑻ュ璞′负null鍒欒繑鍥炵┖瀛楃涓�
+        /// </summary>
+        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
+        /// <returns>鍘婚櫎鍓嶅悗绌烘牸鐨勫瓧绗︿覆缁撴灉</returns>
+        public static string ObjToString(this object thisValue)
+        {
+            if (thisValue != null) return thisValue.ToString().Trim();
+            return "";
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇瀵硅薄鏄惁涓嶄负绌烘垨null鍊�
+        /// </summary>
+        /// <param name="thisValue">瑕佸垽鏂殑瀵硅薄</param>
+        /// <returns>褰撳璞′笉涓虹┖涓斾笉绛変簬"undefined"鎴�"null"瀛楃涓叉椂杩斿洖true锛屽惁鍒欒繑鍥瀎alse</returns>
+        public static bool IsNotEmptyOrNull(this object thisValue)
+        {
+            return ObjToString(thisValue) != "" && ObjToString(thisValue) != "undefined" && ObjToString(thisValue) != "null";
+        }
+
+        /// <summary>
+        /// 灏嗗璞¤浆鎹负瀛楃涓诧紝濡傛灉瀵硅薄涓簄ull鍒欒繑鍥炴寚瀹氱殑閿欒鍊�
+        /// </summary>
+        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
+        /// <param name="errorValue">褰撳璞′负null鏃惰繑鍥炵殑鍊�</param>
+        /// <returns>瀵硅薄鐨勫瓧绗︿覆琛ㄧず鎴栨寚瀹氱殑閿欒鍊�</returns>
+        public static string ObjToString(this object thisValue, string errorValue)
+        {
+            if (thisValue != null) return thisValue.ToString().Trim();
+            return errorValue;
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇瀵硅薄鏄惁涓簄ull銆丏BNull鎴栫┖瀛楃涓�
+        /// </summary>
+        /// <param name="thisValue">瑕佹鏌ョ殑瀵硅薄</param>
+        /// <returns>濡傛灉瀵硅薄涓簄ull銆丏BNull鎴栫┖瀛楃涓插垯杩斿洖true锛屽惁鍒欒繑鍥瀎alse</returns>
+        public static bool IsNullOrEmpty(this object thisValue) => thisValue == null || thisValue == DBNull.Value || string.IsNullOrWhiteSpace(thisValue.ToString());
+
+        /// <summary>
+        /// 灏嗗璞¤浆鎹负Decimal绫诲瀷
+        /// </summary>
+        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
+        /// <returns>杞崲鍚庣殑Decimal鍊硷紝杞崲澶辫触杩斿洖0</returns>
+        public static Decimal ObjToDecimal(this object thisValue)
+        {
+            Decimal reval = 0;
+            if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval))
+            {
+                return reval;
+            }
+
+            return 0;
+        }
+
+        /// <summary>
+        /// 灏嗗璞¤浆鎹负Decimal绫诲瀷锛岃嫢杞崲澶辫触鍒欒繑鍥炴寚瀹氱殑榛樿鍊�
+        /// </summary>
+        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
+        /// <param name="errorValue">杞崲澶辫触鏃惰繑鍥炵殑榛樿鍊�</param>
+        /// <returns>杞崲鎴愬姛鐨凞ecimal鍊兼垨鎸囧畾鐨勯粯璁ゅ��</returns>
+        public static Decimal ObjToDecimal(this object thisValue, decimal errorValue)
+        {
+            Decimal reval = 0;
+            if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval))
+            {
+                return reval;
+            }
+
+            return errorValue;
+        }
+
+        /// <summary>
+        /// 灏嗗璞¤浆鎹负DateTime绫诲瀷
+        /// </summary>
+        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
+        /// <returns>杞崲鍚庣殑DateTime鍊硷紝杞崲澶辫触杩斿洖DateTime.MinValue</returns>
+        public static DateTime ObjToDate(this object thisValue)
+        {
+            DateTime reval = DateTime.MinValue;
+            if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval))
+            {
+                reval = Convert.ToDateTime(thisValue);
+            }
+
+            return reval;
+        }
+
+        /// <summary>
+        /// 灏嗗璞¤浆鎹负DateTime绫诲瀷锛岃浆鎹㈠け璐ユ椂杩斿洖鎸囧畾鐨勯粯璁ゅ��
+        /// </summary>
+        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
+        /// <param name="errorValue">杞崲澶辫触鏃惰繑鍥炵殑榛樿鍊�</param>
+        /// <returns>杞崲鎴愬姛鐨凞ateTime鍊兼垨鎸囧畾鐨勯粯璁ゅ��</returns>
+        public static DateTime ObjToDate(this object thisValue, DateTime errorValue)
+        {
+            DateTime reval = DateTime.MinValue;
+            if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval))
+            {
+                return reval;
+            }
+
+            return errorValue;
+        }
+
+        /// <summary>
+        /// 灏嗗璞¤浆鎹负甯冨皵鍊�
+        /// </summary>
+        /// <param name="thisValue">瑕佽浆鎹㈢殑瀵硅薄</param>
+        /// <returns>杞崲鍚庣殑甯冨皵鍊硷紝杞崲澶辫触鏃惰繑鍥瀎alse</returns>
+        public static bool ObjToBool(this object thisValue)
+        {
+            bool reval = false;
+            if (thisValue != null && thisValue != DBNull.Value && bool.TryParse(thisValue.ToString(), out reval))
+            {
+                return reval;
+            }
+
+            return reval;
+        }
+
+        /// <summary>
+        /// 灏咲ateTime杞崲涓篣nix鏃堕棿鎴筹紙绉掔骇锛�
+        /// </summary>
+        /// <param name="thisValue">闇�瑕佽浆鎹㈢殑DateTime瀵硅薄</param>
+        /// <returns>杩斿洖琛ㄧずUnix鏃堕棿鎴崇殑瀛楃涓�</returns>
+        public static string DateToTimeStamp(this DateTime thisValue)
+        {
+            TimeSpan ts = thisValue - new DateTime(1970, 1, 1, 0, 0, 0, 0);
+            return Convert.ToInt64(ts.TotalSeconds).ToString();
+        }
+
+        /// <summary>
+        /// 灏嗗璞¤浆鎹负鎸囧畾绫诲瀷
+        /// </summary>
+        /// <param name="value">瑕佽浆鎹㈢殑瀵硅薄</param>
+        /// <param name="type">鐩爣绫诲瀷</param>
+        /// <returns>杞崲鍚庣殑瀵硅薄</returns>
+        /// <remarks>
+        /// 鏀寔澶勭悊null鍊笺�佹灇涓剧被鍨嬨�佹硾鍨嬬被鍨嬨�丟uid銆乂ersion绛夌壒娈婄被鍨嬬殑杞崲銆�
+        /// 濡傛灉杞崲澶辫触鎴栫被鍨嬩笉鍖归厤锛屽皢杩斿洖鍘熷鍊兼垨鎶涘嚭寮傚父銆�
+        /// </remarks>
+        public static object ChangeType(this object value, Type type)
+        {
+            if (value == null && type.IsGenericType) return Activator.CreateInstance(type);
+            if (value == null) return null;
+            if (type == value.GetType()) return value;
+            if (type.IsEnum)
+            {
+                if (value is string)
+                    return Enum.Parse(type, value as string);
+                else
+                    return Enum.ToObject(type, value);
+            }
+
+            if (!type.IsInterface && type.IsGenericType)
+            {
+                Type innerType = type.GetGenericArguments()[0];
+                object innerValue = ChangeType(value, innerType);
+                return Activator.CreateInstance(type, new object[] { innerValue });
+            }
+
+            if (value is string && type == typeof(Guid)) return new Guid(value as string);
+            if (value is string && type == typeof(Version)) return new Version(value as string);
+            if (!(value is IConvertible)) return value;
+            return Convert.ChangeType(value, type);
+        }
+
+        /// <summary>
+        /// 灏嗗璞″�艰浆鎹负鎸囧畾绫诲瀷鐨勬硾鍨嬪垪琛ㄣ��
+        /// </summary>
+        /// <param name="value">寰呰浆鎹㈢殑瀵硅薄鍊�</param>
+        /// <param name="type">鐩爣鍒楄〃鍏冪礌绫诲瀷</param>
+        /// <returns>杞崲鍚庣殑娉涘瀷鍒楄〃瀵硅薄锛岃嫢杈撳叆涓簄ull鍒欒繑鍥為粯璁ゅ��</returns>
+        /// <remarks>
+        /// 鏀寔澶勭悊浠ユ嫭鍙峰寘瑁圭殑瀛楃涓叉牸寮忥紙濡�"(1,2,3)"鎴�"("a","b")"锛夛紝
+        /// 鑷姩鍘婚櫎鍒嗛殧绗﹀苟灏嗗厓绱犺浆鎹负鐩爣绫诲瀷鍚庢坊鍔犲埌鍒楄〃銆�
+        /// </remarks>
+        public static object ChangeTypeList(this object value, Type type)
+        {
+            if (value == null) return default;
+
+            var gt = typeof(List<>).MakeGenericType(type);
+            dynamic lis = Activator.CreateInstance(gt);
+
+            var addMethod = gt.GetMethod("Add");
+            string values = value.ToString();
+            if (values != null && values.StartsWith("(") && values.EndsWith(")"))
+            {
+                string[] splits;
+                if (values.Contains("\",\""))
+                {
+                    splits = values.Remove(values.Length - 2, 2)
+                        .Remove(0, 2)
+                        .Split("\",\"");
+                }
+                else
+                {
+                    splits = values.Remove(0, 1)
+                        .Remove(values.Length - 2, 1)
+                        .Split(",");
+                }
+
+                foreach (var split in splits)
+                {
+                    var str = split;
+                    if (split.StartsWith("\"") && split.EndsWith("\""))
+                    {
+                        str = split.Remove(0, 1)
+                            .Remove(split.Length - 2, 1);
+                    }
+
+                    addMethod.Invoke(lis, new object[] { ChangeType(str, type) });
+                }
+            }
+
+            return lis;
+        }
+
+        /// <summary>
+        /// 灏嗗璞″簭鍒楀寲涓篔SON瀛楃涓�
+        /// </summary>
+        /// <param name="value">瑕佸簭鍒楀寲鐨勫璞�</param>
+        /// <returns>瀵硅薄鐨凧SON瀛楃涓茶〃绀�</returns>
+        public static string ToJson(this object value)
+        {
+            return JsonConvert.SerializeObject(value);
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇瀵硅薄鏄惁鍙互杞崲涓烘暣鏁�
+        /// </summary>
+        /// <param name="obj">瑕佸垽鏂殑瀵硅薄</param>
+        /// <returns>濡傛灉鍙互杞崲涓烘暣鏁拌繑鍥瀟rue锛屽惁鍒欒繑鍥瀎alse</returns>
+        public static bool IsInt(this object obj)
+        {
+            if (obj == null)
+                return false;
+            bool reslut = Int32.TryParse(obj.ToString(), out int _number);
+            return reslut;
+
+        }
+        
+        /// <summary>
+        /// 鍒ゆ柇瀵硅薄鏄惁涓烘湁鏁堟棩鏈熸牸寮�
+        /// </summary>
+        /// <param name="str">寰呮娴嬬殑瀵硅薄</param>
+        /// <returns>true琛ㄧず鏄湁鏁堟棩鏈燂紝false鍒欎笉鏄�</returns>
+        /// <remarks>姝ゆ柟娉曟槸鎵╁睍鏂规硶锛岄�氳繃璋冪敤IsDate(out _)瀹炵幇</remarks>
+        public static bool IsDate(this object str)
+        {
+            return str.IsDate(out _);
+        }
+        
+        /// <summary>
+        /// 鍒ゆ柇瀵硅薄鏄惁鍙互杞崲涓烘湁鏁堢殑鏃ユ湡鏃堕棿
+        /// </summary>
+        /// <param name="str">瑕佸垽鏂殑瀵硅薄</param>
+        /// <param name="dateTime">杈撳嚭杞崲鍚庣殑鏃ユ湡鏃堕棿鍊�</param>
+        /// <returns>濡傛灉杞崲鎴愬姛杩斿洖true锛屽惁鍒欒繑鍥瀎alse</returns>
+        public static bool IsDate(this object str, out DateTime dateTime)
+        {
+            dateTime = DateTime.Now;
+            if (str == null || str.ToString() == "")
+            {
+                return false;
+            }
+            return DateTime.TryParse(str.ToString(), out dateTime);
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇瀛楃涓叉槸鍚﹀彲浠ヨ浆鎹负鏁板瓧
+        /// </summary>
+        /// <param name="str">瑕佹鏌ョ殑瀛楃涓�</param>
+        /// <param name="formatString">鏍煎紡瀛楃涓诧紙鏈娇鐢級</param>
+        /// <returns>濡傛灉瀛楃涓插彲浠ヨ浆鎹负鏁板瓧鍒欒繑鍥瀟rue锛屽惁鍒欒繑鍥瀎alse</returns>
+        /// <remarks>
+        /// 浣跨敤姝e垯琛ㄨ揪寮忛獙璇佸瓧绗︿覆鏄惁涓烘暟瀛楁牸寮忥紝鏀寔姝h礋鍙峰拰灏忔暟鐐�
+        /// </remarks>
+        public static bool IsNumber(this string str, string formatString)
+        {
+            if (string.IsNullOrEmpty(str)) return false;
+
+            return Regex.IsMatch(str, @"^[+-]?\d*[.]?\d*$");
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇瀛楃涓叉槸鍚︿负鏈夋晥鐨凣uid鏍煎紡
+        /// </summary>
+        /// <param name="guid">瑕侀獙璇佺殑瀛楃涓�</param>
+        /// <returns>濡傛灉瀛楃涓叉槸鏈夋晥鐨凣uid鏍煎紡鍒欒繑鍥瀟rue锛屽惁鍒欒繑鍥瀎alse</returns>
+        public static bool IsGuid(this string guid)
+        {
+            Guid newId;
+            return guid.GetGuid(out newId);
+        }
+
+        /// <summary>
+        /// 灏嗗瓧绗︿覆杞崲涓篏uid绫诲瀷
+        /// </summary>
+        /// <param name="guid">瑕佽浆鎹㈢殑瀛楃涓�</param>
+        /// <param name="outId">杈撳嚭杞崲鍚庣殑Guid</param>
+        /// <returns>杞崲鎴愬姛杩斿洖true锛屽惁鍒欒繑鍥瀎alse</returns>
+        public static bool GetGuid(this string guid, out Guid outId)
+        {
+            Guid emptyId = Guid.Empty;
+            return Guid.TryParse(guid, out outId);
+        }
+
+        /// <summary>
+        /// 灏嗗瓧绗︿覆绫诲瀷鐨勬潯浠惰浆鎹负瀵瑰簲鐨凩inq琛ㄨ揪寮忕被鍨�
+        /// </summary>
+        /// <param name="stringType">琛ㄧず鏉′欢鐨勫瓧绗︿覆</param>
+        /// <returns>瀵瑰簲鐨凩inq琛ㄨ揪寮忕被鍨嬫灇涓惧��</returns>
+        /// <remarks>
+        /// 璇ユ柟娉曠敤浜庡皢鍓嶇浼犻�掔殑鏉′欢瀛楃涓叉槧灏勪负鍚庣Linq鏌ヨ浣跨敤鐨勮〃杈惧紡绫诲瀷锛�
+        /// 鏀寔鍖呭惈銆佸ぇ浜庣瓑浜庛�佸皬浜庣瓑浜庛�佸ぇ浜庛�佸皬浜庛�佹ā绯婂尮閰嶇瓑甯歌鏉′欢绫诲瀷锛�
+        /// 榛樿杩斿洖绛変簬(Equal)绫诲瀷
+        /// </remarks>
+        public static LinqExpressionType GetLinqCondition(this string stringType)
+        {
+            LinqExpressionType linqExpression;
+            switch (stringType)
+            {
+                case HtmlElementType.Contains:
+                case HtmlElementType.selectlist:
+                case nameof(HtmlElementType.Contains):
+                    linqExpression = LinqExpressionType.In;
                     break;
-                case HtmlElementType.notequal:
-                    linqExpression = LinqExpressionType.NotEqual;
-                    break;
-                case HtmlElementType.notequal:
-                    linqExpression = LinqExpressionType.NotEqual;
-                    break;
-                default:
-                    linqExpression = LinqExpressionType.Equal;
-                    break;
-            }
-            return linqExpression;
-        }
-    }
-}
+                case HtmlElementType.ThanOrEqual:
+                case nameof(HtmlElementType.ThanOrEqual):
+                case HtmlElementType.thanorequal:
+                    linqExpression = LinqExpressionType.ThanOrEqual;
+                    break;
+                case HtmlElementType.LessOrEqual:
+                case nameof(HtmlElementType.LessOrEqual):
+                case HtmlElementType.lessorequal:
+                    linqExpression = LinqExpressionType.LessThanOrEqual;
+                    break;
+                case HtmlElementType.GT:
+                case nameof(HtmlElementType.GT):
+                    linqExpression = LinqExpressionType.GreaterThan;
+                    break;
+                case HtmlElementType.lt:
+                    linqExpression = LinqExpressionType.LessThan;
+                    break;
+                case HtmlElementType.like:
+                    linqExpression = LinqExpressionType.Contains;
+                    break;
+                case HtmlElementType.notequal:
+                    linqExpression = LinqExpressionType.NotEqual;
+                    break;
+                default:
+                    linqExpression = LinqExpressionType.Equal;
+                    break;
+            }
+            return linqExpression;
+        }
+    }
+}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs
index 6696d46..3b9faf3 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -151,9 +151,9 @@
         /// 鏍规嵁璁惧缂栧彿銆佸綋鍓嶅湴鍧�鎸夌収浼樺厛绾т互鍙婂垱寤烘椂闂存帓搴忔煡璇换鍔℃睜鍑哄簱绫诲瀷鐨勬柊澧炵殑浠诲姟
         /// </summary>
         /// <param name="deviceNo">璁惧缂栧彿</param>
-        /// <param name="outStationCodes">褰撳墠鍦板潃</param>
+        /// <param name="outStationCodes">鍑哄簱绔欏彴鍦板潃</param>
         /// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄闆嗗悎锛屽彲鑳戒负null</returns>
-        List<Dt_Task> QueryStackerCraneOutTasks(string deviceNo, List<string> outStationCodes);
+        List<Dt_Task> QueryStackerCraneOutTasks(string deviceNo, List<string> outStationCodes,bool isTrue = true);
 
         /// <summary>
         /// 鏇存柊浠诲姟寮傚父淇℃伅鏄剧ず
@@ -191,6 +191,15 @@
         Dt_Task? UpdatePosition(int taskNum, string currentAddress);
 
         /// <summary>
+        /// 鏍规嵁浠诲姟鍙枫�佸綋鍓嶅湴鍧�銆佷笅涓�鍦板潃鏇存柊浠诲姟浣嶇疆淇℃伅
+        /// </summary>
+        /// <param name="taskNum">浠诲姟鍙�</param>
+        /// <param name="currentAddress">褰撳墠鍦板潃</param>
+        /// <param name="nextAddress">涓嬩竴鍦板潃</param>
+        /// <returns></returns>
+        Dt_Task? UpdatePosition(int taskNum, string currentAddress, string nextAddress);
+
+        /// <summary>
         /// 浠诲姟瀹屾垚
         /// </summary>
         /// <param name="taskNum">浠诲姟缂栧彿</param>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs
index b93568a..90f5f4a 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs
@@ -99,7 +99,7 @@
 
             if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish && task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty)
             {
-                _robotTaskService.CreateLocalRobotTask(task);
+               return _robotTaskService.CreateLocalRobotTask(task);
                 //if (!content.Status)
                 //{
                 //    return content;
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
index ebaa465..513b358 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
@@ -174,10 +174,11 @@
                 StockDTO stock = BuildRobotTaskStock(task, configKey);
 
                 // 鑾峰彇鎶撳彇鍜屾斁缃湴鍧�鐨勭嚎浣撻厤缃紙濡傛灉鏈夛級
-                var section = App.Configuration.GetSection("RobotTaskAddressRules").GetSection(stock?.TargetLineNo ?? string.Empty).GetChildren().Select(c => c.Value).ToArray();
+                var section = App.Configuration.GetSection("RobotAddressRules").GetSection(stock?.TargetLineNo ?? string.Empty).GetChildren().Select(c => c.Value).ToArray();
                 if (section.Length < 2)
                     return WebResponseContent.Instance.Error($"鏈壘鍒扮嚎浣揫{stock?.TargetLineNo}]鐨勫湴鍧�閰嶇疆");
 
+                int taskType = MapConfigKeyToRobotTaskType(configKey);
                 // 鍒涘缓鏈湴鏈哄櫒浜轰换鍔�
                 Dt_RobotTask robotTask = new()
                 {
@@ -186,14 +187,14 @@
                     RobotTargetAddress = section[1]!,
                     RobotSourceAddressLineCode = stock?.SourceLineNo ?? string.Empty,
                     RobotTargetAddressLineCode = stock?.TargetLineNo ?? string.Empty,
-                    RobotRoadway = stock?.Roadway ?? string.Empty,
+                    RobotRoadway = stock?.TargetLineNo == "11068" ? "娉ㄦ恫缁勭洏鏈烘鎵�" : "鎹㈢洏鏈烘鎵�" ?? string.Empty, // todo
                     RobotSourceAddressPalletCode = stock?.SourcePalletNo ?? string.Empty,
                     RobotTargetAddressPalletCode = stock?.TargetPalletNo ?? string.Empty,
-                    RobotTaskType = MapConfigKeyToRobotTaskType(configKey),
+                    RobotTaskType = taskType,
                     RobotTaskState = (int)TaskRobotStatusEnum.RobotNew,
                     RobotGrade = task.Grade,
                     Creater = "WCS_Local",
-                    RobotTaskTotalNum = 1,
+                    RobotTaskTotalNum = taskType == (int)RobotTaskTypeEnum.GroupPallet ? 48 : 1,
                     CreateDate = DateTime.Now
                 };
 
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Query.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Query.cs
index a633f79..6e6f76a 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Query.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Query.cs
@@ -127,9 +127,12 @@
     /// <param name="deviceNo">璁惧缂栧彿</param>
     /// <param name="currentAddress">褰撳墠鍦板潃</param>
     /// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄闆嗗悎锛屽彲鑳戒负null</returns>
-    public List<Dt_Task> QueryStackerCraneOutTasks(string deviceNo, List<string> outStationCodes)
+    public List<Dt_Task> QueryStackerCraneOutTasks(string deviceNo, List<string> outStationCodes, bool isTrue = true)
     {
-        return BaseDal.QueryData(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew && outStationCodes.Contains(x.CurrentAddress), TaskOrderBy);
+        if (isTrue)
+            return BaseDal.QueryData(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew && outStationCodes.Contains(x.NextAddress), TaskOrderBy);
+        else
+            return BaseDal.QueryData(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew && !outStationCodes.Contains(x.NextAddress), TaskOrderBy);
     }
 
     /// <summary>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Status.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Status.cs
index c4cc9d3..c760e6f 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Status.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Status.cs
@@ -175,4 +175,41 @@
         }
         return null;
     }
+
+    /// <summary>
+    /// 鏍规嵁浠诲姟鍙枫�佸綋鍓嶅湴鍧�鏇存柊浠诲姟浣嶇疆淇℃伅
+    /// </summary>
+    /// <param name="taskNum">浠诲姟鍙�</param>
+    /// <param name="currentAddress">褰撳墠鍦板潃</param>
+    /// <param name="nextAddress">涓嬩竴鍦板潃</param>
+    /// <returns></returns>
+    public Dt_Task? UpdatePosition(int taskNum, string currentAddress, string nextAddress)
+    {
+        try
+        {
+            if (string.IsNullOrEmpty(currentAddress))
+                throw new ArgumentNullException(nameof(currentAddress), "褰撳墠鍦板潃涓嶈兘涓虹┖");
+
+            Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.CurrentAddress == currentAddress);
+            if (task == null) throw new Exception($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�");
+
+            string oldCurrentPos = task.CurrentAddress;
+            string oldNextPos = task.NextAddress;
+
+            task.CurrentAddress = task.NextAddress;
+            task.NextAddress = nextAddress;
+
+            task.ModifyDate = DateTime.Now;
+            task.Modifier = "System";
+            BaseDal.UpdateData(task);
+
+            _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"绯荤粺鑷姩娴佺▼锛屾洿鏂板綋鍓嶄綅缃�恵oldCurrentPos} ----> {task.CurrentAddress}銆戝拰涓嬩竴浣嶇疆銆恵oldNextPos} ----> {task.NextAddress}銆�");
+            return task;
+        }
+        catch (Exception ex)
+        {
+            Console.WriteLine($"UpdatePosition 鏇存柊浠诲姟浣嶇疆澶辫触,浠诲姟鍙�:銆恵taskNum}銆�,閿欒淇℃伅:銆恵ex.Message}銆�");
+        }
+        return null;
+    }
 }
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs
index ac18766..7372d1a 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs
@@ -244,6 +244,7 @@
                                     var task = _taskService.QueryManualInboundTask(childDeviceCode);
                                     if (task != null)
                                     {
+                                        QuartzLogHelper.LogInfo(_logger, $"鑾峰彇鍒拌緭閫佺嚎寮�濮嬩换鍔★紝浠诲姟鍙凤細{task.TaskNum}锛岀姸鎬�: {task.TaskStatus},褰撳墠鍦板潃锛歿conveyorLine.DeviceCode}", conveyorLine.DeviceCode);
                                         var handler = new ManualInboundTaskHandler(_taskService, _logger);
                                         handler.WriteTaskToPlc(conveyorLine, childDeviceCode, task);
                                     }
@@ -270,21 +271,21 @@
                                 Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.TaskNo, childDeviceCode);
                                 if (!task.IsNullOrEmpty())
                                 {
-                                    QuartzLogHelper.LogInfo(_logger, "Execute锛氬瓙璁惧 {ChildDeviceCode} 澶勭悊浠诲姟 {TaskNum}锛岀姸鎬�: {Status}", $"澶勭悊浠诲姟 {task.TaskNum}锛岀姸鎬�: {task.TaskStatus}", conveyorLine.DeviceCode, childDeviceCode, task.TaskNum, task.TaskStatus);
+                                    QuartzLogHelper.LogInfo(_logger, $"澶勭悊浠诲姟 {task.TaskNum}锛岀姸鎬�: {task.TaskStatus}", conveyorLine.DeviceCode);
                                     // 澶勭悊浠诲姟鐘舵�侊紙鏍规嵁鐘舵�佸垎鍙戝埌涓嶅悓鏂规硶锛�
                                     ProcessTaskState(conveyorLine, command, task, childDeviceCode);
                                     return Task.CompletedTask;
                                 }
                                 else if (!command.Barcode.IsNullOrEmpty() && childDeviceCode == "11068")
                                 {
-                                    if (_robotTaskService.Db.Queryable<Dt_RobotTask>().Any(x => x.RobotTargetAddressPalletCode == command.Barcode))
+                                    var isWcsTask = _taskService.Db.Queryable<Dt_Task>().Any(x => x.PalletCode == command.Barcode && x.TaskStatus == (int)TaskOutStatusEnum.OutNew);
+                                    var isRobotTask = _robotTaskService.Db.Queryable<Dt_RobotTask>().Any(x => x.RobotTargetAddressPalletCode == command.Barcode);
+                                    if (isWcsTask || isRobotTask)
                                     {
                                         return Task.CompletedTask;
                                     }
 
-                                    Random rnd = new Random();
-                                    int num = rnd.StrictNext();//浜х敓鐪熼殢鏈烘暟
-                                                               // 娌℃湁浠诲姟鍙蜂絾鏈夋潯鐮佸苟涓斿湪11068浣嶇疆锛岀洿鎺ユ坊鍔犳満姊版墜缁勭洏浠诲姟
+                                    // 鐩存帴娣诲姞鏈烘鎵嬬粍鐩樹换鍔�
                                     Dt_RobotTask robotTask = new Dt_RobotTask
                                     {
                                         RobotTargetAddressPalletCode = command.Barcode,
@@ -296,11 +297,12 @@
                                         RobotGrade = 1,
                                         RobotRoadway = "娉ㄦ恫缁勭洏鏈烘鎵�",
                                         RobotTargetAddressLineCode = childDeviceCode,
-                                        RobotTaskNum = num, // 鐢熸垚浠诲姟鍙�
+                                        RobotTaskNum = Random.Shared.StrictNext(), // 鐢熸垚浠诲姟鍙�
                                         RobotDispatchertime = DateTime.Now,
                                     };
                                     if (_robotTaskService.AddData(robotTask).Status)
                                     {
+                                        QuartzLogHelper.LogInfo(_logger, $"鐢熶骇鏈烘鎵嬩换鍔℃垚鍔燂紝 {robotTask.RobotTaskNum}锛岀姸鎬�: {robotTask.RobotTaskState},褰撳墠鍦板潃锛歿conveyorLine.DeviceCode}", conveyorLine.DeviceCode);
                                         conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
                                     }
                                 }
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs
index a113186..a567ad2 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs
@@ -1,5 +1,6 @@
 using MapsterMapper;
 using Serilog;
+using System.Threading.Tasks;
 using WIDESEAWCS_Common.TaskEnum;
 using WIDESEAWCS_Core;
 using WIDESEAWCS_ITaskInfoService;
@@ -171,20 +172,41 @@
 
             QuartzLogHelper.LogInfo(_logger, $"RequestInNextAddress锛氬叆搴撲笅涓�鍦板潃锛屼换鍔″彿: {task.TaskNum}锛屽瓙璁惧: {childDeviceCode}", conveyorLine.DeviceCode);
 
-            //// 濡傛灉涓嶆槸绌烘墭鐩樹换鍔★紝澶勭悊鐩爣鍦板潃
-            //if (task.TaskType != (int)TaskOutboundTypeEnum.OutEmpty)
-            //{
+            bool isEmptyTask = task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty;
 
-            Dt_Router routers = _routerService.QueryNextRoute(task.NextAddress, task.TargetAddress);
-            if (routers == null) throw new Exception($"鏈壘鍒拌澶囪矾鐢变俊鎭�");
+            // 纭畾鐩爣鍦板潃
+            string targetAddress;
+            if (isEmptyTask)
+            {
+                targetAddress = "2125";
+                QuartzLogHelper.LogDebug(_logger, $"瀛愯澶�: {childDeviceCode}锛屽叆搴撲笅涓�鐩爣鍦板潃: {2125}", conveyorLine.DeviceCode);
+            }
+            else
+            {
+                Dt_Router routers = _routerService.QueryNextRoute(task.NextAddress, task.TargetAddress);
+                if (routers == null) throw new Exception($"鏈壘鍒拌澶囪矾鐢变俊鎭�");
+                targetAddress = routers.ChildPosi;
+            }
 
-            _targetAddressSelector.HandleInboundNextAddress(conveyorLine, routers.ChildPosi, childDeviceCode);
-            //}
+            // 澶勭悊鐩爣鍦板潃锛欳hildPosi == "2125" 鏃惰烦杩� HandleInboundNextAddress
+            if (targetAddress == "2125")
+            {
+                conveyorLine.SetValue(ConveyorLineDBNameNew.Target, "2125", childDeviceCode);
+            }
+            else if (!_targetAddressSelector.HandleInboundNextAddress(conveyorLine, targetAddress, childDeviceCode))
+            {
+                return;
+            }
 
-            // 鏇存柊浠诲姟褰撳墠浣嶇疆
-            _ = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress);
-
-            // 璁剧疆 WCS_STB 鏍囧織锛岃〃绀� WCS 宸插鐞�
+            // 鏇存柊浠诲姟褰撳墠浣嶇疆鍜� WCS_ACK
+            if (isEmptyTask)
+            {
+                _ = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress, "2125");
+            }
+            else
+            {
+                _ = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress);
+            }
             conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
         }
 
@@ -227,29 +249,42 @@
         /// <param name="conveyorLine">杈撻�佺嚎璁惧瀵硅薄</param>
         /// <param name="command">PLC 鍛戒护鏁版嵁</param>
         /// <param name="childDeviceCode">瀛愯澶囩紪鐮�</param>
-        public void RequestOutbound(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode)
+        public Task RequestOutbound(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode)
         {
             // 鏌ヨ寰呭鐞嗕换鍔�
             Dt_Task? task = _taskFilter.QueryPendingTask(conveyorLine.DeviceCode, childDeviceCode);
-            if (task != null)
+            if (task == null) return Task.CompletedTask;
+
+            // 纭畾鐩爣鍦板潃锛氱┖鎵樼洏浠诲姟浣跨敤 "2201"锛屽叾浠栦换鍔′娇鐢� NextAddress
+            var isEmptyTask = task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty;
+            var targetAddress = task.CurrentAddress == "2217" ? (isEmptyTask ? "2201" : task.NextAddress) : task.NextAddress;
+
+            // 澶勭悊鐗规畩鍦板潃 2217锛岄渶瑕佽皟鐢ㄧ洰鏍囧湴鍧�閫夋嫨鍣�
+            if (task.CurrentAddress == "2217" && !_targetAddressSelector.HandleOutboundNextAddress(conveyorLine, targetAddress, childDeviceCode))
             {
-                // 璁剧疆浠诲姟鍙�
-                conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, task.TaskNum, childDeviceCode);
-
-                // 璁剧疆鎵樼洏鏉$爜
-                conveyorLine.SetValue(ConveyorLineDBNameNew.Barcode, task.PalletCode, childDeviceCode);
-
-                // 璁剧疆鐩爣鍦板潃
-                conveyorLine.SetValue(ConveyorLineDBNameNew.Target, task.NextAddress, childDeviceCode);
-
-                // 鍥炲 ACK 纭
-                conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
-
-                // 鏇存柊浠诲姟鐘舵��
-                _taskService.UpdateTaskStatusToNext(task);
-
-                QuartzLogHelper.LogInfo(_logger, "RequestOutbound锛氬嚭搴撲换鍔″凡涓嬪彂锛屼换鍔″彿: {TaskNum}锛屽瓙璁惧: {ChildDeviceCode}", $"鍑哄簱浠诲姟宸蹭笅鍙戯紝浠诲姟鍙�: {task.TaskNum}", conveyorLine.DeviceCode, task.TaskNum, childDeviceCode);
+                return Task.CompletedTask; ;
             }
+
+            // 璁剧疆浠诲姟鍙枫�佹墭鐩樻潯鐮併�佺洰鏍囧湴鍧�銆乄CS_ACK
+            conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, task.TaskNum, childDeviceCode);
+            conveyorLine.SetValue(ConveyorLineDBNameNew.Barcode, task.PalletCode, childDeviceCode);
+            conveyorLine.SetValue(ConveyorLineDBNameNew.Target, targetAddress, childDeviceCode);
+            conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
+
+            // 鏇存柊浠诲姟鐘舵�佹垨浣嶇疆
+            if (isEmptyTask && task.NextAddress == "2217")
+            {
+                task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskOutStatusEnum>();
+                task.NextAddress = "2201";
+                _taskService.Repository.UpdateData(task);
+            }
+            else
+            {
+                _taskService.UpdateTaskStatusToNext(task);
+            }
+
+            QuartzLogHelper.LogInfo(_logger, "RequestOutbound锛氬嚭搴撲换鍔″凡涓嬪彂锛屼换鍔″彿: {TaskNum}锛屽瓙璁惧: {ChildDeviceCode}", $"鍑哄簱浠诲姟宸蹭笅鍙戯紝浠诲姟鍙�: {task.TaskNum}", conveyorLine.DeviceCode, task.TaskNum, childDeviceCode);
+            return Task.CompletedTask;
         }
 
         /// <summary>
@@ -257,7 +292,6 @@
         /// </summary>
         /// <remarks>
         /// 褰撳嚭搴撲换鍔℃墽琛屽埌鏌愪釜涓棿绔欑偣鏃惰皟鐢ㄣ��
-        /// 鏍规嵁涓嬩竴鍦板潃鍒ゆ柇鏄惁闇�瑕佷笌鎷樻潫鏈�/鎻掓嫈閽夋満绛夎澶囦氦浜掋��
         /// </remarks>
         /// <param name="conveyorLine">杈撻�佺嚎璁惧瀵硅薄</param>
         /// <param name="command">PLC 鍛戒护鏁版嵁</param>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineTargetAddressSelector.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineTargetAddressSelector.cs
index 0cd3ffd..a950009 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineTargetAddressSelector.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineTargetAddressSelector.cs
@@ -130,7 +130,7 @@
         /// <param name="conveyorLine">杈撻�佺嚎璁惧瀵硅薄锛岀敤浜庡啓鍏ョ洰鏍囧湴鍧�鍜� ACK 淇″彿</param>
         /// <param name="nextAddress">涓嬩竴鍦板潃/鐩爣璁惧缂栫爜锛岀敤浜庤瘑鍒洰鏍囪澶囩被鍨�</param>
         /// <param name="childDeviceCode">褰撳墠瀛愯澶囩紪鐮侊紝鐢ㄤ簬绮剧‘瀹氫綅鍐欏叆鍝釜瀛愯澶�</param>
-        public void HandleInboundNextAddress(CommonConveyorLine conveyorLine, string nextAddress, string childDeviceCode)
+        public bool HandleInboundNextAddress(CommonConveyorLine conveyorLine, string nextAddress, string childDeviceCode)
         {
             // 璁板綍鍏ュ簱鍦烘櫙鐨勮皟璇曟棩蹇楋紝鍖呭惈瀛愯澶囧拰鐩爣鍦板潃淇℃伅
             WriteDebug(conveyorLine, "鍏ュ簱涓嬩竴鍦板潃", childDeviceCode, nextAddress);
@@ -141,8 +141,9 @@
             bool isAvailable = cvState == 2;
             if (isAvailable)
             {
-                conveyorLine.SetValue(ConveyorLineDBNameNew.Target, Convert.ToInt16(nextAddress), childDeviceCode);
+                return conveyorLine.SetValue(ConveyorLineDBNameNew.Target, Convert.ToInt16(nextAddress), childDeviceCode);
             }
+            return false;
         }
 
         /// <summary>
@@ -155,7 +156,7 @@
         /// <param name="conveyorLine">杈撻�佺嚎璁惧瀵硅薄锛岀敤浜庡啓鍏ョ洰鏍囧湴鍧�鍜� ACK 淇″彿</param>
         /// <param name="nextAddress">涓嬩竴鍦板潃/鐩爣璁惧缂栫爜锛岀敤浜庤瘑鍒洰鏍囪澶囩被鍨�</param>
         /// <param name="childDeviceCode">褰撳墠瀛愯澶囩紪鐮侊紝鐢ㄤ簬绮剧‘瀹氫綅鍐欏叆鍝釜瀛愯澶�</param>
-        public void HandleOutboundNextAddress(CommonConveyorLine conveyorLine, string nextAddress, string childDeviceCode)
+        public bool HandleOutboundNextAddress(CommonConveyorLine conveyorLine, string nextAddress, string childDeviceCode)
         {
             // 璁板綍鍑哄簱鍦烘櫙鐨勮皟璇曟棩蹇楋紝鍖呭惈瀛愯澶囧拰鐩爣鍦板潃淇℃伅
             WriteDebug(conveyorLine, "鍑哄簱涓嬩竴鍦板潃", childDeviceCode, nextAddress);
@@ -166,8 +167,9 @@
             bool isAvailable = cvState == 2;
             if (isAvailable)
             {
-                conveyorLine.SetValue(ConveyorLineDBNameNew.Target, Convert.ToInt16(nextAddress), childDeviceCode);
+                return conveyorLine.SetValue(ConveyorLineDBNameNew.Target, Convert.ToInt16(nextAddress), childDeviceCode);
             }
+            return false;
         }
 
         /// <summary>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ManualInbound/ManualInboundTaskHandler.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ManualInbound/ManualInboundTaskHandler.cs
index 4b8b7fe..23adac0 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ManualInbound/ManualInboundTaskHandler.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ManualInbound/ManualInboundTaskHandler.cs
@@ -53,13 +53,24 @@
             try
             {
                 // 鍐欏叆浠诲姟鍙�
-                conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, (short)task.TaskNum, childDeviceCode);
-                // 鍐欏叆璧峰鍦板潃
-                conveyorLine.SetValue(ConveyorLineDBNameNew.Source, short.Parse(task.SourceAddress ?? "0"), childDeviceCode);
+                var isTaskNum = conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, (short)task.TaskNum, childDeviceCode);
+                if (!isTaskNum) return;
+                QuartzLogHelper.LogInfo(_logger, $"浠诲姟鍙峰啓鍏LC鎴愬姛锛屼换鍔″彿銆恵task.TaskNum}銆�", conveyorLine.DeviceCode);
+                Thread.Sleep(500);
+
+                //// 鍐欏叆璧峰鍦板潃
+                //conveyorLine.SetValue(ConveyorLineDBNameNew.Source, short.Parse(task.SourceAddress ?? "0"), childDeviceCode);
+                //QuartzLogHelper.LogInfo(_logger, $"浠诲姟鍙峰啓鍏LC鎴愬姛锛屼换鍔″彿銆恵task.TaskNum}銆�", conveyorLine.DeviceCode);
+                //Thread.Sleep(500);
+
                 // 鍐欏叆鐩爣鍦板潃
-                conveyorLine.SetValue(ConveyorLineDBNameNew.Target, short.Parse(task.NextAddress ?? "0"), childDeviceCode);
+                var isTarget = conveyorLine.SetValue(ConveyorLineDBNameNew.Target, short.Parse(task.NextAddress ?? "0"), childDeviceCode);
+                if (!isTarget) return;
+                QuartzLogHelper.LogInfo(_logger, $"鐩爣鍦板潃鍐欏叆PLC鎴愬姛锛岀洰鏍囧湴鍧�銆恵task.NextAddress}銆�", conveyorLine.DeviceCode);
+                Thread.Sleep(500);
+
                 // 鍐欏叆鎵樼洏鍙�
-                conveyorLine.SetValue(ConveyorLineDBNameNew.Barcode, task.PalletCode, childDeviceCode);
+                //conveyorLine.SetValue(ConveyorLineDBNameNew.Barcode, task.PalletCode, childDeviceCode);
 
                 // 鏇存柊浠诲姟鐘舵�佸埌涓嬩竴闃舵
                 var updateResult = _taskService.UpdateTaskStatusToNext(task);
@@ -72,7 +83,7 @@
                 // 鍐欏叆ACK鏍囧織
                 conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
 
-                QuartzLogHelper.LogInfo(_logger, $"ManualInboundTaskHandler: 鎵嬪姩浠诲姟鍐欏叆PLC鎴愬姛锛屼换鍔″彿銆恵task.TaskNum}銆戯紝婧愬湴鍧�銆恵task.SourceAddress}銆�", conveyorLine.DeviceCode);
+                QuartzLogHelper.LogInfo(_logger, $"ManualInboundTaskHandler: 鎵嬪姩浠诲姟鍐欏叆PLC鎴愬姛锛屼换鍔″彿銆恵task.TaskNum}銆戯紝婧愬湴鍧�銆恵task.SourceAddress}銆戯紝鐩爣鍦板潃銆恵task.NextAddress}銆�", conveyorLine.DeviceCode);
             }
             catch (Exception ex)
             {
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotJob.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotJob.cs
index 8daf967..c97e7ed 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotJob.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotJob.cs
@@ -122,7 +122,7 @@
 
             // 鍒濆鍖栧懡浠ゅ鐞嗗櫒
             // 绠�鍗曞懡浠ゅ鐞嗗櫒锛氬鐞嗙姸鎬佹洿鏂扮瓑绠�鍗曞懡浠�
-            var simpleCommandHandler = new RobotSimpleCommandHandler(_taskProcessor, socketGateway, _logger);
+            var simpleCommandHandler = new RobotSimpleCommandHandler(_taskProcessor, socketGateway, _logger, _stateManager);
             // 鍓嶇紑鍛戒护澶勭悊鍣細澶勭悊 pickfinished銆乸utfinished 绛夊甫鍙傛暟鐨勫懡浠�
             var prefixCommandHandler = new RobotPrefixCommandHandler(robotTaskService, _taskProcessor, _stateManager, socketGateway, fakeBatteryPositionService, _logger);
 
@@ -212,10 +212,10 @@
                 var task = _taskProcessor.GetTask(robotCrane);
 
                 // 濡傛灉娌℃湁鑾峰彇鍒板緟澶勭悊浠诲姟锛屼笖RobotArmObject涓�1锛堟湁鐗╂枡锛夛紝鍒欒幏鍙栬璁惧鎵ц涓殑浠诲姟
-                if (task == null && state.RobotArmObject == 1)
-                {
-                    task = _taskProcessor.GetExecutingTask(robotCrane);
-                }
+                //if (task == null && state.RobotArmObject == 1)
+                //{
+                //    task = _taskProcessor.GetExecutingTask(robotCrane);
+                //}
 
                 // 濡傛灉鏈夊緟澶勭悊浠诲姟
                 if (task != null)
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotMessageHandler.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotMessageHandler.cs
index 90a5b70..3dc5a22 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotMessageHandler.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotMessageHandler.cs
@@ -92,7 +92,7 @@
             if (state.OperStatus == message)
             {
                 // 澶勭悊鎴愬姛鍚庯紝灏嗗師娑堟伅鍥炲啓鍒板鎴风锛堜繚鎸佸師鏈夎涓猴級
-                await _socketClientGateway.SendMessageAsync(client, message);
+                //await _socketClientGateway.SendMessageAsync(client, message);
             }
             // 璁板綍鎺ユ敹鍒扮殑娑堟伅鏃ュ織
             QuartzLogHelper.LogInfo(_logger, $"鎺ユ敹鍒板鎴风銆恵state.RobotCrane?.DeviceName}銆戝彂閫佹秷鎭�恵message}銆�", state.RobotCrane?.DeviceName);
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs
index 84113a2..da5c8c5 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs
@@ -170,36 +170,35 @@
             // 鏋勫缓鍙栬揣鎸囦护锛屾牸寮忥細Pickbattery,{婧愬湴鍧�}
             string taskString = $"Pickbattery,{task.RobotSourceAddress}";
 
-            // 閫氳繃 Socket 缃戝叧鍙戦�佹寚浠ゅ埌鏈哄櫒浜哄鎴风
-            bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString);
+            // 鏇存柊浠诲姟鐘舵�佷负"鏈哄櫒浜烘墽琛屼腑"
+            task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode();
 
-            if (result)
+            // 灏嗕换鍔″叧鑱斿埌鐘舵�佸璞�
+            state.CurrentTask = task;
+
+            if (isScanNG)
             {
-                // 鍙戦�佹垚鍔燂紝璁板綍 Info 鏃ュ織
-                QuartzLogHelper.LogInfo(_logger, $"涓嬪彂鍙栬揣鎸囦护鎴愬姛锛屾寚浠�: {taskString}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
-
-                // 鏇存柊浠诲姟鐘舵�佷负"鏈哄櫒浜烘墽琛屼腑"
-                task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode();
-
-                // 灏嗕换鍔″叧鑱斿埌鐘舵�佸璞�
-                state.CurrentTask = task;
-
-                if (isScanNG)
-                {
-                    state.IsScanNG = true;
-                }
-
-                // 淇濇寔鍘熻涔夛細浠呭湪鐘舵�佸畨鍏ㄥ啓鍏ユ垚鍔熷悗鍐嶆洿鏂颁换鍔$姸鎬�
-                // 杩欐牱鍙互纭繚鐘舵�佸拰浠诲姟璁板綍鐨勪竴鑷存��
-                if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
-                {
-                    await _robotTaskService.UpdateRobotTaskAsync(task);
-                }
+                state.IsScanNG = true;
             }
-            else
+
+            // 淇濇寔鍘熻涔夛細浠呭湪鐘舵�佸畨鍏ㄥ啓鍏ユ垚鍔熷悗鍐嶆洿鏂颁换鍔$姸鎬�
+            // 杩欐牱鍙互纭繚鐘舵�佸拰浠诲姟璁板綍鐨勪竴鑷存��
+            if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
             {
-                // 鍙戦�佸け璐ワ紝璁板綍 Error 鏃ュ織
-                QuartzLogHelper.LogError(_logger, $"涓嬪彂鍙栬揣鎸囦护澶辫触锛屾寚浠�: {taskString}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                QuartzLogHelper.LogInfo(_logger, $"鐘舵�佹洿鏂版垚鍔燂紝璁惧: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                // 閫氳繃 Socket 缃戝叧鍙戦�佹寚浠ゅ埌鏈哄櫒浜哄鎴风
+                bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString);
+                if (result)
+                {
+                    // 鍙戦�佹垚鍔燂紝璁板綍 Info 鏃ュ織
+                    QuartzLogHelper.LogInfo(_logger, $"涓嬪彂鍙栬揣鎸囦护鎴愬姛锛屾寚浠�: {taskString}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                    //await _robotTaskService.UpdateRobotTaskAsync(task);
+                }
+                else
+                {
+                    // 鍙戦�佸け璐ワ紝璁板綍 Error 鏃ュ織
+                    QuartzLogHelper.LogError(_logger, $"涓嬪彂鍙栬揣鎸囦护澶辫触锛屾寚浠�: {taskString}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                }
             }
         }
 
@@ -234,27 +233,26 @@
             // 鏍囪鐐逛綅涓哄凡浣跨敤
             _fakeBatteryPositionService.MarkAsUsed(positions);
 
-            // 閫氳繃 Socket 缃戝叧鍙戦�佹寚浠ゅ埌鏈哄櫒浜哄鎴风
-            bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString);
+            // 鏇存柊浠诲姟鐘舵�佷负"鏈哄櫒浜烘墽琛屼腑"
+            task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode();
 
-            if (result)
+            // 灏嗕换鍔″叧鑱斿埌鐘舵�佸璞�
+            state.CurrentTask = task;
+
+            if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
             {
-                QuartzLogHelper.LogInfo(_logger, $"涓嬪彂鍋囩數鑺彇璐ф寚浠ゆ垚鍔燂紝鎸囦护: {taskString}锛岀偣浣�: {string.Join(",", positions)}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                // 閫氳繃 Socket 缃戝叧鍙戦�佹寚浠ゅ埌鏈哄櫒浜哄鎴风
+                bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString);
 
-                // 鏇存柊浠诲姟鐘舵�佷负"鏈哄櫒浜烘墽琛屼腑"
-                task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode();
-
-                // 灏嗕换鍔″叧鑱斿埌鐘舵�佸璞�
-                state.CurrentTask = task;
-
-                if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
+                if (result)
                 {
-                    await _robotTaskService.UpdateRobotTaskAsync(task);
+                    QuartzLogHelper.LogInfo(_logger, $"涓嬪彂鍋囩數鑺彇璐ф寚浠ゆ垚鍔燂紝鎸囦护: {taskString}锛岀偣浣�: {string.Join(",", positions)}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                    //await _robotTaskService.UpdateRobotTaskAsync(task);
                 }
-            }
-            else
-            {
-                QuartzLogHelper.LogError(_logger, $"涓嬪彂鍋囩數鑺彇璐ф寚浠ゅけ璐ワ紝鎸囦护: {taskString}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                else
+                {
+                    QuartzLogHelper.LogError(_logger, $"涓嬪彂鍋囩數鑺彇璐ф寚浠ゅけ璐ワ紝鎸囦护: {taskString}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                }
             }
         }
 
@@ -307,31 +305,31 @@
         /// <param name="batchEnd">鎵规缁撴潫缂栧彿</param>
         public async Task SendPickWithBatchAsync(Dt_RobotTask task, RobotSocketState state, string position, int batchStart, int batchEnd)
         {
-            // 鍏堝彂閫佹�绘暟鎸囦护
-            string totalNumCmd = $"PickTotalNum,{task.RobotTaskTotalNum}";
-            await _socketClientGateway.SendToClientAsync(state.IPAddress, totalNumCmd);
 
-            // 鍐嶅彂閫佹壒娆″彇璐ф寚浠�
-            string range = batchEnd == 0 ? $"{batchStart}-0" : $"{batchStart}-{batchEnd}";
-            string taskString = $"Pickbattery,{position},{range}";
+            task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode();
+            state.CurrentTask = task;
 
-            bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString);
-
-            if (result)
+            if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
             {
-                QuartzLogHelper.LogInfo(_logger, $"涓嬪彂鎵规鍙栬揣鎸囦护鎴愬姛锛屾寚浠�: {taskString}锛屾壒娆�: {range}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                // 鍏堝彂閫佹�绘暟鎸囦护
+                string totalNumCmd = $"PickTotalNum,{task.RobotTaskTotalNum}";
+                await _socketClientGateway.SendToClientAsync(state.IPAddress, totalNumCmd);
 
-                task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode();
-                state.CurrentTask = task;
+                // 鍐嶅彂閫佹壒娆″彇璐ф寚浠�
+                string range = batchEnd == 0 ? $"{batchStart}-0" : $"{batchStart}-{batchEnd}";
+                string taskString = $"Pickbattery,{position},{range}";
 
-                if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
+                bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString);
+
+                if (result)
                 {
-                    await _robotTaskService.UpdateRobotTaskAsync(task);
+                    QuartzLogHelper.LogInfo(_logger, $"涓嬪彂鎵规鍙栬揣鎸囦护鎴愬姛锛屾寚浠�: {taskString}锛屾壒娆�: {range}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                    //await _robotTaskService.UpdateRobotTaskAsync(task);
                 }
-            }
-            else
-            {
-                QuartzLogHelper.LogError(_logger, $"涓嬪彂鎵规鍙栬揣鎸囦护澶辫触锛屾寚浠�: {taskString}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                else
+                {
+                    QuartzLogHelper.LogError(_logger, $"涓嬪彂鎵规鍙栬揣鎸囦护澶辫触锛屾寚浠�: {taskString}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                }
             }
         }
 
@@ -351,31 +349,31 @@
         /// <param name="batchEnd">鎵规缁撴潫缂栧彿</param>
         public async Task SendFakeBatteryPickWithBatchAsync(Dt_RobotTask task, RobotSocketState state, int batchStart, int batchEnd)
         {
-            // 鍏堝彂閫佹�绘暟鎸囦护
-            string totalNumCmd = $"PickTotalNum,{task.RobotTaskTotalNum}";
-            await _socketClientGateway.SendToClientAsync(state.IPAddress, totalNumCmd);
+            task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode();
+            state.CurrentTask = task;
 
-            // 鍐嶅彂閫佹壒娆″彇璐ф寚浠わ紙鍋囩數鑺浐瀹氫粠5鍙蜂綅鍙栵級
-            string range = batchEnd == 0 ? $"{batchStart}-0" : $"{batchStart}-{batchEnd}";
-            string taskString = $"Pickbattery,5,{range}";
-
-            bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString);
-
-            if (result)
+            if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
             {
-                QuartzLogHelper.LogInfo(_logger, $"涓嬪彂鍋囩數鑺壒娆″彇璐ф寚浠ゆ垚鍔燂紝鎸囦护: {taskString}锛屾壒娆�: {range}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                // 鍏堝彂閫佹�绘暟鎸囦护
+                string totalNumCmd = $"PickTotalNum,{task.RobotTaskTotalNum}";
+                await _socketClientGateway.SendToClientAsync(state.IPAddress, totalNumCmd);
 
-                task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode();
-                state.CurrentTask = task;
+                // 鍐嶅彂閫佹壒娆″彇璐ф寚浠わ紙鍋囩數鑺浐瀹氫粠5鍙蜂綅鍙栵級
+                string range = batchEnd == 0 ? $"{batchStart}-0" : $"{batchStart}-{batchEnd}";
+                string taskString = $"Pickbattery,5,{range}";
 
-                if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
+                bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString);
+
+                if (result)
                 {
-                    await _robotTaskService.UpdateRobotTaskAsync(task);
+                    QuartzLogHelper.LogInfo(_logger, $"涓嬪彂鍋囩數鑺壒娆″彇璐ф寚浠ゆ垚鍔燂紝鎸囦护: {taskString}锛屾壒娆�: {range}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+
+                    //await _robotTaskService.UpdateRobotTaskAsync(task);
                 }
-            }
-            else
-            {
-                QuartzLogHelper.LogError(_logger, $"涓嬪彂鍋囩數鑺壒娆″彇璐ф寚浠ゅけ璐ワ紝鎸囦护: {taskString}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                else
+                {
+                    QuartzLogHelper.LogError(_logger, $"涓嬪彂鍋囩數鑺壒娆″彇璐ф寚浠ゅけ璐ワ紝鎸囦护: {taskString}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                }
             }
         }
 
@@ -396,31 +394,31 @@
         /// <param name="batchEnd">鎵规缁撴潫缂栧彿</param>
         public async Task SendPutWithBatchAsync(Dt_RobotTask task, RobotSocketState state, string position, int batchStart, int batchEnd)
         {
-            // 鍏堝彂閫佹�绘暟鎸囦护
-            string totalNumCmd = $"PutTotalNum,{task.RobotTaskTotalNum}";
-            await _socketClientGateway.SendToClientAsync(state.IPAddress, totalNumCmd);
+            task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode();
+            state.CurrentTask = task;
 
-            // 鍐嶅彂閫佹壒娆℃斁璐ф寚浠�
-            string range = batchEnd == 0 ? $"{batchStart}-0" : $"{batchStart}-{batchEnd}";
-            string taskString = $"Putbattery,{position},{range}";
-
-            bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString);
-
-            if (result)
+            if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
             {
-                QuartzLogHelper.LogInfo(_logger, $"涓嬪彂鏀捐揣鎸囦护鎴愬姛锛屾寚浠�: {taskString}锛屾壒娆�: {range}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                // 鍏堝彂閫佹�绘暟鎸囦护
+                string totalNumCmd = $"PutTotalNum,{task.RobotTaskTotalNum}";
+                await _socketClientGateway.SendToClientAsync(state.IPAddress, totalNumCmd);
 
-                task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode();
-                state.CurrentTask = task;
+                // 鍐嶅彂閫佹壒娆℃斁璐ф寚浠�
+                string range = batchEnd == 0 ? $"{batchStart}-0" : $"{batchStart}-{batchEnd}";
+                string taskString = $"Putbattery,{position},{range}";
 
-                if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
+                bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString);
+
+                if (result)
                 {
-                    await _robotTaskService.UpdateRobotTaskAsync(task);
+                    QuartzLogHelper.LogInfo(_logger, $"涓嬪彂鏀捐揣鎸囦护鎴愬姛锛屾寚浠�: {taskString}锛屾壒娆�: {range}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+
+                    //await _robotTaskService.UpdateRobotTaskAsync(task);
                 }
-            }
-            else
-            {
-                QuartzLogHelper.LogError(_logger, $"涓嬪彂鏀捐揣鎸囦护澶辫触锛屾寚浠�: {taskString}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                else
+                {
+                    QuartzLogHelper.LogError(_logger, $"涓嬪彂鏀捐揣鎸囦护澶辫触锛屾寚浠�: {taskString}锛岃澶�: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName);
+                }
             }
         }
 
@@ -785,5 +783,11 @@
 
             return result;
         }
+
+        public bool UpdateRobotTask(Dt_RobotTask task)
+        {
+            WebResponseContent content = _robotTaskService.UpdateData(task);
+            return content.Status;
+        }
     }
 }
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs
index b0c1d9d..5c709bf 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs
@@ -1,4 +1,6 @@
+using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
 using Serilog;
+using System.Net;
 using WIDESEAWCS_Common.TaskEnum;
 using WIDESEAWCS_Core.LogHelper;
 using WIDESEAWCS_Model.Models;
@@ -42,15 +44,24 @@
         private readonly ILogger _logger;
 
         /// <summary>
+        /// 鏈烘鎵嬬姸鎬佺鐞嗗櫒
+        /// </summary>
+        /// <remarks>
+        /// 鐢ㄤ簬璇诲彇鍜屾洿鏂版満鍣ㄤ汉鐨勭姸鎬併��
+        /// </remarks>
+        private readonly RobotStateManager _stateManager;
+
+        /// <summary>
         /// 鏋勯�犲嚱鏁�
         /// </summary>
         /// <param name="taskProcessor">浠诲姟澶勭悊鍣ㄥ疄渚�</param>
         /// <param name="logger">鏃ュ織璁板綍鍣�</param>
-        public RobotSimpleCommandHandler(RobotTaskProcessor taskProcessor, ISocketClientGateway socketClientGateway, ILogger logger)
+        public RobotSimpleCommandHandler(RobotTaskProcessor taskProcessor, ISocketClientGateway socketClientGateway, ILogger logger, RobotStateManager stateManager)
         {
             _taskProcessor = taskProcessor;
             _socketClientGateway = socketClientGateway;
             _logger = logger;
+            _stateManager = stateManager;
         }
 
         /// <summary>
@@ -140,6 +151,21 @@
                     state.BatteryArrived = false;
 
                     await _socketClientGateway.SendToClientAsync(state.IPAddress, "batteryarrivedno");
+                    return true;
+                // ==================== 鎺ユ敹浠诲姟鍙嶉 ====================
+
+                // 鍙栬揣鎺ユ敹
+                case "pickbatteryover":
+                    var isResult = UpdateStatus(state, true);
+                    if (!isResult)
+                        return false;
+                    return true;
+
+                // 鏀捐揣鎺ユ敹
+                case "putbatteryover":
+                    isResult = UpdateStatus(state, false);
+                    if (!isResult)
+                        return false;
                     return true;
 
                 // ==================== 鍏ㄩ儴瀹屾垚鍛戒护 ====================
@@ -432,5 +458,17 @@
                     return false;
             }
         }
+
+        public bool UpdateStatus(RobotSocketState state, bool isPick)
+        {
+            var task = _taskProcessor.GetTask(state?.RobotCrane);
+            if (task == null)
+            {
+                QuartzLogHelper.LogError(_logger, $"鍙栬揣鎺ユ敹澶辫触: 鏈壘鍒般�恵state?.RobotCrane}銆戠殑浠诲姟", state.RobotCrane?.DeviceName ?? "Unknown");
+            }
+            task.RobotTaskState = (int)TaskRobotStatusEnum.RobotExecuting;
+            _taskProcessor.UpdateRobotTask(task);
+            return true;
+        }
     }
 }
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs
index ec3d757..2567908 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs
@@ -273,7 +273,7 @@
 
                     if (_stateManager.TryUpdateStateSafely(ipAddress, stateToUpdate))
                     {
-                        await _robotTaskService.UpdateRobotTaskAsync(task);
+                        //await _robotTaskService.UpdateRobotTaskAsync(task);
                     }
                 }
             }
@@ -337,15 +337,15 @@
                 // 濡傛灉鏉$爜鐢熸垚鎴愬姛
                 if (!string.IsNullOrEmpty(trayBarcode1) && !string.IsNullOrEmpty(trayBarcode2))
                 {
-                    if (stateForUpdate.CellBarcode.Contains(trayBarcode1) || stateForUpdate.CellBarcode.Contains(trayBarcode2))
-                    {
-                        QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsync锛氳鍙栫殑鐢佃姱鏉$爜宸插瓨鍦紝鍙兘瀛樺湪閲嶅锛屼换鍔″彿: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress);
+                    //if (stateForUpdate.CellBarcode.Contains(trayBarcode1) || stateForUpdate.CellBarcode.Contains(trayBarcode2))
+                    //{
+                    //    QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsync锛氳鍙栫殑鐢佃姱鏉$爜宸插瓨鍦紝鍙兘瀛樺湪閲嶅锛屼换鍔″彿: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress);
 
-                        // 鍙戦�佸彇璐ф寚浠� 鏍囪鎵爜NG锛屾斁璐ф椂涓嶄娇鐢ㄨ繖浜涙潯鐮侊紝骞舵斁鍏G鍙�
-                        //await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate, true);
-                        return;
-                    }
-                    else
+                    //    // 鍙戦�佸彇璐ф寚浠� 鏍囪鎵爜NG锛屾斁璐ф椂涓嶄娇鐢ㄨ繖浜涙潯鐮侊紝骞舵斁鍏G鍙�
+                    //    //await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate, true);
+                    //    return;
+                    //}
+                    //else
                     {
                         if (trayBarcode1.Length < 13 || trayBarcode2.Length < 13)
                         {
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
index 1e5c562..abe9f65 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
@@ -1,6 +1,7 @@
 using Newtonsoft.Json;
 using Serilog;
 using System.Diagnostics.CodeAnalysis;
+using System.Threading.Tasks;
 using WIDESEA_Core;
 using WIDESEAWCS_Common.Constants;
 using WIDESEAWCS_Common.HttpEnum;
@@ -150,10 +151,10 @@
                 return selectedTask;
             }
 
-            // ===== TargetAddress 涓嶅彲鐢ㄦ椂锛屽厛灏濊瘯鍚� NextAddress 鐨勫叾浠栦换鍔� =====
+            // ===== TargetAddress 涓嶅彲鐢ㄦ椂锛屽厛灏濊瘯鍚� NextAddress涓嶅悓TargetAddress 鐨勫叾浠栦换鍔� =====
             var sameStationTasks = _taskService
                 .QueryStackerCraneOutTasks(deviceCode, new List<string> { candidateTask.NextAddress })
-                .Where(x => x.TaskId != candidateTask.TaskId)
+                .Where(x => x.TaskId != candidateTask.TaskId && x.TargetAddress != candidateTask.TargetAddress)
                 .ToList();
 
             foreach (var sameStationTask in sameStationTasks)
@@ -168,13 +169,8 @@
 
             // ===== 鍚� NextAddress 鏃犲彲鐢ㄤ换鍔★紝灏濊瘯涓嶅悓 NextAddress 鐨勪换鍔� =====
             // 鏌ユ壘鍏朵粬鍙敤鐨勫嚭搴撶珯鍙�
-            var otherOutStationCodes = _routerService
-                .QueryNextRoutes(deviceCode, candidateTask.NextAddress, candidateTask.TaskType)
-                .Select(x => x.ChildPosi)
-                .ToList();
-
             // 鏌ヨ鍏朵粬绔欏彴鐨勫嚭搴撲换鍔�
-            var tasks = _taskService.QueryStackerCraneOutTasks(deviceCode, otherOutStationCodes);
+            var tasks = _taskService.QueryStackerCraneOutTasks(deviceCode, new List<string> { candidateTask.NextAddress }, false);
             foreach (var alternativeTask in tasks)
             {
                 selectedTask = TrySelectOutboundTask(alternativeTask);
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs
index 53ef4b5..c9e31b3 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs
@@ -141,7 +141,10 @@
             var locations = await BaseDal.QueryDataAsync(x =>
                 x.EnableStatus == EnableStatusEnum.Normal.GetHashCode() &&
                 x.RoadwayNo == roadwayNo &&
-                x.LocationStatus == LocationStatusEnum.Free.GetHashCode());
+                x.LocationStatus == LocationStatusEnum.Free.GetHashCode() &&
+                (roadwayNo.Contains("HC")
+                    ? x.LocationType == (int)LocationTypeEnum.Capacity
+                    : x.LocationType == (int)LocationTypeEnum.ShelfCapacity));
 
             return locations?
                 .OrderByDescending(x => x.Depth)  // 1. 娣卞害浼樺厛锛堜粠澶у埌灏忥級
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/TaskAddressConstants.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/TaskAddressConstants.cs
index 43f725f..e4ae783 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/TaskAddressConstants.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/TaskAddressConstants.cs
@@ -28,6 +28,11 @@
         /// <summary>
         /// 鍒嗗搴撳嚭搴撳湴鍧�
         /// </summary>
-        public const string GRADING_OUTBOUND_ADDRESS = "10081";
+        public const string GRADING_OUTBOUND_ADDRESS = "2103";
+
+        /// <summary>
+        /// 鍒嗗搴撳嚭搴撳湴鍧�
+        /// </summary>
+        public const string GRADING_RoadWayNo = "HCSC1";
     }
 }
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/LocationEnum/LocationTypeEnum.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/LocationEnum/LocationTypeEnum.cs
index 6916e59..eda44d5 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/LocationEnum/LocationTypeEnum.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/LocationEnum/LocationTypeEnum.cs
@@ -19,10 +19,10 @@
         Undefined = 0,
 
         /// <summary>
-        /// 妯″垏娈�
+        /// 璐ф灦
         /// </summary>
-        [Description("妯″垏娈�")]
-        SmallPallet = 1,
+        [Description("璐ф灦")]
+        ShelfCapacity = 1,
 
         /// <summary>
         /// 鍗风粫娈�
@@ -43,15 +43,15 @@
         ExtraPallet = 4,
 
         /// <summary>
-        /// 鍖栨垚绌烘墭鐩�
+        /// 鍒嗗宸ヨ鏋�
         /// </summary>
-        [Description("鍖栨垚绌烘墭鐩�")]
-        HCTrayPallet = 5,
+        [Description("鍒嗗宸ヨ鏋�")]
+        SubRackType = 5,
 
         /// <summary>
-        /// 鍖栨垚鍒嗗鎵樼洏
+        /// 鍒嗗鏌�
         /// </summary>
-        [Description("鍖栨垚鍒嗗鎵樼洏")]
-        HCFRPallet = 6,
+        [Description("鍒嗗鏌�")]
+        Capacity = 6,
     }
 }
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_GradingMachine.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_GradingMachine.cs
index 29ecd75..23d3d27 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_GradingMachine.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_GradingMachine.cs
@@ -49,12 +49,19 @@
                 if (stockInfo == null)
                 {
                     var location = await _locationInfoService.GetLocationInfoAsync(input.LocationCode);
-                    locationStatus = location?.LocationStatus ?? 0;
+                    locationStatus = location?.LocationStatus == (int)LocationStatusEnum.InStock ? 10 : 0;
                 }
                 else
                 {
-                    locationStatus = stockInfo.LocationDetails?.LocationStatus ?? 0;
+                    locationStatus = MapLocationStatus(stockInfo.StockStatus);
                 }
+
+                int MapLocationStatus(int stockStatus) => stockStatus switch
+                {
+                    (int)StockStatusEmun.鍏ュ簱瀹屾垚 => 10,
+                    (int)StockStatusEmun.绌烘墭鐩樺簱瀛� => 11,
+                    _ => 0
+                };
 
                 OutputDto outPutDto = new OutputDto()
                 {
@@ -91,8 +98,8 @@
                 var result = await _locationInfoService.Db.Updateable<Dt_LocationInfo>()
                     .SetColumns(s => new Dt_LocationInfo
                     {
-                        LocationStatus = input.LocationStatus
-                    }).Where(s => s.LocationCode == input.LocationCode).ExecuteCommandAsync() > 0;
+                        EnableStatus = input.LocationStatus == 1 ? 0 : 3,
+                    }).Where(s => s.LocationCode == input.LocationCode && s.RoadwayNo == TaskAddressConstants.GRADING_RoadWayNo).ExecuteCommandAsync() > 0;
 
                 if (result)
                 {
@@ -127,40 +134,41 @@
                 var stock = await _stockInfoService.GetStockInfoAsync(input.PalletCode, input.LocationCode);
                 if (stock == null)
                 {
-                    content.Error("鏈壘鍒板搴旂殑鎵樼洏");
+                    return content.Error("鏈壘鍒板搴旂殑鎵樼洏");
                 }
-                else
-                {
-                    var taskList = new Dt_Task
-                    {
-                        WarehouseId = stock.WarehouseId,
-                        PalletCode = stock.PalletCode,
-                        PalletType = stock.PalletType,
-                        SourceAddress = stock.LocationCode,
-                        CurrentAddress = stock.LocationCode,
-                        NextAddress = TaskAddressConstants.DEFAULT_ADDRESS,
-                        TargetAddress = TaskAddressConstants.GRADING_OUTBOUND_ADDRESS,
-                        Roadway = stock.LocationDetails.RoadwayNo,
-                        TaskType = TaskOutboundTypeEnum.Outbound.GetHashCode(),
-                        TaskStatus = TaskOutStatusEnum.OutNew.GetHashCode(),
-                        Grade = 1,
-                        TaskNum = await BaseDal.GetTaskNo(),
-                        Creater = "system",
-                    };
 
+                var taskList = new Dt_Task
+                {
+                    WarehouseId = stock.WarehouseId,
+                    PalletCode = stock.PalletCode,
+                    PalletType = stock.PalletType,
+                    SourceAddress = stock.LocationCode,
+                    CurrentAddress = stock.LocationCode,
+                    NextAddress = TaskAddressConstants.DEFAULT_ADDRESS,
+                    TargetAddress = TaskAddressConstants.GRADING_OUTBOUND_ADDRESS,
+                    Roadway = stock.LocationDetails.RoadwayNo,
+                    TaskType = TaskOutboundTypeEnum.Outbound.GetHashCode(),
+                    TaskStatus = TaskOutStatusEnum.OutNew.GetHashCode(),
+                    Grade = 1,
+                    TaskNum = await BaseDal.GetTaskNo(),
+                    Creater = "system",
+                };
+
+                return await _unitOfWorkManage.BeginTranAsync(async () =>
+                {
                     var result = await BaseDal.AddDataAsync(taskList) > 0;
                     var wmstaskDto = result ? _mapper.Map<WMSTaskDTO>(taskList) : null;
 
                     var httpResponse = _httpClientHelper.Post<WebResponseContent>("http://logistics-service/api/logistics/notifyoutbound", JsonSerializer.Serialize(wmstaskDto)).Data;
                     if (result && httpResponse != null)
                     {
-                        content.OK("鍑哄簱璇锋眰鎴愬姛");
+                        return content.OK("鍑哄簱璇锋眰鎴愬姛");
                     }
                     else
                     {
-                        content.Error("鍑哄簱璇锋眰澶辫触");
+                        return content.Error("鍑哄簱璇锋眰澶辫触");
                     }
-                }
+                });
             }
             catch (Exception ex)
             {
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Outbound.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Outbound.cs
index ead9c74..8c1d4b2 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Outbound.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Outbound.cs
@@ -85,9 +85,24 @@
                 WebResponseContent content = new WebResponseContent();
                 return await _unitOfWorkManage.BeginTranAsync(async () =>
                 {
+                    if (task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty)
+                    {
+                        location.LocationStatus = LocationStatusEnum.Free.GetHashCode();
+
+                        var updateResult = await _locationInfoService.UpdateLocationInfoAsync(location);
+                        var deleteResult = _stockInfoService.DeleteData(stockInfo).Status;
+                        if (!updateResult && !deleteResult)
+                            return content.Error("浠诲姟瀹屾垚澶辫触");
+
+                        var completeResult1 = await CompleteTaskAsync(task, "鍑哄簱瀹屾垚");
+                        return content.OK();
+
+                    }
+
                     stockInfo.LocationId = 0;
                     stockInfo.LocationCode = string.Empty;
                     stockInfo.OutboundDate = DateTime.Now;
+                    stockInfo.StockStatus = (int)StockStatusEmun.鍑哄簱瀹屾垚;
 
                     location.LocationStatus = LocationStatusEnum.Free.GetHashCode();
 
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
index 8151757..8ffa8e0 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
@@ -34,7 +34,7 @@
   "MainDB": "DB_WIDESEA", //褰撳墠椤圭洰鐨勪富搴擄紝鎵�瀵瑰簲鐨勮繛鎺ュ瓧绗︿覆鐨凟nabled蹇呴』涓簍rue
   //杩炴帴瀛楃涓�
   //"ConnectionString": "HTI6FB1H05Krd07mNm9yBCNhofW6edA5zLs9TY~MNthRYW3kn0qKbMIsGp~3yyPDF1YZUCPBQx8U0Jfk4PH~ajNFXVIwlH85M3F~v_qKYQ3CeAz3q1mLVDn8O5uWt1~3Ut2V3KRkEwYHvW2oMDN~QIDXPxDgXN0R2oTIhc9dNu7QNaLEknblqmHhjaNSSpERdDVZIgHnMKejU_SL49tralBkZmDNi0hmkbL~837j1NWe37u9fJKmv91QPb~16JsuI9uu0EvNZ06g6PuZfOSAeFH9GMMIZiketdcJG3tHelo=",
-  "ConnectionString": "Data Source=192.168.60.30;Initial Catalog=WIDESEAWMS_ShanMei;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
+  "ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_ShanMei;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
   //"ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_ShanMei;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=WMS_TC;User ID=sa;Password=duo123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
   //鏃MS鏁版嵁搴撹繛鎺�
diff --git "a/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\345\210\206\345\256\271\346\237\234\346\216\245\345\217\243\345\215\217\350\256\256/\345\214\226\346\210\220\345\210\206\345\256\271\346\237\234\346\216\245\345\217\243\345\215\217\350\256\2561.1.xls" "b/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\345\210\206\345\256\271\346\237\234\346\216\245\345\217\243\345\215\217\350\256\256/\345\214\226\346\210\220\345\210\206\345\256\271\346\237\234\346\216\245\345\217\243\345\215\217\350\256\2561.1.xls"
index 24c0a4c..749ba3b 100644
--- "a/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\345\210\206\345\256\271\346\237\234\346\216\245\345\217\243\345\215\217\350\256\256/\345\214\226\346\210\220\345\210\206\345\256\271\346\237\234\346\216\245\345\217\243\345\215\217\350\256\2561.1.xls"
+++ "b/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\345\210\206\345\256\271\346\237\234\346\216\245\345\217\243\345\215\217\350\256\256/\345\214\226\346\210\220\345\210\206\345\256\271\346\237\234\346\216\245\345\217\243\345\215\217\350\256\2561.1.xls"
Binary files differ
diff --git "a/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\351\253\230\345\270\270\346\270\251\345\240\206\345\236\233\346\234\272\344\270\216\350\276\223\351\200\201\347\272\277/WCS\350\276\223\351\200\201\345\257\271\346\216\245\345\234\260\345\235\200\350\241\250_0420.xlsx" "b/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\351\253\230\345\270\270\346\270\251\345\240\206\345\236\233\346\234\272\344\270\216\350\276\223\351\200\201\347\272\277/WCS\350\276\223\351\200\201\345\257\271\346\216\245\345\234\260\345\235\200\350\241\250_0420.xlsx"
new file mode 100644
index 0000000..628813b
--- /dev/null
+++ "b/\351\241\271\347\233\256\350\265\204\346\226\231/\350\256\276\345\244\207\345\215\217\350\256\256/\351\253\230\345\270\270\346\270\251\345\240\206\345\236\233\346\234\272\344\270\216\350\276\223\351\200\201\347\272\277/WCS\350\276\223\351\200\201\345\257\271\346\216\245\345\234\260\345\235\200\350\241\250_0420.xlsx"
Binary files differ

--
Gitblit v1.9.3