private void SimulateLeveller() { HeaderContent.LevSimulates = _repo.GetLevellerSimAll(HeaderContent.WorkOrderID).ToList(); HeaderContent.Materials = _repo.GetAllMaterial(epiSession.PlantID, HeaderContent.WorkOrderID).ToList(); #region Looping by materials foreach (var mat in HeaderContent.Materials.Where(m => m.RemainLengthM > 0).OrderBy(m => m.TransactionLineID)) { //Initial remaining material length from using length(Meter* 1,000). decimal matRemLength = mat.RemainLengthM * 1000; #region Looping by materials foreach (var item in HeaderContent.CuttingDesign.Where(i => i.CalQuantity != i.SOQuantity)) { //Summary quantity for a cutting design has simulated from simulation lines and assign to [bQty]. decimal bQty = HeaderContent.LevSimulates.Where(p => p.CuttingLineID == item.LineID).Sum(i => i.CalQuantity); #region Conditions implement /* * Quantity already simulated[bQty] if not equal SO Qty. * Remaining material length greater than cutting length per unit. */ if (item.SOQuantity != bQty && matRemLength >= item.Length) { //For remaining material length can be used to cutting possible and assign to [calQty:Value is possible]. decimal calQty = Math.Floor(matRemLength / item.Length); #region Calculate by conditional. /* * calQty : จำนวนชิ้นงานที่สามารถสั่งตัดได้ทั้งหมด โดยคิดจากความยาว Material ที่มีอยู่ * bQty : จำนวนที่ Simulate ไปแล้วสำหรับ Cut Design นี้ * item.SOQuantity : จำนวนที่ต้องตัดทั้งหมด * item.CalQuantity : จำนวนที่สั่งตัดหลังจากการคำนวณ * item.Length : ความยาวของชิ้นงานที่ตัดใน 1 หน่วย */ #region ยังไม่ยอดเคยถูก Simulate if (bQty == 0) { #region จำนวนชิ้นงานที่สามารถสั่งตัดได้ทั้งหมด โดยคิดจากความยาว Material ที่มีอยู่ เหลือมากกว่าจำนวนที่สั่ง if (calQty >= item.SOQuantity) { //จำนวนที่สั่งตัดหลังจากการคำนวณ = (จำนวนที่สั่ง) item.CalQuantity = item.SOQuantity; item.CompleteRow = true; //ความยาว Material ที่เหลือ (มิลลิเมตร) = (จำนวนชิ้นงานที่สามารถสั่งตัดได้ทั้งหมด โดยคิดจากความยาว Material ที่มีอยู่ - จำนวนที่สั่งตัดหลังจากการคำนวณ) * ความยาวต่อชิ้นงาน (มิลลิเมตร) matRemLength = Math.Floor((calQty - (item.CalQuantity)) * item.Length); } #endregion จำนวนชิ้นงานที่สามารถสั่งตัดได้ทั้งหมด โดยคิดจากความยาว Material ที่มีอยู่ เหลือมากกว่าจำนวนที่สั่ง #region จำนวนชิ้นงานที่สามารถสั่งตัดได้ทั้งหมด โดยคิดจากความยาว Material ที่มีอยู่ เหลือน้อยกว่าจำนวนที่สั่ง else if (calQty < item.SOQuantity) { //จำนวนที่สั่งตัดหลังจากการคำนวณ = (จำนวนชิ้นงานที่สามารถสั่งตัดได้ทั้งหมด โดยคิดจากความยาว Material ที่มีอยู่) item.CalQuantity = calQty; item.CompleteRow = false; //ความยาว Material ที่เหลือ (มิลลิเมตร) = 0 matRemLength = 0; } #endregion จำนวนชิ้นงานที่สามารถสั่งตัดได้ทั้งหมด โดยคิดจากความยาว Material ที่มีอยู่ เหลือน้อยกว่าจำนวนที่สั่ง } #endregion ยังไม่ยอดเคยถูก Simulate #region มียอดที่ Simulate ไปบ้างแล้ว else if (bQty != 0) { #region จำนวนชิ้นงานที่สามารถสั่งตัดได้ทั้งหมด โดยคิดจากความยาว Material ที่มีอยู่ เหลือมากกว่า [(จำนวนที่สั่ง) - (ยอดที่ Simulate ไปก่อนหน้านี้)] if (calQty >= (item.SOQuantity - bQty)) { //จำนวนที่สั่งตัดหลังจากการคำนวณ = (จำนวนที่สั่ง) - (มียอดที่ Simulate ไปก่อนหน้านี้) item.CalQuantity = item.SOQuantity - bQty; item.CompleteRow = true; // ความยาว Material ที่เหลือ (มิลลิเมตร) = [จำนวนชิ้นงานที่สามารถสั่งตัดได้ทั้งหมด โดยคิดจากความยาว Material ที่มีอยู่ - (จำนวนที่สั่งตัดหลังจากการคำนวณ)] * ความยาวต่อชิ้นงาน (มิลลิเมตร) matRemLength = (calQty - (item.CalQuantity)) * item.Length; } #endregion จำนวนชิ้นงานที่สามารถสั่งตัดได้ทั้งหมด โดยคิดจากความยาว Material ที่มีอยู่ เหลือมากกว่า [(จำนวนที่สั่ง) - (ยอดที่ Simulate ไปก่อนหน้านี้)] #region จำนวนชิ้นงานที่สามารถสั่งตัดได้ทั้งหมด โดยคิดจากความยาว Material ที่มีอยู่ เหลือน้อยกว่า [(จำนวนที่สั่ง) - (ยอดที่ Simulate ไปก่อนหน้านี้)] else if (calQty < item.SOQuantity - bQty) { //จำนวนที่สั่งตัดหลังจากการคำนวณ = (จำนวนชิ้นงานที่สามารถสั่งตัดได้ทั้งหมด โดยคิดจากความยาว Material ที่มีอยู่) item.CalQuantity = calQty; //ถ้าหากจำนวนที่ตัด + จำนวนที่ Simulate ไปแล้ว = SO Qty จะเป็นจริง ไม่เช่น จะเป็นเท็จ item.CompleteRow = (item.SOQuantity == (item.CalQuantity + bQty)); //ความยาว Material ที่เหลือ (มิลลิเมตร) = 0 matRemLength = 0; } #endregion จำนวนชิ้นงานที่สามารถสั่งตัดได้ทั้งหมด โดยคิดจากความยาว Material ที่มีอยู่ เหลือน้อยกว่า [(จำนวนที่สั่ง) - (ยอดที่ Simulate ไปก่อนหน้านี้)] } #endregion มียอดที่ Simulate ไปบ้างแล้ว #endregion Calculate by conditional. LevellerSimulateModel lev = new LevellerSimulateModel(); lev.Plant = epiSession.PlantID; lev.WorkOrderID = HeaderContent.WorkOrderID; lev.CuttingLineID = item.LineID; lev.MaterialTransLineID = mat.TransactionLineID; lev.SOQuantity = Convert.ToInt32(item.SOQuantity); lev.CalQuantity = Convert.ToInt32(item.CalQuantity); lev.RemainWeight = 0;// item.CalUnitWgt(item.Thick, item.Width, item.Length, item.Gravity, item.FrontPlate, item.BackPlate); lev.RemainLength = matRemLength; lev.RemainLengthM = matRemLength / 1000; lev.UsingLength = item.CalQuantity * item.Length; lev.UsingLengthM = (item.CalQuantity * item.Length) / 1000; HeaderContent.LevSimulates = _repo.SaveLevellerSimulate(epiSession, lev).ToList(); item.CalculateRows(HeaderContent); } #endregion Conditions implement } #endregion Looping by materials } #endregion Looping by materials }
public IEnumerable<LevellerSimulateModel> SaveLevellerSimulate(SessionInfo _session, LevellerSimulateModel model) { //int id = 0; string sql = string.Format(@"IF NOT EXISTS ( SELECT * FROM ucc_pln_LevellerSimulateTmp (NOLOCK) WHERE WorkOrderID = {1} AND CuttingLineID = {2} AND MaterialTransLineID = {3} ) BEGIN INSERT INTO ucc_pln_LevellerSimulateTmp (Plant ,WorkOrderID ,CuttingLineID ,MaterialTransLineID ,CalQuantity ,RemainWeight ,RemainLength ,RemainLengthM ,CreationDate ,LastUpdateDate ,CreatedBy ,UpdatedBy, SOQuantity ,UsingWeight ,UsingLength ,UsingLengthM) VALUES (N'{0}' --<Plant, nvarchar(8),> ,{1} --<WorkOrderID, bigint,> ,{2} --<CuttingLineID, bigint,> ,{3} --<MaterialTransLineID, bigint,> ,{4} --<CalQuantity, int,> ,{5} --<RemainWeight, decimal(20,9),> ,{6} --<RemainLength, decimal(20,9),> ,{7} --<RemainLengthM, decimal(20,9),> ,GETDATE() --<CreationDate, datetime,> ,GETDATE() --<LastUpdateDate, datetime,> ,N'{8}' --<CreatedBy, nvarchar(45),> ,N'{8}' --<UpdatedBy, nvarchar(45),> ,{9} ,{10} --<UsingWeight, decimal(20,9),> ,{11} --<UsingLength, decimal(20,9),> ,{12} --<UsingLengthM, decimal(20,9),> ) END ELSE BEGIN UPDATE ucc_pln_LevellerSimulateTmp SET Plant = N'{0}' --<Plant, nvarchar(8),> ,WorkOrderID = {1} --<WorkOrderID, bigint,> ,CuttingLineID = {2} --<CuttingLineID, bigint,> ,MaterialTransLineID = {3} --<MaterialTransLineID, bigint,> ,CalQuantity = {4} --<Quantity, int,> ,RemainWeight = {5} --<RemainWeight, decimal(20,9),> ,RemainLength = {6} --<RemainLength, decimal(20,9),> ,RemainLengthM = {7} --<RemainLengthM, decimal(20,9),> ,LastUpdateDate = GETDATE() --<LastUpdateDate, datetime,> ,UpdatedBy = N'{8}' --<UpdatedBy, nvarchar(45),> ,SOQuantity = {9} ,UsingWeight = {10} --<UsingWeight, decimal(20,9),> ,UsingLength = {11} --<UsingLength, decimal(20,9),> ,UsingLengthM = {12} --<UsingLengthM, decimal(20,9),> WHERE WorkOrderID = {1} AND CuttingLineID = {2} AND MaterialTransLineID = {3} END" + Environment.NewLine , _session.PlantID , model.WorkOrderID , model.CuttingLineID , model.MaterialTransLineID , model.CalQuantity , model.RemainWeight , model.RemainLength , model.RemainLengthM , _session.UserID , model.SOQuantity , model.UsingWeight , model.UsingLength , model.UsingLengthM ); //Update PartLot.CheckBox01 = 1 to change status has already used. //sql += @"DELETE FROM ucc_pln_LevellerSimulateTmp WHERE LengthM = 0"; Repository.Instance.ExecuteWithTransaction(sql, "Add SIM"); return GetLevellerSimAll(model.WorkOrderID); }