代码评审

1.方法的参数不要超过三个。

 

2.快捷键

ctrl+shift+F(代码格式调整)
使用方法:1>先统一对一个文件进行格式调整,然后局部自行调整成自己喜欢的格式
                 2>对一个文件中需要进行格式调整的部分选中,然后按下快捷键对齐。
alt+shift+J(Generate Element Comment),将光标放在方法名上,按快捷键。
使用方法:代码中需要有单行注释、方法注释和类注释。
                单行注释:注释方法中需要注释的部分。方法注释不可以使用这个,因为javadoc导不出,而且.此方法的时候注释也不会出现。
                方法注释:写出方法的功能。
                类注释:写出类的功能、作者、时间
 
3.
String transId = request.getParameter("transId");
//企业手续费订单表创建记录
Transaction trans = getTransactionTemplate().getTransactionByTranId(transId);
Double amount = trans.getDebitFee()==0?trans.getCreditFee():trans.getDebitFee();
trans需要进行判空及判断状态是成功才行。因为此接口为外部项目进行调用,trans为空报空指针,不判状态后续进行扣款存在风险。
 
4.
Double amount = trans.getDebitFee()==0?trans.getCreditFee():trans.getDebitFee();
此处trans.getDebitFee()若为0.00或是0.0或是0.000...是否trans.getDebitFee()==0?,需要根据trans.getDebitFee()的类型拿main函数进行测试,或是打断点在代码中测试。
 
5.
//计算mac
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");  
String dateTime = sdf.format(date);
DecimalFormat df = new DecimalFormat("#######0.00");
时间转换,可以写成一个小方法供使用。
 
6.
StringBuffer s = new StringBuffer();
s.append("merchantId=").append(Constant.companyFeeMerchantAccountId);
s.append("&fromUserId=").append(authorize.getUserId());
s.append("&toUserId=").append("1");
s.append("&orderId=").append(dateTime);
s.append("&orderTime=").append(dateTime);
s.append("&curType=").append("CNY");
s.append("&amount=").append(df.format(amount));
s.append("&remark=").append("feeConsume");
s.append("&merchantKey=").append(Constant.companyFeemerchantKey);
String mac = Md5Encrypt.md5(s.toString());
        
Map<String,String> params = new HashMap<String,String>();
params.put("p2pActionName", "feeConsume");
params.put("merchantId", Constant.companyFeeMerchantAccountId);
params.put("fromUserId", authorize.getUserId());
params.put("toUserId", "1");
params.put("orderId", dateTime);
params.put("orderTime", dateTime);
params.put("curType", "CNY");
params.put("amount", df.format(amount));
params.put("remark", "feeConsume");
params.put("mac", mac);
收款方不要定成1,改写在配置文件里面。为什么?
merchantKey不要配置,要查DB。
计算md5,及发送请求,写成一个小方法,代码的重用。
orderId应该自己生成,不该用时间,这样和托管的订单对应不起来了。使用System.currentTimeMillis()+随机数。
 
