在本次主数据重构中,最大的变化就是数据建模和功能建模进行了分离,使得主数据的配置和生成更加灵活,并支持根据不同功能模型生成不同数量和样式的页面。但是主数据部署时是通过freeMaker模板生成数据管理页面,在模板中按钮的数量和类型是写死的,缺少了灵活配置和显示隐藏。

为了使用户在生成主数据时配置更加灵活,提高使用便捷性,对MDM的数据管理页面按钮进行可配置处理,让用户可以手动进行按钮的新增、事件的扩展,满足更多使用场景,也便于后续与ESB结合进行流程的调用、生成。本篇文档主要介绍主数据在不同的配置结果下生成的初始化按钮。

1业务需求

之前的按钮全部是在freeMaker模板中生成,根据功能模型的配置显示不同的按钮,但是这种按钮不能进行按钮扩展,因此根据不同的功能模型在初始化表单时创建出所需按钮,并且用户可以自主的根据额外需求扩展按钮的功能。接下来将介绍按钮的初始化功能需求。

1.1总体需求

1.在初始化表单时根据功能配置的结果生成按钮;

2.按钮包含预置按钮与扩展按钮,不同按钮的详情页显示要不同;

3.列表页包含上移与下移按钮,能够对按钮顺序进行调整;

4.需要在功能配置中修改配置后对生成的按钮进行变更。

1.2详细需求

1.对数据库进行扩展,新增存储按钮的数据表;

2.初始化页面时根据会生成的表单生成不同的按钮;

3.生成的初始化按钮分为虚拟按钮和事实按钮;

4.支持按钮自行扩展,可以根据需要配置事件名称和参数;

5.用户可以自己配置生成的按钮的图标;

6.初始化按钮不可以删除;

7.当修改功能配置的详情页面时,按钮列表页需要对按钮的类型进行变更。

2实现思路

明确需求后需要明确实现思路,实现思路从数据库的扩展、初始化页面时生成的按钮以及页面的样式和创建三个方面介绍。页面包含列表页、详情页和按钮的图标弹出页三个页面。

2.1数据调整

在数据库扩展功能按钮表(mdm_func_oper),存储按钮信息,并通过外键关联表单表(mdm_func_form);需要在确保初始化表单后根据主数据的类型生成对应按钮,因此需要明确不同类型下主数据所需要的按钮。

MDM按钮初始化功能调整心得_MDM

 

在sys_codetype中新增四个类型。

MDM按钮初始化功能调整心得_初始化_02

其中按钮图标(BUTTON_ICON)为按钮所需的所有图标。

MDM按钮初始化功能调整心得_初始化_03

2.2按钮生成

由于不同的功能模板会初始化不同的表单,所以在初始化表单时新增创建按钮的功能,根据生成的页面创建初始化的默认按钮。

按钮的场景需要读取FreeMaker模板,不同的FreeMaker模板预置的按钮也都不相同。

MDM按钮初始化功能调整心得_MDM_04

在模板文件中会有一些参数的变量需要进行判断,但是这种变量不可以不经过处理直接存入到数据库中,因此要在后台根据实际情况进行判断最后在按钮生成时存入判断的变量。

MDM按钮初始化功能调整心得_基础数据平台_05

2.3页面功能

根据需求新增三个页面,分别是列表页、详情页和图标选择的弹出页,下面介绍页面的创建和每个页面的功能。

2.3.1新增页面

1.扩展三套handler和jsp文件,用于管理按钮信息:

按钮列表:MentityFuncOperListHandler.java、MentityFuncOperList.jsp;

按钮配置:MentityFuncOperEditHandler.java、MentityFuncOperEdit.jsp;

图标弹窗:MentityFuncOperImgListHandler.java、MentityFuncOperImgList.jsp。

2.初始化后的所有表单页面中都需要新增一个新的标签“按钮配置”,新增位置如下:

MDM按钮初始化功能调整心得_java_06

2.3.2列表页面

1.配置表单样式如下,与其他list页面类似包含新增复制等初始按钮;

MDM按钮初始化功能调整心得_MDM_07

2.由于排序是用于编排按钮所在的位置,所以排序不可以重复,在新增时自动填入排序;

3.上移、下移是对按钮最后在数据管理中的按钮顺序进行修改;

