test
9 小时以前 98e221d6dc26183efab868ee5f11a65d5791304e
Merge branch 'master' of http://47.95.120.53:8083/r/JC34WMS
22个文件已修改
1651 ■■■■ 已修改文件
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 19 ●●●●● 补丁 | 查看 | 原始文档 | 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 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs 516 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllSoServer/CompleteDetailServer.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs 827 ●●●●● 补丁 | 查看 | 原始文档 | 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 25 ●●●●● 补丁 | 查看 | 原始文档 | 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()
                        }
@@ -113,6 +115,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>
@@ -405,8 +399,17 @@
                 //监听数据操作
                table.on('tool(LAY-app-content-list)', function(obj) {
                    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;
@@ -286,7 +286,7 @@
                        Db.Updateable(sd1).ExecuteCommand();
                    }
                    else
                    {
                    {
                        // 库存不存在 插入数据
                        sd1 = new DataStockDetail()
                        {
@@ -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 库存明细
                    sd1.Qty = bind.Qty;
                    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
@@ -1585,9 +1585,9 @@
                }
                //开启事务
                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
{
@@ -398,7 +399,7 @@
                            {
                                throw new Exception("批次不可为空!");
                            }
                        }
                        }
                        //库存明细
                        List<DataStockDetail> stockDetails;
                        //指定批次
@@ -522,7 +523,7 @@
                                        q2 = q3;
                                    }
                                    if (q2 > d.skuQty - q1)
                                    {
                                    {
                                        if (!dic.ContainsKey(stockInfo.Id))
                                        {
                                            dic.Add(stockInfo.Id, d.skuQty - q1);
@@ -535,7 +536,7 @@
                                        q1 += d.skuQty - q1;
                                    }
                                    else
                                    {
                                    {
                                        if (!dic.ContainsKey(stockInfo.Id))
                                        {
                                            dic.Add(stockInfo.Id, (decimal)q2);
@@ -599,7 +600,7 @@
                    var notice = new BllExportNotice()
                    {
                        SONo = billNo,
                        OrderCode=model.orderNo,
                        OrderCode = model.orderNo,
                        Type = model.orderType,
                        Status = "0",
                        Origin = "SAP",
@@ -609,7 +610,7 @@
                        IsWave = "0",
                        WaveNo = "",
                        IsDespatch = "0",
                        CreateUser = 0,
                    };
                    if (houseNo == "1000" || houseNo == "1001" || houseNo == "2000" || houseNo == "2002" || houseNo == "2003" || houseNo == "2004")
@@ -775,14 +776,14 @@
                throw new Exception(e.Message);
            }
        }
        //生产叫料
        public bool MESProductionCall(ProductionCallVm model)
        {
            try
            {
                //验证是否备料完成
                var notice = Db.Queryable<BllExportNotice>().First(m=>m.IsDel == "0" && m.OrderCode == model.OrderCode);
                var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.OrderCode == model.OrderCode);
                if (notice == null)
                {
                    throw new Exception("未查询到此工单号");
@@ -803,7 +804,7 @@
                    throw new Exception("当前单据物料在此投料口叫料信息已收到,无需重复下发");
                }
                //判断当前投料口是否有其它工单投料
                var call2 = Db.Queryable<BllProductionCallTask>().First(m => m.IsDel == "0" && m.PutInLocation == model.PutInLocation && m.OrderCode != model.OrderCode );
                var call2 = Db.Queryable<BllProductionCallTask>().First(m => m.IsDel == "0" && m.PutInLocation == model.PutInLocation && m.OrderCode != model.OrderCode);
                if (call2 != null)
                {
                    throw new Exception("此投料口有其它单据物料叫料信息");
@@ -834,7 +835,7 @@
                    foreach (var pro in proCallList)
                    {
                        foreach (var item in locateList)
                        {
                        {
                            //获取备好料的托盘信息
                            var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.Status == "2" && m.SONo == notice.SONo && m.SkuNo == pro.SkuNo && !list.Contains(m.Id)).Select(m => m.PalletNo).ToList();
@@ -862,7 +863,7 @@
                            };
                            Db.Insertable(exTask).ExecuteCommand();
                            //更改分配表的任务号列
                            var allot = Db.Queryable<BllExportAllot>().First(m=>m.IsDel == "0" && m.Status =="2" && m.SONo == notice.SONo &&  m.StockId == stockDetail.Id);
                            var allot = Db.Queryable<BllExportAllot>().First(m => m.IsDel == "0" && m.Status == "2" && m.SONo == notice.SONo && m.StockId == stockDetail.Id);
                            allot.TaskNo = taskNo;
                            Db.Updateable(allot).ExecuteCommand();
                            list.Add(allot.Id);
@@ -871,14 +872,14 @@
                            item.PalletNo = stockDetail.PalletNo;
                            Db.Updateable(item).ExecuteCommand();
                            var locate = Db.Queryable<SysStorageLocat>().First(m=>m.LocatNo == stockDetail.LocatNo);
                            var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == stockDetail.LocatNo);
                            locate.Status = "5";
                            Db.Updateable(locate).ExecuteCommand();
                            break;
                        }
                    }
                    Db.CommitTran();
                }
@@ -887,7 +888,7 @@
                    Db.RollbackTran();
                    throw new Exception(e.Message);
                }
                return true;
            }
            catch (Exception e)
@@ -927,8 +928,8 @@
                .LeftJoin<SysUserInfor>((a, b, c) => a.CreateUser == c.Id)
                .LeftJoin<SysUserInfor>((a, b, c, d) => a.CreateUser == d.Id)
                .LeftJoin<SysUserInfor>((a, b, c, d, e) => a.CheckUser == e.Id)
                .LeftJoin<SysWareHouse>((a, b, c, d, e,f) => a.WareHouseNo == f.WareHouseNo)
                .Select((a, b, c, d, e,f) => new ExportNoticeDto()
                .LeftJoin<SysWareHouse>((a, b, c, d, e, f) => a.WareHouseNo == f.WareHouseNo)
                .Select((a, b, c, d, e, f) => new ExportNoticeDto()
                {
                    Id = a.Id,
                    SONo = a.SONo,
@@ -987,7 +988,7 @@
                switch (type)//0:原料 1:包材 2:成品 3:耗材 4:半成品
                {
                    case "0"://成品出库
                        if (house !="W01")
                        if (house != "W01")
                        {
                            throw new Exception("成品出库只能选择成品库");
                        }
@@ -1186,7 +1187,7 @@
                switch (model.WareHouseNo)
                {
                    case "W01"://成品库
                        if (skuList.Any(m=>m.Type !="2"))
                        if (skuList.Any(m => m.Type != "2"))
                        {
                            throw new Exception("仓库与出库物料不符");
                        }
@@ -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");
@@ -2329,6 +2330,264 @@
            }
        }
        /// <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)
                {
                    Db.RollbackTran();
                    throw new Exception(e.Message);
                }
                #endregion
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        #endregion
        #region 自动分配、取消分配、获取手动分配的数据源、手动分配
@@ -2516,7 +2775,7 @@
                        Dictionary<int, decimal> stockQtyDic = new Dictionary<int, decimal>();//托出库物品数
                        var qty = 0m;
                        var house = "";
                        //分配货物
                        qty += assign.AllotPallets(stockDetail, needQty, pNum, bNum, stockQtyDic, notice.WareHouseNo);
                        foreach (var sc in stockQtyDic)
@@ -3067,7 +3326,7 @@
        {
            try
            {
                var notcie = Db.Queryable<BllExportNotice>().First(m=>m.IsDel == "0" && m.SONo == soNo);
                var notcie = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == soNo);
                if (notcie == null)
                {
                    throw new Exception("未查询到出库单信息");
@@ -3155,9 +3414,9 @@
                        {
                            throw new Exception("出库口工位异常");
                        }
                        var taskNoStr = "";
                        // 储位号
                        var locateNo = outStockDetail.First(m => m.PalletNo == item.PalletNo).LocatNo;
@@ -3200,7 +3459,7 @@
                            }
                            flagList.Add(0);
                            continue;
                        }
                        var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0");//当前出库的储位信息
@@ -3221,7 +3480,7 @@
                        if (locate.Status == "1") //有物品
                        {
                            #region 添加出库任务
                            var taskNo = new Common().GetMaxNo("TK");
                            var exTask = new LogTask    //出库任务
                            {
@@ -3253,13 +3512,13 @@
                                StartLocate = locate.LocatNo, // 起始位置
                                StartRoadway = locate.RoadwayNo,//其实巷道
                                EndLocate = outModeLocate, // 目标位置 
                                Order = 999,
                                Type  = PLCTypeEnum.AGV
                                Type = PLCTypeEnum.AGV
                            });
                            taskNoStr = exTask.TaskNo;
                            #endregion
                            #region 改变数据
@@ -3347,7 +3606,7 @@
                            flagList.Add(1);
                        }
                    }
                    //添加操作日志记录
                    var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", soNo, "出库", $"点击出库按钮出库单号为:{soNo}的出库单", userId);
                    Db.CommitTran();
@@ -3395,8 +3654,8 @@
                            //if (wcsModel.StatusCode == 0)
                            //{
                            //    //更改任务的发送返回时间//
                                new TaskServer().EditTaskIssueOk(list2, time1, time2);
                                str += "下发成功";
                            new TaskServer().EditTaskIssueOk(list2, time1, time2);
                            str += "下发成功";
                            //}
                            //if (wcsModel.StatusCode == -1)
                            //{
@@ -3462,7 +3721,7 @@
                //要出库的明细集合
                var outStockDetail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && outLpnList.Contains(m.PalletNo)).ToList();
                //所有要出库的储位集合
                var locateListStrs = outStockDetail.Where(m=> !string.IsNullOrWhiteSpace(m.LocatNo)).Select(m => m.LocatNo).Distinct().ToList();
                var locateListStrs = outStockDetail.Where(m => !string.IsNullOrWhiteSpace(m.LocatNo)).Select(m => m.LocatNo).Distinct().ToList();
                //物料编码表
                var skuList = Db.Queryable<SysMaterials>().Where(w => w.IsDel == "0");
                //包装表
@@ -3471,13 +3730,13 @@
                try
                {
                    List<LogTask> logTaskList = new List<LogTask>();//此次出库任务集合,为应对同托盘不同物料出库
                    //循环分配的信息生成出库任务
                    foreach (var item in list)
                    {
                        var taskNoStr = "";
                        // 储位号
                        var locateNo = outStockDetail.First(m => m.PalletNo == item.PalletNo).LocatNo;
@@ -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);
@@ -3545,7 +3804,7 @@
                        if (locate.Status == "1") //有物品
                        {
                            var row1 = int.Parse(locate.LocatNo.Substring(2,2));
                            var row1 = int.Parse(locate.LocatNo.Substring(2, 2));
                            var row2 = int.Parse(locate.AisleOne.Substring(2, 2));
                            //需要移库的信息 
                            var NeedMoveInfo = IsNeedMoveLocate(locate, locateListStrs, out int isOut);
@@ -3567,7 +3826,7 @@
                                    foreach (var s in NeedMoveInfo)
                                    {
                                        //储位列
                                        var rows = int.Parse(s.Substring(2,2));
                                        var rows = int.Parse(s.Substring(2, 2));
                                        //获取移库储位
                                        var moveAddress = GetMiJiMoveAddress(s, locate.AisleOne);
@@ -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, // 任务号
@@ -3625,7 +3884,7 @@
                                                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);
@@ -3647,7 +3906,7 @@
                                }
                            }
                            #region 添加出库任务
                            var taskNo = new Common().GetMaxNo("TK");
                            var exTask = new LogTask    //出库任务
                            {
@@ -3685,7 +3944,7 @@
                            });
                            taskNoStr = exTask.TaskNo;
                            #endregion
                            #region 改变数据
