Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Helper/UtilConvert.cs
@@ -1,565 +1,562 @@ using 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>å¦æåæ°ä¸ºnullï¼åè¿åé»è®¤èµ·å§æ¥æ</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> /// å°å¯¹è±¡åºåå为JSONå符串 /// </summary> /// <param name="obj">è¦åºååç对象</param> /// <param name="formatDate">æ¥ææ ¼å¼å设置ï¼é»è®¤ä¸º"yyyy-MM-dd HH:mm:ss"æ ¼å¼</param> /// <returns>åºåååçJSONå符串ï¼å¦æå¯¹è±¡ä¸ºnullåè¿ånull</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> /// å°JSONå符串ååºåå为æå®ç±»åç对象 /// </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å¼ãDBNull.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>è½¬æ¢æåçdouble弿æå®çé误å¼</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ï¼å¦åè¿åfalse</returns> public static bool IsNotEmptyOrNull(this object thisValue) { return ObjToString(thisValue) != "" && ObjToString(thisValue) != "undefined" && ObjToString(thisValue) != "null"; } /// <summary> /// å°å¯¹è±¡è½¬æ¢ä¸ºå符串ï¼å¦æå¯¹è±¡ä¸ºnullåè¿åæå®çéè¯¯å¼ /// </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> /// å¤æå¯¹è±¡æ¯å¦ä¸ºnullãDBNullæç©ºå符串 /// </summary> /// <param name="thisValue">è¦æ£æ¥ç对象</param> /// <returns>å¦æå¯¹è±¡ä¸ºnullãDBNullæç©ºå符串åè¿åtrueï¼å¦åè¿åfalse</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>è½¬æ¢æåçDecimal弿æå®çé»è®¤å¼</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>è½¬æ¢æåçDateTime弿æå®çé»è®¤å¼</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>转æ¢åçå¸å°å¼ï¼è½¬æ¢å¤±è´¥æ¶è¿åfalse</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> /// å°DateTime转æ¢ä¸ºUnixæ¶é´æ³ï¼ç§çº§ï¼ /// </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å¼ãæä¸¾ç±»åãæ³åç±»åãGuidãVersionçç¹æ®ç±»åç转æ¢ã /// å¦æè½¬æ¢å¤±è´¥æç±»åä¸å¹é ï¼å°è¿ååå§å¼ææåºå¼å¸¸ã /// </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>转æ¢åçæ³åå表对象ï¼è¥è¾å ¥ä¸ºnullåè¿åé»è®¤å¼</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> /// å°å¯¹è±¡åºåå为JSONå符串 /// </summary> /// <param name="value">è¦åºååç对象</param> /// <returns>对象çJSONå符串表示</returns> public static string ToJson(this object value) { return JsonConvert.SerializeObject(value); } /// <summary> /// å¤æå¯¹è±¡æ¯å¦å¯ä»¥è½¬æ¢ä¸ºæ´æ° /// </summary> /// <param name="obj">è¦å¤æç对象</param> /// <returns>妿å¯ä»¥è½¬æ¢ä¸ºæ´æ°è¿åtrueï¼å¦åè¿åfalse</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ï¼å¦åè¿åfalse</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>妿å符串å¯ä»¥è½¬æ¢ä¸ºæ°ååè¿åtrueï¼å¦åè¿åfalse</returns> /// <remarks> /// ä½¿ç¨æ£å表达å¼éªè¯å符串æ¯å¦ä¸ºæ°åæ ¼å¼ï¼æ¯ææ£è´å·åå°æ°ç¹ /// </remarks> public static bool IsNumber(this string str, string formatString) { if (string.IsNullOrEmpty(str)) return false; return Regex.IsMatch(str, @"^[+-]?\d*[.]?\d*$"); } /// <summary> /// 夿å符串æ¯å¦ä¸ºææçGuidæ ¼å¼ /// </summary> /// <param name="guid">è¦éªè¯çå符串</param> /// <returns>妿åç¬¦ä¸²æ¯ææçGuidæ ¼å¼åè¿åtrueï¼å¦åè¿åfalse</returns> public static bool IsGuid(this string guid) { Guid newId; return guid.GetGuid(out newId); } /// <summary> /// å°å符串转æ¢ä¸ºGuidç±»å /// </summary> /// <param name="guid">è¦è½¬æ¢çå符串</param> /// <param name="outId">è¾åºè½¬æ¢åçGuid</param> /// <returns>è½¬æ¢æåè¿åtrueï¼å¦åè¿åfalse</returns> public static bool GetGuid(this string guid, out Guid outId) { Guid emptyId = Guid.Empty; return Guid.TryParse(guid, out outId); } /// <summary> /// å°å符串类åçæ¡ä»¶è½¬æ¢ä¸ºå¯¹åºçLinq表达å¼ç±»å /// </summary> /// <param name="stringType">表示æ¡ä»¶çå符串</param> /// <returns>对åºçLinq表达å¼ç±»åæä¸¾å¼</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; using 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>å¦æåæ°ä¸ºnullï¼åè¿åé»è®¤èµ·å§æ¥æ</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> /// å°å¯¹è±¡åºåå为JSONå符串 /// </summary> /// <param name="obj">è¦åºååç对象</param> /// <param name="formatDate">æ¥ææ ¼å¼å设置ï¼é»è®¤ä¸º"yyyy-MM-dd HH:mm:ss"æ ¼å¼</param> /// <returns>åºåååçJSONå符串ï¼å¦æå¯¹è±¡ä¸ºnullåè¿ånull</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> /// å°JSONå符串ååºåå为æå®ç±»åç对象 /// </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å¼ãDBNull.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>è½¬æ¢æåçdouble弿æå®çé误å¼</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ï¼å¦åè¿åfalse</returns> public static bool IsNotEmptyOrNull(this object thisValue) { return ObjToString(thisValue) != "" && ObjToString(thisValue) != "undefined" && ObjToString(thisValue) != "null"; } /// <summary> /// å°å¯¹è±¡è½¬æ¢ä¸ºå符串ï¼å¦æå¯¹è±¡ä¸ºnullåè¿åæå®çéè¯¯å¼ /// </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> /// å¤æå¯¹è±¡æ¯å¦ä¸ºnullãDBNullæç©ºå符串 /// </summary> /// <param name="thisValue">è¦æ£æ¥ç对象</param> /// <returns>å¦æå¯¹è±¡ä¸ºnullãDBNullæç©ºå符串åè¿åtrueï¼å¦åè¿åfalse</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>è½¬æ¢æåçDecimal弿æå®çé»è®¤å¼</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>è½¬æ¢æåçDateTime弿æå®çé»è®¤å¼</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>转æ¢åçå¸å°å¼ï¼è½¬æ¢å¤±è´¥æ¶è¿åfalse</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> /// å°DateTime转æ¢ä¸ºUnixæ¶é´æ³ï¼ç§çº§ï¼ /// </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å¼ãæä¸¾ç±»åãæ³åç±»åãGuidãVersionçç¹æ®ç±»åç转æ¢ã /// å¦æè½¬æ¢å¤±è´¥æç±»åä¸å¹é ï¼å°è¿ååå§å¼ææåºå¼å¸¸ã /// </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>转æ¢åçæ³åå表对象ï¼è¥è¾å ¥ä¸ºnullåè¿åé»è®¤å¼</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> /// å°å¯¹è±¡åºåå为JSONå符串 /// </summary> /// <param name="value">è¦åºååç对象</param> /// <returns>对象çJSONå符串表示</returns> public static string ToJson(this object value) { return JsonConvert.SerializeObject(value); } /// <summary> /// å¤æå¯¹è±¡æ¯å¦å¯ä»¥è½¬æ¢ä¸ºæ´æ° /// </summary> /// <param name="obj">è¦å¤æç对象</param> /// <returns>妿å¯ä»¥è½¬æ¢ä¸ºæ´æ°è¿åtrueï¼å¦åè¿åfalse</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ï¼å¦åè¿åfalse</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>妿å符串å¯ä»¥è½¬æ¢ä¸ºæ°ååè¿åtrueï¼å¦åè¿åfalse</returns> /// <remarks> /// ä½¿ç¨æ£å表达å¼éªè¯å符串æ¯å¦ä¸ºæ°åæ ¼å¼ï¼æ¯ææ£è´å·åå°æ°ç¹ /// </remarks> public static bool IsNumber(this string str, string formatString) { if (string.IsNullOrEmpty(str)) return false; return Regex.IsMatch(str, @"^[+-]?\d*[.]?\d*$"); } /// <summary> /// 夿å符串æ¯å¦ä¸ºææçGuidæ ¼å¼ /// </summary> /// <param name="guid">è¦éªè¯çå符串</param> /// <returns>妿åç¬¦ä¸²æ¯ææçGuidæ ¼å¼åè¿åtrueï¼å¦åè¿åfalse</returns> public static bool IsGuid(this string guid) { Guid newId; return guid.GetGuid(out newId); } /// <summary> /// å°å符串转æ¢ä¸ºGuidç±»å /// </summary> /// <param name="guid">è¦è½¬æ¢çå符串</param> /// <param name="outId">è¾åºè½¬æ¢åçGuid</param> /// <returns>è½¬æ¢æåè¿åtrueï¼å¦åè¿åfalse</returns> public static bool GetGuid(this string guid, out Guid outId) { Guid emptyId = Guid.Empty; return Guid.TryParse(guid, out outId); } /// <summary> /// å°å符串类åçæ¡ä»¶è½¬æ¢ä¸ºå¯¹åºçLinq表达å¼ç±»å /// </summary> /// <param name="stringType">表示æ¡ä»¶çå符串</param> /// <returns>对åºçLinq表达å¼ç±»åæä¸¾å¼</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; } } } 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> 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; 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 }; 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> 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; } } 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); } } 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); //} // å¤çç®æ å°åï¼ChildPosi == "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; ; } // 设置任å¡å·ãæçæ¡ç ãç®æ å°åãWCS_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> 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> 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, $"ä»»å¡å·åå ¥PLCæåï¼ä»»å¡å·ã{task.TaskNum}ã", conveyorLine.DeviceCode); Thread.Sleep(500); //// åå ¥èµ·å§å°å //conveyorLine.SetValue(ConveyorLineDBNameNew.Source, short.Parse(task.SourceAddress ?? "0"), childDeviceCode); //QuartzLogHelper.LogInfo(_logger, $"ä»»å¡å·åå ¥PLCæåï¼ä»»å¡å·ã{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) { 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ãputfinished ç另忰çå½ä»¤ 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) 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); 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; } } } 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; } } } 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ï¼æ¾è´§æ¶ä¸ä½¿ç¨è¿äºæ¡ç ï¼å¹¶æ¾å ¥NGå£ //await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate, true); return; } else // // åéåè´§æä»¤ æ è®°æ«ç NGï¼æ¾è´§æ¶ä¸ä½¿ç¨è¿äºæ¡ç ï¼å¹¶æ¾å ¥NGå£ // //await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate, true); // return; //} //else { if (trayBarcode1.Length < 13 || trayBarcode2.Length < 13) { 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); 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. 深度ä¼å ï¼ä»å¤§å°å°ï¼ 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"; } } 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, } } 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) { 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(); Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
@@ -34,7 +34,7 @@ "MainDB": "DB_WIDESEA", //å½å项ç®ç主åºï¼æå¯¹åºçè¿æ¥å符串çEnabledå¿ é¡»ä¸ºtrue //è¿æ¥å符串 //"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", //æ§WMSæ°æ®åºè¿æ¥ ÏîÄ¿×ÊÁÏ/É豸ÐÒé/·ÖÈݹñ½Ó¿ÚÐÒé/»¯³É·ÖÈݹñ½Ó¿ÚÐÒé1.1.xlsBinary files differ
ÏîÄ¿×ÊÁÏ/É豸ÐÒé/¸ß³£Î¶Ѷâ»úÓëÊäËÍÏß/WCSÊäËͶԽӵØÖ·±í_0420.xlsxBinary files differ