#                                '''防疫系统'''                                #
#2022年5月16日版本
########################################

#   库引用
from PIL import Image
import xlwings as xw
import pandas as pd
import numpy as np
import collections
import datetime
import time
import cv2
import os

########################################

#   定义颜色范围
def getColorList():
    dict = collections.defaultdict(list)
    #红色
    lower_red = np.array([156, 43, 46])
    upper_red = np.array([180, 255, 255])
    color_list = []
    color_list.append(lower_red)
    color_list.append(upper_red)
    dict['red']=color_list
 
    # 红色2
    lower_red = np.array([0, 43, 46])
    upper_red = np.array([10, 255, 255])
    color_list = []
    color_list.append(lower_red)
    color_list.append(upper_red)
    dict['red2'] = color_list
    
    #黄色
    lower_yellow = np.array([26, 43, 46])
    upper_yellow = np.array([34, 255, 255])
    color_list = []
    color_list.append(lower_yellow)
    color_list.append(upper_yellow)
    dict['yellow'] = color_list
 
    #绿色
    lower_green = np.array([35, 43, 46])
    upper_green = np.array([77, 255, 255])
    color_list = []
    color_list.append(lower_green)
    color_list.append(upper_green)
    dict['green'] = color_list
    
    return dict

########################################

#  健康码识别系统

#截图功能
img = Image.open('F://xsj//yssb//jkmhm.jpg')

box=(210,460,650,900)
jt=img.crop(box)

jt.save('F://xsj//jkm1.jpg')

filename="F:\\xsj\\jkm1.jpg"

########################################

