JEPaaS 社区

 找回密码
 立即注册
JEPaaS低代码平台-官网
查看: 4186|回复: 1

Excel导入时编写自定义service对数据进行处理

[复制链接]

44

主题

150

帖子

671

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
671
发表于 2022-4-1 16:20:53 | 显示全部楼层 |阅读模式
案例效果
自定义service实现Excel导入前后,根据业务对Excel中的数据进行处理,此案例以物料管理为例,实现以下业务逻辑:
1、Excel导入前判断Excel中数据填写的是否正确,数据正确的前提下,根据物料编码进行判断,如果数据库中已经存在此物料,就在前台页面给出提示:’此物料已经存在,确定是否导入’;
2、点击【导入】,已经存在的物料就修改库存,没存在的直接导入到数据库中;

实现思路
  • 先在系统中做一个物料管理的功能;
  • 在’excel数据导入’功能中增加配置,配置添加完成之后,点击【导入数据】按钮,可以把Excel中的数据导入到物料管理这个功能对应的表中;
  • 编写后台接口,实现’Excel导入前判断Excel中数据填写的是否正确,数据正确的前提下,根据物料编码进行判断,如果数据库中已经存在此物料,就在前台页面给出提示:”此物料已经存在,确定是否导入!”‘的逻辑;
  • 进入导入明细页面,修改数据处理方式为’执行类’,执行类与执行方法中填写上自己写的service名与方法名;
  • 编写后台接口,实现’点击【导入】,已经存在的物料就修改库存,没存在的直接导入到数据库中’的业务逻辑;
  • 在’excel数据导入’详细页面,将执行后的执行方式修改为’执行类’,并在执行类与执行方法中配置上后台写的service名与方法名;
操作步骤

1、先在系统中做一个物料管理的功能;


2、在’excel数据导入’功能中增加配置,配置添加完成之后,点击【导入数据】按钮,可以把Excel中的数据导入到物料管理这个功能对应的表中


3、编写后台接口,实现’Excel导入前判断Excel中数据填写的是否正确,数据正确的前提下,根据物料编码进行判断,如果数据库中已经存在此物料,就在前台页面给出提示:”此物料已经存在,确定是否导入!”‘的逻辑;

4、进入导入明细页面,修改数据处理方式为’执行类’,执行类与执行方法中填写上自己写的service名与方法名;


5、编写后台接口,实现’点击【导入】,已经存在的物料就修改库存,没存在的直接导入到数据库中’的业务逻辑;

