wumu
2025-04-27 20ffcfb5507daf34f81346ca3dfa4c031e7b2fe3
internal_system_v1/converinfo2.cpp
@@ -15,8 +15,12 @@
    ui->setupUi(this);
    m_menu = nullptr;
    //initUi();
    readInfo(); // 加载表格
    //readInfo(); // 加载表格
    addMenu(); // 增加菜单
    disableWheelEvent(); // 禁用下拉框的滚轮事件
    // 自适应处理
    ui->treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
}
ConverInfo2::~ConverInfo2()
@@ -46,7 +50,7 @@
    it4->setCheckState(0,Qt::Checked);
    // 复选框状态处理
    connect(ui->treeWidget,QOverload<QTreeWidgetItem*,int>::of(QTreeWidget::itemClicked),this,[=](QTreeWidgetItem* it,int index){
    connect(ui->treeWidget,QOverload<QTreeWidgetItem*,int>::of(&QTreeWidget::itemClicked),this,[=](QTreeWidgetItem* it,int index){
        qDebug()<<it<<index;
        if(it == top1){
            qDebug()<<"点击了码蚁集团";
@@ -60,12 +64,14 @@
    m_menu = new QMenu(this);
    m_menu->addAction("删除");
    m_menu->addAction("增加");
    m_menu->addAction("保存导出");
    ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(ui->treeWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(showMenu(QPoint)));
    connect(m_menu->actions().at(0),SIGNAL(triggered(bool)),this,SLOT(deleteInfo()));
    connect(m_menu->actions().at(1),SIGNAL(triggered(bool)),this,SLOT(addInfo()));
    connect(m_menu->actions().at(2),SIGNAL(triggered(bool)),this,SLOT(saveInfo()));
            // 单位内容修改
    // 右边可编辑内容
@@ -87,19 +93,149 @@
{
    if(m_curItem==nullptr)return;
    qDebug()<<"添加公司信息,在节点:"<<m_curItem->text(0);
    on_pushButton_laodFile_clicked();
}
void ConverInfo2::deleteInfo()
{
    if(m_curItem==nullptr)return;
    qDebug()<<"删除公司信息,节点:"<<m_curItem->text(0);
    //auto resList = m_curItem->takeChildren();
    //qDebug()<<"删除数量:"<<resList.size();
    // 删除数据库表里面对应的公司信息,并且再次刷新下拉框和树状图
        // 数据库表有:封面信息表 all_company_info      综合信息表 comprehensive_entry_info    三合一的表 standing_book_info
    QString name = m_curItem->text(0);
    QStringList sp = name.split("(本级)");
    QStringList sp2 = name.split("下级数");
    qDebug()<<"拆开:"<<sp<<"汇总:"<<sp2;
    if(sp.size() == 2){
        name = sp.at(0);
    }
    if(sp2.size() == 2){ // 得递归删除底下的所有单位
        name = sp2.at(0);
    }
    // 删除所有表中这个名字
    deleteAllByName(name);
    // 删除完了,还得去刷新下拉框
    for(auto it=m_nameAndComInfos.begin();it!=m_nameAndComInfos.end();){
        if(it.key() == name){
            m_nameAndComInfos.erase(it++);
            break;
        }else{
            it++;
        }
    }
    // 去刷新树形图
    for(auto it=m_treeNodes.begin();it!=m_treeNodes.end();){
        // 如果等于键,那么要删除对应的所有的值
        if(it.key() == name){
            // 把所有的值对应的单位信息都删掉
            for(auto str:it.value()){
                auto p = m_nameAndComInfos.find(str);
                if(p != m_nameAndComInfos.end()){
                    deleteAllByName(str); // 还得再删掉数据库中的内容
                    m_nameAndComInfos.erase(p);
                }
            }
            m_treeNodes.erase(it++);
            break;
        }
        // 只是某个值,只删除一个即可,遍历值里面的迭代器,找到删除即可
        else{
            auto p = it.value().find(name);
            if(p != it.value().end()){
                it.value().erase(p);
            }
            it++;
        }
    }
    emit updateComboListSignal(m_nameAndComInfos);
    createTreeNode();
}
void ConverInfo2::saveInfo()
{
    if(m_curItem==nullptr)return;
    qDebug()<<"保存公司信息,节点:"<<m_curItem->text(0);
    QString name = m_curItem->text(0);
    if(name.contains("(本级)")){
        name = name.split("(本级)").at(0);
    }else if(name.contains("(汇总)")){
        name = name.split("(汇总)").at(0);
        name = name + "(汇总)";
    }
    qDebug()<<"保存公司名:"<<name;
    ComInfo cif = m_nameAndComInfos[name];
    ExportToFile etf(this);
    etf.saveToExcelFromComInfo(cif);
}
void ConverInfo2::on_treeWidget_doubleClicked(const QModelIndex &index)
{
    QString name = index.model()->data(index).toString();
    qDebug()<<"双击"<<index<<name;
    ComInfo curCominfo = m_nameAndComInfos[name];
    ComInfo curCominfo; // 不要直接给值,可能会导致多添加新的名字进来
    if(name.contains("(本级)")){
        QStringList sps = name.split("(本级)");
        name = sps.at(0);
        curCominfo = m_nameAndComInfos[name];
    }else if(name.contains("(汇总)")){
        name = name.split("(汇总)").at(0);
        qDebug()<<"汇总处理:";
        // 做一个汇总的处理,把所有下级的都累加起来
        ComInfo allCominfo = m_nameAndComInfos[name];
        for(QString cur:m_treeNodes[name]){
            if(name != cur){
                ComInfo &tmp = m_nameAndComInfos[cur];
                allCominfo.organazationNum += tmp.organazationNum;
                allCominfo.realNum += tmp.realNum;
                allCominfo.professionalNum += tmp.professionalNum;
                allCominfo.CIANum += tmp.CIANum;
                allCominfo.masterNum += tmp.masterNum;
                allCominfo.undergraduatesNum += tmp.undergraduatesNum;
                allCominfo.juniorNum += tmp.juniorNum;
                allCominfo.seniorNum += tmp.seniorNum;
                allCominfo.intermediateNum += tmp.intermediateNum;
                allCominfo.primaryNum += tmp.primaryNum;
                allCominfo.noTitleNum += tmp.noTitleNum;
                allCominfo.upFiftyOldNum += tmp.upFiftyOldNum;
                allCominfo.upThirtyOldNum += tmp.upThirtyOldNum;
                allCominfo.downThirtyOldNum += tmp.downThirtyOldNum;
                allCominfo.auditNum += tmp.auditNum;
                allCominfo.accountingNum += tmp.accountingNum;
                allCominfo.economyNum += tmp.economyNum;
                allCominfo.lawNum += tmp.lawNum;
                allCominfo.managerNum += tmp.managerNum;
                allCominfo.itNum += tmp.itNum;
                allCominfo.engineeringNum += tmp.engineeringNum;
                allCominfo.otherNum += tmp.otherNum;
            }
        }
        curCominfo = allCominfo;
        // 处理完了之后,还需要单独起一个汇总的名字
        name = name + "(汇总)";
        strcpy(curCominfo.name,name.toLocal8Bit().data());
        m_nameAndComInfos[name] = curCominfo;
        // 刷新组合下拉框的列表
        emit updateComboListSignal(m_nameAndComInfos);
    }else{
        curCominfo = m_nameAndComInfos[name];
    }
    //ComInfo curCominfo = m_nameAndComInfos[name];
    // 一、单位基本情况
    ui->lineEdit_creditCode->setText(curCominfo.creditCode);
    ui->lineEdit_name->setText(QString::fromLocal8Bit( curCominfo.name));
@@ -200,11 +336,15 @@
        it.next();
        list.append(it.fileInfo().absoluteFilePath());
    }
    int allSize = list.size();
    float cntIdx=1.0;
    foreach(QString str, list)
    {
        qDebug() << str;
        int index = str.indexOf("内审统01表");
        qDebug()<<"index:"<<index;
        if(index > 0){
            QAxObject excel("ket.Application");
            if(!excel.setControl("ket"
@@ -241,16 +381,16 @@
                QVariant  val = usedRange->dynamicCall("Value"); // 拿到二维表格
                QVariantList valRows = val.toList();
                // 遍历每一项
                for(int i=0;i<rows;++i){
                    QVariantList valrow = valRows[i].toList();
                    for(int j=0;j<columns;++j){
                        QVariant valData = valrow[j];
                        if(valData.isValid()){
                            qDebug()<<"val:"<< i<< j << valData;
                        }
//                for(int i=0;i<rows;++i){
//                    QVariantList valrow = valRows[i].toList();
//                    for(int j=0;j<columns;++j){
//                        QVariant valData = valrow[j];
//                        if(valData.isValid()){
//                            qDebug()<<"val:"<< i<< j << valData;
//                        }
                    }
                }
//                    }
//                }
                // 实例化结构体,然后挨个赋值
                ComInfo curComInfo;
@@ -265,8 +405,8 @@
                QVariant name = valRows[9].toList().at(8);
                if(name.isValid()){
                    ui->label_name->setText(name.toString());
                    QTreeWidgetItem *top1 = new QTreeWidgetItem(ui->treeWidget);
                    top1->setText(0,name.toString());
                    //QTreeWidgetItem *top1 = new QTreeWidgetItem(ui->treeWidget);
                    //top1->setText(0,name.toString());
                    strcpy(curComInfo.name,name.toString().toLocal8Bit().data());
                }else{
@@ -517,136 +657,137 @@
                // 四、内审人员配备基本情况
                // 编制数
                QVariant organazationNum = valRows[56].toList().at(4);
                //QVariant organazationNum = valRows[56].toList().at(4);
                QVariant organazationNum = valRows[60].toList().at(4);
                if(organazationNum.isValid()){
                    curComInfo.organazationNum = organazationNum.toInt();
                    qDebug()<<"organazationNum"<<organazationNum;
                }
                // 实有人员数
                QVariant realNum = valRows[56].toList().at(4);
                QVariant realNum = valRows[60].toList().at(6);
                if(realNum.isValid()){
                    curComInfo.realNum = realNum.toInt();
                    qDebug()<<"realNum"<<realNum;
                }
                // 专职人员数
                QVariant professionalNum = valRows[56].toList().at(4);
                QVariant professionalNum = valRows[60].toList().at(8);
                if(professionalNum.isValid()){
                    curComInfo.professionalNum = professionalNum.toInt();
                    qDebug()<<"professionalNum"<<professionalNum;
                }
                // 拥有CIA人员数
                QVariant CIANum = valRows[56].toList().at(4);
                QVariant CIANum = valRows[61].toList().at(6);
                if(CIANum.isValid()){
                    curComInfo.CIANum = CIANum.toInt();
                    qDebug()<<"CIANum"<<CIANum;
                }
                // 学历:硕士及以上 人员数
                QVariant masterNum = valRows[56].toList().at(4);
                QVariant masterNum = valRows[62].toList().at(6);
                if(masterNum.isValid()){
                    curComInfo.masterNum = masterNum.toInt();
                    qDebug()<<"masterNum"<<masterNum;
                }
                // 大学本科
                QVariant undergraduatesNum = valRows[56].toList().at(4);
                QVariant undergraduatesNum = valRows[63].toList().at(6);
                if(undergraduatesNum.isValid()){
                    curComInfo.undergraduatesNum = undergraduatesNum.toInt();
                    qDebug()<<"undergraduatesNum"<<undergraduatesNum;
                }
                // 专科及以下
                QVariant juniorNum = valRows[56].toList().at(4);
                QVariant juniorNum = valRows[64].toList().at(6);
                if(juniorNum.isValid()){
                    curComInfo.juniorNum = juniorNum.toInt();
                    qDebug()<<"juniorNum"<<juniorNum;
                }
                // 职称 高级职称
                QVariant seniorNum = valRows[56].toList().at(4);
                QVariant seniorNum = valRows[65].toList().at(6);
                if(seniorNum.isValid()){
                    curComInfo.seniorNum = seniorNum.toInt();
                    qDebug()<<"seniorNum"<<seniorNum;
                }
                // 中级职称
                QVariant intermediateNum = valRows[56].toList().at(4);
                QVariant intermediateNum = valRows[66].toList().at(6);
                if(intermediateNum.isValid()){
                    curComInfo.intermediateNum = intermediateNum.toInt();
                    qDebug()<<"intermediateNum"<<intermediateNum;
                }
                // 初级职称
                QVariant primaryNum = valRows[56].toList().at(4);
                QVariant primaryNum = valRows[67].toList().at(6);
                if(primaryNum.isValid()){
                    curComInfo.primaryNum = primaryNum.toInt();
                    qDebug()<<"primaryNum"<<primaryNum;
                }
                // 无职称
                QVariant noTitleNum = valRows[56].toList().at(4);
                QVariant noTitleNum = valRows[68].toList().at(6);
                if(noTitleNum.isValid()){
                    curComInfo.noTitleNum = noTitleNum.toInt();
                    qDebug()<<"noTitleNum"<<noTitleNum;
                }
                // 年龄结构 50岁以上
                QVariant upFiftyOldNum = valRows[56].toList().at(4);
                QVariant upFiftyOldNum = valRows[69].toList().at(6);
                if(upFiftyOldNum.isValid()){
                    curComInfo.upFiftyOldNum = upFiftyOldNum.toInt();
                    qDebug()<<"upFiftyOldNum"<<upFiftyOldNum;
                }
                // 30-50岁
                QVariant upThirtyOldNum = valRows[56].toList().at(4);
                QVariant upThirtyOldNum = valRows[70].toList().at(6);
                if(upThirtyOldNum.isValid()){
                    curComInfo.upThirtyOldNum = upThirtyOldNum.toInt();
                    qDebug()<<"upThirtyOldNum"<<upThirtyOldNum;
                }
                // 30岁以下
                QVariant downThirtyOldNum = valRows[56].toList().at(4);
                QVariant downThirtyOldNum = valRows[71].toList().at(6);
                if(downThirtyOldNum.isValid()){
                    curComInfo.downThirtyOldNum = downThirtyOldNum.toInt();
                    qDebug()<<"downThirtyOldNum"<<downThirtyOldNum;
                }
                // 知识结构 审计
                QVariant auditNum = valRows[56].toList().at(4);
                QVariant auditNum = valRows[72].toList().at(6);
                if(auditNum.isValid()){
                    curComInfo.auditNum = auditNum.toInt();
                    qDebug()<<"auditNum"<<auditNum;
                }
                // 会计
                QVariant accountingNum = valRows[56].toList().at(4);
                QVariant accountingNum = valRows[73].toList().at(6);
                if(accountingNum.isValid()){
                    curComInfo.accountingNum = accountingNum.toInt();
                    qDebug()<<"accountingNum"<<accountingNum;
                }
                // 经济
                QVariant economyNum = valRows[56].toList().at(4);
                QVariant economyNum = valRows[74].toList().at(6);
                if(economyNum.isValid()){
                    curComInfo.economyNum = economyNum.toInt();
                    qDebug()<<"economyNum"<<economyNum;
                }
                // 法律
                QVariant lawNum = valRows[56].toList().at(4);
                QVariant lawNum = valRows[75].toList().at(6);
                if(lawNum.isValid()){
                    curComInfo.lawNum = lawNum.toInt();
                    qDebug()<<"lawNum"<<lawNum;
                }
                // 管理
                QVariant managerNum = valRows[56].toList().at(4);
                QVariant managerNum = valRows[76].toList().at(6);
                if(managerNum.isValid()){
                    curComInfo.managerNum = managerNum.toInt();
                    qDebug()<<"managerNum"<<managerNum;
                }
                // 信息技术
                QVariant itNum = valRows[56].toList().at(4);
                QVariant itNum = valRows[77].toList().at(6);
                if(itNum.isValid()){
                    curComInfo.itNum = itNum.toInt();
                    qDebug()<<"itNum"<<itNum;
                }
                // 工程
                QVariant engineeringNum = valRows[56].toList().at(4);
                QVariant engineeringNum = valRows[78].toList().at(6);
                if(engineeringNum.isValid()){
                    curComInfo.engineeringNum = engineeringNum.toInt();
                    qDebug()<<"engineeringNum"<<engineeringNum;
                }
                // 其他
                QVariant otherNum = valRows[56].toList().at(4);
                QVariant otherNum = valRows[79].toList().at(6);
                if(otherNum.isValid()){
                    curComInfo.otherNum = otherNum.toInt();
                    qDebug()<<"otherNum"<<otherNum;
@@ -683,14 +824,50 @@
                // 最后存到map中
                m_nameAndComInfos[name.toString()]=curComInfo;
                // 更新到数据库中
                saveToSQL(curComInfo);
                qDebug()<<"load Excel save to SQL ok:"<<name;
                // 添加树形列表节点
                //addTreeWidgetNode(upName,name);
                if(upName.isValid()){
                    if(name.isValid()){
                        //m_treeNodes[upName.toString()].push_back(name.toString());
                        m_treeNodes[upName.toString()].insert(name.toString());
                    }
                }else{
                    if(name.isValid()){
                        //m_treeNodes[name.toString()].push_back(name.toString());
                        m_treeNodes[name.toString()].insert(name.toString());
                    }
                }
            }
            wbs->dynamicCall("Close()");
            excel.dynamicCall("Quit(void)");
            qDebug()<<"单位信息数量:"<<m_nameAndComInfos.size();
        }
        // 控制显示进度相关
        emit loadProgress((cntIdx/allSize)*100);
        cntIdx++;
    }
    // 再次查询数据库中所有的信息
    readAllSQLData();
    createTreeNode(); // 构建树形节点
    // 发射 加载完成的信号
    emit loadFinished();
    // 更新其他界面的公司信息下拉框
    emit updateComboListSignal(m_nameAndComInfos);
//    QAxObject excel("./debug/Data/附件2_内审统01表_单位及内部审计机构基本情况表-1.301版(1).xls");
//    excel.setProperty("Visible",true);
@@ -708,12 +885,14 @@
    m_menu->addAction("删除");
    m_menu->addAction("增加");
    m_menu->addAction("保存导出");
    ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(ui->treeWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(showMenu(QPoint)));
    connect(m_menu->actions().at(0),SIGNAL(triggered(bool)),this,SLOT(deleteInfo()));
    connect(m_menu->actions().at(1),SIGNAL(triggered(bool)),this,SLOT(addInfo()));
    connect(m_menu->actions().at(2),SIGNAL(triggered(bool)),this,SLOT(saveInfo()));
}
void ConverInfo2::on_pushButton_commit_clicked()
@@ -874,9 +1053,718 @@
    // 更新到数据库
    saveToSQL(curComInfo);
//    // 先判断是不是已经存在公司名了,若已存在,则更新,不存在则插入
//    QString sql = QString("select id,name from all_company_info where name='%1'").arg(name);
//    qDebug()<<"sql:"<<sql;
//    QSqlQuery query;
//    int rowCnt = 0;
//    if(query.exec(sql)){
//        qDebug()<<"size:"<<query.size();
//        while (query.next()) {
//            rowCnt++;
//        }
//    }
//    if(rowCnt == 0){
//        // 不存在,则插入一条新数据
//        qDebug()<<"不存在:"<<name;
//        sql = QString("insert into all_company_info (name,\
//code,\
//机构类型,\
//主要业务活动,\
//行业代码,\
//单位注册地及区域,\
//区域代码,\
//城乡代码,\
//单位规模,\
//从业期末人数,\
//法定代表人,\
//执行会记标准类别,\
//长途区号,\
//固定电话,\
//邮政编码,\
//电子邮箱,\
//网址,\
//是否有上一级法人,\
//上一级统信代码,\
//原组织代码,\
//上级单位名称,\
//是否设置总审计师,\
//总审计师职位层级,\
//总审任职方式,\
//是否设置内审机构,\
//内审机构名称,\
//领导机构,\
//是否独立设置内审机构,\
//财务部门,\
//法务部门,\
//内部控制部门,\
//纪检部门,\
//其他部门,\
//内审层级,\
//编制数量,\
//实有人数量,\
//专职人员数量,\
//拥有CIA人数,\
//硕士学历以上人数,\
//本科人数,\
//专科及以下人数,\
//高级职称人数,\
//中级职称人数,\
//初级职称人数,\
//无职称人数,\
//五十岁以上人数,\
//三十至五十岁岁人数,\
//三十岁以下人数,\
//审计数量,\
//会计数量,\
//经济数量,\
//法律数量,\
//管理数量,\
//信息技术数量,\
//工程数量,\
//其他数量,\
//统计负责人,\
//填表人,\
//联系电话,\
//填报日期) values ('%1','%2','%3','%4','%5','%6','%7','%8','%9',%10,\
//'%11','%12','%13','%14','%15','%16','%17','%18','%19','%20',\
//'%21','%22','%23','%24','%25','%26','%27','%28',%29,%30,\
//%31,%32,%33,'%34',%35,%36,%37,%38,%39,%40,\
//%41,%42,%43,%44,%45,%46,%47,%48,%49,%50,\
//%51,%52,%53,%54,%55,%56,'%57','%58','%59','%60'\
//)").arg(name).arg(creditCode).arg(comType).arg(business).arg(businessCode).arg(addr).arg(areaCode).arg(townCode).arg(scale).arg(people).
//                arg(representative).arg(standardType).arg(trunkCode).arg(fixedTel).arg(postCode).arg(email).arg(webSite).arg(hasUpLegal).arg(upCreditCode).arg(oldCreditCode).
//                arg(upName).arg(hasChiefDesigner).arg(ChiefDesignerLevel).arg(employmentMode).arg(hasSetIntervalAudit).arg(internalName).arg(leadingOrganization).arg(hasSetSeparateIA).arg(financeDepartment).arg(legalDepartment).
//                arg(internalConDepart).arg(disceplineInDepart).arg(otherDepart).arg(intavalAuditLeval).arg(organazationNum).arg(realNum).arg(professionalNum).arg(CIANum).arg(masterNum).arg(undergraduatesNum).
//                arg(juniorNum).arg(seniorNum).arg(intermediateNum).arg(primaryNum).arg(noTitleNum).arg(upFiftyOldNum).arg(upThirtyOldNum).arg(downThirtyOldNum).arg(auditNum).arg(accountingNum).
//                arg(economyNum).arg(lawNum).arg(managerNum).arg(itNum).arg(engineeringNum).arg(otherNum).arg(statisticalConOfficer).arg(personFilling).arg(officerTel).arg(fillingDateTime);
//        qDebug()<<"sql insert:"<<sql;
//        if(query.exec(sql)){
//            qDebug()<<"insert ok";
//        }else{
//            qDebug()<<"insert fail:"<<query.lastError().text();
//        }
//    }else{
//        // 更新
//        qDebug()<<"存在:"<<name;
//        sql = QString("update all_company_info set name='%1',code='%2',机构类型='%3',主要业务活动='%4',行业代码='%5',单位注册地及区域='%6',区域代码='%7',城乡代码='%8',单位规模='%9',从业期末人数=%10\
//,法定代表人='%11',执行会记标准类别='%12',长途区号='%13',固定电话='%14',邮政编码='%15',电子邮箱='%16',网址='%17',是否有上一级法人='%18',上一级统信代码='%19',原组织代码='%20'\
//,上级单位名称='%21',是否设置总审计师='%22',总审计师职位层级='%23',总审任职方式='%24',是否设置内审机构='%25',内审机构名称='%26',领导机构='%27',是否独立设置内审机构='%28',财务部门=%29,法务部门=%30\
//,内部控制部门=%31,纪检部门=%32,其他部门=%33,内审层级='%34',编制数量=%35,实有人数量=%36,专职人员数量=%37,拥有CIA人数=%38,硕士学历以上人数=%39,本科人数=%40\
//,专科及以下人数=%41,高级职称人数=%42,中级职称人数=%43,初级职称人数=%44,无职称人数=%45,五十岁以上人数=%46,三十至五十岁岁人数=%47,三十岁以下人数=%48,审计数量=%49,会计数量=%50\
//,经济数量=%51,法律数量=%52,管理数量=%53,信息技术数量=%54,工程数量=%55,其他数量=%56,统计负责人='%57',填表人='%58',联系电话='%59',填报日期='%60'").
//                arg(name).arg(creditCode).arg(comType).arg(business).arg(businessCode).arg(addr).arg(areaCode).arg(townCode).arg(scale).arg(people).
//                arg(representative).arg(standardType).arg(trunkCode).arg(fixedTel).arg(postCode).arg(email).arg(webSite).arg(hasUpLegal).arg(upCreditCode).arg(oldCreditCode).
//                arg(upName).arg(hasChiefDesigner).arg(ChiefDesignerLevel).arg(employmentMode).arg(hasSetIntervalAudit).arg(internalName).arg(leadingOrganization).arg(hasSetSeparateIA).arg(financeDepartment).arg(legalDepartment).
//                arg(internalConDepart).arg(disceplineInDepart).arg(otherDepart).arg(intavalAuditLeval).arg(organazationNum).arg(realNum).arg(professionalNum).arg(CIANum).arg(masterNum).arg(undergraduatesNum).
//                arg(juniorNum).arg(seniorNum).arg(intermediateNum).arg(primaryNum).arg(noTitleNum).arg(upFiftyOldNum).arg(upThirtyOldNum).arg(downThirtyOldNum).arg(auditNum).arg(accountingNum).
//                arg(economyNum).arg(lawNum).arg(managerNum).arg(itNum).arg(engineeringNum).arg(otherNum).arg(statisticalConOfficer).arg(personFilling).arg(officerTel).arg(fillingDateTime);
//        qDebug()<<"update sql:"<<sql;
//        if(query.exec(sql)){
//            qDebug()<<"update ok";
//        }else{
//            qDebug()<<"update fail:"<<query.lastError().text();
//        }
//    }
    // 独立出来一个函数,传一个结构体就ok
}
void ConverInfo2::readExcelFromPath(QString path)
{
    QAxObject excel("ket.Application");
    if(!excel.setControl("ket"
                         ".Application")){  // windows内核
        excel.setControl("Excel.Application"); // wps内核
    }
    excel.setProperty("Visible",false);
    excel.setProperty("DisplayAlerts",false);
    qDebug()<<"open:"<<path;
    qDebug()<<"excel:"<<excel.className();
    QAxObject * wbs = excel.querySubObject("WorkBooks");
    qDebug()<<"wbs:"<<wbs->className();
    QAxObject * wb = wbs->querySubObject("Open(QString&)",path); // 哪个对象是Open的返回值,哪个就可以保存
    //QAxObject* pWorkBook = excel.querySubObject("ActiveWorkBook");
    //QAxObject* pWorkSheets = pWorkBook->querySubObject("Sheets");//获取工作表
    //QAxObject * shs = wb->querySubObject("Sheets"); // WorkSheets 也可以
    QAxObject * shs = wb->querySubObject("WorkSheets"); // WorkSheets 也可以
//            // 指定单元格拿
//            QAxObject *cell = shs->querySubObject("Cells(int, int)",82,1);
//            qDebug()<<"Cells:82-0:"<<shs->querySubObject("Cells(int, int)",82,0)->dynamicCall("Value()").toString();
//            qDebug()<<"Cells:82-1:"<<cell->dynamicCall("Value()").toString();
    int cnt = shs->property("Count").toInt();
    qDebug()<<"cnt="<<cnt;
    for(int i=0;i<cnt;++i){
        QAxObject * sheet = shs->querySubObject("Item(int)", i+1);
        QString sheetName = sheet->property("Name").toString();
        qDebug()<<"sh name:"<<sheetName;
        QAxObject *usedRange = sheet->querySubObject("UsedRange");
        int rows = usedRange->querySubObject("Rows")->property("Count").toInt();
        int columns = usedRange->querySubObject("Columns")->property("Count").toInt();
        qDebug()<<"r--c:"<<rows<<columns;
        QVariant  val = usedRange->dynamicCall("Value"); // 拿到二维表格
        QVariantList valRows = val.toList();
        // 遍历每一项
//                for(int i=0;i<rows;++i){
//                    QVariantList valrow = valRows[i].toList();
//                    for(int j=0;j<columns;++j){
//                        QVariant valData = valrow[j];
//                        if(valData.isValid()){
//                            qDebug()<<"val:"<< i<< j << valData;
//                        }
//                    }
//                }
        // 实例化结构体,然后挨个赋值
        ComInfo curComInfo;
        // 统一信用代码
        QVariant uniCode = valRows[9].toList().at(3);
        if(uniCode.isValid()){
            ui->label_creditCode->setText(uniCode.toString());
            strcpy(curComInfo.creditCode,uniCode.toString().toLocal8Bit().data());
        }
        // 单位名称
        QVariant name = valRows[9].toList().at(8);
        if(name.isValid()){
            ui->label_name->setText(name.toString());
//            // 菜单相关  当上级公司为空上级时,自己当自己的上级,并且罗列进去当 本级
//            QTreeWidgetItem *top1 = new QTreeWidgetItem(ui->treeWidget);
//            top1->setText(0,name.toString());
            strcpy(curComInfo.name,name.toString().toLocal8Bit().data());
        }else{
            ui->label_name->setText("");
        }
        // 机构类型
        QVariant comType = valRows[12].toList().at(3);
        if(comType.isValid()){
            ui->label_comType->setText(comType.toString());
            strcpy(curComInfo.comType,comType.toString().toLocal8Bit().data());
        }else{
            ui->label_comType->setText("");
        }
        // 主要业务活动
        QString business;
        QVariant first = valRows[18].toList().at(2);
        if(first.isValid()){
            business.append(first.toString());
        }
        QVariant sec = valRows[18].toList().at(5);
        if(sec.isValid()){
            business += "、";
            business.append(sec.toString());
        }
        QVariant third = valRows[18].toList().at(8);
        if(third.isValid()){
            business += "、";
            business.append(third.toString());
        }
        if(business.size() > 0){
            ui->label_business->setText(business);
            ui->label_business->setToolTip(business);
            strcpy(curComInfo.business,business.toLocal8Bit().data());
        }else{
            ui->label_business->setText("");
        }
        // 业务代码
        QVariant busCode = valRows[19].toList().at(4);
        if(busCode.isValid()){
            ui->label_businessCode->setText(busCode.toString());
            strcpy(curComInfo.businessCode,busCode.toString().toLocal8Bit().data());
        }else{
            ui->label_businessCode->setText("");
        }
        // 注册地址
        QString addr="";
        QVariant province = valRows[21].toList().at(1); // 省份
        QVariant city = valRows[21].toList().at(4); // 城市
        QVariant district = valRows[21].toList().at(7); // 管辖区
        QVariant village = valRows[22].toList().at(2); // 乡镇
        QVariant street = valRows[22].toList().at(4); // 街道
        QVariant Sub = valRows[23].toList().at(2); // 街道办事处
        QVariant committee = valRows[25].toList().at(3); // 居委会
        //qDebug()<<province<<city<<district<<village<<street<<Sub<<committee;
        if(province.isValid()) addr += province.toString();
        if(city.isValid()) addr += city.toString();
        if(district.isValid()) addr += district.toString();
        if(village.isValid()) addr += village.toString();
        if(street.isValid()) addr += street.toString();
        if(Sub.isValid()) addr += Sub.toString();
        if(committee.isValid()) addr += committee.toString();
        if(addr.size()>10){
            ui->label_addr->setText(addr);
            strcpy(curComInfo.addr,addr.toLocal8Bit().data());
        }else{
            ui->label_addr->setText("");
        }
        // 区域代码
        QVariant areaCode = valRows[24].toList().at(2);
        if(areaCode.isValid()){
            ui->label_areaCode->setText(areaCode.toString());
            strcpy(curComInfo.areaCode,areaCode.toString().toLocal8Bit().data());
        }else{
            ui->label_areaCode->setText("");
        }
        // 城乡代码
        QVariant townCode = valRows[24].toList().at(6);
        if(townCode.isValid()) {
            ui->label_townCode->setText(townCode.toString());
            strcpy(curComInfo.townCode,townCode.toString().toLocal8Bit().data());
        }else{
            ui->label_townCode->setText("");
        }
        // 单位规模
        QVariant scale = valRows[25].toList().at(3);
        if(scale.isValid()){
            ui->label_scale->setText(scale.toString());
            strcpy(curComInfo.scale,scale.toString().toLocal8Bit().data());
        }else{
            ui->label_scale->setText("");
        }
        // 从业人数
        QVariant people = valRows[26].toList().at(6);
        if(people.isValid()) {
            ui->label_people->setText(people.toString());
            //strcpy(curComInfo.people,people.toString().toLocal8Bit().data());
            curComInfo.people = people.toInt();
        }else{
            ui->label_people->setText("");
        }
        // 法人
        QVariant representative = valRows[27].toList().at(4);
        if(representative.isValid()) {
            ui->label_representative->setText(representative.toString());
            strcpy(curComInfo.representative,representative.toString().toLocal8Bit().data());
        }else{
            ui->label_representative->setText("");
        }
        // 会计标准类别 standardType
        QVariant standardType = valRows[27].toList().at(8);
        if(standardType.isValid()){
            ui->label_standardType->setText(standardType.toString());
            strcpy(curComInfo.standardType,standardType.toString().toLocal8Bit());
        }else{
            ui->label_standardType->setText("");
        }
        // 长途区号
        QVariant trunkCode = valRows[31].toList().at(2);
        if(trunkCode.isValid()){
            ui->label_trunkCode->setText(trunkCode.toString());
            strcpy(curComInfo.trunkCode,trunkCode.toString().toLocal8Bit().data());
        }else{
            ui->label_trunkCode->setText("");
        }
        // 固定电话
        QVariant fixedTel = valRows[32].toList().at(2);
        if(fixedTel.isValid()) {
            ui->label_fixedTel->setText(fixedTel.toString());
            strcpy(curComInfo.fixedTel,fixedTel.toString().toLocal8Bit().data());
        }else{
            ui->label_fixedTel->setText("");
        }
        // 邮政编码
        QVariant postCode = valRows[33].toList().at(2);
        if(postCode.isValid()){
            ui->label_postCode->setText(postCode.toString());
            strcpy(curComInfo.postCode,postCode.toString().toLocal8Bit().data());
        }else{
            ui->label_postCode->setText("");
        }
        // 电子邮箱
        QVariant email = valRows[30].toList().at(5);
        if(email.isValid()) {
            ui->label_email->setText(email.toString());
            strcpy(curComInfo.email,email.toString().toLocal8Bit().data());
        }else{
            ui->label_email->setText("");
        }
        // 网址
        QVariant webSite = valRows[32].toList().at(5);
        if(webSite.isValid()) {
            ui->label_webSite->setText(webSite.toString());
            strcpy(curComInfo.webSite,webSite.toString().toLocal8Bit().data());
        }else{
            ui->label_webSite->setText("");
        }
        // 二、单位组织结构情况
        // 是否有上一级法人
        QVariant hasUpLegal = valRows[35].toList().at(4);
        if(hasUpLegal.isValid()){
            strcpy(curComInfo.hasUpLegal,hasUpLegal.toString().toLocal8Bit().data());
            qDebug()<<"has up legal"<<hasUpLegal;
        }
        // 上级法人单位统一社会信用代码
        QVariant upCreditCode = valRows[36].toList().at(7);
        if(upCreditCode.isValid()){
            strcpy(curComInfo.upCreditCode,upCreditCode.toString().toLocal8Bit().data());
            qDebug()<<"upCreditCode"<<upCreditCode;
        }else {
            qDebug()<<"upCreditCode fail"<<name;
        }
        // 原组织机构代码
        QVariant oldCreditCode = valRows[37].toList().at(7);
        if(oldCreditCode.isValid()){
            strcpy(curComInfo.oldCreditCode,oldCreditCode.toString().toLocal8Bit().data());
            qDebug()<<"oldCreditCode"<<oldCreditCode;
        }
        // 上一级单位详细名称
        QVariant upName = valRows[38].toList().at(7);
        if(upName.isValid()){
            strcpy(curComInfo.upName,upName.toString().toLocal8Bit().data());
            qDebug()<<"upName"<<upName;
        }
        // 总审计师与内审机构基本情况
        // 是否设置总审计师
        QVariant hasChiefDesigner = valRows[40].toList().at(4);
        if(hasChiefDesigner.isValid()){
            strcpy(curComInfo.hasChiefDesigner,hasChiefDesigner.toString().toLocal8Bit().data());
            qDebug()<<"hasChiefDesigner"<<hasChiefDesigner;
        }
        // 总审计师职位层级
        QVariant ChiefDesignerLevel = valRows[41].toList().at(4);
        if(ChiefDesignerLevel.isValid()){
            strcpy(curComInfo.ChiefDesignerLevel,ChiefDesignerLevel.toString().toLocal8Bit().data());
            qDebug()<<"ChiefDesignerLevel"<<ChiefDesignerLevel;
        }
        // 总审计师任职方式
        QVariant employmentMode = valRows[44].toList().at(4);
        if(employmentMode.isValid()){
            strcpy(curComInfo.employmentMode,employmentMode.toString().toLocal8Bit().data());
            qDebug()<<"employmentMode"<<employmentMode;
        }
        // 是否设置内审机构
        QVariant hasSetIntervalAudit = valRows[47].toList().at(4);
        if(hasSetIntervalAudit.isValid()){
            strcpy(curComInfo.hasSetIntervalAudit,hasSetIntervalAudit.toString().toLocal8Bit().data());
            qDebug()<<"hasSetIntervalAudit"<<hasSetIntervalAudit;
        }
        // 内审机构名称
        QVariant internalName = valRows[48].toList().at(4);
        if(internalName.isValid()){
            strcpy(curComInfo.internalName,internalName.toString().toLocal8Bit().data());
            qDebug()<<"internalName"<<internalName;
        }
        // 内审工作的领导机构
        QVariant leadingOrganization = valRows[49].toList().at(4);
        if(leadingOrganization.isValid()){
            strcpy(curComInfo.leadingOrganization,leadingOrganization.toString().toLocal8Bit().data());
            qDebug()<<"leadingOrganization"<<leadingOrganization;
        }
        // 是否独立设置内审机构
        QVariant hasSetSeparateIA = valRows[53].toList().at(4);
        if(hasSetSeparateIA.isValid()){
            strcpy(curComInfo.hasSetSeparateIA,hasSetSeparateIA.toString().toLocal8Bit().data());
            qDebug()<<"hasSetSeparateIA"<<hasSetSeparateIA;
        }
        // 合并设置 财务部门   复选框
        QVariant financeDepartment = valRows[55].toList().at(1);
        if(financeDepartment.isValid()){
            //strcpy(curComInfo.financeDepartment,financeDepartment.toString().toLocal8Bit().data());
            curComInfo.financeDepartment = financeDepartment.toBool();
            qDebug()<<"financeDepartment"<<financeDepartment;
        }
        // 法务部门、内部控制部门、纪检部门、其他部门
        // 需要特殊获取
        QAxObject *checkBox = sheet->querySubObject("CheckBoxes(const QString&)", QString::fromLocal8Bit("财务部门"));
        if(checkBox){
            qDebug()<<"取到财务部门"<<checkBox->property("Value2").toInt()<<checkBox->property("Value").toInt()<<checkBox->property("Value2").toBool();
            if(checkBox->property("Value").toBool()){
                qDebug()<<"财务部门勾选";
            }else{
                qDebug()<<"财务部门未勾选";
            }
        }else{
            qDebug()<<"未取到财务部门";
        }
        QAxObject *checkBox1 = sheet->querySubObject("CheckBoxes(const QString&)", QString::fromLocal8Bit("法务部门"));
        if(checkBox1){
            qDebug()<<"取到法务部门"<<checkBox1->property("Value").toInt();
            if(checkBox1->property("Value").toBool()){
                qDebug()<<"法务部门勾选";
            }else{
                qDebug()<<"法务部门未勾选";
            }
        }else{
            qDebug()<<"未取到法务部门";
        }
        // 内审机构层级
        QVariant intavalAuditLeval = valRows[56].toList().at(4);
        if(intavalAuditLeval.isValid()){
            strcpy(curComInfo.intavalAuditLeval,intavalAuditLeval.toString().toLocal8Bit().data());
            qDebug()<<"intavalAuditLeval"<<intavalAuditLeval;
        }
        // 四、内审人员配备基本情况
        // 编制数
        QVariant organazationNum = valRows[56].toList().at(4);
        if(organazationNum.isValid()){
            curComInfo.organazationNum = organazationNum.toInt();
            qDebug()<<"organazationNum"<<organazationNum;
        }
        // 实有人员数
        QVariant realNum = valRows[56].toList().at(4);
        if(realNum.isValid()){
            curComInfo.realNum = realNum.toInt();
            qDebug()<<"realNum"<<realNum;
        }
        // 专职人员数
        QVariant professionalNum = valRows[56].toList().at(4);
        if(professionalNum.isValid()){
            curComInfo.professionalNum = professionalNum.toInt();
            qDebug()<<"professionalNum"<<professionalNum;
        }
        // 拥有CIA人员数
        QVariant CIANum = valRows[56].toList().at(4);
        if(CIANum.isValid()){
            curComInfo.CIANum = CIANum.toInt();
            qDebug()<<"CIANum"<<CIANum;
        }
        // 学历:硕士及以上 人员数
        QVariant masterNum = valRows[56].toList().at(4);
        if(masterNum.isValid()){
            curComInfo.masterNum = masterNum.toInt();
            qDebug()<<"masterNum"<<masterNum;
        }
        // 大学本科
        QVariant undergraduatesNum = valRows[56].toList().at(4);
        if(undergraduatesNum.isValid()){
            curComInfo.undergraduatesNum = undergraduatesNum.toInt();
            qDebug()<<"undergraduatesNum"<<undergraduatesNum;
        }
        // 专科及以下
        QVariant juniorNum = valRows[56].toList().at(4);
        if(juniorNum.isValid()){
            curComInfo.juniorNum = juniorNum.toInt();
            qDebug()<<"juniorNum"<<juniorNum;
        }
        // 职称 高级职称
        QVariant seniorNum = valRows[56].toList().at(4);
        if(seniorNum.isValid()){
            curComInfo.seniorNum = seniorNum.toInt();
            qDebug()<<"seniorNum"<<seniorNum;
        }
        // 中级职称
        QVariant intermediateNum = valRows[56].toList().at(4);
        if(intermediateNum.isValid()){
            curComInfo.intermediateNum = intermediateNum.toInt();
            qDebug()<<"intermediateNum"<<intermediateNum;
        }
        // 初级职称
        QVariant primaryNum = valRows[56].toList().at(4);
        if(primaryNum.isValid()){
            curComInfo.primaryNum = primaryNum.toInt();
            qDebug()<<"primaryNum"<<primaryNum;
        }
        // 无职称
        QVariant noTitleNum = valRows[56].toList().at(4);
        if(noTitleNum.isValid()){
            curComInfo.noTitleNum = noTitleNum.toInt();
            qDebug()<<"noTitleNum"<<noTitleNum;
        }
        // 年龄结构 50岁以上
        QVariant upFiftyOldNum = valRows[56].toList().at(4);
        if(upFiftyOldNum.isValid()){
            curComInfo.upFiftyOldNum = upFiftyOldNum.toInt();
            qDebug()<<"upFiftyOldNum"<<upFiftyOldNum;
        }
        // 30-50岁
        QVariant upThirtyOldNum = valRows[56].toList().at(4);
        if(upThirtyOldNum.isValid()){
            curComInfo.upThirtyOldNum = upThirtyOldNum.toInt();
            qDebug()<<"upThirtyOldNum"<<upThirtyOldNum;
        }
        // 30岁以下
        QVariant downThirtyOldNum = valRows[56].toList().at(4);
        if(downThirtyOldNum.isValid()){
            curComInfo.downThirtyOldNum = downThirtyOldNum.toInt();
            qDebug()<<"downThirtyOldNum"<<downThirtyOldNum;
        }
        // 知识结构 审计
        QVariant auditNum = valRows[56].toList().at(4);
        if(auditNum.isValid()){
            curComInfo.auditNum = auditNum.toInt();
            qDebug()<<"auditNum"<<auditNum;
        }
        // 会计
        QVariant accountingNum = valRows[56].toList().at(4);
        if(accountingNum.isValid()){
            curComInfo.accountingNum = accountingNum.toInt();
            qDebug()<<"accountingNum"<<accountingNum;
        }
        // 经济
        QVariant economyNum = valRows[56].toList().at(4);
        if(economyNum.isValid()){
            curComInfo.economyNum = economyNum.toInt();
            qDebug()<<"economyNum"<<economyNum;
        }
        // 法律
        QVariant lawNum = valRows[56].toList().at(4);
        if(lawNum.isValid()){
            curComInfo.lawNum = lawNum.toInt();
            qDebug()<<"lawNum"<<lawNum;
        }
        // 管理
        QVariant managerNum = valRows[56].toList().at(4);
        if(managerNum.isValid()){
            curComInfo.managerNum = managerNum.toInt();
            qDebug()<<"managerNum"<<managerNum;
        }
        // 信息技术
        QVariant itNum = valRows[56].toList().at(4);
        if(itNum.isValid()){
            curComInfo.itNum = itNum.toInt();
            qDebug()<<"itNum"<<itNum;
        }
        // 工程
        QVariant engineeringNum = valRows[56].toList().at(4);
        if(engineeringNum.isValid()){
            curComInfo.engineeringNum = engineeringNum.toInt();
            qDebug()<<"engineeringNum"<<engineeringNum;
        }
        // 其他
        QVariant otherNum = valRows[56].toList().at(4);
        if(otherNum.isValid()){
            curComInfo.otherNum = otherNum.toInt();
            qDebug()<<"otherNum"<<otherNum;
        }
        // 后面的4个信息
        // 统计负责人
        QVariant statisticalConOfficer = valRows[81].toList().at(1);
        if(statisticalConOfficer.isValid()){
            strcpy(curComInfo.statisticalConOfficer,statisticalConOfficer.toString().toLocal8Bit().data());
            qDebug()<<"statisticalConOfficer"<<statisticalConOfficer;
        }else{
            qDebug()<<"statisticalConOfficer fail:"<<name.toString();
        }
        // 填表人
        QVariant personFilling = valRows[81].toList().at(4);
        if(personFilling.isValid()){
            strcpy(curComInfo.personFilling,personFilling.toString().toLocal8Bit().data());
            qDebug()<<"personFilling"<<personFilling;
        }
        // 联系电话
        QVariant officerTel = valRows[82].toList().at(1);
        if(officerTel.isValid()){
            strcpy(curComInfo.officerTel,officerTel.toString().toLocal8Bit().data());
            qDebug()<<"officerTel"<<officerTel;
        }
        // 填报日期
        QVariant fillingDateTime = valRows[82].toList().at(4);
        if(fillingDateTime.isValid()){
            strcpy(curComInfo.fillingDateTime,fillingDateTime.toString().toLocal8Bit().data());
            qDebug()<<"fillingDateTime"<<fillingDateTime;
        }
        // 最后存到map中
        m_nameAndComInfos[name.toString()]=curComInfo;
        // 添加左边树形图相关
        // 菜单相关  当上级公司为空上级时,自己当自己的上级,并且罗列进去当 本级
        addTreeWidgetNode(upName,name);
//        if(upName.isValid()){
//            if(name.isValid()){
//                m_treeNodes[upName.toString()].push_back(name.toString());
//            }
//        }else{
//            if(name.isValid()){
//                m_treeNodes[name.toString()].push_back(name.toString());
//            }
//        }
    }
    wbs->dynamicCall("Close()");
    excel.dynamicCall("Quit(void)");
    qDebug()<<"单位信息数量:"<<m_nameAndComInfos.size();
    emit updateComboListSignal(m_nameAndComInfos); // 更新组合下拉框的单位信息
}
void ConverInfo2::createTreeNode(){
    // 先清除当前树上的所有节点
    ui->treeWidget->clear();
    qDebug()<<"构建树形列表"<<m_treeNodes.size();
    for(auto iter=m_treeNodes.begin();iter != m_treeNodes.end();iter++)
    {
        // 先构建一个每级的父节点
        addTreeWidgetNode(iter.key(),iter.key());
        // 再添加孩子节点
        for(QString node:iter.value()){
            qDebug()<<iter.key()<<node;
            if(iter.key() != node){
                addTreeWidgetNode(iter.key(),node);
            }
        }
    }
}
void ConverInfo2::disableWheelEvent()
{
    ui->comboBox_ChiefDesignerLevel->installEventFilter(this);
    ui->comboBox_comType->installEventFilter(this);
    ui->comboBox_employmentMode->installEventFilter(this);
    ui->comboBox_hasChiefDesigner->installEventFilter(this);
    ui->comboBox_hasSetIntervalAudit->installEventFilter(this);
    ui->comboBox_hasSetSeparateIA->installEventFilter(this);
    ui->comboBox_hasUpLegal->installEventFilter(this);
    ui->comboBox_intavalAuditLeval->installEventFilter(this);
    ui->comboBox_leadingOrganization->installEventFilter(this);
    ui->comboBox_scale->installEventFilter(this);
    ui->comboBox_standardType->installEventFilter(this);
}
bool ConverInfo2::eventFilter(QObject *watched, QEvent *event)
{
    QString cls = watched->metaObject()->className();
    if(cls == "QComboBox"){
        //qDebug()<<"发现下拉框";
        if(event->type() == QEvent::Wheel){
            //qDebug()<<"使用了滚轮";
            return true;  // 返回真表示禁用,返回假则能用
        }
    }else{
        qDebug()<<"其他类型:"<<cls;
    }
    return QMainWindow::eventFilter(watched,event);
}
void ConverInfo2::saveToSQL(ComInfo &info)
{
    // 更新到数据库
    // 先判断是不是已经存在公司名了,若已存在,则更新,不存在则插入
    QString sql = QString("select id,name from all_company_info where name='%1'").arg(name);
    QString sql = QString("select id,name from all_company_info where name='%1'").arg(QString::fromLocal8Bit(info.name));
    qDebug()<<"sql:"<<sql;
    QSqlQuery query;
    int rowCnt = 0;
@@ -886,10 +1774,11 @@
        while (query.next()) {
            rowCnt++;
        }
        qDebug()<<"rowCnt:"<<rowCnt;
    }
    if(rowCnt == 0){
        // 不存在,则插入一条新数据
        qDebug()<<"不存在:"<<name;
        qDebug()<<"不存在:"<<QString::fromLocal8Bit(info.name);
        sql = QString("insert into all_company_info (name,\
code,\
机构类型,\
@@ -955,12 +1844,12 @@
%31,%32,%33,'%34',%35,%36,%37,%38,%39,%40,\
%41,%42,%43,%44,%45,%46,%47,%48,%49,%50,\
%51,%52,%53,%54,%55,%56,'%57','%58','%59','%60'\
)").arg(name).arg(creditCode).arg(comType).arg(business).arg(businessCode).arg(addr).arg(areaCode).arg(townCode).arg(scale).arg(people).
                arg(representative).arg(standardType).arg(trunkCode).arg(fixedTel).arg(postCode).arg(email).arg(webSite).arg(hasUpLegal).arg(upCreditCode).arg(oldCreditCode).
                arg(upName).arg(hasChiefDesigner).arg(ChiefDesignerLevel).arg(employmentMode).arg(hasSetIntervalAudit).arg(internalName).arg(leadingOrganization).arg(hasSetSeparateIA).arg(financeDepartment).arg(legalDepartment).
                arg(internalConDepart).arg(disceplineInDepart).arg(otherDepart).arg(intavalAuditLeval).arg(organazationNum).arg(realNum).arg(professionalNum).arg(CIANum).arg(masterNum).arg(undergraduatesNum).
                arg(juniorNum).arg(seniorNum).arg(intermediateNum).arg(primaryNum).arg(noTitleNum).arg(upFiftyOldNum).arg(upThirtyOldNum).arg(downThirtyOldNum).arg(auditNum).arg(accountingNum).
                arg(economyNum).arg(lawNum).arg(managerNum).arg(itNum).arg(engineeringNum).arg(otherNum).arg(statisticalConOfficer).arg(personFilling).arg(officerTel).arg(fillingDateTime);
)").arg(QString::fromLocal8Bit(info.name)).arg(QString::fromLocal8Bit(info.creditCode)).arg(QString::fromLocal8Bit(info.comType)).arg(QString::fromLocal8Bit(info.business)).arg(QString::fromLocal8Bit(info.businessCode)).arg(QString::fromLocal8Bit(info.addr)).arg(QString::fromLocal8Bit(info.areaCode)).arg(QString::fromLocal8Bit(info.townCode)).arg(QString::fromLocal8Bit(info.scale)).arg(info.people).
                arg(QString::fromLocal8Bit(info.representative)).arg(QString::fromLocal8Bit(info.standardType)).arg(QString::fromLocal8Bit(info.trunkCode)).arg(QString::fromLocal8Bit(info.fixedTel)).arg(info.postCode).arg(QString::fromLocal8Bit(info.email)).arg(QString::fromLocal8Bit(info.webSite)).arg(QString::fromLocal8Bit(info.hasUpLegal)).arg(QString::fromLocal8Bit(info.upCreditCode)).arg(QString::fromLocal8Bit(info.oldCreditCode)).
                arg(QString::fromLocal8Bit(info.upName)).arg(QString::fromLocal8Bit(info.hasChiefDesigner)).arg(QString::fromLocal8Bit(info.ChiefDesignerLevel)).arg(QString::fromLocal8Bit(info.employmentMode)).arg(QString::fromLocal8Bit(info.hasSetIntervalAudit)).arg(QString::fromLocal8Bit(info.internalName)).arg(QString::fromLocal8Bit(info.leadingOrganization)).arg(QString::fromLocal8Bit(info.hasSetSeparateIA)).arg(info.financeDepartment).arg(info.legalDepartment).
                arg(info.internalConDepart).arg(info.disceplineInDepart).arg(info.otherDepart).arg(QString::fromLocal8Bit(info.intavalAuditLeval)).arg(info.organazationNum).arg(info.realNum).arg(info.professionalNum).arg(info.CIANum).arg(info.masterNum).arg(info.undergraduatesNum).
                arg(info.juniorNum).arg(info.seniorNum).arg(info.intermediateNum).arg(info.primaryNum).arg(info.noTitleNum).arg(info.upFiftyOldNum).arg(info.upThirtyOldNum).arg(info.downThirtyOldNum).arg(info.auditNum).arg(info.accountingNum).
                arg(info.economyNum).arg(info.lawNum).arg(info.managerNum).arg(info.itNum).arg(info.engineeringNum).arg(info.otherNum).arg(QString::fromLocal8Bit(info.statisticalConOfficer)).arg(QString::fromLocal8Bit(info.personFilling)).arg(QString::fromLocal8Bit(info.officerTel)).arg(QString::fromLocal8Bit(info.fillingDateTime));
        qDebug()<<"sql insert:"<<sql;
@@ -972,19 +1861,25 @@
    }else{
        // 更新
        qDebug()<<"存在:"<<name;
        qDebug()<<"存在:"<<QString::fromLocal8Bit(info.name);
        sql = QString("update all_company_info set name='%1',code='%2',机构类型='%3',主要业务活动='%4',行业代码='%5',单位注册地及区域='%6',区域代码='%7',城乡代码='%8',单位规模='%9',从业期末人数=%10\
,法定代表人='%11',执行会记标准类别='%12',长途区号='%13',固定电话='%14',邮政编码='%15',电子邮箱='%16',网址='%17',是否有上一级法人='%18',上一级统信代码='%19',原组织代码='%20'\
,上级单位名称='%21',是否设置总审计师='%22',总审计师职位层级='%23',总审任职方式='%24',是否设置内审机构='%25',内审机构名称='%26',领导机构='%27',是否独立设置内审机构='%28',财务部门=%29,法务部门=%30\
,内部控制部门=%31,纪检部门=%32,其他部门=%33,内审层级='%34',编制数量=%35,实有人数量=%36,专职人员数量=%37,拥有CIA人数=%38,硕士学历以上人数=%39,本科人数=%40\
,专科及以下人数=%41,高级职称人数=%42,中级职称人数=%43,初级职称人数=%44,无职称人数=%45,五十岁以上人数=%46,三十至五十岁岁人数=%47,三十岁以下人数=%48,审计数量=%49,会计数量=%50\
,经济数量=%51,法律数量=%52,管理数量=%53,信息技术数量=%54,工程数量=%55,其他数量=%56,统计负责人='%57',填表人='%58',联系电话='%59',填报日期='%60'").
                arg(name).arg(creditCode).arg(comType).arg(business).arg(businessCode).arg(addr).arg(areaCode).arg(townCode).arg(scale).arg(people).
                arg(representative).arg(standardType).arg(trunkCode).arg(fixedTel).arg(postCode).arg(email).arg(webSite).arg(hasUpLegal).arg(upCreditCode).arg(oldCreditCode).
                arg(upName).arg(hasChiefDesigner).arg(ChiefDesignerLevel).arg(employmentMode).arg(hasSetIntervalAudit).arg(internalName).arg(leadingOrganization).arg(hasSetSeparateIA).arg(financeDepartment).arg(legalDepartment).
                arg(internalConDepart).arg(disceplineInDepart).arg(otherDepart).arg(intavalAuditLeval).arg(organazationNum).arg(realNum).arg(professionalNum).arg(CIANum).arg(masterNum).arg(undergraduatesNum).
                arg(juniorNum).arg(seniorNum).arg(intermediateNum).arg(primaryNum).arg(noTitleNum).arg(upFiftyOldNum).arg(upThirtyOldNum).arg(downThirtyOldNum).arg(auditNum).arg(accountingNum).
                arg(economyNum).arg(lawNum).arg(managerNum).arg(itNum).arg(engineeringNum).arg(otherNum).arg(statisticalConOfficer).arg(personFilling).arg(officerTel).arg(fillingDateTime);
,经济数量=%51,法律数量=%52,管理数量=%53,信息技术数量=%54,工程数量=%55,其他数量=%56,统计负责人='%57',填表人='%58',联系电话='%59',填报日期='%60' where name='%1'").arg(QString::fromLocal8Bit(info.name)).arg(QString::fromLocal8Bit(info.creditCode)).arg(QString::fromLocal8Bit(info.comType)).arg(QString::fromLocal8Bit(info.business)).arg(QString::fromLocal8Bit(info.businessCode)).arg(QString::fromLocal8Bit(info.addr)).arg(QString::fromLocal8Bit(info.areaCode)).arg(QString::fromLocal8Bit(info.townCode)).arg(QString::fromLocal8Bit(info.scale)).arg(info.people).
                arg(QString::fromLocal8Bit(info.representative)).arg(QString::fromLocal8Bit(info.standardType)).arg(QString::fromLocal8Bit(info.trunkCode)).arg(QString::fromLocal8Bit(info.fixedTel)).arg(info.postCode).arg(QString::fromLocal8Bit(info.email)).arg(QString::fromLocal8Bit(info.webSite)).arg(QString::fromLocal8Bit(info.hasUpLegal)).arg(QString::fromLocal8Bit(info.upCreditCode)).arg(QString::fromLocal8Bit(info.oldCreditCode)).
                arg(QString::fromLocal8Bit(info.upName)).arg(QString::fromLocal8Bit(info.hasChiefDesigner)).arg(QString::fromLocal8Bit(info.ChiefDesignerLevel)).arg(QString::fromLocal8Bit(info.employmentMode)).arg(QString::fromLocal8Bit(info.hasSetIntervalAudit)).arg(QString::fromLocal8Bit(info.internalName)).arg(QString::fromLocal8Bit(info.leadingOrganization)).arg(QString::fromLocal8Bit(info.hasSetSeparateIA)).arg(info.financeDepartment).arg(info.legalDepartment).
                arg(info.internalConDepart).arg(info.disceplineInDepart).arg(info.otherDepart).arg(QString::fromLocal8Bit(info.intavalAuditLeval)).arg(info.organazationNum).arg(info.realNum).arg(info.professionalNum).arg(info.CIANum).arg(info.masterNum).arg(info.undergraduatesNum).
                arg(info.juniorNum).arg(info.seniorNum).arg(info.intermediateNum).arg(info.primaryNum).arg(info.noTitleNum).arg(info.upFiftyOldNum).arg(info.upThirtyOldNum).arg(info.downThirtyOldNum).arg(info.auditNum).arg(info.accountingNum).
                arg(info.economyNum).arg(info.lawNum).arg(info.managerNum).arg(info.itNum).arg(info.engineeringNum).arg(info.otherNum).arg(QString::fromLocal8Bit(info.statisticalConOfficer)).arg(QString::fromLocal8Bit(info.personFilling)).arg(QString::fromLocal8Bit(info.officerTel)).arg(QString::fromLocal8Bit(info.fillingDateTime));
                /*.
                arg(QString::fromLocal8Bit(info.name)).arg(QString::fromLocal8Bit(info.creditCode)).arg(info.comType).arg(info.business).arg(info.businessCode).arg(info.addr).arg(info.areaCode).arg(info.townCode).arg(info.scale).arg(info.people).
                arg(info.representative).arg(info.standardType).arg(info.trunkCode).arg(info.fixedTel).arg(info.postCode).arg(info.email).arg(info.webSite).arg(info.hasUpLegal).arg(info.upCreditCode).arg(info.oldCreditCode).
                arg(info.upName).arg(info.hasChiefDesigner).arg(info.ChiefDesignerLevel).arg(info.employmentMode).arg(info.hasSetIntervalAudit).arg(info.internalName).arg(info.leadingOrganization).arg(info.hasSetSeparateIA).arg(info.financeDepartment).arg(info.legalDepartment).
                arg(info.internalConDepart).arg(info.disceplineInDepart).arg(info.otherDepart).arg(info.intavalAuditLeval).arg(info.organazationNum).arg(info.realNum).arg(info.professionalNum).arg(info.CIANum).arg(info.masterNum).arg(info.undergraduatesNum).
                arg(info.juniorNum).arg(info.seniorNum).arg(info.intermediateNum).arg(info.primaryNum).arg(info.noTitleNum).arg(info.upFiftyOldNum).arg(info.upThirtyOldNum).arg(info.downThirtyOldNum).arg(info.auditNum).arg(info.accountingNum).
                arg(info.economyNum).arg(info.lawNum).arg(info.managerNum).arg(info.itNum).arg(info.engineeringNum).arg(info.otherNum).arg(info.statisticalConOfficer).arg(info.personFilling).arg(info.officerTel).arg(info.fillingDateTime);*/
        qDebug()<<"update sql:"<<sql;
        if(query.exec(sql)){
@@ -994,3 +1889,211 @@
        }
    }
}
void ConverInfo2::readAllSQLData()
{
    QString sql = QString("select * from all_company_info");
    qDebug()<<"sql:"<<sql;
    QSqlQuery query;
    int rowCnt = 0;
    if(query.exec(sql)){
        qDebug()<<"size:"<<query.size();
        while (query.next()) {
            rowCnt++;
            ComInfo info; // 单位信息结构体
            // 基本情况
            strcpy(info.name,query.value(1).toString().toLocal8Bit().data());
            strcpy(info.creditCode,query.value(2).toString().toLocal8Bit().data());
            strcpy(info.comType,query.value(3).toString().toLocal8Bit().data());
            strcpy(info.business,query.value(4).toString().toLocal8Bit().data());
            strcpy(info.businessCode,query.value(5).toString().toLocal8Bit().data());
            strcpy(info.addr,query.value(6).toString().toLocal8Bit().data());
            strcpy(info.areaCode,query.value(7).toString().toLocal8Bit().data());
            strcpy(info.townCode,query.value(8).toString().toLocal8Bit().data());
            strcpy(info.scale,query.value(9).toString().toLocal8Bit().data());
            info.people = query.value(10).toInt();
            strcpy(info.representative,query.value(11).toString().toLocal8Bit().data());
            strcpy(info.standardType,query.value(12).toString().toLocal8Bit().data());
            strcpy(info.trunkCode,query.value(13).toString().toLocal8Bit().data());
            strcpy(info.fixedTel,query.value(14).toString().toLocal8Bit().data());
            strcpy(info.postCode,query.value(15).toString().toLocal8Bit().data());
            strcpy(info.email,query.value(16).toString().toLocal8Bit().data());
            strcpy(info.webSite,query.value(17).toString().toLocal8Bit().data());
            // 单位组织结构情况
            strcpy(info.hasUpLegal,query.value(18).toString().toLocal8Bit().data());
            strcpy(info.upCreditCode,query.value(19).toString().toLocal8Bit().data());
            strcpy(info.oldCreditCode,query.value(20).toString().toLocal8Bit().data());
            strcpy(info.upName,query.value(21).toString().toLocal8Bit().data());
            // 总审计师与内部审计机构基本情况
            strcpy(info.hasChiefDesigner,query.value(22).toString().toLocal8Bit().data());
            strcpy(info.ChiefDesignerLevel,query.value(23).toString().toLocal8Bit().data());
            strcpy(info.employmentMode,query.value(24).toString().toLocal8Bit().data());
            strcpy(info.hasSetIntervalAudit,query.value(25).toString().toLocal8Bit().data());
            strcpy(info.internalName,query.value(26).toString().toLocal8Bit().data());
            strcpy(info.leadingOrganization,query.value(27).toString().toLocal8Bit().data());
            strcpy(info.hasSetSeparateIA,query.value(28).toString().toLocal8Bit().data());
            info.financeDepartment = query.value(29).toBool();
            info.legalDepartment = query.value(30).toBool();
            info.internalConDepart = query.value(31).toBool();
            info.disceplineInDepart = query.value(32).toBool();
            info.otherDepart = query.value(33).toBool();
            strcpy(info.intavalAuditLeval,query.value(34).toString().toLocal8Bit().data());
            // 内部审计人员配备基本情况
            info.organazationNum = query.value(35).toInt();
            info.realNum = query.value(36).toInt();
            info.professionalNum = query.value(37).toInt();
            info.CIANum = query.value(38).toInt();
            info.masterNum = query.value(39).toInt();
            info.undergraduatesNum = query.value(40).toInt();
            info.juniorNum = query.value(41).toInt();
            info.seniorNum = query.value(42).toInt();
            info.intermediateNum = query.value(43).toInt();
            info.primaryNum = query.value(44).toInt();
            info.noTitleNum = query.value(45).toInt();
            info.upFiftyOldNum = query.value(46).toInt();
            info.upThirtyOldNum = query.value(47).toInt();
            info.downThirtyOldNum = query.value(48).toInt();
            info.auditNum = query.value(49).toInt();
            info.accountingNum = query.value(50).toInt();
            info.economyNum = query.value(51).toInt();
            info.lawNum = query.value(52).toInt();
            info.managerNum = query.value(53).toInt();
            info.itNum = query.value(54).toInt();
            info.engineeringNum = query.value(55).toInt();
            info.otherNum = query.value(56).toInt();
            // 后面的4个信息
            strcpy(info.statisticalConOfficer,query.value(57).toString().toLocal8Bit().data());
            strcpy(info.personFilling,query.value(58).toString().toLocal8Bit().data());
            strcpy(info.officerTel,query.value(59).toString().toLocal8Bit().data());
            strcpy(info.fillingDateTime,query.value(60).toString().toLocal8Bit().data());
            // 存信息到map
            QString name = query.value(1).toString();
            m_nameAndComInfos[query.value(1).toString()] = info;
            // 存名字到单位树map
            QString upName = query.value(21).toString();
            if(!upName.isEmpty()){
                //m_treeNodes[upName].push_back(name);
                m_treeNodes[upName].insert(name);
            }else{
                //m_treeNodes[name].push_back(name);
                //m_treeNodes[upName].insert(name);
                if(!name.isEmpty()){
                    //m_treeNodes[name.toString()].push_back(name.toString());
                    m_treeNodes[name].insert(name);
                }
            }
            qDebug()<<"name"<<name<<"upName"<<upName;
        }
        qDebug()<<"rowCnt:"<<rowCnt;
    }
}
void ConverInfo2::deleteAllByName(QString name)
{
    // 数据库表有:封面信息表 all_company_info
    // 综合信息表 comprehensive_entry_info
    // 三合一的表 standing_book_info
    QString first_sql = QString("delete from all_company_info where name='%1'").arg(name);
    qDebug()<<"first_sql:"<<first_sql;
    QString second_sql = QString("delete from comprehensive_entry_info where name='%1'").arg(name);
    qDebug()<<"second_sql:"<<second_sql;
    QString three_sql = QString("delete from standing_book_info where 责任主体名称='%1'").arg(name);
    qDebug()<<"three_sql:"<<three_sql;
    QSqlQuery query;
    if(query.exec(first_sql))
    {
        qDebug()<<"first_sql run ok";
    }
    if(query.exec(second_sql))
    {
        qDebug()<<"second_sql run ok";
    }
    if(query.exec(three_sql))
    {
        qDebug()<<"three_sql run ok";
    }
}
void ConverInfo2::addTreeWidgetNode(QVariant upName,QVariant name){
    // 添加左边树形图相关
    // 菜单相关  当上级公司为空上级时,自己当自己的上级,并且罗列进去当 本级
    if(upName.isValid()) // 有效
    {
        // 判断顶层树节点是否已经存在
        QTreeWidgetItem *top = nullptr;
        for(int k=0;k<ui->treeWidget->topLevelItemCount();++k){
            QTreeWidgetItem *tmp = ui->treeWidget->topLevelItem(k);
            qDebug()<<k<<tmp->text(0)<<upName.toString();
            int pos = tmp->text(0).indexOf(upName.toString()+"(汇总)");
            if(upName.toString()+"(汇总)" == tmp->text(0) || pos != -1){
                top = tmp;
                break;
            }
        }
        if(name.isValid()){
            if(top){ // 存在,则添加到孩子列表中
                QTreeWidgetItem *top1 = new QTreeWidgetItem(top);
                top1->setText(0,name.toString());
                top->setText(0,upName.toString()+"(汇总)下级数:"+QString::number(top->childCount()-1));
            }else{ // 不存在,则新建一个列表
                QTreeWidgetItem *top1 = new QTreeWidgetItem(ui->treeWidget);
                top1->setText(0,name.toString()+"(汇总)");
                QTreeWidgetItem *top2 = new QTreeWidgetItem(top1);
                top2->setText(0,name.toString()+"(本级)");
                top1->setText(0,name.toString()+"(汇总)下级数:"+QString::number(top1->childCount()-1));
            }
        }
    }else{
        qDebug()<<"没发现上一级,只能自己当"<<name;
        if(name.isValid()){
            QTreeWidgetItem *top1 = new QTreeWidgetItem(ui->treeWidget);
            top1->setText(0,name.toString()+"(汇总)");
            QTreeWidgetItem *top2 = new QTreeWidgetItem(top1);
            top2->setText(0,name.toString()+"(本级)");
            top1->setText(0,name.toString()+"(汇总)下级数:"+QString::number(top1->childCount()-1));
        }
    }
}
void ConverInfo2::on_pushButton_laodFile_clicked()
{
    QString path = QFileDialog::getOpenFileName(this,"选择表格:单位及内部审计机构基本情况表","./","excel(*基本情况表*.xls)");
    qDebug()<<"path:"<<path;
    if(path.size() > 1){
        readExcelFromPath(path);
    }
}
void ConverInfo2::showExcelSlot()
{
    readInfo(); // 加载表格
}
void ConverInfo2::on_pushButton_save_to_file_clicked()
{
    QString name = ui->lineEdit_name->text();
    if(name.size()== 0){
        QMessageBox::information(this,"单位名称为空,请先选中一家单位","请先选中一家单位");
        return;
    }
    ExportToFile etf(this);
    ComInfo cif = m_nameAndComInfos[name];
    etf.saveToExcelFromComInfo(cif);
}