操作QSqllite数据库

#ifndef BLL_DBOPE_H
#define BLL_DBOPE_H

#include <QObject>
#include <QSqlDatabase>

class BLL_DBOpe : public QObject
{
    Q_OBJECT
public:
    enum DBOpeType {
        QueryRecipeList = 0,    // 查询菜谱列表
        QueryRecipeStep = 1,    // 查询菜谱预览步骤
        QueryRecipeActStep = 2,  // 查询菜谱操作步骤
        IsExistQueryRecipe = 3,  // 查询菜谱是否存在
        GetRecipeTotalData = 4,  // 获取菜谱全部数据
        ModifyRecipeActStep = 5  // 修改菜谱操作步骤
    };

    enum ReplyErrorType {
        NoError = 0,          // 无错误
        ParseError = 1,       // 数据解析错误
        ReplyError = 2        // 回复错误
    };

    explicit BLL_DBOpe(QObject *parent = nullptr);
    virtual ~BLL_DBOpe();

    // 关闭菜谱数据库
    void closeDb()
    {
        if (m_db.isOpen()) {
            m_db.close();
        }
    }

    // 打开菜谱数据库
    bool openDb();

    // 数据库操作
    QVariantMap operateDB(QVariantMap vMap);

    // 判断菜谱是否被收藏
    int judgeIsRecipeCollected(QString recipeCode);

    // 数据库通用操作
    bool commonOpeDB(QString str);

    // 写入本地数据库
    bool writeRecipeData(QVariantMap vMap);

    // 获取数据库的菜谱数据
    QVariantMap getRecipeTotalData(QVariantMap vMap);

    // 删除每日菜谱资源
    bool deleteEveryDayRecipe();

    // 更新每日菜谱标志
    bool updateEveryDayFlag(QVariantMap vMap);

signals:

private:
    // 连接数据库
    void connectDB();

    // 查询菜谱列表
    QVariantMap queryRecipeList(QString str, bool is_local);

    // 查询菜谱预览步骤
    QVariantMap queryRecipeStep(QString str, bool is_local);

    // 获取菜谱预览步骤
    QVariantMap getRecipeStep(QJsonObject obj);

    // 查询菜谱操作步骤
    QVariantMap queryRecipeActStep(QString str, bool is_local);

    // 获取菜谱烹饪步骤
    QVariantMap getRecipeActStep(QJsonObject obj);

    // 查询菜谱是否存在
    QVariantMap isExistRecipe(QString str, bool is_local);

    // 修改菜谱操作步骤
    QVariantMap modifyRecipeActStep(QVariantMap vMap);

private:
    QSqlDatabase m_db;
    QSqlDatabase m_localDb;
};

#endif // BLL_DBOPE_H
#include "bll_dbope.h"
#include <QSqlQuery>
#include <QJsonObject>
#include <QJsonDocument>
#include <QSqlError>
#include <QJsonArray>
#include <QGuiApplication>
#include <QDateTime>
#include <QUrl>
#include <QDebug>
#include <QDir>

BLL_DBOpe::BLL_DBOpe(QObject *parent) : QObject(parent)
{
    connectDB();
}

void BLL_DBOpe::connectDB()
{
    m_db = QSqlDatabase::addDatabase("QSQLITE", "cheifMachine");
    m_db.setDatabaseName(QGuiApplication::applicationDirPath()+"/recipe/cheifMachine.db");
    if (!m_db.open()) {
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< m_db.lastError().type()<< m_db.lastError().text();
    }

    m_localDb = QSqlDatabase::addDatabase("QSQLITE", "local");
    m_localDb.setDatabaseName(QGuiApplication::applicationDirPath()+"/recipe/local.db");
    if (!m_localDb.open()) {
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< m_localDb.lastError().type()<< m_localDb.lastError().text();
    }
}

BLL_DBOpe::~BLL_DBOpe()
{
    m_db.close();
    m_localDb.close();
}

bool BLL_DBOpe::openDb()
{
    if (!m_db.open()) {
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< m_db.lastError().type()<< m_db.lastError().text();
        return false;
    }

    return true;
}

