员工管理系统 ---------C 语言

本系统有小部分代码借鉴了以下这位朋友的代码,并加以改进,大部分代码,都是自己编写的.

作者:F__Rong
来源:CSDN
原文:https://blog.csdn.net/f__rong/article/details/75765571

注意:因为我模块分的比较多,代码量很大,不太好组织和粘贴,我只把部分代码粘贴进来,供给各位参考.
需要的朋友可以自己去下载:https://download.csdn.net/download/pjfxiaopan2/10745603
如果没有没有积分的朋友,可以留言你的QQ邮箱,我有空的时候给你发

简介

这个是我自己用C语言编写的员工信息管理系统,算是我这一点时间来对所学习C语言的一个总结的作品.代码量还是蛮大的.功能比较丰富,包含了三个端,员工端,部门经理端,超级管理员端. 员工端可以申请请假/加薪/转正(如果是试用期)/查看自己本月应得工资等操作.部门管理员可以对员工的申请进行审核等操作.管理员可以设置公司组织机构等操作.

本系统对于正在学习以及刚学习完C语言,希望巩固一下语法知识的朋友,具有比较高的借鉴意义.比如数组/函数指针的使用/对文件的写入和读取/结构体的设计/枚举等语法的善用/光标的控制/界面的美化(本系统并没有做具体的美化,但是提供了几个美化的函数,比如设置颜色的函数Color(),以及控制光标的函数controlcursor()等函数,你可以自己去美化);

注意,本系统是使用VS2015编写的.所以如果用VC来运行的话,需要自己修改部分语法.

管理员密码在admin.txt文件中
员工和部门经理密码在初始都是123456

图片: 整个系统的框架图,其中有小部分功能没有做,有心的人可以自己加

// main()主文件以及algorithm.h算法模块代码


#include "Login.h"
#include "file.h"
#include "Menu.h"
int main()
{
	//加载数据
	Load();
	//登入模块
	int nRet = Login();
	switch (nRet)
	{
	case 0:
		EXIT();
	case 1:
		g_nLevel = e_admin; //登录成功,则权限为管理员;
		while (MainMenu_1())//管理员主界面
			;
		break;
	case 2:  //部门经理主界面
		g_nLevel = e_manager;
		while (MainMenu_3())//部门经理主界面
			;
		break;
	case 3:
		g_nLevel = e_worker;
		while (MainMenu_2())//员工主界面
			;
	}
	return 0;
}





// algorithm.h算法模块
#include "algorithm.h"
//打印部门职位

static void PrintPost(char *pName);
static bool SortbyNum(S_WORKER*, S_WORKER*);//工号
static bool SortbyName(S_WORKER*, S_WORKER*);//姓名
static bool SortbySala(S_WORKER*, S_WORKER*);//基本工资
static bool SortbyPost(S_WORKER*, S_WORKER*);//部门
static void ModifyPsw_1();//员工修改密码
static void ModifyPsw_2();//部门经理修改密码
static void ModifyPsw_3();//超级管理员修改密码
void Delete_dpt();
void Delete_post();
void Delete_manager();
void Delete_Request();//删除员工节点
void Delete_worker();//释放员工链表堆内存
//void setColor(unsigned short backColor = 0, unsigned short textColor = 7);
void setColor(char c1 = '0', char c2 = '7');

void AddSnode_Worker(S_WORKER * pworker)
{
	PWORKER pnode = (PWORKER)malloc(sizeof(SWORKER));
	pnode->s_data = *pworker;
	pnode->s_pNext = g_worker_head;
	g_worker_head = pnode;
}

void AddSnode_Manager(S_DADMIN *pdata)
{
	PDADMIN  pnode = (PDADMIN)malloc(sizeof(S_NODE_DEPARTMENT_ADMIN));
	pnode->data = *pdata;
	pnode->pnext = g_dptManger_head;
	g_dptManger_head = pnode;
}


unsigned short GetMonth()//获取当前月份
{
	time_t timer;
	time(&timer);
	tm *ptime = localtime(&timer);
	asctime(ptime);
	//printf("%d", time->tm_mon+1);
	return ptime->tm_mon;
}
time_t GetNowTime()//获取当前时间
{
	time_t timer;
	time(&timer);
	return timer;
}

int Confirm_Number()
{
	int n = 0;
	do
	{
		printf("请选择:");
		int nRet = scanf("%d", &n);
		if (!nRet)
		{
			printf("只能输入数字哦!\n");
			rewind(stdin);
			continue;
		}
		else
			break;
	} while (true);
	return n;
}
void Print_Worker(S_WORKER *pworker)
{
	if (g_worker_head == NULL)
	{
		printf("无信息可打印");
		return;
	}
	system("cls");
	printf("工号     姓名     性别     职务       所属部门     状态1    实际工资  加班  请假  处分  状态2    员工请求\n");//状态1为是否正式工,2为是否请假/休假/离职
	PWORKER pNode = g_worker_head;
	printf("_________________________________________________________________________________________________________\n");
	if (pworker)
	{
		if (g_nLevel == e_manager)
		{
			if (strcmp(pworker->ss_Dpt, gp_manager->ss_Department) == 0)
				printf("%-8s%-10s%-8s%-12s%-12s%-12s%-9.0f%-6d%-6d%-6d%-12s%-15s\n", pworker->ss_Number, pworker->ss_Name,
					pworker->b_sex ? "男" : "女", pworker->ss_Post, pworker->ss_Dpt, pworker->b_test ? "正式工" : "试用期", pworker->s_Sala.f_real,
					pworker->cOverDays, pworker->cLeaveDays, pworker->cPunish, pState[pworker->State], pRequest[pworker->e_request]);
			else
				printf("您无权查看该员工信息!");
		}
		if(g_nLevel==e_admin || g_nLevel==e_worker)
			printf("%-8s%-10s%-8s%-12s%-12s%-12s%-9.0f%-6d%-6d%-6d%-12s%-13s\n", pworker->ss_Number, pworker->ss_Name,
				pworker->b_sex ? "男" : "女", pworker->ss_Post, pworker->ss_Dpt, pworker->b_test ? "正式工" : "试用期", pworker->s_Sala.f_real,
				pworker->cOverDays, pworker->cLeaveDays, pworker->cPunish, pState[pworker->State], pRequest[pworker->e_request]);

		return;
	}

	while (pNode)
	{
		if (g_nLevel == e_manager && strcmp(pNode->s_data.ss_Dpt, gp_manager->ss_Department) == 0)
		{//如果是部门主管,则只能查看自己所属部门的员工.
			printf("%-8s%-10s%-8s%-12s%-12s%-12s%-9.0f%-6d%-6d%-6d%-12s%-13s\n", pNode->s_data.ss_Number, pNode->s_data.ss_Name,
				pNode->s_data.b_sex ? "男" : "女", pNode->s_data.ss_Post, pNode->s_data.ss_Dpt, pNode->s_data.b_test ? "正式工" : "试用期", pNode->s_data.s_Sala.f_real,
				pNode->s_data.cOverDays, pNode->s_data.cLeaveDays, pNode->s_data.cPunish, pState[pNode->s_data.State], pRequest[pNode->s_data.e_request]);
		}
		if(g_nLevel==e_admin)
		{
			printf("%-8s%-10s%-8s%-12s%-12s%-12s%-9.0f%-6d%-6d%-6d%-12s%-13s\n", pNode->s_data.ss_Number, pNode->s_data.ss_Name,
				pNode->s_data.b_sex ? "男" : "女", pNode->s_data.ss_Post, pNode->s_data.ss_Dpt, pNode->s_data.b_test ? "正式工" : "试用期", pNode->s_data.s_Sala.f_real,
				pNode->s_data.cOverDays, pNode->s_data.cLeaveDays, pNode->s_data.cPunish, pState[pNode->s_data.State], pRequest[pNode->s_data.e_request]);
		}
		pNode = pNode->s_pNext;
	}
}

//输入参数为只打印指定的职位信息.否则为全部打印
void Print_post(char *pName)
{
	if (!g_post_head)
	{
		printf("当前无职位信息!");
		system("pause");
		return;
	}
	puts("职位名称     基本工资      试用期工资      所属部门");
	PPOST pnode = g_post_head;
	if (!pName)
	{
		while (pnode)
		{
			printf("%-15s%-15.0f%-10.0f%12s\n", pnode->data.ss_postName, pnode->data.f_baseSala,
				pnode->data.f_TestSala, pnode->data.ss_dptName);
			pnode = pnode->pnext;
		}
	}
	else
	{
		bool flag = false;
		while (pnode)
		{
			if (strcmp(pName, pnode->data.ss_dptName) == 0)
			{
				flag = true;
				printf("%-10s%-10f%-10f%10s\n", pnode->data.ss_postName, pnode->data.f_baseSala,
					pnode->data.f_TestSala, pnode->data.ss_dptName);
			}
			pnode = pnode->pnext;
		}
		if (!flag)
		{
			printf("未找到该职位信息!");
		}
	}
}
/
以下代码为组织的增删改查/
/
void PrintDpt(S_DPT * pdata)
{
//	system("cls");
	if (pdata)
	{
		printf("%-10s%-15s%-10s%-10s\n", pdata->ss_dptNum, pdata->ss_dptName, pdata->ss_dpt_manager,
			pdata->ss_dpt_manager_num);
		printf("----------------------------------------------------------\n");
		return;
	}
	if (!g_dpt_head)
	{
		puts("当前无部门信息,请添加!");
		return;
	}

	PDPT pnode = g_dpt_head;
	printf("部门编号   部门名称   部门主管   主管编号   其他\n");
	while (pnode)
	{
		printf("%-10s%-15s%-10s%-10s\n",pnode->data.ss_dptNum,pnode->data.ss_dptName, pnode->data.ss_dpt_manager,
			pnode->data.ss_dpt_manager_num);
		//printf("\n");
		//printf("\t+++此部门包含职位:");
		//PrintPost(pnode->data.ss_dptName);//根据部门编号,打印职位
		//printf("\n");
		printf("----------------------------------------------------------\n");
		//printf("\n\n");
		pnode = pnode->pnext;
	}
}


