chengsc
2025-05-22 fd9ce381b904a22593de2ab242fb8f65cee45efa
修改问题
15个文件已修改
2147 ■■■■■ 已修改文件
HTML/views/HouseWithinSetting/CRLogTask.html 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/QualityControl/InspectionRequest.html 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Pda/View/AsnSetting/requestRuku.html 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Pda/View/SoSetting/ExNoticeOut.html 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Pda/js/public.js 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/InterFaceModel/AsnModels.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs 1312 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllQualityServer/InspectionRequestServer.cs 140 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/HttpServer.cs 416 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/Logic/AllotLocation.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.Entity/LogEntity/LogTask.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IHttpServer.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/BllSoController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/DownApiController.cs 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/HouseWithinSetting/CRLogTask.html
@@ -682,15 +682,14 @@
                    layer.confirm('确定完成选中的出库任务?', function (index) {
                        var param = {
                            taskNo: data.TaskNo,
                            TaskStatus:"2",
                            TaskType:data.Type
                        };
                        var postUrl="/BllCheck/FinishCheckTask"
                        if(data.OrderType=='3'){
                            postUrl='/BllCheck/FinishMoveTask'
                        }
                        sendData(IP + postUrl, param, 'post', function (res) {
                        sendData(IP + "/DownApi/ReceiveRenGongSignal", param, 'post', function (res) {
                            console.log(res);
                            if (res.code == 0) { //成功
                                layer.msg(res.msg, {
                            if (res.Success == "0") { //成功
                                layer.msg(res.Message, {
                                    icon: 1,
                                    time: 1000 //2秒关闭(如果不配置,默认是3秒)
                                }, function () {
@@ -701,7 +700,7 @@
                                    });
                                });
                            } else { //不成功
                                layer.msg(res.msg, {
                                layer.msg(res.Message, {
                                    icon: 2,
                                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                }, function () { });
HTML/views/QualityControl/InspectionRequest.html
@@ -149,10 +149,8 @@
                        <div class="layui-input-inline" style="width: 220px;">
                            <select name="PickingArea" id="PickingArea" lay-search>
                                <option value=""></option>
                                <option value="1">1</option>
                                <option value="2">2</option>
                                <option value="3">3</option>
                                <option value="4">4</option>
                                <option value="B020101">B020101</option>
                                <option value="B050101">B050101</option>
                            </select>
                        </div>
                    </div>
Pda/View/AsnSetting/requestRuku.html
@@ -88,7 +88,17 @@
                                autocomplete="off" class="layui-input">
                        </div>
                    </div>
                    <div id="" class="layui-form-item layout-dropdownlist">
                        <label class="layui-form-label" lang>层数:</label>
                         <div class="layui-input-block" id="cengDiv">
                            <select id="ceng" lay-filter="cengSelect" lay-search>
                                <option value=""></option>
                                <option value="1">1层</option>
                                <option value="2">2层</option>
                            </select>
                            <img src="/assets/down_arraw.png">
                        </div>
                    </div>
                    <!-- <table class="layout-tbl-input" border="" cellspacing="" cellpadding="">
                        <tr>
                            <td colspan="2">
@@ -195,6 +205,7 @@
                }
                //获取托盘上架信息
                sendData(IP + "/PdaAsn/IsEnablePalletNo", param1, 'post', function (res) {
                    if (res.code == 0) { //成功
                        
                    } else { //不成功
@@ -204,7 +215,7 @@
                        }, function () {
                            
                        });
                        return
                        //return
                    }
                });
            }
@@ -220,6 +231,7 @@
                }
                var param = {
                    PalletNo: $("#PalletNo").val(),
                    Ceng: $("#ceng").val(),
                    HouseNo:"W02"
                }
                sendData(IP + "/DownApi/RequestLocation", param, 'post', function (res) {
Pda/View/SoSetting/ExNoticeOut.html
@@ -105,6 +105,13 @@
                        <div class="layui-input-block">
                            <select id="endSelect" lay-filter="endSelect" lay-search>    
                                <option value=""></option>
                                <option value="B020101">一楼-1</option>
                                <option value="B020102">一楼-2</option>
                                <option value="B020103">一楼-3</option>
                                <option value="B020104">一楼-4</option>
                                <option value="B050101">二楼-1</option>
                                <option value="B050102">二楼-2</option>
                                <option value="B050103">二楼-3</option>
                            </select>
                            <img src="/assets/down_arraw.png">
                        </div>
Pda/js/public.js
@@ -18,19 +18,19 @@
        if (!$.cookie('token')) {
            callbackFun("登录人信息已失效");
            try {
                parent.window.location.href = '/views/Login.html';
                parent.window.location.href = '/View/login.html';
            }
            catch (error) {
                window.location.href = '/views/Login.html';
                window.location.href = '/View/login.html';
            }
            return;
        }
        if (isTokenExpired($.cookie('token'))) {
            try {
                parent.window.location.href = '/views/Login.html';
                parent.window.location.href = '/View/login.html';
            }
            catch (error) {
                window.location.href = '/views/Login.html';
                window.location.href = '/View/login.html';
            }
            return;
        }
@@ -68,19 +68,19 @@
        if (!$.cookie('token')) {
            callbackFun("登录人信息已失效");
            try {
                parent.window.location.href = '/view/Login.html';
                parent.window.location.href = '/View/login.html';
            }
            catch (error) {
                window.location.href = '/view/Login.html';
                window.location.href = '/View/login.html';
            }
            return;
        }
        if (isTokenExpired($.cookie('token'))) {
            try {
                parent.window.location.href = '/view/Login.html';
                parent.window.location.href = '/View/login.html';
            }
            catch (error) {
                window.location.href = '/view/Login.html';
                window.location.href = '/View/login.html';
            }
            return;
        }
Wms/Model/InterFaceModel/AsnModels.cs
@@ -77,6 +77,7 @@
        public string PalletNo { get; set; }
        public string HouseNo { get; set; }
        public string RoadwayNo { get; set; }
        public string Ceng { get; set; }
    }
Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs
@@ -800,6 +800,666 @@
            }
        }
        //取样出库拣货(标签)
        public async Task SampleSetPick(string qcNo, string palletNo, string boxNo, string boxNo3, string pickQty, int userId)
        {
            try
            {
                #region 判断
                if (string.IsNullOrWhiteSpace(qcNo))
                {
                    throw Oops.Bah("请验单据不能为空");
                }
                if (string.IsNullOrWhiteSpace(palletNo))
                {
                    throw Oops.Bah("托盘号不能为空");
                }
                var type = await GetSampleType2(palletNo);
                if (type != "0")
                {
                    throw Oops.Bah("当前托盘请在数量页签取样");
                }
                if (string.IsNullOrEmpty(boxNo))
                {
                    throw Oops.Bah("外箱条码不能为空");
                }
                //if (!string.IsNullOrEmpty(boxNo3) && !string.IsNullOrEmpty(pickQty) && int.Parse(pickQty) > 0)
                //{
                //    throw new Exception("追溯条码和拣货数量不能同时输入");
                //}
                //请验单
                var inspecd = await Db.Queryable<BllQualityInspectionRequest>().FirstAsync(m => m.IsDel == "0" && m.QcNo == qcNo);
                if (inspecd == null)
                {
                    throw Oops.Bah("未查询到请验单信息");
                }
                if (inspecd.Status == "0" || inspecd.Status == "3")
                {
                    throw Oops.Bah("请验单状态错误,请核实");
                }
                //库存明细信息
                var stockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNo && m.SkuNo == inspecd.SkuNo && m.LotNo == inspecd.LotNo);
                if (stockDetail == null)
                {
                    throw Oops.Bah("未在库存中查询出当前托盘信息");
                }
                // 判断托盘是否在库内
                if (!string.IsNullOrWhiteSpace(stockDetail.LocatNo))
                {
                    var wareHouseData = await Db.Queryable<SysWareHouse>().FirstAsync(m => m.IsDel == "0" && m.WareHouseNo == stockDetail.WareHouseNo);
                    if (wareHouseData.Type != "2")
                    {
                        throw Oops.Bah("当前托盘不是库外托盘,请核实");
                    }
                }
                //箱支信息
                var boxInfoList = await Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.StockDetailId == stockDetail.Id && m.BoxNo == boxNo).ToListAsync();
                //库存总表
                var stock = await Db.Queryable<DataStock>().FirstAsync(m => m.IsDel == "0" && m.SkuNo == inspecd.SkuNo && m.LotNo == inspecd.LotNo);
                if (stock == null)
                {
                    throw Oops.Bah("未查询出库存总信息");
                }
                //入库单
                var notice = await Db.Queryable<BllArrivalNotice>().FirstAsync(m => m.IsDel == "0" && m.ASNNo == inspecd.ASNNo);
                if (notice == null)
                {
                    throw Oops.Bah("未查询到入库单信息");
                }
                #endregion
                //取样明细记录表
                var sampld = await Db.Queryable<BllSamplingDetails>().Where(m => m.IsDel == "0" && m.QcNo == qcNo).ToListAsync();
                var isAddSampld = false;
                var PickType = ""; //0数量拣货  1 箱支拣货
                var EditboxInfo = new DataBoxInfo();
                var EditboxInfoList = new List<DataBoxInfo>();
                #region 判断拣货方式 散支 数量
                if (!string.IsNullOrEmpty(pickQty) && decimal.Parse(pickQty) > 0) //数量拣货
                {
                    PickType = "0";
                    if (!string.IsNullOrWhiteSpace(boxNo3)) //支中拣数量
                    {
                        if (boxInfoList.Count(m => m.BoxNo3 == boxNo3) == 0)
                        {
                            throw Oops.Bah("未查询到支码信息");
                        }
                        if (boxInfoList.Count(m => m.BoxNo3 == boxNo3) > 1)
                        {
                            throw Oops.Bah("支码信息数据信息错误,请核实");
                        }
                        EditboxInfo = await Db.Queryable<DataBoxInfo>().FirstAsync(m => m.IsDel == "0" && m.StockDetailId == stockDetail.Id && m.BoxNo == boxNo && m.BoxNo3 == boxNo3);
                        if (EditboxInfo.Qty < decimal.Parse(pickQty))
                        {
                            throw Oops.Bah("拣货数量不能大于箱内数量");
                        }
                        isAddSampld = sampld.Count(m => m.PalletNo == palletNo && m.BoxNo == EditboxInfo.BoxNo && m.BoxNo3 == EditboxInfo.BoxNo3) == 0;
                    }
                    else //箱中拣数量
                    {
                        if (boxInfoList.Count == 0)
                        {
                            throw Oops.Bah("未在托盘上查询到箱码信息,请核实");
                        }
                        if (boxInfoList.Count > 1)
                        {
                            throw Oops.Bah("箱码数据信息错误,请核实");
                        }
                        if (boxInfoList.Count(m => !string.IsNullOrWhiteSpace(m.BoxNo3)) > 0)
                        {
                            throw Oops.Bah("当前箱码中含有支码,请输入支码信息取样");
                        }
                        EditboxInfo = await Db.Queryable<DataBoxInfo>().FirstAsync(m => m.IsDel == "0" && m.StockDetailId == stockDetail.Id && m.BoxNo == boxNo);
                        if (EditboxInfo.Qty < decimal.Parse(pickQty))
                        {
                            throw Oops.Bah("拣货数量不能大于箱内数量");
                        }
                        isAddSampld = sampld.Count(m => m.PalletNo == palletNo && m.BoxNo == EditboxInfo.BoxNo) == 0;
                    }
                    if (sampld.Sum(m => m.CompleteQty) + decimal.Parse(pickQty) > inspecd.SamplingQty)
                    {
                        throw Oops.Bah("取样总拣货数量大于请验单取样数量");
                    }
                    //判断箱中是否含有支码,有:不让拣数量
                    if (stockDetail.Qty - stockDetail.LockQty - stockDetail.FrozenQty < decimal.Parse(pickQty))
                    {
                        throw Oops.Bah("托盘上可用数量小于取样数量,请核实锁定、冻结数量");
                    }
                }
                else //箱支拣货
                {
                    PickType = "1";
                    var qty = 0m;
                    if (!string.IsNullOrWhiteSpace(boxNo3)) //拣支
                    {
                        if (boxInfoList.Count(m => m.BoxNo3 == boxNo3) == 0)
                        {
                            throw Oops.Bah("未查询到支码信息");
                        }
                        if (boxInfoList.Count(m => m.BoxNo3 == boxNo3) > 1)
                        {
                            throw Oops.Bah("支码数据信息错误,请核实");
                        }
                        EditboxInfoList = await Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.StockDetailId == stockDetail.Id && m.BoxNo == boxNo && m.BoxNo3 == boxNo3).ToListAsync();
                        if (EditboxInfoList.Sum(m => m.Qty) + sampld.Sum(m => m.CompleteQty) > inspecd.SamplingQty)
                        {
                            throw Oops.Bah("取样总拣货数量大于请验单取样数量");
                        }
                        qty = EditboxInfoList.Sum(m => m.Qty);
                        //isAddSampld = sampld.Count(m => m.PalletNo == palletNo && m.BoxNo == EditboxInfo.BoxNo && m.BoxNo3 == EditboxInfo.BoxNo3) == 0;
                    }
                    else //拣箱
                    {
                        if (boxInfoList.Count == 0)
                        {
                            throw Oops.Bah("未在托盘上查询到箱码信息,请核实");
                        }
                        if (boxInfoList.Count > 1)
                        {
                            throw Oops.Bah("箱码数据信息错误,请核实");
                        }
                        if (boxInfoList.Count(m => !string.IsNullOrWhiteSpace(m.BoxNo3)) > 0)
                        {
                            throw Oops.Bah("当前箱码中含有支码,请输入支码信息取样");
                        }
                        EditboxInfoList = await Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.StockDetailId == stockDetail.Id && m.BoxNo == boxNo).ToListAsync();
                        if (EditboxInfo.Qty < decimal.Parse(pickQty))
                        {
                            throw Oops.Bah("拣货数量不能大于箱内数量");
                        }
                        qty = EditboxInfoList.Sum(m => m.Qty);
                        //isAddSampld = sampld.Count(m => m.PalletNo == palletNo && m.BoxNo == EditboxInfo.BoxNo) == 0;
                    }
                    if (sampld.Sum(m => m.CompleteQty) + qty > inspecd.SamplingQty)
                    {
                        throw Oops.Bah("取样总拣货数量大于请验单取样数量");
                    }
                    if (stockDetail.Qty - stockDetail.LockQty - stockDetail.FrozenQty < qty)
                    {
                        throw Oops.Bah("托盘上可用数量小于取样数量,请核实锁定、冻结数量");
                    }
                }
                #endregion
                Db.BeginTran();
                #region
                if (PickType == "0")
                {
                    #region 添加或修改取样明细
                    var boxInfo = EditboxInfo;
                    //if (isAddSampld) //添加取样明细
                    //{
                    var sampleDetail = new BllSamplingDetails()
                    {
                        QcNo = qcNo,
                        ASNNo = inspecd.ASNNo,
                        PalletNo = palletNo,
                        BoxNo = boxInfo.BoxNo,
                        BoxNo2 = boxInfo.BoxNo2,
                        BoxNo3 = boxInfo.BoxNo3,
                        SkuNo = boxInfo.SkuNo,
                        SkuName = boxInfo.SkuName,
                        Standard = boxInfo.Standard,
                        LotNo = boxInfo.LotNo,
                        SupplierLot = boxInfo.SupplierLot,
                        CompleteQty = decimal.Parse(pickQty),
                        CreateTime = DateTime.Now,
                        CreateUser = userId
                    };
                    Db.Insertable(sampleDetail).ExecuteCommand();
                    //}
                    //else
                    //{
                    //    var sampldFirst = sampld.First(m => m.PalletNo == palletNo && m.BoxNo == boxInfo.BoxNo);
                    //    if (!string.IsNullOrWhiteSpace(boxNo3))
                    //    {
                    //        sampldFirst = sampld.First(m => m.PalletNo == palletNo && m.BoxNo == boxInfo.BoxNo && m.BoxNo3 == boxInfo.BoxNo3);
                    //    }
                    //    sampldFirst.CompleteQty += decimal.Parse(pickQty);
                    //    sampldFirst.UpdateTime = DateTime.Now;
                    //    sampldFirst.UpdateUser = userId;
                    //    Db.Updateable(sampldFirst).ExecuteCommand();
                    //}
                    #endregion
                    #region 修改库存三表
                    //拆包有效期更改
                    var unpackWarranty = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == inspecd.SkuNo).UnpackWarranty;
                    foreach (var item in boxInfoList)
                    {
                        item.BitBoxMark = "1";
                        item.InspectMark = "1";
                        if (unpackWarranty > 0 && boxInfoList.Count(m => m.ProductionTime != null) > 0)
                        {
                            if (item.ProductionTime != null)
                            {
                                var time = DateTime.Parse(item.ProductionTime.ToString()).AddDays((double)unpackWarranty);
                                if (time < item.ExpirationTime)
                                {
                                    item.ExpirationTime = time;
                                }
                            }
                        }
                    }
                    Db.Updateable(boxInfoList).ExecuteCommand();
                    //库存箱码
                    boxInfo.Qty -= decimal.Parse(pickQty);
                    if (boxInfo.Qty == 0)
                    {
                        Db.Deleteable(boxInfo).ExecuteCommand();
                    }
                    else
                    {
                        Db.Updateable(boxInfo).ExecuteCommand();
                    }
                    //库存明细
                    stockDetail.Qty -= decimal.Parse(pickQty);
                    if (stockDetail.Qty == 0)
                    {
                        Db.Deleteable(stockDetail).ExecuteCommand();
                    }
                    else
                    {
                        Db.Updateable(stockDetail).ExecuteCommand();
                    }
                    //库存总表
                    stock.Qty -= decimal.Parse(pickQty);
                    if (stock.Qty == 0)
                    {
                        Db.Deleteable(stock).ExecuteCommand();
                    }
                    else
                    {
                        Db.Updateable(stock).ExecuteCommand();
                    }
                    #endregion
                    #region 修改入库单
                    //不是上传完毕的修改取样状态
                    if (notice.Status != "4")
                    {
                        var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.ASNNo == inspecd.ASNNo && m.SkuNo == inspecd.SkuNo && m.LotNo == inspecd.LotNo);
                        if (noticeDetail.IsSampling == "0")
                        {
                            noticeDetail.IsSampling = "1";
                            Db.Updateable(noticeDetail).ExecuteCommand();
                        }
                    }
                    #endregion
                    #region 修改请验单
                    inspecd.Status = "2";
                    inspecd.UpdateTime = DateTime.Now;
                    if (sampld.Sum(m => m.CompleteQty) + decimal.Parse(pickQty) >= inspecd.SamplingQty)
                    {
                        inspecd.Status = "3";
                    }
                    Db.Updateable(inspecd).ExecuteCommand();
                    #endregion
                }
                else
                {
                    var sumQty = 0m;
                    foreach (var boxInfo in EditboxInfoList)
                    {
                        #region 添加或修改取样明细
                        //if (isAddSampld) //添加取样明细
                        //{
                        var sampleDetail = new BllSamplingDetails()
                        {
                            QcNo = qcNo,
                            ASNNo = inspecd.ASNNo,
                            PalletNo = palletNo,
                            BoxNo = boxInfo.BoxNo,
                            BoxNo2 = boxInfo.BoxNo2,
                            BoxNo3 = boxInfo.BoxNo3,
                            SkuNo = boxInfo.SkuNo,
                            SkuName = boxInfo.SkuName,
                            Standard = boxInfo.Standard,
                            LotNo = boxInfo.LotNo,
                            SupplierLot = boxInfo.SupplierLot,
                            CompleteQty = boxInfo.Qty,
                            CreateTime = DateTime.Now,
                            CreateUser = userId
                        };
                        await Db.Insertable(sampleDetail).ExecuteCommandAsync();
                        //}
                        //else
                        //{
                        //    var sampldFirst = sampld.First(m => m.PalletNo == palletNo && m.BoxNo == boxInfo.BoxNo);
                        //    if (!string.IsNullOrWhiteSpace(boxNo3))
                        //    {
                        //        sampldFirst = sampld.First(m => m.PalletNo == palletNo && m.BoxNo == boxInfo.BoxNo && m.BoxNo3 == boxInfo.BoxNo3);
                        //    }
                        //    sampldFirst.CompleteQty += boxInfo.Qty;
                        //    sampldFirst.UpdateTime = DateTime.Now;
                        //    sampldFirst.UpdateUser = userId;
                        //    Db.Updateable(sampldFirst).ExecuteCommand();
                        //}
                        #endregion
                        #region 修改库存三表
                        //拆包有效期更改
                        var unpackWarranty = (await Db.Queryable<SysMaterials>().FirstAsync(m => m.IsDel == "0" && m.SkuNo == inspecd.SkuNo)).UnpackWarranty;
                        foreach (var item in boxInfoList)
                        {
                            item.BitBoxMark = "1";
                            item.InspectMark = "1";
                            if (unpackWarranty > 0 && boxInfoList.Count(m => m.ProductionTime != null) > 0)
                            {
                                if (item.ProductionTime != null)
                                {
                                    var time = DateTime.Parse(item.ProductionTime.ToString()).AddDays((double)unpackWarranty);
                                    if (time < item.ExpirationTime)
                                    {
                                        item.ExpirationTime = time;
                                    }
                                }
                            }
                        }
                        await Db.Updateable(boxInfoList).ExecuteCommandAsync();
                        //库存箱码
                        await Db.Deleteable(boxInfo).ExecuteCommandAsync();
                        //库存明细
                        stockDetail.Qty -= boxInfo.Qty;
                        if (stockDetail.Qty == 0)
                        {
                            await Db.Deleteable(stockDetail).ExecuteCommandAsync();
                        }
                        else
                        {
                            await Db.Updateable(stockDetail).ExecuteCommandAsync();
                        }
                        //库存总表
                        stock.Qty -= boxInfo.Qty;
                        if (stock.Qty == 0)
                        {
                            await Db.Deleteable(stock).ExecuteCommandAsync();
                        }
                        else
                        {
                            await Db.Updateable(stock).ExecuteCommandAsync();
                        }
                        #endregion
                        #region 修改入库单
                        //不是上传完毕的修改取样状态
                        if (notice.Status != "4")
                        {
                            var noticeDetail = await Db.Queryable<BllArrivalNoticeDetail>().FirstAsync(m => m.IsDel == "0" && m.ASNNo == inspecd.ASNNo && m.SkuNo == inspecd.SkuNo && m.LotNo == inspecd.LotNo);
                            if (noticeDetail.IsSampling == "0")
                            {
                                noticeDetail.IsSampling = "1";
                                await Db.Updateable(noticeDetail).ExecuteCommandAsync();
                            }
                        }
                        #endregion
                        sumQty += boxInfo.Qty;
                    }
                    #region 修改请验单
                    inspecd.Status = "2";
                    inspecd.UpdateTime = DateTime.Now;
                    if (sampld.Sum(m => m.CompleteQty) + sumQty >= inspecd.SamplingQty)
                    {
                        inspecd.Status = "3";
                    }
                    await Db.Updateable(inspecd).ExecuteCommandAsync();
                    #endregion
                }
                #endregion
                //添加操作日志记录
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "取样拣货", qcNo, "拣货", $"在PDA上对请验单号为:{qcNo}的托盘码为:{palletNo}的拣货操作", userId);
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw e;
            }
        }
        //取样出库拣货(数量)
        public async Task SampleSetQtyPick(string qcNo, string palletNo, string pickQty, int userId)
        {
            try
            {
                #region 判断
                if (string.IsNullOrWhiteSpace(qcNo))
                {
                    throw Oops.Bah("请验单据不能为空");
                }
                if (string.IsNullOrWhiteSpace(palletNo))
                {
                    throw Oops.Bah("托盘号不能为空");
                }
                var type = await GetSampleType2(palletNo);
                if (type != "1")
                {
                    throw Oops.Bah("当前托盘请在标签页签取样");
                }
                if (string.IsNullOrWhiteSpace(pickQty))
                {
                    throw Oops.Bah("拣货数量不能为空");
                }
                if (decimal.Parse(pickQty) <= 0)
                {
                    throw Oops.Bah("拣货数量不能小于等于0");
                }
                //请验单
                var inspecd = await Db.Queryable<BllQualityInspectionRequest>().FirstAsync(m => m.IsDel == "0" && m.QcNo == qcNo);
                if (inspecd == null)
                {
                    throw Oops.Bah("未查询到请验单信息");
                }
                if (inspecd.Status == "0" || inspecd.Status == "3")
                {
                    throw Oops.Bah("请验单状态错误,请核实");
                }
                //库存明细信息
                var stockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNo
                && m.SkuNo == inspecd.SkuNo && m.LotNo == inspecd.LotNo);
                if (stockDetail == null)
                {
                    throw Oops.Bah("未在库存中查询出当前托盘信息");
                }
                // 判断托盘是否在库内
                if (!string.IsNullOrWhiteSpace(stockDetail.LocatNo))
                {
                    var wareHouseData = await Db.Queryable<SysWareHouse>().FirstAsync(m => m.IsDel == "0" && m.WareHouseNo == stockDetail.WareHouseNo);
                    if (wareHouseData.Type != "2")
                    {
                        throw Oops.Bah("当前托盘不是库外托盘,请核实");
                    }
                }
                //库存总表
                var stock = await Db.Queryable<DataStock>().FirstAsync(m => m.IsDel == "0" && m.SkuNo == inspecd.SkuNo && m.LotNo == inspecd.LotNo);
                if (stock == null)
                {
                    throw Oops.Bah("未查询出库存总信息");
                }
                //入库单
                var notice = await Db.Queryable<BllArrivalNotice>().FirstAsync(m => m.IsDel == "0" && m.ASNNo == inspecd.ASNNo);
                if (notice == null)
                {
                    throw Oops.Bah("未查询到入库单信息");
                }
                #endregion
                //取样明细记录表
                var sampld = await Db.Queryable<BllSamplingDetails>().Where(m => m.IsDel == "0" && m.QcNo == qcNo).ToListAsync();
                var qty = decimal.Parse(pickQty);
                //var isAddSampld = sampld.Count(m => m.PalletNo == palletNo) == 0;
                #region 判断数量
                if (sampld.Sum(m => m.CompleteQty) + qty > inspecd.SamplingQty)
                {
                    throw Oops.Bah("取样总拣货数量大于请验单取样数量");
                }
                //判断箱中是否含有支码,有:不让拣数量
                if (stockDetail.Qty - stockDetail.LockQty - stockDetail.FrozenQty < qty)
                {
                    throw Oops.Bah("托盘上可用数量小于取样数量,请核实锁定、冻结数量");
                }
                #endregion
                #region 添加或修改取样明细
                Db.BeginTran();
                //if (isAddSampld) //添加取样明细
                //{
                var sampleDetail = new BllSamplingDetails()
                {
                    QcNo = qcNo,
                    ASNNo = inspecd.ASNNo,
                    PalletNo = palletNo,
                    SkuNo = stockDetail.SkuNo,
                    SkuName = stockDetail.SkuName,
                    Standard = stockDetail.Standard,
                    LotNo = stockDetail.LotNo,
                    SupplierLot = stockDetail.SupplierLot,
                    CompleteQty = qty,
                    CreateTime = DateTime.Now,
                    CreateUser = userId
                };
                await Db.Insertable(sampleDetail).ExecuteCommandAsync();
                //}
                //else
                //{
                //    var sampldFirst = sampld.First(m => m.PalletNo == palletNo);
                //    sampldFirst.CompleteQty += qty;
                //    sampldFirst.UpdateTime = DateTime.Now;
                //    sampldFirst.UpdateUser = userId;
                //    Db.Updateable(sampldFirst).ExecuteCommand();
                //}
                #endregion
                #region 修改库存三表
                //库存明细
                stockDetail.Qty -= qty;
                if (stockDetail.Qty == 0)
                {
                    await Db.Deleteable(stockDetail).ExecuteCommandAsync();
                }
                else
                {
                    stockDetail.BitPalletMark = "1";
                    stockDetail.InspectMark = "1";
                    await Db.Updateable(stockDetail).ExecuteCommandAsync();
                }
                //库存总表
                stock.Qty -= qty;
                if (stock.Qty == 0)
                {
                    await Db.Deleteable(stock).ExecuteCommandAsync();
                }
                else
                {
                    await Db.Updateable(stock).ExecuteCommandAsync();
                }
                #endregion
                #region 修改入库单
                //不是上传完毕的修改取样状态
                if (notice.Status != "4")
                {
                    var noticeDetail = await Db.Queryable<BllArrivalNoticeDetail>().FirstAsync(m => m.IsDel == "0" && m.ASNNo == inspecd.ASNNo && m.SkuNo == inspecd.SkuNo && m.LotNo == inspecd.LotNo);
                    if (noticeDetail.IsSampling == "0")
                    {
                        noticeDetail.IsSampling = "1";
                        await Db.Updateable(noticeDetail).ExecuteCommandAsync();
                    }
                }
                #endregion
                #region 修改请验单
                inspecd.Status = "2";
                inspecd.UpdateTime = DateTime.Now;
                if (sampld.Sum(m => m.CompleteQty) + qty >= inspecd.SamplingQty)
                {
                    inspecd.Status = "3";
                }
                await Db.Updateable(inspecd).ExecuteCommandAsync();
                #endregion
                //添加操作日志记录
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "取样拣货", qcNo, "拣货", $"在PDA上对请验单号为:{qcNo}的托盘码为:{palletNo}的拣货操作", userId);
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw e;
            }
        }
        #endregion
        //验证托盘是否存在并是否可出库