6、在’excel数据导入’详细页面,将执行后的执行方式修改为’执行类’,并在执行类与执行方法中配置上后台写的service名与方法名;
相关代码


  1. @Override
  2.     public JSONObject impData(String code, String fileKey, String groupTemId, HttpServletRequest request) {
  3.         JSONObject returnVo = new JSONObject();
  4.         List<DynaBean> datas = new ArrayList<DynaBean>();
  5.         //声明返回值
  6.         JSONObject returnObj = new JSONObject();
  7.         if (StringUtil.isNotEmpty(groupTemId)) {
  8.             returnObj.put("groupTemId", groupTemId);
  9.         }
  10.         DynaBean group = serviceTemplate.selectOne("JE_CORE_EXCELGROUP", " AND GROUPCODE='" + code + "'");
  11.         //声明变量集合,用于解析whereSql的通配符
  12.         Set<Map.Entry> ddSet = new HashSet<Map.Entry>();
  13.         //加入登录信息
  14.         EndUser currentUser = SecurityUserHolder.getCurrentUser();
  15.         ddSet.addAll(SecurityUserHolder.getCurrentInfo(currentUser).entrySet());
  16.         //加入用户变量
  17.         ddSet.addAll(FrontCacheManager.getCacheValues().entrySet());
  18.         ddSet.addAll(BackCacheManager.getCacheValues().entrySet());
  19.         //加入系统设置
  20.         ddSet.addAll(WebUtils.getAllSysVar().entrySet());
  21.         ddSet.addAll(getRequestParams(request).entrySet());
  22.         List<ExcelReturnVo> returnMsgs = new ArrayList<ExcelReturnVo>();
  23.         //系统处理方式
  24.         //数据预览
  25.         String dataPreview = group.getStr("EXCELGROUP_PRVIEW");
  26.         //获取文件流
  27.         FileBO fileBO = documentBusService.readFile(fileKey);
  28.         InputStream inputStream = fileBO.getFile();
  29.         byte[] bytes = IoUtil.readBytes(inputStream);

  30.         //声明默认值
  31.         List<DynaBean> sheets = serviceTemplate.selectList("JE_CORE_EXCELSHEET", " AND JE_CORE_EXCELGROUP_ID='" + group.getStr("JE_CORE_EXCELGROUP_ID") + "' ORDER BY SY_ORDERINDEX");
  32.         Map<String, List<DynaBean>> results = new HashMap<>();
  33.         List<String> sheetNames = new ArrayList<>();
  34.         JSONArray previewSheetInfo = new JSONArray();
  35.         Map<String, Map<String, DynaBean>> allFieldInfos = new HashMap<>();
  36.         for (int sheetIndex = 0; sheetIndex < sheets.size(); sheetIndex++) {
  37.             DynaBean sheet = sheets.get(sheetIndex);
  38.             int sheetOrder = sheet.getInt("SY_ORDERINDEX", 1) - 1;
  39.             String key = "sheet" + sheetOrder;
  40.             //声明字段信息
  41.             List<DynaBean> fields = serviceTemplate.selectList("JE_CORE_EXCELFIELD", " AND JE_CORE_EXCELSHEET_ID='" + sheet.getStr("JE_CORE_EXCELSHEET_ID") + "' ORDER BY SY_ORDERINDEX");

  42.             //读取文件
  43.             ExcelReader reader = new ExcelReader(IoUtil.toStream(bytes), sheetOrder, true);
  44.             String tableCode = sheet.getStr("TABLECODE");
  45.             int startRow = sheet.getInt("STARTROWS", 0);
  46.             int endRow = sheet.getInt("EXCELSHEET_JSX", 0);
  47.             String funcCode = sheet.getStr("FUNCCODE");
  48.             String defaultFuncVal = sheet.getStr("DATA_DEFAULTVALUE");
  49.             String defaultCreateInfo = sheet.getStr("DATA_CREATEINFO");
  50.             String sheetName = reader.getSheet().getSheetName();
  51.             sheetNames.add(sheetName);
  52.             sheet.set("SHEETNAME", sheetName);
  53.             //声明默认值
  54.             DynaBean defaultValues = new DynaBean();
  55.             if ("1".equals(defaultFuncVal)) {
  56.                 serviceTemplate.buildFuncDefaultValues(funcCode, defaultValues);
  57.             }
  58.             List<List<Object>> lists = null;
  59.             if (endRow > startRow && startRow >= 0) {
  60.                 lists = reader.read(startRow, endRow);
  61.             } else {
  62.                 lists = reader.read(startRow - 1);
  63.             }

  64.             Map<String, DynaBean> fieldInfos = new HashMap<String, DynaBean>();
  65.             Map<String, DynaBean> fieldCodeInfos = new HashMap<String, DynaBean>();
  66.             //自动带值数据集
  67.             Map<String, List<DynaBean>> dzValues = new HashMap<String, List<DynaBean>>();
  68.             //编号字段
  69.             List<String> codeFields = new ArrayList<String>();
  70.             //带值字段集合
  71.             List<String> dzFields = new ArrayList<String>();
  72.             List<String> kxjsFields = new ArrayList<String>();
  73.             //日期处理类型
  74.             List<String> dateFields = new ArrayList<String>();
  75.             List<String> dateTimeFields = new ArrayList<String>();
  76.             for (DynaBean field : fields) {
  77.                 String columnName = field.getStr("EXCELFIELD_COLUMN");
  78.                 fieldCodeInfos.put(field.getStr("EXCELFIELD_CODE"), field);
  79.                 //处理默认值
  80.                 String defaultValue = field.getStr("EXCELFIELD_VALUE");
  81.                 if (!Strings.isNullOrEmpty(defaultValue) && StringUtil.isNotEmpty(defaultValue) && defaultValue.startsWith("@") && defaultValue.endsWith("@")) {
  82.                     defaultValue = "{" + defaultValue + "}";
  83.                 }
  84.                 if (!Strings.isNullOrEmpty(defaultValue)) {
  85.                     defaultValues.set(field.getStr("EXCELFIELD_CODE"), StringUtil.parseKeyWord(defaultValue, ddSet));
  86.                 }
  87.                 if (StringUtil.isNotEmpty(columnName)) {
  88.                     fieldInfos.put(columnName, field);
  89.                 }
  90.                 if ("codefield".equals(field.getStr("EXCELFIELD_XTYPE"))) {
  91.                     codeFields.add(field.getStr("EXCELFIELD_CODE"));
  92.                 }
  93.                 if ("datefield".equals(field.getStr("EXCELFIELD_XTYPE"))) {
  94.                     dateFields.add(field.getStr("EXCELFIELD_CODE"));
  95.                 }
  96.                 if ("datetimefield".equals(field.getStr("EXCELFIELD_XTYPE"))) {
  97.                     dateTimeFields.add(field.getStr("EXCELFIELD_CODE"));
  98.                 }
  99.                 if ("1".equals(field.getStr("EXCELFIELD_QCKXJS"))) {
  100.                     kxjsFields.add(field.getStr("EXCELFIELD_CODE"));
  101.                 }
  102.                 excelManager.parseAllDzValues(field, ddSet, dzValues, dzFields, request);
  103.             }
  104.             allFieldInfos.put(key, fieldCodeInfos);
  105.             for (List<Object> vals : lists) {
  106.                 DynaBean dynaBean = new DynaBean();
  107.                 if ("1".equals(defaultFuncVal)) {
  108.                     dynaBean.setValues(defaultValues.clone().getValues());
  109.                 }
  110.                 if ("1".equals(defaultCreateInfo)) {
  111.                     serviceTemplate.buildModelCreateInfo(dynaBean);
  112.                 }
  113.                 if (StringUtil.isNotEmpty(tableCode)) {
  114.                     dynaBean.set(BeanUtils.KEY_TABLE_CODE, tableCode);
  115.                 }
  116.                 for (int i = 0; i < vals.size(); i++) {
  117.                     String nowName = excelManager.getExcelColumnName(i);
  118.                     if (fieldInfos.containsKey(nowName)) {
  119.                         DynaBean field = fieldInfos.get(nowName);
  120.                         String fieldCode = field.getStr("EXCELFIELD_CODE");
  121.                         //去除字段值
  122.                         Object excelValue = vals.get(i);
  123.                         if (!Objects.isNull(excelValue) && !Strings.isNullOrEmpty(excelValue.toString())) {
  124.                             dynaBean.set(fieldCode, excelValue);
  125.                         }
  126.                     }
  127.                 }
  128.                 for (String dzField : dzFields) {
  129.                     DynaBean fieldInfo = fieldCodeInfos.get(dzField);
  130.                     excelManager.doSetBeanDzValue(fieldInfo, dynaBean, dzValues, ddSet);
  131.                 }
  132.                 for (String dateField : dateFields) {
  133.                     String dateValue = dynaBean.getStr(dateField);
  134.                     if (!Strings.isNullOrEmpty(dateValue)) {
  135.                         try {
  136.                             dynaBean.setStr(dateField, DateUtils.formatDate(DateUtils.getDate(dateValue)));
  137.                         } catch (Exception e) {
  138.                             throw new RuntimeException("日期格式错误");
  139.                         }
  140.                     }
  141.                 }

  142.                 for (String dateTimeField : dateTimeFields) {
  143.                     String dateValue = dynaBean.getStr(dateTimeField);
  144.                     if (!Strings.isNullOrEmpty(dateValue)) {
  145.                         try {
  146.                             dynaBean.setStr(dateTimeField, DateUtils.formatDateTime(DateUtils.getDate(dateValue)));
  147.                         } catch (Exception e) {
  148.                             throw new RuntimeException("日期格式错误");
  149.                         }
  150.                     }
  151.                 }

  152.                 for (String kxjsCode : kxjsFields) {
  153.                     String val = dynaBean.getStr(kxjsCode);
  154.                     if (StringUtil.isNotEmpty(val)) {
  155.                         String regx = "^((-?\\d+.?\\d*)[Ee]{1}(-?\\d+))$";
  156.                         Pattern pattern = Pattern.compile(regx);
  157.                         if (pattern.matcher(val).matches()) {
  158. //                             DecimalFormat df = new DecimalFormat("0");
  159. //                             val = df.format(val);
  160.                             BigDecimal b = new BigDecimal(val);
  161.                             val = b.toPlainString();
  162.                         }
  163.                     }
  164.                     dynaBean.set(kxjsCode, val);
  165.                 }
  166.                 dynaBean.set("__CODE__", "1");
  167.                 dynaBean.set("__MSG__", "正确");
  168.                 datas.add(dynaBean);
  169.             }
  170.             String beforeClType = sheet.getStr("BEFORE_CLTYPE");
  171.         }
  172.         ExcelReturnVo excelReturnVo = tainmaExcelDaotuWuliao(datas);
  173.         returnVo.put("excelReturnVo",excelReturnVo);
  174.         return returnVo;
  175.     }

  176. public ExcelReturnVo tainmaExcelDaotuWuliao(List<DynaBean> list) {
  177.         ExcelReturnVo returnVo = new ExcelReturnVo(1, "");
  178.         List<DynaBean> vals = list;
  179.         StringBuffer errormes = new StringBuffer();
  180.         for (DynaBean val : vals) {
  181.             //物料代码
  182.             String name = val.getStr("WLXX_WLDM");
  183.             //组织代码
  184.             String zzdm = val.getStr("WLXX_ZZDM_CODE");
  185.             //组织分类
  186.             String zzfl = val.getStr("WLXX_ZZFL_CODE");
  187.             //产业基地
  188.             String cyjd = val.getStr("WLXX_CYJD");
  189.             //子库
  190.             String zk = val.getStr("WLXX_ZK");
  191.             //货位
  192.             String hw = val.getStr("WLXX_HW");
  193.             //批号
  194.             String ph = val.getStr("WLXX_PH");
  195.             //数量
  196.             String sl = val.getStr("WLXX_SL");
  197.             //计量单位
  198.             String jldw = val.getStr("WLXX_JLDW_CODE");
  199.             //入库日期
  200.             String rkrq = val.getStr("WLXX_RKRQ");

  201.             if (!Strings.isNullOrEmpty(name)) {
  202.                 List<DynaBean> uses =
  203.                         metaService.select("PRO_FLOW_WLXX", ConditionsWrapper.builder().eq("WLXX_WLDM", name));
  204.                 if (uses.size() > 0) {
  205.                     errormes.append(name + "物料已经存在;</br>");
  206.                     if (returnVo.getCode() != 2) {
  207.                         //信息重复
  208.                         returnVo.setCode(3);
  209.                     }
  210.                 }
  211.             } else {
  212.                 errormes.append(name + "信息不全,");
  213.                 //信息不全
  214.                 returnVo.setCode(3);
  215.             }
  216.         }
  217.         if (errormes.length() > 0) {
  218.             if(returnVo.getCode()==2){
  219.                 errormes.append("请检查数据后再导入!");
  220.             }else {
  221.                 errormes.append("请确认是否导入!");
  222.             }
  223.         }
  224.         if(list.size()==0){
  225.             errormes = new StringBuffer("没有数据!");
  226.             returnVo.setCode(2);
  227.         }
  228.         if(returnVo.getCode()==1){
  229.             errormes = new StringBuffer("数据正确,是否导入!");
  230.         }
  231.         returnVo.setMsg(errormes.toString());
  232.         return returnVo;
  233.     }
