Bläddra i källkod

1.8
1、新添加了正在倒计时时禁止修改该频率的计划

Apple 1 dag sedan
förälder
incheckning
4cae8d31d7

+ 226 - 0
TransmitterSwitch/ManagerPlan/managerplan.cpp

@@ -324,6 +324,17 @@ QList<PlanInfo>& ManagerPlan::findPlanList(const int chnID)
     return *list;
 }
 
+/* 查找全局计划列表,没有被修改过的计划列表 */
+void ManagerPlan::findGlobalPlanList(const int chnID, QList<PlanInfo>& list)
+{
+    /* 将PData的计划拷贝过来 */
+    auto pCard = PData.findPlanCard(chnID);
+    if(pCard != nullptr)
+    {
+        pCard->getPlanList(list);
+    }
+}
+
 
 /* 添加计划,同时添加ui的卡片计划和计划列表 */
 void ManagerPlan::addPlanItem(const int chnID, const PlanInfo& info)
@@ -524,6 +535,207 @@ bool ManagerPlan::checkPlanTimeConflict(const int chnID, const PlanInfo& newInfo
     return isConflict;
 }
 
+/**
+ * @brief 判断新添加的计划是否在即将要执行的计划附近
+ *        1、运行这个函数之前会先进行时间冲突监测,如果有冲突,新计划的关机计划必定在即将执行的计划之前
+ *        2、新添加计划主要判断新计划的结束时间是否在即将执行的计划开始时间之前的10分钟内
+ * 
+ * @param chnID 
+ * @param newInfo 
+ * @return true 
+ * @return false 
+ */
+bool ManagerPlan::checkNewPlanNear(const int chnID, const PlanInfo& newInfo)
+{
+    QList<PlanInfo> list;
+    findGlobalPlanList(chnID, list);
+    /* 先寻找是否有即将执行的计划 */
+    QDateTime nowTime = QDateTime::currentDateTime();
+    /* 先判断关机时间是否在当前时间点到之后十分钟之内 */
+    if(!isNearTime(nowTime, newInfo.offWeekDay, newInfo.offDateTime))
+    {
+        /* 关机时间不在当前时间点到之后十分钟之内,不冲突 */
+        return false;
+    }
+    /* 关机时间在当前时间之后的十分钟内,再查找已有的计划开机时间是否有在十分钟之内的 */
+    bool isConflict = false;
+    // PlanInfo tmpInfo;
+    for(const auto& it : list)
+    {
+        if(isNearTime(nowTime, it.onWeekDay, it.onDateTime))
+        {
+            isConflict = true;
+            // tmpInfo = it;           /* 记录即将执行的计划 */
+            break;
+        }
+    }
+
+    return isConflict;
+}
+
+/* 判断修改的计划是否对即将要执行的计划有影响 */
+bool ManagerPlan::checkModifyPlanNear(const int chnID, const PlanInfo& oldInfo, const PlanInfo& newInfo)
+{
+    /* 先判断旧数据是否在原始数据列表中 */
+    QList<PlanInfo> list;
+    findGlobalPlanList(chnID, list);
+    bool isExist = false;
+    for(const auto& it : list)
+    {
+        if(it == oldInfo)
+        {
+            isExist = true;
+            break;
+        }
+    }
+    if(!isExist)
+    {
+        /* 旧数据不在原始数据列表中,直接返回 */
+        return false;
+    }
+    /*--------------------------------------------------------------
+     * 判断修改的计划有没有在倒计时附近
+     * 1、如果被修改的计划在倒计时附近,不能修改
+     * 2、如果被修改的计划不在倒计时附近,判断修改完成后的计划是否在倒计时附近
+     *   判断方法:先判断修改完成后的计划是否在当前十分钟之内,如果在,再查找
+     *   当前十分钟之内是否有即将执行的计划,如果有,则冲突
+     *--------------------------------------------------------------*/
+    QDateTime nowTime = QDateTime::currentDateTime();
+    /* 先判断被修改的计划是否在倒计时附近 */
+    if(isNearTime(nowTime, oldInfo.onWeekDay, oldInfo.onDateTime) ||
+       isNearTime(nowTime, oldInfo.offWeekDay, oldInfo.offDateTime))
+    {
+        /* 被修改的计划在倒计时附近,不能修改 */
+        TipWidget::display(TipWidget::OPERATOR_WARN, "被修改的计划正在倒计时,不能修改!", this);
+        return true;
+    }
+    /* 判断修改完成后的计划是否在当前时间附近 */
+    if(isNearTime(nowTime, newInfo.onWeekDay, newInfo.onDateTime) ||
+    isNearTime(nowTime, newInfo.offWeekDay, newInfo.offDateTime))
+    {
+        /* 查找附近有无倒计时 */
+        if(findNearPlan(chnID, nowTime))
+        {
+            TipWidget::display(TipWidget::OPERATOR_WARN, "修改后的计划在倒计时范围内,不能修改!", this);
+            return true;
+        }
+    }
+
+    return false;
+}
+
+
+/**
+ * @brief 判断这个时间点附近有没有即将要执行的计划
+ *        1、先寻找特殊日,特殊日会覆盖正常日的计划,十分钟内既有特殊日又有正常日,返回的是特殊日
+ *        2、这个查找的是原始的没有被修改过的计划列表
+ * 
+ * @param chnID 
+ * @param nearInfo 
+ * @return true 
+ * @return false 
+ */
+bool ManagerPlan::findNearPlan(const int chnID, const QDateTime& nowTime)
+{
+    QList<PlanInfo> list;
+    findGlobalPlanList(chnID, list);
+
+    bool isNear = false;
+    /* 先判断特殊日 */
+    for(const auto& it : list)
+    {
+        if(it.onWeekDay == enum_WeekDay::WeekDay_Special)
+        {
+            if(isNearTime(nowTime, it.onWeekDay, it.onDateTime))
+            {
+                /* 找到特殊日的计划 */
+                isNear = true;
+                break;
+            }
+            if(isNearTime(nowTime, it.offWeekDay, it.offDateTime))
+            {
+                /* 找到特殊日的计划 */
+                isNear = true;
+                break;
+            }
+        }
+    }
+    if(isNear)
+    {
+        /* 找到特殊日的计划,直接返回 */
+        return true;
+    }
+    /* 判断正常日 */
+    for(const auto& it : list)
+    {
+        if(it.onWeekDay != enum_WeekDay::WeekDay_Special)
+        {
+            if(isNearTime(nowTime, it.onWeekDay, it.onDateTime))
+            {
+                /* 找到正常日的计划 */
+                isNear = true;
+                break;
+            }
+            if(isNearTime(nowTime, it.offWeekDay, it.offDateTime))
+            {
+                /* 找到正常日的计划 */
+                isNear = true;
+                break;
+            }
+        }
+    }
+
+    return isNear;
+}
+
+/* 判断两个时间点是否在十分钟之内 */
+bool ManagerPlan::isNearTime(const QDateTime& nowTime, const enum_WeekDay weekDay, const QDateTime& time)
+{
+    // 10分钟后
+    QDateTime tmpTime = nowTime.addSecs(10 * 60);
+    enum_WeekDay nowWeekDay = static_cast<enum_WeekDay>(nowTime.date().dayOfWeek());
+    enum_WeekDay tmpWeekDay = static_cast<enum_WeekDay>(tmpTime.date().dayOfWeek());
+    /* 先判断是否是特殊日 */
+    if(weekDay == enum_WeekDay::WeekDay_Special)
+    {
+        if(time <= tmpTime && time > nowTime)
+        {
+            /* 在10分钟之内 */
+            return true;
+        }
+    }
+
+    /* 正常日,先判断有没有跨天 */
+    if(nowWeekDay == tmpWeekDay)
+    {
+        /* 在同一天 */
+        if(time.time() <= tmpTime.time() && time.time() > nowTime.time())
+        {
+            /* 在10分钟之内 */
+            return true;
+        }
+    }else {
+        /* 跨天了,判断时间 */
+        if(weekDay == nowWeekDay)
+        {
+            /* 在今天 */
+            if(time.time() >= nowTime.time())
+            {
+                /* 在今天的10分钟之内 */
+                return true;
+            }else {
+                /* 在明天的10分钟之内 */
+                if(time.time() <= tmpTime.time())
+                {
+                    return true;
+                }
+            }
+        }
+    }
+
+    return false; /* 不在10分钟之内 */
+}
+
 
 /* 设置按钮显示或隐藏 */
 void ManagerPlan::setButtonVisible(bool isVisible)
