chengsc
2025-04-19 16865166b741233bad83756ab30899440ecc0dd3
修改问题
1个文件已添加
19个文件已修改
1577 ■■■■■ 已修改文件
HTML/views/ASNSetting/LabelPrint.html 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/HouseWithinSetting/CRLogTask.html 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/SOSetting/ExportNotice.html 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/StatisticalReport/BoxInfor.html 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Pda/View/HouseDataSetting/ConfirmReceipt.html 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Pda/View/SoSetting/pinTuoOut.html 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Model/ModelVm/PdaVm/PdaCrVm.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllCheckServer/StockCheckServer.cs 147 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllPdaServer/PdaAsnServer.cs 94 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs 179 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs 669 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.Entity/DataEntity/DataBoxInfo.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.Entity/DataEntity/DataStockDetail.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.Entity/LogEntity/LogTask.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IBllSoServer/IExportNoticeServer.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IPdaServer/IPdaCrServer.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/DownApiController.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/PdaCrController.cs 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/ASNSetting/LabelPrint.html
@@ -70,9 +70,9 @@
                    </tr>
                    <tr>
                        <td>物料代码</td>
                        <td id="SkuNo"></td>
                        <td>数   量</td>
                        <td id="qty"></td>
                        <td colspan="3" id="SkuNo"></td>
                        <!-- <td>数   量</td>
                        <td id="qty"></td>  -->
                    </tr>
                    <tr>
                        <td>有效期至</td>
HTML/views/HouseWithinSetting/CRLogTask.html
@@ -50,6 +50,7 @@
                                <option value="2">执行完成</option>
                                <option value="3">异常结束</option>
                                <option value="4">已取消</option>
                                <option value="5">等待确认</option>
                            </select>
                        </div>
                    </div>
@@ -203,6 +204,8 @@
                            html = `<button class="layui-btn layui-btn-radius layui-btn-warm layui-btn-xs">异常结束</button>`; 
                        } else if(d.Status=='4') { 
                            html = `<button class="layui-btn layui-btn-radius layui-btn-warm layui-btn-xs">已取消</button>`; 
                        } else if(d.Status=='5') {
                            html = `<button class="layui-btn layui-btn-radius layui-btn-warm layui-btn-xs">等待确认</button>`;
                        } else {
                            
                        }
