zwc
2025-01-15 2920728d7908da2ee196f3af8b3d1c635696e9a1
修改问题
18个文件已修改
1273 ■■■■■ 已修改文件
Wms/Model/InterFaceModel/AsnModels.cs 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/InterFaceModel/HttpModel.cs 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllAsnServer/PalletBindServer.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs 327 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs 388 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/DataServer/StockServer.cs 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IBllAsnServer/IArrivalNoticeServer.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IBllSoServer/IExportNoticeServer.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IDataServer/IStockServer.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IPdaServer/IPdaCrServer.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/BllSoController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/DownApiController.cs 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/PdaCrController.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/UpApiController.cs 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Properties/launchSettings.json 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Tools/ApiUrlConfig.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/appsettings.json 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/InterFaceModel/AsnModels.cs
@@ -98,4 +98,51 @@
        public string PalletNo { get; set; }
    }
    public class BoxInfoCheck
    {
        public string PalletNo { get; set; }
        public string TaskNo { get; set; }
    }
    public class RequestBoxInfoCheck
    {
        /// <summary>
        /// 托盘号
        /// </summary>
        public string PalletNo { get; set; }
        /// <summary>
        /// 任务号
        /// </summary>
        public string TaskNo { get; set; }
        /// <summary>
        /// 订单号
        /// </summary>
        public string OrderNo { get; set; }
        /// <summary>
        /// 物料编码
        /// </summary>
        public string SkuNo { get; set; }
        /// <summary>
        /// 物料名称
        /// </summary>
        public string SkuName { get; set; }
        /// <summary>
        /// 批次
        /// </summary>
        public string LotNo { get; set; }
        /// <summary>
        /// 规格
        /// </summary>
        public string Standard {  get; set; }
        /// <summary>
        /// 拆箱数量
        /// </summary>
        public int? Qty {  get; set; }
        /// <summary>
        /// 托盘上总箱数
        /// </summary>
        public int? QtyCount {  get; set; }
    }
}
Wms/Model/InterFaceModel/HttpModel.cs
@@ -379,7 +379,7 @@
        /// 格式: “yyyy-MM-ddHH:mm:ss”
        /// 是否必填:否
        /// </summary>
        public string EeqTime { get; set; }
        public string ReqTime { get; set; }
        /// <summary>
        /// 客户端编号,如 PDA,HCWMS 等。
@@ -422,6 +422,13 @@
        /// 是否必填:否
        /// </summary>
        public string CtnrTyp { get; set; }
        /// <summary>
        /// 容器数量(叉车/CTU 专用)
        /// 叉车项目必传
        /// 是否必填:否
        /// </summary>
        public string CtnrNum { get; set; }
        /// <summary>
        /// 容器编号(叉车/CTU 专用)
@@ -665,6 +672,7 @@
    /// </summary>
    public class AgvTaskDto
    {
        /// <summary>
        /// 请求编号,每个请求都要一个唯一编号
        /// 同一个请求重复提交 使用同一编号
@@ -683,13 +691,13 @@
        /// 地码 X 坐标(mm):任务完成时有值
        /// 是否必填:否
        /// </summary>
        public int CooX { get; set; }
        public decimal CooX { get; set; }
        /// <summary>
        /// 地码 Y 坐标(mm):任务完成时有值
        /// 是否必填:否
        /// </summary>
        public int CooY { get; set; }
        public decimal CooY { get; set; }
        /// <summary>
        /// 当前位置编号
@@ -785,11 +793,6 @@
        /// </summary>
        public string CtnrCode { get; set; }
        /// <summary>
        /// 容器类型
        /// 是否必填:否
        /// </summary>
        public string CtnrType { get; set; }
        /// <summary>
        /// 巷道编号
@@ -809,6 +812,40 @@
        /// 是否必填:否
        /// </summary>
        public string EqpCode { get; set; }
        public string DstBinCode { get; set; }
        public string IndBind { get; set; }
        public string Layer { get; set; }
        public string MapShortName { get; set; }
        public string MaterialType { get; set; }
        public string Action { get; set; }
        public string AreaCode { get; set; }
        public string BerthCode { get; set; }
        public string CallCode { get; set; }
        public string CallTyp { get; set; }
        public string ClientCode { get; set; }
        public string OrgCode { get; set; }
        public string CtnrTyp { get; set; }
        public string CurrentCallCode { get; set; }
        public string PodCode { get; set; }
        public string PodTyp { get; set; }
        public string PodNum { get; set; }
        public string RelatedArea { get; set; }
        public string ReqTime { get; set; }
        public string SubTaskNum { get; set; }
        public string TaskTyp { get; set; }
        public string TokenCode { get; set; }
        public string Username { get; set; }
        public string WhCode { get; set; }
    }
    /// <summary>
@@ -845,6 +882,35 @@
        /// </summary>
        public string Data { get; set; }
    }
    /// <summary>
    /// WMS下发AGV取消任务回传参数
    /// </summary>
    public class cancelTaskModel
    {
        /// <summary>
        /// 返回码
        /// 0:成功
        /// 1:参数相关的错误
        /// 6:重复发送,上层系统不需要重发
        /// 99:其他未知错误,调用失败后,可以重试
        /// 100: 该任务不存在,上层系统不需重发,需要人工介入处理
        /// 是否必填:是
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// 返回消息
        /// 是否必填:是
        /// </summary>
        public string Message { get; set; }
        /// <summary>
        /// 请求编号
        /// 是否必填:是
        /// </summary>
        public string ReqCode { get; set; }
    }
    #endregion
    #region FuMa-Model
Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs
@@ -410,6 +410,20 @@
                    if (model.Type == "0")//成品入库单下发WCS信息
                    {
                        //计算出总箱数
                        var packmodel = Db.Queryable<SysPackag>().First(w=>w.PackagNo == detailModel.SkuNo);
                        int xqty = 0;
                        if (packmodel.L1Name == "箱") {
                            xqty = (int)detailModel.Qty;
                        }
                        if (packmodel.L2Name == "箱")
                        {
                            xqty = (int)(detailModel.Qty / packmodel.L2Num);
                        }
                        if (packmodel.L3Name == "箱")
                        {
                            xqty = (int)(detailModel.Qty/ packmodel.L2Num / packmodel.L3Num);
                        }
                        addOder.Add(new ResponseOrderTaskModel()
                        {
                            OrderNo = model.ASNNo,
@@ -417,7 +431,7 @@
                            SkuNo = detailModel.SkuNo,
                            SkuName = detailModel.SkuName,
                            BoxType = detailModel.Standard,
                            Qty = (int)detailModel.Qty,
                            Qty = xqty,
                            TaskType = 0
                        });
                    }