@@ -609,6 +821,7 @@ void ManagerPlan::do_selectFrequency(int index)
         /* 有计划,显示按钮 */
         setButtonVisible(true);
     }
+
 }
 
 /* 点击了添加按钮 */
@@ -653,6 +866,13 @@ void ManagerPlan::do_addPlanItem()
         return;
     }
 
+    /* 判断新计划是否在即将要执行的计划时间点附近 */
+    // if(checkNewPlanNear(chnID, one))
+    // {
+    //     TipWidget::display(TipWidget::OPERATOR_WARN, "新计划在即将执行的计划倒计时之内!", this);
+    //     return;
+    // }
+
     /* 添加计划 */
     addPlanItem(chnID, one);
 
@@ -715,6 +935,12 @@ void ManagerPlan::do_modifyPlanItem()
         TipWidget::display(TipWidget::OPERATOR_WARN, "时间段冲突!", this);
         return;
     }
+    /* 判断修改的计划是否在即将要执行的计划时间点附近 */
+    // if(checkModifyPlanNear(chnID, exPlan, one))
+    // {
+    //     return;
+    // }
+    
 
     /* 修改选中的行 */
     auto oldPlan = ui->pCard->modifyPlanItem(slectRow, one);

+ 25 - 0
TransmitterSwitch/ManagerPlan/managerplan.h

