Example #1
0
        /// <summary>
        /// 检查是否要HOLD批次。如果需要HOLD批次,则HOLD批次。
        /// </summary>
        /// <param name="dbtran">数据库事务对象。。</param>
        /// <param name="lotKey">批次主键。</param>
        /// <param name="stepKey">工步主键。</param>
        /// <param name="shiftName">班别名称。</param>
        /// <param name="shiftKey">班别主键。</param>
        /// <param name="editor">编辑人。</param>
        /// <param name="oprComputer">操作计算机名称。</param>
        /// <param name="editTimeZone">编辑时间时区。</param>
        /// <param name="action">动作名称。<see cref="COMMON_FIELDS.FIELD_ACTIVITY_TRACKIN"/>或者<see cref="COMMON_FIELDS.FIELD_ACTIVITY_TRACKOUT"/></param>
        /// <returns>触发预设暂停的个数。0:没有批次被HOLD。>0:该批次被HOLD。</returns>
        private int CheckAndUpdateFutureHold(DbTransaction dbtran, string lotKey, string stepKey,
                                             string shiftName, string shiftKey,
                                             string editor, string oprComputer, string editTimeZone, string action)
        {
            string    sql   = @"SELECT * FROM WIP_FUTUREHOLD 
                           WHERE LOT_KEY=@lotKey AND STEP_KEY=@stepKey AND STATUS=1 AND ACTION_NAME=@action
                           ORDER BY EDIT_TIME DESC";
            DbCommand dbCmd = db.GetSqlStringCommand(sql);

            db.AddInParameter(dbCmd, "lotKey", DbType.String, lotKey);
            db.AddInParameter(dbCmd, "stepKey", DbType.String, stepKey);
            db.AddInParameter(dbCmd, "action", DbType.String, action);
            DataSet dsFutureHold = db.ExecuteDataSet(dbCmd, dbtran);
            int     nRet         = 0;

            if (dsFutureHold != null && dsFutureHold.Tables.Count > 0 && dsFutureHold.Tables[0].Rows.Count > 0)
            {
                DataTable dtFutureHold = dsFutureHold.Tables[0];
                DataRow   drFutureHold = dtFutureHold.Rows[0];

                string transactionKey = UtilHelper.GenerateNewKey(0);
                string rcCodeKey      = Convert.ToString(drFutureHold[WIP_FUTUREHOLD_FIELDS.FIELDS_REASON_CODE_KEY]);
                string rcCodeName     = Convert.ToString(drFutureHold[WIP_FUTUREHOLD_FIELDS.FIELDS_REASON_CODE]);
                string comment        = Convert.ToString(drFutureHold[WIP_FUTUREHOLD_FIELDS.FIELDS_REMARK]);
                string opUser         = Convert.ToString(drFutureHold[WIP_FUTUREHOLD_FIELDS.FIELDS_EDITOR]);

                Hashtable htParams = new Hashtable();
                htParams[POR_LOT_FIELDS.FIELD_LOT_KEY] = lotKey;
                htParams[WIP_TRANSACTION_FIELDS.FIELD_TRANSACTION_KEY]   = transactionKey;
                htParams[WIP_HOLD_RELEASE_FIELDS.FIELD_REASON_CODE_KEY]  = rcCodeKey;
                htParams[WIP_HOLD_RELEASE_FIELDS.FIELD_REASON_CODE_NAME] = rcCodeName;
                htParams[WIP_TRANSACTION_FIELDS.FIELD_ACTIVITY_COMMENT]  = comment;
                htParams[WIP_TRANSACTION_FIELDS.FIELD_SHIFT_NAME]        = shiftName;
                htParams[WIP_TRANSACTION_FIELDS.FIELD_SHIFT_KEY]         = shiftKey;
                htParams[WIP_TRANSACTION_FIELDS.FIELD_OPR_COMPUTER]      = oprComputer;
                htParams[WIP_TRANSACTION_FIELDS.FIELD_OPERATOR]          = opUser;
                htParams[WIP_TRANSACTION_FIELDS.FIELD_EDITOR]            = opUser;
                htParams[WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIMEZONE_KEY] = editTimeZone;
                DataTable dtParams = SolarViewer.Hemera.Share.Common.CommonUtils.ParseToDataTable(htParams);
                dtParams.TableName = TRANS_TABLES.TABLE_MAIN_DATA;
                DataSet dsParams = new DataSet();
                dsParams.Tables.Add(dtParams);

                WipManagement.HoldLot(db, dbtran, dsParams);

                sql = @"UPDATE WIP_FUTUREHOLD 
                        SET STATUS=0,EDITOR=@editor,EDIT_TIME= GETDATE()
                        WHERE LOT_KEY=@lotKey AND STEP_KEY=@stepKey AND STATUS=1 AND ACTION_NAME=@action";

                dbCmd = db.GetSqlStringCommand(sql);
                db.AddInParameter(dbCmd, "lotKey", DbType.String, lotKey);
                db.AddInParameter(dbCmd, "stepKey", DbType.String, stepKey);
                db.AddInParameter(dbCmd, "action", DbType.String, action);
                db.AddInParameter(dbCmd, "editor", DbType.String, editor);
                nRet = db.ExecuteNonQuery(dbCmd, dbtran);
            }
            return(nRet);
        }
Example #2
0
        /// <summary>
        /// 批次终结操作。
        /// </summary>
        /// <param name="dsParams">包含批次终结数据的数据集。</param>
        /// <returns>包含执行结果的数据集。</returns>
        public DataSet TerminalLot(DataSet dsParams)
        {
            DateTime startTime = DateTime.Now;

            DataSet       dsReturn = new DataSet();
            DbConnection  dbConn   = null;
            DbTransaction dbTran   = null;

            try
            {
                dbConn = db.CreateConnection();
                dbConn.Open();
                //Create Transaction
                dbTran = dbConn.BeginTransaction();
                #region CheckExpired
                if (dsParams.Tables.Contains(TRANS_TABLES.TABLE_PARAM))
                {
                    DataTable dtParams    = dsParams.Tables[TRANS_TABLES.TABLE_PARAM];
                    Hashtable htParams    = SolarViewer.Hemera.Share.Common.CommonUtils.ConvertToHashtable(dtParams);
                    string    lotKey      = htParams[POR_LOT_FIELDS.FIELD_LOT_KEY].ToString();
                    string    strEditTime = htParams[POR_LOT_FIELDS.FIELD_EDIT_TIME].ToString();

                    KeyValuePair <string, string>         kvp           = new KeyValuePair <string, string>(POR_LOT_FIELDS.FIELD_LOT_KEY, lotKey);
                    List <KeyValuePair <string, string> > listCondition = new List <KeyValuePair <string, string> >();
                    listCondition.Add(kvp);
                    if (UtilHelper.CheckRecordExpired(db, POR_LOT_FIELDS.DATABASE_TABLE_NAME, listCondition, strEditTime))
                    {
                        SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, COMMON_FIELDS.FIELD_COMMON_EDITTIME_EXP);
                        return(dsReturn);
                    }
                }
                #endregion

                WipManagement.TerminalLot(db, dbTran, dsParams);
                dbTran.Commit();
                SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, string.Empty);
            }
            catch (Exception ex)
            {
                SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, ex.Message);
                LogService.LogError("TerminalLot Error: " + ex.Message);
                dbTran.Rollback();
            }
            finally
            {
                dbConn.Close();
                dbTran.Dispose();
                dbConn.Dispose();
            }

            DateTime endTime = DateTime.Now;
            LogService.LogInfo("TerminalLot Time: " + (endTime - startTime).TotalMilliseconds.ToString());
            return(dsReturn);
        }