QVariantMap BLL_DBOpe::operateDB(QVariantMap vMap)
{
    QVariantMap info;
    int type = vMap.value("type").toInt();
    bool is_local = vMap.value("is_local").toBool();
    QString queryStr = vMap.value("query").toString();
    if (type == DBOpeType::QueryRecipeList) {
        info = queryRecipeList(queryStr, is_local);
    } else if (type == DBOpeType::QueryRecipeStep) {
        info = queryRecipeStep(queryStr, is_local);
    } else if (type == DBOpeType::QueryRecipeActStep) {
        info = queryRecipeActStep(queryStr, is_local);
    } else if (type == DBOpeType::IsExistQueryRecipe) {
        info = isExistRecipe(queryStr, is_local);
    } else if (type == DBOpeType::ModifyRecipeActStep) {
        info = modifyRecipeActStep(vMap);
    }

    return info;
}

bool BLL_DBOpe::commonOpeDB(QString str)
{
    QSqlQuery query = m_localDb.exec(str);
    int ret = query.lastError().type();
    if (ret != 0) {
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< str << query.lastError().type()<< query.lastError().text();
        return false;
    }

    return true;
}

int BLL_DBOpe::judgeIsRecipeCollected(QString recipeCode)
{
    QString str = QString("select isCollected from recipe where recipeCode = '%1'")
                            .arg(recipeCode);
    QSqlQuery query = m_localDb.exec(str);
    int ret = query.lastError().type();
    if (ret != 0) {
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< str << query.lastError().type()<< query.lastError().text();
    }

    int isCollected = 0;
    while (query.next()) {
        isCollected = query.value(0).toInt();
    }

    return isCollected;
}

QVariantMap BLL_DBOpe::queryRecipeList(QString str, bool is_local)
{
    QVariantMap vRecipeContent;
    QVariantList vMapList;

    QSqlQuery query;
    int ret = 0;
    if (is_local) {
        query = m_localDb.exec(str);
    } else {
        query = m_db.exec(str);
    }

    ret = query.lastError().type();
    if (ret != 0) {
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< str << query.lastError().type()<< query.lastError().text();
    }

    while (query.next()) {
        QVariantMap vMap;
        QString recipeData = query.value(0).toString();
        QJsonParseError error;
        QJsonDocument doc = QJsonDocument::fromJson(recipeData.toUtf8(), &error);
        if (doc.isObject()) {
            QString imgUrl = doc.object().value("imageVertical").toString();
            QUrl url(imgUrl);
            if (url.isLocalFile()) {
                imgUrl = "file://"+QGuiApplication::applicationDirPath()+url.path();
            }

            QString recipeName = doc.object().value("recipeName").toString();
            QString recipeCode = doc.object().value("recipeId").toString();
            vMap.insert("recipeImg", imgUrl);
            vMap.insert("recipeCnName", recipeName);
            vMap.insert("recipeCode", recipeCode);
        } else {
            qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<<error.errorString();
        }

        vMapList.append(vMap);
    }

    vRecipeContent.insert("recipeContent", vMapList);
    return vRecipeContent;
}

QVariantMap BLL_DBOpe::queryRecipeStep(QString str, bool is_local)
{
    QVariantMap vMap;
    QSqlQuery query;
    int ret = 0;
    if (is_local) {
        query = m_localDb.exec(str);
    } else {
        query = m_db.exec(str);
    }

    ret = query.lastError().type();
    if (ret != 0) {
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< str << query.lastError().type()<< query.lastError().text();
    }

    if (query.next()) {
        QJsonParseError error;
        QJsonDocument doc = QJsonDocument::fromJson(query.value(0).toString().toUtf8(), &error);

        if (doc.isObject()) {
            vMap = getRecipeStep(doc.object());
        } else {
            qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<<error.errorString();
        }
    } else {
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< str << query.lastError().type()<< query.lastError().text();
    }

    return vMap;
}

QVariantMap BLL_DBOpe::queryRecipeActStep(QString str, bool is_local)
{
    QVariantMap vMap;
    QSqlQuery query;
    int ret = 0;
    if (is_local) {
        query = m_localDb.exec(str);
    } else {
        query = m_db.exec(str);
    }

    ret = query.lastError().type();
    if (ret != 0) {
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< str << query.lastError().type()<< query.lastError().text();
    }

    if (query.next()) {
        QJsonParseError error;
        QJsonDocument doc = QJsonDocument::fromJson(query.value(0).toString().toUtf8(), &error);
        if (doc.isObject()) {
            vMap = getRecipeActStep(doc.object());
        } else {
            qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<<error.errorString();
        }
    } else {
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< str << query.lastError().type()<< query.lastError().text();
    }

    return vMap;
}