@@ -21,6 +21,17 @@ enum class Enum_Mode
     Mode_ModifyTemplate = 2,    /* 修改模版模式,去掉了保存为模版的按钮 */
 };
 
+/**
+ * @brief 即将要执行的计划时间点
+ * 
+ */
+struct NearExecutionPlan
+{
+    bool isExist = false;          /* 是否存在 */
+    enum_WeekDay weekDay = enum_WeekDay::WeekDay_Special; /* 周几 */
+    QDateTime time;                /* 时间 */
+};
+
 /**
  * @brief 管理计划页面
  * 
@@ -48,6 +59,8 @@ public:
     /* 设置FromSQLite地址,复用主窗口的SQLite */
     void setFromSQLite(FromSQLite* fromSQLite);
 
+    
+
 signals:
 
     /* 发送调用回调函数的信号 */
@@ -70,6 +83,8 @@ private:
 
     /* 查找本地计划列表,这个频率不存在则添加 */
     QList<PlanInfo>& findPlanList(const int chnID);
+    /* 查找全局计划列表,没有被修改过的计划列表 */
+    void findGlobalPlanList(const int chnID, QList<PlanInfo>& list);
     /* 添加计划,同时添加ui的卡片计划和计划列表 */
     void addPlanItem(const int chnID, const PlanInfo& info);
     /* 修改容器中的计划 */
@@ -84,6 +99,15 @@ private:
     bool checkPlanTimeConflict(const int chnID, const PlanInfo& info);
     /* 判断计划时间和列表中的时间是否冲突,添加排除的计划,用于比较修改的计划 */
     bool checkPlanTimeConflict(const int chnID, const PlanInfo& newInfo, const PlanInfo& exInfo);
+    /* 判断新添加的计划是否在即将要执行的计划附近 */
+    bool checkNewPlanNear(const int chnID, const PlanInfo& newInfo);
+    /* 判断修改的计划是否对即将要执行的计划有影响 */
+    bool checkModifyPlanNear(const int chnID, const PlanInfo& oldInfo, const PlanInfo& newInfo);
+    /* 判断这个时间点附近有没有即将要执行的计划 */
+    bool findNearPlan(const int chnID, const QDateTime& nowTime);
+    bool findNearPlan(const int chnID, const QDateTime& nowTime, enum_WeekDay& weekDay, QDateTime& time);
+    /* 判断两个时间点是否在十分钟之内 */
+    bool isNearTime(const QDateTime& nowTime, const enum_WeekDay weekDay, const QDateTime& time);
 
     /* 设置按钮显示或隐藏 */
     inline void setButtonVisible(bool isVisible);
@@ -132,6 +156,7 @@ private:
 
     /* 存储计划信息,修改过的频率计划,存储的是这个频率完整的计划 */
     QMap<int, QList<PlanInfo>> m_mapPlanInfo;
+    NearExecutionPlan m_nearExecPlan;           /* 最近要执行的计划 */
 
     FromWebAPI* m_fromWebAPI = nullptr;  /* 网络API接口,用于获取和保存数据 */
     FromSQLite* m_fromSQLite = nullptr; /* SQLite数据库操作类 */

