282 lines
7.3 KiB
C++
282 lines
7.3 KiB
C++
#include "stdafx.h"
|
|
#include "SearchEquDlg.h"
|
|
#include "AecDbEwEquipment.h"
|
|
#include "coretools.h"
|
|
|
|
IMPLEMENT_DYNAMIC(CSearchEquDlg, CDialog)
|
|
|
|
CSearchEquDlg::CSearchEquDlg(CWnd* pParent /*=nullptr*/)
|
|
: CDialog(IDD_SEARCH_EQU_DLG, pParent)
|
|
, m_iSelEqu(-1)
|
|
, m_sEquName(_T(""))
|
|
, m_iIdClass(-1)
|
|
{
|
|
|
|
}
|
|
|
|
CSearchEquDlg::~CSearchEquDlg()
|
|
{
|
|
}
|
|
|
|
void CSearchEquDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
DDX_Control(pDX, IDC_EDT_SEARCH, m_edtSearch);
|
|
DDX_Control(pDX, IDC_LST_REL, m_lstResult);
|
|
DDX_Control(pDX, IDC_LST_BIM, m_lstBims);
|
|
DDX_Control(pDX, IDC_STA_REM, m_staRem);
|
|
}
|
|
|
|
BOOL CSearchEquDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
if (!m_wndViewCtrl.SubclassDlgItem(IDC_STA_VIEW, this))
|
|
{
|
|
// 错误时,结束对话框
|
|
EndDialog(IDCANCEL);
|
|
return FALSE;
|
|
}
|
|
m_wndViewCtrl.init(true);
|
|
|
|
m_lstResult.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_SINGLEROW);
|
|
m_lstResult.InsertColumn(0, _T("文件夹"), LVCFMT_CENTER, 95);
|
|
m_lstResult.InsertColumn(1, _T("类型"), LVCFMT_CENTER, 95);
|
|
m_lstResult.InsertColumn(2, _T("设备名称"), LVCFMT_CENTER, 95);
|
|
|
|
m_lstBims.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_SINGLEROW);
|
|
m_lstBims.InsertColumn(0, _T("名称"), LVCFMT_CENTER, 100);
|
|
m_lstBims.InsertColumn(1, _T("数值"), LVCFMT_CENTER, 100);
|
|
|
|
|
|
CString path = FilePath::GetSysDir() + _T("\\Aec3DMep.db");
|
|
if (!m_dbServer.InitADOServer(path))
|
|
{
|
|
AfxMessageBox(CString(_T("数据库初始化失败,请检查 sys")) + _T("\\Aec3DMep.db") + _T("文件是否存在."));
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CSearchEquDlg, CDialog)
|
|
ON_BN_CLICKED(IDC_BTN_SEARCH, &CSearchEquDlg::OnBnClickedBtnSearch)
|
|
ON_BN_CLICKED(IDOK, &CSearchEquDlg::OnBnClickedOk)
|
|
ON_EN_CHANGE(IDC_EDT_SEARCH, &CSearchEquDlg::OnEnChangeEdtSearch)
|
|
ON_NOTIFY(NM_CLICK, IDC_LST_REL, &CSearchEquDlg::OnNMClickLstRel)
|
|
END_MESSAGE_MAP()
|
|
|
|
void CSearchEquDlg::OnBnClickedBtnSearch()
|
|
{
|
|
OnEnChangeEdtSearch();
|
|
}
|
|
|
|
void CSearchEquDlg::OnBnClickedOk()
|
|
{
|
|
int idx = m_lstResult.GetSelectionMark();
|
|
if (idx < 0)
|
|
{
|
|
AfxMessageBox(_T("请选择一个设备。"));
|
|
return;
|
|
}
|
|
CDialog::OnOK();
|
|
}
|
|
|
|
void CSearchEquDlg::OnEnChangeEdtSearch()
|
|
{
|
|
m_lstResult.DeleteAllItems();
|
|
m_lstBims.DeleteAllItems();
|
|
m_staRem.SetWindowText(_T(""));
|
|
m_wndViewCtrl.clearAll();
|
|
m_wndViewCtrl.init();
|
|
m_wndViewCtrl.RefreshView();
|
|
|
|
CString str(_T(""));
|
|
m_edtSearch.GetWindowText(str);
|
|
if (str.IsEmpty()) return;
|
|
|
|
std::vector<std::vector<CString>> rows;
|
|
search(str, rows);
|
|
|
|
if (rows.empty()) return;
|
|
|
|
int idx(0);
|
|
for (size_t i = 0; i < rows.size(); ++i)
|
|
{
|
|
std::vector<CString> &v(rows[i]);
|
|
if (v.size() < 4) continue;
|
|
|
|
m_lstResult.InsertItem(idx, v[1]);
|
|
m_lstResult.SetItemText(idx, 1, v[2]);
|
|
m_lstResult.SetItemText(idx, 2, v[3]);
|
|
m_lstResult.SetItemData(idx, TypeConvert::s2i(v[0]));
|
|
++idx;
|
|
}
|
|
|
|
}
|
|
|
|
void CSearchEquDlg::OnNMClickLstRel(NMHDR *pNMHDR, LRESULT *pResult)
|
|
{
|
|
*pResult = 0;
|
|
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
|
|
int nItem = pNMItemActivate->iItem;
|
|
if (nItem < 0 || nItem >= m_lstResult.GetItemCount()) return;
|
|
|
|
m_sEquName = m_lstResult.GetItemText(nItem, 2);
|
|
|
|
// aec_package表内的ID
|
|
m_iSelEqu = m_lstResult.GetItemData(nItem);
|
|
|
|
CString tmpFile(FilePath::getSystemTemporaryFolder() + _T("\\temp_$_$_.equ"));
|
|
CString sSql(_T(""));
|
|
sSql.Format(_T("SELECT [package] FROM aec_package WHERE [ID]='%d'"), m_iSelEqu);
|
|
if (!m_dbServer.GetSelBlob(sSql, tmpFile)) return;
|
|
AecDbEwEquipment* pEqu = new AecDbEwEquipment;
|
|
if (!pEqu->ReadFromFile(tmpFile)) return;
|
|
|
|
AcDbExtents ext;
|
|
pEqu->getGeomExtents(ext);
|
|
|
|
m_wndViewCtrl.clearAll();
|
|
m_wndViewCtrl.init();
|
|
m_wndViewCtrl.InitFromCurrentView3D(ext);
|
|
m_wndViewCtrl.Add(pEqu);
|
|
m_wndViewCtrl.RefreshView();
|
|
|
|
std::map<CString, CString> ar;
|
|
sSql.Format(_T("SELECT [name], [value] FROM aec_bims WHERE [equid]='%d'"), m_iSelEqu);
|
|
m_dbServer.GetSelData(sSql, ar);
|
|
|
|
m_lstBims.DeleteAllItems();
|
|
std::map<CString, CString>::const_iterator it(ar.begin());
|
|
for (int idx = 0; it != ar.end(); ++it, ++idx)
|
|
{
|
|
m_lstBims.InsertItem(idx, it->first);
|
|
m_lstBims.SetItemText(idx, 1, it->second);
|
|
}
|
|
|
|
CString sRem(_T(""));
|
|
sSql.Format(_T("SELECT [rem] FROM aec_package WHERE [id]='%d'"), m_iSelEqu);
|
|
m_dbServer.GetSelData(sSql, sRem);
|
|
m_staRem.SetWindowText(sRem);
|
|
}
|
|
|
|
void CSearchEquDlg::search(LPCTSTR psz, std::vector<std::vector<CString>>& vec)
|
|
{
|
|
if (!psz) return;
|
|
std::vector<CString> v(0);
|
|
CoreTools::SplitString(psz, _T(' '), v);
|
|
if (v.empty()) return;
|
|
|
|
/*
|
|
主要考虑
|
|
aec_folder.folder
|
|
, aec_class.class
|
|
, aec_package.name
|
|
, aec_package.rem
|
|
, aec_bims.value
|
|
这几个字段
|
|
搜索每一个相关表中的相关字段,如果有,则将结果去掉重复,显示出来
|
|
*/
|
|
|
|
std::vector<CString> ar(0);
|
|
std::vector<std::set<CString>> equid_ss(0);
|
|
std::set<CString> equIds;
|
|
CString sFolder(_T("")), sClass(_T("")), sPackage1(_T("")), sPackage2(_T("")), sBims(_T(""));
|
|
for (size_t i = 0; i < v.size(); ++i)
|
|
{
|
|
sFolder.Format(_T("SELECT aec_package.[id]")
|
|
_T(" FROM aec_package ")
|
|
_T("INNER JOIN aec_folder, aec_class ")
|
|
_T("ON (aec_package.[idclass] = aec_class.[id] AND aec_class.[idfolder] = aec_folder.[id]) ")
|
|
_T("WHERE aec_folder.[folder] LIKE '%%%s%%'"), v[i]);
|
|
ar.clear();
|
|
m_dbServer.GetSelData(sFolder, ar);
|
|
equIds.insert(ar.begin(), ar.end());
|
|
|
|
sClass.Format(_T("SELECT aec_package.[id]")
|
|
_T(" FROM aec_package ")
|
|
_T("INNER JOIN aec_class ")
|
|
_T("ON aec_package.[idclass] = aec_class.[id] ")
|
|
_T("WHERE aec_class.[class] LIKE '%%%s%%'"), v[i]);
|
|
ar.clear();
|
|
m_dbServer.GetSelData(sClass, ar);
|
|
equIds.insert(ar.begin(), ar.end());
|
|
|
|
sBims.Format(_T("SELECT aec_package.[id]")
|
|
_T(" FROM aec_package ")
|
|
_T("INNER JOIN aec_bims ")
|
|
_T("ON aec_package.[id] = aec_bims.[equid] ")
|
|
_T("WHERE aec_bims.[value] LIKE '%%%s%%'"), v[i]);
|
|
ar.clear();
|
|
m_dbServer.GetSelData(sBims, ar);
|
|
equIds.insert(ar.begin(), ar.end());
|
|
|
|
sPackage1.Format(_T("SELECT aec_package.[id]")
|
|
_T(" FROM aec_package ")
|
|
_T("WHERE [name] LIKE '%%%s%%'"), v[i]);
|
|
ar.clear();
|
|
m_dbServer.GetSelData(sPackage1, ar);
|
|
equIds.insert(ar.begin(), ar.end());
|
|
|
|
sPackage2.Format(_T("SELECT aec_package.[id]")
|
|
_T(" FROM aec_package ")
|
|
_T("WHERE [rem] LIKE '%%%s%%'"), v[i]);
|
|
ar.clear();
|
|
m_dbServer.GetSelData(sPackage2, ar);
|
|
equIds.insert(ar.begin(), ar.end());
|
|
|
|
if (!equIds.empty())
|
|
{
|
|
equid_ss.push_back(equIds);
|
|
equIds.clear();
|
|
}
|
|
}
|
|
// 找到 equid_ss 每一个数组中都存在的 id
|
|
|
|
std::set<CString> allIds;
|
|
for (size_t i = 0; i < equid_ss.size(); ++i)
|
|
{
|
|
std::set<CString>& s(equid_ss[i]);
|
|
allIds.insert(s.begin(), s.end());
|
|
}
|
|
|
|
std::vector<CString> ids;
|
|
std::set<CString>::const_iterator it(allIds.begin()), _it;
|
|
for (; it != allIds.end(); ++it)
|
|
{
|
|
const CString &id(*it);
|
|
bool suc(true);
|
|
for (size_t j = 0; j < equid_ss.size(); ++j)
|
|
{
|
|
std::set<CString> &s(equid_ss[j]);
|
|
_it = s.find(id);
|
|
if (_it == s.end())
|
|
{
|
|
suc = false;
|
|
break;
|
|
}
|
|
}
|
|
if (suc)
|
|
ids.push_back(id);
|
|
}
|
|
|
|
CString sSql;
|
|
for (size_t i = 0; i < ids.size(); ++i)
|
|
{
|
|
sSql.Format(_T("SELECT ")
|
|
_T("aec_package.[id]")
|
|
_T(", aec_folder.[folder]")
|
|
_T(", aec_class.[class]")
|
|
_T(", aec_package.[name] ")
|
|
_T("FROM aec_package ")
|
|
_T("INNER JOIN aec_folder, aec_class ")
|
|
_T("ON (")
|
|
_T("aec_folder.[id] = aec_class.[idfolder] ")
|
|
_T("AND aec_package.[idclass] = aec_class.[id] ")
|
|
_T(") ")
|
|
_T("WHERE aec_package.[id]='%s'"), ids[i]);
|
|
ar.clear();
|
|
m_dbServer.GetSelData(sSql, ar);
|
|
if (!ar.empty())
|
|
vec.push_back(ar);
|
|
}
|
|
}
|