zjh
4 天以前 a27f32ecbfc7390ceb9e3a8d8651c57ada88bfa0
StandardPda/MES.Service/service/Warehouse/MesInvItemOutsManager.cs
@@ -14,93 +14,70 @@
        var itemOutFrom = oItemOut.from;
        var itemOutLists = oItemOut.items;
      return  UseTransaction(db =>
        return UseTransaction(db =>
        {
            // 根据AsnNo和MesNo对明细进行分组
            var groupedItems = itemOutLists
                .GroupBy(item => new { item.AsnNo, item.MesNo, item.SqNo })
                .ToList();
            int result = 1;
            foreach (var group in groupedItems)
            // 根据Type执行不同的逻辑
            switch (itemOutFrom.Type)
            {
                // if (group.Key.AsnNo == null)
                // {
                //     throw new NotImplementedException("AsnNo不能为空");
                // }
                if (group.Key.MesNo == null)
                case "1":
                {
                    throw new NotImplementedException("入库单单号不能为空");
                }
                    // 根据AsnNo和MesNo对明细进行分组
                    var groupedItems = itemOutLists
                        .GroupBy(item => new { item.AsnNo, item.MesNo, item.SqNo })
                        .ToList();
                if (group.Key.SqNo == null)
                {
                    throw new NotImplementedException("退货申请单行号不能为空");
                }
                    var result = 1;
                    foreach (var group in groupedItems)
                    {
                        if (group.Key.MesNo == null)
                            throw new NotImplementedException("入库单单号不能为空");
                // 创建一个临时的itemOutFrom对象,使用分组的Key作为主要属性
                var tempItemOutFrom = new ItemOutFrom
                {
                    AsnNo = group.Key.AsnNo,
                    MesNo = group.Key.MesNo,
                    SqNo = group.Key.SqNo,
                    // 继承原始itemOutFrom的其他属性
                    RtnNo = itemOutFrom.RtnNo,
                    Type = itemOutFrom.Type,
                    CreateBy = itemOutFrom.CreateBy,
                    FMRMODE = itemOutFrom.FMRMODE,
                    DepotId = itemOutFrom.DepotId,
                    SupperId = itemOutFrom.SupperId
                };
                        if (group.Key.SqNo == null)
                            throw new NotImplementedException("退货申请单行号不能为空");
                // 根据Type执行不同的逻辑
                switch (tempItemOutFrom.Type)
                {
                    case "1":
                        // 创建一个临时的itemOutFrom对象,使用分组的Key作为主要属性
                        var tempItemOutFrom = new ItemOutFrom
                        {
                            var mesInvItemOuts = Db.Queryable<MesInvItemOuts>()
                                .Where(s => s.BillTypeId == BILL_TYPE_ID
                                            && s.TransactionNo == TRANSACTION_NO
                                            && s.ItemOutNo == tempItemOutFrom.RtnNo
                                            && s.Sapno == tempItemOutFrom.SqNo
                                )
                                .Count();
                            AsnNo = group.Key.AsnNo,
                            MesNo = group.Key.MesNo,
                            SqNo = group.Key.SqNo,
                            // 继承原始itemOutFrom的其他属性
                            RtnNo = itemOutFrom.RtnNo,
                            Type = itemOutFrom.Type,
                            CreateBy = itemOutFrom.CreateBy,
                            FMRMODE = itemOutFrom.FMRMODE,
                            DepotId = itemOutFrom.DepotId,
                            SupperId = itemOutFrom.SupperId
                        };
                            if (mesInvItemOuts > 0)
                            {
                                throw new NotImplementedException(
                                    tempItemOutFrom.RtnNo +
                                    "的退料申请单已经存在");
                            }
                        var mesInvItemOuts = Db.Queryable<MesInvItemOuts>()
                            .Where(s => s.BillTypeId == BILL_TYPE_ID
                                        && s.TransactionNo == TRANSACTION_NO
                                        && s.ItemOutNo == tempItemOutFrom.RtnNo
                                        && s.Sapno == tempItemOutFrom.SqNo
                            )
                            .Count();
                            // 为当前分组保存数据
                            var groupResult = Save(tempItemOutFrom, group.ToList());
                            if (!groupResult)
                            {
                                result = 0;
                            }
                        if (mesInvItemOuts > 0)
                            throw new NotImplementedException(
                                tempItemOutFrom.RtnNo +
                                "的退料申请单已经存在");
                            break;
                        }
                    case "4":
                        var removeResult = Remove(tempItemOutFrom);
                        if (!removeResult)
                        {
                            result = 0;
                        }
                        // 为当前分组保存数据
                        var groupResult = Save(tempItemOutFrom, group.ToList());
                        if (!groupResult) result = 0;
                    }
                        break;
                    default:
                        result = 0;
                        break;
                    return result;
                }
                case "4":
                    // 删除操作不需要分组,直接根据RtnNo删除即可
                    var removeResult = Remove(itemOutFrom);
                    return removeResult ? 1 : 0;
                default:
                    return 0;
            }
            return result;
        }) > 0;
    }
    private bool Save(ItemOutFrom from, List<ItemOutList> items)
