1.业务场景

在数据导入的时候,我们又一张表单,这张表单上有 一个用户控件数据,在平台中我们的用户控件是对应两个字段,一个字段名,一个字段ID。但是客户在录入excel的时候,一般只会录入用户名,这个就需要我们在导入的时候,能够根据用户名查找对应的用户ID,将用户ID一并插入数据库。

2. 实现分析

在导入之前,我们先对数据进行处理,就是根据用户名查找对应的用户ID。

这里需要解决一个问题,我们需要通过用户名去查找用户ID,用户数据库和表单数据是分离的,这就需要我们先创建一个数据源去访问用户表的数据,

2.1 创建数据源

在表单的微服务上创建一个数据源指向用户数据库。

2.2 创建一个表单

表单尽量简单点,我们就创建两个字段,一个是用户控件字段。

后端生成的数据库如下:

2.3 制作EXCEL上传模板

这里选择用户名字段。

2.4 干预方式

在上传的时候,干预的方式有两种:

  • 使用脚本干预
    这种干预方式,在于方便,在线就可以编写,缺点就是性能比较差,且不方便调试。
  • 编写类进行干预
    这种方式是编写java类进行干预,优点是方便调试,性能好,缺点是需要开发代码,且需要进行编译,不方便热部署。

2.4.1 编写干预脚本

我们需要在上传前,先将数据准备好,即需要根据用户名获取用户ID.

这里有两个方法:

方法 备注
beforeInsert JsonResult beforeInsert(List<Map<String,Object>> data) ,参数是整个导入数据,如果返回失败,那么会不进行导入。
handRow JsonResult handRow(Map<String,Object> data),这个函数如果返回失败,这行数据会跳过
import com.redxun.common.base.entity.JsonResult;
import java.util.Map;
import com.redxun.common.utils.SpringUtil;
import com.redxun.db.CommonDao;
import com.redxun.common.tool.StringUtils;

//对每一行进行判断处理
JsonResult handRow(Map<String,Object> data){
    //return JsonResult.Fail("出错原因");
    return JsonResult.Success();
}
//对读取的数据进行处理
JsonResult beforeInsert(List<Map<String,Object>> data){
    CommonDao dao=SpringUtil.getBean(CommonDao.class);
    for (int i = 0; i < data.size(); i++) {
        Map<String, Object> map = data.get(i);
        if(map==null){
            return JsonResult.Fail("第" + i +"数据为空");
        }

        if(StringUtils.isNotEmpty(map.get("F_USER_NAME"))){    
            String name=map.get("F_USER_NAME");
            String sql="select USER_ID_ from OS_USER  where FULLNAME_='"+name+"'";
            String  userId=(String) dao.queryOne("user", sql);
            if(StringUtils.isNotEmpty(userId)){
                map.put("F_USER",userId);
            }
        }
    }
    return JsonResult.Success();
}

这里我们编写一个查询语句,根据名称查找ID。然后在当前行 将 用户ID进行插入,这样就能将数据同时插入。

2.4.1.1 效果

2.4.2 使用java类

2.4.2.1 编写java代码

在jpaas-form 服务项目中编写代码如下:

@Service
public class UserImportDataHandler implements ImportDataHandler {
    @Override
    public String getName() {
        return "用户数据导入";
    }

    @Override
    public JsonResult beforeInsert(List<Map<String, Object>> data) {
        System.err.println(JSONObject.toJSONString(data));
        return JsonResult.Success();
    }
}
  • 需要实现接口 ImportDataHandler
  • 需要增加注解 @Service
  • 接口有两个方法 ,一个是整体插入之前进行处理,一个是逐行进行处理。

2.4.2.2 配置实现处理类

  1. 实现java类后,我们需要重启jpaas-form

  2. 配置

这样就可以选择到我们实现的类了。

  1. 我们可以在实现的方法中打断点进行调试。
文档更新时间: 2022-07-08 12:34   作者:zyg