复制代码

  1. @Override
  2.     public ExcelReturnVo implData(ExcelParamVo paramVo) {
  3.         ExcelReturnVo returnVo = new ExcelReturnVo(1, "成功");
  4.         Map<String, List<DynaBean>> maps = paramVo.getAllValues();
  5.         List<DynaBean> list = maps.get("sheet0");
  6.         for (DynaBean dynaBean : list) {
  7.             String xydm = dynaBean.getStr("WLXX_WLDM");
  8.             List<DynaBean> uses =
  9.                     metaService.select("PRO_FLOW_WLXX", ConditionsWrapper.builder().eq("WLXX_WLDM", xydm));
  10.             if (uses.size() > 0) {
  11.                 int excelSl = Integer.parseInt( dynaBean.getStr("WLXX_SL"));
  12.                 for(DynaBean dynaBean1:uses){
  13.                     //获取到数据库原有的库存
  14.                     String oldsl = dynaBean1.getStr("WLXX_SL");
  15.                     int oldslInt =Integer.parseInt(oldsl);
  16.                     // 获取到主键
  17.                     String id = dynaBean1.getStr("PRO_FLOW_WLXX_ID");
  18.                     // 更改库存:原来的+ excel导入的
  19.                     int  nowvalue = (oldslInt + excelSl);
  20.                     dynaBean.setStr("PRO_FLOW_WLXX_ID",id);
  21.                     dynaBean.setStr("WLXX_SL",String.valueOf(nowvalue));
  22.                     metaService.update(dynaBean);
  23.                 }
  24.             }else {

  25.                 if(Strings.isNullOrEmpty(xydm) || xydm.equalsIgnoreCase("<系统自动生成>")){
  26.                     //如果是插入新数据,有编号自动生成情况的,获取自动生成字段的编号
  27.                     String wulabm = commonService.buildCode("WLXX_WLDM", "PRO_FLOW_WLXX", dynaBean);
  28.                     dynaBean.setStr("WLXX_WLDM",wulabm);
  29.                 }
  30.                 metaService.insert(dynaBean);
  31.             }
  32.         }
  33.         return returnVo;
  34.     }
复制代码



回复

使用道具 举报

0

主题

2

帖子

80

积分

注册会员

Rank: 2

积分
80
发表于 2024-1-30 19:48:03 | 显示全部楼层
public JSONObject impData(String code, String fileKey, String groupTemId, HttpServletRequest request) {
这里面的参数都是什么意思?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|JEPaaS 低代码平台社区 ( 京ICP备18023569号 )

GMT+8, 2024-3-29 15:10 , Processed in 0.067680 second(s), 20 queries .

Powered by 北京凯特伟业科技有限公司

Copyright © 2001-2021, JEPaaS.COM

快速回复 返回顶部 返回列表