@@ -111,38 +88,29 @@
                        && s.BillNo == from.MesNo
            ).First();
        if (mesInvItemIns == null)
        {
            throw new NotImplementedException("采购入库不存在");
        }
        if (mesInvItemIns == null) throw new NotImplementedException("采购入库不存在");
        var mesDepots = Db.Queryable<MesDepots>()
            .Where(s => s.DepotId == Decimal.Parse(from.DepotId)).First();
            .Where(s => s.DepotId == decimal.Parse(from.DepotId)).First();
        var mesLinkU9 = Db.Queryable<MesLinkU9>()
            .Where(s => s.TableType == "MES_SUPPLIER"
                        && s.U9Id == from.SupperId).First();
        if (mesLinkU9 == null)
        {
            throw new NotImplementedException("供应商ID不存在或未同步于U9");
        }
        var mesSupplier = Db.Queryable<MesSupplier>()
            .Where(s => s.Id == Decimal.Parse(mesLinkU9.MesId))
            .Where(s => s.Id == decimal.Parse(mesLinkU9.MesId))
            .First();
        if (mesDepots == null)
        {
            throw new NotImplementedException("[" + from.DepotId +
                                              "]仓库不存在,请同步给MES");
        }
        if (mesSupplier == null)
        {
            throw new NotImplementedException("[" + from.SupperId +
                                              "]供应商不存在,请同步给MES");
        }
        var nextSequenceValue =
            Db.Ado.SqlQuery<decimal>("SELECT SEQ_OUT_ID.NEXTVAL FROM DUAL")
@@ -178,7 +146,7 @@
            WorkNo = from.AsnNo,
            Fmrmode = from.FMRMODE,
            Sapno = from.SqNo,
            Organizeid = "1002503270000079",
            Organizeid = "1002503270000079"
        };
        // 创建采购退料单记录