4.变更是对主数据配置流程、多对多等进行按钮的更新:

2.3.3详情页面

详情页面是按钮列表中的详情页,内容先行样式如下:

MDM按钮初始化功能调整心得_基础数据平台_08

 

预置虚拟按钮配置:

MDM按钮初始化功能调整心得_java_09

 

手动新增的扩展按钮页面。事件名称会根据调用方式自动生成模板,用户可以根据模板自己进行事件的扩展。

MDM按钮初始化功能调整心得_基础数据平台_10

 

图标的弹出页录入所有的图标的数据,页面先行样式如下:

MDM按钮初始化功能调整心得_基础数据平台_11

 

3实现步骤

在“实现思路”中已经明确了初始化表单的方法,已经介绍了数据库的扩展,因此主要对按钮生成页面生成两个部分进行介绍,主要介绍按钮在哪种功能模板中创建出哪种按钮,以及明确按钮和页面的生成方式。

3.1按钮生成

按钮生成时首先要根据freeMaker模板列出在什么情况下生成什么样的按钮,便于对初始化功能和变更功能的完善。

3.1.1按钮清单

根据freeMaker模板对每种主数据的页面按钮进行梳理,最终梳理的按钮清单如下:

MDM按钮初始化功能调整心得_初始化_12

在freeMaker模板中如果有蓝色字体的变量,需要到对应的Handler中找到对应的变量生成方法,在按钮初始化时将变量插入到事件方法中。

MDM按钮初始化功能调整心得_java_13

 

3.1.2生成方式

1.生成按钮根据初始化表单创建的不同页面,初始化表单调用方法如下。然后声明一个list对象formButtonList,在每一个生成页面的调用方法中新增这个变量。由于部分生成的事件方法需要传入参数所以需要在传送funcRow变量。

MDM按钮初始化功能调整心得_初始化_14

2.在所有的页面初始化方法中加入这个变量。

MDM按钮初始化功能调整心得_初始化_15

3.在每一个新增的表单或列表的方法中,获取随机生成的ID,调用新增按钮方法。

MDM按钮初始化功能调整心得_java_16

4.根据freeMaker模板中按钮的显示条件创建对应的按钮信息,存入到formButtonList中。

MDM按钮初始化功能调整心得_MDM_17

5.根据formButtonList创建每个页面对应的按钮。

在这个方法中首先根据funcId对所有页面进行删除,再根据查询历史的批量Id对按钮进行删除,最后将方法中保存的formList和formButtonList中的数据存入到各自对应的表中。 

MDM按钮初始化功能调整心得_java_18

6.按钮生成的判断逻辑根据按钮清单的按钮进行生成判断。

7.按钮生成的后台方法:initButton。

8.在MentityFuncManage中新增批量删除和插入的方法。

9.在MentityFuncManageImpl中新增这两个方法的对应方法。

批量删除:

MDM按钮初始化功能调整心得_初始化_19

创建:

MDM按钮初始化功能调整心得_按钮初始化_20

 

3.2页面生成

页面生成中列表页、详情页及图标的弹出页就不多赘述了,主要是对列表页的上移、下移功能和检查变更功能的介绍。

3.2.1上移下移

1.上移和下移首先要判断这条数据是否为第一条或者最后一条。

2.在上移时获取表单所包含的所有按钮使用for循环进行判断,如果为当前i为0并且当前所要操作的按钮的id与第一个id相同那么返回。