@@ -4269,659 +4929,7 @@
            return data;
        }
        //取样出库拣货(标签)
        public async Task SampleSetPick(string qcNo, string palletNo, string boxNo, string boxNo3, string pickQty, int userId)
        {
            try
            {
                #region 判断
                if (string.IsNullOrWhiteSpace(qcNo))
                {
                    throw Oops.Bah("请验单据不能为空");
                }
                if (string.IsNullOrWhiteSpace(palletNo))
                {
                    throw Oops.Bah("托盘号不能为空");
                }
                var type = await GetSampleType2(palletNo);
                if (type != "0")
                {
                    throw Oops.Bah("当前托盘请在数量页签取样");
                }
                if (string.IsNullOrEmpty(boxNo))
                {
                    throw Oops.Bah("外箱条码不能为空");
                }
                //if (!string.IsNullOrEmpty(boxNo3) && !string.IsNullOrEmpty(pickQty) && int.Parse(pickQty) > 0)
                //{
                //    throw new Exception("追溯条码和拣货数量不能同时输入");
                //}
                //请验单
                var inspecd = await Db.Queryable<BllQualityInspectionRequest>().FirstAsync(m => m.IsDel == "0" && m.QcNo == qcNo);
                if (inspecd == null)
                {
                    throw Oops.Bah("未查询到请验单信息");
                }
                if (inspecd.Status == "0" || inspecd.Status == "3")
                {
                    throw Oops.Bah("请验单状态错误,请核实");
                }
                //库存明细信息
                var stockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNo && m.SkuNo == inspecd.SkuNo && m.LotNo == inspecd.LotNo);
                if (stockDetail == null)
                {
                    throw Oops.Bah("未在库存中查询出当前托盘信息");
                }
                if (!string.IsNullOrWhiteSpace(stockDetail.LocatNo))
                {
                    throw Oops.Bah("当前托盘不是库外托盘,请核实");
                }
                //箱支信息
                var boxInfoList = await Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.StockDetailId == stockDetail.Id && m.BoxNo == boxNo).ToListAsync();
                //库存总表
                var stock = await Db.Queryable<DataStock>().FirstAsync(m => m.IsDel == "0" && m.SkuNo == inspecd.SkuNo && m.LotNo == inspecd.LotNo);
                if (stock == null)
                {
                    throw Oops.Bah("未查询出库存总信息");
                }
                //入库单
                var notice = await Db.Queryable<BllArrivalNotice>().FirstAsync(m => m.IsDel == "0" && m.ASNNo == inspecd.ASNNo);
                if (notice == null)
                {
                    throw Oops.Bah("未查询到入库单信息");
                }
                #endregion
                //取样明细记录表
                var sampld = await Db.Queryable<BllSamplingDetails>().Where(m => m.IsDel == "0" && m.QcNo == qcNo).ToListAsync();
                var isAddSampld = false;
                var PickType = ""; //0数量拣货  1 箱支拣货
                var EditboxInfo = new DataBoxInfo();
                var EditboxInfoList = new List<DataBoxInfo>();
                #region 判断拣货方式 散支 数量
                if (!string.IsNullOrEmpty(pickQty) && decimal.Parse(pickQty) > 0) //数量拣货
                {
                    PickType = "0";
                    if (!string.IsNullOrWhiteSpace(boxNo3)) //支中拣数量
                    {
                        if (boxInfoList.Count(m => m.BoxNo3 == boxNo3) == 0)
                        {
                            throw Oops.Bah("未查询到支码信息");
                        }
                        if (boxInfoList.Count(m => m.BoxNo3 == boxNo3) > 1)
                        {
                            throw Oops.Bah("支码信息数据信息错误,请核实");
                        }
                        EditboxInfo = await Db.Queryable<DataBoxInfo>().FirstAsync(m => m.IsDel == "0" && m.StockDetailId == stockDetail.Id && m.BoxNo == boxNo && m.BoxNo3 == boxNo3);
                        if (EditboxInfo.Qty < decimal.Parse(pickQty))
                        {
                            throw Oops.Bah("拣货数量不能大于箱内数量");
                        }
                        isAddSampld = sampld.Count(m => m.PalletNo == palletNo && m.BoxNo == EditboxInfo.BoxNo && m.BoxNo3 == EditboxInfo.BoxNo3) == 0;
                    }
                    else //箱中拣数量
                    {
                        if (boxInfoList.Count == 0)
                        {
                            throw Oops.Bah("未在托盘上查询到箱码信息,请核实");
                        }
                        if (boxInfoList.Count > 1)
                        {
                            throw Oops.Bah("箱码数据信息错误,请核实");
                        }
                        if (boxInfoList.Count(m => !string.IsNullOrWhiteSpace(m.BoxNo3)) > 0)
                        {
                            throw Oops.Bah("当前箱码中含有支码,请输入支码信息取样");
                        }
                        EditboxInfo = await Db.Queryable<DataBoxInfo>().FirstAsync(m => m.IsDel == "0" && m.StockDetailId == stockDetail.Id && m.BoxNo == boxNo);
                        if (EditboxInfo.Qty < decimal.Parse(pickQty))
                        {
                            throw Oops.Bah("拣货数量不能大于箱内数量");
                        }
                        isAddSampld = sampld.Count(m => m.PalletNo == palletNo && m.BoxNo == EditboxInfo.BoxNo) == 0;
                    }
                    if (sampld.Sum(m => m.CompleteQty) + decimal.Parse(pickQty) > inspecd.SamplingQty)
                    {
                        throw Oops.Bah("取样总拣货数量大于请验单取样数量");
                    }
                    //判断箱中是否含有支码,有:不让拣数量
                    if (stockDetail.Qty - stockDetail.LockQty - stockDetail.FrozenQty < decimal.Parse(pickQty))
                    {
                        throw Oops.Bah("托盘上可用数量小于取样数量,请核实锁定、冻结数量");
                    }
                }
                else //箱支拣货
                {
                    PickType = "1";
                    var qty = 0m;
                    if (!string.IsNullOrWhiteSpace(boxNo3)) //拣支
                    {
                        if (boxInfoList.Count(m => m.BoxNo3 == boxNo3) == 0)
                        {
                            throw Oops.Bah("未查询到支码信息");
                        }
                        if (boxInfoList.Count(m => m.BoxNo3 == boxNo3) > 1)
                        {
                            throw Oops.Bah("支码数据信息错误,请核实");
                        }
                        EditboxInfoList = await Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.StockDetailId == stockDetail.Id && m.BoxNo == boxNo && m.BoxNo3 == boxNo3).ToListAsync();
                        if (EditboxInfoList.Sum(m => m.Qty) + sampld.Sum(m => m.CompleteQty) > inspecd.SamplingQty)
                        {
                            throw Oops.Bah("取样总拣货数量大于请验单取样数量");
                        }
                        qty = EditboxInfoList.Sum(m => m.Qty);
                        //isAddSampld = sampld.Count(m => m.PalletNo == palletNo && m.BoxNo == EditboxInfo.BoxNo && m.BoxNo3 == EditboxInfo.BoxNo3) == 0;
                    }
                    else //拣箱
                    {
                        if (boxInfoList.Count == 0)
                        {
                            throw Oops.Bah("未在托盘上查询到箱码信息,请核实");
                        }
                        if (boxInfoList.Count > 1)
                        {
                            throw Oops.Bah("箱码数据信息错误,请核实");
                        }
                        if (boxInfoList.Count(m => !string.IsNullOrWhiteSpace(m.BoxNo3)) > 0)
                        {
                            throw Oops.Bah("当前箱码中含有支码,请输入支码信息取样");
                        }
                        EditboxInfoList = await Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.StockDetailId == stockDetail.Id && m.BoxNo == boxNo).ToListAsync();
                        if (EditboxInfo.Qty < decimal.Parse(pickQty))
                        {
                            throw Oops.Bah("拣货数量不能大于箱内数量");
                        }
                        qty = EditboxInfoList.Sum(m => m.Qty);
                        //isAddSampld = sampld.Count(m => m.PalletNo == palletNo && m.BoxNo == EditboxInfo.BoxNo) == 0;
                    }
                    if (sampld.Sum(m => m.CompleteQty) + qty > inspecd.SamplingQty)
                    {
                        throw Oops.Bah("取样总拣货数量大于请验单取样数量");
                    }
                    if (stockDetail.Qty - stockDetail.LockQty - stockDetail.FrozenQty < qty)
                    {
                        throw Oops.Bah("托盘上可用数量小于取样数量,请核实锁定、冻结数量");
                    }
                }
                #endregion
                Db.BeginTran();
                #region
                if (PickType == "0")
                {
                    #region 添加或修改取样明细
                    var boxInfo = EditboxInfo;
                    //if (isAddSampld) //添加取样明细
                    //{
                    var sampleDetail = new BllSamplingDetails()
                    {
                        QcNo = qcNo,
                        ASNNo = inspecd.ASNNo,
                        PalletNo = palletNo,
                        BoxNo = boxInfo.BoxNo,
                        BoxNo2 = boxInfo.BoxNo2,
                        BoxNo3 = boxInfo.BoxNo3,
                        SkuNo = boxInfo.SkuNo,
                        SkuName = boxInfo.SkuName,
                        Standard = boxInfo.Standard,
                        LotNo = boxInfo.LotNo,
                        SupplierLot = boxInfo.SupplierLot,
                        CompleteQty = decimal.Parse(pickQty),
                        CreateTime = DateTime.Now,
                        CreateUser = userId
                    };
                    Db.Insertable(sampleDetail).ExecuteCommand();
                    //}
                    //else
                    //{
                    //    var sampldFirst = sampld.First(m => m.PalletNo == palletNo && m.BoxNo == boxInfo.BoxNo);
                    //    if (!string.IsNullOrWhiteSpace(boxNo3))
                    //    {
                    //        sampldFirst = sampld.First(m => m.PalletNo == palletNo && m.BoxNo == boxInfo.BoxNo && m.BoxNo3 == boxInfo.BoxNo3);
                    //    }
                    //    sampldFirst.CompleteQty += decimal.Parse(pickQty);
                    //    sampldFirst.UpdateTime = DateTime.Now;
                    //    sampldFirst.UpdateUser = userId;
                    //    Db.Updateable(sampldFirst).ExecuteCommand();
                    //}
                    #endregion
                    #region 修改库存三表
                    //拆包有效期更改
                    var unpackWarranty = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == inspecd.SkuNo).UnpackWarranty;
                    foreach (var item in boxInfoList)
                    {
                        item.BitBoxMark = "1";
                        item.InspectMark = "1";
                        if (unpackWarranty > 0 && boxInfoList.Count(m => m.ProductionTime != null) > 0)
                        {
                            if (item.ProductionTime != null)
                            {
                                var time = DateTime.Parse(item.ProductionTime.ToString()).AddDays((double)unpackWarranty);
                                if (time < item.ExpirationTime)
                                {
                                    item.ExpirationTime = time;
                                }
                            }
                        }
                    }
                    Db.Updateable(boxInfoList).ExecuteCommand();
                    //库存箱码
                    boxInfo.Qty -= decimal.Parse(pickQty);
                    if (boxInfo.Qty == 0)
                    {
                        Db.Deleteable(boxInfo).ExecuteCommand();
                    }
                    else
                    {
                        Db.Updateable(boxInfo).ExecuteCommand();
                    }
                    //库存明细
                    stockDetail.Qty -= decimal.Parse(pickQty);
                    if (stockDetail.Qty == 0)
                    {
                        Db.Deleteable(stockDetail).ExecuteCommand();
                    }
                    else
                    {
                        Db.Updateable(stockDetail).ExecuteCommand();
                    }
                    //库存总表
                    stock.Qty -= decimal.Parse(pickQty);
                    if (stock.Qty == 0)
                    {
                        Db.Deleteable(stock).ExecuteCommand();
                    }
                    else
                    {
                        Db.Updateable(stock).ExecuteCommand();
                    }
                    #endregion
                    #region 修改入库单
                    //不是上传完毕的修改取样状态
                    if (notice.Status != "4")
                    {
                        var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.ASNNo == inspecd.ASNNo && m.SkuNo == inspecd.SkuNo && m.LotNo == inspecd.LotNo);
                        if (noticeDetail.IsSampling == "0")
                        {
                            noticeDetail.IsSampling = "1";
                            Db.Updateable(noticeDetail).ExecuteCommand();
                        }
                    }
                    #endregion
                    #region 修改请验单
                    inspecd.Status = "2";
                    inspecd.UpdateTime = DateTime.Now;
                    if (sampld.Sum(m => m.CompleteQty) + decimal.Parse(pickQty) >= inspecd.SamplingQty)
                    {
                        inspecd.Status = "3";
                    }
                    Db.Updateable(inspecd).ExecuteCommand();
                    #endregion
                }
                else
                {
                    var sumQty = 0m;
                    foreach (var boxInfo in EditboxInfoList)
                    {
                        #region 添加或修改取样明细
                        //if (isAddSampld) //添加取样明细
                        //{
                        var sampleDetail = new BllSamplingDetails()
                        {
                            QcNo = qcNo,
                            ASNNo = inspecd.ASNNo,
                            PalletNo = palletNo,
                            BoxNo = boxInfo.BoxNo,
                            BoxNo2 = boxInfo.BoxNo2,
                            BoxNo3 = boxInfo.BoxNo3,
                            SkuNo = boxInfo.SkuNo,
                            SkuName = boxInfo.SkuName,
                            Standard = boxInfo.Standard,
                            LotNo = boxInfo.LotNo,
                            SupplierLot = boxInfo.SupplierLot,
                            CompleteQty = boxInfo.Qty,
                            CreateTime = DateTime.Now,
                            CreateUser = userId
                        };
                        await Db.Insertable(sampleDetail).ExecuteCommandAsync();
                        //}
                        //else
                        //{
                        //    var sampldFirst = sampld.First(m => m.PalletNo == palletNo && m.BoxNo == boxInfo.BoxNo);
                        //    if (!string.IsNullOrWhiteSpace(boxNo3))
                        //    {
                        //        sampldFirst = sampld.First(m => m.PalletNo == palletNo && m.BoxNo == boxInfo.BoxNo && m.BoxNo3 == boxInfo.BoxNo3);
                        //    }
                        //    sampldFirst.CompleteQty += boxInfo.Qty;
                        //    sampldFirst.UpdateTime = DateTime.Now;
                        //    sampldFirst.UpdateUser = userId;
                        //    Db.Updateable(sampldFirst).ExecuteCommand();
                        //}
                        #endregion
                        #region 修改库存三表
                        //拆包有效期更改
                        var unpackWarranty = (await Db.Queryable<SysMaterials>().FirstAsync(m => m.IsDel == "0" && m.SkuNo == inspecd.SkuNo)).UnpackWarranty;
                        foreach (var item in boxInfoList)
                        {
                            item.BitBoxMark = "1";
                            item.InspectMark = "1";
                            if (unpackWarranty > 0 && boxInfoList.Count(m => m.ProductionTime != null) > 0)
                            {
                                if (item.ProductionTime != null)
                                {
                                    var time = DateTime.Parse(item.ProductionTime.ToString()).AddDays((double)unpackWarranty);
                                    if (time < item.ExpirationTime)
                                    {
                                        item.ExpirationTime = time;
                                    }
                                }
                            }
                        }
                        await Db.Updateable(boxInfoList).ExecuteCommandAsync();
                        //库存箱码
                        await Db.Deleteable(boxInfo).ExecuteCommandAsync();
                        //库存明细
                        stockDetail.Qty -= boxInfo.Qty;
                        if (stockDetail.Qty == 0)
                        {
                            await Db.Deleteable(stockDetail).ExecuteCommandAsync();
                        }
                        else
                        {
                            await Db.Updateable(stockDetail).ExecuteCommandAsync();
                        }
                        //库存总表
                        stock.Qty -= boxInfo.Qty;
                        if (stock.Qty == 0)
                        {
                            await Db.Deleteable(stock).ExecuteCommandAsync();
                        }
                        else
                        {
                            await Db.Updateable(stock).ExecuteCommandAsync();
                        }
                        #endregion
                        #region 修改入库单
                        //不是上传完毕的修改取样状态
                        if (notice.Status != "4")
                        {
                            var noticeDetail = await Db.Queryable<BllArrivalNoticeDetail>().FirstAsync(m => m.IsDel == "0" && m.ASNNo == inspecd.ASNNo && m.SkuNo == inspecd.SkuNo && m.LotNo == inspecd.LotNo);
                            if (noticeDetail.IsSampling == "0")
                            {
                                noticeDetail.IsSampling = "1";
                                await Db.Updateable(noticeDetail).ExecuteCommandAsync();
                            }
                        }
                        #endregion
                        sumQty += boxInfo.Qty;
                    }
                    #region 修改请验单
                    inspecd.Status = "2";
                    inspecd.UpdateTime = DateTime.Now;
                    if (sampld.Sum(m => m.CompleteQty) + sumQty >= inspecd.SamplingQty)
                    {
                        inspecd.Status = "3";
                    }
                    await Db.Updateable(inspecd).ExecuteCommandAsync();
                    #endregion
                }
                #endregion
                //添加操作日志记录
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "取样拣货", qcNo, "拣货", $"在PDA上对请验单号为:{qcNo}的托盘码为:{palletNo}的拣货操作", userId);
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw e;
            }
        }
        //取样出库拣货(数量)
        public async Task SampleSetQtyPick(string qcNo, string palletNo, string pickQty, int userId)
        {
            try
            {
                #region 判断
                if (string.IsNullOrWhiteSpace(qcNo))
                {
                    throw Oops.Bah("请验单据不能为空");
                }
                if (string.IsNullOrWhiteSpace(palletNo))
                {
                    throw Oops.Bah("托盘号不能为空");
                }
                var type = await GetSampleType2(palletNo);
                if (type != "1")
                {
                    throw Oops.Bah("当前托盘请在标签页签取样");
                }
                if (string.IsNullOrWhiteSpace(pickQty))
                {
                    throw Oops.Bah("拣货数量不能为空");
                }
                if (decimal.Parse(pickQty) <= 0)
                {
                    throw Oops.Bah("拣货数量不能小于等于0");
                }
                //请验单
                var inspecd = await Db.Queryable<BllQualityInspectionRequest>().FirstAsync(m => m.IsDel == "0" && m.QcNo == qcNo);
                if (inspecd == null)
                {
                    throw Oops.Bah("未查询到请验单信息");
                }
                if (inspecd.Status == "0" || inspecd.Status == "3")
                {
                    throw Oops.Bah("请验单状态错误,请核实");
                }
                //库存明细信息
                var stockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNo
                && m.SkuNo == inspecd.SkuNo && m.LotNo == inspecd.LotNo);
                if (stockDetail == null)
                {
                    throw Oops.Bah("未在库存中查询出当前托盘信息");
                }
                // 判断托盘是否在库内
                if (!string.IsNullOrWhiteSpace(stockDetail.LocatNo))
                {
                    var wareHouseData = await Db.Queryable<SysWareHouse>().FirstAsync(m => m.IsDel == "0" && m.WareHouseNo == stockDetail.WareHouseNo);
                    if (wareHouseData.Type != "2")
                    {
                        throw Oops.Bah("当前托盘不是库外托盘,请核实");
                    }
                }
                //库存总表
                var stock = await Db.Queryable<DataStock>().FirstAsync(m => m.IsDel == "0" && m.SkuNo == inspecd.SkuNo && m.LotNo == inspecd.LotNo);
                if (stock == null)
                {
                    throw Oops.Bah("未查询出库存总信息");
                }
                //入库单
                var notice = await Db.Queryable<BllArrivalNotice>().FirstAsync(m => m.IsDel == "0" && m.ASNNo == inspecd.ASNNo);
                if (notice == null)
                {
                    throw Oops.Bah("未查询到入库单信息");
                }
                #endregion
                //取样明细记录表
                var sampld = await Db.Queryable<BllSamplingDetails>().Where(m => m.IsDel == "0" && m.QcNo == qcNo).ToListAsync();
                var qty = decimal.Parse(pickQty);
                //var isAddSampld = sampld.Count(m => m.PalletNo == palletNo) == 0;
                #region 判断数量
                if (sampld.Sum(m => m.CompleteQty) + qty > inspecd.SamplingQty)
                {
                    throw Oops.Bah("取样总拣货数量大于请验单取样数量");
                }
                //判断箱中是否含有支码,有:不让拣数量
                if (stockDetail.Qty - stockDetail.LockQty - stockDetail.FrozenQty < qty)
                {
                    throw Oops.Bah("托盘上可用数量小于取样数量,请核实锁定、冻结数量");
                }
                #endregion
                #region 添加或修改取样明细
                Db.BeginTran();
                //if (isAddSampld) //添加取样明细
                //{
                var sampleDetail = new BllSamplingDetails()
                {
                    QcNo = qcNo,
                    ASNNo = inspecd.ASNNo,
                    PalletNo = palletNo,
                    SkuNo = stockDetail.SkuNo,
                    SkuName = stockDetail.SkuName,
                    Standard = stockDetail.Standard,
                    LotNo = stockDetail.LotNo,
                    SupplierLot = stockDetail.SupplierLot,
                    CompleteQty = qty,
                    CreateTime = DateTime.Now,
                    CreateUser = userId
                };
                await Db.Insertable(sampleDetail).ExecuteCommandAsync();
                //}
                //else
                //{
                //    var sampldFirst = sampld.First(m => m.PalletNo == palletNo);
                //    sampldFirst.CompleteQty += qty;
                //    sampldFirst.UpdateTime = DateTime.Now;
                //    sampldFirst.UpdateUser = userId;
                //    Db.Updateable(sampldFirst).ExecuteCommand();
                //}
                #endregion
                #region 修改库存三表
                //库存明细
                stockDetail.Qty -= qty;
                if (stockDetail.Qty == 0)
                {
                    await Db.Deleteable(stockDetail).ExecuteCommandAsync();
                }
                else
                {
                    stockDetail.BitPalletMark = "1";
                    stockDetail.InspectMark = "1";
                    await Db.Updateable(stockDetail).ExecuteCommandAsync();
                }
                //库存总表
                stock.Qty -= qty;
                if (stock.Qty == 0)
                {
                    await Db.Deleteable(stock).ExecuteCommandAsync();
                }
                else
                {
                    await Db.Updateable(stock).ExecuteCommandAsync();
                }
                #endregion
                #region 修改入库单
                //不是上传完毕的修改取样状态
                if (notice.Status != "4")
                {
                    var noticeDetail = await Db.Queryable<BllArrivalNoticeDetail>().FirstAsync(m => m.IsDel == "0" && m.ASNNo == inspecd.ASNNo && m.SkuNo == inspecd.SkuNo && m.LotNo == inspecd.LotNo);
                    if (noticeDetail.IsSampling == "0")
                    {
                        noticeDetail.IsSampling = "1";
                        await Db.Updateable(noticeDetail).ExecuteCommandAsync();
                    }
                }
                #endregion
                #region 修改请验单
                inspecd.Status = "2";
                inspecd.UpdateTime = DateTime.Now;
                if (sampld.Sum(m => m.CompleteQty) + qty >= inspecd.SamplingQty)
                {
                    inspecd.Status = "3";
                }
                await Db.Updateable(inspecd).ExecuteCommandAsync();
                #endregion
                //添加操作日志记录
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "取样拣货", qcNo, "拣货", $"在PDA上对请验单号为:{qcNo}的托盘码为:{palletNo}的拣货操作", userId);
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw e;
            }
        }
        #endregion