bool CheckDpt(char* pchar, int nindex, S_DPT** ppdata) //找到返回true,否则返回false
{
	if (!g_dpt_head)
		return false;
	PDPT pnode = g_dpt_head;
	while (pnode)
	{
		if (nindex == 1)
		{
			if (strcmp(pchar, pnode->data.ss_dptNum) == 0)
			{
				if (ppdata)  //如果ppdata不是NULL,就返回被找到的数据地址
					*ppdata = &pnode->data;
				return true;
			}
		}
		if(nindex == 2)
		{
			if (strcmp(pchar, pnode->data.ss_dptName) == 0)
			{
				if (ppdata)  //如果ppdata不是NULL,就返回被找到的数据地址
					*ppdata = &pnode->data;
				return true;
			}
		}
		if (nindex == 3)
		{
			if (strcmp(pchar, pnode->data.ss_dpt_manager_num) == 0)
			{
				if (ppdata)  //如果ppdata不是NULL,就返回被找到的数据地址
					*ppdata = &pnode->data;
				return true;
			}
		}
		pnode = pnode->pnext;
	}
	return false;
}

bool CheckPostName(char * pName, S_POST ** ppdata)
{
	if (g_post_head == NULL)
		return false;
	PPOST pnode = g_post_head;
	while (pnode)
	{
		if(strcmp(pnode->data.ss_postName, pName) == 0)
		{
			if (ppdata)
				*ppdata = &pnode->data;
			return true;
		}
		pnode = pnode->pnext;
	}
	return false;
}

bool CheckWorker(char *pNum, S_WORKER **ppworker)
{
	if (!g_worker_head)
		return false;
	PWORKER pnode = g_worker_head;
	while (pnode)
	{
		if (strcmp(pNum, pnode->s_data.ss_Number) == 0)
		{
			if (ppworker)
				*ppworker = &pnode->s_data;
			return true;
		}
		pnode = pnode->s_pNext;
	}
	return false;
}
bool CheckDManager(char *pNum, S_DADMIN **ppManager)
{
	if (!g_dptManger_head)
		return false;
	PDADMIN pnode = g_dptManger_head;
	while (pnode)
	{
		if (strcmp(pNum, pnode->data.ss_Num) == 0)
		{
			if (ppManager)
				*ppManager = &pnode->data;
			return true;
		}
		pnode = pnode->pnext;
	}
	return false;
}

int Delete_Manager()
{
	char sNum[15];
	while (1)
	{
		system("cls");
		printf("请输入要删除的工号:");
		scanf_s("%s", sNum, sizeof(sNum));
		if (strlen(sNum) == 0)
		{
			printf("长度不能长于14个字符\n");
			system("pause");
			continue;
		}
		S_DADMIN *pManager=NULL;
		if (!CheckDManager(sNum, &pManager))
		{
			printf("未找到该主管工号,请重新输入.\n");
			system("pause");
			continue;
		}
		
		Print_DptManager(pManager);
		
		printf("确定要删除此主管信息吗?(y/n):");
		if (!goOn())
		{
			puts("您取消了当前的删除操作");
			Sleep(2000);
			return 0;
		}
		PDADMIN pnode = g_dptManger_head,p1=NULL;
		if (strcmp(pnode->data.ss_Num, sNum) == 0)
		{
			g_dptManger_head = g_dptManger_head->pnext;
			free(pnode);
			break;
		}
		p1 = pnode;
		while (pnode)
		{
			if (strcmp(pnode->data.ss_Num, sNum) == 0)
			{
				p1->pnext = pnode->pnext;
				free(pnode);
				break;
			}
			p1 = pnode;
			pnode = pnode->pnext;
		}
		break;
	}
	S_DPT *pDpt = NULL;
	if (CheckDpt(sNum, 1, &pDpt))  //同步更新到dpt.txt;
	{
		strcpy(pDpt->ss_dpt_manager, "暂无");
		strcpy(pDpt->ss_dpt_manager_num, "暂无");
	}
	puts("删除成功!");
	return 0;
}

void AddSnode_Dpt(S_DPT *data)//头插法
{
	PDPT pnode = (PDPT)malloc(sizeof(S_NODE_DPT));
	pnode->data = *data;
	pnode->pnext = g_dpt_head;
	g_dpt_head = pnode;
}
void ModifySnode_Dpt(S_DPT * pdata)
{
	system("cls");
	printf("您当前要修改的记录为信息为:\n");
	PrintDpt(pdata);
	printf("确认要修改吗?(y/n):");
	if (!goOn())
	{
		printf("您取消了本次修改!");
		Sleep(1000);
		return;
	}

	char oldName[15];
	strcpy(oldName, pdata->ss_dptName);//拷贝原名称

	system("cls");
	puts("新编号:");
	puts("新部门名称:");
	COORD coord = {7,0};
	while (1)
	{
		gotoxy(7, 0);
		char snum[15];
		scanf_s("%s", snum, sizeof(snum));
		if (strlen(snum) == 0)
		{
			controlcursor(coord, "编号不能长于14个字符!");
			continue;
		}
		strcpy(pdata->ss_dptNum, snum);
		break;
	}
	coord = { 11,1 };
	while (1)
	{
		gotoxy(11, 1);
		char sName[15];
		scanf_s("%s", sName, sizeof(sName));
		if (strlen(sName) == 0)
		{
			controlcursor(coord, "名称不能长于7个字符");
			continue;
		}
		strcpy(pdata->ss_dptName, sName);
		break;
	}
	Uplist_Post(oldName, pdata->ss_dptName);//联动更新g_post_head
	Uplist_worker(oldName, pdata->ss_dptName);//联动更新g_worker_head
	Uplist_manager(oldName, pdata->ss_dptName);//联动更新g_worker_head
}

int DptManage_Menu()
{
	system("cls");
	puts("1.查看主管列表");
	puts("2.添加部门主管");
	puts("3.删除部门主管");
	puts("4.返回上一级");
	puts("0.退出程序");
	printf("请选择:");
	int n = Confirm_Number();
	switch (n)
	{
	case 1:
		Print_DptManager();
		system("pause");
		break;
	case 2:
		while (Add_DptManager())
			;
		Save_Manager();
		Save_dpt();
		break;
	case 3:
		while (Delete_Manager())
			;
		Save_Manager();
		Save_dpt();
		break;
	case 4:
		return 0;
		break;
	case 0:
		EXIT();
	}
	return n;
}

void Print_DptManager(S_DADMIN * pManager)
{
	if (g_dptManger_head == NULL)
	{
		printf("当前主管列表为空,请现在添加部门主管");
		Sleep(2000);
		return;
	}
	//system("cls");
	printf("工号     姓名     性别     管理部门     实际工资\n");//状态1为是否正式工,2为是否请假/休假/离职
	printf("___________________________________________________________________________\n");
	if (pManager)
	{
		printf("%-8s%-10s%-8s%-15s%-9.0f\n", pManager->ss_Num, pManager->ss_Name, pManager->b_sex ? "男" : "女",
			pManager->ss_Department, pManager->s_Sala.f_base);
		return;
	}
	PDADMIN pnode = g_dptManger_head;
	while (pnode)
	{
		printf("%-8s%-10s%-8s%-15s%-9.0f\n",pnode->data.ss_Num,pnode->data.ss_Name,pnode->data.b_sex?"男":"女",
			pnode->data.ss_Department,pnode->data.s_Sala.f_base);
		pnode = pnode->pnext;
	}
}

