kazelee
10 天以前 b928a2f0011fc867d7d219cfff4b764250f5b778
修复查交互表更新终点的流程,添加绑定货位写入物料明细表
11个文件已修改
440 ■■■■■ 已修改文件
App_Start/Startup.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/AgvController.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/ApiHelper.cs 123 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/ImageController.cs 200 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
core/WCSCore.cs 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
device/SnapDevice.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
device/SnapManager.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dispatch/GZRobot.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_CG_Detail.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
process/TaskProcess.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
wms/LocationHelper.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
App_Start/Startup.cs
@@ -41,7 +41,7 @@
            });
            config.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
            config.Formatters.Add(new JsonMediaTypeFormatter());
            app.UseWebApi(config);
        }
    }
api/AgvController.cs
@@ -45,6 +45,8 @@
            return WCSCore.SafetyInteraction(model);
        }
        // 搁置不使用,存在bug:HttpContext.Current.Request赋值前引用,应该是Current为null导致的
        private void LogRequestHeaders() {
            var request = HttpContext.Current.Request;
            var logMessage = new StringBuilder();
api/ApiHelper.cs
@@ -68,6 +68,7 @@
                var cgDetail = new TN_CG_Detail() {
                    S_ITEM_CODE = cgId,
                    S_CNTR_CODE = cntId,
                    S_LOC_CODE = startLoc.S_CODE, // ADD:补充针对PDA分拣
                };
                startLoc.N_CURRENT_NUM = 1;
@@ -189,6 +190,7 @@
                    S_ITEM_CODE = cgId,
                    S_CNTR_CODE = cntId,
                    //S_ITEM_NAME = model.ItemName,
                    S_LOC_CODE = startLoc.S_CODE, // ADD:补充针对PDA分拣
                };
                startLoc.N_CURRENT_NUM = 1;