@@ -1009,10 +1023,11 @@
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public HttpReturnModel HttpCreateAsn(AsnInfo model)
        public HttpReturnModel HttpCreateAsn(AsnInfo model, string url)
        {
            try
            {
                var addOder = new List<ResponseOrderTaskModel>();
                var resultModel = new HttpReturnModel() { Success = "-1", Message = "" };
                if (string.IsNullOrEmpty(model.AsnType))
                {
@@ -1105,7 +1120,37 @@
                    };
                    detailModels.Add(detailModel);
                    if (model.AsnType == "0")//成品入库单下发WCS信息
                    {
                        //计算出总箱数
                        var packmodel = Db.Queryable<SysPackag>().First(w => w.PackagNo == detailModel.SkuNo);
                        int xqty = 0;
                        if (packmodel.L1Name == "箱")
                        {
                            xqty = (int)detailModel.Qty;
                        }
                        if (packmodel.L2Name == "箱")
                        {
                            xqty = (int)(detailModel.Qty / packmodel.L2Num);
                        }
                        if (packmodel.L3Name == "箱")
                        {
                            xqty = (int)(detailModel.Qty / packmodel.L2Num / packmodel.L3Num);
                        }
                        addOder.Add(new ResponseOrderTaskModel()
                        {
                            OrderNo = asnNo,
                            LotNo = asnDetailModel.LotNo,
                            SkuNo = asnDetailModel.SkuNo,
                            SkuName = skuModel.SkuName,
                            BoxType = skuModel.Standard,
                            Qty = (int)asnDetailModel.Qty,
                            TaskType = 0
                        });
                    }
                }
                Db.BeginTran();
                // 插入入库单总表
@@ -1115,6 +1160,36 @@
                Db.Insertable(detailModels).ExecuteCommand();
                Db.CommitTran();
                if (addOder.Count > 0)
                {
                    // 正式运行程序放开
                    var jsonData = JsonConvert.SerializeObject(addOder);
                    string response = "";
                    try
                    {
                        var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                                                 //给WCS下发入库单信息
                        response = HttpHelper.DoPost(url, jsonData, "下发给WCS入库命令", "WCS");
                        //解析返回数据
                        var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response);
                        if (wcsModel.StatusCode == 0)
                        {
                        }
                        if (wcsModel.StatusCode == -1)
                        {
                            throw new Exception($"下发WCS失败:{wcsModel.Msg}");
                        }
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
                resultModel.Success = "0";
                resultModel.Message = "成功";
                return resultModel;
Wms/WMS.BLL/BllAsnServer/PalletBindServer.cs
@@ -3226,9 +3226,9 @@
                    throw new Exception("未找到该托盘条码:" + palletNo);
                }
                var palletBindList = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.LocatNo.Substring(0,1) != "B").First();
                if (palletBindList.IsBelt == "1")
                if (palletBindList.IsBale == "2")
                {
                    palletBindList.IsBelt = "0";
                    palletBindList.IsBale = "0";
                    Db.Updateable(palletBindList).ExecuteCommand();
                    t = 1;
                }
@@ -3256,8 +3256,9 @@
                var palletBindList = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Status == "1").OrderByDescending(m => m.CreateTime).First();
                if (palletBindList.IsBale == "1")
                {
                    palletBindList.IsBelt = "1";
                    palletBindList.IsBale = "2";
                    Db.Updateable(palletBindList).ExecuteCommand();
                    t = 1;
                }
                
                return t;
Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs
@@ -1,4 +1,5 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Policy;
@@ -6,6 +7,7 @@
using System.Threading.Tasks;
using Model.InterFaceModel;
using Model.ModelDto.BllCheckDto;
using Model.ModelDto.LogDto;
using Model.ModelDto.PdaDto;
using Model.ModelDto.SysDto;
using Model.ModelVm;
@@ -904,7 +906,8 @@
            }
            try
            {
                string EndLocat = string.Empty;//目标位置
                string EndLocat = string.Empty,OrderTy = "";//目标位置
                var log = Db.Queryable<LogTask>().First(w => w.IsDel == "0" && w.PalletNo == palletNo && (w.Status == "0" || w.Status == "1"));
                if (log != null)
@@ -924,10 +927,14 @@
                        throw new Exception("所选区域信息不存在,请检查!");
                    }
                    EndLocat = GetLocat(areaNo, stockDetail.SkuNo, stockDetail.LotNo, palletNo);
                    OrderTy = "3";//移库
                }
                else
                {
                    EndLocat = ruku;
                    OrderTy = "0";//入库
                }
                var stock = Db.Queryable<DataStock>().First(w => w.IsDel == "0" && w.SkuNo == stockDetail.SkuNo && w.LotNo == stockDetail.LotNo);
                if (stock == null)
@@ -980,7 +987,7 @@
                    IsFinish = 1,//是否可完成
                    Type = "2",//任务类型 0 入库任务 1 出库任务  2 移库任务
                    Status = "0",//任务状态0:等待执行1正在执行2执行完成
                    OrderType = "3",//0 入库单 1 出库单  2 盘点单  3 移库单
                    OrderType = OrderTy,//0 入库单 1 出库单  2 盘点单  3 移库单
                    CreateTime = DateTime.Now
                };
