#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <wincon.h>
#include <conio.h>
#include <string.h>
#include <io.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <ctype.h>
#include <time.h>

#ifndef TYPE_H_INCLUDED
#define TYPE_H_INCLUDED

/**
主屏幕行数和列数
*/
#define SCR_ROW 100
#define SCR_COL 150

DWORD  num_written;
/**
就诊记录信息链结点类型定义
*/
typedef struct record_node
{
    int number1;          /*病人编号*/
    int number2;       /*记录编号*/
    char   name[11];    /*主治医生姓名*/
    float  lmoney;      /*就诊费用*/
    char   ldate[11];   /*就诊日期*/
    char   bdate[11];   /*计划复诊日期*/
    char   tdate[11];   /*实际复诊日期*/
    char   tell[50];    /*说明*/
    struct record_node *next;/*指向下一个结点*/
} RECORD_NODE;

/**
病人信息链结点类型定义
*/
typedef struct patient_node
{
    int    number;     			 /*科室编号*/
    int    number1;	             /*病人编号*/
    char   name[20];			 /*病人姓名*/
    char   phone[15];             /*电话*/
    int    sex;                 /*性别*/
    char   adr[30];            /*住址*/
    struct patient_node *next;  			/*指向下一节点*/
    struct record_node *lnext;  /*指向就诊记录信息结点的指针*/
} PATIENT_NODE;
/**
科室基本信息链结点类型定义
*/
typedef struct depart_node
{
    int number;           /*科室编号*/
    char  name[20];               /*科室名称*/
    char adr[20];			/*科室地址*/
    char phone[15];			/*科室电话*/
    struct depart_node* next;          /*指向下一结点*/
    struct patient_node* anext;  /*指向病人信息链结点的指针*/
} DEPART_NODE;

/**
 屏幕窗口信息链结点类型定义
  */
typedef struct layer_node {
        char LayerNo;                            /* 弹出窗口层数 */
        SMALL_RECT rcArea;               /* 弹出窗口区域坐标 */
        CHAR_INFO *pContent;             /* 弹出窗口区域字符单元原信息存储缓冲区 */
        char *pScrAtt;                            /* 出窗口区域字符单元原属性值存储缓冲区 */
        struct layer_node *next;         /* 指向下一结点的指针 */
} LAYER_NODE;

/**
标签束结构类型定义
*/
typedef struct labe1_bundle {
        char **ppLabel;                 /* 标签数组指针 */
        COORD *pLoc;                    /* 标签定位数组 */
        int num;                        /* 标签个数 */
} LABEL_BUNDLE;

/**
热区结构类型定义
*/
typedef struct hot_area {
        SMALL_RECT *pArea;                        /* 热区定位 */
        char *pSort;                              /* 热区类别: 按键、文本框、选项框 */
        char *pTag;                               /* 热区序号 */
        int num;                                  /* 热区个数 */
} HOT_AREA;

LAYER_NODE *gp_top_layer = NULL;            	/* 弹出窗口信息链链头 */
DEPART_NODE *gp_head=NULL;                  	/* 主链头指针 */
char* gp_sys_name="电子医嘱管理系统";   /*系统名称*/
char*backup_sys_date_filename="BackupSysData.dat";
//char *use_name="U201314863";                                                /*登陆用户名*/
//char *load_code="******";                                      /*登陆密码*/
char* gp_asset_info_filename="patient.dat";       /*病人基本信息数据文件*/
char* gp_lend_info_filename="record.dat";         /*就诊记录信息数据文件*/
char* gp_member_info_filename="depart.dat";      /*科室信息数据文件*/

char *ga_main_menu[] = {"文件(F)  ",  /* 系统主菜单名 */
                            "添加(A)  ",                       /* 系统主菜单名 */
                            "修改(M)  ",                      /* 系统主菜单名 */
                            "插入(I)  ",                        /* 系统主菜单名 */
                            "删除(D)  ",                       /* 系统主菜单名 */
                            "查询(Q)  ",                       /* 系统主菜单名 */
                            "帮助(H)  "                        /* 系统主菜单名 */
                           };

char *ga_sub_menu[] = {"[L]数据加载",
                           "[S] 数据保存",      	                        /* 系统子菜单名 */
                           "[B] 数据备份",                                  /* 系统子菜单名 */
                           "[R] 数据恢复",                                  /* 系统子菜单名 */
                           "[X] 退出系统  Alt+X",                  /* 系统子菜单名 */

                           "[M] 医院科室基本信息",                  /* 系统子菜单名 */
                           "[Z] 病人基本信息",                           /* 系统子菜单名 */
                           "[O] 就诊记录基本信息",                   /* 系统子菜单名 */

                           "[M] 医院科室基本信息",                  /* 系统子菜单名 */
                           "[Z] 病人基本信息",                           /* 系统子菜单名 */
                           "[O] 就诊记录基本信息",                   /* 系统子菜单名 */

                           "[M] 医院科室基本信息",                  /* 系统子菜单名 */
                           "[Z] 病人基本信息",                           /* 系统子菜单名 */
                           "[O] 就诊记录基本信息",                   /* 系统子菜单名 */

                           "[M] 医院科室基本信息",                  /* 系统子菜单名 */
                           "[Z] 病人基本信息",                           /* 系统子菜单名 */
                           "[O] 就诊记录基本信息",                   /* 系统子菜单名 */

                           "[M] 医院科室基本信息",                  /* 系统子菜单名 */
                           "[Z] 病人基本信息",                           /* 系统子菜单名 */
                           "[O] 就诊记录基本信息",                   /* 系统子菜单名 */

                           "输出科室基本信息",/* 系统子菜单名 */
                           "输出病人基本信息",/* 系统子菜单名 */
                           "输出就诊记录基本信息",/* 系统子菜单名 */
                           "",
                           "[T] 帮助主题",/* 系统子菜单名 */
                           "[A] 关于本系统"/* 系统子菜单名 */
                          };
