IPC-610
2024-09-26 f512b0475560ed449f936e0b7a27ba197e6bafe5
Merge branch 'master' of https://gitee.com/liudongl/jc24-wms
8个文件已修改
936 ■■■■ 已修改文件
Wms/Model/InterFaceModel/HttpModel.cs 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllAsnServer/PalletBindServer.cs 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs 787 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IBllAsnServer/IArrivalNoticeServer.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/BllAsnController.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Tools/ApiUrlConfig.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/appsettings.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/InterFaceModel/HttpModel.cs
@@ -315,6 +315,50 @@
        public int? QtyCount { get; set; }
    }
    //入库任务单据信息
    public class ResponseOrderTaskModel
    {
        /// <summary>
        /// WMS下发单号
        /// </summary>
        public string? OrderNo { get; set; }
        /// <summary>
        /// 任务号
        /// </summary>
        public string? TaskNo { get; set; }
        /// <summary>
        /// 批次号
        /// </summary>
        public string? LotNo { get; set; }
        /// <summary>
        /// 物料编码
        /// </summary>
        public string? SkuNo { get; set; }
        /// <summary>
        /// 物料名称
        /// </summary>
        public string? SkuName { get; set; }
        /// <summary>
        /// 规格
        /// </summary>
        public string? BoxType { get; set; }
        /// <summary>
        /// 总箱数/计划箱数/预估箱数
        /// </summary>
        public int? Qty { get; set; }
        /// <summary>
        /// 任务类型
        /// </summary>
        public int? TaskType { get; set; }
    }
    #endregion
    #region AGV-Model
Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs
@@ -18,6 +18,8 @@
using WMS.Entity.SysEntity;
using WMS.IBLL.IBllAsnServer;
using WMS.BLL.SysServer;
using System.Threading.Tasks;
using System.Security.Policy;
namespace WMS.BLL.BllAsnServer
{
@@ -254,7 +256,7 @@
        }
        //添加入库单据
        public string AddArrivalNotice(ArrivalNoticeVm model)
        public string AddArrivalNotice(ArrivalNoticeVm model, string url)
        {
            string strMessage = "";
            string sqlString = string.Empty;
@@ -262,6 +264,7 @@
            //0:成品入库 1:采购入库 2:中间品入库 3:退货入库 4:车间余料入库 5:其它入库 6:代储入库 7:寄存入库
            var TypeLot = "1, 2, 5, 6, 7"; //批次可为空单据类型
            var addOder = new List<ResponseOrderTaskModel>();
            try
            {
                if (model.Origin == "录入")
@@ -341,6 +344,20 @@
                    sqlDetailStr += $"'{model.ASNNo}','{detailModel.SkuNo}','{detailModel.SkuName}','{detailModel.Standard}', ";
                    sqlDetailStr += $"'{detailModel.LotNo}','{detailModel.LotText}','{detailModel.Qty}','{detailModel.PackagNo}','{detailModel.Price}', ";
                    sqlDetailStr += $"{detailModel.Money},'{detailModel.IsBale}','{detailModel.IsBelt}','{detailModel.SupplierLot}','0','{detailModel.UDF1}','{detailModel.UDF2}','{detailModel.UDF3}','{detailModel.UDF4}','{detailModel.UDF5}','{model.CreateUser}');";
                    if (model.Type == "1")
                    {
                        addOder.Add(new ResponseOrderTaskModel()
                        {
                            OrderNo = model.ASNNo,
                            LotNo = detailModel.LotNo,
                            SkuNo = detailModel.SkuNo,
                            SkuName = detailModel.SkuName,
                            BoxType = detailModel.Standard,
                            Qty = (int)detailModel.Qty,
                            TaskType = 0
                        });
                    }
                }
                if (sqlDetailStr == string.Empty)
@@ -359,6 +376,35 @@
                if (rowCount > 0 && rowDetailCount > 0)
                {
                    new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", model.ASNNo, "添加", $"添加了单据号为{model.ASNNo}的单据信息", Convert.ToInt32(model.CreateUser));
                    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)
                            {
                            }
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                    return strMessage;
                }
                else