Example #3
0
        /// <summary>
        /// 批次出站或者重工操作更新设备信息。
        /// </summary>
        /// <param name="dbtran">数据库事务对象。</param>
        /// <param name="dataset">包含批次出站数据的数据集对象。</param>
        private void TrackOutOrReworkForEquipment(DbTransaction dbtran, DataSet dataset)
        {
            string lotKey = "", stepKey = "", userKey = "";
            string equipmentKey = "";

            if (dataset.Tables.Contains(TRANS_TABLES.TABLE_PARAM))
            {
                DataTable mainTable = dataset.Tables[TRANS_TABLES.TABLE_PARAM];
                Hashtable hashData  = SolarViewer.Hemera.Share.Common.CommonUtils.ConvertToHashtable(mainTable);
                lotKey  = hashData[POR_LOT_FIELDS.FIELD_LOT_KEY].ToString();
                stepKey = hashData[WIP_TRANSACTION_FIELDS.FIELD_STEP_KEY].ToString();
                userKey = hashData[WIP_TRANSACTION_FIELDS.FIELD_EDITOR].ToString();
            }
            if (dataset.Tables.Contains(EMS_EQUIPMENTS_FIELDS.DATABASE_TABLE_NAME))
            {
                DataTable equTable    = dataset.Tables[EMS_EQUIPMENTS_FIELDS.DATABASE_TABLE_NAME];
                Hashtable equHashData = SolarViewer.Hemera.Share.Common.CommonUtils.ConvertToHashtable(equTable);
                equipmentKey = equHashData[EMS_EQUIPMENTS_FIELDS.FIELD_EQUIPMENT_KEY].ToString();
            }
            WipManagement.TrackOutForEquipment(lotKey, stepKey, equipmentKey, userKey, dbtran);
        }
Example #4
0
        /// <summary>
        /// 进行批次报废操作。
        /// </summary>
        /// <param name="dsParams">
        /// 包含批次报废数据信息的数据集对象。
        /// 必须包含名称为<see cref=" TRANS_TABLES.TABLE_PARAM"/>的数据表,用于存储批次主信息的数据。
        /// 包含名称为<see cref=" WIP_SCRAP_FIELDS.DATABASE_TABLE_NAME"/>的数据表(可选),用于存储批次报废的数据。
        /// </param>
        /// <returns>包含执行结果的数据集。</returns>
        public DataSet LotLossBonus(DataSet dsParams)
        {
            System.DateTime startTime = System.DateTime.Now;
            DataSet         dsReturn = new DataSet();
            DbConnection    dbConn = null;
            DbTransaction   dbTran = null;
            string          lotKey = string.Empty, editor = string.Empty, editTimeZone = string.Empty, qty = string.Empty;

            try
            {
                dbConn = db.CreateConnection();
                dbConn.Open();
                //Create Transaction
                dbTran = dbConn.BeginTransaction();

                #region CheckExpired 检查记录是否过期。防止重复修改。
                if (dsParams.Tables.Contains(TRANS_TABLES.TABLE_PARAM))
                {
                    DataTable dtParams = dsParams.Tables[TRANS_TABLES.TABLE_PARAM];
                    Hashtable htParams = SolarViewer.Hemera.Share.Common.CommonUtils.ConvertToHashtable(dtParams);

                    lotKey       = htParams[POR_LOT_FIELDS.FIELD_LOT_KEY].ToString();
                    qty          = htParams[WIP_TRANSACTION_FIELDS.FIELD_QUANTITY_OUT].ToString();
                    editor       = htParams[WIP_TRANSACTION_FIELDS.FIELD_EDITOR].ToString();
                    editTimeZone = htParams[WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIMEZONE_KEY].ToString();

                    string strEditTime = htParams[WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIME].ToString();
                    KeyValuePair <string, string>         kvp           = new KeyValuePair <string, string>(POR_LOT_FIELDS.FIELD_LOT_KEY, lotKey);
                    List <KeyValuePair <string, string> > listCondition = new List <KeyValuePair <string, string> >();
                    listCondition.Add(kvp);
                    //如果记录过期,当前编辑时间<数据库中的记录编辑时间。结束方法执行。
                    if (UtilHelper.CheckRecordExpired(db, POR_LOT_FIELDS.DATABASE_TABLE_NAME, listCondition, strEditTime))
                    {
                        SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, COMMON_FIELDS.FIELD_COMMON_EDITTIME_EXP);
                        return(dsReturn);
                    }
                }
                #endregion

                //进行报废数据收集。
                WipManagement.SetLossBonus(db, dbTran, dsParams);

                //更新批次数量。
                string sql = string.Format(@"UPDATE POR_LOT 
                                            SET QUANTITY='{0}',EDITOR='{1}',EDIT_TIME=GETDATE(),EDIT_TIMEZONE='{2}'
                                            WHERE LOT_KEY='{3}'",
                                           qty.PreventSQLInjection(),
                                           editor.PreventSQLInjection(),
                                           editTimeZone.PreventSQLInjection(),
                                           lotKey.PreventSQLInjection());
                db.ExecuteNonQuery(dbTran, CommandType.Text, sql);
                dbTran.Commit();
                SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, "");
            }
            catch (Exception ex)
            {
                SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, ex.Message);
                LogService.LogError("LotLossBonus Error: " + ex.Message);
                dbTran.Rollback();
            }
            finally
            {
                dbConn.Close();
            }

            System.DateTime endTime = System.DateTime.Now;
            LogService.LogInfo("LotLossBonus Time: " + (endTime - startTime).TotalMilliseconds.ToString());
            return(dsReturn);
        }