7.
try {
String json = IOUtil.postUrl(Constant.companyFeeConsumeUrl, params,"UTF-8");
logger.info("返回json:" + json);
JSONObject jsonObject = JSONObject.fromObject(json);
String rspCode = jsonObject.getString("rspCode");
if("0000".equals(rspCode)){
//查询手续费余额
Double balanceFee = getCompanyfeeService().selectCompanyfeeBalance(authorize.getUserId());
//记录企业手续费入金流水
getCompanyfeeService().saveCompanyfeeBalHis(authorize.getAccountSeq(), 3L, amount, balanceFee, "-1" , trans.getTransId());
//企业手续费订单表更新状态
getCompanyfeeService().updateCompanyfeeOrderInfoByTransId(transId);
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
我的托管接口需要返回余额。
异常,能想到的就需要进行catch,且每个catch里面都需要有日志,不要e.printStackTrace(),改成log.error();
对数据库表的操作,如果两个需要同时成功或是同时失败,需写在一个service里面,避免数据的不一致性。事务。
一个方法80行。
 
8.
@Override
public void updateHandFeeValue(Long ysbId, Double amount, Double balanceFee) {

//查出企业手续费信息
List<AccountFeeValue> accountFeeValue = getCompanyfeeDao().selectAccountFeeValueById(ysbId);
if (accountFeeValue.size() != 0) {
//阀值=(充值金额+余额)*比率
Double autoFeeValue = 0D;
BigDecimal scale = new BigDecimal(accountFeeValue.get(0).getScale());
autoFeeValue = new BigDecimal(balanceFee).multiply(scale).doubleValue();
accountFeeValue.get(0).setAutoFeeValue(autoFeeValue);
getCompanyfeeDao().updateAccountFeeValue(accountFeeValue.get(0));
}

}
要写成基本数据类型long......因为装箱拆箱耗内存。
 
9.
try {
String json = IOUtil.postUrl(Constant.companyFeeRechargeUrl, params,"UTF-8");
logger.info("返回json:" + json);
JSONObject jsonObject = JSONObject.fromObject(json);
String rspCode = jsonObject.getString("rspCode");
if("0000".equals(rspCode)){
request.setAttribute("succ", true);
//查询手续费余额
Double balanceFee = getCompanyfeeService().selectCompanyfeeBalance(authorize.getUserId());
//记录企业手续费入金流水
getCompanyfeeService().saveCompanyfeeBalHis(authorize.getAccountSeq(), trans.getDebit().getAccount().getId(), trans.getAmount(), balanceFee, "1",  trans.getTransId());
//更新手续费阀值
getCompanyfeeService().updateHandFeeValue(authorize.getAccountSeq(), trans.getAmount(), balanceFee);
//企业手续费订单表更新状态
getCompanyfeeService().updateCompanyfeeOrderInfo(trans.getOrderId());

resultMap.put("resultCode", "0000");
resultMap.put("resultMessage", "successful");
}
} catch (IOException e) {
resultMap.put("resultCode", "1001");
resultMap.put("resultMessage", "fail");
e.printStackTrace();
} catch (Exception e) {
resultMap.put("resultCode", "1001");
resultMap.put("resultMessage", "fail");
e.printStackTrace();
}
充值接口也返回余额。需要修改。
白catch了,两个catch返回的结果一样。
手续费订单表,充值和消费写成两个,因为两个的订单含义不同。
 
10.
public String createOrderId() {
    long currentTime = System.currentTimeMillis();
    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
    Date date = new Date(currentTime);
    String random1 = String.valueOf(Math.round(Math.random() * 100));
    String random2 = String.valueOf(Math.round(Math.random() * 100));
    String random3 = String.valueOf(Math.round(Math.random() * 100));
    String orderId = "CF" + formatter.format(date) + random1 + random2 + random3;
    return orderId;
}
或者使用创建订单专门的服务,或者使用创建订单专用的方法(里面是用序列进行创建的)。一般像类似这样公用的方法,在小组的群里喊一下,大家都要使用共通的。
 
11.
// 去托管扣除手续费
String json = getCompanyfeeService().deduct(accountSeq, orderId, amount);
JSONObject jsonObject = JSONObject.fromObject(json);
String rspCode = jsonObject.getString("rspCode");
try {
    json = IOUtil.postUrl(Constant.companyFeeConsumeUrl, params, "UTF-8");
    logger.info("返回json:" + json);
} catch (IOException e) {
    logger.error(e);
} catch (Exception e) {
    logger.error(e);
}
需要在catch里throw出去,不然响应回去会报空指针。
 
12.
应先处理==null的逻辑,再处理!=null的逻辑。(如下图)

 

 

13.

写明这个方法的功能是什么即可,不需要写出那么多参数,同时参数可以都放在一个bean里面。

 

 

14.

需要自己定义一个log对象,不然日志打印出来是父类的第几行的报错信息。

 

15.

Boolean改成boolean。

 

16.

对于手续费订单的保存,是否添加了事务,需完善功能

 

17.

确认trans放在页面上是否有用

 

 

18.

充值失败补充日志。

 

19.

资源使用之后需要在finally中进行关闭。

 

posted @ 2017-06-23 13:45  夏末阳光Flo  阅读(362)  评论(0编辑  收藏  举报