本系统有小部分代码借鉴了以下这位朋友的代码,并加以改进,大部分代码,都是自己编写的.
作者: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("您的申请已经提交!");
}