QVariantMap BLL_DBOpe::isExistRecipe(QString str, bool is_local)
{
    QVariantMap vMap;
    QSqlQuery query;
    int ret = 0;
    if (is_local) {
        query = m_localDb.exec(str);
    } else {
        query = m_db.exec(str);
    }

    ret = query.lastError().type();
    if (ret != 0) {
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< str << query.lastError().type()<< query.lastError().text();
    }

    if (query.next()) {
        int rows = query.value(0).toInt();
        if (rows > 0) {
            vMap.insert("isExist", true);
        } else {
            vMap.insert("isExist", false);
        }
    } else {
        vMap.insert("isExist", false);
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< str << query.lastError().type()<< query.lastError().text();
    }

    return vMap;
}

QVariantMap BLL_DBOpe::getRecipeActStep(QJsonObject obj)
{
    QVariantMap vCookStepMap;
    QVariantList vMapList;

    QString dirPath = QGuiApplication::applicationDirPath();
    dirPath.append("/recipe/Image/finishImg/");

    QJsonObject sizeForm = obj.value("sizeForm").toArray().at(0).toObject();
    // 实际做菜步骤
    QJsonArray cookStepList = sizeForm.value("curve").toArray();
    foreach (QJsonValue recipeObj, cookStepList) {
        QVariantMap vMap;
        if (recipeObj.isObject()) {
            // 动画
            QJsonArray uiValue = recipeObj.toObject().value("uiValue").toArray();
            vMap.insert("gifType", uiValue.at(1).toInt());
            int dispType = uiValue.at(0).toInt();
            // 界面id
            vMap.insert("dispType", dispType);
            if (dispType == 140) { // 烹饪页面
                int func = recipeObj.toObject().value("tool").toInt();
                int press = recipeObj.toObject().value("press").toInt();
                int temp = recipeObj.toObject().value("temperature").toInt();
                int fire = recipeObj.toObject().value("fire").toInt();
                switch (func) {
                case 1: // 翻炒
                    // 温度/压力/火力
                    vMap.insert("temp", fire);
                    break;
                case 2: // 压力煮
                    vMap.insert("temp", press);
                    break;
                case 3: // 慢炖
                    vMap.insert("temp", fire);
                    break;
                case 4: // 低温烹饪
                    vMap.insert("temp", temp);
                    break;
                case 5: // 烘烤
                    vMap.insert("temp", temp);
                    break;
                case 6: // 无水焗
                    vMap.insert("temp", press);
                    break;
                case 7: // 保温
                    vMap.insert("temp", temp);
                    break;
                case 8: // 煮饭
                    break;
                case 9: // 煮粥
                    vMap.insert("temp", press);
                    break;
                case 10: // 无压煮
                    vMap.insert("temp", fire);
                    break;
                case 11: // 收汁
                    vMap.insert("temp", fire);
                    break;
                case 12: // 焯水
                    vMap.insert("temp", fire);
                    break;
                case 13: // 蒸制
                    vMap.insert("temp", fire);
                    break;
                case 14: // 揉面
                    break;
                case 15: // 发酵
                    vMap.insert("temp", temp);
                    break;
                default:
                    break;
                }

                QString actStep = recipeObj.toObject().value("content").toArray().at(0).toObject().value("text").toString();
                // 提示语
                vMap.insert("actStep", actStep);
                // 功能
                vMap.insert("func", recipeObj.toObject().value("tool").toInt());
                // 盖子类型
                vMap.insert("lid", recipeObj.toObject().value("cup").toInt());
                // 时间
                vMap.insert("timeRange", recipeObj.toObject().value("time").toInt());
                // 速度
                vMap.insert("speed", recipeObj.toObject().value("speed").toInt());
                // 排气
                vMap.insert("exhaust", recipeObj.toObject().value("air").toInt());
            } else if (dispType == 143) { // 结束页面
                QString actStep = recipeObj.toObject().value("content").toArray().at(0).toObject().value("text").toString();
                // 提示语
                vMap.insert("actStep", actStep);
                QString finishImg = sizeForm.value("recipeId").toString()+".jpg";
                QString imgUrl = "file://" + dirPath + finishImg;
                // 结束图片
                vMap.insert("finishImg", imgUrl);
            } else if (dispType == 137 || dispType == 139) { // 137:计时纯文本 139:称重纯文本
                // 计时时间
                int countTime = recipeObj.toObject().value("countTime").toInt();
                vMap.insert("countTime", countTime*60);
                // 文本
                QStringList actStepList;
                QJsonArray actStep = recipeObj.toObject().value("content").toArray();
                foreach (QJsonValue str, actStep) {
                    actStepList.append(str.toObject().value("text").toString());
                }

                vMap.insert("actStepList", actStepList);
            } else {
                // 提示语
                QStringList actStepList;
                QJsonArray actStep = recipeObj.toObject().value("content").toArray();
                foreach (QJsonValue str, actStep) {
                    actStepList.append(str.toObject().value("text").toString());
                }

                vMap.insert("actStepList", actStepList);
            }
        } else {
            qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<<"getRecipeActStep data is not Json!";
        }

        vMapList.append(vMap);
    }

    vCookStepMap.insert("CookStep", vMapList);
    return vCookStepMap;
}