@@ -3859,26 +4118,26 @@
        /// <param name="addressList">要出口的储位集合</param>
        /// <param name="isOut">是否出库 1:有未下发的任务在前面</param>
        /// <returns>需要移库的集合(如果为空则不需移库)</returns>
        private List<string> IsNeedMoveLocate(SysStorageLocat lcoate,List<string> locateStrList, out int isOut)
        private List<string> IsNeedMoveLocate(SysStorageLocat lcoate, List<string> locateStrList, out int isOut)
        {
            var nowAddress = new List<string>(); //需要移库的集合
            // 010101 派列层
            //var bol = String.CompareOrdinal(lcoate.LocatNo, lcoate.AisleOne);
            var sArray = lcoate.LocatNo.Substring(4,2);
                                                 // 010101 派列层
                                                 //var bol = String.CompareOrdinal(lcoate.LocatNo, lcoate.AisleOne);
            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;
            var bol = row2 - row > 0;
            //同组的储位集合
            var slotList = Db.Queryable<SysStorageLocat>().Where(m => m.RoadwayNo == lcoate.RoadwayNo).ToList();
            List<string> list;
            if (bol)
            {
                //储位小于通道口   倒序
@@ -3931,7 +4190,7 @@
            {
                return nowAddress;
            }
            return nowAddress;
        }
@@ -3954,7 +4213,7 @@
            // 获取移库目标储位
            //
            var sArray = oldAddress.Substring(4,2);
            var sArray = oldAddress.Substring(4, 2);
            var ceng = int.Parse(sArray);
            //
            var sArray2 = slotOut.Substring(2, 2);
@@ -3985,206 +4244,220 @@
            //根据十字口差值最小的排序
            shiKou3 = shiKou3.OrderBy(m => m.distNum).ToList();
                /**
                //1 移动到最近的空储位,必须回移。
                //根据四向车移动轨迹计算出最近空储位。
                //出库完成后根据批次号 生产日期 出口计算回移储位。
            /**
            //1 移动到最近的空储位,必须回移。
            //根据四向车移动轨迹计算出最近空储位。
            //出库完成后根据批次号 生产日期 出口计算回移储位。
                //2 移动适合存放的组,系统自动计算是否回移。
                //根据批次号 生产日期 出口 物料等计算出移库目标储位
                //出库完成后,判断是否有比当前库位更合适的存储储位,有移动,无不移动。
                */
            //2 移动适合存放的组,系统自动计算是否回移。
            //根据批次号 生产日期 出口 物料等计算出移库目标储位
            //出库完成后,判断是否有比当前库位更合适的存储储位,有移动,无不移动。
            */
                var oldSlot = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == oldAddress);
                if (oldSlot == null)
            var oldSlot = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == oldAddress);
            if (oldSlot == null)
            {
                throw new Exception("未能找到储位信息");
            }
            #region 1不需要回移的
            //后期库存托盘表改了后需要加筛选条件托盘的状态(退货/预拣)
            var tray1 = Db.Queryable<DataStockDetail>().Where(m => m.LocatNo == oldAddress).ToList();
            //根据物料、批次、托盘状态(退货/预拣/暂存等)分组判断
            var d = tray1.GroupBy(m => new { m.SkuNo, m.LotNo, m.PalletTags });
            var location = string.Empty;
            if (d.Any())
            {
                //旧储位同组的储位集合
                var slotList = Db.Queryable<SysStorageLocat>().Where(m => m.RoadwayNo == oldSlot.RoadwayNo).Select(m => m.LocatNo).ToList();
                foreach (var item in d)
                {
                    throw new Exception("未能找到储位信息");
                }
                #region 1不需要回移的
                //后期库存托盘表改了后需要加筛选条件托盘的状态(退货/预拣)
                var tray1 = Db.Queryable<DataStockDetail>().Where(m => m.LocatNo == oldAddress).ToList();
                //根据物料、批次、托盘状态(退货/预拣/暂存等)分组判断
                var d = tray1.GroupBy(m => new { m.SkuNo, m.LotNo, m.PalletTags });
                var location = string.Empty;
                if (d.Any())
                {
                    //旧储位同组的储位集合
                    var slotList = Db.Queryable<SysStorageLocat>().Where(m => m.RoadwayNo == oldSlot.RoadwayNo).Select(m => m.LocatNo).ToList();
                    foreach (var item in d)
                    foreach (var item2 in item)
                    {
                        foreach (var item2 in item)
                        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)
                        {
                            var okLan = Db.Queryable<SysStorageRoadway>().Where(m => m.Status == "0" && m.IsDel == "0").Select(m => m.RoadwayNo).ToList();
                            var tray2 = Db.Queryable<DataStockDetail>().Where(m => m.SkuNo == item2.SkuNo
                            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)
                        foreach (var s in tray2)
                        {
                            if (string.IsNullOrWhiteSpace(s.RoadwayNo))//判断是否在库外,如是跳过
                            {
                                if (string.IsNullOrWhiteSpace(s.RoadwayNo))//判断是否在库外,如是跳过
                                continue;
                            }
                            var lan = Db.Queryable<SysStorageLocat>().Where(m => m.RoadwayNo == s.RoadwayNo).OrderBy(m => m.LocatNo).ToList();
                            //判断是否有入库中、出库中、移入中、移出中
                            if (lan.Count(m => m.Status == "2" || m.Status == "3" || m.Status == "4" || m.Status == "5") > 0)
                            {
                                continue;
                            }
                            if (lan.Count(m => m.Status == "0") > 0)
                            {
                                var bol = GetBecomingLocation(s.RoadwayNo, ref location);
                                if (bol && !string.IsNullOrWhiteSpace(location))
                                {
                                    continue;
                                }
                                var lan = Db.Queryable<SysStorageLocat>().Where(m => m.RoadwayNo == s.RoadwayNo).OrderBy(m => m.LocatNo).ToList();
                                //判断是否有入库中、出库中、移入中、移出中
                                if (lan.Count(m => m.Status == "2" || m.Status == "3" || m.Status == "4" || m.Status == "5") > 0)
                                {
                                    continue;
                                }
                                if (lan.Count(m => m.Status == "0") > 0)
                                {
                                    var bol = GetBecomingLocation(s.RoadwayNo, ref location);
                                    if (bol && !string.IsNullOrWhiteSpace(location))
                                    {
                                        newAddress = location;
                                        return newAddress;
                                    }
                                    newAddress = location;
                                    return newAddress;
                                }
                            }
                        }
                    }
                }
                #endregion
            }
                #region 2需要回移的
            #endregion
                ////如果没有找到合适的储位
                //if (string.IsNullOrWhiteSpace(newAddress))
                //{
                //    foreach (var s in shiKou3)
                //    {
                //        var r = int.Parse(s.slotCode.Substring(0, 2));
                //        var l = int.Parse(s.slotCode.Substring(2, 2));
                //        var c = int.Parse(s.slotCode.Substring(4, 2));
                //        //查询空储位
                //        var sqlString = $@"select LocatNo,Row,Column,Layer,(ABS(Row-{r}) + ABS(Column-{l}) ) as distNum
                //                from SysStorageLocat where (AisleOneRow  = {r} or AisleTwoRow = {r}) and Status in (0) and
                //                 RoadwayNo !='{oldSlot.RoadwayNo}' and RoadwayNo not in(select RoadwayNo from SysStorageRoadway where Status = 1) order by distNum,SlotCode";
            #region 2需要回移的
                //        var addressModels = dataContext.ExecuteQuery<addreClass>(sqlString).ToList();
                //        foreach (var item in addressModels)
                //        {                            、
                //            newAddress = item.slotCode;
                //            var dz = newAddress.Split(new char[] { '-' });
                //            var l1 = dz[1];
                //            var c1 = dz[0];
                //            newLaneWayAddress = $"{c1}-{l1}-{a[2]}";
                //            flags = newLaneWayAddress;
            ////如果没有找到合适的储位
            //if (string.IsNullOrWhiteSpace(newAddress))
            //{
            //    foreach (var s in shiKou3)
            //    {
                //            var slotModel = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == item.slotCode);
            //        var r = int.Parse(s.slotCode.Substring(0, 2));
            //        var l = int.Parse(s.slotCode.Substring(2, 2));
            //        var c = int.Parse(s.slotCode.Substring(4, 2));
            //        //查询空储位
            //        var sqlString = $@"select LocatNo,Row,Column,Layer,(ABS(Row-{r}) + ABS(Column-{l}) ) as distNum
            //                from SysStorageLocat where (AisleOneRow  = {r} or AisleTwoRow = {r}) and Status in (0) and
            //                 RoadwayNo !='{oldSlot.RoadwayNo}' and RoadwayNo not in(select RoadwayNo from SysStorageRoadway where Status = 1) order by distNum,SlotCode";
                //            var lan = dataContext.WmsBaseSlot.Where(m => m.SlotLanewayId == slotModel.SlotLanewayId).ToList();
                //            if (slotModel.SlotRow > int.Parse(a[2]))
                //            {
                //                // 取最上面一排
                //                lan = lan.OrderBy(m => m.SlotCode).ToList();
                //                for (int i = 0; i < lan.Count; i++)
                //                {
                //                    var slot = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == lan[i].SlotCode);
                //                    if (slot.SlotStatus == 0)
                //                    {
                //                        if (i == lan.Count - 1)
                //                        {
                //                            newAddress = lan[lan.Count - 1].SlotCode;
            //        var addressModels = dataContext.ExecuteQuery<addreClass>(sqlString).ToList();
            //        foreach (var item in addressModels)
            //        {                            、
                //                            break;
                //                        }
                //                        else
                //                        {
                //                            continue;
                //                        }
                //                    }
                //                    else
                //                    {
                //                        newAddress = lan[i - 1].SlotCode;
                //                        break;
                //                    }
                //                }
            //            newAddress = item.slotCode;
            //            var dz = newAddress.Split(new char[] { '-' });
            //            var l1 = dz[1];
            //            var c1 = dz[0];
            //            newLaneWayAddress = $"{c1}-{l1}-{a[2]}";
            //            flags = newLaneWayAddress;
                //            }
                //            else
                //            {
                //                // 取最下面一排
                //                lan = lan.OrderByDescending(m => m.SlotCode).ToList();
                //                for (int i = 0; i < lan.Count; i++)
                //                {
                //                    var slot = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == lan[i].SlotCode);
                //                    if (slot.SlotStatus == 0)
                //                    {
                //                        if (i == lan.Count - 1)
                //                        {
                //                            newAddress = lan[lan.Count - 1].SlotCode;
                //                            break;
                //                        }
                //                        else
                //                        {
                //                            continue;
                //                        }
            //            var slotModel = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == item.slotCode);
                //                    }
                //                    else
                //                    {
                //                        newAddress = lan[i - 1].SlotCode;
                //                        break;
                //                    }
                //                }
                //            }
                //            //添加回移任务
                //            AddHyTask(oldAddress, newAddress, newLaneWayAddress, oldSlot.SlotLanewayId, slotOut, billCode);
                //            refLanWayId = slotModel.SlotLanewayId;
                //            refLanOutCode = newLaneWayAddress;
                //            //9:锁定储位
                //            var updateSlot = dataContext.WmsBaseSlot.Where(m => m.SlotLanewayId == slotModel.SlotLanewayId).ToList();
                //            var newAddressRow = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == newAddress);
                //            if (newAddressRow.SlotRow > int.Parse(a[2]))
                //            {
                //                updateSlot = updateSlot.Where(m => m.SlotRow < newAddressRow.SlotRow && m.SlotRow > int.Parse(a[2])).OrderBy(m => m.SlotCode).ToList();
                //            }
                //            else
                //            {
                //                updateSlot = updateSlot.Where(m => m.SlotRow > newAddressRow.SlotRow && m.SlotRow < int.Parse(a[2])).OrderByDescending(m => m.SlotCode).ToList();
            //            var lan = dataContext.WmsBaseSlot.Where(m => m.SlotLanewayId == slotModel.SlotLanewayId).ToList();
            //            if (slotModel.SlotRow > int.Parse(a[2]))
            //            {
            //                // 取最上面一排
            //                lan = lan.OrderBy(m => m.SlotCode).ToList();
            //                for (int i = 0; i < lan.Count; i++)
            //                {
            //                    var slot = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == lan[i].SlotCode);
            //                    if (slot.SlotStatus == 0)
            //                    {
            //                        if (i == lan.Count - 1)
            //                        {
            //                            newAddress = lan[lan.Count - 1].SlotCode;
                //            }
                //            foreach (var source in updateSlot)
                //            {
                //                if (source.SlotCode == newAddress)
                //                {
                //                    continue;
                //                }
                //                if (source.SlotStatus == 0)
                //                {
                //                    source.SlotStatus = 8;
                //                }
                //            }
            //                            break;
            //                        }
            //                        else
            //                        {
            //                            continue;
            //                        }
                //            if (updateSlot.Count <= 0)
                //            {
                //                refLanWayId = "";
                //                refLanOutCode = "";
                //            }
                //            dataContext.SubmitChanges();
                //            return newAddress;
            //                    }
            //                    else
            //                    {
            //                        newAddress = lan[i - 1].SlotCode;
            //                        break;
            //                    }
            //                }
                //        }
            //            }
            //            else
            //            {
            //                // 取最下面一排
            //                lan = lan.OrderByDescending(m => m.SlotCode).ToList();
            //                for (int i = 0; i < lan.Count; i++)
            //                {
            //                    var slot = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == lan[i].SlotCode);
            //                    if (slot.SlotStatus == 0)
            //                    {
            //                        if (i == lan.Count - 1)
            //                        {
            //                            newAddress = lan[lan.Count - 1].SlotCode;
            //                            break;
            //                        }
            //                        else
            //                        {
            //                            continue;
            //                        }
                //    }
            //                    }
            //                    else
            //                    {
            //                        newAddress = lan[i - 1].SlotCode;
            //                        break;
            //                    }
            //                }
            //            }
            //            //添加回移任务
            //            AddHyTask(oldAddress, newAddress, newLaneWayAddress, oldSlot.SlotLanewayId, slotOut, billCode);
            //            refLanWayId = slotModel.SlotLanewayId;
            //            refLanOutCode = newLaneWayAddress;
            //            //9:锁定储位
            //            var updateSlot = dataContext.WmsBaseSlot.Where(m => m.SlotLanewayId == slotModel.SlotLanewayId).ToList();
            //            var newAddressRow = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == newAddress);
            //            if (newAddressRow.SlotRow > int.Parse(a[2]))
            //            {
            //                updateSlot = updateSlot.Where(m => m.SlotRow < newAddressRow.SlotRow && m.SlotRow > int.Parse(a[2])).OrderBy(m => m.SlotCode).ToList();
            //            }
            //            else
            //            {
            //                updateSlot = updateSlot.Where(m => m.SlotRow > newAddressRow.SlotRow && m.SlotRow < int.Parse(a[2])).OrderByDescending(m => m.SlotCode).ToList();
                //}
            //            }
            //            foreach (var source in updateSlot)
            //            {
            //                if (source.SlotCode == newAddress)
            //                {
            //                    continue;
            //                }
            //                if (source.SlotStatus == 0)
            //                {
            //                    source.SlotStatus = 8;
            //                }
            //            }
                return newAddress;
                #endregion
            //            if (updateSlot.Count <= 0)
            //            {
            //                refLanWayId = "";
            //                refLanOutCode = "";
            //            }
            //            dataContext.SubmitChanges();
            //            return newAddress;
            //        }
            //    }
            //}
            return newAddress;
            #endregion
        }
        /// <summary>