HTML/views/SOSetting/ExportNotice.html
@@ -1272,8 +1272,12 @@
                        area: ['1200px', '90%'],
                    });
                } else if (obj.event === 'outKu') {
                    $("#PickingArea").val('');
                    outFunction(data.SONo);
                    //if(data.WareHouseName =="成品库"){
                        outFunction(data.SONo);
                    // }else{
                    //     outFunction2(data.SONo)
                    // }
                } else if (obj.event === 'beiLiaoOutKu') {
                    if (orderType != "1") {
@@ -1395,20 +1399,11 @@
                    area: ['350px', '285px'],
                    btn: ['确定', '取消'],
                    yes: function (index, layero) {
                        var pa = $('#PickingArea').val();
                        console.log(pa)
                        if (isChongFu == true) {
                            isChongFu = false;
                            if (pa == null) {
                                layer.msg("请勿重复点击", {
                                    icon: 2,
                                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                });
                                return;
                            }
                            
                            console.log($("#PickingArea").val())
                            if ($("#PickingArea").val() == '') {
                            if ($("#PickingArea").val() == '' || $('#PickingArea').val() == null) {
                                layer.msg("请选择出库口", {
                                    icon: 2,
                                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
@@ -1419,7 +1414,7 @@
                            var param = {
                                soNo: soNo,
                                //unstackingMode: $('#UnstackWay').val(),
                                outMode: pa,
                                outMode: $("#PickingArea").val(),
                                //loadingAddre: $('#LoadingArea').val()
                            };
                            console.log(param);
@@ -1454,6 +1449,47 @@
                    }
                });
            }
            //不选择出库口的弹窗方法
            function outFunction2(soNo) {
                layer.confirm('确定当前单据出库吗?', function (index) {
                    if (isChongFu == true) {
                        isChongFu = false;
                        var param = {
                            soNo: soNo,
                        };
                        console.log(param);
                        sendData(IP + "/DownApi/IssueOutHouse", param, 'get', function (res) {
                            console.log(res);
                            if (res.code == 0) { //成功
                                layer.msg(res.msg, {
                                    icon: 1,
                                    time: 3000 //1秒关闭(如果不配置,默认是3秒)
                                }, function () {
                                    refreshTable();
                                    isChongFu = true;
                                });
                            } else { //不成功
                                layer.msg(res.msg, {
                                    icon: 2,
                                    time: 3000 //2秒关闭(如果不配置,默认是3秒)
                                }, function () {
                                    refreshTable();
                                    isChongFu = true;
                                });
                            }
                            layer.close(index);
                        });
                    } else {
                        layer.msg("请勿重复点击", {
                            icon: 2,
                            time: 2000 //2秒关闭(如果不配置,默认是3秒)
                        });
                    }
                });
            }
            //选择出库口弹窗方法
            function beiLiaoOutFunction(soNo) {
HTML/views/StatisticalReport/BoxInfor.html
@@ -225,7 +225,21 @@
                    </div>
                </div>
                <script type="text/html" id="buttonTpl">
                    {{#  if(d.Status=='0'){ }}
                      <button class="layui-btn layui-btn-radius layui-btn-danger layui-btn-xs">待分配</button>
                    {{#  } else if(d.Status == '1') { }}
                      <button class="layui-btn layui-btn-radius layui-btn-xs">部分分配</button>
                    {{#  } else if(d.Status == '2') { }}
                        <button class="layui-btn layui-btn-radius layui-btn-xs">已分配</button>
                    {{#  } else if(d.Status == '3') { }}
                       <button class="layui-btn layui-btn-radius layui-btn-xs">盘点锁定</button>
                    {{#  } else if(d.Status == '4') { }}
                        <button class="layui-btn layui-btn-radius layui-btn-xs">移库锁定</button>
                    {{#  } else if(d.Status == '5') { }}
                        <button class="layui-btn layui-btn-radius layui-btn-xs layui-btn-danger">异常锁定</button>
                    {{#  } }}
                  </script>
                <script type="text/html" id="BoxStatus">
                        {{#  if(d.Status=='0'){ }}
                            <p>未组托</p>
@@ -363,6 +377,7 @@
                { field: 'LockQty', title: '锁定数量', align: 'center',width: 90, },
                { field: 'FrozenQty', title: '冻结数量', align: 'center',width: 90, },
                
                { field: 'Status', title: '库存状态', align: 'center', templet: '#buttonTpl', width: 90, },
                { field: 'InspectStatus', templet: '#InspectStatus1', title: '质检状态', align: 'center' ,width: 100,},
                { field: 'InspectMark', title: '抽检标记', align: 'center', templet: '#InspectMarkStatus' ,width: 100,},
                { field: 'BitPalletMark', title: '零托标记', align: 'center', templet: '#BitPalletMarkStatus',width: 100,},
Pda/View/HouseDataSetting/ConfirmReceipt.html
New file
@@ -0,0 +1,177 @@
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="user-scalable=0,width=device-width,initial-scale=1.0" />
        <!-- <meta name="viewport" content="width=device-width, initial-scale=0.665, minimum-scale=0.5, maximum-scale=2.0, user-scalable=no" /> -->
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <title>Boxline PDA</title>
        <link rel="stylesheet" href="/layui/css/layui.css" />
        <link rel="stylesheet" href="/css/style.css" />
        <script src="/js/adaptive.js"></script>
        <link rel="stylesheet" href="/css/my.css" />
        <link rel="stylesheet" href="/css/adapter.css" />
        <style type="text/css">
            .layout-bill-info {
                height: 255px;
            }
            .layout-tbl-submit {
                margin-top: 10px;
            }
        </style>
    </head>
    <body>
        <div id="" class="main-content">
            <div id="" class="layout-title">
                <table border="" cellspacing="" cellpadding="">
                    <tr>
                        <td class="img-back"><a href="../index.html"><img src="/assets/back.jpg" ></a></td>
                        <td class="title-text">车间收货</td>
                        <td class="title-menu-icon"><img id="menuImg" src="/assets/menu.jpg" ></td>
                    </tr>
                </table>
            </div>
            <div id="" class="layout-sub-content">
                <div id="menuList" class="menu">
                    <ul class="" style="text-align: center;">
                        <li><a href="../index.html">主页</a></li>
                        <!-- <li><a href="productEnterConfirm.html">入库信息确认</a></li> -->
                        <li><a href="../login.html">重新登录</a></li>
                    </ul>
                </div>
                <div id="" class="layout-bill-info">
                    <form class="layui-form" action="">
                        <div id="layout-pallet" class="layui-form-item layout-input">
                            <label class="layui-form-label" lang>托盘条码:</label>
                            <div class="layui-input-block">
                                <input id="palletNo" type="text" lay-verify="required" lang langholder
                                    placeholder="请扫描托盘条码" autocomplete="off" class="layui-input">
                            </div>
                        </div>
                        <div id="layout-soNo" class="layui-form-item layout-input">
                            <label class="layui-form-label">出库单:</label>
                            <div class="layui-input-block">
                                <input id="SoNo" type="text" disabled lang langholder
                                placeholder="" autocomplete="off" class="layui-input">
                            </div>
                        </div>
                        <table class="layout-tbl-submit" border="" cellspacing="" cellpadding="">
                            <tr>
                                <td style="width: 23%;"></td>
                                <td>
                                    <button class="layout-btn layout-btn-red" lang type="button" lay-submit
                                        lay-filter="formUnbind">收货</button>
                                </td>
                                <td style="width: 33%;"></td>
                            </tr>
                        </table>
                    </form>
                </div>
            </div>
        </div>
        <script src="/js/jquery-3.5.1.min.js"></script>
        <script src="/layui/layui.js"></script>
        <script src="/js/public.js"></script>
        <script src="/js/jquery.cookie.js"></script>
        <script>
            layui.use(['form', 'jquery'], function() {
                var form = layui.form
                //当托盘条码输入框文本改变时,检查一下托盘状态
                $("#palletNo").on('input', function () {
                    if ($("#palletNo").val() == "" || $("#palletNo").val().length < 8) {
                        return
                    }
                    if ($("#palletNo").val().length >= 8) {
                        $("#palletNo").val($("#palletNo").val().substr(-8))
                    }
                    checkPalletState()
                })
                //检查托盘状态
                function checkPalletState() {
                    $('#SoNo').val('');
                    var param = {
                        "PalletNo": $("#palletNo").val()
                    }
                    synData(IP + "/PdaCr/GetReceiptSoNoByPallet", param, 'post', function (res) {
                        if (res.code == 0) { //成功
                            $('#SoNo').val(res.data);
                        } else { //不成功
                            layer.msg(res.msg, {
                                icon: 2,
                                time: 2000 //2秒关闭(如果不配置,默认是3秒)
                            }, function () { });
                        }
                    });
                }
                var isChongFu = true;
                form.on('submit(formUnbind)', function(data) {
                    if (!$("#palletNo").val()) {
                        layer.msg('请扫描托盘条码', {
                            icon: 2,
                            time: 2000 //2秒关闭(如果不配置,默认是3秒)
                        });
                        return;
                    }
                    if (isChongFu == true) {
                        isChongFu = false;
                        var param = {
                            "PalletNo":$("#palletNo").val(),
                        }
                        sendData(IP + "/PdaCr/ConfirmReceipt", param, 'post', function(res) {
                            if (res.code == 0) { //成功
                                layer.msg("成功", {
                                    icon: 1,
                                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                }, function () {
                                    isChongFu = true;
                                });
                            } else { //不成功
                                layer.msg(res.msg, {
                                    icon: 2,
                                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
                                }, function() {isChongFu = true;});
                            }
                        });
                        return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。
                    }else{
                        layer.msg("请勿重复点击", {
                            icon: 2,
                            time: 2000 //2秒关闭(如果不配置,默认是3秒)
                        });
                    }
                });
                // form.verify({
                //     stock: [/^[\S]{6}$/, '托盘条码必须为六位字符']
                // });
                $("#menuImg").click(function(e){
                    //console.log("menuImg")
                    e.stopPropagation()
                    if($("#menuList").is(":hidden")){
                        $("#menuList").show()
                    }else{
                        $("#menuList").hide()
                    }
                })
                $('body').click(function(){
                    // //console.log("body")
                    $("#menuList").hide()
                })
            })
        </script>
    </body>
</html>
Pda/View/SoSetting/pinTuoOut.html
@@ -1259,7 +1259,7 @@
                            console.log(2)
                            updateSkuLotNoList2();
                            updateQtyList2();
                            // getBar2();
                            getBar2();
                            // GetDataInfo();
                        }
@@ -1315,14 +1315,14 @@
                        for (var i = 0; i < res.data.length; i++) {
                            if (i == 0) {
                                $("#skuLotNo2").append('<option value =' + res.data[i].SoDetailId + ' selected>' + res.data[i].SkuName);
                                if (res.data[i].LotNo == null) {
                                if (res.data[i].LotNo != null) {
                                    $("#skuLotNo2").append(" - " + res.data[i].LotNo);
                                }
                                $("#skuLotNo2").append('</option>');
                            } else {
                                $("#skuLotNo2").append('<option value =' + res.data[i].SoDetailId + '>' + res.data[i].SkuName);
                                if (res.data[i].LotNo == null) {
                                if (res.data[i].LotNo != null) {
                                    $("#skuLotNo2").append(" - " + res.data[i].LotNo);
                                }
                                $("#skuLotNo2").append('</option>');
Wms/Model/ModelVm/PdaVm/PdaCrVm.cs
@@ -82,4 +82,10 @@
        public decimal DevanQty { get; set; }
        public string BoxNo { get; set; }
    }
    public class PdaReceiptVm
    {
        public string PalletNo { get; set; }
    }
}
Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs
@@ -149,6 +149,10 @@
                }
                var labelQty = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.ASNDetailNo == id).Sum(m => m.Qty + (m.SamplingQty == null? 0: m.SamplingQty));
                if (labelQty == null)
                {
                    labelQty = 0;
                }
                var qty = detail.Qty - labelQty;
                if (qty<0)
                {
Wms/WMS.BLL/BllCheckServer/StockCheckServer.cs
@@ -1686,90 +1686,99 @@
            try
            {
                //当前任务信息
                var task = await Db.Queryable<LogTask>().FirstAsync(m => m.TaskNo == taskNo && m.IsDel == "0");
                var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0");
                if (task == null)
                {
                    throw Oops.Bah($"未查询到任务号为:‘{taskNo}’的任务信息");
                    throw new Exception($"未查询到任务号为:‘{taskNo}’的任务信息");
                }
                if (task.Status == "2")
                {
                    throw Oops.Bah("当前任务已完成");
                    throw new Exception("当前任务已完成");
                }
                Db.BeginTran();
                //库存中当前托盘的信息
                var stockDetail = await Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToListAsync();
                var locateNo = stockDetail.Select(m => m.LocatNo).Distinct().FirstOrDefault();
                //当前任务中的储位信息
                var locate = await Db.Queryable<SysStorageLocat>().FirstAsync(m => m.LocatNo == locateNo);
                //更改任务
                task.Status = "2";//任务状态
                task.IsSend = 0;
                task.IsCancel = 0;
                task.IsFinish = 0;
                task.FinishDate = DateTime.Now;//完成时间
                Db.Updateable(task).ExecuteCommand();
                // 更改当前任务中的储位状态(改为0空储位)
                locate.Status = "0";
                Db.Updateable(locate).ExecuteCommand();
                //目标储位信息
                var endLocate = await Db.Queryable<SysStorageLocat>().FirstAsync(m => m.LocatNo == task.EndLocat);
                if (endLocate != null)
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList();
                //当前任务中的目标储位信息
                //当前任务中的原储位
                var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.StartLocat);
                if (locate == null)
                {
                    if (endLocate.Status != "0")
                    throw new Exception($"WMS系统中没有该{task.StartLocat}储位对应的信息");
                }
                var locate2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.EndLocat);
                if (locate2 == null)
                {
                    throw new Exception($"WMS系统中没有该{task.EndLocat}储位对应的信息");
                }
                //平库中储位集合
                var pingKuLocate = Db.Queryable<SysStorageLocat>().Where(m => m.WareHouseNo == "W04" && m.IsDel == "0").ToList();
                //车间暂存区
                var pingKuLocate2 = Db.Queryable<SysStorageLocat>().Where(m => m.WareHouseNo == "W04" && m.IsDel == "0" && (m.AreaNo == "B06" || m.AreaNo == "B07")).ToList();
                var pingKuList = pingKuLocate.Select(m => m.LocatNo).ToList();
                try
                {
                    task.Status = "2";//任务状态
                    //判断起始目标位置都是平库
                    if (pingKuList.Contains(task.StartLocat) && pingKuList.Contains(task.EndLocat))
                    {
                        throw Oops.Bah("目标储位状态非空储位");
                        task.Status = "5";
                    }
                }
                //更改库存明细
                foreach (var item in stockDetail)
                {
                    item.Status = "0";//待分配
                    item.LockQty = 0;//锁定数量改为0
                    if (endLocate != null)//有目标储位说明移到其他区域储位
                    {
                        item.LocatNo = endLocate.LocatNo;//储位更改
                        item.WareHouseNo = endLocate.WareHouseNo;//所属仓库更改
                        item.RoadwayNo = endLocate.RoadwayNo;//所属巷道更改
                        item.AreaNo = endLocate.AreaNo;//所属区域更改
                    }
                    else//没有目标储位说明移到入库口
                    {
                        item.LocatNo = "";//储位更改(改为空)
                        item.WareHouseNo = "";//所属仓库更改(改为空)
                        item.RoadwayNo = "";//所属巷道更改(改为空)
                        item.AreaNo = "";//所属区域更改(改为空)
                    }
                    await Db.Updateable(item).ExecuteCommandAsync();
                    //更改库存总表
                    var stock = Db.Queryable<DataStock>().First(w => w.IsDel == "0" && w.SkuNo == item.SkuNo && w.LotNo == item.LotNo);
                    stock.LockQty -= (decimal)item.Qty;
                    await Db.Updateable(stock).ExecuteCommandAsync();
                }
                if (endLocate != null)
                {
                    //更改目标储位状态
                    endLocate.Status = "1";//有物品
                    await Db.Updateable(endLocate).ExecuteCommandAsync();
                }
                    task.IsSend = 0;
                    task.IsCancel = 0;
                    task.IsFinish = 0;
                    task.FinishDate = DateTime.Now;//完成时间
                    Db.Updateable(task).ExecuteCommand();
                if (_userManager.UserId != 0)
                {
                    //添加操作日志记录
                    //var k = new OperationCrServer().AddLogOperationCr("库内作业", "库内日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId);
                    await _operation.AddLogOperationCr(new OperationInputVm()
                    #region 修改储位状态
                    if (!pingKuList.Contains(task.StartLocat))
                    {
                        ParentName = "库内作业",
                        MenuName = "库内日志",
                        FkNo = taskNo,
                        TypeName = "完成",
                        Msg = $"点击完成按钮、完成任务号为:{taskNo}的任务"
                    });
                        //原储位改为空储位 0
                        locate.Status = "0";
                        Db.Updateable(locate).ExecuteCommand();
                    }
                    //目标储位改为有货物 1
                    locate2.Status = "1";
                    Db.Updateable(locate2).ExecuteCommand();
                    //判断目标位置如果不是是车间暂存区  并且是平库储位 更改库存位置
                    if (pingKuLocate2.Count(m=>m.LocatNo == task.EndLocat)<=0 && pingKuList.Contains(task.EndLocat))
                    {
                        foreach (var item in stockDetail)
                        {
                            item.WareHouseNo = locate2.WareHouseNo;
                            item.AreaNo = locate2.AreaNo;
                            item.RoadwayNo = locate2.RoadwayNo;
                            item.LocatNo = locate2.LocatNo;
                        }
                        Db.Updateable(stockDetail).ExecuteCommand();
                    }
                    #endregion
                    if (_userManager.UserId != 0)
                    {
                        //添加操作日志记录
                        //var k = new OperationCrServer().AddLogOperationCr("库内作业", "库内日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId);
                        await _operation.AddLogOperationCr(new OperationInputVm()
                        {
                            ParentName = "库内作业",
                            MenuName = "库内日志",
                            FkNo = taskNo,
                            TypeName = "完成",
                            Msg = $"点击完成按钮、完成任务号为:{taskNo}的任务"
                        });
                    }
                    Db.CommitTran();
                }
                Db.CommitTran();
                catch (Exception ex)
                {
                    Db.RollbackTran();
                    throw new Exception(ex.Message);
                }
            }
            catch (Exception ex)
Wms/WMS.BLL/BllPdaServer/PdaAsnServer.cs
@@ -128,39 +128,8 @@
                var pNum = 0;//托盘物品数量 
                var bNum = 0;//箱码物品数量 
                if (pack == null)
                {
                    throw new Exception("获取物料包装信息失败,请核实!");
                }
                if (pack.L5Num.HasValue)
                {
                    pNum = (int)pack.L5Num;
                    bNum = (int)pack.L4Num;
                }
                else if (pack.L4Num.HasValue)
                {
                    pNum = (int)pack.L4Num;
                    bNum = (int)pack.L3Num;
                }
                else if (pack.L3Num.HasValue)
                {
                    pNum = (int)pack.L3Num;
                    bNum = (int)pack.L2Num;
                }
                else if (pack.L2Num.HasValue)
                {
                    pNum = (int)pack.L2Num;
                    bNum = (int)pack.L1Num;
                }
                else if (pack.L1Num.HasValue)
                {
                    pNum = (int)pack.L1Num;
                    bNum = (int)pack.L1Num;
                }
                if (pNum == 0 || bNum == 0)
                {
                    throw new Exception($"绑定失败,{detail.SkuNo}物品包装未找到!");
                }
                //公共方法获取包装数量
                new Common().GetPackQtyInfo(detail.PackagNo, ref pNum, ref bNum);
                #endregion
@@ -1123,6 +1092,7 @@
        {
            try
            {
                Db.BeginTran();
                #region 判断
                //0:成品入库 1:采购入库 3:退货入库 4:车间余料入库 8:生产退料入库
@@ -1197,44 +1167,13 @@
                #region 包装
                var sku = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == detail.SkuNo);
                var pack = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == detail.PackagNo);    // liudl 由Sku包装编号变更为入库单明细包装编号
                //var pack = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == detail.PackagNo);    // liudl 由Sku包装编号变更为入库单明细包装编号
                var pNum = 0;//托盘物品数量 
                var bNum = 0;//箱码物品数量 
                if (pack == null)
                {
                    throw new Exception("获取物料包装失败,请核实!");
                }
                if (pack.L5Num.HasValue)
                {
                    pNum = (int)pack.L5Num;
                    bNum = (int)pack.L4Num;
                }
                else if (pack.L4Num.HasValue)
                {
                    pNum = (int)pack.L4Num;
                    bNum = (int)pack.L3Num;
                }
                else if (pack.L3Num.HasValue)
                {
                    pNum = (int)pack.L3Num;
                    bNum = (int)pack.L2Num;
                }
                else if (pack.L2Num.HasValue)
                {
                    pNum = (int)pack.L2Num;
                    bNum = (int)pack.L1Num;
                }
                else if (pack.L1Num.HasValue)
                {
                    pNum = (int)pack.L1Num;
                    bNum = (int)pack.L1Num;
                }
                if (pNum == 0 || bNum == 0)
                {
                    throw new Exception($"绑定失败,{detail.SkuNo}物品包装未找到!");
                }
                //公共方法获取包装数量
                new Common().GetPackQtyInfo(detail.PackagNo, ref pNum, ref bNum);
                #endregion
@@ -1330,10 +1269,16 @@
                {
                    tags = "1";
                }
                //验证库存托盘是否有贴标物料
                var skuStr = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0" && m.IsPasteCode == "1").Select(m => m.SkuNo).ToList();
                var sdHave = Db.Queryable<DataStockDetail>().Count(m => m.IsDel == "0" && m.PalletNo == model.PalletNo && skuStr.Contains(m.SkuNo));
                if (sdHave>0)
                {
                    throw new Exception("当前托盘含有贴标物料信息,不能组托");
                }
                // 判断库存明细是否已有此托盘信息  
                var sd1 = Db.Queryable<DataStockDetail>()
                    .First(m => m.IsDel == "0" && m.ASNDetailNo == bind.ASNDetailNo && m.PalletNo == model.PalletNo && m.LotNo == bind.LotNo);
                    .First(m => m.IsDel == "0" && m.ASNDetailNo == bind.ASNDetailNo && m.PalletNo == model.PalletNo && m.SkuNo == detail.SkuNo && m.LotNo == bind.LotNo);
                var sdId1 = 0;
                if (sd1 != null)
                {
@@ -1426,8 +1371,6 @@
                }
                #endregion
                #region 更改组托信息
                var isSample = "0";//是否取样
@@ -1497,10 +1440,12 @@
                Db.Updateable(notice).ExecuteCommand();
                #endregion
                #region 库存明细
                #region 更改库存明细数量
                sd1.Qty = bind.Qty;
                //更改库存明细数量
                Db.Updateable(sd1).Where(m => m.Id == sdId1).ExecuteCommand();
                #endregion
                #region 库存
@@ -1574,9 +1519,12 @@
                sqlStr += $"insert into LogPalletTrack values('{model.PalletNo}','{model.AsnNo}','组盘','0',getDate(),{userId},NULL,NULL);";
                Db.Ado.ExecuteCommand(sqlStr);
                new OperationASNServer().AddLogOperationAsn("PDA模块", "托盘绑定", model.AsnNo, "添加", $"添加了托盘码为:{model.PalletNo}的组盘信息", userId);
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs
@@ -6,6 +6,7 @@
using System.Threading.Tasks;
using Dm;
using Model.InterFaceModel;
using Model.ModelDto;
using Model.ModelDto.BllCheckDto;
using Model.ModelDto.PdaDto;
using Newtonsoft.Json;
@@ -689,7 +690,7 @@
            {
                throw Oops.Bah("托盘储位信息不存在,请检查!");
            }
            if (models.WareHouseNo != "W02")
            if (models.WareHouseNo != "W04")
            {
                throw Oops.Bah("该托盘未在平库内,请检查!");
            }
@@ -719,7 +720,7 @@
                {
                    throw Oops.Bah("托盘储位信息不存在,请检查!");
                }
                if (models.WareHouseNo != "W02")
                if (models.WareHouseNo != "W04")
                {
                    throw Oops.Bah("该托盘未在平库内,请检查!");
                }
@@ -729,14 +730,9 @@
                    throw Oops.Bah("储位信息不存在,请检查!");
                }
                if (storageLocat.AreaNo.Contains("B0"))
                {
                    storageArea = await Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.AreaNo.Contains("B0") && w.WareHouseNo == "W02").OrderBy(o => o.AreaNo).ToListAsync();
                }
                else
                {
                    storageArea = await Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.AreaNo.Contains("B1") && w.WareHouseNo == "W02").OrderBy(o => o.AreaNo).ToListAsync();
                }
                storageArea = await Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.AreaNo != storageLocat.AreaNo && w.WareHouseNo == "W04").OrderBy(o => o.AreaNo).ToListAsync();
            }
            return storageArea;
        }
@@ -817,7 +813,7 @@
                    {
                        throw Oops.Bah("所选区域信息不存在,请检查!");
                    }
                    EndLocat = await GetLocat(areaNo, stockDetail.SkuNo, stockDetail.LotNo, palletNo);
                    EndLocat = await GetLocat(areaNo);
                }
                else
                {
@@ -846,7 +842,7 @@
                var storageLocatEnd = new SysStorageLocat();
                if (!string.IsNullOrEmpty(areaNo))
                {
                    storageLocatEnd = await Db.Queryable<SysStorageLocat>().FirstAsync(w => w.IsDel == "0" && w.LocatNo == EndLocat && w.Flag == "0" && w.Status == "0");
                    storageLocatEnd = await Db.Queryable<SysStorageLocat>().FirstAsync(w => w.IsDel == "0" && w.LocatNo == EndLocat && w.Flag == "0");
                    if (storageLocatEnd == null)
                    {
                        throw Oops.Bah("目标储位信息不存在,请检查!");
@@ -1019,7 +1015,7 @@
                    throw Oops.Bah($"托盘号:{item.PalletNo}所在的储位信息不存在,请检查!");
                }
                //获取目标储位
                EndLocat = await GetLocat(areaNo, item.SkuNo, item.LotNo, palletNo);
                EndLocat = await GetLocat(areaNo);
                if (string.IsNullOrEmpty(EndLocat))
                {
                    throw Oops.Bah("分配目标储位失败,请检查!");
@@ -1101,28 +1097,23 @@
        /// <param name="skuNo"></param>
        /// <param name="lotNo"></param>
        /// <returns></returns>
        private async Task<string> GetLocat(string areaNo, string skuNo, string lotNo, string palletNo, string hasLocatNoList = "")
        private async Task<string> GetLocat(string areaNo)
        {
            string endLocat = string.Empty;//目标储位
                                           //当然区域所有储位信息
            var storageLocatList = await Db.Queryable<SysStorageLocat>().Where(w => w.WareHouseNo == "W02" && w.AreaNo == areaNo).ToListAsync();
            //同区域同批次物料的储位信息
            List<string> locatList = await Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.SkuNo == skuNo && w.LotNo == lotNo && w.WareHouseNo == "W02" && w.AreaNo == areaNo && w.PalletNo != palletNo)
                .OrderByDescending(o => o.LocatNo).Select(s => s.LocatNo).Distinct().ToListAsync();
            foreach (var item in locatList)
            {
                var locatInfo = storageLocatList.Where(w => w.LocatNo == item).First();
            //当前区域所有储位信息
            var storageLocatList = await Db.Queryable<SysStorageLocat>().Where(w => w.WareHouseNo == "W04" && w.AreaNo == areaNo).ToListAsync();
            var locatInfo2 = storageLocatList.Where(w => w.IsDel == "0" && w.Flag == "0" && w.Status == "0")
                           .OrderByDescending(m => m.Layer).OrderByDescending(m => m.Column).OrderByDescending(m => m.Row).First();
                var locatInfo2 = storageLocatList.Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0" && w.LocatNo != locatInfo.LocatNo && w.Row == locatInfo.Row && !hasLocatNoList.Contains(w.LocatNo))
                    .OrderByDescending(o => o.Column).First();
                if (locatInfo2 != null)
                {
                    endLocat = locatInfo2.LocatNo;
                }
            if (locatInfo2 != null)
            {
                endLocat = locatInfo2.LocatNo;
            }
            if (string.IsNullOrEmpty(endLocat))
            {
                var locatInfo3 = storageLocatList.Where(w => w.IsDel == "0" && w.Flag == "0" && w.Status == "0" && !hasLocatNoList.Contains(w.LocatNo))
                var locatInfo3 = storageLocatList.Where(w => w.IsDel == "0" && w.Flag == "0")
                            .OrderByDescending(m => m.Layer).OrderByDescending(m => m.Column).OrderByDescending(m => m.Row).First();
                if (locatInfo3 != null)
@@ -1216,7 +1207,7 @@
        }
        #endregion
        #region 箱码拆箱贴标
        #region 箱码拆箱贴标、人工确认收货
        /// <summary>
        /// 拆箱添加标签
        /// </summary>
@@ -1252,7 +1243,18 @@
                Db.Updateable(boxInfo).ExecuteCommand();
                var boxStr = boxInfo.BoxNo.Substring(0, boxInfo.BoxNo.Length - 6);//获取箱码前缀-除后六位流水外
                var maxBoxCode = Db.Queryable<BllBoxInfo>().Where(m => m.BoxNo.Contains(boxStr) && m.IsDel == "0" && m.Origin == "WMS生成").Max(a => a.BoxNo);
                var maxBoxCode1 = Db.Queryable<BllBoxInfo>().Where(m => m.BoxNo.Contains(boxStr) && m.IsDel == "0" && m.Origin == "WMS生成").Max(a => a.BoxNo);
                var maxBoxCode2 = Db.Queryable<DataBoxInfo>().Where(m => m.BoxNo.Contains(boxStr) && m.IsDel == "0").Max(a => a.BoxNo);
                //如果结果为0,则说明两个字符串相等;  ABC  BCE
                //如果结果小于0,则说明第一个字符串小于第二个字符串;
                //如果结果大于0,则说明第一个字符串大于第二个字符串。
                var maxBoxCode = maxBoxCode1;
                var bol = String.CompareOrdinal(maxBoxCode1, maxBoxCode2);
                if (bol<0)
                {
                    maxBoxCode = maxBoxCode2;
                }
                var boxNoNew = maxBoxCode.Substring(0, maxBoxCode.Length - 6) + (int.Parse(maxBoxCode.Substring(maxBoxCode.Length - 6, 6)) + 1).ToString().PadLeft(6, '0');
                // 添加新箱码信息
@@ -1296,6 +1298,121 @@
                throw new Exception(e.Message);
            }
        }
        public string GetReceiptSoNoByPallet(string palletNo)
        {
            try
            {
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).GroupBy(m=>m.SONo).Select(m=>m.SONo).ToList();
                if (stockDetail.Count == 0)
                {
                    throw new Exception("没有查询到托盘库存信息");
                }
                if (stockDetail.Count != 1)
                {
                    throw new Exception("库存托盘不是唯一出库单");
                }
                var detail = stockDetail.First();
                if (string.IsNullOrWhiteSpace(detail))
                {
                    throw new Exception("托盘没有出库单信息");
                }
                var task = Db.Queryable<LogTask>().First(m => m.PalletNo == palletNo && m.IsDel == "0" && m.Status == "5");
                if (task == null)
                {
                    throw new Exception("没有查询到托盘任务信息");
                }
                if (task.Status != "5")
                {
                    throw new Exception("任务状态不是等待确认");
                }
                return detail;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        /// <summary>
        /// 人工确认收货
        /// </summary>
        /// <param name="palletNo"></param>
        /// <param name="userId"></param>
        public void ConfirmReceipt(string palletNo, int userId)
        {
            try
            {
                Db.BeginTran();
                var task = Db.Queryable<LogTask>().First(m => m.PalletNo == palletNo && m.IsDel == "0" && m.Status == "5");
                if (task == null)
                {
                    throw new Exception("没有查询到托盘任务信息");
                }
                if (task.Status != "5")
                {
                    throw new Exception("任务状态不是等待确认");
                }
                //任务状态变更为执行完成
                task.Status = "2";
                Db.Updateable(task).ExecuteCommand();
                var locatList = Db.Queryable<SysStorageLocat>().Where(m=>m.WareHouseNo == "W04" && (m.AreaNo == "B06" || m.AreaNo == "B07") && m.IsDel == "0").ToList();
                var locat = locatList.FirstOrDefault(m => m.LocatNo == task.EndLocat);
                //判断托盘储位是否在车间
                if (locat == null)
                {
                    throw new Exception("储位信息没有在车间工位上");
                }
                locat.Status = "0";
                Db.Updateable(locat).ExecuteCommand();
                //判断托盘信息
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).ToList();
                foreach (var item in stockDetail)
                {
                    if (item.UDF5 != "1" || string.IsNullOrWhiteSpace(item.SONo))
                    {
                        continue;
                    }
                    //item.WareHouseNo = "";
                    //item.RoadwayNo = "";
                    //item.AreaNo = "";
                    item.LocatNo = "";
                    item.PalletNo = "";
                    item.LockQty = 0; // 锁定数量更为0
                    item.Status = "0"; // 状态变为待分配
                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.StockDetailId == item.Id).ToList();
                    foreach (var item2 in boxInfo)
                    {
                        item2.Status = "2"; //状态变为已入库
                    }
                    Db.Updateable(boxInfo).ExecuteCommand();
                }
                Db.Updateable(stockDetail).ExecuteCommand();
                //托盘变更状态
                var pallet = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == palletNo);
                if (pallet == null)
                {
                    throw new Exception("没有查询到托盘信息");
                }
                pallet.Status = "0";
                Db.Updateable(pallet).ExecuteCommand();
                //添加操作日志
                new OperationCrServer().AddLogOperationCr("库内作业", "操作日志", palletNo, "编辑", $"车间收货:{palletNo}托盘收货", userId);
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        #endregion
    }
Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs
@@ -118,20 +118,20 @@
                #region 拼托信息
                var sdId = 0;
                bool isNew = false;
                var pinStockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew);
                var pinStockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.SkuNo == stockDetail.SkuNo && m.LotNo == stockDetail.LotNo);
                if (pinStockDetail != null)
                {
                    if (palletNo != palletNoNew)//非整托拣货
                    {
                        if (pinStockDetail.SONo != notice.SONo)
                        var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Id!= pinStockDetail.Id).ToList();
                        if (pinStockDetails.Count(m=>m.SONo != notice.SONo) > 0)
                        {
                            throw Oops.Bah("拼托托盘上只能放同一个出库单下的物料!");
                        }
                        if (pinStockDetail.SkuName != stockDetail.SkuName || pinStockDetail.LotNo != stockDetail.LotNo)
                        {
                            isNew = true;
                        }
                    }
                    sdId = pinStockDetail.Id;
                }
                else
@@ -147,6 +147,7 @@
                    newPalletInfo.Status = "1";
                    await Db.Updateable(newPalletInfo).ExecuteCommandAsync();
                }
                var sd = new DataStockDetail();
                if (isNew)
                {
@@ -189,7 +190,7 @@
                    sd.IsDel = "0";
                    sd.CreateUser = userId;
                    sd.CreateTime = nowDate;
                    sd.UDF5 = "1";
                    //新增拼托库存明细信息
                    sdId = await Db.Insertable(sd).ExecuteReturnIdentityAsync();
                }
@@ -269,6 +270,7 @@
                    if (palletNo != palletNoNew)
                    {
                        var locateStr = stockDetail.LocatNo;
                        //删除原托盘库存明细
                        await Db.Deleteable(stockDetail).ExecuteCommandAsync();
@@ -280,10 +282,19 @@
                        }
                        pallet.Status = "0";
                        await Db.Updateable(pallet).ExecuteCommandAsync();
                        //更改储位状态为空储位
                        var locate = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == locateStr);
                        if (locate != null)
                        {
                            locate.Status = "0";
                            Db.Updateable(locate).ExecuteCommand();
                        }
                    }
                    else
                    {
                        stockDetail.SONo = soNo;
                        stockDetail.UDF5 = "1";
                        await Db.Updateable(stockDetail).ExecuteCommandAsync();
                    }
@@ -301,14 +312,13 @@
                }
                else
                {
                    var biaoShi = "0";//0:整箱拣货、1:散支拣货、2:数量拣货
                    List<DataBoxInfo> boxInfos;
                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo);
                    if (await boxInfo.CountAsync() == 0)
                    {
                        throw Oops.Bah("未查询到该箱码的信息");
                    }
                    boxInfos = boxInfo.ToList();
                    var comDetailList = await Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToListAsync();
                    
                    //整箱拣货
@@ -322,7 +332,7 @@
                    {
                        throw Oops.Bah("拣货数量不能大于箱内剩余待拣数量");
                    }
                    boxInfos = await boxInfo.ToListAsync();
                    foreach (var item in boxInfos)
                    {
                        if (comDetailList.Any(m => m.BoxNo == item.BoxNo))
@@ -360,9 +370,13 @@
                        comList.Add(completeDetail);
                        //修改库存箱码明细
                        item.StockDetailId = sdId;
                        item.BindNo = null;//托盘绑定号
                        item.PalletNo = palletNoNew;
                        if (palletNo != palletNoNew)
                        {
                            item.StockDetailId = sdId;
                            item.BindNo = null;//托盘绑定号
                            item.PalletNo = palletNoNew;
                        }
                        item.Status = "5";//箱支状态,0:未组托  1:已组托 2:已入库 3:已出库 4:已分配 5:已拣货
                        await Db.Updateable(item).ExecuteCommandAsync();
@@ -382,6 +396,7 @@
                    stockDetail.BitPalletMark = "1";//修改为零托标识
                    stockDetail.Qty -= pickQty;
                    stockDetail.LockQty -= pickQty;
                    stockDetail.UDF5 = "1";
                    if (stockDetail.Qty == stockDetail.LockQty)
                    {
                        stockDetail.Status = "2";
@@ -397,15 +412,9 @@
                    if (stockDetail.Qty <= 0)
                    {
                        var locateStr = stockDetail.LocatNo;
                        await Db.Deleteable(stockDetail).ExecuteCommandAsync();
                    }
                    else
                    {
                        await Db.Updateable(stockDetail).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)
@@ -414,7 +423,20 @@
                        }
                        pallet.Status = "0";
                        await Db.Updateable(pallet).ExecuteCommandAsync();
                        //更改储位状态为空储位
                        var locate = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == locateStr);
                        if (locate != null)
                        {
                            locate.Status = "0";
                            Db.Updateable(locate).ExecuteCommand();
                        }
                    }
                    else
                    {
                        await Db.Updateable(stockDetail).ExecuteCommandAsync();
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    await Db.Updateable(noticeDetail).ExecuteCommandAsync();
@@ -542,18 +564,15 @@
                #region 拼托信息
                bool isNew = false;
                var pinStockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew);
                var pinStockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.SkuNo== stockDetail.SkuNo && m.LotNo == stockDetail.LotNo);
                if (pinStockDetail != null)
                {
                    if (palletNo != palletNoNew)//非整托拣货
                    {
                        if (pinStockDetail.SONo != notice.SONo)
                        var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Id != pinStockDetail.Id).ToList();
                        if (pinStockDetails.Count(m => m.SONo != notice.SONo) > 0)
                        {
                            throw Oops.Bah("拼托托盘上只能放同一个出库单下的物料!");
                        }
                        if (pinStockDetail.SkuName != stockDetail.SkuName || pinStockDetail.LotNo != stockDetail.LotNo)
                        {
                            isNew = true;
                        }
                    }
                }
@@ -617,6 +636,7 @@
                    sd.IsDel = "0";
                    sd.CreateUser = userId;
                    sd.CreateTime = nowDate;
                    sd.UDF5 = "1";
                    //新增拼托库存明细信息
                    await Db.Insertable(sd).ExecuteReturnIdentityAsync();
@@ -628,11 +648,13 @@
                        //修改拼托托盘库存明细
                        pinStockDetail.Qty += int.Parse(PickQty);
                        pinStockDetail.LockQty += int.Parse(PickQty);
                        pinStockDetail.UDF5 = "1";
                        await Db.Updateable(pinStockDetail).ExecuteCommandAsync();
                    }
                    else
                    {
                        pinStockDetail.SONo = soNo;
                        pinStockDetail.UDF5 = "1";
                        await Db.Updateable(pinStockDetail).ExecuteCommandAsync();
                    }
                }
