系统功能结构图
从两张图可以看出:完成整个项目,总共需要完成四个小模块,而每一个模块都有自己的功能。通过两图可以看出,完成该项目大致的思路都是完成各自模块的增、删、改、查。这几个功能在之前练习过程中也常用到,而这个项目难点在于各个模块之间的数据调用。
需求说明
以下主要对开发团队调度管理和开发项目管理做出分享。
开发团队调度管理
该模块的主要难点在于:把最后的主界面和开发人员管理模块相联系起来,这就要注意参数的传递要准确。
团队的创建
我们可以先调用增删改查后,开发人员的数据,得到想要存到团队里的员工ID,添加到创建的数组中。在添加团队成员时,按照添加团队成员的要求,设置判断语句限制添加成员的类别和数量。
多个团队的创建和保存:
在创建团队时,我们可以在第一个团队创建后,在退出这里,把团队的数据保存到一个新建的集合里,然后初始化团队的数据,以便于下一个团队可以像第一个团队那样重新添加团队成员。
代码展示:
TeamService
package com.team.service;
import com.team.domain.Architect;
import com.team.domain.Designer;
import com.team.domain.Employee;
import com.team.domain.Programmer;
/*
团队成员操作
*/
public class TeamService extends Throwable {
//用于自动生成团队成员的memberId
private static int counter = 1;
//团队人数上限
private final int MAX_MEMBER = 5;
//保存当前团队成员
private Programmer[] team = new Programmer[MAX_MEMBER];
//团队实际人数
private int total = 0;
public TeamService() {
}
//返回team中所有程序员构成的数组
public Programmer[] getTeam() {
Programmer[] team = new Programmer[total];
for (int i = 0; i < total; i++) {
team[i] = this.team[i];
}
return team;
}
//初始化当前团队成员数组
public void clearTeam() {
team = new Programmer[MAX_MEMBER];
counter=1;
total=0;
this.team = team;
}
//增加团队成员
public void addMember(Employee e) throws TeamException {
if (total >= MAX_MEMBER){
throw new TeamException("成员已满,无法添加");}
if (!(e instanceof Programmer)) {
throw new TeamException("该成员不是开发人员,无法添加");
}
Programmer p = (Programmer)e;
if (isExist(p)) {
throw new TeamException("该员工已在本团队中");
}
if(!p.getStatus()) {
throw new TeamException("该员工已是某团队成员");
}
int numOfArch = 0, numOfDsgn = 0, numOfPrg = 0;
for (int i = 0; i < total; i++) {
if (team[i] instanceof Architect) {numOfArch++;}
else if (team[i] instanceof Designer){ numOfDsgn++;}
else if (team[i] instanceof Programmer){ numOfPrg++;}
}
if (p instanceof Architect) {
if (numOfArch >= 1)
{throw new TeamException("团队中至多只能有一名架构师");}
} else if (p instanceof Designer) {
if (numOfDsgn >= 2)
{throw new TeamException("团队中至多只能有两名设计师");}
} else if (p instanceof Programmer) {
if (numOfPrg >= 3)
{throw new TeamException("团队中至多只能有三名程序员");}
}
//添加到数组
p.setStatus(false);
p.setMemberId(counter++);
team[total++] = p;
}
private boolean isExist(Programmer p) {
for (int i = 0; i < total; i++) {
if (team[i].getId() == p.getId()) return true;
}
return false;
}
//删除指定memberId的程序员
public void removeMember(int memberId) throws TeamException {
int n = 0;
//找到指定memberId的员工,并删除
for (; n < total; n++) {
if (team[n].getMemberId() == memberId) {
team[n].setStatus(true);
break;
}
}
//如果遍历一遍,都找不到,则报异常
if (n == total)
throw new TeamException("找不到该成员,无法删除");
//后面的元素覆盖前面的元素
for (int i = n + 1; i < total; i++) {
team[i - 1] = team[i];
}
team[--total] = null;
}
}
TeamView
package com.team.service;
import com.team.view.IndexView;
import com.team.view.TSUtility;
import com.team.domain.Employee;
import com.team.domain.Programmer;
import java.util.ArrayList;
public class TeamView {
private NameListService lis =new NameListService();
private TeamService teamSvc = new TeamService();
private ArrayList<Programmer[]> team = new ArrayList<>();
private static IndexView I=new IndexView();
//主菜单
public void enterMainMenu() {
boolean loopFlag = true;
char key = 0;
do {
if (key != '1') {
listAllEmployees();
}
System.out.println("1-团队列表 2-添加团队成员 3-删除团队成员 4-退出 请选择(1-4):");
key = TSUtility.readMenuSelection();
System.out.println();
switch (key) {
case '1':
listTeam();
break;
case '2':
addMember();
break;
case '3':
deleteMember();
break;
case '4':
System.out.print("确认是否退出(Y/N):");
char yn = TSUtility.readConfirmSelection();
if (yn == 'Y') {
if (teamSvc.getTeam().length == 0){
loopFlag = false;
}else {
team.add(teamSvc.getTeam());//获取存入team中所有程序员构成的数组,每调用一次,就在集合team里存入了一个团队
teamSvc.clearTeam();//每次退出都会初始化当前团队的成员数组 teamSvc,以便于下一次加入新的团队
loopFlag = false;
}
}
break;
default:
break;
}
} while (loopFlag);
}//分别调用了增删改查功能
//显示所有的员工成员
public void listAllEmployees(){
System.out.println("~~~~~~~~~~~~~~欢迎来到团队调度软件~~~~~~~~~~~~~~~");
ArrayList<Employee> emps = lis.getAllEmployees();
if (emps.size() == 0){
System.out.println("没有客户记录");
}else {
System.out.println("ID\t姓名\t\t工资\t\t职位\t\t状态\t\t奖金\t\t股票\t\t领用设备");
}
for (int i = 0; i < emps.size(); i++) {
System.out.println(" "+emps.get(i));
}
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}
//显示开发团队成员列表
public void listTeam(){
System.out.println("~~~~~~~~~~~~~~~~团队成员列表~~~~~~~~~~~~~~~~");
Programmer[] team=teamSvc.getTeam();//获取team中所有程序员构成的数组
if (team.length == 0){
System.out.println("开发团队目前没有成员!");
}else {
System.out.println("TID/ID\t姓名\t\t工资\t\t职位\t\t奖金\t\t股票");
}
for (int i = 0; i < team.length; i++) {//打印输出
System.out.println(" "+team[i].getDetailsForTeam());
}
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}
// 添加成员到团队
private void addMember() {
System.out.println("---------------------添加成员---------------------");
System.out.print("请输入要添加的员工ID:");
int id = TSUtility.readInt();
try {
Employee e = lis.getEmployee(id);
teamSvc.addMember(e);//添加成员到团队
System.out.println("添加成功");
} catch (TeamException e) {
System.out.println("添加失败,原因:" + e.getMessage());
}
// 按回车键继续...
TSUtility.readReturn();
}
// 从团队中删除指定id的成员
private void deleteMember() {
System.out.println("---------------------删除成员---------------------");
System.out.print("请输入要删除员工的TID:");
int id = TSUtility.readInt();
System.out.print("确认是否删除(Y/N):");
char yn = TSUtility.readConfirmSelection();
if (yn == 'N')
return;
try {
teamSvc.removeMember(id);//改变员工的状态,表示将其移除团队
System.out.println("删除成功");
} catch (TeamException e) {
System.out.println("删除失败,原因:" + e.getMessage());
}
// 按回车键继续...
TSUtility.readReturn();
}
// 加入并得到更多的团队
public ArrayList<Programmer[]> getManyTeam(NameListService nameListSer) {
boolean flag = true;
char key = 0;
lis=nameListSer;//将传入的对象,赋值给lis ,使得lis可以用到参数对象里的 数据
do {
System.out.println("※※※※※※※※※※※");
System.out.println("※ 团队调度界面 ※");
System.out.println("※※※※※※※※※※※");
System.out.print("1-添加团队 2-查看团队 3-删除团队 4-退出 请选择(1-4):");
key = TSUtility.readMenuSelection();
System.out.println();
switch (key) {
case '1':
enterMainMenu();
break;
case '2':
System.out.println("~~~~~~~~~~~~~~~~~~团队列表~~~~~~~~~~~~~~~~~~~~~~");
for (Programmer[] team : team) {
for (int i = 0; i < team.length; i++) {
System.out.println(team[i]);
}
/*for (int i = 0; i < team.length; i++) {
System.out.println(team[i]);
}*/
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}
break;
case '3':
System.out.println("请输入想要删除第几个团队");
int num = TSUtility.readInt();
if (num<=team.size())
{
System.out.print("确认是否删除(Y/N):");
char de = TSUtility.readConfirmSelection();
if (de == 'Y') {
team.remove(num-1);
}else
{
System.out.println("请确认!");
}
}else {
System.out.println("没有该团队,请正常输入!"+"目前团队只有"+team.size()+"个");
}
break;
case '4':
System.out.print("确认是否退出(Y/N):");
char yn = TSUtility.readConfirmSelection();
if (yn == 'Y') {
flag = false;
}
break;
default:
break;
}
} while (flag);
return team;
}//调用了主菜单的功能
}
总结
数据传递应该层层传递,不要创建太多实体类,这样数据混乱,让后面的调用产生困难。