tjx
2025-11-13 2f4699ff377f0e5ea3640bb3670b2fbfbd56e3fb
StandardPda/MES.Service/service/Warehouse/MesInvItemOutsManager.cs
@@ -14,30 +14,26 @@
        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;
            var result = 1;
            foreach (var group in groupedItems)
            {
                if (group.Key.AsnNo == null)
                {
                    throw new NotImplementedException("AsnNo不能为空");
                }
                // if (group.Key.AsnNo == null)
                // {
                //     throw new NotImplementedException("AsnNo不能为空");
                // }
                if (group.Key.MesNo == null)
                {
                    throw new NotImplementedException("入库单单号不能为空");
                }
                if (group.Key.SqNo == null)
                {
                    throw new NotImplementedException("退货申请单行号不能为空");
                }
                // 创建一个临时的itemOutFrom对象,使用分组的Key作为主要属性
                var tempItemOutFrom = new ItemOutFrom
@@ -58,37 +54,29 @@
                switch (tempItemOutFrom.Type)
                {
                    case "1":
                        {
                            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 mesInvItemOuts = Db.Queryable<MesInvItemOuts>()
                            .Where(s => s.BillTypeId == BILL_TYPE_ID
                                        && s.TransactionNo == TRANSACTION_NO
                                        && s.ItemOutNo == tempItemOutFrom.RtnNo
                                        && s.Sapno == tempItemOutFrom.SqNo
                            )
                            .Count();
                            if (mesInvItemOuts > 0)
                            {
                                throw new NotImplementedException(
                                    tempItemOutFrom.RtnNo +
                                    "的退料申请单已经存在");
                            }
                        if (mesInvItemOuts > 0)
                            throw new NotImplementedException(
                                tempItemOutFrom.RtnNo +
                                "的退料申请单已经存在");
                            // 为当前分组保存数据
                            var groupResult = Save(tempItemOutFrom, group.ToList());
                            if (!groupResult)
                            {
                                result = 0;
                            }
                        // 为当前分组保存数据
                        var groupResult = Save(tempItemOutFrom, group.ToList());
                        if (!groupResult) result = 0;
                            break;
                        }
                        break;
                    }
                    case "4":
                        var removeResult = Remove(tempItemOutFrom);
                        if (!removeResult)
                        {
                            result = 0;
                        }
                        if (!removeResult) result = 0;
                        break;
                    default:
@@ -99,8 +87,6 @@
            return result;
        }) > 0;
    }
    private bool Save(ItemOutFrom from, List<ItemOutList> items)
@@ -111,38 +97,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 +155,7 @@
            WorkNo = from.AsnNo,
            Fmrmode = from.FMRMODE,
            Sapno = from.SqNo,
            Organizeid = "1002503270000079",
            Organizeid = "1002503270000079"
        };
        // 创建采购退料单记录
@@ -188,24 +165,18 @@
        {
            // 检查必要字段是否为空
            if (string.IsNullOrEmpty(itemOutList.SrcDocNo))
            {
                throw new NotImplementedException("采购订单号不能为空");
            }
            if (string.IsNullOrEmpty(itemOutList.SrcDocLineNo))
            {
                throw new NotImplementedException("采购订单行号不能为空");
            }
            if (string.IsNullOrEmpty(itemOutList.AsnLineNo))
            {
                throw new NotImplementedException("ASN行号不能为空");
            }
            //if (string.IsNullOrEmpty(itemOutList.AsnLineNo))
            //{
            //    throw new NotImplementedException("ASN行号不能为空");
            //}
            if (string.IsNullOrEmpty(itemOutList.itemId))
            {
                throw new NotImplementedException("物料ID不能为空");
            }
            var mesRohInData = Db.Queryable<MesRohInData>()
                .Where(s => s.BillNo == itemOutList.SrcDocNo
@@ -213,69 +184,59 @@
                .First();
            if (mesRohInData == null)
            {
                throw new NotImplementedException("采购订单不存在");
            }
            var deliveryDetail = Db.Queryable<DeliveryDetail>()
                .Where(a => a.Zzasn == from.AsnNo
                            && Int32.Parse(a.ZzitemId) ==
                            Int32.Parse(itemOutList.AsnLineNo))
                .Count();
            // var deliveryDetail = Db.Queryable<DeliveryDetail>()
            //     .Where(a => a.Zzasn == from.AsnNo
            //                 && Int32.Parse(a.ZzitemId) ==
            //                 Int32.Parse(itemOutList.AsnLineNo))
            //     .Count();
            if (deliveryDetail <= 0)
            {
                throw new NotImplementedException("[" + from.AsnNo + "]的明细行[" +
                                                  itemOutList.AsnLineNo +
                                                  "]不存在");
            }
            // if (deliveryDetail <= 0)
            // {
            //     throw new NotImplementedException("[" + from.AsnNo + "]的明细行[" +
            //                                       itemOutList.AsnLineNo +
            //                                       "]不存在");
            // }
            var itemIdLinkU9 = Db.Queryable<MesLinkU9>()
                .Where(s => s.TableType == "MES_ITEMS"
                            && 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 +244,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 +254,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 +282,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 +297,8 @@
                .ToList();
            if (mesInvItemOutItems == null || mesInvItemOutItems.Count == 0)
            {
                throw new NotImplementedException(
                    $"找不到采购退料单[{itemOut.ItemOutNo}]对应的明细");
            }
            // 删除采购退料单明细
            var deleteItemsResult = Db.Deleteable<MesInvItemOutItems>()
@@ -357,9 +306,7 @@
                .ExecuteCommand();
            if (deleteItemsResult <= 0)
            {
                throw new Exception($"删除采购退料单[{itemOut.ItemOutNo}]明细失败");
            }
            // 删除采购退料单
            var deleteResult = Db.Deleteable<MesInvItemOuts>()
@@ -367,9 +314,7 @@
                .ExecuteCommand();
            if (deleteResult <= 0)
            {
                throw new Exception($"删除采购退料单[{itemOut.ItemOutNo}]失败");
            }
        }
        return true;