@@ -4196,14 +4469,14 @@
        private bool GetBecomingLocation(string laneWayId, ref string location)
        {
            bool bl = false;
            // 循环判断当前组是否有剩余储位
            string sqlString = string.Empty;
            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;";
            var slotModel =Db.SqlQueryable<LocateInfo>(sqlString).ToList();
            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)
            {
                bl = false;
@@ -4211,7 +4484,7 @@
            else  // 存在空储位
            {
                // 判断当前组合适的储位地址
                var numstr = slotModel[0].AisleOne.Substring(4,2);
                var numstr = slotModel[0].AisleOne.Substring(4, 2);
                int aisleRow = int.Parse(numstr);
                if (slotModel[0].Column > aisleRow)
@@ -4226,11 +4499,11 @@
                    location = slotModel[slotModel.Count - 1].LocatNo;
                }
                bl = true;
            }
            return bl;
        }
@@ -4245,7 +4518,7 @@
            public string LocatNo { get; set; }
            public int Column { get; set; }
            public string AisleOne { get; set; }
        }
        /// <summary>
@@ -4324,12 +4597,12 @@
                        item.WareHouseNo = "";//所属仓库更改(改为空)
                        item.RoadwayNo = "";//所属巷道更改(改为空)
                        item.AreaNo = "";//所属区域更改(改为空)
                    }
                    //出库流水(更改状态)
                    var allot = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.TaskNo == taskNo || (m.Status == "1" && m.PalletNo == task.PalletNo))).ToList();
                    var PalletType = "0"; //0:物料托  1:空托盘托
                    foreach (var item in allot)
                    {
                        if (item.SkuNo == "100099")
@@ -4345,9 +4618,9 @@
                    }
                    var endLocateList = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && (m.AreaNo == "B02" || m.AreaNo == "B05")).Select(m=>m.LocatNo).ToList();
                    var endLocateList = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && (m.AreaNo == "B02" || m.AreaNo == "B05")).Select(m => m.LocatNo).ToList();
                    //判断是否是原辅料出库任务  货架储位=》平库储位
                    if ( endLocateList.Contains(task.EndLocat) && PalletType == "0")
                    if (endLocateList.Contains(task.EndLocat) && PalletType == "0")
                    {
                        //修改目标地址状态
                        var endLocat = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == task.EndLocat);
