一个Jalor5 Service方法的重构过程
如下是一个重构前的Jalor5 Service方法:
-
Java 代码
001 | public IncHeadVO saveInc(IncHeadVO incHeadVO) throws ApplicationException { |
002 | logger.info("created incentive data start "); |
003 | /** |
004 | * 1. 获取head的seqID ---在Insert前自动生成并赋值到headVO中 |
005 | * 2. 获取head的编码 -- 通过incHeadDAO.f indIncHeadAppNO()获取 |
006 | * 3. 插 入head数据 |
007 | * 4. 插 入多选的数据(供应商、产品型号、包装指令) |
008 | * 5. 循环行数据 |
009 | * 5.1 。 获取行数据的seqID ---在Insert前自动生成并赋值到lineVO中 |
010 | * 5.2. 插 入行数据 |
011 | * 5.3. 循环插 入明细数据 |
012 | */ |
013 | functionCount = functionCount + 1; |
014 | String userId = incCommonService.getCurrentUserId(); |
015 | //记录首次提交时间 |
016 | DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
017 | String time=format.format(new Date()); |
018 | if(StringUtils.isNotBlank(incHeadVO.getSubmitFlag()) && StringUtils.isBlank(incHeadVO.getSubmitTime())){ |
019 | incHeadVO.setSubmitTime(time); |
020 | } |
021 | boolean isUpdate = false; |
022 | if (null != incHeadVO && StringUtils.isNotBlank(incHeadVO.getRowId())) { |
023 | if(StringUtils.isBlank(incHeadVO.getIsImportFlag())){ |
024 | // 如果id存在更新操作 |
025 | incHeadVO.setCreatedBy(userId); |
026 | incHeadVO.setLastUpdatedBy(userId); |
027 | //R1611-0061 start |
028 |
|
029 | List<IncLineVO> result = iIncPrcLineDAO.f I n dIncLinesByHeadId(incHeadVO.getRowId()); |
030 | for (IncLineVO incLineVO : result) { |
031 | String status = null; |
032 | //更新状态为'Y'并且状态为草稿或驳回的情况才更新行数据 |
033 | if("Draft".equals(incHeadVO.getStatus()) ||"1".equals(incHeadVO.getStatus())){ |
034 | status = "1"; |
035 | }else if("Incentive Returned".equals(incHeadVO.getStatus()) ||"4".equals(incHeadVO.getStatus())){ |
036 | status = "4"; |
037 | } |
038 | if("Y".equals(incLineVO.getIsUpdate()) && ("1".equals(status) || "4".equals(status) )){ |
039 | isUpdate = true; |
040 | break; |
041 | } |
042 | } |
043 | if(isUpdate){ |
044 | incPrcHeadDAO.updateIncHeadAndLine(incHeadVO); |
045 | }else{ |
046 | incPrcHeadDAO.updateIncHead(incHeadVO); |
047 | } |
048 | //R1611-0061 end |
049 | } |
050 | } else { |
051 | incHeadVO.setCreatedBy(userId); |
052 | incHeadVO.setStatus("1"); |
053 | incHeadVO.setAppNo(incPrcHeadDAO.f I n dIncHeadAppNO()); |
054 | // 如果id不存在创建操作 |
055 | incPrcHeadDAO.insertIncAsDraft(incHeadVO); |
056 | } |
057 |
|
058 | if (null != incHeadVO && StringUtils.isNotBlank(incHeadVO.getRowId())) { |
059 | List<IncTypeVO> typeList = incHeadVO.getTypeList(); |
060 | if (null != typeList && !typeList.isEmpty() && StringUtils.isBlank(incHeadVO.getIsImportFlag())) { |
061 | incPrcHeadDAO.insertHeadTypeAsDraft(typeList, incHeadVO.getRowId()); |
062 | } |
063 |
|
064 | //需要保存行数据并且行数据不为空的场合 |
065 | if((null == incHeadVO.getIsSaveHead() ||"".equals(incHeadVO.getIsSaveHead())) && (null != incHeadVO.getLines() && !incHeadVO.getLines().isEmpty())){ |
066 | if(isUpdate){ |
067 | //更新Line |
068 | for (IncLineVO incLineVO : incHeadVO.getLines()) { |
069 | if(StringUtils.isNotBlank(incLineVO.getRowId())){ |
070 | this.updateIncLine(incHeadVO,incLineVO); |
071 | }else{ |
072 | //新增的行 |
073 | List<IncLineVO> incLineVOList = newArrayList<IncLineVO>(); |
074 | incLineVOList.add(incLineVO); |
075 | insertIncLine(incHeadVO, incLineVOList); |
076 | } |
077 | } |
078 | }else{ |
079 | insertIncLine(incHeadVO, incHeadVO.getLines()); |
080 | } |
081 | } |
082 | //R1611-0061 end |
083 | } |
084 | if(StringUtils.isBlank(incHeadVO.getIsImportFlag())){ |
085 | BatchVO<TeamVO> paramBatchVO = new BatchVO<TeamVO>(); |
086 | paramBatchVO.setItems2Update(incHeadVO.getIncTeamList()); |
087 | incPrcHeadService.batchOperation(paramBatchVO, "PRM_INC", incHeadVO.getRowId()); |
088 | } |
089 | logger.info("created incentive data end "); |
090 | //重新查询排序 |
091 | IncHeadVO headVO = this.fi ndHeadById(incHeadVO.getRowId()); |
092 | if(headVO!=null){ |
093 | incHeadVO.setLines(headVO.getLines()); |
094 | } |
095 |
|
096 | // 待办的场合 WAT START |
097 | if(incHeadVO.getWatIds() != null && !"".equals(incHeadVO.getWatIds().trim())) { |
098 | prmIncIdealPriceTService.updateStatusToComplete(incHeadVO.getWatIds().trim()); |
099 | } |
100 | // 待办的场合 WAT END |
101 |
|
102 | return incHeadVO; |
103 | } |
这个方法的重构,从以下几个方面入手:
1、入参一开始就要进行空值判断,为空的逻辑第一步处理(要么抛异常,要么特殊处理后返回),不要后面一堆的重复判断;
2、对于VO特定字段的判断,下沉到VO,即在VO里有一个对应的实例方法,专门用于判断字段是否合法,例如下面的代码:
-
Java 代码
1 | if (null != incHeadVO && StringUtils.isNotBlank(incHeadVO.getRowId())) |
这么长的一个判断代码,完全可以在VO中加一个方法 isValidRowId,在业务代码中,上面的判断就可以这么写:
-
Java 代码
1 | if(incHeadVO.isValidRowId()) |
这样,代码既简洁又具有鲜明的业务意义,可读性很高,代码也不容易出错;
3、去掉代码中的字面值(魔术数值),要么提升为类常量,要么提升为Enum类型,如下代码:
-
Java 代码
1 | "4".equals(incHeadVO.getStatus()) |
4是一个status值,业务上代表什么呢?一点都不直观,可以声明一组常量,说明每个数值代表的具体业务意义;
4、集合类用工具类进行空或者空值判断,如:
-
Java 代码
1 | CollectionUtil.isNullOrEmpty(typeList),StringUtils.isNullOrEmpty(str) |
少一个判断,就少一个复杂度,代码也更简洁;
5、复杂代码按处理逻辑抽取成private方法;
6、深层次的if、循环嵌套通过相反条件,把复杂代码从if中提出来,独立成块。
对应VO新增如下方法:
-
Java 代码
01 | public boolean isValidSubmitFlag(){ |
02 | return StringUtils.isNotBlank(getSubmitFlag()); |
03 | } |
04 |
|
05 | public boolean isValidSubmitTime(){ |
06 | return StringUtils.isBlank(getSubmitTime()); |
07 | } |
08 | |
09 | public boolean isValidRowId(){ |
10 | return StringUtils.isNotBlank(getRowId()); |
11 | } |
12 | |
13 | public boolean isValidIsImportFlag() { |
14 | return StringUtils.isBlank(getIsImportFlag()); |
15 | } |
16 | |
17 | public boolean isEmptyIsSaveHead() { |
18 | return (null == getIsSaveHead() || StringUtil.EMPTY.equals(getIsSaveHead())); |
19 | } |
20 | |
21 | public boolean isValidWatIds() { |
22 | return getWatIds() != null && !"".equals(getWatIds().trim()); |
23 | } |
24 |
|
25 | public boolean isEmptyLines() { |
26 | return CollectionUtil.isNullOrEmpty(getLines()); |
27 | } |
重构后的代码如下:
-
Java 代码
001 |
|
002 | /** |
003 | 草稿 |
004 | */ |
005 | private static final String DRAFT = "Draft"; |
006 | /** |
007 | 驳回 |
008 | */ |
009 | private static final String REJECTED = "1"; |
010 | /** |
011 | 已更新 |
012 | */ |
013 | private static final String IS_UPDATED = "Y"; |
014 | /** |
015 | 激励被驳回 |
016 | */ |
017 | private static final String INCENTIVE_RETURNED = "Incentive Returned"; |
018 | /** |
019 | 审批通过 |
020 | */ |
021 | private static final String APPROVED = "4"; |
022 |
|
023 | /** |
024 | * 1. 获取head的seqID ---在Insert前自动生成并赋值到headVO中 |
025 | * 2. 获取head的编码 -- 通过incHeadDAO.fi ndIncHeadAppNO()获取 |
026 | * 3. 插 入head数据 |
027 | * 4. 插 入多选的数据(供应商、产品型号、包装指令) |
028 | * 5. 循环行数据 |
029 | * 5.1 。 获取行数据的seqID ---在Insert前自动生成并赋值到lineVO中 |
030 | * 5.2. 插 入行数据 |
031 | * 5.3. 循环插 入明细数据 |
032 | */ |
033 | public IncHeadVO saveInc(IncHeadVO incHeadVO) throws ApplicationException { |
034 | if(incHeadVO == null){ |
035 | return null; |
036 | } |
037 |
|
038 | logger.info("created incentive data start "); |
039 |
|
040 | functionCount = functionCount + 1; |
041 | String userId = incCommonService.getCurrentUserId(); |
042 | //记录首次提交时间 |
043 | DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
044 | String time=format.format(new Date()); |
045 | if(incHeadVO.isValidSubmitFlag() && incHeadVO.isValidSubmitTime()){ |
046 | incHeadVO.setSubmitTime(time); |
047 | } |
048 | boolean isUpdate = false; |
049 | if (incHeadVO.isValidRowId()) { |
050 | isUpdate = updateIncHead(incHeadVO, userId); |
051 | } else { |
052 | incHeadVO.setCreatedBy(userId); |
053 | incHeadVO.setStatus("1"); |
054 | incHeadVO.setAppNo(incPrcHeadDAO.f I nd IncHeadAppNO()); |
055 | // 如果id不存在创建操作 |
056 | incPrcHeadDAO.insertIncAsDraft(incHeadVO); |
057 | } |
058 | |
059 | if (incHeadVO.isValidRowId()) { |
060 | List<IncTypeVO> typeList = incHeadVO.getTypeList(); |
061 | if (!CollectionUtil.isNullOrEmpty(typeList) && incHeadVO.isValidIsImportFlag()) { |
062 | incPrcHeadDAO.insertHeadTypeAsDraft(typeList, incHeadVO.getRowId()); |
063 | } |
064 | //需要保存行数据并且行数据不为空的场合 |
065 | saveOrUpdateIncLine(incHeadVO, isUpdate); |
066 | //R1611-0061 end |
067 | } |
068 | if(incHeadVO.isValidIsImportFlag()){ |
069 | BatchVO<TeamVO> paramBatchVO = new BatchVO<TeamVO>(); |
070 | paramBatchVO.setItems2Update(incHeadVO.getIncTeamList()); |
071 | incPrcHeadService.batchOperation(paramBatchVO, "PRM_INC", incHeadVO.getRowId()); |
072 | } |
073 | logger.info("created incentive data end "); |
074 | |
075 | //重新查询排序 |
076 | IncHeadVO headVO = this.fi ndHeadById(incHeadVO.getRowId()); |
077 | if(headVO != null){ |
078 | incHeadVO.setLines(headVO.getLines()); |
079 | } |
080 | // 待办的场合 WAT START |
081 | if(incHeadVO.isValidWatIds()) { |
082 | prmIncIdealPriceTService.updateStatusToComplete(incHeadVO.getWatIds().trim()); |
083 | } |
084 | // 待办的场合 WAT END |
085 |
|
086 | return incHeadVO; |
087 | } |
088 |
|
089 | /** |
090 | 保存或者更新行 |
091 | */ |
092 | private void saveOrUpdateIncLine(IncHeadVO incHeadVO, boolean isUpdate) throwsApplicationException { |
093 | if(!incHeadVO.isEmptyIsSaveHead() || incHeadVO.isEmptyLines()){ |
094 | return; |
095 | } |
096 |
|
097 | if(isUpdate){ |
098 | //更新Line |
099 | updateIncLine(incHeadVO); |
100 | }else{ |
101 | insertIncLine(incHeadVO, incHeadVO.getLines()); |
102 | } |
103 | } |
104 | |
105 | /** |
106 | 更新头 |
107 | */ |
108 | private boolean updateIncHead(IncHeadVO incHeadVO, String userId) { |
109 | if(!incHeadVO.isValidIsImportFlag()){ |
110 | return false; |
111 | } |
112 | |
113 | boolean isUpdate = false; |
114 | // 如果id存在更新操作 |
115 | incHeadVO.setCreatedBy(userId); |
116 | incHeadVO.setLastUpdatedBy(userId); |
117 | List<IncLineVO> result = iIncPrcLineDAO.fi ndIncLinesByHeadId(incHeadVO.getRowId()); |
118 | for (IncLineVO incLineVO : result) { |
119 | String status = null; |
120 | //更新状态为'Y'并且状态为草稿或驳回的情况才更新行数据 |
121 | if(DRAFT.equals(incHeadVO.getStatus()) || REJECTED.equals(incHeadVO.getStatus())){ |
122 | status = REJECTED; |
123 | }else if(INCENTIVE_RETURNED.equals(incHeadVO.getStatus()) || APPROVED.equals(incHeadVO.getStatus())){ |
124 | status = APPROVED; |
125 | } |
126 | if(IS_UPDATED.equals(incLineVO.getIsUpdate()) && (REJECTED.equals(status) || APPROVED.equals(status) )){ |
127 | isUpdate = true; |
128 | break; |
129 | } |
130 | } |
131 | if(isUpdate){ |
132 | incPrcHeadDAO.updateIncHeadAndLine(incHeadVO); |
133 | }else{ |
134 | incPrcHeadDAO.updateIncHead(incHeadVO); |
135 | } |
136 | //R1611-0061 end |
137 |
|
138 | return isUpdate; |
139 | } |
140 |
|
141 | /** |
142 | 更新行 |
143 | */ |
144 | private void updateIncLine(IncHeadVO incHeadVO) throws ApplicationException { |
145 | for (IncLineVO incLineVO : incHeadVO.getLines()) { |
146 | if(incLineVO.isValidRowId()){ |
147 | this.updateIncLine(incHeadVO,incLineVO); |
148 | }else{ |
149 | //新增的行 |
150 | List<IncLineVO> incLineVOList = new ArrayList<IncLineVO>() |
151 | incLineVOList.add(incLineVO); |
152 | insertIncLine(incHeadVO, incLineVOList); |
153 | } |
154 | } |
155 | } |
如需本文转载,如需转载请与云社区联系。
- 点赞
- 收藏
- 关注作者
评论(0)