int Add_DptManager()
{
	system("cls");
	puts("工号:");
	puts("姓名:");
	puts("性别:      (0为女,1为男)");
	puts("管理的部门:");
	puts("工资:");
	S_DADMIN Manager;
	COORD coord = { 5,0 };
	while (1) //工号
	{
		gotoxy(5, 0);
		scanf_s("%s", Manager.ss_Num, sizeof(Manager.ss_Num));
		if (strlen(Manager.ss_Num) == 0)
		{
			controlcursor(coord, "工号不能长于14个字符.");
			continue;
		}
		if (CheckDManager(Manager.ss_Num))//检查工号是否有重复.
		{
			controlcursor(coord, "该工号已存在!");
			continue;
		}
		break;
	}
	coord = { 5,1 };
	while (1) //姓名
	{
		gotoxy(5, 1);
		scanf_s("%s", Manager.ss_Name, sizeof(Manager.ss_Name));
		if (strlen(Manager.ss_Name) == 0)
		{
			controlcursor(coord, "姓名不能长于7个汉字.");
			continue;
		}
		break;
	}
	coord = { 5,2 };
	while (1) //性别
	{
		gotoxy(5, 2);
		rewind(stdin);
		char c;
		scanf("%c", &c);
		if (c != '0' && c != '1')
		{
			controlcursor(coord, "只能输入0或者1");
			continue;
		}
		c == '0' ? Manager.b_sex = 0 : Manager.b_sex = 1;
		break;
	}
	coord = { 11,3 };
	S_DPT *pdpt;
	while (1) //所管理的部门
	{
		gotoxy(11, 3);
		scanf_s("%s", Manager.ss_Department, sizeof(Manager.ss_Department));
		if (strlen(Manager.ss_Department) == 0)
		{
			controlcursor(coord, "职务名称不能长于7个汉字.");
			continue;
		}
		if (!CheckDpt(Manager.ss_Department,2,&pdpt))
		{
			controlcursor(coord, "当前无此部门名称!");
			continue;
		}
		break;
	}
	coord = { 5,4 };
	while (1) 
	{
		gotoxy(5, 4);
		rewind(stdin);
		int n = scanf("%f", &Manager.s_Sala.f_base);
		if (!n)
		{
			controlcursor(coord, "只能输入数字!");
			continue;
		}
		Manager.s_Sala = { GetMonth(), Manager.s_Sala.f_base,0,0, Manager.s_Sala.f_base ,"" };
		break;
	}
	strcpy(pdpt->ss_dpt_manager, Manager.ss_Name);//同步更新到dpt.txt文件
	strcpy(pdpt->ss_dpt_manager_num, Manager.ss_Num);//同步更新到dpt.txt文件
	pdpt->ss_Free[0] = '\0';

	Manager.cLeaveDays = 0;
	Manager.cOverDays = 0;
	Manager.cPunish = 0;
	strcpy(Manager.ss_Psw, "123456");//员工密码初始统一为123456
	Manager.n_Level = e_manager;
	Manager.ss_Free[0] = '\0';
	/*strcpy(Manager.ss_Free, "");*/
	AddSnode_Manager(&Manager);//添加到链表
	printf("\n添加完成,是否继续添加?(y/n):");
	return goOn();
}

void PrintPost(char * pName)
{
	if (g_post_head == NULL)
	{
		printf("暂无\n");
		return;
	}
	PPOST pnode = g_post_head;
	while (pnode)
	{
		if(strcmp(pnode->data.ss_dptName,pName)==0)
			printf("%s  ", pnode->data.ss_postName);
		pnode = pnode->pnext;
	}
}
int AddDpt()//添加部门
{

	S_DPT data;
	COORD coord = { 10,0 };
	do
	{
		system("cls");
		puts("部门编号:");
		puts("部门名称:");
		while (true)
		{
			gotoxy(10, 0);
			scanf_s("%s", data.ss_dptNum, sizeof(data.ss_dptNum));
			//如果输入长度过长,则data.ss_dptNum为空
			if (strlen(data.ss_dptNum) == 0)
			{
				controlcursor(coord, "部门编号长度不能大于14个字符!");
				continue;
			}
			if (CheckDpt(data.ss_dptNum,1))//检查部门名称是否已经存在
			{
				controlcursor(coord, "该部门编号已存在,请重新输入!");
				continue;
			}
			break;
		}
		while (true)
		{
			gotoxy(10, 1);
			scanf_s("%s", data.ss_dptName, sizeof(data.ss_dptName));
			if (strlen(data.ss_dptName) == 0)
			{
				controlcursor(coord, "部门名称长度不能大于7个汉字!");
				continue;
			}
			if (CheckDpt(data.ss_dptName,2))//检查部门名称是否已经存在
			{
				controlcursor(coord, "该部门已存在,请重新输入!");
				continue;
			}
			break;
		}
		strcpy_s(data.ss_dpt_manager, sizeof(data.ss_dpt_manager), "暂无");
		strcpy_s(data.ss_dpt_manager_num, sizeof(data.ss_dpt_manager_num), "暂无");
		data.ss_Free[0] = '\0';
		/*while (true)
		{
			gotoxy(10, 1);
			coord = { 10,1 };
			int nRet = scanf("%d", &data.ss_dpt_level);
			if (nRet == 0)
			{
				controlcursor(coord, "只能输入数字哦!");
				continue;
			}
			break;
		}*/
		AddSnode_Dpt(&data);//添加到部门链表
		printf("录入完成,是否继续?(y/n)");
	} while (goOn());
	return 0;
}

void AddSnode_Post(S_POST * data)
{
	PPOST pnode = (PPOST)malloc(sizeof(S_NODE_POST));
	pnode->data = *data;
	pnode->pnext = g_post_head;
	g_post_head = pnode;
}

void Modify_Dpt()
{
	system("cls");
	if (g_post_head == NULL)
	{
		puts("当前无部门信息,请添加!");
		system("pause");
		return;
	}
	puts("当前正在进行修改操作.");
	printf("---------------------------------------------\n");
	printf("请输入部门编号:\n");
	printf("---------------------------------------------\n");
	printf("当前部门信息为:\n\n");
	PrintDpt();
	char sNum[20] = {""};
	COORD coord = { 15,2 };
	while (true)
	{
		gotoxy(15, 2);
		scanf_s("%s", sNum, sizeof(sNum));
		if (strlen(sNum) == 0)
		{
			controlcursor(coord, "编号不能长于14个字符.");
			continue;
		}
		S_DPT *pdata;
		if (CheckDpt(sNum, 1,&pdata))
		{
			ModifySnode_Dpt(pdata);
			printf("更新成功!");
			system("pause");
		}
		else
		{
			controlcursor(coord, "未找到相关编号,请重新输入!");
			continue;
		}
		break;
	}
	
}

void Delete_Dpt()
{
	system("cls");
	if (g_post_head == NULL)
	{
		puts("当前无部门信息,请添加!");
		system("pause");
		return;
	}
	puts("当前正在进行删除操作.");
	printf("---------------------------------------------\n");
	printf("请输入部门编号:\n");
	printf("---------------------------------------------\n");
	printf("当前部门信息为:\n\n");
	PrintDpt();
	char sNum[20] = { "" };
	COORD coord = { 15,2 };
	while (true)
	{
		gotoxy(15, 2);
		scanf_s("%s", sNum, sizeof(sNum));
		if (strlen(sNum) == 0)
		{
			controlcursor(coord, "编号不能长于14个字符.");
			continue;
		}
		S_DPT *pdata;
		if (CheckDpt(sNum, 1, &pdata))
		{
			if (CheckPostName(pdata->ss_dptName)) //要删除的部门下必须没有对应职位信息
			{
				printf("当前部门下有职位信息,无法删除!");
				system("pause");
				return;
			}
			DeleteSnode_Dpt(pdata); 
			printf("删除成功!");
			Save_dpt();//保存部门信息
			system("pause");
		}
		else
		{
			controlcursor(coord, "未找到相关编号,请重新输入!");
			continue;
		}
		break;
	}
}

void DeleteSnode_Dpt(S_DPT * pdata)
{
	if (g_dpt_head == NULL)
		return;
	PDPT pnode = g_dpt_head;
	if (strcmp(g_dpt_head->data.ss_dptNum, pdata->ss_dptNum) == 0)
	{//如果第一个就是
		g_dpt_head = g_dpt_head->pnext;
		free(pnode);
		return;
	}
	PDPT p1= pnode;
	while (pnode)
	{
		if (strcmp(pnode->data.ss_dptNum, pdata->ss_dptNum) == 0)
		{
			p1->pnext = pnode->pnext;
			free(pnode);
			return;
		}
		p1 = pnode;
		pnode = pnode->pnext;
	}
}

bool Delete_Worker()
{
	system("cls");
	Print_Worker();
	printf("_________________________________________________________________________________________________\n");
	printf("请输入你要删除的员工工号:");
	char sNum[15];
	scanf_s("%s", sNum, sizeof(sNum));
	S_WORKER *pworker;
	if (!CheckWorker(sNum, &pworker))
	{
		printf("未找到该工号员工,请检查输入是否正确?");
		system("pause");
		return false;
	}
	if (g_nLevel == e_manager)
	{
		if (strcmp(pworker->ss_Dpt, gp_manager->ss_Department))
		{
			printf("无法删除其他部门的员工!");
			system("pause");
			return  0;
		}
	}
	printf("你要删除的记录为:\n\n");
	Print_Worker(pworker);
	printf("是否确认删除本条记录(y/n):");
	if (!goOn())
	{
		printf("你取消了本次修改!\n");
		system("pause");
		return true;
	}
	DeleteSnode_Worker(pworker);
	printf("删除成功!\n");
	Sleep(2000);
	Print_Worker();
	system("pause");
	return false;
}