@@ -4429,9 +4702,9 @@
                    ////判断起始目标位置都是平库  
                    //if (pingKuList.Contains(task.StartLocat) && pingKuList.Contains(task.EndLocat))
                    //{
                        task.Status = "2";
                    task.Status = "2";
                    //}
                    task.IsSend = 0;
                    task.IsCancel = 0;
                    task.IsFinish = 0;
@@ -4446,13 +4719,13 @@
                        locate.Status = "0";
                        Db.Updateable(locate).ExecuteCommand();
                    }
                    //目标储位改为有货物 1
                    locate2.Status = "1";
                    Db.Updateable(locate2).ExecuteCommand();
                    //判断起始目标位置都是平库  
                    if ( pingKuList.Contains(task.EndLocat))
                    if (pingKuList.Contains(task.EndLocat))
                    {
                        foreach (var item in stockDetail)
                        {
@@ -4463,7 +4736,7 @@
                        }
                        Db.Updateable(stockDetail).ExecuteCommand();
                    }
                    #endregion
@@ -4490,12 +4763,12 @@
            try
            {
                Db.BeginTran();
                var task = Db.Queryable<LogTask>().First(m=>m.IsDel =="0" && m.TaskNo == taskNo);
                var task = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.TaskNo == taskNo);
                if (task == null)
                {
                    throw new Exception("没有查询到任务信息");
                }
                if (task.Status!="1")
                if (task.Status != "1")
                {
                    throw new Exception("任务状态不是正在执行,请核实");
                }
