kazelee
昨天 6ed44f32c96a17fd10601a24c3c36ca1229bc89b
优化货位绑定图片链接保存逻辑,删除不使用的代码
7个文件已修改
177 ■■■■ 已修改文件
api/AgvController.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/ErpController.cs 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/ImageController.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/MoboxController.cs 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
core/WCSCore.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_CG_Detail.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
wms/LocationHelper.cs 3 ●●●● 补丁 | 查看 | 原始文档 | 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);