@@ -697,7 +719,7 @@
                await Db.Updateable(allot).ExecuteCommandAsync();
                int isDel = 0;
                var locateStr = stockDetail.LocatNo;
                if (palletNo != palletNoNew)
                {
                    //删除或修改库存明细
@@ -742,6 +764,15 @@
                    pallet.Status = "0";
                    await Db.Updateable(pallet).ExecuteCommandAsync();
                    //更改储位状态为空储位
                    var locate = Db.Queryable<SysStorageLocat>().First(m=>m.IsDel == "0" && m.LocatNo == locateStr);
                    if (locate!=null)
                    {
                        locate.Status = "0";
                        Db.Updateable(locate).ExecuteCommand();
                    }
                }
                //修改出库单明细拣货数量
@@ -803,10 +834,10 @@
                throw Oops.Bah("托盘码为空,请输入托盘码");
            }
            var palletInfo = await Db.Queryable<DataStockDetail>().FirstAsync(w => w.IsDel == "0" && w.PalletNo == palletNo);
            if (!string.IsNullOrEmpty(palletInfo.WareHouseNo) && type != "1")
            {
                throw Oops.Bah("该托盘还未出库");
            }
            //if (!string.IsNullOrEmpty(palletInfo.WareHouseNo) && type != "1")
            //{
            //    throw Oops.Bah("该托盘还未出库");
            //}
            if (type == "1")//平库出库获取单据
            {
                var allotList = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.Status == "1" && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -29,6 +29,7 @@
using System.Diagnostics;
using System.Drawing.Drawing2D;
using Model.ModelDto.LogDto;
using AutoMapper.Internal;
namespace WMS.BLL.BllSoServer
{
@@ -1016,7 +1017,7 @@
                var stockRst = new StockServer();
                var stockDetailRst = new StockDetailServer();
                Expression<Func<DataStockDetail, bool>> item = Expressionable.Create<DataStockDetail>()
                    .And(it => it.WareHouseNo == house)
                    .And(it => it.WareHouseNo == house || string.IsNullOrWhiteSpace(it.LocatNo))
                    .AndIF(!string.IsNullOrWhiteSpace(inspectStatus), it => inspectStatus.Contains(it.InspectStatus))
                    .And(m => skuStrList.Contains(m.SkuNo))
                    .AndIF(type == "6", m => m.OwnerNo == ownerNo)//代储出库需要关联货主
@@ -1249,7 +1250,7 @@
                        IsWave = "0",
                        WaveNo = "",
                        IsDespatch = "0",
                        WareHouseNo = model.WareHouseNo,
                        CreateUser = userId,
                    };
@@ -3025,9 +3026,40 @@
                try
                {
                    List<LogTask> logTaskList = new List<LogTask>();//此次出库任务集合,为应对同托盘不同物料出库
                    var i = 0;
                    var outLocatelist1 = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.AreaNo == "B02" && m.Flag == "0").ToList();
                    var outLocatelist2 = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.AreaNo == "B05" && m.Flag == "0").ToList();
                    //循环分配的信息生成出库任务
                    foreach (var item in list)
                    {
                        var outModeLocate = "";
                        if (outMode == "1")
                        {
                            if (i < outLocatelist1.Count)
                            {
                                outModeLocate = outLocatelist1[i].LocatNo;
                            }
                            else
                            {
                                var j = i % outLocatelist1.Count;
                                outModeLocate = outLocatelist1[j].LocatNo;
                            }
                        }
                        else if(outMode == "2")
                        {
                            if (i < outLocatelist1.Count)
                            {
                                outModeLocate = outLocatelist2[i].LocatNo;
                            }
                            else
                            {
                                var j = i % outLocatelist1.Count;
                                outModeLocate = outLocatelist2[j].LocatNo;
                            }
                        }
                        var taskNoStr = "";
                                           
                        // 储位号
@@ -3050,7 +3082,7 @@
                            {
                                //如果不在仓库内,当前分配信息直接更新出库完成 
                                item.Status = "2";//状态
                                item.OutMode = outMode;//出库口
                                item.OutMode = outModeLocate;//出库口
                                Db.Updateable(item).ExecuteCommand();
                                var noticeDetail = Db.Queryable<BllExportNoticeDetail>().First(m => m.IsDel == "0" && m.Id == item.SODetailNo);
                                if (noticeDetail != null) //更新出库单据的下发数量
@@ -3072,6 +3104,7 @@
                            }
                            flagList.Add(0);
                            continue;
                        }
                        var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0");//当前出库的储位信息