@@ -4504,7 +4777,7 @@
                {
                    throw new Exception("没有查询到起始储位信息");
                }
                if (locate.WareHouseNo!="W04")
                if (locate.WareHouseNo != "W04")
                {
                    throw new Exception("起始储位不是平库储位,请核实");
                }
@@ -4529,7 +4802,7 @@
            }
        }
        #endregion
        #endregion
@@ -4551,7 +4824,7 @@
                    throw new Exception("未查询到出库单信息");
                }
                var task = Db.Queryable<BllExportTimingTask>().Count(m => m.SoNo == soNo);
                if (task>0)
                if (task > 0)
                {
                    throw new Exception("当前出库单已生成备料任务,无需重复点击");
                }
@@ -4563,7 +4836,7 @@
                };
                Db.Insertable(exTask).ExecuteCommand();
                notice.Status = "3";//修改单据状态未正在执行
                notice.UpdateTime = DateTime.Now;
                notice.UpdateTime = DateTime.Now;
                notice.UpdateUser = userId;
                Db.Updateable(notice).ExecuteCommand();
@@ -4575,7 +4848,7 @@
                throw new Exception(e.Message);
            }
        }
        // JC23 备料定时任务开始 领料单备料下发出库(调用wcs接口给他库位地址)
        public List<OutCommandDto> BeiLiaoIssueOutHouse(string url)
        {
@@ -4669,7 +4942,7 @@
                                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.FactQty>0) > 0)
                                    if (detailList.Count(m => m.FactQty > 0) > 0)
                                    {
                                        notice.Status = "3"; //变更状态为正在执行
                                        Db.Updateable(notice).ExecuteCommand();
@@ -4696,7 +4969,7 @@
                                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.FactQty>0) > 0)
                                    if (detailList.Count(m => m.FactQty > 0) > 0)
                                    {
                                        notice.Status = "3"; //变更状态为正在执行
                                        Db.Updateable(notice).ExecuteCommand();
@@ -5085,7 +5358,7 @@
            {
                //先查询任务表中要有任务的投料口信息
                var proCallList = Db.Queryable<BllProductionCallTask>().Where(m => m.IsDel == "0").ToList();
                var proLocationList = proCallList.Select(m=>m.PutInLocation).ToList();
                var proLocationList = proCallList.Select(m => m.PutInLocation).ToList();
                if (proCallList.Count == 0)
                {
                    return null;
@@ -5098,12 +5371,12 @@
                {
                    //当前投料口包含的工位
                    var list = locate.Where(m => m.AreaNo == item).ToList();
                    var listStr = locate.Where(m => m.AreaNo == item).Select(m=>m.LocatNo).ToList();
                    var listStr = locate.Where(m => m.AreaNo == item).Select(m => m.LocatNo).ToList();
                    //判断投料口的工位中是否有未下发成功的任务
                    var task = Db.Queryable<LogTask>().Where(m => m.Type == "1" && m.IsSuccess == 0 && m.Status == "0" && listStr.Contains(m.EndLocat) ).OrderBy(m=>m.TaskNo).ToList();
                    if(task.Count > 0)
                    var task = Db.Queryable<LogTask>().Where(m => m.Type == "1" && m.IsSuccess == 0 && m.Status == "0" && listStr.Contains(m.EndLocat)).OrderBy(m => m.TaskNo).ToList();
                    if (task.Count > 0)
                    {
                        foreach (var item2 in task)
                        {
                            //添加下发任务的信息
@@ -5123,12 +5396,12 @@
                            //item2.Status = "1";
                            //Db.Updateable(item2).ExecuteCommand();
                        }
                        //return outlist;
                    }
                }
                if (outlist.Count>0)
                if (outlist.Count > 0)
                {
                    //将任务发送至AGV
                    // 正式运行程序放开
@@ -5147,8 +5420,8 @@
                        //if (wcsModel.StatusCode == 0)
                        //{
                        //    //更改任务的发送返回时间//
                           new TaskServer().EditTaskIssueOk(list2, time1, time2);
                        new TaskServer().EditTaskIssueOk(list2, time1, time2);
                        //}
                        //if (wcsModel.StatusCode == -1)
                        //{
@@ -5161,7 +5434,7 @@
                        throw new Exception(ex.Message);
                    }
                }
                return null;
            }
            catch (Exception e)
@@ -5186,7 +5459,7 @@
                {
                    throw new Exception("当前任务已完成");
                }
                Db.BeginTran();
                //库存中当前托盘的信息
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList();
@@ -5224,11 +5497,11 @@
                        var exTime = Db.Queryable<BllProductionCallTask>().First(m => m.IsDel == "0" && m.PutInLocation == locate.AreaNo && m.SkuNo == locate.SkuNo);
                        if (exTime != null)
                        {
                            var notice = Db.Queryable<BllExportNotice>().First(m=>m.IsDel =="0" && m.SONo == exTime.OrderCode);
                            var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == exTime.OrderCode);
                            //获取备好料的托盘信息
                            var taskStr = Db.Queryable<LogTask>().Where(m => m.IsDel == "0" && (m.Status == "0" || m.Status == "1") && m.Receiver == "AGV").Select(m => m.TaskNo).ToList();
                            var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.Status == "2" && m.SONo == notice.SONo && m.SkuNo == locate.SkuNo && !taskStr.Contains(m.TaskNo)).Select(m => m.PalletNo).ToList();
                            if (allotList.Count >0)
                            if (allotList.Count > 0)
                            {
                                var stockDetail2 = Db.Queryable<DataStockDetail>().Where(m => allotList.Contains(m.PalletNo)).OrderBy(m => m.LocatNo).First();
@@ -5266,7 +5539,7 @@
                            else
                            {
                                var listLocate = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.AreaNo == locate.AreaNo).ToList();
                                if (listLocate.Count(m=>m.SkuNo == locate.SkuNo && m.Status != "0") == 0)
                                if (listLocate.Count(m => m.SkuNo == locate.SkuNo && m.Status != "0") == 0)
                                {
                                    Db.Deleteable(exTime).ExecuteCommand();
                                }
@@ -5323,7 +5596,7 @@
                                //删除库存箱码明细
                                Db.Deleteable(item2).ExecuteCommand();
                            }
                            if (comList.Count>0)
                            if (comList.Count > 0)
                            {
                                Db.Insertable(comList).ExecuteCommand();
                            }