#处理图片
def get_color(frame):
    hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
    maxsum = -100
    color = None
    color_dict = getColorList()
    for d in color_dict:
        mask = cv2.inRange(hsv,color_dict[d][0],color_dict[d][1])
        cv2.imwrite(d+'.jpg',mask)
        binary = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY)[1]
        binary = cv2.dilate(binary,None,iterations=2)
        contours, hierarchy = cv2.findContours(binary.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        sum = 0
        for c in contours:
            sum+=cv2.contourArea(c)
        if sum > maxsum :
            maxsum = sum
            color = d
    return color

########################################

#颜色识别函数
def yssb():
    frame = cv2.imread(filename)
    a=get_color(frame)
    if a == 'green':
        return '0'
    if a== 'yellow':
        return '1'
    if a == 'red':
        return '2'

########################################

rq=datetime.date.today().day
df=pd.read_excel("社区信息表 .xlsx")

#初始界面函数
def csjm():
    print(">>>欢迎进入防疫系统<<<")
    print('现在时间是：', time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
    print("#####################")
    print("输入1 您将进入社区端")
    print("输入2 您将进入居民端")
    print("输入3 您将进入外来人口端")
    print("输入0 您将退出防疫系统")
    csjm=input("请在这输入：")
    return csjm

########################################

#社区端函数
def sqdhs():
    print(">>>欢迎社区管理员<<<")
    print("#####################")
    print("输入1 您将获得所有居民当日的打卡信息")
    print("输入2 您将获得所有外来人员信息")
    print("输入3 您将获得所有未打卡的居民姓名以及人数")
    print("输入0 您将退出社区端返回到初始界面")
    sqdhs=input("请在这输入：")
    return sqdhs

########################################

#居民端函数
def jmdhs():        
    print(">>>欢迎业主<<<")
    print("#####################")
    print("输入1 您将进入每日打卡系统")
    print("输入0 您将退出居民端返回到初始界面")
    jmdhs=input("请在这输入：")
    return jmdhs

########################################

#外来人员端函数
def wlrk():
    print('>>>欢迎来到外来人员端<<<')
    print("#####################")
    print("输入1 您将进入外来人员登记系统")
    print("输入2 您将进入上传健康码进行系统分析系统")
    print('输入3 您将查看进入社区审核结果')
    print("输入0 您将退出外来人员系统")
    wlrk=input('请在这输入：')
    return wlrk

########################################

#创建每日表格
def mrdk():
    rq=datetime.date.today().day
    if not os.path.isfile(f'F://xsj//{rq}号打卡表.xlsx'):
        dkb = xw.App(visible=True,add_book=False)#启动excel程序
        workbook = dkb.books.add()
        workbook.save(f'F://xsj//{rq}号打卡表.xlsx')
        workbook.save(f'F://xsj//{rq}号外来人口表格.xlsx')
        workbook.close()
        dkb.quit()#程序退出
        df1=pd.read_excel(f'D://vs2019pro//大作业////{rq}号打卡表.xlsx')
        df2=pd.read_excel(f'F://xsj//{rq}号外来人口表格.xlsx')
        df1['姓名']=df.loc[1:,('姓名')]
        df1[['打卡情况','今日所在地','健康码状态','是否核酸','体温情况','是否隔离']]='无'
        df2[['外来人口','从哪来','来本社区的原因','联系电话','健康码状态','审核结果']]=None
        df1.to_excel(f'F://xsj//{rq}号打卡表.xlsx',index = False,encoding = "utf-8")
        df2.to_excel(f'F://xsj//{rq}号外来人口表格.xlsx',index = False,encoding = "utf-8")
        print(">>>每日打卡表格创建完成<<<")
        print(">>>每日外来人口表格创建完成<<<")
        print("#####################")
        print()
        return True
    
########################################

#防疫系统社区端主体函数
def sqdzths():
    mrdk()
    while True:
        y=sqdhs()
        df1=pd.read_excel(f'F://xsj//{rq}号打卡表.xlsx')
        df2=pd.read_excel(f'F://xsj//{rq}号外来人口表格.xlsx')
        if y == '0':#返回到初始界面
            print('>>>已退出社区端<<<')
            print("#####################")
            print()
            break
        if y == '1':#社区端函数功能
            if os.path.isfile(f'F://xsj//{rq}号打卡表.xlsx'):
                print(df1[['姓名','打卡情况','今日所在地','健康码状态','是否核酸','体温情况','是否隔离']])
                print()
            else:
                print("请检修系统")
                print()
        if y == '2':
            if os.path.isfile(f'F://xsj//{rq}号外来人口表格.xlsx'):
                print(df2[['外来人口','从哪来','来本社区的原因','联系电话','健康码状态','审核结果']])
                print()
            else:
                print("请检修系统")
                print()
        if y == '3':
            if os.path.isfile(f'F://xsj//{rq}号打卡表.xlsx'):
                print(len(df1[(df1.打卡情况.str[:]=='无')]['姓名']),'人未打卡')
                print(df1[(df1.打卡情况.str[:]=='无')]['姓名'])
                print()
            else:
                print('请检修系统')
                print()
        if y not in ['0','1','2','3']:
            print('输入有误，请重新输入')
            print()
            
########################################

#防疫系统居民端主体函数
def jmdzths():
    while True:
        y=jmdhs()
        if y == '0':#返回到初始界面
            print('>>>已退出居民端<<<')
            print("#####################")
            print()
            break
        if y == '1':#进入每日打卡系统
            if os.path.isfile(f'F://xsj//{rq}号打卡表.xlsx'):
                df1=pd.read_excel(f'F://xsj//{rq}号打卡表.xlsx')
                print("欢迎来到每日打卡系统")
                print("#####################")
                print(">>>非常时期，感谢配合<<<")
                nm=input('请输入姓名：')
                xm=df1[(df1.姓名.str[:]==nm)].index
                if nm in df1.姓名.values.tolist() and df1.loc[xm,('打卡情况')].tolist()==['无']:
                        df1.loc[xm,('今日所在地')]=input("今日所在地：")
                        df1.loc[xm,('健康码状态')]=input("健康码状态 请填 绿/黄/红：")
                        df1.loc[xm,('是否核酸')]=input("是否核酸 请填 是/否：")
                        df1.loc[xm,('体温情况')]=input('体温情况(低于37.2属于正常体温) 请填 正常/异常：')
                        df1.loc[xm,('是否隔离')]=input("是否被隔离 请填 是/否：")
                        df1.loc[xm,('打卡情况')]='是'
                        df1.to_excel(f'F://xsj//{rq}号打卡表.xlsx',index = False,encoding = "utf-8")
                        print("   >>>非 常 时 期，感 谢 有 你<<<   ")
                        print("#####################")
                        print()
                if nm in df1.姓名.values.tolist() and df1.loc[xm,('打卡情况')].tolist()==['是']:
                    print(">>>    您今日已完成打卡    <<<")
                    print(">>>非 常 时 期，感 谢 有 你<<<")
                    print("#####################")
                    print()
                if nm not in df1.姓名.values.tolist():
                    print('>>>请先返回初始界面<<<')
                    print('>>>进入外来人员端进行报备<<<')
                    print("#####################")
                    print()
                    break
            else:
                print(">>>正在等待管理员创建每日打卡表格<<<")
                print("   >>>非 常 时 期，感 谢 有 你<<<   ")
                print("#####################")
                print()
        if y not in ['0','1']:
            print('输入有误，请重新输入')
            print()

########################################

#防疫系统外来人员端主体函数
def wlrkdzths():
    while True:
        y=wlrk()
        if y == '0':#返回初始界面
            print("已退出外来人口端")
            print("#####################")
            print()
            break
        if y == '1':#进入外来人口登记系统
            if os.path.isfile(f'F://xsj//{rq}号外来人口表格.xlsx'):
                df2=pd.read_excel(f'F://xsj//{rq}号外来人口表格.xlsx')
                wz=len(df2)+1
                df2.loc[wz,('外来人口')]=input('请输入您的名字：')
                df2.loc[wz,('从哪来')]=input('请输入您从哪来：')
                df2.loc[wz,('来本社区的原因')]=input("请输入您来本社区的原因：")
                df2.to_excel(f'F://xsj//{rq}号外来人口表格.xlsx',index = False,encoding = "utf-8")
                while True:
                    dh=input("请输入您的联系电话：")
                    if len(dh) == 11:
                        df2.loc[wz,('联系电话')]=dh
                        print(">>> 请等待管理员审核 <<<")
                        print(">>>非常时期，感谢配合<<<")
                        print("#######################")
                        print()
                        df2.to_excel(f'F://xsj//{rq}号外来人口表格.xlsx',index = False,encoding = "utf-8")
                        break
                    if len(dh) != 11:
                        print()
                        print("您的输入有误，请重新输入正确的电话号码")
                        print(">>>非常时期，感谢配合<<<")
                        print("#######################")
                        print()
            else:
                print(">>>正在等待管理员创建外来人口表格<<<")
                print("  >>>非 常 时 期，感 谢 配 合<<<   ")
                print("#####################")
                print()
        if y == '2':#进入上传健康码分析系统
            if os.path.isfile(f'F://xsj//{rq}号外来人口表格.xlsx'):
                df2=pd.read_excel(f'F://xsj//{rq}号外来人口表格.xlsx')
                nm=input("请输入您的名字：")
                if nm in df2['外来人口'].tolist():
                    wz1=df2[(df2.外来人口.str[:]==nm)].index
                    if yssb() == '0':
                        df2.loc[wz1,('健康码状态')]='绿'
                        df2.to_excel(f'F://xsj//{rq}号外来人口表格.xlsx',index = False,encoding = "utf-8")
                        print(">>>非 常 时 期，感 谢 配 合<<<")
                        print("#############################")
                        print()
                    if yssb() == '1':
                        df2.loc[wz1,('健康码状态')]='黄'
                        df2.to_excel(f'F://xsj//{rq}号外来人口表格.xlsx',index = False,encoding = "utf-8")
                        print(">>>非 常 时 期，感 谢 配 合<<<")
                        print("#############################")
                        print()
                    if yssb() == '2':
                        df2.loc[wz1,('健康码状态')]='红'
                        df2.to_excel(f'F://xsj//{rq}号外来人口表格.xlsx',index = False,encoding = "utf-8")
                        print(">>>非 常 时 期，感 谢 配 合<<<")
                        print("#############################")
                        print()
                if nm not in df2['外来人口'].tolist():
                    print('请 先 登 记 信 息')
                    print("##################################")
                    print()
            else:
                print(">>>正在等待管理员创建外来人口表格<<<")
                print("   >>>非 常 时 期，感 谢 配 合<<<   ")
                print("##################################")
                print()
        if y == '3':#进入查看审核结果系统
            if os.path.isfile(f'F://xsj//{rq}号外来人口表格.xlsx'):
                df2=pd.read_excel(f'F://xsj//{rq}号外来人口表格.xlsx')
                nm=input("请输入您的名字：")
                if nm in df2['外来人口'].tolist() :
                    wz2=df2[(df2.外来人口.str[:]==nm)].index
                    if df2.loc[wz2,('健康码状态')].tolist()==['绿']:
                        df2.loc[wz2,('审核结果')]='通过'
                        df2.to_excel(f'F://xsj//{rq}号外来人口表格.xlsx',index = False,encoding = "utf-8")
                        print('您的审核已通过')
                        print(">>>非 常 时 期，感 谢 配 合<<<")
                        print("#############################")
                        print()
                    if df2.loc[wz2,('健康码状态')].tolist()==['黄']:
                        df2.loc[wz2,('审核结果')]='不通过'
                        df2.to_excel(f'F://xsj//{rq}号外来人口表格.xlsx',index = False,encoding = "utf-8")
                        print('您的审核不通过') 
                        print("如果您有七天三检且三检均为阴性的核酸证明")
                        print("请联系社区管理员")
                        print("社区管理员电话：15174199895")
                        print(">>>非 常 时 期，感 谢 配 合<<<")
                        print("#############################")
                        print()
                    if df2.loc[wz2,('健康码状态')].tolist()==['红']:
                        df2.loc[wz2,('审核结果')]='不通过'
                        df2.to_excel(f'F://xsj//{rq}号外来人口表格.xlsx',index = False,encoding = "utf-8")
                        print('您的审核不通过')
                        print("由于您是红码人员")
                        print("系统已经将您的信息上传至疫情防控中心")
                        print("建议您远离人群，就地等待")
                        print(">>>非 常 时 期，感 谢 配 合<<<")
                        print("#############################")
                        print()
                    else:
                        print("请先上传健康码,进行系统分析")
                        print(">>>非 常 时 期，感 谢 配 合<<<")
                        print("##############################")
                        print()
                if nm not in df2['外来人口'].tolist():
                    print(' 请 先 登 记 信 息')
                    print("##############################")
                    print()
            else:
                print(">>>正在等待管理员创建外来人员登记表格<<<")
                print("   >>>非 常 时 期，感 谢 配 合<<<   ")
                print("##################################")
                print()
        if y not in ['0','1','2','3']:
            print('输入有误，请重新输入')
            print()
                             
########################################

#防疫系统主体函数
while True:
    x=csjm()
    if x == '1':
        sqdzths()
    if x == '2':
        jmdzths()
    if x == '3':
        wlrkdzths()
    if x == '0':
        print('>>>已退出防疫系统<<<')
        print(">>>非常时期，感谢有你<<<")
        print("#####################")
        break
    if x not in ['0','1','2','3']:
        print('输入有误，请重新输入')
        print()