QVariantMap BLL_DBOpe::getRecipeStep(QJsonObject obj)
{
    QString dirPath = QGuiApplication::applicationDirPath();
    dirPath.append("/recipe/Image/recipeStepImage/");
    QVariantMap vDetailMap;
    QVariantList vMapList;

    QJsonObject sizeForm = obj.value("sizeForm").toArray().at(0).toObject();
    // 步骤
    QJsonArray recipeDetailList = sizeForm.value("step").toArray();
    foreach (QJsonValue recipeObj, recipeDetailList) {
        QVariantMap vMap;
        if (recipeObj.isObject()) {
            int type = recipeObj.toObject().value("type").toInt();
            if (type == 1) { // 预览步骤
                vMap.insert("actConnent", recipeObj.toObject().value("content").toString());
                vMapList.append(vMap);
            }
        } else {
            qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<<"getRecipeDetail step is not Json!";
        }
    }

    vDetailMap.insert("RecipeAction", vMapList);

    //食材
    vMapList.clear();
    recipeDetailList = sizeForm.value("foodList").toArray();
    foreach (QJsonValue recipeObj, recipeDetailList) {
        QVariantMap vMap;
        if (recipeObj.isObject()) {
            int foodType = recipeObj.toObject().value("foodType").toInt();
            if (foodType == 1) { // 主料
                vMap.insert("isMain", true);
            } else { //辅料
                vMap.insert("isMain", false);
            }

            // 食材名称
            vMap.insert("ingredientName", recipeObj.toObject().value("foodName").toString());
            // 食材数量1
            vMap.insert("ingredientQuantity", recipeObj.toObject().value("weight").toString());
            // 单位1
            vMap.insert("quantityUnit1", recipeObj.toObject().value("unitName").toString());
            // 食材数量2
            QString ingredientQuantity2 = recipeObj.toObject().value("secondWeight").toString();
            // 单位2
            QString quantityUnit2 = recipeObj.toObject().value("secondUnitName").toString();
            // 食材数量2+单位2
            vMap.insert("quantityUnit2", ingredientQuantity2+quantityUnit2);
            // 食材用处
            vMap.insert("ingredientAcy", recipeObj.toObject().value("deal").toString());

            vMapList.append(vMap);
        } else {
            qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<<"getRecipeDetail ingredient is not Json!";
        }
    }

    vDetailMap.insert("RecipeIngredients", vMapList);

    // 提示
    vMapList.clear();
    recipeDetailList = sizeForm.value("step").toArray();
    foreach (QJsonValue recipeObj, recipeDetailList) {
        QVariantMap vMap;
        if (recipeObj.isObject()) {
            int type = recipeObj.toObject().value("type").toInt();
            // 提示内容
            if (type == 2) {
                vMap.insert("tipContent", recipeObj.toObject().value("content").toString());
                vMapList.append(vMap);
            }

        } else {
            qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<<"getRecipeDetail tip is not Json!";
        }
    }

    vDetailMap.insert("RecipeTips", vMapList);

    // 配件
    vMapList.clear();
    if (sizeForm.contains("cookTool")) {
        recipeDetailList = sizeForm.value("cookTool").toArray();
        foreach (QJsonValue recipeObj, recipeDetailList) {
            QVariantMap vMap;
            if (recipeObj.isObject()) {
                // 配件名称
                vMap.insert("toolName", recipeObj.toObject().value("name").toString());
            } else {
                qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<<"getRecipeDetail tool is not Json!";
            }

            vMapList.append(vMap);
        }

        vDetailMap.insert("RecipeTools", vMapList);
    }

    // 营养价值
    vMapList.clear();
    QVariantMap map;
    // 时间范围
    map.insert("timeRange", sizeForm.value("recipeTime").toString());
    // 时间单位
    map.insert("timeUnitName", sizeForm.value("timeUnitName").toString());
    // 菜谱简介
    map.insert("recipeContent", sizeForm.value("recipeContent").toString());
    // 份量
    map.insert("sizeName", sizeForm.value("sizeName").toString());
    // 口味
    QJsonArray tasteArr = obj.value("taste").toArray();
    if (tasteArr.size() > 1) {
        map.insert("taste", "多种");
    } else {
        map.insert("taste", tasteArr.at(0).toObject().value("name").toString());
    }

    // 难度
    map.insert("degree", obj.value("difficulty").toString());
    // 图片
    QString imgName = obj.value("recipeId").toString()+".jpg";
    QString imgUrl = "file://" + dirPath + imgName;
    map.insert("recipeStepImage", imgUrl);
    // 菜谱名称
    map.insert("recipeCnName", obj.value("recipeName").toString());
    vMapList.append(map);
    vDetailMap.insert("RecipeNutri", vMapList);

    return vDetailMap;
}