@@ -5352,9 +5625,9 @@
                            #endregion
                            #region 出库流水(更改状态)
                            allot.Status = "5";
                            if (stockInfoList.Count == 0)
                            {
                                allot.CompleteQty += item.LockQty;
@@ -5368,7 +5641,7 @@
                            #region 出库单及明细
                            var noticeDetail = Db.Queryable<BllExportNoticeDetail>().First(m => m.Id == allot.SODetailNo && m.IsDel == "0");
                            if (stockInfoList.Count == 0)
                            {
                                noticeDetail.CompleteQty += item.LockQty;
@@ -5383,9 +5656,9 @@
                            {
                                var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == noticeDetail.SONo);
                                notice.Status = "4"; //更改为执行完成//修改出库单信息
                                Db.Updateable(notice).ExecuteCommand();
                            }
                            #endregion
@@ -5408,7 +5681,7 @@
                                }
                            }
                        }
                        item.LocatNo = locate2.LocatNo;//储位更改(改为空)
                        item.WareHouseNo = locate2.WareHouseNo;//所属仓库更改(改为空)
                        item.RoadwayNo = locate2.RoadwayNo;//所属巷道更改(改为空)
@@ -5782,7 +6055,7 @@
                                                    OutMode = toLocation,  //目标地址
                                                    Order = 1,
                                                });
                                                #endregion