+ 11 - 0
TransmitterSwitch/lhtranmitterswitch.h

@@ -121,6 +121,17 @@ int LHTRANSMITTERSWITCH_EXPORT DoSetCallBack(trackCallBack cb);
 //------------------------------------------------------------------------
 int LHTRANSMITTERSWITCH_EXPORT DoSetUserPermission(int USerPermission);
 
+//------------------------------------------------------------------------
+//函    数: DoSetNowExecPlan()
+//
+//说    明: 设置某个频率当前进入倒计时的计划
+//
+//参    数: trackCallBack 函数指针
+//
+//返 回 值:0:成功; 其他:失败(详见返回码定义)
+//------------------------------------------------------------------------
+// int LHTRANSMITTERSWITCH_EXPORT DoSetNowExecPlan(int chnID, int onWeekDay, QDateTime onDateTime, int offWeekDay, QDateTime offDateTime);
+
 
 
 /*===========================================================================

+ 158 - 15
TransmitterSwitch/transmitterswitch.cpp

@@ -255,7 +255,7 @@ void TransmitterSwitch::getExecPlanFromEQM()
         }
     }
 
-    /* 判断是指定了频率还是全部频率 */
+    /* 判断是单频率还是多频率 */
     if(!GInfo.isOneFrequency())
     {
         /* 所有频率 */
@@ -263,13 +263,19 @@ void TransmitterSwitch::getExecPlanFromEQM()
         if(m_fromWebAPI->getExecPlanData(mapPlan))
         {
             /* 先清空所有的计划 */
-            PData.clearAllPlanItem();
+            // PData.clearAllPlanItem();
             /* 遍历所有的频率 */
             for(auto begin = mapPlan.begin(), end = mapPlan.end(); begin != end; begin++)
             {
                 auto pCard = PData.findPlanCard(begin.key());
                 if(pCard != nullptr)
                 {
+                    if(isFrequencyInCountdown(pCard->getChannelInfo().ChannelID))
+                    {
+                        TipWidget::display(TipWidget::OPERATOR_WARN, QString("<%1>正在倒计时中,无法更新计划").arg(pCard->getChannelInfo().ChannelName), this);
+                        continue;
+                    }
+                    pCard->clearPlanItem(); /* 清空当前频率的计划 */
                     pCard->setPlanList(begin.value());
                 }
             }
@@ -573,18 +579,25 @@ void TransmitterSwitch::setOnePlanData(QList<OnePlanItemInfo>& listPlan, ExecPla
 /* 点击了添加计划按钮 */
 void TransmitterSwitch::do_pBtnAddExecPlan()
 {
-    /* 创建新增窗口 */
-    std::shared_ptr<ManagerPlan> mp = std::make_shared<ManagerPlan>(Enum_Mode::Mode_Add);
-
     /* 获取当前选中的窗口 */
     auto pCard = PData.getCurrentPlanCard();
     ChannelInfo chnInfo;
     if(pCard == nullptr)
     {
         LH_WRITE_LOG_DEBUG("没有选中频率卡片");
-    }else {
-        mp->setFrequencyID(pCard->getChannelInfo());
+        TipWidget::display(TipWidget::OPERATOR_WARN, "没有选中频率卡片", this);
+        return;
     }
+    /* 判断有没有在倒计时中,如果在就不能操作 */
+    if(isFrequencyInCountdown(pCard->getChannelInfo().ChannelID))
+    {
+        TipWidget::display(TipWidget::OPERATOR_WARN, QString("<%1>正在倒计时中,无法添加计划").arg(pCard->getChannelInfo().ChannelName), this);
+        return;
+    }
+
+    /* 创建新增窗口 */
+    std::shared_ptr<ManagerPlan> mp = std::make_shared<ManagerPlan>(Enum_Mode::Mode_Add);
+    mp->setFrequencyID(pCard->getChannelInfo());
     mp->setFromWebAPI(m_fromWebAPI);
     mp->setFromSQLite(m_fromSQLite);
     connect(mp.get(), &ManagerPlan::signal_callBack, this, &TransmitterSwitch::do_callBack);
@@ -656,6 +669,14 @@ void TransmitterSwitch::do_pBtnModifyExecPlan()
         TipWidget::display(TipWidget::OPERATOR_WARN, "没有选中频率卡片", this);
         return;
     }
+
+    /* 判断有没有在倒计时中,如果在就不能操作 */
+    if(isFrequencyInCountdown(pCard->getChannelInfo().ChannelID))
+    {
+        TipWidget::display(TipWidget::OPERATOR_WARN, QString("<%1>正在倒计时中,无法修改计划").arg(pCard->getChannelInfo().ChannelName), this);
+        return;
+    }
+
     /* 创建新增窗口 */
     std::shared_ptr<ManagerPlan> mp = std::make_shared<ManagerPlan>(Enum_Mode::Mode_Modify);
     /* 设置频率信息 */
@@ -801,11 +822,19 @@ void TransmitterSwitch::do_pBtnClearPlan()
     }
     
     /* 先判断有没有选中的频率卡片 */
-    if(PData.getCurrentPlanCard() == nullptr)
+    auto pCard = PData.getCurrentPlanCard();
+    if(pCard == nullptr)
     {
         TipWidget::display(TipWidget::OPERATOR_FAIL, "没有选中频率卡片", this);
         return;
     }
+    /* 判断有没有在倒计时中,如果在就不能操作 */
+    if(isFrequencyInCountdown(pCard->getChannelInfo().ChannelID))
+    {
+        TipWidget::display(TipWidget::OPERATOR_WARN, QString("<%1>正在倒计时中,无法清空计划").arg(pCard->getChannelInfo().ChannelName), this);
+        return;
+    }
+
     /* 跳出弹窗警告 */
     Warning w(this);
     w.setQSS(EPUIStyle.getQSSPath());
@@ -819,13 +848,6 @@ void TransmitterSwitch::do_pBtnClearPlan()
     {
         return;
     }
-    /* 获取选中的卡片 */
-    auto pCard = PData.getCurrentPlanCard();
-    if(pCard == nullptr)
-    {
-        LH_WRITE_ERROR("没有选中频率卡片");
-        return;
-    }
     /* 清空计划 */
     pCard->clearPlanItem();
     if(GInfo.isOnlineDB())
@@ -893,6 +915,12 @@ void TransmitterSwitch::do_pBtnCopyToOther()
             LH_WRITE_ERROR(QString("没有找到频率ID为%1的卡片").arg(it.ChannelID));
             continue;
         }
+        /* 判断有没有在倒计时中,如果在就不能操作 */
+        if(isFrequencyInCountdown(pTmpCard->getChannelInfo().ChannelID))
+        {
+            TipWidget::display(TipWidget::OPERATOR_WARN, QString("<%1>正在倒计时中,无法变更计划").arg(pCard->getChannelInfo().ChannelName), this);
+            continue;
+        }
         /* 设置计划列表 */
         pTmpCard->setPlanList(listPlan);
         QList<OnePlanItemInfo> tmpListPlan;
@@ -1426,6 +1454,12 @@ void TransmitterSwitch::importTemplateFromEQM()
             LH_WRITE_ERROR(QString("没有找到频率ID为%1的卡片").arg(begin.key()));
             continue;
         }