Example #5
0
        /// <summary>
        /// 执行批次进站作业。
        /// </summary>
        /// <param name="dsParams">
        /// 数据集对象。包含名称为<see cref="TRANS_TABLES.TABLE_PARAM"/>的数据表。
        /// 数据表中必须包含两个列"name"和"value"。列name存放哈希表的键名,列value存放哈希表键对应的键值。</param>
        /// <returns>
        /// 包含执行结果的数据集。
        /// 0:成功。-1或1:失败。 2:需要进行数据采集。
        /// </returns>
        public DataSet TrackInLot(DataSet dsParams)
        {
            DateTime      startTime         = DateTime.Now;
            DataSet       dsReturn          = new DataSet();
            string        sql               = "";
            DbConnection  dbconn            = null;
            DbTransaction dbtran            = null;
            string        lotKey            = "",
                          lineKey           = "",
                          workOrderKey      = "",
                          stepKey           = "",
                          quantityIn        = "",
                          user              = "",
                          editTime          = "",
                          lotNumber         = "",
                          strEquKey         = "",
                          strEquStateKey    = "",
                          strOperationKey   = "",
                          strIsBatch        = "",
                          maxQuantity       = "",
                          inProductQuantity = "",
                          isAutoTrackOut    = string.Empty,
                          oprLine           = string.Empty,
                          shiftName         = string.Empty,
                          lineName          = string.Empty,
                          editTimeZone      = string.Empty,
                          shiftKey          = string.Empty,
                          operateCompName   = string.Empty;

            try
            {
                dbconn = db.CreateConnection();
                dbconn.Open();
                //Create Transaction
                dbtran = dbconn.BeginTransaction();

                //如果数据集中包含TRANS_TABLES.TABLE_PARAM的数据表
                if (dsParams.Tables.Contains(TRANS_TABLES.TABLE_PARAM))
                {
                    DataTable dtParams = dsParams.Tables[TRANS_TABLES.TABLE_PARAM];
                    Hashtable htParams = SolarViewer.Hemera.Share.Common.CommonUtils.ConvertToHashtable(dtParams);
                    lotKey          = htParams[POR_LOT_FIELDS.FIELD_LOT_KEY].ToString();
                    lotNumber       = htParams[POR_LOT_FIELDS.FIELD_LOT_NUMBER].ToString();
                    lineKey         = htParams[WIP_TRANSACTION_FIELDS.FIELD_LINE_KEY].ToString();
                    workOrderKey    = htParams[WIP_TRANSACTION_FIELDS.FIELD_WORK_ORDER_KEY].ToString();
                    stepKey         = htParams[WIP_TRANSACTION_FIELDS.FIELD_STEP_KEY].ToString();
                    quantityIn      = htParams[WIP_TRANSACTION_FIELDS.FIELD_QUANTITY_IN].ToString();
                    user            = htParams[WIP_TRANSACTION_FIELDS.FIELD_EDITOR].ToString();
                    editTime        = htParams[WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIME].ToString();
                    editTimeZone    = htParams[WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIMEZONE_KEY].ToString();
                    oprLine         = htParams[WIP_TRANSACTION_FIELDS.FIELD_OPR_LINE].ToString();
                    shiftName       = htParams[WIP_TRANSACTION_FIELDS.FIELD_SHIFT_NAME].ToString();
                    lineName        = htParams[POR_LOT_FIELDS.FIELD_LINE_NAME].ToString();
                    shiftKey        = Convert.ToString(htParams[WIP_TRANSACTION_FIELDS.FIELD_SHIFT_KEY]);
                    operateCompName = Convert.ToString(htParams[WIP_TRANSACTION_FIELDS.FIELD_OPR_COMPUTER]);
                }

                #region 检查记录是否过期。
                KeyValuePair <string, string>         kvp           = new KeyValuePair <string, string>(POR_LOT_FIELDS.FIELD_LOT_KEY, lotKey);
                List <KeyValuePair <string, string> > listCondition = new List <KeyValuePair <string, string> >();
                listCondition.Add(kvp);
                //判断数据是否过期,如果过期,则返回执行结果为“数据已过期。”,结束方法执行。
                if (UtilHelper.CheckRecordExpired(db, POR_LOT_FIELDS.DATABASE_TABLE_NAME, listCondition, editTime))
                {
                    SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, 1, "数据已过期");
                    return(dsReturn);
                }
                #endregion

                DateTime dtCurrent = UtilHelper.GetSysdate(db);

                #region 检查设备
                //如果数据集合中包含EMS_EQUIPMENTS_FIELDS.DATABASE_TABLE_NAME数据表对象。
                if (dsParams.Tables.Contains(EMS_EQUIPMENTS_FIELDS.DATABASE_TABLE_NAME))
                {
                    DataTable equDataTable = dsParams.Tables[EMS_EQUIPMENTS_FIELDS.DATABASE_TABLE_NAME];
                    Hashtable equHashData  = SolarViewer.Hemera.Share.Common.CommonUtils.ConvertToHashtable(equDataTable);
                    strEquKey       = equHashData[EMS_EQUIPMENTS_FIELDS.FIELD_EQUIPMENT_KEY].ToString();
                    strOperationKey = equHashData[POR_ROUTE_OPERATION_VER_FIELDS.FIELD_ROUTE_OPERATION_VER_KEY].ToString();
                    //如果设备主键有值。
                    if (strEquKey != "" && strEquKey.Length > 0)
                    {
                        sql = @"SELECT a.ISBATCH,a.EQUIPMENT_STATE_KEY,a.MAXQUANTITY ,b.EQUIPMENT_STATE_TYPE,b.EQUIPMENT_STATE_NAME
                                FROM EMS_EQUIPMENTS a
                                LEFT JOIN EMS_EQUIPMENT_STATES b ON a.EQUIPMENT_STATE_KEY=b.EQUIPMENT_STATE_KEY
                                WHERE EQUIPMENT_KEY='" + strEquKey.PreventSQLInjection() + "'";
                        DataSet dsEqu = db.ExecuteDataSet(CommandType.Text, sql);//查询设备
                        //如果有数据。
                        if (dsEqu.Tables[0].Rows.Count > 0)
                        {
                            strIsBatch     = Convert.ToString(dsEqu.Tables[0].Rows[0][EMS_EQUIPMENTS_FIELDS.FIELD_ISBATCH]);                             //设备是否是批处理设备。
                            strEquStateKey = Convert.ToString(dsEqu.Tables[0].Rows[0][EMS_EQUIPMENTS_FIELDS.FIELD_EQUIPMENT_STATE_KEY]);                 //设备状态。
                            maxQuantity    = Convert.ToString(dsEqu.Tables[0].Rows[0][EMS_EQUIPMENTS_FIELDS.FIELD_MAXQUANTITY]);                         //最大数量。
                            string strEquStateName = Convert.ToString(dsEqu.Tables[0].Rows[0][EMS_EQUIPMENT_STATES_FIELDS.FIELD_EQUIPMENT_STATE_NAME]);  //设备状态名称。
                            string strEquStateType = Convert.ToString(dsEqu.Tables[0].Rows[0][EMS_EQUIPMENT_STATES_FIELDS.FIELD_EQUIPMENT_STATE_TYPE]);  //设备状态类型。
                            #region 检查设备状态
                            //如果设备状态不是“待产”
                            if (strEquStateType != "LOST")
                            {
                                //如果设备状态是“在产”
                                if (strEquStateType == "RUN")
                                {
                                    //如果是批处理设备。
                                    if (strIsBatch == "1")
                                    {
                                        //获取设备在产数量。
                                        sql = @"SELECT ISNULL(SUM(T.QUANTITY),0) AS INQUANTITY 
                                                FROM EMS_LOT_EQUIPMENT T
                                                WHERE T.EQUIPMENT_KEY = '" + strEquKey + "' AND T.END_TIMESTAMP IS NULL";
                                        DataSet dsLotEqu = db.ExecuteDataSet(CommandType.Text, sql);
                                        if (dsLotEqu.Tables[0].Rows.Count > 0 && !string.IsNullOrEmpty(maxQuantity))//获取设备在产数量成功
                                        {
                                            inProductQuantity = dsLotEqu.Tables[0].Rows[0]["inQuantity"].ToString();
                                            //在产数量>设备的最大数量,结束方法执行。
                                            if (Convert.ToInt32(inProductQuantity) + Convert.ToInt32(quantityIn) > Convert.ToInt32(maxQuantity))
                                            {
                                                SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, "${res:SolarViewer.Hemera.Modules.Wip.WipEngine.Msg.BigThenMaxQuantity}");
                                                return(dsReturn);
                                            }
                                        }
                                    }
                                    else
                                    {
                                        //如果不是批处理设备,结束方法执行。
                                        SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, "${res:SolarViewer.Hemera.Modules.Wip.WipEngine.Msg.BatchIsFalse}");
                                        return(dsReturn);
                                    }
                                }
                                else
                                {
                                    //如果设备状态不是在产,结束方法执行。
                                    SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, "${res:SolarViewer.Hemera.Modules.Wip.WipEngine.Msg.EquipmentCanNotUser}");
                                    return(dsReturn);
                                }
                            }
                            #endregion
                        }
                        else//获取设备数据失败。
                        {
                            SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, "${res:SolarViewer.Hemera.Modules.Wip.WipEngine.Msg.GetEquipmentError}");
                            return(dsReturn);
                        }
                    }
                }
                #endregion

                //批次进站,更新批次数据,插入批次进站操作记录。
                WipManagement.TrackInLot(db, dbtran, dsParams);
                //设备主键不为空。
                if (strEquKey != "")
                {
                    //批次和设备进行关联。
                    WipManagement.TrackInForEquipment(lotKey, Convert.ToInt32(quantityIn), strOperationKey, stepKey, strEquKey, user, dbtran);
                }

                #region 检查自动合批
                //工步主键不为空。
                if (stepKey != "")
                {
                    string  isLastStep     = "";
                    string  isAutoMerge    = "";
                    int     maxBoxQuantity = -1;
                    DataSet dsStepUda      = GetStepUda(stepKey);
                    //如果获取到工步自定义属性数据。
                    if (dsStepUda.Tables[0].Rows.Count > 0)
                    {
                        //遍历工序的自定义属性。
                        for (int i = 0; i < dsStepUda.Tables[0].Rows.Count; i++)
                        {
                            string szAttriName  = dsStepUda.Tables[0].Rows[i][POR_ROUTE_STEP_ATTR_FIELDS.FIELD_ATTRIBUTE_NAME].ToString();
                            string szAttriValue = dsStepUda.Tables[0].Rows[i][POR_ROUTE_STEP_ATTR_FIELDS.FIELD_ATTRIBUTE_VALUE].ToString();
                            //是否是最后一个工步。
                            if (szAttriName == "IsLastStep")
                            {
                                isLastStep = szAttriValue;
                            }
                            //是否自动合批。
                            if (szAttriName == "AutoMerge")
                            {
                                isAutoMerge = szAttriValue;
                            }
                            //箱子最大数量。
                            if (szAttriName == "MaxBoxQuantity" && !int.TryParse(szAttriValue, out maxBoxQuantity))
                            {
                                maxBoxQuantity = -1;
                            }
                            //是否自动出站。
                            if (szAttriName == "AutoTrackOut")
                            {
                                isAutoTrackOut = szAttriValue;
                            }
                        }
                        if (isAutoMerge.ToLower() == "true")//进行自动合批
                        {
                            AutoMerge(db, dbtran, lotKey, workOrderKey, stepKey, lineKey,
                                      quantityIn, maxBoxQuantity, 4, user, false, oprLine, shiftName);
                        }
                    }
                }

                #endregion

                #region 检查自动出站
                //自动出站
                if (isAutoTrackOut.ToLower() == "true")
                {
                    DataSet dsInfo = GetLotsInfo(dbtran, lotKey);
                    //获取批次信息成功。
                    if (dsInfo.Tables.Count > 0 && dsInfo.Tables[0].Rows.Count > 0)
                    {
                        string nextRunTime = string.Empty;
                        string sDuration   = Convert.ToString(dsInfo.Tables[0].Rows[0][POR_ROUTE_STEP_FIELDS.FIELD_DURATION]);
                        double duration    = 0;
                        if (!double.TryParse(sDuration, out duration))
                        {
                            duration = 0;
                        }
                        nextRunTime = dtCurrent.AddMinutes(duration).ToString("yyyy-MM-dd HH:mm:ss");
                        Hashtable hashWipJob = new Hashtable();
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_EDIT_TIMEZONE, editTimeZone);
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_EDITOR, user);
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_EDIT_TIME, dtCurrent);
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_ENTERPRISE_KEY, dsInfo.Tables[0].Rows[0][POR_LOT_FIELDS.FIELD_ROUTE_ENTERPRISE_VER_KEY].ToString());
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_JOB_CREATETIME, dtCurrent);
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_EQUIPMENT_KEY, strEquKey);
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_JOB_CLOSETYPE, string.Empty);
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_JOB_NEXTRUNTIME, nextRunTime);
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_JOB_RUNACCOUNT, "0");
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_JOB_STATUS, "0");
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_JOB_TYPE, ACTIVITY_FIELD_VALUES.FIELD_ACTIVITY_TRACKIN);
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_LINE_NAME, lineName);
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_LOT_KEY, lotKey);
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_LOT_NUMBER, lotNumber);
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_NOTIFY_USER, string.Empty);
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_ROUTE_KEY, dsInfo.Tables[0].Rows[0][POR_LOT_FIELDS.FIELD_CUR_ROUTE_VER_KEY]);
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_ROW_KEY, UtilHelper.GenerateNewKey(0));
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_STEP_KEY, dsInfo.Tables[0].Rows[0][POR_LOT_FIELDS.FIELD_CUR_STEP_VER_KEY]);
                        hashWipJob.Add(WIP_JOB_FIELDS.FIELDS_WORKORDER_NUMBER, dsInfo.Tables[0].Rows[0][POR_WORK_ORDER_FIELDS.FIELD_ORDER_NUMBER]);
                        //插入一笔自动过站任务。
                        WipJobAutoTrack.InsertWipJob(db, dbtran, hashWipJob);
                    }
                }
                #endregion

                //检查是否需要进行数据采集。
                string edcPointKey = string.Empty;
                if (CheckNeedEdc(dbtran, lotKey, strEquKey, out edcPointKey))
                {
                    IEDCEngine edcEngine = RemotingServer.ServerObjFactory.Get <IEDCEngine>();
                    edcEngine.SaveEdcMainInfo(dbtran, lotKey, edcPointKey, user, strEquKey, oprLine, shiftKey);
                    SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, 2, "批次" + lotNumber + "需要抽检");
                }
                else
                {
                    //更新批次状态为9(WaitingForTrackout)
                    UpdateLotState(dbtran, lotKey, 9);
                    SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, 0, string.Empty);
                }
                //检查是否需要进行锁定。
                CheckAndUpdateFutureHold(dbtran, lotKey, stepKey, shiftName, shiftKey, user,
                                         operateCompName, editTimeZone, ACTIVITY_FIELD_VALUES.FIELD_ACTIVITY_TRACKIN);

                dbtran.Commit();
            }
            catch (Exception ex)
            {
                ReturnMessageUtils.AddServerReturnMessage(dsReturn, 1, "批次进站出错" + ex.Message);
                LogService.LogError("TrackInLot Error: " + ex.Message);
                dbtran.Rollback();
            }
            finally
            {
                dbconn.Close();
            }
            System.DateTime endTime = System.DateTime.Now;
            LogService.LogInfo("TrackIn Lot Time: " + (endTime - startTime).TotalMilliseconds.ToString());
            return(dsReturn);
        }