@@ -422,17 +424,25 @@
                var endLoc = new TN_Location();
                if (cgDetail.F_QTY > 2000) {
                    // 重量超过2t,报错
                    if (GZRobot.UpdateInteractInfo(new UpdateInteractInfo {
                        type_name = "GET_DST",
                        interaction_info_id = int.Parse(task.S_EQ_TASK_CODE),
                        info_status = "error",
                    })) {
                        LogHelper.Info($"国自AGV接受超重取消信息成功", "HosttoagvTask");
                    if (GZRobot.TryGetInteractionInfoId(task.S_CODE, out var id1)) {
                        if (GZRobot.UpdateInteractInfo(new UpdateInteractInfo {
                            type_name = "GET_DST",
                            interaction_info_id = id1,
                            info_status = "error",
                        })) {
                            LogHelper.Info($"国自AGV接受超重取消信息成功", "HosttoagvTask");
                        }
                        else {
                            LogHelper.Info($"国自AGV接受超重取消信息失败", "HosttoagvTask");
                            //return BuildSimpleResult(7, $"国自AGV接受终点信息失败");
                        }
                    }
                    else {
                        LogHelper.Info($"国自AGV接受超重取消信息失败", "HosttoagvTask");
                        //return BuildSimpleResult(7, $"获取任务{task.S_CODE}的agv interaction_info_id失败!");
                        LogHelper.Info($"AGV:获取任务{task.S_CODE}的interaction_info_id失败!", "HosttoagvTask");
                        //return BuildSimpleResult(8, $"国自AGV接受终点信息失败");
                    }
                    return BuildSimpleResult(8, $"物料重量{cgDetail.F_QTY}超过2t");
                }
                else if (cgDetail.F_QTY > 1500) {
@@ -468,16 +478,23 @@
                task.S_END_LOC = endLoc.S_CODE;
                LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁
                if (GZRobot.UpdateInteractInfo(new UpdateInteractInfo {
                    type_name = "GET_DST",
                    interaction_info_id = int.Parse(task.S_EQ_TASK_CODE),
                    info_status = "invalid",
                    return_value = LocationHelper.GetAgvSite(task.S_END_LOC), // 目前使用agvsite
                })) {
                    LogHelper.Info($"国自AGV接受终点信息成功", "HosttoagvTask");
                if (GZRobot.TryGetInteractionInfoId(task.S_CODE, out var id2)) {
                    if (GZRobot.UpdateInteractInfo(new UpdateInteractInfo {
                        type_name = "GET_DST",
                        interaction_info_id = id2,
                        info_status = "invalid",
                        return_value = LocationHelper.GetAgvSite(task.S_END_LOC), // 目前使用agvsite
                    })) {
                        LogHelper.Info($"国自AGV接受终点信息成功", "HosttoagvTask");
                    }
                    else {
                        LogHelper.Info($"国自AGV接受终点信息失败", "HosttoagvTask");
                        return BuildSimpleResult(7, $"国自AGV接受终点信息失败");
                    }
                }
                else {
                    LogHelper.Info($"国自AGV接受终点信息失败", "HosttoagvTask");
                    LogHelper.Info($"AGV:获取任务{task.S_CODE}的interaction_info_id失败!", "HosttoagvTask");
                    return BuildSimpleResult(8, $"国自AGV接受终点信息失败");
                }
                using (var tran = db.Ado.UseTran()) {
@@ -646,6 +663,80 @@
            }
        }
        /// <summary>
        /// 产品部分回库(不指定终点,备用)
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        internal static SimpleResult PartInboundAuto(PartInboundInfo model) {
            var taskName = TaskName.产品部分回库;
            var db = new SqlHelper<object>().GetInstance();
            var startAreas = Settings.Areas[AreaIndex.X卸货区];
            var endAreas = Settings.Areas[AreaIndex.H货架区];
            try {
                // 起点位置:取放货区(有货物、没有锁、已启用)
                var startLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.startLoc && a.N_CURRENT_NUM == 1 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y" && startAreas.Contains(a.S_AREA_CODE));
                if (startLoc == null) {
                    return BuildSimpleResult(2, $"起点位置 {model.startLoc} 不符合回库条件");
                }
                var locCntrRel = db.Queryable<TN_Loc_Container>().First(a => a.S_LOC_CODE == model.startLoc);
                if (locCntrRel == null) {
                    return BuildSimpleResult(3, $"起点位置 {model.startLoc} 没有绑定容器,无可回库的物料");
                }
                // 终点位置:货架(没有货物,没有锁)
                var endLoc = db.Queryable<TN_Location>().First(a => a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y" && endAreas.Contains(a.S_AREA_CODE));
                if (endLoc == null) {
                    return BuildSimpleResult(4, $"没有找到合适的终点货位");
                }
                var cntId = locCntrRel.S_CNTR_CODE;
                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
                LocationHelper.LockLoc(ref startLoc, 2); // 起点出库锁
                LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁
                using (var tran = db.Ado.UseTran()) {
                    if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
                        it.N_LOCK_STATE,
                        it.S_LOCK_STATE,
                        it.S_LOCK_OP,
                        it.T_MODIFY
                    }).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        return BuildSimpleResult(500,
                            $"生成 {taskName} 失败,容器号 {cntId} ,起点 {startLoc.S_CODE} ,终点货位 {endLoc.S_CODE}");
                    }
                    if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
                        it.N_LOCK_STATE,
                        it.S_LOCK_STATE,
                        it.S_LOCK_OP,
                        it.T_MODIFY
                    }).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        return BuildSimpleResult(500,
                            $"生成 {taskName} 失败,容器号 {cntId} ,起点 {startLoc.S_CODE} ,终点货架 {endLoc.S_CODE}");
                    }
                    if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        return BuildSimpleResult(500,
                            $"生成 {taskName} 失败,容器号 {cntId} ,起点 {startLoc.S_CODE} ,终点货架 {endLoc.S_CODE}");
                    }
                    tran.CommitTran();
                    return BuildSimpleResult(0,
                        $"生成 {taskName} 成功,容器号 {cntId} ,起点 {startLoc.S_CODE} ,终点货架 {endLoc.S_CODE}");
                }
            }
            catch (Exception ex) {
                return BuildSimpleResult(1, $"发生了异常:{ex.Message}");
            }
        }
        public static SimpleResult CancelTask(CancelTaskInfo model) {
            var db = new SqlHelper<object>().GetInstance();
            var info = "";
api/ImageController.cs
@@ -5,105 +5,113 @@
using System.Web;
using System.Web.Http;
public class ImageController : ApiController {
    private readonly string _baseStoragePath = HttpContext.Current.Server.MapPath("~/StaticStorage");
    private readonly string[] _allowedExtensions = { ".jpg", ".jpeg", ".png", ".gif", ".bmp" };
namespace HH.WCS.Mobox3.AnGang.api {
    // 上传图片接口
    [HttpPost]
    [Route("api/image/upload")]
    public HttpResponseMessage UploadImage() {
        try {
            if (!Request.Content.IsMimeMultipartContent()) {
                return Request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType, "请求必须包含多部分内容");
    //[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 {
                if (!Request.Content.IsMimeMultipartContent()) {
                    return Request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType, "请求必须包含多部分内容");
                }
                var provider = new MultipartFormDataStreamProvider(Path.GetTempPath());
                var result = Request.Content.ReadAsMultipartAsync(provider).Result;
                if (result.FileData.Count == 0) {
                    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "未接收到文件");
                }
                var fileData = result.FileData[0];
                var fileName = fileData.Headers.ContentDisposition.FileName.Trim('"');
                var fileExt = Path.GetExtension(fileName).ToLower();
                if (Array.IndexOf(_allowedExtensions, fileExt) == -1) {
                    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "不支持的文件类型");
                }
                // 生成日期路径
                var now = DateTime.Now;
                var year = now.ToString("yyyy");
                var month = now.ToString("MM");
                var day = now.ToString("dd");
                // 生成唯一文件名
                var newFileName = $"{now:yyyy-MM-dd-HHmmssfff}{fileExt}";
                // 目标路径
                var targetPath = Path.Combine(_baseStoragePath, "image", year, month, day);
                // 确保目录存在
                Directory.CreateDirectory(targetPath);
                // 完整文件路径
                var fullPath = Path.Combine(targetPath, newFileName);
                // 移动文件到目标位置
                File.Move(fileData.LocalFileName, fullPath);
                // 返回访问URL
                var url = $"{Request.RequestUri.Scheme}://{Request.RequestUri.Authority}/static/image/{year}/{month}/{day}/{newFileName}";
                return Request.CreateResponse(HttpStatusCode.OK, new { Url = url });
            }
            var provider = new MultipartFormDataStreamProvider(Path.GetTempPath());
            var result = Request.Content.ReadAsMultipartAsync(provider).Result;
            if (result.FileData.Count == 0) {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "未接收到文件");
            catch (Exception ex) {
                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message);
            }
            var fileData = result.FileData[0];
            var fileName = fileData.Headers.ContentDisposition.FileName.Trim('"');
            var fileExt = Path.GetExtension(fileName).ToLower();
            if (Array.IndexOf(_allowedExtensions, fileExt) == -1) {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "不支持的文件类型");
            }
            // 生成日期路径
            var now = DateTime.Now;
            var year = now.ToString("yyyy");
            var month = now.ToString("MM");
            var day = now.ToString("dd");
            // 生成唯一文件名
            var newFileName = $"{now:yyyy-MM-dd-HHmmssfff}{fileExt}";
            // 目标路径
            var targetPath = Path.Combine(_baseStoragePath, "image", year, month, day);
            // 确保目录存在
            Directory.CreateDirectory(targetPath);
            // 完整文件路径
            var fullPath = Path.Combine(targetPath, newFileName);
            // 移动文件到目标位置
            File.Move(fileData.LocalFileName, fullPath);
            // 返回访问URL
            var url = $"{Request.RequestUri.Scheme}://{Request.RequestUri.Authority}/static/image/{year}/{month}/{day}/{newFileName}";
            return Request.CreateResponse(HttpStatusCode.OK, new { Url = url });
        }
        catch (Exception ex) {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message);
        // 获取图片接口 - 实际由静态文件处理,这里只是示例
        [HttpGet]
        //[ActionName("Get")]
        [Route("static/image/{year}/{month}/{day}/{filename}")]
        public HttpResponseMessage GetImage(string year, string month, string day, string filename) {
            try {
                var filePath = Path.Combine(_baseStoragePath, "image", year, month, day, filename);
                if (!File.Exists(filePath)) {
                    return Request.CreateErrorResponse(HttpStatusCode.NotFound, "文件不存在");
                }
                var response = new HttpResponseMessage(HttpStatusCode.OK);
                var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                response.Content = new StreamContent(stream);
                // 根据文件扩展名设置ContentType
                var ext = Path.GetExtension(filename).ToLower();
                switch (ext) {
                    case ".jpg":
                    case ".jpeg":
                        response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/jpeg");
                        break;
                    case ".png":
                        response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/png");
                        break;
                    case ".gif":
                        response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/gif");
                        break;
                    case ".bmp":
                        response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/bmp");
                        break;
                    default:
                        response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
                        break;
                }
                return response;
            }
            catch (Exception ex) {
                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message);
            }
        }
    }
    // 获取图片接口 - 实际由静态文件处理,这里只是示例
    [HttpGet]
    [Route("static/image/{year}/{month}/{day}/{filename}")]
    public HttpResponseMessage GetImage(string year, string month, string day, string filename) {
        try {
            var filePath = Path.Combine(_baseStoragePath, "image", year, month, day, filename);
            if (!File.Exists(filePath)) {
                return Request.CreateErrorResponse(HttpStatusCode.NotFound, "文件不存在");
            }
            var response = new HttpResponseMessage(HttpStatusCode.OK);
            var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            response.Content = new StreamContent(stream);
            // 根据文件扩展名设置ContentType
            var ext = Path.GetExtension(filename).ToLower();
            switch (ext) {
                case ".jpg":
                case ".jpeg":
                    response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/jpeg");
                    break;
                case ".png":
                    response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/png");
                    break;
                case ".gif":
                    response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/gif");
                    break;
                case ".bmp":
                    response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/bmp");
                    break;
                default:
                    response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
                    break;
            }
            return response;
        }
        catch (Exception ex) {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message);
        }
    }
}
}
core/WCSCore.cs
@@ -206,7 +206,7 @@
                    return;
                }
                //row -= 100; // 118-1
                //row -= 100; // 111-118 => 1-8
                // 只当之前指定终点货架后,才尝试计算终点货位
                if (cgDetail.F_QTY > 2000) {
@@ -215,18 +215,23 @@
                    LogHelper.Info("重量超过2t,不允许入库");
                    // 传递给国自AGV
                    if (GZRobot.UpdateInteractInfo(new UpdateInteractInfo {
                        type_name = "GET_DST",
                        interaction_info_id = int.Parse(tn_task.S_EQ_TASK_CODE),
                        info_status = "error",
                    })) {
                        LogHelper.Info($"国自AGV接受超重取消信息成功", "HosttoagvTask");
                    if (GZRobot.TryGetInteractionInfoId(tn_task.S_CODE, out var id1)) {
                        if (GZRobot.UpdateInteractInfo(new UpdateInteractInfo {
                            type_name = "GET_DST",
                            interaction_info_id = id1,
                            info_status = "error",
                        })) {
                            LogHelper.Info($"国自AGV接受超重取消信息成功", "HosttoagvTask");
                        }
                        else {
                            LogHelper.Info($"国自AGV接受超重取消信息失败", "HosttoagvTask");
                        }
                    }
                    else {
                        LogHelper.Info($"国自AGV接受超重取消信息失败", "HosttoagvTask");
                        LogHelper.Info($"AGV:获取任务{tn_task.S_CODE}的interaction_info_id失败!", "HosttoagvTask");
                    }
                    return;
                    return; // 超重会自己return,如果国自agv没接受到也不需要提前return
                }
                else if (cgDetail.F_QTY > 1500) {
                    // 重量超过1.5t,需要选择1-2层货架
@@ -276,16 +281,23 @@
                    LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁
                    // 传递给国自AGV
                    if (GZRobot.UpdateInteractInfo(new UpdateInteractInfo {
                        type_name = "GET_DST",
                        interaction_info_id = int.Parse(tn_task.S_EQ_TASK_CODE),
                        info_status = "invalid",
                        return_value = LocationHelper.GetAgvSite(tn_task.S_END_LOC), // 目前使用agvsite
                    })) {
                        LogHelper.Info($"国自AGV接受终点信息成功", "HosttoagvTask");
                    if (GZRobot.TryGetInteractionInfoId(tn_task.S_CODE, out var id2)) {
                        if (GZRobot.UpdateInteractInfo(new UpdateInteractInfo {
                            type_name = "GET_DST",
                            interaction_info_id = id2,
                            info_status = "invalid",
                            return_value = LocationHelper.GetAgvSite(tn_task.S_END_LOC), // 目前使用agvsite
                        })) {
                            LogHelper.Info($"国自AGV接受终点信息成功", "HosttoagvTask");
                        }
                        else {
                            LogHelper.Info($"国自AGV接受终点信息失败", "HosttoagvTask");
                            return;
                        }
                    }
                    else {
                        LogHelper.Info($"国自AGV接受终点信息失败", "HosttoagvTask");
                        LogHelper.Info($"AGV:获取任务{tn_task.S_CODE}的interaction_info_id失败!", "HosttoagvTask");
                        return;
                    }
                    using (var tran = db.Ado.UseTran()) {
device/SnapDevice.cs
@@ -108,6 +108,9 @@
            if (!ret) {
                LogHelper.Info("抓图失败");
            }
            else {
                LogHelper.Info("抓图成功");
            }
            return ret;
        }
device/SnapManager.cs
@@ -22,10 +22,11 @@
            // SNAP
            DateTime now = DateTime.Now;
            string path = Settings.CaptureUrl;
            string fileName = string.Format("{0}{1}{2}{3}{4}{5}", now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second) + ".jpg";
            //string path = Settings.CaptureUrl;
            string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"StaticStorage/image/{now.Year}/{now.Month}/{now.Day}");
            string fileName = string.Format("{0}-{1}-{2}-{3}{4}{5}", now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second) + ".jpg";
            string filePath = path + "\\" + fileName;
            string url = Path.Combine(Settings.WebApiUrl, $"static/image/{now.Year}/{now.Month}/{now.Day}", fileName);
            //// 获取当前时间
            //DateTime now = DateTime.Now;
@@ -42,13 +43,16 @@
            //string filePath = Path.Combine(directoryPath, fileName);
            if (_snapDevice.SnapPictureToFileOK(ref filePath)) {
                return filePath;
                //return filePath;
                return url;
            }
            else {
                return string.Empty;
            }
        }
        // 大概率用不到,应该不是本地抓图,只可能是网络抓图,图片保存到后台
        public static string GetCapturePictureLocal() {
            return _snapDevice.GetCapturePictureLocalPath();
        }
dispatch/GZRobot.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IdentityModel.Protocols.WSTrust;
using System.Linq;
using System.Security.Policy;
using System.Threading.Tasks;
@@ -146,6 +147,10 @@
                case "waiting":
                    agv.state = 1;
                    break;
                case "dispatched":
                    //调度派车(开始取货)NEW ADDED
                    agv.state = 3;
                    break;
                case "source_finish":
                    //取货完成
                    agv.state = 4;
@@ -252,6 +257,31 @@
            return list;
        }
        /// <summary>
        /// 根据没有interaction_info_name(task.S_CODE)获取interaction_info_id
        /// </summary>
        /// <param name="taskCode"></param>
        /// <param name="infoId"></param>
        /// <returns></returns>
        public static bool TryGetInteractionInfoId(string taskCode, out int infoId) {
            var list = QueryInteractInfo(3);
            if (list.Count == 0) {
                LogHelper.Info($"查交互表失败!没有读取到交互表!");
                infoId = 0;
                return false;
            }
            var data = list.Where(i => i.interaction_info_name == taskCode).FirstOrDefault();
            if (data == null) {
                LogHelper.Info($"查交互表失败!没有interaction_info_name='{taskCode}'的值!" + JsonConvert.SerializeObject(list));
                infoId = 0;
                return false;
            }
            infoId = data.interaction_info_id;
            return true;
        }
        // DOC 6.    交互表查询(更新终点货位)
        public static bool UpdateInteractInfo(UpdateInteractInfo interactInfo) {
            string msg = "";
models/TN_CG_Detail.cs
@@ -14,7 +14,7 @@
        /// 货品 ID
        /// </summary>
        public string S_CG_ID { get; set; } = "";
        public string S_CNTR_CODE { get; set; } = "";//容器编码
        public string S_ITEM_CODE { get; set; } = "";//货品编码
@@ -40,7 +40,7 @@
        /// </summary>
        public float F_QTY { get; set; } = 0f;
        public string S_LOC_CODE { get; set; }
    }
}
process/TaskProcess.cs
@@ -114,16 +114,18 @@
                var startSite = LocationHelper.GetAgvSite(mst.S_START_LOC);
                var endSite = LocationHelper.GetAgvSite(mst.S_END_LOC); // 如果找不到会返回0,就是假终点
                var code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = startSite, order_name = $"tet" }), "p2pdst2", "pgapi");
                //var code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = startSite, order_name = $"tet" }), "p2pdst2", "pgapi");
                //var code = -1;
                var code = 0;
                if (taskType == TaskName.产品入库) {
                    code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = startSite, order_name = $"{mst.S_CODE}" }), "p2pdst", "pgapi");
                    //code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = startSite, order_name = $"{mst.S_CODE}" }), "p2pdst", "pgapi");
                    code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = startSite, order_name = $"{mst.S_CODE}" }), "p2pdst2", "pgapi");
                }
                else {
                    code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = startSite, dst = endSite }), "p2p", "pgapi");
                    code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = startSite, dst = endSite }), "p2pcm", "pgapi");
                }
                LogHelper.Info($"eq_task_code={code}");
                //LogHelper.Info($"eq_task_code={code}");
                // car_type 默认为1
                // src_ort 货架排号
                // dst_orc 货架层数(后两个信息应该为国自AGV内部维护,以后面更改的结果为准)