+        /* 判断有没有在倒计时中,如果在就不能操作 */
+        if(isFrequencyInCountdown(pCard->getChannelInfo().ChannelID))
+        {
+            TipWidget::display(TipWidget::OPERATOR_WARN, QString("<%1>正在倒计时中,无法导入模版").arg(pCard->getChannelInfo().ChannelName), this);
+            continue;
+        }
         /* 设置计划列表 */
         pCard->setPlanList(begin.value());
 
@@ -1821,6 +1855,115 @@ void TransmitterSwitch::manageTemplateFromSQLite()
     }
 }
 
+/* 判断当前频率是否在倒计时 */
+bool TransmitterSwitch::isFrequencyInCountdown(int channelID)
+{
+    auto pCard = PData.findPlanCard(channelID);
+    if(pCard == nullptr)
+    {
+        LH_WRITE_ERROR(QString("没有找到频率ID为%1的卡片").arg(channelID));
+        return false;
+    }
+    QList<PlanInfo> list;
+    pCard->getPlanList(list);
+
+    bool isNear = false;
+    QDateTime nowTime = QDateTime::currentDateTime();
+    /* 先判断特殊日 */
+    for(const auto& it : list)
+    {
+        if(it.onWeekDay == enum_WeekDay::WeekDay_Special)
+        {
+            if(isInCountdownTime(nowTime, it.onWeekDay, it.onDateTime))
+            {
+                /* 找到特殊日的计划 */
+                isNear = true;
+                break;
+            }
+            if(isInCountdownTime(nowTime, it.offWeekDay, it.offDateTime))
+            {
+                /* 找到特殊日的计划 */
+                isNear = true;
+                break;
+            }
+        }
+    }
+    if(isNear)
+    {
+        /* 找到特殊日的计划,直接返回 */
+        return true;
+    }
+    /* 判断正常日 */
+    for(const auto& it : list)
+    {
+        if(it.onWeekDay != enum_WeekDay::WeekDay_Special)
+        {
+            if(isInCountdownTime(nowTime, it.onWeekDay, it.onDateTime))
+            {
+                /* 找到正常日的计划 */
+                isNear = true;
+                break;
+            }
+            if(isInCountdownTime(nowTime, it.offWeekDay, it.offDateTime))
+            {
+                /* 找到正常日的计划 */
+                isNear = true;
+                break;
+            }
+        }
+    }
+
+    return isNear;
+}
+
+/* 判断两个时间点是否在十分钟之内 */
+bool TransmitterSwitch::isInCountdownTime(const QDateTime& nowTime, const enum_WeekDay weekDay, const QDateTime& time)
+{
+    // 10分钟后
+    QDateTime tmpTime = nowTime.addSecs(10 * 60);
+    enum_WeekDay nowWeekDay = static_cast<enum_WeekDay>(nowTime.date().dayOfWeek());
+    enum_WeekDay tmpWeekDay = static_cast<enum_WeekDay>(tmpTime.date().dayOfWeek());
+    /* 先判断是否是特殊日 */
+    if(weekDay == enum_WeekDay::WeekDay_Special)
+    {
+        if(time <= tmpTime && time > nowTime)
+        {
+            /* 在10分钟之内 */
+            return true;
+        }
+    }
+
+    /* 正常日,先判断有没有跨天 */
+    if(nowWeekDay == tmpWeekDay)
+    {
+        /* 在同一天 */
+        if(time.time() <= tmpTime.time() && time.time() > nowTime.time())
+        {
+            /* 在10分钟之内 */
+            return true;
+        }
+    }else {
+        /* 跨天了,判断时间 */
+        if(weekDay == nowWeekDay)
+        {
+            /* 在今天 */
+            if(time.time() >= nowTime.time())
+            {
+                /* 在今天的10分钟之内 */
+                return true;
+            }else {
+                /* 在明天的10分钟之内 */
+                if(time.time() <= tmpTime.time())
+                {
+                    return true;
+                }
+            }
+        }
+    }
+
+    return false; /* 不在10分钟之内 */
+}
+
 
 
 /* 事件过滤器 */