@@ -188,14 +156,10 @@
        {
            // 检查必要字段是否为空
            if (string.IsNullOrEmpty(itemOutList.SrcDocNo))
            {
                throw new NotImplementedException("采购订单号不能为空");
            }
            if (string.IsNullOrEmpty(itemOutList.SrcDocLineNo))
            {
                throw new NotImplementedException("采购订单行号不能为空");
            }
            //if (string.IsNullOrEmpty(itemOutList.AsnLineNo))
            //{
@@ -203,9 +167,7 @@
            //}
            if (string.IsNullOrEmpty(itemOutList.itemId))
            {
                throw new NotImplementedException("物料ID不能为空");
            }
            var mesRohInData = Db.Queryable<MesRohInData>()
                .Where(s => s.BillNo == itemOutList.SrcDocNo
@@ -213,9 +175,7 @@
                .First();
            if (mesRohInData == null)
            {
                throw new NotImplementedException("采购订单不存在");
            }
            // var deliveryDetail = Db.Queryable<DeliveryDetail>()
            //     .Where(a => a.Zzasn == from.AsnNo
@@ -235,47 +195,39 @@
                            && s.U9Id == itemOutList.itemId).First();
            if (mesLinkU9 == null)
            {
                throw new NotImplementedException("供应商ID不存在或未同步于U9");
            }
            var mesItems = Db.Queryable<MesItems>()
                .Where(s => s.Id == Decimal.Parse(itemIdLinkU9.MesId))
                .Where(s => s.Id == decimal.Parse(itemIdLinkU9.MesId))
                .First();
            if (mesItems == null)
            {
                throw new NotImplementedException("[" + itemOutList.itemId +
                                                  "]物料不存在,请同步给MES");
            }
            var mesInvItemInCItems = Db.Queryable<MesInvItemInCItems>()
                .Where(s => s.ItemInId == mesInvItemIns.Id
                            && s.ItemNo == mesItems.ItemNo
                            && s.Ebeln == itemOutList.SrcDocNo
                            && s.EbelnLineNo ==
                            Decimal.Parse(itemOutList.SrcDocLineNo)
                            decimal.Parse(itemOutList.SrcDocLineNo)
                            && s.SuppNo == mesSupplier.SuppNo
                            // && Convert.ToInt32(s.ZzitemId) == Convert.ToInt32(itemOutList.AsnLineNo)
                            ).First();
                    // && Convert.ToInt32(s.ZzitemId) == Convert.ToInt32(itemOutList.AsnLineNo)
                ).First();
            if (mesInvItemInCItems == null)
            {
                throw new NotImplementedException("没有对应的入库明细");
            }
            // 确保CbillNo不为空
            if (string.IsNullOrEmpty(mesInvItemIns.CbillNo))
            {
                throw new NotImplementedException("入库单关联的采购单号不能为空");
            }
            mesInvItemOutItems.Add(new MesInvItemOutItems
            {
                ItemOutId = nextSequenceValue,
                ItemNo = mesItems.ItemNo,
                Quantity = Decimal.Parse(itemOutList.qty),
                Quantity = decimal.Parse(itemOutList.qty),
                CreateBy = "PL017",
                CreateDate = DateTime.Now,
                Factory = "1000",
@@ -283,9 +235,9 @@
                DepotCode = mesDepots.DepotCode,
                WorkNo = itemOutList.SrcDocNo, // 确保WorkNo有值
                WorkLine =
                    Decimal.Parse(itemOutList.SrcDocLineNo), // 确保WorkLine有值
                EbelnK3id = Decimal.Parse(mesRohInData.ErpId),
                LineK3id = Decimal.Parse(mesRohInData.EbelnK3id),
                    decimal.Parse(itemOutList.SrcDocLineNo), // 确保WorkLine有值
                EbelnK3id = decimal.Parse(mesRohInData.ErpId),
                LineK3id = decimal.Parse(mesRohInData.EbelnK3id),
                FType = 0,
                Status = 0,
                PbillNo = mesInvItemIns.CbillNo, // 确保PbillNo有值
@@ -293,27 +245,21 @@
                RkLine = mesInvItemInCItems.Id, // 确保RkLine有值
                RkQty = mesInvItemInCItems.Quantity,
                TlQty = 0,
                ItemId = Decimal.Parse(itemIdLinkU9.MesId), // 确保ItemId有值
                ItemId = decimal.Parse(itemIdLinkU9.MesId), // 确保ItemId有值
                SqNo = itemOutList.SqNo, // 确保ItemId有值
                ZzitemId = itemOutList.AsnLineNo, // 确保ItemId有值
                ZzitemId = itemOutList.AsnLineNo // 确保ItemId有值
                // Unit = item.Unit,
            });
        }
        var outItemCommand = Db.Insertable(mesInvItemOutItems)
            .PageSize(1).IgnoreColumnsNull().ExecuteCommand();
        if (outItemCommand <= 0)
        {
            throw new Exception("创建采购退料单子表失败");
        }
        if (outItemCommand <= 0) throw new Exception("创建采购退料单子表失败");
        // 插入采购退料单记录
        var insertResult = Db.Insertable(mesInvItemOuts).IgnoreColumns(true)
            .ExecuteCommand();
        if (insertResult <= 0)
        {
            throw new Exception("创建采购退料单失败");
        }
        if (insertResult <= 0) throw new Exception("创建采购退料单失败");
        return outItemCommand + insertResult >= 2;
    }
@@ -327,15 +273,11 @@
                        && s.ItemOutNo == from.RtnNo).ToList();
        if (mesInvItemOuts == null || mesInvItemOuts.Count == 0)
        {
            throw new NotImplementedException("找不到对应的采购退料单: " + from.RtnNo);
        }
        // 检查是否有已审核的单据,如果存在已审核(Status=1)则不允许删除
        if (mesInvItemOuts.Any(item => item.Status == 1))
        {
            throw new NotImplementedException("存在已审核的采购退料单,不允许删除");
        }
        // 删除所有相关单据
        foreach (var itemOut in mesInvItemOuts)
@@ -346,10 +288,8 @@
                .ToList();
            if (mesInvItemOutItems == null || mesInvItemOutItems.Count == 0)
            {
                throw new NotImplementedException(
                    $"找不到采购退料单[{itemOut.ItemOutNo}]对应的明细");
            }
            // 删除采购退料单明细
            var deleteItemsResult = Db.Deleteable<MesInvItemOutItems>()
@@ -357,9 +297,7 @@
                .ExecuteCommand();
            if (deleteItemsResult <= 0)
            {
                throw new Exception($"删除采购退料单[{itemOut.ItemOutNo}]明细失败");
            }
            // 删除采购退料单
            var deleteResult = Db.Deleteable<MesInvItemOuts>()
@@ -367,9 +305,7 @@
                .ExecuteCommand();
            if (deleteResult <= 0)
            {
                throw new Exception($"删除采购退料单[{itemOut.ItemOutNo}]失败");
            }
        }
        return true;