using MES.Service.DB; using MES.Service.Dto.service; using MES.Service.Modes; using SqlSugar; namespace MES.Service.service.Warehouse; public class MesInvItemOutsManager : Repository { //当前类已经继承了 Repository 增、删、查、改的方法 //这里面写的代码不会给覆盖,如果要重新生成请删除 MesInvItemOutsManager.cs public bool Audit(WarehouseQuery query) { // 审核前校验 Validate(query); //审核 return Db.Updateable() .SetColumns(s => s.Status == 1) .SetColumns(s => s.CheckUser == query.userName) .SetColumns(s => s.CheckDate == DateTime.Now) .Where(s => s.Id == query.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) .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); } //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 List GetSumItem(WarehouseQuery query) { 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)", query.DepotCode, query.id); var results = Db.Ado.SqlQuery(sql); return results; } 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; } }