|
|
#define _CRT_SECURE_NO_WARNINGS 1
|
|
|
#include "xitong.h"
|
|
|
|
|
|
/* 职员管理 */
|
|
|
void zhiyuan_guanli(YinhangXitong *xitong) {
|
|
|
int caozuo;
|
|
|
int i;
|
|
|
int id;
|
|
|
int xuhao;
|
|
|
Zhiyuan z;
|
|
|
|
|
|
while (1) {
|
|
|
printf("\n========== 银行职员管理 ==========\n");
|
|
|
printf("1. 查看全部职员\n");
|
|
|
printf("2. 添加职员\n");
|
|
|
printf("3. 删除职员\n");
|
|
|
printf("4. 修改职员\n");
|
|
|
printf("5. 查询职员\n");
|
|
|
printf("0. 返回上级\n");
|
|
|
printf("请选择: ");
|
|
|
caozuo = duquzhengshu(); /* 读取当前菜单操作码 */
|
|
|
|
|
|
if (caozuo == 1) {
|
|
|
if (xitong->zhiyuanshu == 0) {
|
|
|
printf("暂无职员数据。\n");
|
|
|
} else {
|
|
|
for (i = 0; i < xitong->zhiyuanshu; i++) {
|
|
|
xianshizhiyuan(&xitong->zhiyuanliebiao[i]);
|
|
|
}
|
|
|
}
|
|
|
} else if (caozuo == 2) {
|
|
|
if (xitong->zhiyuanshu >= 200) {
|
|
|
printf("职员容量已满。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入职员ID: ");
|
|
|
z.zhiyuanid = duquzhengshu();
|
|
|
if (zhaozhiyuan(xitong, z.zhiyuanid) >= 0) {
|
|
|
printf("ID已存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入姓名: ");
|
|
|
duquzifuchuan(z.xingming, 32);
|
|
|
printf("输入性别: ");
|
|
|
duquzifuchuan(z.xingbie, 8);
|
|
|
printf("输入年龄: ");
|
|
|
z.nianling = duquzhengshu();
|
|
|
printf("输入岗位: ");
|
|
|
duquzifuchuan(z.gangwei, 32);
|
|
|
printf("输入电话: ");
|
|
|
duquzifuchuan(z.dianhua, 32);
|
|
|
printf("输入密码: ");
|
|
|
duquzifuchuan(z.mima, 32);
|
|
|
printf("输入地址: ");
|
|
|
duquzifuchuan(z.dizhi, 128);
|
|
|
|
|
|
xitong->zhiyuanliebiao[xitong->zhiyuanshu] = z; /* 新职员追加到数组尾部 */
|
|
|
xitong->zhiyuanshu++;
|
|
|
baocunzhiyuan(xitong); /* 立即落盘,避免退出丢失 */
|
|
|
printf("添加成功。\n");
|
|
|
} else if (caozuo == 3) {
|
|
|
printf("输入要删除的职员ID: ");
|
|
|
id = duquzhengshu();
|
|
|
xuhao = zhaozhiyuan(xitong, id);
|
|
|
if (xuhao < 0) {
|
|
|
printf("未找到该职员。\n");
|
|
|
continue;
|
|
|
}
|
|
|
for (i = xuhao; i < xitong->zhiyuanshu - 1; i++) { /* 删除后前移覆盖空洞 */
|
|
|
xitong->zhiyuanliebiao[i] = xitong->zhiyuanliebiao[i + 1];
|
|
|
}
|
|
|
xitong->zhiyuanshu--;
|
|
|
baocunzhiyuan(xitong);
|
|
|
printf("删除成功。\n");
|
|
|
} else if (caozuo == 4) {
|
|
|
printf("输入要修改的职员ID: ");
|
|
|
id = duquzhengshu();
|
|
|
xuhao = zhaozhiyuan(xitong, id);
|
|
|
if (xuhao < 0) {
|
|
|
printf("未找到该职员。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入新姓名: ");
|
|
|
duquzifuchuan(xitong->zhiyuanliebiao[xuhao].xingming, 32);
|
|
|
printf("输入新性别: ");
|
|
|
duquzifuchuan(xitong->zhiyuanliebiao[xuhao].xingbie, 8);
|
|
|
printf("输入新年龄: ");
|
|
|
xitong->zhiyuanliebiao[xuhao].nianling = duquzhengshu();
|
|
|
printf("输入新岗位: ");
|
|
|
duquzifuchuan(xitong->zhiyuanliebiao[xuhao].gangwei, 32);
|
|
|
printf("输入新电话: ");
|
|
|
duquzifuchuan(xitong->zhiyuanliebiao[xuhao].dianhua, 32);
|
|
|
printf("输入新密码: ");
|
|
|
duquzifuchuan(xitong->zhiyuanliebiao[xuhao].mima, 32);
|
|
|
printf("输入新地址: ");
|
|
|
duquzifuchuan(xitong->zhiyuanliebiao[xuhao].dizhi, 128);
|
|
|
baocunzhiyuan(xitong);
|
|
|
printf("修改成功。\n");
|
|
|
} else if (caozuo == 5) {
|
|
|
printf("输入职员ID: ");
|
|
|
id = duquzhengshu();
|
|
|
xuhao = zhaozhiyuan(xitong, id);
|
|
|
if (xuhao < 0) {
|
|
|
printf("未找到该职员。\n");
|
|
|
} else {
|
|
|
xianshizhiyuan(&xitong->zhiyuanliebiao[xuhao]);
|
|
|
}
|
|
|
} else if (caozuo == 0) {
|
|
|
return;
|
|
|
} else {
|
|
|
printf("输入有误,请重试。\n");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void zhiyuan_ziguanli(YinhangXitong *xitong, int zhiyuanxuhao) {
|
|
|
int caozuo;
|
|
|
while (1) {
|
|
|
printf("\n========== 职员个人中心 ==========\n");
|
|
|
printf("1. 查看个人信息\n");
|
|
|
printf("2. 修改电话\n");
|
|
|
printf("3. 修改地址\n");
|
|
|
printf("4. 修改登录密码\n");
|
|
|
printf("0. 返回\n");
|
|
|
printf("请选择: ");
|
|
|
caozuo = duquzhengshu(); /* 读取当前菜单操作码 */
|
|
|
|
|
|
if (caozuo == 1) {
|
|
|
xianshizhiyuan(&xitong->zhiyuanliebiao[zhiyuanxuhao]);
|
|
|
} else if (caozuo == 2) {
|
|
|
printf("输入新电话: ");
|
|
|
duquzifuchuan(xitong->zhiyuanliebiao[zhiyuanxuhao].dianhua, 32);
|
|
|
baocunzhiyuan(xitong);
|
|
|
printf("修改成功。\n");
|
|
|
} else if (caozuo == 3) {
|
|
|
printf("输入新地址: ");
|
|
|
duquzifuchuan(xitong->zhiyuanliebiao[zhiyuanxuhao].dizhi, 128);
|
|
|
baocunzhiyuan(xitong);
|
|
|
printf("修改成功。\n");
|
|
|
} else if (caozuo == 4) {
|
|
|
printf("输入新密码: ");
|
|
|
duquzifuchuan(xitong->zhiyuanliebiao[zhiyuanxuhao].mima, 32);
|
|
|
baocunzhiyuan(xitong);
|
|
|
printf("密码修改成功。\n");
|
|
|
} else if (caozuo == 0) {
|
|
|
return;
|
|
|
} else {
|
|
|
printf("输入有误。\n");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 客户账户管理 */
|
|
|
void kehu_guanli(YinhangXitong *xitong) {
|
|
|
int caozuo;
|
|
|
int i;
|
|
|
int zhanghao;
|
|
|
int xuhao;
|
|
|
Kehu k;
|
|
|
char chuan[16];
|
|
|
|
|
|
while (1) {
|
|
|
printf("\n========== 客户账户管理 ==========\n");
|
|
|
printf("1. 查看全部客户\n");
|
|
|
printf("2. 添加客户\n");
|
|
|
printf("3. 删除客户\n");
|
|
|
printf("4. 修改客户\n");
|
|
|
printf("5. 查询客户\n");
|
|
|
printf("0. 返回上级\n");
|
|
|
printf("请选择: ");
|
|
|
caozuo = duquzhengshu(); /* 读取当前菜单操作码 */
|
|
|
|
|
|
if (caozuo == 1) {
|
|
|
if (xitong->kehushu == 0) {
|
|
|
printf("暂无客户数据。\n");
|
|
|
} else {
|
|
|
for (i = 0; i < xitong->kehushu; i++) {
|
|
|
xianshikehu(&xitong->kehuliebiao[i]);
|
|
|
}
|
|
|
}
|
|
|
} else if (caozuo == 2) {
|
|
|
if (xitong->kehushu >= 500) {
|
|
|
printf("客户容量已满。\n");
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
printf("输入主账户编号: ");
|
|
|
k.zhuzhanghao = duquzhengshu();
|
|
|
if (zhaokehu(xitong, k.zhuzhanghao) >= 0) {
|
|
|
printf("主账户已存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入姓名: ");
|
|
|
duquzifuchuan(k.xingming, 32);
|
|
|
printf("输入类型(普通/VIP): ");
|
|
|
duquzifuchuan(k.leixing, 8);
|
|
|
k.yinhangkashuliang = 0; /* 新客户初始没有绑定银行卡 */
|
|
|
for (i = 0; i < 10; i++) {
|
|
|
k.yinhangkabianhao[i] = 0;
|
|
|
}
|
|
|
printf("输入储蓄余额: ");
|
|
|
k.chuxuyue = duqufudian();
|
|
|
printf("输入贷款余额: ");
|
|
|
k.daikuanyue = duqufudian();
|
|
|
printf("输入电话: ");
|
|
|
duquzifuchuan(k.dianhua, 32);
|
|
|
printf("输入开户日期(yyyy-mm-dd): ");
|
|
|
duquzifuchuan(k.kaihuriqi, 16);
|
|
|
printf("输入信用分(0-100): ");
|
|
|
k.xinyong = duquzhengshu();
|
|
|
printf("输入金融资产: ");
|
|
|
k.jinrongzichan = duqufudian();
|
|
|
printf("输入地址: ");
|
|
|
duquzifuchuan(k.dizhi, 128);
|
|
|
printf("输入登录密码: ");
|
|
|
duquzifuchuan(k.mima, 32);
|
|
|
printf("输入身份证后6位数字(演示): ");
|
|
|
k.shenfenzheng = duquzhengshu();
|
|
|
printf("输入月收入: ");
|
|
|
k.yueshouru = duqufudian();
|
|
|
printf("输入月支出: ");
|
|
|
k.yuezhichu = duqufudian();
|
|
|
|
|
|
if (strcmp(k.leixing, "VIP") != 0 && strcmp(k.leixing, "普通") != 0) { /* 非法类型回退为普通 */
|
|
|
strcpy(k.leixing, "普通");
|
|
|
}
|
|
|
|
|
|
xitong->kehuliebiao[xitong->kehushu] = k;
|
|
|
xitong->kehushu++;
|
|
|
baocunkehu(xitong);
|
|
|
printf("添加客户成功。\n");
|
|
|
} else if (caozuo == 3) {
|
|
|
printf("输入要删除的主账户编号: ");
|
|
|
zhanghao = duquzhengshu();
|
|
|
xuhao = zhaokehu(xitong, zhanghao);
|
|
|
if (xuhao < 0) {
|
|
|
printf("未找到该客户。\n");
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < xitong->kashu; i++) { /* 先删除该客户名下的所有银行卡 */
|
|
|
if (xitong->kaliebiao[i].zhuzhanghao == zhanghao) {
|
|
|
int j;
|
|
|
for (j = i; j < xitong->kashu - 1; j++) {
|
|
|
xitong->kaliebiao[j] = xitong->kaliebiao[j + 1];
|
|
|
}
|
|
|
xitong->kashu--;
|
|
|
i--;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
for (i = xuhao; i < xitong->kehushu - 1; i++) { /* 客户数组前移 */
|
|
|
xitong->kehuliebiao[i] = xitong->kehuliebiao[i + 1];
|
|
|
}
|
|
|
xitong->kehushu--;
|
|
|
|
|
|
baocunkehu(xitong);
|
|
|
baocunka(xitong);
|
|
|
printf("删除成功。\n");
|
|
|
} else if (caozuo == 4) {
|
|
|
printf("输入要修改的主账户编号: ");
|
|
|
zhanghao = duquzhengshu();
|
|
|
xuhao = zhaokehu(xitong, zhanghao);
|
|
|
if (xuhao < 0) {
|
|
|
printf("未找到该客户。\n");
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
printf("输入新姓名: ");
|
|
|
duquzifuchuan(xitong->kehuliebiao[xuhao].xingming, 32);
|
|
|
printf("输入新类型(普通/VIP): ");
|
|
|
duquzifuchuan(chuan, 16);
|
|
|
if (strcmp(chuan, "VIP") == 0 || strcmp(chuan, "普通") == 0) {
|
|
|
strcpy(xitong->kehuliebiao[xuhao].leixing, chuan);
|
|
|
}
|
|
|
printf("输入新储蓄余额: ");
|
|
|
xitong->kehuliebiao[xuhao].chuxuyue = duqufudian();
|
|
|
printf("输入新贷款余额: ");
|
|
|
xitong->kehuliebiao[xuhao].daikuanyue = duqufudian();
|
|
|
printf("输入新电话: ");
|
|
|
duquzifuchuan(xitong->kehuliebiao[xuhao].dianhua, 32);
|
|
|
printf("输入新开户日期: ");
|
|
|
duquzifuchuan(xitong->kehuliebiao[xuhao].kaihuriqi, 16);
|
|
|
printf("输入新信用分: ");
|
|
|
xitong->kehuliebiao[xuhao].xinyong = duquzhengshu();
|
|
|
printf("输入新金融资产: ");
|
|
|
xitong->kehuliebiao[xuhao].jinrongzichan = duqufudian();
|
|
|
printf("输入新地址: ");
|
|
|
duquzifuchuan(xitong->kehuliebiao[xuhao].dizhi, 128);
|
|
|
printf("输入新密码: ");
|
|
|
duquzifuchuan(xitong->kehuliebiao[xuhao].mima, 32);
|
|
|
printf("输入新月收入: ");
|
|
|
xitong->kehuliebiao[xuhao].yueshouru = duqufudian();
|
|
|
printf("输入新月支出: ");
|
|
|
xitong->kehuliebiao[xuhao].yuezhichu = duqufudian();
|
|
|
|
|
|
baocunkehu(xitong);
|
|
|
printf("修改成功。\n");
|
|
|
} else if (caozuo == 5) {
|
|
|
printf("输入主账户编号: ");
|
|
|
zhanghao = duquzhengshu();
|
|
|
xuhao = zhaokehu(xitong, zhanghao);
|
|
|
if (xuhao < 0) {
|
|
|
printf("未找到客户。\n");
|
|
|
} else {
|
|
|
xianshikehu(&xitong->kehuliebiao[xuhao]);
|
|
|
}
|
|
|
} else if (caozuo == 0) {
|
|
|
return;
|
|
|
} else {
|
|
|
printf("输入有误。\n");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 银行卡管理 */
|
|
|
void ka_guanli(YinhangXitong *xitong) {
|
|
|
int caozuo;
|
|
|
int i;
|
|
|
int kabianhao;
|
|
|
int xuhao;
|
|
|
int kehuxuhao;
|
|
|
Yinhangka ka;
|
|
|
|
|
|
while (1) {
|
|
|
printf("\n========== 银行卡管理 ==========\n");
|
|
|
printf("1. 查看全部银行卡\n");
|
|
|
printf("2. 添加银行卡\n");
|
|
|
printf("3. 删除银行卡\n");
|
|
|
printf("4. 修改银行卡\n");
|
|
|
printf("5. 查询银行卡\n");
|
|
|
printf("0. 返回上级\n");
|
|
|
printf("请选择: ");
|
|
|
caozuo = duquzhengshu(); /* 读取当前菜单操作码 */
|
|
|
|
|
|
if (caozuo == 1) {
|
|
|
if (xitong->kashu == 0) {
|
|
|
printf("暂无银行卡数据。\n");
|
|
|
} else {
|
|
|
for (i = 0; i < xitong->kashu; i++) {
|
|
|
xianshika(&xitong->kaliebiao[i]);
|
|
|
}
|
|
|
}
|
|
|
} else if (caozuo == 2) {
|
|
|
if (xitong->kashu >= 1200) {
|
|
|
printf("银行卡容量已满。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入银行卡编号: ");
|
|
|
ka.kabianhao = duquzhengshu();
|
|
|
if (zhaoka(xitong, ka.kabianhao) >= 0) {
|
|
|
printf("卡号已存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入所属主账户编号: ");
|
|
|
ka.zhuzhanghao = duquzhengshu();
|
|
|
kehuxuhao = zhaokehu(xitong, ka.zhuzhanghao);
|
|
|
if (kehuxuhao < 0) {
|
|
|
printf("主账户不存在,先建客户。\n");
|
|
|
continue;
|
|
|
}
|
|
|
if (xitong->kehuliebiao[kehuxuhao].yinhangkashuliang >= 10) {
|
|
|
printf("该客户卡数量已达上限。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入类型(借记卡/储蓄卡/信用卡): ");
|
|
|
duquzifuchuan(ka.kaleixing, 16);
|
|
|
printf("输入余额: ");
|
|
|
ka.yue = duqufudian();
|
|
|
printf("输入年利率(如0.015): ");
|
|
|
ka.lilv = duqufudian();
|
|
|
printf("输入开户日期(yyyy-mm-dd): ");
|
|
|
duquzifuchuan(ka.kaihuriqi, 16);
|
|
|
strcpy(ka.zhuangtai, "正常");
|
|
|
|
|
|
xitong->kaliebiao[xitong->kashu] = ka; /* 新卡写入卡数组 */
|
|
|
xitong->kashu++;
|
|
|
kehutianjiaka(&xitong->kehuliebiao[kehuxuhao], ka.kabianhao); /* 同步到客户卡号列表 */
|
|
|
baocunka(xitong);
|
|
|
baocunkehu(xitong);
|
|
|
printf("添加银行卡成功。\n");
|
|
|
} else if (caozuo == 3) {
|
|
|
printf("输入要删除的卡号: ");
|
|
|
kabianhao = duquzhengshu();
|
|
|
xuhao = zhaoka(xitong, kabianhao);
|
|
|
if (xuhao < 0) {
|
|
|
printf("未找到该卡。\n");
|
|
|
continue;
|
|
|
}
|
|
|
kehuxuhao = zhaokehu(xitong, xitong->kaliebiao[xuhao].zhuzhanghao);
|
|
|
if (kehuxuhao >= 0) {
|
|
|
kehuquchuaka(&xitong->kehuliebiao[kehuxuhao], kabianhao);
|
|
|
}
|
|
|
for (i = xuhao; i < xitong->kashu - 1; i++) { /* 卡数组前移覆盖 */
|
|
|
xitong->kaliebiao[i] = xitong->kaliebiao[i + 1];
|
|
|
}
|
|
|
xitong->kashu--;
|
|
|
baocunka(xitong);
|
|
|
baocunkehu(xitong);
|
|
|
printf("删除成功。\n");
|
|
|
} else if (caozuo == 4) {
|
|
|
printf("输入要修改的卡号: ");
|
|
|
kabianhao = duquzhengshu();
|
|
|
xuhao = zhaoka(xitong, kabianhao);
|
|
|
if (xuhao < 0) {
|
|
|
printf("未找到该卡。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入新类型(借记卡/储蓄卡/信用卡): ");
|
|
|
duquzifuchuan(xitong->kaliebiao[xuhao].kaleixing, 16);
|
|
|
printf("输入新余额: ");
|
|
|
xitong->kaliebiao[xuhao].yue = duqufudian();
|
|
|
printf("输入新年利率: ");
|
|
|
xitong->kaliebiao[xuhao].lilv = duqufudian();
|
|
|
printf("输入新开户日期: ");
|
|
|
duquzifuchuan(xitong->kaliebiao[xuhao].kaihuriqi, 16);
|
|
|
printf("输入新状态(正常/冻结): ");
|
|
|
duquzifuchuan(xitong->kaliebiao[xuhao].zhuangtai, 16);
|
|
|
baocunka(xitong);
|
|
|
printf("修改成功。\n");
|
|
|
} else if (caozuo == 5) {
|
|
|
printf("输入卡号: ");
|
|
|
kabianhao = duquzhengshu();
|
|
|
xuhao = zhaoka(xitong, kabianhao);
|
|
|
if (xuhao < 0) {
|
|
|
printf("未找到该卡。\n");
|
|
|
} else {
|
|
|
xianshika(&xitong->kaliebiao[xuhao]);
|
|
|
}
|
|
|
} else if (caozuo == 0) {
|
|
|
return;
|
|
|
} else {
|
|
|
printf("输入有误。\n");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 存取贷业务管理 */
|
|
|
void cunqudai_guanli(YinhangXitong *xitong) {
|
|
|
int caozuo;
|
|
|
int kahao;
|
|
|
int kahao2;
|
|
|
int kaxuhao;
|
|
|
int kaxuhao2;
|
|
|
int kehuxuhao;
|
|
|
int kehuxuhao2;
|
|
|
double jine;
|
|
|
int tianshu;
|
|
|
double lixi;
|
|
|
|
|
|
while (1) {
|
|
|
printf("\n========== 存取贷业务管理 ==========\n");
|
|
|
printf("1. 存款\n");
|
|
|
printf("2. 取款\n");
|
|
|
printf("3. 贷款\n");
|
|
|
printf("4. 还款\n");
|
|
|
printf("5. 转账\n");
|
|
|
printf("6. 利息计算并入账\n");
|
|
|
printf("7. 查询卡余额\n");
|
|
|
printf("0. 返回上级\n");
|
|
|
printf("请选择: ");
|
|
|
caozuo = duquzhengshu(); /* 读取当前菜单操作码 */
|
|
|
|
|
|
if (caozuo == 1) {
|
|
|
printf("输入卡号: ");
|
|
|
kahao = duquzhengshu();
|
|
|
kaxuhao = zhaoka(xitong, kahao);
|
|
|
if (kaxuhao < 0) {
|
|
|
printf("卡号不存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入存款金额: ");
|
|
|
jine = duqufudian();
|
|
|
if (jine <= 0) {
|
|
|
printf("金额必须大于0。\n");
|
|
|
continue;
|
|
|
}
|
|
|
xitong->kaliebiao[kaxuhao].yue += jine; /* 卡余额增加 */
|
|
|
kehuxuhao = zhaokehu(xitong, xitong->kaliebiao[kaxuhao].zhuzhanghao);
|
|
|
if (kehuxuhao >= 0) {
|
|
|
xitong->kehuliebiao[kehuxuhao].chuxuyue += jine; /* 主账户储蓄余额同步增加 */
|
|
|
}
|
|
|
xierujiaoyi(xitong, /* 写入交易流水 */
|
|
|
xitong->kaliebiao[kaxuhao].zhuzhanghao,
|
|
|
xitong->kaliebiao[kaxuhao].kabianhao,
|
|
|
"存款",
|
|
|
jine,
|
|
|
xitong->kaliebiao[kaxuhao].yue,
|
|
|
"收入",
|
|
|
"柜面存款");
|
|
|
baocunka(xitong);
|
|
|
baocunkehu(xitong);
|
|
|
baocunjiaoyi(xitong);
|
|
|
printf("存款成功,当前余额: %.2f\n", xitong->kaliebiao[kaxuhao].yue);
|
|
|
} else if (caozuo == 2) {
|
|
|
printf("输入卡号: ");
|
|
|
kahao = duquzhengshu();
|
|
|
kaxuhao = zhaoka(xitong, kahao);
|
|
|
if (kaxuhao < 0) {
|
|
|
printf("卡号不存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入取款金额: ");
|
|
|
jine = duqufudian();
|
|
|
if (jine <= 0) {
|
|
|
printf("金额必须大于0。\n");
|
|
|
continue;
|
|
|
}
|
|
|
if (xitong->kaliebiao[kaxuhao].yue < jine) {
|
|
|
printf("余额不足。\n");
|
|
|
continue;
|
|
|
}
|
|
|
xitong->kaliebiao[kaxuhao].yue -= jine; /* 卡余额扣减 */
|
|
|
kehuxuhao = zhaokehu(xitong, xitong->kaliebiao[kaxuhao].zhuzhanghao);
|
|
|
if (kehuxuhao >= 0) {
|
|
|
xitong->kehuliebiao[kehuxuhao].chuxuyue -= jine; /* 主账户储蓄余额同步扣减 */
|
|
|
if (xitong->kehuliebiao[kehuxuhao].chuxuyue < 0) {
|
|
|
xitong->kehuliebiao[kehuxuhao].chuxuyue = 0; /* 避免出现负数 */
|
|
|
}
|
|
|
}
|
|
|
xierujiaoyi(xitong, /* 写入交易流水 */
|
|
|
xitong->kaliebiao[kaxuhao].zhuzhanghao,
|
|
|
xitong->kaliebiao[kaxuhao].kabianhao,
|
|
|
"取款",
|
|
|
jine,
|
|
|
xitong->kaliebiao[kaxuhao].yue,
|
|
|
"支出",
|
|
|
"柜面取款");
|
|
|
baocunka(xitong);
|
|
|
baocunkehu(xitong);
|
|
|
baocunjiaoyi(xitong);
|
|
|
printf("取款成功,当前余额: %.2f\n", xitong->kaliebiao[kaxuhao].yue);
|
|
|
} else if (caozuo == 3) {
|
|
|
printf("输入贷款入账卡号: ");
|
|
|
kahao = duquzhengshu();
|
|
|
kaxuhao = zhaoka(xitong, kahao);
|
|
|
if (kaxuhao < 0) {
|
|
|
printf("卡号不存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入贷款金额: ");
|
|
|
jine = duqufudian();
|
|
|
if (jine <= 0) {
|
|
|
printf("金额必须大于0。\n");
|
|
|
continue;
|
|
|
}
|
|
|
xitong->kaliebiao[kaxuhao].yue += jine; /* 贷款先打入卡余额 */
|
|
|
kehuxuhao = zhaokehu(xitong, xitong->kaliebiao[kaxuhao].zhuzhanghao);
|
|
|
if (kehuxuhao >= 0) {
|
|
|
xitong->kehuliebiao[kehuxuhao].daikuanyue += jine; /* 增加贷款余额 */
|
|
|
xitong->kehuliebiao[kehuxuhao].chuxuyue += jine; /* 贷款入账后可用资金增加 */
|
|
|
}
|
|
|
xierujiaoyi(xitong,
|
|
|
xitong->kaliebiao[kaxuhao].zhuzhanghao,
|
|
|
xitong->kaliebiao[kaxuhao].kabianhao,
|
|
|
"贷款",
|
|
|
jine,
|
|
|
xitong->kaliebiao[kaxuhao].yue,
|
|
|
"收入",
|
|
|
"贷款发放");
|
|
|
baocunka(xitong);
|
|
|
baocunkehu(xitong);
|
|
|
baocunjiaoyi(xitong);
|
|
|
printf("贷款成功。\n");
|
|
|
} else if (caozuo == 4) {
|
|
|
printf("输入还款卡号: ");
|
|
|
kahao = duquzhengshu();
|
|
|
kaxuhao = zhaoka(xitong, kahao);
|
|
|
if (kaxuhao < 0) {
|
|
|
printf("卡号不存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入还款金额: ");
|
|
|
jine = duqufudian();
|
|
|
if (jine <= 0) {
|
|
|
printf("金额必须大于0。\n");
|
|
|
continue;
|
|
|
}
|
|
|
if (xitong->kaliebiao[kaxuhao].yue < jine) {
|
|
|
printf("余额不足,无法还款。\n");
|
|
|
continue;
|
|
|
}
|
|
|
kehuxuhao = zhaokehu(xitong, xitong->kaliebiao[kaxuhao].zhuzhanghao);
|
|
|
if (kehuxuhao < 0) {
|
|
|
printf("客户不存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
if (xitong->kehuliebiao[kehuxuhao].daikuanyue <= 0) {
|
|
|
printf("该客户没有贷款余额。\n");
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
if (jine > xitong->kehuliebiao[kehuxuhao].daikuanyue) {
|
|
|
jine = xitong->kehuliebiao[kehuxuhao].daikuanyue; /* 还款额不能超过欠款 */
|
|
|
}
|
|
|
|
|
|
xitong->kaliebiao[kaxuhao].yue -= jine; /* 卡内资金减少 */
|
|
|
xitong->kehuliebiao[kehuxuhao].daikuanyue -= jine; /* 贷款余额减少 */
|
|
|
xitong->kehuliebiao[kehuxuhao].chuxuyue -= jine; /* 主账户储蓄同步减少 */
|
|
|
if (xitong->kehuliebiao[kehuxuhao].chuxuyue < 0) {
|
|
|
xitong->kehuliebiao[kehuxuhao].chuxuyue = 0; /* 防止余额出现负值 */
|
|
|
}
|
|
|
|
|
|
xierujiaoyi(xitong,
|
|
|
xitong->kaliebiao[kaxuhao].zhuzhanghao,
|
|
|
xitong->kaliebiao[kaxuhao].kabianhao,
|
|
|
"还款",
|
|
|
jine,
|
|
|
xitong->kaliebiao[kaxuhao].yue,
|
|
|
"支出",
|
|
|
"贷款还款");
|
|
|
baocunka(xitong);
|
|
|
baocunkehu(xitong);
|
|
|
baocunjiaoyi(xitong);
|
|
|
printf("还款成功。\n");
|
|
|
} else if (caozuo == 5) {
|
|
|
printf("输入转出卡号: ");
|
|
|
kahao = duquzhengshu();
|
|
|
printf("输入转入卡号: ");
|
|
|
kahao2 = duquzhengshu();
|
|
|
printf("输入转账金额: ");
|
|
|
jine = duqufudian();
|
|
|
|
|
|
kaxuhao = zhaoka(xitong, kahao);
|
|
|
kaxuhao2 = zhaoka(xitong, kahao2);
|
|
|
if (kaxuhao < 0 || kaxuhao2 < 0) {
|
|
|
printf("转出或转入卡不存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
if (jine <= 0) {
|
|
|
printf("金额必须大于0。\n");
|
|
|
continue;
|
|
|
}
|
|
|
if (xitong->kaliebiao[kaxuhao].yue < jine) {
|
|
|
printf("转出卡余额不足。\n");
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
xitong->kaliebiao[kaxuhao].yue -= jine; /* 转出卡扣减 */
|
|
|
xitong->kaliebiao[kaxuhao2].yue += jine; /* 转入卡增加 */
|
|
|
|
|
|
kehuxuhao = zhaokehu(xitong, xitong->kaliebiao[kaxuhao].zhuzhanghao);
|
|
|
kehuxuhao2 = zhaokehu(xitong, xitong->kaliebiao[kaxuhao2].zhuzhanghao);
|
|
|
if (kehuxuhao >= 0) {
|
|
|
xitong->kehuliebiao[kehuxuhao].chuxuyue -= jine;
|
|
|
if (xitong->kehuliebiao[kehuxuhao].chuxuyue < 0) {
|
|
|
xitong->kehuliebiao[kehuxuhao].chuxuyue = 0;
|
|
|
}
|
|
|
}
|
|
|
if (kehuxuhao2 >= 0) {
|
|
|
xitong->kehuliebiao[kehuxuhao2].chuxuyue += jine;
|
|
|
}
|
|
|
|
|
|
xierujiaoyi(xitong, /* 记录转出流水 */
|
|
|
xitong->kaliebiao[kaxuhao].zhuzhanghao,
|
|
|
xitong->kaliebiao[kaxuhao].kabianhao,
|
|
|
"转账",
|
|
|
jine,
|
|
|
xitong->kaliebiao[kaxuhao].yue,
|
|
|
"支出",
|
|
|
"转出");
|
|
|
xierujiaoyi(xitong, /* 记录转入流水 */
|
|
|
xitong->kaliebiao[kaxuhao2].zhuzhanghao,
|
|
|
xitong->kaliebiao[kaxuhao2].kabianhao,
|
|
|
"转账",
|
|
|
jine,
|
|
|
xitong->kaliebiao[kaxuhao2].yue,
|
|
|
"收入",
|
|
|
"转入");
|
|
|
baocunka(xitong);
|
|
|
baocunkehu(xitong);
|
|
|
baocunjiaoyi(xitong);
|
|
|
printf("转账成功。\n");
|
|
|
} else if (caozuo == 6) {
|
|
|
printf("输入卡号: ");
|
|
|
kahao = duquzhengshu();
|
|
|
kaxuhao = zhaoka(xitong, kahao);
|
|
|
if (kaxuhao < 0) {
|
|
|
printf("卡不存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入计算天数: ");
|
|
|
tianshu = duquzhengshu();
|
|
|
if (tianshu <= 0) {
|
|
|
tianshu = 1;
|
|
|
}
|
|
|
lixi = xitong->kaliebiao[kaxuhao].yue * xitong->kaliebiao[kaxuhao].lilv * ((double)tianshu) / 360.0; /* 按天折算利息 */
|
|
|
if (strcmp(xitong->kaliebiao[kaxuhao].kaleixing, "信用卡") == 0) {
|
|
|
lixi = -lixi; /* 信用卡按利息支出处理 */
|
|
|
}
|
|
|
xitong->kaliebiao[kaxuhao].yue += lixi; /* 利息计入卡余额 */
|
|
|
kehuxuhao = zhaokehu(xitong, xitong->kaliebiao[kaxuhao].zhuzhanghao);
|
|
|
if (kehuxuhao >= 0) {
|
|
|
xitong->kehuliebiao[kehuxuhao].chuxuyue += lixi;
|
|
|
}
|
|
|
xierujiaoyi(xitong,
|
|
|
xitong->kaliebiao[kaxuhao].zhuzhanghao,
|
|
|
xitong->kaliebiao[kaxuhao].kabianhao,
|
|
|
"利息",
|
|
|
lixi,
|
|
|
xitong->kaliebiao[kaxuhao].yue,
|
|
|
lixi >= 0 ? "收入" : "支出",
|
|
|
"利息结算");
|
|
|
baocunka(xitong);
|
|
|
baocunkehu(xitong);
|
|
|
baocunjiaoyi(xitong);
|
|
|
printf("利息入账完成,利息金额: %.2f\n", lixi);
|
|
|
} else if (caozuo == 7) {
|
|
|
printf("输入卡号: ");
|
|
|
kahao = duquzhengshu();
|
|
|
kaxuhao = zhaoka(xitong, kahao);
|
|
|
if (kaxuhao < 0) {
|
|
|
printf("卡不存在。\n");
|
|
|
} else {
|
|
|
printf("卡号 %d 当前余额 %.2f\n", kahao, xitong->kaliebiao[kaxuhao].yue);
|
|
|
}
|
|
|
} else if (caozuo == 0) {
|
|
|
return;
|
|
|
} else {
|
|
|
printf("输入有误。\n");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 业务查询 */
|
|
|
void yewu_chaxun(YinhangXitong *xitong) {
|
|
|
int caozuo;
|
|
|
int i;
|
|
|
int zongshu;
|
|
|
char kaishi[32];
|
|
|
char jieshu[32];
|
|
|
char kehuileixing[8];
|
|
|
int kahao;
|
|
|
double minjine;
|
|
|
double maxjine;
|
|
|
char shouzhi[8];
|
|
|
int kehuxuhao;
|
|
|
double zongshouru;
|
|
|
double zongzhichu;
|
|
|
int mingxishu;
|
|
|
|
|
|
while (1) {
|
|
|
printf("\n========== 业务查询 ==========\n");
|
|
|
printf("1. 按时间段查询交易\n");
|
|
|
printf("2. 按客户类型查询交易\n");
|
|
|
printf("3. 按银行卡查询交易\n");
|
|
|
printf("4. 按金额区间查询交易\n");
|
|
|
printf("5. 按收入/支出类型查询交易\n");
|
|
|
printf("6. 汇总统计\n");
|
|
|
printf("0. 返回上级\n");
|
|
|
printf("请选择: ");
|
|
|
caozuo = duquzhengshu(); /* 读取当前菜单操作码 */
|
|
|
|
|
|
if (caozuo == 1) {
|
|
|
printf("输入开始时间(yyyy-mm-dd hh:mm:ss): ");
|
|
|
duquzifuchuan(kaishi, 32);
|
|
|
printf("输入结束时间(yyyy-mm-dd hh:mm:ss): ");
|
|
|
duquzifuchuan(jieshu, 32);
|
|
|
zongshu = 0;
|
|
|
for (i = 0; i < xitong->jiaoyishu; i++) {
|
|
|
if (strcmp(xitong->jiaoyiliebiao[i].shijian, kaishi) >= 0 &&
|
|
|
strcmp(xitong->jiaoyiliebiao[i].shijian, jieshu) <= 0) {
|
|
|
xianshijiaoyi(&xitong->jiaoyiliebiao[i]);
|
|
|
zongshu++;
|
|
|
}
|
|
|
}
|
|
|
printf("共查询到 %d 条。\n", zongshu);
|
|
|
} else if (caozuo == 2) {
|
|
|
printf("输入客户类型(普通/VIP): ");
|
|
|
duquzifuchuan(kehuileixing, 8);
|
|
|
zongshu = 0;
|
|
|
for (i = 0; i < xitong->jiaoyishu; i++) {
|
|
|
kehuxuhao = zhaokehu(xitong, xitong->jiaoyiliebiao[i].zhuzhanghao);
|
|
|
if (kehuxuhao >= 0 && strcmp(xitong->kehuliebiao[kehuxuhao].leixing, kehuileixing) == 0) {
|
|
|
xianshijiaoyi(&xitong->jiaoyiliebiao[i]);
|
|
|
zongshu++;
|
|
|
}
|
|
|
}
|
|
|
printf("共查询到 %d 条。\n", zongshu);
|
|
|
} else if (caozuo == 3) {
|
|
|
printf("输入卡号: ");
|
|
|
kahao = duquzhengshu();
|
|
|
zongshu = 0;
|
|
|
for (i = 0; i < xitong->jiaoyishu; i++) {
|
|
|
if (xitong->jiaoyiliebiao[i].kabianhao == kahao) {
|
|
|
xianshijiaoyi(&xitong->jiaoyiliebiao[i]);
|
|
|
zongshu++;
|
|
|
}
|
|
|
}
|
|
|
printf("共查询到 %d 条。\n", zongshu);
|
|
|
} else if (caozuo == 4) {
|
|
|
printf("输入最小金额: ");
|
|
|
minjine = duqufudian();
|
|
|
printf("输入最大金额: ");
|
|
|
maxjine = duqufudian();
|
|
|
zongshu = 0;
|
|
|
for (i = 0; i < xitong->jiaoyishu; i++) {
|
|
|
if (xitong->jiaoyiliebiao[i].jine >= minjine && xitong->jiaoyiliebiao[i].jine <= maxjine) {
|
|
|
xianshijiaoyi(&xitong->jiaoyiliebiao[i]);
|
|
|
zongshu++;
|
|
|
}
|
|
|
}
|
|
|
printf("共查询到 %d 条。\n", zongshu);
|
|
|
} else if (caozuo == 5) {
|
|
|
printf("输入类型(收入/支出): ");
|
|
|
duquzifuchuan(shouzhi, 8);
|
|
|
zongshu = 0;
|
|
|
for (i = 0; i < xitong->jiaoyishu; i++) {
|
|
|
if (strcmp(xitong->jiaoyiliebiao[i].shouruzhichu, shouzhi) == 0) {
|
|
|
xianshijiaoyi(&xitong->jiaoyiliebiao[i]);
|
|
|
zongshu++;
|
|
|
}
|
|
|
}
|
|
|
printf("共查询到 %d 条。\n", zongshu);
|
|
|
} else if (caozuo == 6) {
|
|
|
zongshouru = 0;
|
|
|
zongzhichu = 0;
|
|
|
mingxishu = xitong->jiaoyishu;
|
|
|
for (i = 0; i < xitong->jiaoyishu; i++) {
|
|
|
if (strcmp(xitong->jiaoyiliebiao[i].shouruzhichu, "收入") == 0) {
|
|
|
zongshouru += xitong->jiaoyiliebiao[i].jine;
|
|
|
} else if (strcmp(xitong->jiaoyiliebiao[i].shouruzhichu, "支出") == 0) {
|
|
|
zongzhichu += xitong->jiaoyiliebiao[i].jine;
|
|
|
}
|
|
|
}
|
|
|
printf("交易总条数: %d\n", mingxishu);
|
|
|
printf("总收入: %.2f\n", zongshouru);
|
|
|
printf("总支出: %.2f\n", zongzhichu);
|
|
|
printf("净流入: %.2f\n", zongshouru - zongzhichu);
|
|
|
} else if (caozuo == 0) {
|
|
|
return;
|
|
|
} else {
|
|
|
printf("输入有误。\n");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 排队管理 */
|
|
|
void paidui_guanli(YinhangXitong *xitong) {
|
|
|
int caozuo;
|
|
|
int zhanghao;
|
|
|
int kehuxuhao;
|
|
|
Paidui p;
|
|
|
int i;
|
|
|
int idx;
|
|
|
int minvip;
|
|
|
int minputong;
|
|
|
int dengdai_vip;
|
|
|
int dengdai_putong;
|
|
|
int jinriwancheng;
|
|
|
char jinri[11];
|
|
|
char shijian[20];
|
|
|
|
|
|
while (1) {
|
|
|
printf("\n========== 银行排队管理 ==========\n");
|
|
|
printf("1. 客户取号\n");
|
|
|
printf("2. 叫号办理(按VIP优先)\n");
|
|
|
printf("3. 显示排队信息\n");
|
|
|
printf("4. 每日客流统计\n");
|
|
|
printf("0. 返回上级\n");
|
|
|
printf("请选择: ");
|
|
|
caozuo = duquzhengshu(); /* 读取当前菜单操作码 */
|
|
|
|
|
|
if (caozuo == 1) {
|
|
|
if (xitong->paiduishu >= 3000) {
|
|
|
printf("排队记录容量已满。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入客户主账户: ");
|
|
|
zhanghao = duquzhengshu();
|
|
|
kehuxuhao = zhaokehu(xitong, zhanghao);
|
|
|
if (kehuxuhao < 0) {
|
|
|
printf("客户不存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
p.quhaoid = shengchengquhaoid(xitong);
|
|
|
p.zhuzhanghao = zhanghao;
|
|
|
strcpy(p.kehuileixing, xitong->kehuliebiao[kehuxuhao].leixing);
|
|
|
if (strcmp(p.kehuileixing, "VIP") == 0) {
|
|
|
strcpy(p.chuangkou, "VIP窗");
|
|
|
} else {
|
|
|
strcpy(p.chuangkou, "普通窗");
|
|
|
}
|
|
|
strcpy(p.zhuangtai, "等待中");
|
|
|
p.pingfen = 0;
|
|
|
qudangqianshijian(p.shijian, sizeof(p.shijian));
|
|
|
|
|
|
xitong->paiduiliebiao[xitong->paiduishu] = p;
|
|
|
xitong->paiduishu++;
|
|
|
baocunpaidui(xitong);
|
|
|
printf("取号成功,号码: %d,窗口: %s\n", p.quhaoid, p.chuangkou);
|
|
|
} else if (caozuo == 2) {
|
|
|
idx = -1;
|
|
|
minvip = 2147483647; /* 先从VIP队列里找最小号 */
|
|
|
minputong = 2147483647;
|
|
|
|
|
|
for (i = 0; i < xitong->paiduishu; i++) {
|
|
|
if (strcmp(xitong->paiduiliebiao[i].zhuangtai, "等待中") == 0 &&
|
|
|
strcmp(xitong->paiduiliebiao[i].kehuileixing, "VIP") == 0) {
|
|
|
if (xitong->paiduiliebiao[i].quhaoid < minvip) {
|
|
|
minvip = xitong->paiduiliebiao[i].quhaoid;
|
|
|
idx = i;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (idx < 0) { /* 没有VIP时再从普通队列叫号 */
|
|
|
for (i = 0; i < xitong->paiduishu; i++) {
|
|
|
if (strcmp(xitong->paiduiliebiao[i].zhuangtai, "等待中") == 0 &&
|
|
|
strcmp(xitong->paiduiliebiao[i].kehuileixing, "普通") == 0) {
|
|
|
if (xitong->paiduiliebiao[i].quhaoid < minputong) {
|
|
|
minputong = xitong->paiduiliebiao[i].quhaoid;
|
|
|
idx = i;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (idx < 0) {
|
|
|
printf("当前没有等待中的客户。\n");
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
printf("叫号: %d,客户主账户: %d,窗口: %s\n",
|
|
|
xitong->paiduiliebiao[idx].quhaoid,
|
|
|
xitong->paiduiliebiao[idx].zhuzhanghao,
|
|
|
xitong->paiduiliebiao[idx].chuangkou);
|
|
|
printf("请输入客户评分(1-5): ");
|
|
|
xitong->paiduiliebiao[idx].pingfen = duquzhengshu();
|
|
|
if (xitong->paiduiliebiao[idx].pingfen < 1) {
|
|
|
xitong->paiduiliebiao[idx].pingfen = 1;
|
|
|
}
|
|
|
if (xitong->paiduiliebiao[idx].pingfen > 5) {
|
|
|
xitong->paiduiliebiao[idx].pingfen = 5;
|
|
|
}
|
|
|
strcpy(xitong->paiduiliebiao[idx].zhuangtai, "已完成"); /* 更新办理状态 */
|
|
|
baocunpaidui(xitong);
|
|
|
printf("该号业务已完成。\n");
|
|
|
} else if (caozuo == 3) {
|
|
|
dengdai_vip = 0;
|
|
|
dengdai_putong = 0;
|
|
|
for (i = 0; i < xitong->paiduishu; i++) {
|
|
|
if (strcmp(xitong->paiduiliebiao[i].zhuangtai, "等待中") == 0) {
|
|
|
if (strcmp(xitong->paiduiliebiao[i].kehuileixing, "VIP") == 0) {
|
|
|
dengdai_vip++;
|
|
|
} else {
|
|
|
dengdai_putong++;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
printf("VIP窗口等待人数: %d\n", dengdai_vip);
|
|
|
printf("普通窗口等待人数: %d\n", dengdai_putong);
|
|
|
printf("------ 全部排队记录 ------\n");
|
|
|
for (i = 0; i < xitong->paiduishu; i++) {
|
|
|
xianshipaidui(&xitong->paiduiliebiao[i]);
|
|
|
}
|
|
|
} else if (caozuo == 4) {
|
|
|
qudangqianshijian(shijian, sizeof(shijian));
|
|
|
strncpy(jinri, shijian, 10);
|
|
|
jinri[10] = '\0';
|
|
|
jinriwancheng = 0;
|
|
|
for (i = 0; i < xitong->paiduishu; i++) {
|
|
|
if (strcmp(xitong->paiduiliebiao[i].zhuangtai, "已完成") == 0 &&
|
|
|
strncmp(xitong->paiduiliebiao[i].shijian, jinri, 10) == 0) {
|
|
|
jinriwancheng++;
|
|
|
}
|
|
|
}
|
|
|
printf("今日日期: %s\n", jinri);
|
|
|
printf("今日已完成业务客户数: %d\n", jinriwancheng);
|
|
|
} else if (caozuo == 0) {
|
|
|
return;
|
|
|
} else {
|
|
|
printf("输入有误。\n");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 网点管理 */
|
|
|
void wangdian_guanli(YinhangXitong *xitong) {
|
|
|
int caozuo;
|
|
|
int i;
|
|
|
int id;
|
|
|
int xuhao;
|
|
|
Wangdian w;
|
|
|
Luxian l;
|
|
|
int qidian;
|
|
|
int zhongdian;
|
|
|
int n;
|
|
|
int j;
|
|
|
int *tu;
|
|
|
int juli[120];
|
|
|
int qianqu[120];
|
|
|
int fangwen[120];
|
|
|
int min;
|
|
|
int u;
|
|
|
int v;
|
|
|
int qidianxuhao;
|
|
|
int zhongdianxuhao;
|
|
|
int lujing[120];
|
|
|
int lujingchangdu;
|
|
|
int duiwu[120];
|
|
|
int tou;
|
|
|
int wei;
|
|
|
int keyi;
|
|
|
|
|
|
tu = (int *)malloc(sizeof(int) * 120 * 120); /* 邻接矩阵改用堆内存,避免栈溢出 */
|
|
|
if (tu == NULL) {
|
|
|
printf("内存不足,无法进入网点管理。\n");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
while (1) {
|
|
|
printf("\n========== 银行网点查询与管理 ==========\n");
|
|
|
printf("1. 查看网点\n");
|
|
|
printf("2. 新增网点\n");
|
|
|
printf("3. 修改网点\n");
|
|
|
printf("4. 删除网点\n");
|
|
|
printf("5. 查看路径信息\n");
|
|
|
printf("6. 新增路径\n");
|
|
|
printf("7. 最短路径导航\n");
|
|
|
printf("8. 可行路径判断\n");
|
|
|
printf("0. 返回上级\n");
|
|
|
printf("请选择: ");
|
|
|
caozuo = duquzhengshu(); /* 读取当前菜单操作码 */
|
|
|
|
|
|
if (caozuo == 1) {
|
|
|
if (xitong->wangdianshu == 0) {
|
|
|
printf("暂无网点数据。\n");
|
|
|
} else {
|
|
|
for (i = 0; i < xitong->wangdianshu; i++) {
|
|
|
xianshiwangdian(&xitong->wangdianliebiao[i]);
|
|
|
}
|
|
|
}
|
|
|
} else if (caozuo == 2) {
|
|
|
if (xitong->wangdianshu >= 120) {
|
|
|
printf("网点容量已满。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入网点ID: ");
|
|
|
w.wangdianid = duquzhengshu();
|
|
|
if (zhaowangdian(xitong, w.wangdianid) >= 0) {
|
|
|
printf("网点ID已存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入网点名称: ");
|
|
|
duquzifuchuan(w.mingcheng, 32);
|
|
|
printf("输入网点地址: ");
|
|
|
duquzifuchuan(w.dizhi, 128);
|
|
|
printf("输入当前业务人数: ");
|
|
|
w.yewurenshu = duquzhengshu();
|
|
|
|
|
|
xitong->wangdianliebiao[xitong->wangdianshu] = w;
|
|
|
xitong->wangdianshu++;
|
|
|
baocunwangdian(xitong);
|
|
|
printf("新增网点成功。\n");
|
|
|
} else if (caozuo == 3) {
|
|
|
printf("输入要修改的网点ID: ");
|
|
|
id = duquzhengshu();
|
|
|
xuhao = zhaowangdian(xitong, id);
|
|
|
if (xuhao < 0) {
|
|
|
printf("网点不存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入新名称: ");
|
|
|
duquzifuchuan(xitong->wangdianliebiao[xuhao].mingcheng, 32);
|
|
|
printf("输入新地址: ");
|
|
|
duquzifuchuan(xitong->wangdianliebiao[xuhao].dizhi, 128);
|
|
|
printf("输入新业务人数: ");
|
|
|
xitong->wangdianliebiao[xuhao].yewurenshu = duquzhengshu();
|
|
|
baocunwangdian(xitong);
|
|
|
printf("修改成功。\n");
|
|
|
} else if (caozuo == 4) {
|
|
|
printf("输入要删除的网点ID: ");
|
|
|
id = duquzhengshu();
|
|
|
xuhao = zhaowangdian(xitong, id);
|
|
|
if (xuhao < 0) {
|
|
|
printf("网点不存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
for (i = xuhao; i < xitong->wangdianshu - 1; i++) {
|
|
|
xitong->wangdianliebiao[i] = xitong->wangdianliebiao[i + 1];
|
|
|
}
|
|
|
xitong->wangdianshu--;
|
|
|
|
|
|
for (i = 0; i < xitong->luxianshu; i++) {
|
|
|
if (xitong->luxianliebiao[i].qidianid == id || xitong->luxianliebiao[i].zhongdianid == id) {
|
|
|
for (j = i; j < xitong->luxianshu - 1; j++) {
|
|
|
xitong->luxianliebiao[j] = xitong->luxianliebiao[j + 1];
|
|
|
}
|
|
|
xitong->luxianshu--;
|
|
|
i--;
|
|
|
}
|
|
|
}
|
|
|
baocunwangdian(xitong);
|
|
|
baocunluxian(xitong);
|
|
|
printf("删除成功。\n");
|
|
|
} else if (caozuo == 5) {
|
|
|
if (xitong->luxianshu == 0) {
|
|
|
printf("暂无路径数据。\n");
|
|
|
} else {
|
|
|
printf("格式: 起点ID -> 终点ID, 距离, 是否可行\n");
|
|
|
for (i = 0; i < xitong->luxianshu; i++) {
|
|
|
printf("%d -> %d, 距离:%d, 可行:%s\n",
|
|
|
xitong->luxianliebiao[i].qidianid,
|
|
|
xitong->luxianliebiao[i].zhongdianid,
|
|
|
xitong->luxianliebiao[i].juli,
|
|
|
xitong->luxianliebiao[i].kehang == 1 ? "是" : "否");
|
|
|
}
|
|
|
}
|
|
|
} else if (caozuo == 6) {
|
|
|
if (xitong->luxianshu >= 400) {
|
|
|
printf("路径容量已满。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入起点网点ID: ");
|
|
|
l.qidianid = duquzhengshu();
|
|
|
printf("输入终点网点ID: ");
|
|
|
l.zhongdianid = duquzhengshu();
|
|
|
if (zhaowangdian(xitong, l.qidianid) < 0 || zhaowangdian(xitong, l.zhongdianid) < 0) {
|
|
|
printf("起点或终点网点不存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入距离: ");
|
|
|
l.juli = duquzhengshu();
|
|
|
printf("输入是否可行(1可行 0不可行): ");
|
|
|
l.kehang = duquzhengshu();
|
|
|
if (l.kehang != 0) {
|
|
|
l.kehang = 1;
|
|
|
}
|
|
|
xitong->luxianliebiao[xitong->luxianshu] = l;
|
|
|
xitong->luxianshu++;
|
|
|
baocunluxian(xitong);
|
|
|
printf("路径新增成功。\n");
|
|
|
} else if (caozuo == 7) {
|
|
|
if (xitong->wangdianshu <= 1) {
|
|
|
printf("网点数量不足。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入起点网点ID: ");
|
|
|
qidian = duquzhengshu();
|
|
|
printf("输入终点网点ID: ");
|
|
|
zhongdian = duquzhengshu();
|
|
|
qidianxuhao = zhaowangdian(xitong, qidian);
|
|
|
zhongdianxuhao = zhaowangdian(xitong, zhongdian);
|
|
|
if (qidianxuhao < 0 || zhongdianxuhao < 0) {
|
|
|
printf("起点或终点不存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
n = xitong->wangdianshu; /* 图中顶点数量 */
|
|
|
for (i = 0; i < n; i++) {
|
|
|
for (j = 0; j < n; j++) {
|
|
|
if (i == j) {
|
|
|
tu[i * 120 + j] = 0;
|
|
|
} else {
|
|
|
tu[i * 120 + j] = 1000000000; /* 无边时使用大值表示不可达 */
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < xitong->luxianshu; i++) {
|
|
|
if (xitong->luxianliebiao[i].kehang == 1) {
|
|
|
int a;
|
|
|
int b;
|
|
|
a = zhaowangdian(xitong, xitong->luxianliebiao[i].qidianid);
|
|
|
b = zhaowangdian(xitong, xitong->luxianliebiao[i].zhongdianid);
|
|
|
if (a >= 0 && b >= 0) {
|
|
|
if (xitong->luxianliebiao[i].juli < tu[a * 120 + b]) {
|
|
|
tu[a * 120 + b] = xitong->luxianliebiao[i].juli; /* 无向图双向赋值 */
|
|
|
tu[b * 120 + a] = xitong->luxianliebiao[i].juli;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < n; i++) {
|
|
|
juli[i] = 1000000000; /* 初始化最短路为无穷大 */
|
|
|
qianqu[i] = -1;
|
|
|
fangwen[i] = 0;
|
|
|
}
|
|
|
juli[qidianxuhao] = 0; /* 起点到自身距离为0 */
|
|
|
|
|
|
for (i = 0; i < n; i++) {
|
|
|
min = 1000000000;
|
|
|
u = -1;
|
|
|
for (j = 0; j < n; j++) {
|
|
|
if (!fangwen[j] && juli[j] < min) {
|
|
|
min = juli[j];
|
|
|
u = j;
|
|
|
}
|
|
|
}
|
|
|
if (u == -1) {
|
|
|
break;
|
|
|
}
|
|
|
fangwen[u] = 1; /* 标记最短距离已确定 */
|
|
|
for (v = 0; v < n; v++) {
|
|
|
if (!fangwen[v] && tu[u * 120 + v] < 1000000000 && juli[u] + tu[u * 120 + v] < juli[v]) {
|
|
|
juli[v] = juli[u] + tu[u * 120 + v]; /* 松弛边 */
|
|
|
qianqu[v] = u; /* 记录前驱点 */
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (juli[zhongdianxuhao] >= 1000000000) {
|
|
|
printf("无可达最短路径。\n");
|
|
|
} else {
|
|
|
lujingchangdu = 0;
|
|
|
v = zhongdianxuhao;
|
|
|
while (v != -1) { /* 反向回溯完整路径 */
|
|
|
lujing[lujingchangdu] = v;
|
|
|
lujingchangdu++;
|
|
|
v = qianqu[v];
|
|
|
}
|
|
|
printf("最短距离: %d\n", juli[zhongdianxuhao]);
|
|
|
printf("路径: ");
|
|
|
for (i = lujingchangdu - 1; i >= 0; i--) {
|
|
|
printf("%s", xitong->wangdianliebiao[lujing[i]].mingcheng);
|
|
|
if (i != 0) {
|
|
|
printf(" -> ");
|
|
|
}
|
|
|
}
|
|
|
printf("\n");
|
|
|
}
|
|
|
} else if (caozuo == 8) {
|
|
|
if (xitong->wangdianshu <= 1) {
|
|
|
printf("网点数量不足。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入起点网点ID: ");
|
|
|
qidian = duquzhengshu();
|
|
|
printf("输入终点网点ID: ");
|
|
|
zhongdian = duquzhengshu();
|
|
|
qidianxuhao = zhaowangdian(xitong, qidian);
|
|
|
zhongdianxuhao = zhaowangdian(xitong, zhongdian);
|
|
|
if (qidianxuhao < 0 || zhongdianxuhao < 0) {
|
|
|
printf("起点或终点不存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
n = xitong->wangdianshu; /* BFS可行路径判断 */
|
|
|
for (i = 0; i < n; i++) {
|
|
|
fangwen[i] = 0;
|
|
|
qianqu[i] = -1;
|
|
|
}
|
|
|
tou = 0;
|
|
|
wei = 0;
|
|
|
duiwu[wei++] = qidianxuhao;
|
|
|
fangwen[qidianxuhao] = 1;
|
|
|
keyi = 0;
|
|
|
|
|
|
while (tou < wei) { /* 标准队列广度优先遍历 */
|
|
|
u = duiwu[tou++];
|
|
|
if (u == zhongdianxuhao) {
|
|
|
keyi = 1;
|
|
|
break;
|
|
|
}
|
|
|
for (i = 0; i < xitong->luxianshu; i++) {
|
|
|
int a;
|
|
|
int b;
|
|
|
if (xitong->luxianliebiao[i].kehang != 1) {
|
|
|
continue;
|
|
|
}
|
|
|
a = zhaowangdian(xitong, xitong->luxianliebiao[i].qidianid);
|
|
|
b = zhaowangdian(xitong, xitong->luxianliebiao[i].zhongdianid);
|
|
|
if (a == u && b >= 0 && !fangwen[b]) {
|
|
|
fangwen[b] = 1;
|
|
|
qianqu[b] = u;
|
|
|
duiwu[wei++] = b;
|
|
|
}
|
|
|
if (b == u && a >= 0 && !fangwen[a]) {
|
|
|
fangwen[a] = 1;
|
|
|
qianqu[a] = u;
|
|
|
duiwu[wei++] = a;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (!keyi) {
|
|
|
printf("不可达,无可行路径。\n");
|
|
|
} else {
|
|
|
lujingchangdu = 0;
|
|
|
v = zhongdianxuhao;
|
|
|
while (v != -1) {
|
|
|
lujing[lujingchangdu++] = v;
|
|
|
v = qianqu[v];
|
|
|
}
|
|
|
printf("存在可行路径: ");
|
|
|
for (i = lujingchangdu - 1; i >= 0; i--) {
|
|
|
printf("%s", xitong->wangdianliebiao[lujing[i]].mingcheng);
|
|
|
if (i != 0) {
|
|
|
printf(" -> ");
|
|
|
}
|
|
|
}
|
|
|
printf("\n");
|
|
|
}
|
|
|
} else if (caozuo == 0) {
|
|
|
free(tu); /* 退出前释放堆内存 */
|
|
|
return;
|
|
|
} else {
|
|
|
printf("输入有误。\n");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 智能管理 */
|
|
|
void zhineng_guanli(YinhangXitong *xitong) {
|
|
|
int caozuo;
|
|
|
int i;
|
|
|
int j;
|
|
|
int kahao;
|
|
|
int kaxuhao;
|
|
|
int zhanghao;
|
|
|
int kehuxuhao;
|
|
|
double jine;
|
|
|
double rishouyi;
|
|
|
double yueshouyi;
|
|
|
double zhaiwubilv;
|
|
|
double shouzhibi;
|
|
|
int pingfen;
|
|
|
char dengji[8];
|
|
|
char tupianwenjian[256];
|
|
|
FILE *fp;
|
|
|
int yanzhengma;
|
|
|
char yanzhengzifu[16];
|
|
|
char dangri[11];
|
|
|
int duoci;
|
|
|
char shijian[20];
|
|
|
|
|
|
while (1) {
|
|
|
printf("\n========== 智能管理 ==========\n");
|
|
|
printf("1. 交易异常报警\n");
|
|
|
printf("2. 银行卡每日/月利息计算\n");
|
|
|
printf("3. 客户统计分析\n");
|
|
|
printf("4. 信用评级与风控审批\n");
|
|
|
printf("5. 投资顾问建议\n");
|
|
|
printf("6. 身份核验\n");
|
|
|
printf("7. 生物识别模拟\n");
|
|
|
printf("8. 影像读取模拟\n");
|
|
|
printf("0. 返回上级\n");
|
|
|
printf("请选择: ");
|
|
|
caozuo = duquzhengshu(); /* 读取当前菜单操作码 */
|
|
|
|
|
|
if (caozuo == 1) {
|
|
|
int yichanggeshu;
|
|
|
yichanggeshu = 0;
|
|
|
printf("异常规则: 单笔金额>=50000 或 同账户单日交易>=5笔\n");
|
|
|
|
|
|
for (i = 0; i < xitong->jiaoyishu; i++) { /* 规则1:筛大额交易 */
|
|
|
if (xitong->jiaoyiliebiao[i].jine >= 50000.0) {
|
|
|
printf("[大额报警] ");
|
|
|
xianshijiaoyi(&xitong->jiaoyiliebiao[i]);
|
|
|
yichanggeshu++;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < xitong->jiaoyishu; i++) { /* 规则2:同账户单日多笔 */
|
|
|
strncpy(dangri, xitong->jiaoyiliebiao[i].shijian, 10);
|
|
|
dangri[10] = '\0';
|
|
|
duoci = 0;
|
|
|
for (j = 0; j < xitong->jiaoyishu; j++) {
|
|
|
if (xitong->jiaoyiliebiao[j].zhuzhanghao == xitong->jiaoyiliebiao[i].zhuzhanghao &&
|
|
|
strncmp(xitong->jiaoyiliebiao[j].shijian, dangri, 10) == 0) {
|
|
|
duoci++;
|
|
|
}
|
|
|
}
|
|
|
if (duoci >= 5) {
|
|
|
printf("[多笔报警] 主账户:%d 日期:%s 笔数:%d\n",
|
|
|
xitong->jiaoyiliebiao[i].zhuzhanghao, dangri, duoci);
|
|
|
yichanggeshu++;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (yichanggeshu == 0) {
|
|
|
printf("未发现明显异常交易。\n");
|
|
|
}
|
|
|
} else if (caozuo == 2) {
|
|
|
printf("输入卡号: ");
|
|
|
kahao = duquzhengshu();
|
|
|
kaxuhao = zhaoka(xitong, kahao);
|
|
|
if (kaxuhao < 0) {
|
|
|
printf("卡不存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
rishouyi = xitong->kaliebiao[kaxuhao].yue * xitong->kaliebiao[kaxuhao].lilv / 360.0;
|
|
|
yueshouyi = xitong->kaliebiao[kaxuhao].yue * xitong->kaliebiao[kaxuhao].lilv / 12.0;
|
|
|
if (strcmp(xitong->kaliebiao[kaxuhao].kaleixing, "信用卡") == 0) {
|
|
|
rishouyi = -rishouyi;
|
|
|
yueshouyi = -yueshouyi;
|
|
|
}
|
|
|
printf("卡号:%d 当前余额:%.2f 年利率:%.4f\n", kahao, xitong->kaliebiao[kaxuhao].yue, xitong->kaliebiao[kaxuhao].lilv);
|
|
|
printf("每日利息试算: %.2f\n", rishouyi);
|
|
|
printf("每月利息试算: %.2f\n", yueshouyi);
|
|
|
} else if (caozuo == 3) {
|
|
|
int vipshu;
|
|
|
int putongshu;
|
|
|
double zongzichan;
|
|
|
double zongdaikuan;
|
|
|
double pingjunxinyong;
|
|
|
vipshu = 0;
|
|
|
putongshu = 0;
|
|
|
zongzichan = 0;
|
|
|
zongdaikuan = 0;
|
|
|
pingjunxinyong = 0;
|
|
|
for (i = 0; i < xitong->kehushu; i++) {
|
|
|
if (strcmp(xitong->kehuliebiao[i].leixing, "VIP") == 0) {
|
|
|
vipshu++;
|
|
|
} else {
|
|
|
putongshu++;
|
|
|
}
|
|
|
zongzichan += xitong->kehuliebiao[i].jinrongzichan;
|
|
|
zongdaikuan += xitong->kehuliebiao[i].daikuanyue;
|
|
|
pingjunxinyong += xitong->kehuliebiao[i].xinyong;
|
|
|
}
|
|
|
if (xitong->kehushu > 0) {
|
|
|
pingjunxinyong = pingjunxinyong / xitong->kehushu;
|
|
|
}
|
|
|
printf("客户总数: %d\n", xitong->kehushu);
|
|
|
printf("VIP客户数: %d\n", vipshu);
|
|
|
printf("普通客户数: %d\n", putongshu);
|
|
|
printf("客户总金融资产: %.2f\n", zongzichan);
|
|
|
printf("客户总贷款余额: %.2f\n", zongdaikuan);
|
|
|
printf("平均信用分: %.2f\n", pingjunxinyong);
|
|
|
} else if (caozuo == 4) {
|
|
|
printf("输入客户主账户: ");
|
|
|
zhanghao = duquzhengshu();
|
|
|
kehuxuhao = zhaokehu(xitong, zhanghao);
|
|
|
if (kehuxuhao < 0) {
|
|
|
printf("客户不存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入拟审批贷款金额: ");
|
|
|
jine = duqufudian();
|
|
|
|
|
|
zhaiwubilv = xitong->kehuliebiao[kehuxuhao].daikuanyue / /* 债务压力 */
|
|
|
(xitong->kehuliebiao[kehuxuhao].chuxuyue + xitong->kehuliebiao[kehuxuhao].jinrongzichan + 1.0);
|
|
|
shouzhibi = xitong->kehuliebiao[kehuxuhao].yuezhichu / /* 收支健康度 */
|
|
|
(xitong->kehuliebiao[kehuxuhao].yueshouru + 1.0);
|
|
|
|
|
|
pingfen = xitong->kehuliebiao[kehuxuhao].xinyong; /* 从基础信用分出发 */
|
|
|
if (zhaiwubilv < 0.2) {
|
|
|
pingfen += 10;
|
|
|
} else if (zhaiwubilv > 0.6) {
|
|
|
pingfen -= 15;
|
|
|
}
|
|
|
if (shouzhibi < 0.5) {
|
|
|
pingfen += 8;
|
|
|
} else if (shouzhibi > 0.9) {
|
|
|
pingfen -= 10;
|
|
|
}
|
|
|
if (xitong->kehuliebiao[kehuxuhao].jinrongzichan > 500000) {
|
|
|
pingfen += 8;
|
|
|
}
|
|
|
|
|
|
if (pingfen >= 85) {
|
|
|
strcpy(dengji, "A");
|
|
|
} else if (pingfen >= 70) {
|
|
|
strcpy(dengji, "B");
|
|
|
} else {
|
|
|
strcpy(dengji, "C");
|
|
|
}
|
|
|
|
|
|
printf("客户:%s 风控评分:%d 评级:%s\n", xitong->kehuliebiao[kehuxuhao].xingming, pingfen, dengji);
|
|
|
if (pingfen >= 75 && jine <= (xitong->kehuliebiao[kehuxuhao].jinrongzichan * 0.5)) {
|
|
|
printf("风控审批结果: 通过\n");
|
|
|
} else {
|
|
|
printf("风控审批结果: 拒绝或需人工复核\n");
|
|
|
}
|
|
|
} else if (caozuo == 5) {
|
|
|
printf("输入客户主账户: ");
|
|
|
zhanghao = duquzhengshu();
|
|
|
kehuxuhao = zhaokehu(xitong, zhanghao);
|
|
|
if (kehuxuhao < 0) {
|
|
|
printf("客户不存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("客户:%s\n", xitong->kehuliebiao[kehuxuhao].xingming);
|
|
|
if (xitong->kehuliebiao[kehuxuhao].jinrongzichan < 100000) {
|
|
|
printf("建议: 以货币基金+定期存款为主,控制风险。\n");
|
|
|
} else if (xitong->kehuliebiao[kehuxuhao].jinrongzichan < 500000) {
|
|
|
printf("建议: 债券基金+指数基金组合,适当配置保险。\n");
|
|
|
} else {
|
|
|
if (xitong->kehuliebiao[kehuxuhao].xinyong >= 85) {
|
|
|
printf("建议: 指数基金+固收+部分权益类产品,分散投资。\n");
|
|
|
} else {
|
|
|
printf("建议: 先稳健配置,降低杠杆,再逐步增加权益资产。\n");
|
|
|
}
|
|
|
}
|
|
|
} else if (caozuo == 6) {
|
|
|
printf("输入客户主账户: ");
|
|
|
zhanghao = duquzhengshu();
|
|
|
kehuxuhao = zhaokehu(xitong, zhanghao);
|
|
|
if (kehuxuhao < 0) {
|
|
|
printf("客户不存在。\n");
|
|
|
continue;
|
|
|
}
|
|
|
printf("输入身份证后6位(演示): ");
|
|
|
yanzhengma = duquzhengshu();
|
|
|
if (yanzhengma == xitong->kehuliebiao[kehuxuhao].shenfenzheng) {
|
|
|
printf("身份核验通过。\n");
|
|
|
} else {
|
|
|
printf("身份核验失败。\n");
|
|
|
}
|
|
|
} else if (caozuo == 7) {
|
|
|
printf("输入生物识别结果(ok/fail): ");
|
|
|
duquzifuchuan(yanzhengzifu, 16);
|
|
|
if (strcmp(yanzhengzifu, "ok") == 0 || strcmp(yanzhengzifu, "OK") == 0) {
|
|
|
printf("生物识别通过。\n");
|
|
|
} else {
|
|
|
printf("生物识别未通过。\n");
|
|
|
}
|
|
|
} else if (caozuo == 8) {
|
|
|
printf("输入要读取的影像文件名: ");
|
|
|
duquzifuchuan(tupianwenjian, 256);
|
|
|
fp = fopen(tupianwenjian, "r");
|
|
|
if (fp == NULL) {
|
|
|
printf("影像读取失败,文件不存在或无法访问。\n");
|
|
|
} else {
|
|
|
fclose(fp);
|
|
|
qudangqianshijian(shijian, sizeof(shijian));
|
|
|
printf("影像读取成功,读取时间: %s\n", shijian);
|
|
|
}
|
|
|
} else if (caozuo == 0) {
|
|
|
return;
|
|
|
} else {
|
|
|
printf("输入有误。\n");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 管理员菜单 */
|
|
|
void guanliyuan_caidan(YinhangXitong *xitong) {
|
|
|
int caozuo;
|
|
|
while (1) {
|
|
|
printf("\n========== 管理员主菜单 ==========\n");
|
|
|
printf("1. 银行职员管理\n");
|
|
|
printf("2. 客户账户管理\n");
|
|
|
printf("3. 银行卡管理\n");
|
|
|
printf("4. 存取贷业务管理\n");
|
|
|
printf("5. 业务查询\n");
|
|
|
printf("6. 银行排队管理\n");
|
|
|
printf("7. 银行网点查询\n");
|
|
|
printf("8. 智能管理\n");
|
|
|
printf("9. 保存全部数据\n");
|
|
|
printf("0. 退出登录\n");
|
|
|
printf("请选择: ");
|
|
|
caozuo = duquzhengshu(); /* 读取当前菜单操作码 */
|
|
|
|
|
|
if (caozuo == 1) {
|
|
|
zhiyuan_guanli(xitong);
|
|
|
} else if (caozuo == 2) {
|
|
|
kehu_guanli(xitong);
|
|
|
} else if (caozuo == 3) {
|
|
|
ka_guanli(xitong);
|
|
|
} else if (caozuo == 4) {
|
|
|
cunqudai_guanli(xitong);
|
|
|
} else if (caozuo == 5) {
|
|
|
yewu_chaxun(xitong);
|
|
|
} else if (caozuo == 6) {
|
|
|
paidui_guanli(xitong);
|
|
|
} else if (caozuo == 7) {
|
|
|
wangdian_guanli(xitong);
|
|
|
} else if (caozuo == 8) {
|
|
|
zhineng_guanli(xitong);
|
|
|
} else if (caozuo == 9) {
|
|
|
baocunsuoyoushuju(xitong); /* 手动触发一次全量保存 */
|
|
|
printf("全部数据已保存。\n");
|
|
|
} else if (caozuo == 0) {
|
|
|
baocunsuoyoushuju(xitong);
|
|
|
return;
|
|
|
} else {
|
|
|
printf("输入有误。\n");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 职员菜单 */
|
|
|
void zhiyuan_caidan(YinhangXitong *xitong, int zhiyuanxuhao) {
|
|
|
int caozuo;
|
|
|
while (1) {
|
|
|
printf("\n========== 职员主菜单 ==========\n");
|
|
|
printf("当前登录职员: %s\n", xitong->zhiyuanliebiao[zhiyuanxuhao].xingming);
|
|
|
printf("1. 客户账户管理\n");
|
|
|
printf("2. 银行卡管理\n");
|
|
|
printf("3. 存取贷业务管理\n");
|
|
|
printf("4. 业务查询\n");
|
|
|
printf("5. 银行排队管理\n");
|
|
|
printf("6. 银行网点查询\n");
|
|
|
printf("7. 智能管理\n");
|
|
|
printf("8. 个人信息与密码修改\n");
|
|
|
printf("0. 退出登录\n");
|
|
|
printf("请选择: ");
|
|
|
caozuo = duquzhengshu(); /* 读取当前菜单操作码 */
|
|
|
|
|
|
if (caozuo == 1) {
|
|
|
kehu_guanli(xitong);
|
|
|
} else if (caozuo == 2) {
|
|
|
ka_guanli(xitong);
|
|
|
} else if (caozuo == 3) {
|
|
|
cunqudai_guanli(xitong);
|
|
|
} else if (caozuo == 4) {
|
|
|
yewu_chaxun(xitong);
|
|
|
} else if (caozuo == 5) {
|
|
|
paidui_guanli(xitong);
|
|
|
} else if (caozuo == 6) {
|
|
|
wangdian_guanli(xitong);
|
|
|
} else if (caozuo == 7) {
|
|
|
zhineng_guanli(xitong);
|
|
|
} else if (caozuo == 8) {
|
|
|
zhiyuan_ziguanli(xitong, zhiyuanxuhao);
|
|
|
} else if (caozuo == 0) {
|
|
|
baocunsuoyoushuju(xitong);
|
|
|
return;
|
|
|
} else {
|
|
|
printf("输入有误。\n");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 客户菜单 */
|
|
|
void kehu_caidan(YinhangXitong *xitong, int kehuxuhao) {
|
|
|
int caozuo;
|
|
|
int i;
|
|
|
int kahao;
|
|
|
|
|
|
while (1) {
|
|
|
printf("\n========== 客户主菜单 ==========\n");
|
|
|
printf("当前客户: %s (主账户:%d)\n", xitong->kehuliebiao[kehuxuhao].xingming, xitong->kehuliebiao[kehuxuhao].zhuzhanghao);
|
|
|
printf("1. 查看个人信息\n");
|
|
|
printf("2. 修改电话地址密码\n");
|
|
|
printf("3. 查看名下银行卡\n");
|
|
|
printf("4. 查看个人交易记录\n");
|
|
|
printf("5. 排队取号\n");
|
|
|
printf("6. 身份核验(智能管理子功能)\n");
|
|
|
printf("0. 退出登录\n");
|
|
|
printf("请选择: ");
|
|
|
caozuo = duquzhengshu(); /* 读取当前菜单操作码 */
|
|
|
|
|
|
if (caozuo == 1) {
|
|
|
xianshikehu(&xitong->kehuliebiao[kehuxuhao]);
|
|
|
} else if (caozuo == 2) {
|
|
|
printf("输入新电话: ");
|
|
|
duquzifuchuan(xitong->kehuliebiao[kehuxuhao].dianhua, 32);
|
|
|
printf("输入新地址: ");
|
|
|
duquzifuchuan(xitong->kehuliebiao[kehuxuhao].dizhi, 128);
|
|
|
printf("输入新密码: ");
|
|
|
duquzifuchuan(xitong->kehuliebiao[kehuxuhao].mima, 32);
|
|
|
baocunkehu(xitong);
|
|
|
printf("修改成功。\n");
|
|
|
} else if (caozuo == 3) {
|
|
|
for (i = 0; i < xitong->kashu; i++) {
|
|
|
if (xitong->kaliebiao[i].zhuzhanghao == xitong->kehuliebiao[kehuxuhao].zhuzhanghao) {
|
|
|
xianshika(&xitong->kaliebiao[i]);
|
|
|
}
|
|
|
}
|
|
|
} else if (caozuo == 4) {
|
|
|
for (i = 0; i < xitong->jiaoyishu; i++) {
|
|
|
if (xitong->jiaoyiliebiao[i].zhuzhanghao == xitong->kehuliebiao[kehuxuhao].zhuzhanghao) {
|
|
|
xianshijiaoyi(&xitong->jiaoyiliebiao[i]);
|
|
|
}
|
|
|
}
|
|
|
} else if (caozuo == 5) {
|
|
|
Paidui p;
|
|
|
if (xitong->paiduishu >= 3000) {
|
|
|
printf("当前排队系统繁忙。\n");
|
|
|
continue;
|
|
|
}
|
|
|
p.quhaoid = shengchengquhaoid(xitong); /* 生成新排队号 */
|
|
|
p.zhuzhanghao = xitong->kehuliebiao[kehuxuhao].zhuzhanghao;
|
|
|
strcpy(p.kehuileixing, xitong->kehuliebiao[kehuxuhao].leixing);
|
|
|
if (strcmp(p.kehuileixing, "VIP") == 0) {
|
|
|
strcpy(p.chuangkou, "VIP窗");
|
|
|
} else {
|
|
|
strcpy(p.chuangkou, "普通窗");
|
|
|
}
|
|
|
strcpy(p.zhuangtai, "等待中");
|
|
|
p.pingfen = 0;
|
|
|
qudangqianshijian(p.shijian, sizeof(p.shijian));
|
|
|
xitong->paiduiliebiao[xitong->paiduishu] = p; /* 排队记录入队 */
|
|
|
xitong->paiduishu++;
|
|
|
baocunpaidui(xitong);
|
|
|
printf("取号成功,号码:%d,窗口:%s\n", p.quhaoid, p.chuangkou);
|
|
|
} else if (caozuo == 6) {
|
|
|
printf("输入身份证后6位(演示): ");
|
|
|
kahao = duquzhengshu();
|
|
|
if (kahao == xitong->kehuliebiao[kehuxuhao].shenfenzheng) {
|
|
|
printf("身份核验通过。\n");
|
|
|
} else {
|
|
|
printf("身份核验失败。\n");
|
|
|
}
|
|
|
} else if (caozuo == 0) {
|
|
|
baocunsuoyoushuju(xitong);
|
|
|
return;
|
|
|
} else {
|
|
|
printf("输入有误。\n");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 主菜单 */
|
|
|
void zhucaidan(YinhangXitong *xitong) {
|
|
|
int caozuo;
|
|
|
int zhiyuanxuhao;
|
|
|
int kehuxuhao;
|
|
|
|
|
|
while (1) {
|
|
|
printf("\n======================================================\n");
|
|
|
printf(" 银行智能管理系统\n");
|
|
|
printf("======================================================\n");
|
|
|
printf("1. 管理员登录\n");
|
|
|
printf("2. 职员登录\n");
|
|
|
printf("3. 客户登录\n");
|
|
|
printf("4. 查看测试数据文件名\n");
|
|
|
printf("5. 重新加载文件数据\n");
|
|
|
printf("0. 退出系统\n");
|
|
|
printf("请选择: ");
|
|
|
caozuo = duquzhengshu(); /* 读取当前菜单操作码 */
|
|
|
|
|
|
if (caozuo == 1) {
|
|
|
if (guanliyuanlogin()) {
|
|
|
printf("管理员登录成功。\n");
|
|
|
guanliyuan_caidan(xitong);
|
|
|
} else {
|
|
|
printf("账号或密码错误。\n");
|
|
|
}
|
|
|
} else if (caozuo == 2) {
|
|
|
if (zhiyuanlogin(xitong, &zhiyuanxuhao)) {
|
|
|
printf("职员登录成功。\n");
|
|
|
zhiyuan_caidan(xitong, zhiyuanxuhao);
|
|
|
} else {
|
|
|
printf("职员ID或密码错误。\n");
|
|
|
}
|
|
|
} else if (caozuo == 3) {
|
|
|
if (kehulogin(xitong, &kehuxuhao)) {
|
|
|
printf("客户登录成功。\n");
|
|
|
kehu_caidan(xitong, kehuxuhao);
|
|
|
} else {
|
|
|
printf("客户账号或密码错误。\n");
|
|
|
}
|
|
|
} else if (caozuo == 4) {
|
|
|
zhanshimorenwenjianming();
|
|
|
} else if (caozuo == 5) {
|
|
|
jiazaisuoyoushuju(xitong); /* 从文本重新读取,覆盖内存数据 */
|
|
|
printf("文件数据已重新加载。\n");
|
|
|
} else if (caozuo == 0) {
|
|
|
baocunsuoyoushuju(xitong);
|
|
|
printf("系统已退出,数据已保存。\n");
|
|
|
return;
|
|
|
} else {
|
|
|
printf("输入有误,请重试。\n");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|