@@ -1009,53 +1016,105 @@
                #region 呼叫小车代码
                var endlono = EndLocat;
                var tasktype = "D00";  //默认为点到点任务
                //根据目的地址库区获取小车任务类型
                switch (storageLocatEnd.AreaNo)
                {
                    case "B13" :
                        tasktype = "D02";  // 叠托任务(目的地址为空托盘收集区)
                        break;
                    case "B15":
                        tasktype = "D01";  // 拆托任务(目的地址为拣货区)
                        break;
                }
                //缓存库位转换     3楼原辅料Y003_001,Y003_002,Y003_003  1楼Y138_001到Y138_021外包缓存区   1楼Y128_001到Y128_015内包缓存区
                if (storageLocatEnd.AreaNo == "B12")
                {
                    switch (EndLocat.ToString().Substring(4, 1))
                    {
                        case "1":
                            endlono = "Y003_00" + EndLocat.ToString().Substring(6, 1);
                            tasktype = "D00";     //点到点任务
                            break;
                        case "2":
                            endlono = "Y138_0" + EndLocat.ToString().Substring(5, 2);
                            tasktype = "F20";    //电梯任务
                            break;
                        case "3":
                            endlono = "Y128_0" + EndLocat.ToString().Substring(5, 2);
                            tasktype = "F20";     //电梯任务
                            break;
                        default:
                            break;
                    }
                }
                //点到点指令集合
                object[] position = new object[2];
                position[0] = new
                {
                    positionCode = stockDetail.LocatNo,
                    type = "00"
                };
                position[1] = new
                {
                    positionCode = endlono,
                    type = "00"
                };
                List<AgvSchedulingTask> agvTaskList = new List<AgvSchedulingTask>();
                Random r = new Random();
                long ran =DateTime.Now.Ticks;
                AgvSchedulingTask agvTask = new AgvSchedulingTask();
                agvTask.ReqCode = taskNo;
                agvTask.TaskTyp = "F01";
                agvTask.WbCode = "";
                agvTask.PositionCodePath = null;
                agvTask.PodCode = "-1";
                agvTask.TaskCode = taskNo;
                agvTask.ReqCode = ran.ToString();
                agvTask.TaskTyp = tasktype;
                agvTask.PositionCodePath = position;
                agvTask.CtnrTyp = "1";
                if (tasktype == "D02")
                {
                    agvTask.CtnrNum = "10";     //叠托任务需要下发空托盘数量
                }
                agvTaskList.Add(agvTask);
                var IsTrue = false;
                while (IsTrue == true)
                // 正式运行程序放开
                string str = "";
                var list2 = agvTaskList.Select(m => m.ReqCode).ToList();
                var jsonData = JsonConvert.SerializeObject(agvTaskList);
                jsonData = jsonData.Substring(1, jsonData.Length - 1);
                jsonData = jsonData.Substring(0, jsonData.Length - 1);
                string response = "";
                try
                {
                    // 正式运行程序放开
                    string str = "";
                    var list2 = agvTaskList.Select(m => m.ReqCode).ToList();
                    var jsonData = JsonConvert.SerializeObject(agvTaskList);
                    string response = "";
                    var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                    response = HttpHelper.DoPost(url, jsonData, "下发给AGV转运命令", "AGV");
                    var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                    try
                    //////解析返回数据
                    var agvModel = JsonConvert.DeserializeObject<OutCommanAgvDto>(response);
                    if (agvModel.Code == "0")
                    {
                        var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                        response = HttpHelper.DoPost(url, jsonData, "下发给AGV转运命令", "AGV");
                        var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                        //////解析返回数据
                        var agvModel = JsonConvert.DeserializeObject<OutCommanAgvDto>(response);
                        if (agvModel.Code == "0")
                        {
                            //更改任务的发送返回时间//
                            new TaskServer().EditTaskIssueOk(list2, time1, time2);
                            str += "下发成功";
                            IsTrue = true;
                        }
                        if (agvModel.Code == "1")
                        {
                            new TaskServer().EditTaskIssueNo(list2, time1, time2, agvModel.Message);
                            throw new Exception(agvModel.Message);
                        }
                        //更改任务的发送返回时间//
                        new TaskServer().EditTaskIssueOk(list2, time1, time2);
                        str += "下发成功";
                    }
                    catch (Exception ex)
                    if (agvModel.Code == "1")
                    {
                        throw new Exception(ex.Message);
                        new TaskServer().EditTaskIssueNo(list2, time1, time2, agvModel.Message);
                        throw new Exception(agvModel.Message);
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                #endregion
                //提交事务
@@ -1074,7 +1133,7 @@
        /// <param name="palletNo"></param>
        /// <param name="areaNo"></param>
        /// <param name="userId"></param>
        public List<string> AgvTransport2(string soNo, string palletNo, string areaNo, int userId, string url)
        public List<string> AgvTransport2(string soNo, string palletNo, string areaNo,string ruku, int userId, string url)
        {
            if (string.IsNullOrEmpty(soNo))
            {
@@ -1196,12 +1255,58 @@
                    };
                    Db.Insertable(exTask).ExecuteCommand();
                    var endlono = EndLocat;
                    var tasktype = "D00";
                    //根据目的地址库区获取小车任务类型
                    switch (storageLocatEnd.AreaNo)
                    {
                        case "B13":
                            tasktype = "D02";  // 叠托任务(目的地址为空托盘收集区)
                            break;
                        case "B15":
                            tasktype = "D01";  // 拆托任务(目的地址为拣货区)
                            break;
                    }
                    //缓存库位转换     3楼原辅料Y003_001,Y003_002,Y003_003  1楼Y138_001到Y138_021外包缓存区   1楼Y128_001到Y128_015内包缓存区
                    if (storageLocatEnd.AreaNo == "B12")
                    {
                        switch (EndLocat.ToString().Substring(4, 1))
                        {
                            case "1":
                                endlono = "Y003_00" + EndLocat.ToString().Substring(6, 1);
                                break;
                            case "2":
                                endlono = "Y138_0" + EndLocat.ToString().Substring(5, 2);
                                tasktype = "F20";    //电梯任务
                                break;
                            case "3":
                                endlono = "Y128_0" + EndLocat.ToString().Substring(5, 2);
                                tasktype = "F20";     //电梯任务
                                break;
                            default:
                                break;
                        }
                    }
                    //点到点指令集合
                    object[] position = new object[2];
                    position[0] = new
                    {
                        positionCode = item.LocatNo,
                        type = "00"
                    };
                    position[1] = new
                    {
                        positionCode = endlono,
                        type = "00"
                    };
                    AgvSchedulingTask agvTask = new AgvSchedulingTask();
                    agvTask.ReqCode = taskNo;
                    agvTask.TaskTyp = "F01";
                    agvTask.WbCode = "";
                    agvTask.PositionCodePath = null;
                    agvTask.PodCode = "-1";
                    agvTask.TaskTyp = tasktype;
                    agvTask.PositionCodePath = position;
                    agvTaskList.Add(agvTask);
@@ -1249,6 +1354,8 @@
                    string str = "";
                    var list2 = agvTaskList.Select(m => m.ReqCode).ToList();
                    var jsonData = JsonConvert.SerializeObject(agvTaskList);
                    jsonData = jsonData.Substring(1, jsonData.Length - 1);
                    jsonData = jsonData.Substring(0, jsonData.Length - 1);
                    string response = "";
                    try
@@ -1290,6 +1397,126 @@
                throw new Exception(ex.Message);
            }
        }
        /// <summary>
        /// agv调度任务下发
        /// </summary>
        /// <param name="type">搬运类型</param>
        /// <param name="taskno">任务号</param>
        /// <param name="positionStart">起始地址</param>
        /// <param name="positionEnd">目的地址</param>               2
        /// <param name="url">接口URL</param>
        public OutCommanAgvDto AGVTask(string type, string taskno, string positionStart, string positionEnd ,string url)
        {
            var endlono = positionEnd;
            var tasktype = type;
            var storageLocatEnd = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == endlono && w.Flag == "0" && w.Status == "0");
            if (storageLocatEnd == null)
            {
                throw new Exception("生成的AGV任务目的地址不正确");
            }
            //根据目的地址库区获取小车任务类型
            switch (storageLocatEnd.AreaNo)
            {
                case "B13":
                    tasktype = "D02";  // 叠托任务(目的地址为空托盘收集区)
                    break;
                case "B15":
                    tasktype = "D01";  // 拆托任务(目的地址为拣货区)
                    break;
            }
            // MES申请备料,备料区库位需要转换     车间备料缓存位名称:3楼原辅料Y003_001-->Y003_003  1楼外包缓存区Y138_001-->Y138_021   1楼内包缓存区Y128_001-->Y128_015
            if (storageLocatEnd.AreaNo == "B12")
            {
                switch (endlono.ToString().Substring(4, 1))
                {
                    case "1":
                        endlono = "Y003_00" + endlono.Substring(6, 1);
                        break;
                    case "2":
                        endlono = "Y138_0" + endlono.Substring(5, 2);
                        tasktype = "F20";    //电梯任务
                        break;
                    case "3":
                        endlono = "Y128_0" + endlono.Substring(5, 2);
                        tasktype = "F20";     //电梯任务
                        break;
                    default:
                        break;
                }
            }
            List<AgvSchedulingTask> agvTaskList = new List<AgvSchedulingTask>();
            object[] position = new object[2];
            position[0] = new
            {
                positionCode = positionStart,
                type = "00"
            };
            position[1] = new
            {
                positionCode = endlono,
                type = "00"
            };
            AgvSchedulingTask agvTask = new AgvSchedulingTask();
            agvTask.ReqCode = taskno;         //agv请求编号,需要随机生成  (最大32位)
            agvTask.TaskCode = taskno;         //任务号
            agvTask.TaskTyp = tasktype;           //搬运类型
            agvTask.PositionCodePath = position;      //起始和目的位集合
            agvTask.CtnrTyp = "1";            //容器类型,值为1
            if (tasktype == "D02")
            {
                agvTask.CtnrNum = "10";     //叠托任务需要下发空托盘数量
            }
            agvTaskList.Add(agvTask);
            string str = "";
            var list2 = agvTaskList.Select(m => m.ReqCode).ToList();
            var jsonData = JsonConvert.SerializeObject(agvTaskList);
            jsonData = jsonData.Substring(1, jsonData.Length-1);
            jsonData = jsonData.Substring(0, jsonData.Length - 1);
            var response = HttpHelper.DoPost(url, jsonData, "下发给AGV转运命令", "AGV");
            var agvModel = JsonConvert.DeserializeObject<OutCommanAgvDto>(response);
            return agvModel;
        }
        /// <summary>
        /// agv任务取消
        /// </summary>
        /// <param name="taskno">取消任务编号</param>
        /// <param name="url">接口URL</param>
        public void cancelTask(string taskno,string url)
        {
            try
            {
                AgvCancelTask agvTaskList = new AgvCancelTask();
                agvTaskList.ReqCode = "006"; //随机生成
                agvTaskList.TaskCode = taskno.ToString();
                //agvTaskList.ReqTime = DateTime.Now.ToString();
               var jsonData = JsonConvert.SerializeObject(agvTaskList);
                var response = HttpHelper.DoPost(url, jsonData, "下发给AGV转运命令", "AGV");
                var agvModel = JsonConvert.DeserializeObject<cancelTaskModel>(response);
                if (agvModel.Code != "0")
                {
                    throw new Exception("下发AGV取消任务失败");
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// 根据区域分配储位
        /// </summary>
@@ -1478,12 +1705,28 @@
                    {
                        {"Authorization",token }
                    };
                    var endlono = EndLocat.LocatNo;
                    //缓存库位转换
                    switch (EndLocat.LocatNo.ToString().Substring(4, 1))
                    {
                        case "1":
                            endlono = "Y003_00" + EndLocat.LocatNo.ToString().Substring(6, 1);
                            break;
                        case "2":
                            endlono = "Y138_0" + EndLocat.LocatNo.ToString().Substring(5, 2);
                            break;
                        case"3":
                            endlono = "Y128_0" + EndLocat.LocatNo.ToString().Substring(5, 2);
                            break;
                        default:
                            break;
                    }
                    var mescode = Db.Queryable<BllExportNotice>().Where(w => w.SONo == stockDetail.First().SONo).First();
                    var mesData = new RequertBeiliaoModel()
                    {
                        morder_no = mescode.OrderCode,
                        pallet = stockDetail.First().PalletNo,
                        layer_no = EndLocat.LocatNo,
                        layer_no = endlono,
                        items = data
                    };
                    var jsonData = JsonConvert.SerializeObject(mesData);
@@ -1501,7 +1744,7 @@
                //添加操作日志记录
                var k = new OperationCrServer().AddLogOperationCr("PDA模块", "AGV转运", palletNo, "移库", $"PDA呼叫小车对托盘号:{palletNo}发起转运", userId);
                var k = new OperationCrServer().AddLogOperationCr("PDA模块", "人工转运", palletNo, "移库", $"PDA呼叫小车对托盘号:{palletNo}发起转运", userId);
                
                //提交事务
                Db.CommitTran();
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -24,6 +24,12 @@
using WMS.IBLL.IBllSoServer;
using Model.ModelVm;
using System.Runtime.Intrinsics.X86;
using WMS.Entity.BllAsnEntity;
using Model.ModelDto;
using WMS.BLL.BllPdaServer;
using WMS.IBLL.IPdaServer;
using System.DirectoryServices.Protocols;
using Model.ModelDto.SysDto;
namespace WMS.BLL.BllSoServer
{
@@ -2235,16 +2241,24 @@
            }
        }
        //wcs返回的成功信号(出库成功)
        public void ExportSuccess(string taskNo, int userId)
        //wcs返回的成功信号(出库成功)
        public void ExportSuccess(string taskNo, int userId,string url)
        {
            try
            {
                //出库任务号更改,如果由PLC出库,则PLC回传任务号为:任务号+实际出库口
                var TtaskNo = taskNo;
                var outLine = "";
                if (userId == 0)
                {
                    TtaskNo = taskNo.Substring(0, taskNo.Length - 4);
                    outLine = taskNo.Substring(taskNo.Length - 4, 3);
                }
                //当前任务信息
                var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0");
                var task = Db.Queryable<LogTask>().First(m => m.TaskNo == TtaskNo && m.IsDel == "0");
                if (task == null)
                {
                    throw new Exception($"未查询到任务号为:‘{taskNo}’的任务信息");
                    throw new Exception($"未查询到任务号为:‘{TtaskNo}’的任务信息");
                }
                if (task.Status == "2")
                {
@@ -2360,7 +2374,7 @@
                        Db.Updateable(item).ExecuteCommand();
                    }
                    //出库流水(更改状态)
                    var allot = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.TaskNo == taskNo || (m.Status == "1" && m.PalletNo == task.PalletNo))).ToList();
                    var allot = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.TaskNo == TtaskNo || (m.Status == "1" && m.PalletNo == task.PalletNo))).ToList();
                    foreach (var item in allot)
                    {
@@ -2379,7 +2393,106 @@
                    if (userId != 0)
                    {
                        //添加操作日志记录
                        var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId);
                        var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库日志", TtaskNo, "完成", $"点击完成按钮、完成任务号为:{TtaskNo}的任务", userId);
                    }
                    if (outLine != "")
                    {
                        #region 分配出库目的位
                        string positionStart = outLine, positionEnd = "" ,type ="D00";
                        var type1 = Db.Queryable<BllExportNotice>().Where(m => m.SONo == allot.First().SONo && m.IsDel == "0" && m.Status == "3").First();
                        if (type1 == null)
                        {
                            var locateno = Db.Queryable<SysStorageLocat>().Where(m => m.AreaNo == "B13").ToList();
                            type = "D02" ; //空托盘垛出库
                             if (outLine == "443")//西侧出库
                            {
                                positionEnd = locateno.First(m => m.LocatNo.Substring(3, 2) == "01" && m.LocatNo.Substring(3, 2) == "02" && m.LocatNo.Substring(3, 2) == "03" &&
                                m.Status == "0" && m.Flag == "0").LocatNo;
                            }
                            else if (outLine == "440")  //东侧出库
                            {
                                positionEnd = locateno.First(m => m.LocatNo.Substring(4, 2) == "04" && m.LocatNo.Substring(4, 2) == "05" && m.LocatNo.Substring(4, 2) == "06" &&
                                m.Status == "0" && m.Flag == "0").LocatNo; //东侧房间库位
                            }
                        }
                        if (type1.Type == "1" && (type1.Type == "5" || (positionStart == "440" && positionStart == "440")))  //3楼领料出库 /3L中间品出库
                        {
                            var locateno = Db.Queryable<SysStorageLocat>().Where(m => m.AreaNo == "B11").ToList();
                            if (outLine == "443")//西侧出库
                            {
                                positionEnd = locateno.First(m => m.LocatNo.Substring(3, 2) == "01"&& m.LocatNo.Substring(4, 2) == "02" && m.Status == "0" && m.Flag == "0").LocatNo; //西侧房间库位
                            }
                            else  if(outLine == "440")  //东侧出库
                            {
                                positionEnd = locateno.First(m => m.LocatNo.Substring(3, 2) == "03" && m.LocatNo.Substring(4, 2) == "04" && m.LocatNo.Substring(4, 2) == "05" &&
                                m.LocatNo.Substring(4, 2) == "06" && m.LocatNo.Substring(3, 2) == "07" && m.Status == "0" && m.Flag == "0").LocatNo; //东侧房间库位
                            }
                        }
                        else if (type1.Type == "2" && type1.Type == "3") //抽检出库 /取样出库
                        {
                            positionEnd = Db.Queryable<SysStorageLocat>().First(m => m.AreaNo == "B04" && m.Status == "0" && m.Flag == "0").LocatNo;
                        }
                        else if (type1.Type == "4")//不合格品出库
                        {
                            positionEnd = Db.Queryable<SysStorageLocat>().First(m => m.AreaNo == "B03" && m.Status == "0" && m.Flag == "0").LocatNo;
                        }
                        else //其他单据类型都存放发货缓存区
                        {
                            positionEnd = Db.Queryable<SysStorageLocat>().First(m => m.AreaNo == "B02" && m.Status == "0" && m.Flag == "0").LocatNo;
                        }
                        #endregion
                        #region AGV调用
                        var storageLocatEnd = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == positionEnd && w.Flag == "0" && w.Status == "0");
                        if (storageLocatEnd == null)
                        {
                            throw new Exception("生成的AGV任务目的地址不正确");
                        }
                        List<AgvSchedulingTask> agvTaskList = new List<AgvSchedulingTask>();
                        object[] position = new object[2];
                        position[0] = new
                        {
                            positionCode = positionStart,
                            type = "00"
                        };
                        position[1] = new
                        {
                            positionCode = positionEnd,
                            type = "00"
                        };
                        AgvSchedulingTask agvTask = new AgvSchedulingTask();
                        agvTask.ReqCode = TtaskNo;         //agv请求编号,需要随机生成  (最大32位)
                        agvTask.TaskCode = TtaskNo;         //任务号
                        agvTask.TaskTyp = type;           //搬运类型
                        agvTask.PositionCodePath = position;      //起始和目的位集合
                        agvTask.CtnrTyp = "1";            //容器类型,值为1
                        if (type == "D02")
                        {
                            agvTask.CtnrNum = "10";     //叠托任务需要下发空托盘数量
                        }
                        agvTaskList.Add(agvTask);
                        string str = "";
                        var list2 = agvTaskList.Select(m => m.ReqCode).ToList();
                        var jsonData = JsonConvert.SerializeObject(agvTaskList);
                        jsonData = jsonData.Substring(1, jsonData.Length - 1);
                        jsonData = jsonData.Substring(0, jsonData.Length - 1);
                        var response = HttpHelper.DoPost(url, jsonData, "下发给AGV转运命令", "AGV");
                        var agvModel = JsonConvert.DeserializeObject<OutCommanAgvDto>(response);
                        if (agvModel.Code != "0")
                        {
                            //记录log
                            var logStr = $@".\log\AGV\任务反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
                            jsonData = JsonConvert.SerializeObject(agvModel);
                            LogFile.SaveLogToFile($"AGV任务反馈执行通知:( {jsonData} ),", logStr);
                        }
                        #endregion
                    }
                    Db.CommitTran();
                }