Wms/WMS.BLL/BllQualityServer/InspectionRequestServer.cs
@@ -358,97 +358,7 @@
                    var Locats = Db.Queryable<SysStorageLocat>()
                        .Where(m => m.LocatNo == pallet.LocatNo && m.WareHouseNo == pallet.WareHouseNo 
                        && m.IsDel == "0").ToList().FirstOrDefault();
                    if (Locats.Depth == "02")
                    {
                        // 获取外侧储位地址
                        string locatNo = Locats.LocatNo.Substring(0, 6) + "01";
                        var Locatwc = Db.Queryable<SysStorageLocat>()
                        .Where(m => m.LocatNo == locatNo && m.WareHouseNo == pallet.WareHouseNo
                        && m.IsDel == "0").ToList().FirstOrDefault();
                        if (Locatwc.Status == "1")
                        {
                            // 外侧有货物
                            var Locatwcsku = Db.Queryable<DataStockDetail>()
                                .Where(m => m.LocatNo == locatNo
                                && m.IsDel == "0"
                                && m.WareHouseNo== Locatwc.WareHouseNo).ToList().FirstOrDefault();
                            // 获取移库地址
                            var newSlot = com.MoveAddress(locatNo, Locatwc.RoadwayNo, Locatwcsku.SkuNo);
                            var taskNo1 = new Common().GetMaxNo("TK");
                            var exTask1 = new LogTask();    //出库任务
                            exTask1.TaskNo = taskNo1;
                            exTask1.Sender = "WMS";
                            exTask1.Receiver = "WCS";
                            exTask1.IsSuccess = 0;                  //是否下发成功 0失败 1成功
                            exTask1.StartLocat = locatNo;           //起始位置
                            exTask1.PalletNo = Locatwcsku.PalletNo; //托盘码
                            exTask1.IsSend = 1;//是否可再次下发
                            exTask1.IsCancel = 1;//是否可取消
                            exTask1.IsFinish = 1;//是否可完成
                            exTask1.Status = "0";//任务状态0:等待执行1正在执行2执行完成
                            exTask1.OrderType = "4";    //0 入库单 1 出库单  2 盘点单  3 移库单 4 取样出库单
                            OutCommandDto taskModel = new OutCommandDto();
                            taskModel.TaskNo = com.GetMaxNo("TK");      // 任务号
                            taskModel.StartRoadway = Locatwc.RoadwayNo;
                            taskModel.PalletNo = Locatwcsku.PalletNo;       // 托盘号
                            taskModel.StartLocate = locatNo;                // 起始位置
                            taskModel.Order = 1;
                            if (newSlot == "")
                            {
                                exTask1.EndLocat = model.Code;          //目标位置
                                exTask1.Type = "1";                     //任务类型 0 入库任务 1 出库任务  2 移库任务
                                exTask1.Msg = Locats.LocatNo +"托盘出库创建的"+locatNo + "托盘的出库任务";
                                // 没有多余的空储位
                                taskModel.EndLocate = model.Code;           // 出库口
                                taskModel.EndRoadway = "";                  // 目标巷道
                                taskModel.TaskType = "1";// 任务类型 (出库)
                                taskModel.OutMode = model.Code;  //目标地址
                                // 更新储位地址
                                Locatwc.Status = "3";
                                Db.Updateable(Locatwc).ExecuteCommand();
                            }
                            else
                            {
                                // 获取移库巷道号
                                var Locatyk = Db.Queryable<SysStorageLocat>()
                                    .Where(m => m.LocatNo == newSlot && m.WareHouseNo == pallet.WareHouseNo
                                    && m.IsDel == "0").ToList().FirstOrDefault();
                                exTask1.EndLocat = newSlot;          //目标位置
                                exTask1.Type = "2";                     //任务类型 0 入库任务 1 出库任务  2 移库任务
                                exTask1.Msg = Locats.LocatNo + "托盘出库创建的" + locatNo + "托盘的移库任务";
                                taskModel.EndLocate = newSlot;              // 目标地址
                                taskModel.EndRoadway = Locatyk.RoadwayNo;   // 目标巷道
                                taskModel.TaskType = "2";                   // 任务类型 (移库)
                                taskModel.OutMode = newSlot;
                                // 更新储位地址
                                Locatwc.Status = "5";               // 移出中
                                Locatyk.Status = "4";               // 移入中
                                Db.Updateable(Locatyk).ExecuteCommand();
                            }
                            Db.Updateable(Locatwc).ExecuteCommand();
                            // 插入任务日志
                            Db.Insertable(exTask1).ExecuteCommand();
                            outWhs.Add(taskModel);
                        }
                        if (Locatwc.Status == "2" || Locatwc.Status == "4")
                        {
                            numberQty = numberQty + pallet.Qty;
                            continue;
                        }
                    }
                    var Locats2 = Db.Queryable<SysStorageLocat>().Where(m => m.LocatNo == model.Code && m.IsDel == "0").ToList().FirstOrDefault();
                    var taskNo2 = new Common().GetMaxNo("TK");
                    var exTask2 = new LogTask();    //出库任务