+ 5 - 0
TransmitterSwitch/transmitterswitch.h

@@ -147,6 +147,11 @@ private:
     /* 管理SQLite数据库的模版数据 */
     void manageTemplateFromSQLite();
 
+    /* 判断当前频率是否在倒计时 */
+    bool isFrequencyInCountdown(int channelID);
+    /* 判断两个时间点是否在十分钟之内 */
+    bool isInCountdownTime(const QDateTime& nowTime, const enum_WeekDay weekDay, const QDateTime& time);
+
 protected:
     /* 事件过滤器 */
     bool eventFilter(QObject *watched, QEvent *event) override;

+ 2 - 2
show1/widget.cpp

@@ -40,8 +40,8 @@ Widget::Widget(QWidget *parent) :
     /* 初始化WebAPI */
     InitData initData;
     initData.url = "http://192.1.3.133:31000/v6/";
-    initData.serverID = "2e36b53ccd2a433b9a803b98d683ed91";      /* 61DM */ 
-    // initData.serverID = "3b8889a0d58b8d71affc04bc27d14e42";         /* GBase */
+    // initData.serverID = "2e36b53ccd2a433b9a803b98d683ed91";      /* 61DM */ 
+    initData.serverID = "3b8889a0d58b8d71affc04bc27d14e42";         /* GBase */
     initData.userPermission = 0;
 
     // initData.url = "http://192.1.3.136:31000/v6/";