Example #6
0
        public DataSet TransferLotToStore(DataSet dataset)
        {
            //dataset.WriteXml(@"d:\TransferLotToStore.xml");

            System.DateTime startTime = System.DateTime.Now;

            DataSet       dsReturn = new DataSet();
            DbConnection  dbconn = null;
            DbTransaction dbtran = null;
            string        sql = "", storeKey = "", storeName = "", lotNumber = "";
            string        strEditor = "", strEditTimeZone = "", strEditTime = "";
            string        lotKey = "", stepKey = "";

            if (dataset != null)
            {
                if (dataset.Tables.Contains(WST_STORE_MAT_FIELDS.DATABASE_TABLE_NAME))
                {
                    WST_STORE_MAT_FIELDS tableFields = new WST_STORE_MAT_FIELDS();
                    DataTable            dataTable   = dataset.Tables[WST_STORE_MAT_FIELDS.DATABASE_TABLE_NAME];
                    storeName       = dataTable.Rows[0][WST_STORE_FIELDS.FIELD_STORE_NAME].ToString();
                    lotNumber       = dataTable.Rows[0][WST_STORE_MAT_FIELDS.FIELD_ITEM_NO].ToString();
                    strEditor       = dataTable.Rows[0][WST_STORE_MAT_FIELDS.FIELD_EDITOR].ToString();
                    strEditTimeZone = dataTable.Rows[0][WST_STORE_MAT_FIELDS.FIELD_EDIT_TIMEZONE].ToString();
                    strEditTime     = dataTable.Rows[0][WST_STORE_MAT_FIELDS.FIELD_EDIT_TIME].ToString();
                    lotKey          = dataTable.Rows[0][POR_LOT_FIELDS.FIELD_LOT_KEY].ToString();
                    stepKey         = dataTable.Rows[0][POR_LOT_FIELDS.FIELD_CUR_STEP_VER_KEY].ToString();
                    try
                    {
                        #region CheckRecordExpired
                        KeyValuePair <string, string>         kvp           = new KeyValuePair <string, string>(POR_LOT_FIELDS.FIELD_LOT_NUMBER, lotNumber);
                        List <KeyValuePair <string, string> > listCondition = new List <KeyValuePair <string, string> >();
                        listCondition.Add(kvp);
                        if (UtilHelper.CheckRecordExpired(db, POR_LOT_FIELDS.DATABASE_TABLE_NAME, listCondition, strEditTime))
                        {
                            SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, COMMON_FIELDS.FIELD_COMMON_EDITTIME_EXP);
                            return(dsReturn);
                        }
                        #endregion

                        sql = @"SELECT STORE_KEY FROM WST_STORE WHERE STORE_NAME='" + storeName + "'";
                        IDataReader dataReader = db.ExecuteReader(CommandType.Text, sql);
                        if (dataReader.Read())
                        {
                            storeKey = dataReader["STORE_KEY"].ToString();
                            using (dbconn = db.CreateConnection())
                            {
                                dbconn.Open();
                                //Create Transaction
                                dbtran = dbconn.BeginTransaction();
                                try
                                {
                                    #region insert record into store_mat
                                    dataTable.Rows[0][WST_STORE_MAT_FIELDS.FIELD_EDIT_TIME] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                                    sql = DatabaseTable.BuildInsertSqlStatement(tableFields, dataTable, 0,
                                                                                new Dictionary <string, string>()
                                    {
                                        { WST_STORE_MAT_FIELDS.FIELD_STORE_KEY, storeKey },
                                        { WST_STORE_MAT_FIELDS.FIELD_ITEM_TYPE, "Lot" },
                                        { WST_STORE_MAT_FIELDS.FIELD_OBJECT_STATUS, "1" },
                                    },
                                                                                new List <string>()
                                    {
                                        WST_STORE_FIELDS.FIELD_STORE_NAME,
                                        POR_LOT_FIELDS.FIELD_CUR_STEP_VER_KEY,
                                        POR_LOT_FIELDS.FIELD_LOT_KEY
                                    });
                                    db.ExecuteNonQuery(dbtran, CommandType.Text, sql);
                                    #endregion

                                    #region 更新批次信息
                                    sql = @"UPDATE POR_LOT SET STATE_FLAG=11," +
                                          "EDITOR='" + strEditor + "'," +
                                          "EDIT_TIME=SYSDATE," +
                                          "EDIT_TIMEZONE='" + strEditTimeZone + "' " +
                                          "WHERE LOT_NUMBER='" + lotNumber + "'";
                                    db.ExecuteNonQuery(dbtran, CommandType.Text, sql);
                                    #endregion

                                    #region update ems_lot_equipment
                                    DataSet resDs     = new DataSet();
                                    string  sqlString = @"SELECT B.EQUIPMENT_KEY,A.EQUIPMENT_NAME,A.EQUIPMENT_STATE_KEY
                                     FROM EMS_EQUIPMENTS A,EMS_LOT_EQUIPMENT B
                                     WHERE A.EQUIPMENT_KEY = B.EQUIPMENT_KEY 
                                     AND B.STEP_KEY = '" + stepKey + "' " +
                                                        "AND B.LOT_KEY='" + lotKey + "' " +
                                                        "AND B.END_TIMESTAMP IS NULL";
                                    db.LoadDataSet(CommandType.Text, sqlString, resDs, new string[] { EMS_OPERATION_EQUIPMENT_FIELDS.DATABASE_TABLE_NAME });
                                    if (resDs != null && resDs.Tables.Count > 0)
                                    {
                                        if (resDs.Tables[0].Rows.Count > 0)
                                        {
                                            string equipmentKey = resDs.Tables[0].Rows[0]["EQUIPMENT_KEY"].ToString();
                                            WipManagement.TrackOutForEquipment(lotKey, stepKey, equipmentKey, strEditor, dbtran);
                                        }
                                    }
                                    #endregion

                                    SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, "");
                                    dbtran.Commit();
                                }
                                catch (Exception ex)
                                {
                                    SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, ex.Message);
                                    //Rollback Transaction
                                    dbtran.Rollback();
                                    LogService.LogError("TransferLotToStore Error: " + ex.Message);
                                }
                                finally
                                {
                                    dbconn.Close();
                                }
                            }
                        }
                        else
                        {
                            SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, "${res:SolarViewer.Hemera.Modules.FMM.StoreEngine.StoreIsNotExist}");
                            return(dsReturn);
                        }

                        dataReader.Close();
                        dataReader.Dispose();
                    }
                    catch (Exception ex)
                    {
                        SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, ex.Message);
                    }
                }
            }

            System.DateTime endTime = System.DateTime.Now;
            LogService.LogInfo("TransferLotToStore Time: " + (endTime - startTime).TotalMilliseconds.ToString());

            return(dsReturn);
        }