void DeleteSnode_Worker(S_WORKER *pworker)
{
	PWORKER pnode = g_worker_head,p1=NULL;
	if (strcmp(pnode->s_data.ss_Number, pworker->ss_Number) == 0)
	{
		g_worker_head = g_worker_head->s_pNext;
		free(pnode);
		return;
	}
	p1 = pnode;
	while (pnode)
	{
		if (strcmp(pnode->s_data.ss_Number, pworker->ss_Number) == 0)
		{
			p1->s_pNext = pnode->s_pNext;
			free(pnode);
			return;
		}
		p1 = pnode;
		pnode = pnode->s_pNext;
	}
}

void DelteSnode_Dpt(S_DPT *pdata)
{
	system("cls");
	printf("您当前要删除的记录为信息为:\n");
	PrintDpt(pdata);
	printf("确认要删除吗?(y/n):");
	if (!goOn())
	{
		printf("您取消了本次删除!");
		Sleep(1000);
		return;
	}

	char sName[15];
	strcpy(sName, pdata->ss_dptName);//拷贝原名称
	
	//Uplist_Dpt(oldName, pdata->ss_dptName);//联动更新g_post_head
}


//未完成,如果职位下有人,且该员工不是离职状态,就不能删除该职位.
//所以应该先做录入员工的模块.
void Delele_Post()
{
	system("cls");
	printf("请输入要删除的职位:");
	Print_post();
}

void Uplist_Post(char *pName,char *newName)
{
	if (g_post_head == NULL)
		return;
	PPOST pnode = g_post_head;
	while (pnode)
	{
		if (strcmp(pnode->data.ss_dptName, pName) == 0)
			strcpy(pnode->data.ss_dptName, newName);
		pnode = pnode->pnext;
	}
}

void Uplist_worker(char *pOldDptName, char *pNewDptName)
{
	if (g_worker_head == NULL)
		return;
	PWORKER pnode = g_worker_head;
	while (pnode)
	{
		if (strcmp(pnode->s_data.ss_Dpt, pOldDptName) == 0)
			strcpy(pnode->s_data.ss_Dpt, pNewDptName);
		pnode = pnode->s_pNext;
	}
}

void Uplist_manager(char * pOldDptName, char * pNewDptName)
{
	if (!g_dptManger_head)
		return; 
	PDADMIN pnode = g_dptManger_head;
	while (pnode)
	{
		if (strcmp(pnode->data.ss_Department, pOldDptName) == 0)
			strcpy(pnode->data.ss_Department, pNewDptName);
		pnode = pnode->pnext;
	}
}

bool goOn()
{
	char c;
	while(1)
	{
		rewind(stdin);
		c=getchar();
		if (c != 'y' && c != 'n')
		{
			printf("请输入合法字符.");
			continue;
		}
		break;
	}
	return c == 'y';
}




bool SortbyNum(S_WORKER *p1, S_WORKER *p2)//工号
{
	return strcmp(p1->ss_Number, p2->ss_Number) > 0;
}
bool SortbyName(S_WORKER *p1, S_WORKER *p2)//姓名
{
		return strcmp(p1->ss_Name, p2->ss_Name) > 0;
}
bool SortbySala(S_WORKER *p1, S_WORKER *p2)//基本工资
{
	return p1->s_Sala.f_base < p2->s_Sala.f_base;
}
bool SortbyPost(S_WORKER *p1, S_WORKER *p2)//部门
{
	return strcmp(p1->ss_Post, p2->ss_Post) > 0;
}

void Sort_Worker(int n_index)
{
	if (g_worker_head == NULL)
		return;
	int n = 0;
	PWORKER pnode = g_worker_head;
	while (pnode)
	{
		n++;
		pnode = pnode->s_pNext;
	}
	//申请一个指针数组
	S_NODE_WORKER **pp = (PWORKER *)malloc(sizeof(PWORKER) * (n + 1));
	pnode = g_worker_head, n = 0;
	while (pnode)//让一级指针数组分别指向每一个节点.
	{
		pp[n++] = pnode;
		pnode = pnode->s_pNext;
	}
	pp[n] = NULL;//表示结尾
	//然后开始排序
	pFuncSortWorker ps[] = { SortbyNum ,SortbyName,SortbySala,SortbyPost};

	int i = 0, j = 0, m = 0;
	while (i<n-1)
	{
		m = i, j = i + 1;//m用来记录位置
		while (j < n)
		{
			if (ps[n_index-2](&pp[m]->s_data,&pp[j]->s_data))
				m = j;
			j++;
		}
		//两个指针互相交换
		if (i != m) 
		{
			PWORKER t = pp[i];
			pp[i] = pp[m];
			pp[m] = t;
		}
		i++;
	}
	//然后打印排序后的顺序
	PrintSortWorker(pp, n);
	free(pp);//最后释放所申请的指针数组空间.
}

void PrintSortWorker(S_NODE_WORKER **pp,int n) //打印对指针数组排序后的员工顺序列表;
{
	int i = 0;
	system("cls");
	printf("工号     姓名     性别     职务       所属部门     状态1    实际工资  加班  请假  处分  状态2    员工请求\n");//状态1为是否正式工,2为是否请假/休假/离职
	printf("_________________________________________________________________________________________________________\n");
	while (pp[i])
	{
		if (g_nLevel == e_manager && strcmp(pp[i]->s_data.ss_Dpt, gp_manager->ss_Department) == 0)
		{
			printf("%-8s%-10s%-8s%-12s%-12s%-12s%-9.0f%-6d%-6d%-6d%-12s%-13s\n", pp[i]->s_data.ss_Number, pp[i]->s_data.ss_Name,
				pp[i]->s_data.b_sex ? "男" : "女", pp[i]->s_data.ss_Post, pp[i]->s_data.ss_Dpt, pp[i]->s_data.b_test ? "正式工" : "试用期", pp[i]->s_data.s_Sala.f_real,
				pp[i]->s_data.cOverDays, pp[i]->s_data.cLeaveDays, pp[i]->s_data.cPunish, pState[pp[i]->s_data.State],  pRequest[pp[i]->s_data.e_request]);
		}
		if (g_nLevel == e_admin)
		{
			printf("%-8s%-10s%-8s%-12s%-12s%-12s%-9.0f%-6d%-6d%-6d%-12s%-13s\n", pp[i]->s_data.ss_Number, pp[i]->s_data.ss_Name,
				pp[i]->s_data.b_sex ? "男" : "女", pp[i]->s_data.ss_Post, pp[i]->s_data.ss_Dpt, pp[i]->s_data.b_test ? "正式工" : "试用期", pp[i]->s_data.s_Sala.f_real,
				pp[i]->s_data.cOverDays, pp[i]->s_data.cLeaveDays, pp[i]->s_data.cPunish, pState[pp[i]->s_data.State], pRequest[pp[i]->s_data.e_request]);
		}
		++i;
	}
}
int AddDptPost()
{
	S_POST data;
	do
	{
		system("cls");
		puts("所属部门名称:");
		puts("职位名称:");
		puts("基本工资:");
		puts("试用工资:");
		COORD coord = { 14,0 };
		while (true)
		{
			gotoxy(14, 0);
			scanf_s("%s", data.ss_dptName, sizeof(data.ss_dptName));
			if (strlen(data.ss_dptName) == 0)
			{
				controlcursor(coord, "部门名称长度不能长于7个汉字.");
				continue;
			}
			if (!CheckDpt(data.ss_dptName, 2))//如果没有找到
			{
				controlcursor(coord, "部门名称未找到");
				continue;
			}
			break;
		}
		coord = { 10,1 };
		while (true)
		{
			gotoxy(10, 1);
			scanf_s("%s", data.ss_postName, sizeof(data.ss_postName));
			if (strlen(data.ss_postName) == 0)
			{
				controlcursor(coord, "职位名称长度不能长于7个汉字.");
				continue;
			}

			if (CheckPostName(data.ss_postName))
			{
				controlcursor(coord, "该职位名称已存在.");
				continue;
			}
			break;
		}
		coord = { 10,2 };
		while (true)
		{
			gotoxy(10, 2);
			int nRet = scanf("%f", &data.f_baseSala);
			if (!nRet)
			{
				controlcursor(coord, "请输入合法的数字.");
				continue;
			}
			break;
		}
		coord = { 10,3 };
		while (true)
		{
			gotoxy(10, 3);
			int nRet = scanf("%f", &data.f_TestSala);
			if (!nRet)
			{
				controlcursor(coord, "请输入合法的数字.");
				continue;
			}
			break;
		}
		strcpy(data.note, "");
		AddSnode_Post(&data);
		printf("录入成功,是否继续录入?(y/n):");
	} while (goOn());
	return 0;
}