@@ -2400,7 +2513,7 @@
        /// </summary>
        /// <param name="taskNo">任务号</param>
        /// <param name="userId">操作人</param>
        /// <exception cref="Exception"></exception>
        /// <exception cref="Exception"></exception>
        public void RelocationSuccess(string taskNo, int userId)
        {
            try
@@ -3621,5 +3734,266 @@
            return nowAddress;
        }
        /// <summary>
        /// 获取拆垛托盘拆垛信息
        /// </summary>
        /// <param name="model">拆垛托盘号和WCS任务号</param>
        /// <returns>拆垛托盘信息</returns>
        public RequestBoxInfoCheck BoxInfoCheckWcs (BoxInfoCheck model)
        {
            try
            {
                // 判断当前任务状态  Status 1:正在执行 3:异常结束
                var taskModel = Db.Queryable<LogTask>().First(m => m.TaskNo == model.TaskNo && m.IsDel == "0" && m.Status == "1");
                if (taskModel == null)
                {
                    throw new Exception("此任务不存在或任务状态已变更!");
                }
                // 验证托盘分配信息
                var palletBindModel = Db.Queryable<BllExportAllot>().First(m => m.PalletNo == model.PalletNo && m.TaskNo == model.TaskNo && m.IsDel == "0" && m.Status == "1");
                if (palletBindModel != null)
                {
                    throw new Exception("未找到当前托盘分配任务信息!");
                }
                //计算当前当前托盘上箱数和拆垛箱数
                var storcklist = Db.Queryable<DataStockDetail>().First(m => m.PalletNo == palletBindModel.PalletNo && m.SkuNo == palletBindModel.SkuNo && m.LotNo == palletBindModel.LotNo);
                string level = "1";
                int qty = 0, qtycount = 0;
                var packlist = Db.Queryable<SysPackag>().First(m => m.PackagNo == palletBindModel.SkuNo && m.IsDel == "0");
                if (packlist.L2Name == "箱")
                {
                    level = "2";
                }
                switch (level)
                {
                    case "1":
                        qty = (int)(palletBindModel.Qty / packlist.L1Num);
                        qtycount = (int)(storcklist.Qty / packlist.L1Num);
                        break;
                    case "2":
                        qty = (int)(palletBindModel.Qty / packlist.L2Num);
                        qtycount = (int)(storcklist.Qty / packlist.L2Num);
                        break;
                }
                var list = new RequestBoxInfoCheck
                {
                    PalletNo = model.PalletNo,
                    TaskNo = model.TaskNo,
                    SkuNo = palletBindModel.SkuNo,
                    SkuName  = palletBindModel.SkuName,
                    LotNo = palletBindModel.LotNo,
                    OrderNo = palletBindModel.SONo,
                    Standard = palletBindModel.Standard,
                    Qty = qty,//拆垛箱数
                    QtyCount = qtycount   //托盘上箱数
                };
                return list;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        /// <summary>
        /// 获取拆垛分拣主扫箱码出库
        /// </summary>
        /// <param name="model">拆垛托盘号和WCS任务号</param>
        /// <returns>拆垛托盘信息</returns>
        public string BoxInfoExportWcs(string boxno)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(boxno))
                {
                    throw new Exception("主扫分拣箱码为空");
                }
                //箱码所在拆垛拣货信息
                var boxModel = Db.Queryable<DataBoxInfo>().First(m=>m.BoxNo == boxno);
                if (boxModel == null)
                {
                    throw new Exception("未查询到该箱码的信息");
                }
                //出库分配信息
                var allot = Db.Queryable<BllExportAllot>().First(m =>
                    m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.PalletNo == boxModel.PalletNo);
                if (allot == null)
                {
                    throw new Exception("未查询到该托盘的分配信息");
                }
                //出库单
                var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == allot.SONo);
                if (notice == null)
                {
                    throw new Exception("未查询到该出库单的信息");
                }
                //出库单明细
                var noticeDetail = Db.Queryable<BllExportNoticeDetail>()
                    .First(m => m.IsDel == "0" && m.Id == allot.SODetailNo);
                if (noticeDetail == null)
                {
                    throw new Exception("未查询到该出库单明细的信息");
                }
                //剩余拣货数量(待拣减去已拣)
                var needQty = allot.Qty - allot.CompleteQty;
                //库存明细
                var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.Id == allot.StockId);
                if (stockDetail == null)
                {
                    throw new Exception("未查询到该托盘分配的库存明细信息!");
                }
                //库存总表
                var stock = Db.Queryable<DataStock>().First(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo && a.LotNo == stockDetail.LotNo);
                if (stock == null)
                {
                    throw new Exception("未查询到该托盘分配的库存信息!");
                }
                List<DataBoxInfo> boxInfos;
                var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxno && m.StockDetailId == stockDetail.Id);
                if (boxInfo.Count() == 0)
                {
                    throw new Exception("未查询到该箱码及追溯码的信息");
                }
                boxInfos = boxInfo.ToList();
                var comDetailList = Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == boxModel.PalletNo).ToList();
                if (boxInfo.Count() == 0)
                {
                    throw new Exception("未查询到该箱码的信息");
                }
                if (boxInfo.Any(m => m.PalletNo != boxModel.PalletNo))
                {
                    throw new Exception("该托盘与箱码没有绑定关系");
                }
                var boxQty = boxInfo.GroupBy(m => m.BoxNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToList();
                if (boxQty[0] > needQty)
                {
                    throw new Exception("拣货数量不能大于箱内剩余待拣数量");
                }
                decimal pickQty = 0;//拣货的数量
                var comList = new List<BllCompleteDetail>();
                foreach (var item in boxInfos)
                {
                    //添加拣货明细
                    var completeDetail = new BllCompleteDetail()
                    {
                        SONo = allot.SONo,
                        SODetailNo = allot.SODetailNo,
                        ExportAllotId = allot.Id,
                        StockId = allot.StockId,
                        BoxNo = item.BoxNo,
                        BoxNo2 = item.BoxNo2,
                        BoxNo3 = item.BoxNo3,
                        LotNo = allot.LotNo,
                        LotText = allot.LotText,
                        SupplierLot = allot.SupplierLot,
                        SkuNo = allot.SkuNo,
                        SkuName = allot.SkuName,
                        Standard = allot.Standard,
                        PalletNo = boxModel.PalletNo,
                        CompleteQty = item.Qty,
                    };
                    comList.Add(completeDetail);
                    pickQty += item.Qty;
                    //删除库存箱码明细
                    Db.Deleteable(item).ExecuteCommand();
                }
                Db.Insertable(comList).ExecuteCommand();
                //修改出库分配信息
                allot.CompleteQty += pickQty;
                allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3";
                allot.UpdateTime = DateTime.Now;
                if (allot.Status == "5")
                {
                    //判断该托盘是否还存在物料 存在改为待回库 待回库完成后改为已完成
                }
                Db.Updateable(allot).ExecuteCommand();
                //删除或修改库存明细
                stockDetail.BitPalletMark = "1";//修改为零托标识
                stockDetail.Qty -= pickQty;
                stockDetail.LockQty -= pickQty;
                if (stockDetail.Qty == stockDetail.LockQty)
                {
                    stockDetail.Status = "2";
                }
                else if (stockDetail.Qty > stockDetail.LockQty && stockDetail.LockQty > 0)
                {
                    stockDetail.Status = "1";
                }
                else
                {
                    stockDetail.Status = "0";
                }
                if (stockDetail.Qty <= 0)
                {
                    Db.Deleteable(stockDetail).ExecuteCommand();
                }
                else
                {
                    Db.Updateable(stockDetail).ExecuteCommand();
                }
                stock.Qty -= pickQty;
                stock.LockQty -= pickQty;
                if (stock.Qty <= 0)
                {
                    Db.Deleteable(stock).ExecuteCommand();
                }
                else
                {
                    Db.Updateable(stock).ExecuteCommand();
                }
                var num2 = Db.Queryable<DataStockDetail>().Count(m => m.IsDel == "0" && m.PalletNo == boxModel.PalletNo);
                if (num2 <= 0)
                {
                    //改变托盘状态
                    var pallet = Db.Queryable<SysPallets>().First(m => m.PalletNo == boxModel.PalletNo && m.IsDel == "0");
                    if (pallet == null)
                    {
                        throw new Exception("未在托盘表中查询到托盘信息");
                    }
                    pallet.Status = "0";
                    Db.Updateable(pallet).ExecuteCommand();
                }
                //修改出库单明细拣货数量
                noticeDetail.CompleteQty += pickQty;
                noticeDetail.Status = "2";
                Db.Updateable(noticeDetail).ExecuteCommand();
                var num = Db.Queryable<BllExportNoticeDetail>()
                    .Count(m => m.IsDel == "0" && m.SONo == allot.SONo && m.CompleteQty < m.Qty);
                if (num <= 0)
                {
                    notice.Status = "4"; //更改为执行完成
                    noticeDetail.Status = "3";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                }
                //修改出库单信息
                Db.Updateable(notice).ExecuteCommand();
                return "";
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
    }
}
Wms/WMS.BLL/DataServer/StockServer.cs
@@ -11,8 +11,10 @@
using Model.ModelVm.DataVm;
using SqlSugar;
using WMS.DAL;
using WMS.Entity.BllSoEntity;
using WMS.Entity.Context;
using WMS.Entity.DataEntity;
using WMS.Entity.LogEntity;
using WMS.Entity.SysEntity;
using WMS.IBLL.IDataServer;
@@ -1021,5 +1023,143 @@
            return stockDetailsList;
        }
        #endregion
        #region AGV小车任务完成
        /// <summary>
        /// AGV入库完成
        /// </summary>
        /// <param name="TaskCode">任务号</param>
        /// <returns></returns>
        public void ArriveFinish(string TaskCode)
        {
            try
            {
                var palletNo = Db.Queryable<LogTask>().First(m => m.TaskNo == TaskCode && m.OrderType == "0");//获取任务信息
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == palletNo.StartLocat); //获取库位信息
                var stockDetail = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo.PalletNo);
                //开启事务
                Db.BeginTran();
                //修改起始库位状态
                storageLocat.Status = "0";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                Db.Updateable(storageLocat).ExecuteCommand();
                //修改任务状态
                palletNo.Status = "2";   //已完成
                Db.Updateable(palletNo).ExecuteCommand();
                //修改库存明细
                stockDetail.Status = "0";//待分配
                stockDetail.LocatNo = "";
                stockDetail.AreaNo = "";
                stockDetail.RoadwayNo = "";
                stockDetail.WareHouseNo = "";
                Db.Updateable(stockDetail).ExecuteCommand();
                //下发WCS申请入库
                Db.CommitTran();
            }
            catch (Exception ex)
            {
                throw new Exception("AGV返回入库完成信号处理错误,错误信息:" + ex);
            }
        }
        /// <summary>
        /// AGV出库完成
        /// </summary>
        /// <param name="TaskCode">任务号</param>
        /// <returns></returns>
        public void SoFinish(string TaskCode)
        {
            try
            {
                var palletNo = Db.Queryable<LogTask>().First(m => m.TaskNo == TaskCode && m.OrderType == "1");//获取任务信息
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == palletNo.EndLocat); //获取库位信息
                var storageStart = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == palletNo.StartLocat); //获取库位信息
                var stockDetail = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo.PalletNo); //获取库存信息
                //开启事务
                Db.BeginTran();
                //修改目的库位状态
                storageLocat.Status = "1";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                Db.Updateable(storageLocat).ExecuteCommand();
                //修改任务状态
                palletNo.Status = "2";   //已完成
                Db.Updateable(palletNo).ExecuteCommand();
                //修改库存明细
                stockDetail.Status = "2";// 0:待分配   1:部分分配 2:已分配 3:盘点锁定: 4移库锁定
                stockDetail.LocatNo = storageLocat.LocatNo;
                stockDetail.AreaNo = storageLocat.AreaNo;
                stockDetail.RoadwayNo = storageLocat.RoadwayNo;
                stockDetail.WareHouseNo = storageLocat.WareHouseNo;
                Db.Updateable(stockDetail).ExecuteCommand();
                Db.CommitTran();
            }
            catch (Exception ex )
            {
                throw new Exception("AGV返回出库完成信号处理错误,错误信息:" + ex);
            }
        }
        /// <summary>
        /// AGV移库完成
        /// </summary>
        /// <param name="TaskCode">任务号</param>
        /// <returns></returns>
        public void MoveFinish(string TaskCode)
        {
            try
            {
                var palletNo = Db.Queryable<LogTask>().First(m => m.TaskNo == TaskCode && m.OrderType == "3");//获取任务信息
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == palletNo.EndLocat); //获取库位信息
                var storageStart = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == palletNo.StartLocat); //获取库位信息
                var stockDetail = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo.PalletNo); //获取库存信息
                //var soAllot = Db.Queryable<BllExportAllot>().First(m => m.IsDel == "0" && m.PalletNo == palletNo.PalletNo);//获取分配信息
                //开启事务
                Db.BeginTran();
                //修改起始库位状态
                storageLocat.Status = "0";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                Db.Updateable(storageLocat).ExecuteCommand();
                //修改目的库位状态
                storageLocat.Status = "1";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                Db.Updateable(storageLocat).ExecuteCommand();
                //修改任务状态
                palletNo.Status = "2";   //已完成
                Db.Updateable(palletNo).ExecuteCommand();
                //修改库存明细
                stockDetail.Status = "2";// 0:待分配   1:部分分配 2:已分配 3:盘点锁定: 4移库锁定
                stockDetail.LocatNo = storageLocat.LocatNo;
                stockDetail.AreaNo = storageLocat.AreaNo;
                stockDetail.RoadwayNo = storageLocat.RoadwayNo;
                stockDetail.WareHouseNo = storageLocat.WareHouseNo;
                Db.Updateable(stockDetail).ExecuteCommand();
                Db.CommitTran();
            }
            catch (Exception ex)
            {
                throw new Exception("AGV返回移库完成信号处理错误,错误信息:"+ex);
            }
        }
        #endregion
    }
}
Wms/WMS.IBLL/IBllAsnServer/IArrivalNoticeServer.cs
@@ -93,7 +93,7 @@
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        HttpReturnModel HttpCreateAsn(AsnInfo model);
        HttpReturnModel HttpCreateAsn(AsnInfo model,string url);
        /// <summary>
        /// 订单回传上游系统
        /// </summary>
