コード例 #1
0
        /// <summary>
        /// 得到一个对象实体
        /// </summary>
        public Mod_TPA_HL_PLAN GetModel(string C_ID)
        {
            StringBuilder strSql = new StringBuilder();

            strSql.Append("select C_ID,C_FK,C_STOVE_NO,C_STL_GRD,C_STD_CODE,C_WH_CODE,C_SLAB_TYPE,D_START_TIME,D_END_TIME,N_HL_TIME,D_PLAN_DATE,C_HLYQ,C_REMARK,N_STATUS,C_CCM,N_QUA,N_CAP,N_TOTAL_QUA,D_START_TIME_SJ,D_END_TIME_SJ,N_QUA_SJ,C_WH_CODE_SJ,D_OVER_TIME,N_NUM from TPA_HL_PLAN ");
            strSql.Append(" where C_ID=:C_ID ");
            OracleParameter[] parameters =
            {
                new OracleParameter(":C_ID", OracleDbType.Varchar2, 50)
            };
            parameters[0].Value = C_ID;

            Mod_TPA_HL_PLAN model = new Mod_TPA_HL_PLAN();
            DataSet         ds    = DbHelperOra.Query(strSql.ToString(), parameters);

            if (ds.Tables[0].Rows.Count > 0)
            {
                return(DataRowToModel(ds.Tables[0].Rows[0]));
            }
            else
            {
                return(null);
            }
        }
コード例 #2
0
        /// <summary>
        /// 得到一个对象实体
        /// </summary>
        public Mod_TPA_HL_PLAN DataRowToModel(DataRow row)
        {
            Mod_TPA_HL_PLAN model = new Mod_TPA_HL_PLAN();

            if (row != null)
            {
                if (row["C_ID"] != null)
                {
                    model.C_ID = row["C_ID"].ToString();
                }
                if (row["C_FK"] != null)
                {
                    model.C_FK = row["C_FK"].ToString();
                }
                if (row["C_STOVE_NO"] != null)
                {
                    model.C_STOVE_NO = row["C_STOVE_NO"].ToString();
                }
                if (row["C_STL_GRD"] != null)
                {
                    model.C_STL_GRD = row["C_STL_GRD"].ToString();
                }
                if (row["C_STD_CODE"] != null)
                {
                    model.C_STD_CODE = row["C_STD_CODE"].ToString();
                }
                if (row["C_WH_CODE"] != null)
                {
                    model.C_WH_CODE = row["C_WH_CODE"].ToString();
                }
                if (row["C_SLAB_TYPE"] != null)
                {
                    model.C_SLAB_TYPE = row["C_SLAB_TYPE"].ToString();
                }
                if (row["D_START_TIME"] != null && row["D_START_TIME"].ToString() != "")
                {
                    model.D_START_TIME = DateTime.Parse(row["D_START_TIME"].ToString());
                }
                if (row["D_END_TIME"] != null && row["D_END_TIME"].ToString() != "")
                {
                    model.D_END_TIME = DateTime.Parse(row["D_END_TIME"].ToString());
                }
                if (row["N_HL_TIME"] != null && row["N_HL_TIME"].ToString() != "")
                {
                    model.N_HL_TIME = decimal.Parse(row["N_HL_TIME"].ToString());
                }
                if (row["D_PLAN_DATE"] != null && row["D_PLAN_DATE"].ToString() != "")
                {
                    model.D_PLAN_DATE = DateTime.Parse(row["D_PLAN_DATE"].ToString());
                }
                if (row["C_HLYQ"] != null)
                {
                    model.C_HLYQ = row["C_HLYQ"].ToString();
                }
                if (row["C_REMARK"] != null)
                {
                    model.C_REMARK = row["C_REMARK"].ToString();
                }
                if (row["N_STATUS"] != null && row["N_STATUS"].ToString() != "")
                {
                    model.N_STATUS = decimal.Parse(row["N_STATUS"].ToString());
                }
                if (row["C_CCM"] != null)
                {
                    model.C_CCM = row["C_CCM"].ToString();
                }
                if (row["N_QUA"] != null && row["N_QUA"].ToString() != "")
                {
                    model.N_QUA = decimal.Parse(row["N_QUA"].ToString());
                }
                if (row["N_CAP"] != null && row["N_CAP"].ToString() != "")
                {
                    model.N_CAP = decimal.Parse(row["N_CAP"].ToString());
                }
                if (row["N_TOTAL_QUA"] != null && row["N_TOTAL_QUA"].ToString() != "")
                {
                    model.N_TOTAL_QUA = decimal.Parse(row["N_TOTAL_QUA"].ToString());
                }
                if (row["D_START_TIME_SJ"] != null && row["D_START_TIME_SJ"].ToString() != "")
                {
                    model.D_START_TIME_SJ = DateTime.Parse(row["D_START_TIME_SJ"].ToString());
                }
                if (row["D_END_TIME_SJ"] != null && row["D_END_TIME_SJ"].ToString() != "")
                {
                    model.D_END_TIME_SJ = DateTime.Parse(row["D_END_TIME_SJ"].ToString());
                }
                if (row["N_QUA_SJ"] != null && row["N_QUA_SJ"].ToString() != "")
                {
                    model.N_QUA_SJ = decimal.Parse(row["N_QUA_SJ"].ToString());
                }
                if (row["C_WH_CODE_SJ"] != null)
                {
                    model.C_WH_CODE_SJ = row["C_WH_CODE_SJ"].ToString();
                }
                if (row["D_OVER_TIME"] != null && row["D_OVER_TIME"].ToString() != "")
                {
                    model.D_OVER_TIME = DateTime.Parse(row["D_OVER_TIME"].ToString());
                }
                if (row["N_NUM"] != null && row["N_NUM"].ToString() != "")
                {
                    model.N_NUM = decimal.Parse(row["N_NUM"].ToString());
                }
            }
            return(model);
        }
