java枚举类管理成员之间有链表关系的使用场景

使用场景:

开发中有一个用户导入数据验证的需求需要验证一个人的在职阶段填写是否有误

验证要求

人员表验证:在职阶段所填写的内容必须必须是提前定义好的在职阶段。

其他表验证:1.根据工号关联必须与人员表的在职阶段保持一致。

                      2.如果员工表存在晋升日期,并且导入表里有每日的明细数据,则要求超过晋升日期的数据与员工表定义的在职阶段的下一个阶段一致。

在职阶段:培训期、实操期、实习1、实习2、正式

处理逻辑:

1.定义在职阶段枚举类

public enum Phase {
    PXQ("培训期"),
    SCQ("实操期"),
    SX1("实习1"),
    SX2("实习2"),
    ZSQ("正式");
    private static Phase[] vals = values();
    /**
     * 获取上一个在职阶段
     * @return
     */
    public Phase previous() {
        return vals[(this.ordinal() - 1) % vals.length];
    }
    /**
     * 获取下一个在职阶段
     * @return
     */
    public Phase next() {
        if (this.ordinal() == vals.length - 1) {
            return vals[this.ordinal()];
        }
        return vals[(this.ordinal() + 1) % vals.length];
    }
    private String desc;//中文描述
    /**
     * 私有构造,防止被外部调用
     * @param desc
     */
    private Phase(String desc){
        this.desc=desc;
    }
    /**
     * 覆盖
     * @return
     */
    @Override
    public String toString() {
        return desc;
    }

    /**
     * 获取在职阶段
     * @param v_phase
     * @return
     */
    public static Phase getPhase(String v_phase) {
        for (Phase phase:vals) {
            if (phase.toString().equals(v_phase)) {
                return phase;
            }
        }
        return null;
    }
}

2.数据验证使用

2.1人员表验证

if (sheetName.equals("人员数据-HR")) {//人员数据-HR表只验证在职阶段
    //获取在职阶段并验证
    if (titleMap.get("在职阶段")!=null) {
        Cell cell = row.getCell(titleMap.get("在职阶段"), Row.MissingCellPolicy.RETURN_BLANK_AS_NULL);
        if (cell!=null) {
            String v_phase = cell.getStringCellValue().trim();
            if (v_phase.equals("正式期")) {//兼容正式期和正式
                v_phase = "正式";
            }
            Phase phase = Phase.getPhase(v_phase);
            if (phase == null) {
                messageInfoList.add(sheetName+"表的第"+j+"行【在职阶段】列填写有误,请填写正确的在职阶段");
            }
        }
    }
}

2.2其他表验证

这里之粘贴部分代码,大概逻辑就是如果存在日期字段就去跟人员表的晋升日期比对,小于今生日期的直接比对在职阶段,大于晋升日期的则通过phase.next()比对下一个阶段。

if (peopleCheckVO.getV_regular_date()!=null&&titleMap.get("日期")!=null){
    cell = row.getCell(titleMap.get("日期"), Row.MissingCellPolicy.RETURN_BLANK_AS_NULL);
    if (cell!=null) {
        final long time = cell.getDateCellValue().getTime();
        if (time>=peopleCheckVO.getV_regular_date()) {
            Phase phase = Phase.getPhase(peopleCheckVO.getV_phase());
            if (phase != null) {
                String v_phase_rel = phase.next().toString();
                if (!v_phase.equals(v_phase_rel)){
                    messageInfoList.add(sheetName+"表的第"+j+"行【在职阶段】列有问题,因为与人员数据HR表的数据有冲突,请修改");
                }
            }
        }else{
            if (!v_phase.equals(peopleCheckVO.getV_phase())){
                messageInfoList.add(sheetName+"表的第"+j+"行【在职阶段】列有问题,因为与人员数据HR表的数据有冲突,请修改");
            }
        }
    }
} else {
    if (!v_phase.equals(peopleCheckVO.getV_phase())){
        messageInfoList.add(sheetName+"表的第"+j+"行【在职阶段】列有问题,因为与人员数据HR表的数据有冲突,请修改");
    }
}

总结:

枚举类的使用大大方便了我们对字符串列表的维护,使我们的代码更加的健壮并且更利于扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值