@@ -3102,7 +3135,7 @@
                                IsSuccess = 0, //是否下发成功 0失败 1成功
                                StartLocat = locate.LocatNo,//起始位置
                                EndLocat = outMode,//目标位置
                                EndLocat = outModeLocate,//目标位置
                                PalletNo = item.PalletNo,//托盘码
                                IsSend = 1,//是否可再次下发
                                IsCancel = 1,//是否可取消
@@ -3110,7 +3143,7 @@
                                Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                Status = "0",//任务状态0:等待执行1正在执行2执行完成
                                OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                Msg = "从" + locate.LocatNo + "到" + outMode + "的出库任务", //关键信息
                                Msg = "从" + locate.LocatNo + "到" + outModeLocate + "的出库任务", //关键信息
                            };
                            Db.Insertable(exTask).ExecuteCommand();
                            logTaskList.Add(exTask);
@@ -3120,10 +3153,10 @@
                                PalletNo = item.PalletNo,//托盘号
                                StartLocate = locate.LocatNo, // 起始位置
                                StartRoadway = locate.RoadwayNo,//其实巷道
                                EndLocate = outMode, // 目标位置
                                EndLocate = outModeLocate, // 目标位置
                                TaskNo = exTask.TaskNo, // 任务号
                                TaskType = "1",// 任务类型 (出库)0入 1出 2移 
                                OutMode = outMode,  //出库口
                                OutMode = outModeLocate,  //出库口
                                Order = 1,
                                //UnstackingMode = "unstackingMode2",//拣货方式 0机器拆托出  1 人工拣货出