bool BLL_DBOpe::updateEveryDayFlag(QVariantMap vMap)
{
    QString recipeCode = vMap.value("recipeId").toString();
    QSqlQuery query(m_localDb);
    QString updateEveryDay = QString("update recipe set isEveryDay = 1, modifyTime = '%1' where recipeCode = '%2'").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(recipeCode);
    bool result = query.exec(updateEveryDay);
    if (!result) {
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<<query.lastQuery()<<query.lastError().type()<< query.lastError().text();
        return false;
    }

    return true;
}

bool BLL_DBOpe::writeRecipeData(QVariantMap vMap)
{
    QString recipeCode = vMap.value("recipeId").toString();
    QString recipeName = vMap.value("recipeName").toString();
    QJsonObject jsObj = vMap.value("recipeData").toJsonObject(); 
    QJsonDocument doc(jsObj);
    QString recipeData = QString(doc.toJson());

    QSqlQuery query(m_localDb);
    query.prepare("insert into recipe (recipeCode, recipeName, recipeData) values (:recipeCode, :recipeName, :recipeData)");
    query.bindValue(":recipeCode", recipeCode);
    query.bindValue(":recipeName", recipeName);
    query.bindValue(":recipeData", recipeData);
    query.exec();
    int ret = query.lastError().type();
    if (ret != 0) {
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<<query.lastQuery()<<query.lastError().type()<< query.lastError().text();
        return false;
    }

    return true;
}

QVariantMap BLL_DBOpe::getRecipeTotalData(QVariantMap Map)
{
    QString recipeId = Map.value("recipeId").toString();
    bool is_local = Map.value("is_local").toBool();
    QString str = QString("select * from recipe where recipeCode = '%1'").arg(recipeId);
    QSqlQuery query;
    int errorType = ReplyErrorType::NoError;
    int ret = 0;
    if (is_local) {
        query = m_localDb.exec(str);
    } else {
        query = m_db.exec(str);
    }

    ret = query.lastError().type();
    if (ret != 0) {
        errorType = ReplyErrorType::ReplyError;
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< str << query.lastError().type()<< query.lastError().text();
    }

    QVariantMap recipeMap;
    if (query.next()) {
        QString recipeCode = query.value(0).toString();
        QString recipeName = query.value(1).toString();
        QString recipeData = query.value(2).toString();
        QJsonParseError error;
        QJsonDocument doc = QJsonDocument::fromJson(recipeData.toUtf8(), &error);
        if (doc.isObject()) {
            QVariantMap vMap;
            vMap.insert("recipeId", recipeCode);
            vMap.insert("recipeName", recipeName);
            vMap.insert("recipeData", doc.object());

            recipeMap.insert("recipeInfo", vMap);
            errorType = ReplyErrorType::NoError;
        } else {
            errorType = ReplyErrorType::ParseError;
            qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<<error.errorString();
        }
    } else {
        errorType = ReplyErrorType::ReplyError;
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< str << query.lastError().type()<< query.lastError().text();
    }

    recipeMap.insert("replyError", errorType);
    return recipeMap;
}