bool AddWorker() //写好后放回algerithm.cpp里面
{
	S_WORKER worker;
	COORD coord = { 5,0 };
	while (1) //工号
	{
		gotoxy(5, 0);
		scanf_s("%s", worker.ss_Number, sizeof(worker.ss_Number));
		if (strlen(worker.ss_Number) == 0)
		{
			controlcursor(coord, "工号不能长于14个字符.");
			continue;
		}
		if (CheckWorker(worker.ss_Number))//检查工号是否有重复.
		{
			controlcursor(coord, "该工号已存在!");
			continue;
		}
		break;
	}
	coord = { 5,1 };
	while (1) //姓名
	{
		gotoxy(5, 1);
		scanf_s("%s", worker.ss_Name, sizeof(worker.ss_Name));
		if (strlen(worker.ss_Name) == 0)
		{
			controlcursor(coord, "姓名不能长于7个汉字.");
			continue;
		}
		break;
	}
	coord = { 5,2 };
	while (1) //性别
	{
		gotoxy(5, 2);
		rewind(stdin);
		char c;
		scanf("%c", &c);
		if (c != '0' && c != '1')
		{
			controlcursor(coord, "只能输入0或者1");
			continue;
		}
		c == '0' ? worker.b_sex = 0 : worker.b_sex = 1;
		break;
	}
	coord = { 5,3 };
	S_POST *ppost = NULL;
	while (1) //职务
	{
		gotoxy(5, 3);
		scanf_s("%s", worker.ss_Post, sizeof(worker.ss_Post));
		if (strlen(worker.ss_Post) == 0)
		{
			controlcursor(coord, "职务名称不能长于7个汉字.");
			continue;
		}
		if (!CheckPostName(worker.ss_Post, &ppost))
		{
			controlcursor(coord, "当前无此职务名称!");
			continue;
		}
		if (g_nLevel == e_manager)
		{
			if (strcmp(ppost->ss_dptName, gp_manager->ss_Department))
			{
				controlcursor(coord,"当前职位不属于您所在的部门,请重新输入!",50);
				continue;
			}
		}
		break;
	}
	coord = { 7,4 };
	while (1) //正式工
	{
		gotoxy(7, 4);
		rewind(stdin);
		char c;
		scanf("%c", &c);
		if (c != '0' && c != '1')
		{
			controlcursor(coord, "只能输入0或者1");
			continue;
		}
		c == '0' ? worker.b_test = 0 : worker.b_test = 1;
		//工资: 确认了职位以及是否正式工以后,就可以知道工资了
		if (worker.b_test)
			worker.s_Sala = {GetMonth(), ppost->f_baseSala,0,0, ppost->f_baseSala ,""};
		else
			worker.s_Sala = {GetMonth(), ppost->f_TestSala,0,0, ppost->f_TestSala ,"" };
		gotoxy(5, 5);
		printf("%.0f", worker.s_Sala.f_base);
		//所属部门;
		gotoxy(9, 6);
		strcpy(worker.ss_Dpt, ppost->ss_dptName);
		printf("%s", worker.ss_Dpt);
		//状态:
		worker.State = e_Onjob;//在职
		break;
	}
		worker.cLeaveDays = 0;
		worker.cOverDays = 0;
		worker.cPunish = 0;
		strcpy(worker.ss_Psw, "123456");//员工密码初始统一为123456
		worker.level = e_worker;//添加员工无法直接设置成主管.需要通过设置主管命令设置.
		//worker.s_Sala.n_Month = GetMonth();//获取本月月份
		worker.e_request = e_none;
		strcpy(worker.ss_Free, "");
	AddSnode_Worker(&worker);//添加到链表
	printf("\n添加完成,是否继续添加?(y/n):");
	return goOn();
}


void Find_Worker(int nIndex)
{
	char data[15];
	while (true)
	{
		system("cls");
		if (nIndex == 1)
			printf("请输入工号:");
		else
			printf("请输入姓名:");
		scanf_s("%s", data, sizeof(data));
		if (!strlen(data))
		{
			printf("不能长于15个字符或7个汉字");
			continue;
		}
		break;
	}
	PWORKER pnode = g_worker_head;
	while (pnode)
	{
		if (nIndex == 1 && strcmp(pnode->s_data.ss_Number, data) == 0)
		{
			Print_Worker(&pnode->s_data);
			return;
		}
		if (nIndex == 2 && strcmp(pnode->s_data.ss_Name, data) == 0)
				Print_Worker(&pnode->s_data);
		pnode = pnode->s_pNext;
	}
	if (pnode == NULL)
	{
		puts("未查找到该员工信息,请确认是否输入正确!");
		Sleep(2000);
	}

}

int ModifyWorker()
{
	system("cls");
	Print_Worker();
	printf("_________________________________________________________________________________________________\n");
	printf("请输入你要修改的员工工号:");
	char sNum[15];
	scanf_s("%s", sNum, sizeof(sNum));
	S_WORKER *pworker;
	if (!CheckWorker(sNum, &pworker))
	{
		printf("未找到该工号员工,请检查输入是否正确?");
		system("pause");
		return  0;
	}
	if (g_nLevel == e_manager)
	{
		if (strcmp(pworker->ss_Dpt, gp_manager->ss_Department))
		{
			printf("无法修改其他部门的员工信息!");
			system("pause");
			return  0;
		}
	}
	printf("你要修改的记录为:\n\n");
	Print_Worker(pworker);
	printf("是否确认修改本条记录(y/n):");
	if (!goOn())
	{
		printf("你取消了本次修改!\n");
		system("pause");
		return 0;
	}
	int n=ModifyMenu_pjf();
	S_WORKER worker;
	switch (n)
	{
	case 1:
		printf("请输入新工号:");
		scanf_s("%s", worker.ss_Dpt, sizeof(worker.ss_Number));
		strcpy(pworker->ss_Number, worker.ss_Number);
		break;
	case 2:
		printf("请输入姓名:");
		scanf_s("%s", worker.ss_Name, sizeof(worker.ss_Name));
		strcpy(pworker->ss_Name, worker.ss_Name);
		break;
	case 3:
		pworker->b_sex = !pworker->b_sex;
		printf("性别修改成功!");
		Sleep(1000);
		break;
	case 4:
		printf("请输入新密码:");//管理员及部门经理不需要验证旧密码.
		scanf_s("%s", worker.ss_Psw, sizeof(worker.ss_Psw));
		strcpy(pworker->ss_Psw, worker.ss_Psw);
		break;
	case 5:
		while (true)
		{
			printf("请输入工资:");
			if (!scanf("%f", &worker.s_Sala.f_base))
			{
				printf("只能输入数值!\n");
				continue;
			}
			break;
		}
		pworker->s_Sala.f_base = worker.s_Sala.f_base;
		pworker->s_Sala.f_real = worker.s_Sala.f_base-worker.s_Sala.f_cut+worker.s_Sala.f_bonus;
		break;
	case 6:
		printf("请输入要归属哪个部门:");
		scanf_s("%s", worker.ss_Dpt, sizeof(worker.ss_Dpt));
		strcpy(pworker->ss_Dpt, worker.ss_Dpt);
		break;
	case 7:
		{
			printf("转正后,员工工资将自动变成正式工工资,确认要转正吗?(y/n)");
			if (!goOn())
			{
				printf("您取消了转正操作!");
				Sleep(1000);
				return 1;
			}
			S_POST *ppost = NULL;
			CheckPostName(pworker->ss_Dpt, &ppost);
			if (ppost)
				pworker->s_Sala.f_base = ppost->f_baseSala;
			pworker->b_test = 1;
			printf("已转正!");
		}
		break;
	case 8:
		{
			printf("请输入当前状态(在职/休假/离职):");
			char s_State[5];
			scanf_s("%s", s_State, sizeof(s_State));
			if (strcmp(s_State, "在职")==0)
				pworker->State = e_Onjob;
			if (strcmp(s_State, "休假")==0)
				pworker->State = e_Leave;
			if (strcmp(s_State, "离职")==0)
				pworker->State = e_Quit;
		}
		break;
	case 9:
		printf("请输入实际加班天数:");
		scanf_s("%d", &worker.cOverDays);
		pworker->cOverDays = worker.cOverDays;
		break;
	case 10:
		printf("请输入实际请假天数:");
		scanf_s("%d", &worker.cLeaveDays);
		pworker->cLeaveDays = worker.cLeaveDays;
		break;
	case 11:
		printf("请输入实际处分次数:");
		scanf_s("%d", &worker.cPunish);
		pworker->cPunish = worker.cPunish;
		break;
	case 12:
		return 0;
	case 0:
		EXIT();
		break;
	}
	return 0;
}

void Delete_Request()//删除员工请求链表
{
	if (gp_request_head == NULL)
		return;
	S_NODE_REQUEST *pnode = gp_request_head;
	while (pnode)
	{
		gp_request_head = gp_request_head->pnext;
		free(pnode);
		pnode = gp_request_head;
	}
}
void EXIT()
{	
	Delete_worker();
	Delete_dpt();
	Delete_post();
	Delete_manager();
    Delete_Request();//删除员工节点
	exit(0);
}


void Delete_worker()
{
	if (g_worker_head == NULL)
		return;
	PWORKER pnode = NULL;
	while (g_worker_head)
	{
		pnode = g_worker_head;
		g_worker_head = g_worker_head->s_pNext;
		free(pnode);
	}
}