Wms/WMS.IBLL/IBllSoServer/IExportNoticeServer.cs
@@ -133,7 +133,7 @@
        /// <param name="taskNo">任务号</param> 
        /// <param name="userId">操作人</param> 
        /// <returns></returns>
        void ExportSuccess(string taskNo,int userId);
        void ExportSuccess(string taskNo,int userId,string url);
        /// <summary>
        /// wcs返回的成功信号或手动完成(移库成功)
@@ -215,5 +215,13 @@
        /// <param name="soNo"></param>
        /// <returns></returns>
        string IsNeedUnpack(string soNo);
        /// <summary>
        /// 获取拆垛托盘拆垛信息
        /// </summary>
        /// <param name="model">拆垛托盘号和WCS任务号</param>
        /// <returns>拆垛托盘信息</returns>
        public RequestBoxInfoCheck BoxInfoCheckWcs(BoxInfoCheck model);
    }
}
Wms/WMS.IBLL/IDataServer/IStockServer.cs
@@ -119,5 +119,29 @@
        /// <returns></returns>
        List<StockDetailDto> GetInventoryList1DaoChu(string skuNo, string skuName, string lotNo, string locatNo, string palletNo, string status, string inspectStatus);
        #endregion
        #region AGV小车任务完成
        /// <summary>
        /// 入库任务完成
        /// </summary>
        /// <param name="skuNo">物料编码</param>
        /// <param name="skuName">物料名称</param>
        /// <returns></returns>
        public void ArriveFinish(string TaskCode);
        /// <summary>
        /// 出库任务完成
        /// </summary>
        /// <param name="skuNo">物料编码</param>
        /// <param name="skuName">物料名称</param>
        /// <returns></returns>
        public void SoFinish(string TaskCode);
        /// <summary>
        /// 移库任务完成
        /// </summary>
        /// <param name="skuNo">物料编码</param>
        /// <param name="skuName">物料名称</param>
        /// <returns></returns>
        public void MoveFinish(string TaskCode);
        #endregion
    }
}
Wms/WMS.IBLL/IPdaServer/IPdaCrServer.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Text;
using Model.InterFaceModel;
using Model.ModelDto.BllCheckDto;
using Model.ModelDto.PdaDto;
using WMS.Entity.DataEntity;
@@ -137,7 +138,19 @@
        /// <param name="palletNo"></param>
        /// <param name="areaNo"></param>
        /// <param name="userId"></param>
        List<string> AgvTransport2(string soNo, string palletNo, string areaNo, int userId, string url);
        List<string> AgvTransport2(string soNo, string palletNo, string areaNo,string ruku, int userId, string url);
        /// <summary>
        ///  agv任务下发
        /// </summary>
        /// <param name="model"></param>
        public OutCommanAgvDto AGVTask(string type, string taskno, string positionStart, string positionEnd, string url);
        /// <summary>
        ///  agv任务取消
        /// </summary>
        /// <param name="model"></param>
        public void cancelTask(string taskno, string url);
        #endregion
        #region 人工转运
