#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>

#ifndef TYPE_H_INCLUDED
#define TYPE_H_INCLUDED

/*
主屏幕行数和列数
*/
#define SCR_ROW 100
#define SCR_COL 140

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   detail[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 *rnext;   /*指向就诊记录信息结点的指针*/
} PATIENT_NODE;
/*
科室基本信息链结点类型定义
*/
typedef struct depart_node
{
    int number;                        /*科室编号*/
    char  name[20];                    /*科室名称*/
    char adr[20];			           /*科室地址*/
    char phone[15];			           /*科室电话*/
    struct depart_node* next;          /*指向下一结点*/
    struct patient_node* pnext;        /*指向病人信息链结点的指针*/
} 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* gp_patient_info_filename="patient.dat";       /*病人基本信息数据文件*/
char* gp_record_info_filename="record.dat";         /*就诊记录信息数据文件*/
char* gp_depart_info_filename="depart.dat";      /*科室信息数据文件*/ 

char *ga_main_menu[] = {"文件(F)  ",                            /* 系统主菜单名 */
                        "创建(A)  ",                            /* 系统主菜单名 */
                        "修改(M)  ",                            /* 系统主菜单名 */
                        "插入(I)  ",                            /* 系统主菜单名 */
                        "删除(D)  ",                            /* 系统主菜单名 */
                        "查询(Q)  ",                            /* 系统主菜单名 */
                        "帮助(H)  "                             /* 系统主菜单名 */
                        };

char *ga_sub_menu[] = {"[L]数据加载",
                       "[S] 数据保存",      	                /* 系统子菜单名 */
                       "[X] 退出系统",                   /* 系统子菜单名 */

                       "[M] 医院科室基本信息",                  /* 系统子菜单名 */
                       "[Z] 病人基本信息",                      /* 系统子菜单名 */
                       "[O] 就诊记录基本信息",                  /* 系统子菜单名 */

                       "[M] 医院科室基本信息",                  /* 系统子菜单名 */
                       "[Z] 病人基本信息",                      /* 系统子菜单名 */
                       "[O] 就诊记录基本信息",                  /* 系统子菜单名 */

                       "[M] 医院科室基本信息",                  /* 系统子菜单名 */
                       "[Z] 病人基本信息",                      /* 系统子菜单名 */
                       "[O] 就诊记录基本信息",                  /* 系统子菜单名 */

                       "[M] 医院科室基本信息",                  /* 系统子菜单名 */
                       "[Z] 病人基本信息",                      /* 系统子菜单名 */
                       "[O] 就诊记录基本信息",                  /* 系统子菜单名 */

                       "[M] 医院科室基本信息",                  /* 系统子菜单名 */
                       "[Z] 病人基本信息",                      /* 系统子菜单名 */
                       "[O] 就诊记录基本信息",                  /* 系统子菜单名 */
                       "",
                       "输出全部科室基本信息",                      /* 系统子菜单名 */
                       "输出全部病人基本信息",                      /* 系统子菜单名 */
                       "输出全部就诊记录基本信息",                  /* 系统子菜单名 */
                                     
                       "[T] 帮助主题",                          /* 系统子菜单名 */
                       "[A] 关于本系统"                         /* 系统子菜单名 */
                       };
int ga_sub_menu_count[] = {3, 3, 3,3, 3, 7,2}; /* 各主菜单项下子菜单的个数 */
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 gc_sys_state = '\0';                      /* 用来保存系统状态的字符 */
                                              
HANDLE gh_std_out;                             /* 标准输出设备句柄 */
HANDLE gh_std_in;                              /* 标准输入设备句柄 */
                                              
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 ExitSys(void);                /* 退出系统 */

DEPART_NODE *CreateD(void);    /*创建科室信息结点*/
BOOL CreateP(void);            /*创建病人基本信息结点*/
BOOL CreateR(void);            /*创建就诊记录基本信息结点*/


BOOL ModD(void);          /*修改科室信息*/
BOOL ModP(void);          /*修改病人基本信息*/
BOOL ModR(void);          /*修改就诊记录信息*/

BOOL InserD(void);/*插入科室信息*/
BOOL InserP(void);/*插入病人基本信息*/
BOOL InserR(void);/*插入就诊记录信息*/

BOOL DeleD(void);/*删除科室信息*/
BOOL DeleP(void);/*删除病人基本信息*/
BOOL DeleR(void);/*删除就诊记录信息*/

BOOL QueryD(void);/*查询科室信息*/
BOOL QueryP(void);/*查询病人基本信息*/
BOOL QueryR(void);/*查询就诊记录基本信息*/


DEPART_NODE *findD(int num,DEPART_NODE *head);/*查找科室信息结点*/
PATIENT_NODE *findP(int num,DEPART_NODE *head);/*查找病人信息结点*/
RECORD_NODE *findR(int num,DEPART_NODE *head);/*查找就诊记录信息结点*/

void LookP();/*查询详细的病人信息*/

BOOL PutD();/*输出科室信息*/
BOOL PutP();/*输出病人基本信息*/
BOOL PutR();/*输出就诊记录信息*/
BOOL HelpTopic(void);              /* 帮助说明 */
BOOL About(void);                  /* 关于系统 */

#endif /* TYPE_H_INCLUDED*/
