import xlrd
from threading import Thread
import tkinter
from tkinter import *
import os
from tkinter import ttk


def check_name(orwData, strInput):  # 检查公司名
    if orwData.find(strInput) == -1:
        return 0
    return 1


def check_data(orwData, strInput):  # 检查标注实体
    for text in strInput:
        if orwData.find(text) == -1:
            return 0
    return 1


def check_number(orwData, strInput):  # 检查股票代码（严格）
    findtext = re.compile('\((\d{4,6})')
    num = re.findall(findtext, orwData)

    if strInput == '无':
        if num:
            return num[0]
        return 0
    elif orwData.find(strInput) == -1:
        if num:
            return ' 未找到'

    if strInput.isdigit() and len(strInput) not in [4, 5, 6]:
        return ' 长度错误'
    return 0


def print_error_list(errorList, File):  # 打印列表
    count = 0
    for item in errorList:
        print(str(count), '\t', item, file=File)
        count += 1
    print(file=File)

# 计数
def count_detail(detailList, title, mark):
    if title in detailList:
        if mark == '正':
            detailList[title][0] += 1
        elif mark == '负':
            detailList[title][2] += 1
        elif mark == '中':
            detailList[title][1] += 1
        else:
            detailList[title][3] += 1
            return mark
    else:
        if mark == '正':
            detailList[title] = [1, 0, 0, 0]
        elif mark == '负':
            detailList[title] = [0, 0, 1, 0]
        elif mark == '中':
            detailList[title] = [0, 1, 0, 0]
        else:
            detailList[title] = [0, 0, 0, 1]
            return mark


def mainCheck(returnData, excelName="data_check.xls", pageNumber=0):
    # 初始化表格
    try:
        excel_content = xlrd.open_workbook(excelName)
        dataInform = ['表格:\t' + str(excel_content.sheet_names()),
                      '目标表格:\t' + str(excel_content.sheet_names()[pageNumber])]
        ret1 = excel_content.sheets()[pageNumber]
        row_num = ret1.nrows
    except:
        return returnData.append(['打开失败，请检查data_check.xls是否存在'])

    str1 = ''  # 表格中整行数据
    str2 = ''  # 原文
    lst1 = []  # 切分后的整行数据
    lst2 = []  # 切分后的标注内容

    errorList1 = ['标注格式错误:']  # 标注格式错误
    errorList2 = ['公司名错误:']  # 公司名错误
    errorList3 = ['标注内容错误:']  # 标注实体错误
    errorList4 = ['股票代码错误:']  # 股票代码错误
    errorList5 = ['未知错误:']  # 未知错误
    detailList = {}
    for item in ['产品上市', '业务变化', '关联问题', '产品问题', '产品价格变动', '销量、份额变动', '技术质控变动', '产能产量变动', '成本变动', '意外事故', '政府补贴',
                 '资质变动', '项目问题', '减资破产', '整体停产停业', '经营性债务拖欠', '开展合作', '项目中标', '其他经营动态', '董监高变动', '高管政治地位提升', '管监高违纪',
                 '员工变动', '其他管理问题', '利润公布', '利润预告', '资产变动', '财务造假', '变更会计师', '非标意见', '延期披露', '业绩更正', '大额借贷担保', '银行授信变动',
                 '债务拖欠', '大额借贷', '其他财务动态', '行政处罚', '监管问询', '立案调查', '公司涉诉', '资产查封', '资金问题', '澄清公告', '公司申诉', '其他违规事件',
                 '评级变动', '违约事件', '担保风险', '造假事件', '列为被执行人', '其他信用事件', '并购重组', '并购重组失败', '投资事件', '公司上市', '股票增发', '债权融资',
                 '其他融资事件', '行业变动', '风险警示', '限售股解禁', '股票回购', '股权纠纷', '股票退市', '股票评级调整', '员工持股计划', '股利分配', '股价变动', '股票复牌',
                 '股票挂牌', '股票停牌', '股份冻结', '其他股票相关事件', '股东增持', '股东减持', '股东质押', '解除质押', '股东违规', '股东变动', '增加票面价值', '增加出资',
                 '发行新股', '债转股', '其他增资事件', '减资', '----']:
        detailList[item] = [0, 0, 0, 0]

    # 开始检查
    for i in range(row_num):
        row_data = ret1.row_values(i)
        str1 = row_data[4]
        lst1 = str1.split('##')

        # 标注格式错误
        if len(lst1) != 3:
            if row_data[6] == '----':
                continue
        else:
            errorList1.append('数据库编号:\t' + str(row_data[0]) + '\t表格行数:\t' + str(i + 1) + '\t' + str(lst1))
            continue

        try:
            lst2 = lst1[1].split('&&')
            lst1[1] = lst2
            str2 = row_data[3].replace(' ', '')

            # 公司名错误
            if not check_name(str2, lst1[0]):
                errorList2.append(
                    '数据库编号:\t' + str(row_data[0]) + '\t表格行数:\t' + str(i + 1) + '\t' + str(lst1[0]))
                continue

            # 标注实体错误（文章内容）
            if not check_data(str2, lst1[1]):
                errorList3.append(
                    '数据库编号:\t' + str(row_data[0]) + '\t表格行数:' + str(i + 1) + '\t' + str(lst1[1]))
                continue

            # 股票代码错误
            temp = check_number(str2, lst1[3])
            if temp:
                errorList4.append(
                    '数据库编号:\t' + str(row_data[0]) + '\t表格行数:\t' + str(i + 1) + '\t' + str(lst1[3]) + '\t' + temp)
                continue

            # 实体错误(正负中) + 统计数量
            temp = count_detail(detailList, row_data[6], lst1[2])
            if temp is not None:
                errorList3.append('数据库编号:\t' + str(row_data[0]) + '\t表格行数:\t' + str(i + 1) + '\t' + temp)
                continue
        # 未知错误
        except:
            errorList5.append(
                '数据库编号:\t' + str(row_data[0]) + '\t表格行数:' + str(i + 1) + '\t' + str(row_data[4]))

    # 返回结果
    return returnData.extend([dataInform, errorList1, errorList2, errorList3, errorList4, errorList5, detailList])


