Ejemplo n.º 1
0
        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
        }
Ejemplo n.º 2
0
        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);
        }