@@ -3157,17 +3190,21 @@
                            }
                            locate.Status = "3"; //要出库的储位改变状态 正在出库
                            Db.Updateable(locate).ExecuteCommand();
                            var locate2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == outModeLocate && m.IsDel == "0");//当前出库的目标储位信息
                            locate2.Status = "4";
                            Db.Updateable(locate2).ExecuteCommand();
                            item.TaskNo = taskNoStr; // 出库分配信息中更新任务号
                            item.Status = "1"; // 出库分配信息状态改为正在执行 
                            //item.UnstackingMode = unstackingMode2;//拆垛方式
                            item.OutMode = outMode;//出库口
                            item.OutMode = outModeLocate;//出库口
                            //item.LoadingAddre = unstackingMode2 == "0" ? loadingAddre : "";//装车口
                            Db.Updateable(item).ExecuteCommand();
                            #endregion
                            flagList.Add(0);
                            i++;
                        }
                        else if (locate.Status == "3") //出库中
                        {
@@ -4100,7 +4137,6 @@
            return bl;
        }
        private class addreClass
        {
            public string slotCode { get; set; }
@@ -4113,6 +4149,289 @@
            public string AisleOne { get; set; }
             
        }
        /// <summary>
        /// wcs返回的成功信号(出库成功)
        /// </summary>
        /// <param name="taskNo"></param>
        /// <param name="userId"></param>
        /// <exception cref="Exception"></exception>
        public void ExportSuccess(string taskNo, int userId)
        {
            try
            {
                //当前任务信息
                var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0");
                if (task == null)
                {
                    throw new Exception($"未查询到任务号为:‘{taskNo}’的任务信息");
                }
                if (task.Status == "2")
                {
                    throw new Exception("当前任务已完成");
                }
                Db.BeginTran();
                //库存中当前托盘的信息
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList();
                var locateNo = stockDetail.Select(m => m.LocatNo).Distinct().FirstOrDefault();
                //当前任务中的储位信息
                var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo);
                try
                {
                    task.Status = "2";//任务状态
                    task.IsSend = 0;
                    task.IsCancel = 0;
                    task.IsFinish = 0;
                    task.FinishDate = DateTime.Now;//完成时间
                    Db.Updateable(task).ExecuteCommand();
                    if (locate != null)
                    {
                        locate.Status = "0"; // 更改当前任务中的储位状态(改为0空储位)
                        Db.Updateable(locate).ExecuteCommand();
                    }
                    foreach (var item in stockDetail)
                    {
                        if (item.SkuNo == "100099")//判断是否是空托出库
                        {
                            //判断总库存是否为0,如果为0删除 否则减去数量
                            var stock = Db.Queryable<DataStock>().First(m => m.SkuNo == "100099");
                            if (stock != null)
                            {
                                if (item.LockQty != null)
                                {
                                    stock.Qty -= item.LockQty.Value;
                                    stock.LockQty -= item.LockQty.Value;
                                    Db.Updateable(stock).ExecuteCommand();
                                }
                                if (stock.Qty == 0)
                                {
                                    Db.Deleteable(stock).ExecuteCommand();
                                }
                            }
                            //托盘状态改为未使用
                            var sCode = Db.Queryable<SysPallets>().First(m => m.PalletNo == item.PalletNo);
                            if (sCode != null)
                            {
                                sCode.Status = "0";
                                Db.Updateable(sCode).ExecuteCommand();
                            }
                            Db.Deleteable(item).ExecuteCommand();
                            continue;
                        }
                        item.LocatNo = "";//储位更改(改为空)
                        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")
                        {
                            item.Status = "5";
                            item.CompleteQty += stockDetail[0].Qty;
                            PalletType = "1";
                        }
                        else
                        {
                            item.Status = "2";
                        }
                    }
                    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")
                    {
                        //修改目标地址状态
                        var endLocat = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == task.EndLocat);
                        endLocat.Status = "1";
                        Db.Updateable(endLocat).ExecuteCommand();
                        foreach (var item in stockDetail)
                        {
                            item.LocatNo = endLocat.LocatNo;//储位更改(改为空)
                            item.WareHouseNo = endLocat.WareHouseNo;//所属仓库更改(改为空)
                            item.RoadwayNo = endLocat.RoadwayNo;//所属巷道更改(改为空)
                            item.AreaNo = endLocat.AreaNo;//所属区域更改(改为空)
                        }
                    }
                    Db.Updateable(stockDetail).ExecuteCommand();
                    Db.Updateable(allot).ExecuteCommand();
                    if (userId != 0)
                    {
                        //添加操作日志记录
                        var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId);
                    }
                    Db.CommitTran();
                }
                catch (Exception ex)
                {
                    Db.RollbackTran();
                    throw new Exception(ex.Message);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("完成反馈失败:" + ex.Message);
            }
        }
        /// <summary>
        /// wcs返回的成功信号(移库成功)
        /// </summary>
        /// <param name="taskNo">任务号</param>
        /// <param name="userId">操作人</param>
        /// <exception cref="Exception"></exception>
        public void RelocationSuccess(string taskNo, int userId)
        {
            try
            {
                //当前任务信息
                var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0");
                if (task == null)
                {
                    throw new Exception($"未查询到任务号为:‘{taskNo}’的任务信息");
                }
                if (task.Status == "2")
                {
                    throw new Exception("当前任务已完成");
                }
                Db.BeginTran();
                //库存中当前托盘的信息
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList();
                //当前任务中的目标储位信息
                //当前任务中的原储位
                var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.StartLocat);
                if (locate == null)
                {
                    throw new Exception($"WMS系统中没有该{task.StartLocat}储位对应的信息");
                }
                var locate2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.EndLocat);
                if (locate2 == null)
                {
                    throw new Exception($"WMS系统中没有该{task.EndLocat}储位对应的信息");
                }
                //平库中储位集合
                var pingKuLocate = Db.Queryable<SysStorageLocat>().Where(m => m.WareHouseNo == "W04" && m.IsDel == "0").ToList();
                var pingKuList = pingKuLocate.Select(m => m.LocatNo).ToList();
                try
                {
                    task.Status = "5";//任务状态
                    //判断起始目标位置都是平库
                    if (pingKuList.Contains(task.StartLocat) && pingKuList.Contains(task.EndLocat))
                    {
                        task.Status = "2";
                    }
                    task.IsSend = 0;
                    task.IsCancel = 0;
                    task.IsFinish = 0;
                    task.FinishDate = DateTime.Now;//完成时间
                    Db.Updateable(task).ExecuteCommand();
                    #region 修改储位状态
                    if (!pingKuList.Contains(task.StartLocat))
                    {
                        //原储位改为空储位 0
                        locate.Status = "0";
                        Db.Updateable(locate).ExecuteCommand();
                    }
                    //目标储位改为有货物 1
                    locate2.Status = "1";
                    Db.Updateable(locate2).ExecuteCommand();
                    //判断起始目标位置都是平库
                    if ( pingKuList.Contains(task.EndLocat))
                    {
                        foreach (var item in stockDetail)
                        {
                            item.WareHouseNo = locate2.WareHouseNo;
                            item.AreaNo = locate2.AreaNo;
                            item.RoadwayNo = locate2.RoadwayNo;
                            item.LocatNo = locate2.LocatNo;
                        }
                        Db.Updateable(stockDetail).ExecuteCommand();
                    }
                    #endregion
                    Db.CommitTran();
                }
                catch (Exception ex)
                {
                    Db.RollbackTran();
                    throw new Exception(ex.Message);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("完成反馈失败:" + ex.Message);
            }
        }
        /// <summary>
        /// AGV任务取货完成反馈
        /// </summary>
        /// <param name="taskNo"></param>
        public void AGVQuHuoSuccess(string taskNo)
        {
            try
            {
                Db.BeginTran();
                var task = Db.Queryable<LogTask>().First(m=>m.IsDel =="0" && m.TaskNo == taskNo);
                if (task == null)
                {
                    throw new Exception("没有查询到任务信息");
                }
                if (task.Status!="1")
                {
                    throw new Exception("任务状态不是正在执行,请核实");
                }
                var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.StartLocat && m.IsDel == "0");
                if (locate == null)
                {
                    throw new Exception("没有查询到起始储位信息");
                }
                if (locate.WareHouseNo!="W04")
                {
                    throw new Exception("起始储位不是平库储位,请核实");
                }
                locate.Status = "0"; //更改储位状态为空储位
                Db.Updateable(locate).ExecuteCommand();
                //查询出托盘信息  更改库存储位信息
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == task.PalletNo).ToList();
                foreach (var item in stockDetail)
                {
                    item.WareHouseNo = "";
                    item.AreaNo = "";
                    item.RoadwayNo = "";
                    item.LocatNo = "";
                }
                Db.Updateable(stockDetail).ExecuteCommand();
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        #endregion
        #endregion
