package net.tccn.service; import com.lxyer.excel.poi.ExcelKit; import net.tccn.base.JBean; import net.tccn.base.Kv; import net.tccn.dbq.Field; import net.tccn.meta.MetaTable; import net.tccn.plat.SysPlat; import org.redkale.net.http.RestMapping; import org.redkale.net.http.RestParam; import org.redkale.net.http.RestService; import javax.annotation.Resource; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import static java.util.Arrays.asList; /** * @author: liangxianyou at 2018/10/24 10:57. */ @RestService(automapping = true, comment = "文件服务") public class _FileService extends BaseService { private final static String[] FIELDS = {"field", "cate", "must", "remark1", "remark2", "tag", "selects", "column", "filter", "ck", "edit"}; @Resource private QtaskService qtaskService; @RestMapping(name = "sheets", comment = "得到所有的sheetName") public List sheets(String filePath) { List sheets = new ArrayList<>(); try { File file = new File(webroot, filePath); if (file.exists()) { sheets = ExcelKit.getSheetNames(file); } } catch (IOException e) { e.printStackTrace(); } return sheets.stream().filter(x -> { return !x.contains("版本记录") && !x.contains("表说明") && !x.contains("表名称"); }).collect(Collectors.toList()); } @RestMapping(name = "data", comment = "得到文件数据") public JBean data(String filePath, @RestParam(name = "platToken") String token) { JBean jBean = new JBean(); SysPlat sysPlat = qtaskService.getSysPlat(token); File file = new File(webroot, filePath); if (file.exists()) { try { Map> map = ExcelKit.readExcelAll(file, FIELDS); Kv data = Kv.of(); map.forEach((k, v) -> { if (v.size() > 2) { data.put(k.replace(" ", ""), toCols(v)); } }); StringBuffer buf = new StringBuffer(); buf.append("for d in meta_cols\n" + " filter d.name in ["); data.values().forEach(x -> { buf.append("'").append(x.getName()).append("',"); }); buf.deleteCharAt(buf.length() - 1); buf.append("] and d.sysPlatId=='" + sysPlat.getKey() + "'\n" + " return d.name"); List hv = MetaTable.dao.find(buf.toString(), String.class); Kv res = Kv.of(); data.forEach((k, v) -> { Kv kv = Kv.of(); res.put(k, kv.set("name", v.getName()) .set("hv", hv.contains(v.getName()) ? 1 : 0) .set("comment", v.getComment()) ); }); jBean.setBody(res); } catch (IOException e) { e.printStackTrace(); } } return jBean; } @RestMapping(name = "sheet_data", comment = "得到sheet数据") public JBean sheetData(String filePath, String sheetName, @RestParam(name = "platToken") String token) { JBean jBean = new JBean(); SysPlat sysPlat = qtaskService.getSysPlat(token); File file = new File(webroot, filePath); try { List list = ExcelKit.readExcel(file, FIELDS, sheetName); MetaTable metaTable = toCols(list); jBean.setBody(metaTable); } catch (IOException e) { e.printStackTrace(); jBean.set(-1, String.format("读取sheet[%s]失败", sheetName)); } return jBean; } @RestMapping(name = "import_metatable", comment = "导入excel数据到metatable") public JBean importMetaTable(@RestParam(name = "sheetArr", comment = "sheet名") String[] sheetArr, @RestParam(name = "filePath", comment = "文件路径") String filePath, @RestParam(name = "platToken") String token) { JBean jBean = new JBean(); SysPlat sysPlat = qtaskService.getSysPlat(token); File file = new File(webroot, filePath); String[] fields = {"field", "cate", "must", "remark1", "remark2", "tag", "selects", "column", "filter", "ck", "edit"}; try { Map> map = ExcelKit.readExcelAll(file, fields); map.forEach((k, v) -> { if (v.size() > 2) { MetaTable table = toCols(v); for (String sn : sheetArr) { if (table.getName().equals(sn)) { //在选中列表中 MetaTable metaTable = new MetaTable(); metaTable.setSysPlatId(sysPlat.getKey()); metaTable.setName(table.getName()); MetaTable _metaTable = MetaTable.dao.findFirst(metaTable); if (_metaTable == null) {//库里没有数据保存 table.setSysPlatId(sysPlat.getKey()); table.save(); } break; } } } }); } catch (IOException e) { e.printStackTrace(); } return jBean; } /** * 组装元数据 */ private MetaTable toCols(List list) { //Kv col = Kv.of(); MetaTable metaTable = new MetaTable(); list.remove(1);//list[0] head info Map rowHead = list.remove(0); String comment = getComment(rowHead);//list[1] comment, String tableName = getTableName(rowHead); //col.set("name", tableName).set("comment", comment); metaTable.setName(tableName); metaTable.setComment(comment); //所有字段 List items = new ArrayList<>(); //展示的字段 List shows = new ArrayList<>(); //编辑的字段 List edits = new ArrayList<>(); //查询过滤用字段 List filters = new ArrayList<>(); list.forEach(x -> { String colName = x.getOrDefault("field", "") + ""; Field item = new Field(); item.setName(colName); item.setLabel(x.getOrDefault("remark1", "") + ""); item.setType(x.getOrDefault("cate", "") + ""); item.setInType(x.getOrDefault("tag", "") + ""); item.setInExt(x.getOrDefault("selects", "") + ""); items.add(item); if ("1".equals(x.getOrDefault("column", "") + "")) { shows.add(colName); } if ("1".equals(x.getOrDefault("edit", "") + "")) { edits.add(Kv.of("col", colName)); } if (x.get("filter") != null && !"".equals(x.get("filter") + "")) { String filter = x.getOrDefault("filter", "") + ""; filter = filter.replace("1", "EQUAL"); filter = filter.replace("!1", "NOTEQUAL"); filter = filter.replace("like", "LIKE"); filters.add(Kv.of("name", item).set("filterType", asList(filter.split(",")))); } }); metaTable.setItems(items); //metaTable.setShows(shows); //metaTable.setEdits(edits); //metaTable.setFilters(filters); return metaTable; } private String getTableName(Map rowHead) { String field = rowHead.get("field") + ""; int s = field.indexOf("("); if (s > 0) { return field.substring(0, s); } return field; } private String getComment(Map rowHead) { String field = rowHead.get("field") + ""; int s = field.indexOf("("); int e = field.indexOf(")"); if (s > 0) { return field.substring(s + 1, e > 0 ? e : field.length()); } return ""; } }