第一个任务遇到的一些问题


​ 在捣鼓了几天的SVN检出项目之后,终于成功把代码从远程代码库下载下来并成功把系统运行起来了。但是由于系统过于庞大,跟了我几年的电脑开始有点不堪重负,CPU跟内存占用都达到了80%,风扇也转的很大声,赶紧叫来了标哥,在tomcat的配置文件那里加了一句:

  -Xms2048m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=512m

​ 问题终于迎刃而解。

​ 于是也就迎来了在公司的第一个任务:

熊奉标 10:56:41局内业务批量受理校验功能,如果导入的字段值有空格,则系统校验不通过,提示机房或者设施不存在。因此,要去系统优化功能,能自动去除字段值前后的空格后再进行校验。案例见附件

​ 这个任务的需求也就是在局内业务批量受理校验功能中,用户从系统导出excel模板,对着模板填充对应的信息。但是由于用户有时候会误操作,或者输入的时候会填充多一些空格在文字的前后,此时系统校验功能就会出错,自动读取空格为某一列,然后导致错位,提示机房或者设施不存在。所以需要在系统原有的基础上进行优化,能自动去除字段值前后的空格后再进行校验。

​ 由于我的excel是2016版本,如果单元格没有设置为文本格式的话,是没有办法直接在文字前面或者后面直接添加空格,因为excel会自动去除空格,2010版本则没有这个问题。下面则列出我的部分测试数据(高亮部分为特殊测试数据,在数字的前后分别加入空格):

(必填) 无需填 无需填 无需填 (二选一必填) 无需填 无需填 (二选一必填)
接入网类型 光纤类型 纤芯数量 A端机房区域 A端机房 A端网元名称 A端端口位置 A端设备种类 B端机房区域 B端机房 B端网元名称 B端端口位置
FTTH,FTTO,FTTB+DSL,FTTB+LAN OLT,1D-OBD,2D-OBD,ONU
超出字典值范围时提示提示“无此光路类型” 默认值:单模 默认值:单纤 由光交设施或机房生成 1、已填写但不存在,提示:A端机房名称不存在; 2、未填写:由A端网元名称生成 1、已填写但不存在,提示:A端网元名称不存在; 当不存在,提示:A端端子不存在;当无空闲,提示:A端端子非空闲。 当有填写时校验字典值范围。 当无填写时,由A端网元名称生成 由光交设施或机房生成 1、已填写但不存在,提示:B端机房名称不存在; 2、未填写:由B端网元名称生成 1、已填写但不存在,提示:B端网元名称不存在; 当不存在,提示:B端端子不存在;当无空闲,提示:B端端子非空闲。
FTTH 11 11 1 2 2 2

​ 在看了好久的源代码之后,终于开始着手写代码了。首先找到了


第一个任务遇到的一些问题
在该源文件中添加了如下代码:

  
  public static String getStringWithoutSpace(String str){
      String str1 = str.replaceAll(" ", "");
      return str1;
  }

ctrl + S保存,再找到如下文件:

第一个任务遇到的一些问题

