using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using AMESCoreStudio.WebApi;
using AMESCoreStudio.WebApi.Models.SYS;
using AMESCoreStudio.WebApi.Models.AMES;
using AMESCoreStudio.WebApi.Models.BAS;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Query.SqlExpressions;
using System.Reflection;

namespace AMESCoreStudio.WebApi
{
    /// <summary>
    /// 
    /// </summary>
    public class AMESContext : DbContext
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="options"></param>
        public AMESContext(DbContextOptions<AMESContext> options)
            : base(options)
        {
            //Configuration.ProxyCreationEnabled = false;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="datePartArg"></param>
        /// <param name="date"></param>
        /// <returns></returns>
        public int? DatePart(string datePartArg, DateTimeOffset? date) => throw new InvalidOperationException($"{nameof(DatePart)} cannot be called client side.");


        /// <summary>
        /// 
        /// </summary>
        /// <param name="modelBuilder"></param>
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            var methodInfo = typeof(DbFunctionExtensions).GetMethod(nameof(DatePart));

            var datePartMethodInfo = typeof(AMESContext)
                .GetRuntimeMethod(nameof(AMESContext.DatePart), new[] { typeof(string), typeof(DateTimeOffset) });
            modelBuilder.HasDbFunction(datePartMethodInfo)
               .HasTranslation(args =>
                        new SqlFunctionExpression("DatePart",
                            new[]
                            {
                            new SqlFragmentExpression((args.ToArray()[0] as SqlConstantExpression).Value.ToString()),
                            args.ToArray()[1]
                            },
                            true,
                            new[] { false, false },
                            typeof(int?),
                            null
                        )
                    );

            /*
            modelBuilder.Entity<RoleModule>()
                .HasOne(m => m.Module);
            */

            modelBuilder.Entity<Rules>().HasKey(c => new { c.RuleID });
            modelBuilder.Entity<WipBarcode>().HasKey(c => new { c.WipNO, c.StartNO, c.EndNO });
            modelBuilder.Entity<WipLog>().HasKey(c => new { c.WipID, c.CreateDate });
            modelBuilder.Entity<PartMap>().HasKey(c => new { c.CorpSN });
            modelBuilder.Entity<BarcodeWip>().HasKey(c => new { c.WipID, c.BarcodeID });
            modelBuilder.Entity<BarcodeStation>().HasKey(c => new { c.BarcodeID ,c.WipID, c.StationID ,c.RuleStatus ,c.InputDate,c.FlowRuleID });

            modelBuilder.Entity<WipRule>().HasKey(c => new { c.WipNO, c.StationID, c.KeyNo });
            modelBuilder.Entity<WipMAC>().HasKey(c => new { c.WipNO, c.StartNO, c.EndNO });
            modelBuilder.Entity<WipInfoBlob>().HasKey(c => new { c.WipBlobID, c.WipNo });
            modelBuilder.Entity<BarcodeItem>().HasOne(r => r.B).WithMany().HasForeignKey(r => r.BarcodeID).IsRequired();
            modelBuilder.Entity<BarcodeItem>().HasOne(r => r.I).WithMany().HasForeignKey(r => r.ItemNo).IsRequired();
            modelBuilder.Entity<BarcodeItem>().HasOne(r => r.S).WithMany().HasForeignKey(r => r.StationID).IsRequired();
            modelBuilder.Entity<WorkClass>().HasOne(r => r.Group).WithMany().HasForeignKey(r => r.GroupID).IsRequired();
            modelBuilder.Entity<ListObj>().HasKey(c => new { c.value, c.name });

            modelBuilder.Entity<CycleTime>().HasKey(c => new { c.ItemNo, c.LineID });
            modelBuilder.Entity<CycleTime>().HasOne(r => r.Unit).WithMany().HasForeignKey(r => r.SectionNo).IsRequired();
            modelBuilder.Entity<CycleTime>().HasOne(r => r.Line).WithMany().HasForeignKey(r => r.LineID).IsRequired();

            modelBuilder.Entity<AMESCoreStudio.WebApi.Models.BAS.ClassInfo>().HasOne(r => r.Unit).WithMany().HasForeignKey(r => r.UnitNo).IsRequired();
            modelBuilder.Entity<AMESCoreStudio.WebApi.Models.BAS.LineInfo>().HasOne(r => r.Unit).WithMany().HasForeignKey(r => r.UnitNo).IsRequired();
            modelBuilder.Entity<AMESCoreStudio.WebApi.Models.BAS.LineInfo>().HasOne(r => r.Dept).WithMany().HasForeignKey(r => r.DeptID).IsRequired();
            modelBuilder.Entity<AMESCoreStudio.WebApi.Models.BAS.Stations>().HasOne(r => r.Unit).WithMany().HasForeignKey(r => r.UnitNo).IsRequired();

            modelBuilder.Entity<MACInfo>().HasKey(c => new { c.Class, c.ClassGroup });

            modelBuilder.Entity<RoleModule>().HasOne(r => r.Module).WithMany().HasForeignKey(r => r.ModuleID).IsRequired();

            modelBuilder.Entity<StandardWorkTime>().HasOne(r => r.Stations).WithMany().HasForeignKey(r => r.StationID).IsRequired();
            modelBuilder.Entity<StandardWorkTime>().HasOne(r => r.LineInfo).WithMany().HasForeignKey(r => r.LineID).IsRequired();

            modelBuilder.Entity<UserInfo>().HasKey(c => new { c.UserNo});
            modelBuilder.Entity<WorkManPower>().HasOne(r => r.U).WithMany().HasForeignKey(r => r.UserNo).IsRequired();
            //modelBuilder.Entity<WorkManPower>().HasOne(r => r.DeptInfo).WithMany().HasForeignKey(r => r.UserNo).IsRequired();

            // modelBuilder.Entity<MaterialFlow>().HasKey(c => new { c.ItemID,c.FlowRuleID,c.UnitNo});
            // modelBuilder.Entity<MaterialFlow>().HasKey(c => new { c.ItemID, c.FlowSEQ, c.UnitNo });
            //modelBuilder.Entity<MaterialFlow>().HasKey(c => new { c.ItemID });
            modelBuilder.Entity<MaterialFlow>().HasOne(r => r.MaterialItem).WithMany().HasForeignKey(r => r.ItemID).IsRequired();
            modelBuilder.Entity<MaterialFlow>().HasOne(r => r.FlowRule).WithMany().HasForeignKey(r => r.FlowRuleID).IsRequired();
            modelBuilder.Entity<RuninTime>().HasKey(c => new { c.ItemNo });

            //modelBuilder.Entity<BarcodeWip>().HasKey(c => new { c.WipID, c.BarcodeID });
            modelBuilder.Entity<BarcodeGroup>().HasKey(c => new { c.GroupID, c.BarcodeID });

            modelBuilder.Entity<FqcInhouseMaster>().HasKey(c => new { c.InhouseNo, c.SeqID });
            modelBuilder.Entity<FqcInhouseDetail>().HasKey(c => new { c.InhouseNo, c.SeqID , c.SerialNo });
            modelBuilder.Entity<FqcResultDetail>().HasKey(c => new { c.FqcID, c.BoxNo ,c.BarcodeNo });
            modelBuilder.Entity<FqcBarcode>().HasKey(c => new { c.FqcID, c.BarcodeID });
            modelBuilder.Entity<FqcItem>().HasKey(c => new { c.FqcID, c.ItemID });
            modelBuilder.Entity<FqcResultMasterBlob>().HasKey(e => new { e.FqcID, e.CreateDate });
            modelBuilder.Entity<NgInfo>().HasOne(r => r.Barcode).WithMany().HasForeignKey(r => r.BarcodeID).IsRequired();
            modelBuilder.Entity<NgInfo>().HasOne(r => r.Wip).WithMany().HasForeignKey(r => r.WipId).IsRequired();
            modelBuilder.Entity<NgInfo>().HasOne(r => r.Station).WithMany().HasForeignKey(r => r.StationId).IsRequired();
            //modelBuilder.Entity<NgInfo>().HasOne(r => r.User).WithMany().HasForeignKey(r => r.OperatorID).IsRequired();

            modelBuilder.Entity<WipStation>().HasKey(c => new { c.WipID, c.StationID, c.RuleStatus, c.CreateDate});
            modelBuilder.Entity<WipClass>().HasKey(c => new { c.WipID, c.StationID, c.RuleStatus, c.ClassID, c.CreateDate });
            modelBuilder.Entity<WipTime>().HasKey(c => new { c.WipID, c.StationID, c.RuleStatus, c.SegmentID, c.CreateDate });

            //Yiru add  ---------------------------------------------------------------------------------------------------------------------------
            modelBuilder.Entity<WareHouseing>().HasKey(c => new { c.InhouseNo, c.SeqID, c.SerialNo });
            modelBuilder.Entity<OutfitFactoryInfo>().HasKey(c => new { c.OutfitFactoryID });
            modelBuilder.Entity<OutfitInfoBlob>().HasKey(c => new { c.OutfitID });
	     	modelBuilder.Entity<RLabelReprint>().HasKey(c => new { c.SerialNumber,c.ReprintTime});
            modelBuilder.Entity<CZmomaterialList>().HasNoKey();
	    	modelBuilder.Entity<SerialRuleDetail>().HasKey(c => new { c.SerialRuleDetailID });
            modelBuilder.Entity<ExceptionWorktimeBlob>().HasKey(c => new { c.ExceptionWorktimeID, c.CreateDate });
            //Yiru End  ---------------------------------------------------------------------------------------------------------------------------


            modelBuilder.Entity<InspectionResultBlob>().HasKey(c => new { c.InspectionItemID, c.InspectionID,c.CreateDate });

            modelBuilder.Entity<InspectionResultDetail>().HasKey(c => new { c.InspectionItemID, c.InspectionID });


            modelBuilder.Entity<InspectionResultDetail>().HasOne(r => r.Stations).WithMany().HasForeignKey(r => r.RuleStationID).IsRequired();
            modelBuilder.Entity<InspectionResultDetail>().HasOne(r => r.LineInfo).WithMany().HasForeignKey(r => r.LineID).IsRequired();
            //modelBuilder.Entity<InspectionResultDetail>().HasOne(r => r.FactoryUnit).WithMany().HasForeignKey(r => r.MissingUnitNo).IsRequired();
            //modelBuilder.Entity<InspectionResultDetail>().HasOne(r => r.User).WithMany().HasForeignKey(r => r.MissingUserID).IsRequired();
            modelBuilder.Entity<InspectionResultDetail>().HasOne(r => r.InspectionItem).WithMany().HasForeignKey(r => r.InspectionItemID).IsRequired();
            modelBuilder.Entity<InspectionForm>().HasOne(r => r.FactoryUnit).WithMany().HasForeignKey(r => r.UnitNo).IsRequired();

            modelBuilder.Entity<SNKeyPart>().HasKey(c => new { c.StockInNo, c.KPItem });
            modelBuilder.Entity<NGReason>().HasKey(c => new { c.NGClassNo, c.NGReasonNo });
        }

