使用场景:
开发中有一个用户导入数据验证的需求需要验证一个人的在职阶段填写是否有误
验证要求
人员表验证:在职阶段所填写的内容必须必须是提前定义好的在职阶段。
其他表验证: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表的数据有冲突,请修改");
}
}
总结:
枚举类的使用大大方便了我们对字符串列表的维护,使我们的代码更加的健壮并且更利于扩展。