def printButtonData3(checkList, strinput, excelName="data_check.xls", pageNumber=0):
    try:
        excel_content = xlrd.open_workbook(excelName)
        dataInform = ['表格:\t' + str(excel_content.sheet_names()),
                      '目标表格:\t' + str(excel_content.sheet_names()[pageNumber])]
        ret1 = excel_content.sheets()[pageNumber]
        row_num = ret1.nrows
    except:
        return ['打开失败']

    str1 = ''  # 表格中整行数据
    str2 = ''  # 原文
    lst1 = []  # 切分后的整行数据
    lst2 = []  # 切分后的标注内容
    errorList01 = []
    inputlist = []
    if checkList[0]:
        inputlist.append('正')
    if checkList[2]:
        inputlist.append('中')
    if checkList[1]:
        inputlist.append('负')
    # 开始检查
    for i in range(row_num):
        row_data = ret1.row_values(i)
        if not row_data[6] == strinput:
            continue

        str1 = row_data[4]
        lst1 = str1.split('##')

        if len(lst1) != 4:
            if checkList[3]:
                errorList01.append('数据库编号:\t' + str(row_data[0]) + '\t表格行数:\t' + str(i + 1) + '\t' + str(lst1))
            continue

        try:
            lst2 = lst1[1].split('&&')
            lst1[1] = lst2
            # 实体错误(正负中) + 统计数量
            if lst1[2] in inputlist:
                errorList01.append('数据库编号:\t' + str(row_data[0]) + '\t表格行数:' + str(i + 1) + '\t' + lst1[2])
            else:
                if lst1[2] not in ['正', '负', '中', ] and checkList[3]:
                    errorList01.append('数据库编号:\t' + str(row_data[0]) + '\t表格行数:' + str(i + 1) + '\t' + lst1[2])

        # 未知错误
        except:
            errorList01.append(
                '数据库编号:\t' + str(row_data[0]) + '\t表格行数:' + str(i + 1) + '\t' + str(row_data[4]))
    return errorList01