void Delete_dpt()
{
	if (g_dpt_head == NULL)
		return;
	PDPT pnode = NULL;
	while (g_dpt_head)
	{
		pnode = g_dpt_head;
		g_dpt_head = g_dpt_head->pnext;
		free(pnode);
	}
}
void Delete_post()
{
	if (g_post_head == NULL)
		return;
	PPOST pnode = NULL;
	while (g_post_head)
	{
		pnode = g_post_head;
		g_post_head = g_post_head->pnext;
		free(pnode);
	}
}
void Delete_manager()
{
	if (g_dptManger_head == NULL)
		return;
	PDADMIN pnode = NULL;
	while (g_dptManger_head)
	{
		pnode = g_dptManger_head;
		g_dptManger_head = g_dptManger_head->pnext;
		free(pnode);
	}
}

void ModifyPsw_1()//员工修改密码
{
	do
	{
		system("cls");
		printf("当前正在进行修改密码的操作:\n");
		printf("--------------------------------\n");
		char s_psw[9];
		printf("请输入原密码:");
		scanf_s("%s", s_psw, sizeof(s_psw));
		if (strcmp(gp_worker->ss_Psw, s_psw))
		{
			printf("原密码输入错误!");
			Sleep(2000);
			continue;
		}
		while (true)
		{
			printf("请输入新密码:");
			scanf_s("%s", s_psw, sizeof(s_psw));
			if (strlen(s_psw) == 0)
			{
				printf("密码长度不能高于8位");
				continue;
			}
			strcpy(gp_worker->ss_Psw, s_psw);
			printf("密码修改成功!\n");
			system("pause");
			Save_Worker();
			return;
		}
		break;
	} while (true);
}
void ModifyPsw_2()//部门主管修改密码
{
	system("cls");
	printf("当前正在进行修改密码的操作:\n");
	printf("--------------------------------\n");
	puts("1.修改员工密码");
	puts("2.修改自身密码");
	puts("0.返回上一级");
	int n = Confirm_Number();
	switch (n)
	{
	case 1:
		do
		{
			printf("请输入员工工号:");
			char s_Num[15];
			scanf_s("%s", s_Num, sizeof(s_Num));
			S_WORKER *pworker = NULL;
			if (!CheckWorker(s_Num, &pworker))
			{
				printf("未查找到该工号信息,请确认输入是否正确!\n");
				Sleep(2000);
				continue;
			}
			printf("您要修改的员工为:\n");
			Print_Worker(pworker);
			printf("确认要修改该工号员工吗?(y/n)");
			if (!goOn())
			{
				puts("您取消了当前修改密码操作!");
				Sleep(2000);
				return;
			}
			while (true)
			{
				char s_psw[9];
				printf("请输入新密码:");
				scanf_s("%s", s_psw, sizeof(s_psw));
				if (strlen(s_psw) == 0)
				{
					printf("密码长度不能高于8位");
					continue;
				}
				strcpy(pworker->ss_Psw, s_psw);
				printf("密码修改成功!\n");
				system("pause");
				Save_Worker();
				return;
			}
			break;
		} while (true);

		break;
	case 2:
		do
		{
			printf("请输入原密码:");
			char s_psw[9];
			scanf_s("%s", s_psw, sizeof(s_psw));
			if (strcmp(gp_manager->ss_Psw, s_psw))
			{
				printf("原密码输入错误!");
				Sleep(2000);
				continue;
			}
			while (true)
			{
				printf("请输入新密码:");
				scanf_s("%s", s_psw, sizeof(s_psw));
				if (strlen(s_psw) == 0)
				{
					printf("密码长度不能高于8位");
					Sleep(2000);
					continue;
				}
				strcpy(gp_manager->ss_Psw, s_psw);
				printf("密码修改成功!\n");
				system("pause");
				Save_Manager();
				return;
			}
			break;
		} while (true);
		break;
	}
	
}
void ModifyPsw_3() //管理员修改密码
{
	system("cls");
	printf("当前正在进行修改密码的操作:\n");
	printf("--------------------------------\n");
	puts("1.修改员工密码");
	puts("2.修改部门经理密码");
	puts("3.修改自身密码");
	int n = Confirm_Number();
	switch (n)
	{
	case 1:
		do
		{
			printf("请输入员工工号:");
			char s_Num[15];
			scanf_s("%s", s_Num, sizeof(s_Num));
			S_WORKER *pworker = NULL;
			if (!CheckWorker(s_Num, &pworker))
			{
				printf("未查找到该工号信息,请确认输入是否正确!\n");
				Sleep(2000);
				continue;
			}
			printf("您要修改的员工为:\n");
			Print_Worker(pworker);
			printf("确认要修改该工号员工吗?(y/n)");
			if (!goOn())
			{
				puts("您取消了当前修改密码操作!");
				Sleep(2000);
				return;
			}
			while (true)
			{
				char s_psw[9];
				printf("请输入新密码:");
				scanf_s("%s", s_psw, sizeof(s_psw));
				if (strlen(s_psw) == 0)
				{
					printf("密码长度不能高于8位");
					Sleep(2000);
					continue;
				}
				strcpy(pworker->ss_Psw, s_psw);
				printf("密码修改成功!\n");
				system("pause");
				Save_Worker();
				return;
			}
			break;
		} while (true);

		break;
	case 2:
		do
		{
			printf("请输入部门经理工号:");
			char s_Num[15];
			scanf_s("%s", s_Num, sizeof(s_Num));
			S_DADMIN *pManager = NULL;
			if (!CheckDManager(s_Num, &pManager))
			{
				printf("未查找到该工号信息,请确认输入是否正确!\n");
				Sleep(2000);
				continue;
			}
			printf("您要修改的部门经理信息为:\n");
			Print_DptManager(pManager);
			printf("确认要修改吗?(y/n)");
			if (!goOn())
			{
				puts("您取消了当前修改密码操作!");
				Sleep(2000);
				return;
			}
			while (true)
			{
				char s_psw[9];
				printf("请输入新密码:");
				scanf_s("%s", s_psw, sizeof(s_psw));
				if (strlen(s_psw) == 0)
				{
					printf("密码长度不能高于8位");
					continue;
				}
				strcpy(pManager->ss_Psw, s_psw);
				printf("密码修改成功!\n");
				system("pause");
				Save_Manager();
				return;
			}
			break;
		} while (true);
		break;
	case 3:
		do
		{
			printf("请输入原密码:");
			char s_psw[9];
			scanf_s("%s", s_psw, sizeof(s_psw));
			if (strcmp(g_sPsw, s_psw))
			{
				printf("原密码输入错误!\n");
				Sleep(2000);
				continue;
			}
			while (true)
			{
				printf("请输入新密码:");
				scanf_s("%s", s_psw, sizeof(s_psw));
				if (strlen(s_psw) == 0)
				{
					printf("密码长度不能高于8位");
					continue;
				}
				strcpy(g_sPsw, s_psw);
				printf("密码修改成功!\n");
				system("pause");
				Save_Admin();
				return;
			}
			break;
		} while (true);
		break;
	}
}

void ModifyPsw(e_Level e_level)
{
//	pFuncModifyPsw pModifyPsw[] = { ModifyPsw_1,ModifyPsw_2};
//	pModifyPsw[e_level];
	switch (e_level)
	{
	case e_worker:
		ModifyPsw_1();
		break;
	case e_manager:
		ModifyPsw_2();
		break;
	case e_admin:
		ModifyPsw_3();
		break;
	}
}

int ProcessingWorkerRequests()
{
	system("cls");
	if (Print_ProcessWorker())
		return 0;
	puts("-------------------------------------------------------");
	printf("请输入员工编号(输入字符q,返回上一步):");
	char sNum[15];
	scanf_s("%s", sNum, sizeof(sNum));
	if (sNum[0] == 'q')
		return 0;
	S_WORKER *pworker = NULL;
	if (!CheckWorker(sNum, &pworker))
	{
		printf("无此工号员工信息!");
		Sleep(2000);
		return 0;
	}
	if (g_nLevel == e_manager)
	{
		if (strcmp(pworker->ss_Dpt, gp_manager->ss_Department))
		{
			printf("无法处理其他部门的员工请求!");
			system("pause");
			return  0;
		}
	}
	if (!pworker->e_request)
	{
		printf("该员工无请求信息!");
		system("pause");
		return  0;
	}
	//PrintRequest(pworker->ss_Number);
	switch (pworker->e_request)
	{
	case e_gobye: //请假
		process_gobye(pworker->ss_Number);
		system("pause");
		break;
	case e_positive://转正
		process_formal(pworker->ss_Number);
		system("pause");
		break;
	case e_pay://加薪
		process_AddPay(pworker->ss_Number);
		system("pause");
		break;
	case e_Others://有话说
		process_talk(pworker->ss_Number);
		break;
	}
	printf("是否继续?(y/n)");
	return goOn();
}
void process_formal(char *pNum)
{
	system("cls");
	S_REQUEST *pdata = NULL;
	if (!Check_Request(pNum, e_positive, &pdata))
	{
		printf("未查找到该请求!请确认request.txt文件被正确载入!");
		return;
	}
	printf("员工工号:%s\n\n", pdata->ss_Number);
	printf("员工姓名:%s\n\n", pdata->ss_Name);
	printf("请求类型:%s\n\n", pRequest[pdata->e_request]);
	printf("理由:%s\n\n", pdata->ss_data2);
	puts("************************************************************");
	S_WORKER *pworker = NULL;
	CheckWorker(pNum, &pworker);
	printf("是否通过该申请:");
	if (!goOn())
	{
		pworker->e_request = e_none;
		pdata->e_process = e_no;
		Save_Request();
		Save_Worker();
		return;
	}
	S_POST *pPost;
	if (!CheckPostName(pworker->ss_Post, &pPost))
	{
		puts("该员工所属职位信息未查找到.请检查post.txt文件是否存在,数据是否已经损坏!");
		system("pause");
		return;
	}
	pdata->e_process = e_yes;
	pworker->e_request = e_none;
	pworker->s_Sala.f_base = pPost->f_baseSala;
	Save_Request();
	Save_Worker();
	printf("您已通过了该员工的转正申请!");
}
void Color()
{
	system("cls");
	puts("提示:");
	printf("0 = 黑色\t8 = 灰色\n1 = 蓝色\t9 = 淡蓝色\n2 = 绿色\tA = 淡绿色\n3 = 湖蓝色\tB = 淡浅绿色\n4 = 红色\tC = 淡红色\n5 = 紫色\tD = 淡紫色\n");
	printf("6 = 黄色\tE = 淡黄色\n7 = 白色\tF = 亮白色");

	printf("\n\n请输入你喜欢的颜色!格式如:07,表示黑底白字.\n");
	printf("输入h表示还原默认,输入q表示返回上一级:");
	char c1, c2;
	do
	{
		rewind(stdin);
		scanf("%c%c", &c1, &c2);
		if (c1 == 'q')
			break;
		if (c1 == 'h')
			setColor();
		else
			setColor(c1, c2);
	} while (true);
}

