api/AgvController.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
api/ErpController.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
api/ImageController.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
api/MoboxController.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
core/WCSCore.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
models/TN_CG_Detail.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
wms/LocationHelper.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
api/AgvController.cs
@@ -35,7 +35,6 @@ [Route("orderStatusReport")] public GzResult orderStatusReport(orderStatusReportParme model) { //LogHelper.Info("RCS国自AGV任务状态回报:" + JsonConvert.SerializeObject(model), "HosttoagvTask"); //LogRequestHeaders(); return GZRobot.orderStatusReport(model); } @@ -45,14 +44,6 @@ LogHelper.Info("agvRealtimeStateReport:RCS国自AGV实时状态回报:" + JsonConvert.SerializeObject(model), "HosttoagvTask"); var res = WCSCore.agvRealtimeStateReport(model); //if (res == "offline") { // //return NotFound(new EmptyGzResult()); // return NotFound(); //} //else { // //return Ok(new EmptyGzResult()); // return Ok(); //} if (model == null) return NotFound(); if (string.IsNullOrEmpty(res)) { return BadRequest(); @@ -71,37 +62,6 @@ [Route("safetyInteraction")] public gzResult SafetyInteraction(SafetyInteractionInfo model) { return WCSCore.SafetyInteraction(model); } // 搁置不使用,存在bug:HttpContext.Current.Request赋值前引用,应该是Current为null导致的 private void LogRequestHeaders() { var request = HttpContext.Current.Request; var logMessage = new StringBuilder(); logMessage.AppendLine("=== 请求头信息 ==="); logMessage.AppendLine($"请求URL: {request.Url}"); logMessage.AppendLine($"HTTP方法: {request.HttpMethod}"); foreach (string headerName in request.Headers) { logMessage.AppendLine($"{headerName}: {request.Headers[headerName]}"); } LogHelper.Info(logMessage.ToString()); } private void LogResponseHeaders() { var response = HttpContext.Current.Response; var logMessage = new StringBuilder(); logMessage.AppendLine("=== 响应头信息 ==="); logMessage.AppendLine($"状态码: {response.StatusCode}"); foreach (string headerName in response.Headers) { logMessage.AppendLine($"{headerName}: {response.Headers[headerName]}"); } LogHelper.Info(logMessage.ToString()); } } } api/ErpController.cs
@@ -23,13 +23,7 @@ [HttpPost] [Route("InboundDataSync")] public IHttpActionResult InboundDataSync(InboundDataSyncInfo model) { LogHelper.Info("触发API:入库数据同步" + JsonConvert.SerializeObject(model), "API"); //var headers = Request.Headers; //var checkRes = CheckHeaders(headers); //if (!checkRes.isSuccess) { // return CreateErrorResponse(checkRes.code, checkRes.message); //} LogHelper.Info("触发API:InboundDataSync:入库数据同步" + JsonConvert.SerializeObject(model), "API"); var res = ApiHelper.InboundDataSync(model); return CreateSuccessResponse(res); @@ -43,44 +37,10 @@ [HttpPost] [Route("OutboundDataSync")] public IHttpActionResult OutboundDataSync(OutboundDataSyncInfo model) { LogHelper.Info("触发API:出库发料同步" + JsonConvert.SerializeObject(model), "API"); //var headers = Request.Headers; //var checkRes = CheckHeaders(headers); //if (!checkRes.isSuccess) { // return CreateErrorResponse(checkRes.code, checkRes.message); //} LogHelper.Info("触发API:OutboundDataSync:出库发料同步" + JsonConvert.SerializeObject(model), "API"); var res = ApiHelper.OutboundDataSync(model); return CreateSuccessResponse(res); } private CheckHeadersResult CheckHeaders(System.Net.Http.Headers.HttpRequestHeaders headers) { // 必须字段验证 if (!headers.Contains("sourceAppCode") || !headers.Contains("serviceId") || !headers.Contains("msgSendTime")) { return CreateCheckHeadersResult(false, "2003", "缺少必要请求头参数"); } var headerModel = new { SourceAppCode = headers.GetValues("sourceAppCode").First(), Password = headers.Contains("password") ? headers.GetValues("password").First() : null, ServiceId = headers.GetValues("serviceId").First(), MsgToken = headers.Contains("msgToken") ? headers.GetValues("msgToken").First() : null, MsgSendTime = headers.GetValues("msgSendTime").First() }; // 验证Header var validationResult = ValidateHeaders(headerModel); if (validationResult != null) { return validationResult; } // 验证Body if (Request.Content.Headers.ContentLength > 2 * 1024 * 1024) { return CreateCheckHeadersResult(false, "2102", "消息内容过长,超过2M"); } return CreateCheckHeadersResult(true); } private IHttpActionResult CreateSuccessResponse(object data) { @@ -89,59 +49,5 @@ Content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json") }); } private IHttpActionResult CreateErrorResponse(string code, string message) { return ResponseMessage(new HttpResponseMessage(HttpStatusCode.OK) { Headers = { { "returnCode", code } }, Content = new StringContent(message) }); } private CheckHeadersResult ValidateHeaders(dynamic headers) { // 实现所有Header验证逻辑 if (!IsRegisteredApp(headers.SourceAppCode, headers.Password)) { return CreateCheckHeadersResult(false, "2201", "源调用系统未注册"); } if (!IsValidService(headers.ServiceId)) { return CreateCheckHeadersResult(false, "2202", "代理服务未注册"); } if (!IsValidDateTime(headers.MsgSendTime)) { return CreateCheckHeadersResult(false, "2101", "时间格式校验失败"); } if (!string.IsNullOrEmpty(headers.MsgToken) && headers.MsgToken.Length > 32) { return CreateCheckHeadersResult(false, "2104", "消息令牌过长,超过32位"); } return null; } private bool IsRegisteredApp(string appId, string password) { return true; } private bool IsValidService(string serviceId) { return true; } private bool IsValidDateTime(string dataTime) { return true; } private CheckHeadersResult CreateCheckHeadersResult(bool isSuccess, string code = "", string message = "") { return new CheckHeadersResult { code = code, message = message, isSuccess = isSuccess }; } } public class CheckHeadersResult { public bool isSuccess { get; set; } public string code { get; set; } public string message { get; set; } } } api/ImageController.cs
@@ -6,17 +6,12 @@ using System.Web.Http; namespace HH.WCS.Mobox3.AnGang.api { //[RoutePrefix("api/image")] public class ImageController : ApiController { //private readonly string _baseStoragePath = HttpContext.Current.Server.MapPath("~/StaticStorage"); private readonly string _baseStoragePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "StaticStorage"); private readonly string[] _allowedExtensions = { ".jpg", ".jpeg", ".png", ".gif", ".bmp" }; // 上传图片接口 [HttpPost] //[ActionName("Upload")] //[Route("api/image/upload")] [Route("UploadImage")] public HttpResponseMessage UploadImage() { try { @@ -72,7 +67,6 @@ // 获取图片接口 - 实际由静态文件处理,这里只是示例 [HttpGet] //[ActionName("Get")] [Route("static/image/{year}/{month}/{day}/{filename}")] public HttpResponseMessage GetImage(string year, string month, string day, string filename) { try { api/MoboxController.cs
@@ -15,14 +15,14 @@ [RoutePrefix("api")] public class MoboxController : ApiController { /// <summary> /// 货品入库(PDA) /// 货品入库(旧) /// </summary> /// <param name="model"></param> /// <returns></returns> [HttpPost] [Route("Inbound")] public SimpleResult Inbound(InboundInfo model) { LogHelper.Info("触发API:产品入库(PDA)" + JsonConvert.SerializeObject(model), "API"); LogHelper.Info("触发API:Inbound:产品入库(旧)" + JsonConvert.SerializeObject(model), "API"); return ApiHelper.Inbound(model); } @@ -34,7 +34,7 @@ [HttpPost] [Route("InboundData")] public SimpleResult InboundData(InboundDataInfo model) { LogHelper.Info("触发API:产品入库-手动添加数据" + JsonConvert.SerializeObject(model), "API"); LogHelper.Info("触发API:InboundData:产品入库" + JsonConvert.SerializeObject(model), "API"); return ApiHelper.InboundData(model); } @@ -46,7 +46,7 @@ [HttpPost] [Route("PDAFullInArea")] public SimpleResult SelectLocation(SelectLocationInfo model) { LogHelper.Info("触发API:PDA选择终点货位" + JsonConvert.SerializeObject(model), "API"); LogHelper.Info("触发API:PDAFullInArea:PDA选择终点货位" + JsonConvert.SerializeObject(model), "API"); return ApiHelper.SelectLocation(model); } @@ -58,7 +58,7 @@ [HttpPost] [Route("PartOutbound")] public SimpleResult PartOutbound(PartOutboundInfo model) { LogHelper.Info("触发API:产品部分出库(WMS)" + JsonConvert.SerializeObject(model), "API"); LogHelper.Info("触发API:PartOutbound:产品部分出库" + JsonConvert.SerializeObject(model), "API"); return ApiHelper.PartOutbound(model); } @@ -70,7 +70,7 @@ [HttpPost] [Route("PartInbound")] public SimpleResult PartInbound(PartInboundInfo model) { LogHelper.Info("触发API:产品部分回库(WMS)" + JsonConvert.SerializeObject(model), "API"); LogHelper.Info("触发API:PartInbound:产品部分回库" + JsonConvert.SerializeObject(model), "API"); return ApiHelper.PartInbound(model); } @@ -82,7 +82,7 @@ [HttpPost] [Route("CancelTask")] public SimpleResult CancelTask(CancelTaskInfo model) { LogHelper.Info("触发API:取消任务" + JsonConvert.SerializeObject(model), "API"); LogHelper.Info("触发API:CancelTask:取消任务" + JsonConvert.SerializeObject(model), "API"); return ApiHelper.CancelTask(model); } @@ -96,7 +96,7 @@ [HttpPost] [Route("CheckOutboundOnce")] public SimpleResult CheckOutboundOnce(CheckOutboundOnceInfo model) { LogHelper.Info("触发API:盘点理货出库" + JsonConvert.SerializeObject(model), "API"); LogHelper.Info("触发API:CheckOutboundOnce:盘点理货出库" + JsonConvert.SerializeObject(model), "API"); return ApiHelper.CheckOutboundOnce(model); } @@ -109,7 +109,7 @@ [HttpPost] [Route("CountProduct")] public SimpleResult CountProduct(CountProductInfo model) { LogHelper.Info("触发API:盘点理货" + JsonConvert.SerializeObject(model), "API"); LogHelper.Info("触发API:CountProduct:盘点理货" + JsonConvert.SerializeObject(model), "API"); return ApiHelper.CountProduct(model); } @@ -121,7 +121,7 @@ [HttpPost] [Route("CheckOutbound")] public SimpleResult CheckOutbound(CheckOutboundInfo model) { LogHelper.Info("触发API:盘点理货出库" + JsonConvert.SerializeObject(model), "API"); LogHelper.Info("触发API:CheckOutbound:盘点理货出库" + JsonConvert.SerializeObject(model), "API"); return ApiHelper.CheckOutbound(model); } @@ -133,7 +133,7 @@ [HttpPost] [Route("CheckInbound")] public SimpleResult CheckInbound(CheckInboundInfo model) { LogHelper.Info("触发API:盘点理货回库" + JsonConvert.SerializeObject(model), "API"); LogHelper.Info("触发API:CheckInbound:盘点理货回库" + JsonConvert.SerializeObject(model), "API"); return ApiHelper.CheckInbound(model); } } core/WCSCore.cs
@@ -128,9 +128,8 @@ return; } if (db.Updateable<TN_Loc_Container>() .SetColumns(d => d.S_IMG_URL == filepath) .Where(d => d.S_CNTR_CODE == model.S_CNTR_CODE).ExecuteCommand() <= 0) { if (db.Updateable<TN_Loc_Container>().SetColumns(d => d.S_IMG_URL == filepath).Where(d => d.S_CNTR_CODE == model.S_CNTR_CODE).ExecuteCommand() <= 0 && db.Updateable<TN_CG_Detail>().SetColumns(d => d.S_EXT_ATTR5 == filepath).Where(d => d.S_CNTR_CODE == model.S_CNTR_CODE).ExecuteCommand() <= 0) { // FIX: SNAP LogHelper.Info($"图片URL '{filepath}' 写入数据库失败"); return; models/TN_CG_Detail.cs
@@ -96,5 +96,8 @@ ///// </summary> //public string S_INVENTORY_MAN { get; set; } // 修复图片存储的风险:URL存一份到CGDetail表的S_EXT_ATTR5中 public string S_EXT_ATTR5 { get; set; } = string.Empty; // FIX: SNAP } } wms/LocationHelper.cs
@@ -289,8 +289,7 @@ { // 补充逻辑:避免解绑导致的信息丢失 (N_LOCK_STATE与CG_Detail保持一致所以直接赋值就行;IMGURL货位移动了就删除,也很合理) var cgDetail = db.Queryable<TN_CG_Detail>().Where(d => d.S_CNTR_CODE == item).First(); //bindLocCntList.Add(new TN_Loc_Container() { S_LOC_CODE = loc, S_CNTR_CODE = item, S_IMG_URL = "", N_LOCK_STATE = cgDetail?.N_LOCK_STATE ?? 1 }); bindLocCntList.Add(new TN_Loc_Container() { S_LOC_CODE = loc, S_CNTR_CODE = item, S_IMG_URL = "", N_LOCK_STATE = cgDetail?.N_LOCK_STATE ?? 0 }); bindLocCntList.Add(new TN_Loc_Container() { S_LOC_CODE = loc, S_CNTR_CODE = item, S_IMG_URL = cgDetail?.S_EXT_ATTR5 ?? "", N_LOCK_STATE = cgDetail?.N_LOCK_STATE ?? 0 }); } var log = JsonConvert.SerializeObject(bindLocCntList);