admin 管理员组

文章数量: 887021

产品

各位读者,早上好!

这里从产品角度介绍下“四眼原则”。自从产品有一次再开发中提出“四眼原则”的设计想法后,很多版本的迭代,凡是涉及到审核的,基本都需要运用这种规则。

四眼原则—— 一个人提交的某种东西,自己不能立马审核,需要过“冷静期”之后自己方能审核;或者自己提交东西团队中不同的人可以立马审核。

优点:
为了避免在团队中自己提交东西自己审核,加强团队之间的监督和制约,也让自己“冷静”一段时间后重新审核自己提交的东西,避免当时提交时的思维盲点。

这里涉及2点:
1、这个业务有提交、审核的流程;
2、提交人、审核人、提交时间、冷静时间 四个关键要素。

需求提出来了,代码怎么抽象呢?看下一这段代码:

/**
以下代码是简化版,并非真实业务代码,但足够表达我要表达的意思
*/
@GET
@Path("list")
@RolesAllowed('OPERATOR','OPERATOR_ADMIN')
public List<BusinessDTOs> list(@QueryParam("offset") @DefaultValue("10")int offset, @QueryParam("limit") @DefaultValue("10")int limit){List<BusinessDTOs> dtos = businessService.query(offset,limit);
return dtos;}

上面这段代码就是最终需要返回给前端的一个业务列表,具体什么列表是有业务决定的,四眼原则怎么抽象到代码中?加上四眼原则后,要达到的效果是这样的:
1、该列表有”审核“按钮,如果不满足四眼原则,”审核“按钮不展示;展示需要过冷静期后方可审核;
2、对于团队其他成员,审核按钮是可以看到的(冷静期只是限制提交人);
3、冷静期过后,自己方可提交;

抽象出来就是这样:

package com.cmh.business;import org.joda.time.DateTime;import java.io.Serializable;/*** @author:起舞的日子* @date: 2020/4/10 上午7:19*/
public abstract class FourEyePriciple implements Serializable {/*** 是否可操作*/private boolean operable;/*** 不可操作原因*/private String notOperableReason;public void apply(String submitter, String auditor, DateTime submittedTime, int fourEyeHours) {if (!submitter.equals(auditor)) {operable = true;return;}if (submittedTime == null) {operable = true;return;}if (submittedTime.plusHours(fourEyeHours).isBeforeNow()) {operable = true;return;}operable = false;notOperableReason = String.format("待团队成员确认,请于%d小时候操作", fourEyeHours);}
}

下一步让BusinessDTO继承一下FourEyePriciple,然后在Resource层遍历下DTOs调用下方法即可。

@GET
@Path("list")
@RolesAllowed('OPERATOR','OPERATOR_ADMIN')
public List<BusinessDTOs> list(@QueryParam("offset") @DefaultValue("10")int offset, @QueryParam("limit") @DefaultValue("10")int limit){List<BusinessDTOs> dtos = businessService.query(offset,limit);
dtos.foreach(e->{e.apply(dto.getCreatedBy(),dto.getCurrentUserId(),dto.getCreatedTime,foreEyeHours);});
return dtos;}这个fourEyeHours就走配置,支持灵活调整。

好了,以后关于设计的一些零碎想法就作为”产品“系列发布吧。

再会!

本文标签: 产品