Wms/Wms/Controllers/BllSoController.cs
@@ -700,7 +700,7 @@
                var type = _taskSvc.GetTaskType(taskNo);
                if (type == "1")//出库完成
                {
                    _exNoticeSvc.ExportSuccess(taskNo, int.Parse(userId));
                    _exNoticeSvc.ExportSuccess(taskNo, int.Parse(userId), "");
                }
                else if (type == "2")//出库时产生的移库任务完成
                {
Wms/Wms/Controllers/DownApiController.cs
@@ -17,6 +17,7 @@
using Model.ModelVm.PdaVm;
using WMS.IBLL.IPdaServer;
using Model.ModelVm;
using WMS.IBLL.IDataServer;
namespace Wms.Controllers
{
@@ -34,8 +35,9 @@
        private readonly ITaskServer _taskSvc;//任务Svc 
        private readonly IPdaSoServer _pdaSoSvc;//空托出库Svc
        private readonly IPdaAsnServer _paAsnSvc;//空托跺绑定
        private readonly IStockServer _stockSvc;//AGV任务完成箅
        public DownApiController(IOptions<ApiUrlConfig> setting, IExportNoticeServer exNoticeSvc, IPalletBindServer asnPalletBindSvc, IStockCheckServer crCheckSvc, ITaskServer taskSvc, IPdaSoServer pdaSoSvc,IPdaAsnServer paAsnSvc)
        public DownApiController(IOptions<ApiUrlConfig> setting, IExportNoticeServer exNoticeSvc, IPalletBindServer asnPalletBindSvc, IStockCheckServer crCheckSvc, ITaskServer taskSvc, IPdaSoServer pdaSoSvc,IPdaAsnServer paAsnSvc,IStockServer stockSvc)
        {
            _config = setting.Value;
            _exNoticeSvc = exNoticeSvc;
@@ -44,6 +46,7 @@
            _taskSvc = taskSvc;
            _pdaSoSvc = pdaSoSvc;
            _paAsnSvc = paAsnSvc;
            _stockSvc = stockSvc;
        }
        #region WMS接口 调用下游系统接口 
@@ -374,7 +377,7 @@
                    case "1"://出库完成任务
                        if (model.TaskType == "1")//0:入库 1:出库 2:移库
                        {
                            _exNoticeSvc.ExportSuccess(model.TaskNo, 0);
                            _exNoticeSvc.ExportSuccess(model.TaskNo, 0, _config.AgvHost + _config.GenAgvSchedulingTask);
                            return Ok(new WcsModel { StatusCode = 0, Msg = "出库完成" });
                        }
                        else if (model.TaskType == "2")
@@ -696,6 +699,31 @@
        //车间叫料
        //WCS申请拆垛信息
        /// <summary>
        /// 成品箱码拆垛拣货
        /// </summary>
        /// <param name="model">入库单信息</param>
        /// <returns></returns>
        [AllowAnonymous]
        [HttpPost]
        public IActionResult ResultBoxInfoCheckWcs(BoxInfoCheck model)
        {
            var logStr = $@".\log\WCS\WCS申请拆垛托盘信息" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            try
            {
                RequestBoxInfoCheck list = _exNoticeSvc.BoxInfoCheckWcs(model);
                return Ok(new { Success = 1,Message = "拆垛信息获取成功",data = list});
            }
            catch  (Exception e)
            {
                LogFile.SaveLogToFile($"WCS申请托盘拆垛异常返回:( {e.Message} ),", logStr);
                return Ok(new ErpModel { Success = -1, Message = e.Message});
            }
        }
        #region AGV
@@ -704,10 +732,10 @@
        ///  AGV 执行回调的方法,包含任务开始,走出储位,任务完成及任务取消。
        ///  取消通知为任务单,其他通知为单个任务组或子任务。注意:是否通知需要在任务模板配置
        /// </summary>
        /// <param name="model">入库单信息</param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        [HttpPost]
        public IActionResult AgvCallback(AgvContinueTask model)
        public IActionResult AgvCallback(AgvTaskDto model)
        {
            try
            {
@@ -718,21 +746,32 @@
                //接收时间
                var time1 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                //测试接口用
                var orderType = _taskSvc.GetTaskOrderType(model.TaskCode);// 判断单据类型入出移
                var taskType = _taskSvc.GetTaskType(model.TaskCode);//根据任务号获取任务类型
                switch (orderType)
                {
                    case "0"://入库任务执行
                        _stockSvc.ArriveFinish(model.TaskCode);
                        break;
                    case "1"://出库任务执行
                        _stockSvc.SoFinish(model.TaskCode);
                        break;
                    case "2"://盘库任务执行
                    case "3"://移库任务执行
                        return Ok(new OutCommanAgvDto { Code = "0", Message = "成功", ReqCode = model.ReqCode });
                        _stockSvc.MoveFinish(model.TaskCode);
                        break;
                    // return Ok(new OutCommanAgvDto { Code = "0", Message = "成功", ReqCode = model.ReqCode });
                    default:
                        return Ok(new OutCommanAgvDto { Code = "1", Message = "失败", ReqCode = model.ReqCode });
                }
                return Ok(new OutCommanAgvDto { Code = "0", Message = "成功", ReqCode = model.ReqCode });
            }
            catch (Exception ex)
@@ -745,7 +784,7 @@
            }
        }
        #endregion
Wms/Wms/Controllers/PdaCrController.cs
@@ -363,7 +363,7 @@
                }
                var uId = int.Parse(userId);
                _pdaCrSvc.AgvTransport(model.PalletNo, model.AreaNo, model.Ruku, uId, _config.WcsHost + _config.GenAgvSchedulingTask);
                _pdaCrSvc.AgvTransport(model.PalletNo, model.AreaNo, model.Ruku, uId, _config.AgvHost + _config.GenAgvSchedulingTask);
                return Ok(new { data = "", code = 0, msg = "成功" });
            }