@@ -5599,338 +5918,6 @@
            }
        }
        
        //wcs返回的成功信号(出库成功)
        public void ExportSuccess(string taskNo, int userId)
        {
            try
            {
                //当前任务信息
                var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0");
                if (task == null)
                {
                    throw new Exception($"未查询到任务号为:‘{taskNo}’的任务信息");
                }
                if (task.Status == "2")
                {
                    throw new Exception("当前任务已完成");
                }
                Db.BeginTran();
                //库存中当前托盘的信息
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList();
                var locateNo = stockDetail.Select(m => m.LocatNo).Distinct().FirstOrDefault();
                //当前任务中的储位信息
                var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo);
                try
                {
                    task.Status = "2";//任务状态
                    task.IsSend = 0;
                    task.IsCancel = 0;
                    task.IsFinish = 0;
                    task.FinishDate = DateTime.Now;//完成时间
                    Db.Updateable(task).ExecuteCommand();
                    if (locate != null)
                    {
                        locate.Status = "0"; // 更改当前任务中的储位状态(改为0空储位)
                        Db.Updateable(locate).ExecuteCommand();
                    }
                    foreach (var item in stockDetail)
                    {
                        if (item.SkuNo == "100099")//判断是否是空托出库
                        {
                            //判断总库存是否为0,如果为0删除 否则减去数量
                            var stock = Db.Queryable<DataStock>().First(m => m.SkuNo == "100099");
                            if (stock != null)
                            {
                                if (item.LockQty != null)
                                {
                                    stock.Qty -= item.LockQty.Value;
                                    stock.LockQty -= item.LockQty.Value;
                                    Db.Updateable(stock).ExecuteCommand();
                                }
                                if (stock.Qty == 0)
                                {
                                    Db.Deleteable(stock).ExecuteCommand();
                                }
                            }
                            //托盘状态改为未使用
                            var sCode = Db.Queryable<SysPallets>().First(m => m.PalletNo == item.PalletNo);
                            if (sCode != null)
                            {
                                sCode.Status = "0";
                                Db.Updateable(sCode).ExecuteCommand();
                            }
                            Db.Deleteable(item).ExecuteCommand();
                            #region 拣货信息
                            //var pickQty = 0;//拣货的数量
                            //var comList = new List<BllCompleteDetail>();
                            //    //添加拣货明细
                            //    var completeDetail = new BllCompleteDetail()
                            //    {
                            //        SONo = "",
                            //        SODetailNo = 0,
                            //        ExportAllotId = 0,
                            //        StockId = exportAllot.StockId,
                            //        BoxNo = item.BoxNo,
                            //        BoxNo2 = item.BoxNo2,
                            //        BoxNo3 = item.BoxNo3,
                            //        LotNo = exportAllot.LotNo,
                            //        LotText = exportAllot.LotText,
                            //        SupplierLot = exportAllot.SupplierLot,
                            //        SkuNo = exportAllot.SkuNo,
                            //        SkuName = exportAllot.SkuName,
                            //        Standard = exportAllot.Standard,
                            //        PalletNo = palletNo,
                            //        CompleteQty = item.Qty,
                            //        CreateUser = userId
                            //    };
                            //    comList.Add(completeDetail);
                            //    //删除库存箱码明细
                            //    Db.Deleteable(item).ExecuteCommand();
                            //    pickQty += item.Qty;
                            //    exportAllot.Status = "5"; //待回库 : 已完成
                            //    exportAllot.CompleteQty += item.Qty; //拣货数量
                            //    exportAllot.UpdateUser = userId; //修改人
                            //    exportAllot.UpdateTime = serverTime; //修改时间
                            //    Db.Updateable(exportAllot).ExecuteCommand();
                            //    //验证拣货信息是否为已完成
                            //    if (exportAllot.Status == "5")
                            //    {
                            //        break;
                            //    }
                            //Db.Insertable(comList).ExecuteCommand();
                            #endregion
                            continue;
                        }
                        item.LocatNo = "";//储位更改(改为空)
                        item.WareHouseNo = "";//所属仓库更改(改为空)
                        item.RoadwayNo = "";//所属巷道更改(改为空)
                        item.AreaNo = "";//所属区域更改(改为空)
                        Db.Updateable(item).ExecuteCommand();
                    }
                    //出库流水(更改状态)
                    var allot = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.TaskNo == taskNo || (m.Status == "1" && m.PalletNo == task.PalletNo))).ToList();
                    var PalletType = "0"; //0:物料托  1:空托盘托
                    var soNo = "";
                    var sku = "";
                    foreach (var item in allot)
                    {
                        if (item.SkuNo == "100099")
                        {
                            item.Status = "5";
                            item.CompleteQty += stockDetail[0].Qty;
                            PalletType = "1";
                        }
                        else
                        {
                            item.Status = "2";
                            soNo = item.SONo;
                            sku = item.SkuNo;
                        }
                    }
                    //下发四楼调度AGV的任务
                    if ((task.EndLocat == "outMode" || task.EndLocat == "outMode") && PalletType == "0")
                    {
                        foreach (var item in allot)
                        {
                            var detail = Db.Queryable<DataStockDetail>().First(m => m.Id == item.StockId);
                            detail.SONo = item.SONo;
                            Db.Updateable(detail).ExecuteCommand();
                        }
                        var locatePing = new AllotLocation().GetPingLocate(soNo, sku);
                        if (locatePing == null)
                        {
                            throw new Exception("平库未查询到空位置");
                        }
                        var exTask = new LogTask    //出库任务
                        {
                            TaskNo = new Common().GetMaxNo("TK"),
                            Sender = "WMS",
                            Receiver = "AGV",
                            IsSuccess = 0, //是否下发成功 0失败 1成功
                            StartLocat = task.EndLocat,//起始位置
                            EndLocat = locatePing.LocatNo,//outMode,//目标位置
                            PalletNo = task.PalletNo,//托盘码
                            IsSend = 1,//是否可再次下发
                            IsCancel = 1,//是否可取消
                            IsFinish = 1,//是否可完成
                            Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                            Status = "0",//任务状态0:等待执行1正在执行2执行完成
                            OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                            Msg = "从" + task.EndLocat + "到" + locatePing.LocatNo + "的出库任务", //关键信息
                        };
                        Db.Insertable(exTask).ExecuteCommand();
                        var outDto = new List<OutCommandDto>
                        {
                            new OutCommandDto()
                            {
                                PalletNo = task.PalletNo,//托盘号
                                StartLocate = task.EndLocat, // 起始位置
                                StartRoadway = "",//其实巷道
                                EndLocate = locatePing.LocatNo,//outMode, // 目标位置
                                TaskNo = exTask.TaskNo, // 任务号
                                TaskType = "1",// 任务类型 (出库)0入 1出 2移
                                OutMode = "",  //出库口
                                Order = 1,
                                //UnstackingMode = unstackingMode2,//拣货方式 0机器拆托出  1 人工拣货出
                                //CompleteQty = outCount2,  //拆的件数
                                //BoxexQty = outCount,      //总件数
                            }
                        };
                        // 正式运行程序放开
                        var list2 = outDto.Select(m => m.TaskNo).ToList();
                        var jsonData = JsonConvert.SerializeObject(outDto);
                        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<WcsModel>(response);
                            //if (wcsModel.StatusCode == 0)
                            //{
                            //更改任务的发送返回时间//
                            new TaskServer().EditTaskIssueOk(list2, time1, time2);
                            //}
                            //if (wcsModel.StatusCode == -1)
                            //{
                            //    new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.Msg);
                            //    throw new Exception(wcsModel.Msg);
                            //}
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                    Db.Updateable(allot).ExecuteCommand();
                    if (userId != 0)
                    {
                        //添加操作日志记录
                        var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId);
                    }
                    Db.CommitTran();
                }
                catch (Exception ex)
                {
                    Db.RollbackTran();
                    throw new Exception(ex.Message);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("完成反馈失败:" + ex.Message);
            }
        }
        /// <summary>
        /// wcs返回的成功信号(移库成功)
        /// </summary>
        /// <param name="taskNo">任务号</param>
        /// <param name="userId">操作人</param>
        /// <exception cref="Exception"></exception>
        public void RelocationSuccess(string taskNo, int userId)
        {
            try
            {
                //当前任务信息
                var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0");
                if (task == null)
                {
                    throw new Exception($"未查询到任务号为:‘{taskNo}’的任务信息");
                }
                if (task.Status == "2")
                {
                    throw new Exception("当前任务已完成");
                }
                Db.BeginTran();
                //库存中当前托盘的信息
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList();
                //当前任务中的目标储位信息
                //当前任务中的原储位
                var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.StartLocat);
                if (locate == null)
                {
                    throw new Exception($"WMS系统中没有该{task.StartLocat}储位对应的信息");
                }
                var locate2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.EndLocat);
                if (locate2 == null)
                {
                    throw new Exception($"WMS系统中没有该{task.EndLocat}储位对应的信息");
                }
                try
                {
                    task.Status = "2";//任务状态
                    task.IsSend = 0;
                    task.IsCancel = 0;
                    task.IsFinish = 0;
                    task.FinishDate = DateTime.Now;//完成时间
                    Db.Updateable(task).ExecuteCommand();
                    #region 修改储位状态
                    //原储位改为空储位 0
                    locate.Status = "0";
                    Db.Updateable(locate).ExecuteCommand();
                    //目标储位改为有货物 1
                    locate2.Status = "1";
                    Db.Updateable(locate2).ExecuteCommand();
                    foreach (var item in stockDetail)
                    {
                        item.WareHouseNo = locate2.WareHouseNo;
                        item.AreaNo = locate2.AreaNo;
                        item.RoadwayNo = locate2.RoadwayNo;
                        item.LocatNo = locate2.LocatNo;
                    }
                    Db.Updateable(stockDetail).ExecuteCommand();
                    #endregion
                    Db.CommitTran();
                }
                catch (Exception ex)
                {
                    Db.RollbackTran();
                    throw new Exception(ex.Message);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("完成反馈失败:" + ex.Message);
            }
        }
        //重新下发出库任务
        public OutCommandDto AgainSendSoTask(string taskNo, int userId, string url)
        {
Wms/WMS.Entity/DataEntity/DataBoxInfo.cs
@@ -79,10 +79,10 @@
        /// Default:
        /// Nullable:True
        /// </summary>           
        public decimal? FullQty {get;set;}
        public decimal? FullQty {get;set; }
        /// <summary>
        /// Desc:状态
        /// Desc:状态 0 未组托  1已组托 2 已入库 3 已出库  4 已分配 5 已拣货
        /// Default:
        /// Nullable:True
        /// </summary>           
Wms/WMS.Entity/DataEntity/DataStockDetail.cs
@@ -269,6 +269,12 @@
        /// Nullable:True
        /// </summary>           
        public string Demo { get; set; }
        /// <summary>
        /// Desc:是否需要收货托盘  1 车间收货   2 仓库收货
        /// Default:
        /// Nullable:True
        /// </summary>
        public string UDF5 { get; set; }
    }
}
Wms/WMS.Entity/LogEntity/LogTask.cs
@@ -136,7 +136,7 @@
        /// <summary>
        /// Desc:状态
        /// Default:0 等待执行 1 正在执行 2 执行完成 3 异常结束 4 已取消
        /// Default:0 等待执行 1 正在执行 2 执行完成 3 异常结束 4 已取消  5等待确认
        /// Nullable:True
        /// </summary>           
        public string Status {get;set;}
