Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs
@@ -80,9 +80,15 @@
                {
                    throw Oops.Bah("未查询到该出库单的信息");
                }
                if (notice.Status != "3")
                //if (notice.Status != "3")
                //{
                //    throw Oops.Bah("出库单的状态不是正在执行,不能拣货");
                //}
                //2025年12月05日甲方要求超捡,出库单调整为执行完毕也可以超捡
                List<string> statusList = new List<string>() { "3", "4" };
                if (!statusList.Contains(notice.Status))
                {
                    throw Oops.Bah("出库单的状态不是正在执行,不能拣货");
                    throw Oops.Bah("出库单的状态非正在执行,不能拣货");
                }
                //出库单明细
                var noticeDetail = await Db.Queryable<BllExportNoticeDetail>().FirstAsync(m => m.IsDel == "0" && m.Id == int.Parse(soDetailId));
@@ -119,18 +125,21 @@
                bool isNew = false;
                var pinStockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.SkuNo == stockDetail.SkuNo && m.LotNo == stockDetail.LotNo);
                //var pinStockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew);
                if (pinStockDetail != null)
                {
                    //修改托盘表状态让托盘表和库存明细表保持一致
                    string uptPalletStatusSql = $@"update SysPallets set Status='1' where PalletNo='{palletNoNew}'";
                    int uptPalletStatus = Db.Ado.ExecuteCommand(uptPalletStatusSql);
                    Db.CommitTran();
                    if (palletNo != palletNoNew)//非整托拣货                                                
                    {
                        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("拼托托盘上只能放同一个出库单下的物料!");
                        //}
                        //var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Id != pinStockDetail.Id).ToList();
                        var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew).ToList();
                        //只允许绑定同一个出库单下的物料
                        if (pinStockDetails.GroupBy(e => e.SONo).Count() > 0 && pinStockDetails.Count(m => m.SONo != notice.SONo) > 0)
                        if (pinStockDetails.Count(m => m.SONo != notice.SONo) > 0)
                        {
                            throw Oops.Bah("拼托托盘上只能放同一个出库单下的物料!");
                        }
@@ -150,14 +159,10 @@
                    if (newPalletInfo.Status == "0")
                    {
                        var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew && (m.SkuNo != stockDetail.SkuNo || m.LotNo != stockDetail.LotNo)).ToList();
                        //if (pinStockDetails.Count(m => m.SONo != notice.SONo) > 0)
                        //{
                        //    throw Oops.Bah("一个托盘只能接受一个出库单拼托!");
                        //}
                        //只允许绑定同一个出库单下的物料
                        if (pinStockDetails.GroupBy(e => e.SONo).Count() > 0 && pinStockDetails.Count(m => m.SONo != notice.SONo) > 0)
                        if (pinStockDetails.Count(m => m.SONo != notice.SONo) > 0)
                        {
                            throw Oops.Bah("拼托托盘上只能放同一个出库单下的物料!");
                            throw Oops.Bah("一个托盘只能接受一个出库单拼托!");
                        }
                    }
                    else
@@ -214,6 +219,10 @@
                    sd.UDF5 = "1";
                    //新增拼托库存明细信息
                    sdId = await Db.Insertable(sd).ExecuteReturnIdentityAsync();
                    //修改托盘表状态让托盘表和库存明细表保持一致
                    string uptPalletStatusSql = $@"update SysPallets set Status='1' where PalletNo='{palletNoNew}'";
                    int uptPalletStatus = Db.Ado.ExecuteCommand(uptPalletStatusSql);
                }
                #endregion
@@ -605,11 +614,18 @@
                #region 拼托信息
                bool isNew = false;
                var pinStockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.SkuNo == stockDetail.SkuNo && m.LotNo == stockDetail.LotNo);
                //var pinStockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew);
                if (pinStockDetail != null)
                {
                    //修改托盘表状态让托盘表和库存明细表保持一致
                    string uptPalletStatusSql = $@"update SysPallets set Status='1' where PalletNo='{palletNoNew}'";
                    int uptPalletStatus = Db.Ado.ExecuteCommand(uptPalletStatusSql);
                    Db.CommitTran();
                    if (palletNo != palletNoNew)//非整托拣货
                    {
                        var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Id != pinStockDetail.Id).ToList();
                        //var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Id != pinStockDetail.Id).ToList();
                        var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew).ToList();
                        if (pinStockDetails.Count(m => m.SONo != notice.SONo) > 0)
                        {
                            throw Oops.Bah("拼托托盘上只能放同一个出库单下的物料!");
@@ -620,8 +636,13 @@
                {
                    isNew = true;
                    var newPalletInfo = await Db.Queryable<SysPallets>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Status == "0");
                    //var newPalletInfo = await Db.Queryable<SysPallets>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Status == "0");
                    var newPalletInfo = await Db.Queryable<SysPallets>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew);
                    if (newPalletInfo == null)
                    {
                        throw Oops.Bah("新托盘信息不存在!");
                    }
                    if (newPalletInfo.Status == "0")
                    {
                        var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew && (m.SkuNo != stockDetail.SkuNo && m.LotNo != stockDetail.LotNo)).ToList();
                        if (pinStockDetails.Count(m => m.SONo != notice.SONo) > 0)