@@ -464,7 +374,7 @@
                    exTask2.Status = "0";//任务状态0:等待执行1正在执行2执行完成
                    exTask2.OrderType = "4";    //0 入库单 1 出库单  2 盘点单  3 移库单 4 取样出库单
                    exTask2.EndLocat = model.Code;          //目标位置
                    exTask2.Type = "1";                     //任务类型 0 入库任务 1 出库任务  2 移库任务
                    exTask2.Type = "2";                     //任务类型 0 入库任务 1 出库任务  2 移库任务
                    exTask2.Msg = pallet.LocatNo + "托盘出库任务";
                    // 插入任务日志
                    Db.Insertable(exTask2).ExecuteCommand();
@@ -476,42 +386,46 @@
                    taskModel1.Order = 1;
                    taskModel1.EndLocate = model.Code;           // 目标地址
                    taskModel1.EndRoadway = "";                  // 目标巷道 
                    taskModel1.TaskNo = com.GetMaxNo("TK");      // 任务号
                    taskModel1.TaskType = "1";// 任务类型 (出库)
                    taskModel1.OutMode = model.Code;
                    taskModel1.TaskNo = taskNo2;      // 任务号
                    taskModel1.TaskType = "2";// 任务类型 (出库)
                    taskModel1.Type = PLCTypeEnum.AGV;
                    // 更新储位状态
                    Locats.Status = "3";
                    Locats.Status = "5";
                    Db.Updateable(Locats).ExecuteCommand();
                    Locats2.Status = "4";
                    Db.Updateable(Locats2).ExecuteCommand();
                    outWhs.Add(taskModel1);
                }
                    // 向WCS下发出库任务
                    if (outWhs.Count > 0)
                    {
                        // 正式运行程序放开
                        var list2 = outWhs.Select(m => m.TaskNo).ToList();
                        var jsonData = JsonConvert.SerializeObject(outWhs);
                        //string response = "";
                    string response = "";
                        try
                        {
                            //var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                            //response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS");
                            //var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                        var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                        response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS");
                        var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                            ////解析返回数据
                            //var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response);
                            //if (wcsModel.StatusCode == 0)
                            //{
                            //    //更改任务的发送返回时间//
                                //new TaskServer().EditTaskIssueOk(list2, time1, time2);
                            //}
                            //if (wcsModel.StatusCode == -1)
                            //{
                            //    new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.Msg);
                            //    throw new Exception(wcsModel.Msg);
                            //}
                        //解析返回数据
                        var wcsModel = JsonConvert.DeserializeObject<WcsModel2>(response);
                        if (wcsModel.code == 200)
                        {
                            //更改任务的发送返回时间//
                            new TaskServer().EditTaskIssueOk(list2, time1, time2);
                        }
                        else
                        {
                            new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.message);
                            throw new Exception(wcsModel.message);
                        }
                        }
                        catch (Exception ex)
                        {
@@ -519,8 +433,6 @@
                        }
                    }
                }
                //添加操作日志记录
                var k = new OperationCrServer()
                    .AddLogOperationCr("质量管理", "质检请验", data.QcNo, "出库", $"点击了出库操作;请验单:{data.QcNo}!", userId);
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -4330,12 +4330,12 @@
                try
                {
                    task.Status = "5";//任务状态
                    //判断起始目标位置都是平库
                    if (pingKuList.Contains(task.StartLocat) && pingKuList.Contains(task.EndLocat))
                    {
                    //task.Status = "5";//任务状态
                    ////判断起始目标位置都是平库
                    //if (pingKuList.Contains(task.StartLocat) && pingKuList.Contains(task.EndLocat))
                    //{
                        task.Status = "2";
                    }
                    //}
                    
                    task.IsSend = 0;
                    task.IsCancel = 0;
Wms/WMS.BLL/HttpServer.cs
@@ -6,6 +6,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Utility.Tools;
using WMS.BLL.Logic;
using WMS.BLL.LogServer;
using WMS.DAL;
@@ -30,10 +31,10 @@
        /// </summary>
        /// <param name="palletNo"></param>
        /// <param name="houseNo"></param>
        /// <param name="roadwayNo"></param>
        /// <param name="ceng"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public OutCommandDto RequestLocation(string palletNo, string houseNo)
        public OutCommandDto RequestLocation(string palletNo, string houseNo,string ceng)
        {
            try
            {
@@ -242,7 +243,7 @@
                    areaList.Add(item);
                }
                locate = allotLocate.GetSuiTableLocate(houseNo, areaList, "");
                locate = allotLocate.GetSuiTableLocate(houseNo, areaList, "",ceng);
                
                #endregion
@@ -1140,9 +1141,8 @@
            }
        }
        /// <summary>
        /// 移库任务完成JC34
        /// 移库单的 移库任务完成JC34 兼容AGV小车移库
        /// </summary>
        /// <param name="taskNo"></param>
        /// <param name="userId"></param>