Wms/WMS.IBLL/IBllSoServer/IExportNoticeServer.cs
@@ -195,8 +195,6 @@
        /// <returns>下发的指令集合</returns>
        List<OutCommandDto> IssueOutHouse(string soNo, string unstackingMode, string outMode, string loadingAddre, int userId,string url,out string str);
        /// <summary>
        /// wcs返回的成功信号或手动完成(出库成功)
        /// </summary>
@@ -213,6 +211,13 @@
        void RelocationSuccess(string taskNo, int userId);
        /// <summary>
        /// AGV任务取货完成反馈
        /// </summary>
        /// <param name="taskNo"></param>
        void AGVQuHuoSuccess(string taskNo);
        /// <summary>
        /// 重新下发出库任务
        /// </summary>
        /// <param name="taskNo">任务号</param> 
Wms/WMS.IBLL/IPdaServer/IPdaCrServer.cs
@@ -156,6 +156,21 @@
        #region 箱码拆箱贴标
        //箱码拆箱添加标签信息
        void AddLableByDevanning(string boxNo,decimal devanQty, int userId);
        /// <summary>
        /// 根据收货托盘获取出库单信息
        /// </summary>
        /// <param name="palletNo"></param>
        string GetReceiptSoNoByPallet(string palletNo);
        /// <summary>
        /// 车间收货
        /// </summary>
        /// <param name="palletNo"></param>
        /// <param name="userId"></param>
        void ConfirmReceipt(string palletNo, int userId);
        #endregion