        /// <summary>
        /// 
        /// </summary>
        public DbSet<IDKey> IDKeys { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public DbSet<AuthInfo> AuthInfo { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public DbSet<SystemInfo> SystemInfoes { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public DbSet<ModuleInfo> ModuleInfoes { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public DbSet<ProgramInfo> ProgramInfoes { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public DbSet<RoleInfo> RoleInfoes { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public DbSet<UserInfo> UserInfoes { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public DbSet<DeptInfo> DeptInfoes { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public DbSet<RoleModule> RoleModules { get; set; }

       
        /// <summary>
        /// 
        /// </summary>
        public DbSet<RoleProgram> RolePrograms { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public DbSet<UserRole> UserRoles { get; set; }

        //#region AMES Table BAS
        /// <summary>
        /// 工廠
        /// </summary>
        public DbSet<AMESCoreStudio.WebApi.Models.BAS.FactoryInfo> FactoryInfos { get; set; }

        /// <summary>
        /// 單位
        /// </summary>
        public DbSet<AMESCoreStudio.WebApi.Models.BAS.FactoryUnit> FactoryUnits { get; set; }

        /// <summary>ClassInfo
        /// 線別
        /// </summary>
        public DbSet<AMESCoreStudio.WebApi.Models.BAS.LineInfo> LineInfoes { get; set; }

        /// <summary>
        /// 班别資料
        /// </summary>
        public DbSet<AMESCoreStudio.WebApi.Models.BAS.ClassInfo> ClassInfoes { get; set; }

        /// <summary>TIME_SEGMENT
        /// 生產時段
        /// </summary>
        public DbSet<AMESCoreStudio.WebApi.Models.BAS.TimeSegment> TimeSegments { get; set; }

        /// <summary>
        /// 工作臺類別
        /// </summary>
        public DbSet<AMESCoreStudio.WebApi.Models.BAS.StationType> StationTypes { get; set; }

        /// <summary>
        /// 工作臺
        /// </summary>
        public DbSet<AMESCoreStudio.WebApi.Models.BAS.Stations> Stationses { get; set; }

        /// <summary>
        /// 責任單位資料
        /// </summary>
        public DbSet<AMESCoreStudio.WebApi.Models.BAS.RepairResponsibleUnits> RepairResponsibleUnitses { get; set; }

        /// <summary>
        /// 郵件群组類别
        /// </summary>
        public DbSet<AMESCoreStudio.WebApi.Models.BAS.MailGroup> MailGroups { get; set; }

        /// <summary>
        /// 郵件群组資料
        /// </summary>
        public DbSet<AMESCoreStudio.WebApi.Models.BAS.MailGroupDetail> MailGroupDetails { get; set; }

        /// <summary>
        /// 測試代號
        /// </summary>
        public DbSet<AMESCoreStudio.WebApi.Models.BAS.TestType> TestTypes { get; set; }

        /// <summary>
        /// List
        /// </summary>
        public DbSet<AMESCoreStudio.WebApi.Models.BAS.ListObj> ListObjs { get; set; }

        /////////////////////////*****/////////////////////////////////////////////////////////

        /// <summary>
        /// 正背面
        /// </summary>
        public DbSet<AMESCoreStudio.WebApi.Models.AMES.MFGType> MFGTypes { get; set; }

        /// <summary>
        /// 工單性質
        /// </summary>
        public DbSet<AMESCoreStudio.WebApi.Models.AMES.ProcessType> ProcessTypes { get; set; }

        /// <summary>
        /// 產品別
        /// </summary>
        public DbSet<AMESCoreStudio.WebApi.Models.AMES.ProductType> ProductTypes { get; set; }

        /// <summary>
        /// 工單機種資料
        /// </summary>
        public DbSet<AMESCoreStudio.WebApi.Models.AMES.WipAtt> WipAtts { get; set; }

        /// <summary>
        /// 工單基本資料文件
        /// </summary>
        public virtual DbSet<WipInfo> WipInfos { get; set; }


        /// <summary>
        /// 流程資料
        /// </summary>
        public DbSet<FlowRule> FlowRules { get; set; }

        /// <summary>
        /// 流程站別資料
        /// </summary>
        public DbSet<RuleStation> RuleStations { get; set; }

        /// <summary>
        /// 流程規則資料
        /// </summary>
        public DbSet<Rules> Ruleses { get; set; }

        /// <summary>
        /// 條碼狀態資料
        /// </summary>
        public DbSet<BarcodeStatus> BarcodeStatus { get; set; }

        /// <summary>
        /// 異常群組資料
        /// </summary>
        public DbSet<ErrorGroup> ErrorGroups { get; set; }

        /// <summary>
        /// 異常類別資料
        /// </summary>
        public DbSet<ErrorClass> ErrorClasses { get; set; }

        /// <summary>
        /// 工單狀態資料
        /// </summary>
        public DbSet<WipStatus> WipStatus { get; set; }

        /// <summary>
        /// 工單鎖定資料檔
        /// </summary>
        public DbSet<WipLock> WipLocks { get; set; }

        /// <summary>
        /// 工單條碼起迄資料檔
        /// </summary>
        public DbSet<WipBarcode> WipBarcodes { get; set; }

        /// <summary>
        /// 異常原因資料
        /// </summary>
        public DbSet<ErrorReason> ErrorReasons { get; set; }

        /// <summary>
        /// 工單投產纪錄資料文件
        /// </summary>
        public DbSet<WipLog> WipLogs { get; set; }


        /// <summary>
        /// 工單投產纪錄資料文件
        /// </summary>
        public DbSet<NGGroup> NGGroups { get; set; }

        /// <summary>
        /// 工單投產纪錄資料文件
        /// </summary>
        public DbSet<NGClass> NGClasses { get; set; }

        /// <summary>
        /// 維修群組資料
        /// </summary>
        public DbSet<RMAGroup> RMAGroups { get; set; }

        /// <summary>
        /// 維修類別資料
        /// </summary>
        public DbSet<RMAClass> RMAClasses { get; set; }

        /// <summary>
        /// 維修原因資料
        /// </summary>
        public DbSet<RMAReason> RMAReasons { get; set; }

        /// <summary>
        /// 機種C/T資料
        /// </summary>
        public DbSet<CycleTime> CycleTimes { get; set; }

        /// <summary>
        /// 不良現象原因代碼資料
        /// </summary>
        public DbSet<NGReason> NGReasons { get; set; }

        /// <summary>
        /// 問題類別資料
        /// </summary>
        public DbSet<QAType> QATypes { get; set; }

        /// <summary>
        /// 維修方式資料
        /// </summary>
        public DbSet<RepairType> RepairTypes { get; set; }

        /// <summary>
        /// 組件類別資料
        /// </summary>
        public DbSet<RepairItem> RepairItems { get; set; }

        /// <summary>
        /// 序號料號資料
        /// </summary>
        public DbSet<PartMap> PartMaps { get; set; }

        /// <summary>
        /// 組件料號序號資料
        /// </summary>
        public DbSet<KPLink> KPLinks { get; set; }

        /// <summary>
        /// 組件類別資料
        /// </summary>
        public virtual DbSet<Items> Items { get; set; }

  		/// <summary>
        /// MAC資料
        /// </summary>
        public DbSet<MACInfo> MACInfoes { get; set; }

        /// <summary>
        /// SOP文件維護
        /// </summary>
        //public virtual DbSet<WipSop> WipSops { get; set; }
        public virtual DbSet<MaterialSop> MaterialSops { get; set; }

        /// <summary>
        /// 料號基本資料檔
        /// </summary>
        public virtual DbSet<MaterialItem> MaterialItems { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public virtual DbSet<MaterialKp> MaterialKps { get; set; }

        /// <summary>
        /// 工單資訊-板卡工程資訊
        /// </summary>
        public virtual DbSet<WipBoard> WipBoards { get; set; }

        /// <summary>
        /// 工單資訊-系統組裝工程資訊
        /// </summary>
        public virtual DbSet<WipSystem> WipSystems { get; set; }

        /// <summary>
        /// 工單資訊-系統組裝工程資訊
        /// </summary>
        public virtual DbSet<BarcodeChange> BarcodeChanges { get; set; }

        /// <summary>
        /// 工單對應SOP文件log
        /// </summary>
        public virtual DbSet<WipSop> WipSops { get; set; }

        /// <summary>
        /// 工單資料-標籤
        /// </summary>
        public virtual DbSet<WipLabel> WipLabels { get; set; }

        /// <summary>
        /// 工單MAC資料檔
        /// </summary>
        public virtual DbSet<WipMAC> WipMACs { get; set; }

        /// <summary>
        /// 工單條碼規則設定文件檔
        /// </summary>
        public virtual DbSet<WipRule> WipRules { get; set; }

        /// <summary>
        /// 工單條碼區間設定檔(除内部SN)
        /// </summary>
        public virtual DbSet<WipBarcodeOther> WipBarcodeOthers { get; set; }

        /// <summary>
        ///條碼資料
        /// </summary>
        public virtual DbSet<BarcodeInfo> BarcodeInfoes { get; set; }

        /// <summary>
        ///條碼组件資料
        /// </summary>
        public virtual DbSet<BarcodeItem> BarcodeItems { get; set; }


        /// <summary>
        ///工時群組資料
        /// </summary>
        public DbSet<WorkGroup> WorkGroups { get; set; }

        /// <summary>
        ///工作類別資料
        /// </summary>
        public DbSet<WorkClass> WorkClasses { get; set; }

        /// <summary>
        ///標準工時資料
        /// </summary>
        public DbSet<StandardWorkTime> StandardWorkTimes { get; set; }

        /// <summary>
        ///每日出勤資料
        /// </summary>
        public DbSet<WorkManPower> WorkManPowers { get; set; }


        /// <summary>
        ///援入援外資料
        /// </summary>
        public DbSet<SupportUser> SupportUsers { get; set; }

        /// <summary>
        ///異常工時資料
        /// </summary>
        public DbSet<ExceptionWorktime> ExceptionWorktimes { get; set; }

        /// <summary>
        ///重工工時資料
        /// </summary>
        public DbSet<StandardWorkTimeRework> StandardWorkTimeReworks { get; set; }

        /// <summary>
        ///無效工時在線收集資料
        /// </summary>
        public DbSet<ExceptionWorktimeOline> ExceptionWorktimeOlines { get; set; }

        /// <summary>
        /// 條碼類別資料檔
        /// </summary>
        public virtual DbSet<BarcodeType> BarcodeTypes { get; set; }

        /// <summary>
        /// 料號属性代碼基本檔
        /// </summary>
        public virtual DbSet<MatProperty> MatPropertys { get; set; }


        /// <summary>
        ///條碼组件變更資料
        /// </summary>
        public DbSet<BarcodeItemChange> BarcodeItemChanges { get; set; }

        /// <summary>
        /// 料號站別工項資料檔
        /// </summary>
        public virtual DbSet<AMESCoreStudio.WebApi.Models.AMES.MaterialStationsItem> MaterialStationsItems { get; set; }

        /// <summary>
        /// 料號治具資訊資料檔
        /// </summary>
        public virtual DbSet<AMESCoreStudio.WebApi.Models.AMES.MaterialOutfit> MaterialOutfits { get; set; }

        /// <summary>
        /// 條碼鎖定資料表
        /// </summary>
        public DbSet<BarcodeLock> BarcodeLocks { get; set; }

        /// <summary>
        /// 檔案用途    條碼工單資料檔
        /// </summary>
        public virtual DbSet<BarcodeWip> BarcodeWips { get; set; }

        /// <summary>
        /// 測試不良基本資料檔
        /// </summary>
        public virtual DbSet<NgInfo> NgInfos { get; set; }

        /// <summary>
        /// 條碼過站資料檔
        /// </summary>
        //public DbSet<AMESCoreStudio.WebApi.Models.AMES.BarcodeStation> BarcodeStation { get; set; }
        public DbSet<BarcodeStation> BarcodeStation { get; set; }

        /// <summary>
        /// 條碼關聯資料檔
        /// </summary>
        public virtual DbSet<BarcodeGroup> BarcodeGroups { get; set; }

        /// <summary>
        /// 料號流程資料檔
        /// </summary>
        public virtual DbSet<AMESCoreStudio.WebApi.Models.BAS.MaterialFlow> MaterialFlows { get; set; }

        /// <summary>
        /// 燒机時間資料檔
        /// </summary>
        public virtual DbSet<RuninTime> RuninTimes { get; set; }

        /// <summary>
        /// 檢驗類別維護資料檔
        /// </summary>
        public virtual DbSet<QcGroup> QcGroups { get; set; }

        /// <summary>
        /// 檢驗項目維護資料檔
        /// </summary>
        public virtual DbSet<QcItem> QcItems { get; set; }

        /// <summary>
        /// 檢驗结果維護資料檔
        /// </summary>
        public virtual DbSet<FqcResult> FqcResults { get; set; }

        /// <summary>
        /// 抽驗係数資料檔
        /// </summary>
        public virtual DbSet<QcQuot> QcQuots { get; set; }

        /// <summary>
        /// 抽驗標準資料檔
        /// </summary>
        public virtual DbSet<QcCriterion> QcCriteria { get; set; }

        /// <summary>
        /// 入庫單資料檔
        /// </summary>
        public virtual DbSet<FqcInhouseMaster> FqcInhouseMasters { get; set; }

        /// <summary>
        /// 檢驗單明細資料檔
        /// </summary>
        public virtual DbSet<FqcInhouseDetail> FqcInhouseDetails { get; set; }

        /// <summary>
        /// 檢驗單結果資料檔
        /// </summary>
        public virtual DbSet<FqcResultMaster> FqcResultMasters { get; set; }

        /// <summary>
        /// FQC檢驗結果明細資料檔
        /// </summary>
        public virtual DbSet<FqcResultDetail> FqcResultDetails { get; set; }

        /// <summary>
        /// FQC條碼資料檔
        /// </summary>
        public virtual DbSet<FqcBarcode> FqcBarcodes { get; set; }

        /// <summary>
        /// FQC细目資料檔
        /// </summary>
        public virtual DbSet<FqcItem> FqcItems { get; set; }

        /// <summary>
        /// 抽驗批退資料檔
        /// </summary>
        public virtual DbSet<QngInfo> QngInfos { get; set; }

        /// <summary>
        /// 測試不良基本資料檔
        /// </summary>
        public DbSet<NgComponent> NgComponents { get; set; }

        /// <summary>
        /// 維修紀錄資料檔
        /// </summary>
        public DbSet<RepairRecord> RepairRecords { get; set; }

        /// <summary>
        /// 不良維修資料檔
        /// </summary>
        public DbSet<NgRepair> NgRepairs { get; set; }

        /// <summary>
        /// 維修解碼上傳圖檔資料表
        /// </summary>
        public DbSet<NgRepairBlob> NgRepairBlobs { get; set; }

        /// <summary>
        /// 過站狀態檔
        /// </summary>
        public virtual DbSet<StatusType> StatusTypes { get; set; }
        /// <summary>
        /// 異常工時類別資料檔
        /// </summary>
        public virtual DbSet<ExceptionClass> ExceptionClasses { get; set; }

        /// <summary>
        /// 異常工時CODE資料檔
        /// </summary>
        public virtual DbSet<ExceptionCode> ExceptionCodes { get; set; }

        /// <summary>
        /// 異常工時REASON資料檔
        /// </summary>
        public virtual DbSet<ExceptionReason> ExceptionReasons { get; set; }

        /// <summary>
        /// 工單箱號資料檔
        /// </summary>
        public virtual DbSet<WipBox> WipBoxs { get; set; }
        /// <summary>
        /// 巡檢類別資料檔
        /// </summary>
        public virtual DbSet<InspectionType> InspectionTypes { get; set; }

        /// <summary>
        /// 工單各站數量資料檔
        /// </summary>
        public virtual DbSet<WipStation> WipStations { get; set; }
        /// <summary>
        /// 巡檢表單資料檔
        /// </summary>
        public virtual DbSet<InspectionItem> InspectionItems { get; set; }

        /// <summary>
        /// 巡檢項目資料檔
        /// </summary>
        public virtual DbSet<InspectionForm> InspectionForms { get; set; }

        /// <summary>
        /// 巡檢項目資料檔
        /// </summary>
        public virtual DbSet<InspectionResultMaster> InspectionResultMasters { get; set; }

        /// <summary>
        /// 巡檢項目資料檔
        /// </summary>
        public virtual DbSet<InspectionResultDetail> InspectionResultDetails { get; set; }

        /// <summary>
        /// 巡檢項目資料檔
        /// </summary>
        public virtual DbSet<InspectionResultBlob> InspectionResultBlobs { get; set; }

        /// <summary>
        /// 各班別數量資料檔
        /// </summary>
        public virtual DbSet<WipClass> WipClass { get; set; }

        /// <summary>
        /// 工單各站數量資料檔 – By TIME
        /// </summary>
        public virtual DbSet<WipTime> WipTimes { get; set; }

        /// <summary>
        /// 工單KP資訊資料檔
        /// </summary>
        public virtual DbSet<WipKp> WipKps { get; set; }

        /// <summary>
        /// 日曆資料表
        /// </summary>
        public DbSet<CalendarTable> CalendarTables { get; set; }

        /// <summary>
        /// 內部序號對應的治具序號明細
        /// </summary>
        public virtual DbSet<BarcodeOutfit> BarcodeOutfits { get; set; }

        /// <summary>
        /// 設備種類資料檔
        /// </summary>
        public virtual DbSet<OutfitCommodityInfo> OutfitCommodityInfoes { get; set; }

        /// <summary>
        /// 設備規格資料檔
        /// </summary>
        public virtual DbSet<OutfitVarityInfo> OutfitVarityInfoes { get; set; }

        /// <summary>
        /// 廠商資料檔
        /// </summary>
        public virtual DbSet<OutfitVendorInfo> OutfitVendorInfoes { get; set; }

        /// <summary>
        /// 治具資料檔
        /// </summary>
        public virtual DbSet<OutfitInfo> OutfitInfoes { get; set; }

        /// <summary>
        /// PLM轉入料號說明
        /// </summary>
        public virtual DbSet<PlmMeterialInfo> PlmMeterialInfos { get; set; }
        /// <summary>
        /// 設備狀態紀錄資料檔
        /// </summary>
        public virtual DbSet<OutfitStatusLog> OutfitStatusLogs { get; set; }

        /// <summary>
        /// 工單資訊確認
        /// </summary>
        public virtual DbSet<WipCheck> WipChecks { get; set; }

        /// <summary>
        /// 工單治具資料檔
        /// </summary>
        public virtual DbSet<WipOutfit> WipOutfits { get; set; }

        /// <summary>
        /// 工單上傳圖檔資料表
        /// </summary>
        public virtual DbSet<WipInfoBlob> WipInfoBlobs { get; set; }


        /// <summary>
        /// 出貨序號規則
        /// </summary>
        public virtual DbSet<SerialRule> SerialRules { get; set; }

        /// <summary>
        /// 燒機記錄資料表
        /// </summary>
        public virtual DbSet<BurnInfo> BurnInfos { get; set; }
        
        /// <summary>
        /// 樣本序號取得記錄資料表
        /// </summary>
        public virtual DbSet<SampleSipmentSN> SampleSipmentSNs { get; set; }


        /// <summary>
        /// 工單序號退回紀錄
        /// </summary>
        public virtual DbSet<WipReturn> WipReturns { get; set; }

        /// <summary>
        /// 料號對應工項資料檔
        /// </summary>
        public virtual DbSet<MaterialFqcItem> MaterialFqcItems { get; set; }

        /// <summary>
        /// 工單對應工項資料檔
        /// </summary>
        public virtual DbSet<WipFqcItem> WipFqcItems { get; set; }

        /// <summary>
        /// 檢驗結果上傳圖檔資料表
        /// </summary>
        public virtual DbSet<FqcResultMasterBlob> FqcResultMasterBlobs { get; set; }

        /// <summary>
        /// 工單警報資料
        /// </summary>
        public DbSet<WipAlarm> WipAlarms { get; set; }

        /// <summary>
        /// 工時收集資料檔
        /// </summary>
        public DbSet<WorkingHoursCollection> WorkingHoursCollections { get; set; }

        /// <summary>
        /// 外包機種資料
        /// </summary>
        public DbSet<SNKeyPart> SNKeyParts { get; set; }

        /// <summary> Yiru add  ---------------------------------------------------
        /// 檢驗單明細資料檔
        /// </summary>
        public virtual DbSet<WareHouseing> WareHouseings { get; set; }

        /// <summary>
        /// 生產工時報工資料檔
        /// </summary>
        public DbSet<WipTimeSheet> WipTimeSheets { get; set; }

        /// <summary>
        /// 鋼板基本資料檔
        /// </summary>
        public virtual DbSet<SteelPlateInfo> SteelPlateInfos { get; set; }

        /// <summary>
        /// 鋼板量測記錄資料檔
        /// </summary>
        public virtual DbSet<SteelPlateMeasure> SteelPlateMeasures { get; set; }

        /// <summary>
        /// 錫膏基本資料檔
        /// </summary>
        public virtual DbSet<SolderPasteInfo> SolderPasteInfos { get; set; }

        /// <summary>
        /// 錫膏使用紀錄資料檔
        /// </summary>
        public virtual DbSet<SolderPasteRecord> SolderPasteRecords { get; set; }

        /// <summary>
        /// 條碼報廢轉出資料檔
        /// </summary>
        public DbSet<BarcodeQngInfo> BarcodeQngInfos { get; set; }

        /// <summary>
        /// 異常工時附件資料檔
        /// </summary>
        public virtual DbSet<ExceptionWorktimeBlob> ExceptionWorktimeBlobs { get; set; }


        /// <summary> Yiru add  ---------------------------------------------------
        /// 設備廠別資料檔
        /// </summary>
        public virtual DbSet<OutfitFactoryInfo> OutfitFactoryInfos { get; set; }

        public virtual DbSet<RLabelReprint> RLabelReprints { get; set; }

        /// <summary> yiru 2022-09-20  ---------------------------------------------------
        /// 治具ID圖檔
        /// </summary>
        public virtual DbSet<OutfitInfoBlob> OutfitInfoBlobs { get; set; }

        /// <summary>
        /// FQC 報表自動派送維護
        /// </summary>
        public virtual DbSet<FqcNoticeMail> FqcNoticeMails { get; set; }

        /// <summary>
        /// 解除綁定出貨序號箱號資料檔
        /// </summary>
        public virtual DbSet<UnbindExtraBarcode> UnbindExtraBarcodes { get; set; }

        /// <summary>
        /// SOP資訊 - SOP類型為暫行文件
        /// </summary>
        public virtual DbSet<CTempSop> CTempSops { get; set; }

        /// <summary> yiru add
        /// 工單發料資料
        /// </summary>
        public DbSet<CZmomaterialList> CZmomaterialLists { get; set; }

	  /// <summary> yiru add
        /// 出貨序號規則-明細
        /// </summary>
        public DbSet<SerialRuleDetail> SerialRuleDetails { get; set; }

        /// <summary>
        /// 清線資料
        /// </summary>
        public DbSet<WipClear> WipClears { get; set; }

        /// <summary>
        /// 清線明細資料
        /// </summary>
        public DbSet<WipClearDetail> WipClearDetails { get; set; }

        /// <summary>
        /// PlmBom資料
        /// </summary>
        public DbSet<PlmBom> PlmBoms { get; set; }

        /// <summary>
        /// 工程編號
        /// </summary>

        public virtual DbSet<MaterialBake> MaterialBakes { get; set; }

        /// <summary>
        /// 報工站別資料
        /// </summary>

        public DbSet<StationWorkingHour> StationWorkingHours { get; set; }
    }

}