@@ -395,7 +395,7 @@
                }
                var uId = int.Parse(userId);
                var str = _pdaCrSvc.AgvTransport2(model.SoNo,model.PalletNo, model.AreaNo, uId, _config.WcsHost + _config.GenAgvSchedulingTask);
                var str = _pdaCrSvc.AgvTransport2(model.SoNo,model.PalletNo, model.AreaNo,model.Ruku, uId, _config.WcsHost + _config.GenAgvSchedulingTask);
                var msgStr = "";
                if (str.Contains("0"))
                {
Wms/Wms/Controllers/UpApiController.cs
@@ -13,6 +13,7 @@
using WMS.IBLL.IBllCheckServer;
using Model.ModelVm.BllCheckVm;
using Microsoft.Extensions.Logging;
using WMS.IBLL.IPdaServer;
namespace Wms.Controllers
{
@@ -28,12 +29,14 @@
        private readonly IExportNoticeServer _exNoticeSvc;//出库单Svc 
        private readonly IArrivalNoticeServer _arrivalNoticeSvc;
        private readonly IStockCheckServer _stockCheckSvc;//盘点单Svc 
        public UpApiController(IOptions<ApiUrlConfig> setting,IExportNoticeServer exNoticeSvc,IArrivalNoticeServer arrivalNoticeServer,IStockCheckServer stockCheckSvc)
        private readonly IPdaCrServer _daCrSvc;//PDA
        public UpApiController(IOptions<ApiUrlConfig> setting,IExportNoticeServer exNoticeSvc,IArrivalNoticeServer arrivalNoticeServer,IStockCheckServer stockCheckSvc,IPdaCrServer daCrSvc)
        {
            _config = setting.Value;
            _exNoticeSvc = exNoticeSvc;
            _arrivalNoticeSvc = arrivalNoticeServer;
            _stockCheckSvc = stockCheckSvc;
            _daCrSvc = daCrSvc;
        }
        #endregion
@@ -134,7 +137,7 @@
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        [HttpPost]
        public IActionResult FinishExportNotice(FinshVm model)
        {
            try
@@ -209,8 +212,56 @@
            }
        }
        //箱码信息 手持组托用 (扫箱码向追溯要信息)
        //箱码信息 手持组托用 (扫箱码向追溯要信息)
        //
        /// <summary>
        /// 下发AGV调度任务
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult AGVTask(string type, string taskno, string positionStart, string positionEnd)
        {
            try
            {
                OutCommanAgvDto agvRequest =  _daCrSvc.AGVTask(type,taskno,positionStart,positionEnd, _config.AgvHost + _config.GenAgvSchedulingTask);
                if (agvRequest.Code != "0")
                {
                    return Ok(new { code = 1, msg = "小车任务执行失败" });
                }
                return Ok(new { code = 1, msg = "AGV任务下发成功" });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }
        /// <summary>
        /// 下发AGV取消任务
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult cancelTask(string taskno)
        {
            try
            {
                _daCrSvc.cancelTask(taskno, _config.AgvHost + _config.CancelTask);
                return Ok(new { code = 1, msg = "AGV任务取消成功" });
            }
            catch (Exception e)
            {
                return Ok(new { code = 1, msg = e.Message });
            }
        }
        #endregion
@@ -244,7 +295,7 @@
                    LogFile.SaveLogToFile($"入库单下发:( {jsonData} ),", logStr);
                }
                result = _arrivalNoticeSvc.HttpCreateAsn(model);
                result = _arrivalNoticeSvc.HttpCreateAsn(model, _config.WcsHost + _config.AddOrderTaskUrl);
                if (logStr != "")
                {
                    var jsonData = JsonConvert.SerializeObject(result);
Wms/Wms/Properties/launchSettings.json
@@ -1,20 +1,13 @@
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:50515/",
      "sslPort": 44363
    }
  },
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
      },
      "sqlDebugging": false,
      "nativeDebugging": true
    },
    "Wms": {
      "commandName": "Project",
@@ -24,5 +17,14 @@
      },
      "applicationUrl": "https://localhost:5001;http://localhost:5000"
    }
  },
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://192.168.137.94:8081/",
      "sslPort": 44363
    }
  }
}
Wms/Wms/Tools/ApiUrlConfig.cs
@@ -109,6 +109,11 @@
        public string GenAgvSchedulingTask { get; set; }
        /// <summary>
        /// 取消任务接口
        /// </summary>
        public string CancelTask { get; set; }
        /// <summary>
        /// 继续执行任务接口
        /// </summary>
        public string ContinueTask { get; set; }
