public static void Main()
        {
            var storeEngine = new StoreEngine();

            storeEngine.Run();
        }
Example #2
0
        /// <summary>
        /// 将线边仓中的批次进行合并。
        /// </summary>
        /// <param name="db">数据库对象。</param>
        /// <param name="dbtran">数据库操作事务对象。</param>
        /// <param name="dsParams">
        /// 包含合批数据的数据集对象.
        /// (1)数据集对象中包含一个名称为<see cref="BASE_PARAMETER_FIELDS.DATABASE_TABLE_NAME"/>的数据表对象。
        /// 数据表中存放待合并的批次返工或退库数据。
        /// (2) 数据集对象中包含一个名称为<see cref="TRANS_TABLES.TABLE_MAIN_DATA"/>的数据表对象。
        /// 数据表中必须包含两个列"name"和"value"。列name存放哈希表的键名,列value存放哈希表键对应的键值。
        /// 键名:
        /// 合并到批次的返工或退库记录的主键<see cref="WST_STORE_MAT_FIELDS.FIELD_ROW_KEY"/>,
        /// 合并到批次的批次号<see cref="POR_LOT_FIELDS.FIELD_LOT_NUMBER"/>,
        /// 合并后批次的数量<see cref="POR_LOT_FIELDS.FIELD_QUANTITY"/>,
        /// 编辑人<see cref="WIP_TRANSACTION_FIELDS.FIELD_EDITOR"/>,
        /// 编辑时区<see cref="WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIMEZONE_KEY"/>,
        /// 编辑时间<see cref="WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIME"/>,
        /// 批次主键<see cref="POR_LOT_FIELDS.FIELD_LOT_KEY"/>。
        /// </param>
        private void MergeLotInStore(Database db, DbTransaction dbtran, DataSet dsParams)
        {
            String  sql      = string.Empty;
            DataSet dsReturn = new DataSet();
            DataSet ds;
            string  strParentRowKey        = "";
            string  strParentLotNumber     = "";
            string  strParentTransKey      = "";
            string  strParentStepKey       = "";
            string  strParentRouteKey      = "";
            string  strParentEnterpriseKey = "";
            string  strParentQTY           = "";
            string  strTotalQTY            = "";
            string  strSumQTY = "";
            string  strComment = "";
            string  strEditor = "", strEditTimeZone = "", strEditTime = "";
            string  strLineKey = "", strShiftName = "", strWorkOrderKey = "", strStateFlag = "";

            if (dsParams.Tables.Count > 0)//数据集中包含数据表。
            {
                DataTable dataTable = dsParams.Tables[TRANS_TABLES.TABLE_MAIN_DATA];
                Hashtable hashData  = SolarViewer.Hemera.Share.Common.CommonUtils.ConvertToHashtable(dataTable);
                strParentRowKey    = hashData[WST_STORE_MAT_FIELDS.FIELD_ROW_KEY].ToString();
                strParentLotNumber = hashData["LOT_NUMBER"].ToString();
                strSumQTY          = hashData[POR_LOT_FIELDS.FIELD_QUANTITY].ToString();
                //strComment = hashData[WIP_TRANSACTION_FIELDS.FIELD_ACTIVITY_COMMENT].ToString();
                strEditor       = hashData[WIP_TRANSACTION_FIELDS.FIELD_EDITOR].ToString();
                strEditTimeZone = hashData[WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIMEZONE_KEY].ToString();
                strEditTime     = UtilHelper.GetSysdate(db).ToString("yyyy-MM-dd HH:mm:ss");
                // Get Lot Details
                ds = StoreEngine.GetStoreLotDetailsInfor(db, strParentRowKey);
                strParentStepKey       = ds.Tables[WST_STORE_MAT_FIELDS.DATABASE_TABLE_NAME].Rows[0][WST_STORE_MAT_FIELDS.FIELD_STEP_KEY].ToString();
                strParentRouteKey      = ds.Tables[WST_STORE_MAT_FIELDS.DATABASE_TABLE_NAME].Rows[0][WST_STORE_MAT_FIELDS.FIELD_ROUTE_KEY].ToString();
                strParentEnterpriseKey = ds.Tables[WST_STORE_MAT_FIELDS.DATABASE_TABLE_NAME].Rows[0][WST_STORE_MAT_FIELDS.FIELD_ENTERPRISE_KEY].ToString();
                strParentQTY           = ds.Tables[WST_STORE_MAT_FIELDS.DATABASE_TABLE_NAME].Rows[0][WST_STORE_MAT_FIELDS.FIELD_ITEM_QTY].ToString();

                strLineKey      = ds.Tables[WST_STORE_MAT_FIELDS.DATABASE_TABLE_NAME].Rows[0][WST_STORE_MAT_FIELDS.FIELD_LINE_KEY].ToString();
                strShiftName    = UtilHelper.GetShiftKey(db, strEditTime);
                strWorkOrderKey = ds.Tables[WST_STORE_MAT_FIELDS.DATABASE_TABLE_NAME].Rows[0][POR_LOT_FIELDS.FIELD_WORK_ORDER_KEY].ToString();

                //更新WST_STORE_MAT记录
                sql = string.Format(@"UPDATE WST_STORE_MAT 
                                    SET ITEM_QTY= '{0}', EDIT_TIME=GETDATE() 
                                    WHERE ROW_KEY='{1}'",
                                    strSumQTY.PreventSQLInjection(),
                                    strParentRowKey.PreventSQLInjection());
                db.ExecuteNonQuery(dbtran, CommandType.Text, sql);
                strTotalQTY = (Convert.ToInt32(strParentQTY) + Convert.ToInt32(strSumQTY)).ToString();

                WIP_TRANSACTION_FIELDS wipFields = new WIP_TRANSACTION_FIELDS();

                #region 合并批次操作记录
                Hashtable parenttransactionTable = new Hashtable();
                DataTable parenttransaction      = new DataTable();
                strParentTransKey = UtilHelper.GenerateNewKey(0);
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_TRANSACTION_KEY, strParentTransKey);
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_PIECE_TYPE, "0");
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_PIECE_KEY, hashData[POR_LOT_FIELDS.FIELD_LOT_KEY].ToString());
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_CHILD_LOT_KEY, strParentRowKey);
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_QUANTITY_IN, strParentQTY);
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_QUANTITY_OUT, strTotalQTY);
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_ACTIVITY, ACTIVITY_FIELD_VALUES.FIELD_ACTIVITY_STOREMERGE);
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_ACTIVITY_COMMENT, strComment);
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_EDITOR, strEditor);
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIMEZONE_KEY, strEditTimeZone);
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIME, strEditTime);
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_LINE_KEY, strLineKey);
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_SHIFT_NAME, strShiftName);
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_WORK_ORDER_KEY, strWorkOrderKey);
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_STEP_KEY, strParentStepKey);
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_ROUTE_KEY, strParentRouteKey);
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_ENTERPRISE_KEY, strParentEnterpriseKey);
                parenttransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_STATE_FLAG, strStateFlag);
                //向WIP_TRANSACTION插入合并到批次的操作记录
                sql = DatabaseTable.BuildInsertSqlStatement(wipFields, parenttransactionTable, null);
                db.ExecuteNonQuery(dbtran, CommandType.Text, sql);
                #endregion

                #region 生成子批次
                string strChildRowKey    = "";
                string strChildLotNumber = "";
                string strChildQty       = "";

                if (dsParams.Tables.Contains(BASE_PARAMETER_FIELDS.DATABASE_TABLE_NAME))
                {
                    DataTable parameterdatatable = dsParams.Tables[BASE_PARAMETER_FIELDS.DATABASE_TABLE_NAME];
                    for (int i = 0; i < parameterdatatable.Rows.Count; i++)
                    {
                        //更新WST_STORE_MAT数据
                        strChildRowKey    = parameterdatatable.Rows[i][WST_STORE_MAT_FIELDS.FIELD_ROW_KEY].ToString();
                        strChildLotNumber = parameterdatatable.Rows[i]["LOT_NUMBER"].ToString();
                        strChildQty       = parameterdatatable.Rows[i][WST_STORE_MAT_FIELDS.FIELD_ITEM_QTY].ToString();

                        sql = @"UPDATE WST_STORE_MAT 
                                SET ITEM_QTY='0',OBJECT_STATUS='3', EDIT_TIME=GETDATE() 
                                WHERE ROW_KEY='" + strChildRowKey.PreventSQLInjection() + "'";
                        db.ExecuteNonQuery(dbtran, CommandType.Text, sql);
                        //向WIP_TRANSACTION插入被合并批次的操作记录
                        Hashtable childtransactionTable = new Hashtable();
                        DataTable childtransaction      = new DataTable();
                        //sql = "";
                        string strChildTransKey = UtilHelper.GenerateNewKey(0);
                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_TRANSACTION_KEY, strChildTransKey);
                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_PIECE_TYPE, "0");
                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_PIECE_KEY, parameterdatatable.Rows[i][POR_LOT_FIELDS.FIELD_LOT_KEY].ToString());
                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_CHILD_LOT_KEY, strChildRowKey);
                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_QUANTITY_IN, strChildQty);
                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_QUANTITY_OUT, "0");
                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_ACTIVITY, ACTIVITY_FIELD_VALUES.FIELD_ACTIVITY_STORE_MERGED);
                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_ACTIVITY_COMMENT, "");
                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_EDITOR, strEditor);
                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIMEZONE_KEY, strEditTimeZone);
                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIME, strEditTime);

                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_LINE_KEY, strLineKey);
                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_SHIFT_NAME, strShiftName);
                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_WORK_ORDER_KEY, strWorkOrderKey);
                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_ENTERPRISE_KEY, strParentEnterpriseKey);
                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_ROUTE_KEY, strParentRouteKey);
                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_STEP_KEY, strParentStepKey);
                        childtransactionTable.Add(WIP_TRANSACTION_FIELDS.FIELD_STATE_FLAG, strStateFlag);
                        sql = DatabaseTable.BuildInsertSqlStatement(wipFields, childtransactionTable, null);
                        db.ExecuteNonQuery(dbtran, CommandType.Text, sql);

                        //向WIP_MERGE插入合并批次记录
                        Hashtable        MergeHashTable = new Hashtable();
                        WIP_MERGE_FIELDS wipMerge       = new WIP_MERGE_FIELDS();

                        MergeHashTable.Add(WIP_MERGE_FIELDS.FIELD_TRANSACTION_KEY, strParentTransKey);
                        MergeHashTable.Add(WIP_MERGE_FIELDS.FIELD_CHILD_LOT_KEY, strChildRowKey);
                        MergeHashTable.Add(WIP_MERGE_FIELDS.FIELD_MAIN_LOT_KEY, strParentRowKey);
                        MergeHashTable.Add(WIP_MERGE_FIELDS.FIELD_MERGE_QUANTITY, strChildQty);
                        MergeHashTable.Add(WIP_MERGE_FIELDS.FIELD_STEP_KEY, strParentStepKey);
                        MergeHashTable.Add(WIP_MERGE_FIELDS.FIELD_ROUTE_KEY, strParentRouteKey);
                        MergeHashTable.Add(WIP_MERGE_FIELDS.FIELD_ENTERPRISE_KEY, strParentEnterpriseKey);
                        MergeHashTable.Add(WIP_MERGE_FIELDS.FIELD_EDITOR, strEditor);
                        MergeHashTable.Add(WIP_MERGE_FIELDS.FIELD_EDIT_TIME, strEditTime);
                        MergeHashTable.Add(WIP_MERGE_FIELDS.FIELD_EDIT_TIMEZONE, strEditTimeZone);
                        MergeHashTable.Add(WIP_MERGE_FIELDS.FIELD_CHILD_TRANSACTION_KEY, strChildTransKey);
                        sql = DatabaseTable.BuildInsertSqlStatement(wipMerge, MergeHashTable, null);
                        db.ExecuteNonQuery(dbtran, CommandType.Text, sql);
                    }
                }
                #endregion
            }
        }
Example #3
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
            }
        }