wms/LocationHelper.cs
@@ -221,7 +221,8 @@
                    using (var tran = db.Ado.UseTran())
                    {
                        if (db.Deleteable<TN_Loc_Container>().Where(it => cntrs.Contains(it.S_CNTR_CODE) && it.S_LOC_CODE == loc).ExecuteCommand() > 0)
                        if (db.Deleteable<TN_Loc_Container>().Where(it => cntrs.Contains(it.S_CNTR_CODE) && it.S_LOC_CODE == loc).ExecuteCommand() > 0 &&
                            db.Updateable<TN_CG_Detail>().SetColumns(d => d.S_LOC_CODE == null).Where(d => cntrs.Contains(d.S_CNTR_CODE)).ExecuteCommand() > 0) // ADD:补充针对PDA分拣
                        {
                            LogHelper.Info($"删除货位容器关系表成功,{log}");
                        }
@@ -294,7 +295,8 @@
                using (var tran = db.Ado.UseTran())
                {
                    if (db.Insertable<TN_Loc_Container>(bindLocCntList).ExecuteCommand() > 0)
                    if (db.Insertable<TN_Loc_Container>(bindLocCntList).ExecuteCommand() > 0 &&
                        db.Updateable<TN_CG_Detail>().SetColumns(d => d.S_LOC_CODE == loc).Where(d => cntrs.Contains(d.S_CNTR_CODE)).ExecuteCommand() > 0) // ADD:补充针对PDA分拣
                    {
                        LogHelper.Info($"插入货位容器关系表成功,{log}");
                    }