int ga_sub_menu_count[] = {5, 3, 3,3, 3, 3,6}; /* 各主菜单项下子菜单的个数 */
int gi_sel_menu = 1;                        /* 被选中的主菜单项号,初始为1 */
int gi_sel_sub_menu = 0;                    /* 被选中的子菜单项号,初始为0,表示未选中 */
DEPART_NODE *hp=NULL;

CHAR_INFO *gp_buff_menubar_info = NULL;     /* 存放菜单条屏幕区字符信息的缓冲区 */
CHAR_INFO *gp_buff_stateBar_info = NULL;    /* 存放状态条屏幕区字符信息的缓冲区 */

char *gp_scr_att = NULL;                    /* 存放屏幕上字符单元属性值的缓冲区 */
char *gp_use_code = NULL;                   /* 存放使用代码表的数据缓冲区 */
char *gp_type_code = NULL;                  /* 存放科室类别代码表的数据缓冲区 */
char gc_sys_state = '\0';                   /* 用来保存系统状态的字符 */

HANDLE gh_std_out;                          /* 标准输出设备句柄 */
HANDLE gh_std_in;                           /* 标准输入设备句柄 */

void Load();                                /*登陆界面*/
int LoadCode(char *filename, char **ppbuffer);  /* 代码表加载 */
int CreateList();              /* 数据链表初始化 */
void InitInterface(void);                 /* 系统界面初始化 */
void ClearScreen(void);                         /* 清屏 */
void ShowMenu(void);                            /* 显示菜单栏 */
void PopMenu(int num);                          /* 显示下拉菜单 */
void PopPrompt (int num);                        /* 显示弹出窗口 */
void PopUp(SMALL_RECT *, WORD, LABEL_BUNDLE *, HOT_AREA *);  /* 弹出窗口屏幕信息维护 */
void PopOff(void);                              /* 关闭顶层弹出窗口 */
void DrawBox(SMALL_RECT *parea);                /* 绘制边框 */
void LocSubMenu(int num, SMALL_RECT *parea);    /* 主菜单下拉菜单定位 */
void ShowState(void);                           /* 显示状态栏 */
void TagMainMenu(int num);                      /* 标记被选中的主菜单项 */
void TagSubMenu(int num);                       /* 标记被选中的子菜单项 */
int DealConInput(HOT_AREA *phot_area, int *pihot_num);  /* 控制台输入处理 */
void SetHotPoint(HOT_AREA *phot_area, int hot_num);     /* 设置热区 */
void RunSys(void);                          /* 系统功能模块的选择和运行 */
BOOL ExeFunction(int main_menu_num, int sub_menu_num);  /* 功能模块的调用 */
BOOL CloseSys(void);/* 退出系统 */

BOOL SaveSysData();             /*数据保存*/
BOOL LoadData(void);               /* 数据加载 */
BOOL SaveSysData(DEPART_NODE*head);                       /* 保存系统数据 */
BOOL BackupSysData(void);     /* 备份系统数据 */
BOOL RestoreSysData(void);  /* 恢复系统数据 */
BOOL ExitSys(void);                /* 退出系统 */

DEPART_NODE *CreateM(void);    /*创建科室信息结点*/
BOOL CreateA(void);            /*创建病人基本信息结点*/
BOOL CreateL(void);        /*创建就诊记录基本信息结点*/


BOOL ModM(void);          /*修改科室信息*/
BOOL ModA(void);         /*修改病人基本信息*/
BOOL ModL(void);         /*修改就诊记录信息*/

BOOL InserM(void);/*插入科室信息*/
BOOL InserA(void);/*插入病人基本信息*/
BOOL InserL(void);/*插入就诊记录信息*/

BOOL DeleM(void);/*删除科室信息*/
BOOL DeleA(void);/*删除病人基本信息*/
BOOL DeleL(void);/*删除就诊记录信息*/

BOOL QueryM(void);/*查询科室信息*/
BOOL QueryA(void);/*查询病人基本信息*/
BOOL QueryL(void);/*查询就诊记录基本信息*/


DEPART_NODE *findM(int num,DEPART_NODE *head);/*查找科室信息结点*/
PATIENT_NODE *findA(int num,DEPART_NODE *head);/*查找病人信息结点*/
RECORD_NODE *findL(int num,DEPART_NODE *head);/*查找就诊记录信息结点*/

void LookA();/*查询详细的病人信息*/

BOOL PutM();/*输出科室信息*/
BOOL PutA();/*输出病人基本信息*/
BOOL PutL();/*输出就诊记录信息*/
BOOL HelpTopic(void);              /* 帮助主体 */
BOOL About(void);              /* 关于系统 */

#endif /* TYPE_H_INCLUDED*/