Wms/Wms/Controllers/DownApiController.cs
@@ -504,7 +504,7 @@
                        }
                        break;
                    case "2"://盘库完成任务
                        if (model.TaskType == "1")//0:入库 1:出库 3:移库
                        if (model.TaskType == "1")//0:入库 1:出库 2:移库
                        {
                            _crCheckSvc.CheckSuccess(model.TaskNo, 0);
                            return Ok(new WcsModel { StatusCode = 0, Msg = "盘点出库完成" });
@@ -516,7 +516,7 @@
                        }
                        break;
                    case "3"://移库完成任务、优化储位
                        if (model.TaskType == "3") //0:入库 1:出库 3:移库
                        if (model.TaskType == "3") //0:入库 1:出库 2:移库
                        {
                            //填写移库完成代码
                        }
@@ -534,6 +534,31 @@
        /// <summary>
        /// WCS反馈AGV任务取货完成
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult AGVQuHuoSuccess(ReceiveWcsSignal model)
        {
            var logStr = $@".\log\WCS\AGV取货完成反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            try
            {
                var jsonData = JsonConvert.SerializeObject(model);
                LogFile.SaveLogToFile($"AGV取货完成反馈:( {jsonData} ),", logStr);
                _exNoticeSvc.AGVQuHuoSuccess(model.TaskNo);
                var data = new HttpReturnModel { Success = "0", Message = "成功" };
                LogFile.SaveLogToFile($"AGV取货完成反馈:({JsonConvert.SerializeObject(data)}),", logStr);
                return Ok(data);
            }
            catch (Exception e)
            {
                LogFile.SaveLogToFile($"AGV取货完成反馈:( {e.Message} ),", logStr);
                return Ok(new HttpReturnModel { Success = "-1", Message = e.Message });
            }
        }
        /// <summary>
        /// 空取异常
        /// </summary>
        /// <returns></returns>
Wms/Wms/Controllers/PdaCrController.cs
@@ -323,5 +323,50 @@
        }
        #endregion
        #region 确认收货
        /// <summary>
        /// 根据收货托盘获取出库单信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetReceiptSoNoByPallet(PdaReceiptVm model)
        {
            try
            {
                var soNo = _pdaCrSvc.GetReceiptSoNoByPallet(model.PalletNo);
                return Ok(new { data = soNo, code = 0, msg = "成功" });
            }
            catch (Exception e)
            {
                return Ok(new { data = "", code = 1, msg = $"异常:{e.Message}" });
            }
        }
        /// <summary>
        /// 确认收货
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult ConfirmReceipt(PdaReceiptVm model)
        {
            try
            {
                _pdaCrSvc.ConfirmReceipt(model.PalletNo, _userManager.UserId);
                return Ok(new { data = "", code = 0, msg = "成功" });
            }
            catch (Exception e)
            {
                return Ok(new { data = "", code = 1, msg = $"异常:{e.Message}" });
            }
        }
        #endregion
    }
}