如何判断订单状态

我现有的订单状态是:
全部,列出所有订单,并且要各自标注清楚情况
已完成,use_status = 5 && paid_at != null
待支付,use_status = 0 && padi_at == null && close = 0
待使用,use_status = 0 && padi_at != null
已退款,这和比较复杂,因为有一次下单多个,但是退款部分的情况,目前是order主表,关联多个order_item附表
已取消,use_status = 0 && padi_at != null && close = 1

我现在是在后台分情况各种where查,但是感觉逻辑很混乱,另外退款又是单独查的order_item表,还有就是不排除以后又会加新条件,我想把代码理顺,这样后面维护成本也低,不然过一断时间再去看,简直是噩梦

请教用啥呢,责任链吗?还是有什么别的方法

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 14

你的单词写错了,应该是paid_at 支付时间,数据表设计可以参考,订单状态机

1年前 评论
wongvio (楼主) 1年前
order订单主表 存放订单类型,支付金额,退款金额,订单运费,优惠金额,父子订单标识等
order_items订单商品表,存放商品,规格sku,单价,数量,单规格运费,关联订单表和商品表(1N)
order_payments 订单支付表,存放支付单号,交易单号,支付金额,支付时间,状态,关联订单表(1N)
order_refund 订单退款表,存放退款单号,交易单号,退款金额,退款时间,状态,关联订单表(1N
1年前 评论
wongvio (楼主) 1年前
PHPer技术栈 (作者) 1年前

可以单独维护一个你自己用的字段

1年前 评论

我是用管道模式,有点像责任链模式来逻辑切割

  $pips = [
            [OrderStatusCancel::class, 'handle'],//已取消 --
            [OrderStatusWaitPay::class, 'handle'],//待支付
            [OrderStatusFinish::class, 'handle'],//已完成  --
            [OrderStatusSettle::class, 'handle'],//已结算  --
            [OrderStatusPay::class, 'handle'],//已支付 --
            [OrderStatusRefund::class, 'handle'],//已退款 --
            [OrderStatusRefundIng::class, 'handle'],//退款中
            [OrderStatusInvalid::class, 'handle'],//无效订单 --
        ];

每个类中加你所写的逻辑,比较清晰,返回的格式是统一的 [status:1,note:'待支付']

后续加更多的状态,我只需要再加一个类就好了

1年前 评论
yzbfeng 1年前

其实最好分开不同的状态字段,这样维护起来比较好维护和管理

1年前 评论
sanders

个人建议将并列的状态分成不同的枚举属性。我通过楼主的描述粗略猜测应该有至少三个并列的的状态:交易状态、支付状态 和 退款状态。这里尽量不要用时间来代替枚举值,因为时间仅能做布尔值判断,而布尔值不如枚举方便扩展。要记录各个状态的时间可以再单独增加相应的时间字段,按应用场景来看,订单应该记录的时间字段应该大致等于所有并列状态的所有枚举值,以便于之后的跟踪筛选。如:支付单创建时间、支付完成时间、订单创建时间、订单使用时间、订单完成时间、订单取消时间。

查询条件是应用场景定义的,用本地作用域来进行封装是最简单的实现方案。

状态流转不要刻意的采用状态机之类的模式(我个人觉得比较鸡肋)。按照最小职责原则将业务拆分封装做好判断就好,毕竟状态流转只是订单处理流程中很小的一块逻辑。

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!