@@ -5872,7 +6145,7 @@
                            item.TaskNo = taskNoStr; // 出库分配信息中更新任务号
                            item.Status = "1"; // 出库分配信息状态改为正在执行 
                            item.UnstackingMode = unstackingMode2;//拆垛方式
                            item.OutMode =  outMode ;//出库口
                            item.OutMode = outMode;//出库口
                            //item.LoadingAddre = unstackingMode2 == "0" ? loadingAddre : "";//装车口
                            Db.Updateable(item).ExecuteCommand();
@@ -5916,7 +6189,7 @@
                            item.TaskNo = taskNo.TaskNo;
                            item.Status = "1"; // 出库分配信息状态改为正在执行 
                            item.OutMode = item.OutMode;//出库口
                            item.UnstackingMode = unstackingMode2 ;//拆垛模式
                            item.UnstackingMode = unstackingMode2;//拆垛模式
                            Db.Updateable(item).ExecuteCommand();
                            flagList.Add(0);
                            #endregion
@@ -6007,7 +6280,7 @@
                throw new Exception(e.Message);
            }
        }
        //重新下发出库任务
        public OutCommandDto AgainSendSoTask(string taskNo, int userId, string url)
        {
@@ -6330,7 +6603,7 @@
        }
        #endregion
        /// <summary>
        /// 判断出库是否需要拆箱
@@ -6449,7 +6722,7 @@
                {
                    sqlPub += $"AND tb1.IsDespatch = '{isDespatch}' ";
                }
                if (logisticsId != null)
                if (logisticsId != null)
                {
                    sqlPub += $"AND tb1.LogisticsId = '{logisticsId}' ";
                }
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 = "请选择出库口" });
                //}
                var list = _exNoticeSvc.IssuePalletNoOut(palletNo, outMode, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out string str);
                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);
                }
                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,