void setColor(char c1, char c2)
{
	if (c1 >= 'a'&&c1 <= 'f')  //转换成大写
		c1 -= 32;
	if (c2 >= 'a'&&c2 <= 'f')
		c2 -= 32;
	if (c1 >= '0' && c1 <= '9' || c1 >= 'A'&&c1 <= 'F')
		if (c2 >= '0' && c2 <= '9' || c2 >= 'A' && c2 <= 'F')
		{
			char command[9] = "color 07";		//默认颜色	
			command[6] = c1;
			command[7] = c2;
			system(command);				//调用系统函数 
			printf("\n设置成功!如需更换请继续输入,如退出则输入q:");
			return;
		}
	printf("\n输入值非法!请重新输入:");
}
//void setColor(unsigned short backColor , unsigned short textColor) 
//{
//	char command[9] = "color 07";		//默认颜色	
//	command[6] = '0' + backColor;		//将backColor变量改为字符型 
//	command[7] = '0' + textColor;		//将textColor变量改为字符型 
//	system(command);				//调用系统函数 
//}

void process_gobye(char *pNum)
{
	system("cls");
	S_REQUEST *pdata = NULL;
	if (!Check_Request(pNum, e_gobye,&pdata))
	{
		printf("未查找到该请求!请确认request.txt文件被正确载入!");
		return;
	}
	printf("员工工号:%s\n\n", pdata->ss_Number);
	printf("员工姓名:%s\n\n", pdata->ss_Name);
	printf("请求类型:%s\n\n", pRequest[pdata->e_request]);
	printf("天数:%d\n\n", pdata->n_data1);
	printf("请假理由:%s\n\n", pdata->ss_data2);
	puts("************************************************************");
	S_WORKER *pworker = NULL;
	CheckWorker(pNum, &pworker);
	printf("是否通过该申请:");
	if (!goOn())
	{
		pworker->e_request = e_none;
		pdata->e_process = e_no;
		Save_Request();
		Save_Worker();
		return;
	}
	pdata->e_process = e_yes;
	pworker->e_request= e_none;
	pworker->cLeaveDays += pdata->n_data1;
	pworker->s_Sala.f_real -= pdata->n_data1 * 100;
	pworker->s_Sala.f_cut = pdata->n_data1 * 100;

	Save_Request();
	Save_Worker();
	puts("您已通过了该员工的请假申请!");
}

void process_AddPay(char * pNum)
{
	system("cls");
	S_REQUEST *pdata = NULL;
	if (!Check_Request(pNum, e_pay, &pdata))
	{
		printf("未查找到该请求!请确认request.txt文件被正确载入!");
		return;
	}
	printf("员工工号:%s\n\n", pdata->ss_Number);
	printf("员工姓名:%s\n\n", pdata->ss_Name);
	printf("请求类型:%s\n\n", pRequest[pdata->e_request]);
	printf("加薪幅度:%d\n\n", pdata->n_data1);
	printf("加薪理由:%s\n\n", pdata->ss_data2);
	puts("************************************************************");
	S_WORKER *pworker = NULL;
	CheckWorker(pNum, &pworker);
	printf("是否通过该申请:");
	if (!goOn())
	{
		pworker->e_request = e_none;
		pdata->e_process = e_no;
		Save_Request();
		Save_Worker();
		return;
	}
	pdata->e_process = e_yes;
	pworker->e_request = e_none;
	//pworker->s_Sala.f_real -= pdata->n_data1 * 100;
	//pworker->s_Sala.f_cut = pdata->n_data1 * 100;
	pworker->s_Sala.f_base = pdata->n_data1;
	Save_Request();
	Save_Worker();
	puts("您已通过了该员工的加薪申请!");
}

void process_talk(char * pNum)
{
	system("cls");
	S_REQUEST *pdata = NULL;
	if (!Check_Request(pNum, e_Others, &pdata))
	{
		printf("未查找到该请求!请确认request.txt文件被正确载入!");
		return;
	}
	printf("员工工号:%s\n\n", pdata->ss_Number);
	printf("员工姓名:%s\n\n", pdata->ss_Name);
	printf("请求类型:%s\n\n", pRequest[pdata->e_request]);
	printf("要说的话:\n%s\n\n", pdata->ss_data2);
	puts("************************************************************");
	S_WORKER *pworker = NULL;
	CheckWorker(pNum, &pworker);
	printf("是否确认已经阅读该条信息?(y/n):");
	if (!goOn())
	{
		/*pworker->e_request = e_Others;
		pdata->e_process = e_none;
		Save_Request();
		Save_Worker();*/
		return;
	}
	pdata->e_process = e_yes;
	pworker->e_request = e_none;
	//pworker->s_Sala.f_real -= pdata->n_data1 * 100;
	//pworker->s_Sala.f_cut = pdata->n_data1 * 100;
	//pworker->s_Sala.f_base = pdata->n_data1;
	Save_Request();
	Save_Worker();
	puts("您已确认阅读了该条信息!");
}


bool Check_Request(char * pNum, e_Request request, S_REQUEST ** ppData)
{
	S_NODE_REQUEST *pnode = gp_request_head;
	while (pnode)
	{
		if (strcmp(pNum, pnode->data.ss_Number) == 0 && pnode->data.e_process == e_untreated
			&&pnode->data.e_request == request)
		{
			if (ppData)
				*ppData = &pnode->data;
			return true;
		}
		pnode = pnode->pnext;
	}
	return false;
}


bool Print_ProcessWorker()
{
	printf("工号     姓名     性别     职务       所属部门     状态1    实际工资  加班  请假  处分  状态2    员工请求\n");//状态1为是否正式工,2为是否请假/休假/离职
	PWORKER pNode = g_worker_head;
	printf("_________________________________________________________________________________________________________\n");
	bool nFlag = 0;
	while (pNode)
	{
		if (strcmp(pNode->s_data.ss_Dpt, gp_manager->ss_Department) == 0 && pNode->s_data.e_request)
		{
			printf("%-8s%-10s%-8s%-12s%-12s%-12s%-9.0f%-6d%-6d%-6d%-12s%-13s\n", pNode->s_data.ss_Number, pNode->s_data.ss_Name,
				pNode->s_data.b_sex ? "男" : "女", pNode->s_data.ss_Post, pNode->s_data.ss_Dpt, pNode->s_data.b_test ? "正式工" : "试用期", pNode->s_data.s_Sala.f_real,
				pNode->s_data.cOverDays, pNode->s_data.cLeaveDays, pNode->s_data.cPunish, pState[pNode->s_data.State], pRequest[pNode->s_data.e_request]);
			nFlag = 1;
		}
		pNode = pNode->s_pNext;
	}
	if (!nFlag)
	{
		printf("当前无待处理事件!\n");
		Sleep(2000);
	}
	return !nFlag;
}

void PrintTime(time_t time, char *pstr)
{//newTime->tm_year + 1900,
	tm *newTime = localtime(&time);
	sprintf(pstr,"%d月%d日",  newTime->tm_mon + 1, newTime->tm_mday/*,newTime->tm_hour,
		newTime->tm_min, newTime->tm_sec*/);
}

void AddNode_Request(S_REQUEST * pdata)
{
	S_NODE_REQUEST *pnode = (S_NODE_REQUEST*)malloc(sizeof(S_NODE_REQUEST));
	pnode->data = *pdata;
	pnode->pnext = gp_request_head;
	gp_request_head = pnode;
}