bool BLL_DBOpe::deleteEveryDayRecipe()
{
    QString str = "select recipeCode from recipe where isEveryDay = 1";
    QSqlQuery query = m_localDb.exec(str);
    int ret = query.lastError().type();
    if (ret != 0) {
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< str << query.lastError().type()<< query.lastError().text();
        return false;
    }

    QStringList list;
    while (query.next()) {
        QString recipeId = query.value(0).toString();
        recipeId += ".*";
        list.append(recipeId);
    }

    QString dirPath = "recipe/Image/recipeImage";
    QDir dir(dirPath);
    // 删除缩略图
    QStringList fileList = dir.entryList(list, QDir::Files);
    foreach (QString str, fileList) {
        dir.remove(str);
    }

    // 删除详情图
    dir.setPath("recipe/Image/recipeStepImage");
    fileList = dir.entryList(list, QDir::Files);
    foreach (QString str, fileList) {
        dir.remove(str);
    }

    // 删除步骤结束图
    dir.setPath("recipe/Image/finishImg");
    fileList = dir.entryList(list, QDir::Files);
    foreach (QString str, fileList) {
        dir.remove(str);
    }

    str = "delete from recipe where isEveryDay = 1";
    query = m_localDb.exec(str);
    ret = query.lastError().type();
    if (ret != 0) {
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< str << query.lastError().type()<< query.lastError().text();
        return false;
    }

    return true;
}

QVariantMap BLL_DBOpe::modifyRecipeActStep(QVariantMap vMap)
{
    QVariantMap info;
    // 获取菜谱步骤
    QString recipeCode = vMap.value("recipeCode").toString();
    int defaultVal = vMap.value("defaultVal").toInt();
    int weightVal = vMap.value("weightVal").toInt();
    if (weightVal < 350) {
        weightVal = 350;
    } else if (weightVal > 1000) {
        weightVal = 1000;
    }

    qreal ratio = weightVal*1.0/defaultVal;
    bool is_local = vMap.value("is_local").toBool();
    QString str = vMap.value("query").toString();
    QSqlQuery query;
    int ret = 0;
    if (is_local) {
        query = m_localDb.exec(str);
    } else {
        query = m_db.exec(str);
    }

    ret = query.lastError().type();
    if (ret != 0) {
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< str << query.lastError().type()<< query.lastError().text();
        info.insert("error", 1);
        return info;
    }

    QJsonObject recipeData;
    if (query.next()) {
        QJsonParseError error;
        QJsonDocument doc = QJsonDocument::fromJson(query.value(0).toString().toUtf8(), &error);
        if (doc.isObject()) {
            recipeData = doc.object();
        } else {
            qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<<error.errorString();
            info.insert("error", 1);
            return info;
        }
    } else {
        qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<< str << query.lastError().type()<< query.lastError().text();
        info.insert("error", 1);
        return info;
    }

    // 修改菜谱操作步骤
    if (!recipeData.isEmpty()) {
        QJsonObject sizeFormObj = recipeData.value("sizeForm").toArray().at(0).toObject();
        QJsonArray curve = sizeFormObj.value("curve").toArray();
        int len = curve.size();
        for (int j = 0; j < len; ++j) {
            QJsonObject obj = curve.at(j).toObject();
            if (obj.contains("adjust")) {
                QJsonArray adjust = obj.value("adjust").toArray();
                int size = adjust.size();
                for (int i = 0; i < size; ++i) {
                    int v = qRound(adjust.at(i).toInt()*ratio);
                    adjust.replace(i, v);
                }

                obj.insert("adjust", adjust);
                curve.replace(j, obj);
            }

            if (obj.contains("time")) {
                int time = qRound(obj.value("time").toInt()*ratio);
                obj.insert("time", time);
                curve.replace(j, obj);
            }
        }

        sizeFormObj.insert("curve", curve);
        QJsonArray sizeForm = recipeData.value("sizeForm").toArray();
        sizeForm.replace(0, sizeFormObj);
        recipeData.insert("sizeForm",sizeForm);

        // 更新数据库
        QJsonDocument doc(recipeData);
        QString data = QString(doc.toJson());
        QString str = QString("update recipe set recipeData = '%1' where recipeCode = '%2'").arg(data).arg(recipeCode);
        QSqlQuery query;
        if (is_local) {
            query = m_localDb.exec(str);
        } else {
            query = m_db.exec(str);
        }

        int ret = query.lastError().type();
        if (ret != 0) {
            qDebug()<<__FILE__<<__FUNCTION__<<__LINE__<<query.lastQuery()<<query.lastError().type()<< query.lastError().text();
            info.insert("error", 1);
            return info;
        }
    } else {
       info.insert("error", 1);
    }

    info.insert("error", 0);
    return info;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值