在源代码中:

  //由于所有excel表格数据都是获取到mapmo对象中
  for (int j = 0; j < loopCount; j++) {
              List<Map<String, String>> list = getDatasByPage(fileparse, j, 0);
              for (int k = 0; k < list.size(); k++) {
                  Map<String, String> mapmo = list.get(k);
                
                  
  //所以我就在想只要在每次mapmo对象获取key对应的value值时,对获得的String字符串进行去空格处理,如下所示:                
  String fiberMainState = mapmo.get("CUS_NOTNULL_FIBERMAINSTATE");
  -> 
  String fiberMainState = InventoryUtil.getStringWithoutSpace(mapmo.get("CUS_NOTNULL_FIBERMAINSTATE"));
  
  //对OrderVerifyImportProcessor.java文件中所有相应部位都加上InventoryUtil.getStringWithoutSpace()处理。对读取的String进行去空格处理。
                

Ctrl + S保存,右键tomcat->debug运行,导入测试文件进行测试,然后弹出如下空指针异常:

第一个任务遇到的一些问题

这一下子就有点懵逼了,于是开始苦逼的debug断点调试,F5,F6旋转跳跃不停歇。

终于在一处地方看到了端倪:

  
  String fiberMainState = InventoryUtil.getStringWithoutSpace(mapmo.get("CUS_NOTNULL_FIBERMAINSTATE"));
  //当mapmo获取对应的value时,如果该value值本身为null,而上述的去空格代码没有进行判空处理,就会出现空指针异常。
  //于是将代码改成如下:
  
  public static String getStringWithoutSpace(String str)
  {
      if(str != null)
      {
          String str1 = str.trim(); 
          return str1;
      }
      return str;
  }

此时再次运行系统就没有再出现空指针异常。

然后成功导入用户的检验文件,输出校验结果文件:

校验成功码:
接入网光路(深圳)-订购
接入网类型 光纤类型 纤芯数量 A端机房区域 A端机房 A端网元名称 A端端口位置 A端设备种类 B端机房区域 B端机房
FTTH 海珠 11 11 1 黄埔 2

RESULT文件并没有将空格去除,但是在读取文件的时候空格明明已经去除了,我就在想可能是因为在读取excel文件时去除空格,只是存在于内存中,而在生成RESULT文件时没有将空格去除,所以还是有空格。

于是我又找到了生成RESULT文件的方法,对其进行修改:

  
  private void createExcelFileManySheet(OutputStream out, String[] dataTitles,
              List<Map<String, String>> dataList,HSSFRichTextString[] cellComment,String metaClassName,String verifyCode) {
          WritableWorkbook workbook;
          WritableCellFeatures wcfeatures = null;
          try {
              workbook = Workbook.createWorkbook(out);
              WritableSheet sheet = workbook.createSheet("sheet1",0);
              NetworkTemplateUtil.initialSheetSetting(sheet);
              verifyCode = "校验成功码:"+(verifyCode==null?"":verifyCode);
              String productName = NetworkTemplateUtil.templateNameMaps.get(metaClassName);
              sheet.addCell(new Label(0, 0, verifyCode));
              sheet.addCell(new Label(0, 1, productName));
              Label label;
              for (int j = 0; j < dataTitles.length; j++){
                  label = new Label(j, 2, dataTitles[j]);
                  wcfeatures = new WritableCellFeatures(); 
                  wcfeatures.setComment(cellComment[j].toString()); 
                  label.setCellFeatures(wcfeatures); 
                  sheet.addCell(label);
              }
              for (int row=0; row<dataList.size(); row++) {
                  Map<String , String > maps = dataList.get(row);
                  for (int n = 0; n < dataTitles.length ; n++) {
                      Cell cells = sheet.getCell(n, 2);
                      String str = cells.getCellFeatures().getComment();
                      label = new Label(n, row + 3, InventoryUtil.getStringWithoutSpace(maps.get(str));
                                        //在此处加入去空格处理,所以写入RESULT文件时就会没有空格
                      sheet.addCell(label);
                  }
              }
              workbook.write();
              workbook.close();
          } catch (SocketException s) {
              s.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          } catch (WriteException e) {
              e.printStackTrace();
          } catch (Exception ex) {
              ex.printStackTrace();
          }
      }

事情到这个阶段就告一段落,成功运行系统,导出正确的RESULT文件,看到想要的结果,超级开心地叫来了标哥,在看了代码以后标哥给了个建议:

这样改的话,可能需要改动的地方太多了,每一处有用到mapmo获取的地方都需要加入去空格处理,工程量太大,看看能不能在一开始获取excel表数据的源头那里就直接对数据进行处理,这样以后就不用每次都处理。

然后我就找到了一开始读取excel表的方法:

  
      public List<Map<String, String>> parse(int begin, int end, int sheetIndex) {
          XSSFSheet sheet = sheets.get(sheetIndex);
          if(sheet == null){
              return null;
          }
          List<String> keyList = sheetsKeyList.get(sheetIndex);
          List<Map<String, String>> excelList = new ArrayList<Map<String, String>>();
          int startCol = 0;
          if(commentRow==3) startCol=1;
          for (int row = begin; row <= end; row++) {
              Map<String, String> map = new HashMap<String, String>();
              if (sheet.getRow(row) != null) {
  
                  for (int i = 0; i < keyList.size(); i++) {
                      String key = keyList.get(i);
                      String value = getCellValue(sheet, row, i+startCol);
                        //在这里加入去空格处理:
                        String value = InventoryUtil.getStringWithoutSpace(getCellValue(sheet, row, i+startCol);
                      map.put(key, value);
                  }
                  if (map.size() > 0) {
                      excelList.add(map);
                  }
              } else {
                  map.put(null, null);
                  excelList.add(map);
              }
          }
          return excelList;
      }

去除其他地方的去空格处理,运行系统,得到了想要的效果。把标哥叫来了,标哥看了下这个parse方法,发现有两三处地方都调用了这个方法,改动了这个方法后这样子就有可能影响了其他地方的功能。所以再次给出了另外一个建议:

既然所有的数据都是先获取到mapmo对象中,那可不可以考虑在获取mapmp后直接对其进行处理,然后再开始对它进行调用。

//由于所有excel表格数据都是获取到mapmo对象中for (int j = 0; j < loopCount; j++) {

  
          List<Map<String, String>> list = getDatasByPage(fileparse, j, 0);
          for (int k = 0; k < list.size(); k++) {
              Map<String, String> mapmo = list.get(k);
            

​ 考虑了一下以后,在OrderVerifyImportProcessor.java文件中编写一个新的方法,对mapmo对象进行去空格处理:

  
      private void getMapmoWithoutSpace(Map<String, String> mapmo) {
          if (mapmo == null) return;
          Set<String> keys = mapmo.keySet();
          for (String key : keys) {
                  String value = mapmo.get(key);
                  value = InventoryUtil.getStringWithoutSpace(value);
                  mapmo.put(key, value);
              }
      }

​ 运行系统,终于大功告成,第一个任务顺利完成,终于也能在公司提交自己写的代码了,也是很有成就感。

接下来就是将自己的代码同步到远程SVN仓库:

点击Team Synchronizing视图:

第一个任务遇到的一些问题

点击Synchronize:

第一个任务遇到的一些问题

选择SVN:

第一个任务遇到的一些问题

可以直接选取工作空间,也可以选择工作集,然后可以创建自己的工作集,这样就不用每次都再全部同步:

第一个任务遇到的一些问题

成功同步后,点击以下按钮:

第一个任务遇到的一些问题

查看svn代码库与本地代码库不同的文件,然后全选那些不同的文件,右键->更新,先对本地代码进行更新。

然后点击如下按钮:

第一个任务遇到的一些问题

经过与SVN代码库的代码对比,找出做出的修改,尽量做到只提交必要的修改:

第一个任务遇到的一些问题

然后右键对应的文件->提交:

第一个任务遇到的一些问题

第一个任务遇到的一些问题

此处需要用到PMS帐号,由于我还没有申请PMS帐号,所以就先写到这里。


终于等到了PMS帐号,可以为公司提交代码啦,刚注册了PMS帐号,就发现自己头上有两个bug任务:

第一个任务遇到的一些问题

接下来让我们来提交第一个bug的解决方案:

第一个任务遇到的一些问题

选择需要提交的代码,此处不能选择全部提交,只需要提交改动的java文件即可:

第一个任务遇到的一些问题

添加上对应的PMS,点击OK即可。

接下来就是欣赏自己的成果了:

第一个任务遇到的一些问题

第一个任务到此就顺利完成啦~