コード例 #3
0
        /// <summary>
        /// 增加一条数据
        /// </summary>
        public bool Add(Mod_TPA_HL_PLAN model)
        {
            StringBuilder strSql = new StringBuilder();

            strSql.Append("insert into TPA_HL_PLAN(");
            strSql.Append("C_ID,C_FK,C_STOVE_NO,C_STL_GRD,C_STD_CODE,C_WH_CODE,C_SLAB_TYPE,D_START_TIME,D_END_TIME,N_HL_TIME,D_PLAN_DATE,C_HLYQ,C_REMARK,N_STATUS,C_CCM,N_QUA,N_CAP,N_TOTAL_QUA,D_START_TIME_SJ,D_END_TIME_SJ,N_QUA_SJ,C_WH_CODE_SJ,D_OVER_TIME,N_NUM)");
            strSql.Append(" values (");
            strSql.Append(":C_ID,:C_FK,:C_STOVE_NO,:C_STL_GRD,:C_STD_CODE,:C_WH_CODE,:C_SLAB_TYPE,:D_START_TIME,:D_END_TIME,:N_HL_TIME,:D_PLAN_DATE,:C_HLYQ,:C_REMARK,:N_STATUS,:C_CCM,:N_QUA,:N_CAP,:N_TOTAL_QUA,:D_START_TIME_SJ,:D_END_TIME_SJ,:N_QUA_SJ,:C_WH_CODE_SJ,:D_OVER_TIME,:N_NUM)");
            OracleParameter[] parameters =
            {
                new OracleParameter(":C_ID",            OracleDbType.Varchar2,  50),
                new OracleParameter(":C_FK",            OracleDbType.Varchar2,  50),
                new OracleParameter(":C_STOVE_NO",      OracleDbType.Varchar2,  50),
                new OracleParameter(":C_STL_GRD",       OracleDbType.Varchar2,  50),
                new OracleParameter(":C_STD_CODE",      OracleDbType.Varchar2,  50),
                new OracleParameter(":C_WH_CODE",       OracleDbType.Varchar2,  50),
                new OracleParameter(":C_SLAB_TYPE",     OracleDbType.Varchar2,  50),
                new OracleParameter(":D_START_TIME",    OracleDbType.Date),
                new OracleParameter(":D_END_TIME",      OracleDbType.Date),
                new OracleParameter(":N_HL_TIME",       OracleDbType.Decimal,   10),
                new OracleParameter(":D_PLAN_DATE",     OracleDbType.Date),
                new OracleParameter(":C_HLYQ",          OracleDbType.Varchar2, 500),
                new OracleParameter(":C_REMARK",        OracleDbType.Varchar2, 500),
                new OracleParameter(":N_STATUS",        OracleDbType.Decimal,    5),
                new OracleParameter(":C_CCM",           OracleDbType.Varchar2,  50),
                new OracleParameter(":N_QUA",           OracleDbType.Decimal,   10),
                new OracleParameter(":N_CAP",           OracleDbType.Decimal,   10),
                new OracleParameter(":N_TOTAL_QUA",     OracleDbType.Decimal,   10),
                new OracleParameter(":D_START_TIME_SJ", OracleDbType.Date),
                new OracleParameter(":D_END_TIME_SJ",   OracleDbType.Date),
                new OracleParameter(":N_QUA_SJ",        OracleDbType.Decimal,   10),
                new OracleParameter(":C_WH_CODE_SJ",    OracleDbType.Varchar2,  50),
                new OracleParameter(":D_OVER_TIME",     OracleDbType.Date),
                new OracleParameter(":N_NUM",           OracleDbType.Decimal, 10)
            };
            parameters[0].Value  = model.C_ID;
            parameters[1].Value  = model.C_FK;
            parameters[2].Value  = model.C_STOVE_NO;
            parameters[3].Value  = model.C_STL_GRD;
            parameters[4].Value  = model.C_STD_CODE;
            parameters[5].Value  = model.C_WH_CODE;
            parameters[6].Value  = model.C_SLAB_TYPE;
            parameters[7].Value  = model.D_START_TIME;
            parameters[8].Value  = model.D_END_TIME;
            parameters[9].Value  = model.N_HL_TIME;
            parameters[10].Value = model.D_PLAN_DATE;
            parameters[11].Value = model.C_HLYQ;
            parameters[12].Value = model.C_REMARK;
            parameters[13].Value = model.N_STATUS;
            parameters[14].Value = model.C_CCM;
            parameters[15].Value = model.N_QUA;
            parameters[16].Value = model.N_CAP;
            parameters[17].Value = model.N_TOTAL_QUA;
            parameters[18].Value = model.D_START_TIME_SJ;
            parameters[19].Value = model.D_END_TIME_SJ;
            parameters[20].Value = model.N_QUA_SJ;
            parameters[21].Value = model.C_WH_CODE_SJ;
            parameters[22].Value = model.D_OVER_TIME;
            parameters[23].Value = model.N_NUM;

            int rows = DbHelperOra.ExecuteSql(strSql.ToString(), parameters);

            if (rows > 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
コード例 #4
0
        /// <summary>
        /// 更新一条数据
        /// </summary>
        public bool Update(Mod_TPA_HL_PLAN model)
        {
            StringBuilder strSql = new StringBuilder();

            strSql.Append("update TPA_HL_PLAN set ");
            strSql.Append("C_FK=:C_FK,");
            strSql.Append("C_STOVE_NO=:C_STOVE_NO,");
            strSql.Append("C_STL_GRD=:C_STL_GRD,");
            strSql.Append("C_STD_CODE=:C_STD_CODE,");
            strSql.Append("C_WH_CODE=:C_WH_CODE,");
            strSql.Append("C_SLAB_TYPE=:C_SLAB_TYPE,");
            strSql.Append("D_START_TIME=:D_START_TIME,");
            strSql.Append("D_END_TIME=:D_END_TIME,");
            strSql.Append("N_HL_TIME=:N_HL_TIME,");
            strSql.Append("D_PLAN_DATE=:D_PLAN_DATE,");
            strSql.Append("C_HLYQ=:C_HLYQ,");
            strSql.Append("C_REMARK=:C_REMARK,");
            strSql.Append("N_STATUS=:N_STATUS,");
            strSql.Append("C_CCM=:C_CCM,");
            strSql.Append("N_QUA=:N_QUA,");
            strSql.Append("N_CAP=:N_CAP,");
            strSql.Append("N_TOTAL_QUA=:N_TOTAL_QUA,");
            strSql.Append("D_START_TIME_SJ=:D_START_TIME_SJ,");
            strSql.Append("D_END_TIME_SJ=:D_END_TIME_SJ,");
            strSql.Append("N_QUA_SJ=:N_QUA_SJ,");
            strSql.Append("C_WH_CODE_SJ=:C_WH_CODE_SJ,");
            strSql.Append("D_OVER_TIME=:D_OVER_TIME,");
            strSql.Append("N_NUM=:N_NUM");
            strSql.Append(" where C_ID=:C_ID ");
            OracleParameter[] parameters =
            {
                new OracleParameter(":C_FK",            OracleDbType.Varchar2,  50),
                new OracleParameter(":C_STOVE_NO",      OracleDbType.Varchar2,  50),
                new OracleParameter(":C_STL_GRD",       OracleDbType.Varchar2,  50),
                new OracleParameter(":C_STD_CODE",      OracleDbType.Varchar2,  50),
                new OracleParameter(":C_WH_CODE",       OracleDbType.Varchar2,  50),
                new OracleParameter(":C_SLAB_TYPE",     OracleDbType.Varchar2,  50),
                new OracleParameter(":D_START_TIME",    OracleDbType.Date),
                new OracleParameter(":D_END_TIME",      OracleDbType.Date),
                new OracleParameter(":N_HL_TIME",       OracleDbType.Decimal,   10),
                new OracleParameter(":D_PLAN_DATE",     OracleDbType.Date),
                new OracleParameter(":C_HLYQ",          OracleDbType.Varchar2, 500),
                new OracleParameter(":C_REMARK",        OracleDbType.Varchar2, 500),
                new OracleParameter(":N_STATUS",        OracleDbType.Decimal,    5),
                new OracleParameter(":C_CCM",           OracleDbType.Varchar2,  50),
                new OracleParameter(":N_QUA",           OracleDbType.Decimal,   10),
                new OracleParameter(":N_CAP",           OracleDbType.Decimal,   10),
                new OracleParameter(":N_TOTAL_QUA",     OracleDbType.Decimal,   10),
                new OracleParameter(":D_START_TIME_SJ", OracleDbType.Date),
                new OracleParameter(":D_END_TIME_SJ",   OracleDbType.Date),
                new OracleParameter(":N_QUA_SJ",        OracleDbType.Decimal,   10),
                new OracleParameter(":C_WH_CODE_SJ",    OracleDbType.Varchar2,  50),
                new OracleParameter(":D_OVER_TIME",     OracleDbType.Date),
                new OracleParameter(":N_NUM",           OracleDbType.Decimal,   10),
                new OracleParameter(":C_ID",            OracleDbType.Varchar2, 50)
            };
            parameters[0].Value  = model.C_FK;
            parameters[1].Value  = model.C_STOVE_NO;
            parameters[2].Value  = model.C_STL_GRD;
            parameters[3].Value  = model.C_STD_CODE;
            parameters[4].Value  = model.C_WH_CODE;
            parameters[5].Value  = model.C_SLAB_TYPE;
            parameters[6].Value  = model.D_START_TIME;
            parameters[7].Value  = model.D_END_TIME;
            parameters[8].Value  = model.N_HL_TIME;
            parameters[9].Value  = model.D_PLAN_DATE;
            parameters[10].Value = model.C_HLYQ;
            parameters[11].Value = model.C_REMARK;
            parameters[12].Value = model.N_STATUS;
            parameters[13].Value = model.C_CCM;
            parameters[14].Value = model.N_QUA;
            parameters[15].Value = model.N_CAP;
            parameters[16].Value = model.N_TOTAL_QUA;
            parameters[17].Value = model.D_START_TIME_SJ;
            parameters[18].Value = model.D_END_TIME_SJ;
            parameters[19].Value = model.N_QUA_SJ;
            parameters[20].Value = model.C_WH_CODE_SJ;
            parameters[21].Value = model.D_OVER_TIME;
            parameters[22].Value = model.N_NUM;
            parameters[23].Value = model.C_ID;

            int rows = DbHelperOra.ExecuteSql(strSql.ToString(), parameters);

            if (rows > 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
コード例 #5
0
        public string ProcessSort(out List <Mod_TSP_PLAN_SMS> processResult)
        {
            int    ccm_dfphl = int.Parse(ConfigurationManager.AppSettings.Get("ccm_dfphl"));
            int    dfphl_kp  = int.Parse(ConfigurationManager.AppSettings.Get("dfphl_kp"));
            int    kp_hl     = int.Parse(ConfigurationManager.AppSettings.Get("kp_hl"));
            int    hl_xm     = int.Parse(ConfigurationManager.AppSettings.Get("hl_xm"));
            int    ccm_kp    = int.Parse(ConfigurationManager.AppSettings.Get("ccm_kp"));
            int    kp_xm     = int.Parse(ConfigurationManager.AppSettings.Get("kp_xm"));
            string result    = "1";
            //获取缓冷坑库位
            var strLocs  = bll_TPA_HL_ACT.DataTableToList(dal.GetDfpHlStrLoc());
            var dStrLocs = strLocs.Where(x => x.C_SLAB_TYPE == "大方坯").OrderBy(x => x.C_WH_CODE).ToList(); //大方坯库位
            var xStrLocs = strLocs.Where(x => x.C_SLAB_TYPE == "小方坯").OrderBy(x => x.C_WH_CODE).ToList(); //小方坯库位

            //查询所有连铸计划
            var smsAllModels = bll_TSP_PLAN_SMS.DataTableToList(dal_TSP_PLAN_SMS.GetList(" C_SLAB_TYPE='大方坯' AND N_CREAT_PLAN!=3  ").Tables[0]);



            //按照连铸计划时间、热轧排序 大方坯
            var smsModels = smsAllModels.Where(x => x.C_SLAB_TYPE == "大方坯")
                            .OrderBy(x => x.D_P_START_TIME)
                            .ThenByDescending(x => x.C_DFP_RZ)
                            .ToList();

            //删除个子表计划
            dal.DelDfpHl_FK(smsModels);
            dal.DelKp_FK(smsModels);
            dal.DelHl_FK(smsModels);
            dal.DelXm_FK(smsModels);

            //连铸计划推出开坯计划
            List <Mod_TSP_PLAN_SMS> kpResult = new List <Mod_TSP_PLAN_SMS>();
            //缓冷计划
            List <Mod_TPA_DHL_PLAN> dhlPlans = new List <Mod_TPA_DHL_PLAN>();
            //开坯计划
            List <Mod_TPA_KP_PLAN> kpPlans = new List <Mod_TPA_KP_PLAN>();
            //缓冷计划(小方坯)
            List <Mod_TPA_HL_PLAN> hlPlans = new List <Mod_TPA_HL_PLAN>();
            //开坯计划推出修磨计划
            List <Mod_TSP_PLAN_SMS> xmResult = new List <Mod_TSP_PLAN_SMS>();
            //修磨计划
            List <Mod_TPA_XM_PLAN> xmPlans = new List <Mod_TPA_XM_PLAN>();


            try
            {
                int smsCount = smsModels.Count;
                for (int i = 0; i < smsCount; i++)
                {
                    smsModels[i].C_QUA = "19";
                    if (smsModels[i].C_DFP_HL == "Y")   //缓冷(大方坯)
                    {
                        #region 计算缓冷时间
                        //获取未用缓冷坑(所有缓冷坑-已使用过的缓冷坑)
                        DataTable usedD = dal.GetUsedLoc();
                        if (usedD.Rows.Count > 0)
                        {
                            int lCount = usedD.Rows.Count;
                            for (int l = 0; l < lCount; l++)
                            {
                                var loc = dStrLocs.FirstOrDefault(x => x.C_WH_CODE == usedD.Rows[l]["C_WH_CODE"].ToString());
                                dStrLocs.Remove(loc);
                            }
                        }
                        smsModels[i].D_DFPHL_START_TIME = smsModels[i].D_P_START_TIME.Value.AddHours(ccm_dfphl);                           //连铸到缓冷1小时
                        smsModels[i].D_DFPHL_END_TIME   = smsModels[i].D_DFPHL_START_TIME.Value.AddHours((int)smsModels[i].N_DFP_HL_TIME); //需要缓冷时间
                                                                                                                                           //入坑记录
                        Mod_TPA_DHL_PLAN dhlM = new Mod_TPA_DHL_PLAN();
                        dhlM.C_ID         = Guid.NewGuid().ToString("N");
                        dhlM.C_FK         = smsModels[i].C_ID;
                        dhlM.C_STOVE_NO   = smsModels[i].C_STOVE_NO;
                        dhlM.C_STL_GRD    = smsModels[i].C_STL_GRD;
                        dhlM.C_STD_CODE   = smsModels[i].C_STD_CODE;
                        dhlM.D_START_TIME = smsModels[i].D_DFPHL_START_TIME;
                        dhlM.D_END_TIME   = smsModels[i].D_DFPHL_END_TIME;
                        dhlM.N_HL_TIME    = smsModels[i].N_HL_TIME;
                        dhlM.N_STATUS     = 1;
                        dhlM.N_QUA        = decimal.Parse(smsModels[i].C_QUA);
                        dhlM.D_OVER_TIME  = smsModels[i].D_DFPHL_END_TIME;
                        var locD      = dal.GetUseLoc(usedD, (int)dhlM.N_QUA, dhlM.D_END_TIME); //可用坑位
                        var locMaster = dal.GetOutLoc(usedD, smsModels[i].D_P_START_TIME);      //快要出坑明细
                        if (locD != null && locD.Rows.Count > 0)                                //缓冷坑余量足够 并且 当前坑中原钢坯与新入钢坯时间间隔不能超过5小时
                        {
                            dhlM.C_WH_CODE      = locD.Rows[0]["C_WH_CODE"].ToString();
                            dhlM.N_TOTAL_QUA    = dhlM.N_QUA + int.Parse(locD.Rows[0]["N_TOTAL_QUA"].ToString());
                            dhlM.N_NUM          = int.Parse(locD.Rows[0]["N_NUM"].ToString());
                            dhlM.N_CAP          = int.Parse(locD.Rows[0]["N_CAP"].ToString());
                            smsModels[i].WhCode = dhlM.C_WH_CODE;
                            smsModels[i].Num    = dhlM.N_NUM;
                        }
                        else if (dStrLocs != null && dStrLocs.Count > 0)//使用没有使用过的坑位
                        {
                            dhlM.C_WH_CODE      = dStrLocs[0].C_WH_CODE;
                            dhlM.N_TOTAL_QUA    = dhlM.N_QUA;
                            dhlM.N_NUM          = 1;
                            dhlM.N_CAP          = dStrLocs[0].N_CAP_QUA;
                            smsModels[i].WhCode = dhlM.C_WH_CODE;
                            smsModels[i].Num    = dhlM.N_NUM;
                        }
                        else if (locMaster != null && locMaster.Rows.Count > 0)//计划n+1次入坑
                        {
                            dhlM.C_WH_CODE      = locMaster.Rows[0]["C_WH_CODE"].ToString();
                            dhlM.N_TOTAL_QUA    = dhlM.N_QUA;
                            dhlM.N_NUM          = int.Parse(locMaster.Rows[0]["N_NUM"].ToString()) + 1;
                            dhlM.N_CAP          = int.Parse(locMaster.Rows[0]["N_CAP"].ToString());
                            smsModels[i].WhCode = dhlM.C_WH_CODE;
                            smsModels[i].Num    = dhlM.N_NUM;
                        }
                        else//坑满 虚拟坑位
                        {
                            dhlM.C_WH_CODE        = "0";
                            smsModels[i].N_STATUS = 0;
                            dhlM.N_TOTAL_QUA      = dhlM.N_QUA + dal.GetVirtualLocMaxQua();
                            dhlM.N_NUM            = 0;
                            smsModels[i].WhCode   = dhlM.C_WH_CODE;
                            smsModels[i].Num      = dhlM.N_NUM;
                        }
                        dal_TPA_DHL_PLAN.Add(dhlM);
                        dhlPlans.Add(dhlM);

                        #endregion

                        #region 计算开坯时间(需要缓冷钢坯)
                        smsModels[i].D_KP_START_TIME    = smsModels[i].D_DFPHL_END_TIME.Value.AddHours(dfphl_kp);                        //缓冷坑到开坯增加一小时
                        smsModels[i].D_KP_END_TIME      = smsModels[i].D_KP_START_TIME.Value.AddHours((double)smsModels[i].N_PROD_TIME); //开坯时间
                        smsModels[i].CalCulateTimeStart = smsModels[i].D_KP_START_TIME;
                        smsModels[i].C_QUA = (int.Parse(smsModels[i].C_QUA) * 2).ToString();
                        kpResult.Add(smsModels[i]);
                        #endregion
                    }
                    else//不需要缓冷(大方坯)
                    {
                        #region 计算开坯时间
                        smsModels[i].D_KP_START_TIME    = smsModels[i].D_P_START_TIME.Value.AddHours(ccm_kp);                            //连铸到开坯2小时
                        smsModels[i].D_KP_END_TIME      = smsModels[i].D_KP_START_TIME.Value.AddHours((double)smsModels[i].N_PROD_TIME); //开坯时间
                        smsModels[i].CalCulateTimeStart = smsModels[i].D_KP_START_TIME;
                        smsModels[i].C_QUA = (int.Parse(smsModels[i].C_QUA) * 2).ToString();
                        kpResult.Add(smsModels[i]);

                        #endregion
                    }
                }

                #region 计算开坯顺序
                kpResult = kpResult.OrderBy(x => x.D_KP_START_TIME)
                           .ThenByDescending(x => x.C_DFP_RZ)
                           .ToList();

                for (int j = 2; j < kpResult.Count; j++)
                {
                    //如果开坯时间互斥,重新计算开坯时间
                    if ((kpResult[j].D_KP_START_TIME < kpResult[j - 1].D_KP_END_TIME))
                    {
                        kpResult[j].D_KP_START_TIME = kpResult[j - 1].D_KP_END_TIME;
                        kpResult[j].D_KP_END_TIME   = kpResult[j].D_KP_START_TIME.Value.AddHours((double)kpResult[j].N_PROD_TIME);
                    }
                }

                kpResult = kpResult.OrderBy(x => x.D_KP_START_TIME)
                           .ThenByDescending(x => x.C_DFP_RZ)
                           .ToList();

                foreach (var kp in kpResult)
                {
                    //开坯记录
                    Mod_TPA_KP_PLAN kpM = new Mod_TPA_KP_PLAN();
                    kpM.C_ID             = Guid.NewGuid().ToString("N");
                    kpM.C_FK             = kp.C_ID;
                    kpM.C_STOVE_NO       = kp.C_STOVE_NO;
                    kpM.C_STL_GRD        = kp.C_STL_GRD;
                    kpM.C_STD_CODE       = kp.C_STD_CODE;
                    kpM.N_WGT            = kp.N_SLAB_WGT;
                    kpM.D_START_TIME     = kp.D_KP_START_TIME;
                    kpM.D_END_TIME       = kp.D_KP_END_TIME;
                    kpM.N_CN             = kp.N_JSCN.Value;
                    kpM.N_STATUS         = 1;
                    kpM.C_CCM            = kp.C_CCM_DESC;
                    kpM.D_CAN_START_TIME = kp.D_KP_START_TIME;
                    kpPlans.Add(kpM);
                }
                #endregion

                #region 计算缓冷坑最大出坑时间(大方坯)
                var useD = dal.GetUsedLoc();
                if (useD != null && useD.Rows.Count > 0)
                {
                    var uCount = useD.Rows.Count;
                    for (int i = 0; i < uCount; i++)
                    {
                        for (int j = 0; j < int.Parse(useD.Rows[i]["N_NUM"].ToString()); j++)
                        {
                            var outPitDt = dal.GetOutPitTime(useD.Rows[j]["C_WH_CODE"].ToString(), j + 1);
                            if (outPitDt != null && outPitDt.Rows.Count > 0)
                            {
                                int nCount = outPitDt.Rows.Count;
                                for (int n = 0; n < nCount; n++)
                                {
                                    string   c_fk          = outPitDt.Rows[n]["C_FK"].ToString();
                                    DateTime overtime      = DateTime.Parse(outPitDt.Rows[n]["D_OVER_TIME"].ToString());
                                    var      resetOutTimes = smsModels.Where(x => x.C_ID == c_fk).ToList();
                                    if (resetOutTimes.Count > 0)
                                    {
                                        resetOutTimes[0].D_DFPHL_END_TIME = overtime;
                                    }
                                }
                            }
                        }
                    }
                }
                #endregion

                kpResult.OrderBy(x => x.D_KP_END_TIME).ThenByDescending(x => x.C_RZP_RZ).ToList();
                //计算小方坯缓冷
                for (int i = 0; i < kpResult.Count; i++)
                {
                    //缓冷(小方坯)
                    if (kpResult[i].C_HL == "Y")
                    {
                        #region 小方坯缓冷
                        //获取未用缓冷坑(所有缓冷坑-已使用过的缓冷坑)
                        DataTable usedX = dal.GetUsedXLoc();
                        if (usedX.Rows.Count > 0)
                        {
                            for (int l = 0; l < usedX.Rows.Count; l++)
                            {
                                var loc = xStrLocs.FirstOrDefault(x => x.C_WH_CODE == usedX.Rows[l]["C_WH_CODE"].ToString());
                                xStrLocs.Remove(loc);
                            }
                        }

                        kpResult[i].D_HL_START_TIME = kpResult[i].D_KP_END_TIME.Value.AddHours(kp_hl);                        //开坯到缓冷1小时
                        kpResult[i].D_HL_END_TIME   = kpResult[i].D_HL_START_TIME.Value.AddHours((int)kpResult[i].N_HL_TIME); //需要缓冷时间
                                                                                                                              //入坑记录
                        Mod_TPA_HL_PLAN xhlM = new Mod_TPA_HL_PLAN();
                        xhlM.C_ID         = Guid.NewGuid().ToString("N");
                        xhlM.C_FK         = kpResult[i].C_ID;
                        xhlM.C_STOVE_NO   = kpResult[i].C_STOVE_NO;
                        xhlM.C_STL_GRD    = kpResult[i].C_STL_GRD;
                        xhlM.C_STD_CODE   = kpResult[i].C_STD_CODE;
                        xhlM.D_START_TIME = kpResult[i].D_HL_START_TIME;
                        xhlM.D_END_TIME   = kpResult[i].D_HL_END_TIME;
                        xhlM.N_HL_TIME    = kpResult[i].N_HL_TIME;
                        xhlM.N_STATUS     = 1;
                        xhlM.N_QUA        = decimal.Parse(kpResult[i].C_QUA);
                        xhlM.D_OVER_TIME  = kpResult[i].D_HL_END_TIME;
                        var locD      = dal.GetUseXLoc(usedX, (int)xhlM.N_QUA, xhlM.D_END_TIME); //可用坑位
                        var locMaster = dal.GetOutXLoc(usedX, kpResult[i].D_KP_END_TIME);        //快要出坑明细
                        if (locD != null && locD.Rows.Count > 0)                                 //缓冷坑余量足够 并且 当前坑中原钢坯与新入钢坯时间间隔不能超过5小时
                        {
                            xhlM.C_WH_CODE     = locD.Rows[0]["C_WH_CODE"].ToString();
                            xhlM.N_TOTAL_QUA   = xhlM.N_QUA + int.Parse(locD.Rows[0]["N_TOTAL_QUA"].ToString());
                            xhlM.N_NUM         = int.Parse(locD.Rows[0]["N_NUM"].ToString());
                            xhlM.N_CAP         = int.Parse(locD.Rows[0]["N_CAP"].ToString());
                            kpResult[i].WhCode = xhlM.C_WH_CODE;
                            kpResult[i].Num    = xhlM.N_NUM;
                        }
                        else if (xStrLocs != null && xStrLocs.Count > 0)//使用没有使用过的坑位
                        {
                            xhlM.C_WH_CODE     = xStrLocs[0].C_WH_CODE;
                            xhlM.N_TOTAL_QUA   = xhlM.N_QUA;
                            xhlM.N_NUM         = 1;
                            xhlM.N_CAP         = xStrLocs[0].N_CAP_QUA;
                            kpResult[i].WhCode = xhlM.C_WH_CODE;
                            kpResult[i].Num    = xhlM.N_NUM;
                        }
                        else if (locMaster != null && locMaster.Rows.Count > 0)//计划n+1次入坑
                        {
                            xhlM.C_WH_CODE     = locMaster.Rows[0]["C_WH_CODE"].ToString();
                            xhlM.N_TOTAL_QUA   = xhlM.N_QUA;
                            xhlM.N_NUM         = int.Parse(locMaster.Rows[0]["N_NUM"].ToString()) + 1;
                            xhlM.N_CAP         = int.Parse(locMaster.Rows[0]["N_CAP"].ToString());
                            kpResult[i].WhCode = xhlM.C_WH_CODE;
                            kpResult[i].Num    = xhlM.N_NUM;
                        }
                        else//坑满 虚拟坑位
                        {
                            xhlM.C_WH_CODE       = "0";
                            kpResult[i].N_STATUS = 0;
                            xhlM.N_TOTAL_QUA     = xhlM.N_QUA + dal.GetVirtualXLocMaxQua();
                            xhlM.N_NUM           = 0;
                            kpResult[i].WhCode   = xhlM.C_WH_CODE;
                            kpResult[i].Num      = xhlM.N_NUM;
                        }

                        dal_TPA_HL_PLAN.Add(xhlM);
                        hlPlans.Add(xhlM);
                        #endregion

                        #region 计算修磨时间(需要缓冷)
                        if (kpResult[i].C_XM == "Y")
                        {
                            kpResult[i].D_XM_START_TIME = kpResult[i].D_HL_END_TIME.Value.AddHours(kp_hl);
                            decimal?d = kpResult[i].N_SLAB_WGT / (400 / 24);
                            kpResult[i].D_XM_END_TIME      = kpResult[i].D_XM_START_TIME.Value.AddHours((double)d);
                            kpResult[i].CalCulateTimeStart = kpResult[i].D_XM_END_TIME;
                            xmResult.Add(kpResult[i]);
                        }
                        #endregion
                    }
                    else if (kpResult[i].C_XM == "Y")
                    {
                        #region 计算修磨时间
                        kpResult[i].D_XM_START_TIME = kpResult[i].D_KP_END_TIME.Value.AddHours(kp_xm);
                        decimal?d = kpResult[i].N_SLAB_WGT / (400 / 24);
                        kpResult[i].D_XM_END_TIME      = kpResult[i].D_XM_START_TIME.Value.AddHours((double)d);
                        kpResult[i].CalCulateTimeStart = kpResult[i].D_XM_END_TIME;
                        xmResult.Add(kpResult[i]);
                        #endregion
                    }
                }

                #region 计算修磨顺序
                xmResult = xmResult.OrderBy(x => x.D_XM_START_TIME)
                           .ToList();
                for (int j = 1; j < xmResult.Count; j++)
                {
                    //如果修磨时间互斥,重新计算修磨时间
                    if (xmResult[j].D_XM_START_TIME < xmResult[j - 1].D_XM_END_TIME)
                    {
                        xmResult[j].D_XM_START_TIME = xmResult[j - 1].D_XM_END_TIME;
                        decimal?d = xmResult[j].N_SLAB_WGT / (400 / 24);
                        xmResult[j].D_XM_END_TIME = xmResult[j].D_XM_START_TIME.Value.AddHours((double)d);
                    }
                }
                xmResult = xmResult.OrderBy(x => x.D_XM_START_TIME)
                           .ToList();

                foreach (var xm in xmResult)
                {
                    Mod_TPA_XM_PLAN xmM = new Mod_TPA_XM_PLAN();
                    xmM.C_ID         = Guid.NewGuid().ToString("N");
                    xmM.C_STOVE_NO   = xm.C_STOVE_NO;
                    xmM.C_STL_GRD    = xm.C_STL_GRD;
                    xmM.C_STD_CODE   = xm.C_STD_CODE;
                    xmM.N_WGT        = xm.N_SLAB_WGT;
                    xmM.N_CN         = xm.N_SLAB_WGT / (400 / 24);
                    xmM.D_PLAN_DATE  = xm.D_XM_START_TIME;
                    xmM.D_START_TIME = xm.D_XM_START_TIME;
                    xmM.D_END_TIME   = xm.D_XM_END_TIME;
                    xmM.N_STATUS     = 0;
                    xmM.C_CCM        = xm.C_CCM_DESC;
                    xmM.C_FK         = xm.C_ID;
                    xmM.C_XM_TYPE    = "碳钢";
                    xmPlans.Add(xmM);
                }


                #endregion

                #region 计算缓冷坑最大出坑时间(小方坯)
                var useDX = dal.GetUsedXLoc();
                if (useDX != null && useDX.Rows.Count > 0)
                {
                    var uCount = useDX.Rows.Count;
                    for (int i = 0; i < uCount; i++)
                    {
                        for (int j = 0; j < int.Parse(useDX.Rows[i]["N_NUM"].ToString()); j++)
                        {
                            var outPitDt = dal.GetOutPitXTime(useDX.Rows[j]["C_WH_CODE"].ToString(), j + 1);
                            if (outPitDt != null && outPitDt.Rows.Count > 0)
                            {
                                int nCount = outPitDt.Rows.Count;
                                for (int n = 0; n < nCount; n++)
                                {
                                    string   c_fk          = outPitDt.Rows[n]["C_FK"].ToString();
                                    DateTime overtime      = DateTime.Parse(outPitDt.Rows[n]["D_OVER_TIME"].ToString());
                                    var      resetOutTimes = smsModels.Where(x => x.C_ID == c_fk).ToList();
                                    if (resetOutTimes.Count > 0)
                                    {
                                        resetOutTimes[0].D_HL_END_TIME = overtime;
                                    }
                                }
                            }
                        }
                    }
                }
                #endregion
                TransactionHelper.BeginTransaction();

                foreach (var kpPlan in kpPlans)
                {
                    if (!dal_TPA_KP_PLAN.TranAdd(kpPlan))
                    {
                        TransactionHelper.RollBack();
                        dal.DelDfpHl(dhlPlans);
                        dal.DelHl(hlPlans);
                        processResult = smsModels;
                        return("0");
                    }
                }

                foreach (var xmPlan in xmPlans)
                {
                    if (!dal_TPA_XM_PLAN.TranAdd(xmPlan))
                    {
                        TransactionHelper.RollBack();
                        dal.DelDfpHl(dhlPlans);
                        dal.DelHl(hlPlans);
                        processResult = smsModels;
                        return("0");
                    }
                }

                if (!dal.DelSms(smsModels))
                {
                    TransactionHelper.RollBack();
                    dal.DelDfpHl(dhlPlans);
                    dal.DelHl(hlPlans);
                    processResult = smsModels;
                    return("0");
                }

                foreach (var sms in smsModels)
                {
                    sms.N_CREAT_PLAN = 2;
                    if (!dal_TSP_PLAN_SMS.TranAdd(sms))
                    {
                        TransactionHelper.RollBack();
                        dal.DelDfpHl(dhlPlans);
                        dal.DelHl(hlPlans);
                        processResult = smsModels;
                        return("0");
                    }
                }

                TransactionHelper.Commit();

                processResult = kpResult;
            }
            catch (Exception e)
            {
                TransactionHelper.RollBack();
                dal.DelDfpHl(dhlPlans);
                dal.DelHl(hlPlans);
                processResult = kpResult;
                return("0");
            }
            return(result);
        }
コード例 #6
0
 /// <summary>
 /// 更新一条数据
 /// </summary>
 public bool Update(Mod_TPA_HL_PLAN model)
 {
     return(dal.Update(model));
 }
コード例 #7
0
 /// <summary>
 /// 增加一条数据
 /// </summary>
 public bool Add(Mod_TPA_HL_PLAN model)
 {
     return(dal.Add(model));
 }
コード例 #8
0
        private static List <Mod_TPA_HL_ACT> hl_acl     = new List <Mod_TPA_HL_ACT>();    //已排产未完成的计划

        #region 更新各个工序计划LIST
        public static List <Mod_TSP_CAST_PLAN> Sort_GX_Plan(List <Mod_TSP_CAST_PLAN> lst)
        {
            #region 重新初始化各工序计划
            dhl_plan = bll_dhl.GetModelList(" AND C_STOVE_NO IS  NULL ");  //已排产大方坯缓冷未完成计划
            kp_plan  = bll_kp.GetModelList("  AND C_STOVE_NO IS  NULL  "); //已排产大方坯开坯未完成
            hl_plan  = bll_hl.GetModelList("  AND C_STOVE_NO IS  NULL ");  //已排产热轧坯缓冷未完成计划
            xm_plan  = bll_xm.GetModelList("  AND C_STOVE_NO IS  NULL  "); //已排产修磨未完成计划
            lc_plan  = bll_plan_sms.GetModelList(" N_CREAT_PLAN<3 ");      //已排产未完成的计划
            hl_acl   = bll_hl_act.GetModelList("");                        //已排产未完成的计划
            #endregion
            #region 在list中将待排产的浇次排产
            for (int j = 0; j < lst.Count; j++)
            {
                List <Mod_TSP_PLAN_SMS> lst_lc = bll_plan_sms.GetModelListByJcID(lst[j].C_ID);
                if (lst_lc.Count > 0)
                {
                    #region 将炉次计划的工序计划插入到工序计划list表中
                    DateTime D_P_START_TIME = (DateTime)lst[j].D_P_START_TIME;

                    for (int lc = 0; lc < lst_lc.Count; lc++)
                    {
                        #region 更新炉次计划时间
                        lst_lc[lc].N_SORT         = lc + 1;
                        lst_lc[lc].N_JC_SORT      = lst[j].N_SORT;
                        lst_lc[lc].N_USE_WGT      = lst_lc[lc].N_SLAB_WGT;
                        lst_lc[lc].D_P_START_TIME = D_P_START_TIME;
                        lst_lc[lc].D_P_END_TIME   = D_P_START_TIME.AddHours(Convert.ToDouble(lst_lc[lc].N_SLAB_WGT / lst_lc[lc].N_JSCN));
                        D_P_START_TIME            = (DateTime)lst_lc[lc].D_P_END_TIME;//下一炉的开始时间
                        #endregion
                        #region 插入大方坯缓冷计划
                        if (lst_lc[lc].C_DFP_HL == "Y")
                        {
                            DateTime?        D_OVER_TIME = null;//进入坑的坑的结束时间
                            Mod_TPA_DHL_PLAN mod_dhl     = new Mod_TPA_DHL_PLAN();
                            mod_dhl.C_ID         = System.Guid.NewGuid().ToString();
                            mod_dhl.C_FK         = lst_lc[lc].C_ID;
                            mod_dhl.C_STL_GRD    = lst_lc[lc].C_STL_GRD;
                            mod_dhl.C_STD_CODE   = lst_lc[lc].C_STD_CODE;
                            mod_dhl.C_CCM        = lst_lc[lc].C_CCM_DESC;
                            mod_dhl.C_HLYQ       = lst_lc[lc].C_DFP_YQ;
                            mod_dhl.N_HL_TIME    = lst_lc[lc].N_DFP_HL_TIME;
                            mod_dhl.N_QUA        = 19;
                            mod_dhl.C_HLYQ       = lst_lc[lc].C_DFP_YQ;
                            mod_dhl.D_START_TIME = Convert.ToDateTime(lst_lc[lc].D_P_START_TIME).AddHours(2);
                            mod_dhl.D_END_TIME   = Convert.ToDateTime(lst_lc[lc].D_P_START_TIME).AddHours(2).AddHours(Convert.ToDouble(mod_dhl.N_HL_TIME));                                                                                                                                                                                                                                                                                                                                                                          //计划缓冷结束时间
                            var lstdhl = dhl_plan.Where(a => a.D_OVER_TIME > mod_dhl.D_START_TIME && a.C_WH_CODE != "0" && a.D_START_TIME < mod_dhl.D_START_TIME).GroupBy(a => new { a.C_WH_CODE, a.N_NUM }).Select(a => new { wh = a.First().C_WH_CODE, total_qua = a.Sum(p => p.N_QUA), cap = a.Max(p => p.N_CAP), left = a.Max(p => p.N_CAP) - a.Sum(p => p.N_QUA), num = a.Max(p => p.N_NUM), over_time = a.Max(p => p.D_END_TIME) }).ToList().Where(a => a.left >= mod_dhl.N_QUA).OrderByDescending(a => a.over_time).ToList(); //查找缓冷未结束的有空闲的坑按缓冷结束时间倒序;
                            if (lstdhl.Count > 0)
                            {
                                mod_dhl.C_WH_CODE   = lstdhl[0].wh;
                                mod_dhl.N_TOTAL_QUA = 19 + lstdhl[0].total_qua;
                                mod_dhl.N_NUM       = lstdhl[0].num;
                                mod_dhl.N_CAP       = lstdhl[0].cap;
                                D_OVER_TIME         = lstdhl[0].over_time;

                                if (mod_dhl.D_END_TIME > lstdhl[0].over_time)
                                {
                                    D_OVER_TIME = mod_dhl.D_END_TIME;
                                }
                                mod_dhl.D_OVER_TIME = D_OVER_TIME;
                                dhl_plan.Add(mod_dhl);
                                //跟新当前坑的结束时间
                                var lstUpdateOverTime = dhl_plan.Where(a => a.C_WH_CODE == mod_dhl.C_WH_CODE && a.N_NUM == mod_dhl.N_NUM).ToList();
                            }
                            else
                            {
                                var lstdhl2 = dhl_plan.Where(a => a.C_WH_CODE != "0").GroupBy(a => new { a.C_WH_CODE }).Select(a => new { wh = a.First().C_WH_CODE, total_qua = a.Sum(p => p.N_QUA), cap = a.Max(p => p.N_CAP), left = a.Max(p => p.N_CAP) - a.Sum(p => p.N_QUA), num = a.Max(p => p.N_NUM), over_time = a.Max(p => p.D_END_TIME) }).ToList().Where(a => a.over_time < mod_dhl.D_START_TIME).OrderBy(a => a.over_time).ToList();//查找已缓冷结束的坑
                                if (lstdhl2.Count > 0)
                                {
                                    mod_dhl.C_WH_CODE   = lstdhl2[0].wh;
                                    mod_dhl.N_TOTAL_QUA = 19;
                                    mod_dhl.N_NUM       = lstdhl2[0].num + 1;
                                    D_OVER_TIME         = mod_dhl.D_END_TIME;
                                    mod_dhl.N_CAP       = lstdhl2[0].cap;
                                    mod_dhl.D_OVER_TIME = D_OVER_TIME;
                                    dhl_plan.Add(mod_dhl);
                                    //更新当前坑的结束时间
                                }
                                else
                                {
                                    var list1 = dhl_plan.GroupBy(a => a.C_WH_CODE).Select(a => new { a.First().C_WH_CODE }).ToList();
                                    var list2 = hl_acl.Where(a => a.C_SLAB_TYPE == "大方坯" && a.N_QUA == 0).GroupBy(a => a.C_WH_CODE).Select(a => new { a.First().C_WH_CODE }).ToList();

                                    var expectedList = list2.Except(list1).ToList().OrderBy(a => a.C_WH_CODE).ToList();

                                    //从没有使用过的缓冷坑找一个坑使用
                                    var lstdhl_act = hl_acl.Where(a => a.C_WH_CODE == expectedList[0].C_WH_CODE).ToList();
                                    if (lstdhl_act.Count > 0)
                                    {
                                        foreach (var item in hl_acl)
                                        {
                                            if (item.C_ID == lstdhl_act[0].C_ID)
                                            {
                                                item.N_QUA = Convert.ToDecimal(mod_dhl.N_QUA);
                                            }
                                        }

                                        mod_dhl.C_WH_CODE   = expectedList[0].C_WH_CODE;
                                        mod_dhl.N_TOTAL_QUA = 19;
                                        mod_dhl.N_CAP       = lstdhl_act[0].N_CAP_QUA;
                                        mod_dhl.N_NUM       = dhl_plan.Where(a => a.C_WH_CODE == mod_dhl.C_WH_CODE).Max(a => a.N_NUM) == null ? 0 : dhl_plan.Where(a => a.C_WH_CODE == mod_dhl.C_WH_CODE).Max(a => a.N_NUM) + 1;
                                        mod_dhl.D_OVER_TIME = mod_dhl.D_END_TIME;
                                        dhl_plan.Add(mod_dhl);
                                    }
                                    else
                                    {
                                        hl_acl[0].N_QUA     = Convert.ToDecimal(mod_dhl.N_QUA);
                                        mod_dhl.C_WH_CODE   = "0";
                                        mod_dhl.N_TOTAL_QUA = 19;
                                        mod_dhl.N_CAP       = 10000;
                                        mod_dhl.N_NUM       = 1;
                                        mod_dhl.D_OVER_TIME = mod_dhl.D_END_TIME;
                                        dhl_plan.Add(mod_dhl);
                                    }
                                }
                            }

                            lst_lc[lc].D_DFPHL_START_TIME = mod_dhl.D_START_TIME;
                            lst_lc[lc].D_DFPHL_END_TIME   = mod_dhl.D_OVER_TIME;
                        }
                        #endregion
                        #region 插入开坯计划

                        Mod_TPA_KP_PLAN mod_kp = new Mod_TPA_KP_PLAN();
                        mod_kp.C_ID             = System.Guid.NewGuid().ToString();
                        mod_kp.C_FK             = lst_lc[lc].C_ID;
                        mod_kp.C_STL_GRD        = lst_lc[lc].C_STL_GRD;
                        mod_kp.C_STD_CODE       = lst_lc[lc].C_STD_CODE;
                        mod_kp.C_CCM            = lst_lc[lc].C_CCM_DESC;
                        mod_kp.D_CAN_START_TIME = lst_lc[lc].C_DFP_HL == "Y" ? Convert.ToDateTime(lst_lc[lc].D_DFPHL_END_TIME).AddHours(1) : Convert.ToDateTime(lst_lc[lc].D_P_START_TIME).AddHours(2); //可开坯时间
                        mod_kp.N_WGT            = lst_lc[lc].N_SLAB_WGT;
                        mod_kp.N_CN             = 114;                                                                                                                                                  //机时产能
                        mod_kp.C_DHL            = lst_lc[lc].C_HL;                                                                                                                                      //热轧钢坯是否缓冷
                        mod_kp.C_DFP_RZ         = lst_lc[lc].C_DFP_RZ;                                                                                                                                  //大方坯是否热装
                        mod_kp.C_DFP_YQ         = lst_lc[lc].C_DFP_YQ;                                                                                                                                  //大方坯缓冷要求

                        mod_kp.C_MATRL_CODE_SLAB = lst_lc[lc].C_MATRL_NO;
                        mod_kp.C_MATRL_NAME_SLAB = lst_lc[lc].C_MATRL_NAME;
                        mod_kp.C_MATRL_CODE_KP   = lst_lc[lc].C_MATRL_CODE_KP;
                        mod_kp.C_MATRL_NAME_KP   = lst_lc[lc].C_MATRL_NAME_KP;
                        mod_kp.C_KP_SIZE         = lst_lc[lc].C_KP_SIZE;
                        mod_kp.N_KP_LENGTH       = lst_lc[lc].N_KP_LENGTH;
                        mod_kp.N_KP_PW           = lst_lc[lc].N_KP_PW;

                        mod_kp.N_SLAB_LENGTH = Convert.ToDecimal(lst_lc[lc].C_SLAB_LENGTH);
                        mod_kp.C_SLAB_SIZE   = lst_lc[lc].C_SLAB_SIZE;
                        mod_kp.N_SLAB_PW     = lst_lc[lc].N_SLAB_PW;

                        if (mod_kp.C_DFP_RZ == "Y" || mod_kp.C_DFP_YQ.Trim() != "")
                        {
                            //必需热轧
                            DateTime?dtjhkssj  = null;
                            var      lstlastkp = kp_plan.Where(a => a.D_START_TIME <= Convert.ToDateTime(lst_lc[lc].D_P_START_TIME).AddHours(2)).ToList();
                            if (lstlastkp.Count > 0)
                            {
                                dtjhkssj = (DateTime)kp_plan.Where(a => a.D_START_TIME <= Convert.ToDateTime(lst_lc[lc].D_P_START_TIME).AddHours(2)).Max(a => a.D_END_TIME);
                                if (dtjhkssj < Convert.ToDateTime(lst_lc[lc].D_P_START_TIME).AddHours(2))
                                {
                                    dtjhkssj = Convert.ToDateTime(lst_lc[lc].D_P_START_TIME).AddHours(2);
                                }
                                mod_kp.N_SORT = kp_plan.Where(a => a.D_START_TIME <= Convert.ToDateTime(lst_lc[lc].D_P_START_TIME).AddHours(2)).Max(a => a.N_SORT) + 1;//开坯计划排序号
                            }
                            else
                            {
                                mod_kp.N_SORT = 1;
                            }
                            mod_kp.D_START_TIME = dtjhkssj;                                                            //开坯计划开始时间
                            mod_kp.D_END_TIME   = ((DateTime)dtjhkssj).AddHours((double)(mod_kp.N_WGT / mod_kp.N_CN)); //开坯计划结束时间
                                                                                                                       //将当前计划之后的计划时间全都重新计算
                            var updatelist = kp_plan.Where(a => a.N_SORT > mod_kp.N_SORT - 1).OrderBy(a => a.N_SORT).ToList();
                            if (updatelist.Count > 0)
                            {
                                DateTime dtB2 = (DateTime)mod_kp.D_END_TIME;
                                for (int m = 0; m < updatelist.Count; m++)
                                {
                                    updatelist[m].N_SORT       = updatelist[m].N_SORT + 1;
                                    updatelist[m].D_START_TIME = dtB2;
                                    updatelist[m].D_END_TIME   = dtB2.AddHours((double)(updatelist[m].N_WGT / updatelist[m].N_CN));
                                    dtB2 = (DateTime)updatelist[m].D_END_TIME;
                                }
                            }
                        }
                        else
                        {
                            int      kpsort   = 0;
                            DateTime dtjhkssj = (DateTime)mod_kp.D_CAN_START_TIME;
                            if (kp_plan.Count == 0)
                            {
                                dtjhkssj = (DateTime)mod_kp.D_CAN_START_TIME;
                            }
                            else
                            {
                                dtjhkssj = (DateTime)kp_plan.Max(a => a.D_END_TIME);
                                kpsort   = (int)kp_plan.Max(a => a.N_SORT);
                            }

                            if (dtjhkssj < mod_kp.D_CAN_START_TIME)
                            {
                                dtjhkssj = (DateTime)mod_kp.D_CAN_START_TIME;
                            }
                            mod_kp.N_SORT       = kpsort + 1;                                              //开坯计划排序号
                            mod_kp.D_START_TIME = dtjhkssj;                                                //开坯计划开始时间
                            mod_kp.D_END_TIME   = dtjhkssj.AddHours((double)(mod_kp.N_WGT / mod_kp.N_CN)); //开坯计划结束时间
                        }
                        kp_plan.Add(mod_kp);
                        lst_lc[lc].D_KP_START_TIME = mod_kp.D_START_TIME;
                        lst_lc[lc].D_KP_END_TIME   = mod_kp.D_END_TIME;
                        if (lst_lc[lc].C_HL == "N" && lst_lc[lc].C_XM == "N")
                        {
                            lst_lc[lc].D_CAN_USE_TIME = ((DateTime)mod_kp.D_START_TIME).AddHours(2);
                        }
                        #endregion
                        #region 插入热轧坯缓冷计划
                        if (lst_lc[lc].C_HL == "Y")
                        {
                            DateTime?       D_OVER_TIME = null;//进入坑的坑的结束时间
                            Mod_TPA_HL_PLAN mod_hl      = new Mod_TPA_HL_PLAN();
                            mod_hl.C_ID         = System.Guid.NewGuid().ToString();
                            mod_hl.C_FK         = lst_lc[lc].C_ID;
                            mod_hl.C_STL_GRD    = lst_lc[lc].C_STL_GRD;
                            mod_hl.C_STD_CODE   = lst_lc[lc].C_STD_CODE;
                            mod_hl.C_CCM        = lst_lc[lc].C_CCM_DESC;
                            mod_hl.C_HLYQ       = lst_lc[lc].C_RZP_YQ;
                            mod_hl.N_HL_TIME    = lst_lc[lc].N_HL_TIME;
                            mod_hl.N_QUA        = 38;
                            mod_hl.C_HLYQ       = lst_lc[lc].C_DFP_YQ;
                            mod_hl.D_START_TIME = Convert.ToDateTime(lst_lc[lc].D_KP_START_TIME).AddHours(2);
                            mod_hl.D_END_TIME   = Convert.ToDateTime(lst_lc[lc].D_KP_START_TIME).AddHours(2).AddHours(Convert.ToDouble(mod_hl.N_HL_TIME));                                                                                                                                                                                                                                                                                                                                                                   //计划缓冷结束时间
                            var lstdhl = hl_plan.Where(a => a.D_OVER_TIME > mod_hl.D_START_TIME && a.C_WH_CODE != "0" && a.D_START_TIME < mod_hl.D_START_TIME).GroupBy(a => new { a.C_WH_CODE, a.N_NUM }).Select(a => new { wh = a.First().C_WH_CODE, num = a.First().N_NUM, total_qua = a.Sum(p => p.N_QUA), cap = a.Max(p => p.N_CAP), left = a.Max(p => p.N_CAP) - a.Sum(p => p.N_QUA), over_time = a.Max(p => p.D_END_TIME) }).ToList().Where(a => a.left >= mod_hl.N_QUA).OrderByDescending(a => a.over_time).ToList(); //查找缓冷未结束的有空闲的坑按缓冷结束时间倒序;
                            if (lstdhl.Count > 0)
                            {
                                mod_hl.C_WH_CODE   = lstdhl[0].wh;
                                mod_hl.N_TOTAL_QUA = 38 + lstdhl[0].total_qua;
                                mod_hl.N_NUM       = lstdhl[0].num;
                                mod_hl.N_CAP       = lstdhl[0].cap;
                                D_OVER_TIME        = lstdhl[0].over_time;
                                if (mod_hl.D_END_TIME > lstdhl[0].over_time)
                                {
                                    D_OVER_TIME = mod_hl.D_END_TIME;
                                }
                                mod_hl.D_OVER_TIME = D_OVER_TIME;
                                hl_plan.Add(mod_hl);
                                //跟新当前坑的结束时间
                                var lstUpdateOverTime = hl_plan.Where(a => a.C_WH_CODE == mod_hl.C_WH_CODE && a.N_NUM == mod_hl.N_NUM).ToList();
                            }
                            else
                            {
                                var lstdhl2 = hl_plan.Where(a => a.C_WH_CODE != "0").GroupBy(a => new { a.C_WH_CODE }).Select(a => new { wh = a.First().C_WH_CODE, num = a.First().N_NUM, total_qua = a.Sum(p => p.N_QUA), cap = a.Max(p => p.N_CAP), left = a.Max(p => p.N_CAP) - a.Sum(p => p.N_QUA), over_time = a.Max(p => p.D_END_TIME) }).ToList().Where(a => a.over_time < mod_hl.D_START_TIME).OrderBy(a => a.over_time).ToList();//查找缓冷坑缓冷已结束的坑
                                if (lstdhl2.Count > 0)
                                {
                                    mod_hl.C_WH_CODE   = lstdhl2[0].wh;
                                    mod_hl.N_TOTAL_QUA = 38;
                                    mod_hl.N_NUM       = lstdhl2[0].num + 1;
                                    D_OVER_TIME        = mod_hl.D_END_TIME;
                                    mod_hl.N_CAP       = lstdhl2[0].cap;
                                    mod_hl.D_OVER_TIME = D_OVER_TIME;
                                    hl_plan.Add(mod_hl);
                                    //更新当前坑的结束时间
                                }
                                else
                                {
                                    var list1        = hl_plan.GroupBy(a => a.C_WH_CODE).Select(a => new { a.First().C_WH_CODE }).ToList();
                                    var list2        = hl_acl.Where(a => a.C_SLAB_TYPE == "小方坯" && a.N_QUA == 0).GroupBy(a => a.C_WH_CODE).Select(a => new { a.First().C_WH_CODE }).ToList();
                                    var expectedList = list2.Except(list1).ToList().OrderBy(a => a.C_WH_CODE).ToList();
                                    if (expectedList.Count > 0)
                                    {
                                        //从没有使用过的缓冷坑找一个坑使用
                                        var lstdhl_act = hl_acl.Where(a => a.C_WH_CODE == expectedList[0].C_WH_CODE).ToList();
                                        if (lstdhl_act.Count > 0)
                                        {
                                            foreach (var item in hl_acl)
                                            {
                                                if (item.C_ID == lstdhl_act[0].C_ID)
                                                {
                                                    item.N_QUA = Convert.ToDecimal(mod_hl.N_QUA);
                                                }
                                            }
                                            //从没有使用过的缓冷坑找一个坑使用
                                            mod_hl.C_WH_CODE   = expectedList[0].C_WH_CODE;
                                            mod_hl.N_TOTAL_QUA = 38;
                                            mod_hl.N_CAP       = lstdhl_act[0].N_CAP_QUA;
                                            mod_hl.N_NUM       = dhl_plan.Where(a => a.C_WH_CODE == mod_hl.C_WH_CODE).Max(a => a.N_NUM) == null ? 0 : dhl_plan.Where(a => a.C_WH_CODE == mod_hl.C_WH_CODE).Max(a => a.N_NUM) + 1;
                                            mod_hl.D_OVER_TIME = mod_hl.D_END_TIME;
                                            hl_plan.Add(mod_hl);
                                        }
                                        else
                                        {
                                            hl_acl[0].N_QUA    = Convert.ToDecimal(mod_hl.N_QUA);
                                            mod_hl.C_WH_CODE   = "0";
                                            mod_hl.N_TOTAL_QUA = 38;
                                            mod_hl.N_CAP       = 10000;
                                            mod_hl.N_NUM       = 1;
                                            mod_hl.D_OVER_TIME = mod_hl.D_END_TIME;
                                            hl_plan.Add(mod_hl);
                                        }
                                    }
                                    else
                                    {
                                        hl_acl[0].N_QUA    = Convert.ToDecimal(mod_hl.N_QUA);
                                        mod_hl.C_WH_CODE   = "0";
                                        mod_hl.N_TOTAL_QUA = 38;
                                        mod_hl.N_CAP       = 10000;
                                        mod_hl.N_NUM       = 1;
                                        mod_hl.D_OVER_TIME = mod_hl.D_END_TIME;
                                        hl_plan.Add(mod_hl);
                                    }
                                }
                            }

                            lst_lc[lc].D_HL_START_TIME = mod_hl.D_START_TIME;
                            lst_lc[lc].D_HL_END_TIME   = mod_hl.D_OVER_TIME;
                            if (lst_lc[lc].C_XM == "N")
                            {
                                if (mod_hl.D_OVER_TIME == null)
                                {
                                    lst_lc[lc].D_CAN_USE_TIME = null;
                                }
                                else
                                {
                                    lst_lc[lc].D_CAN_USE_TIME = ((DateTime)mod_hl.D_OVER_TIME).AddHours(2);
                                }
                            }
                        }
                        #endregion
                        #region 插入修磨计划

                        if (lst_lc[lc].C_XM == "Y")
                        {
                            Mod_TPA_XM_PLAN mod_xm = new Mod_TPA_XM_PLAN();
                            mod_xm.C_ID        = System.Guid.NewGuid().ToString();
                            mod_xm.C_FK        = lst_lc[lc].C_ID;
                            mod_xm.C_STL_GRD   = lst_lc[lc].C_STL_GRD;
                            mod_xm.C_STD_CODE  = lst_lc[lc].C_STD_CODE;
                            mod_xm.C_CCM       = lst_lc[lc].C_CCM_DESC;
                            mod_xm.D_PLAN_DATE = lst_lc[lc].C_HL == "Y" ? Convert.ToDateTime(lst_lc[lc].D_HL_END_TIME).AddHours(1) : Convert.ToDateTime(lst_lc[lc].D_KP_END_TIME).AddHours(12);//可修磨时间
                            mod_xm.N_WGT       = lst_lc[lc].N_SLAB_WGT;
                            mod_xm.C_XM_TYPE   = "碳钢";
                            mod_xm.N_CN        = 400 / 24;                                                       //机时产能
                            DateTime maxxmtime = (DateTime)mod_xm.D_PLAN_DATE;
                            DateTime?maxsytime = xm_plan.Where(a => a.C_XM_TYPE == "碳钢").Max(a => a.D_END_TIME); //找出已排计划最大修磨结束时间
                            if (maxsytime != null && maxsytime >= maxxmtime)
                            {
                                maxxmtime = (DateTime)maxsytime;
                            }
                            mod_xm.D_START_TIME = maxxmtime;
                            mod_xm.D_END_TIME   = maxxmtime.AddHours((double)(mod_xm.N_WGT / mod_xm.N_CN));
                            xm_plan.Add(mod_xm);
                            lst_lc[lc].D_XM_START_TIME = mod_xm.D_START_TIME;
                            lst_lc[lc].D_XM_END_TIME   = mod_xm.D_END_TIME;
                            lst_lc[lc].D_CAN_USE_TIME  = ((DateTime)mod_xm.D_END_TIME).AddHours(2);
                        }
                        #endregion
                        bll_plan_sms.Update(lst_lc[lc]);
                    }
                    #endregion
                }

                bll_cast_plan.Update(lst[j]);
            }
            #endregion

            #region 添加工序计划

            if (dhl_plan.Count > 0)
            {
                for (int i = 0; i < dhl_plan.Count; i++)
                {
                    bll_dhl.Add(dhl_plan[i]);
                }
            }


            if (kp_plan.Count > 0)
            {
                for (int i = 0; i < kp_plan.Count; i++)
                {
                    bll_kp.Add(kp_plan[i]);
                }
            }
            if (hl_plan.Count > 0)
            {
                for (int i = 0; i < hl_plan.Count; i++)
                {
                    bll_hl.Add(hl_plan[i]);
                }
            }
            if (xm_plan.Count > 0)
            {
                for (int i = 0; i < xm_plan.Count; i++)
                {
                    bll_xm.Add(xm_plan[i]);
                }
            }
            #endregion
            return(lst);
        }