许鹏程
2023-07-05 5c0d2ecb9476515cab0f1cc52ba49b02a5149a67
src/main/java/com/product/module/data/service/OrganizationImportService.java
@@ -36,1789 +36,1789 @@
public class OrganizationImportService extends AbstractBaseService implements IOrganizationImportService {
    @Autowired
    StaffManagerService staffManagerService;
   @Autowired
   StaffManagerService staffManagerService;
    private final String companyLevelSeparator = ">";
   private final String companyLevelSeparator = ">";
    /**
     * 导入公司 之前 数据处理
     *
     * @param dt
     * @throws BaseException
     */
    @Override
    public DataTableEntity importCompanyBefore(DataTableEntity dt) throws BaseException {
        ImportErrorEntity errorEntity = new ImportErrorEntity();
        try {
   /**
    * 导入公司 之前 数据处理
    *
    * @param dt
    * @throws BaseException
    */
   @Override
   public DataTableEntity importCompanyBefore(DataTableEntity dt) throws BaseException {
      ImportErrorEntity errorEntity = new ImportErrorEntity();
      try {
            SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
            //管理员权限验证
            managerPermissionValidation(errorEntity, currentUser);
            FieldSetEntity managerFieldSet = currentUser.getCurrentManager();
            String managerCompany = managerFieldSet.getString(CmnConst.ORG_LEVEL_UUID);
            // 当前管理员管理的公司
            String managerCompanyUuids = currentUser.getCurrentCompany().getString(CmnConst.ORG_LEVEL_UUID);
            if (!BaseUtil.dataTableIsEmpty(dt)) {
                //数据验证结果
                Map<String, String> fieldType = Maps.newHashMap();
                fieldType.put(CmnConst.SEQUENCE, "int");
                errorEntity = fieldRequiredValidation(dt, new String[]{CmnConst.FIELD_ORG_LEVEL_NAME, CmnConst.FIELD_ORG_LEVEL_ALL, CmnConst.SEQUENCE}, null, f -> {
                    if (f != null && f[0] != null) {
                        FieldSetEntity fse = f[0];
                        //公司名称
                        String companyName = fse.getString(CmnConst.FIELD_ORG_LEVEL_NAME);
                        //公司全称
                        String companyAllName = fse.getString(CmnConst.FIELD_ORG_LEVEL_ALL);
                        //上级公司全称
                        String parentAllName = companyAllName.replace(companyLevelSeparator + companyName, "");
                        fse.setValue("parentAllName", parentAllName);
                    }
                });
                DataTableEntity systemData = getBaseDao().listTable(CmnConst.TABLE_PRODUCT_SYS_ORG_LEVELS, " org_level_type=0 AND "
                        + BaseUtil.buildQuestionMarkFilter(CmnConst.ORG_LEVEL_UUID, managerCompanyUuids.split(","), true), new Object[]{}, "org_level_code");
                // 验证重复 & 合并错误信息
                errorEntity.mergeError(fieldRepeatValidation(dt, systemData, CmnConst.FIELD_ORG_LEVEL_ALL));
                if (errorEntity.isError) {
                    errorEntity.newThrowBaseException();
                }
                List<FieldSetEntity> data = dt.getData();
                data.sort((a, b) -> {
                    String Aorg_level_all = a.getString(CmnConst.FIELD_ORG_LEVEL_ALL);
                    String Borg_level_all = b.getString(CmnConst.FIELD_ORG_LEVEL_ALL);
                    int lengthA = Aorg_level_all != null ? Aorg_level_all.length() : -1;
                    int lengthB = Borg_level_all != null ? Borg_level_all.length() : -1;
                    return lengthA - lengthB;
                });
                // 获取当前管理管理公司以及子公司
                DataTableEntity allCompany = getBaseDao().listTable(CmnConst.TABLE_PRODUCT_SYS_ORG_LEVELS, " org_level_type=0 AND "
                        + BaseUtil.buildQuestionMarkFilter(CmnConst.ORG_LEVEL_UUID, managerCompanyUuids.split(","), true), new Object[]{}, "org_level_code");
                Map<String, String> levelCode = Maps.newHashMap();
                if (!BaseUtil.dataTableIsEmpty(allCompany)) {
                    for (int i = 0; i < allCompany.getRows(); i++) {
                        String org_level_all = allCompany.getString(i, CmnConst.FIELD_ORG_LEVEL_ALL);
                        String org_level_code = allCompany.getString(i, CmnConst.FIELD_ORG_LEVEL_CODE);
                        // 将公司编码用全称存储
                        levelCode.put(org_level_all, org_level_code);
                    }
                }
                for (FieldSetEntity fse : data) {
                    //当前行
                    Integer rowIndex = fse.getInteger("~row~");
                    //公司全称
                    String companyAllName = fse.getString(CmnConst.FIELD_ORG_LEVEL_ALL);
                    //上级组织机构全称
                    String parentAllName = fse.getString("parentAllName");
                    //上级机构编码
                    String code = levelCode.get(parentAllName);
                    if (StringUtils.isEmpty(code)) {
                        errorEntity.addError(rowIndex, " 获取上级机构编码错误,请检查公司名称、全称是否正确,错误行号:").append(rowIndex + 1);
                        continue;
                    }
                    //初始化公司数据
                    initOrganizationFieldSet(fse, currentUser.getClient_uuid(), code, 0);
                    // 将当前公司生成的org_level_code 放入map中
                    levelCode.put(companyAllName, fse.getString(CmnConst.FIELD_ORG_LEVEL_CODE));
                    String uuid = null;
                    try {
                        // 保存出错直接跳过该条数据
                        getBaseDao().add(fse);
                    } catch (Exception e) {
                        continue;
                    }
                    if (null != uuid) {
                        // 导入时创建该公司的数据权限
                        FieldSetEntity fs = new FieldSetEntity();
                        fs.setTableName(CmnConst.TABLE_PRODUCT_SYS_DATA_STRATEGY_MASTER);
         SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
         //管理员权限验证
         managerPermissionValidation(errorEntity, currentUser);
         FieldSetEntity managerFieldSet = currentUser.getCurrentManager();
         String managerCompany = managerFieldSet.getString(CmnConst.ORG_LEVEL_UUID);
         // 当前管理员管理的公司
         String managerCompanyUuids = currentUser.getCurrentCompany().getString(CmnConst.ORG_LEVEL_UUID);
         if (!BaseUtil.dataTableIsEmpty(dt)) {
            //数据验证结果
            Map<String, String> fieldType = Maps.newHashMap();
            fieldType.put(CmnConst.SEQUENCE, "int");
            errorEntity = fieldRequiredValidation(dt, new String[]{CmnConst.FIELD_ORG_LEVEL_NAME, CmnConst.FIELD_ORG_LEVEL_ALL, CmnConst.SEQUENCE}, null, f -> {
               if (f != null && f[0] != null) {
                  FieldSetEntity fse = f[0];
                  //公司名称
                  String companyName = fse.getString(CmnConst.FIELD_ORG_LEVEL_NAME);
                  //公司全称
                  String companyAllName = fse.getString(CmnConst.FIELD_ORG_LEVEL_ALL);
                  //上级公司全称
                  String parentAllName = companyAllName.replace(companyLevelSeparator + companyName, "");
                  fse.setValue("parentAllName", parentAllName);
               }
            });
            DataTableEntity systemData = getBaseDao().listTable(CmnConst.TABLE_PRODUCT_SYS_ORG_LEVELS, " org_level_type=0 AND "
                  + BaseUtil.buildQuestionMarkFilter(CmnConst.ORG_LEVEL_UUID, managerCompanyUuids.split(","), true), new Object[]{}, "org_level_code");
            // 验证重复 & 合并错误信息
            errorEntity.mergeError(fieldRepeatValidation(dt, systemData, CmnConst.FIELD_ORG_LEVEL_ALL));
            if (errorEntity.isError) {
               errorEntity.newThrowBaseException();
            }
            List<FieldSetEntity> data = dt.getData();
            data.sort((a, b) -> {
               String Aorg_level_all = a.getString(CmnConst.FIELD_ORG_LEVEL_ALL);
               String Borg_level_all = b.getString(CmnConst.FIELD_ORG_LEVEL_ALL);
               int lengthA = Aorg_level_all != null ? Aorg_level_all.length() : -1;
               int lengthB = Borg_level_all != null ? Borg_level_all.length() : -1;
               return lengthA - lengthB;
            });
            // 获取当前管理管理公司以及子公司
            DataTableEntity allCompany = getBaseDao().listTable(CmnConst.TABLE_PRODUCT_SYS_ORG_LEVELS, " org_level_type=0 AND "
                  + BaseUtil.buildQuestionMarkFilter(CmnConst.ORG_LEVEL_UUID, managerCompanyUuids.split(","), true), new Object[]{}, "org_level_code");
            Map<String, String> levelCode = Maps.newHashMap();
            if (!BaseUtil.dataTableIsEmpty(allCompany)) {
               for (int i = 0; i < allCompany.getRows(); i++) {
                  String org_level_all = allCompany.getString(i, CmnConst.FIELD_ORG_LEVEL_ALL);
                  String org_level_code = allCompany.getString(i, CmnConst.FIELD_ORG_LEVEL_CODE);
                  // 将公司编码用全称存储
                  levelCode.put(org_level_all, org_level_code);
               }
            }
            for (FieldSetEntity fse : data) {
               //当前行
               Integer rowIndex = fse.getInteger("~row~");
               //公司全称
               String companyAllName = fse.getString(CmnConst.FIELD_ORG_LEVEL_ALL);
               //上级组织机构全称
               String parentAllName = fse.getString("parentAllName");
               //上级机构编码
               String code = levelCode.get(parentAllName);
               if (StringUtils.isEmpty(code)) {
                  errorEntity.addError(rowIndex, " 获取上级机构编码错误,请检查公司名称、全称是否正确,错误行号:").append(rowIndex + 1);
                  continue;
               }
               //初始化公司数据
               initOrganizationFieldSet(fse, currentUser.getClient_uuid(), code, 0);
               // 将当前公司生成的org_level_code 放入map中
               levelCode.put(companyAllName, fse.getString(CmnConst.FIELD_ORG_LEVEL_CODE));
               String uuid = null;
               try {
                  // 保存出错直接跳过该条数据
                  getBaseDao().add(fse);
               } catch (Exception e) {
                  continue;
               }
               if (null != uuid) {
                  // 导入时创建该公司的数据权限
                  FieldSetEntity fs = new FieldSetEntity();
                  fs.setTableName(CmnConst.TABLE_PRODUCT_SYS_DATA_STRATEGY_MASTER);
//                        fs.setValue(CmnConst.ORG_LEVEL_UUID, uuid);
                        fs.setValue("property_uuid", "001");
                        fs.setValue("is_used", "1");
                        fs.setValue("effective_start_date", new Date());
                        fs.setValue(CmnConst.CREATED_BY, currentUser.getUser_id());
                        fs.setValue(CmnConst.CREATED_UTC_DATETIME, new Date());
                        getBaseDao().add(fs);
                    }
                }
                // 回写到隐藏管理员所管理的公司 todo group_concat 太多会报错
                getBaseDao().executeUpdate("UPDATE product_sys_org_manager SET org_level_uuid =(SELECT group_concat(UUID) FROM product_sys_org_levels WHERE CLIENT_UUID =? AND ORG_LEVEL_TYPE =0) WHERE CLIENTS_UUID=? AND MANAGER_TYPE=? "
                        , new Object[]{currentUser.getClient_uuid(), currentUser.getClient_uuid(), 3});
                // 回写当前管理员管理的公司
                if (currentUser.getUserType() == 2 && dt.getUuids() != null) {
                    if (!StringUtils.isEmpty(managerCompany)) {
                        managerCompany += ",";
                    } else {
                        managerCompany = "";
                    }
                    managerCompany += dt.getUuidsToString();
                    String manager_uuid = managerFieldSet.getUUID();
                    String sql = "update product_sys_org_manager set org_level_uuid=? where uuid=?";
                    getBaseDao().executeUpdate(sql, new Object[]{managerCompany, manager_uuid});
                }
                //抛出错误
                if (errorEntity.isError) {
                    errorEntity.newThrowBaseException();
                }
                UpdateLoginUserInfoService loginUserInfoService = SpringBeanUtil.getBean("updateLoginUserInfoService", UpdateLoginUserInfoService.class);
                loginUserInfoService.updateUserInfoByUserId(new Object[]{currentUser.getUser_id()}, false);
                return dt;
            } else {
                errorEntity.newThrowBaseException("导入公司失败,未提取到数据");
            }
        } catch (BaseException e) {
            throw e;
        } catch (Exception e) {
            e.printStackTrace();
            errorEntity.addError(0, "导入公司失败,未知错误 ," + e.getMessage());
            errorEntity.newThrowBaseException();
        }
        return null;
    }
                  fs.setValue("property_uuid", "001");
                  fs.setValue("is_used", "1");
                  fs.setValue("effective_start_date", new Date());
                  fs.setValue(CmnConst.CREATED_BY, currentUser.getUser_id());
                  fs.setValue(CmnConst.CREATED_UTC_DATETIME, new Date());
                  getBaseDao().add(fs);
               }
            }
            // 回写到隐藏管理员所管理的公司 todo group_concat 太多会报错
            getBaseDao().executeUpdate("UPDATE product_sys_org_manager SET org_level_uuid =(SELECT group_concat(UUID) FROM product_sys_org_levels WHERE CLIENT_UUID =? AND ORG_LEVEL_TYPE =0) WHERE CLIENTS_UUID=? AND MANAGER_TYPE=? "
                  , new Object[]{currentUser.getClient_uuid(), currentUser.getClient_uuid(), 3});
            // 回写当前管理员管理的公司
            if (currentUser.getUserType() == 2 && dt.getUuids() != null) {
               if (!StringUtils.isEmpty(managerCompany)) {
                  managerCompany += ",";
               } else {
                  managerCompany = "";
               }
               managerCompany += dt.getUuidsToString();
               String manager_uuid = managerFieldSet.getUUID();
               String sql = "update product_sys_org_manager set org_level_uuid=? where uuid=?";
               getBaseDao().executeUpdate(sql, new Object[]{managerCompany, manager_uuid});
            }
            //抛出错误
            if (errorEntity.isError) {
               errorEntity.newThrowBaseException();
            }
            UpdateLoginUserInfoService loginUserInfoService = SpringBeanUtil.getBean("updateLoginUserInfoService", UpdateLoginUserInfoService.class);
            loginUserInfoService.updateUserInfoByUserId(new Object[]{currentUser.getUser_id()}, false);
            return dt;
         } else {
            errorEntity.newThrowBaseException("导入公司失败,未提取到数据");
         }
      } catch (BaseException e) {
         throw e;
      } catch (Exception e) {
         e.printStackTrace();
         errorEntity.addError(0, "导入公司失败,未知错误 ," + e.getMessage());
         errorEntity.newThrowBaseException();
      }
      return null;
   }
    /**
     * 字段重复验证
     *
     * @param errorEntity
     * @param importData  导入数据
     * @param systemData  系统数据 (可选)
     * @param fieldNames  字段名称
     * @return
     * @throws BaseException
     */
    protected ImportErrorEntity fieldRepeatValidation(ImportErrorEntity errorEntity, DataTableEntity importData, DataTableEntity systemData, String[] fieldNames) throws BaseException {
        if (fieldNames == null || fieldNames.length <= 0) {
            return errorEntity;
        }
        List<FieldSetEntity> dataList = importData.clones().getData();
        Map<String, Object> valueMap = Maps.newHashMap();
        if (!BaseUtil.dataTableIsEmpty(systemData)) {
            for (int i = 0; i < systemData.getRows(); i++) {
                for (String field : fieldNames) {
                    String value = systemData.getString(i, field);
                    if (!StringUtils.isEmpty(value)) {
                        valueMap.put(field + this.companyLevelSeparator + value, Boolean.FALSE);
                    }
                }
            }
        }
        fieldRepeatValidation(errorEntity, dataList, valueMap, fieldNames);
        return errorEntity;
    }
   /**
    * 字段重复验证
    *
    * @param errorEntity
    * @param importData  导入数据
    * @param systemData  系统数据 (可选)
    * @param fieldNames  字段名称
    * @return
    * @throws BaseException
    */
   protected ImportErrorEntity fieldRepeatValidation(ImportErrorEntity errorEntity, DataTableEntity importData, DataTableEntity systemData, String[] fieldNames) throws BaseException {
      if (fieldNames == null || fieldNames.length <= 0) {
         return errorEntity;
      }
      List<FieldSetEntity> dataList = importData.clones().getData();
      Map<String, Object> valueMap = Maps.newHashMap();
      if (!BaseUtil.dataTableIsEmpty(systemData)) {
         for (int i = 0; i < systemData.getRows(); i++) {
            for (String field : fieldNames) {
               String value = systemData.getString(i, field);
               if (!StringUtils.isEmpty(value)) {
                  valueMap.put(field + this.companyLevelSeparator + value, Boolean.FALSE);
               }
            }
         }
      }
      fieldRepeatValidation(errorEntity, dataList, valueMap, fieldNames);
      return errorEntity;
   }
    /**
     * 字段重复验证
     *
     * @param dataList   导入数据
     * @param valueMap
     * @param fieldNames 字段名称
     * @throws BaseException
     */
    protected void fieldRepeatValidation(ImportErrorEntity errorEntity, List<FieldSetEntity> dataList, Map<String, Object> valueMap, String[] fieldNames) throws BaseException {
   /**
    * 字段重复验证
    *
    * @param dataList   导入数据
    * @param valueMap
    * @param fieldNames 字段名称
    * @throws BaseException
    */
   protected void fieldRepeatValidation(ImportErrorEntity errorEntity, List<FieldSetEntity> dataList, Map<String, Object> valueMap, String[] fieldNames) throws BaseException {
        for (FieldSetEntity fse : dataList) {
            DataLocation dataLocation = getDataLocation(fse);
            for (String fieldName : fieldNames) {
                String value = fse.getString(fieldName);
                if (!StringUtils.isEmpty(value)) {
                    if (valueMap.get(fieldName + this.companyLevelSeparator + value) != null) {
                        Object val = valueMap.get(fieldName + this.companyLevelSeparator + value);
                        if (val != null) {
                            String error;
                            if (val instanceof Boolean) {
                                // 系统中存在
                                // 第 N 行,第 N 列,'表头名称' ('数据值') 数据重复,在系统中已存在
                                error = "第 %s 行,第 %s 列 '%s', 数据重复,在系统中已存在";
                                error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(fieldName), dataLocation.getColName(fieldName), value);
                            } else {
                                FieldSetEntity fs = (FieldSetEntity) val;
                                DataLocation historyLocation = getDataLocation(fs);
                                // 第N行,第 N列,'表头名称' ('数据值') 数据和第 %s 行,第N行,第 N列,'表头名称' ('数据值') 数据重复
                                error = "第 %s 行,第 %s 列 '%s', 数据和第 %s 行,第 %s 列 '%s' ,数据重复";
                                error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(fieldName), dataLocation.getColName(fieldName), value,
                                        historyLocation.getRowIndex(), historyLocation.getColIndex(fieldName), historyLocation.getColName(fieldName), value);
                            }
                            errorEntity.addError(dataLocation.getRowIndex(), error);
                        }
                    } else {
                        valueMap.put(fieldName + this.companyLevelSeparator + value, fse);
                    }
                }
            }
        }
    }
      for (FieldSetEntity fse : dataList) {
         DataLocation dataLocation = getDataLocation(fse);
         for (String fieldName : fieldNames) {
            String value = fse.getString(fieldName);
            if (!StringUtils.isEmpty(value)) {
               if (valueMap.get(fieldName + this.companyLevelSeparator + value) != null) {
                  Object val = valueMap.get(fieldName + this.companyLevelSeparator + value);
                  if (val != null) {
                     String error;
                     if (val instanceof Boolean) {
                        // 系统中存在
                        // 第 N 行,第 N 列,'表头名称' ('数据值') 数据重复,在系统中已存在
                        error = "第 %s 行,第 %s 列 '%s', 数据重复,在系统中已存在";
                        error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(fieldName), dataLocation.getColName(fieldName), value);
                     } else {
                        FieldSetEntity fs = (FieldSetEntity) val;
                        DataLocation historyLocation = getDataLocation(fs);
                        // 第N行,第 N列,'表头名称' ('数据值') 数据和第 %s 行,第N行,第 N列,'表头名称' ('数据值') 数据重复
                        error = "第 %s 行,第 %s 列 '%s', 数据和第 %s 行,第 %s 列 '%s' ,数据重复";
                        error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(fieldName), dataLocation.getColName(fieldName), value,
                              historyLocation.getRowIndex(), historyLocation.getColIndex(fieldName), historyLocation.getColName(fieldName), value);
                     }
                     errorEntity.addError(dataLocation.getRowIndex(), error);
                  }
               } else {
                  valueMap.put(fieldName + this.companyLevelSeparator + value, fse);
               }
            }
         }
      }
   }
    /**
     * 字段重复验证
     *
     * @param importData 导入数据
     * @param systemData 系统数据 (可选)
     * @param fieldName  字段名称
     * @return
     * @throws BaseException
     */
    protected ImportErrorEntity fieldRepeatValidation(DataTableEntity importData, DataTableEntity
            systemData, String fieldName) throws BaseException {
        return fieldRepeatValidation(new ImportErrorEntity(), importData, systemData, new String[]{fieldName});
    }
   /**
    * 字段重复验证
    *
    * @param importData 导入数据
    * @param systemData 系统数据 (可选)
    * @param fieldName  字段名称
    * @return
    * @throws BaseException
    */
   protected ImportErrorEntity fieldRepeatValidation(DataTableEntity importData, DataTableEntity
         systemData, String fieldName) throws BaseException {
      return fieldRepeatValidation(new ImportErrorEntity(), importData, systemData, new String[]{fieldName});
   }
    /**
     * 字段必填验证
     *
     * @param dt
     * @return
     * @throws BaseException
     */
    protected ImportErrorEntity fieldRequiredValidation(DataTableEntity dt, String[]
            fieldNames, Map<String, String> fieldType, CallBack<FieldSetEntity> callBack) throws BaseException {
        ImportErrorEntity errorEntity = new ImportErrorEntity();
        for (int i = 0; i < dt.getRows(); i++) {
            FieldSetEntity fieldSetEntity = dt.getFieldSetEntity(i);
            if (callBack != null) {
                callBack.method(fieldSetEntity);
            }
            fieldRequiredValidation(errorEntity, fieldSetEntity, fieldNames, fieldType);
        }
   /**
    * 字段必填验证
    *
    * @param dt
    * @return
    * @throws BaseException
    */
   protected ImportErrorEntity fieldRequiredValidation(DataTableEntity dt, String[]
         fieldNames, Map<String, String> fieldType, CallBack<FieldSetEntity> callBack) throws BaseException {
      ImportErrorEntity errorEntity = new ImportErrorEntity();
      for (int i = 0; i < dt.getRows(); i++) {
         FieldSetEntity fieldSetEntity = dt.getFieldSetEntity(i);
         if (callBack != null) {
            callBack.method(fieldSetEntity);
         }
         fieldRequiredValidation(errorEntity, fieldSetEntity, fieldNames, fieldType);
      }
        return errorEntity;
    }
      return errorEntity;
   }
    /**
     * 字段类型验证
     * 目前支持 int  double dateTime
     *
     * @param errorEntity
     * @param fse
     * @param fieldTypeMap
     * @return
     * @throws BaseException
     */
    protected boolean fieldTypeValidation(ImportErrorEntity errorEntity, FieldSetEntity
            fse, Map<String, String> fieldTypeMap) throws BaseException {
        boolean flag = true;
        if (fieldTypeMap != null && fieldTypeMap.size() > 0 && fse != null) {
            for (Map.Entry<String, String> v : fieldTypeMap.entrySet()) {
                String fieldType = v.getValue();
                String key = v.getKey();
                Object value = fse.getObject(key);
                if (value == null) {
                    continue;
                }
                String type = null;
                String msg = "";
                try {
                    switch (fieldType) {
                        case "int":
                            type = "整数";
                            fse.getInteger(key);
                            continue;
                        case "dateTime":
                            type = "日期";
                            Date date = fse.getDate(key);
                            fse.setValue(key, date);
                            continue;
                        case "double":
                            type = "小数";
                            fse.getDouble(key);
                            continue;
                        case "mobile_phone":
                            type = "移动电话";
                            String phone = fse.getString(key);
                            // 验证是否为中国大陆 手机号
                            if (!BaseUtil.isChinaPhoneLegal(phone)) {
                                throw new BaseException("", "");
                            }
                            continue;
                        case "id_card":
                            type = "身份证号码";
                            String idCard = fse.getString(key);
                            // 验证身份证号码是否合法
                            if (IdcardUtils.validateCard(idCard)) {
                                msg = BaseUtil.idCardVerification(idCard);
                                throw new BaseException("", "");
                            }
                            continue;
                        case "email":
                            type = "邮箱";
                            String email = fse.getString(key);
                            // 邮箱验证
                            if (!BaseUtil.isEmail(email)) {
                                throw new BaseException("", "");
                            }
                            continue;
                        case "sex":
                            type = "性别";
                            String sex = fse.getString(key);
                            // 邮箱验证
                            if (!"男".equals(sex) && !"女".equals(sex)) {
                                throw new BaseException("", "");
                            }
                            continue;
                        default:
                    }
                } catch (BaseException e) {
                    DataLocation dataLocation = getDataLocation(fse);
                    String error = "第 %s 行,第 %s 列,数据类型错误" + (type != null ? ",请输入正确的 '%s'值" : "");
                    if (type != null) {
                        error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(key), type);
                    } else {
                        error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(key));
                    }
                    if (!StringUtils.isEmpty(msg)) {
                        error += "," + msg;
                    }
                    errorEntity.addError(dataLocation.getRowIndex(), error);
                    flag = false;
                }
            }
        }
   /**
    * 字段类型验证
    * 目前支持 int  double dateTime
    *
    * @param errorEntity
    * @param fse
    * @param fieldTypeMap
    * @return
    * @throws BaseException
    */
   protected boolean fieldTypeValidation(ImportErrorEntity errorEntity, FieldSetEntity
         fse, Map<String, String> fieldTypeMap) throws BaseException {
      boolean flag = true;
      if (fieldTypeMap != null && fieldTypeMap.size() > 0 && fse != null) {
         for (Map.Entry<String, String> v : fieldTypeMap.entrySet()) {
            String fieldType = v.getValue();
            String key = v.getKey();
            Object value = fse.getObject(key);
            if (value == null) {
               continue;
            }
            String type = null;
            String msg = "";
            try {
               switch (fieldType) {
                  case "int":
                     type = "整数";
                     fse.getInteger(key);
                     continue;
                  case "dateTime":
                     type = "日期";
                     Date date = fse.getDate(key);
                     fse.setValue(key, date);
                     continue;
                  case "double":
                     type = "小数";
                     fse.getDouble(key);
                     continue;
                  case "mobile_phone":
                     type = "移动电话";
                     String phone = fse.getString(key);
                     // 验证是否为中国大陆 手机号
                     if (!BaseUtil.isChinaPhoneLegal(phone)) {
                        throw new BaseException("", "");
                     }
                     continue;
                  case "id_card":
                     type = "身份证号码";
                     String idCard = fse.getString(key);
                     // 验证身份证号码是否合法
                     if (IdcardUtils.validateCard(idCard)) {
                        msg = BaseUtil.idCardVerification(idCard);
                        throw new BaseException("", "");
                     }
                     continue;
                  case "email":
                     type = "邮箱";
                     String email = fse.getString(key);
                     // 邮箱验证
                     if (!BaseUtil.isEmail(email)) {
                        throw new BaseException("", "");
                     }
                     continue;
                  case "sex":
                     type = "性别";
                     String sex = fse.getString(key);
                     // 邮箱验证
                     if (!"男".equals(sex) && !"女".equals(sex)) {
                        throw new BaseException("", "");
                     }
                     continue;
                  default:
               }
            } catch (BaseException e) {
               DataLocation dataLocation = getDataLocation(fse);
               String error = "第 %s 行,第 %s 列,数据类型错误" + (type != null ? ",请输入正确的 '%s'值" : "");
               if (type != null) {
                  error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(key), type);
               } else {
                  error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(key));
               }
               if (!StringUtils.isEmpty(msg)) {
                  error += "," + msg;
               }
               errorEntity.addError(dataLocation.getRowIndex(), error);
               flag = false;
            }
         }
      }
        return flag;
    }
      return flag;
   }
    /**
     * 字段必填验证
     *
     * @param fse
     * @return
     * @throws BaseException
     */
    private boolean fieldRequiredValidation(ImportErrorEntity errorEntity, FieldSetEntity fse, String[]
            fieldNames, Map<String, String> fieldType) throws BaseException {
        if (fse == null || fieldNames == null || fieldNames.length <= 0) {
            return true;
        }
        DataLocation dataLocation = getDataLocation(fse);
        boolean flag = true;
        for (String fieldName : fieldNames) {
            if (!StringUtils.isEmpty(fieldName)) {
                String value = fse.getString(fieldName);
                if (StringUtils.isEmpty(value)) {
                    String error = "第 %s 行,第 %s 列 '%s', 不能为空";
                    Integer rowIndex = dataLocation.getRowIndex();
                    String colIndex = dataLocation.getColIndex(fieldName);
                    String colName = dataLocation.getColName(fieldName);
                    error = String.format(error, rowIndex, colIndex, colName);
                    errorEntity.addError(rowIndex, error);
                    flag = false;
                }
            }
        }
        if (flag) {
            return fieldTypeValidation(errorEntity, fse, fieldType);
        } else {
            fieldTypeValidation(errorEntity, fse, fieldType);
            return false;
        }
    }
   /**
    * 字段必填验证
    *
    * @param fse
    * @return
    * @throws BaseException
    */
   private boolean fieldRequiredValidation(ImportErrorEntity errorEntity, FieldSetEntity fse, String[]
         fieldNames, Map<String, String> fieldType) throws BaseException {
      if (fse == null || fieldNames == null || fieldNames.length <= 0) {
         return true;
      }
      DataLocation dataLocation = getDataLocation(fse);
      boolean flag = true;
      for (String fieldName : fieldNames) {
         if (!StringUtils.isEmpty(fieldName)) {
            String value = fse.getString(fieldName);
            if (StringUtils.isEmpty(value)) {
               String error = "第 %s 行,第 %s 列 '%s', 不能为空";
               Integer rowIndex = dataLocation.getRowIndex();
               String colIndex = dataLocation.getColIndex(fieldName);
               String colName = dataLocation.getColName(fieldName);
               error = String.format(error, rowIndex, colIndex, colName);
               errorEntity.addError(rowIndex, error);
               flag = false;
            }
         }
      }
      if (flag) {
         return fieldTypeValidation(errorEntity, fse, fieldType);
      } else {
         fieldTypeValidation(errorEntity, fse, fieldType);
         return false;
      }
   }
    /**
     * 导入部门 之前 数据处理
     *
     * @param dt
     * @throws BaseException
     */
    @Override
    public DataTableEntity importDeptBefore(DataTableEntity dt) throws BaseException {
        ImportErrorEntity errorEntity = new ImportErrorEntity();
        if (!BaseUtil.dataTableIsEmpty(dt)) {
            try {
                SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
                //管理员权限验证
                managerPermissionValidation(errorEntity, currentUser);
   /**
    * 导入部门 之前 数据处理
    *
    * @param dt
    * @throws BaseException
    */
   @Override
   public DataTableEntity importDeptBefore(DataTableEntity dt) throws BaseException {
      ImportErrorEntity errorEntity = new ImportErrorEntity();
      if (!BaseUtil.dataTableIsEmpty(dt)) {
         try {
            SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
            //管理员权限验证
            managerPermissionValidation(errorEntity, currentUser);
                Map<String, String> fieldType = Maps.newHashMap();
                fieldType.put(CmnConst.SEQUENCE, "int");
                //数据必填验证结果
                errorEntity = fieldRequiredValidation(dt, new String[]{CmnConst.FIELD_ORG_LEVEL_NAME, CmnConst.FIELD_ORG_LEVEL_ALL, CmnConst.SEQUENCE, CmnConst.ORG_LEVEL_UUID}, fieldType, null);
                if (errorEntity.isError) {
                    errorEntity.newThrowBaseException();
                }
                FieldSetEntity currentManager = currentUser.getCurrentManager();
                String managerCompanyUuids = currentManager.getString(CmnConst.ORG_LEVEL_UUID);
                String uuidFilter = BaseUtil.buildQuestionMarkFilter("uuid", managerCompanyUuids.split(","), true);
                StringBuilder sql = new StringBuilder(8);
                sql.append(" select uuid,org_level_name,org_level_code, ");
                sql.append(" org_level_code_parent,org_level_all,org_level_type ");
                sql.append(" FROM product_sys_org_levels where client_uuid=?  and ( ");
                sql.append(" ( ");
                sql.append("  ").append(uuidFilter);
                sql.append(" AND org_level_type=0 ) ");
                sql.append(" or ( ");
                sql.append("  ").append(uuidFilter.replace("uuid", "org_level_uuid"));
                sql.append(" AND org_level_type=1 ) ");
                sql.append(" )  order by org_level_code,org_level_type");
                // 系统数据
                DataTableEntity systemData = getBaseDao().listTable(sql.toString(), new Object[]{currentUser.getClient_uuid()});
                importDeptBefore(dt, systemData, currentUser, errorEntity);
                return dt;
            } catch (BaseException e) {
                e.printStackTrace();
                throw e;
            } catch (Exception e) {
                e.printStackTrace();
                errorEntity.addError(0, "导入部门失败,未知错误 ," + e.getMessage());
                errorEntity.newThrowBaseException();
            }
        }
        errorEntity.newThrowBaseException("导入公司失败,未提取到数据");
        return null;
    }
            Map<String, String> fieldType = Maps.newHashMap();
            fieldType.put(CmnConst.SEQUENCE, "int");
            //数据必填验证结果
            errorEntity = fieldRequiredValidation(dt, new String[]{CmnConst.FIELD_ORG_LEVEL_NAME, CmnConst.FIELD_ORG_LEVEL_ALL, CmnConst.SEQUENCE, CmnConst.ORG_LEVEL_UUID}, fieldType, null);
            if (errorEntity.isError) {
               errorEntity.newThrowBaseException();
            }
            FieldSetEntity currentManager = currentUser.getCurrentManager();
            String managerCompanyUuids = currentManager.getString(CmnConst.ORG_LEVEL_UUID);
            String uuidFilter = BaseUtil.buildQuestionMarkFilter("uuid", managerCompanyUuids.split(","), true);
            StringBuilder sql = new StringBuilder(8);
            sql.append(" select uuid,org_level_name,org_level_code, ");
            sql.append(" org_level_code_parent,org_level_all,org_level_type ");
            sql.append(" FROM product_sys_org_levels where client_uuid=?  and ( ");
            sql.append(" ( ");
            sql.append("  ").append(uuidFilter);
            sql.append(" AND org_level_type=0 ) ");
            sql.append(" or ( ");
            sql.append("  ").append(uuidFilter.replace("uuid", "org_level_uuid"));
            sql.append(" AND org_level_type=1 ) ");
            sql.append(" )  order by org_level_code,org_level_type");
            // 系统数据
            DataTableEntity systemData = getBaseDao().listTable(sql.toString(), new Object[]{currentUser.getClient_uuid()});
            importDeptBefore(dt, systemData, currentUser, errorEntity);
            return dt;
         } catch (BaseException e) {
            e.printStackTrace();
            throw e;
         } catch (Exception e) {
            e.printStackTrace();
            errorEntity.addError(0, "导入部门失败,未知错误 ," + e.getMessage());
            errorEntity.newThrowBaseException();
         }
      }
      errorEntity.newThrowBaseException("导入公司失败,未提取到数据");
      return null;
   }
    private void importDeptBefore(DataTableEntity dt, DataTableEntity systemData, SystemUser
            user, ImportErrorEntity errorEntity) throws BaseException {
        List<FieldSetEntity> data = dt.getData();
        // 机构全称排序
        data.sort(Comparator.comparing(a -> a.getString(CmnConst.FIELD_ORG_LEVEL_ALL)));
        if (BaseUtil.dataTableIsEmpty(systemData)) {
            errorEntity.newThrowBaseException("获取系统机构信息失败,请联系管理员 ");
        }
        List<FieldSetEntity> systemDataList = systemData.getData();
        // 公司
        Map<String, FieldSetEntity> companyMap = Maps.newHashMap();
        // 部门
        Map<String, FieldSetEntity> deptMap = Maps.newHashMap();
        for (FieldSetEntity fse : systemDataList) {
            // 机构类型
            String orgLevelType = fse.getString(CmnConst.FIELD_ORG_LEVEL_TYPE);
            // 机构全称
            String org_level_all = fse.getString(CmnConst.FIELD_ORG_LEVEL_ALL);
            Map<String, FieldSetEntity> map;
            if ("0".equals(orgLevelType)) {
                map = companyMap;
            } else if ("1".equals(org_level_all)) {
                map = deptMap;
            } else {
                continue;
            }
            map.put(org_level_all, fse);
        }
        for (int i = 0; i < dt.getRows(); i++) {
            FieldSetEntity fse = dt.getFieldSetEntity(i);
            // 公司全称
            String companyAllName = fse.getString(CmnConst.ORG_LEVEL_UUID);
            // 部门全称
            String deptAllName = fse.getString(CmnConst.FIELD_ORG_LEVEL_ALL);
            // 部门名称
            String deptName = fse.getString(CmnConst.FIELD_ORG_LEVEL_NAME);
   private void importDeptBefore(DataTableEntity dt, DataTableEntity systemData, SystemUser
         user, ImportErrorEntity errorEntity) throws BaseException {
      List<FieldSetEntity> data = dt.getData();
      // 机构全称排序
      data.sort(Comparator.comparing(a -> a.getString(CmnConst.FIELD_ORG_LEVEL_ALL)));
      if (BaseUtil.dataTableIsEmpty(systemData)) {
         errorEntity.newThrowBaseException("获取系统机构信息失败,请联系管理员 ");
      }
      List<FieldSetEntity> systemDataList = systemData.getData();
      // 公司
      Map<String, FieldSetEntity> companyMap = Maps.newHashMap();
      // 部门
      Map<String, FieldSetEntity> deptMap = Maps.newHashMap();
      for (FieldSetEntity fse : systemDataList) {
         // 机构类型
         String orgLevelType = fse.getString(CmnConst.FIELD_ORG_LEVEL_TYPE);
         // 机构全称
         String org_level_all = fse.getString(CmnConst.FIELD_ORG_LEVEL_ALL);
         Map<String, FieldSetEntity> map;
         if ("0".equals(orgLevelType)) {
            map = companyMap;
         } else if ("1".equals(org_level_all)) {
            map = deptMap;
         } else {
            continue;
         }
         map.put(org_level_all, fse);
      }
      for (int i = 0; i < dt.getRows(); i++) {
         FieldSetEntity fse = dt.getFieldSetEntity(i);
         // 公司全称
         String companyAllName = fse.getString(CmnConst.ORG_LEVEL_UUID);
         // 部门全称
         String deptAllName = fse.getString(CmnConst.FIELD_ORG_LEVEL_ALL);
         // 部门名称
         String deptName = fse.getString(CmnConst.FIELD_ORG_LEVEL_NAME);
            DataLocation dataLocation = getDataLocation(fse);
            FieldSetEntity companyFse = companyMap.get(companyAllName);
            if (companyFse == null || StringUtils.isEmpty(companyFse.getUUID())) {
                String error = "第 %s 行,上级机构获取失败,所属公司不存在,请检查' %s '是否正确:' %s '";
                error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColName(CmnConst.ORG_LEVEL_UUID), companyAllName);
                errorEntity.addError(dataLocation.getRowIndex(), error);
                continue;
            }
            String error = "第 %s 行,上级机构获取失败,上级部门不存在,请检查' %s '是否正确:' %s '";
            // 部门上级全称
            String parentDeptAllName = getParentAllName(deptAllName, deptName);
            if (StringUtils.isEmpty(parentDeptAllName)) {
                error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColName(CmnConst.FIELD_ORG_LEVEL_ALL), deptAllName);
                errorEntity.addError(dataLocation.getRowIndex(), error);
                continue;
            }
            // 上级编码
            String code;
            // 上级机构的uuid
            String parentUuid;
            if (!parentDeptAllName.equals(companyAllName)) {
                FieldSetEntity deptFse = deptMap.get(parentDeptAllName);
                if (deptFse == null || StringUtils.isEmpty(deptFse.getUUID())) {
                    error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColName(CmnConst.FIELD_ORG_LEVEL_ALL), deptAllName);
                    errorEntity.addError(dataLocation.getRowIndex(), error);
                    continue;
                }
                // 取出上级部门的code作为上级编码
                code = deptFse.getString(CmnConst.FIELD_ORG_LEVEL_CODE);
         DataLocation dataLocation = getDataLocation(fse);
         FieldSetEntity companyFse = companyMap.get(companyAllName);
         if (companyFse == null || StringUtils.isEmpty(companyFse.getUUID())) {
            String error = "第 %s 行,上级机构获取失败,所属公司不存在,请检查' %s '是否正确:' %s '";
            error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColName(CmnConst.ORG_LEVEL_UUID), companyAllName);
            errorEntity.addError(dataLocation.getRowIndex(), error);
            continue;
         }
         String error = "第 %s 行,上级机构获取失败,上级部门不存在,请检查' %s '是否正确:' %s '";
         // 部门上级全称
         String parentDeptAllName = getParentAllName(deptAllName, deptName);
         if (StringUtils.isEmpty(parentDeptAllName)) {
            error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColName(CmnConst.FIELD_ORG_LEVEL_ALL), deptAllName);
            errorEntity.addError(dataLocation.getRowIndex(), error);
            continue;
         }
         // 上级编码
         String code;
         // 上级机构的uuid
         String parentUuid;
         if (!parentDeptAllName.equals(companyAllName)) {
            FieldSetEntity deptFse = deptMap.get(parentDeptAllName);
            if (deptFse == null || StringUtils.isEmpty(deptFse.getUUID())) {
               error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColName(CmnConst.FIELD_ORG_LEVEL_ALL), deptAllName);
               errorEntity.addError(dataLocation.getRowIndex(), error);
               continue;
            }
            // 取出上级部门的code作为上级编码
            code = deptFse.getString(CmnConst.FIELD_ORG_LEVEL_CODE);
                parentUuid = deptFse.getString(CmnConst.ORG_LEVEL_UUID);
            } else {
                // 取出上级公司的code作为上级编码
                code = companyFse.getString(CmnConst.FIELD_ORG_LEVEL_CODE);
                parentUuid = companyFse.getUUID();
            }
            initOrganizationFieldSet(fse, user.getClient_uuid(), code, 1);
            fse.setValue(CmnConst.ORG_LEVEL_UUID, parentUuid);
            getBaseDao().saveFieldSetEntity(fse);
            deptMap.put(deptAllName, fse);
        }
        if (errorEntity.isError) {
            errorEntity.newThrowBaseException();
        }
    }
            parentUuid = deptFse.getString(CmnConst.ORG_LEVEL_UUID);
         } else {
            // 取出上级公司的code作为上级编码
            code = companyFse.getString(CmnConst.FIELD_ORG_LEVEL_CODE);
            parentUuid = companyFse.getUUID();
         }
         initOrganizationFieldSet(fse, user.getClient_uuid(), code, 1);
         fse.setValue(CmnConst.ORG_LEVEL_UUID, parentUuid);
         getBaseDao().saveFieldSetEntity(fse);
         deptMap.put(deptAllName, fse);
      }
      if (errorEntity.isError) {
         errorEntity.newThrowBaseException();
      }
   }
    private String getParentAllName(String allName, String name) {
        if (!StringUtils.isEmpty(allName) && !StringUtils.isEmpty(name)) {
            int index = allName.indexOf(this.companyLevelSeparator + name);
            if (index > -1) {
                return allName.substring(0, index);
            }
        }
        return "";
    }
   private String getParentAllName(String allName, String name) {
      if (!StringUtils.isEmpty(allName) && !StringUtils.isEmpty(name)) {
         int index = allName.indexOf(this.companyLevelSeparator + name);
         if (index > -1) {
            return allName.substring(0, index);
         }
      }
      return "";
   }
    /**
     * 导入岗位等级 之前 数据处理
     *
     * @param dt
     * @throws BaseException
     */
    @Override
    public DataTableEntity importPostLevelBefore(DataTableEntity dt) throws BaseException {
        ImportErrorEntity errorEntity = new ImportErrorEntity();
        try {
            if (!BaseUtil.dataTableIsEmpty(dt)) {
                SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
                //管理员权限验证
                managerPermissionValidation(errorEntity, currentUser);
                // 当前管理员管理的公司
                String managerCompanyUuids = currentUser.getCurrentManager().getString(CmnConst.ORG_LEVEL_UUID);
                Map<String, List<FieldSetEntity>> groupCompany = Maps.newHashMap();
                Map<String, String> fieldType = Maps.newHashMap();
                fieldType.put(CmnConst.SEQUENCE, "int");
                fieldType.put(CmnConst.FIELD_JOB_GRADE_CLASS, "int");
                StringBuilder sql = new StringBuilder();
                sql.append(" select concat( ");
                sql.append(" org_level_uuid,'>',job_grade_name) uuid ");
                sql.append("  FROM product_sys_job_post_grades where ");
                sql.append(BaseUtil.buildQuestionMarkFilter("org_level_uuid", managerCompanyUuids.split(","), true));
                DataTableEntity systemData = getBaseDao().listTable(sql.toString(), new Object[]{});
                Set<Object> systemDataSet = Sets.newHashSet();
                if (!BaseUtil.dataTableIsEmpty(systemData)) {
                    systemDataSet.addAll(Arrays.asList(systemData.getUuidsToString().split(",")));
                }
                for (int i = 0; i < dt.getRows(); i++) {
                    FieldSetEntity fse = dt.getFieldSetEntity(i);
                    // 字段必填验证
                    boolean validation = fieldRequiredValidation(errorEntity, fse, new String[]{CmnConst.ORG_LEVEL_UUID, CmnConst.FIELD_JOB_GRADE_NAME, CmnConst.SEQUENCE, CmnConst.FIELD_JOB_GRADE_CLASS}, fieldType);
                    if (!validation) {
                        // 验证未通过 跳过该条数据
                        continue;
                    }
                    // 公司全称
                    String companyAllName = fse.getString(CmnConst.ORG_LEVEL_UUID);
   /**
    * 导入岗位等级 之前 数据处理
    *
    * @param dt
    * @throws BaseException
    */
   @Override
   public DataTableEntity importPostLevelBefore(DataTableEntity dt) throws BaseException {
      ImportErrorEntity errorEntity = new ImportErrorEntity();
      try {
         if (!BaseUtil.dataTableIsEmpty(dt)) {
            SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
            //管理员权限验证
            managerPermissionValidation(errorEntity, currentUser);
            // 当前管理员管理的公司
            String managerCompanyUuids = currentUser.getCurrentManager().getString(CmnConst.ORG_LEVEL_UUID);
            Map<String, List<FieldSetEntity>> groupCompany = Maps.newHashMap();
            Map<String, String> fieldType = Maps.newHashMap();
            fieldType.put(CmnConst.SEQUENCE, "int");
            fieldType.put(CmnConst.FIELD_JOB_GRADE_CLASS, "int");
            StringBuilder sql = new StringBuilder();
            sql.append(" select concat( ");
            sql.append(" org_level_uuid,'>',job_grade_name) uuid ");
            sql.append("  FROM product_sys_job_post_grades where ");
            sql.append(BaseUtil.buildQuestionMarkFilter("org_level_uuid", managerCompanyUuids.split(","), true));
            DataTableEntity systemData = getBaseDao().listTable(sql.toString(), new Object[]{});
            Set<Object> systemDataSet = Sets.newHashSet();
            if (!BaseUtil.dataTableIsEmpty(systemData)) {
               systemDataSet.addAll(Arrays.asList(systemData.getUuidsToString().split(",")));
            }
            for (int i = 0; i < dt.getRows(); i++) {
               FieldSetEntity fse = dt.getFieldSetEntity(i);
               // 字段必填验证
               boolean validation = fieldRequiredValidation(errorEntity, fse, new String[]{CmnConst.ORG_LEVEL_UUID, CmnConst.FIELD_JOB_GRADE_NAME, CmnConst.SEQUENCE, CmnConst.FIELD_JOB_GRADE_CLASS}, fieldType);
               if (!validation) {
                  // 验证未通过 跳过该条数据
                  continue;
               }
               // 公司全称
               String companyAllName = fse.getString(CmnConst.ORG_LEVEL_UUID);
                    List<FieldSetEntity> groupPostGradeList = groupCompany.get(companyAllName);
                    if (groupPostGradeList == null) {
                        groupPostGradeList = Lists.newArrayList();
                        groupCompany.put(companyAllName, groupPostGradeList);
                    }
                    groupPostGradeList.add(fse);
                }
                if (errorEntity.isError) {
                    errorEntity.newThrowBaseException();
                }
                Set<String> companyAllNames = groupCompany.keySet();
                sql = new StringBuilder();
                sql.append(" select uuid,org_level_all ");
                sql.append(" FROM product_sys_org_levels ");
                sql.append(" where ");
                sql.append(BaseUtil.buildQuestionMarkFilter("uuid", managerCompanyUuids.split(","), true));
                sql.append(" AND ");
                sql.append(BaseUtil.buildQuestionMarkFilter("org_level_all", companyAllNames.toArray(), true));
                // 根据用户上传的公司全称 & 该管理员管理的所有公司 进行查询公司的uuid
                DataTableEntity companyInfo = getBaseDao().listTable(sql.toString(), new Object[]{});
                // 定义没有找到公司的数据 写入错误方法
                CallBack<FieldSetEntity> callBack = (value) -> {
                    for (FieldSetEntity fs : value) {
                        DataLocation dataLocation = getDataLocation(fs);
                        String error = "第 %s 行,第 %s 数据错误,所属公司不存在,请检查列 '%s'";
                        errorEntity.addError(dataLocation.getRowIndex(), String.format(error,
                                dataLocation.getRowIndex(),
                                dataLocation.getColIndex(CmnConst.ORG_LEVEL_UUID),
                                dataLocation.getColName(CmnConst.ORG_LEVEL_UUID)));
                    }
                };
                // 没有查询到所有公司信息
                if (BaseUtil.dataTableIsEmpty(companyInfo)) {
                    for (List<FieldSetEntity> value : groupCompany.values()) {
                        // 循环写入错误
                        callBack.method(value.toArray(new FieldSetEntity[]{}));
                    }
                    errorEntity.newThrowBaseException();
                } else {
                    // copy 公司全称
                    Set<String> companyNames = Sets.newHashSet();
                    companyNames.addAll(companyAllNames);
                    // 循环查询的公司结果
                    for (int i = 0; i < companyInfo.getRows(); i++) {
                        String uuid = companyInfo.getString(i, CmnConst.UUID);
                        String org_level_all = companyInfo.getString(i, CmnConst.FIELD_ORG_LEVEL_ALL);
                        if (companyNames.contains(org_level_all)) {
                            companyNames.remove(org_level_all);
                        }
                        List<FieldSetEntity> postGradeList = groupCompany.get(org_level_all);
                        if (postGradeList != null) {
                            for (FieldSetEntity fs : postGradeList) {
                                // 将公司uuid写入每条数据
                                BaseUtil.createCreatorAndCreationTime(currentUser, fs);
                                fs.setValue(CmnConst.ORG_LEVEL_UUID, uuid);
                                fs.setValue(CmnConst.IS_USED, 1);
                                String job_grade_name = fs.getString(CmnConst.FIELD_JOB_GRADE_NAME);
               List<FieldSetEntity> groupPostGradeList = groupCompany.get(companyAllName);
               if (groupPostGradeList == null) {
                  groupPostGradeList = Lists.newArrayList();
                  groupCompany.put(companyAllName, groupPostGradeList);
               }
               groupPostGradeList.add(fse);
            }
            if (errorEntity.isError) {
               errorEntity.newThrowBaseException();
            }
            Set<String> companyAllNames = groupCompany.keySet();
            sql = new StringBuilder();
            sql.append(" select uuid,org_level_all ");
            sql.append(" FROM product_sys_org_levels ");
            sql.append(" where ");
            sql.append(BaseUtil.buildQuestionMarkFilter("uuid", managerCompanyUuids.split(","), true));
            sql.append(" AND ");
            sql.append(BaseUtil.buildQuestionMarkFilter("org_level_all", companyAllNames.toArray(), true));
            // 根据用户上传的公司全称 & 该管理员管理的所有公司 进行查询公司的uuid
            DataTableEntity companyInfo = getBaseDao().listTable(sql.toString(), new Object[]{});
            // 定义没有找到公司的数据 写入错误方法
            CallBack<FieldSetEntity> callBack = (value) -> {
               for (FieldSetEntity fs : value) {
                  DataLocation dataLocation = getDataLocation(fs);
                  String error = "第 %s 行,第 %s 数据错误,所属公司不存在,请检查列 '%s'";
                  errorEntity.addError(dataLocation.getRowIndex(), String.format(error,
                        dataLocation.getRowIndex(),
                        dataLocation.getColIndex(CmnConst.ORG_LEVEL_UUID),
                        dataLocation.getColName(CmnConst.ORG_LEVEL_UUID)));
               }
            };
            // 没有查询到所有公司信息
            if (BaseUtil.dataTableIsEmpty(companyInfo)) {
               for (List<FieldSetEntity> value : groupCompany.values()) {
                  // 循环写入错误
                  callBack.method(value.toArray(new FieldSetEntity[]{}));
               }
               errorEntity.newThrowBaseException();
            } else {
               // copy 公司全称
               Set<String> companyNames = Sets.newHashSet();
               companyNames.addAll(companyAllNames);
               // 循环查询的公司结果
               for (int i = 0; i < companyInfo.getRows(); i++) {
                  String uuid = companyInfo.getString(i, CmnConst.UUID);
                  String org_level_all = companyInfo.getString(i, CmnConst.FIELD_ORG_LEVEL_ALL);
                  if (companyNames.contains(org_level_all)) {
                     companyNames.remove(org_level_all);
                  }
                  List<FieldSetEntity> postGradeList = groupCompany.get(org_level_all);
                  if (postGradeList != null) {
                     for (FieldSetEntity fs : postGradeList) {
                        // 将公司uuid写入每条数据
                        BaseUtil.createCreatorAndCreationTime(currentUser, fs);
                        fs.setValue(CmnConst.ORG_LEVEL_UUID, uuid);
                        fs.setValue(CmnConst.IS_USED, 1);
                        String job_grade_name = fs.getString(CmnConst.FIELD_JOB_GRADE_NAME);
//                            String group_name = fs.getString(CmnConst.FIELD_GROUP_NAME);
                                String managerValue = uuid + this.companyLevelSeparator + job_grade_name;
                        String managerValue = uuid + this.companyLevelSeparator + job_grade_name;
                                if (systemDataSet.contains(managerValue)) {
                        if (systemDataSet.contains(managerValue)) {
                                    DataLocation dataLocation = getDataLocation(fs);
                                    String error = "第 %s 行,第 %s 列,数据重复";
                                    error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(CmnConst.FIELD_JOB_GRADE_NAME));
                                    errorEntity.addError(dataLocation.getRowIndex(), error);
                                    continue;
                                }
                                systemDataSet.add(managerValue);
                            }
                            if (errorEntity.isError) {
                                errorEntity.newThrowBaseException();
                            }
                        }
                    }
                    // 判断有是否有公司没查询到
                    if (companyNames != null && companyNames.size() > 0) {
                        List<FieldSetEntity> postGradeList = Lists.newArrayList();
                        for (String companyName : companyNames) {
                            //将没查询到的公司所属岗位等级合并
                            postGradeList.addAll(groupCompany.get(companyName));
                        }
                        if (postGradeList.size() > 0) {
                            //调用错误组装回调
                            callBack.method(postGradeList.toArray(new FieldSetEntity[]{}));
                            // 抛出错误
                            errorEntity.newThrowBaseException();
                        }
                    }
                    // 保存所有数据
                    getBaseDao().add(dt);
                    return dt;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
                           DataLocation dataLocation = getDataLocation(fs);
                           String error = "第 %s 行,第 %s 列,数据重复";
                           error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(CmnConst.FIELD_JOB_GRADE_NAME));
                           errorEntity.addError(dataLocation.getRowIndex(), error);
                           continue;
                        }
                        systemDataSet.add(managerValue);
                     }
                     if (errorEntity.isError) {
                        errorEntity.newThrowBaseException();
                     }
                  }
               }
               // 判断有是否有公司没查询到
               if (companyNames != null && companyNames.size() > 0) {
                  List<FieldSetEntity> postGradeList = Lists.newArrayList();
                  for (String companyName : companyNames) {
                     //将没查询到的公司所属岗位等级合并
                     postGradeList.addAll(groupCompany.get(companyName));
                  }
                  if (postGradeList.size() > 0) {
                     //调用错误组装回调
                     callBack.method(postGradeList.toArray(new FieldSetEntity[]{}));
                     // 抛出错误
                     errorEntity.newThrowBaseException();
                  }
               }
               // 保存所有数据
               getBaseDao().add(dt);
               return dt;
            }
         }
      } catch (Exception e) {
         e.printStackTrace();
            errorEntity.newThrowBaseException("导入岗位等级失败", e);
        }
        errorEntity.newThrowBaseException("导入岗位等级失败,未提取到数据");
        return null;
    }
         errorEntity.newThrowBaseException("导入岗位等级失败", e);
      }
      errorEntity.newThrowBaseException("导入岗位等级失败,未提取到数据");
      return null;
   }
    /**
     * 导入岗位 之前 数据处理
     *
     * @param dt
     * @throws BaseException
     */
    @Override
    public DataTableEntity importPostBefore(DataTableEntity dt) throws BaseException {
        ImportErrorEntity errorEntity = new ImportErrorEntity();
        if (!BaseUtil.dataTableIsEmpty(dt)) {
            SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
            //管理员权限验证
            managerPermissionValidation(errorEntity, currentUser);
            Map<String, String> fieldType = Maps.newHashMap();
            // 当前管理员管理的公司
            String managerCompanyUuids = currentUser.getCurrentManager().getString(CmnConst.ORG_LEVEL_UUID);
            fieldType.put(CmnConst.SEQUENCE, "int");
            String companyFilter = BaseUtil.buildQuestionMarkFilter(CmnConst.ORG_LEVEL_UUID, managerCompanyUuids.split(","), true);
            StringBuilder sql = new StringBuilder(8);
            sql.append(" SELECT org_level_all uuid, uuid dept_uuid,org_level_uuid FROM product_sys_org_levels where org_level_type=1 and length(org_level_uuid)>0 ");
            sql.append(" and ");
            sql.append(companyFilter);
            DataTableEntity deptData = getBaseDao().listTable(sql.toString(), new Object[]{});
            if (BaseUtil.dataTableIsEmpty(deptData)) {
                errorEntity.newThrowBaseException("您所管理的公司没有可供选择的部门,请核对部门数据");
            }
            sql = new StringBuilder(8);
            sql.append(" SELECT job_grade_name uuid,org_level_uuid,uuid grade_uuid ");
            sql.append(" FROM product_sys_job_post_grades WHERE ");
            sql.append(companyFilter);
            // 查询当前管理管理公司所有的岗位等级
            DataTableEntity postGradeData = getBaseDao().listTable(sql.toString(), new Object[]{});
            if (BaseUtil.dataTableIsEmpty(postGradeData)) {
   /**
    * 导入岗位 之前 数据处理
    *
    * @param dt
    * @throws BaseException
    */
   @Override
   public DataTableEntity importPostBefore(DataTableEntity dt) throws BaseException {
      ImportErrorEntity errorEntity = new ImportErrorEntity();
      if (!BaseUtil.dataTableIsEmpty(dt)) {
         SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
         //管理员权限验证
         managerPermissionValidation(errorEntity, currentUser);
         Map<String, String> fieldType = Maps.newHashMap();
         // 当前管理员管理的公司
         String managerCompanyUuids = currentUser.getCurrentManager().getString(CmnConst.ORG_LEVEL_UUID);
         fieldType.put(CmnConst.SEQUENCE, "int");
         String companyFilter = BaseUtil.buildQuestionMarkFilter(CmnConst.ORG_LEVEL_UUID, managerCompanyUuids.split(","), true);
         StringBuilder sql = new StringBuilder(8);
         sql.append(" SELECT org_level_all uuid, uuid dept_uuid,org_level_uuid FROM product_sys_org_levels where org_level_type=1 and length(org_level_uuid)>0 ");
         sql.append(" and ");
         sql.append(companyFilter);
         DataTableEntity deptData = getBaseDao().listTable(sql.toString(), new Object[]{});
         if (BaseUtil.dataTableIsEmpty(deptData)) {
            errorEntity.newThrowBaseException("您所管理的公司没有可供选择的部门,请核对部门数据");
         }
         sql = new StringBuilder(8);
         sql.append(" SELECT job_grade_name uuid,org_level_uuid,uuid grade_uuid ");
         sql.append(" FROM product_sys_job_post_grades WHERE ");
         sql.append(companyFilter);
         // 查询当前管理管理公司所有的岗位等级
         DataTableEntity postGradeData = getBaseDao().listTable(sql.toString(), new Object[]{});
         if (BaseUtil.dataTableIsEmpty(postGradeData)) {
//                errorEntity.newThrowBaseException("您所管理的公司没有可供选择的岗位等级,请核对岗位等级数据");
            }
            for (int i = 0; i < dt.getRows(); i++) {
                FieldSetEntity fse = dt.getFieldSetEntity(i);
                // 字段必填 & 类型验证
                boolean validationResult = fieldRequiredValidation(errorEntity, fse, new String[]{CmnConst.FIELD_DEPT_UUID, CmnConst.FIELD_JOB_POST_NAME, CmnConst.SEQUENCE}, fieldType);
                if (!validationResult) {
                    // 验证未通过跳过
                    continue;
                }
                // 部门全称
                String deptAllName = fse.getString(CmnConst.FIELD_DEPT_UUID);
                // 岗位等级名称
                String[] gradeNames = BaseUtil.ifNull(fse.getString(CmnConst.FIELD_JOB_POST_GRADE), "").split(",");
                List<FieldSetEntity> fieldSetEntity = deptData.getFieldSetEntity(deptAllName);
                // 部门所在的公司
                String companyUuid = null;
                // 错误标识
                boolean errorFlag = false;
                DataLocation dataLocation = null;
                if (fieldSetEntity == null || fieldSetEntity.size() < 1) {
                    dataLocation = getDataLocation(fse);
                    String error = "第 %s 行,第 %s 列,部门不存在,请核对 '%s' 数据在系统中是否存在";
                    error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(CmnConst.FIELD_DEPT_UUID), dataLocation.getColName(CmnConst.FIELD_DEPT_UUID));
                    errorEntity.addError(dataLocation.getRowIndex(), error);
                    errorFlag = true;
                } else {
                    FieldSetEntity fs = fieldSetEntity.get(0);
                    companyUuid = fs.getString(CmnConst.ORG_LEVEL_UUID);
                    fse.setValue(CmnConst.FIELD_DEPT_UUID, fs.getString(CmnConst.FIELD_DEPT_UUID));
                }
                // 根据岗位等级名称取出相关数据
                List<FieldSetEntity> postGradeList = new ArrayList<>();
                for (String gradeName : gradeNames) {
                    if (!BaseUtil.dataTableIsEmpty(postGradeData) && postGradeData.getFieldSetEntity(gradeName) != null) {
                        postGradeList.addAll(postGradeData.getFieldSetEntity(gradeName));
                    }
                }
                String error = "第 %s 行,第 %s 列,岗位等级不存在,请核对 '%s' 数据在系统中是否存在";
                // 判断岗位等级是否存在 默认不抛出错误
                if (postGradeList.size() < 1 && false) {
                    if (dataLocation == null) {
                        dataLocation = getDataLocation(fse);
                    }
                    error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(CmnConst.FIELD_JOB_POST_GRADE), dataLocation.getColName(CmnConst.FIELD_JOB_POST_GRADE));
                    errorEntity.addError(dataLocation.getRowIndex(), error);
                    errorFlag = true;
                } else if (postGradeList.size() > 0) {
                    String gradeUuid = "";
                    // 循环岗位等级
                    for (FieldSetEntity fs : postGradeList) {
                        // 查找岗位等级与公司是否匹配
                        if (companyUuid != null && companyUuid.equals(fs.getString(CmnConst.ORG_LEVEL_UUID))) {
                            if (!StringUtils.isEmpty(gradeUuid)) {
                                gradeUuid += ",";
                            }
                            gradeUuid += fs.getString("grade_uuid");
                        }
                    }
                    // 没有匹配到该公司下有相应的岗位等级
                    if (StringUtils.isEmpty(gradeUuid)) {
                        if (dataLocation == null) {
                            dataLocation = getDataLocation(fse);
                        }
                        error = "第 %s 行,第 %s 列,岗位等级在不存在,请核对 '%s' 数据在所属部门的公司中是否存在";
                        error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(CmnConst.FIELD_JOB_POST_GRADE), dataLocation.getColName(CmnConst.FIELD_JOB_POST_GRADE));
                        errorEntity.addError(dataLocation.getRowIndex(), error);
                        errorFlag = true;
                    } else {
                        String[] gradeUuids = gradeUuid.split(",");
                        // 创建岗位与岗位等级的映射表
                        DataTableEntity subGradeMapping = new DataTableEntity();
                        for (String uuid : gradeUuids) {
                            FieldSetEntity gradeMappingFieldSet = new FieldSetEntity();
                            gradeMappingFieldSet.setTableName(CmnConst.TABLE_PRODUCT_SYS_JOB_POSTS_GRADES_MAPPING);
                            gradeMappingFieldSet.setValue("job_grade_uuid", uuid);
                            BaseUtil.createCreatorAndCreationTime(gradeMappingFieldSet);
                            subGradeMapping.addFieldSetEntity(gradeMappingFieldSet);
                        }
                        fse.addSubDataTable(subGradeMapping);
                        fse.setValue(CmnConst.FIELD_JOB_POST_GRADE, null);
                    }
                }
                if (errorFlag) {
                    continue;
                }
                // 导入数据默认启用
                fse.setValue(CmnConst.IS_USED, 1);
            }
            if (errorEntity.isError) {
                errorEntity.newThrowBaseException();
            } else {
                return dt;
            }
        }
        errorEntity.newThrowBaseException("导入岗位等级失败,未提取到数据");
        return null;
    }
         }
         for (int i = 0; i < dt.getRows(); i++) {
            FieldSetEntity fse = dt.getFieldSetEntity(i);
            // 字段必填 & 类型验证
            boolean validationResult = fieldRequiredValidation(errorEntity, fse, new String[]{CmnConst.FIELD_DEPT_UUID, CmnConst.FIELD_JOB_POST_NAME, CmnConst.SEQUENCE}, fieldType);
            if (!validationResult) {
               // 验证未通过跳过
               continue;
            }
            // 部门全称
            String deptAllName = fse.getString(CmnConst.FIELD_DEPT_UUID);
            // 岗位等级名称
            String[] gradeNames = BaseUtil.ifNull(fse.getString(CmnConst.FIELD_JOB_POST_GRADE), "").split(",");
            List<FieldSetEntity> fieldSetEntity = deptData.getFieldSetEntity(deptAllName);
            // 部门所在的公司
            String companyUuid = null;
            // 错误标识
            boolean errorFlag = false;
            DataLocation dataLocation = null;
            if (fieldSetEntity == null || fieldSetEntity.size() < 1) {
               dataLocation = getDataLocation(fse);
               String error = "第 %s 行,第 %s 列,部门不存在,请核对 '%s' 数据在系统中是否存在";
               error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(CmnConst.FIELD_DEPT_UUID), dataLocation.getColName(CmnConst.FIELD_DEPT_UUID));
               errorEntity.addError(dataLocation.getRowIndex(), error);
               errorFlag = true;
            } else {
               FieldSetEntity fs = fieldSetEntity.get(0);
               companyUuid = fs.getString(CmnConst.ORG_LEVEL_UUID);
               fse.setValue(CmnConst.FIELD_DEPT_UUID, fs.getString(CmnConst.FIELD_DEPT_UUID));
            }
            // 根据岗位等级名称取出相关数据
            List<FieldSetEntity> postGradeList = new ArrayList<>();
            for (String gradeName : gradeNames) {
               if (!BaseUtil.dataTableIsEmpty(postGradeData) && postGradeData.getFieldSetEntity(gradeName) != null) {
                  postGradeList.addAll(postGradeData.getFieldSetEntity(gradeName));
               }
            }
            String error = "第 %s 行,第 %s 列,岗位等级不存在,请核对 '%s' 数据在系统中是否存在";
            // 判断岗位等级是否存在 默认不抛出错误
            if (postGradeList.size() < 1 && false) {
               if (dataLocation == null) {
                  dataLocation = getDataLocation(fse);
               }
               error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(CmnConst.FIELD_JOB_POST_GRADE), dataLocation.getColName(CmnConst.FIELD_JOB_POST_GRADE));
               errorEntity.addError(dataLocation.getRowIndex(), error);
               errorFlag = true;
            } else if (postGradeList.size() > 0) {
               String gradeUuid = "";
               // 循环岗位等级
               for (FieldSetEntity fs : postGradeList) {
                  // 查找岗位等级与公司是否匹配
                  if (companyUuid != null && companyUuid.equals(fs.getString(CmnConst.ORG_LEVEL_UUID))) {
                     if (!StringUtils.isEmpty(gradeUuid)) {
                        gradeUuid += ",";
                     }
                     gradeUuid += fs.getString("grade_uuid");
                  }
               }
               // 没有匹配到该公司下有相应的岗位等级
               if (StringUtils.isEmpty(gradeUuid)) {
                  if (dataLocation == null) {
                     dataLocation = getDataLocation(fse);
                  }
                  error = "第 %s 行,第 %s 列,岗位等级在不存在,请核对 '%s' 数据在所属部门的公司中是否存在";
                  error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(CmnConst.FIELD_JOB_POST_GRADE), dataLocation.getColName(CmnConst.FIELD_JOB_POST_GRADE));
                  errorEntity.addError(dataLocation.getRowIndex(), error);
                  errorFlag = true;
               } else {
                  String[] gradeUuids = gradeUuid.split(",");
                  // 创建岗位与岗位等级的映射表
                  DataTableEntity subGradeMapping = new DataTableEntity();
                  for (String uuid : gradeUuids) {
                     FieldSetEntity gradeMappingFieldSet = new FieldSetEntity();
                     gradeMappingFieldSet.setTableName(CmnConst.TABLE_PRODUCT_SYS_JOB_POSTS_GRADES_MAPPING);
                     gradeMappingFieldSet.setValue("job_grade_uuid", uuid);
                     BaseUtil.createCreatorAndCreationTime(gradeMappingFieldSet);
                     subGradeMapping.addFieldSetEntity(gradeMappingFieldSet);
                  }
                  fse.addSubDataTable(subGradeMapping);
                  fse.setValue(CmnConst.FIELD_JOB_POST_GRADE, null);
               }
            }
            if (errorFlag) {
               continue;
            }
            // 导入数据默认启用
            fse.setValue(CmnConst.IS_USED, 1);
         }
         if (errorEntity.isError) {
            errorEntity.newThrowBaseException();
         } else {
            return dt;
         }
      }
      errorEntity.newThrowBaseException("导入岗位等级失败,未提取到数据");
      return null;
   }
    /**
     * 导入员工 之前 数据处理
     *
     * @param fse
     * @throws BaseException
     */
    @Override
    public DataTableEntity importStaffBefore(DataTableEntity fse) throws BaseException {
        ImportStaffDataVo staffDataVo = new ImportStaffDataVo(fse);
        staffDataVo.startImporting();
        return fse;
    }
   /**
    * 导入员工 之前 数据处理
    *
    * @param fse
    * @throws BaseException
    */
   @Override
   public DataTableEntity importStaffBefore(DataTableEntity fse) throws BaseException {
      ImportStaffDataVo staffDataVo = new ImportStaffDataVo(fse);
      staffDataVo.startImporting();
      return fse;
   }
    /**
     * 员工导入操作类
     */
    private class ImportStaffDataVo {
        //导入的所有数据
        private DataTableEntity dt;
        /**
         * 错误处理类
         */
        private ImportErrorEntity errorEntity;
        /**
         * 系统中上级领导数据
         */
        DataTableEntity directLeaderData;
        /**
         * 部门数据
         */
        DataTableEntity deptData;
        /**
         * 角色数据
         */
        DataTableEntity roleData;
        /**
         * 岗位 & 岗位等级数据
         */
        DataTableEntity postData;
        /**
         * 员工表历史数据
         */
        DataTableEntity systemData;
        /**
         * 导入数据的所有领导(员工编码)
         */
        Set<String> direct_leader_codes;
        /**
         * 导入的数据按部门分组
         */
        Map<String, List<FieldSetEntity>> deptGroupMap;
        /**
         * 当前用户
         */
        SystemUser currentUser;
        /**
         * 当前客户
         */
        String client_uuid;
        /**
         * 导入的数据以员工编码存放(员工编码是唯一的)
         */
        Map<String, FieldSetEntity> staffCodeMap;
        /**
         * 导入数据类型验证
         */
        Map<String, String> fieldType;
        /**
         * 公司过滤条件
         */
        String companyFilter;
        /**
         * 分隔符
         */
        String separator = ">";
   /**
    * 员工导入操作类
    */
   private class ImportStaffDataVo {
      //导入的所有数据
      private DataTableEntity dt;
      /**
       * 错误处理类
       */
      private ImportErrorEntity errorEntity;
      /**
       * 系统中上级领导数据
       */
      DataTableEntity directLeaderData;
      /**
       * 部门数据
       */
      DataTableEntity deptData;
      /**
       * 角色数据
       */
      DataTableEntity roleData;
      /**
       * 岗位 & 岗位等级数据
       */
      DataTableEntity postData;
      /**
       * 员工表历史数据
       */
      DataTableEntity systemData;
      /**
       * 导入数据的所有领导(员工编码)
       */
      Set<String> direct_leader_codes;
      /**
       * 导入的数据按部门分组
       */
      Map<String, List<FieldSetEntity>> deptGroupMap;
      /**
       * 当前用户
       */
      SystemUser currentUser;
      /**
       * 当前客户
       */
      String client_uuid;
      /**
       * 导入的数据以员工编码存放(员工编码是唯一的)
       */
      Map<String, FieldSetEntity> staffCodeMap;
      /**
       * 导入数据类型验证
       */
      Map<String, String> fieldType;
      /**
       * 公司过滤条件
       */
      String companyFilter;
      /**
       * 分隔符
       */
      String separator = ">";
        StringBuilder sql;
        /**
         * 初始密码
         * 来源于 properties 中的初始密码 如不存在默认为 '123'
         */
        String init_pwd;
        /**
         * 部门全称存放的部门详情数据
         */
        private Map<String, FieldSetEntity> deptMap;
        /**
         * 员工管理service
         * 定义该操作类中避免没必要的注入 进入构造时会初始化对应bean
         */
        private StaffManagerService staffManagerService;
      StringBuilder sql;
      /**
       * 初始密码
       * 来源于 properties 中的初始密码 如不存在默认为 '123'
       */
      String init_pwd;
      /**
       * 部门全称存放的部门详情数据
       */
      private Map<String, FieldSetEntity> deptMap;
      /**
       * 员工管理service
       * 定义该操作类中避免没必要的注入 进入构造时会初始化对应bean
       */
      private StaffManagerService staffManagerService;
        /**
         * 构造方法 用于clone 非必要不要自行调用此方法
         *
         * @param currentData
         * @param currentDeptData
         */
        ImportStaffDataVo(FieldSetEntity currentData, FieldSetEntity currentDeptData) throws BaseException {
            // 该构造用于 clone 方法
            // 非clone 方式调用会出现未知错误
            this.currentData = currentData;
            this.currentDeptData = currentDeptData;
            if (currentData == null || currentDeptData == null) {
                try {
                    throw new RuntimeException("Constructor arguments cannot be null");
                } catch (RuntimeException e) {
                    throw new BaseException(e);
                }
            }
        }
      /**
       * 构造方法 用于clone 非必要不要自行调用此方法
       *
       * @param currentData
       * @param currentDeptData
       */
      ImportStaffDataVo(FieldSetEntity currentData, FieldSetEntity currentDeptData) throws BaseException {
         // 该构造用于 clone 方法
         // 非clone 方式调用会出现未知错误
         this.currentData = currentData;
         this.currentDeptData = currentDeptData;
         if (currentData == null || currentDeptData == null) {
            try {
               throw new RuntimeException("Constructor arguments cannot be null");
            } catch (RuntimeException e) {
               throw new BaseException(e);
            }
         }
      }
        /**
         * 无参构造 初始必要数据
         *
         * @param dt
         */
        public ImportStaffDataVo(DataTableEntity dt) throws BaseException {
            errorEntity = new ImportErrorEntity();
            if (BaseUtil.dataTableIsEmpty(dt)) {
                errorEntity.newThrowBaseException("导入员工失败,未提取到数据");
            }
            this.staffManagerService = SpringBeanUtil.getBean("staffManagerService", StaffManagerService.class);
            direct_leader_codes = Sets.newHashSet();
            fieldType = Maps.newHashMap();
            currentUser = SpringMVCContextHolder.getCurrentUser();
            client_uuid = currentUser.getClient_uuid();
            staffCodeMap = Maps.newHashMap();
            deptGroupMap = Maps.newHashMap();
            init_pwd = Global.getSystemConfig("initial.pwd", "123");
            this.dt = dt;
            //管理员权限验证
            managerPermissionValidation(errorEntity, currentUser);
            // 公司过滤条件
            companyFilter = BaseUtil.buildQuestionMarkFilter(CmnConst.ORG_LEVEL_UUID, currentUser.getCurrentManager().getString(CmnConst.ORG_LEVEL_UUID).split(","), true);
            fieldType.put("id_number", "id_card");
            fieldType.put("birth_date", "dateTime");
            fieldType.put("entry_datetime", "dateTime");
            fieldType.put("mobile_phone", "mobile_phone");
            fieldType.put("staff_email", "email");
            fieldType.put("age", "int");
        }
      /**
       * 无参构造 初始必要数据
       *
       * @param dt
       */
      public ImportStaffDataVo(DataTableEntity dt) throws BaseException {
         errorEntity = new ImportErrorEntity();
         if (BaseUtil.dataTableIsEmpty(dt)) {
            errorEntity.newThrowBaseException("导入员工失败,未提取到数据");
         }
         this.staffManagerService = SpringBeanUtil.getBean("staffManagerService", StaffManagerService.class);
         direct_leader_codes = Sets.newHashSet();
         fieldType = Maps.newHashMap();
         currentUser = SpringMVCContextHolder.getCurrentUser();
         client_uuid = currentUser.getClient_uuid();
         staffCodeMap = Maps.newHashMap();
         deptGroupMap = Maps.newHashMap();
         init_pwd = Global.getSystemConfig("initial.pwd", "123");
         this.dt = dt;
         //管理员权限验证
         managerPermissionValidation(errorEntity, currentUser);
         // 公司过滤条件
         companyFilter = BaseUtil.buildQuestionMarkFilter(CmnConst.ORG_LEVEL_UUID, currentUser.getCurrentManager().getString(CmnConst.ORG_LEVEL_UUID).split(","), true);
         fieldType.put("id_number", "id_card");
         fieldType.put("birth_date", "dateTime");
         fieldType.put("entry_datetime", "dateTime");
         fieldType.put("mobile_phone", "mobile_phone");
         fieldType.put("staff_email", "email");
         fieldType.put("age", "int");
      }
        /**
         * 导入数据入口
         * 开始导入
         */
        public void startImporting() throws BaseException {
            // 数据有效性验证 数据必填验证 & 数据有效性验证 & 数据分组
            this.requiredValidation();
            // 查询系统中已存在的员工
            findExistStaff();
            // 数据重复验证
            this.repeatValidation();
            this.throwError();
            // 初始化所需数据
            this.initializeSystemData();
            // 开始处理导入数据
            this.handleDataTable();
        }
      /**
       * 导入数据入口
       * 开始导入
       */
      public void startImporting() throws BaseException {
         // 数据有效性验证 数据必填验证 & 数据有效性验证 & 数据分组
         this.requiredValidation();
         // 查询系统中已存在的员工
         findExistStaff();
         // 数据重复验证
         this.repeatValidation();
         this.throwError();
         // 初始化所需数据
         this.initializeSystemData();
         // 开始处理导入数据
         this.handleDataTable();
      }
        /**
         * handleDataTable 遍历时的数据
         * 可能是通过 clone 对象赋值的 没有通过 handleDataTable 方法
         */
        private FieldSetEntity currentData;
        /**
         * handleDataTable 遍历数据对应的部门
         * 可能是通过 clone 对象赋值的 没有通过 handleDataTable 方法
         */
        private FieldSetEntity currentDeptData;
      /**
       * handleDataTable 遍历时的数据
       * 可能是通过 clone 对象赋值的 没有通过 handleDataTable 方法
       */
      private FieldSetEntity currentData;
      /**
       * handleDataTable 遍历数据对应的部门
       * 可能是通过 clone 对象赋值的 没有通过 handleDataTable 方法
       */
      private FieldSetEntity currentDeptData;
        /**
         * 上级领导未找到
         */
        private void superStaffNotExist() throws BaseException {
            DataLocation dataLocation = getDataLocation(this.currentData);
            String error = "第 %s 行,第 %s 列,上级领导获取失败,请检查 %s 填写值是否正确,该列值应填写 %s 列对应的值";
            error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(CmnConst.FIELD_DIRECT_LEADER_CODE), dataLocation.getColName(CmnConst.FIELD_DIRECT_LEADER_CODE), dataLocation.getColName(CmnConst.FIELD_STAFF_CODE));
            errorEntity.addError(dataLocation.getRowIndex(), error);
        }
      /**
       * 上级领导未找到
       */
      private void superStaffNotExist() throws BaseException {
         DataLocation dataLocation = getDataLocation(this.currentData);
         String error = "第 %s 行,第 %s 列,上级领导获取失败,请检查 %s 填写值是否正确,该列值应填写 %s 列对应的值";
         error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(CmnConst.FIELD_DIRECT_LEADER_CODE), dataLocation.getColName(CmnConst.FIELD_DIRECT_LEADER_CODE), dataLocation.getColName(CmnConst.FIELD_STAFF_CODE));
         errorEntity.addError(dataLocation.getRowIndex(), error);
      }
        /**
         * 处理所有记录
         */
        private void handleDataTable() throws BaseException {
            for (Map.Entry<String, List<FieldSetEntity>> fieldSets : this.deptGroupMap.entrySet()) {
                String deptAllName = fieldSets.getKey();
                currentDeptData = this.getStaffDept(deptAllName);
                List<FieldSetEntity> values = fieldSets.getValue();
                if (currentDeptData == null) {
                    for (int i = 0; i < values.size(); i++) {
                        this.currentData = values.get(i);
                        DataLocation dataLocation = getDataLocation(this.currentData);
                        String error = "第 %s 行,第 %s 列,部门在系统或管理的公司中不存在,请检查列 '%s' 的值 '%s' 是否正确";
                        error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(CmnConst.FIELD_DEPT_UUID),
                                dataLocation.getColName(CmnConst.FIELD_DEPT_UUID), deptAllName);
                        this.errorEntity.addError(dataLocation.getRowIndex(), error);
                    }
                    continue;
                }
                for (FieldSetEntity value : values) {
                    if (value.getBoolean("~processed~")) {
                        continue;
                    }
                    this.currentData = value;
                    this.handleFieldSet();
                }
            }
            throwError();
        }
      /**
       * 处理所有记录
       */
      private void handleDataTable() throws BaseException {
         for (Map.Entry<String, List<FieldSetEntity>> fieldSets : this.deptGroupMap.entrySet()) {
            String deptAllName = fieldSets.getKey();
            currentDeptData = this.getStaffDept(deptAllName);
            List<FieldSetEntity> values = fieldSets.getValue();
            if (currentDeptData == null) {
               for (int i = 0; i < values.size(); i++) {
                  this.currentData = values.get(i);
                  DataLocation dataLocation = getDataLocation(this.currentData);
                  String error = "第 %s 行,第 %s 列,部门在系统或管理的公司中不存在,请检查列 '%s' 的值 '%s' 是否正确";
                  error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex(CmnConst.FIELD_DEPT_UUID),
                        dataLocation.getColName(CmnConst.FIELD_DEPT_UUID), deptAllName);
                  this.errorEntity.addError(dataLocation.getRowIndex(), error);
               }
               continue;
            }
            for (FieldSetEntity value : values) {
               if (value.getBoolean("~processed~")) {
                  continue;
               }
               this.currentData = value;
               this.handleFieldSet();
            }
         }
         throwError();
      }
        /**
         * 处理单条记录
         */
        private void handleFieldSet() throws BaseException {
            if (this.currentData.getBoolean("~processed~")) {
                return;
            }
            String dept_uuid = this.currentDeptData.getString(CmnConst.UUID);
            String org_level_uuid = this.currentDeptData.getString(CmnConst.ORG_LEVEL_UUID);
            this.currentData.setValue("~processed~", 1);
            this.currentData.setValue("~dept_uuid~", dept_uuid);
            this.currentData.setValue(CmnConst.FIELD_STAFF_CODE, this.currentData.getString("~temp_staff_code~"));
            this.currentData.setValue(CmnConst.FIELD_DEPT_UUID, currentDeptData.getString(CmnConst.FIELD_DEPT_UUID));
            this.currentData.setValue(CmnConst.ORG_LEVEL_UUID, org_level_uuid);
            this.currentData.setValue("status", 1);
      /**
       * 处理单条记录
       */
      private void handleFieldSet() throws BaseException {
         if (this.currentData.getBoolean("~processed~")) {
            return;
         }
         String dept_uuid = this.currentDeptData.getString(CmnConst.UUID);
         String org_level_uuid = this.currentDeptData.getString(CmnConst.ORG_LEVEL_UUID);
         this.currentData.setValue("~processed~", 1);
         this.currentData.setValue("~dept_uuid~", dept_uuid);
         this.currentData.setValue(CmnConst.FIELD_STAFF_CODE, this.currentData.getString("~temp_staff_code~"));
         this.currentData.setValue(CmnConst.FIELD_DEPT_UUID, currentDeptData.getString(CmnConst.FIELD_DEPT_UUID));
         this.currentData.setValue(CmnConst.ORG_LEVEL_UUID, org_level_uuid);
         this.currentData.setValue("status", 1);
            //取出配置中账户初始密码
            this.currentData.setValue(CmnConst.USER_PWD, this.init_pwd);
            String sex = this.currentData.getString("sex");
            if (!StringUtils.isEmpty(sex)) {
                // 性别不为空时 转换参照数据 性别验证已在上个方法中验证过
                this.currentData.setValue("sex", sex.equals("男") ? 0 : 1);
            }
            // 导入数据配置中 使用 staff_avatar 字段作为用户登录账户的载体 在此处转换回来
            this.currentData.setValue(CmnConst.USER_ACCOUNT, this.currentData.getString("staff_avatar"));
            // 删除载体数据
            this.currentData.remove("staff_avatar");
            // 将show_name 字段(员工名称) 复制到 user表字段上
            this.currentData.setValue(CmnConst.USER_NAME, this.currentData.getString("show_name"));
            String job_post_grade_uuid = this.currentData.getString(CmnConst.FIELD_JOB_POST_GRADE_UUID);
            String job_post_name = this.currentData.getString("job_post_uuid");
         //取出配置中账户初始密码
         this.currentData.setValue(CmnConst.USER_PWD, this.init_pwd);
         String sex = this.currentData.getString("sex");
         if (!StringUtils.isEmpty(sex)) {
            // 性别不为空时 转换参照数据 性别验证已在上个方法中验证过
            this.currentData.setValue("sex", sex.equals("男") ? 0 : 1);
         }
         // 导入数据配置中 使用 staff_avatar 字段作为用户登录账户的载体 在此处转换回来
         this.currentData.setValue(CmnConst.USER_ACCOUNT, this.currentData.getString("staff_avatar"));
         // 删除载体数据
         this.currentData.remove("staff_avatar");
         // 将show_name 字段(员工名称) 复制到 user表字段上
         this.currentData.setValue(CmnConst.USER_NAME, this.currentData.getString("show_name"));
         String job_post_grade_uuid = this.currentData.getString(CmnConst.FIELD_JOB_POST_GRADE_UUID);
         String job_post_name = this.currentData.getString("job_post_uuid");
            // 岗位 & 岗位等级
            List<FieldSetEntity> postDataList = postData.getFieldSetEntity(this.currentData.getString("job_post_uuid"));
            if (postDataList == null || postDataList.size() <= 0) {
                // 没有岗位
                postNotExist.method(this.currentData, "job_post_uuid");
            } else {
                // 记录找到的岗位等级uuid ,多个用逗号分隔
                String grade_uuid = "";
                // 岗位uuid
                String post_uuid = null;
                // 循环系统中岗位数据
                for (FieldSetEntity postFs : postDataList) {
                    // 判断岗位是否在部门下 & 岗位名称和导入数据的岗位名称是否相同
                    if (currentDeptData.getString(CmnConst.FIELD_DEPT_UUID).equals(postFs.getString(CmnConst.FIELD_DEPT_UUID)) && job_post_name.equals(postFs.getUUID())) {
                        // 系统中岗位的uuid
                        String job_post_uuid = postFs.getString("job_post_uuid");
                        // 岗位uuid不为空时 判断当前postFs 中的岗位uuid是否跟已找到的岗位相同
                        if (post_uuid != null && !post_uuid.equals(job_post_uuid)) {
                            continue;
                        }
                        if (post_uuid == null) {
                            // 记录岗位uuid
                            post_uuid = job_post_uuid;
                        }
                        // 获取岗位中的岗位等级名称
                        String job_grade_name = postFs.getString(CmnConst.FIELD_JOB_GRADE_NAME);
                        // 拆分循环导入岗位等级名称
                        if (!BaseUtil.strIsNull(job_post_grade_uuid)) {
                            for (String grade_name : job_post_grade_uuid.split(",")) {
                                // 判断岗位等级名称和系统中相同
                                if (job_grade_name.equals(grade_name)) {
                                    if (!StringUtils.isEmpty(grade_uuid)) {
                                        grade_uuid += ",";
                                    }
                                    grade_uuid += postFs.getString(CmnConst.FIELD_JOB_POST_GRADE);
                                }
                            }
                        }
                    }
         // 岗位 & 岗位等级
         List<FieldSetEntity> postDataList = postData.getFieldSetEntity(this.currentData.getString("job_post_uuid"));
         if (postDataList == null || postDataList.size() <= 0) {
            // 没有岗位
            postNotExist.method(this.currentData, "job_post_uuid");
         } else {
            // 记录找到的岗位等级uuid ,多个用逗号分隔
            String grade_uuid = "";
            // 岗位uuid
            String post_uuid = null;
            // 循环系统中岗位数据
            for (FieldSetEntity postFs : postDataList) {
               // 判断岗位是否在部门下 & 岗位名称和导入数据的岗位名称是否相同
               if (currentDeptData.getString(CmnConst.FIELD_DEPT_UUID).equals(postFs.getString(CmnConst.FIELD_DEPT_UUID)) && job_post_name.equals(postFs.getUUID())) {
                  // 系统中岗位的uuid
                  String job_post_uuid = postFs.getString("job_post_uuid");
                  // 岗位uuid不为空时 判断当前postFs 中的岗位uuid是否跟已找到的岗位相同
                  if (post_uuid != null && !post_uuid.equals(job_post_uuid)) {
                     continue;
                  }
                  if (post_uuid == null) {
                     // 记录岗位uuid
                     post_uuid = job_post_uuid;
                  }
                  // 获取岗位中的岗位等级名称
                  String job_grade_name = postFs.getString(CmnConst.FIELD_JOB_GRADE_NAME);
                  // 拆分循环导入岗位等级名称
                  if (!BaseUtil.strIsNull(job_post_grade_uuid)) {
                     for (String grade_name : job_post_grade_uuid.split(",")) {
                        // 判断岗位等级名称和系统中相同
                        if (job_grade_name.equals(grade_name)) {
                           if (!StringUtils.isEmpty(grade_uuid)) {
                              grade_uuid += ",";
                           }
                           grade_uuid += postFs.getString(CmnConst.FIELD_JOB_POST_GRADE);
                        }
                     }
                  }
               }
                }
                // 没有找到岗位
                if (StringUtils.isEmpty(post_uuid)) {
                    // 抛出岗位未找到错误
                    postNotExist.method(this.currentData, "job_post_uuid");
                } else {
                    // 找到岗位
                    this.currentData.setValue("job_post_uuid", post_uuid);
                }
                // 没有找到岗位等级
                if (!StringUtils.isEmpty(grade_uuid)) {
            }
            // 没有找到岗位
            if (StringUtils.isEmpty(post_uuid)) {
               // 抛出岗位未找到错误
               postNotExist.method(this.currentData, "job_post_uuid");
            } else {
               // 找到岗位
               this.currentData.setValue("job_post_uuid", post_uuid);
            }
            // 没有找到岗位等级
            if (!StringUtils.isEmpty(grade_uuid)) {
//                    postNotExist.method(this.currentData, CmnConst.FIELD_JOB_POST_GRADE_UUID);
//                } else {
                    this.currentData.setValue(CmnConst.FIELD_JOB_POST_GRADE_UUID, grade_uuid);
                }
            }
            // 导入数据中岗位名称
            String[] role_uuids = this.currentData.getString("role_uuids").split(",");
            String roleUuid = "";
            // 角色处理
            roleFor:
            // 循环角色名称
            for (String roleName : role_uuids) {
                // 使用角色名称获取系统数据
                List<FieldSetEntity> roleList = roleData.getFieldSetEntity(roleName);
                if (roleList != null && roleList.size() > 0) {
                    // 循环系统中的角色
                    for (FieldSetEntity roleFs : roleList) {
                        // 因系统中角色所属公司可多选,在此处前后拼接逗号
                        String roleCompany = "," + roleFs.getString(CmnConst.ORG_LEVEL_UUID) + ",";
                        // 判断角色是否有导入数据的公司
                        if (roleCompany.contains("," + org_level_uuid + ",")) {
                            String role_uuid = roleFs.getString("role_uuid");
                            if (!StringUtils.isEmpty(roleUuid)) {
                                roleUuid += ",";
                            }
                            roleUuid += role_uuid;
                            continue roleFor;
                        }
                    }
                }
               this.currentData.setValue(CmnConst.FIELD_JOB_POST_GRADE_UUID, grade_uuid);
            }
         }
         // 导入数据中岗位名称
         String[] role_uuids = this.currentData.getString("role_uuids").split(",");
         String roleUuid = "";
         // 角色处理
         roleFor:
         // 循环角色名称
         for (String roleName : role_uuids) {
            // 使用角色名称获取系统数据
            List<FieldSetEntity> roleList = roleData.getFieldSetEntity(roleName);
            if (roleList != null && roleList.size() > 0) {
               // 循环系统中的角色
               for (FieldSetEntity roleFs : roleList) {
                  // 因系统中角色所属公司可多选,在此处前后拼接逗号
                  String roleCompany = "," + roleFs.getString(CmnConst.ORG_LEVEL_UUID) + ",";
                  // 判断角色是否有导入数据的公司
                  if (roleCompany.contains("," + org_level_uuid + ",")) {
                     String role_uuid = roleFs.getString("role_uuid");
                     if (!StringUtils.isEmpty(roleUuid)) {
                        roleUuid += ",";
                     }
                     roleUuid += role_uuid;
                     continue roleFor;
                  }
               }
            }
                // 没有找到角色数据 抛出错误
                roleNotExist.method(this.currentData, roleName);
            // 没有找到角色数据 抛出错误
            roleNotExist.method(this.currentData, roleName);
            }
            this.currentData.setValue("role_uuids", roleUuid);
            //装载上级领导code
            this.loadingSuperCode();
            if (staffManagerService == null) {
                staffManagerService = SpringBeanUtil.getBean("staffManagerService", StaffManagerService.class);
            }
            staffManagerService.saveStaffInfo(this.currentData);
        }
         }
         this.currentData.setValue("role_uuids", roleUuid);
         //装载上级领导code
         this.loadingSuperCode();
         if (staffManagerService == null) {
            staffManagerService = SpringBeanUtil.getBean("staffManagerService", StaffManagerService.class);
         }
         staffManagerService.saveStaffInfo(this.currentData);
      }
        /**
         * 抛出错误
         *
         * @throws BaseException
         */
        void throwError() throws BaseException {
            if (errorEntity.isError) {
                errorEntity.newThrowBaseException();
            }
        }
      /**
       * 抛出错误
       *
       * @throws BaseException
       */
      void throwError() throws BaseException {
         if (errorEntity.isError) {
            errorEntity.newThrowBaseException();
         }
      }
        /**
         * 装载上级领导编码
         *
         * @return
         */
        private boolean loadingSuperCode() throws BaseException {
            // 上级领导(员工编码)
            String direct_leader_code = this.currentData.getString(CmnConst.FIELD_DIRECT_LEADER_CODE);
            String superCode = "";
            if (!StringUtils.isEmpty(direct_leader_code)) {
                List<FieldSetEntity> fieldSetEntity = directLeaderData.getFieldSetEntity(direct_leader_code);
                if (staffCodeMap.get(direct_leader_code) == null && (fieldSetEntity == null || fieldSetEntity.size() <= 0)) {
                    // 未找到上级领导
                    this.superStaffNotExist();
                    return false;
                } else {
                    //上级领导在导入数据 或系统中已存在
                    // 根据编码获取上级(导入数据)
                    FieldSetEntity superFs = staffCodeMap.get(direct_leader_code);
                    if (superFs == null && (fieldSetEntity == null || fieldSetEntity.size() <= 0)) {
                        // 未找到上级领导
                        this.superStaffNotExist();
                        return false;
                    } else if (superFs == null) {
                        // 在系统中拿出上级领导
                        superFs = fieldSetEntity.get(0);
                    }
                    String user_id = superFs.getString(CmnConst.USER_ID);
                    if (StringUtils.isEmpty(user_id)) {
                        // user_id 不存在,该上级在导入数据中未保存过
                        String deptAllName = superFs.getString(CmnConst.FIELD_DEPT_UUID);
                        if (superFs.getBoolean("~processed~")) {
                            deptAllName = superFs.getString("~" + CmnConst.FIELD_DEPT_UUID + "~");
                        }
                        FieldSetEntity deptFs = getStaffDept(deptAllName);
                        if (deptFs == null) {
                            return false;
                        }
                        // 克隆当前对象 将父级的部门 & 员工表数据放入克隆对象中
                        ImportStaffDataVo clone = this.clone(deptFs, superFs);
                        // 先让父级数据进行保存操作
                        // 这里会出现递归操作 因为 handleFieldSet 方法调用了当前方法 父级的父级进入一致的判断会一直递归 clone并保存
                        // 如果递归层数过多可能会出现 full gc
                        clone.handleFieldSet();
                    } else {
                        //已保存过的数据 取出已生成的tricode
                        superCode = superFs.getString(CmnConst.TRICODE);
                    }
                }
            }
            this.currentData.setValue(CmnConst.FIELD_DIRECT_LEADER_CODE, superCode);
            return true;
        }
      /**
       * 装载上级领导编码
       *
       * @return
       */
      private boolean loadingSuperCode() throws BaseException {
         // 上级领导(员工编码)
         String direct_leader_code = this.currentData.getString(CmnConst.FIELD_DIRECT_LEADER_CODE);
         String superCode = "";
         if (!StringUtils.isEmpty(direct_leader_code)) {
            List<FieldSetEntity> fieldSetEntity = directLeaderData.getFieldSetEntity(direct_leader_code);
            if (staffCodeMap.get(direct_leader_code) == null && (fieldSetEntity == null || fieldSetEntity.size() <= 0)) {
               // 未找到上级领导
               this.superStaffNotExist();
               return false;
            } else {
               //上级领导在导入数据 或系统中已存在
               // 根据编码获取上级(导入数据)
               FieldSetEntity superFs = staffCodeMap.get(direct_leader_code);
               if (superFs == null && (fieldSetEntity == null || fieldSetEntity.size() <= 0)) {
                  // 未找到上级领导
                  this.superStaffNotExist();
                  return false;
               } else if (superFs == null) {
                  // 在系统中拿出上级领导
                  superFs = fieldSetEntity.get(0);
               }
               String user_id = superFs.getString(CmnConst.USER_ID);
               if (StringUtils.isEmpty(user_id)) {
                  // user_id 不存在,该上级在导入数据中未保存过
                  String deptAllName = superFs.getString(CmnConst.FIELD_DEPT_UUID);
                  if (superFs.getBoolean("~processed~")) {
                     deptAllName = superFs.getString("~" + CmnConst.FIELD_DEPT_UUID + "~");
                  }
                  FieldSetEntity deptFs = getStaffDept(deptAllName);
                  if (deptFs == null) {
                     return false;
                  }
                  // 克隆当前对象 将父级的部门 & 员工表数据放入克隆对象中
                  ImportStaffDataVo clone = this.clone(deptFs, superFs);
                  // 先让父级数据进行保存操作
                  // 这里会出现递归操作 因为 handleFieldSet 方法调用了当前方法 父级的父级进入一致的判断会一直递归 clone并保存
                  // 如果递归层数过多可能会出现 full gc
                  clone.handleFieldSet();
               } else {
                  //已保存过的数据 取出已生成的tricode
                  superCode = superFs.getString(CmnConst.TRICODE);
               }
            }
         }
         this.currentData.setValue(CmnConst.FIELD_DIRECT_LEADER_CODE, superCode);
         return true;
      }
        /**
         * 克隆对象
         * 克隆后 sql 成员变量未初始化
         *
         * @param currentDeptData
         * @param currentData
         * @return
         */
        private ImportStaffDataVo clone(FieldSetEntity currentDeptData, FieldSetEntity currentData) throws BaseException {
            ImportStaffDataVo clone = new ImportStaffDataVo(currentData, currentDeptData);
            clone.deptData = this.deptData;
            clone.postData = this.postData;
            clone.roleData = this.roleData;
            clone.deptGroupMap = this.deptGroupMap;
            clone.errorEntity = this.errorEntity;
            clone.direct_leader_codes = this.direct_leader_codes;
            clone.deptMap = this.deptMap;
            clone.dt = this.dt;
            clone.systemData = this.systemData;
            clone.directLeaderData = this.directLeaderData;
            clone.staffCodeMap = this.staffCodeMap;
            clone.companyFilter = this.companyFilter;
            clone.currentUser = this.currentUser;
            clone.fieldType = this.fieldType;
            clone.init_pwd = this.init_pwd;
            clone.client_uuid = this.client_uuid;
            return clone;
        }
      /**
       * 克隆对象
       * 克隆后 sql 成员变量未初始化
       *
       * @param currentDeptData
       * @param currentData
       * @return
       */
      private ImportStaffDataVo clone(FieldSetEntity currentDeptData, FieldSetEntity currentData) throws BaseException {
         ImportStaffDataVo clone = new ImportStaffDataVo(currentData, currentDeptData);
         clone.deptData = this.deptData;
         clone.postData = this.postData;
         clone.roleData = this.roleData;
         clone.deptGroupMap = this.deptGroupMap;
         clone.errorEntity = this.errorEntity;
         clone.direct_leader_codes = this.direct_leader_codes;
         clone.deptMap = this.deptMap;
         clone.dt = this.dt;
         clone.systemData = this.systemData;
         clone.directLeaderData = this.directLeaderData;
         clone.staffCodeMap = this.staffCodeMap;
         clone.companyFilter = this.companyFilter;
         clone.currentUser = this.currentUser;
         clone.fieldType = this.fieldType;
         clone.init_pwd = this.init_pwd;
         clone.client_uuid = this.client_uuid;
         return clone;
      }
        /**
         * 根据部门全称获取部门详情
         *
         * @param deptAllName
         * @return
         * @throws BaseException
         */
        private FieldSetEntity getStaffDept(String deptAllName) throws BaseException {
            if (deptMap == null) {
                deptMap = Maps.newHashMap();
            }
            if (deptMap.get(deptAllName) != null) {
                return deptMap.get(deptAllName);
            }
            List<FieldSetEntity> deptDatList = deptData.getFieldSetEntity(deptAllName);
            if (deptDatList == null || deptDatList.size() < 0) {
                return null;
            }
            return deptDatList.get(0);
        }
      /**
       * 根据部门全称获取部门详情
       *
       * @param deptAllName
       * @return
       * @throws BaseException
       */
      private FieldSetEntity getStaffDept(String deptAllName) throws BaseException {
         if (deptMap == null) {
            deptMap = Maps.newHashMap();
         }
         if (deptMap.get(deptAllName) != null) {
            return deptMap.get(deptAllName);
         }
         List<FieldSetEntity> deptDatList = deptData.getFieldSetEntity(deptAllName);
         if (deptDatList == null || deptDatList.size() < 0) {
            return null;
         }
         return deptDatList.get(0);
      }
        /**
         * 角色未找到错误回调
         */
        private CallBack<Object> roleNotExist = f -> {
            FieldSetEntity fs = (FieldSetEntity) f[0];
            Object role_name = f[1];
            DataLocation dataLocation = getDataLocation(fs);
            String error = "第 %s 行,第 %s 列,%s 在系统中不存在,请检查列值%s 是否正确";
            error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex("role_uuids"),
                    dataLocation.getColName("role_uuids"), role_name);
            errorEntity.addError(dataLocation.getRowIndex(), error);
        };
        /**
         * 岗位 & 岗位等级未找到错误回调
         */
        private CallBack<Object> postNotExist = f -> {
            FieldSetEntity fs = (FieldSetEntity) f[0];
            String fieldName = (String) f[1];
            DataLocation datLocation = getDataLocation(fs);
            String error = "第 %s 行,第 %s 列,'%s' 数据在系统中不存在,请检查 '%s' 是否正确";
            error = String.format(error, datLocation.getRowIndex(), datLocation.getColIndex(fieldName),
                    datLocation.getColName(fieldName), fs.getString(fieldName));
            errorEntity.addError(datLocation.getRowIndex(), error);
        };
      /**
       * 角色未找到错误回调
       */
      private CallBack<Object> roleNotExist = f -> {
         FieldSetEntity fs = (FieldSetEntity) f[0];
         Object role_name = f[1];
         DataLocation dataLocation = getDataLocation(fs);
         String error = "第 %s 行,第 %s 列,%s 在系统中不存在,请检查列值%s 是否正确";
         error = String.format(error, dataLocation.getRowIndex(), dataLocation.getColIndex("role_uuids"),
               dataLocation.getColName("role_uuids"), role_name);
         errorEntity.addError(dataLocation.getRowIndex(), error);
      };
      /**
       * 岗位 & 岗位等级未找到错误回调
       */
      private CallBack<Object> postNotExist = f -> {
         FieldSetEntity fs = (FieldSetEntity) f[0];
         String fieldName = (String) f[1];
         DataLocation datLocation = getDataLocation(fs);
         String error = "第 %s 行,第 %s 列,'%s' 数据在系统中不存在,请检查 '%s' 是否正确";
         error = String.format(error, datLocation.getRowIndex(), datLocation.getColIndex(fieldName),
               datLocation.getColName(fieldName), fs.getString(fieldName));
         errorEntity.addError(datLocation.getRowIndex(), error);
      };
        /**
         * 初始化系统数据
         */
        private void initializeSystemData() throws BaseException {
            //查询上级领导
            findDirectLeaderData();
            // 查询管理员管理的(公司下的)部门
            findDeptData();
            // 管理员管理的角色
            findRoleData();
            // 管理员管理的岗位 & 岗位等级
            findPostData();
            this.throwError();
        }
      /**
       * 初始化系统数据
       */
      private void initializeSystemData() throws BaseException {
         //查询上级领导
         findDirectLeaderData();
         // 查询管理员管理的(公司下的)部门
         findDeptData();
         // 管理员管理的角色
         findRoleData();
         // 管理员管理的岗位 & 岗位等级
         findPostData();
         this.throwError();
      }
        /**
         * 查询所有岗位 & 岗位等级
         */
        private void findPostData() throws BaseException {
            sql = new StringBuilder();
            sql.append(" select a.job_post_name uuid,a.uuid job_post_uuid,c.job_grade_name,c.uuid job_post_grades_uuid,a.dept_uuid FROM product_sys_job_posts a ");
            sql.append(" LEFT join product_sys_job_posts_grades_mapping b on  ");
            sql.append(" a.dept_uuid in (select uuid FROM product_sys_org_levels where org_level_type=1 and  ");
            sql.append(companyFilter);
            sql.append(" ) and a.uuid=b.job_post_uuid ");
            sql.append(" LEFT  join product_sys_job_post_grades c on b.job_grade_uuid=c.uuid ");
            sql.append(" group by  a.job_post_name,a.uuid ,c.job_grade_name,c.uuid,a.dept_uuid ");
            // 查询岗位 & 岗位等级
            postData = getBaseDao().listTable(sql.toString(), new Object[]{});
            if (BaseUtil.dataTableIsEmpty(roleData)) {
                errorEntity.addError(0, "系统中没有可供选择的岗位或岗位等级");
            }
        }
      /**
       * 查询所有岗位 & 岗位等级
       */
      private void findPostData() throws BaseException {
         sql = new StringBuilder();
         sql.append(" select a.job_post_name uuid,a.uuid job_post_uuid,c.job_grade_name,c.uuid job_post_grades_uuid,a.dept_uuid FROM product_sys_job_posts a ");
         sql.append(" LEFT join product_sys_job_posts_grades_mapping b on  ");
         sql.append(" a.dept_uuid in (select uuid FROM product_sys_org_levels where org_level_type=1 and  ");
         sql.append(companyFilter);
         sql.append(" ) and a.uuid=b.job_post_uuid ");
         sql.append(" LEFT  join product_sys_job_post_grades c on b.job_grade_uuid=c.uuid ");
         sql.append(" group by  a.job_post_name,a.uuid ,c.job_grade_name,c.uuid,a.dept_uuid ");
         // 查询岗位 & 岗位等级
         postData = getBaseDao().listTable(sql.toString(), new Object[]{});
         if (BaseUtil.dataTableIsEmpty(roleData)) {
            errorEntity.addError(0, "系统中没有可供选择的岗位或岗位等级");
         }
      }
        /**
         * 查询所有角色
         */
        private void findRoleData() throws BaseException {
            sql = new StringBuilder();
            sql.append(" select role_name as uuid,uuid as role_uuid,org_level_uuid FROM product_sys_role ");
            sql.append(" where is_used = 1  and ");
            sql.append(companyFilter);
            // 查询角色
            roleData = getBaseDao().listTable(sql.toString(), new Object[]{});
            if (BaseUtil.dataTableIsEmpty(roleData)) {
                errorEntity.addError(0, "系统中没有可供选择的角色");
            }
        }
      /**
       * 查询所有角色
       */
      private void findRoleData() throws BaseException {
         sql = new StringBuilder();
         sql.append(" select role_name as uuid,uuid as role_uuid,org_level_uuid FROM product_sys_role ");
         sql.append(" where is_used = 1  and ");
         sql.append(companyFilter);
         // 查询角色
         roleData = getBaseDao().listTable(sql.toString(), new Object[]{});
         if (BaseUtil.dataTableIsEmpty(roleData)) {
            errorEntity.addError(0, "系统中没有可供选择的角色");
         }
      }
        /**
         * 查询所有部门
         */
        private void findDeptData() throws BaseException {
            // 查询部门
            sql = new StringBuilder();
            sql.append(" select org_level_all uuid,uuid as dept_uuid,org_level_uuid,org_level_code,org_level_code_parent FROM product_sys_org_levels ");
            sql.append(" where org_level_type = 1 and ");
            sql.append(BaseUtil.buildQuestionMarkFilter(CmnConst.FIELD_ORG_LEVEL_ALL, deptGroupMap.size(), true));
            sql.append(" and ");
            sql.append(companyFilter);
            // 查询部门
            deptData = getBaseDao().listTable(sql.toString(), deptGroupMap.keySet().toArray());
            if (BaseUtil.dataTableIsEmpty(deptData)) {
                errorEntity.addError(0, "系统中没有可供选择的部门");
            }
        }
      /**
       * 查询所有部门
       */
      private void findDeptData() throws BaseException {
         // 查询部门
         sql = new StringBuilder();
         sql.append(" select org_level_all uuid,uuid as dept_uuid,org_level_uuid,org_level_code,org_level_code_parent FROM product_sys_org_levels ");
         sql.append(" where org_level_type = 1 and ");
         sql.append(BaseUtil.buildQuestionMarkFilter(CmnConst.FIELD_ORG_LEVEL_ALL, deptGroupMap.size(), true));
         sql.append(" and ");
         sql.append(companyFilter);
         // 查询部门
         deptData = getBaseDao().listTable(sql.toString(), deptGroupMap.keySet().toArray());
         if (BaseUtil.dataTableIsEmpty(deptData)) {
            errorEntity.addError(0, "系统中没有可供选择的部门");
         }
      }
        /**
         * 查询导入数据所有的上级领导
         */
        private void findDirectLeaderData() throws BaseException {
            sql = new StringBuilder();
            sql.append(" SELECT staff_code uuid,tricode,user_id FROM product_sys_staffs ");
            sql.append(" where ");
            sql.append(BaseUtil.buildQuestionMarkFilter(CmnConst.FIELD_STAFF_CODE, direct_leader_codes.size(), true));
            if (direct_leader_codes.size() > 0) {
                sql.append(" and ");
            }
            sql.append(" org_level_uuid in (select uuid FROM product_sys_org_levels where org_level_type=0 and client_uuid=?) ");
            // 暂时注释不用公司做限制
      /**
       * 查询导入数据所有的上级领导
       */
      private void findDirectLeaderData() throws BaseException {
         sql = new StringBuilder();
         sql.append(" SELECT staff_code uuid,tricode,user_id FROM product_sys_staffs ");
         sql.append(" where ");
         sql.append(BaseUtil.buildQuestionMarkFilter(CmnConst.FIELD_STAFF_CODE, direct_leader_codes.size(), true));
         if (direct_leader_codes.size() > 0) {
            sql.append(" and ");
         }
         sql.append(" org_level_uuid in (select uuid FROM product_sys_org_levels where org_level_type=0 and client_uuid=?) ");
         // 暂时注释不用公司做限制
//                sql.append(" and ");
//                sql.append(companyFilter);
            // 查询上级领导
            List<String> params = Lists.newArrayList(direct_leader_codes.iterator());
            params.add(currentUser.getClient_uuid());
            directLeaderData = getBaseDao().listTable(sql.toString(), params.toArray());
        }
         // 查询上级领导
         List<String> params = Lists.newArrayList(direct_leader_codes.iterator());
         params.add(currentUser.getClient_uuid());
         directLeaderData = getBaseDao().listTable(sql.toString(), params.toArray());
      }
        /**
         * 查询所有员工编码以及user表中的账号
         */
        private void findExistStaff() throws BaseException {
            sql = new StringBuilder(126);
            sql.append(" select  concat(b.client_uuid,'>',staff_code) staff_code,a.user_account as staff_avatar ");
            sql.append(" FROM product_sys_users a left join product_sys_staffs b on (b.client_uuid=? or b.uuid is null) and  a.user_id=b.user_id ");
            systemData = getBaseDao().listTable(sql.toString(), new Object[]{client_uuid});
        }
      /**
       * 查询所有员工编码以及user表中的账号
       */
      private void findExistStaff() throws BaseException {
         sql = new StringBuilder(126);
         sql.append(" select  concat(b.client_uuid,'>',staff_code) staff_code,a.user_account as staff_avatar ");
         sql.append(" FROM product_sys_users a left join product_sys_staffs b on (b.client_uuid=? or b.uuid is null) and  a.user_id=b.user_id ");
         systemData = getBaseDao().listTable(sql.toString(), new Object[]{client_uuid});
      }
        /**
         * 数据格式效验
         */
        private void repeatValidation() throws BaseException {
            // 注 :staff_avatar 字段为 user表中 user_account 的载体
            fieldRepeatValidation(errorEntity, dt, systemData, new String[]{CmnConst.FIELD_STAFF_CODE, "staff_avatar"});
        }
      /**
       * 数据格式效验
       */
      private void repeatValidation() throws BaseException {
         // 注 :staff_avatar 字段为 user表中 user_account 的载体
         fieldRepeatValidation(errorEntity, dt, systemData, new String[]{CmnConst.FIELD_STAFF_CODE, "staff_avatar"});
      }
        /**
         * 必填效验 数据处理
         */
        private void requiredValidation() throws BaseException {
            errorEntity.mergeError(fieldRequiredValidation(dt, new String[]{"show_name", "staff_avatar", CmnConst.FIELD_STAFF_CODE,
                    CmnConst.FIELD_DEPT_UUID, "job_post_uuid", "role_uuids"}, fieldType, (FieldSetEntity[] f) -> {
                FieldSetEntity fs = f[0];
                //上级领导编码
                String direct_leader_code = fs.getString(CmnConst.FIELD_DIRECT_LEADER_CODE);
                //工作部门全称
                String deptAllName = fs.getString(CmnConst.FIELD_DEPT_UUID);
                String id_number = fs.getString("id_number");
                String age = fs.getString("age");
                Date birth_date = fs.getDate("birth_date");
                String sex = fs.getString("sex");
                String staff_code = fs.getString(CmnConst.FIELD_STAFF_CODE);
      /**
       * 必填效验 数据处理
       */
      private void requiredValidation() throws BaseException {
         errorEntity.mergeError(fieldRequiredValidation(dt, new String[]{"show_name", "staff_avatar", CmnConst.FIELD_STAFF_CODE,
               CmnConst.FIELD_DEPT_UUID, "job_post_uuid", "role_uuids"}, fieldType, (FieldSetEntity[] f) -> {
            FieldSetEntity fs = f[0];
            //上级领导编码
            String direct_leader_code = fs.getString(CmnConst.FIELD_DIRECT_LEADER_CODE);
            //工作部门全称
            String deptAllName = fs.getString(CmnConst.FIELD_DEPT_UUID);
            String id_number = fs.getString("id_number");
            String age = fs.getString("age");
            Date birth_date = fs.getDate("birth_date");
            String sex = fs.getString("sex");
            String staff_code = fs.getString(CmnConst.FIELD_STAFF_CODE);
                if (!StringUtils.isEmpty(staff_code)) {
                    fs.setValue("~temp_staff_code~", staff_code);
                    fs.setValue(CmnConst.FIELD_STAFF_CODE, client_uuid + this.separator + staff_code);
                    staffCodeMap.put(staff_code, fs);
                }
                fs.setValue(CmnConst.CLIENT_UUID, client_uuid);
                if (!StringUtils.isEmpty(direct_leader_code)) {
                    //将上级领导编码统一放入集合中
                    // 上级领导编码 = 员工编码
                    direct_leader_codes.add(direct_leader_code);
                }
                //按部门分组数据
                if (!StringUtils.isEmpty(deptAllName)) {
                    List<FieldSetEntity> fieldSets = deptGroupMap.get(deptAllName);
                    if (fieldSets == null) {
                        fieldSets = Lists.newArrayList();
                        deptGroupMap.put(deptAllName, fieldSets);
                    }
                    fieldSets.add(fs);
                }
                if (!StringUtils.isEmpty(id_number)) {
                    try {
                        if (birth_date == null) {
                            // 根据身份证取出生日期
                            fs.setValue("birth_date", BaseUtil.getBirthday(id_number));
                        }
                        if (StringUtils.isEmpty(age)) {
                            // 根据身份证取出年龄
                            fs.setValue("age", BaseUtil.getAge(id_number));
                        }
                        if (StringUtils.isEmpty(sex)) {
                            // 根据身份证取出性别
                            fs.setValue("sex", BaseUtil.getSex(id_number));
                        }
                    } catch (Exception e) {
            if (!StringUtils.isEmpty(staff_code)) {
               fs.setValue("~temp_staff_code~", staff_code);
               fs.setValue(CmnConst.FIELD_STAFF_CODE, client_uuid + this.separator + staff_code);
               staffCodeMap.put(staff_code, fs);
            }
            fs.setValue(CmnConst.CLIENT_UUID, client_uuid);
            if (!StringUtils.isEmpty(direct_leader_code)) {
               //将上级领导编码统一放入集合中
               // 上级领导编码 = 员工编码
               direct_leader_codes.add(direct_leader_code);
            }
            //按部门分组数据
            if (!StringUtils.isEmpty(deptAllName)) {
               List<FieldSetEntity> fieldSets = deptGroupMap.get(deptAllName);
               if (fieldSets == null) {
                  fieldSets = Lists.newArrayList();
                  deptGroupMap.put(deptAllName, fieldSets);
               }
               fieldSets.add(fs);
            }
            if (!StringUtils.isEmpty(id_number)) {
               try {
                  if (birth_date == null) {
                     // 根据身份证取出生日期
                     fs.setValue("birth_date", BaseUtil.getBirthday(id_number));
                  }
                  if (StringUtils.isEmpty(age)) {
                     // 根据身份证取出年龄
                     fs.setValue("age", BaseUtil.getAge(id_number));
                  }
                  if (StringUtils.isEmpty(sex)) {
                     // 根据身份证取出性别
                     fs.setValue("sex", BaseUtil.getSex(id_number));
                  }
               } catch (Exception e) {
                    }
                }
               }
            }
            }));
         }));
        }
    }
      }
   }
    /**
     * 重载导入员工方法
     * 处理公司、部门、岗位、岗位等级、账号 相关数据
     *
     * @param postData     系统岗位 & 岗位等级数据
     * @param roleData     系统角色数据
     * @param roleNotExist 角色不存在错误回调
     * @param postNotExist 岗位 & 岗位等级不存在错误回调
     * @param fs           导入数据
     * @param deptFieldSet 部门数据
     * @param deptAllName  部门全称
     * @throws BaseException
     */
    private void importStaffBefore(DataTableEntity postData, DataTableEntity
            roleData, CallBack<Object> roleNotExist, CallBack<Object> postNotExist, FieldSetEntity fs, FieldSetEntity deptFieldSet, String deptAllName) throws BaseException {
   /**
    * 重载导入员工方法
    * 处理公司、部门、岗位、岗位等级、账号 相关数据
    *
    * @param postData     系统岗位&岗位等级数据
    * @param roleData     系统角色数据
    * @param roleNotExist 角色不存在错误回调
    * @param postNotExist 岗位&岗位等级不存在错误回调
    * @param fs           导入数据
    * @param deptFieldSet 部门数据
    * @param deptAllName  部门全称
    * @throws BaseException
    */
   private void importStaffBefore(DataTableEntity postData, DataTableEntity
         roleData, CallBack<Object> roleNotExist, CallBack<Object> postNotExist, FieldSetEntity fs, FieldSetEntity deptFieldSet, String deptAllName) throws BaseException {
        String dept_uuid = fs.getString(CmnConst.UUID);
        String org_level_uuid = fs.getString(CmnConst.ORG_LEVEL_UUID);
        fs.setValue(CmnConst.FIELD_STAFF_CODE, fs.getString("~temp_staff_code~"));
        fs.setValue(CmnConst.FIELD_DEPT_UUID, dept_uuid);
        fs.setValue(CmnConst.ORG_LEVEL_UUID, org_level_uuid);
      String dept_uuid = fs.getString(CmnConst.UUID);
      String org_level_uuid = fs.getString(CmnConst.ORG_LEVEL_UUID);
      fs.setValue(CmnConst.FIELD_STAFF_CODE, fs.getString("~temp_staff_code~"));
      fs.setValue(CmnConst.FIELD_DEPT_UUID, dept_uuid);
      fs.setValue(CmnConst.ORG_LEVEL_UUID, org_level_uuid);
        String job_post_grade_uuid = fs.getString(CmnConst.FIELD_JOB_POST_GRADE);
        String job_post_name = fs.getString("job_post_uuid");
      String job_post_grade_uuid = fs.getString(CmnConst.FIELD_JOB_POST_GRADE);
      String job_post_name = fs.getString("job_post_uuid");
        // 岗位 & 岗位等级
        List<FieldSetEntity> postDataList = postData.getFieldSetEntity(deptAllName);
        if (postDataList == null || postDataList.size() <= 0) {
            // 没有岗位
            postNotExist.method(fs, "job_post_uuid");
        } else {
            // 记录找到的岗位等级uuid ,多个用逗号分隔
            String grade_uuid = "";
            // 岗位uuid
            String post_uuid = null;
            // 循环系统中岗位数据
            for (FieldSetEntity postFs : postDataList) {
                // 判断岗位是否在部门下 & 岗位名称和导入数据的岗位名称是否相同
                if (dept_uuid.equals(postFs.getString(CmnConst.FIELD_DEPT_UUID)) && job_post_name.equals(postFs.getString(CmnConst.FIELD_JOB_POST_NAME))) {
                    // 系统中岗位的uuid
                    String job_post_uuid = postFs.getString("job_post_uuid");
                    // 岗位uuid不为空时 判断当前postFs 中的岗位uuid是否跟已找到的岗位相同
                    if (post_uuid != null && !post_uuid.equals(job_post_uuid)) {
                        continue;
                    }
                    if (post_uuid == null) {
                        // 记录岗位uuid
                        post_uuid = job_post_uuid;
                    }
                    // 获取岗位中的岗位等级名称
                    String job_grade_name = postFs.getString(CmnConst.FIELD_JOB_GRADE_NAME);
                    // 拆分循环导入岗位等级名称
                    for (String grade_name : job_post_grade_uuid.split(",")) {
                        // 判断岗位等级名称和系统中相同
                        if (job_grade_name.equals(grade_name)) {
                            if (!StringUtils.isEmpty(grade_uuid)) {
                                grade_uuid += ",";
                            }
                            grade_uuid += postFs.getString(CmnConst.FIELD_JOB_POST_GRADE);
                        }
                    }
                }
                // 没有找到岗位
                if (StringUtils.isEmpty(post_uuid)) {
                    // 抛出岗位未找到错误
                    postNotExist.method(fs, "job_post_uuid");
                } else {
                    // 找到岗位
                    fs.setValue("job_post_uuid", post_uuid);
                }
                // 没有找到岗位等级
                if (StringUtils.isEmpty(grade_uuid)) {
                    postNotExist.method(fs, CmnConst.FIELD_JOB_POST_GRADE);
                } else {
                    fs.setValue(CmnConst.FIELD_JOB_POST_GRADE, grade_uuid);
                }
            }
        }
        // 导入数据中岗位名称
        String[] role_uuids = (String[]) fs.getObject("role_uuids");
        String roleUuid = "";
        // 角色处理
        roleFor:
        // 循环角色名称
        for (String roleName : role_uuids) {
            // 使用角色名称获取系统数据
            List<FieldSetEntity> roleList = roleData.getFieldSetEntity(roleName);
            // 在系统中没有找到角色名称一致的数据
            if (roleList == null || roleList.size() <= 0) {
                roleNotExist.method(fs, roleName);
            } else {
                // 循环系统中的角色
                for (FieldSetEntity roleFs : roleList) {
                    // 因系统中角色所属公司可多选,在此处前后拼接逗号
                    String roleCompany = "," + roleFs.getString(CmnConst.ORG_LEVEL_UUID) + ",";
                    // 判断角色是否有导入数据的公司
                    if (roleCompany.contains("," + org_level_uuid + ",")) {
                        String role_uuid = roleFs.getString("role_uuid");
                        if (!StringUtils.isEmpty(roleUuid)) {
                            roleUuid += ",";
                        }
                        roleUuid += role_uuid;
                        continue roleFor;
                    }
                }
                // 没有找到角色数据 抛出错误
                roleNotExist.method(fs, roleName);
            }
      // 岗位 & 岗位等级
      List<FieldSetEntity> postDataList = postData.getFieldSetEntity(deptAllName);
      if (postDataList == null || postDataList.size() <= 0) {
         // 没有岗位
         postNotExist.method(fs, "job_post_uuid");
      } else {
         // 记录找到的岗位等级uuid ,多个用逗号分隔
         String grade_uuid = "";
         // 岗位uuid
         String post_uuid = null;
         // 循环系统中岗位数据
         for (FieldSetEntity postFs : postDataList) {
            // 判断岗位是否在部门下 & 岗位名称和导入数据的岗位名称是否相同
            if (dept_uuid.equals(postFs.getString(CmnConst.FIELD_DEPT_UUID)) && job_post_name.equals(postFs.getString(CmnConst.FIELD_JOB_POST_NAME))) {
               // 系统中岗位的uuid
               String job_post_uuid = postFs.getString("job_post_uuid");
               // 岗位uuid不为空时 判断当前postFs 中的岗位uuid是否跟已找到的岗位相同
               if (post_uuid != null && !post_uuid.equals(job_post_uuid)) {
                  continue;
               }
               if (post_uuid == null) {
                  // 记录岗位uuid
                  post_uuid = job_post_uuid;
               }
               // 获取岗位中的岗位等级名称
               String job_grade_name = postFs.getString(CmnConst.FIELD_JOB_GRADE_NAME);
               // 拆分循环导入岗位等级名称
               for (String grade_name : job_post_grade_uuid.split(",")) {
                  // 判断岗位等级名称和系统中相同
                  if (job_grade_name.equals(grade_name)) {
                     if (!StringUtils.isEmpty(grade_uuid)) {
                        grade_uuid += ",";
                     }
                     grade_uuid += postFs.getString(CmnConst.FIELD_JOB_POST_GRADE);
                  }
               }
            }
            // 没有找到岗位
            if (StringUtils.isEmpty(post_uuid)) {
               // 抛出岗位未找到错误
               postNotExist.method(fs, "job_post_uuid");
            } else {
               // 找到岗位
               fs.setValue("job_post_uuid", post_uuid);
            }
            // 没有找到岗位等级
            if (StringUtils.isEmpty(grade_uuid)) {
               postNotExist.method(fs, CmnConst.FIELD_JOB_POST_GRADE);
            } else {
               fs.setValue(CmnConst.FIELD_JOB_POST_GRADE, grade_uuid);
            }
         }
      }
      // 导入数据中岗位名称
      String[] role_uuids = (String[]) fs.getObject("role_uuids");
      String roleUuid = "";
      // 角色处理
      roleFor:
      // 循环角色名称
      for (String roleName : role_uuids) {
         // 使用角色名称获取系统数据
         List<FieldSetEntity> roleList = roleData.getFieldSetEntity(roleName);
         // 在系统中没有找到角色名称一致的数据
         if (roleList == null || roleList.size() <= 0) {
            roleNotExist.method(fs, roleName);
         } else {
            // 循环系统中的角色
            for (FieldSetEntity roleFs : roleList) {
               // 因系统中角色所属公司可多选,在此处前后拼接逗号
               String roleCompany = "," + roleFs.getString(CmnConst.ORG_LEVEL_UUID) + ",";
               // 判断角色是否有导入数据的公司
               if (roleCompany.contains("," + org_level_uuid + ",")) {
                  String role_uuid = roleFs.getString("role_uuid");
                  if (!StringUtils.isEmpty(roleUuid)) {
                     roleUuid += ",";
                  }
                  roleUuid += role_uuid;
                  continue roleFor;
               }
            }
            // 没有找到角色数据 抛出错误
            roleNotExist.method(fs, roleName);
         }
        }
    }
      }
   }
    /**
     * 获取数据位置对象
     *
     * @param fse
     * @return
     */
    private DataLocation getDataLocation(FieldSetEntity fse) {
        if (fse.getString("~dataLocation~") != null) {
            return (DataLocation) fse.getObject("~dataLocation~");
        } else {
            DataLocation dataLocation = new DataLocation(fse);
            fse.setValue("~dataLocation~", dataLocation);
            return dataLocation;
        }
    }
   /**
    * 获取数据位置对象
    *
    * @param fse
    * @return
    */
   private DataLocation getDataLocation(FieldSetEntity fse) {
      if (fse.getString("~dataLocation~") != null) {
         return (DataLocation) fse.getObject("~dataLocation~");
      } else {
         DataLocation dataLocation = new DataLocation(fse);
         fse.setValue("~dataLocation~", dataLocation);
         return dataLocation;
      }
   }
    /**
     * 初始化机构数据
     *
     * @param fse
     * @param level_type
     */
    public void initOrganizationFieldSet(FieldSetEntity fse, String client_uuid, String parentCode,
                                         int level_type) {
        fse.setValue(CmnConst.FIELD_ORG_LEVEL_CODE_PARENT, parentCode);
        fse.setValue(CmnConst.FIELD_ORG_LEVEL_CODE, BaseUtil.createCode(fse, CmnConst.TABLE_PRODUCT_SYS_ORG_LEVELS, CmnConst.FIELD_ORG_LEVEL_CODE, parentCode));
        BaseUtil.createCreatorAndCreationTime(fse);
        fse.remove(CmnConst.ORG_LEVEL_UUID);
        fse.setValue(CmnConst.CLIENT_UUID, client_uuid);
        fse.setValue(CmnConst.FIELD_ORG_LEVEL_STATUS, 0);
        fse.setValue(CmnConst.FIELD_ORG_LEVEL_TYPE, level_type);
        fse.setCodeFieldUpdateFlat(CmnConst.FIELD_ORG_LEVEL_CODE, false);
    }
   /**
    * 初始化机构数据
    *
    * @param fse
    * @param level_type
    */
   public void initOrganizationFieldSet(FieldSetEntity fse, String client_uuid, String parentCode,
                               int level_type) {
      fse.setValue(CmnConst.FIELD_ORG_LEVEL_CODE_PARENT, parentCode);
      fse.setValue(CmnConst.FIELD_ORG_LEVEL_CODE, BaseUtil.createCode(fse, CmnConst.TABLE_PRODUCT_SYS_ORG_LEVELS, CmnConst.FIELD_ORG_LEVEL_CODE, parentCode));
      BaseUtil.createCreatorAndCreationTime(fse);
      fse.remove(CmnConst.ORG_LEVEL_UUID);
      fse.setValue(CmnConst.CLIENT_UUID, client_uuid);
      fse.setValue(CmnConst.FIELD_ORG_LEVEL_STATUS, 0);
      fse.setValue(CmnConst.FIELD_ORG_LEVEL_TYPE, level_type);
      fse.setCodeFieldUpdateFlat(CmnConst.FIELD_ORG_LEVEL_CODE, false);
   }
    public void managerPermissionValidation(ImportErrorEntity errorEntity, SystemUser user) throws
            BaseException {
        FieldSetEntity managerFieldSet = user.getCurrentManager();
        if (managerFieldSet == null || user.getUserType() != 2) {
            errorEntity.newThrowBaseException("没有导入此数据的权限,请联系统管理员");
        } else if (StringUtils.isEmpty(managerFieldSet.getString(CmnConst.ORG_LEVEL_UUID))) {
            errorEntity.newThrowBaseException("公司权限不存在,请联系统管理员");
        }
    }
   public void managerPermissionValidation(ImportErrorEntity errorEntity, SystemUser user) throws
         BaseException {
      FieldSetEntity managerFieldSet = user.getCurrentManager();
      if (managerFieldSet == null || user.getUserType() != 2) {
         errorEntity.newThrowBaseException("没有导入此数据的权限,请联系统管理员");
      } else if (StringUtils.isEmpty(managerFieldSet.getString(CmnConst.ORG_LEVEL_UUID))) {
         errorEntity.newThrowBaseException("公司权限不存在,请联系统管理员");
      }
   }
    /**
     * 错误位置
     */
    class DataLocation {
   /**
    * 错误位置
    */
   class DataLocation {
        //当前行
        private Integer rowIndex;
        //列名
        private List<String> colNameList;
        //字段列索引
        private Map<String, String> fieldIndex;
      //当前行
      private Integer rowIndex;
      //列名
      private List<String> colNameList;
      //字段列索引
      private Map<String, String> fieldIndex;
        DataLocation(FieldSetEntity fse) {
            //当前行
            this.rowIndex = fse.getInteger("~row~");
            //列名
            this.colNameList = (List<String>) fse.getObject("~colName~");
            //字段列索引
            this.fieldIndex = (Map<String, String>) fse.getObject("~fieldIndex~");
        }
      DataLocation(FieldSetEntity fse) {
         //当前行
         this.rowIndex = fse.getInteger("~row~");
         //列名
         this.colNameList = (List<String>) fse.getObject("~colName~");
         //字段列索引
         this.fieldIndex = (Map<String, String>) fse.getObject("~fieldIndex~");
      }
        /**
         * 获取当前行索引
         *
         * @return
         */
        public Integer getRowIndex() {
            return rowIndex + 1;
        }
      /**
       * 获取当前行索引
       *
       * @return
       */
      public Integer getRowIndex() {
         return rowIndex + 1;
      }
        /**
         * 获取当前列索引
         *
         * @param fieldName
         * @return
         */
        public String getColIndex(String fieldName) {
            if (fieldIndex == null || StringUtils.isEmpty(fieldName)) {
                return null;
            }
            String colIndex = fieldIndex.get(fieldName);
            return !StringUtils.isEmpty(colIndex) ? String.valueOf(Integer.valueOf(colIndex) + 1) : "未知";
        }
      /**
       * 获取当前列索引
       *
       * @param fieldName
       * @return
       */
      public String getColIndex(String fieldName) {
         if (fieldIndex == null || StringUtils.isEmpty(fieldName)) {
            return null;
         }
         String colIndex = fieldIndex.get(fieldName);
         return !StringUtils.isEmpty(colIndex) ? String.valueOf(Integer.valueOf(colIndex) + 1) : "未知";
      }
        /**
         * 获取当前列名称
         *
         * @param fieldName
         * @return
         */
        public String getColName(String fieldName) {
            String colIndex = getColIndex(fieldName);
            if (this.colNameList == null || colIndex == null || "未知".equals(colIndex)) {
                return "未知列名";
            }
            return colNameList.get(Integer.valueOf(colIndex) - 1);
        }
      /**
       * 获取当前列名称
       *
       * @param fieldName
       * @return
       */
      public String getColName(String fieldName) {
         String colIndex = getColIndex(fieldName);
         if (this.colNameList == null || colIndex == null || "未知".equals(colIndex)) {
            return "未知列名";
         }
         return colNameList.get(Integer.valueOf(colIndex) - 1);
      }
    }
   }
    static class ImportErrorEntity {
   static class ImportErrorEntity {
        interface errorMsg {
            errorMsg append(Object errorMsg);
        }
      interface errorMsg {
         errorMsg append(Object errorMsg);
      }
        private Map<Integer, String> errorMap;
      private Map<Integer, String> errorMap;
        private boolean isError = false;
      private boolean isError = false;
        /**
         * 新增错误 自动换行
         *
         * @param row
         * @param errorMsg
         * @return
         */
        public errorMsg addError(int row, String errorMsg) {
            if (errorMap == null) {
                errorMap = Maps.newHashMap();
            }
            isError = true;
            String error = errorMap.get(row);
            if (!StringUtils.isEmpty(error)) {
                error += "\n";
            } else {
                error = "";
            }
            error += errorMsg;
            errorMap.put(row, error);
            return (emg) -> this.append(row, String.valueOf(emg));
        }
      /**
       * 新增错误 自动换行
       *
       * @param row
       * @param errorMsg
       * @return
       */
      public errorMsg addError(int row, String errorMsg) {
         if (errorMap == null) {
            errorMap = Maps.newHashMap();
         }
         isError = true;
         String error = errorMap.get(row);
         if (!StringUtils.isEmpty(error)) {
            error += "\n";
         } else {
            error = "";
         }
         error += errorMsg;
         errorMap.put(row, error);
         return (emg) -> this.append(row, String.valueOf(emg));
      }
        /**
         * 合并错误
         *
         * @param errorEntity
         * @return
         */
        public ImportErrorEntity mergeError(ImportErrorEntity errorEntity) {
            Map<Integer, String> errorMap = errorEntity.errorMap;
            if (errorEntity.isError) {
                if (this.errorMap == null) {
                    this.errorMap = errorMap;
                    this.isError = true;
                    return this;
                } else {
                    errorMap.forEach((k, v) -> {
                        String error = this.errorMap.get(k);
                        if (!StringUtils.isEmpty(error)) {
                            error += "\n";
                        } else {
                            error = "";
                        }
                        error += v;
                        this.isError = true;
                        this.errorMap.put(k, error);
                    });
                }
            }
            return this;
        }
      /**
       * 合并错误
       *
       * @param errorEntity
       * @return
       */
      public ImportErrorEntity mergeError(ImportErrorEntity errorEntity) {
         Map<Integer, String> errorMap = errorEntity.errorMap;
         if (errorEntity.isError) {
            if (this.errorMap == null) {
               this.errorMap = errorMap;
               this.isError = true;
               return this;
            } else {
               errorMap.forEach((k, v) -> {
                  String error = this.errorMap.get(k);
                  if (!StringUtils.isEmpty(error)) {
                     error += "\n";
                  } else {
                     error = "";
                  }
                  error += v;
                  this.isError = true;
                  this.errorMap.put(k, error);
               });
            }
         }
         return this;
      }
        /**
         * 拼接错误
         *
         * @param row
         * @param errorMsg
         * @return
         */
        public errorMsg append(int row, String errorMsg) {
            if (errorMap == null) {
                errorMap = Maps.newHashMap();
            }
            isError = true;
            String error = errorMap.get(row);
            if (StringUtils.isEmpty(error)) {
                error = "";
            }
            error += errorMsg;
            errorMap.put(row, error);
            return (emg) -> this.append(row, String.valueOf(emg));
        }
      /**
       * 拼接错误
       *
       * @param row
       * @param errorMsg
       * @return
       */
      public errorMsg append(int row, String errorMsg) {
         if (errorMap == null) {
            errorMap = Maps.newHashMap();
         }
         isError = true;
         String error = errorMap.get(row);
         if (StringUtils.isEmpty(error)) {
            error = "";
         }
         error += errorMsg;
         errorMap.put(row, error);
         return (emg) -> this.append(row, String.valueOf(emg));
      }
        public void newThrowBaseException() {
            newThrowBaseException(null, null);
        }
      public void newThrowBaseException() {
         newThrowBaseException(null, null);
      }
        public void newThrowBaseException(String msg, Exception exception) {
            if (!StringUtils.isEmpty(msg)) {
                throw new BaseException(CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getValue(), msg);
            } else if (errorMap != null) {
                List<Integer> es = Lists.newArrayList(errorMap.keySet().iterator());
                StringBuilder errorMsg = new StringBuilder();
                for (Integer e : es) {
                    String error = errorMap.get(e);
                    if (!StringUtils.isEmpty(error)) {
                        errorMsg.append(error).append("\n");
                    }
                }
                if (errorMsg.length() > 0) {
                    if (exception != null) {
                        throw new BaseException(CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getValue(), errorMsg.toString(), exception);
                    } else {
                        throw new BaseException(CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getValue(), errorMsg.toString());
                    }
                }
                throw new BaseException(CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getValue(), " 未知错误,请联系管理员,error message is empty for 'throwExportDataError' Method ");
            }
            if (exception != null) {
                throw new BaseException(CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getValue(), " 未知错误,请联系管理员,error message is empty for 'throwExportDataError' Method ", exception);
            }
            throw new BaseException(CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getValue(), " 未知错误,请联系管理员,error message is empty for 'throwExportDataError' Method ");
        }
      public void newThrowBaseException(String msg, Exception exception) {
         if (!StringUtils.isEmpty(msg)) {
            throw new BaseException(CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getValue(), msg);
         } else if (errorMap != null) {
            List<Integer> es = Lists.newArrayList(errorMap.keySet().iterator());
            StringBuilder errorMsg = new StringBuilder();
            for (Integer e : es) {
               String error = errorMap.get(e);
               if (!StringUtils.isEmpty(error)) {
                  errorMsg.append(error).append("\n");
               }
            }
            if (errorMsg.length() > 0) {
               if (exception != null) {
                  throw new BaseException(CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getValue(), errorMsg.toString(), exception);
               } else {
                  throw new BaseException(CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getValue(), errorMsg.toString());
               }
            }
            throw new BaseException(CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getValue(), " 未知错误,请联系管理员,error message is empty for 'throwExportDataError' Method ");
         }
         if (exception != null) {
            throw new BaseException(CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getValue(), " 未知错误,请联系管理员,error message is empty for 'throwExportDataError' Method ", exception);
         }
         throw new BaseException(CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getValue(), " 未知错误,请联系管理员,error message is empty for 'throwExportDataError' Method ");
      }
        public void newThrowBaseException(String msg) {
            newThrowBaseException(msg, null);
        }
      public void newThrowBaseException(String msg) {
         newThrowBaseException(msg, null);
      }
    }
   }
}