void LookResult(int n )
{
	system("cls");
	if (gp_request_head == NULL)
	{
		printf("当前无申请信息!");
		Sleep(2000);
		return;
	}
	puts("申请日期     工号     姓名     申请类型      处理结果");
	puts("--------------------------------------------------------------------------------");
	S_NODE_REQUEST *pnode = gp_request_head;
	char timestr[10];
	int nFlag = 0;
	while (pnode)
	{
		if (strcmp(pnode->data.ss_Number, gp_worker->ss_Number) == 0 && pnode->data.n_Month==n)
		{
			PrintTime(pnode->data.s_RuquestTime, timestr);
			printf("%-12s%-10s%-10s%-14s%s\n", timestr,
				pnode->data.ss_Number, pnode->data.ss_Name, pRequest[pnode->data.e_request],
				 pProcess[pnode->data.e_process]);
			nFlag = 1;
		}
		pnode = pnode->pnext;
	}
	if (!nFlag)
	{
		printf("当前无数据可打印!\n");
		Sleep(2000);
	}
	/*puts("申请日期     工号     姓名     申请类型     附加信息1   处理结果   附加信息2");
	puts("--------------------------------------------------------------------------------");
	S_NODE_REQUEST *pnode = gp_request_head;
	char timestr[10];
	while (pnode)
	{
		if (strcmp(pnode->data.ss_Number, gp_worker->ss_Number) == 0)
		{
			PrintTime(pnode->data.s_RuquestTime, timestr);
			printf("%-12s%-10s%-10s%-14s%-12d%-10s%s\n", timestr,
				pnode->data.ss_Number, pnode->data.ss_Name, pRequest[pnode->data.e_request],
				pnode->data.n_data1, pProcess[pnode->data.e_process], pnode->data.ss_data2);
		}
		pnode = pnode->pnext;
	}*/

}

void PrintRequest(char *pNum)
{
	system("cls");
	if (gp_request_head == NULL)
	{
		printf("当前无申请信息!");
		Sleep(2000);
		return;
	}
	puts("申请日期     工号     姓名     申请类型     附加信息1   处理结果   附加信息2");
	puts("--------------------------------------------------------------------------------");
	S_NODE_REQUEST *pnode = gp_request_head;
	char timestr[10];
	while (pnode)
	{
		if (strcmp(pnode->data.ss_Number, pNum) == 0 && pnode->data.e_process==e_untreated)
		{
			PrintTime(pnode->data.s_RuquestTime, timestr);
			printf("%-12s%-10s%-10s%-14s%-12d%-10s%s\n", timestr,
				pnode->data.ss_Number, pnode->data.ss_Name, pRequest[pnode->data.e_request],
				pnode->data.n_data1, pProcess[pnode->data.e_process], pnode->data.ss_data2);
		}
		pnode = pnode->pnext;
	}
}

void SendRequest_gobye()//申请请假
{
	system("cls");
	if (gp_worker->e_request != e_none)
	{
		puts("您当前有其他申请正在处理,不能同时申请两个及以上请求!");
		Sleep(2000);
		return;
	}
	S_REQUEST data;
	puts("您正在进行申请请假操作!");
	puts("请假扣除工资计算方式为:天数*100.");
	puts("**********************************************************");
	printf("您确认要请假吗?(y/n)");
	if (!goOn())
	{
		puts("您取消了此操作!");
		Sleep(2000);
		return;
	}
	while (true)
	{
		printf("请输入请假天数:");
		rewind(stdin);
		if (scanf("%d", &data.n_data1) == 0)
		{
			puts("只能输入数字哦!");
			continue;
		}
		break;
	}
	while (true)
	{
		printf("请输入请假理由:");
		scanf_s("%s", data.ss_data2, sizeof(data.ss_data2));
		if (strlen(data.ss_data2) == 0)
		{
			puts("请假理由不能超过49个汉字哦!");
			continue;
		}
		break;
	}
	data.s_RuquestTime = GetNowTime();//记录请求的时间
	gp_worker->e_request = e_gobye;
	data.e_request= e_gobye; //请求类型
	strcpy(data.ss_Number, gp_worker->ss_Number);  //工号
	strcpy(data.ss_Name, gp_worker->ss_Name);      //名字
	data.e_process = e_untreated;  //标记为未处理
	data.n_Month = GetMonth();
	//data.b_alreadySeeing = false;  //标记为被查看处理结果
	data.ss_free[0] = '\0';

	AddNode_Request(&data);
	Save_Worker();
	Save_Request();
	puts("您的申请已经提交!");
}

void SendRequest_formal()
{
	system("cls");
	if (gp_worker->e_request != e_none)
	{
		puts("您当前有其他申请正在处理,不能同时申请两个及以上请求!");
		Sleep(2000);
		return;
	}
	if (gp_worker->b_test)
	{
		puts("你当前以及是正式职员了哦!");
		Sleep(2000);
		return;
	}
	puts("你确认要申请转正吗?如果通过的话,您的工资将从下月起");
	puts("开始转变为该职位正式职员的工资.");
	printf("确认要申请吗?(y/n)");
	if (!goOn())
	{
		printf("你取消了当前操作!");
		Sleep(2000);
		return;
	}
	S_REQUEST data;
	while (true)
	{
		printf("请输入希望转正的理由:");
		scanf_s("%s", data.ss_data2, sizeof(data.ss_data2));
		if (strlen(data.ss_data2) == 0)
		{
			puts("不能超过49个汉字哦!");
			continue;
		}
		break;
	}
	gp_worker->e_request = e_positive;
	data.e_request = e_positive; //请求类型
	data.s_RuquestTime = GetNowTime();//记录请求的时间
	strcpy(data.ss_Number, gp_worker->ss_Number);  //工号
	strcpy(data.ss_Name, gp_worker->ss_Name);      //名字
	data.e_process = e_untreated;  //标记为未处理
	data.n_Month = GetMonth();
	data.n_data1 = 0;
	//data.b_alreadySeeing = false;  //标记为被查看处理结果
	data.ss_free[0] = '\0';

	AddNode_Request(&data);
	Save_Worker();
	Save_Request();
	puts("您的申请已经提交!");
}

void SendRequest_talk()
{
	system("cls");
	if (gp_worker->e_request != e_none)
	{
		puts("您当前有其他申请正在处理,不能同时申请两个及以上请求!");
		Sleep(2000);
		return;
	}
	puts("如果平常碰不到主管,可以把重点写在这里,让主管看到哦!");
	puts("*******************************************************");
	printf("确认要进行此操作吗?(y/n)");
	if (!goOn())
	{
		printf("你取消了当前操作!");
		Sleep(2000);
		return;
	}
	S_REQUEST data;
	while (true)
	{
		puts("请输入你想说的话:");
		scanf_s("%s", data.ss_data2, sizeof(data.ss_data2));
		if (strlen(data.ss_data2) == 0)
		{
			puts("不能超过49个汉字哦!");
			continue;
		}
		break;
	}
	gp_worker->e_request = e_Others;
	data.e_request = e_Others; //请求类型
	data.s_RuquestTime = GetNowTime();//记录请求的时间
	strcpy(data.ss_Number, gp_worker->ss_Number);  //工号
	strcpy(data.ss_Name, gp_worker->ss_Name);      //名字
	data.e_process = e_untreated;  //标记为未处理
	data.n_Month = GetMonth();
	data.n_data1 = 0;
	data.ss_free[0] = '\0';

	AddNode_Request(&data);
	Save_Worker();
	Save_Request();
	puts("您想说的话已经提交!");
}

void SendRequest_AddPay()
{
	system("cls");
	if (gp_worker->e_request != e_none)
	{
		puts("您当前有其他申请正在处理,不能同时申请两个及以上请求!");
		Sleep(2000);
		return;
	}
	puts("你确认要申请加薪吗?如果通过的话,您的工资将从下月起");
	puts("开始算.");
	puts("****************************************************");
	printf("确认要申请吗?(y/n)");
	if (!goOn())
	{
		printf("你取消了当前操作!");
		Sleep(2000);
		return;
	}
	S_REQUEST data;
	while (true)
	{
		printf("请输入希望加薪多少:");
		rewind(stdin);
		if (scanf("%d", &data.n_data1) == 0)
		{
			puts("只能输入数字哦!");
			continue;
		}
		break;
	}
	while (true)
	{
		printf("请输入希望加薪的理由:");
		scanf_s("%s", data.ss_data2, sizeof(data.ss_data2));
		if (strlen(data.ss_data2) == 0)
		{
			puts("不能超过49个汉字哦!");
			continue;
		}
		break;
	}
	gp_worker->e_request = e_pay;
	data.e_request = e_pay; //请求类型
	data.s_RuquestTime = GetNowTime();//记录请求的时间
	strcpy(data.ss_Number, gp_worker->ss_Number);  //工号
	strcpy(data.ss_Name, gp_worker->ss_Name);      //名字
	data.e_process = e_untreated;  //标记为未处理
	data.n_Month = GetMonth();
	//data.b_alreadySeeing = false;  //标记为被查看处理结果
	data.ss_free[0] = '\0';

	AddNode_Request(&data);
	Save_Worker();
	Save_Request();
	puts("您的申请已经提交!");
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值