erp 项目订单重构--修改订单状态部分
背景
最近公司物流部那边经常叫我更改我维护的一个erp系统修改订单状态部分,发现以前开发写的太乱了,所以来重构一下。
业务分解
- 公司分为客服、采购、物流、财务等各个部门,需要根据业务需求对erp系统上订单状态进行修改;
- 目前订单状态有已下单、有效单、已采购、已入库、重出单、已出仓、、已发货、问题件、拒签、已签收、退货、退件单、已收款、确认中、风险单、已缺货、取消单、拦截单等,不同的订单状态修改可能会涉及到其他业务,而且因为单量较大,所以各部门都是导入批量修改的。
代码分析
目前代码是写在一个function,不同的订单状态通过前端传过来的code字段进行修改:
每一个状态的代码可能相同,有些也有差异,以下举几个例子:
-
大部分默认的逻辑是通过订单号或快递单号判断订单是否存在,然后判断订单状态是否允许被修改为指定的状态:
-
有些状态的修改不同的角色允许操作的订单范围不同:
-
更改为发货状态需要调私有function修改库存:
-
看完以上代码目测对代码敏感或有代码洁癖的人可能会有各种吐槽,下面我们一步步来重构这份代码。
重构思路和实现
- 代码中存在大量
\App\Model\Simple\Order::
的语句,类使用use App\Model\Simple\Order as OrderModel
导入一次,后文可以直接用OrderModel
。注:这个Controller的类名就叫order,所以要给order Model 起别名。
OrderModel::select(DB::raw('id,type_id'))
改为OrderModel::select('id','type_id')
(ps:目测以前的开发不想写这么多单引号吧)-
$_order_type = \App\Model\Simple\OrderType::all(); foreach ($_order_type as $value) { $types[$value->code] = array( 'id' => $value->id ); } 改为: $_order_type = OrderType::select('id', 'code')->pluck('id', 'code'); 之后: $types['fahuo']['id']之类的获取订单状态的id改为: $_order_type['fahuo']
- 大部分默认的逻辑都需要判断订单状态是否允许被修改为指定的状态,可以写个映射数组在model里,然后写个当前order_type 是否可被修改为指定type的function,具体逻辑如下:
在orderTypeModel加:
(ps:吐槽订单状态命名的希望可以给个好的解决方案)
加入检验的function:
/**
* 检验订单状态是否可改
* @param $check_type 当前要修改的状态
* @param $check_content_type 允许被改的状态
* @return bool
*/
public static function checkTypeAuth($check_type,$check_content_type){
if(empty(self::$typeMap[$check_type])||in_array($check_content_type,self::$typeMap[$k_type])){
return true;
}
return false;
}
# 因为后面有循环查订单状态表,这个表的内容基本不改,所以在orderTypeModel加:
/**
* 从缓存中获取数据
* @return mixed
*/
public static function getFromCached()
{
return Cache::remember('order_type_all', 5*60, function(){
return self::all();
});
}
加入以上代码后所有的code片段都可以做以下改动:
- 做了以上改动后可以提取出所以相同的逻辑,写在一个code片段里面,对比数据如下图:
- 此外有些代码太多if_else,可以做如下修改:
修改前:
修改后:
注: 以上代码(修改前、修改后)都放在github上。点击链接
小结
通过此次代码的重构,总结以下成果:
- 代码比之前更加简洁,可读性提高;
- 通过map映射来管理可修改状态,不用每次都在code代码段里找,管理代码更方便;
- 以后有新的订单状态要修改,新增代码可以找对应相似code片段,如果存在可以不用复制一段长长的code,节约代码量。
引出问题
自己在改完这份代码之后感觉还是不满意,因为还是有些地方可以改进的:比如图八可以看出还是有很多相似都代码但无法独立开来;订单状态的命名;还有一些我没发现的问题。
源码链接前面已经给出了,希望有能人异士帮忙指点一下哈!
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: