using MES.Service.DB; using MES.Service.Dto.service; using MES.Service.Modes; namespace MES.Service.service.Warehouse; public class MesInvItemOutsManager : Repository { private readonly int BILL_TYPE_ID = 200; private readonly int TRANSACTION_NO = 203; public bool ReturnRequest(ItemOut oItemOut) { var itemOutFrom = oItemOut.from; var itemOutLists = oItemOut.items; // 根据AsnNo和MesNo对明细进行分组 var groupedItems = itemOutLists .GroupBy(item => new { item.MesNo, item.SqNo }) .ToList(); bool result = true; foreach (var group in groupedItems) { //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 { 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 }; // 根据Type执行不同的逻辑 switch (tempItemOutFrom.Type) { case "1": { var mesInvItemOuts = Db.Queryable() .Where(s => s.BillTypeId == BILL_TYPE_ID && s.TransactionNo == TRANSACTION_NO && s.ItemOutNo == tempItemOutFrom.RtnNo ) .Count(); if (mesInvItemOuts > 0) { throw new NotImplementedException( tempItemOutFrom.RtnNo + "的退料申请单已经存在"); } // 为当前分组保存数据 var groupResult = Save(tempItemOutFrom, group.ToList()); if (!groupResult) { result = false; } break; } case "4": var removeResult = Remove(tempItemOutFrom); if (!removeResult) { result = false; } break; default: result = false; break; } } return result; } private bool Save(ItemOutFrom from, List items) { var mesInvItemIns = Db.Queryable() .Where(s => s.BillTypeId == 100 && s.TransctionNo == "101" && s.BillNo == from.MesNo ).First(); if (mesInvItemIns == null) { throw new NotImplementedException("采购入库不存在"); } var mesDepots = Db.Queryable() .Where(s => s.DepotId == Decimal.Parse(from.DepotId)).First(); var mesLinkU9 = Db.Queryable() .Where(s => s.TableType == "MES_SUPPLIER" && s.U9Id == from.SupperId).First(); if (mesLinkU9 == null) { throw new NotImplementedException("供应商ID不存在或未同步于U9"); } var mesSupplier = Db.Queryable() .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("SELECT SEQ_OUT_ID.NEXTVAL FROM DUAL") .First(); // var billCode = // Db.Ado.SqlQuery( // "SELECT GETBILLCODE1('1000', '1000', 'TLSQ') FROM DUAL") // .First(); var billCode = from.RtnNo; // 创建采购退料单记录 var mesInvItemOuts = new MesInvItemOuts { Id = nextSequenceValue, ItemOutNo = billCode, Status = 0, CreateBy = "PL017", CreateDate = DateTime.Now, BillTypeId = 200, TransactionNo = 203, DepotCode = mesDepots.DepotCode, FType = 0, OutStatus = 0, IsVisual = 1, Factory = "1000", Company = "1000", SuppNo = mesSupplier.SuppNo, ItemFlag = 0, BoardFlag = 0, OutType = "采购退料", Nflag = 0, Fmrmode = from.FMRMODE, Sapno = from.SqNo, Organizeid = "1002503270000079", }; // 创建采购退料单记录 var mesInvItemOutItems = new List(); foreach (var itemOutList in items) { // 检查必要字段是否为空 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.itemId)) { throw new NotImplementedException("物料ID不能为空"); } var mesRohInData = Db.Queryable() .Where(s => s.BillNo == itemOutList.SrcDocNo && s.OrderLineId == itemOutList.SrcDocLineNo) .First(); if (mesRohInData == null) { throw new NotImplementedException("采购订单不存在"); } //var deliveryDetail = Db.Queryable() // .Where(a => Int32.Parse(a.ZzitemId) == // Int32.Parse(itemOutList.AsnLineNo)) // .Count(); //if (deliveryDetail <= 0) //{ // throw new NotImplementedException("[" + from.AsnNo + "]的明细行[" + // itemOutList.AsnLineNo + // "]不存在"); //} var itemIdLinkU9 = Db.Queryable() .Where(s => s.TableType == "MES_ITEMS" && s.U9Id == itemOutList.itemId).First(); if (mesLinkU9 == null) { throw new NotImplementedException("供应商ID不存在或未同步于U9"); } var mesItems = Db.Queryable() .Where(s => s.Id == Decimal.Parse(itemIdLinkU9.MesId)) .First(); if (mesItems == null) { throw new NotImplementedException("[" + itemOutList.itemId + "]物料不存在,请同步给MES"); } var mesInvItemInCItems = Db.Queryable() .Where(s => s.ItemInId == mesInvItemIns.Id && s.ItemNo == mesItems.ItemNo && s.Ebeln == itemOutList.SrcDocNo && s.EbelnLineNo == Decimal.Parse(itemOutList.SrcDocLineNo) && s.SuppNo == mesSupplier.SuppNo ).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), CreateBy = "PL017", CreateDate = DateTime.Now, Factory = "1000", Company = "1000", DepotCode = mesDepots.DepotCode, WorkNo = itemOutList.SrcDocNo, // 确保WorkNo有值 WorkLine = Decimal.Parse(itemOutList.SrcDocLineNo), // 确保WorkLine有值 EbelnK3id = Decimal.Parse(mesRohInData.ErpId), LineK3id = Decimal.Parse(mesRohInData.EbelnK3id), FType = 0, Status = 0, PbillNo = mesInvItemIns.CbillNo, // 确保PbillNo有值 RkNo = from.MesNo, // 确保RkNo有值 RkLine = mesInvItemInCItems.Id, // 确保RkLine有值 RkQty = mesInvItemInCItems.Quantity, TlQty = 0, ItemId = Decimal.Parse(itemIdLinkU9.MesId), // 确保ItemId有值 //SqNo = itemOutList.SqNo, // 确保ItemId有值 //ZzitemId = itemOutList.AsnLineNo, // 确保ItemId有值 // Unit = item.Unit, }); } var outItemCommand = Db.Insertable(mesInvItemOutItems) .PageSize(1).IgnoreColumnsNull().ExecuteCommand(); if (outItemCommand <= 0) { throw new Exception("创建采购退料单子表失败"); } // 插入采购退料单记录 var insertResult = Db.Insertable(mesInvItemOuts).IgnoreColumns(true) .ExecuteCommand(); if (insertResult <= 0) { throw new Exception("创建采购退料单失败"); } return outItemCommand + insertResult >= 2; } private bool Remove(ItemOutFrom from) { // 查找要删除的采购退料单 var mesInvItemOuts = Db.Queryable() .Where(s => s.BillTypeId == BILL_TYPE_ID && s.TransactionNo == TRANSACTION_NO && 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) { // 查找要删除的采购退料单明细 var mesInvItemOutItems = Db.Queryable() .Where(s => s.ItemOutId == itemOut.Id) .ToList(); if (mesInvItemOutItems == null || mesInvItemOutItems.Count == 0) { throw new NotImplementedException( $"找不到采购退料单[{itemOut.ItemOutNo}]对应的明细"); } // 删除采购退料单明细 var deleteItemsResult = Db.Deleteable() .Where(s => s.ItemOutId == itemOut.Id) .ExecuteCommand(); if (deleteItemsResult <= 0) { throw new Exception($"删除采购退料单[{itemOut.ItemOutNo}]明细失败"); } // 删除采购退料单 var deleteResult = Db.Deleteable() .Where(s => s.Id == itemOut.Id) .ExecuteCommand(); if (deleteResult <= 0) { throw new Exception($"删除采购退料单[{itemOut.ItemOutNo}]失败"); } } return true; } }