Example #7
0
        /// <summary>
        /// 执行批次出站或仅采集批次报废数量。
        /// </summary>
        /// <param name="dataset">包含批次出站信息的数据集对象。
        /// 必须包含名称为<see cref=" TRANS_TABLES.TABLE_PARAM"/>的数据表,用于存储批次及批出站主信息的数据。
        /// 包含名称为<see cref=" WIP_SCRAP_FIELDS.DATABASE_TABLE_NAME"/>的数据表(可选),用于存储批次报废的数据。
        /// 包含名称为<see cref="WST_STORE_MAT_FIELDS.DATABASE_TABLE_NAME"/>的数据表(可选),用于存储批次返工或退库的数据。
        /// 包含名称为<see cref="EMS_EQUIPMENTS_FIELDS.DATABASE_TABLE_NAME"/>的数据表(可选),用于存储设备数据。</param>
        /// <returns>
        /// 包含方法执行结果的数据集。
        /// </returns>
        public DataSet TrackOutLot(DataSet dsParams)
        {
            System.DateTime startTime = System.DateTime.Now;
            DataSet         dsReturn  = new DataSet();
            DbConnection    dbConn    = null;
            DbTransaction   dbtran    = null;
            DataTable       dtParams  = new DataTable();
            Hashtable       htParams  = new Hashtable();
            //string module = "";
            int    quantityOut = 0;
            int    quantityToMerge = 0;
            string lotKeyForMerge = string.Empty;
            string lotKey = string.Empty;
            string workOrderKey = string.Empty, lineKey = "", editor = "", opUser = "", editTime = string.Empty;
            int    workOrderStep = 0;                                         //工单序号
            string isAutoTrackIn = string.Empty, oprLine = string.Empty;      //是否自动进站,操作线别
            string shiftName       = string.Empty;                            //班次名称
            bool   isFinished      = false;                                   //批次完成状态。
            string toStepKey       = string.Empty;                            //工步主键
            string toRouteKey      = string.Empty;                            //工艺流程主键
            string toEnterpriseKey = string.Empty;                            //工艺流程组主键
            string editTimeZone    = string.Empty;                            //编辑时间时区
            string operateCompName = string.Empty;                            //操作计算机名称
            string shiftKey        = string.Empty;                            //班次主键
            string stepKey         = string.Empty;                            //当前工步主键

            try
            {
                dbConn = db.CreateConnection();
                dbConn.Open();
                //Create Transaction
                dbtran = dbConn.BeginTransaction();

                if (dsParams.Tables.Contains(TRANS_TABLES.TABLE_PARAM))
                {
                    dtParams        = dsParams.Tables[TRANS_TABLES.TABLE_PARAM];
                    htParams        = SolarViewer.Hemera.Share.Common.CommonUtils.ConvertToHashtable(dtParams);
                    lotKey          = Convert.ToString(htParams[POR_LOT_FIELDS.FIELD_LOT_KEY]);
                    lotKeyForMerge  = lotKey;
                    workOrderKey    = Convert.ToString(htParams[WIP_TRANSACTION_FIELDS.FIELD_WORK_ORDER_KEY]);
                    lineKey         = Convert.ToString(htParams[WIP_TRANSACTION_FIELDS.FIELD_LINE_KEY]);
                    oprLine         = Convert.ToString(htParams[WIP_TRANSACTION_FIELDS.FIELD_OPR_LINE]);
                    editor          = Convert.ToString(htParams[WIP_TRANSACTION_FIELDS.FIELD_EDITOR]);
                    opUser          = Convert.ToString(htParams[WIP_TRANSACTION_FIELDS.FIELD_OPERATOR]);
                    shiftName       = Convert.ToString(htParams[WIP_TRANSACTION_FIELDS.FIELD_SHIFT_NAME]);
                    editTime        = Convert.ToString(htParams[WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIME]);
                    toStepKey       = Convert.ToString(htParams[WIP_FIELDS.FIELDS_TO_STEP_VER_KEY]);
                    toRouteKey      = Convert.ToString(htParams[WIP_FIELDS.FIELDS_TO_ROUTE_VER_KEY]);
                    toEnterpriseKey = Convert.ToString(htParams[WIP_FIELDS.FIELDS_TO_ENTERPRISE_VER_KEY]);
                    //module = Convert.ToString(htParams[POR_LOT_FIELDS.FIELD_MODULE]);
                    editTimeZone    = Convert.ToString(htParams[WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIMEZONE_KEY]);
                    operateCompName = Convert.ToString(htParams[WIP_TRANSACTION_FIELDS.FIELD_OPR_COMPUTER]);
                    shiftKey        = Convert.ToString(htParams[WIP_TRANSACTION_FIELDS.FIELD_SHIFT_KEY]);
                    stepKey         = Convert.ToString(htParams[WIP_TRANSACTION_FIELDS.FIELD_STEP_KEY]);
                    //如果哈希表中包含最后一步的字段。表示该工步为最后一个工步,设置批次完成状态为true
                    if (htParams.ContainsKey("LAST_STEP"))
                    {
                        isFinished = Boolean.Parse(htParams["LAST_STEP"].ToString());
                    }
                    quantityOut     = Convert.ToInt32(htParams[WIP_TRANSACTION_FIELDS.FIELD_QUANTITY_OUT]);
                    quantityToMerge = quantityOut;
                }

                #region 检查记录是否过期。防止重复修改。
                KeyValuePair <string, string>         kvp           = new KeyValuePair <string, string>(POR_LOT_FIELDS.FIELD_LOT_KEY, lotKey);
                List <KeyValuePair <string, string> > listCondition = new List <KeyValuePair <string, string> >();
                listCondition.Add(kvp);
                //如果数据记录过期,则返回结束方法执行。
                if (UtilHelper.CheckRecordExpired(db, POR_LOT_FIELDS.DATABASE_TABLE_NAME, listCondition, editTime))
                {
                    SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, COMMON_FIELDS.FIELD_COMMON_EDITTIME_EXP);
                    return(dsReturn);
                }
                #endregion

                //如果数据集中包含批次报废数据表。
                if (dsParams.Tables.Contains(WIP_SCRAP_FIELDS.DATABASE_TABLE_NAME))
                {
                    WipManagement.SetLossBonus(db, dbtran, dsParams);
                }
                //如果数据集中包含批次返工或退库的数据表。
                if (dsParams.Tables.Contains(WST_STORE_MAT_FIELDS.DATABASE_TABLE_NAME))
                {
                    SetDefect(dbtran, dsParams);
                }
                //插入批次出站的记录信息。
                WipManagement.TrackOutOrReworkLot(db, dbtran, dsParams, ACTIVITY_FIELD_VALUES.FIELD_ACTIVITY_TRACKOUT);
                //更新批次出站和设备关联的记录信息。
                if (dsParams.Tables.Contains(EMS_EQUIPMENTS_FIELDS.DATABASE_TABLE_NAME))
                {
                    TrackOutOrReworkForEquipment(dbtran, dsParams);
                }

                #region 确定是否自动分批或自动合批
                //如果不是完成状态且数量>0
                if (isFinished == false && quantityOut > 0)
                {
                    int    maxBoxQuantity = -1;
                    string autoMerge      = "";
                    string autoSplit      = "";
                    //获取下一工步的自定义属性。
                    DataSet dsStepUda = GetStepUda(toStepKey);
                    if (dsStepUda.Tables[0].Rows.Count > 0)
                    {
                        //获取下一工步的自定义属性成功。
                        for (int i = 0; i < dsStepUda.Tables[0].Rows.Count; i++)
                        {
                            string szStepUdaName  = dsStepUda.Tables[0].Rows[i][POR_ROUTE_STEP_ATTR_FIELDS.FIELD_ATTRIBUTE_NAME].ToString();
                            string szStepUdaValue = dsStepUda.Tables[0].Rows[i][POR_ROUTE_STEP_ATTR_FIELDS.FIELD_ATTRIBUTE_VALUE].ToString();
                            //箱的最大数量
                            if (szStepUdaName == "MaxBoxQuantity")
                            {
                                maxBoxQuantity = Convert.ToInt32(szStepUdaValue);
                            }
                            //自动合批
                            if (szStepUdaName == "AutoMerge")
                            {
                                autoMerge = szStepUdaValue;
                            }
                            //自动分批
                            if (szStepUdaName == "AutoSplit")
                            {
                                autoSplit = szStepUdaValue;
                            }
                            //自动出站
                            if (szStepUdaName == "AutoTrackIn")
                            {
                                isAutoTrackIn = szStepUdaValue;
                            }
                        }
                        //确定自动分批
                        if (autoSplit.ToLower() == "true")
                        {
                            //箱最大数量
                            if (maxBoxQuantity == -1)
                            {
                                throw new Exception("${res:SolarViewer.Hemera.Addins.WIP.AutoSplit.Exception}");
                            }
                            else if (quantityOut > maxBoxQuantity)//出站数量>箱最大数量。
                            {
                                #region splitLot
                                #region MainDataTable
                                if (htParams.Contains(POR_LOT_FIELDS.FIELD_QUANTITY))
                                {
                                    htParams.Remove(POR_LOT_FIELDS.FIELD_QUANTITY);
                                }
                                htParams.Add(POR_LOT_FIELDS.FIELD_QUANTITY, maxBoxQuantity.ToString());
                                htParams[WIP_TRANSACTION_FIELDS.FIELD_QUANTITY_IN]      = quantityOut;
                                htParams[POR_LOT_FIELDS.FIELD_ROUTE_ENTERPRISE_VER_KEY] = toEnterpriseKey;
                                htParams[POR_LOT_FIELDS.FIELD_CUR_ROUTE_VER_KEY]        = toRouteKey;
                                htParams[POR_LOT_FIELDS.FIELD_CUR_STEP_VER_KEY]         = toStepKey;
                                htParams.Add(POR_LOT_FIELDS.FIELD_STATE_FLAG, "0");
                                if (workOrderStep != 0)
                                {
                                    htParams.Add(COMMON_FIELDS.FIELD_WORK_ORDER_STEP, workOrderStep);
                                }
                                DataTable splitTable = SolarViewer.Hemera.Share.Common.CommonUtils.ParseToDataTable(htParams);
                                splitTable.TableName = TRANS_TABLES.TABLE_MAIN_DATA;
                                DataSet splitDS = new DataSet();
                                splitDS.Tables.Add(splitTable);
                                #endregion
                                int remainderQty = quantityOut - maxBoxQuantity;
                                #region ChildTable
                                DataTable childTable = new DataTable();
                                //childTable.Columns.Add("LOT_NUMBER", Type.GetType("System.String"));
                                childTable.Columns.Add("QUANTITY", Type.GetType("System.String"));
                                childTable.Columns.Add("SPLIT_SEQ", Type.GetType("System.String"));
                                childTable.Columns.Add("LOT_KEY", Type.GetType("System.String"));
                                //string childLotNumber = "";
                                string lastChildLotKey = "";
                                int    i = 0;
                                //剩余数量-箱最大数量>0,继续分批
                                while ((remainderQty - maxBoxQuantity) >= 0)
                                {
                                    #region GenerateChildLotNumber
                                    i++;
                                    #endregion
                                    //childTable.Rows.Add(childLotNumber, maxBoxQuantity.ToString(), i.ToString("00"), Utils.GenerateNewKey(0));
                                    childTable.Rows.Add(maxBoxQuantity.ToString(), i.ToString("00"), UtilHelper.GenerateNewKey(0));
                                    remainderQty = remainderQty - maxBoxQuantity;
                                }
                                //如果剩余数量>0,作为最后一批。
                                if (remainderQty > 0)
                                {
                                    i++;
                                    lastChildLotKey = UtilHelper.GenerateNewKey(0);
                                    childTable.Rows.Add(remainderQty.ToString(), i.ToString("00"), lastChildLotKey);
                                }
                                childTable.TableName = BASE_PARAMETER_FIELDS.DATABASE_TABLE_NAME;
                                splitDS.Tables.Add(childTable);
                                #endregion
                                //Excute Split
                                //SplitLot(db, dbtran, splitDS);
                                DataSet childLotReturn = new DataSet();
                                //执行分批操作。
                                SplitLotTransact(db, dbtran, splitDS, ref childLotReturn);
                                quantityToMerge = remainderQty;
                                lotKeyForMerge  = lastChildLotKey;
                                #endregion
                            }
                        }
                        #region AutoMerge
                        //如果自动合批。
                        if (autoMerge.ToLower() == "true")
                        {
                            //执行自动合批操作。
                            AutoMerge(db, dbtran, lotKeyForMerge, workOrderKey, toStepKey, lineKey, quantityToMerge.ToString(), maxBoxQuantity, 0, editor, false, oprLine, shiftName);
                        }
                        #endregion
                    }
                }
                #endregion

                //检查是否需要进行锁定。
                int nHoldCount = 0;
                if (isFinished == false)
                {
                    nHoldCount = CheckAndUpdateFutureHold(dbtran, lotKey, stepKey, shiftName, shiftKey, editor,
                                                          operateCompName, editTimeZone, ACTIVITY_FIELD_VALUES.FIELD_ACTIVITY_TRACKOUT);
                }
                dbtran.Commit();
                SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, "");

                #region AutoTrackIn 确定是否自动进站。
                //如果自动进站
                if (isFinished == false && isAutoTrackIn.ToLower() == "true" && nHoldCount == 0)
                {
                    //执行自动进站作业。
                    AutoTrackIn(lotKey, string.Empty, shiftName);
                }
                #endregion
            }
            catch (Exception ex)
            {
                SolarViewer.Hemera.Share.Common.ReturnMessageUtils.AddServerReturnMessage(dsReturn, ex.Message);
                LogService.LogError("TrackOutLot Error: " + ex.Message);
                dbtran.Rollback();
            }
            finally
            {
                dbConn.Close();
            }
            //记录操作时间 记录。
            System.DateTime endTime = System.DateTime.Now;
            LogService.LogInfo("TrackOut Lot Time: " + (endTime - startTime).TotalMilliseconds.ToString());

            return(dsReturn);
        }