Wms/WMS.BLL/BllAsnServer/PalletBindServer.cs
@@ -77,12 +77,13 @@
                    {
                        throw new Exception("单据号不可为空!");
                    }
                    if (model.AsnDetailNo == 0)
                    {
                        throw new Exception("单据明细不可为空!");
                    }
                    //if (model.AsnDetailNo == 0)
                    //{
                    //    throw new Exception("单据明细不可为空!");
                    //}
                    //根据单据号获取入库单总单
                    notice = Db.Queryable<BllArrivalNotice>().First(a => a.IsDel == "0" && a.ASNNo == model.AsnNo && a.OrderCode == model.OrderCode);
                    notice = Db.Queryable<BllArrivalNotice>().First(a => a.IsDel == "0" && a.ASNNo == model.AsnNo);
                    //notice = Db.Queryable<BllArrivalNotice>().First(a => a.IsDel == "0" && a.ASNNo == model.AsnNo && a.OrderCode == model.OrderCode);
                    if (notice.Status != "0" && notice.Status != "1" && notice.Status != "2")
                    {
                        throw new Exception("该单据已关单!");
@@ -96,7 +97,8 @@
                        throw new Exception("批次不能为空!");
                    }
                    // 验证入库单明细是否存在
                    detail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.Id == model.AsnDetailNo && m.ASNNo == model.AsnNo && m.LotNo == model.LotNo && m.SkuNo == model.SkuNo);
                    detail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo && m.LotNo == model.LotNo && m.SkuNo == model.SkuNo);
                    //detail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.Id == model.AsnDetailNo && m.ASNNo == model.AsnNo && m.LotNo == model.LotNo && m.SkuNo == model.SkuNo);
                    if (detail == null)
                    {
                        throw new Exception("当前物料及批次与单据无关联,请核实!");
@@ -176,14 +178,14 @@
                #endregion
                //判断托盘绑定信息中是否有
                var bind = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0" && m.ASNDetailNo == model.AsnDetailNo && m.PalletNo == model.PalletNo && m.Status != "2");
                var bind = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0" && m.ASNDetailNo == detail.Id && m.PalletNo == model.PalletNo && m.Status != "2");
                var bindId = 0;
                if (bind == null)
                {
                    bind = new BllPalletBind
                    {
                        ASNNo = model.AsnNo,
                        ASNDetailNo = model.AsnDetailNo,
                        ASNNo = notice.ASNNo,
                        ASNDetailNo = detail.Id,
                        PalletNo = model.PalletNo,
                        PalletNo2 = "",
                        PalletNo3 = "",
@@ -230,8 +232,8 @@
                    {
                        var boxInfo = new BllBoxInfo()
                        {
                            ASNNo = model.AsnNo,
                            ASNDetailNo = model.AsnDetailNo,
                            ASNNo = notice.ASNNo,
                            ASNDetailNo = detail.Id,
                            OrderCode = box.OrderCode,
                            BindNo = bindId,
                            BoxNo = box.BoxNo,
@@ -270,10 +272,10 @@
                }
                else if (model.Type == "0")//物料托
                {
                    if (model.Detail.Count(m => m.OrderCode != detail.OrderDetailCode) > 0)
                    {
                        throw new Exception($"托盘绑定明细中,含有箱码生产工单不一致");
                    }
                    //if (model.Detail.Count(m => m.OrderCode != detail.OrderDetailCode) > 0)
                    //{
                    //    throw new Exception($"托盘绑定明细中,含有箱码生产工单不一致");
                    //}
                    if (model.Detail.Count(m => m.SkuNo != model.SkuNo || m.LotNo != model.LotNo) > 0)
                    {
                        throw new Exception($"托盘绑定明细中,含有箱码物料或批次不一致");
@@ -288,8 +290,8 @@
                            boxFullQty += box.Qty;
                            var boxInfo = new BllBoxInfo()
                            {
                                ASNNo = model.AsnNo,
                                ASNDetailNo = model.AsnDetailNo,
                                ASNNo = detail.ASNNo,
                                ASNDetailNo = detail.Id,
                                OrderCode = box.OrderCode,
                                BindNo = bindId,
                                BoxNo = box.BoxNo,
@@ -376,9 +378,9 @@
                // 更改托盘使用状态
                var sqlStr = $"update SysPallets set Status = '1' where PalletNo = '{model.PalletNo}';";
                //添加托盘记录表数据
                sqlStr += $"insert into LogPalletTrack values('{model.PalletNo}','{model.AsnNo}','组盘','0',getDate(),{userId},NULL,NULL);";
                sqlStr += $"insert into LogPalletTrack values('{model.PalletNo}','{notice.ASNNo}','组盘','0',getDate(),{userId},NULL,NULL);";
                Db.Ado.ExecuteCommand(sqlStr);
                new OperationASNServer().AddLogOperationAsn("PDA模块", "托盘绑定", model.AsnNo, "添加", $"添加了托盘码为:{model.PalletNo}的组盘信息", userId);
                new OperationASNServer().AddLogOperationAsn("PDA模块", "托盘绑定", notice.ASNNo, "添加", $"添加了托盘码为:{model.PalletNo}的组盘信息", userId);
                Db.CommitTran();
            }
Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs
@@ -18,6 +18,8 @@
using WMS.BLL.LogServer;
using WMS.DAL;
using WMS.Entity.LogEntity;
using Model.ModelDto.SysDto;
using Model.ModelDto.BllSoDto;
namespace WMS.BLL.BllPdaServer
{
@@ -973,7 +975,9 @@
            try
            {
                string strMsg = "";
                var outDtoList = new List<OutCommandDto>(); //出库数据的集合
                var outDto1 = new List<OutCommandDto>(); //先出库数据的集合(深度为1的储位)
                var outDto2 = new List<OutCommandDto>(); //后出库数据的集合(深度为2的储位)
                var moveDto = new List<OutCommandDto>(); //要移库数据的集合
                //获取当前时间
                DateTime serverTime = Db.GetDate();
                //获取库存明细是否小于等于该垛数
@@ -997,132 +1001,637 @@
                    return strMsg;
                }
                int i = 0;
                var com = new Common();
                Db.BeginTran();
                //遍历库存信息 
                foreach (var s in stockDetail)
                {
                    //if (outDto1.Contains(m=>m.PalletNo == s.PalletNo) >0)
                    //{
                    //    continue;
                    //}
                    //获取储位信息
                    var locat = Db.Queryable<SysStorageLocat>().First(l => l.LocatNo == s.LocatNo && l.IsDel == "0" && l.WareHouseNo == "W01");
                    if (locat != null)
                    if(locat == null)
                    {
                        if (locat.Status != "1")
                        {
                            continue;
                        }
                        //更改储位状态为出库中
                        locat.Status = "3"; //3 出库中
                        locat.UpdateTime = serverTime; //修改时间
                        locat.UpdateUser = userId; //修改人
                        //修改储位信息
                        Db.Updateable(locat).ExecuteCommand();
                        continue;
                    }
                    //增加库存锁定数量
                    //stock.AllotQty +=
                    stock.LockQty += (int)s.Qty; //锁定数量
                    stock.UpdateTime = serverTime; //修改时间
                    stock.UpdateUser = userId; //修改人
                    //修改库存总表信息
                    Db.Updateable(stock).ExecuteCommand();
                    //增加库存明细锁定数量
                    //s.AllotQty +=
                    s.LockQty += (int)s.Qty; //锁定数量
                    s.UpdateTime = serverTime; //修改时间
                    s.UpdateUser = userId; //修改人
                    s.Status = "2"; //2 已分配
                    //修改库存明细信息
                    Db.Updateable(s).ExecuteCommand();
                    #region 分配
                    //添加分配表信息
                    var allot = new BllExportAllot
                    ////更改储位状态为出库中
                    //locat.Status = "3"; //3 出库中
                    //locat.UpdateTime = serverTime; //修改时间
                    //locat.UpdateUser = userId; //修改人
                    ////修改储位信息
                    //Db.Updateable(locat).ExecuteCommand();
                    if (locat.Status == "1")
                    {
                        SONo = "",
                        WaveNo = "",
                        SODetailNo = 0,
                        StockId = s.Id,
                        LotNo = "",
                        LotText = "",
                        SupplierLot = "",
                        SkuNo = s.SkuNo,
                        SkuName = s.SkuName,
                        Standard = s.Standard,
                        PalletNo = s.PalletNo,
                        IsBale = "0", //是否裹包
                        IsBelt = "0", //是否打带
                        if (locat.Depth == "01") //深度为1
                        {
                            #region 改变库存
                        //BoxexQty = s.Qty,
                        Qty = (int)s.Qty,
                        CompleteQty = 0,
                        Status = "1",
                        LogisticsId = 0,
                        IsAdvance = "0",
                        OutMode = model.OutMode,//出库口
                            //增加库存锁定数量
                            stock.LockQty += (int)s.Qty; //锁定数量
                            stock.UpdateTime = serverTime; //修改时间
                            stock.UpdateUser = userId; //修改人
                            Db.Updateable(stock).ExecuteCommand();//修改库存总表信息
                        CreateUser = userId,
                        CreateTime = DateTime.Now
                    };
                    Db.Insertable(allot).ExecuteCommand();
                            //增加库存明细锁定数量
                            s.LockQty += (int)s.Qty; //锁定数量
                            s.UpdateTime = serverTime; //修改时间
                            s.UpdateUser = userId; //修改人
                            s.Status = "2"; //2 已分配
                            Db.Updateable(s).ExecuteCommand();//修改库存明细信息
                    #endregion
                            #endregion
                    #region 添加出库任务信息
                            #region 分配
                    var taskNo = new Common().GetMaxNo("TK");
                    var exTask = new LogTask    //出库任务
                            //添加分配表信息
                            var allot = new BllExportAllot
                            {
                                SONo = "",
                                WaveNo = "",
                                SODetailNo = 0,
                                StockId = s.Id,
                                LotNo = "",
                                LotText = "",
                                SupplierLot = "",
                                SkuNo = s.SkuNo,
                                SkuName = s.SkuName,
                                Standard = s.Standard,
                                PalletNo = s.PalletNo,
                                IsBale = "0", //是否裹包
                                IsBelt = "0", //是否打带
                                //BoxexQty = s.Qty,
                                Qty = (int)s.Qty,
                                CompleteQty = 0,
                                Status = "1",
                                LogisticsId = 0,
                                IsAdvance = "0",
                                OutMode = model.OutMode,//出库口
                                CreateUser = userId,
                                CreateTime = DateTime.Now
                            };
                            Db.Insertable(allot).ExecuteCommand();
                            #endregion
                            #region 添加出库任务信息
                            var taskNo = new Common().GetMaxNo("TK");
                            var exTask = new LogTask    //出库任务
                            {
                                TaskNo = taskNo,
                                Sender = "WMS",
                                Receiver = "PDA",
                                IsSuccess = 1, //是否下发成功 0失败 1成功
                                StartLocat = locat == null ? "" : s.LocatNo,//起始位置
                                EndLocat = model.OutMode,//目标位置
                                PalletNo = s.PalletNo,//托盘码
                                IsSend = 1,//是否可再次下发
                                IsCancel = 1,//是否可取消
                                IsFinish = 1,//是否可完成
                                Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                CreateTime = serverTime, //创建时间
                                CreateUser = userId, //创建人
                                Msg = "Pda空托从" + locat == null ? "" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                                                                                                                 //FinishDate = serverTime, //完成时间
                            };
                            outDto1.Add(new OutCommandDto()
                            {
                                PalletNo = exTask.PalletNo,//托盘号
                                StartLocate = exTask.StartLocat, // 起始位置
                                StartRoadway = locat.RoadwayNo, //所属巷道
                                EndLocate = model.OutMode, // 目标位置
                                TaskNo = exTask.TaskNo, // 任务号
                                TaskType = "1",// 任务类型 (出库)
                                OutMode = model.OutMode,  //目标地址
                                Order = 1
                            });
                            Db.Insertable(exTask).ExecuteCommand();
                            #endregion
                            #region 储位状态变更
                            //更改储位状态为出库中
                            locat.Status = "3"; //3 出库中
                            Db.Updateable(locat).ExecuteCommand();//修改储位信息
                            #endregion
                        }
                        else if (locat.Depth == "02") //深度为2
                        {
                            //获取出库深度为2储位前面的储位信息
                            var sql2 = $@"select * from SysStorageLocat where  WareHouseNo = '{locat.WareHouseNo}' and row = {locat.Row} and [Column] = {locat.Column} and Layer = {locat.Layer} and Depth = '01'; ";
                            var slotBefore = Db.Ado.SqlQuery<SysStorageLocat>(sql2).First();
                            if (slotBefore == null)
                            {
                                #region 改变库存
                                //增加库存锁定数量
                                stock.LockQty += (int)s.Qty; //锁定数量
                                stock.UpdateTime = serverTime; //修改时间
                                stock.UpdateUser = userId; //修改人
                                Db.Updateable(stock).ExecuteCommand();//修改库存总表信息
                                //增加库存明细锁定数量
                                s.LockQty += (int)s.Qty; //锁定数量
                                s.UpdateTime = serverTime; //修改时间
                                s.UpdateUser = userId; //修改人
                                s.Status = "2"; //2 已分配
                                Db.Updateable(s).ExecuteCommand();//修改库存明细信息
                                #endregion
                                #region 分配
                                //添加分配表信息
                                var allot = new BllExportAllot
                                {
                                    SONo = "",
                                    WaveNo = "",
                                    SODetailNo = 0,
                                    StockId = s.Id,
                                    LotNo = "",
                                    LotText = "",
                                    SupplierLot = "",
                                    SkuNo = s.SkuNo,
                                    SkuName = s.SkuName,
                                    Standard = s.Standard,
                                    PalletNo = s.PalletNo,
                                    IsBale = "0", //是否裹包
                                    IsBelt = "0", //是否打带
                                    //BoxexQty = s.Qty,
                                    Qty = (int)s.Qty,
                                    CompleteQty = 0,
                                    Status = "1",
                                    LogisticsId = 0,
                                    IsAdvance = "0",
                                    OutMode = model.OutMode,//出库口
                                    CreateUser = userId,
                                    CreateTime = DateTime.Now
                                };
                                Db.Insertable(allot).ExecuteCommand();
                                #endregion
                                #region 添加出库任务信息
                                var taskNo = new Common().GetMaxNo("TK");
                                var exTask = new LogTask    //出库任务
                                {
                                    TaskNo = taskNo,
                                    Sender = "WMS",
                                    Receiver = "PDA",
                                    IsSuccess = 1, //是否下发成功 0失败 1成功
                                    StartLocat = locat == null ? "" : s.LocatNo,//起始位置
                                    EndLocat = model.OutMode,//目标位置
                                    PalletNo = s.PalletNo,//托盘码
                                    IsSend = 1,//是否可再次下发
                                    IsCancel = 1,//是否可取消
                                    IsFinish = 1,//是否可完成
                                    Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                    Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                    OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                    CreateTime = serverTime, //创建时间
                                    CreateUser = userId, //创建人
                                    Msg = "Pda空托从" + locat == null ? "" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                                                                                                                     //FinishDate = serverTime, //完成时间
                                };
                                outDto1.Add(new OutCommandDto()
                                {
                                    PalletNo = exTask.PalletNo,//托盘号
                                    StartLocate = exTask.StartLocat, // 起始位置
                                    StartRoadway = locat.RoadwayNo, //所属巷道
                                    EndLocate = model.OutMode, // 目标位置
                                    TaskNo = exTask.TaskNo, // 任务号
                                    TaskType = "1",// 任务类型 (出库)
                                    OutMode = model.OutMode,  //目标地址
                                    Order = 1
                                });
                                Db.Insertable(exTask).ExecuteCommand();
                                #endregion
                                #region 储位状态变更
                                //更改储位状态为出库中
                                locat.Status = "3"; //3 出库中
                                Db.Updateable(locat).ExecuteCommand();//修改储位信息
                                #endregion
                            }
                            else
                            {
                                //判断储位状态
                                if (slotBefore.Status == "0")
                                {
                                    #region 改变库存
                                    //增加库存锁定数量
                                    stock.LockQty += (int)s.Qty; //锁定数量
                                    stock.UpdateTime = serverTime; //修改时间
                                    stock.UpdateUser = userId; //修改人
                                    Db.Updateable(stock).ExecuteCommand();//修改库存总表信息
                                    //增加库存明细锁定数量
                                    s.LockQty += (int)s.Qty; //锁定数量
                                    s.UpdateTime = serverTime; //修改时间
                                    s.UpdateUser = userId; //修改人
                                    s.Status = "2"; //2 已分配
                                    Db.Updateable(s).ExecuteCommand();//修改库存明细信息
                                    #endregion
                                    #region 分配
                                    //添加分配表信息
                                    var allot = new BllExportAllot
                                    {
                                        SONo = "",
                                        WaveNo = "",
                                        SODetailNo = 0,
                                        StockId = s.Id,
                                        LotNo = "",
                                        LotText = "",
                                        SupplierLot = "",
                                        SkuNo = s.SkuNo,
                                        SkuName = s.SkuName,
                                        Standard = s.Standard,
                                        PalletNo = s.PalletNo,
                                        IsBale = "0", //是否裹包
                                        IsBelt = "0", //是否打带
                                        //BoxexQty = s.Qty,
                                        Qty = (int)s.Qty,
                                        CompleteQty = 0,
                                        Status = "1",
                                        LogisticsId = 0,
                                        IsAdvance = "0",
                                        OutMode = model.OutMode,//出库口
                                        CreateUser = userId,
                                        CreateTime = DateTime.Now
                                    };
                                    Db.Insertable(allot).ExecuteCommand();
                                    #endregion
                                    #region 添加出库任务信息
                                    var taskNo = new Common().GetMaxNo("TK");
                                    var exTask = new LogTask    //出库任务
                                    {
                                        TaskNo = taskNo,
                                        Sender = "WMS",
                                        Receiver = "PDA",
                                        IsSuccess = 1, //是否下发成功 0失败 1成功
                                        StartLocat = locat == null ? "" : s.LocatNo,//起始位置
                                        EndLocat = model.OutMode,//目标位置
                                        PalletNo = s.PalletNo,//托盘码
                                        IsSend = 1,//是否可再次下发
                                        IsCancel = 1,//是否可取消
                                        IsFinish = 1,//是否可完成
                                        Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                        Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                        OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                        CreateTime = serverTime, //创建时间
                                        CreateUser = userId, //创建人
                                        Msg = "Pda空托从" + locat == null ? "" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                                                                                                                         //FinishDate = serverTime, //完成时间
                                    };
                                    outDto1.Add(new OutCommandDto()
                                    {
                                        PalletNo = exTask.PalletNo,//托盘号
                                        StartLocate = exTask.StartLocat, // 起始位置
                                        StartRoadway = locat.RoadwayNo, //所属巷道
                                        EndLocate = model.OutMode, // 目标位置
                                        TaskNo = exTask.TaskNo, // 任务号
                                        TaskType = "1",// 任务类型 (出库)
                                        OutMode = model.OutMode,  //目标地址
                                        Order = 1
                                    });
                                    Db.Insertable(exTask).ExecuteCommand();
                                    #endregion
                                    #region 储位状态变更
                                    //更改储位状态为出库中
                                    locat.Status = "3"; //3 出库中
                                    Db.Updateable(locat).ExecuteCommand();//修改储位信息
                                    #endregion
                                }
                                else if(slotBefore.Status == "1")
                                {
                                    //判断托盘上物料
                                    var pallSku = Db.Queryable<DataStockDetail>().First(m=>m.SkuNo == "100099" && m.LocatNo == slotBefore.LocatNo);
                                    if (pallSku == null) //移库
                                    {
                                        #region 分配
                                        //添加分配表信息
                                        var allot = new BllExportAllot
                                        {
                                            SONo = "",
                                            WaveNo = "",
                                            SODetailNo = 0,
                                            StockId = s.Id,
                                            LotNo = "",
                                            LotText = "",
                                            SupplierLot = "",
                                            SkuNo = s.SkuNo,
                                            SkuName = s.SkuName,
                                            Standard = s.Standard,
                                            PalletNo = s.PalletNo,
                                            IsBale = "0", //是否裹包
                                            IsBelt = "0", //是否打带
                                            //BoxexQty = s.Qty,
                                            Qty = (int)s.Qty,
                                            CompleteQty = 0,
                                            Status = "1",
                                            LogisticsId = 0,
                                            IsAdvance = "0",
                                            OutMode = model.OutMode,//出库口
                                            CreateUser = userId,
                                            CreateTime = DateTime.Now
                                        };
                                        Db.Insertable(allot).ExecuteCommand();
                                        #endregion
                                        #region 添加移库任务信息
                                        var taskNo = new Common().GetMaxNo("TK");
                                        var exTask = new LogTask    //出库任务
                                        {
                                            TaskNo = taskNo,
                                            Sender = "WMS",
                                            Receiver = "PDA",
                                            IsSuccess = 1, //是否下发成功 0失败 1成功
                                            StartLocat = locat == null ? "" : s.LocatNo,//起始位置
                                            EndLocat = model.OutMode,//目标位置
                                            PalletNo = s.PalletNo,//托盘码
                                            IsSend = 1,//是否可再次下发
                                            IsCancel = 1,//是否可取消
                                            IsFinish = 1,//是否可完成
                                            Type = "2",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                            Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                            OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                            CreateTime = serverTime, //创建时间
                                            CreateUser = userId, //创建人
                                            Msg = "Pda空托从" + locat == null ? "" : s.LocatNo + "到" + model.OutMode + "的移库任务", //关键信息
                                                                                                                             //FinishDate = serverTime, //完成时间
                                        };
                                        moveDto.Add(new OutCommandDto()
                                        {
                                            PalletNo = exTask.PalletNo,//托盘号
                                            StartLocate = exTask.StartLocat, // 起始位置
                                            StartRoadway = locat.RoadwayNo, //所属巷道
                                            EndLocate = model.OutMode, // 目标位置
                                            TaskNo = exTask.TaskNo, // 任务号
                                            TaskType = "2",// 任务类型 (出库)
                                            OutMode = model.OutMode,  //目标地址
                                            Order = 1
                                        });
                                        Db.Insertable(exTask).ExecuteCommand();
                                        #endregion
                                        #region 储位状态变更
                                        //更改储位状态为移出中
                                        slotBefore.Status = "5"; //5 移出中
                                        Db.Updateable(slotBefore).ExecuteCommand();//修改储位信息
                                        #endregion
                                    }
                                    else  //出库
                                    {
                                        #region 改变库存
                                        //增加库存锁定数量
                                        stock.LockQty += (int)s.Qty; //锁定数量
                                        stock.UpdateTime = serverTime; //修改时间
                                        stock.UpdateUser = userId; //修改人
                                        Db.Updateable(stock).ExecuteCommand();//修改库存总表信息
                                        //增加库存明细锁定数量
                                        s.LockQty += (int)s.Qty; //锁定数量
                                        s.UpdateTime = serverTime; //修改时间
                                        s.UpdateUser = userId; //修改人
                                        s.Status = "2"; //2 已分配
                                        Db.Updateable(s).ExecuteCommand();//修改库存明细信息
                                        #endregion
                                        #region 分配
                                        //添加分配表信息
                                        var allot = new BllExportAllot
                                        {
                                            SONo = "",
                                            WaveNo = "",
                                            SODetailNo = 0,
                                            StockId = s.Id,
                                            LotNo = "",
                                            LotText = "",
                                            SupplierLot = "",
                                            SkuNo = s.SkuNo,
                                            SkuName = s.SkuName,
                                            Standard = s.Standard,
                                            PalletNo = s.PalletNo,
                                            IsBale = "0", //是否裹包
                                            IsBelt = "0", //是否打带
                                            //BoxexQty = s.Qty,
                                            Qty = (int)s.Qty,
                                            CompleteQty = 0,
                                            Status = "1",
                                            LogisticsId = 0,
                                            IsAdvance = "0",
                                            OutMode = model.OutMode,//出库口
                                            CreateUser = userId,
                                            CreateTime = DateTime.Now
                                        };
                                        Db.Insertable(allot).ExecuteCommand();
                                        #endregion
                                        #region 添加出库任务信息
                                        var taskNo = new Common().GetMaxNo("TK");
                                        var exTask = new LogTask    //出库任务
                                        {
                                            TaskNo = taskNo,
                                            Sender = "WMS",
                                            Receiver = "PDA",
                                            IsSuccess = 1, //是否下发成功 0失败 1成功
                                            StartLocat = locat == null ? "" : s.LocatNo,//起始位置
                                            EndLocat = model.OutMode,//目标位置
                                            PalletNo = s.PalletNo,//托盘码
                                            IsSend = 1,//是否可再次下发
                                            IsCancel = 1,//是否可取消
                                            IsFinish = 1,//是否可完成
                                            Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                            Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                            OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                            CreateTime = serverTime, //创建时间
                                            CreateUser = userId, //创建人
                                            Msg = "Pda空托从" + locat == null ? "" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                                                                                                                             //FinishDate = serverTime, //完成时间
                                        };
                                        outDto2.Add(new OutCommandDto()
                                        {
                                            PalletNo = exTask.PalletNo,//托盘号
                                            StartLocate = exTask.StartLocat, // 起始位置
                                            StartRoadway = locat.RoadwayNo, //所属巷道
                                            EndLocate = model.OutMode, // 目标位置
                                            TaskNo = exTask.TaskNo, // 任务号
                                            TaskType = "1",// 任务类型 (出库)
                                            OutMode = model.OutMode,  //目标地址
                                            Order = 1
                                        });
                                        Db.Insertable(exTask).ExecuteCommand();
                                        #endregion
                                        #region 储位状态变更
                                        //更改储位状态为出库中
                                        slotBefore.Status = "3"; //3 出库中
                                        Db.Updateable(slotBefore).ExecuteCommand();//修改储位信息
                                        #endregion
                                    }
                                    if (int.Parse(model.Num) == outDto1.Count + outDto2.Count)
                                    {
                                        break;//需求垛数已达到 可以出库了
                                    }
                                    else
                                    {
                                        #region 改变库存
                                        //增加库存锁定数量
                                        stock.LockQty += (int)s.Qty; //锁定数量
                                        stock.UpdateTime = serverTime; //修改时间
                                        stock.UpdateUser = userId; //修改人
                                        Db.Updateable(stock).ExecuteCommand();//修改库存总表信息
                                        //增加库存明细锁定数量
                                        s.LockQty += (int)s.Qty; //锁定数量
                                        s.UpdateTime = serverTime; //修改时间
                                        s.UpdateUser = userId; //修改人
                                        s.Status = "2"; //2 已分配
                                        Db.Updateable(s).ExecuteCommand();//修改库存明细信息
                                        #endregion
                                        #region 分配
                                        //添加分配表信息
                                        var allot = new BllExportAllot
                                        {
                                            SONo = "",
                                            WaveNo = "",
                                            SODetailNo = 0,
                                            StockId = s.Id,
                                            LotNo = "",
                                            LotText = "",
                                            SupplierLot = "",
                                            SkuNo = s.SkuNo,
                                            SkuName = s.SkuName,
                                            Standard = s.Standard,
                                            PalletNo = s.PalletNo,
                                            IsBale = "0", //是否裹包
                                            IsBelt = "0", //是否打带
                                            //BoxexQty = s.Qty,
                                            Qty = (int)s.Qty,
                                            CompleteQty = 0,
                                            Status = "1",
                                            LogisticsId = 0,
                                            IsAdvance = "0",
                                            OutMode = model.OutMode,//出库口
                                            CreateUser = userId,
                                            CreateTime = DateTime.Now
                                        };
                                        Db.Insertable(allot).ExecuteCommand();
                                        #endregion
                                        #region 添加出库任务信息
                                        var taskNo = new Common().GetMaxNo("TK");
                                        var exTask = new LogTask    //出库任务
                                        {
                                            TaskNo = taskNo,
                                            Sender = "WMS",
                                            Receiver = "PDA",
                                            IsSuccess = 1, //是否下发成功 0失败 1成功
                                            StartLocat = locat == null ? "" : s.LocatNo,//起始位置
                                            EndLocat = model.OutMode,//目标位置
                                            PalletNo = s.PalletNo,//托盘码
                                            IsSend = 1,//是否可再次下发
                                            IsCancel = 1,//是否可取消
                                            IsFinish = 1,//是否可完成
                                            Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                            Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                            OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                            CreateTime = serverTime, //创建时间
                                            CreateUser = userId, //创建人
                                            Msg = "Pda空托从" + locat == null ? "" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                                                                                                                             //FinishDate = serverTime, //完成时间
                                        };
                                        outDto2.Add(new OutCommandDto()
                                        {
                                            PalletNo = exTask.PalletNo,//托盘号
                                            StartLocate = exTask.StartLocat, // 起始位置
                                            StartRoadway = locat.RoadwayNo, //所属巷道
                                            EndLocate = model.OutMode, // 目标位置
                                            TaskNo = exTask.TaskNo, // 任务号
                                            TaskType = "1",// 任务类型 (出库)
                                            OutMode = model.OutMode,  //目标地址
                                            Order = 1
                                        });
                                        Db.Insertable(exTask).ExecuteCommand();
                                        #endregion
                                        #region 储位状态变更
                                        //更改储位状态为出库中
                                        locat.Status = "3"; //3 出库中
                                        Db.Updateable(locat).ExecuteCommand();//修改储位信息
                                        #endregion
                                    }
                                }
                            }
                        }
                    }
                    if (int.Parse(model.Num) == outDto1.Count+ outDto2.Count)
                    {
                        TaskNo = taskNo,
                        Sender = "WMS",
                        Receiver = "PDA",
                        IsSuccess = 1, //是否下发成功 0失败 1成功
                        StartLocat = locat == null ? "零箱库" : s.LocatNo,//起始位置
                        EndLocat = model.OutMode,//目标位置
                        PalletNo = s.PalletNo,//托盘码
                        IsSend = 1,//是否可再次下发
                        IsCancel = 1,//是否可取消
                        IsFinish = 1,//是否可完成
                        Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                        Status = "1",//任务状态0:等待执行1正在执行2执行完成
                        OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                        CreateTime = serverTime, //创建时间
                        CreateUser = userId, //创建人
                        Msg = "Pda空托从" + locat == null ? "零箱库" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                        //FinishDate = serverTime, //完成时间
                    };
                    outDtoList.Add(new OutCommandDto()
                    {
                        PalletNo = exTask.PalletNo,//托盘号
                        StartLocate = exTask.StartLocat, // 起始位置
                        StartRoadway = locat.RoadwayNo, //所属巷道
                        EndLocate = model.OutMode, // 目标位置
                        TaskNo = exTask.TaskNo, // 任务号
                        TaskType = "1",// 任务类型 (出库)
                        OutMode = model.OutMode,  //目标地址
                        Order = 1
                    });
                    Db.Insertable(exTask).ExecuteCommand();
                    #endregion
                    i += 1;
                    if (i == int.Parse(model.Num))
                    {
                        //需求垛数已达到 可以出库了
                        break;
                        break;//需求垛数已达到 可以出库了
                    }
                }
                if (outDtoList.Count > 0)
                outDto1.AddRange(moveDto);
                outDto1.AddRange(outDto2);
                if (outDto1.Count > 0)
                {
                    // 正式运行程序放开
                    var list2 = outDtoList.Select(m => m.TaskNo).ToList();
                    var jsonData = JsonConvert.SerializeObject(outDtoList);
                    var list2 = outDto1.Select(m => m.TaskNo).ToList();
                    var jsonData = JsonConvert.SerializeObject(outDto1);
                    string response = "";
                    try
@@ -1153,7 +1662,7 @@
                }
                //添加操作日志记录
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "空托出库", i + "", "下发", $"用PDA下发了 {i} 个空托垛", userId);
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "空托出库", int.Parse(model.Num) + "", "下发", $"用PDA下发了 {int.Parse(model.Num)} 个空托垛", userId);
                Db.CommitTran();
                return "";
@@ -1167,6 +1676,68 @@
        }
        public string MoveAddress(string oldAddress, string roadWay, string skuNo)//01020201  排-列-层-深度
        {
            string nowAddress = "";
            //根据物料编码获取对应区域
            var skuCategoryNo = Db.Queryable<SysMaterials>().Where(a => a.IsDel == "0" && a.SkuNo == skuNo).Select(a => a.CategoryNo).First();
            var category = Db.Queryable<SysMaterialCategory>().First(a => a.IsDel == "0" && a.CategoryNo == skuCategoryNo);
            // 获取移库目标储位
            var row = int.Parse(oldAddress.Substring(0, 2));
            var lie = int.Parse(oldAddress.Substring(2, 2));
            var ceng = int.Parse(oldAddress.Substring(4, 2));
            var sqlString = $@"select LocatNo,[Row],[Column],Layer, (ABS(Row-{row}) + ABS([Column]-{lie}) + ABS(Layer-{ceng}))  as distNum from SysStorageLocat where Flag = '0' and Status = '0' and Depth = '02' and RoadwayNo = '{roadWay}' and AreaNo in ('{category.AreaNo}') order by distNum;";
            var addressModels = Db.Ado.SqlQuery<AddressCls>(sqlString).ToList();
            if (addressModels.Count > 0)   // 判断同巷道内排空库位
            {
                var listLocaete = new List<string>();
                foreach (var item in addressModels)
                {
                    // 目标内库位对应的外库位
                    string addressee = item.LocatNo.Substring(0, 6) + "01";
                    // 判断目标库位的外库位是否存在货物   (正常情况下正在移入情况不存在,因为移库先移入里面,后移入外面)
                    //SlotStatus 0: 空储位 1:有货  2:正在入库  3:正在出库   4:正在移入  5:正在移出
                    sqlString = $"select count(*) from SysStorageLocat where LocatNo = '{addressee}' and Status = '0' and Flag in ('0','1') ; ";
                    var rowNum = Db.Ado.SqlQuery<int>(sqlString).First();
                    if (rowNum == 0)
                    {
                        continue;
                    }
                    else
                    {
                        nowAddress = item.LocatNo;
                        break;
                    }
                }
            }
            if (nowAddress == "")
            {
                // 判断同巷道外排空库位
                sqlString = $@"select LocatNo,[Row],[Column],Layer, (ABS(Row-{row}) + ABS([Column]-{lie}) + ABS(Layer-{ceng}))  as distNum
                                from SysStorageLocat
                                where Flag = '0' and Status = '0' and Depth = '01' and RoadwayNo = '{roadWay}' and AreaNo  in '{category}'
                                order by distNum;";
                var adderModeling = Db.Ado.SqlQuery<AddressCls>(sqlString).ToList();
                if (adderModeling.Count > 0)
                {
                    nowAddress = adderModeling[0].LocatNo;
                }
                else
                {
                    // 库内不存在空储位
                    nowAddress = "";
                }
            }
            return nowAddress;
        }
        //获取平库托盘信息
        public List<BoxInfo> GetPingKuInfoByPallet(string soNo, string palletNo)
        {
Wms/WMS.IBLL/IBllAsnServer/IArrivalNoticeServer.cs
@@ -45,7 +45,7 @@
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        string AddArrivalNotice(ArrivalNoticeVm model);
        string AddArrivalNotice(ArrivalNoticeVm model, string url);
        /// <summary>
        /// 编辑入库单
        /// </summary>
Wms/Wms/Controllers/BllAsnController.cs
@@ -9,6 +9,8 @@
using WMS.IBLL.IBllAsnServer;
using WMS.IBLL.ILogServer;
using Model.ModelVm.BllAsnVm;
using Wms.Tools;
using Microsoft.Extensions.Options;
namespace Wms.Controllers
{
@@ -18,6 +20,7 @@
    public class BllAsnController : ControllerBase
    {
        #region 依赖注入
        private readonly ApiUrlConfig _config; //接口交互路径
        private readonly IArrivalNoticeServer _arrivalNoticeSvc;                    // 入库单据Svc 
        private readonly IPalletBindServer _PalletBindSvc;                          // 托盘绑定Svc 
        private readonly IBllBoxInfoServer _BoxInfoSvc;
@@ -29,8 +32,9 @@
        #endregion
        #region 构造函数
        public BllAsnController(IArrivalNoticeServer arrivalNoticeSvc, IPalletBindServer palletBindSvc,IBllBoxInfoServer bllBoxInfoSvc, ITaskServer taskSvc,IOperationASNServer logSvc, IPalletUnbindServer palletUnbind,IAuditLogServer auditLog,IBllLabelBoxNoServer labelBox)
        public BllAsnController(IOptions<ApiUrlConfig> setting, IArrivalNoticeServer arrivalNoticeSvc, IPalletBindServer palletBindSvc,IBllBoxInfoServer bllBoxInfoSvc, ITaskServer taskSvc,IOperationASNServer logSvc, IPalletUnbindServer palletUnbind,IAuditLogServer auditLog,IBllLabelBoxNoServer labelBox)
        {
            _config = setting.Value;
            _arrivalNoticeSvc = arrivalNoticeSvc;
            _PalletBindSvc = palletBindSvc;
            _BoxInfoSvc = bllBoxInfoSvc;
@@ -134,7 +138,7 @@
                }
                model.CreateUser = int.Parse(UserId);
                string strMesage = _arrivalNoticeSvc.AddArrivalNotice(model);
                string strMesage = _arrivalNoticeSvc.AddArrivalNotice(model, _config.WcsHost + _config.AddOrderTaskUrl);
                if (strMesage == "")
                {
Wms/Wms/Tools/ApiUrlConfig.cs
@@ -103,5 +103,11 @@
        #endregion
        #region WCS
        /// <summary>
        /// //给WCS下发入库单信息
        /// </summary>
        public string AddOrderTaskUrl { get; set; }
        #endregion
    }
}
Wms/Wms/appsettings.json
@@ -31,6 +31,7 @@
    // WCS
    "IssueComApiUrl": "/api/demo/wcsTasks", //下发命令(出库、移库)
    "IssueComApiUrl2": "/api/demo/wcsTask", //"/api/WCSApi/AddTask", //重新下发命令(出库、移库)
    "AddOrderTaskUrl": "/api/demo/addOrderTask", //WMS给WCS下发的入库单任务
    // ERP
    "AsnFinishUrl": "/api/wmsInterface/OutStockTask", //入库订单关闭