DPS/DataPlatform/ProjectEventModule.cpp

367 lines
9.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma execution_character_set("utf-8")
#include <QDateTime>
#include <fstream>
#include <QFileDialog>
#include <QCoreApplication>
#include <QApplication>
#include "ProjectEventModule.h"
#include "Session.h"
#include "mainwindow.h"
#include "ProjectData.h"
#include "DataAccessModule.h"
#include "DataManager.h"
#include "M_ProjectDAO.h"
#include "FileGenerate.h"
#include "QWaiting.h"
ProjectEventModule::ProjectEventModule(QObject* /*parent*/, DataManager* manager) :BaseEventModule(manager, "ProjectManager")
{
addShareEventModule(new DataAccessModule(manager));
}
ProjectEventModule::~ProjectEventModule()
{
}
void ProjectEventModule::contextMenu(const json& /*request*/, QMenu* menu)
{
QAction* exportAction = new QAction(this);
exportAction->setText(QStringLiteral("导出"));//给动作设置文本
menu->addAction(exportAction); //把动作添加到菜单
QAction* instanceAction = new QAction(this);
instanceAction->setText(QStringLiteral("文档生成"));//给动作设置文本
menu->addAction(instanceAction); //把动作添加到菜单
}
bool ProjectEventModule::onMessage(const std::string& eventName, json& parameter)
{
LOG(INFO) << CommonHelper::utf8ToStdString("ProjectEventModule receive message.......");
LOG(INFO) << eventName;
LOG(INFO) << CommonHelper::jsonToString(parameter);
TRY{
if (!pDataManager->_dbConnected)
{
parameter["error"] = "数据库连接失败";
LOG(INFO) << CommonHelper::utf8ToStdString("ProjectEventModule::onMessage...DB connect failed");
return true;
}
if (eventName == "add-project")
{
//新建项目
//项目添加失败需返回错误信息
return addProject(parameter);
}
else if (eventName == "save-project")
{
//修改项目
return updateProject(parameter);
}
else if (eventName == "delete-project")
{
//删除项目
return deleteProject(parameter);
}
else if (eventName == "change-project-focus")
{
//修改关注状态
return changeFocusStatus(parameter);
}
else if (eventName == "preimport-project")
{
//获取导入项目列表
return getImportProjectList(parameter);
}
else if (eventName == "import-project")
{
//导入项目
return importProject(parameter);
}
else if (eventName == "export-project")
{
//导出项目
return exportProject(parameter);
}
else if (eventName == "export-document")
{
//生成文档
return generateFile(parameter);
}
}
CATCH(parameter);
return EventModule::onMessage(eventName, parameter);
}
bool ProjectEventModule::addProject(json& parameter)
{
//新建name,type,author
auto data = parameter["data"];
QString name = CommonHelper::utf8ToQString(data["name"]);
//先判断是否有重名项目
if (ProjectData::hasRepetitiveName(name, pDataManager))
{
parameter["error"] = "项目名称不能重复";
}
else
{
ProjectData* newProject = new ProjectData();
newProject->setNewData(parameter);
newProject->_parent = pDataManager;
//将新建项目数据保存进数据库,存入pDataManager下层结点
if (pDataManager->addChild(newProject))
{
//若保存成功将新建项目返回给web端
data["id"] = newProject->_id;
data["createTime"] = CommonHelper::qstringToUtf8(newProject->getCreateTime());
data["updateTime"] = CommonHelper::qstringToUtf8(newProject->getUpdateTime());
parameter["response"] = data;
}
else {
delete newProject;
newProject = nullptr;
//parameter错误提示
parameter["error"] = "新建项目失败";
}
}
LOG(INFO) << CommonHelper::utf8ToStdString("addProject Sendto web.......");
LOG(INFO) << CommonHelper::jsonToString(parameter);
return true;
}
//编辑项目
bool ProjectEventModule::updateProject(json& parameter)
{
//参数 id, name, type,author
//可以修改name,type,author
auto data = parameter["data"];
auto projectId = data["id"];
QString name = CommonHelper::utf8ToQString(data["name"]);
//查找当前项目
DPData* pData = pDataManager->findObjectById(DataManager::DataType::project, projectId);
ProjectData* pProject = qobject_cast<ProjectData*>(pData);
if (pProject) {
pProject->setEditData(parameter);
if (pProject->saveSelf())
{
//更新数据成功冲掉web端的更新时间
data["updateTime"] = CommonHelper::qstringToUtf8(pProject->getUpdateTime());
parameter["response"] = data;
}
else
{
//编辑失败
parameter["error"] = "编辑项目失败";
}
}
else {
parameter["error"] = "查询项目失败";
}
LOG(INFO) << CommonHelper::utf8ToStdString("updateProject Sendto web.......");
LOG(INFO) << CommonHelper::jsonToString(parameter);
return true;
}
bool ProjectEventModule::deleteProject(json& parameter)
{
//需要删除的项目编号
auto data = parameter["data"];
auto projectId = data["id"];
DPData* pData = pDataManager->findObjectById(DataManager::DataType::project, projectId);
if (pData)
{
if (pData->deleteSelf())
{//更新总map
pDataManager->deleteInDataMap(DataManager::DataType::project, projectId);
delete pData;
pData = nullptr;
//删除成功
parameter["response"]["deleted"] = true;
}
else
{
parameter["response"]["deleted"] = false;
}
}
else
{
parameter["error"] = "找不到该项目";
}
LOG(INFO) << CommonHelper::utf8ToStdString("deleteProject Sendto web.......");
LOG(INFO) << CommonHelper::jsonToString(parameter);
return true;
}
bool ProjectEventModule::changeFocusStatus(json& parameter)
{
//获取项目id和关注状态
auto data = parameter["data"];
auto projectId = data["id"];
//查找当前项目
DPData* pData = pDataManager->findObjectById(DataManager::DataType::project, projectId);
ProjectData* pProject = qobject_cast<ProjectData*>(pData);
if (pProject) {
pProject->setFocus(data["focus"]);
if (pProject->saveSelf())
{
data["focused"] = pProject->getFocus();
parameter["response"] = data;
}
else {
//失败
parameter["error"] = "修改关注状态失败";
}
}
else {
parameter["error"] = "查询项目失败";
}
LOG(INFO) << CommonHelper::utf8ToStdString("changeFocusStatus Sendto web.......");
LOG(INFO) << CommonHelper::jsonToString(parameter);
return true;
}
bool ProjectEventModule::getImportProjectList(json& parameter)
{
//选择导入项目文件,返回项目列表
QString selectDir = QFileDialog::getOpenFileName(nullptr, "选择导入文件", "", "*.dbp");
SysManager& sysMgr = GetSysManager();
sysMgr._importFilePath = selectDir;
QList<ProjectData*> projectList;
parameter["response"] = json::array();
if (selectDir.isEmpty())
{
//未选择导入文件
LOG(INFO) << CommonHelper::utf8ToStdString("未选择导入文件");
}
else
{
if (ProjectData::getImportProjectList(projectList, selectDir))
{
for (int i = 0; i < projectList.size(); i++)
{
json j;
projectList.at(i)->toJson(j);
parameter["response"].push_back(j);
}
//释放内存
qDeleteAll(projectList);
projectList.clear();
}
else
{
parameter["error"] = "获取导入项目列表失败";
}
}
LOG(INFO) << CommonHelper::utf8ToStdString("getImportProjectList Sendto web.......");
LOG(INFO) << CommonHelper::jsonToString(parameter);
return true;
}
bool ProjectEventModule::importProject(json& parameter)
{
QWaiting waiting(Session::getSession()->parent(), "项目导入中...");
waiting.working(std::bind([&](json& parameter) {
parameter["response"] = json::array();
QList<int> projectIdList;
if (ProjectData::importData(parameter, projectIdList))
{
//从数据库取
pDataManager->getAllChildren();
ProjectData* pData = nullptr;
for (int i = 0; i < projectIdList.size(); i++)
{
pData = dynamic_cast<ProjectData*>(pDataManager->findObjectById(DataManager::DataType::project, projectIdList.at(i)));
if (pData)
{
json j;
pData->toJson(j);
parameter["response"].push_back(j);
}
}
}
else
{
LOG(INFO) << CommonHelper::utf8ToStdString("ProjectData::importData failed ");
}
return true; }, std::ref(parameter)));
LOG(INFO) << CommonHelper::utf8ToStdString("importProject Sendto web.......");
LOG(INFO) << CommonHelper::jsonToString(parameter);
return true;
}
bool ProjectEventModule::exportProject(json& parameter)
{
QString filePath = QFileDialog::getSaveFileName(nullptr, "保存导出文件", "", tr("*.dbp"));
if (filePath.isEmpty())
{
LOG(INFO) << CommonHelper::utf8ToStdString("未选择导出路径");
}
else
{
//调用多线程处理耗时的任务
QWaiting waiting(Session::getSession()->parent(), "项目导出中...");
waiting.working(std::bind([](json& parameter, QString filePath) {
if (ProjectData::exportData(parameter, filePath))
{
parameter["response"] = { {"status",true} };
}
else
{
LOG(INFO) << CommonHelper::utf8ToStdString("exportProject failed");
parameter["response"] = { {"status",false} };
}
return true; }, std::ref(parameter), filePath));
}
LOG(INFO) << CommonHelper::utf8ToStdString("exportProject Sendto web.......");
LOG(INFO) << CommonHelper::jsonToString(parameter);
return true;
}
//生成需求文档
bool ProjectEventModule::generateFile(json& parameter)
{
//选择生成实例文件全路径
// QString file = QFileDialog::getSaveFileName(nullptr, tr("生成需求文件"), "", ".doc");
QString path = QFileDialog::getExistingDirectory(nullptr, "生成需求文件", "");
if (path.isEmpty())
{
LOG(INFO) << CommonHelper::utf8ToStdString("未选择生成路径");
parameter["response"] = { {"status",false} };
}
else
{
QWaiting waiting(Session::getSession()->parent(), "文档生成中...");
waiting.working(std::bind([&parameter, path]() {
FileGenerate generator;
if (generator.generate(path + "/", parameter))
{
parameter["response"] = { {"status",true} };
}
else {
parameter["response"] = { {"status",false} };
};
return true;
}));
}
LOG(INFO) << CommonHelper::utf8ToStdString("generateFile Sendto web.......");
LOG(INFO) << CommonHelper::jsonToString(parameter);
return true;
}