using System.Data; using MES.Service.DB; using MES.Service.Dto.service; using MES.Service.Modes; using MES.Service.util; using Newtonsoft.Json; using SqlSugar; using DbType = System.Data.DbType; namespace MES.Service.service.Warehouse; public class MesInvItemOutsManager : Repository { //当前类已经继承了 Repository 增、删、查、改的方法 //这里面写的代码不会给覆盖,如果要重新生成请删除 MesInvItemOutsManager.cs public List GetProductionPickPage(WarehouseQuery query) { return Db.Queryable((a, o) => new JoinQueryInfos( JoinType.Left, o.DepotCode == a.DepotCode && a.Company == o.Company && a.Factory == o.Factory )) .Where((a, o) => a.BillTypeId == 200 && a.TransactionNo == 201 && a.Factory == "1000" && a.Company == "1000" && a.IsVisual == 1) .WhereIF(query.status != null, (a, o) => a.Status == query.status) .WhereIF(query.id != null, (a, o) => a.Id == query.id) .Select((a, o) => new MesInvItemOuts { Id = a.Id, Sapstatus = a.Sapstatus, OutDate = a.OutDate, CheckDate = a.CheckDate, BoardItem = a.BoardItem, WorkNo = a.WorkNo, OutPart = a.OutPart, PbillNo = a.PbillNo, OutType = a.OutType, CreateBy = a.CreateBy, Status = a.Status, CheckUser = a.CheckUser, ItemOutNo = a.ItemOutNo, DepotName = o.DepotName // 需要动态添加的字段 }) .ToPageList(query.PageIndex, query.Limit); } public MaterialReceipt GetProductionPick(WarehouseQuery query) { var form = new MaterialReceipt(); if (query.id != null) { var mesInvItemOutsList = GetProductionPickPage(query); if (mesInvItemOutsList.Count <= 0) return form; form.ItemOuts = mesInvItemOutsList[0]; form.ItemsList = getProductionItemsList(query); form.InvItemoutCDetails = GetProductionDetails(query); } return form; } private List getProductionItemsList( WarehouseQuery query) { return Db.Queryable( (c, s, f) => new JoinQueryInfos( JoinType.Inner, c.ItemNo == s.ItemNo, JoinType.Left, f.TaskNo == c.TaskNo && f.ItemNo == c.ItemNo )) .Where((c, s, f) => c.ItemOutId == query.id) .OrderBy(c => c.Id) .Select((c, s, f) => new MesInvItemOutItems { Id = c.Id, ItemNo = c.ItemNo, Quantity = c.Quantity, TaskNo = c.TaskNo, Remark = c.Remark, ItemName = s.ItemName, // 动态字段 ItemModel = s.ItemModel, // 动态字段 ItemUnit = SqlFunc.Subqueryable() .Where(si => si.ItemUnit == s.ItemUnit) .Select(si => SqlFunc.MappingColumn( "F_GETUNITNAME(si.Item_Unit)")) // 动态字段 }) .ToList(); } private List GetProductionDetails( WarehouseQuery query) { return Db .Queryable( (b, c, d) => new JoinQueryInfos( JoinType.Left, b.ItemNo == c.ItemNo && b.Company == c.Company && b.Factory == c.Factory, JoinType.Left, d.DepotCode == b.DepotCode && b.Company == d.Company && b.Factory == d.Factory )) .Where((b, c, d) => b.ItemOutId == query.id) .Select((b, c, d) => new MesInvItemOutCDetails { ForceOutFlag = b.ForceOutFlag, DepotSectionCode = b.DepotSectionCode, ItemNo = b.ItemNo, Quantity = b.Quantity, ItemBarcode = b.ItemBarcode, ItemName = c.ItemName, ItemModel = c.ItemModel, DepotName = d.DepotName, DepotCode = b.DepotCode }) .ToList(); } 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 nvl(SUM(S.QUANTITY),0) - nvl(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.ID where d.item_out_no = '{0}' and d.bill_type_id = {1} and d.transaction_no = {2} AND S.item_no = '{3}' and nvl(d.status, 0) = 1 and nvl(d.nflag, 0) = 0", query.billNo, billTypeId, transactionNo, mesInvItemStocks.ItemNo); var cqty = Db.Ado.SqlQuerySingle(sql); if (cqty == null) throw new Exception("物料" + mesInvItemStocks.ItemNo + "的辅助属性与条码不一致!请检查"); if (cqty < StocksNum) throw new Exception("请确认发料数量"); //调用存储过程 try { // 定义输出参数 var outputResult = new SugarParameter("C_RESULT", null, DbType.Int32, ParameterDirection.Output, 4000); var outputMessage = new SugarParameter("MSG", null, DbType.String, ParameterDirection.Output, 4000); // 定义输入参数 var parameters = new List { new("p_item_barcode", query.barcode, DbType.String, ParameterDirection.Input), new("p_bill_no", query.billNo, DbType.String, ParameterDirection.Input), new("pi_factory", "1000", DbType.String, ParameterDirection.Input), new("pi_company", "1000", DbType.String, ParameterDirection.Input), new("c_user", query.userName, DbType.String, ParameterDirection.Input), outputResult, outputMessage }; // 使用 SqlSugar 执行存储过程 Db.Ado.ExecuteCommand( "BEGIN MES_CG_UPDATE_BARCODES(:p_item_barcode, :p_bill_no, :pi_factory, :pi_company, :c_user, :C_RESULT, :MSG); END;", parameters.ToArray()); // 获取输出参数的值 var resultValue = outputResult.Value?.ToString(); var messageValue = outputMessage.Value?.ToString(); if ("1".Equals(resultValue)) throw new Exception("条码扣除失败"); } catch (Exception ex) { throw new Exception(ex.Message); } // 变量用于保存查询结果 decimal? C_SQ_QTY = 0; decimal? C_OK_QTY = 0; var c_result = string.Empty; 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_NO, PBILL_NO, RK_NO, SUM(QUANTITY) AS QUANTITY_OK FROM MES_INV_ITEM_OUT_C_DETAILS GROUP BY ITEM_OUT_ID, ITEM_NO, PBILL_NO, RK_NO ) D ON D.ITEM_OUT_ID = C.ITEM_OUT_ID AND D.ITEM_NO = C.ITEM_NO AND D.RK_NO = C.RK_NO AND NVL(C.PBILL_NO, '0') = NVL(D.PBILL_NO, '0') WHERE C.ITEM_OUT_ID = {0}", mesInvItemOuts.Id); var queryResult = Db.Ado.SqlQuerySingle(sql); C_SQ_QTY = queryResult?.SQ_QTY; C_OK_QTY = queryResult?.OK_QTY; // 判断逻辑 if (C_SQ_QTY < C_OK_QTY) throw new Exception("扫描数量超过申请数量,请重新扫描!"); if (C_SQ_QTY == C_OK_QTY) return true; return false; } public bool Audit(WarehouseQuery query) { // 审核前校验 Validate(query); query.status = 1; //审核 return Update(query); } public bool SetNFlag(WarehouseQuery query) { return Db.Updateable() .SetColumns(s => s.Nflag == 1) .Where(s => s.ItemOutNo == query.billNo) .ExecuteCommand() > 0; } public bool DeApprove(WarehouseQuery query) { query.date = null; query.status = 0; return Update(query); } private bool Update(WarehouseQuery entity) { 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.Id == entity.id).ExecuteCommand() > 0; } public 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.Id) .ToList(); var sql = string.Empty; var P_Msg = string.Empty; foreach (var item in itemOutItems) { // 判断申请数量是否大于剩余可退数量 sql = string.Format( @"SELECT NVL(s1.RK_QTY, 0) - NVL(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.ID = {0}", item.Id); 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.Id && s1.RkNo == item.RkNo) .Count(); if (cf_Num > 1) { 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.PbillNo) .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) { P_Msg = $"子表仓库编码:{j.DepotCode} 与主表仓库编码:{mesInvItemOuts.DepotCode},不一致,请检查"; throw new Exception(P_Msg); } } } public OutItemDto SaveCombination(OutItemDto dto) { var mesInvItemOuts = dto.Form; mesInvItemOuts.Status = 0; mesInvItemOuts.BoardFlag = 0; mesInvItemOuts.Sapstatus = 0; mesInvItemOuts.OutStatus = 0; mesInvItemOuts.ItemFlag = 0; mesInvItemOuts.IsVisual = 1; mesInvItemOuts.TransactionNo = 203; mesInvItemOuts.Factory = "1000"; mesInvItemOuts.Company = "1000"; //返回ID var id = Db.Insertable(mesInvItemOuts) .ExecuteReturnIdentity(); if (id <= 0) throw new Exception("插入错误"); mesInvItemOuts.Id = id; dto.SaveItems.ForEach(s => { s.ItemOutId = id; 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) .ExecuteCommand(); if (insertable < 0) throw new Exception("插入错误"); var query = new WarehouseQuery(); query.id = id; dto.SelectItems = GetItems(query); return dto; } public List GetPage(WarehouseQuery query) { return Db.Queryable((a, e, i, u1, u3) => new JoinQueryInfos( JoinType.Left, a.DepotCode == e.DepotCode && e.Factory == a.Factory && e.Company == a.Company, JoinType.Left, a.SuppNo == i.SuppNo, JoinType.Left, a.CreateBy == u1.Fcode, JoinType.Left, a.CheckUser == u3.Fcode)) .WhereIF(query.id > 0, (a, e, i, u1, u3) => a.Id == query.id) .WhereIF(!string.IsNullOrEmpty(query.billNo), (a, e, i, u1, u3) => a.ItemOutNo == query.billNo) .Select((a, e, i, u1, u3) => new MesInvItemOuts { Id = a.Id, DepotCode = a.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 = a.SuppNo, DepotName = e.DepotName, SuppName = i.SuppName, CreateByFname = u1.Fname, CheckUserFname = u3.Fname, CreateDate = a.CreateDate, CreateBy = a.CreateBy, Status = a.Status, ItemOutNo = a.ItemOutNo }).ToPageList(query.PageIndex, query.Limit); } public List GetScanBarcode(WarehouseQuery query) { return Db.Queryable( (b, bar, c, d) => new JoinQueryInfos( JoinType.Left, b.ItemBarcode == bar.ItemBarcode, JoinType.Left, b.ItemNo == c.ItemNo && b.Company == c.Company && b.Factory == c.Factory, JoinType.Left, b.DepotCode == d.DepotCode && b.Company == d.Company && b.Factory == d.Factory )) .Where((b, bar, c, d) => b.ItemOutId == query.id) .Select((b, bar, c, d) => new MesInvItemOutCDetails { 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(); } //MESInvItemOutItems public List GetItems(WarehouseQuery query) { var where = "and 1=1"; if (query.id != null) where = "and ITEM_OUT_ID = '" + query.id + "'"; var sql = string.Format(@"select * from ( SELECT C.REMARK, C.PBILL_NO, C.ITEM_OUT_ID, C.RK_QTY, C.TL_QTY, C.WORK_LINE, C.QUANTITY, C.ITEM_NO, NVL(s1.RK_QTY, 0) - NVL(KT_QTY, 0) KT_QTY, R.DEPOT_SECTION_CODE, S.ITEM_MODEL, S.ITEM_NAME, K.CGB014, Q.STAFF_NAME, R.DEPOT_CODE FROM MES_INV_ITEM_OUT_ITEMS C JOIN MES_ITEMS S ON C.ITEM_NO = S.ITEM_NO LEFT JOIN (SELECT SUM(QUANTITY) KT_QTY, ITEM_NO, PBILL_NO, WORK_LINE, RK_NO 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_details 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 LEFT JOIN MES_ROH_IN_DATA K ON K.BILL_NO = C.PBILL_NO AND C.WORK_LINE = K.PURCHASE_ORDER_LINE_NUMBER left join MES_ROH_IN H on H.BILL_NO = K.BILL_NO left join MES_STAFF Q on H.PURCHASER = Q.STAFF_NAME LEFT JOIN MES_SUPPLIER T ON H.SUPPLIER = T.ID LEFT JOIN (select * from (SELECT row_number() over (partition by DEPOT_CODE, ITEM_NO, EBELN order by CREATE_DATE) rn, DEPOT_CODE, DEPOT_SECTION_CODE, ITEM_NO, EBELN FROM mes_inv_item_in_c_details where EBELN is not null) where rn = 1 and ROWNUM = 1) R ON R.ITEM_NO = C.ITEM_NO) where 1=1 {0}", where); var results = Db.Ado.SqlQuery(sql); return results; } public OutItemDto GetSumItem(WarehouseQuery query) { var mesInvItemOuts = base.GetSingle(it => it.ItemOutNo == query.billNo); if (mesInvItemOuts == null) throw new Exception("采购退货单不存在"); var sql = string.Format(@"SELECT DEPOT ,ITEM_NO,ITEM_MODEL, ITEM_NAME,QTY FROM (SELECT SUM(QTY) QTY, DEPOT, ITEM_NO, ITEM_MODEL, ITEM_NAME FROM (SELECT f_get_section_code2('1000', '1000', b.ITEM_NO,'{0}') DEPOT, B.ITEM_NO, A.ITEM_MODEL,A.ITEM_NAME,to_char(nvl(b.QUANTITY, 0) - nvl(D.QUANTITY_OK, 0),'FM9999999990.00') QTY FROM MES_INV_ITEM_OUT_ITEMS B LEFT JOIN mes_ITEMS A ON B.ITEM_NO = A.ITEM_NO LEFT JOIN (SELECT ITEM_OUT_ID, ITEM_NO,PBILL_NO,SUM(QUANTITY) QUANTITY_OK,RK_NO FROM MES_INV_ITEM_OUT_C_DETAILS WHERE ITEM_OUT_ID = {1} GROUP BY ITEM_OUT_ID,ITEM_NO,PBILL_NO,RK_NO) D ON D.ITEM_OUT_ID = B.ITEM_OUT_ID AND D.ITEM_NO = B.ITEM_NO AND D.PBILL_NO = B.PBILL_NO AND D.RK_NO = B.RK_NO WHERE B.ITEM_OUT_ID = {1} AND nvl(b.QUANTITY, 0) - nvl(D.QUANTITY_OK, 0) > 0 ORDER BY f_get_section_code2('1000','1000',b.ITEM_NO,'{0}'), A.ITEM_MODEL,A.ITEM_NAME) GROUP BY DEPOT, ITEM_NO, ITEM_MODEL, ITEM_NAME)", mesInvItemOuts.DepotCode, mesInvItemOuts.Id); var results = Db.Ado.SqlQuery(sql); var mesInvItemStocks = Db.Queryable() .Where(a => a.ItemBarcode == query.barcode).Single(); var dto = new OutItemDto(); dto.SumItem = results; if (mesInvItemStocks != null) { dto.ItemNo = mesInvItemStocks.ItemNo; dto.Quantity = mesInvItemStocks.Quantity; } return dto; } public List SelectMaterials(WarehouseQuery query) { var sql = string.Format(@"select B.WORK_NO, b.work_line, b.item_no, s2.item_name, s2.item_model, sum(b.quantity) sum_Quantity, b.unit, b.supp_no, nvl(s1.quantity, 0) quantity, sum(b.quantity) - nvl(U.KT_QTY, 0) Refundable_Quantity, B.cbill_no, B.task_no, A.BILL_NO, to_char(b.CREATE_DATE, 'yyyy-mm-dd') as CREATE_DATE from mes_inv_item_in_c_details b left join mes_inv_item_ins a on b.item_in_id = a.id LEFT JOIN (select s.item_no, s.work_line, s.Work_no, sum(s.quantity) quantity, S.RK_NO from mes_inv_item_out_c_details s group by s.item_no, s.work_line, s.work_no, S.RK_NO) s1 ON NVL(B.work_LINE, '0') = NVL(s1.work_LINE, '0') and B.work_no = s1.work_no and B.item_no = s1.item_no AND B.BILL_NO = S1.RK_NO LEFT JOIN (SELECT SUM(QUANTITY) KT_QTY, ITEM_NO, PBILL_NO, WORK_LINE, RK_NO FROM MES_INV_ITEM_OUT_ITEMS GROUP BY ITEM_NO, PBILL_NO, WORK_LINE, RK_NO) U ON U.ITEM_NO = B.ITEM_NO AND U.WORK_LINE = B.WORK_LINE AND U.PBILL_NO = B.WORK_NO AND U.RK_NO = B.BILL_NO left join mes_items s2 on b.item_no = s2.item_no left join purdha da on da.dha001 = b.cbill_no WHERE A.BILL_NO LIKE 'Q%' AND A.CBILL_NO like 'L%' group by b.item_no, b.work_line, b.supp_no, b.remark, s1.quantity, b.unit, s2.item_name, s2.item_model, da.dha003, B.WORK_NO, B.cbill_no, B.task_no, to_char(b.CREATE_DATE, 'yyyy-mm-dd'), A.BILL_NO, U.KT_QTY, A.CBILL_NO having b.remark = '采购入库' and sum(b.quantity) - nvl(U.KT_QTY, 0) > 0 and b.supp_no = '{0}' order by to_char(b.CREATE_DATE, 'yyyy-mm-dd')", query.SuppNo); var results = Db.Ado.SqlQuery(sql); return results; } 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 executeReturnIdentity = Db.Insertable(message).ExecuteReturnIdentity(); if (executeReturnIdentity > 0) { message.Id = executeReturnIdentity; message.Pid = executeReturnIdentity; return message; } throw new Exception("获取数据失败"); } 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.billNo); 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; } public bool DeApproveBefore(WarehouseQuery query) { var mesInvItemOuts = base.GetById(query.id); if (mesInvItemOuts == null) throw new Exception("出库单不存在"); var nflag = mesInvItemOuts.Nflag ?? 0; if (nflag != 0) return true; return false; } private string GetDeApprovePam(decimal? id) { var sid = (int)id; var encodedUrl = "taskname=CGTL&mesid=" + sid + "&optype=delete&datajson={}"; return encodedUrl; } private string GetErpParameters(string? billNo) { var invItemIns = Db.Queryable() .Single(x => x.ItemOutNo == billNo); //调用function函数 var sql = $"SELECT F_GENERATE_DATA_INSERTED('{billNo}') FROM DUAL;"; var jsonString = Db.Ado.SqlQuerySingle(sql); var encodedUrl = "taskname=CGTL&mesid=" + invItemIns.Id + "&optype=create&datajson=" + jsonString; return encodedUrl; } public List GetItemOutNo() { var data5 = Db.Queryable().Where(it => it.BillTypeId == 200 && it.TransactionNo == 203 && it.Status == 1) .OrderBy(it => it.Id, OrderByType.Desc) .ToPageList(1, 20); var ItemOutNos = data5.FindAll(a => a.Nflag == null || a.Nflag == 0) .Select(s => s.ItemOutNo).ToList(); // // var ItemOutNos = data5 // .Select(s => s.ItemOutNo).ToList(); return ItemOutNos; } //生产领料单审核前校验 public MessageCenter SaveProductionMessageCenter(WarehouseQuery entity) { var message = ProductionMesToErpParam(entity); var executeReturnIdentity = Db.Insertable(message).ExecuteReturnIdentity(); if (executeReturnIdentity > 0) { message.Id = executeReturnIdentity; message.Pid = executeReturnIdentity; return message; } throw new Exception("获取数据失败"); } public MessageCenter ProductionMesToErpParam(WarehouseQuery query) { var erpParameters = ""; var title = ""; var tableName = "INV_ITEM_OUTS_" + query.Type; if ("A".Equals(query.Type)) { erpParameters = GetProductionErpParameters(query.billNo, query.userName); 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/ProductionPick/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 GetProductionErpParameters(string? queryBillNo, string? userName) { userName ??= "system"; var mesInvItemOuts = Db.Queryable() .Where(it => it.ItemOutNo == queryBillNo) .First(); if (mesInvItemOuts == null) throw new Exception("领料单号不存在"); var womcaa = Db.Queryable() .Where(it => it.Caa020 == mesInvItemOuts.WorkNo) .First(); if (womcaa == null) throw new Exception("任务单号不存在"); var Departmentcode = Db.Queryable( (a, b) => new JoinQueryInfos(JoinType.Left, a.Departmentname == b.OutPart )).Where((a, b) => b.OutPart == mesInvItemOuts.OutPart && b.ItemOutNo == queryBillNo).Select(a => a.Departmentcode) .First(); if (string.IsNullOrEmpty(Departmentcode)) throw new Exception("部门信息不存在"); // 检查领料单状态 if (mesInvItemOuts.Status == 1) throw new Exception("领料单已审核,不能重复推送"); var C_OUT_ITEMS = Db .Queryable( (c, b, d, e, f) => new JoinQueryInfos( JoinType.Left, b.Id == c.ItemDabid, JoinType.Left, d.Id == b.Pid, JoinType.Left, e.Caa001 == d.Daa021, JoinType.Left, f.Eid == e.Erpid )) .Where((c, b, d, e, f) => c.ItemOutId == mesInvItemOuts.Id) .Select((c, b, d, e, f) => new { c.Id, c.ItemNo, c.Quantity, c.DepotCode, c.DepotSectionCode, c.ItemId, erpId = b.ErpId, e.Caa015, f.PositionNo }).ToList(); var scllentryList = new List(); foreach (var item in C_OUT_ITEMS) { var sql = "SELECT FNAME FROM MES_UNIT WHERE ID = (SELECT ITEM_UNIT FROM MES_ITEMS WHERE ID = '" + item.ItemId + "')"; var C_ITEM_UNIT = Db.Ado.SqlQuerySingle(sql); var xsddh = item.Caa015 ?? ""; var wzh = item.PositionNo ?? ""; var qty = ((int)item.Quantity).ToString(); var erpid = ((int)item.erpId).ToString(); var id = ((int)item.Id).ToString(); scllentryList.Add(new { FMaterialId = item.ItemNo, FUnitID = C_ITEM_UNIT, FAppQty = qty, FActualQty = qty, FStockId = item.DepotCode, FPPBomEntryId = erpid, F_UNW_Text_xsddh = xsddh, F_UNW_TEXT_WZH = wzh, F_MES_ENTRYID = id }); } var dataJson = new { F_MES_ID = mesInvItemOuts.Id.ToString(), FDate = DateTime.Now.ToString("yyyy-MM-dd"), FPickerId = userName, F_UNW_LargeText_BZ = " ", F_UNW_KH = " ", F_UNW_DDSL = womcaa.Caa012.ToString(), F_UNW_Text_CZG = userName, scllentry = scllentryList }; return "taskname=SCLL&mesid=" + mesInvItemOuts.Id + "&optype=create&datajson=" + JsonConvert.SerializeObject( dataJson); } public bool AuditProduction(WarehouseQuery query) { query.status = 1; //审核 return Update(query); } }