Example #8
0
        /// <summary>
        /// 采集不良数据。
        /// </summary>
        /// <param name="dbTran">数据操作事务对象。</param>
        /// <param name="ds">包含报废数据的数据集对象。</param>
        private void SetDefect(DbTransaction dbTran, DataSet ds)
        {
            DataTable dataTable       = ds.Tables[TRANS_TABLES.TABLE_PARAM];
            Hashtable hashData        = SolarViewer.Hemera.Share.Common.CommonUtils.ConvertToHashtable(dataTable);
            string    lotKey          = Convert.ToString(hashData[POR_LOT_FIELDS.FIELD_LOT_KEY]);
            string    strWorkOrderKey = Convert.ToString(hashData[WIP_TRANSACTION_FIELDS.FIELD_WORK_ORDER_KEY]);
            string    strLineKey      = Convert.ToString(hashData[WIP_TRANSACTION_FIELDS.FIELD_LINE_KEY]);
            string    strOprLine      = Convert.ToString(hashData[WIP_TRANSACTION_FIELDS.FIELD_OPR_LINE]);
            string    strEditor       = Convert.ToString(hashData[WIP_TRANSACTION_FIELDS.FIELD_EDITOR]);
            string    strOperator     = Convert.ToString(hashData[WIP_TRANSACTION_FIELDS.FIELD_OPERATOR]);
            string    strShiftName    = Convert.ToString(hashData[WIP_TRANSACTION_FIELDS.FIELD_SHIFT_NAME]);
            string    strEditTime     = Convert.ToString(hashData[WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIME]);
            string    shiftKey        = Convert.ToString(hashData[WIP_TRANSACTION_FIELDS.FIELD_SHIFT_KEY]);
            string    computeName     = Convert.ToString(hashData[WIP_TRANSACTION_FIELDS.FIELD_OPR_COMPUTER]);
            string    stateFlag       = Convert.ToString(hashData[WIP_TRANSACTION_FIELDS.FIELD_STATE_FLAG]);
            string    reworkFlag      = Convert.ToString(hashData[WIP_TRANSACTION_FIELDS.FIELD_REWORK_FLAG]);
            //string comment        = Convert.ToString(hashData[WIP_TRANSACTION_FIELDS.FIELD_ACTIVITY_COMMENT]); //Q.001
            string comment = Convert.ToString(hashData["DEFECTCOMMET"]); //Q.001

            DataTable   table     = ds.Tables[WST_STORE_MAT_FIELDS.DATABASE_TABLE_NAME];
            string      sql       = string.Format(@"SELECT LOT_SEQ,LOT_NUMBER FROM POR_LOT WHERE LOT_KEY='{0}'", lotKey.PreventSQLInjection());
            IDataReader readerSEQ = db.ExecuteReader(CommandType.Text, sql);
            int         seq       = 0;
            //获取当前批次对应的返工和退库记录数。
            string lotNumber = string.Empty;

            if (readerSEQ.Read())
            {
                if (readerSEQ["LOT_SEQ"].ToString() != "")
                {
                    seq = Int32.Parse(readerSEQ["LOT_SEQ"].ToString());
                }
                lotNumber = readerSEQ[POR_LOT_FIELDS.FIELD_LOT_NUMBER].ToString();
            }
            readerSEQ.Close();
            readerSEQ.Dispose();
            for (int i = 0; i < table.Rows.Count; i++)
            {
                table.Rows[i][WST_STORE_MAT_FIELDS.FIELD_ITEM_NO]      = lotNumber + (seq + i + 1).ToString("00");
                table.Rows[i][WIP_TRANSACTION_FIELDS.FIELD_SHIFT_NAME] = strShiftName;
            }

            //插入批次对应的返工和退库记录。
            WipManagement.InsertIntoStoreMat(db, dbTran, ds);

            //更新批次对应的返工和退库记录数。
            sql = string.Format(@"UPDATE POR_LOT SET LOT_SEQ='{0}' WHERE LOT_KEY='{1}'",
                                seq + table.Rows.Count, lotKey.PreventSQLInjection());
            db.ExecuteNonQuery(dbTran, CommandType.Text, sql);

            //如果包含缺陷代码数据表。设置了先区分不良代码再入库。
            if (ds.Tables.Contains(WIP_DEFECT_FIELDS.DATABASE_TABLE_NAME))
            {
                DataTable dtStoreMat = ds.Tables[WST_STORE_MAT_FIELDS.DATABASE_TABLE_NAME];
                DataTable dtDefect   = ds.Tables[WIP_DEFECT_FIELDS.DATABASE_TABLE_NAME];

                string rowKey          = dtStoreMat.Rows[0][WST_STORE_MAT_FIELDS.FIELD_ROW_KEY].ToString();
                string storeType       = dtStoreMat.Rows[0][WST_STORE_FIELDS.FIELD_STORE_TYPE].ToString();
                string lineKey         = dtStoreMat.Rows[0][WST_STORE_MAT_FIELDS.FIELD_LINE_KEY].ToString();
                string stepKey         = dtStoreMat.Rows[0][WST_STORE_MAT_FIELDS.FIELD_STEP_KEY].ToString();
                string routeKey        = dtStoreMat.Rows[0][WST_STORE_MAT_FIELDS.FIELD_ROUTE_KEY].ToString();
                string enterpriseKey   = dtStoreMat.Rows[0][WST_STORE_MAT_FIELDS.FIELD_ENTERPRISE_KEY].ToString();
                string quantity        = dtStoreMat.Rows[0][WST_STORE_MAT_FIELDS.FIELD_ITEM_QTY].ToString();
                string editor          = dtStoreMat.Rows[0][WST_STORE_MAT_FIELDS.FIELD_EDITOR].ToString();
                string editTimeZone    = dtStoreMat.Rows[0][WST_STORE_MAT_FIELDS.FIELD_EDIT_TIMEZONE].ToString();
                string workorderNumber = dtStoreMat.Rows[0][WST_STORE_MAT_FIELDS.FIELD_WORKORDER_NUMBER].ToString();
                string storeKey        = dtStoreMat.Rows[0][WST_STORE_MAT_FIELDS.FIELD_STORE_KEY].ToString();
                string storeName       = dtStoreMat.Rows[0][WST_STORE_FIELDS.FIELD_STORE_NAME].ToString();
                string objectStatus    = dtStoreMat.Rows[0][WST_STORE_MAT_FIELDS.FIELD_OBJECT_STATUS].ToString();

                #region RW_STORE_TRANSACTION
                Hashtable htReworkLotInStore = new Hashtable();
                DataTable dtReworkLotInStore = new DataTable();

                htReworkLotInStore.Add(WST_STORE_FIELDS.FIELD_STORE_TYPE, storeType);
                htReworkLotInStore.Add(POR_WORK_ORDER_FIELDS.FIELD_WORK_ORDER_KEY, strWorkOrderKey);
                htReworkLotInStore.Add(WST_STORE_MAT_FIELDS.FIELD_ROW_KEY, rowKey);
                htReworkLotInStore.Add(WST_STORE_MAT_FIELDS.FIELD_LINE_KEY, lineKey);
                htReworkLotInStore.Add(WST_STORE_MAT_FIELDS.FIELD_STEP_KEY, stepKey);
                htReworkLotInStore.Add(WST_STORE_MAT_FIELDS.FIELD_ROUTE_KEY, routeKey);
                htReworkLotInStore.Add(WST_STORE_MAT_FIELDS.FIELD_ENTERPRISE_KEY, enterpriseKey);
                htReworkLotInStore.Add(WST_STORE_MAT_FIELDS.FIELD_ITEM_QTY, quantity);

                htReworkLotInStore.Add(WIP_TRANSACTION_FIELDS.FIELD_EDITOR, editor);
                htReworkLotInStore.Add(WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIMEZONE_KEY, editTimeZone);
                htReworkLotInStore.Add(WIP_TRANSACTION_FIELDS.FIELD_OPERATOR, strOperator);
                htReworkLotInStore.Add(WIP_TRANSACTION_FIELDS.FIELD_PIECE_KEY, lotKey);
                htReworkLotInStore.Add(WIP_TRANSACTION_FIELDS.FIELD_SHIFT_NAME, strShiftName);
                htReworkLotInStore.Add(WIP_TRANSACTION_FIELDS.FIELD_SHIFT_KEY, shiftKey);
                htReworkLotInStore.Add(WIP_TRANSACTION_FIELDS.FIELD_OPR_COMPUTER, computeName);
                htReworkLotInStore.Add(WIP_TRANSACTION_FIELDS.FIELD_STATE_FLAG, stateFlag);
                htReworkLotInStore.Add(WIP_TRANSACTION_FIELDS.FIELD_REWORK_FLAG, reworkFlag);
                htReworkLotInStore.Add(WIP_TRANSACTION_FIELDS.FIELD_OPR_LINE, strOprLine);
                htReworkLotInStore.Add(WIP_TRANSACTION_FIELDS.FIELD_ACTIVITY_COMMENT, comment);

                dtReworkLotInStore           = SolarViewer.Hemera.Share.Common.CommonUtils.ParseToDataTable(htReworkLotInStore);
                dtReworkLotInStore.TableName = TRANS_TABLES.TABLE_MAIN_DATA;
                DataSet dsReworkLotInStore = new DataSet();
                dsReworkLotInStore.Tables.Add(dtReworkLotInStore);
                dsReworkLotInStore.Merge(dtDefect);
                StoreEngine.ReworkLotInStore(db, dbTran, dsReworkLotInStore);
                #endregion

                #region RWOUTSTORE
                //ReworkLot
                DataTable dtReworkLotDetail = new DataTable();
                dtReworkLotDetail.TableName = BASE_PARAMETER_FIELDS.DATABASE_TABLE_NAME;
                dtReworkLotDetail.Columns.Add("ROW_KEY");
                dtReworkLotDetail.Columns.Add("LOT_NUMBER");
                dtReworkLotDetail.Columns.Add("LINE_KEY");
                dtReworkLotDetail.Columns.Add("LINE_NAME");
                dtReworkLotDetail.Columns.Add("ITEM_QTY");
                dtReworkLotDetail.Columns.Add("EDIT_TIME");
                dtReworkLotDetail.Columns.Add("STEP_KEY");
                dtReworkLotDetail.Columns.Add("ROUTE_KEY");
                dtReworkLotDetail.Columns.Add("ENTERPRISE_KEY");
                dtReworkLotDetail.Columns.Add(WST_STORE_MAT_FIELDS.FIELD_BALANCE_QTY);
                dtReworkLotDetail.Columns.Add(WST_STORE_MAT_FIELDS.FIELD_BALANCE_EDITOR);
                dtReworkLotDetail.Columns.Add(POR_LOT_FIELDS.FIELD_LOT_KEY);
                dtReworkLotDetail.Rows.Add(rowKey, lotNumber, lineKey, strOprLine, quantity, strEditTime,
                                           stepKey, routeKey, enterpriseKey, 0, string.Empty, lotKey);
                DataSet dsReworkLot = new DataSet();
                dsReworkLot.Tables.Add(dtReworkLotDetail);

                Hashtable htReworkLot = new Hashtable();
                DataTable dtReworkLot = new DataTable();

                htReworkLot.Add(WST_STORE_FIELDS.FIELD_STORE_NAME, storeName);
                htReworkLot.Add(WST_STORE_FIELDS.FIELD_STORE_TYPE, storeType);
                htReworkLot.Add(POR_WORK_ORDER_FIELDS.FIELD_WORK_ORDER_KEY, strWorkOrderKey);
                htReworkLot.Add(WST_STORE_MAT_FIELDS.FIELD_STORE_KEY, storeKey);
                htReworkLot.Add(WST_STORE_MAT_FIELDS.FIELD_WORKORDER_NUMBER, workorderNumber);
                htReworkLot.Add(WIP_TRANSACTION_FIELDS.FIELD_ACTIVITY, string.Empty);
                htReworkLot.Add(WIP_TRANSACTION_FIELDS.FIELD_EDITOR, editor);
                htReworkLot.Add(WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIMEZONE_KEY, editTimeZone);
                htReworkLot.Add(WIP_TRANSACTION_FIELDS.FIELD_OPERATOR, strOperator);
                htReworkLot.Add(WIP_TRANSACTION_FIELDS.FIELD_SHIFT_NAME, strShiftName);
                htReworkLot.Add(WIP_TRANSACTION_FIELDS.FIELD_SHIFT_KEY, shiftKey);
                htReworkLot.Add(WIP_TRANSACTION_FIELDS.FIELD_OPR_COMPUTER, computeName);
                htReworkLot.Add(WIP_TRANSACTION_FIELDS.FIELD_STATE_FLAG, stateFlag);
                htReworkLot.Add(WIP_TRANSACTION_FIELDS.FIELD_REWORK_FLAG, reworkFlag);
                htReworkLot.Add(WIP_TRANSACTION_FIELDS.FIELD_OPR_LINE, strOprLine);
                htReworkLot.Add(WIP_TRANSACTION_FIELDS.FIELD_ACTIVITY_COMMENT, comment);
                htReworkLot.Add("REWORK_QTY", quantity);
                dtReworkLot           = SolarViewer.Hemera.Share.Common.CommonUtils.ParseToDataTable(htReworkLot);
                dtReworkLot.TableName = TRANS_TABLES.TABLE_MAIN_DATA;
                dsReworkLot.Tables.Add(dtReworkLot);
                StoreEngine.ReworkLot(db, dbTran, dsReworkLot);
                #endregion
            }
        }