@@ -685,9 +706,12 @@
                        CreateTime = nowDate,
                        UDF5 = "1"
                    };
                    //新增拼托库存明细信息
                    await Db.Insertable(sd).ExecuteReturnIdentityAsync();
                    //修改托盘表状态让托盘表和库存明细表保持一致
                    string uptPalletStatusSql = $@"update SysPallets set Status='1' where PalletNo='{palletNoNew}'";
                    int uptPalletStatus = Db.Ado.ExecuteCommand(uptPalletStatusSql);
                }
                else
                {
@@ -1544,7 +1568,7 @@
                string skuName = boxInfos.First().SkuName;
                // 验证是否车间线边仓库
                var areaList = new List<string>() { "B06", "B07", "B09", "B24" };
                var areaList = new List<string>() { "B06", "B07", "B09", "B24", "B29" };
                if (!areaList.Contains(stockDetail.AreaNo))
                {
                    throw Oops.Bah("托盘不是车间托盘!");
@@ -1635,10 +1659,10 @@
                    boxNo, "出库", $"在PDA上对箱号为:{boxNo}的托盘码为:{palletNo}的拣货操作", userId);
                Db.CommitTran();
            }
            catch (AppFriendlyException e)
            {
                Db.RollbackTran();
            }
            //catch (AppFriendlyException e)
            //{
            //    Db.RollbackTran();
            //}
            catch (Exception e)
            {
                Db.RollbackTran();
@@ -1702,7 +1726,7 @@
                }
                // 验证是否车间线边仓库
                var areaList = new List<string>() { "B06", "B07", "B09", "B24" };
                var areaList = new List<string>() { "B06", "B07", "B09", "B24", "B29" };
                if (!areaList.Contains(stockDetail.AreaNo))
                {
                    throw Oops.Bah("托盘不是车间托盘!");
@@ -1900,10 +1924,12 @@
                throw Oops.Bah("出库明细为空,请选择物料-批次");
            }
            var allotList = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.Status == "0" && m.SONo == soNo && m.SODetailNo == int.Parse(soDetailId)).Select(m => m.PalletNo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
            //var allotList = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.Status == "0" && m.SONo == soNo && m.SODetailNo == int.Parse(soDetailId)).Select(m => m.PalletNo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
            //获取状态为0待下发、1任务下发、2待拣货、3部分拣货的出库单
            List<string> statusList = new List<string>() { "0", "1", "2", "3" };
            var allotList = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && statusList.Contains(m.Status) && m.SONo == soNo && m.SODetailNo == int.Parse(soDetailId)).Select(m => m.PalletNo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
            return allotList;
        }
@@ -1913,7 +1939,8 @@
        {
            if (type == "1")//平库出库获取单据
            {
                var allotList = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.Status == "1" || m.Status == "0")).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
                List<string> statusList = new List<string>() { "0", "1", "2", "3" };
                var allotList = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && statusList.Contains(m.Status)).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
                return allotList;
            }
            //获取状态为待拣货或者部分拣货的出库单
@@ -1933,8 +1960,9 @@
            {
                throw Oops.Bah("单据为空,请选择单据");
            }
            //获取状态为待拣货或者部分拣货的出库单
            var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SONo == soNo && (m.Status == "0" || m.Status == "1"));
            //获取状态为0待下发、1任务下发、2待拣货、3部分拣货的出库单
            List<string> statusList = new List<string>() { "0", "1", "2", "3" };
            var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SONo == soNo && (statusList.Contains(m.Status)));
            var list = await allotList.GroupBy(m => new { m.SODetailNo, m.SkuNo, m.SkuName, m.LotNo }).Select(m => new DetailIdSkuLotNo()
            {