using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Project.Dialog
{
    public partial class fLoaderInfo : Form
    {
        string PrintPos = "";

        public fLoaderInfo(List<string> errlist)
        {
            InitializeComponent();
            Pub.flag.set(eFlag.WAIT_LOADERINFO, true, "_LOAD");
            this.FormClosed += FLoaderInfo_FormClosed;
            this.lstErrmsg.Items.Clear();

            if (errlist != null)
            {

                foreach (var item in errlist)
                    AddErrorMessage(item);
            }

        }

        void AddErrorMessage(string msg)
        {
            if (this.lstErrmsg.InvokeRequired)
            {
                this.lstErrmsg.BeginInvoke(new Action(() =>
                {
                    //Does an item with the same tag exist?
                    if (lstErrmsg.FindString(msg) < 0)
                        lstErrmsg.Items.Add(string.Format("{0}", msg));
                }));
            }
            else
            {
                //동일한 태그를 가진 항목이 존재하는가?
                if (lstErrmsg.FindString(msg) < 0)
                    lstErrmsg.Items.Add(string.Format("{0}", msg));
            }
        }

        private void FLoaderInfo_FormClosed(object sender, FormClosedEventArgs e)
        {
            //Image release  210329
            if (this.iv1.Image != null)
            {
                this.iv1.Image.Dispose();
                this.iv1.Image = null;
            }

            Pub.flag.set(eFlag.WAIT_LOADERINFO, false, "_CLOSE");

            //User closed without entering information correctly
            if (Pub.Result.ItemData[1].VisionData.Confirm == false)
            {
                if (Pub.sm.Step == StateMachine.eSMStep.RUN)
                {
                    Pub.Result.SetResultMessage(eResult.OPERATION, eECode.CAM_NOBARCODEL, eNextStep.pause, 1);
                }
            }
        }

        private void fLoaderInfo_Load(object sender, EventArgs e)
        {
            //Display all data that the barcode has read.
            this.tbRID.Text = Pub.Result.ItemData[1].VisionData.RID;
            this.tbRID.Tag = Pub.Result.ItemData[1].VisionData.RID0;

            //if (Pub.Result.JobType == "13" )
            //{
            //	if (Pub.Result.ItemData[1].VisionData.SID.StartsWith("103"))
            //	{
            //		tbSID.Text = Pub.Result.ItemData[1].VisionData.SID;
            //	}
            //	else
            //	{
            //		var msg = $"13작업이나 입력된 SID가 103이 아니여서 적용하지 않습니다. sid:{Pub.Result.ItemData[1].VisionData.SID}";
            //		Pub.AddSystemLog(Application.ProductVersion, "LoaderInfo", msg);
            //		Pub.log.AddAT(msg);
            //	}
            //}
            //else 
            {
                tbSID.Text = Pub.Result.ItemData[1].VisionData.SID;
            }

			
            lbSID0.Text = Pub.Result.ItemData[1].VisionData.SID0;
            tbVLOT.Text = Pub.Result.ItemData[1].VisionData.VLOT;

			if (lbSID0.Text.isEmpty() == false)
				lbSID0.Tag = lbSID0.Text;

            //Quantity manual input field
            if (Pub.Result.Option_QtyUpdateM)
            {
                if (Pub.Result.ItemData[1].VisionData.QTYRQ == true)
                {
                    //Manual input or RQ value is in barcode, so use that.
                    //lock (Pub.Result.ItemData[1].VisionData.barcodelist)
                    {
                        var rqBcd = Pub.Result.ItemData[1].VisionData.barcodelist.Where(t => t.Data.StartsWith("RQ")).FirstOrDefault();
                        if (rqBcd != null)
                        {
                            var newqty = rqBcd.Data.Substring(2).Trim();
                            Pub.log.Add($"Quantity updated {tbQTY.Text}->{newqty}");
                            tbQTY.Text = newqty;
                        }
                        else
                        {
                            Pub.log.AddAT("RQ was set but the value is not in the code list, so quantity is not filled");
                        }
                    }



                }
                else
                {
                    //Direct input for quantity, so clear the quantity value.
                    Pub.log.Add($"Quantity updated {tbQTY.Text}-> (deleted due to direct input)");
                    tbQTY.Text = string.Empty;
                }
            }
            else
            {
                Pub.log.Add($"Quantity updated {tbQTY.Text}->{Pub.Result.ItemData[1].VisionData.QTY}");
                tbQTY.Text = Pub.Result.ItemData[1].VisionData.QTY;
            }

            lbQTY0.Text = Pub.Result.ItemData[1].VisionData.QTY0;
            tbDate.Text = Pub.Result.ItemData[1].VisionData.MFGDATE;
            tbVName.Text = Pub.Result.ItemData[1].VisionData.VNAME;
            tbpartno.Text = Pub.Result.ItemData[1].VisionData.PARTNO;

            TbCustCode.Text = Pub.Result.ItemData[1].VisionData.temp_custcode; //210317
            tbCustName.Text = Pub.Result.ItemData[1].VisionData.temp_custname;
            //라벨위치 정보표시 - 210127
            DisplayLabelPos(Pub.Result.ItemData[1].VisionData.LabelPositionData);

            //프린트정보표시
            this.PrintPos = Pub.Result.ItemData[1].VisionData.PrintPositionData;
            DisplayPrintPos(Pub.Result.ItemData[1].VisionData.PrintPositionData);

            //이미지표시  210121
            this.iv1.Shapes.Clear();
            if (Pub.Result.ItemData[1].VisionData.image != null)
            {
                //이미지복사해서사용 210329
                var keyImage = Pub.Result.ItemData[1].VisionData.image.Clone();
                this.iv1.Image = keyImage;
            }

            this.lvbcdList.Items.Clear();

            //키엔스로부터 읽은 바코드 목록을 표시한다(우측)
            func_displaybcdlist();

            if (iv1.Image != null)
                iv1.ZoomFit();


            selectInput(this.tbRID);

            //자동판단데이터 확인; (101-103d우선처리)
            //이제 모든 sid변환은 1,3컬럼만 사용한다, 22-01-04
            if (Pub.Result.JobType2 == "13" && tbSID.Text.StartsWith("10")) func_sidconv(true);

            //릴아이디가 없는 경우 자동 생성해준다.
            Boolean updaterid = false;
            var custCode = TbCustCode.Text;
            if (Pub.Result.Option_NewReelID)
            {

                if (tbRID.Text.isEmpty())
                {
                    if (custCode.isEmpty() == false) updaterid = true;
                    else Pub.log.AddAT("Need to generate Reel ID but customer code is missing.");
                }
                else if (custCode.isEmpty() == false)
                {
                    //릴id는 있는데. customer 코드값이 다르면 다시 만들어줘야한다.
                    if (tbRID.Text.StartsWith("RC" + custCode) == false)
                    {
                        Pub.log.Add("릴 ID의 cust 코드가 달라 다시 생성합니다");
                        updaterid = true;
                    }
                }
            }

            if (updaterid)
            {
                var YY = DateTime.Now.Year.ToString().Substring(2);
                var MM = DateTime.Now.Month.ToString("X");
                var datestr = YY + MM;
                var newsn = AmkorReelID.GetNextSNbyYM(datestr);

                var data = "R";
                data += "C";
                data += custCode.Trim();
                data += "4";
                data += "A";
                data += YY;
                data += MM;
                data += newsn;
                if (data.Length == 15)
                {
                    this.tbRID.Text = data;
                    Pub.log.Add("기초자료가 있어 릴 id를 자동 생성했음" + data);
                }
                else
                {
                    Util.MsgE("릴 ID생성했지만 15자리가 아님 프로그램 오류(" + data + ")");
                }
            }


            //자동완료이며, 사용자 확인이 off된상태, 수량입력도 false 된 상태여야함
            if (Pub.Result.Option_AutoConf && Pub.Result.Option_Confirm1 == false && Pub.Result.Option_QtyUpdateM == false && Pub.Result.JobFirst == false)
            {
                //자료가 모두 있는지 확인한다.
                tmAutoConfirm.Start();
            }

        }

        void func_displaybcdlist()
        {
            var angok = Pub.Result.ItemData[1].VisionData.BaseAngle(out string msg, out Class.KeyenceBarcodeData bcd);
            lock (Pub.Result.ItemData[1].VisionData.barcodelist)
            {
                var no = 1;
                lvbcdList.Items.Clear();    //기존꺼 삭제
                foreach (var item in Pub.Result.ItemData[1].VisionData.barcodelist)
                {
                    var lv = this.lvbcdList.Items.Add(item.Angle.ToString("N1"));
                    lv.SubItems.Add(item.Data);
                    //lv.SubItems.Add(item.CenterPX.X.ToString());
                    //lv.SubItems.Add(item.CenterPX.Y.ToString());
                    var c = new StdLabelPrint.CAmkorSTDBarcode(item.Data);
                    if (c.isValid) lv.ForeColor = Color.Blue;
                    else lv.ForeColor = Color.Black;

                    if (item.sym == "1") lv.BackColor = Color.Gold;
                    else if (item.sym == "2") lv.BackColor = Color.Lime;
                    else lv.BackColor = Color.WhiteSmoke;

                    //회전에 사용할 데이터라면 체크를 해준다.
                    if (angok && bcd.Data == item.Data)
                    {
                        if (this.lvbcdList.CheckedItems.Count == 0)
                            lv.Checked = true;
                    }
                    else lv.Checked = false;

                    //vertext 표시
                    var vt = item.vertex;
                    if (vt.Length == 4)
                    {
                        Color lcolor = no % 2 == 0 ? Color.Tomato : Color.Lime;
                        iv1.AddShapeLine(vt[0], vt[1], lcolor);
                        iv1.AddShapeLine(vt[1], vt[2], lcolor);
                        iv1.AddShapeLine(vt[2], vt[3], lcolor);
                        iv1.AddShapeLine(vt[3], vt[0], lcolor);

                        iv1.AddShapeText(vt[0], no.ToString(), Color.Black); //210312
                    }

                    //가장우측상단에 번호를 표시한다.


                    no += 1;
                }
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {

        }

        private void label6_Click(object sender, EventArgs e)
        {

        }

        string TagStr = string.Empty;
        void selectInput(Control c)
        {
            TagStr = string.Empty;
            if (c is TextBox)
            {
                var tb = c as TextBox;
                TagStr = tb.Tag.ToString();
            }
            else if (c is Label)
            {
                var lb = c as Label;
                TagStr = lb.Tag.ToString();
            }

            //동일태그를 가진 textbox 의 배경색을 업데이트한다
            foreach (Control tb in groupBox2.Controls)
            {
                if (tb is TextBox)
                {
                    if (tb.Tag.ToString() == TagStr)
                    {
                        tb.BackColor = Color.SkyBlue;
                    }
                    else tb.BackColor = SystemColors.Control;
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //if (this.listView1.FocusedItem == null)
            //{
            //	Util.MsgE("입력할 바코드 값을 먼저 선택하세요");
            //	return;
            //}
            if (this.TagStr.isEmpty())
            {
                Util.MsgE("Please click the field to enter data first");
                return;
            }
            var lvitem = this.lvbcdList.FocusedItem;
            if (lvitem == null) return;

            var lvValue = lvitem.SubItems[1].Text.Trim();
            if (lvValue.isEmpty())
            {
                Util.MsgE("선택한 자료에 값이 없습니다\n\n다른 자료를 선택하세요");
                return;
            }

            //선택자료가 ; 으로 분류가능하면 추가로 팝업
            if (lvValue.Split(';').Length > 1)
            {
                var ff = new Dialog.fSelectDataList(lvValue.Split(';'));
                if (ff.ShowDialog() == DialogResult.OK)
                {
                    lvValue = ff.SelectedValue;
                }
                else return;
            }
            else if (lvValue.Split(',').Length > 1)
            {
                var ff = new Dialog.fSelectDataList(lvValue.Split(','));
                if (ff.ShowDialog() == DialogResult.OK)
                {
                    lvValue = ff.SelectedValue;
                }
                else return;
            }

            if (TagStr == "RID" || TagStr == "ID")
            {
                tbRID.Text = lvValue;
            }
            else if (TagStr == "SID")
            {
                tbSID.Text = lvValue;

                //sid값을 적용했다면 프린트 위치도 확인한.다.
                if (this.PrintPos.isEmpty() || this.PrintPos == "5" && lvValue.isEmpty() == false)
                {
                    try
                    {
                        using (var db = new EEEntities())
                        {
                            var dr = db.Component_Reel_SIDInfo.Where(t => t.SID == lvValue).FirstOrDefault();
                            if (dr != null)  //자료가잇는 경우에만 적용
                            {
                                this.PrintPos = dr.PrintPosition;
                                this.DisplayPrintPos(this.PrintPos);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Util.MsgE("SID:" + lvValue + " 의 인쇄위치값 불러오기 실패\n" + ex.Message);
                    }
                }
            }
            else if (TagStr == "VLOT")
            {
                tbVLOT.Text = lvValue;
            }
            else if (TagStr == "QTY")
            {
                Pub.log.Add($"수량업데이트 {tbQTY.Text}->{lvValue}");
                tbQTY.Text = lvValue;
            }
            else if (TagStr == "MFGDATE")
            {
                tbDate.Text = lvValue;
            }
            else if (TagStr == "SUPPLY")
            {
                tbVName.Text = lvValue;
            }
            else if (TagStr == "PARTNO")
            {
                tbpartno.Text = lvValue;
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            CancleAutoConfirm();
            //Pub.Result.JobEndTime
            //sid를 변경했다면 원본값은 sid0에 넣는다
            func_sidconv(false);
        }

        void CancleAutoConfirm()
        {
            if (Pub.Result.Option_AutoConf)
            {
                btOK.Text = "◆ 입력 완료 ◆";
                tmAutoConfirm.Stop();
            }
        }

        void func_sidconv(Boolean auto)
        {
            var sid = tbSID.Text.Trim();
            var jobtype = Pub.Result.JobType2;
            if (jobtype == "13")
            {
                if (auto)
                {
                    //데이터베이스에서 조회한다.
                    try
                    {
                        using (var db = new EEEntities())
                        {
                            var dr = db.Component_Reel_SIDConv.Where(t => t.SIDFrom == sid && string.IsNullOrEmpty(t.SIDTo) == false);
                            if (dr.Any() == true)   //변환테이블자료가 있다.
                            {
                                if (dr.Count() == 1)
                                {
                                    //원본에 값이 없는경우에만 생성한다
                                    if(lbSID0.Text.isEmpty())
                                    {
                                        lbSID0.Tag = tbSID.Text;    //변환정보가 있으니 현재 정보를 원본의 값에 넣는다
                                        lbSID0.Text = tbSID.Text;   //원본값
                                    }
                                    tbSID.Text = dr.First().SIDTo; //변환된 값을 현재 값에 넣는다.
                                    Pub.log.Add(string.Format("다음 SID 자동변환 {0}->{1},작업:{2}", dr.First().SIDFrom, dr.First().SIDTo, jobtype));
                                }
                                else Pub.log.AddE(string.Format("SID 자동변환실패 {0}, 발견 SID변환정보 수량:{1}", dr.First().SIDFrom, dr.Count()));
                            }
                            else Pub.log.Add(string.Format("SID자동변경실패 변환자료 없음 sid:{0},작업:{1}", sid, jobtype));
                        }
                    }
                    catch (Exception ex)
                    {
                        Pub.log.AddE("SID변환작업실패 메세지:" + ex.Message);
                    }
                }
                else
                {
                    var f = new Dialog.fNewSID(sid);
                    if (f.ShowDialog() != DialogResult.OK) return;

                    if (lbSID0.Tag == null || lbSID0.Tag.ToString().isEmpty())  //기존에 변환된 정보가 있는가?
                    {
                        //원본값 백업
                        lbSID0.Tag = tbSID.Text;
                        lbSID0.Text = tbSID.Text;

                        //from & to
                        Pub.Result.LastSIDFrom = tbSID.Text.Trim();
                        Pub.Result.LastSIDTo = f.NewSID.Trim();

                        Pub.log.Add($"sid수동선택으로 인해 마지막 기록을 입력합니다 from={Pub.Result.LastSIDFrom},to={Pub.Result.LastSIDTo}");
                    }

                    Pub.Result.LastSIDCnt = f.FindSIDCount;
                    tbSID.Text = f.NewSID;
                }

                UpdateSID(auto);
                makenewId();
            }
            else
            {
                Util.MsgE("sid변환작업 불가 :작업형태가 일치하지 않습니다 값=" + Pub.Result.JobType2);
            }
        }

        void makenewId()
        {
            //ID가 잘못되었다.
            if (Pub.Result.Option_NewReelID && CheckRID() == false)
            {
                //릴 아이디가 잘못되었다면 새로 갱신한다
                var yy = DateTime.Now.ToString("yy");
                var m = DateTime.Now.Month.ToString("X");
                if (TbCustCode.Text.isEmpty())
                {
                    Pub.log.AddAT("Customer 값이 없어 reelid를 새로 생성하지 못했습니다");
                }
                else
                {
                    var newrid = AmkorReelID.MakeReelID(TbCustCode.Text, yy + m);
                    Pub.log.Add($"RID값을 자동 변경 했습니다 {tbRID.Text} -> {newrid}");
                    //if(tbRID.Text.isEmpty()==false) tbri
                    tbRID.Text = newrid;
                }
            }
        }

        void UpdateSID(Boolean auto = false)
        {
            //고칠게 없다.
            if (TbCustCode.Text.isEmpty() == false && tbpartno.Text.isEmpty() == false && this.PrintPos.isEmpty() == false)
            {
                return;
            }

            //sid 가 변경되었으나 해당 sid  인쇄위치 및 customer / part no 값을 확인 합니다.
            using (var db = new EEEntities())
            {
                var sid = this.tbSID.Text.Trim();

                var dr = db.Component_Reel_SIDInfo.Where(t => t.SID == sid).FirstOrDefault();
                if (dr == null) return;

                var msg = "SID 변경으로 인해 다음 자료를 입력할까요?";
                Boolean bupdate = false;
                if (dr.CustCode.isEmpty() == false && dr.CustCode != TbCustCode.Text)
                {
                    msg += "\nCustomer Code : " + dr.CustCode;
                    msg += "\nCustomer Name : " + dr.CustName;
                    bupdate = true;
                }

                if (dr.PartNo.isEmpty() == false && dr.PartNo != tbpartno.Text)// tbpartno.Text.isEmpty())
                {
                    msg += "\nPart No : " + dr.PartNo;
                    bupdate = true;
                }

                if (dr.PrintPosition.isEmpty() == false)
                {
                    msg += "\nPrint Position : " + dr.PrintPosition;
                    bupdate = true;
                }
                if (bupdate == false)
                {
                    //Util.MsgE("변경 가능한 자료가 없습니다");
                    return;
                }

                //화면에 표시 --자동화면일떄에는 묻지않고 적용한다
                if (auto == false && Util.MsgQ(msg) != DialogResult.Yes) return;
                if (dr.CustCode.isEmpty() == false && TbCustCode.Text != dr.CustCode)
                {
                    TbCustCode.Text = dr.CustCode;
                    tbCustName.Text = dr.CustName;
                }

                if (dr.PartNo.isEmpty() == false && tbpartno.Text != dr.PartNo)
                {
                    this.tbpartno.Text = dr.PartNo;
                }

                if (dr.PrintPosition.isEmpty() == false)
                {
                    this.PrintPos = dr.PrintPosition;
                    DisplayPrintPos(this.PrintPos);
                }

                //이 SID의 최근 MFGDate 와 Qty 를 추가 체크한다  210326
                if (tbDate.Text.isEmpty() || tbQTY.Text.isEmpty())
                {
                    func_CheckDateQty();
                }
            }

        }

        Boolean func_CheckDateQty()
        {
            Boolean bwarn = false;
            using (var db2 = new EEEntities())
            {
                var sid = this.tbSID.Text.Trim();
                if (sid.isEmpty()) return false; //sid가 없다.

                //최근 6시간안에서 동일한 데이터를 찾아서 제안 해준다
                var sd = DateTime.Now.AddHours(-1);
                var preData = db2.Component_Reel_Result.AsNoTracking().Where(t =>
                t.JTYPE == Pub.Result.JobType2 &&
                t.SID == sid &&
                string.IsNullOrEmpty(t.QR) == false &&
                t.STIME >= sd).OrderByDescending(t => t.wdate).FirstOrDefault();

                //기존자료가 없다면 취소
                if (preData == null) return false;
                var amkorid = new StdLabelPrint.CAmkorSTDBarcode(preData.QR);

                if (preData.VNAME != tbVName.Text)
                {
                    //해당 mfgdae 가 바코드목록에 잇다면 바로 적용
                    //업다면 적용하고 적용 메세지 표시한다
                    //Pub.log.Add(string.Format("이전결과에서 값 업데이트 sid:{0},mfgdata={1}", sid, amkorid.MFGDate));
                    tbVName.Text = preData.VNAME;
                    bwarn = true;
                    //if (func_existbcddata(amkorid.MFGDate) == false)
                    {
                        AddErrorMessage("V.Name 이전 기록으로 업데이트");
                        Pub.log.Add("'V.Name' 값을 이전 기록을 통해서 입력했습니다\n" +
                            "이전 작업시간 : " + ((DateTime)(preData.wdate)).ToString("yyyy-MM-dd HH:mm:ss") + "\n" +
                            "SID : " + preData.SID + "\n" +
                            "MFG Date : " + amkorid.MFGDate + "\n" +
                            "Part No : " + amkorid.PARTNO + "\n" +
                            "Vender Lot : " + amkorid.VLOT + "\n" +
                            "Vender Name : " + amkorid.VENDERNAME + "\n" +
                            "QTY : " + amkorid.QTY.ToString(), true);
                    }
                }


                if (amkorid.MFGDate.isEmpty() == false && tbDate.Text.isEmpty())
                {
                    //해당 mfgdae 가 바코드목록에 잇다면 바로 적용
                    //업다면 적용하고 적용 메세지 표시한다
                    //Pub.log.Add(string.Format("이전결과에서 값 업데이트 sid:{0},mfgdata={1}", sid, amkorid.MFGDate));
                    tbDate.Text = amkorid.MFGDate;
                    bwarn = true;
                    if (func_existbcddata(amkorid.MFGDate) == false)
                    {
                        AddErrorMessage("MFG 이전 기록으로 업데이트");
                        Pub.log.Add("'MFG Date' 값을 이전 기록을 통해서 입력했습니다\n" +
                            "이전 작업시간 : " + ((DateTime)(preData.wdate)).ToString("yyyy-MM-dd HH:mm:ss") + "\n" +
                            "SID : " + preData.SID + "\n" +
                            "MFG Date : " + amkorid.MFGDate + "\n" +
                            "Part No : " + amkorid.PARTNO + "\n" +
                            "Vender Lot : " + amkorid.VLOT + "\n" +
                            "Vender Name : " + amkorid.VENDERNAME + "\n" +
                            "QTY : " + amkorid.QTY.ToString(), true);
                    }
                }

                if (amkorid.QTY > 0 && tbQTY.Text.isEmpty())
                {
                    //해당 mfgdae 가 바코드목록에 잇다면 바로 적용
                    //업다면 적용하고 적용 메세지 표시한다
                    Pub.log.Add($"수량업데이트 {tbQTY.Text}->{amkorid.QTY}");
                    tbQTY.Text = amkorid.QTY.ToString();
                    //Pub.log.Add(string.Format("이전결과에서 값 업데이트 sid:{0},qty={1}", sid, amkorid.QTY));
                    bwarn = true;
                    if (func_existbcddata(amkorid.QTY.ToString()) == false)
                    {
                        AddErrorMessage("QTY 이전 기록으로 업데이트");
                        Pub.log.Add("'Qty' 값을 이전 기록을 통해서 입력했습니다\n" +
                            "이전 작업시간 : " + ((DateTime)(preData.wdate)).ToString("yyyy-MM-dd HH:mm:ss") + "\n" +
                            "SID : " + preData.SID + "\n" +
                            "MFG Date : " + amkorid.MFGDate + "\n" +
                            "Part No : " + amkorid.PARTNO + "\n" +
                                "Vender Lot : " + amkorid.VLOT + "\n" +
                            "Vender Name : " + amkorid.VENDERNAME + "\n" +
                            "QTY : " + amkorid.QTY.ToString(), true);
                    }

                }

                if (amkorid.PARTNO.isEmpty() == false && tbpartno.Text.isEmpty())
                {
                    //해당 mfgdae 가 바코드목록에 잇다면 바로 적용
                    //업다면 적용하고 적용 메세지 표시한다
                    tbpartno.Text = amkorid.PARTNO;
                    bwarn = true;
                    //Pub.log.Add(string.Format("이전결과에서 값 업데이트 sid:{0},PARTNO={1}", sid, amkorid.PARTNO));
                    if (func_existbcddata(amkorid.PARTNO) == false)
                    {
                        AddErrorMessage("PartNo 이전 기록으로 업데이트");
                        Pub.log.Add("'Part No' 값을 이전 기록을 통해서 입력했습니다\n" +
                            "이전 작업시간 : " + ((DateTime)(preData.wdate)).ToString("yyyy-MM-dd HH:mm:ss") + "\n" +
                            "SID : " + preData.SID + "\n" +
                            "MFG Date : " + amkorid.MFGDate + "\n" +
                            "Part No : " + amkorid.PARTNO + "\n" +
                                "Vender Lot : " + amkorid.VLOT + "\n" +
                            "Vender Name : " + amkorid.VENDERNAME + "\n" +
                            "QTY : " + amkorid.QTY.ToString(), true);
                    }

                }

                //Customer
                if (amkorid.RID.Length > 10 && amkorid.RID.Substring(2, 4) != TbCustCode.Text.Trim())
                {
                    //해당 mfgdae 가 바코드목록에 잇다면 바로 적용
                    //업다면 적용하고 적용 메세지 표시한다
                    TbCustCode.Text = amkorid.RID.Substring(2, 4);
                    bwarn = true;
                    //Pub.log.Add(string.Format("이전결과에서 값 업데이트 sid:{0},VLOT={1}", sid, amkorid.VLOT));
                    if (func_existbcddata(TbCustCode.Text) == false)
                    {
                        AddErrorMessage("Customer Code 이전 기록으로 업데이트");
                        Pub.log.Add("'Customer Code' 값을 이전 기록을 통해서 입력했습니다\n" +
                            "이전 작업시간 : " + ((DateTime)(preData.wdate)).ToString("yyyy-MM-dd HH:mm:ss") + "\n" +
                            "SID : " + preData.SID + "\n" +
                            "MFG Date : " + amkorid.MFGDate + "\n" +
                            "Part No : " + amkorid.PARTNO + "\n" +
                            "Vender Lot : " + amkorid.VLOT + "\n" +
                            "Vender Name : " + amkorid.VENDERNAME + "\n" +
                            "QTY : " + amkorid.QTY.ToString(), true);


                    }
                    button6.PerformClick();
                }


                if (amkorid.VLOT.isEmpty() == false && tbVLOT.Text.isEmpty())
                {
                    //해당 mfgdae 가 바코드목록에 잇다면 바로 적용
                    //업다면 적용하고 적용 메세지 표시한다
                    tbVLOT.Text = amkorid.VLOT;
                    bwarn = true;
                    //Pub.log.Add(string.Format("이전결과에서 값 업데이트 sid:{0},VLOT={1}", sid, amkorid.VLOT));
                    if (func_existbcddata(amkorid.VLOT) == false)
                    {
                        AddErrorMessage("VLOT 이전 기록으로 업데이트");
                        Pub.log.Add("'Vender LOT' 값을 이전 기록을 통해서 입력했습니다\n" +
                            "이전 작업시간 : " + ((DateTime)(preData.wdate)).ToString("yyyy-MM-dd HH:mm:ss") + "\n" +
                            "SID : " + preData.SID + "\n" +
                            "MFG Date : " + amkorid.MFGDate + "\n" +
                            "Part No : " + amkorid.PARTNO + "\n" +
                            "Vender Lot : " + amkorid.VLOT + "\n" +
                            "Vender Name : " + amkorid.VENDERNAME + "\n" +
                            "QTY : " + amkorid.QTY.ToString(), true);
                    }

                }

                if (amkorid.VENDERNAME.isEmpty() == false && tbVName.Text.isEmpty())
                {
                    //해당 mfgdae 가 바코드목록에 잇다면 바로 적용
                    //업다면 적용하고 적용 메세지 표시한다
                    tbVName.Text = amkorid.VENDERNAME;
                    bwarn = true;
                    //Pub.log.Add(string.Format("이전결과에서 값 업데이트 sid:{0},VENDERNAME={1}", sid, amkorid.VENDERNAME));
                    if (func_existbcddata(amkorid.VENDERNAME) == false)
                    {
                        AddErrorMessage("VNAME 이전 기록으로 업데이트");
                        Pub.log.Add("'Vender Name' 값을 이전 기록을 통해서 입력했습니다\n" +
                            "이전 작업시간 : " + ((DateTime)(preData.wdate)).ToString("yyyy-MM-dd HH:mm:ss") + "\n" +
                            "SID : " + preData.SID + "\n" +
                            "MFG Date : " + amkorid.MFGDate + "\n" +
                            "Part No : " + amkorid.PARTNO + "\n" +
                            "Vender Lot : " + amkorid.VLOT + "\n" +
                            "Vender Name : " + amkorid.VENDERNAME + "\n" +
                            "QTY : " + amkorid.QTY.ToString(), true);
                    }

                }
            }
            return bwarn;

        }
        /// <summary>
        /// 키엔스 바코드 목록에서 해당 데이터가 있는지 체크합니다
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        Boolean func_existbcddata(string data)
        {
            var lv = lvbcdList.FindItemWithText(data);
            return lv != null;
        }

        private void btReqQty_Click(object sender, EventArgs e)
        {
            var msg = string.Empty;
            var rid = tbRID.Text.Trim();
            if (rid.isEmpty())
            {
                Util.MsgE("Reel ID 가 필요 합니다");
                return;
            }
            if (Pub.setting.OnlineMode == false)
            {
                Util.MsgE("오프라인 모드라 사용할 수 없습니다");
                return;
            }
            var cnt = (Amkor.RestfulService.get_stock_count(rid, out msg));
            if (cnt > 0)
            {
                var oldCnt = int.Parse(tbQTY.Text.Replace(",", ""));
                var newCnt = (int)cnt;
                if (oldCnt == newCnt)
                {
                    //수량이 동일하니 처리하지 않는다
                }
                else
                {
                    //숫자가 달라지면?
                    if (Util.MsgQ(string.Format("수량을 변경하시겠습니까?\n현재:{0}\n서버:{1}", tbQTY.Text, newCnt)) == DialogResult.Yes)
                    {
                        Pub.log.Add($"수량업데이트 {tbQTY.Text}->{newCnt}");
                        tbQTY.Text = newCnt.ToString();
                    }
                }
            }
            else
            {
                Util.MsgE("서버수량 확인 실패\n\n" + msg);
            }
        }

        private void tbSupply_TextChanged(object sender, EventArgs e)
        {

        }


        private void label13_Click(object sender, EventArgs e)
        {
            //라벨위치
            //라벨위치느느 클릭해서 고칠필요 없다
        }


        private void label22_Click(object sender, EventArgs e)
        {
            //부착위치
            var lb = sender as Label;
            PrintPos = lb.Tag.ToString();
            DisplayPrintPos(PrintPos);
        }

        void DisplayPrintPos(string v)
        {
            var lbs = new Label[] { pb7, pb8, pb9, pb4, pb6, pb1, pb2, pb3 };
            foreach (Label item in lbs)
                if (item.Tag.ToString() == v) item.BackColor = Color.Blue;
                else item.BackColor = Color.FromArgb(64, 64, 64);
        }


        //라벨은 여러 위치에서 발견될 수 있다
        void DisplayLabelPos(byte[] labelpos)
        {
            var lbs = new Label[] { lbl1, lbl2, lbl3, lbl4, lbl6, lbl7, lbl8, lbl9 };
            for (int i = 0; i < labelpos.Length; i++)
                lbs[i].BackColor = labelpos[i] > 0 ? Color.Blue : Color.FromArgb(64, 64, 64);
        }

        private void btNewID_Click(object sender, EventArgs e)
        {
            var id = TbCustCode.Text; // string.Empty;
            if (id.Length != 4)
            {
                Util.MsgE($"올바른 고객번호를 입력하세요\n" +
                    $"고객번호는 4자리여야 합니다\n" +
                    $"값 : {id}\n" +
                    $"길이 : {id.Length}");
                return;
            }
            //if (tbRID.Text.Length > 4) id = tbRID.Text.Substring(0, 4);
            var f = new Dialog.fNewReelID(id);
            if (f.ShowDialog() != DialogResult.OK) return;
            this.tbRID.Text = f.NewID;
            if (f.tbCustCode.Text.Trim() != "" && f.tbCustCode.Text.Trim() != this.TbCustCode.Text.Trim())
                this.TbCustCode.Text = f.tbCustCode.Text.Trim();
        }

        private void tbDate_Click(object sender, EventArgs e)
        {
            selectInput(sender as TextBox);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            DateTime dt = DateTime.Now;
            var dtstr = this.tbDate.Text.Trim().Replace("-", "").Replace("/", "");
            if (dtstr.Length == 8)
            {
                dt = new DateTime(
                    int.Parse(dtstr.Substring(0, 4)),
                    int.Parse(dtstr.Substring(4, 2)),
                    int.Parse(dtstr.Substring(6, 2)));
            }

            var f = new Dialog.fSelectDay(dt);
            if (f.ShowDialog() == DialogResult.OK)
            {
                this.tbDate.Text = f.dt.ToShortDateString();
            }
        }

        private void groupBox2_Enter(object sender, EventArgs e)
        {

        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            //클릭하면 입력창을 띄운다
            Util.TouchKeyShow(tbRID, "Input REEL ID");
        }

        private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Util.TouchKeyShow(tbSID, "INPUT SID");
        }

        private void linkLabel3_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Util.TouchKeyShow(tbVLOT, "INPUT VENDER LOT");
        }

        private void linkLabel4_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Util.TouchKeyShow(tbQTY, "INPUT QTY");
        }

        private void linkLabel5_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Util.TouchKeyShow(tbDate, "INPUT MFG DATE");
        }

        private void linkLabel6_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Util.TouchKeyShow(tbVName, "INPUT SUPPLY NAME");
        }

        private void linkLabel7_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            //tbpartno
            Util.TouchKeyShow(tbpartno, "INPUT CUSTOMER PART NO.");
        }

        private void button5_Click(object sender, EventArgs e)
        {
            //파트번호자동입력(sid 를 가지고 테이블에서 찾는다)
            if (tbSID.Text.isEmpty())
            {
                Util.MsgE("SID값이 필요 합니다", true);
                return;
            }
            var sid = tbSID.Text.Trim();
            using (var db = new EEEntities())
            {
                var dr = db.Component_Reel_SIDInfo.Where(t =>
                t.SID == sid).FirstOrDefault();
                if (dr == null)
                {
                    Util.MsgE("해당 SID로 등록된 정보가 없습니다");
                    return;
                }

                //파트번호가 잇어야 한다.
                if (dr.PartNo != null || dr.PartNo.isEmpty())
                {
                    Util.MsgE("해당 SID에 Part No 의 값이 입력되지 않았습니다");
                    return;
                }

                var partno = dr.PartNo.Trim();
                if (tbpartno.Text.isEmpty()) tbpartno.Text = partno;
                else
                {
                    var dlg = Util.MsgQ(string.Format("Part NO 값을 변경 할까요?\n" +
                        "기존 : " + tbpartno.Text + "\n" +
                        "신규 :  " + partno));
                    if (dlg == DialogResult.Yes) tbpartno.Text = dr.PartNo;
                }
            }

        }

        private void button6_Click(object sender, EventArgs e)
        {
            using (var db = new EEEntities())
            {
                ////서플라이코드가 있다면 그 코드값으로 가져온다
                //var custCode = TbCustCode.Text.Trim();
                //if (custCode.isEmpty() == false)
                //{
                //	var drCustCode = db.Component_Reel_SIDConv.Where(t => t.cust == custCode).FirstOrDefault();
                //	if (drCustCode != null && drCustCode.manu.isEmpty() == false)
                //	{
                //		Pub.log.Add(string.Format("서플라이네임을 가져옴 값={0},코드={1}", drCustCode.manu, custCode));
                //		tbVName.Text = drCustCode.manu;
                //		return;
                //	}
                //}

                var sid = tbSID.Text.Trim();
                if (sid.isEmpty())
                {
                    Util.MsgE("SID값이 필요 합니다", true);
                    return;
                }

                var dr = db.Component_Reel_SIDInfo.AsNoTracking().Where(t =>
                t.SID == sid).FirstOrDefault();


                if (dr == null || dr.CustCode.isEmpty())
                {
                    Util.MsgE("해당 SID로 등록된 정보가 없습니다");
                    return;
                }

                //찾은데이터에서 값을 확인한다.
                //Util.MsgI(string.Format("Customer/Vender 정보가 업데이트 되었습니다\n" +
                //		"Customer : {0}\n" +
                //		"Customer Name : {1}\n" +
                //		"Vender Name : {2}", dr.CustCode, dr.CustName, dr.VenderName));

                //벤더네임은 vlot값을 가지고 한다. 210504
                var vlot = this.tbVLOT.Text.Trim();
                if (vlot.isEmpty() == false)
                {
                    var dr2 = db.Component_Reel_Result.AsNoTracking().Where(t => t.VLOT == vlot).OrderByDescending(t => t.wdate).FirstOrDefault();
                    if (dr2 != null)
                    {
                        tbVName.Text = dr2.VNAME;
                    }
                }
                TbCustCode.Text = dr.CustCode;
                tbCustName.Text = dr.CustName;

            }


        }

        private void linkLabel8_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Util.TouchKeyShow(TbCustCode, "INPUT SUPPLY CODE");
        }

        private void button7_Click(object sender, EventArgs e)
        {
            //진수석님 데이터에서 찾아본다.
            var custcode = TbCustCode.Text.Trim();
            var partno = tbpartno.Text.Trim();
            if (partno.isEmpty())
            {
                Util.MsgE("SID 를 찾기 위해서는 다음 정보가 필요 합니다\n" +
                    "1. Part No");
                return;
            }

            //각 상황에 따라 다르다.
            using (var db = new EEEntities())
            {
                var amksid = string.Empty;

                if (custcode.isEmpty() == false && partno.isEmpty() == false)
                {
                    var dr = db.Component_Reel_SIDInfo.Where(t => t.CustCode == custcode && t.PartNo == partno && string.IsNullOrEmpty(t.SID) == false).FirstOrDefault();
                    if (dr != null && dr.SID.isEmpty() == false)
                    {
                        amksid = dr.SID;
                    }
                    else
                    {
                        Util.MsgE("등록된 Customer Code /Part No 에 해당되는 SID를 확인할 수 없습니다\n" +
                            "Customer Code : " + custcode + "\n" +
                            "Part No : " + partno);
                        return;
                    }
                }
                else if (custcode.isEmpty() == false)
                {
                    var drow = db.Component_Reel_SIDInfo.Where(t => t.CustCode == custcode && string.IsNullOrEmpty(t.SID) == false).ToList();
                    if (drow == null || drow.Count < 1)
                    {
                        Util.MsgE("등록된 Customer Code 에 해당되는 SID를 확인할 수 없습니다\nCustomer : " + custcode);
                        return;
                    }
                    var f = new fSelectDataList(drow.Select(t => t.SID).ToArray());
                    if (f.ShowDialog() == DialogResult.OK)
                    {
                        amksid = f.SelectedValue;
                    }
                    else
                    {
                        Util.MsgE("사용자 선택이 취소 되었습니다");
                        return;
                    }
                }
                else if (partno.isEmpty() == false)
                {
                    var drow = db.Component_Reel_SIDInfo.Where(t => t.PartNo == partno && string.IsNullOrEmpty(t.SID) == false).ToList();
                    if (drow == null || drow.Count < 1)
                    {
                        Util.MsgE("등록된 Part No 에 해당되는 SID를 확인할 수 없습니다\n" + "Part No : " + partno);
                        return;
                    }

                    var sidarr = drow.Select(t => t.SID).ToList();
                    var lst = new List<String>();
                    foreach (var item in sidarr)
                    {
                        var m101 = string.Empty;
                        var m103 = item.Trim();
                        var m106 = string.Empty;
                        lst.Add(m101 + ";" + m103 + ";" + m106);
                    }
                    var f = new Dialog.fSelectSID(lst);
                    if (f.ShowDialog() == DialogResult.OK)
                    {
                        var returndata = f.Value.Split(';');
                        amksid = returndata[1].Trim();
                    }
                    else
                    {
                        Util.MsgE("사용자 선택이 취소 되었습니다");
                        return;
                    }
                }

                if (amksid.isEmpty() == false)
                {
                    Pub.log.Add(string.Format("amkor SId찾기  code={0},part={1},sid={2}", custcode, partno, amksid));
                    tbSID.Text = amksid;
                    UpdateSID();
                    makenewId();
                }
                else
                {
                    Pub.log.Add(string.Format("검색된 SID가 없어 sid찾기가 실패 했습니다\n" +
                        "Cust:{0}\n" +
                        "PartNo:{1}", custcode, partno));
                }
            }




        }

        private void button8_Click(object sender, EventArgs e)
        {
            //중복검사
            var rid = tbRID.Text.Trim();
            if (rid.isEmpty())
            {
                Util.MsgE("Reel Id 값이 없습니다");
                return;
            }
            if (Pub.setting.OnlineMode == false)
            {
                Util.MsgE("오프라인 모드라 사용할 수 없습니다");
                return;
            }
            var result = Amkor.RestfulService.get_existed_matl_by_id(rid);
            if (result.Complete == false)
            {
                Util.MsgE(result.Message);
            }
            else
            {
                if (result.Result == true)
                {
                    Util.MsgE($"해당 ID는 중복된 ID 입니다\n값:{rid}");
                    return;
                }
                else
                {
                    Util.MsgI($"해당 ID는 중복되지 않았습니다\n{rid}");
                }
            }

        }

        private void button9_Click(object sender, EventArgs e)
        {
            var f = new Dialog.fSelectCustInfo();
            if (f.ShowDialog() == DialogResult.OK)
            {
                this.tbCustName.Text = f.CustName;
                this.TbCustCode.Text = f.CustCode;
                Pub.log.Add(string.Format("사용자가 Customer 를 직접 선택함 {0}:{1}", tbCustName.Text, TbCustCode.Text));
            }
        }

        Boolean CheckRID()
        {
            var rid = tbRID.Text.Trim();
            if (rid.Length < 10) return false;
            var cut = TbCustCode.Text.Trim();
            if (rid.Substring(2, 4) != cut)
            {
                return false;
            }
            else return true;
        }
        Boolean autoconf = false;
        Boolean warn = false;
        Boolean samesidwarn = false;
        private void btOK_Click(object sender, EventArgs e)
        {
            //manu 목록에 없다면 추가 해준다.
            var manuName = tbVName.Text.Trim().ToLower();
            if (manuName.isEmpty() == false)
            {
                lock (Pub.Result.dsList)
                {
                    if (Pub.Result.dsList.Supply.Where(t => t.TITLE.ToLower() == manuName).Any() == false)
                    {
                        //기존 manu 목록에 없으니 추가한다.
                        var newdr = Pub.Result.dsList.Supply.NewSupplyRow();
                        newdr.TITLE = tbVName.Text.Trim();
                        Pub.Result.dsList.Supply.AddSupplyRow(newdr);
                        Pub.Result.SaveListDB();
                    }
                }
            }

            //회전용데이터가 여러개 있다면 처리하지 않는다.
            if (this.lvbcdList.CheckedItems.Count != 1)
            {
                Pub.AddSystemLog(Application.ProductVersion, "MAIN", $"회전 기준데이터가 {this.lvbcdList.CheckedItems.Count}건 입니다");
                Util.MsgE("회전 기준데이터는 1개만 선택되어야 합니다");
                return;
            }
            if (this.lvbcdList.CheckedItems.Count == 1)
            {
                var bcddata = lvbcdList.CheckedItems[0].SubItems[1].Text;
                lock (Pub.Result.ItemData[1].VisionData.barcodelist)
                {
                    foreach (var item in Pub.Result.ItemData[1].VisionData.barcodelist)
                    {
                        if (item.Data == bcddata)
                        {
                            Pub.log.Add(string.Format("회전 기준 바코드값 {0}", item.Data));
                            item.UserActive = true;
                        }
                        else item.UserActive = false;
                    }
                }
            }

            //마지막에 작업한 데이터와 비교 ?? 220104
            if (tbSID.Text == Pub.Result.LastSIDTo && tbVName.Text != Pub.Result.LastVName)
            {
                Pub.Result.LastVName = tbVName.Text;
                Pub.log.Add($"Vname 값을 저장하여 연속작업시 사용합니다 sid:{tbSID.Text},vname:{tbVName.Text}");
            }

            if (tbSID.Text.isEmpty())
            {
                Util.MsgE("SID 가 입력되지 않았습니다");
                tbSID.Focus();
                return;
            }
            if (tbVLOT.Text.isEmpty())
            {
                Util.MsgE("VLOT 가 입력되지 않았습니다");
                tbVLOT.Focus();
                return;
            }
            if (tbQTY.Text.isEmpty())
            {
                Util.MsgE("QTY 가 입력되지 않았습니다");
                tbQTY.Focus();
                return;
            }
            if (tbDate.Text.isEmpty())
            {
                Util.MsgE("MFG-DATE 가 입력되지 않았습니다");
                tbDate.Focus();
                return;
            }
            if (tbRID.Text.isEmpty())
            {
                Util.MsgE("REEL ID 가 입력되지 않았습니다");
                tbRID.Focus();
                return;
            }

            //파트넘버 필수로 필요한 - 최준호s
            if (this.tbpartno.Text.isEmpty())
            {
                Util.MsgE("PART No 가 입력되지 않았습니다");
                tbpartno.Focus();
                return;
            }
            if (this.PrintPos.isEmpty())
            {
                Util.MsgE("프린트 부착 위치가 지정되지 않았습니다");
                return;
            }

            if (Pub.Result.Option_vname && this.tbVName.Text.isEmpty())
            {
                Util.MsgE("Vender Name 이 입력되지 않았습니다");
                return;
            }

            //현재 작업모드와 SID가 일치하는지 확인한다.
            var sidNew = this.tbSID.Text.Trim();
            var sidOld = this.lbSID0.Text.Trim();//.Tag == null ? string.Empty : lbSID0.Text;


            if (Pub.Result.Option_NewReelID && tbRID.Text.Length != 15)
            {
                Util.MsgE("신규 릴ID 생성모드 입니다.\n현재 릴ID는 15자리 가 아닙니다.\n릴ID를 확인하세요.");
                return;
            }

            if (CheckRID() == false)
            {
                Pub.AddSystemLog(Application.ProductVersion, "MAIN", $"Reel ID 의 Customer Code 값이 현재 값과 일치하지 않습니다(RID:{tbRID.Text}/CUST:{TbCustCode.Text})");
                Util.MsgE("Reel ID 의 Customer Code 값이 현재 값과 일치하지 않습니다");
                return;
            }



            //SID별 부착위치를 결정시켜준다 - 210202
            try
            {
                if (Pub.setting.OnlineMode)
                {
                    using (var db = new EEEntities())
                    {
                        var drPrnPos = db.Component_Reel_SIDInfo.Where(t => t.SID == sidNew).FirstOrDefault();
                        if (drPrnPos == null)
                        {
                            var newdrpos = new Component_Reel_SIDInfo()
                            {
                                SID = sidNew,
                                PrintPosition = this.PrintPos,
                                Remark = string.Empty
                            };
                            db.Component_Reel_SIDInfo.Add(newdrpos);
                            db.SaveChanges();
                            Pub.log.Add(string.Format("SId별 프린트 위치 정보 추가 sid:{0},위치:{1}", tbSID.Text, this.PrintPos));


                        }
                        else if (drPrnPos.PrintPosition != this.PrintPos)
                        {
                            //기존에있는경우 내용이 다르면 업데이트한다
                            drPrnPos.PrintPosition = this.PrintPos;
                            db.SaveChanges();
                            Pub.log.Add(string.Format("SId별 프린트 위치 정보 추가 sid:{0},위치:{1}", tbSID.Text, this.PrintPos));
                        }
                    }
                }



            }
            catch (Exception ex)
            {
                Pub.log.AddE(string.Format("sid별 프린트 위치 정보 추가 실패 sid:{0},메세지:{1}", tbSID.Text, ex.Message));
            }

            //sid lot 이름 검증
            //var sid = this.tbSID.Text.Trim();
            var lot = this.tbVLOT.Text.Trim();
            if (warn == false && autoconf == true)
            {
                if (Pub.setting.OnlineMode)
                    using (var db = new EEEntities())
                    {
                        var predata = db.Component_Reel_Result.AsNoTracking().Where(t => t.SID == sidNew).OrderByDescending(t => t.wdate).FirstOrDefault();
                        if (predata != null && predata.VLOT != lot)
                        {
                            Util.MsgE("이전 LOT 값이 일치 하지 않습니다. 자동 확인이 취소 됩니다");
                            warn = true;
                            return;
                        }
                    }
            }


            //변환테이블의 데이터를 확인하고 업데이트한다.
            if (Pub.setting.OnlineMode)
                using (var db = new EEEntities())
                {

                    //파트번호 업데이트
                    bool dataUpdate = false;
                    var drsidInfo = db.Component_Reel_SIDInfo.Where(t => t.SID == sidNew).FirstOrDefault();
                    if (drsidInfo.PartNo.isEmpty() && tbpartno.Text.isEmpty() == false &&
                        drsidInfo.PartNo != tbpartno.Text)
                    {
                        if (Util.MsgQ("다음 SID의 PART NO를 기록할까요?\n기록을 진행하면 이후 작업에는 묻지 않고 진행 됩니다\n" +
                            "SID:" + sidNew + "\nPARTNO:" + tbpartno.Text) == DialogResult.Yes)
                        {
                            drsidInfo.PartNo = this.tbpartno.Text.Trim();
                            dataUpdate = true;
                        }
                    }
                    if (drsidInfo.CustCode.isEmpty() && TbCustCode.Text.isEmpty() == false &&
                        drsidInfo.CustCode != TbCustCode.Text)
                    {
                        if (Util.MsgQ("다음 SID의 Customer Code 를 기록할까요?\n기록을 진행하면 이후 작업에는 묻지 않고 진행 됩니다\n" +
                            "SID:" + sidNew + "\n" + "CUST:" + TbCustCode.Text) == DialogResult.Yes)
                        {
                            drsidInfo.CustCode = this.TbCustCode.Text.Trim();
                            dataUpdate = true;
                        }
                    }

                    //커스터머이름도 저장한다. 220108
                    if (drsidInfo.CustName.isEmpty() && tbCustName.Text.isEmpty() == false && drsidInfo.CustName != tbCustName.Text)
                    {
                        if (Util.MsgQ("다음 SID의 Customer Name 을 기록할까요?\n기록을 진행하면 이후 작업에는 묻지 않고 진행 됩니다\n" +
            "SID:" + sidNew + "\n" + "Cust Name:" + tbCustName.Text) == DialogResult.Yes)
                        {
                            drsidInfo.CustName = this.tbCustName.Text.Trim();
                            dataUpdate = true;
                        }
                    }

                    //SID변환테이블 -220104
                    if (Pub.Result.JobType2 == "13" && sidOld != sidNew && sidOld.isEmpty() == false && sidNew.isEmpty() == false)
                    {
                        var drConvData = db.Component_Reel_SIDConv.Where(t => t.SIDFrom == sidOld && t.SIDTo == sidNew).Any();
                        if (drConvData == false)
                        {
                            if (Util.MsgQ("다음 변환된 SID 정보를 저장할까요?\n기록을 진행하면 이후 작업에는 묻지 않고 진행 됩니다\n" +
                                                "SID 원본 :" + sidOld + "\n" + "SID 대상:" + sidNew) == DialogResult.Yes)
                            {
                                //자료가 없다면 추가하고 
                                //var olist = db.Component_Reel_SIDConv.Where(t => t.M101 == lbSID0.Text).ToList();
                                //if (olist.Count < 1)
                                //{
                                try
                                {
                                    var newdr = new Component_Reel_SIDConv();
                                    newdr.SIDFrom = sidOld;
                                    newdr.SIDTo = sidNew;
                                    newdr.Remark = "Auto Gen";
                                    //newdr.M106 = string.Empty;
                                    //newdr.M108 = string.Empty;
                                    db.Component_Reel_SIDConv.Add(newdr);
                                    db.SaveChanges();
                                }
                                catch (Exception ex)
                                {
                                    Util.MsgE("SID변환 정보를 서버에 저장하지 못했습니다");
                                    Pub.log.Add("sid변환정보 저장 실패 : " + ex.Message);
                                }

                                //}
                                //else
                                //{
                                //    //있긴이삳.
                                //    foreach (var item in olist)
                                //        item.M103 = sid;
                                //    db.SaveChanges();
                                //}
                                //있다면 업데이트 해준다.
                            }
                        }
                    }

                    //벤더는 SID에 종속되지 않는다
                    //if (drConv.VenderName.isEmpty() && tbVName.Text.isEmpty() == false && drConv.VenderName != tbVName.Text)
                    //{
                    //	if (Util.MsgQ("다음 SID의 Vender Name 를 기록할까요? 기록을 진행하면 이후 작업에는 묻지 않고 진행 됩니다") == DialogResult.Yes)
                    //	{
                    //		drConv.VenderName = this.tbVName.Text.Trim();
                    //		dataUpdate = true;
                    //	}
                    //}
                    if (dataUpdate)
                    {
                        Pub.log.Add("Customer / Partno 의 SId연결 정보를 업데이트 합니다");
                        db.SaveChanges();
                    }
                }



            //값을 설정해주고 빠져나간다

            Pub.Result.ItemData[1].VisionData.SID = tbSID.Text.Trim();
            Pub.Result.ItemData[1].VisionData.SID0 = lbSID0.Text.Trim();
            Pub.Result.ItemData[1].VisionData.VLOT = tbVLOT.Text.Trim();
            Pub.Result.ItemData[1].VisionData.QTY = tbQTY.Text.Trim();
            Pub.Result.ItemData[1].VisionData.MFGDATE = tbDate.Text.Trim();
            Pub.Result.ItemData[1].VisionData.VNAME = tbVName.Text.Trim();
            Pub.Result.ItemData[1].VisionData.SetRID(tbRID.Text.Trim(), "USER CONFIRM");//.RID = tbRID.Text.Trim();

            if (tbRID.Tag == null || tbRID.Text.isEmpty()) Pub.Result.ItemData[1].VisionData.RID0 = string.Empty;
            else Pub.Result.ItemData[1].VisionData.RID0 = tbRID.Text.Trim();// tbRID.Tag.ToString(); //210429

            Pub.Result.ItemData[1].VisionData.PARTNO = tbpartno.Text.Trim();

            if (this.autoconf) Pub.Result.ItemData[1].VisionData.ConfirmAuto = true;
            Pub.Result.ItemData[1].VisionData.ConfirmUser = true;   //사용자가확인했다!

            Pub.Result.ItemData[1].VisionData.PrintPositionData = this.PrintPos;
            Pub.Result.ItemData[1].VisionData.PrintPositionCheck = true; //사용자가 확인했다.

            this.DisplayLabelPos(Pub.Result.ItemData[1].VisionData.LabelPositionData);

            this.PrintPos = Pub.Result.ItemData[1].VisionData.PrintPositionData;
            this.DisplayPrintPos(Pub.Result.ItemData[1].VisionData.PrintPositionData);

            this.Close();
        }

        private void label26_Click(object sender, EventArgs e)
        {
            var sid = this.tbSID.Text.Trim();
            if (sid.isEmpty()) return;

            var dlg = Util.MsgQ("SID 에서 인쇄 위치를 검색 할까요?");
            if (dlg != DialogResult.Yes) return;

            using (var db = new EEEntities())
            {
                var dr = db.Component_Reel_SIDInfo.Where(t => t.SID == sid).FirstOrDefault();
                if (dr == null || dr.PrintPosition.isEmpty())
                {
                    Util.MsgE("입력된 SID에 저장된 인쇄 위치가 없습니다\n" +
                        "SID:" + sid);
                    return;
                }
                this.PrintPos = dr.PrintPosition;
                DisplayPrintPos(this.PrintPos);
            }
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            //데이터베이스 결과에서 자료를 추가한다.

            List<Component_Reel_Result> result = new List<Component_Reel_Result>();

            using (var db = new EEEntities())
            {
                //1.sid sid를 먼저 검색한다. 이것이 확률이 제일 높음
                if (this.tbSID.Text.isEmpty() == false)
                {
                    var list = db.Component_Reel_Result.AsNoTracking().
                        OrderByDescending(t => t.wdate).
                        Where(t => t.SID == tbSID.Text.Trim()).Take(5).ToList();
                    if (list != null && list.Count > 0) result.AddRange(list);
                }
                //2.파트번호
                if (result.Count == 0 && this.tbpartno.Text.isEmpty() == false)
                {
                    var list = db.Component_Reel_Result.AsNoTracking().
                        OrderByDescending(t => t.wdate).
                        Where(t => t.QR.Contains(";" + tbpartno.Text)).Take(5).ToList();
                    if (list != null && list.Count > 0) result.AddRange(list);
                }
                //3.벤더LOT
                if (result.Count == 0 && this.tbVLOT.Text.isEmpty() == false)
                {
                    var list = db.Component_Reel_Result.AsNoTracking().
                        OrderByDescending(t => t.wdate).
                        Where(t => t.QR.Contains(";" + tbVLOT.Text + ";")).Take(5).ToList();
                    if (list != null && list.Count > 0) result.AddRange(list);
                }

                //4.벤더이름
                if (result.Count == 0 && this.tbVName.Text.isEmpty() == false)
                {
                    var list = db.Component_Reel_Result.AsNoTracking().
                        OrderByDescending(t => t.wdate).
                        Where(t => t.QR.Contains(";" + tbVName.Text + ";")).Take(5).ToList();
                    if (list != null && list.Count > 0) result.AddRange(list);
                }

            }

            //customer code

            if (result.Count < 1)
            {
                Util.MsgE("검색된 결과가 없습니다\n검색 아이템\n" +
                    "1.SID\n" +
                    "2.LOT\n" +
                    "3.PARTNO\n");
                return;
            }
            var f = new fSelectResult(result);
            if (f.ShowDialog() != DialogResult.OK) return;

            //값이 없는 것만 처리한다.
            string msg = string.Empty;
            var qr = f.SelectedValue.QR;
            var amk = new StdLabelPrint.CAmkorSTDBarcode(qr);
            if (this.tbSID.Text.isEmpty() && amk.SID.isEmpty() == false)
            {
                msg += (msg.isEmpty() ? "" : "\n") + string.Format("SID:{0}=>{1}", tbSID.Text, amk.SID);
                tbSID.Text = amk.SID;
            }
            if (this.tbpartno.Text.isEmpty() && amk.PARTNO.isEmpty() == false)
            {
                msg += (msg.isEmpty() ? "" : "\n") + string.Format("Part No:{0}=>{1}", tbpartno.Text, amk.PARTNO);
                tbpartno.Text = amk.PARTNO;
            }
            if (this.tbVLOT.Text.isEmpty() && amk.VLOT.isEmpty() == false)
            {
                msg += (msg.isEmpty() ? "" : "\n") + string.Format("Vender LOT:{0}=>{1}", tbVLOT.Text, amk.VLOT);
                tbVLOT.Text = amk.VLOT;
            }
            if (this.tbVName.Text.isEmpty() && f.SelectedValue.VNAME.isEmpty() == false)
            {
                msg += (msg.isEmpty() ? "" : "\n") + string.Format("Vender Name:{0}=>{1}", tbVName.Text, f.SelectedValue.VNAME);
                tbVName.Text = f.SelectedValue.VNAME;
            }
            if (this.tbDate.Text.isEmpty() && amk.MFGDate.isEmpty() == false)
            {
                msg += (msg.isEmpty() ? "" : "\n") + string.Format("MFG Date:{0}=>{1}", tbDate.Text, amk.MFGDate);
                tbDate.Text = amk.MFGDate;
            }

            if (Pub.Result.Option_QtyUpdateM == false && this.tbQTY.Text.isEmpty() && amk.QTY != 0)
            {
                msg += (msg.isEmpty() ? "" : "\n") + string.Format("QTY:{0}=>{1}", tbQTY.Text, amk.QTY);

                Pub.log.Add($"수량업데이트 {tbQTY.Text}->{amk.QTY}");
                tbQTY.Text = amk.QTY.ToString();
            }


            var custcode = amk.RID.Substring(2, 4);
            if (this.TbCustCode.Text.isEmpty() && custcode.isEmpty() == false)
            {
                msg += (msg.isEmpty() ? "" : "\n") + string.Format("QTY:{0}=>{1}", TbCustCode.Text, custcode);
                TbCustCode.Text = custcode;// amk.QTY.ToString();
            }

            if (msg.isEmpty() == false)
            {
                Util.MsgI("다음 정보가 변경 되었습니다\n" + msg, true);
            }
        }

        private void label2_Click_1(object sender, EventArgs e)
        {
            var sid = this.tbSID.Text.Trim();
            if (sid.isEmpty()) return;



            using (var db = new EEEntities())
            {
                var dr = db.Component_Reel_SIDInfo.Where(t => t.SID == sid).FirstOrDefault();
                if (dr == null || dr.PrintPosition.isEmpty())
                {
                    Util.MsgE("입력된 SID에 저장된 인쇄 위치가 없습니다\n" +
                        "SID:" + sid);
                    return;
                }
                this.PrintPos = dr.PrintPosition;
            }

            DisplayPrintPos(this.PrintPos);
        }

        private void button3_Click_1(object sender, EventArgs e)
        {
            var sid = this.tbSID.Text.Trim();
            if (sid.isEmpty())
            {
                Util.MsgE("SID 값이 필요합니다");
                return;
            }
            func_CheckDateQty();
        }

        DateTime stime = DateTime.Now;
        private void tmAutoConfirm_Tick(object sender, EventArgs e)
        {
            var ts = DateTime.Now - stime;
            btOK.Text = string.Format("{0:N0}/{1:N0} 초후 자동 완료", ts.TotalSeconds, Pub.setting.Timeout_AutoConfirm);
            if (ts.TotalSeconds >= Pub.setting.Timeout_AutoConfirm)
            {
                tmAutoConfirm.Stop();
                autoconf = true;
                btOK.PerformClick();
            }
        }

        private void 회전기준바코드로설정ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (lvbcdList.FocusedItem == null)
            {
                Util.MsgE("포커스를 받은 항목이 없습니다");
                return;
            }
            var dataindex = lvbcdList.FocusedItem.Index;
            foreach (ListViewItem item in this.lvbcdList.Items)
            {
                if (item.Index == dataindex) item.Checked = true;
                else item.Checked = false;
            }
        }

        private void button4_Click_1(object sender, EventArgs e)
        {
            if (tbpartno.Text.isEmpty()) tbpartno.Text = "N/A";
            else
            {
                var dlg = Util.MsgQ("현재 Part No 값을 N/A로 변경 할까요?");
                if (dlg == DialogResult.Yes) tbpartno.Text = "N/A";
            }
        }

        private void linkLabel9_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Util.TouchKeyShow(this.tbCustName, "INPUT CUST NAME");
        }

        private void button5_Click_1(object sender, EventArgs e)
        {
            var a = 1;
            var b = 0;
            var c = a / b;

        }
    }
}
