前言
工作已经接近半年了,这半年里从一个懵懂不知的愣头青终于要自己面对客户根据客户需求编写程序了,这个过程是比较艰辛的,从前读书的时候总是把开发看的有趣又简单,觉得自己一个人做一个项目又是怎样的牛x,真正到做的时候才发现自己还是太嫩了些。首先客户的需求是在不断变化的,并且怎样理解用户需求变成了意料之外的问题,在不断克服问题之后开发的程序终于到了测试版本。
Avaya Voice Portal简介前言
首先要介绍一下avaya voice portal是个什么东西。avaya是个做企业通讯的牌子,VoicePortal中文译为语音门户,这个东西一般在呼叫中心的项目中会用,说白了就是我们平时拨打客服中心时操作的语音菜单。开发这个东西其实很简单,avaya提供了一个基于eclipse的开发工具Dialog Designer,大部分的开发是图形化的,只要将所需节点拖下来并连接在一起就可以了,但有些地方还是需要进行代码的编写。
客户需求
这一次客户的需求是编写一个流程,根据上下班时间将用户的来电分别转接到坐席或者手机上。这个流程里客户希望节假日信息和平时上班信息全部放在数据库里而不是封装在程序里进行判断。这让初次开发的我比较为难的了,幸好另一个合作厂商的同事经验比较丰富,将数据库结构之类东西都建好了,这样我就能根据数据库结构来写程序而不是自己想着该怎么写。这一点我一开始没有意识到,直到我开始写程序的时候才发现要不是数据库结构都已经写好了,这次开发肯定要走更多的弯路。
开发记录
因为之前的同事做过一个判断上下班时间的流程,我本来想对应着他的流程进行开发,判断时间的流程。但是客户的需求是希望能将判断的条件都放在数据库里,本来想着应该比较简单的事情,而且我自己心里有想法,没想到另外管数据库的厂商将数据库的结构发给我了,这一下变成了只能按照他们的结构做了。
数据库建了两个表,一个用来记录调休时间,一个用来记录平时的工作时间。
工作时间表
节假日调休配置表
整个程序的逻辑为:电话进线之后,Voice Portal会读取数据库进行判断今天是否是在节假日调休表里,如果是的话调休的是休息天还是上班,如果是休息的话程序将直接转向一段已经录好的语音进行播放后短线,如果是工作日的话在判断现在的时间是否在工作时间内。如果今天不在节假日调休配置表里,再根据今天是周几读取数据库条目进行工作时间的判断。
一开始我在Voice Portal里面获取当前时间,经过一系列的格式变换之后再写在数据库查询语句里面跟设定的时间去做比对。
int Day;
String strDate = "";
String strMark = "";
String value = "";
String value1= "";
String value2 = "";
String value3 = "";
String value4 = "";
String value5 = "";
List<List<String>> lists = new ArrayList<List<String>>();
Map map = new HashMap();
Connection objConn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Date strDate1 = new Date();
Date strHour = new Date();
SimpleDateFormat dateformat1=new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat dateformat = new SimpleDateFormat("HH:mm");
String date = dateformat1.format(strDate1);
String nowdate = dateformat.format(strHour);
Date bdate = null;
Date bBegin1 = null;
Date bEnd1 = null;
Date bBegin2 = null;
Date bEnd2 = null;
Date bNow = null;
try {
bdate = dateformat1.parse(date);
bNow = dateformat.parse(nowdate);
} catch (ParseException e) {
e.printStackTrace();
}
Calendar cal = Calendar.getInstance();
cal.setTime(bdate);
Day = cal.get(Calendar.DAY_OF_WEEK);
strDate = String.valueOf(Day);
try{
objConn = DButil.getConnection();
if(objConn != null){
String sql = "SELECT * FROM TBL_WORKTIME2 WHERE STRWEEKDAY = ?";
ps = objConn.prepareStatement(sql);
ps.setString(1, strDate);
rs = ps.executeQuery();
while(rs.next()){
List<String> oneList = new ArrayList<String>();
oneList.add(rs.getString(3));
oneList.add(rs.getString(4));
oneList.add(rs.getString(5));
lists.add(oneList);
}
objConn.commit();
mySession.getVariableField(IProjectVariables.TEST).setValue(value5);
for(int j = 0;j<lists.size();j++){
if(j<1){
List<String> list = lists.get(0);
value = list.get(0);
value1 = list.get(1);
value2 = list.get(2);
}else{
List<String> list1 = lists.get(1);
value3 = list1.get(0);
value4 = list1.get(1);
value5 = list1.get(2);
}
}
try{
bBegin1 = dateformat.parse(value);
bEnd1 = dateformat.parse(value1);
bBegin2 = dateformat.parse(value3);
bEnd2 = dateformat.parse(value4);
}catch (ParseException e) {
e.printStackTrace();
}
int result = bBegin1.compareTo(bNow);
int result2 = bEnd1.compareTo(bNow);
int result3 = bBegin2.compareTo(bNow);
int result4 = bEnd2.compareTo(bNow);
if(result<0 && result2>0 && "Wokringtime".equals(value2)){
mySession.getVariableField(IProjectVariables.V_RETRY_2).setValue("1");
}else if(result3<0 && result4>0 && "Homeworking".equals(value5)){
mySession.getVariableField(IProjectVariables.V_RETRY_2).setValue("2");
}else if(result<0 && result2>0 && "Resttime".equals(value2)){
mySession.getVariableField(IProjectVariables.V_RETRY_2).setValue("2");
}else{
mySession.getVariableField(IProjectVariables.V_RETRY_2).setValue("0");
}
}
辛辛苦苦写了一堆代码,从数据库里取出当日的所有时间信息,再辛辛苦苦的去做比对,不知道把轮询出来的数据库资料放哪还特地的上网去查List怎么用,最后用了笨办法把List里的数据终于都取出来了,做测试的时候又傻眼了,根本不生效。当时还不知道问题在哪里,以为是开发工具有问题,于是把Avaya骂了一通只能自己再找问题。
首先要确定的是数据库连接有没有问题,当我写了一个测试项目的时候发现数据库能连接上但是取出来的数据有问题时才发现原来装载我程序的那台服务器的时间和数据库服务器的时间相差了整整有8个小时,这样的情况下怎么还可能得出正确的结果。
发现问题之后整个思路就都变化了,我发现不能在Voice Portal对时间进行判断,而应该把这些判断都放在数据库里执行,Voice Portal只应该取到一个是与否的值而已。
于是改写了SQL语句
SELECT STRREMARK FROM TBL_WORKTIME2 WHERE TO_CHAR(SYSDATE, 'hh24mi') BETWEEN STRBEGINTIME AND STRENDTIME AND STRWEEKDAY =TO_CHAR(SYSDATE,'d')
这样一来先前写的一大堆废物的程序就不再需要了,只要确认今天是周几,然后根据周几来确认该找什么信息。而写判断节假日调休就更加简单了
SELECT INTWORKFLAG FROM TBL_WORKTIMEJUDGE2 WHERE STRBEGINTIME < sysdate AND STRENDTIME > sysdate
为了不出现判断周几的乌龙事件,在Linux里改了下系统的时间
date --set "月/日/年 时:分:秒"
小结
第一次写程序,尤其是作为一个菜鸟,本来初生牛犊不怕虎还真有点那个意思,但真的到要做要写的时候就真的发现自己懂的太少经验太少,考虑不周全,知识欠缺,架构不了解等等问题不一而足。还好有谷歌度娘,第一次开发收货多多,其实遇到了比写出来更多的问题,但因为之前没有记录好很多都忘了,这也算这次的一个教训吧。