Commit b72a014e by ss.dai

提交海信测试

parent a088791e
...@@ -4,6 +4,14 @@ ...@@ -4,6 +4,14 @@
#include <QVariant> #include <QVariant>
#include <QDebug> #include <QDebug>
#include <QSettings> #include <QSettings>
#include <windows.h>
#include <QDir>
#include <QFile>
#include <QCoreApplication>
#include <QLibrary>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
FmPlugin &FmPlugin::GetInstance() FmPlugin &FmPlugin::GetInstance()
{ {
...@@ -40,51 +48,21 @@ bool FmPlugin::ConnectDb(const QString &host, const QString &username, const QSt ...@@ -40,51 +48,21 @@ bool FmPlugin::ConnectDb(const QString &host, const QString &username, const QSt
bool FmPlugin::GetStoreInfo(QString &storeId, QString &posId, QString &cashierId, QDateTime &dateTime, QString &error) bool FmPlugin::GetStoreInfo(QString &storeId, QString &posId, QString &cashierId, QDateTime &dateTime, QString &error)
{ {
// TODO(用于鲜丰演示)
QSettings set("tmp.ini", QSettings::IniFormat);
storeId = set.value("storeId").toString(); QSettings reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\Hisensoft Co.Ltd\\FoodPos", QSettings::NativeFormat);
posId = QString("001");
cashierId = QString("001");
return true;
if(!m_db.open()) storeId = reg.value("OrgCode").toString();
{
error = m_db.lastError().text();
return false;
}
QSqlQuery query = QSqlQuery(m_db); posId = "1";
// 获取门店号 cashierId = "1";
QString queryStoreId("select sys_var_value from sys_t_system where sys_var_id='g_branch_no';");
query.prepare(queryStoreId);
if (!query.exec())
{
error = query.lastError().text();
m_db.close();
return false;
}
query.next();
storeId = query.value(0).toString();
m_storeId = storeId;
// 获取营业日
QString queryDateTime("select sys_var_value from sys_t_system where sys_var_id='dBusiness';");
query.prepare(queryDateTime);
if (!query.exec())
{
error = query.lastError().text();
m_db.close();
return false;
}
query.next();
dateTime = query.value(0).toDateTime();
posId="1"; if(storeId.isEmpty())
cashierId="1"; {
return false;
}
error = QString("success");
m_db.close(); return true;
return true;
} }
bool FmPlugin::GetOnDutyCashiers(QList<CashierObject> &cashiersList, QString &error) bool FmPlugin::GetOnDutyCashiers(QList<CashierObject> &cashiersList, QString &error)
...@@ -127,50 +105,52 @@ bool FmPlugin::GetOnDutyCashiers(QList<CashierObject> &cashiersList, QString &er ...@@ -127,50 +105,52 @@ bool FmPlugin::GetOnDutyCashiers(QList<CashierObject> &cashiersList, QString &er
return true; return true;
} }
bool FmPlugin::DoOrderEntry(const OrderObject *orderObject, const QString &cashierId, const QString &cashierName, const QString &shiftId, const QString &shiftName, QString &error) bool FmPlugin::DoOrderEntry(const OrderObject *orderObject, QString &error)
{ {
// TODO(用于鲜丰演示) QString dirPath = QString("%1/orders").arg(QCoreApplication::applicationDirPath());
return true; QDir dir;
dir.mkdir(dirPath);
QFile file(QString("%1/%2").arg(dirPath, orderObject->order_id));
m_orderObject = orderObject; if(file.exists())
if(!m_db.open())
{ {
error = m_db.lastError().text(); return true;
return false;
} }
// 先插入顾客信息不管成功与否不影响后续操作
int custid = -1; if(f_UFMSaveSales==NULL)
_InsertInto_p_t_fmwm_custinfo(custid);
// 开启事务
if(!m_db.transaction())
{ {
error = m_db.lastError().text(); QString appDir;
m_db.close(); QSettings reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\Hisensoft Co.Ltd\\FoodPos", QSettings::NativeFormat);
return false; appDir = reg.value("AppDir").toString();
m_lib.setFileName(QString("%1/MHiFMSaveSales.dll").arg(appDir));
if(m_lib.load())
{
f_UFMSaveSales = (UFMSaveSales)m_lib.resolve("UFMSaveSales");
if(f_UFMSaveSales!=NULL)
{
error = QString("load UFMSaveSales failed");
}
}else
{
qDebug() << m_lib.errorString();
error = QString("load dll failed[%1]").arg(appDir + "/MHiFMSaveSales.dll");
}
} }
// 插入三张临时表后执行存储过程有一个失败则回滚 if(f_UFMSaveSales!=NULL)
if(_InsertInto_d_t_food_fmbill0(cashierId, cashierName, shiftId, shiftName, custid))
{ {
if(_InsertInto_d_t_food_fmbills0()) char tmp[100] = {0};
if(1==f_UFMSaveSales(_GetOrderStr(orderObject).toLocal8Bit().data(), tmp))
{
file.open(QIODevice::WriteOnly);
file.close();
return true;
}else
{ {
if(_InsertInto_d_t_bill_fmpay0()) QJsonObject obj = QJsonDocument::fromJson(QString::fromLocal8Bit(tmp).toUtf8()).object();
{ error = obj["Msg"].toString();
if(_Exec_pr_fmwm())
{
// 都成功则提交
m_db.commit();
error = QString("success");
m_db.close();
return true;
}
}
} }
} }
// 回滚 qDebug() << error;
error = m_lastError;
m_db.rollback();
m_db.close();
return false; return false;
} }
...@@ -358,3 +338,55 @@ QString FmPlugin::_Penny2Dollar(int penny) ...@@ -358,3 +338,55 @@ QString FmPlugin::_Penny2Dollar(int penny)
double dollar = (double)penny/100; double dollar = (double)penny/100;
return QString::number(dollar,'f',2); return QString::number(dollar,'f',2);
} }
QString FmPlugin::_GetOrderStr( const OrderObject *orderObject)
{
QJsonObject rObj;
float YsTotal = _Penny2Dollar(orderObject->total_fee-orderObject->send_fee-orderObject->service_fee-orderObject->dis_shop_fee).toFloat();
rObj.insert("BillNo", orderObject->order_id);
rObj.insert("XsDate", QDateTime::fromTime_t(orderObject->create_time).toString("yyyy-MM-dd hh:mm:ss"));
rObj.insert("OprtID", 1);
rObj.insert("OprtCode", "001");
rObj.insert("YsTotal", YsTotal);
float sca = (orderObject->total_fee-orderObject->send_fee-orderObject->service_fee-orderObject->dis_shop_fee)/orderObject->total_fee;
float SsTotal =0;
QJsonArray products;
for(int i=0; i < orderObject->proList.count(); i++)
{
QJsonObject tObj;
tObj.insert("LnNo", i+1);
tObj.insert("PluCode", orderObject->proList.at(i)->pid);
tObj.insert("PluName", orderObject->proList.at(i)->name);
tObj.insert("Price", _Penny2Dollar(orderObject->proList.at(i)->price).toFloat());
tObj.insert("XsCount", orderObject->proList.at(i)->productAmount);
if((i+1) == orderObject->proList.count())
{
tObj.insert("YsTotal", YsTotal-SsTotal);
}else
{
float Ys = _Penny2Dollar(orderObject->proList.at(i)->price*orderObject->proList.at(i)->productAmount).toFloat()*sca;
tObj.insert("YsTotal", Ys);
SsTotal += Ys;
}
products.insert(i, tObj);
}
rObj.insert("PluDetails", products);
QJsonArray payDetails;
QJsonObject tObj;
tObj.insert("SerialNo", 1);
tObj.insert("ZfCode", "001");
tObj.insert("ZfName", "非码外卖");
tObj.insert("ZfTotal", YsTotal);
tObj.insert("TradeNo", "");
payDetails.insert(0, tObj);
rObj.insert("PayDetails", payDetails);
qDebug() << rObj;
QJsonDocument doc(rObj);
return QString(doc.toJson(QJsonDocument::Compact));
}
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "Model/stockObject.h" #include "Model/stockObject.h"
#include <QtSql/QSqlDatabase> #include <QtSql/QSqlDatabase>
#include <QDateTime> #include <QDateTime>
#include <QLibrary>
class PluginWorker; class PluginWorker;
...@@ -36,8 +37,7 @@ public: ...@@ -36,8 +37,7 @@ public:
* 参数:[1]订单对象[2]错误信息 * 参数:[1]订单对象[2]错误信息
* 返回:是否成功 * 返回:是否成功
* */ * */
bool DoOrderEntry(OrderObject const *orderObject, const QString& cashierId, const QString& cashierName, bool DoOrderEntry(OrderObject const *orderObject, QString& error);
const QString& shiftId, const QString& shiftName, QString& error);
/* 功能:获取库存信息 /* 功能:获取库存信息
* 参数:[1]_out库存信息 * 参数:[1]_out库存信息
* 返回:是否成功 * 返回:是否成功
...@@ -45,7 +45,7 @@ public: ...@@ -45,7 +45,7 @@ public:
bool GetStockInfo(QList<StockObject>& stockList, QString& error); bool GetStockInfo(QList<StockObject>& stockList, QString& error);
private: private:
FmPlugin(){} FmPlugin():f_UFMSaveSales(NULL){}
FmPlugin(FmPlugin const&); FmPlugin(FmPlugin const&);
FmPlugin& operator=(FmPlugin const&); FmPlugin& operator=(FmPlugin const&);
...@@ -89,6 +89,13 @@ private: ...@@ -89,6 +89,13 @@ private:
* 返回:元 * 返回:元
* */ * */
QString _Penny2Dollar(int penny); QString _Penny2Dollar(int penny);
QString _GetOrderStr(const OrderObject *);
QLibrary m_lib;
typedef int (*UFMSaveSales)(char* , char*);
UFMSaveSales f_UFMSaveSales;
}; };
#endif // FMPLUGIN_H #endif // FMPLUGIN_H
...@@ -13,6 +13,8 @@ TEMPLATE = lib ...@@ -13,6 +13,8 @@ TEMPLATE = lib
DEFINES += FMPLUGIN_LIBRARY DEFINES += FMPLUGIN_LIBRARY
DESTDIR = ../HaiDing
INCLUDEPATH += ../fmTakeaway INCLUDEPATH += ../fmTakeaway
SOURCES += \ SOURCES += \
......
...@@ -26,3 +26,6 @@ unix { ...@@ -26,3 +26,6 @@ unix {
} }
LIBS += -lWinspool LIBS += -lWinspool
DESTDIR = ../HaiDing
...@@ -51,6 +51,12 @@ bool FlowControl::_Login() ...@@ -51,6 +51,12 @@ bool FlowControl::_Login()
QJsonObject sendJson; QJsonObject sendJson;
QJsonObject recvJson; QJsonObject recvJson;
if(!_GetStoreInfo())
{
QLOG_INFO() << QString("%1 msec after login...").arg(VALUE_RELOGINTIME);
QTimer::singleShot(VALUE_RELOGINTIME, this, &FlowControl::_Login);
return false;
}
sendJson = DataManger::GetInstance().GetLoginData(m_storeId, SERVER_PASSWORD, m_posId, m_cashierId); sendJson = DataManger::GetInstance().GetLoginData(m_storeId, SERVER_PASSWORD, m_posId, m_cashierId);
emit showAlert(AlertForm::LOADING, "正在登录......"); emit showAlert(AlertForm::LOADING, "正在登录......");
...@@ -160,6 +166,25 @@ bool FlowControl::_PullOrder() ...@@ -160,6 +166,25 @@ bool FlowControl::_PullOrder()
} }
} }
if( orderObject->status != 1 &&
orderObject->status != 3 &&
orderObject->status != -1 &&
orderObject->status != 20 &&
orderObject->status != 30 &&
orderObject->status != 40 &&
orderObject->status != 100)
{
QLOG_INFO() << QString("[---order entry begin---]");
// 写入销售单
if(!FmPlugin::GetInstance().DoOrderEntry(orderObject, error))
{
QLOG_ERROR() << QString("order entry failed,[%1]").arg(error);
}else
{
QLOG_INFO() << QString("order entry success.");
}
}
m_timestamp = orderObject->timestamp; m_timestamp = orderObject->timestamp;
} }
syncTime = recvJson[JSON_SYNCTIME].toInt()*1000; syncTime = recvJson[JSON_SYNCTIME].toInt()*1000;
...@@ -243,35 +268,11 @@ bool FlowControl::_ConfirmOrder(const QString &orderId, const DeliverObject &del ...@@ -243,35 +268,11 @@ bool FlowControl::_ConfirmOrder(const QString &orderId, const DeliverObject &del
{ {
OrderObject *orderObject = m_ordersMap.value(orderId); OrderObject *orderObject = m_ordersMap.value(orderId);
emit showAlert(AlertForm::LOADING, "正在录入天天饮食......");
QLOG_INFO() << QString("[---order entry begin---]");
// 写入销售单
// TODO(用于鲜丰演示)
//QString orderEntryError("[此单录入天天饮食成功]");
QString orderEntryError("");
if(!FmPlugin::GetInstance().DoOrderEntry(orderObject, m_cashierObject.id, m_cashierObject.name,
m_cashierObject.shiftId, m_cashierObject.shiftName, error))
{
QString dirPath = QString("%1/orders").arg(QApplication::applicationDirPath());
QDir dir;
dir.mkdir(dirPath);
QFile file(QString("%1/%2").arg(dirPath, orderObject->order_id));
if(!file.exists())
{
file.open(QFile::WriteOnly);
file.close();
}
orderEntryError = QString("<font color=\"#FF0000\">[此单录入天天饮食失败,请务必及时在订单详情页补录]</font>");
QLOG_ERROR() << QString("order entry failed,[%1]").arg(error);
}else
{
QLOG_INFO() << QString("order entry success.");
}
QString remark(orderObject->remark), deliveryTime; QString remark(orderObject->remark), deliveryTime;
remark = remark.isEmpty()? "" : QString("[备注: %1]").arg(remark); remark = remark.isEmpty()? "" : QString("[备注: %1]").arg(remark);
deliveryTime = QString("[期望送达时间: %1]").arg(orderObject->delivery_time==0? "立即送出" : QDateTime::fromTime_t(orderObject->delivery_time).toString("yyyy-MM-dd hh:mm:ss")); deliveryTime = QString("[期望送达时间: %1]").arg(orderObject->delivery_time==0? "立即送出" : QDateTime::fromTime_t(orderObject->delivery_time).toString("yyyy-MM-dd hh:mm:ss"));
emit showAlert(AlertForm::SUCCESS, QString("接单成功!%1<br/>%2<br/>%3").arg(remark).arg(deliveryTime).arg(orderEntryError)); emit showAlert(AlertForm::SUCCESS, QString("接单成功!%1<br/>%2").arg(remark).arg(deliveryTime));
// 通知主界面移动订单 // 通知主界面移动订单
int oldStatus = orderObject->status; int oldStatus = orderObject->status;
...@@ -550,10 +551,9 @@ void FlowControl::onFlowStart() ...@@ -550,10 +551,9 @@ void FlowControl::onFlowStart()
m_procOrderSocket = new BillSocket(this); m_procOrderSocket = new BillSocket(this);
m_syncStockSocket = new BillSocket(this); m_syncStockSocket = new BillSocket(this);
if(_GetStoreInfo())
{ _Login();
_Login();
}
return; return;
} }
...@@ -633,32 +633,31 @@ void FlowControl::onUpdateCashier(const CashierObject &cashier) ...@@ -633,32 +633,31 @@ void FlowControl::onUpdateCashier(const CashierObject &cashier)
void FlowControl::onGetOrderDetails(const QString &orderId) void FlowControl::onGetOrderDetails(const QString &orderId)
{ {
if(_CheckCashiers()) // if(_CheckCashiers())
{ // {
emit hideAlert(); emit hideAlert();
emit showOrderDetails(m_ordersMap.value(orderId)); emit showOrderDetails(m_ordersMap.value(orderId));
} // }
} }
void FlowControl::onReEntryOrder(const QString &orderId) void FlowControl::onReEntryOrder(const QString &orderId)
{ {
emit showAlert(AlertForm::LOADING, "正在补录到天天饮食......"); emit showAlert(AlertForm::LOADING, "正在补录......");
QLOG_INFO() << QString("[---order reEntry begin---]"); QLOG_INFO() << QString("[---order reEntry begin---]");
// 写入销售单 // 写入销售单
OrderObject *orderObject = m_ordersMap.value(orderId); OrderObject *orderObject = m_ordersMap.value(orderId);
QString error; QString error;
if(!FmPlugin::GetInstance().DoOrderEntry(orderObject, m_cashierObject.id, m_cashierObject.name, if(!FmPlugin::GetInstance().DoOrderEntry(orderObject, error))
m_cashierObject.shiftId, m_cashierObject.shiftName, error))
{ {
QLOG_ERROR() << QString("order reEntry failed,[%1]").arg(error); QLOG_ERROR() << QString("order reEntry failed,[%1]").arg(error);
emit showAlert(AlertForm::ERROR, "<font color=\"#FF0000\">补录天天饮食失败,请联系管理员或者进群咨询(205821431)</font>"); emit showAlert(AlertForm::ERROR, "<font color=\"#FF0000\">补录失败</font>");
}else }else
{ {
QFile file(QString("%1/orders/%2").arg(QApplication::applicationDirPath(), orderObject->order_id)); QFile file(QString("%1/orders/%2").arg(QApplication::applicationDirPath(), orderObject->order_id));
file.remove(); file.remove();
QLOG_INFO() << QString("order reEentry success."); QLOG_INFO() << QString("order reEentry success.");
emit showAlert(AlertForm::SUCCESS, "补录天天饮食成功"); emit showAlert(AlertForm::SUCCESS, "补录成功");
} }
} }
......
...@@ -19,6 +19,26 @@ void OrderObject::FromJson(const QJsonObject &json) ...@@ -19,6 +19,26 @@ void OrderObject::FromJson(const QJsonObject &json)
return; return;
} }
int OrderObject::getdis_shop_fee() const
{
return dis_shop_fee;
}
void OrderObject::setdis_shop_fee(const int &v)
{
dis_shop_fee = v;
}
int OrderObject::getservice_fee() const
{
return service_fee;
}
void OrderObject::setservice_fee(const int &v)
{
service_fee = v;
}
int OrderObject::getstatus() const int OrderObject::getstatus() const
{ {
return status; return status;
......
...@@ -52,6 +52,8 @@ public: ...@@ -52,6 +52,8 @@ public:
Q_PROPERTY (int delivery_status READ getdelivery_status WRITE setdelivery_status) Q_PROPERTY (int delivery_status READ getdelivery_status WRITE setdelivery_status)
Q_PROPERTY (QString fm_id READ getfm_id WRITE setfm_id) Q_PROPERTY (QString fm_id READ getfm_id WRITE setfm_id)
Q_PROPERTY (QStringList records READ getrecords WRITE setrecords) Q_PROPERTY (QStringList records READ getrecords WRITE setrecords)
Q_PROPERTY (int dis_shop_fee READ getdis_shop_fee WRITE setdis_shop_fee)
Q_PROPERTY (int service_fee READ getservice_fee WRITE setservice_fee)
QString address; //地址 QString address; //地址
QString channel; //渠道 QString channel; //渠道
...@@ -90,7 +92,15 @@ public: ...@@ -90,7 +92,15 @@ public:
int user_fee; //应付金额 int user_fee; //应付金额
QStringList records; //订单操作记录 QStringList records; //订单操作记录
int dis_shop_fee; //商户承担的优惠金额
int service_fee; //外卖平台服务费
protected: protected:
int getdis_shop_fee() const;
void setdis_shop_fee(const int& v);
int getservice_fee() const;
void setservice_fee(const int& v);
int getstatus() const ; int getstatus() const ;
void setstatus(const int& v); void setstatus(const int& v);
QString getChannel() const ; QString getChannel() const ;
......
...@@ -73,14 +73,14 @@ void DbsetForm::on_dbsetBtnOk_clicked() ...@@ -73,14 +73,14 @@ void DbsetForm::on_dbsetBtnOk_clicked()
{ {
ui->dbsetLabError->hide(); ui->dbsetLabError->hide();
if(ui->dbsetEdt0->text().isEmpty() || // if(ui->dbsetEdt0->text().isEmpty() ||
ui->dbsetEdt1->text().isEmpty() || // ui->dbsetEdt1->text().isEmpty() ||
ui->dbsetEdt3->text().isEmpty()) // ui->dbsetEdt3->text().isEmpty())
{ // {
ui->dbsetLabError->setText(tr("请输入正确信息!")); // ui->dbsetLabError->setText(tr("请输入正确信息!"));
ui->dbsetLabError->show(); // ui->dbsetLabError->show();
return; // return;
} // }
ui->dbsetPgb0->show(); ui->dbsetPgb0->show();
_SetSubElementEnable(false); _SetSubElementEnable(false);
......
...@@ -80,9 +80,12 @@ FORMS += mainForm.ui \ ...@@ -80,9 +80,12 @@ FORMS += mainForm.ui \
RC_FILE += fmTakeaway.rc RC_FILE += fmTakeaway.rc
CONFIG(release, debug|release) { CONFIG(release, debug|release) {
LIBS += -L../fmPlugin/release -lfmPlugin LIBS += -L../HaiDing -lfmPlugin
LIBS += -L../fmPrinter/release -lfmPrinter LIBS += -L../HaiDing -lfmPrinter
} else { } else {
LIBS += -L../fmPlugin/debug -lfmPlugin LIBS += -L../fmPlugin/debug -lfmPlugin
LIBS += -L../fmPrinter/debug -lfmPrinter LIBS += -L../fmPrinter/debug -lfmPrinter
} }
DESTDIR = ../HaiDing
...@@ -77,19 +77,6 @@ int main(int argc, char *argv[]) ...@@ -77,19 +77,6 @@ int main(int argc, char *argv[])
FlowControl::GetInstance().moveToThread(&workThread); FlowControl::GetInstance().moveToThread(&workThread);
workThread.start(); workThread.start();
// 将退款控制器移到工作线程
// TODO(用于鲜丰演示)
// RefundControl::GetInstance().SetListenPort(ConfigManger::GetInstance().GetListenPort());
// RefundControl::GetInstance().moveToThread(&refundThread);
// QObject::connect(&refundThread, &QThread::started, &RefundControl::GetInstance(), &RefundControl::run);
// refundThread.start();
DbsetForm d;
if(QDialog::Rejected == d.exec())
{
QLOG_INFO() << QString("-------- fmTakeaway exit --------");
return -1;
}
FloatForm f; FloatForm f;
MainForm w; MainForm w;
QObject::connect(&w, &MainForm::showFloatForm, &f, &FloatForm::onShow); QObject::connect(&w, &MainForm::showFloatForm, &f, &FloatForm::onShow);
......
...@@ -102,7 +102,7 @@ void MainForm::_Init() ...@@ -102,7 +102,7 @@ void MainForm::_Init()
// 初始化文字 // 初始化文字
ui->mainLabStoreid->setText(UI_STOREID); ui->mainLabStoreid->setText(UI_STOREID);
ui->mainLabVersion->setText(APP_VERSION); ui->mainLabVersion->setText("1.170301.01");
ui->mainLabCashier->setText(UI_CASHIER); ui->mainLabCashier->setText(UI_CASHIER);
// 初始化表 // 初始化表
...@@ -145,6 +145,9 @@ void MainForm::_Init() ...@@ -145,6 +145,9 @@ void MainForm::_Init()
// TODO(用于鲜丰演示) // TODO(用于鲜丰演示)
ui->mainSlabLogo0->hide(); ui->mainSlabLogo0->hide();
ui->mainSlabLogo1->hide(); ui->mainSlabLogo1->hide();
ui->mainBtnCashier->hide();
ui->mainLabCashier->setText("001");
} }
void MainForm::onSetCurrentTime() void MainForm::onSetCurrentTime()
......
run/skin/float_normal.png

10.6 KB | W: | H:

run/skin/float_normal.png

8.17 KB | W: | H:

run/skin/float_normal.png
run/skin/float_normal.png
run/skin/float_normal.png
run/skin/float_normal.png
  • 2-up
  • Swipe
  • Onion skin
run/skin/float_remind.png

11.6 KB | W: | H:

run/skin/float_remind.png

9.32 KB | W: | H:

run/skin/float_remind.png
run/skin/float_remind.png
run/skin/float_remind.png
run/skin/float_remind.png
  • 2-up
  • Swipe
  • Onion skin
File added
rcc -binary deaufult.qrc -o ..\..\..\build\takeaway-Debug\fmTakeaway\debug\skin\deaufult.rcc rcc -binary deaufult.qrc -o deaufult.rcc
pause pause
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment