using NewPdaSqlServer.DB; using NewPdaSqlServer.Dto.service; using NewPdaSqlServer.entity; using NewPdaSqlServer.util; using Newtonsoft.Json; using SqlSugar; namespace NewPdaSqlServer.service.Warehouse; public class MesInvItemOutsManager : Repository { public List GetPage(WarehouseQuery query) { var parsedGuid = Guid.Empty; if (!string.IsNullOrEmpty(query.id)) { var isValid = Guid.TryParse(query.id, out parsedGuid); if (!isValid) throw new ApplicationException("GUID转换错误"); } return Db.Queryable((a, e, i, u1, u3) => new JoinQueryInfos( JoinType.Left, a.DepotId == e.DepotId, JoinType.Left, a.SuppId == i.Id, JoinType.Left, a.CreateBy == u1.Account, JoinType.Left, a.CheckUser == u3.Account)) .WhereIF(UtilityHelper.CheckGuid(parsedGuid), (a, e, i, u1, u3) => a.Guid == parsedGuid) .WhereIF(!string.IsNullOrEmpty(query.billNo), (a, e, i, u1, u3) => a.ItemOutNo == query.billNo) .Select((a, e, i, u1, u3) => new MesInvItemOuts { Guid = a.Guid, DepotCode = e.DepotCode, Fmrmode = a.Fmrmode, CheckDate = a.CheckDate, CheckUser = a.CheckUser, States = a.States, Reason = a.Reason, Remark = a.Remark, Nflag = a.Nflag, FType = a.FType, SuppNo = i.SuppNo, DepotName = e.DepotName, SuppName = i.SuppName, CreateByFname = u1.Account, CheckUserFname = u3.Account, CreateDate = a.CreateDate, CreateBy = a.CreateBy, Status = a.Status, ItemOutNo = a.ItemOutNo }).ToPageList(query.PageIndex, query.Limit); } public List GetItems(WarehouseQuery query) { var parsedGuid = Guid.Empty; if (string.IsNullOrEmpty(query.id)) return []; var isValid = Guid.TryParse(query.id, out parsedGuid); if (!isValid) throw new ApplicationException("GUID转换错误"); var mesInvItemOutItemsList = Db.Queryable( (c, s) => new object[] { JoinType.Inner, c.ItemId == s.Id }).Where((c, s) => c.ItemOutId == parsedGuid) .Select((c, s) => new MesInvItemOutItems { Guid = c.Guid, TlQty = c.TlQty, WorkLine = c.WorkLine, PbillNo = c.PbillNo, LineK3id = c.LineK3id, DepotCode = c.DepotCode, Status = c.Status, Remark = c.Remark, EbelnK3id = c.EbelnK3id, Quantity = c.Quantity, ItemNo = s.ItemNo, ItemName = s.ItemName, ItemModel = s.ItemModel, ItemId = c.ItemId, RkNo = c.RkNo, WorkNo = c.WorkNo }).ToList(); foreach (var mesInvItemOutItemse in mesInvItemOutItemsList) { var u = Db.Queryable() .GroupBy(it => new { it.ItemId, it.PbillNo, it.WorkLine, it.RkNo }) .Where(it => it.ItemId == mesInvItemOutItemse.ItemId // && it.PbillNo == mesInvItemOutItemse.PbillNo // && it.WorkLine == mesInvItemOutItemse.WorkLine && it.RkNo == mesInvItemOutItemse.RkNo) .Select(it => new { KtQty = SqlFunc.AggregateSum(it.Quantity ?? 0) }).First(); var s1 = Db.Queryable() .GroupBy(it => new { it.ItemId, it.Ebeln, it.WorkLine, it.BillNo }) .Where(it => it.ItemId == mesInvItemOutItemse.ItemId && it.CbillNo == mesInvItemOutItemse.PbillNo // && it.WorkLine == mesInvItemOutItemse.WorkLine // && it.BillNo == mesInvItemOutItemse.RkNo ) .Select(it => new { RkQty = SqlFunc.AggregateSum(it.Quantity ?? 0) }).First(); mesInvItemOutItemse.KtQty = s1.RkQty - u.KtQty; } return mesInvItemOutItemsList; } public OutItemDto SaveCombination(OutItemDto dto) { var mesInvItemOuts = dto.Form; mesInvItemOuts.Status = 0; mesInvItemOuts.BoardFlag = false; mesInvItemOuts.Sapstatus = false; mesInvItemOuts.OutStatus = false; mesInvItemOuts.ItemFlag = false; mesInvItemOuts.IsVisual = true; mesInvItemOuts.TransactionNo = 203; mesInvItemOuts.Factory = "1000"; mesInvItemOuts.Company = "1000"; var newGuid = Guid.NewGuid(); mesInvItemOuts.Guid = newGuid; //返回ID var command = Db.Insertable(mesInvItemOuts) .IgnoreColumns(true).ExecuteCommand(); if (command <= 0) throw new Exception("插入错误"); dto.SaveItems.ForEach(s => { s.ItemOutId = newGuid; s.Factory = "1000"; s.Company = "1000"; s.Status = 0; s.DepotCode = mesInvItemOuts.DepotCode; s.FType = mesInvItemOuts.FType; s.CreateBy = mesInvItemOuts.CreateBy; s.CreateDate = mesInvItemOuts.CreateDate; }); var insertable = Db.Insertable(dto.SaveItems) .IgnoreColumns(true).ExecuteCommand(); if (insertable < 0) throw new Exception("插入错误"); var query = new WarehouseQuery(); query.id = newGuid.ToString(); dto.SelectItems = GetItems(query); return dto; } public List SelectMaterials(WarehouseQuery query) { return Db.Queryable() .Where(s => s.SuppId == query.SuppId) .ToList(); } private void Validate(WarehouseQuery query) { // 校验单号是否正确 var mesInvItemOuts = Db.Queryable() .Where(o => o.ItemOutNo == query.billNo) .Single(); if (mesInvItemOuts == null) throw new Exception("没找到" + query.billNo + " 对应的采购退货单,请检查"); // 校验子表数据 var itemOutItems = Db.Queryable() .Where(o => o.ItemOutId == mesInvItemOuts.Guid) .ToList(); var sql = string.Empty; var P_Msg = string.Empty; foreach (var item in itemOutItems) { // 判断申请数量是否大于剩余可退数量 sql = string.Format( @"SELECT isnull(s1.RK_QTY, 0) - isnull(KT_QTY, 0) KT_QTY FROM MES_INV_ITEM_OUT_ITEMS C LEFT JOIN (SELECT SUM(QUANTITY) KT_QTY, ITEM_NO, PBILL_NO, RK_NO, WORK_LINE FROM MES_INV_ITEM_OUT_ITEMS GROUP BY ITEM_NO, PBILL_NO, WORK_LINE,RK_NO) U ON U.ITEM_NO = C.ITEM_NO AND U.WORK_LINE = C.WORK_LINE AND U.PBILL_NO = C.PBILL_NO AND U.RK_NO = C.RK_NO LEFT JOIN (SELECT SUM(QUANTITY) RK_QTY, ITEM_NO, EBELN, WORK_LINE,BILL_NO FROM MES_INV_ITEM_IN_C_ITEMS GROUP BY ITEM_NO, EBELN, WORK_LINE,BILL_NO) s1 ON S1.ITEM_NO = C.ITEM_NO AND S1.WORK_LINE = C.WORK_LINE AND S1.EBELN = C.PBILL_NO AND S1.BILL_NO = C.RK_NO WHERE C.guid = '{0}'", item.Guid); var sy_Qty = Db.Ado.SqlQuery(sql); if (sy_Qty != null && sy_Qty[0] < 0) { P_Msg = $"采购订单:{item.PbillNo},行:{item.WorkLine},物料:{item.ItemNo} 申请数量大于剩余可收数量"; throw new Exception(P_Msg); } // 判断行是否重复 var cf_Num = Db.Queryable() .Where(s1 => s1.ItemNo == item.ItemNo && s1.WorkLine == item.WorkLine && s1.PbillNo == item.PbillNo && s1.ItemOutId == mesInvItemOuts.Guid && s1.RkNo == item.RkNo) .Count(); if (cf_Num <= 1) continue; P_Msg = $"采购订单:{item.PbillNo},行:{item.WorkLine},物料:{item.ItemNo}重复请删除其中一条数据"; throw new Exception(P_Msg); } // 校验主表内容是否被删掉 // 主表仓库编码 if (string.IsNullOrEmpty(mesInvItemOuts.DepotCode)) { P_Msg = "仓库编码为空,请检查"; throw new Exception(P_Msg); } var supplierExists = Db.Queryable() .Any(supplier => supplier.SuppNo == mesInvItemOuts.SuppNo); if (!supplierExists) { P_Msg = $"供应商编码 {mesInvItemOuts.SuppNo} 在系统中不存在,请检查"; throw new Exception(P_Msg); } // 子表行与主表符合性校验 foreach (var j in itemOutItems) { // 校验子表对应采购订单的供应商编码 var c_SuppNo = Db.Queryable( (roh, supp) => new JoinQueryInfos( JoinType.Left, roh.Supplier == supp.Id.ToString() )) .Where(roh => roh.BillNo == j.WorkNo) .Select((roh, supp) => supp.SuppNo) .Single(); if (c_SuppNo == null) { P_Msg = $"子表行供应商编码 {c_SuppNo} 在系统中未找到"; throw new Exception(P_Msg); } if (mesInvItemOuts.SuppNo != c_SuppNo) { P_Msg = $"子表采购订单行的供应商编码 {c_SuppNo} 与主表供应商编码 {mesInvItemOuts.SuppNo} 不一致,请检查"; throw new Exception(P_Msg); } // 校验子表委外采购类型和主表类型是否一致 if (j.FType != mesInvItemOuts.FType) { P_Msg = $"子表委外类型:{j.FType},与主表委外类型:{mesInvItemOuts.FType},不一致,请检查"; throw new Exception(P_Msg); } // 检查子表仓库是否和主表仓库一致 if (j.DepotCode == mesInvItemOuts.DepotCode) continue; P_Msg = $"子表仓库编码:{j.DepotCode} 与主表仓库编码:{mesInvItemOuts.DepotCode},不一致,请检查"; throw new Exception(P_Msg); } } public bool DeApproveBefore(WarehouseQuery query) { var mesInvItemOuts = base.GetById(query.id); if (mesInvItemOuts == null) throw new Exception("出库单不存在"); var nflag = mesInvItemOuts.Nflag ?? 0; return nflag != 0; } public bool Audit(WarehouseQuery query) { // 审核前校验 Validate(query); query.status = 1; //审核 return Update(query); } private bool Update(WarehouseQuery entity) { var parsedGuid = Guid.Empty; if (!string.IsNullOrEmpty(entity.id)) { var isValid = Guid.TryParse(entity.id, out parsedGuid); if (!isValid) throw new ApplicationException("GUID转换错误"); } if (!UtilityHelper.CheckGuid(parsedGuid)) throw new ApplicationException("更新错误,数据是不合法的"); var userName = entity.userName ?? "system"; return Db.Updateable() .SetColumns(s => s.Status == entity.status) .SetColumns(s => s.CheckUser == userName) .SetColumns(s => s.CheckDate == DateTime.Now) .Where(s => s.Guid == parsedGuid).ExecuteCommand() > 0; } public string GetMaxItemOutNo() { var date = DateTime.Now.ToString("yyyyMMdd"); var par = "NTL" + date; var sql = $"select max(ITEM_OUT_NO) from MES_INV_ITEM_OUTS where ITEM_OUT_NO like '{par}%'"; var maxBillNo = Db.Ado.SqlQuerySingle(sql); var number = "0001"; if (maxBillNo != null) { maxBillNo = maxBillNo.Substring(11); var no = Convert.ToInt32(maxBillNo); no++; number = no.ToString().PadLeft(4, '0'); } return "NTL" + date + number; } public MessageCenter SaveMessageCenter(WarehouseQuery query) { var message = MesToErpParam(query); var newGuid = Guid.NewGuid(); message.Guid = newGuid; message.Pid = newGuid; var executeReturnIdentity = Db.Insertable(message).IgnoreColumns(true).ExecuteCommand(); if (executeReturnIdentity > 0) return message; throw new Exception("获取数据失败"); } public List GetItemOutNo() { var data5 = Db.Queryable().Where(it => it.BillTypeId == 200 && it.TransactionNo == 203 && it.Status == 1) .ToPageList(1, 20); var ItemOutNos = data5.FindAll(a => a.Nflag == null || a.Nflag == 0) .ToList(); return ItemOutNos; } public OutItemDto GetSumItem(WarehouseQuery query) { var mesInvItemOuts = base.GetSingle(it => it.ItemOutNo == query.billNo); if (mesInvItemOuts == null) throw new Exception("采购退货单不存在"); var dto = new OutItemDto(); //dto.SumItem = GetItems(query); var mesInvItemStocks = Db.Queryable() .Where(a => a.ItemBarcode == query.barcode).Single(); if (mesInvItemStocks == null) return dto; var mesItems = Db.Queryable() .Where(s => s.Id == mesInvItemStocks.ItemId).Single(); dto.ItemNo = mesItems.ItemNo; dto.Quantity = mesInvItemStocks.Quantity; return dto; } public List GetScanBarcode(WarehouseQuery query) { //string转guid var parsedGuid = Guid.Empty; if (string.IsNullOrEmpty(query.id)) return []; var isValid = Guid.TryParse(query.id, out parsedGuid); if (!isValid) throw new ApplicationException("GUID转换错误"); var mesInvItemOutCDetailsList = Db .Queryable( (b, bar, c, d) => new JoinQueryInfos( JoinType.Left, b.ItemBarcode == bar.ItemBarcode, JoinType.Left, b.ItemId == c.Id, JoinType.Left, b.DepotId == d.DepotId )) .Where((b, bar, c, d) => b.ItemOutId == parsedGuid) .Select((b, bar, c, d) => new MesInvItemOutCDetails { Guid = b.Guid, Quantity = b.Quantity, DepotSectionCode = b.DepotSectionCode, DepotCode = b.DepotCode, ItemNo = b.ItemNo, ItemBarcode = b.ItemBarcode, ItemName = c.ItemName, ItemModel = c.ItemModel, DepotName = d.DepotName, Unit = bar.Unit }).ToList(); return mesInvItemOutCDetailsList; } public MessageCenter MesToErpParam(WarehouseQuery query) { var erpParameters = ""; var title = ""; var tableName = "MES_INV_ITEM_OUTS_" + query.Type; if ("A".Equals(query.Type)) { erpParameters = GetErpParameters(query.id); title = "采购退货单" + query.billNo + "审核"; } else if ("B".Equals(query.Type)) { erpParameters = GetDeApprovePam(query.id); title = "采购退货单" + query.billNo + "反审核"; } var ErpUrl = AppsettingsUtility.Settings.ProductionErpUrl; var message = new MessageCenter { TableName = tableName, Url = ErpUrl, Status = 1, CreateBy = query.userName, Route = query.billNo, Title = title, PageName = "Warehouse/PurchaseReturn/Add?id=" + query.id + "&itemOutNo=" + query.billNo, CreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Method = "POST", Seq = 1, Data = erpParameters, IsMessage = 0, ContentType = "application/x-www-form-urlencoded" }; return message; } private string GetErpParameters(string? id) { var guid = Guid.Empty; if (string.IsNullOrEmpty(id)) return ""; var isValid = Guid.TryParse(id, out guid); if (!isValid) throw new ApplicationException("GUID转换错误"); var materials = Db .Queryable( (a, b, c, d, e, f) => new JoinQueryInfos( JoinType.Left, a.Guid == b.ItemOutId, JoinType.Left, b.ItemId == c.Id, JoinType.Left, d.Id.ToString() == c.ItemUnit, JoinType.Left, e.CbillNo == b.WorkNo && e.ItemId == b.ItemId, JoinType.Left, f.DepotId == a.DepotId )).Where((a, b, c, d, e, f) => b.Guid == guid) .Select((a, b, c, d, e, f) => new Material { FMaterialId = c.ItemNo, FRMREALQTY = b.Quantity.ToString(), FStockId = f.DepotCode, FUnitID = d.Fnumber, FLot = b.WorkNo, F_MES_ENTRYID = b.Guid, FsrcEntryId = e.Guid.ToString() }).ToList(); var mm = Db.Queryable() .Where(a => a.Guid == guid).First(); var jsonEntries = materials.Select(d => new { d.FMaterialId, d.FRMREALQTY, d.FStockId, d.FUnitID, d.FLot, F_MES_ENTRYID = d.F_MES_ENTRYID.ToString(), d.FsrcEntryId }).ToList(); var fdate = DateTime.Now.ToString("yyyy-MM-dd"); var jsonString = JsonConvert.SerializeObject(jsonEntries); var encodedUrl = "taskname=CGTL&mesid=" + guid + "&optype=create&datajson={\"F_MES_ID\":\"" + guid + "\",\"FDate\":\"" + fdate + "\",\"FSRCBillTypeId\":\"" + "采购入库单" + "\",\"FDESCRIPTION\":\"" + mm.Remark + "\",\"FMRMODE\":\"" + mm.Fmrmode + "\",\"cgtlentry\":" + jsonString + "}"; return encodedUrl; } private string GetDeApprovePam(string? id) { var encodedUrl = "taskname=CGTL&mesid=" + id + "&optype=delete&datajson={}"; return encodedUrl; } public bool ScanCode(WarehouseQuery query) { decimal billTypeId = 200; decimal transactionNo = 203; var count = Db.Queryable() .Where(a => a.ItemBarcode == query.barcode && a.TaskNo == query.billNo) .Count(); if (count > 0) throw new Exception("条码重复扫描,请核对!"); //验证条码 var mesInvItemStocks = Db.Queryable() .Where(a => a.ItemBarcode == query.barcode && a.Quantity > 0).Single(); if (mesInvItemStocks == null) throw new Exception(query.barcode + "库存中无此条码,请核对!"); //验证出库单mes_inv_item_outs var mesInvItemOuts = Db.Queryable() .Where(d => d.ItemOutNo == query.billNo && d.BillTypeId == billTypeId && d.TransactionNo == transactionNo).Single(); //出库单的校验 if (mesInvItemOuts == null) throw new Exception("出库单 " + query.billNo + " 不存在,请确认!"); //未审核的不允许继续 if (mesInvItemOuts.Status == null || mesInvItemOuts.Status == 0) throw new Exception("出库单 " + query.billNo + "未审核"); //已推送的不允许继续 if (mesInvItemOuts.Nflag == 1) throw new Exception("出库单 " + query.billNo + "已经推送,无法重复推送"); var depotCodeOut = mesInvItemOuts.DepotCode ?? "0"; var depotsCodeStock = mesInvItemStocks.DepotsCode ?? "0"; if (!depotCodeOut.Equals(depotsCodeStock)) { // 创建错误消息 var errorMessage = $"002[条码仓库{depotsCodeStock}与申请仓库{depotCodeOut}不一致,请核对!"; throw new Exception(errorMessage); } var StocksNum = mesInvItemStocks.Quantity; var sql = string.Format( @"select isnull(SUM(S.QUANTITY),0) - isnull(SUM(S.TL_QTY),0) from MES_INV_ITEM_OUT_ITEMS S LEFT JOIN mes_inv_item_outs d ON S.ITEM_OUT_ID = D.GUID where d.item_out_no = '{0}' and d.bill_type_id = {1} and d.transaction_no = {2} AND S.item_ID = '{3}' and isnull(d.status, 0) = 1 and isnull(d.nflag, 0) = 0", query.billNo, billTypeId, transactionNo, mesInvItemStocks.ItemId); var cqty = Db.Ado.SqlQuerySingle(sql); if (cqty == null) throw new Exception("物料" + mesInvItemStocks.ItemNo + "的辅助属性与条码不一致!请检查"); if (cqty < StocksNum) throw new Exception("请确认发料数量"); //调用存储过程 var prcRfPdaBarcodeCgth = PrcRfPdaBarcodeCgth(query); if (!prcRfPdaBarcodeCgth) throw new Exception("执行失败"); // 变量用于保存查询结果 decimal? C_SQ_QTY = 0; decimal? C_OK_QTY = 0; var C_COUNT = 0; sql = string.Format(@" SELECT SUM(C.QUANTITY) AS SQ_QTY, SUM(D.QUANTITY_OK) AS OK_QTY FROM MES_INV_ITEM_OUT_ITEMS C LEFT JOIN (SELECT ITEM_OUT_ID, ITEM_ID, PBILL_NO, RK_NO, SUM(QUANTITY) AS QUANTITY_OK FROM MES_INV_ITEM_OUT_C_DETAILS GROUP BY ITEM_OUT_ID, ITEM_ID, PBILL_NO, RK_NO) D ON D.ITEM_OUT_ID = C.ITEM_OUT_ID AND D.ITEM_ID = C.ITEM_ID AND isnull(C.PBILL_NO, '0') = isnull(D.PBILL_NO, '0') WHERE C.ITEM_OUT_ID = '{0}'", mesInvItemOuts.Guid); var queryResult = Db.Ado.SqlQuerySingle(sql); C_SQ_QTY = queryResult?.SQ_QTY ?? 0; C_OK_QTY = queryResult?.OK_QTY ?? 0; // 判断逻辑 if (C_SQ_QTY < C_OK_QTY) throw new Exception("扫描数量超过申请数量,请重新扫描!"); return C_SQ_QTY == C_OK_QTY; } private bool PrcRfPdaBarcodeCgth(WarehouseQuery query) { var c_user = query.userName; var p_bill_no = query.billNo; var p_item_barcode = query.barcode; var p_bill_type_id = 200; var p_transaction_no = 203; int c_num; decimal C_STOCKNUM, C_SQTY, C_OKQTY, C_CQTY; var commit = UseTransaction(db => { if (string.IsNullOrEmpty(p_bill_no)) throw new Exception("请选取单据号!"); // Retrieve mes_inv_item_outs var c_mes_inv_item_outs = db.Queryable() .Where(d => d.ItemOutNo == p_bill_no) .First(); if (c_mes_inv_item_outs == null) throw new Exception("请选择或扫描正确的采购退货单!"); if (c_mes_inv_item_outs.Status == 0) throw new Exception("采购退货申请单未审核!"); if (c_mes_inv_item_outs.Nflag == 1) throw new Exception("采购退货单已完结推送ERP,不能操作!"); // Check for duplicate barcode scan c_num = db.Queryable() .Where(b => b.ItemBarcode == p_item_barcode && b.ItemOutId == c_mes_inv_item_outs.Guid) .Count(); if (c_num > 0) throw new Exception("此条码已采购退货扫码完成!"); // Query item stock info var c_mes_inv_item_stocks = db.Queryable() .Where(t => t.ItemBarcode == p_item_barcode && t.Quantity > 0) .First(); if (c_mes_inv_item_stocks == null) throw new Exception($"库存中无此条码,请核对!{p_item_barcode}"); // Validate depot codes if (c_mes_inv_item_outs.DepotCode != c_mes_inv_item_stocks.DepotsCode) throw new Exception( $"此条码属于仓库 {c_mes_inv_item_stocks.DepotsCode} 与采购退货申请仓库 {c_mes_inv_item_outs.DepotCode} 不一致,请核对!"); C_STOCKNUM = c_mes_inv_item_stocks.Quantity.Value; // Calculate the total and completed quantities for the item var quantities = db.Queryable( (s, d) => new object[] { JoinType.Left, s.ItemOutId == d.Guid }) .Where((s, d) => d.ItemOutNo == p_bill_no && s.ItemId == c_mes_inv_item_stocks.ItemId && d.Status == 1 && (d.Nflag == 0 || d.Nflag == null)) .Select((s, d) => new { TotalQuantity = SqlFunc.AggregateSum(s.Quantity), CompletedQuantity = SqlFunc.AggregateSum(s.TlQty) }) .First(); if (quantities == null) throw new Exception("采购退料单 '" + p_bill_no + "'未审核"); C_SQTY = quantities.TotalQuantity ?? 0; C_OKQTY = quantities.CompletedQuantity ?? 0; C_CQTY = C_SQTY - C_OKQTY; if (C_CQTY < C_STOCKNUM) return 1; // Handle barcode reduction var p_number2 = C_STOCKNUM; var itemOutItems = db.Queryable() .Where(s => s.ItemOutId == c_mes_inv_item_outs.Guid && s.ItemId == c_mes_inv_item_stocks.ItemId) .ToList(); itemOutItems = itemOutItems .Where(s => s.Quantity - (s.TlQty ?? 0) > 0).ToList(); foreach (var CMI in itemOutItems) { if (p_number2 == 0) break; var c_mes_inv_item_arn_detail = db .Queryable() .Where(t => t.CbillNo == CMI.PbillNo && t.Ebeln == CMI.WorkNo && //t.WorkLine == CMI.WorkLine && t.ItemId == CMI.ItemId) .First(); if (c_mes_inv_item_arn_detail == null) throw new Exception("未找到采购退料来源单据"); if (CMI.Quantity - CMI.TlQty <= p_number2) { db.Updateable() .SetColumns(it => new MesInvItemOutItems { TlQty = (int)it.Quantity, Status = 1 }) .Where(it => it.Guid == CMI.Guid) .ExecuteCommand(); p_number2 -= CMI.Quantity ?? 0 - CMI.TlQty ?? 0; db.Insertable(new MesInvItemOutCDetails { ItemOutId = c_mes_inv_item_outs.Guid, ItemBarcode = p_item_barcode, ItemNo = c_mes_inv_item_stocks.ItemNo, LotNo = c_mes_inv_item_stocks.LotNo, Quantity = CMI.Quantity - CMI.TlQty, ForceOutFlag = 0, CreateBy = c_user, CreateDate = DateTime.Now, LastupdateBy = c_user, LastupdateDate = DateTime.Now, DepotCode = c_mes_inv_item_stocks.DepotsCode, DepotSectionCode = c_mes_inv_item_stocks.DepotSectionsCode, WorkNo = CMI.WorkNo, WorkLine = CMI.WorkLine, SuppNo = c_mes_inv_item_outs.SuppNo, PbillNo = CMI.PbillNo, ItemId = c_mes_inv_item_stocks.ItemId, EbelnK3id = c_mes_inv_item_stocks.EbelnK3id, LineK3id = c_mes_inv_item_stocks.LineK3id, DepotId = c_mes_inv_item_outs.DepotId }).IgnoreColumns(true).ExecuteCommand(); db.Insertable(new MesInvBusiness2 { Status = 1, BillTypeId = p_bill_type_id, TransactionCode = p_transaction_no.ToString(), BusinessType = 1, ItemBarcode = p_item_barcode, ItemNo = c_mes_inv_item_stocks.ItemNo, LotNo = c_mes_inv_item_stocks.LotNo, EpFlag = true, Quantity = CMI.Quantity - CMI.TlQty, FromInvDepotsCode = c_mes_inv_item_stocks.DepotsCode, FromInvDepotSectionsCode = c_mes_inv_item_stocks.DepotSectionsCode, ToInvDepotsCode = null, ToInvDepotSectionsCode = null, Description = "采购退货", CreateBy = c_user, CreateDate = DateTime.Now, LastupdateBy = c_user, LastupdateDate = DateTime.Now, TaskNo = CMI.WorkNo, ItemId = c_mes_inv_item_stocks.ItemId, EbelnK3id = c_mes_inv_item_stocks.EbelnK3id, LineK3id = c_mes_inv_item_stocks.LineK3id }).IgnoreColumns(true).ExecuteCommand(); if (p_number2 == 0) db.Deleteable() .Where(s => s.Guid == c_mes_inv_item_outs.Guid) .ExecuteCommand(); } else { var mesInvItemOutItems = db.Queryable() .Where(s => s.Guid == CMI.Guid).First(); db.Updateable() .SetColumns(i => i.TlQty == p_number2 + (mesInvItemOutItems.TlQty ?? 0)) .Where(i => i.Guid == CMI.Guid) .ExecuteCommand(); db.Insertable(new MesInvItemOutCDetails { ItemOutId = c_mes_inv_item_outs.Guid, ItemBarcode = p_item_barcode, ItemNo = c_mes_inv_item_stocks.ItemNo, LotNo = c_mes_inv_item_stocks.LotNo, Quantity = p_number2, ForceOutFlag = 0, CreateBy = c_user, CreateDate = DateTime.Now, LastupdateBy = c_user, LastupdateDate = DateTime.Now, DepotCode = c_mes_inv_item_stocks.DepotsCode, DepotSectionCode = c_mes_inv_item_stocks.DepotSectionsCode, WorkNo = CMI.WorkNo, WorkLine = CMI.WorkLine, SuppNo = c_mes_inv_item_outs.SuppNo, ItemId = c_mes_inv_item_stocks.ItemId, EbelnK3id = c_mes_inv_item_stocks.EbelnK3id, LineK3id = c_mes_inv_item_stocks.LineK3id, DepotId = c_mes_inv_item_outs.DepotId }).IgnoreColumns(true).ExecuteCommand(); db.Insertable(new MesInvBusiness2 { Status = 1, BillTypeId = p_bill_type_id, TransactionCode = p_transaction_no.ToString(), BusinessType = 1, ItemBarcode = p_item_barcode, ItemNo = c_mes_inv_item_stocks.ItemNo, LotNo = c_mes_inv_item_stocks.LotNo, EpFlag = true, Quantity = p_number2, FromInvDepotsCode = c_mes_inv_item_stocks.DepotsCode, FromInvDepotSectionsCode = c_mes_inv_item_stocks.DepotSectionsCode, Description = "采购退货", CreateBy = c_user, CreateDate = DateTime.Now, LastupdateBy = c_user, LastupdateDate = DateTime.Now, TaskNo = CMI.PbillNo, BillNo = p_bill_no, WorkNo = CMI.WorkNo, WorkLine = CMI.WorkLine, SuppNo = c_mes_inv_item_outs.SuppNo, SuppId = c_mes_inv_item_outs.SuppId.ToString(), ItemId = c_mes_inv_item_stocks.ItemId, EbelnK3id = c_mes_inv_item_stocks.EbelnK3id, LineK3id = c_mes_inv_item_stocks.LineK3id }).IgnoreColumns(true).ExecuteCommand(); p_number2 = 0; } } if (p_number2 > 0) throw new Exception("物料数量将超采购退料申请单数量,无法出库"); return 1; }); return commit > 0; } }