Wms/Wms/appsettings.json
@@ -27,7 +27,7 @@
    "MesHost": "http://10.18.99.67:3000", //mesIP
    "WcsHost": "http://10.60.16.10:5005", // "http://localhost:57061", //wcsIPhttp://localhost:57061/
    "BoxHost": "http://10.110.24.30:8081", //boxIP
    "AgvHost": "http://10.110.24.30:8081", //agvIP
    "AgvHost": "http://10.18.99.66:8181", //agvIP
    // WCS
    "IssueComApiUrl": "/api/demo/wcsTasks", //下发命令(出库、移库)
@@ -49,9 +49,10 @@
    "FuMaGetTokenUrl": "/port/mes/service/system/sign_login", //获取令牌
    // AGV
    "GenAgvSchedulingTask": "http://IP:PORT/rcms/services/rest/hikRpcService/genAgvSchedulingTask", //生成任务单接口
    "ContinueTask": "http://IP:PORT/rcms/services/rest/hikRpcService/continueTask", //继续执行任务接口
    "GenPreScheduleTask": "http://IP:PORT/rcms/services/rest/hikRpcService/genPreScheduleTask" // 预调度对外接口
    "GenAgvSchedulingTask": "/rcms/services/rest/hikRpcService/genAgvSchedulingTask", //生成任务单接口
    "CancelTask": "/rcms/services/rest/hikRpcService/cancelTask",//取消任务接口
    "ContinueTask": "/rcms/services/rest/hikRpcService/continueTask", //继续执行任务接口
    "GenPreScheduleTask": "/rcms/services/rest/hikRpcService/genPreScheduleTask" // 预调度对外接口
  },
  "MesConfig": {
    "MesUser": "wms",