def main():
    result = []
    t1 = Thread(mainCheck(result))  # 开始检查的线程
    t1.start()

    # 开始绘制ui
    showText = ' 标注格式 公司名称 标注实体 股票代码 未知错误'
    window = tkinter.Tk()
    window.title('数据标注检查')
    window.geometry('400x220')
    frame1 = Frame(window, relief=RAISED, borderwidth=2)
    frame2 = Frame(window, relief=RAISED, borderwidth=2)
    frame3 = Frame(window, relief=RAISED, borderwidth=2)
    frame4 = Frame(window, relief=RAISED, borderwidth=4, width=350)
    frame1.pack(side=TOP, fill=BOTH)
    frame2.pack(side=TOP)
    frame3.pack(side=TOP)
    frame4.pack(side=TOP, ipadx=6, ipady=3, expand=2)
    TextLay = tkinter.Label(frame1, bg='gray', width=60, text=showText)
    TextLay.pack()

    def selection_str():
        global showText
        showText = ''
        if var1.get() == 1:
            showText += ' 标注格式'
        if var2.get() == 1:
            showText += ' 公司名称'
        if var3.get() == 1:
            showText += ' 标注实体'
        if var4.get() == 1:
            showText += ' 股票代码'
        if var5.get() == 1:
            showText += ' 未知错误'
        TextLay.config(text=showText)

    var1 = tkinter.IntVar()
    var2 = tkinter.IntVar()
    var3 = tkinter.IntVar()
    var4 = tkinter.IntVar()
    var5 = tkinter.IntVar()
    c1 = tkinter.Checkbutton(frame2, text='标注格式', variable=var1, onvalue=1, offvalue=0,
                             command=selection_str)
    c2 = tkinter.Checkbutton(frame2, text='公司名称', variable=var2, onvalue=1, offvalue=0,
                             command=selection_str)
    c3 = tkinter.Checkbutton(frame2, text='标注实体', variable=var3, onvalue=1, offvalue=0,
                             command=selection_str)
    c4 = tkinter.Checkbutton(frame2, text='股票代码', variable=var4, onvalue=1, offvalue=0,
                             command=selection_str)
    c5 = tkinter.Checkbutton(frame2, text='未知错误', variable=var5, onvalue=1, offvalue=0,
                             command=selection_str)
    c1.select()
    c2.select()
    c3.select()
    c4.select()
    c5.select()
    c1.pack(side=LEFT)
    c2.pack(side=LEFT)
    c3.pack(side=LEFT)
    c4.pack(side=LEFT)
    c5.pack(side=LEFT)

    #  打印错误内容
    def printButtonData1(dataList):
        File = open('可疑标注.txt', 'w+', encoding='UTF-8')
        print_error_list(dataList[0], File)
        if var1.get() == 1:
            print_error_list(dataList[1], File)
        if var2.get() == 1:
            print_error_list(dataList[2], File)
        if var3.get() == 1:
            print_error_list(dataList[3], File)
        if var4.get() == 1:
            print_error_list(dataList[4], File)
        if var5.get() == 1:
            print_error_list(dataList[5], File)
        File.close()
        os.startfile('可疑标注.txt')

    # 打印统计信息
    def printButtonData2(dataList):
        temp = 0
        File = open('数据现况.txt', 'w+', encoding='UTF-8')
        print('\t\t标题\t正\t中\t负\t异常\t\t共计', file=File)
        detaillist = dataList[6]
        nameList = [
            ('经营问题',
             ['产品上市', '业务变化', '关联问题', '产品问题', '产品价格变动', '销量、份额变动', '技术质控变动', '产能产量变动', '成本变动', '意外事故', '政府补贴', '资质变动',
              '项目问题', '减资破产', '整体停产停业', '经营性债务拖欠', '开展合作', '项目中标', '其他经营动态']),
            ('管理问题', ['董监高变动', '高管政治地位提升', '管监高违纪', '员工变动', '其他管理问题']),
            ('财务', ['利润公布', '利润预告', '资产变动', '财务造假', '变更会计师', '非标意见', '延期披露', '业绩更正', '大额借贷担保', '银行授信变动', '债务拖欠', '大额借贷',
                    '其他财务动态']),
            ('合规', ['行政处罚', '监管问询', '立案调查', '公司涉诉', '资产查封', '资金问题', '澄清公告', '公司申诉', '其他违规事件']),
            ('信用', ['评级变动', '违约事件', '担保风险', '造假事件', '列为被执行人', '其他信用事件']),
            ('投资并购', ['并购重组', '并购重组失败', '投资事件']),
            ('融资', ['公司上市', '股票增发', '债权融资', '其他融资事件']),
            ('行业', ['行业变动']),
            ('股票',
             ['风险警示', '限售股解禁', '股票回购', '股权纠纷', '股票退市', '股票评级调整', '员工持股计划', '股利分配', '股价变动', '股票复牌', '股票挂牌', '股票停牌',
              '股份冻结',
              '其他股票相关事件']),
            ('股东', ['股东增持', '股东减持', '股东质押', '解除质押', '股东违规', '股东变动']),
            ('增资、减资', ['增加票面价值', '增加出资', '发行新股', '债转股', '其他增资事件', '减资']),
            ('其他', ['----'])
        ]

        for temptup in nameList:
            print('\n', temptup[0], file=File)
            for tempstr in temptup[1]:
                print('\t%12.8s' % tempstr, end='', file=File)
                tempcount = 0
                for tempnum in detaillist[tempstr]:
                    tempcount += int(tempnum)
                    print('\t', tempnum, end='', file=File)
                print('\t\t', tempcount, file=File)
        nameList = set(detaillist.keys()).difference(
            {'产品上市', '业务变化', '关联问题', '产品问题', '产品价格变动', '销量、份额变动', '技术质控变动', '产能产量变动', '成本变动', '意外事故', '政府补贴',
             '资质变动', '项目问题', '减资破产', '整体停产停业', '经营性债务拖欠', '开展合作', '项目中标', '其他经营动态', '董监高变动', '高管政治地位提升', '管监高违纪',
             '员工变动', '其他管理问题', '利润公布', '利润预告', '资产变动', '财务造假', '变更会计师', '非标意见', '延期披露', '业绩更正', '大额借贷担保', '银行授信变动',
             '债务拖欠', '大额借贷', '其他财务动态', '行政处罚', '监管问询', '立案调查', '公司涉诉', '资产查封', '资金问题', '澄清公告', '公司申诉', '其他违规事件',
             '评级变动', '违约事件', '担保风险', '造假事件', '列为被执行人', '其他信用事件', '并购重组', '并购重组失败', '投资事件', '公司上市', '股票增发', '债权融资',
             '其他融资事件', '行业变动', '风险警示', '限售股解禁', '股票回购', '股权纠纷', '股票退市', '股票评级调整', '员工持股计划', '股利分配', '股价变动', '股票复牌',
             '股票挂牌', '股票停牌', '股份冻结', '其他股票相关事件', '股东增持', '股东减持', '股东质押', '解除质押', '股东违规', '股东变动', '增加票面价值', '增加出资',
             '发行新股', '债转股', '其他增资事件', '减资', '----'})
        for tempstr in nameList:
            print('\t%12.8s' % tempstr, end='', file=File)
            tempcount = 0
            for tempnum in detaillist[tempstr]:
                tempcount += int(tempnum)
                print('\t', tempnum, end='', file=File)
            print('\t\t', tempcount, file=File)

        File.close()
        os.startfile('数据现况.txt')

    xVariable1 = tkinter.StringVar()  # #创建变量，便于取值
    xVariable2 = tkinter.StringVar()

    com1 = ttk.Combobox(frame4, textvariable=xVariable1, width=16)  # #创建下拉菜单
    com2 = ttk.Combobox(frame4, textvariable=xVariable2, width=16)  # #创建下拉菜单
    com1.configure(state="readonly")
    com1.grid(row=0, column=0)  # #将下拉菜单绑定到窗体
    com2.grid(row=0, column=2)  # #将下拉菜单绑定到窗体

    com1["value"] = (
        '----', '经营问题', '管理问题', '财务', '合规', '信用', '投资并购', '融资', '行业', '行业', '股票', '股东', '增资、减资',
        '其他')  # #给下拉菜单设定值
    com1.current(0)  # #设定下拉菜单的默认值为第3个，即山东

    com2["value"] = (
        '----')

    com2.current(0)

    def xFunc(event):
        if com1.get() == '----':
            com2["value"] = (
                '----')
        elif com1.get() == '经营问题':
            com2["value"] = (
                '----', '产品上市', '业务变化', '关联问题', '产品问题', '产品价格变动', '销量、份额变动', '技术质控变动', '产能产量变动', '成本变动', '意外事故',
                '政府补贴', '资质变动',
                '项目问题', '减资破产', '整体停产停业', '经营性债务拖欠', '开展合作', '项目中标', '其他经营动态')
        elif com1.get() == '管理问题':
            com2["value"] = (
                '----', '董监高变动', '高管政治地位提升', '管监高违纪', '员工变动', '其他管理问题')
        elif com1.get() == '财务':
            com2["value"] = (
                '----', '利润公布', '利润预告', '资产变动', '财务造假', '变更会计师', '非标意见', '延期披露', '业绩更正', '大额借贷担保', '银行授信变动', '债务拖欠',
                '大额借贷',
                '其他财务动态')
        elif com1.get() == '合规':
            com2["value"] = (
                '----', '行政处罚', '监管问询', '立案调查', '公司涉诉', '资产查封', '资金问题', '澄清公告', '公司申诉', '其他违规事件')
        elif com1.get() == '信用':
            com2["value"] = (
                '----', '评级变动', '违约事件', '担保风险', '造假事件', '列为被执行人', '其他信用事件')
        elif com1.get() == '投资并购':
            com2["value"] = (
                '----', '并购重组', '并购重组失败', '投资事件')
        elif com1.get() == '融资':
            com2["value"] = (
                '----', '公司上市', '股票增发', '债权融资', '其他融资事件')
        elif com1.get() == '行业':
            com2["value"] = (
                '----', '行业变动')
        elif com1.get() == '股票':
            com2["value"] = (
                '----', '风险警示', '限售股解禁', '股票回购', '股权纠纷', '股票退市', '股票评级调整', '员工持股计划', '股利分配', '股价变动', '股票复牌', '股票挂牌',
                '股票停牌',
                '股份冻结',
                '其他股票相关事件')
        elif com1.get() == '股东':
            com2["value"] = (
                '----', '股东增持', '股东减持', '股东质押', '解除质押', '股东违规', '股东变动')
        elif com1.get() == '增资、减资':
            com2["value"] = (
                '----', '增加票面价值', '增加出资', '发行新股', '债转股', '其他增资事件', '减资')
        else:
            com2['value'] = (
                '----')

    com1.bind("<<ComboboxSelected>>", xFunc)  # #给下拉菜单绑定事件

    var01 = tkinter.IntVar()
    var02 = tkinter.IntVar()
    var03 = tkinter.IntVar()
    var04 = tkinter.IntVar()
    c1 = tkinter.Checkbutton(frame4, text='正 ', variable=var01, onvalue=1, offvalue=0,
                             command=selection_str, width=6)
    c2 = tkinter.Checkbutton(frame4, text='负 ', variable=var02, onvalue=1, offvalue=0,
                             command=selection_str, width=6)
    c3 = tkinter.Checkbutton(frame4, text='中 ', variable=var03, onvalue=1, offvalue=0,
                             command=selection_str, width=6)
    c4 = tkinter.Checkbutton(frame4, text='错误', variable=var04, onvalue=1, offvalue=0,
                             command=selection_str, width=6)
    c1.grid(row=1, column=0)
    c2.grid(row=1, column=1)
    c3.grid(row=2, column=0)
    c4.grid(row=2, column=1)

    t1.join()  # 检查结束，result值被修改

    # 继续绘制ui
    def clickButton1():
        printButtonData1(result)

    def clickButton2():
        printButtonData2(result)

    def clickButton3():
        checkList = [var01.get(), var02.get(), var03.get(), var04.get()]
        result = printButtonData3(checkList, com2.get())
        try:
            File = open('查询结果.txt', 'w+', encoding='UTF-8')
        except:
            print('error')
            return
        print_error_list(result, File)
        File.close()
        os.startfile('查询结果.txt')

    b1 = tkinter.Button(frame3, text='数据检查', command=clickButton1, width=16, height=1)
    b2 = tkinter.Button(frame3, text='数据统计', command=clickButton2, width=16, height=1)
    b3 = tkinter.Button(frame4, text='查询', command=clickButton3, width=12, height=2)
    b1.pack(side=RIGHT)
    b2.pack(side=LEFT)
    b3.grid(row=2, column=2, columnspan=1, rowspan=1)
    window.mainloop()  # 显示ui


if __name__ == '__main__':
    main()