@@ -1191,7 +1191,7 @@
                if (userId != 0)
                {
                    //添加操作日志记录
                    var k = new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId);
                    var k = new OperationASNServer().AddLogOperationAsn("库内作业", "库内日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId);
                }
                foreach (var item in stockDetail)
@@ -1245,6 +1245,410 @@
            }
        }
        /// <summary>
        /// 出库单的移库任务,JC34 货架托盘下架
        /// </summary>
        /// <param name="taskNo">任务号</param>
        /// <param name="userId">操作人</param>
        /// <exception cref="Exception"></exception>
        public void ExMoveSuccess(string taskNo, int userId)
        {
            try
            {
                //当前任务信息
                var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0");
                if (task == null)
                {
                    throw new Exception($"未查询到任务号为:‘{taskNo}’的任务信息");
                }
                if (task.Status == "2")
                {
                    throw new Exception("当前任务已完成");
                }
                Db.BeginTran();
                //库存中当前托盘的信息
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList();
                //当前任务中的目标储位信息
                //当前任务中的原储位
                var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.StartLocat);
                if (locate == null)
                {
                    throw new Exception($"WMS系统中没有该{task.StartLocat}储位对应的信息");
                }
                var locate2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.EndLocat);
                if (locate2 == null)
                {
                    throw new Exception($"WMS系统中没有该{task.EndLocat}储位对应的信息");
                }
                //平库中储位集合
                var pingKuLocate = Db.Queryable<SysStorageLocat>().Where(m => m.WareHouseNo == "W04" && m.IsDel == "0").ToList();
                var pingKuList = pingKuLocate.Select(m => m.LocatNo).ToList();
                try
                {
                    //task.Status = "5";//任务状态
                    ////判断起始目标位置都是平库
                    //if (pingKuList.Contains(task.StartLocat) && pingKuList.Contains(task.EndLocat))
                    //{
                    task.Status = "2";
                    //}
                    task.IsSend = 0;
                    task.IsCancel = 0;
                    task.IsFinish = 0;
                    task.FinishDate = DateTime.Now;//完成时间
                    Db.Updateable(task).ExecuteCommand();
                    #region 修改储位状态
                    if (!pingKuList.Contains(task.StartLocat))
                    {
                        //原储位改为空储位 0
                        locate.Status = "0";
                        Db.Updateable(locate).ExecuteCommand();
                    }
                    //目标储位改为有货物 1
                    locate2.Status = "1";
                    Db.Updateable(locate2).ExecuteCommand();
                    foreach (var item in stockDetail)
                    {
                        item.WareHouseNo = locate2.WareHouseNo;
                        item.AreaNo = locate2.AreaNo;
                        item.RoadwayNo = locate2.RoadwayNo;
                        item.LocatNo = locate2.LocatNo;
                    }
                    Db.Updateable(stockDetail).ExecuteCommand();
                    #endregion
                    Db.CommitTran();
                }
                catch (Exception ex)
                {
                    Db.RollbackTran();
                    throw new Exception(ex.Message);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("完成反馈失败:" + ex.Message);
            }
        }
        /// <summary>
        /// PDA下发出库
        /// </summary>
        /// <param name="soNo"></param>
        /// <param name="detailId"></param>
        /// <param name="outMode"></param>
        /// <param name="userId"></param>
        /// <param name="url"></param>
        /// <param name="str"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public List<OutCommandDto> IssueOutHouseLk(string soNo, string detailId,string outMode, int userId, string url, out string str)
        {
            try
            {
                var outDto1 = new List<OutCommandDto>(); //出库数据的集合(深度为1的储位)
                //记录错误信息的集合 //1:当前要出库的储位正在移出、2 出库的托盘储位信息错误(在储位表中未查询到)、3储位损坏不能出库、4 要出库的托盘正在入库
                var com = new Common();
                var notice = Db.Queryable<BllExportNotice>().First(m => m.SONo == soNo && m.IsDel == "0");
                if (notice == null)
                {
                    throw new Exception($"未找到{soNo}出库单信息");
                }
                if (notice.WareHouseNo != "W02")
                {
                    throw new Exception("仓库号错误");
                }
                var intDetailId = int.Parse(detailId);
                if (intDetailId <=0)
                {
                    throw new Exception("选择的出库单明细参数错误");
                }
                //所有要出库的出库分配信息(未下发的信息和待拣货的信息)
                var item = Db.Queryable<BllExportAllot>().First(a => a.IsDel == "0" && a.SONo == soNo && a.SODetailNo == intDetailId && a.Status == "0" );
                if (item == null) //判断是否有需要下发的出库流水
                {
                    throw new Exception("当前出库单据无需要下发的托盘");
                }
                #region 集合
                //要出库的明细集合
                var outStockDetail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == item.PalletNo).ToList();
                //物料编码表
                var skuList = Db.Queryable<SysMaterials>().Where(w => w.IsDel == "0");
                //包装表
                var packagList = Db.Queryable<SysPackag>().Where(w => w.IsDel == "0");
                Db.BeginTran();
                try
                {
                    List<LogTask> logTaskList = new List<LogTask>();//此次出库任务集合,为应对同托盘不同物料出库
                    var i = 0;
                    str = string.Empty;
                    var outLocatelist1 = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.AreaNo == "B02" && m.Flag == "0").ToList();
                    var outLocatelist2 = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.AreaNo == "B05" && m.Flag == "0").ToList();
                    //循环分配的信息生成出库任务
                    var outModeLocate = outMode;
                    var taskNoStr = "";
                    // 储位号
                    var locateNo = outStockDetail.First(m => m.PalletNo == item.PalletNo).LocatNo;
                    #region 判断
                    //判断托盘是否在库内
                    if (string.IsNullOrWhiteSpace(locateNo)) //库外
                    {
                        //判断托盘是否在入库中
                        var imBl = com.GetImTask(item.PalletNo);
                        if (imBl != null)
                        {
                            str = "要出库的托盘正在入库";
                            return outDto1;
                        }
                        //判断是否是已经出过库又回库
                        if (item.Status == "0")
                        {
                            //如果不在仓库内,当前分配信息直接更新出库完成
                            item.Status = "2";//状态
                            item.OutMode = outModeLocate;//出库口
                            Db.Updateable(item).ExecuteCommand();
                            var noticeDetail = Db.Queryable<BllExportNoticeDetail>().First(m => m.IsDel == "0" && m.Id == item.SODetailNo);
                            if (noticeDetail != null) //更新出库单据的下发数量
                            {
                                noticeDetail.FactQty += item.Qty;
                                Db.Updateable(noticeDetail).ExecuteCommand();
                            }
                            //var notice2 = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == item.SONo);
                            if (notice.Status == "0" || notice.Status == "1" || notice.Status == "2")
                            {
                                var detailList = Db.Queryable<BllExportNoticeDetail>().Where(m => m.IsDel == "0" && m.SONo == item.SONo).ToList();
                                if (detailList.Count(m => m.Qty >= m.AllotQty) > 0)
                                {
                                    notice.Status = "3"; //变更状态为正在执行
                                    Db.Updateable(notice).ExecuteCommand();
                                }
                            }
                            str = "要出库的托盘已在库外";
                            return outDto1;
                        }
                        str = "要出库的托盘正在入库";
                        return outDto1;
                    }
                    var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0");//当前出库的储位信息
                    if (locate == null)
                    {
                        str = "出库的托盘储位信息错误(在储位表中未查询到)";
                        return outDto1;
                    }
                    //判断储位标志是否为损坏
                    if (locate.Flag == "2")
                    {
                        str = "储位损坏不能出库";
                        return outDto1;
                    }
                    #endregion
                    if (locate.Status == "1") //有物品
                    {
                        #region 添加出库任务
                        var taskNo = new Common().GetMaxNo("TK");
                        var exTask = new LogTask    //出库任务
                        {
                            TaskNo = taskNo,
                            Sender = "WMS",
                            Receiver = "WCS",
                            IsSuccess = 0, //是否下发成功 0失败 1成功
                            StartLocat = locate.LocatNo,//起始位置
                            EndLocat = outModeLocate,//目标位置
                            PalletNo = item.PalletNo,//托盘码
                            IsSend = 1,//是否可再次下发
                            IsCancel = 1,//是否可取消
                            IsFinish = 1,//是否可完成
                            Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                            Status = "0",//任务状态0:等待执行1正在执行2执行完成
                            OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                            Msg = "从" + locate.LocatNo + "到" + outModeLocate + "的出库任务", //关键信息
                        };
                        Db.Insertable(exTask).ExecuteCommand();
                        logTaskList.Add(exTask);
                        outDto1.Add(new OutCommandDto()
                        {
                            TaskNo = exTask.TaskNo, // 任务号
                            TaskType = "1",// 任务类型 (出库)0入 1出 2移
                            PalletNo = item.PalletNo,//托盘号
                            StartLocate = locate.LocatNo, // 起始位置
                            StartRoadway = locate.RoadwayNo,//其实巷道
                            EndLocate = outModeLocate, // 目标位置
                            Order = 999,
                            Type = PLCTypeEnum.AGV
                        });
                        taskNoStr = exTask.TaskNo;
                        #endregion
                        #region 改变数据
                        if (item.Status == "0")//判断托盘是否下发过
                        {
                            var noticeDetail = Db.Queryable<BllExportNoticeDetail>().First(m => m.IsDel == "0" && m.Id == item.SODetailNo);
                            if (noticeDetail != null) //更新出库单据的下发数量
                            {
                                noticeDetail.FactQty += item.Qty;
                                Db.Updateable(noticeDetail).ExecuteCommand();
                            }
                            //var notice2 = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == item.SONo);
                            if (notice.Status == "0" || notice.Status == "1" || notice.Status == "2")
                            {
                                var detailList = Db.Queryable<BllExportNoticeDetail>().Where(m => m.IsDel == "0" && m.SONo == item.SONo).ToList();
                                if (detailList.Count(m => m.Qty >= m.AllotQty) > 0)
                                {
                                    notice.Status = "3"; //变更状态为正在执行
                                    Db.Updateable(notice).ExecuteCommand();
                                }
                            }
                        }
                        locate.Status = "3"; //要出库的储位改变状态 正在出库
                        Db.Updateable(locate).ExecuteCommand();
                        var locate2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == outModeLocate && m.IsDel == "0");//当前出库的目标储位信息
                        locate2.Status = "4";
                        Db.Updateable(locate2).ExecuteCommand();
                        item.TaskNo = taskNoStr; // 出库分配信息中更新任务号
                        item.Status = "1"; // 出库分配信息状态改为正在执行
                        //item.UnstackingMode = unstackingMode2;//拆垛方式
                        item.OutMode = outModeLocate;//出库口
                        //item.LoadingAddre = unstackingMode2 == "0" ? loadingAddre : "";//装车口
                        Db.Updateable(item).ExecuteCommand();
                        #endregion
                    }
                    else if (locate.Status == "3") //出库中
                    {
                        #region 改变数据
                        //判断是否是已经出过库又回库(状态为待拣货的 1)
                        if (item.Status == "0")
                        {
                            var noticeDetail = Db.Queryable<BllExportNoticeDetail>().First(m => m.IsDel == "0" && m.Id == item.SODetailNo);
                            if (noticeDetail != null) //更新出库单据的下发数量
                            {
                                noticeDetail.FactQty += item.Qty;
                                Db.Updateable(noticeDetail).ExecuteCommand();
                            }
                            //var notice2 = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == item.SONo);
                            if (notice.Status == "0" || notice.Status == "1" || notice.Status == "2")
                            {
                                var detailList = Db.Queryable<BllExportNoticeDetail>().Where(m => m.IsDel == "0" && m.SONo == item.SONo).ToList();
                                if (detailList.Count(m => m.Qty >= m.AllotQty) > 0)
                                {
                                    notice.Status = "3"; //变更状态为正在执行
                                    Db.Updateable(notice).ExecuteCommand();
                                }
                            }
                        }
                        var taskNo = Db.Queryable<LogTask>().First(m => m.OrderType == "1" && m.TaskNo != item.TaskNo && m.Status == "1" && m.PalletNo == item.PalletNo);
                        if (taskNo == null)
                        {
                            taskNo = logTaskList.FirstOrDefault(m => m.PalletNo == item.PalletNo);//当前有同托盘不同物料出库
                        }
                        if (taskNo == null)
                        {
                            throw new Exception($"托盘号:{item.PalletNo},出库异常");
                        }
                        item.TaskNo = taskNo.TaskNo;
                        item.Status = "1"; // 出库分配信息状态改为正在执行
                        item.OutMode = item.OutMode;//出库口
                        //item.UnstackingMode = unstackingMode2;//拆垛模式
                        Db.Updateable(item).ExecuteCommand();
                        #endregion
                    }
                    else if (locate.Status == "5") //移出中
                    {
                        str = "当前要出库的储位正在移出";
                        return outDto1;
                    }
                    //添加操作日志记录
                    var k = new OperationSOServer().AddLogOperationSo("PDA模块", "下发出库", soNo, "出库", $"点击出库按钮出库单号为:{soNo}的出库单", userId);
                    Db.CommitTran();
                    if (outDto1.Count > 0)
                    {
                        // 正式运行程序放开
                        var list2 = outDto1.Select(m => m.TaskNo).ToList();
                        var jsonData = JsonConvert.SerializeObject(outDto1);
                        string response = "";
                        try
                        {
                            var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                            response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS");
                            var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                            //解析返回数据
                            var wcsModel = JsonConvert.DeserializeObject<WcsModel2>(response);
                            if (wcsModel.code == 0)
                            {
                                //更改任务的发送返回时间//
                                new TaskServer().EditTaskIssueOk(list2, time1, time2);
                                str = "下发成功";
                            }
                            else
                            {
                                new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.message);
                                throw new Exception(wcsModel.message);
                            }
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                    return outDto1;
                }
                catch (Exception e)
                {
                    Db.RollbackTran();
                    throw new Exception(e.Message);
                }
                #endregion
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        #region MyRegion
Wms/WMS.BLL/Logic/AllotLocation.cs
@@ -292,10 +292,14 @@
        /// <param name="areaList">区域集合</param>
        /// <param name="roadwayNo">巷道号(可空)</param>
        /// <returns></returns>
        public SysStorageLocat GetSuiTableLocate(string houseNo, List<string> areaList,string roadwayNo = "")
        public SysStorageLocat GetSuiTableLocate(string houseNo, List<string> areaList,string roadwayNo = "",string ceng = "")
        {
            try
            {
                if (string.IsNullOrWhiteSpace(ceng))
                {
                    throw new Exception($"申请货架库位层数不能为空");
                }
                var db = DataContext.Db;
                /* 1.先判断仓库(立库或者平库)
                 * 2.如果是立库 再判断是否指定巷道号
@@ -334,7 +338,7 @@
                            //查询该巷道并且标志为正常的的储位
                            roadwayList.Add(roadway);
                            var locate = GetLocateByRoadways(roadwayList,areaList,true,houseNo);
                            var locate = GetLocateByRoadways(roadwayList,areaList,true,houseNo, ceng);
                            if (locate == null)
                            {
                                throw new Exception($"{roadwayNo}巷道没有合适的空储位");
@@ -346,7 +350,7 @@
                        {
                            var roadwayList = db.Queryable<SysStorageRoadway>().Where(m => m.WareHouseNo == houseNo && m.Status == "0" && roadList.Contains(m.RoadwayNo)).OrderBy(m => new { m.Priority, m.RoadwayNo }).ToList();
                            var locate = GetLocateByRoadways(roadwayList,areaList,false, houseNo);
                            var locate = GetLocateByRoadways(roadwayList,areaList,false, houseNo,ceng);
                            if (locate == null)
                            {
                                throw new Exception($"{houseNo}仓库已启用的巷道中没有合适的空储位");
@@ -380,7 +384,7 @@
        /// <param name="areaList">区域集合</param>
        /// <param name="isRoadway">是否指定巷道</param>
        /// <returns></returns>
        private SysStorageLocat GetLocateByRoadways(List<SysStorageRoadway> roadways,List<string> areaList,bool isRoadway = false ,string houseNo = "W02")
        private SysStorageLocat GetLocateByRoadways(List<SysStorageRoadway> roadways,List<string> areaList,bool isRoadway = false ,string houseNo = "W02",string ceng = "")
        {
            try
            {
@@ -469,7 +473,7 @@
                        var count = 0;
                        do
                        {
                            locate = GetLocateByRoadway(l.RoadwayNo, topOrBom, leftOrRight, areaList, list, ref count);
                            locate = GetLocateByRoadway(l.RoadwayNo, topOrBom, leftOrRight, areaList, list, ref count, ceng);
                            if (locate != null)
                            {
                                break;
@@ -503,7 +507,7 @@
                                var count = 0;
                                do
                                {
                                    locate = GetLocateByRoadway(log.RoadwayNo, topOrBom, leftOrRight, areaList, list, ref count);
                                    locate = GetLocateByRoadway(log.RoadwayNo, topOrBom, leftOrRight, areaList, list, ref count,ceng);
                                    if (locate != null)
                                    {
                                        break;
@@ -531,7 +535,7 @@
                        var count = 0;
                        do
                        {
                            locate = GetLocateByRoadway(item.RoadwayNo, topOrBom, leftOrRight, areaList, list, ref count);
                            locate = GetLocateByRoadway(item.RoadwayNo, topOrBom, leftOrRight, areaList, list, ref count,ceng);
                            if (locate != null)
                            {
                                break;
@@ -575,7 +579,7 @@
        /// <param name="areaList">区域集合</param>
        /// <param name="locateNoStr">排除的储位集合</param>
        /// <returns></returns>
        private SysStorageLocat GetLocateByRoadway(string roadwayNo, int topOrBom, int leftOrRight,List<string> areaList,List<string> locateNoStr,ref int count)
        private SysStorageLocat GetLocateByRoadway(string roadwayNo, int topOrBom, int leftOrRight,List<string> areaList,List<string> locateNoStr,ref int count,string ceng = "")
        {
            var db = DataContext.Db;
            var str = "";
@@ -596,7 +600,11 @@
            
            foreach (var area in areaList)
            {
                var sql = $@"select * from SysStorageLocat where IsDel = 0 and Flag = 0 and [Status] = 0 and RoadwayNo = '{roadwayNo}' and AreaNo = '{area}' and LocatNo not in({str}) ";
                var sql = $@"select * from SysStorageLocat where IsDel = 0 and Layer!= '3' and Flag = 0 and [Status] = 0 and RoadwayNo = '{roadwayNo}' and AreaNo = '{area}' and LocatNo not in({str}) ";
                if (!string.IsNullOrWhiteSpace(ceng))
                {
                    sql += $"and Layer = '{ceng}' ";
                }
                sql += "order by ";
                sql += topOrBom == 0 ? "Layer desc, " : "Layer, ";
                sql += leftOrRight == 0 ? "[Column], " : "[Column] desc, ";
Wms/WMS.Entity/LogEntity/LogTask.cs
@@ -128,7 +128,7 @@
        public int? IsFinish {get;set;}
        /// <summary>
        /// Desc:单据类型 0 入库单 1 出库单  2 盘点单  3 移库单 4视觉盘点
        /// Desc:单据类型 0 入库单 1 出库单  2 盘点单  3 移库单 4取样出库单
        /// Default:
        /// Nullable:True
        /// </summary>           
Wms/WMS.IBLL/IHttpServer.cs
@@ -15,8 +15,9 @@
        /// </summary>
        /// <param name="palletNo"></param>
        /// <param name="houseNo"></param>
        /// <param name="ceng"></param>
        /// <returns></returns>
        OutCommandDto RequestLocation(string palletNo, string houseNo);
        OutCommandDto RequestLocation(string palletNo, string houseNo,string ceng);
        /// <summary>
        /// 申请巷道(密集库)
@@ -56,7 +57,29 @@
        /// <param name="userId"></param>
        void MoveSuccess(string taskNo, int userId);
        /// <summary>
        /// 出库单的移库任务完成
        /// </summary>
        /// <param name="taskNo"></param>
        /// <param name="userId"></param>
        void ExMoveSuccess(string taskNo, int userId);
        //----------------------------------------------------------------------------------------------------------
        /// <summary>
        /// PDA下发出库
        /// </summary>
        /// <param name="soNo"></param>
        /// <param name="detailId"></param>
        /// <param name="outMode"></param>
        /// <param name="userId"></param>
        /// <param name="url"></param>
        /// <param name="str"></param>
        /// <returns></returns>
        List<OutCommandDto> IssueOutHouseLk(string soNo, string detailId, string outMode, int userId, string url, out string str);
        #endregion
Wms/Wms/Controllers/BllSoController.cs
@@ -703,7 +703,7 @@
        {
            try
            {
                var type = new List<string>(){"1","4"};
                var type = new List<string>(){"1"};
                RefAsync<int> count = new RefAsync<int>();
                var bolls = await _taskSvc.GetTaskList( type, model.Type,model.Status,model.TaskNo,model.IsSuccess,model.PalletNo,model.Msg,model.Page, model.Limit, count);
Wms/Wms/Controllers/DownApiController.cs
@@ -151,6 +151,58 @@
            }
        }
        /// <summary>
        /// PDA下发出库
        /// </summary>
        /// <param name="soNo"></param>
        /// <param name="soDetailId">出库单明细ID</param>
        /// <param name="outMode">出库地址(平库拣货位)</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult PDAIssueOut(string soNo, string soDetailId,string outMode)
        {
            try
            {
                //获取当前登录的用户ID
                var claimsIdentity = this.User.Identity as ClaimsIdentity;
                if (claimsIdentity == null)
                {
                    return Ok(new HttpReturnModel { Success = "-1", Message = "未获取到当前操作人信息"});
                }
                var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
                if (string.IsNullOrWhiteSpace(userId))
                {
                    return Ok(new HttpReturnModel { Success = "-1", Message = "未获取到当前操作人信息"});
                }
                //验证出库口
                if (string.IsNullOrWhiteSpace(outMode))
                {
                    return Ok(new HttpReturnModel { Success = "-1", Message = "请选择出库地址" });
                }
                var house = _exNoticeSvc.GetHouseBySo(soNo);
                if (house == "W01")
                {
                    //var list = _exNoticeSvc.IssueOutHouseMk(soNo, outMode, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out string str);
                    return Ok(new HttpReturnModel { Success = "0", Message = "str", Data = "list" });
                }
                else if (house == "W02")
                {
                    var list = _exNoticeSvc.IssueOutHouseLk(soNo, outMode, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out string str);
                    return Ok(new HttpReturnModel { Success = "0", Message = str, Data = list});
                }
                else
                {
                    return Ok(new HttpReturnModel { Success = "-1", Message = "仓库信息错误,请核实单据信息" });
                }
            }
            catch (Exception e)
            {
                return Ok(new HttpReturnModel { Success = "-1", Message = e.Message });
            }
        }
        /// <summary>
        /// 重新下发出库任务
@@ -301,7 +353,7 @@
            try
            {
                var list = _http.RequestLocation(model.PalletNo, model.HouseNo);
                var list = _http.RequestLocation(model.PalletNo, model.HouseNo,model.Ceng);
                _asnPalletBindSvc.IssueAsnTask(list, _config.WcsHost+ _config.IssueComApiUrl2);//WCS路径
                
                new OperationASNServer().AddLogOperationAsn("PDA模块", "申请入库", model.PalletNo, "添加", $"申请储位托盘号:{model.PalletNo}的成功信息", int.Parse(userId));
@@ -420,7 +472,7 @@
                        }
                        else if (model.TaskType == "2")
                        {
                            _exNoticeSvc.RelocationSuccess(model.TaskNo, 0);
                            _http.ExMoveSuccess(model.TaskNo, 0);
                            return Ok(new WcsModel { StatusCode = 0, Msg = "移库完成" });
                        }
                        break;
@@ -436,11 +488,19 @@
                            return Ok(new WcsModel { StatusCode = 0, Msg = "入库完成" });
                        }
                        break;
                    case "3"://移库完成任务、优化储位
                    case "3"://移库单  AGV走这
                        if (model.TaskType == "2") //0:入库 1:出库 2:移库
                        {
                            //填写移库完成代码
                            _http.MoveSuccess(model.TaskNo, 0);
                            return Ok(new WcsModel { StatusCode = 0, Msg = "移库完成" });
                        }
                        break;
                    case "4"://质检出库
                        if (model.TaskType == "2") //0:入库 1:出库 2:移库
                        {
                            //填写移库完成代码
                            _http.ExMoveSuccess(model.TaskNo, 0);
                            return Ok(new WcsModel { StatusCode = 0, Msg = "移库完成" });
                        }
                        break;
@@ -483,6 +543,93 @@
            }
        }
        /// <summary>
        /// 接受wcs返回的信号 //指令反馈(是否完成)
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult ReceiveRenGongSignal(ReceiveWcsSignal model)
        {
            //获取当前登录的用户ID
            var claimsIdentity = this.User.Identity as ClaimsIdentity;
            if (claimsIdentity == null)
            {
                return Ok(new HttpReturnModel { Success = "1", Message = "未获取到当前操作人信息" });
            }
            var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
            if (string.IsNullOrWhiteSpace(userId))
            {
                return Ok(new HttpReturnModel { Success = "1", Message = "未获取到当前操作人信息" });
            }
            try
            {
                if (string.IsNullOrEmpty(model.TaskNo) || string.IsNullOrEmpty(model.TaskStatus) || string.IsNullOrEmpty(model.TaskType))
                {
                    return Ok(new HttpReturnModel { Success = "-1", Message = "参数错误" });
                }
                //接收时间
                var orderType = _taskSvc.GetTaskOrderType(model.TaskNo);// 判断单据类型入出移
                switch (orderType)
                {
                    case "0"://入库完成任务
                        if (model.TaskType == "0")//0:入库 1:出库 2:移库
                        {
                            _http.ArrivalSuccess2(model.TaskNo, 0);
                            return Ok(new HttpReturnModel { Success = "0", Message = "入库完成" });
                        }
                        break;
                    case "1"://出库完成任务
                        if (model.TaskType == "1")//0:入库 1:出库 2:移库
                        {
                            _exNoticeSvc.ExportSuccess(model.TaskNo, 0);
                            return Ok(new HttpReturnModel { Success = "0", Message = "出库完成" });
                        }
                        else if (model.TaskType == "2")
                        {
                            _http.ExMoveSuccess(model.TaskNo, 0);
                            return Ok(new HttpReturnModel { Success = "0", Message = "移库完成" });
                        }
                        break;
                    case "2"://盘库完成任务
                        if (model.TaskType == "1")//0:入库 1:出库 2:移库
                        {
                            _crCheckSvc.CheckSuccess(model.TaskNo, 0);
                            return Ok(new HttpReturnModel { Success = "0", Message = "盘点出库完成" });
                        }
                        else if (model.TaskType == "0")// 盘点出库托盘回库完成
                        {
                            _http.ArrivalSuccess2(model.TaskNo, 0);
                            return Ok(new HttpReturnModel { Success = "0", Message = "入库完成" });
                        }
                        break;
                    case "3"://移库单
                        if (model.TaskType == "2") //0:入库 1:出库 2:移库
                        {
                            //填写移库完成代码
                            _http.MoveSuccess(model.TaskNo, 0);
                            return Ok(new HttpReturnModel { Success = "0", Message = "移库完成" });
                        }
                        break;
                    case "4"://质检出库
                        if (model.TaskType == "2") //0:入库 1:出库 2:移库
                        {
                            _http.ExMoveSuccess(model.TaskNo, 0);
                            return Ok(new HttpReturnModel { Success = "0", Message = "移库完成" });
                        }
                        break;
                    default:
                        return Ok(new HttpReturnModel { Success = "-1", Message = "传递的任务状态为失败状态" });
                }
                return Ok(new HttpReturnModel { Success = "-1", Message = "传递的任务状态为失败状态" });
            }
            catch (Exception ex)
            {
                return Ok(new HttpReturnModel { Success = "-1", Message = ex.Message });
            }
        }
        /// <summary>
        /// WCS反馈AGV任务取货完成
        /// </summary>