test
7 小时以前 98e221d6dc26183efab868ee5f11a65d5791304e
Merge branch 'master' of http://47.95.120.53:8083/r/JC34WMS
22个文件已修改
1103 ■■■■■ 已修改文件
HTML/views/SOSetting/ComBoxInfo.html 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/SOSetting/ExportAllot.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/SOSetting/ExportNotice.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/SOSetting/ExportNoticeAddFrom.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/SOSetting/PalletNoOut.html 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/StatisticalReport/InventoryStatistics.html 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Pda/View/SoSetting/productOut.html 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllAsnServer/BllBoxInfoServer.cs 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllPdaServer/PdaAsnServer.cs 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs 516 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllSoServer/CompleteDetailServer.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs 289 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/DataServer/StockServer.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IBllSoServer/ICompleteDetailServer.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IBllSoServer/IExportNoticeServer.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IDataServer/IStockServer.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IPdaServer/IPdaSoServer.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/BllSoController.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/PdaSoController.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/StatisticalController.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/SOSetting/ComBoxInfo.html
@@ -58,6 +58,7 @@
                    layer = layui.layer;
                var h1 = GetTableHeight();
                var boxNo = getQueryString('BoxNo');
                var SONo = getQueryString('SONo');
                if (!boxNo)
                {
                    boxNo = "";
@@ -70,6 +71,7 @@
                    refreshTable();
                    function refreshTable() {
                        var param={
                            SONo: getQueryString('SONo'),
                            BoxNo:getQueryString('BoxNo'),
                            BoxNo3:$("#BoxNo3").val()
                        }
@@ -114,6 +116,9 @@
                            field: 'PalletNo', title: '托盘条码', align: 'center', width: 110,
                        }, 
                        {
                            field: 'BoxNo2', title: '盒码', align: 'center', width: 220,
                        },
                        {
                            field: 'BoxNo3', title: '支码', align: 'center', width: 220,
                        },  
                        {
HTML/views/SOSetting/ExportAllot.html
@@ -876,7 +876,7 @@
                    layer.open({
                        type: 2,
                        title: '箱支详情信息',
                        content: 'ComBoxInfo.html?BoxNo=' + BoxNo,
                        content: 'ComBoxInfo.html?BoxNo=' + BoxNo+'&SONo='+data.SONo,
                        maxmin: true,
                        area: ['80%', '85%'],
                        btn: ['关闭'],
HTML/views/SOSetting/ExportNotice.html
@@ -368,7 +368,7 @@
                                                </a>`;
                                    }
                                    
                                    if( d.Status == '2' || d.Status == '3'){
                                    if( (d.Status == '2' || d.Status == '3') && d.Type=='0'){
                                        html += `<a class="layui-btn layui-btn-normal layui-btn-xs outClass" lay-event="outKu">
                                                    <i class="layui-icon layui-icon-ok"></i>出库
                                                </a>`;
HTML/views/SOSetting/ExportNoticeAddFrom.html
@@ -403,10 +403,10 @@
                    var item = {
                        SkuNo: infoOptions.data[i].SkuNo,
                        LotNo: infoOptions.data[i].LotNo,
                        Qty: parseFloat(infoOptions.data[i].Qty), // 保留4位小数精度
                        Qty: parseFloat(formattedExQty),//parseFloat(infoOptions.data[i].Qty), // 保留4位小数精度
                        IsBale: infoOptions.data[i].IsBale,
                        IsBelt: infoOptions.data[i].IsBelt,
                        ExQty: parseFloat(formattedExQty),
                        //ExQty: parseFloat(formattedExQty),
                    };
                    DataList.push(item);
HTML/views/SOSetting/PalletNoOut.html
@@ -88,13 +88,7 @@
                            <div class="layui-input-inline">
                                <select name="PickingArea" id="PickingArea" 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>
                            </div>
                        </div>
@@ -407,6 +401,15 @@
                    var data = obj.data; 
                     
                    if(obj.event === 'outKu'){
                        $("#PickingArea").empty();
                        $("#PickingArea").append('<option value =""></option>');
                        if(data.WareHouseNo=='W02'){
                            $("#PickingArea").append('<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>');
                        }else if(data.WareHouseNo=='W01'){
                            $("#PickingArea").append('<option value="17">17工位</option><option value="18">18工位</option>');
                        }
                        form.render('select');
                        layer.open({
                            type: 1,
                            title: '确认出库口',
HTML/views/StatisticalReport/InventoryStatistics.html
@@ -149,6 +149,22 @@
                                placeholder="结束时间">
                        </div>
                    </div> -->
                    <div class="layui-inline">
                        <label class="layui-form-label" style="width: 60px;">所属仓库</label>
                        <div class="layui-input-inline">
                            <select name="WareHouseNo" id="WareHouseNo" lay-filter="getWareHouseNo" lay-search>
                                <option value=""></option>
                            </select>
                        </div>
                    </div>
                    <div class="layui-inline">
                        <label class="layui-form-label" style="width: 60px;">所属区域</label>
                        <div class="layui-input-inline">
                            <select name="AreaNo" id="AreaNo" lay-filter="getAreaNo" lay-search>
                                <option value=""></option>
                            </select>
                        </div>
                    </div>
                    <div class="layui-inline sousuo">
                        <button class="layui-btn layui-btn-sm layuiadmin-btn-list" lay-submit
                            lay-filter="LAY-app-contlist-search">
@@ -306,7 +322,7 @@
            var TotalColsSysArr = encodeURIComponent(encodeURIComponent(JSON.stringify(TotalColsArr)))//将表头数据进行url编码
            //#endregion
            //获取总量信息
            function refreshTable(SelectType, SkuNo, SkuName, OwnerNo, OwnerName, LotNo, Status, InspectStatus) {
            function refreshTable(SelectType, SkuNo, SkuName, OwnerNo, OwnerName, LotNo, Status, InspectStatus, WareHouseNo, AreaNo) {
                //#region 自定义表头
                var colsJson
                var param1 = {
@@ -347,6 +363,8 @@
                        LotNo: LotNo, //批次号
                        Status: Status, //库存状态 = $("#Status").val();
                        InspectStatus: InspectStatus, //质检状态 = $("#InspectStatus").val();
                        WareHouseNo:WareHouseNo, //所属仓库
                        AreaNo:AreaNo//所属区域
                    };
                    sendData(IP + "/Statistical/GetInventoryList", param, 'get', function (res) {
                        console.log(res)
@@ -381,7 +399,9 @@
                var OwnerName = $("#OwnerName").val();
                var Status = $("#Status").val();
                var InspectStatus = $("#InspectStatus").val();
                refreshTable(SelectType, SkuNo, SkuName, OwnerNo, OwnerName, LotNo, Status, InspectStatus);
                var WareHouseNo = $("#WareHouseNo").val();
                var AreaNo = $("#AreaNo").val();
                refreshTable(SelectType, SkuNo, SkuName, OwnerNo, OwnerName, LotNo, Status, InspectStatus, WareHouseNo, AreaNo);
            });
@@ -414,6 +434,51 @@
            });
            //获取仓库下拉框信息
            sendData(IP + "/Sys/GetWarehouseDic", {}, 'get', function (res) {
                if (res.code == 0) { //成功
                    for (var i = 0; i < res.data.length; i++) {
                        $("#WareHouseNo").append('<option value =' + res.data[i].WareHouseNo + '>' + res.data[i].WareHouseNo + '-' +
                            res.data[i].WareHouseName + '</option>');
                    }
                    form.render('select');
                } else { //不成功
                    layer.msg(res.msg, {
                        icon: 2,
                        time: 2000 //2秒关闭(如果不配置,默认是3秒)
                    }, function () { });
                }
            });
            getAR("");
            form.on('select(getWareHouseNo)', function (data) {
                console.log(data);
                getAR(data.value);
            });
            function getAR(val) {
                //获取 区域下拉框
                sendData(IP + "/Sys/GetStorageAreaByHouseNo?wareHouseNo=" + val, {}, 'get', function (res) {
                    $("#AreaNo").empty();
                    $("#AreaNo").append('<option value =""></option>');
                    if (res.code == 0) { //成功
                        for (var i = 0; i < res.data.length; i++) {
                            $("#AreaNo").append('<option value =' + res.data[i].AreaNo + '>' + res.data[i].AreaNo + '-' +
                                res.data[i].AreaName + '</option>');
                        }
                        form.render('select');
                    } else { //不成功
                        layer.msg('获取区域信息失败', {
                            icon: 2,
                            time: 2000 //2秒关闭(如果不配置,默认是3秒)
                        }, function () {
                            //回调
                            form.render('select');
                        });
                    }
                });
            };
            //#region 自定义表头
            //自定义表头            
            active = {
Pda/View/SoSetting/productOut.html
@@ -288,7 +288,7 @@
                                        </div>
                                    </td>
                                </tr> -->
                                <tr>
                                <!-- <tr>
                                    <td>
                                        <div class="layui-form-item layout-input" style="margin-top: 6px;">
                                            <label class="layui-form-label lableWidth">追溯条码:</label>
@@ -298,15 +298,14 @@
                                            </div>
                                        </div>
                                    </td>
                                </tr>
                                </tr> -->
                                <tr class="divPickQty1">
                                    <td>
                                        <div class="layui-form-item layout-input" style="margin-top: 6px;">
                                            <label class="layui-form-label lableWidth">拣货数量:</label>
                                            <div class="layui-input-block">
                                                <input id="pickQty1" type="number" placeholder="请输入拣货数量"
                                                    autocomplete="off" class="layui-input"
                                                    oninput="value=value.replace(/^(0+)|[^\d]+/g,'')">
                                                    autocomplete="off" class="layui-input">
                                            </div>
                                        </div>
                                    </td>
@@ -971,20 +970,20 @@
                        });
                        return;
                    }
                    if (($('#boxNo3').val() != "" && ($('#pickQty1').val() != "" || $('#pickQty1').val() != 0))) {
                        layer.msg("追溯条码和拣货数量不能同时输入!", {
                            icon: 2,
                            time: 2000 //2秒关闭(如果不配置,默认是3秒)
                        });
                        return;
                    }
                    if ($('#pickQty1').val() != "" && $('#pickQty1').val() > parseInt($('#pickQty').val())) {
                        layer.msg("拣货数量不能大于待拣数量!", {
                            icon: 2,
                            time: 2000 //2秒关闭(如果不配置,默认是3秒)
                        });
                        return;
                    }
                    // if (($('#boxNo3').val() != "" && ($('#pickQty1').val() != "" || $('#pickQty1').val() != 0))) {
                    //     layer.msg("追溯条码和拣货数量不能同时输入!", {
                    //         icon: 2,
                    //         time: 2000 //2秒关闭(如果不配置,默认是3秒)
                    //     });
                    //     return;
                    // }
                    // if ($('#pickQty1').val() != "" && $('#pickQty1').val() > parseInt($('#pickQty').val())) {
                    //     layer.msg("拣货数量不能大于待拣数量!", {
                    //         icon: 2,
                    //         time: 2000 //2秒关闭(如果不配置,默认是3秒)
                    //     });
                    //     return;
                    // }
                }
                // let boxQty = parseInt($('#boxQty').val())
                // let qty = parseInt($('#qty').val()) 
@@ -1017,7 +1016,7 @@
                    "SoDetailId": $("#skuLotNo").val(),
                    "PalletNo": $('#palletNo').val(),
                    "BoxNo": $('#boxNo').val(),
                    "BoxNo3": $('#boxNo3').val(),
                    //"BoxNo3": $('#boxNo3').val(),
                    "PickQty": $('#pickQty1').val()
                }
                sendData(IP + "/PdaSo/SoSetPick", param, 'post', function (res) {
Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs
@@ -777,10 +777,10 @@
                    return "-1:入库单状态已变更,不可删除!";
                }
                if (asnModel.Origin != "录入" && asnModel.Origin != "采购单")
                {
                    return "-1:上游系统下发的单据,不可删除;";
                }
                //if (asnModel.Origin != "录入" && asnModel.Origin != "采购单")
                //{
                //    return "-1:上游系统下发的单据,不可删除;";
                //}
                // 删除总单
                var editDateTime = DateTime.Now;
Wms/WMS.BLL/BllAsnServer/BllBoxInfoServer.cs
@@ -534,8 +534,17 @@
                {
                    throw new Exception("未查询到单据明细信息,请核实");
                }
                var skuInfo = Db.Queryable<SysMaterials>().First(w => w.IsDel == "0" && w.SkuNo == asnDetail.SkuNo);
                if (skuInfo == null)
                {
                    throw new Exception("未查询到物料信息,请核实");
                }
                if (string.IsNullOrEmpty(skuInfo.PackagNo))
                {
                    throw new Exception("未查询到物料的包装信息,请核实");
                }
                var packInfo = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == asnDetail.PackagNo);
                var packInfo = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == skuInfo.PackagNo);
                if (packInfo == null)
                {
                    throw new Exception("未查询到单据明细中的物料包装信息");
@@ -781,7 +790,6 @@
                            maxBoxCode = maxBoxCode.Substring(0, maxBoxCode.Length-6) + (int.Parse(maxBoxCode.Substring(maxBoxCode.Length - 6, 6)) + 1).ToString().PadLeft(6, '0');
                        }
                        DateTime? storeTime2 = null;
                        // 将条码保存到原料条码表
                        var labelModel = new BllBoxInfo()
                        {
@@ -801,14 +809,26 @@
                            BitBoxMark = bNum > boxQty ? "1" : "0",
                            InspectStatus = "0",
                            ProductionTime = DateTime.Parse(productionTime),
                            StoreTime = string.IsNullOrWhiteSpace(storeTime) ? storeTime2 : DateTime.Parse(storeTime ),
                            ExpirationTime = DateTime.Parse(expirationTime),
                            ProductionTime = null,
                            StoreTime = null,
                            ExpirationTime = null,
                            Origin = "WMS生成",
                            CreateUser = userId,
                            CreateTime = DateTime.Now,
                        };
                        if (!string.IsNullOrEmpty(productionTime))
                        {
                            labelModel.ProductionTime = DateTime.Parse(productionTime);
                        }
                        if (!string.IsNullOrEmpty(storeTime))
                        {
                            labelModel.StoreTime = DateTime.Parse(storeTime);
                        }
                        if (!string.IsNullOrEmpty(expirationTime))
                        {
                            labelModel.ExpirationTime = DateTime.Parse(expirationTime);
                        }
                        Db.Insertable(labelModel).ExecuteCommand();
                        modelList.Add(labelModel);
@@ -953,14 +973,26 @@
                                BitBoxMark = bNum > boxQty ? "1" : "0",
                                InspectStatus = "0",
                                ProductionTime = DateTime.Parse(productionTime),
                                StoreTime = DateTime.Parse(storeTime),
                                ExpirationTime = DateTime.Parse(expirationTime),
                                ProductionTime = null,
                                StoreTime = null,
                                ExpirationTime = null,
                                Origin = "WMS生成",
                                CreateUser = userId,
                                CreateTime = DateTime.Now,
                            };
                            if (!string.IsNullOrEmpty(productionTime))
                            {
                                labelModel.ProductionTime = DateTime.Parse(productionTime);
                            }
                            if (!string.IsNullOrEmpty(storeTime))
                            {
                                labelModel.StoreTime = DateTime.Parse(storeTime);
                            }
                            if (!string.IsNullOrEmpty(expirationTime))
                            {
                                labelModel.ExpirationTime = DateTime.Parse(expirationTime);
                            }
                            Db.Insertable(labelModel).ExecuteCommand();
                            modelList.Add(labelModel);
Wms/WMS.BLL/BllPdaServer/PdaAsnServer.cs
@@ -126,11 +126,11 @@
                    throw new Exception("当前物料及批次与单据无关联,请核实!");
                }
                //判断托盘是否在库外
                var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == model.PalletNo);
                if (stockDetail != null && !string.IsNullOrEmpty(stockDetail.WareHouseNo))
                {
                    throw new Exception("该托盘已有储位信息,不可组托,请核实!");
                }
                //var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == model.PalletNo);
                //if (stockDetail != null && !string.IsNullOrEmpty(stockDetail.WareHouseNo))
                //{
                //    throw new Exception("该托盘已有储位信息,不可组托,请核实!");
                //}
                #endregion
@@ -272,13 +272,13 @@
                    }
                    // 判断库存明细是否已有此托盘信息  
                    var sd1 = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.ASNDetailNo == bind.ASNDetailNo && m.PalletNo == model.PalletNo);
                    var sd1 = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == model.PalletNo && m.LotNo == detail.LotNo && m.SkuNo == detail.SkuNo);// && m.ASNDetailNo == bind.ASNDetailNo
                    var sdId1 = 0;
                    if (sd1 != null)
                    {
                        sdId1 = sd1.Id;
                        // 库存已存在 更新数据
                        sd1.Qty = bind.Qty;
                        sd1.Qty += bind.Qty;
                        sd1.CompleteTime = comTime;
                        sd1.UpdateUser = userId;
                        sd1.UpdateTime = comTime;
@@ -325,6 +325,14 @@
                            CreateUser = 0,
                            CreateTime = comTime
                        };
                        var palletData = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == sd1.PalletNo && !string.IsNullOrEmpty(w.LocatNo));
                        if (palletData != null)
                        {
                            sd1.WareHouseNo = palletData.WareHouseNo;
                            sd1.RoadwayNo = palletData.RoadwayNo;
                            sd1.AreaNo = palletData.AreaNo;
                            sd1.LocatNo = palletData.LocatNo;
                        }
                        //维护库存明细货主/供应商信息 //0:成品入库,2:中间品入库,4:车间余料入库,6:代储入库,7:寄存入库
                        if (notice.Type == "0" || notice.Type == "2" || notice.Type == "4" || notice.Type == "6" || notice.Type == "7")
@@ -484,6 +492,10 @@
                    }
                    detail.UpdateUser = userId;
                    detail.UpdateTime = comTime;
                    if (notice.Type == "4" || notice.Type == "8")
                    {
                        detail.InspectStatus = "1";//车间退料默认检验合格
                    }
                    //更新入库单明细
                    Db.Updateable(detail).ExecuteCommand();
@@ -504,7 +516,10 @@
                    #endregion
                    #region 库存明细
                    if (sd1.Qty <= 0)
                    {
                    sd1.Qty = bind.Qty;
                    }
                    //更改库存明细数量
                    Db.Updateable(sd1).Where(m => m.Id == sdId1).ExecuteCommand();
                    #endregion
@@ -1822,7 +1837,7 @@
                    }
                }
                else if (notice.Type == "1" || notice.Type == "4") //采购入库
                else if (notice.Type == "1" || notice.Type == "4" || notice.Type == "8") //采购入库
                {
                    string sqlString = $@"SELECT 
                                            ASNNo,
@@ -2726,7 +2741,7 @@
                        ExpirationTime = boxInfoOne.ExpirationTime,
                        Status = "0",
                        InspectMark = boxInfoOne.InspectMark,
                        InspectStatus = sku.IsInspect,
                        InspectStatus = "1",//sku.IsInspect,//从车间入库的质检状态默认合格
                        BitPalletMark = "1",
                        PackagNo = sku.PackagNo,
Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs
@@ -1587,7 +1587,7 @@
                Db.BeginTran();
                
                //库存箱支明细信息
                var boxList = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo == boxNo).ToList();
                var boxList = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo == boxNo && w.Status == "2").ToList();
                if (boxList.Count != 1)
                {
                    throw new Exception("该箱码信息错误,存在多个此箱码信息");
Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs
@@ -92,7 +92,7 @@
                }
                //出库分配信息
                var allot = await Db.Queryable<BllExportAllot>().FirstAsync(m =>
                    m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.SONo == soNo &&
                    m.IsDel == "0" && (m.Status == "2" || m.Status == "3" || m.Status == "5") && m.SONo == soNo &&
                    m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo);
                if (allot == null)
                {
@@ -322,7 +322,7 @@
                else
                {
                    List<DataBoxInfo> boxInfos;
                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo);
                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo && m.Status == "2");
                    if (await boxInfo.CountAsync() == 0)
                    {
                        throw Oops.Bah("未查询到该箱码的信息");
@@ -1852,7 +1852,7 @@
                return allotList;
            }
            //获取状态为待拣货或者部分拣货的出库单
            var allotList2 = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
            var allotList2 = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.Status == "2" || m.Status == "3" || m.Status == "5") && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
            //var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToList();
            //获取出库单据不为待拣货 执行完毕 订单关闭 等待执行的单据
@@ -1927,7 +1927,7 @@
                throw Oops.Bah("托盘码为空,请输入托盘码");
            }
            //获取状态为待拣货或者部分拣货的出库单
            var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.PalletNo == palletNo);
            var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.Status == "2" || m.Status == "3" || m.Status == "5") && m.PalletNo == palletNo);
            //var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SONo == soNo && m.Status != "4" && m.Status != "5");
            if (!string.IsNullOrWhiteSpace(soNo))
            {
@@ -1949,7 +1949,7 @@
        //获取出库口、规格、待拣及已拣数量(根据出库单明细ID、托盘号)
        public async Task<OutPdaInfo> GetOutlets(string soDetailId, string palletNo)
        {
            var allotInfo = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo && (m.Status == "2" || m.Status == "3")).ToListAsync();
            var allotInfo = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo && (m.Status == "2" || m.Status == "3" || m.Status == "5")).ToListAsync();
            if (allotInfo.Count == 0)
            {
                throw Oops.Bah($"{palletNo}托盘上未查询到分配信息,请核实");
@@ -2033,7 +2033,7 @@
            }
            if (!string.IsNullOrWhiteSpace(soDetailId))
            {
                var allotInfos = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo && (m.Status == "2" || m.Status == "3")).ToListAsync();
                var allotInfos = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo && (m.Status == "2" || m.Status == "3" || m.Status == "5")).ToListAsync();
                if (allotInfos.Count == 0)
                {
                    throw Oops.Bah($"{palletNo}托盘上未查询到分配信息,请核实");
@@ -2603,6 +2603,510 @@
            }
        }
        /// <summary>
        /// 出库pda拣货-JC34
        /// </summary>
        /// <param name="soNo"></param>
        /// <param name="soDetailId"></param>
        /// <param name="palletNo"></param>
        /// <param name="boxNo">箱码/盒码/支码</param>
        /// <param name="pickQty1"></param>
        /// <param name="userId"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public async Task SoSetPick34(string soNo, string soDetailId, string palletNo, string boxNo, string pickQty1, int userId)
        {
            Db.BeginTran();
            try
            {
                #region 判断
                if (string.IsNullOrWhiteSpace(soNo))
                {
                    throw Oops.Bah("出库单据不能为空");
                }
                if (string.IsNullOrWhiteSpace(soDetailId))
                {
                    throw Oops.Bah("出库物料-批次不能为空");
                }
                if (string.IsNullOrWhiteSpace(palletNo))
                {
                    throw Oops.Bah("托盘码不能为空");
                }
                //if (!string.IsNullOrEmpty(boxNo3) && !string.IsNullOrEmpty(pickQty1) && int.Parse(pickQty1) > 0)
                //{
                //    throw Oops.Bah("追溯条码和拣货数量不能同时输入");
                //}
                //出库单
                var notice = await Db.Queryable<BllExportNotice>().FirstAsync(m => m.IsDel == "0" && m.SONo == soNo);
                if (notice == null)
                {
                    throw Oops.Bah("未查询到该出库单的信息");
                }
                if (notice.Status != "3" && notice.Status != "4")
                {
                    throw Oops.Bah("出库单的状态不是正在执行,不能拣货");
                }
                //出库单明细
                var noticeDetail = await Db.Queryable<BllExportNoticeDetail>()
                    .FirstAsync(m => m.IsDel == "0" && m.Id == int.Parse(soDetailId));
                if (noticeDetail == null)
                {
                    throw Oops.Bah("未查询到该出库单明细的信息");
                }
                //出库分配信息
                var allot = await Db.Queryable<BllExportAllot>().FirstAsync(m =>
                    m.IsDel == "0" && (m.Status == "2" || m.Status == "3" || m.Status == "5") && m.SONo == soNo &&
                    m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo);
                if (allot == null)
                {
                    throw Oops.Bah("未查询到该托盘的分配信息");
                }
                //剩余拣货数量(待拣减去已拣)
                var needQty = allot.Qty - allot.CompleteQty;
                //库存明细
                var stockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.Id == allot.StockId);
                if (stockDetail == null)
                {
                    throw Oops.Bah("未查询到该托盘分配的库存明细信息!");
                }
                //库存总表
                var stock = await Db.Queryable<DataStock>().FirstAsync(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo && a.LotNo == stockDetail.LotNo);
                if (stock == null)
                {
                    throw Oops.Bah("未查询到该托盘分配的库存信息!");
                }
                #endregion
                if (string.IsNullOrWhiteSpace(boxNo))//整托拣货
                {
                    List<DataBoxInfo> boxInfos;
                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.SkuNo == stockDetail.SkuNo && m.LotNo == stockDetail.LotNo);//找到托盘上所有箱码
                    boxInfos = await boxInfo.ToListAsync();
                    if (boxInfo.Count() <= 0)
                    {
                        throw Oops.Bah("该托盘上没有可拣货的箱子");
                    }
                    var boxQty = await boxInfo.GroupBy(m => m.PalletNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToListAsync();
                    if (boxQty[0] > needQty)
                    {
                        throw Oops.Bah("拣货数量不能大于箱内剩余待拣数量");
                    }
                    decimal pickQty = 0;//拣货的数量
                    var comDetailList = await Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToListAsync();
                    var comList = new List<BllCompleteDetail>();
                    foreach (var item in boxInfos)
                    {
                        if (comDetailList.Any(m => m.BoxNo3 == item.BoxNo3) && item.BoxNo3 != null)
                        {
                            throw Oops.Bah($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货");
                        }
                        if (item.SkuNo != allot.SkuNo || item.LotNo != allot.LotNo)
                        {
                            throw Oops.Bah("当前托盘上有其他不同物料批次,拣货失败");
                        }
                        //添加拣货明细
                        var completeDetail = new BllCompleteDetail()
                        {
                            SONo = soNo,
                            SODetailNo = int.Parse(soDetailId),
                            ExportAllotId = allot.Id,
                            StockId = allot.StockId,
                            BoxNo = item.BoxNo,
                            BoxNo2 = item.BoxNo2,
                            BoxNo3 = item.BoxNo3,
                            LotNo = allot.LotNo,
                            LotText = allot.LotText,
                            SupplierLot = allot.SupplierLot,
                            SkuNo = allot.SkuNo,
                            SkuName = allot.SkuName,
                            Standard = allot.Standard,
                            PalletNo = palletNo,
                            CompleteQty = item.Qty,
                            CreateUser = userId
                        };
                        comList.Add(completeDetail);
                        //删除库存箱码明细
                        await Db.Deleteable(item).ExecuteCommandAsync();
                        pickQty += item.Qty;
                    }
                    //添加拣货明细
                    await Db.Insertable(comList).ExecuteCommandAsync();
                    //修改出库分配信息
                    allot.CompleteQty += pickQty;
                    allot.Status = allot.Qty <= allot.CompleteQty ? "5" : "3";
                    allot.UpdateTime = DateTime.Now;
                    await Db.Updateable(allot).ExecuteCommandAsync();
                    //删除库存明细
                    await Db.Deleteable(stockDetail).ExecuteCommandAsync();
                    //删除或修改库存
                    stock.Qty -= pickQty;
                    stock.LockQty -= pickQty;
                    if (stock.LockQty < 0)
                    {
                        stock.LockQty = 0;
                    }
                    if (stock.Qty <= 0)
                    {
                        await Db.Deleteable(stock).ExecuteCommandAsync();
                    }
                    else
                    {
                        await Db.Updateable(stock).ExecuteCommandAsync();
                    }
                    //判断托盘上还有没有其他物料
                    var palletData = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo && w.Id != stockDetail.Id);
                    if (palletData == null)
                    {
                        //改变托盘状态为:未使用
                        var pallet = Db.Queryable<SysPallets>().First(m => m.PalletNo == palletNo && m.IsDel == "0");
                        if (pallet == null)
                        {
                            throw Oops.Bah("未在托盘表中查询到托盘信息");
                        }
                        pallet.Status = "0";
                        await Db.Updateable(pallet).ExecuteCommandAsync();
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    await Db.Updateable(noticeDetail).ExecuteCommandAsync();
                    var num = await Db.Queryable<BllExportNoticeDetail>()
                        .CountAsync(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty);
                    if (num <= 0)
                    {
                        notice.Status = "4"; //更改为执行完成
                        //修改出库单信息
                        await Db.Updateable(notice).ExecuteCommandAsync();
                        if (notice.IsWave == "1")
                        {
                            var waveNum = await Db.Queryable<BllExportNotice>().CountAsync(m => m.IsDel == "0" && m.WaveNo == notice.WaveNo && m.Status != "4");
                            if (waveNum == 0)
                            {
                                var wave = await Db.Queryable<BllWaveMage>().FirstAsync(m => m.IsDel == "0" && m.WaveNo == notice.WaveNo);
                                if (wave != null)
                                {
                                    wave.Status = "4";
                                    wave.UpdateUser = userId;
                                    wave.UpdateTime = DateTime.Now;
                                    await Db.Updateable(wave).ExecuteCommandAsync();
                                }
                            }
                        }
                    }
                }
                else
                {
                    var biaoShi = "0";//0:整箱拣货、1:整盒拣货、 2:散支拣货、3:数量拣货
                    List<DataBoxInfo> boxInfos;
                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo);
                    if (await boxInfo.CountAsync() == 0)
                    {
                        biaoShi = "1";
                        boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo2 == boxNo);
                        if (await boxInfo.CountAsync() == 0)
                        {
                            biaoShi = "2";
                            boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo3 == boxNo);
                            if (await boxInfo.CountAsync() == 0)
                            {
                                throw Oops.Bah("未查询到该箱码及追溯码的信息");
                            }
                        }
                    }
                    if (biaoShi == "0" && !string.IsNullOrEmpty(pickQty1) && decimal.Parse(pickQty1) > 0)
                    {
                        biaoShi = "3";
                    }
                    if (biaoShi == "2" && !string.IsNullOrEmpty(pickQty1) && decimal.Parse(pickQty1) > 0)
                    {
                        throw Oops.Bah("追溯条码和拣货数量不能同时输入");
                    }
                    boxInfos = await boxInfo.ToListAsync();
                    var comDetailList = Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToList();
                    if (biaoShi == "2") //散支拣货
                    {
                        boxInfos = boxInfos.Where(m => m.BoxNo3 == boxNo).ToList();
                        if (boxInfos.Count() == 0)
                        {
                            throw Oops.Bah("未查询到该箱码及追溯码的信息");
                        }
                        if (boxInfos.Count() > 1)
                        {
                            throw Oops.Bah("该追溯支码的信息大于1条,信息错误,请核实!");
                        }
                        if (boxInfos.Any(m => m.PalletNo != palletNo))
                        {
                            throw Oops.Bah("该托盘与箱码没有绑定关系");
                        }
                        var boxQty = boxInfos.First().Qty;
                        //if (boxQty > needQty)
                        //{
                        //    throw Oops.Bah("拣货数量不能大于剩余待拣数量");
                        //}
                        foreach (var item in boxInfos)
                        {
                            if (comDetailList.Any(m => m.BoxNo3 == item.BoxNo3))
                            {
                                throw Oops.Bah($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货");
                            }
                        }
                    }
                    else if (biaoShi == "1")//整盒拣货
                    {
                        if (boxInfo.Count() == 0)
                        {
                            throw Oops.Bah("未查询到该盒码的信息");
                        }
                        if (boxInfo.Any(m => m.PalletNo != palletNo))
                        {
                            throw Oops.Bah("该托盘与盒码没有绑定关系");
                        }
                        var boxQty = await boxInfo.GroupBy(m => m.BoxNo2).Select(m => SqlFunc.AggregateSum(m.Qty)).ToListAsync();
                        //if (boxQty[0] > needQty)
                        //{
                        //    throw Oops.Bah("拣货数量不能大于箱内剩余待拣数量");
                        //}
                        foreach (var item in boxInfos)
                        {
                            if (comDetailList.Any(m => m.BoxNo3 == item.BoxNo3))
                            {
                                throw Oops.Bah($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货");
                            }
                        }
                    }
                    else if (biaoShi == "3")//数量拣货
                    {
                        if (boxInfo.Count() > 1)
                        {
                            throw Oops.Bah("该箱码内存在支码不能进行数量拣货");
                        }
                        decimal boxQty = boxInfo.First().Qty;
                        if (Convert.ToDecimal(pickQty1) > boxQty)
                        {
                            throw Oops.Bah("拣货数量不能大于箱内数量");
                        }
                        //if (Convert.ToInt32(pickQty1) > needQty)
                        //{
                        //    throw Oops.Bah("拣货数量不能大于剩余待拣数量");
                        //}
                    }
                    else //整箱拣货
                    {
                        if (boxInfo.Count() == 0)
                        {
                            throw Oops.Bah("未查询到该箱码的信息");
                        }
                        if (boxInfo.Any(m => m.PalletNo != palletNo))
                        {
                            throw Oops.Bah("该托盘与箱码没有绑定关系");
                        }
                        var boxQty = await boxInfo.GroupBy(m => m.BoxNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToListAsync();
                        //if (boxQty[0] > needQty)
                        //{
                        //    throw Oops.Bah("拣货数量不能大于箱内剩余待拣数量");
                        //}
                        foreach (var item in boxInfos)
                        {
                            if (comDetailList.Any(m => m.BoxNo == item.BoxNo))
                            {
                                throw Oops.Bah($"当前{item.BoxNo}已拣货完成,请勿重复拣货");
                            }
                        }
                    }
                    decimal pickQty = 0;//拣货的数量
                    var comList = new List<BllCompleteDetail>();
                    foreach (var item in boxInfos)
                    {
                        //添加拣货明细
                        var completeDetail = new BllCompleteDetail()
                        {
                            SONo = soNo,
                            SODetailNo = int.Parse(soDetailId),
                            ExportAllotId = allot.Id,
                            StockId = allot.StockId,
                            BoxNo = item.BoxNo,
                            BoxNo2 = item.BoxNo2,
                            BoxNo3 = item.BoxNo3,
                            LotNo = allot.LotNo,
                            LotText = allot.LotText,
                            SupplierLot = allot.SupplierLot,
                            SkuNo = allot.SkuNo,
                            SkuName = allot.SkuName,
                            Standard = allot.Standard,
                            PalletNo = palletNo,
                            CompleteQty = biaoShi == "3" ? decimal.Parse(pickQty1) : item.Qty,
                            CreateUser = userId
                        };
                        comList.Add(completeDetail);
                        if (biaoShi != "3")
                        {
                            //删除库存箱码明细
                            await Db.Deleteable(item).ExecuteCommandAsync();
                            pickQty += item.Qty;
                        }
                        else//数量拣货
                        {
                            if (decimal.Parse(pickQty1) == item.Qty)
                            {
                                //删除库存箱码明细
                                await Db.Deleteable(item).ExecuteCommandAsync();
                            }
                            else
                            {
                                item.Qty -= decimal.Parse(pickQty1);
                                item.BitBoxMark = "1";//零箱标识
                                await Db.Updateable(item).ExecuteCommandAsync();
                            }
                            pickQty += decimal.Parse(pickQty1);
                        }
                    }
                    //改变库内箱码是否零箱信息
                    if (biaoShi == "1" || biaoShi == "2")
                    {
                        var boxSurplusList = new List<DataBoxInfo>();
                        if (biaoShi == "1")
                        {
                            boxSurplusList = boxInfo.Where(m => m.BoxNo2 != boxNo).ToList();
                        }
                        else
                        {
                            boxSurplusList = boxInfo.Where(m => m.BoxNo3 != boxNo).ToList();
                        }
                        foreach (var item in boxSurplusList)
                        {
                            item.BitBoxMark = "1";
                            await Db.Updateable(item).ExecuteCommandAsync();
                        }
                    }
                    await Db.Insertable(comList).ExecuteCommandAsync();
                    //修改出库分配信息
                    allot.CompleteQty += pickQty;
                    allot.Status = allot.Qty <= allot.CompleteQty ? "5" : "3";
                    allot.UpdateTime = DateTime.Now;
                    if (allot.Status == "5")
                    {
                        //判断该托盘是否还存在物料 存在改为待回库 待回库完成后改为已完成
                    }
                    await Db.Updateable(allot).ExecuteCommandAsync();
                    //删除或修改库存明细
                    stockDetail.BitPalletMark = "1";//修改为零托标识
                    stockDetail.Qty -= pickQty;
                    stockDetail.LockQty -= pickQty;
                    if (stockDetail.LockQty < 0)
                    {
                        stockDetail.LockQty = 0;
                    }
                    if (stockDetail.Qty == stockDetail.LockQty)
                    {
                        stockDetail.Status = "2";
                    }
                    else if (stockDetail.Qty > stockDetail.LockQty && stockDetail.LockQty > 0)
                    {
                        stockDetail.Status = "1";
                    }
                    else
                    {
                        stockDetail.Status = "0";
                    }
                    if (stockDetail.Qty <= 0)
                    {
                        await Db.Deleteable(stockDetail).ExecuteCommandAsync();
                    }
                    else
                    {
                        await Db.Updateable(stockDetail).ExecuteCommandAsync();
                    }
                    stock.Qty -= pickQty;
                    stock.LockQty -= pickQty;
                    if (stock.LockQty < 0)
                    {
                        stock.LockQty = 0;
                    }
                    if (stock.Qty <= 0)
                    {
                        await Db.Deleteable(stock).ExecuteCommandAsync();
                    }
                    else
                    {
                        await Db.Updateable(stock).ExecuteCommandAsync();
                    }
                    var num2 = await Db.Queryable<DataStockDetail>().CountAsync(m => m.IsDel == "0" && m.PalletNo == palletNo);
                    if (num2 <= 0)
                    {
                        //改变托盘状态
                        var pallet = await Db.Queryable<SysPallets>().FirstAsync(m => m.PalletNo == palletNo && m.IsDel == "0");
                        if (pallet == null)
                        {
                            throw Oops.Bah("未在托盘表中查询到托盘信息");
                        }
                        pallet.Status = "0";
                        await Db.Updateable(pallet).ExecuteCommandAsync();
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    await Db.Updateable(noticeDetail).ExecuteCommandAsync();
                    var num = await Db.Queryable<BllExportNoticeDetail>()
                        .CountAsync(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty);
                    if (num <= 0)
                    {
                        notice.Status = "4"; //更改为执行完成
                        //修改出库单信息
                        await Db.Updateable(notice).ExecuteCommandAsync();
                        if (notice.IsWave == "1")
                        {
                            var waveNum = await Db.Queryable<BllExportNotice>()
                                .CountAsync(m => m.IsDel == "0" && m.WaveNo == notice.WaveNo && m.Status != "4");
                            if (waveNum == 0)
                            {
                                var wave = await Db.Queryable<BllWaveMage>().FirstAsync(m => m.IsDel == "0" && m.WaveNo == notice.WaveNo);
                                if (wave != null)
                                {
                                    wave.Status = "4";
                                    wave.UpdateUser = userId;
                                    wave.UpdateTime = DateTime.Now;
                                    await Db.Updateable(wave).ExecuteCommandAsync();
                                }
                            }
                        }
                    }
                }
                //添加操作日志记录
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "拣货出库", soNo, "拣货", $"在PDA上对出库单号为:{soNo}的托盘码为:{palletNo}的拣货操作", userId);
                Db.CommitTran();
            }
            //catch (AppFriendlyException e)
            //{
            //    Db.RollbackTran();
            //}
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        //出库pda拣货
        public async Task SoSetQtyPick(string soNo, string soDetailId, string palletNo, string PickQty, int userId)
        {
Wms/WMS.BLL/BllSoServer/CompleteDetailServer.cs
@@ -70,11 +70,12 @@
        }
        //查询拣货明细支码详细信息
        public List<CompleteDetailDto> GetCompBoxInfoList(string boxNo, string boxNo3)
        public List<CompleteDetailDto> GetCompBoxInfoList(string sONo, string boxNo, string boxNo3)
        {
            try
            {
                Expression<Func<BllCompleteDetail, bool>> item = Expressionable.Create<BllCompleteDetail>()
                    .AndIF(!string.IsNullOrWhiteSpace(sONo), it => it.SONo == sONo.Trim())
                    .AndIF(!string.IsNullOrWhiteSpace(boxNo), it => it.BoxNo == boxNo.Trim())
                    .AndIF(!string.IsNullOrWhiteSpace(boxNo3), it => it.BoxNo3.Contains(boxNo3.Trim()))
                    .ToExpression();
@@ -90,6 +91,7 @@
                        ExportAllotId = a.ExportAllotId,
                        BoxNo = a.BoxNo,
                        BoxNo2 = a.BoxNo2,
                        BoxNo3 = a.BoxNo3,
                        LotNo = a.LotNo,
                        LotText = a.LotText,
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -30,6 +30,7 @@
using System.Drawing.Drawing2D;
using Model.ModelDto.LogDto;
using AutoMapper.Internal;
using System.Diagnostics.Contracts;
namespace WMS.BLL.BllSoServer
{
@@ -2079,7 +2080,7 @@
                   .AndIF(!string.IsNullOrWhiteSpace(model.BitPalletMark), m => m.BitPalletMark == model.BitPalletMark)
                   .And(m => !string.IsNullOrWhiteSpace(m.WareHouseNo))
                   .And(a => a.Status == "0")
                   .And(a => a.WareHouseNo == "W02")
                   .And(a => a.WareHouseNo == "W01" || a.WareHouseNo == "W02")
                   .ToExpression();
            var data = await Db.Queryable<DataStockDetail>().Where(item).OrderBy(m => m.LocatNo).ToPageListAsync(model.Page, model.Limit, count);
            //data.Select(m => m.Status == "0" && m.IsDel == "0");
@@ -2313,6 +2314,264 @@
                    }
                    return outDtoList;
                }
                catch (Exception e)
                {
                    Db.RollbackTran();
                    throw new Exception(e.Message);
                }
                #endregion
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        /// <summary>
        /// 托盘出库(密集库)
        /// </summary>
        /// <param name="palletNo"></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> IssuePalletNoOutMk(string palletNo, string outMode, int userId, string url, out string str)
        {
            try
            {
                //判断托盘号是否为空
                if (string.IsNullOrWhiteSpace(palletNo))
                {
                    throw new Exception($"托盘号不能为空,请核实");
                }
                str = "";
                var stockDetailList = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo && m.IsDel == "0").ToList();
                if (stockDetailList.Count == 0)
                {
                    throw new Exception($"未在库内查询到该托盘信息");
                }
                var stocka = Db.Queryable<DataStock>().First(a => a.IsDel == "0" && a.SkuNo == stockDetailList[0].SkuNo);
                //验证库存托盘状态
                if (stockDetailList[0].Status != "0")
                {
                    throw new Exception($"当前托盘未处于待分配状态,请核实!");
                }
                //判断托盘库存信息分组后是否大于1条
                var detailGroup = stockDetailList.GroupBy(m => new { m.SkuNo, m.PalletNo, m.WareHouseNo, m.LocatNo }).ToList();
                if (detailGroup.Count > 1)
                {
                    throw new Exception($"未在库内查询到该托盘信息");
                }
                var locatStart = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == stockDetailList[0].LocatNo && w.Status == "1");
                if (locatStart == null)
                {
                    throw new Exception($"起始储位不存在或非空闲,请检查");
                }
                #region 集合
                var outDto1 = new List<OutCommandDto>(); //先出库数据的集合(深度为1的储位)
                var outDto2 = new List<OutCommandDto>(); //后出库数据的集合(深度为2的储位)
                var moveDto = new List<OutCommandDto>(); //要移库数据的集合
                #endregion
                var com = new Common();
                var allot = new AllotLocation();
                #region 集合
                Db.BeginTran();
                try
                {
                    List<LogTask> logTaskList = new List<LogTask>();//此次出库任务集合,为应对同托盘不同物料出库
                    var taskNoStr = "";
                    // 储位号
                    var locateNo = locatStart.LocatNo;
                    List<string> locateListStrs = new List<string>();
                    locateListStrs.Add(locateNo);
                    var row1 = int.Parse(locatStart.LocatNo.Substring(2, 2));
                    var row2 = int.Parse(locatStart.AisleOne.Substring(2, 2));
                    //需要移库的信息
                    var NeedMoveInfo = IsNeedMoveLocate(locatStart, locateListStrs, out int isOut);
                    if (isOut == 1)
                    {
                        //巷道组中有入库或移入的储位,或者是当前储位前有储位未下发成功的任务
                        throw new Exception($"巷道组中有入库或移入的储位,请稍后再试");
                    }
                    if (NeedMoveInfo.Count > 0)//需要移库
                    {
                        //判断库内空储位是否够
                        var okRoad = Db.Queryable<SysStorageRoadway>().Where(m => m.Status == "0" && m.IsDel == "0" && m.WareHouseNo == locatStart.WareHouseNo).Select(m => m.RoadwayNo).ToList();
                        var nullSlotNum = Db.Queryable<SysStorageLocat>().Count(m => m.RoadwayNo != locatStart.RoadwayNo && okRoad.Contains(m.RoadwayNo) && m.Status == "0");
                        //判断空储位的数量是否大于需要移库的数量
                        if (nullSlotNum >= NeedMoveInfo.Count)
                        {
                            foreach (var s in NeedMoveInfo)
                            {
                                //储位列
                                var rows = int.Parse(s.Substring(2, 2));
                                //获取移库储位
                                var moveAddress = GetMiJiMoveAddress(s, locatStart.AisleOne);
                                var tary = Db.Queryable<DataStockDetail>().First(m => m.LocatNo == s);
                                if (string.IsNullOrWhiteSpace(moveAddress)) // 判断是否获取到移库的库位
                                {
                                    throw new Exception($"出库前有货物,需移库但未查询到空储位");
                                }
                                else
                                {
                                    var ykTaskNo = new Common().GetMaxNo("TK");
                                    var ykTask = new LogTask    //出库任务
                                    {
                                        TaskNo = ykTaskNo,
                                        Sender = "WMS",
                                        Receiver = "WCS",
                                        IsSuccess = 0, //是否下发成功 0失败 1成功
                                        StartLocat = s,//起始位置
                                        EndLocat = moveAddress,//outMode,//目标位置
                                        PalletNo = tary.PalletNo,//托盘码
                                        IsSend = 1,//是否可再次下发
                                        IsCancel = 1,//是否可取消
                                        IsFinish = 1,//是否可完成
                                        Type = "2",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                        Status = "0",//任务状态0:等待执行1正在执行2执行完成
                                        OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                        Msg = "从" + s + "到" + moveAddress + "的移库任务", //关键信息
                                    };
                                    Db.Insertable(ykTask).ExecuteCommand();
                                    logTaskList.Add(ykTask);
                                    outDto1.Add(new OutCommandDto()
                                    {
                                        PalletNo = ykTask.PalletNo,//托盘号
                                        StartLocate = ykTask.StartLocat, // 起始位置
                                        StartRoadway = locatStart.RoadwayNo,//其实巷道
                                        EndLocate = moveAddress,//outMode, // 目标位置
                                        TaskNo = ykTaskNo, // 任务号
                                        TaskType = "2",// 任务类型 (出库)0入 1出 2移
                                        Order = Math.Abs(row2 - rows),
                                        Type = PLCTypeEnum.ShuttleCar
                                    });
                                    var slotChange = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == s);
                                    var slotChange2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == moveAddress);
                                    slotChange.Status = "5"; //改变状态(正在出库)
                                    slotChange2.Status = "4"; // 改变状态(正在移入)
                                    Db.Updateable(slotChange).ExecuteCommand();
                                    Db.Updateable(slotChange2).ExecuteCommand();
                                }
                            }
                        }
                        else
                        {
                            throw new Exception($"出库前有货物,需移库但空储位不够移库");
                        }
                    }
                    #region 添加出库任务
                    var taskNo = new Common().GetMaxNo("TK");
                    var exTask = new LogTask    //出库任务
                    {
                        TaskNo = taskNo,
                        Sender = "WMS",
                        Receiver = "WCS",
                        IsSuccess = 0, //是否下发成功 0失败 1成功
                        StartLocat = locatStart.LocatNo,//起始位置
                        EndLocat = outMode,//outMode,//目标位置
                        PalletNo = palletNo,//托盘码
                        IsSend = 1,//是否可再次下发
                        IsCancel = 1,//是否可取消
                        IsFinish = 1,//是否可完成
                        Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                        Status = "0",//任务状态0:等待执行1正在执行2执行完成
                        OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                        Msg = "从" + locatStart.LocatNo + "到" + outMode + "的出库任务", //关键信息
                    };
                    Db.Insertable(exTask).ExecuteCommand();
                    logTaskList.Add(exTask);
                    var endroad = allot.RoadwayToStationNum(locatStart.RoadwayNo, outMode);
                    outDto1.Add(new OutCommandDto()
                    {
                        PalletNo = palletNo,//托盘号
                        StartLocate = locatStart.LocatNo, // 起始位置
                        StartRoadway = locatStart.RoadwayNo,//起始巷道
                        EndLocate = outMode,//, // 目标位置
                        EndRoadway = endroad,
                        TaskNo = exTask.TaskNo, // 任务号
                        TaskType = "1",// 任务类型 (出库)0入 1出 2移
                        OutMode = outMode,  //出库口
                        Order = Math.Abs(row2 - row1),
                        Type = PLCTypeEnum.ShuttleCar
                    });
                    taskNoStr = exTask.TaskNo;
                    #endregion
                    #region 改变数据
                    locatStart.Status = "3"; //要出库的储位改变状态 正在出库
                    Db.Updateable(locatStart).ExecuteCommand();
                    #endregion
                    outDto1.AddRange(moveDto);
                    outDto1.AddRange(outDto2);
                    //添加操作日志记录
                    new OperationSOServer().AddLogOperationSo("出库作业", "托盘出库", palletNo, "出库", $"点击出库按钮出库托盘为:{palletNo}", 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 == 200)
                            {
                                //更改任务的发送返回时间//
                                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)
                {
@@ -3528,7 +3787,7 @@
                        }
                        //判断储位
                        var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0");//当前出库的储位信息
                        var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0" && m.WareHouseNo == "W01");//当前出库的储位信息
                        if (locate == null)
                        {
                            flagList.Add(2);
@@ -3616,8 +3875,8 @@
                                            outDto1.Add(new OutCommandDto()
                                            {
                                                PalletNo = item.PalletNo,//托盘号
                                                StartLocate = locate.LocatNo, // 起始位置
                                                PalletNo = ykTask.PalletNo,//托盘号
                                                StartLocate = ykTask.StartLocat, // 起始位置
                                                StartRoadway = locate.RoadwayNo,//其实巷道
                                                EndLocate = moveAddress,//outMode, // 目标位置 
                                                TaskNo = ykTaskNo, // 任务号
@@ -3865,9 +4124,9 @@
            // 010101 派列层
            //var bol = String.CompareOrdinal(lcoate.LocatNo, lcoate.AisleOne);
            
            var sArray = lcoate.LocatNo.Substring(4,2);
            var sArray = lcoate.LocatNo.Substring(2, 2);
            var row = int.Parse(sArray);//储位列
            var sArray2 = lcoate.AisleOne.Substring(4, 2);
            var sArray2 = lcoate.AisleOne.Substring(2, 2);
            var row2 = int.Parse(sArray2); //通道口列
            isOut = 0;
@@ -4015,7 +4274,21 @@
                    {
                        foreach (var item2 in item)
                        {
                            var okLan = Db.Queryable<SysStorageRoadway>().Where(m => m.Status == "0" && m.IsDel == "0").Select(m => m.RoadwayNo).ToList();
                        var okLan = Db.Queryable<SysStorageRoadway>().Where(m => m.Status == "0" && m.IsDel == "0" && m.WareHouseNo == item2.WareHouseNo).Select(m => m.RoadwayNo).ToList();
                        //当前托盘所在楼层
                        if (oldSlot.Layer == 1)
                        {
                            okLan = okLan.Where(m => Convert.ToInt32(m.Replace("MR", "")) <= 56).ToList();
                        }
                        else if (oldSlot.Layer == 2)
                        {
                            okLan = okLan.Where(m => Convert.ToInt32(m.Replace("MR", "")) > 56).ToList();
                        }
                        else
                        {
                            throw new Exception("当前托盘所在楼层异常");
                        }
                            var tray2 = Db.Queryable<DataStockDetail>().Where(m => m.SkuNo == item2.SkuNo
                            && m.LotNo == item2.LotNo && !slotList.Contains(m.LocatNo) && m.PalletTags == item2.PalletTags && okLan.Contains(m.RoadwayNo)).ToList();
                            foreach (var s in tray2)
@@ -4202,7 +4475,7 @@
            location = "";
            
            // 判断储位组是否有空储位   关联库存明细表可防止储位状态不准确避免造成满入异常//not in ('1','2','4','6','7','8')
            sqlString = $"select LocatNo,Column,AisleOne from SysStorageLocat where RoadwayNo = {laneWayId} and Status in ('0') and LocatNo not in (select LocatNo from DataStockDetail where RoadwayNo = { laneWayId}) order by Row;";
            sqlString = $"select LocatNo,[Column],AisleOne from SysStorageLocat where IsDel=0 and WareHouseNo='W01' and RoadwayNo = '{laneWayId}' and Status in ('0') and LocatNo not in (select LocatNo from DataStockDetail where RoadwayNo = '{laneWayId}') order by Row;";
            var slotModel =Db.SqlQueryable<LocateInfo>(sqlString).ToList();
            if (slotModel.Count == 0)
            {
Wms/WMS.BLL/DataServer/StockServer.cs
@@ -47,9 +47,11 @@
        /// <param name="lotNo">批次</param>
        /// <param name="status">库存状态</param>
        /// <param name="inspectStatus">质检状态</param>
        /// <param name="wareHouseNo">所属仓库</param>
        /// <param name="areaNo">所属区域</param>
        /// <returns></returns>
        public async Task<List<MateDataStockDto>> GetDataStockList(string selectType, string skuNo, string skuName, string ownerNo, 
            string ownerName, string lotNo, string status, string inspectStatus)
            string ownerName, string lotNo, string status, string inspectStatus, string wareHouseNo, string areaNo)
        {
            Expression<Func<DataStockDetail, bool>> item = Expressionable.Create<DataStockDetail>()
            .AndIF(!string.IsNullOrEmpty(skuNo), a => a.SkuNo.Contains(skuNo))
@@ -59,6 +61,8 @@
            .AndIF(!string.IsNullOrEmpty(lotNo), a => a.LotNo.Contains(lotNo))
            .AndIF(!string.IsNullOrEmpty(status), a => a.Status == status)
            .AndIF(!string.IsNullOrEmpty(inspectStatus), a => a.InspectStatus == inspectStatus)
            .AndIF(!string.IsNullOrEmpty(wareHouseNo), a => a.WareHouseNo == wareHouseNo)
            .AndIF(!string.IsNullOrEmpty(areaNo), a => a.AreaNo == areaNo)
            .And(a => a.IsDel == "0")
            .ToExpression();//注意 这一句 不能少
Wms/WMS.IBLL/IBllSoServer/ICompleteDetailServer.cs
@@ -26,7 +26,7 @@
        /// <param name="boxNo">箱码</param>
        /// <param name="boxNo3">支码</param>
        /// <returns></returns>
        List<CompleteDetailDto> GetCompBoxInfoList(string boxNo,string boxNo3);
        List<CompleteDetailDto> GetCompBoxInfoList(string sONo, string boxNo,string boxNo3);
        #region 数据归档
        /// <summary>
Wms/WMS.IBLL/IBllSoServer/IExportNoticeServer.cs
@@ -123,6 +123,18 @@
        /// <returns></returns>
        List<OutCommandDto> IssuePalletNoOut(string palletNo, string outMode, int userId, string url, out string str);
        /// <summary>
        /// 托盘出库(密集库)
        /// </summary>
        /// <param name="palletNo"></param>
        /// <param name="outMode"></param>
        /// <param name="userId"></param>
        /// <param name="url"></param>
        /// <param name="str"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        List<OutCommandDto> IssuePalletNoOutMk(string palletNo, string outMode, int userId, string url, out string str);
        //------------------------------------------------------------------------------------------
        #region 备料
Wms/WMS.IBLL/IDataServer/IStockServer.cs
@@ -23,9 +23,11 @@
        /// <param name="lotNo">批次</param>
        /// <param name="status">库存状态</param>
        /// <param name="inspectStatus">质检状态</param>
        /// <param name="wareHouseNo">所属仓库</param>
        /// <param name="areaNo">所属区域</param>
        /// <returns></returns>
        Task<List<MateDataStockDto>> GetDataStockList(string selectType, string skuNo, string skuName, string ownerNo, string ownerName, string lotNo, 
            string status, string inspectStatus);
            string status, string inspectStatus, string wareHouseNo, string areaNo);
        /// <summary>
        /// 获取库存明细
Wms/WMS.IBLL/IPdaServer/IPdaSoServer.cs
@@ -142,6 +142,18 @@
        /// <param name="boxNo3">支/袋码</param>
        /// <param name="userId">操作人</param>
        Task SoSetPick(string soNo, string soDetailId, string palletNo, string boxNo, string boxNo3, string PickQty, int userId);
        /// <summary>
        /// 出库pda拣货-JC34
        /// </summary>
        /// <param name="soNo"></param>
        /// <param name="soDetailId"></param>
        /// <param name="palletNo"></param>
        /// <param name="boxNo">箱码/盒码/支码</param>
        /// <param name="pickQty1"></param>
        /// <param name="userId"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        Task SoSetPick34(string soNo, string soDetailId, string palletNo, string boxNo, string pickQty1, int userId);
        /// <summary>
        /// 出库pda拣货
Wms/Wms/Controllers/BllSoController.cs
@@ -582,11 +582,11 @@
        }
        [HttpGet]
        public IActionResult GetCompBoxInfoList( string boxNo,string boxNo3)
        public IActionResult GetCompBoxInfoList(string sONo, string boxNo,string boxNo3)
        {
            try
            {
                var bolls = _comDetailSvc.GetCompBoxInfoList(boxNo, boxNo3);
                var bolls = _comDetailSvc.GetCompBoxInfoList(sONo, boxNo, boxNo3);
                return Ok(new { code = 0, count = bolls.Count, msg = "拣货明细信息", data = bolls });
            }
@@ -638,12 +638,21 @@
                    return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
                }
                //验证出库口
                //if (string.IsNullOrWhiteSpace(outMode))
                //{
                //    return Ok(new { code = 1, msg = "请选择出库口" });
                //}
                if (string.IsNullOrWhiteSpace(outMode))
                {
                    return Ok(new { code = 1, msg = "请选择出库口" });
                }
                string str = string.Empty;
                var list = new List<OutCommandDto>();
                if (outMode == "17" || outMode == "18")
                {
                    list = _exNoticeSvc.IssuePalletNoOutMk(palletNo, outMode, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out str);
                }
                else
                {
                    list = _exNoticeSvc.IssuePalletNoOut(palletNo, outMode, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out str);
                }
                var list = _exNoticeSvc.IssuePalletNoOut(palletNo, outMode, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out string str);
                return Ok(new { code = 0, msg = str, data = list });
Wms/Wms/Controllers/PdaSoController.cs
@@ -160,7 +160,8 @@
        [HttpPost]
        public async Task SoSetPick(PdaSoVm model)
        {
            await _pdaSoSvc.SoSetPick(model.SoNo, model.SoDetailId, model.PalletNo, model.BoxNo, model.BoxNo3, model.PickQty, _userManager.UserId);
            //await _pdaSoSvc.SoSetPick(model.SoNo, model.SoDetailId, model.PalletNo, model.BoxNo, model.BoxNo3, model.PickQty, _userManager.UserId);
            await _pdaSoSvc.SoSetPick34(model.SoNo, model.SoDetailId, model.PalletNo, model.BoxNo, model.PickQty, _userManager.UserId);
        }
        /// <summary>
Wms/Wms/Controllers/StatisticalController.cs
@@ -7,6 +7,7 @@
using WMS.IBLL.IDataServer;
using System.Security.Claims;
using System.Threading.Tasks;
using Model.ModelDto.SysDto;
namespace Wms.Controllers
{
@@ -51,9 +52,9 @@
        /// <param name="inspectStatus">质检状态</param>
        /// <returns></returns>
        [HttpGet]
        public async Task<IActionResult> GetInventoryList(string selectType, string skuNo, string skuName, string ownerNo, string ownerName, string lotNo, string status, string inspectStatus)
        public async Task<IActionResult> GetInventoryList(string selectType, string skuNo, string skuName, string ownerNo, string ownerName, string lotNo, string status, string inspectStatus, string wareHouseNo, string areaNo)
        {
            List<MateDataStockDto> StockList = await _stock.GetDataStockList(selectType, skuNo, skuName, ownerNo, ownerName, lotNo, status, inspectStatus);
            List<MateDataStockDto> StockList = await _stock.GetDataStockList(selectType, skuNo, skuName, ownerNo, ownerName, lotNo, status, inspectStatus, wareHouseNo, areaNo);
            return Ok(new
            {
                data = StockList,