ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_BasicService/Service/MaterielInfoService.cs
@@ -1,17 +1,11 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_BasicRepository; using WIDESEA_Common.CommonEnum; using WIDESEA_Common.MaterielEnum; using WIDESEA_Common.CommonEnum; using WIDESEA_Core; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Helper; using WIDESEA_DTO.Basic; using WIDESEA_DTO; using WIDESEA_DTO.ERP; using WIDESEA_DTO.PLS; using WIDESEA_External.PLSService; using WIDESEA_IBasicRepository; using WIDESEA_IBasicService; using WIDESEA_Model.Models; @@ -181,9 +175,16 @@ return WebResponseContent.Instance.Error("æ¥å£ä¼ å ¥çç©ææ°æ®éåä¸è½ä¸ºç©º"); } ///ç¾åæ ¡éª bool IsSign = MD5Util.CheckPLSSign(vmiModel); if (!IsSign) { return WebResponseContent.Instance.Error("ç¾åéªè¯å¤±è´¥ï¼è¯·æ£æ¥"); } foreach (var itemData in vmiModel.Data) { var existMateriel = BaseDal.QueryFirst(x => x.MaterielCode == itemData.ItemCode); var existMateriel = BaseDal.QueryFirst(x => x.MaterielCode == itemData.ItemCode && x.OrgId == itemData.OrgId && x.MaterielInvOrgId == itemData.SupplierCode); if (existMateriel == null) { @@ -193,22 +194,20 @@ OrgId = itemData.OrgId, MaterielInvOrgId = itemData.SupplierCode, PackageQty = itemData.PackageQty, MaterielState = itemData.DeleteFlag == "0" ? EnableEnum.Enable : EnableEnum.Disable, MaterielState = itemData.DeleteFlag == 0 ? EnableEnum.Enable : EnableEnum.Disable, WarehouseId = 0, MaterielSourceType = 0, Creater = itemData.CreateUser, CreateDate = itemData.CreateDate, Modifier = itemData.UpdateUser, ModifyDate = itemData.UpdateDate CreateDate = DateTime.Now, }; BaseDal.AddData(addEntity); _basicRepository.MaterielInfoRepository.AddData(addEntity); } else { existMateriel.OrgId = itemData.OrgId; existMateriel.MaterielInvOrgId = itemData.SupplierCode; existMateriel.PackageQty = itemData.PackageQty; existMateriel.MaterielState = itemData.DeleteFlag == "0" ? EnableEnum.Enable : EnableEnum.Disable; existMateriel.MaterielState = itemData.DeleteFlag == 0 ? EnableEnum.Enable : EnableEnum.Disable; existMateriel.Modifier = itemData.UpdateUser; existMateriel.ModifyDate = itemData.UpdateDate; @@ -225,5 +224,6 @@ return WebResponseContent.Instance.Error($"VMIç©æåæ¥å¤±è´¥ï¼{ex.Message}"); } } } } ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_BasicService/WIDESEA_BasicService.csproj
@@ -7,6 +7,7 @@ </PropertyGroup> <ItemGroup> <ProjectReference Include="..\WIDESEA_External\WIDESEA_External.csproj" /> <ProjectReference Include="..\WIDESEA_IBasicService\WIDESEA_IBasicService.csproj" /> <ProjectReference Include="..\WIDESEA_IRecordService\WIDESEA_IRecordService.csproj" /> <ProjectReference Include="..\WIDESEA_ISystemRepository\WIDESEA_ISystemRepository.csproj" /> ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/APIEnum/APIEnum.cs
@@ -77,6 +77,14 @@ /// PLSæ¥å£è°ç¨ /// </summary> [Description("PLSæ¥å£è°ç¨")] InvokePLSApi InvokePLSApi, /// <summary> /// MLSè·åtokenæ¥å£è°ç¨ /// </summary> [Description("MLSè·åtokenæ¥å£è°ç¨")] InvokeMLSTokenApi } } ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Core/AOP/SqlSugarAop.cs
@@ -85,7 +85,7 @@ baseEntity.ModifyDate = DateTime.Now; } //if (App.User?.UserId > 0) if (App.User?.UserId > 0) { switch (entityInfo.OperationType) { ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/MLS/MLSRequestContent.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,39 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WIDESEA_DTO.MLS { /// <summary> /// è°ç¨MLSæ¥å£åå /// </summary> public class MLSRequestContent { /// <summary> /// ç¶æç 0-æåï¼1-失败 /// </summary> public string Code { get; set; } /// <summary> /// ååºä¿¡æ¯ /// </summary> public string Msg { get; set; } /// <summary> /// éè¯¯ä¿¡æ¯ /// </summary> public string ErrMsg { get; set; } /// <summary> /// æ¶é´æ³ /// </summary> public string Timestamp { get; set; } /// <summary> /// ååºæ°æ® /// </summary> public object Data { get; set; } } } ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/MLS/ReceiveMLSToken.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,24 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WIDESEA_DTO.MLS { /// <summary> /// è·åtoken请æ±å®ä½ /// </summary> public class ReceiveMLSToken { /// <summary> /// MLSæä¾è´¦å· /// </summary> public string MlsUser { get; set; } /// <summary> /// MLSæä¾å¯ç /// </summary> public string MlsPwd { get; set; } } } ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/PLS/MoInboundOrderDTO.cs
@@ -43,7 +43,7 @@ /// <summary> /// VMIç©æµç¶æ /// </summary> public string Status { get; set; } public int Status { get; set; } /// <summary> /// åæ®å· /// </summary> ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/PLS/PLSBaseModel.cs
@@ -14,6 +14,10 @@ /// <summary> /// æ¶é´æ³ /// </summary> public string AppId { get; set; } /// <summary> /// æ¶é´æ³ /// </summary> public long TimeStamp { get; set; } /// <summary> ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/PLS/PLSRequestContent.cs
@@ -7,7 +7,7 @@ namespace WIDESEA_DTO.PLS { /// <summary> /// PLSæ¥å£ååºå®ä½ /// æ¥æ¶PLSæ¥å£ååºå®ä½ /// </summary> public class PLSRequestContent { @@ -15,7 +15,7 @@ /// <summary> /// ç¶æç 0-æåï¼1-失败 /// </summary> public int Code { get; set; } public string Code { get; set; } /// <summary> /// ååºä¿¡æ¯ ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/PLS/PlsResponseContent.cs
@@ -14,7 +14,7 @@ /// <summary> /// ç¶æç 0-æå 1-失败 /// </summary> public int Code { get; set; } = 0; public string Code { get; set; } = "0"; /// <summary> /// ååºä¿¡æ¯ @@ -39,7 +39,7 @@ /// </summary> public ApiResponseContent OK(string message = null) { Code = 0; Code = "0"; Msg = message ?? "æå"; Data = null??"æ "; return this; @@ -50,7 +50,7 @@ /// </summary> public ApiResponseContent Error(string message = null) { Code = 1; Code = "1"; Msg = message ?? "失败"; Data = null ?? "æ "; return this; @@ -61,7 +61,7 @@ /// </summary> public ApiResponseContent OK(List<LabelNoData> dataList, string message = null) { Code = 0; Code = "0"; Msg = message ?? "æå"; Data = dataList; return this; ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/PLS/ReturnMoInboundStatuModel.cs
@@ -22,7 +22,7 @@ /// <summary> /// VMIç©æµç¶æ /// </summary> public string Status { get; set; } public int Status { get; set; } /// <summary> /// åæ®å· ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/PLS/VMIItemCodeInfo.cs
@@ -60,7 +60,7 @@ /// <summary> /// æææ è¯ /// </summary> public string DeleteFlag { get; set; } public int DeleteFlag { get; set; } /// <summary> /// å建人 ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/IMLSService/IInvokeMLSService.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Core; using WIDESEA_DTO.MLS; namespace WIDESEA_External.IMLSService { public interface IInvokeMLSService { string ReceiveTokenVoid(); } } ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/PLSService/InvokeMLSService.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,73 @@ using Newtonsoft.Json.Serialization; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_DTO.MLS; using WIDESEA_External.IMLSService; using WIDESEA_IBasicRepository; using WIDESEA_Common.APIEnum; using WIDESEA_Core.Helper; using WIDESEA_Model.Models; namespace WIDESEA_External.PLSService { public class InvokeMLSService : IInvokeMLSService { private readonly IApiInfoRepository _apiInfoRepository; public InvokeMLSService(IApiInfoRepository apiInfoRepository) { _apiInfoRepository = apiInfoRepository; } JsonSerializerSettings settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; /// <summary> /// è·åtoken /// </summary> /// <param name="receiveMLSToken"></param> /// <returns></returns> /// <exception cref="NotImplementedException"></exception> public string ReceiveTokenVoid() { try { Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeMLSTokenApi.ToString()); string MlsPwd = AppSettings.Get("MlsPwd"); string MlsUser = AppSettings.Get("MlsUser"); var finalRequest = new { mlsUser = MlsUser, mlsPwd = MlsPwd }; string requestJson = JsonConvert.SerializeObject(finalRequest, settings); string response = HttpHelper.Post(apiInfo.ApiAddress, requestJson); MLSRequestContent mLSRequestContent = response.DeserializeObject<MLSRequestContent>(); if (mLSRequestContent.Code == "0" && mLSRequestContent.Data!= null) { apiInfo.Remark = (string)mLSRequestContent.Data; _apiInfoRepository.UpdateData(apiInfo); } else { return "è·åtokenå¤±è´¥ï¼æè¿åtokenå¼ä¸ºç©º"; } return response; } catch(Exception ex) { return ex.Message; } } } } ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/PLSService/InvokePLSService.cs
@@ -27,17 +27,42 @@ { ContractResolver = new CamelCasePropertyNamesContractResolver() }; /// <summary> /// è·åMO票 /// </summary> /// <param name="moInboundStatuModel"></param> /// <returns></returns> public string InvokeMoInboundStatuApi(ReturnMoInboundStatuModel moInboundStatuModel) { Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokePLSApi.ToString()); PLSBaseModel<ReturnMoInboundStatuModel> model = new PLSBaseModel<ReturnMoInboundStatuModel>() string appId = AppSettings.Get("LocalAppId"); string appSecret = AppSettings.Get("LocalAppSecret"); var requestModel = new { Data = moInboundStatuModel, TimeStamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), Sign = "RWMS001" AppId = appId }; string request = JsonConvert.SerializeObject(model, settings); string response = HttpHelper.Post(apiInfo.ApiAddress, request); string paramStr = MD5Util.GetParamStr(requestModel); string sign = MD5Util.GetMD5_32(paramStr + appSecret); var finalRequest = new { requestModel.Data, requestModel.TimeStamp, requestModel.AppId, Sign = sign }; string requestJson = JsonConvert.SerializeObject(finalRequest, settings); string response = HttpHelper.Post(apiInfo.ApiAddress, requestJson); return response; } } ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/PLSService/MD5Util.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,462 @@ using Newtonsoft.Json.Linq; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Core.Helper; using Newtonsoft.Json.Serialization; namespace WIDESEA_External.PLSService { public class MD5Util { // è·å¾32ä½çMD5å å¯ public static string GetMD5_32(string input) { System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create(); byte[] data = md5.ComputeHash(Encoding.UTF8.GetBytes(input)); StringBuilder sb = new StringBuilder(); for (int i = 0; i < data.Length; i++) { sb.Append(data[i].ToString("x2")); } return sb.ToString(); } // è·å¾16ä½çMD5å å¯ public static string GetMD5_16(string input) { return GetMD5_32(input).Substring(8, 16); } // è·å¾8ä½çMD5å å¯ public static string GetMD5_8(string input) { return GetMD5_32(input).Substring(8, 8); } // è·å¾4ä½çMD5å å¯ public static string GetMD5_4(string input) { return GetMD5_32(input).Substring(8, 4); } // æ·»å MD5çåç¼ï¼ä¾¿äºæ£æ¥ææ ç¯¡æ¹ public static string AddMD5Profix(string input) { return GetMD5_4(input) + input; } // ç§»é¤MD5çåç¼ public static string RemoveMD5Profix(string input) { return input.Substring(4); } // éªè¯MD5åç¼å¤ççåç¬¦ä¸²ææ è¢«ç¯¡æ¹ public static bool ValidateValue(string input) { bool res = false; if (input.Length >= 4) { string tmp = input.Substring(4); if (input.Substring(0, 4) == GetMD5_4(tmp)) { res = true; } } return res; } /// <summary> /// 对jsonå¾é®è¿è¡æåº /// </summary> /// <param name="json"></param> /// <returns></returns> public static string SortJson(string json) { var tokenType = GetJsonType(json); if (tokenType == JTokenType.Object) { var dic = JsonConvert.DeserializeObject<SortedDictionary<string, object>>(json); SortedDictionary<string, object> keyValues = new SortedDictionary<string, object>(dic); keyValues.OrderBy(m => m.Key);//ååº æKeyæ¢æValue å°±æ¯å¯¹Valueè¿è¡æåº //keyValues.OrderByDescending(m => m.Key);//éåº SortedDictionary<string, object> tempKeyValues = new SortedDictionary<string, object>(keyValues); foreach (KeyValuePair<string, object> kv in tempKeyValues) { // 夿valueæ¯ä¸æ¯JObjectç±»å Type t1 = kv.Value.GetType(); if (t1 == typeof(JObject)) { // valueæ¯JObjectç±»å string jsonItem = JsonConvert.SerializeObject(kv.Value); jsonItem = SortJson(jsonItem); keyValues[kv.Key] = JsonConvert.DeserializeObject<JObject>(jsonItem); } else if (t1 == typeof(JArray)) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append("["); bool isFirst = true; foreach (JToken item in (JArray)kv.Value) { if (item.Type == JTokenType.Object) { string jsonArrayItem = JsonConvert.SerializeObject(item); jsonArrayItem = SortJson(jsonArrayItem); if (isFirst) { stringBuilder.Append(jsonArrayItem); } else { stringBuilder.Append($",{jsonArrayItem}"); } } else if (item.Type == JTokenType.Array) { var arrayTmpRes = SortJson(JsonConvert.SerializeObject(item)); if (isFirst) { stringBuilder.Append(arrayTmpRes); } else { stringBuilder.Append($",{arrayTmpRes}"); } } else { string jsonArrayItem = JsonConvert.SerializeObject(item); if (isFirst) { stringBuilder.Append(jsonArrayItem); } else { stringBuilder.Append($",{jsonArrayItem}"); } } isFirst = false; } stringBuilder.Append("]"); var tmpJsonStr = stringBuilder.ToString(); keyValues[kv.Key] = JsonConvert.DeserializeObject<JArray>(tmpJsonStr); } } return JsonConvert.SerializeObject(keyValues); } else if (tokenType == JTokenType.Array) { var arraies = JsonConvert.DeserializeObject<JArray>(json); StringBuilder stringBuilder2 = new StringBuilder(); stringBuilder2.Append("["); bool isFirst2 = true; foreach (JToken item in arraies) { if (item.Type == JTokenType.Object) { string jsonArrayItem = JsonConvert.SerializeObject(item); jsonArrayItem = SortJson(jsonArrayItem); if (isFirst2) { stringBuilder2.Append(jsonArrayItem); } else { stringBuilder2.Append($",{jsonArrayItem}"); } } else if (item.Type == JTokenType.Array) { var arrayTmpRes = SortJson(JsonConvert.SerializeObject(item)); if (isFirst2) { stringBuilder2.Append(arrayTmpRes); } else { stringBuilder2.Append($",{arrayTmpRes}"); } } else { string jsonArrayItem = JsonConvert.SerializeObject(item); if (isFirst2) { stringBuilder2.Append(jsonArrayItem); } else { stringBuilder2.Append($",{jsonArrayItem}"); } } isFirst2 = false; } stringBuilder2.Append("]"); return stringBuilder2.ToString(); } return json; } /// <summary> /// æ ¹æ®json夿jsonç±»å /// </summary> /// <param name="json"></param> /// <returns></returns> public static JTokenType GetJsonType(string json) { JToken token = JToken.Parse(json); return token.Type; } #region MD5ç¾åéªè¯ /// <summary> /// 对ç»å®æä»¶è·¯å¾çæä»¶å 䏿 ç¾ /// </summary> /// <param name="path">è¦å å¯çæä»¶çè·¯å¾</param> /// <returns>æ ç¾çå¼</returns> public static bool AddMD5(string path) { bool IsNeed = true; //å·²è¿è¡MD5å¤ç if (CheckMD5(path)) IsNeed = false; try { FileStream fsread = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); byte[] md5File = new byte[fsread.Length]; // å°æä»¶æµè¯»åå°Bufferä¸ fsread.Read(md5File, 0, (int)fsread.Length); fsread.Close(); if (IsNeed) { // 对Bufferä¸çåèå 容ç®MD5 string result = MD5Buffer(md5File, 0, md5File.Length); // å°åç¬¦ä¸²è½¬æ¢æåèæ°ç»ä»¥ä¾¿åäººå°æä»¶ä¸ byte[] md5 = System.Text.Encoding.ASCII.GetBytes(result); FileStream fsWrite = new FileStream(path, FileMode.Open, FileAccess.ReadWrite); // å°æä»¶ï¼MD5å¼ éæ°åå ¥å°æä»¶ä¸ã fsWrite.Write(md5File, 0, md5File.Length); fsWrite.Write(md5, 0, md5.Length); fsWrite.Close(); } else { FileStream fsWrite = new FileStream(path, FileMode.Open, FileAccess.ReadWrite); fsWrite.Write(md5File, 0, md5File.Length); fsWrite.Close(); } } catch { return false; } return true; } /// <summary> /// 对ç»å®è·¯å¾çæä»¶è¿è¡éªè¯ /// </summary> /// <param name="path"></param> /// <returns>æ¯å¦å äºæ ç¾ææ¯å¦æ ç¾å¼ä¸å 容å¼ä¸è´</returns> public static bool CheckMD5(string path) { try { FileStream get_file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); // è¯»å ¥æä»¶ byte[] md5File = new byte[get_file.Length]; get_file.Read(md5File, 0, (int)get_file.Length); get_file.Close(); // 对æä»¶é¤æå32ä½ä»¥å¤çåè计ç®MD5ï¼è¿ä¸ª32æ¯å 为æ ç¾ä½ä¸º32ä½ã string result = MD5Buffer(md5File, 0, md5File.Length - 32); //读åæä»¶æå32ä½ï¼å ¶ä¸ä¿åçå°±æ¯MD5å¼ string md5 = Encoding.ASCII.GetString(md5File, md5File.Length - 32, 32); return result == md5; } catch { return false; } } /// <summary> /// è®¡ç®æä»¶çMD5å¼ /// </summary> /// <param name="MD5File">MD5ç¾åæä»¶å符æ°ç»</param> /// <param name="index">计ç®èµ·å§ä½ç½®</param> /// <param name="count">计ç®ç»æ¢ä½ç½®</param> /// <returns>计ç®ç»æ</returns> private static string MD5Buffer(byte[] MD5File, int index, int count) { System.Security.Cryptography.MD5CryptoServiceProvider get_md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); byte[] hash_byte = get_md5.ComputeHash(MD5File, index, count); string result = BitConverter.ToString(hash_byte); result = result.Replace("-", ""); return result; } #endregion //èªå®ä¹åºååå·¥å ·ç±» public class JsonPropertySortResolver : Newtonsoft.Json.Serialization.DefaultContractResolver { protected override IList<Newtonsoft.Json.Serialization.JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { return base.CreateProperties(type, memberSerialization).OrderBy(p => p.PropertyName).ToList(); } } public class SortedCamelCaseContractResolver : DefaultContractResolver { protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { // è·åææéè¦åºååç屿§ï¼åºç±»æ¹æ³å·²è¿æ»¤å¿½ç¥å±æ§çï¼ var properties = base.CreateProperties(type, memberSerialization).ToList(); // å 对æ¯ä¸ªå±æ§åºç¨ CamelCase å½åï¼ç¡®ä¿æç»è¾åºçåæ®µåæ¯å°é©¼å³°ï¼ foreach (var prop in properties) { prop.PropertyName = GetCamelCaseName(prop.UnderlyingName); } // æå±æ§åï¼å³å°é©¼å³°åçåç§°ï¼åæ¯ååºæåº return properties.OrderBy(p => p.PropertyName).ToList(); } private string GetCamelCaseName(string name) { if (string.IsNullOrEmpty(name) || char.IsLower(name[0])) return name; return char.ToLower(name[0]) + name.Substring(1); } } //å ¥åå å¯åç½®æ ¼å¼å public static string GetParamStr<T>(T objectParam) { // è·åJSON串,使é¤signåæ®µ Func<object, string, object, bool> filter = (object obj, string field, object value) => !field.Equals("sign"); string paramStr = JsonConvert.SerializeObject(objectParam, new JsonSerializerSettings { ContractResolver = new SortedCamelCaseContractResolver(), NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None, ReferenceLoopHandling = ReferenceLoopHandling.Ignore, DateFormatString = "yyyy-MM-dd HH:mm:ss", DateTimeZoneHandling = DateTimeZoneHandling.Unspecified, Converters = new List<JsonConverter> { new DecimalWithoutTrailingZerosConverter() } }); //æåºJOSN,å¾å°æ ¼å¼åç串 return SortJson(paramStr); } public class DecimalWithoutTrailingZerosConverter : JsonConverter<decimal> { public override void WriteJson(JsonWriter writer, decimal value, JsonSerializer serializer) { // 夿æ¯å¦ä¸ºæ´æ°ï¼å°¾æ°ä¸ºé¶ï¼ if (value == Math.Floor(value)) { writer.WriteValue(Convert.ToInt64(value)); } else { writer.WriteValue(value); } } public override decimal ReadJson(JsonReader reader, Type objectType, decimal existingValue, bool hasExistingValue, JsonSerializer serializer) { // ååºååæ¶ç´æ¥è½¬æ¢ä¸º decimalï¼å ¼å®¹æ´æ°åå°æ° return Convert.ToDecimal(reader.Value); } } /// <summary> /// éç¨PLSæ¥å£ç¾åæ ¡éª /// </summary> public static bool CheckPLSSign<T>(T model) where T : class { try { // åºå®é ç½® string localAppId = AppSettings.Get("LocalAppId"); string localAppSecret = AppSettings.Get("LocalAppSecret"); var type = typeof(T); object signModel = null; // ========== èªå¨è·åå ¬å ±åæ®µ ========== var timeStampProp = type.GetProperty("TimeStamp"); var signProp = type.GetProperty("Sign"); var dataProp = type.GetProperty("Data"); if (timeStampProp == null || signProp == null || dataProp == null) return false; // è·åå¼ string requestSign = signProp.GetValue(model)?.ToString() ?? ""; object timeStampVal = timeStampProp.GetValue(model); object dataVal = dataProp.GetValue(model); //æ¶é´æ³æ ¡éª long nowTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); long timeStamp = 0; if (timeStampVal is long lng) timeStamp = lng; else if (timeStampVal is string str && long.TryParse(str, out long t)) timeStamp = t; //æå»ºç¾å对象 if (localAppId != null) { signModel = new { AppId = localAppId, TimeStamp = timeStamp, Data = dataVal }; } else { return false; } string paramStr = GetParamStr(signModel); string localSign = GetMD5_32(paramStr + localAppSecret); ///ç¾åæ¯å¯¹ return localSign.Equals(requestSign, StringComparison.OrdinalIgnoreCase); } catch { return false; } } } } ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/WIDESEA_External.csproj
@@ -13,4 +13,8 @@ <ProjectReference Include="..\WIDESEA_IBasicRepository\WIDESEA_IBasicRepository.csproj" /> </ItemGroup> <ItemGroup> <Folder Include="MLSService\" /> </ItemGroup> </Project> ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IBasicService/IMaterielInfoService.cs
@@ -5,6 +5,7 @@ using System.Threading.Tasks; using WIDESEA_Core; using WIDESEA_Core.BaseServices; using WIDESEA_DTO; using WIDESEA_DTO.Basic; using WIDESEA_DTO.ERP; using WIDESEA_DTO.PLS; ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IInboundService/IMoInboundOrderService.cs
@@ -4,6 +4,8 @@ using System.Text; using System.Threading.Tasks; using WIDESEA_Core.BaseServices; using WIDESEA_DTO.PLS; using WIDESEA_DTO; using WIDESEA_IInboundRepository; using WIDESEA_Model.Models; @@ -12,5 +14,12 @@ public interface IMoInboundOrderService : IService<Dt_MoInboundOrder> { IMoInboundOrderRepository Repository { get; } /// <summary> /// æ¥æ¶MOç¥¨ä¿¡æ¯ /// </summary> /// <param name="model"></param> /// <returns></returns> public ApiResponseContent ReceiveMoStatus(MoInboundOrderDTO model); } } ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_InboundService/MoInboundOrderService.cs
@@ -13,6 +13,8 @@ using WIDESEA_IInboundRepository; using WIDESEA_IInboundService; using WIDESEA_Model.Models; using WIDESEA_External.PLSService; using WIDESEA_Core; namespace WIDESEA_InboundService { @@ -57,8 +59,15 @@ throw new Exception("æ ç¾å· LabelNo ä¸è½ä¸ºç©º"); } // æ¥è¯¢MO票æ¯å¦å·²åå¨ var existMo = BaseDal.QueryFirst(x => x.LabelNo == item.LabelNo); ///ç¾åæ ¡éª bool IsSign = MD5Util.CheckPLSSign(model); if (!IsSign) { return ApiResponseContent.Instance.Error("ç¾åéªè¯å¤±è´¥ï¼è¯·æ£æ¥"); } // æ¥è¯¢å¯ä¸é®æ¯å¦å·²åå¨ï¼orgId+labelNoï¼ var existMo = BaseDal.QueryFirst(x => x.LabelNo == item.LabelNo && x.OrgId == item.OrgId); if (existMo == null) { ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Basic/Dt_ApiInfo.cs
@@ -37,7 +37,7 @@ /// <summary> /// 夿³¨ /// </summary> [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "夿³¨")] [SugarColumn(IsNullable = true, Length = 500, ColumnDescription = "夿³¨")] public string Remark { get; set; } } } ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Inbound/Dt_MoInboundOrder.cs
@@ -40,10 +40,10 @@ public string BarcodeNumber { get; set; } /// <summary> /// VMIç©æµç¶æ(å·²å建ï¼å·²å¤è´§ï¼å·²åè¿ï¼å·²åæ¶) /// VMIç©æµç¶æ(0-å·²å建ï¼1-å¾ æ£è´§ï¼2-å·²å¤è´§ï¼3-å·²åè¿ï¼4-已忶) /// </summary> [SugarColumn(IsNullable = false, Length = 10, ColumnDescription = "VMIç©æµç¶æ(å·²å建ï¼å·²å¤è´§ï¼å·²åè¿ï¼å·²åæ¶)")] public string Status { get; set; } [SugarColumn(IsNullable = false, Length = 10, ColumnDescription = "VMIç©æµç¶æ(0-å·²å建ï¼1-å¾ æ£è´§ï¼2-å·²å¤è´§ï¼3-å·²åè¿ï¼4-已忶)")] public int Status { get; set; } /// <summary> ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Inbound/MoInboundOrderController.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,31 @@ using Microsoft.AspNetCore.Mvc; using WIDESEA_Core; using WIDESEA_Core.BaseController; using WIDESEA_DTO.PLS; using WIDESEA_DTO; using WIDESEA_IInboundService; using WIDESEA_Model.Models; using Microsoft.AspNetCore.Authorization; namespace WIDESEA_WMSServer.Controllers.Inbound { [Route("api/MoInboundOrder")] [ApiController] public class MoInboundOrderController : ApiBaseController<IMoInboundOrderService, Dt_MoInboundOrder> { public MoInboundOrderController(IMoInboundOrderService service) : base(service) { } /// <summary> /// 忥MOç¥¨ä¿¡æ¯ /// </summary> /// <param name="model"></param> /// <returns></returns> [HttpPost, HttpGet, Route("ReceiveMoStatus"),AllowAnonymous] public ApiResponseContent ReceiveMoStatus([FromBody] MoInboundOrderDTO model) { return Service.ReceiveMoStatus(model); } } } ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/PLS/PlsController.cs
@@ -13,6 +13,9 @@ namespace WIDESEA_WMSServer.Controllers.PLS { /// <summary> /// PLSæ¥å£ /// </summary> [Route("api/Pls")] [ApiController] public class PlsController:ControllerBase @@ -39,7 +42,7 @@ return ApiResponseContent.Instance.OK(); } else { return ApiResponseContent.Instance.Error(); return ApiResponseContent.Instance.Error(content.Message); } } ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/appsettings.json
@@ -10,6 +10,7 @@ "AllowedHosts": "*", "ConnectionStringsEncryption": false, "MainDB": "DB_WIDESEA", //å½å项ç®ç主åºï¼æå¯¹åºçè¿æ¥å符串çEnabledå¿ é¡»ä¸ºtrue //è¿æ¥å符串 //"ConnectionString": "HTI6FB1H05Krd07mNm9yBCNhofW6edA5zLs9TY~MNthRYW3kn0qKbMIsGp~3yyPDF1YZUCPBQx8U0Jfk4PH~ajNFXVIwlH85M3F~v_qKYQ3CeAz3q1mLVDn8O5uWt1~3Ut2V3KRkEwYHvW2oMDN~QIDXPxDgXN0R2oTIhc9dNu7QNaLEknblqmHhjaNSSpERdDVZIgHnMKejU_SL49tralBkZmDNi0hmkbL~837j1NWe37u9fJKmv91QPb~16JsuI9uu0EvNZ06g6PuZfOSAeFH9GMMIZiketdcJG3tHelo=", //"ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_HUAIAN;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False", @@ -27,12 +28,18 @@ }, "WCS": "http://localhost:9291", "LogAopEnable": false, "PrintSql": true, //æå°SQLè¯å¥ "PrintSql": false, //æå°SQLè¯å¥ "ApiName": "WIDESEA", "ExpMinutes": 120, "QuartzJobAutoStart": true, "PDAVersion": "4", "WebSocketPort": "9296ï¼", "DBSeedEnable": true "DBSeedEnable": false, //PLSç¾åè´¦å·åå¯é¥ "LocalAppId": "RWMS", "LocalAppSecret": "pW6wny!#3P9nb#68", //MLSè´¦å·å¯ç "MlsUser": "123", "MlsPwd": "wewe" }