for (int i = 0; i < rsList.size(); i++) {
foperRow = rsList.get(i);
String foperId = foperRow.getString("FOPER_ID");
if(i==0 && foperId.equals(operId)) {
responseText = FAIL;
break;
}

3.下移时判断最后一条的按钮的id是否与所要操作的按钮id相同。

List<DataRow> rsList = getService().findFuncOperRecords(formId);
int size = rsList.size();
String finalFoperId = rsList.get(size-1).getString("FOPER_ID");
if(finalFoperId.equals(operId)) {
responseText = FAIL;
return new AjaxRenderer(responseText);
}

4.下移时直接获取想要交换顺序的按钮的id和当前按钮id调用方法。

void changeFuncOperSort(String operId, String prevOperId);

5.在实现类中交换两个按钮的排序执行更新方法。

@Override
public void changeFuncOperSort(String operId, String changeFoperId) {
String statementId = sqlNameSpace + "." + "getFuncOperRecord";
DataParam operParam = new DataParam("FOPER_ID", operId);
DataRow operRow = this.daoHelper.getRecord(statementId, operParam);
DataParam changeParam = new DataParam("FOPER_ID", changeFoperId);
DataRow changeOperRow = this.daoHelper.getRecord(statementId, changeParam);
int changeOperSort = changeOperRow.getInt("FOPER_SORT");
int operSort = operRow.getInt("FOPER_SORT");
operRow.put("FOPER_SORT", changeOperSort);
changeOperRow.put("FOPER_SORT", operSort);
operParam = operRow.toDataParam();
changeParam = changeOperRow.toDataParam();
String changeStatementId = sqlNameSpace + "." + "updateFuncOperRecord";
this.daoHelper.updateRecord(changeStatementId, operParam);
this.daoHelper.updateRecord(changeStatementId, changeParam);
}

3.2.2检查变更

1.检查变更时,在funcRow中查询变更按钮所需的数据,如流程多对多等是否配置。如果已经配置,将需要删除的按钮编码存储到删除的codeList中。

MDM按钮初始化功能调整心得_基础数据平台_21

 

2.利用List.contains方法检查按钮的list中是否包含所需的按钮,如果包含就调用对应的按钮生成的方法将数据存入到保存的list中。

MDM按钮初始化功能调整心得_MDM_22

3.最后执行新增与删除的按钮方法。

MDM按钮初始化功能调整心得_java_23

4效果展示

1.在表单页面初始化表单后,按钮会自动生成。

MDM按钮初始化功能调整心得_MDM_24

2.点击复制按钮后上下移,数据可以上下移动。

MDM按钮初始化功能调整心得_按钮初始化_25

3.预置的详情按钮,样式如下:

MDM按钮初始化功能调整心得_按钮初始化_26

4.预置的虚拟按钮样式如下:

MDM按钮初始化功能调整心得_基础数据平台_27

5.复制或新增后按钮分类为扩展。

MDM按钮初始化功能调整心得_MDM_28

6.按钮的图标清单,可以对编码和名称进行查询。

MDM按钮初始化功能调整心得_MDM_29

7.回到功能配置的详情页配置流程保存后。

MDM按钮初始化功能调整心得_初始化_30

8.在列表页点击更新后会新增这三个按钮。

MDM按钮初始化功能调整心得_MDM_31

5总结体会

本次按钮初始化功能的调整让我对代码方面有了更深刻的理解,在这次工作过程中我也收获了很多,下面将从开发收获、总结反思、心得体会三个方面进行介绍。

5.1开发收获

在本次开发过程中对于底层代码有了更深的体会,主要是对于实现类和接口之间的关系有了更深的认知。在调用接口时传过去值最好不要单纯传DataParam,在实现类中调用sql方法会让后续接触代码的人更明确这个方法要做什么。已有的sqlMap文件尽量不要扩展,尽量提升自己代码的复用性。

5.2总结反思

本次工作中主要问题是对于Java的基础实现功能的了解不全面,导致自己出了很多笑话,后续要提升自己Java的代码能力。其次是自己经常会想要去写新的方法和sql而不去调用已经封装好的,为此也没少受到同事的抱怨,今后自己要多了解封装方法以及使用方式,多使用封装的方法确实是必要的,通过方法的统一会避免攥写很多的冗余代码,并且只需要修改统一调用的方法就可以实现大范围修改。

5.3心得体会

在今后的工作中,我应该更加努力,要有紧迫感、摆脱拖延症,多了解公司产品的知识,遇到新的知识点要勤于记录和总结,自己对于命名的方式还是有很多的不行,提交代码后很多次同事都修改了我的命名,在后续工作中自己也要多多的注意。

在本次开发中虽然自己也了解到了按钮表单模块的作用,也调用了一些底层的统一方法和命名,但是依旧有很多地方考虑不周,同时也暴露出了自己对于Java的基础知识的不牢固,公司底层代码的不了解。在今后的工作中对于公司底层封装的代码自己不能只是单纯的会使用,要深入的了解封装方法的逻辑,不能做一名只会调用封装方法的程序员。