Browse Source

init dmp: 初始化导数工具

yaoll 4 years ago
parent
commit
d475c963bc
23 changed files with 3784 additions and 0 deletions
  1. 49 0
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/TransApp.java
  2. 155 0
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/config/GraphMapping.java
  3. 19 0
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/controller/TransController.java
  4. 43 0
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/model/TransContext.java
  5. 347 0
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/service/TransObjInfoService.java
  6. 210 0
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/service/TransObjService.java
  7. 107 0
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/service/TransObjectValidService.java
  8. 169 0
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/service/TransRelationService.java
  9. 13 0
      dmp-rwd-datautils/src/main/resources/application-dev.yml
  10. 21 0
      dmp-rwd-datautils/src/main/resources/application.yml
  11. 49 0
      dmp-rwd-datautils/src/main/resources/logback-spring.xml
  12. 33 0
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/SheetReadInfo.java
  13. 100 0
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransService.java
  14. 101 0
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForWD.java
  15. 100 0
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForXG.java
  16. 101 0
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForZS.java
  17. 109 0
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/DataTypeMapping.java
  18. 155 0
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/ExcelUtils.java
  19. 40 0
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/FuncidDefModel.java
  20. 134 0
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/FuncidUtils.java
  21. 584 0
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/ImportClass.java
  22. 813 0
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/ImportFuncid.java
  23. 332 0
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/knowladge/Test1.java

+ 49 - 0
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/TransApp.java

@@ -0,0 +1,49 @@
+package com.persagy.dmp.rwd.datautils;
+
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.common.http.HttpUtils;
+import com.persagy.dmp.rwd.funcid.parse.parser.InfoCodeParserFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.core.env.ConfigurableEnvironment;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-14
+ * @verison: 1.0
+ */
+@Slf4j
+@SpringBootApplication
+public class TransApp {
+
+	public static void main(String[] args) {
+
+		log.info("======================= app start");
+		ConfigurableApplicationContext context = SpringApplication.run(TransApp.class, args);
+		ConfigurableEnvironment env = context.getEnvironment();
+
+		String[] activeProfiles = env.getActiveProfiles();
+		log.info("======================= active profile: {}", JacksonMapper.toSimpleJson(activeProfiles));
+		try {
+			Thread.sleep(3000);
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+
+		log.info("======================= app end");
+
+	}
+
+	@Bean
+	public HttpUtils httpUtils() {
+		return new HttpUtils();
+	}
+
+	@Bean
+	public InfoCodeParserFactory infoCodeParserFactory(){
+		return new InfoCodeParserFactory();
+	}
+}

+ 155 - 0
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/config/GraphMapping.java

@@ -0,0 +1,155 @@
+package com.persagy.dmp.rwd.datautils.config;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * @author: yaoll
+ * @date: 2020-12-01
+ * @verison: 1.0
+ */
+public class GraphMapping {
+
+	private static final List<Item> mappings = new LinkedList<>();
+
+	static {
+		mappings.add(new Item("ArchSubset", "Bd2Fl", "Subset", "1", "1"));
+		mappings.add(new Item("ArchSubset", "Bd2Sh", "ShaftandBuilding", "1", "1"));
+		mappings.add(new Item("ArchSubset", "Bd2Sp", "Subset", "2", "1"));
+		mappings.add(new Item("ArchSubset", "Fl2Sp", "Subset", "4", "1"));
+		mappings.add(new Item("ArchSubset", "Sh2Sp", "ShaftandSpace", "1", "1"));
+		mappings.add(new Item("MechSubset", "Sy2Eq", "SystemEquip", "1", "1"));
+		mappings.add(new Item("MechSubset", "Eq2Ec", "Subset", "5", "1"));
+		mappings.add(new Item("SpaceNeighborhood", "None", "SpaceNeighborhood", "1", "1"));
+		mappings.add(new Item("SpaceNeighborhood", "Door", "SpaceNeighborhood", "2", "1"));
+		mappings.add(new Item("SpaceNeighborhood", "Window", "SpaceNeighborhood", "3", "1"));
+		mappings.add(new Item("SpaceNeighborhood", "DoorWindow", "SpaceNeighborhood", "4", "1"));
+		mappings.add(new Item("SpaceNeighborhood", "Connect", "SpaceNeighborhood", "5", "1"));
+		mappings.add(new Item("TrafficNetwork", "Normal", "TrafficNetwork", "1", "1"));
+		mappings.add(new Item("TrafficNetwork", "FFOpen", "TrafficNetwork", "2", "1"));
+		mappings.add(new Item("TrafficNetwork", "FFClose", "TrafficNetwork", "3", "1"));
+		mappings.add(new Item("ConvectionNetwork", "Natural", "ConvectionNetwork", "1", "1"));
+		mappings.add(new Item("ConvectionNetwork", "MixMech", "ConvectionNetwork", "2", "1"));
+		mappings.add(new Item("RadiationNetwork", "Connect", "RadiationNetwork", "1", "1"));
+		mappings.add(new Item("RadiationNetwork", "Transparent", "RadiationNetwork", "2", "1"));
+		mappings.add(new Item("LUDistribution", "Normal", "LUDistribution", "1", "1"));
+		mappings.add(new Item("LUDistribution", "Backup", "LUDistribution", "2", "1"));
+		mappings.add(new Item("HUDistribution", "Normal", "HUDistribution", "1", "1"));
+		mappings.add(new Item("HUDistribution", "Backup", "HUDistribution", "2", "1"));
+		mappings.add(new Item("ChillWaterLoop", "Supply", "ChillWaterLoop", "1", "1"));
+		mappings.add(new Item("ChillWaterLoop", "Return", "ChillWaterLoop", "2", "1"));
+		mappings.add(new Item("ChillWaterLoop", "Bypass", "ChillWaterLoop", "3", "1"));
+		mappings.add(new Item("ChillWaterLoop", "Fill", "ChillWaterLoop", "4", "1"));
+		mappings.add(new Item("CoolingWaterLoop", "Supply", "CoolingWaterLoop", "1", "1"));
+		mappings.add(new Item("CoolingWaterLoop", "Return", "CoolingWaterLoop", "2", "1"));
+		mappings.add(new Item("CoolingWaterLoop", "Bypass", "CoolingWaterLoop", "3", "1"));
+		mappings.add(new Item("CoolingWaterLoop", "Fill", "CoolingWaterLoop", "4", "1"));
+		mappings.add(new Item("HeatWaterLoop", "Supply", "HeatWaterLoop", "1", "1"));
+		mappings.add(new Item("HeatWaterLoop", "Return", "HeatWaterLoop", "2", "1"));
+		mappings.add(new Item("HeatWaterLoop", "Bypass", "HeatWaterLoop", "3", "1"));
+		mappings.add(new Item("HeatWaterLoop", "Fill", "HeatWaterLoop", "4", "1"));
+		mappings.add(new Item("CondWaterNetwork", "Discharge", "CondWaterNetwork", "1", "1"));
+		mappings.add(new Item("ACAirNetwork", "Supply", "ACAirNetwork", "1", "1"));
+		mappings.add(new Item("ACAirNetwork", "Return", "ACAirNetwork", "2", "1"));
+		mappings.add(new Item("FreshAirNetwork", "Fresh", "FreshAirNetwork", "1", "1"));
+		mappings.add(new Item("VentNetwork", "Supply", "VentNetwork", "1", "1"));
+		mappings.add(new Item("VentNetwork", "Discharge", "VentNetwork", "2", "1"));
+		mappings.add(new Item("VentNetwork", "Uncertain", "VentNetwork", "3", "1"));
+		mappings.add(new Item("VRFNetwork", "SupplyReturn", "VRFNetwork", "1", "1"));
+		mappings.add(new Item("DomesticWaterNetwork", "Supply", "SupplyWaterNetwork", "1", "1"));
+		mappings.add(new Item("DomesticWaterNetwork", "Bypass", "SupplyWaterNetwork", "2", "1"));
+		mappings.add(new Item("DrainingWaterNetwork", "Discharge", "DrainingWaterNetwork", "1", "1"));
+		mappings.add(new Item("DrainingWaterNetwork", "Bypass", "DrainingWaterNetwork", "2", "1"));
+		mappings.add(new Item("RecycleWaterNetwork", "Supply", "RecycleWaterNetwork", "1", "1"));
+		mappings.add(new Item("RecycleWaterNetwork", "Bypass", "RecycleWaterNetwork", "2", "1"));
+		mappings.add(new Item("DrinkingWaterNetwork", "Supply", "DrinkingWaterNetwork", "1", "1"));
+		mappings.add(new Item("DrinkingWaterNetwork", "Bypass", "DrinkingWaterNetwork", "2", "1"));
+		mappings.add(new Item("DHWNetwork", "Supply", "DHWNetwork", "1", "1"));
+		mappings.add(new Item("DHWNetwork", "Bypass", "DHWNetwork", "2", "1"));
+		mappings.add(new Item("GasNetwork", "Supply", "GasNetwork", "1", "1"));
+		mappings.add(new Item("GasNetwork", "Bypass", "GasNetwork", "2", "1"));
+		mappings.add(new Item("FireWaterNetwork", "Supply", "FireWaterNetwork", "1", "1"));
+		mappings.add(new Item("FireWaterNetwork", "Bypass", "FireWaterNetwork", "2", "1"));
+		mappings.add(new Item("FireVentNetwork", "Discharge", "FireVentNetwork", "1", "1"));
+		mappings.add(new Item("WENetwork", "Normal", "SensorNetwork", "1", "1"));
+		mappings.add(new Item("MechInArch", "Eq2Bd", "Subset", "3", "0"));
+		mappings.add(new Item("MechInArch", "Eq2Fl", "EquipinFloor", "1", "1"));
+		mappings.add(new Item("MechInArch", "Eq2Sp", "EquipinSpace", "1", "1"));
+		mappings.add(new Item("MechCtrl", "EqCtrl", "ControlRelation", "1", "1"));
+		mappings.add(new Item("MechPower", "EqNormal", "EquipPower", "1", "1"));
+		mappings.add(new Item("MechPower", "EqBackup", "EquipPower", "2", "1"));
+		mappings.add(new Item("MechForArch", "Eq2Sp", "EquipforSpace", "1", "1"));
+		mappings.add(new Item("Property2Mech", "Pe2Eq", "Pe2Eq", "1", "1"));
+		mappings.add(new Item("PropertyInArch", "Pe2Bd", "Subset", "6", "0"));
+		mappings.add(new Item("PropertyInArch", "Pe2Fl", "Subset", "7", "0"));
+		mappings.add(new Item("SubE", "Sub2Sub", "SubE", "1", "1"));
+		mappings.add(new Item("SubE", "Mt2Sub", "SubE", "2", "1"));
+		mappings.add(new Item("SubE", "Br2Sub", "SubE", "3", "1"));
+		mappings.add(new Item("SubE", "Un2Sub", "SubE", "4", "1"));
+		mappings.add(new Item("SubC", "Sub2Sub", "SubC", "1", "1"));
+		mappings.add(new Item("SubC", "Mt2Sub", "SubC", "2", "1"));
+		mappings.add(new Item("SubC", "Br2Sub", "SubC", "3", "1"));
+		mappings.add(new Item("SubC", "Un2Sub", "SubC", "4", "1"));
+		mappings.add(new Item("SubH", "Sub2Sub", "SubH", "1", "1"));
+		mappings.add(new Item("SubH", "Mt2Sub", "SubH", "2", "1"));
+		mappings.add(new Item("SubH", "Br2Sub", "SubH", "3", "1"));
+		mappings.add(new Item("SubH", "Un2Sub", "SubH", "4", "1"));
+		mappings.add(new Item("SubW", "Sub2Sub", "SubW", "1", "1"));
+		mappings.add(new Item("SubW", "Mt2Sub", "SubW", "2", "1"));
+		mappings.add(new Item("SubW", "Br2Sub", "SubW", "3", "1"));
+		mappings.add(new Item("SubW", "Un2Sub", "SubW", "4", "1"));
+		mappings.add(new Item("SubG", "Sub2Sub", "SubG", "1", "1"));
+		mappings.add(new Item("SubG", "Mt2Sub", "SubG", "2", "1"));
+		mappings.add(new Item("SubG", "Br2Sub", "SubG", "3", "1"));
+		mappings.add(new Item("SubG", "Un2Sub", "SubG", "4", "1"));
+		mappings.add(new Item("SubF", "Sub2Sub", "SubF", "1", "1"));
+		mappings.add(new Item("SubF", "Mt2Sub", "SubF", "2", "1"));
+		mappings.add(new Item("SubF", "Br2Sub", "SubF", "3", "1"));
+		mappings.add(new Item("SubF", "Un2Sub", "SubF", "4", "1"));
+		mappings.add(new Item("SubV", "Sub2Sub", "SubV", "1", "1"));
+		mappings.add(new Item("SubV", "Mt2Sub", "SubV", "2", "1"));
+		mappings.add(new Item("SubV", "Br2Sub", "SubV", "3", "1"));
+		mappings.add(new Item("SubV", "Un2Sub", "SubV", "4", "1"));
+		mappings.add(new Item("EnergyMonitorStructure", "Mt2Br", "EnergyMonitorStructure", "2", "1"));
+		mappings.add(new Item("EnergyMonitorStructure", "Mt2Un", "EnergyMonitorStructure", "3", "1"));
+		mappings.add(new Item("EnergyMonitorStructure", "Br2Un", "EnergyMonitorStructure", "4", "1"));
+		mappings.add(new Item("VRFNetwork", "SupplyReturn", "VRFNetwork", "2", "0"));
+		mappings.add(new Item("WENetwork", "Normal", "ControlEquipNetwork", "1", "1"));
+		mappings.add(new Item("PropertyInArch", "Pe2Bd", "Pe2Bd", "1", "1"));
+		mappings.add(new Item("PropertyInArch", "Pe2Fl", "Pe2Fl", "1", "1"));
+		mappings.add(new Item("SubE", "Sub2Sub", "EnergyItemTree", "1", "1"));
+		mappings.add(new Item("EnergyMonitorStructure", "Mt2Br", "EnergyMonitorStructure", "1", "1"));
+	}
+
+	public static Item getMapping(String graph, String relCode) {
+		for (Item mapping : mappings) {
+			if (mapping.oldGraph.equals(graph) && mapping.oldRelcode.equals(relCode)) {
+				return mapping;
+			}
+		}
+		return null;
+	}
+
+	@Getter
+	@Setter
+	public static class Item {
+		private String newGraph;
+		private String newRelcode;
+		private String oldGraph;
+		private String oldRelcode;
+		private Boolean same;
+
+		public Item(String newGraph, String newRelcode, String oldGraph, String oldRelcode, String same) {
+			this.newGraph = newGraph;
+			this.newRelcode = newRelcode;
+			this.oldGraph = oldGraph;
+			this.oldRelcode = oldRelcode;
+			this.same = "1".equalsIgnoreCase(same);
+		}
+	}
+
+
+}

+ 19 - 0
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/controller/TransController.java

@@ -0,0 +1,19 @@
+package com.persagy.dmp.rwd.datautils.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-14
+ * @verison: 1.0
+ */
+@RestController
+@RequestMapping("/trans")
+public class TransController {
+
+
+
+
+
+}

+ 43 - 0
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/model/TransContext.java

@@ -0,0 +1,43 @@
+package com.persagy.dmp.rwd.datautils.model;
+
+import com.persagy.common.date.DateUtils;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-14
+ * @verison: 1.0
+ */
+@Data
+public class TransContext {
+
+	private String basePath;
+
+	private String dataFile;
+
+	private String groupCode;
+
+	private String schemaId;
+
+	private String projectId;
+
+	private String appId = "datautils";
+
+	private Map<String, String> classCodeMapping = new HashMap<>();
+
+	private Map<String, String> objTypeMapping = new HashMap<>();
+
+	public String getErrorFile() {
+		int idx = this.dataFile.lastIndexOf(".");
+		return this.dataFile.substring(0, idx) + "-error-" + DateUtils.format(new Date()) + ".json";
+	}
+
+	public String getOutFile() {
+		int idx = this.dataFile.lastIndexOf(".");
+		return this.dataFile.substring(0, idx) + "-out-" + DateUtils.format(new Date()) + ".json";
+	}
+}

+ 347 - 0
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/service/TransObjInfoService.java

@@ -0,0 +1,347 @@
+package com.persagy.dmp.rwd.datautils.service;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.common.http.HttpUtils;
+import com.persagy.dmp.rwd.datautils.model.TransContext;
+import com.persagy.dmp.rwd.enums.FuncidCategory;
+import com.persagy.dmp.rwd.funcid.parse.parser.InfoCodeParser;
+import com.persagy.dmp.rwd.funcid.parse.parser.InfoCodeParserFactory;
+import com.persagy.dmp.rwd.funcid.parse.parser.ParserContext;
+import com.persagy.dmp.rwd.model.FuncidDefModel;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.*;
+import java.util.*;
+
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-14
+ * @verison: 1.0
+ */
+@Slf4j
+@Service
+public class TransObjInfoService {
+
+	@Value("${persagy.dmp.rwd.server}")
+	private String rwdServer;
+
+	@Autowired
+	private HttpUtils httpUtils;
+
+	@Autowired
+	private InfoCodeParserFactory infoCodeParserFactory;
+
+	@Data
+	private static final class Model {
+		private String project_id;
+		private String obj_type;
+		private String obj_id;
+		private String info_id;
+		private String s_value;
+		private Long l_value;
+		private Double d_value;
+		private String time;
+		private String error;
+
+		@JsonIgnore
+		public String getId() {
+			if ("Pj".equals(obj_type)) {
+				return obj_type + project_id;
+			}
+			return obj_type + project_id + obj_id;
+		}
+	}
+
+	private static final Set<String> baseColumn = new HashSet<>(Arrays.asList(
+			"BuildID",
+			"FloorID",
+			"RoomID",
+			"EquipID",
+			"BuildName",
+			"FloorName",
+			"RoomName",
+			"EquipName",
+			"BuildLocalID",
+			"FloorLocalID",
+			"RoomLocalID",
+			"EquipLocalID",
+			"BuildLocalName",
+			"FloorLocalName",
+			"RoomLocalName",
+			"EquipLocalName"));
+
+	public void trans(TransContext ctx) throws IOException {
+
+		initClass(ctx);
+
+		String file = ctx.getBasePath() + "/" + ctx.getDataFile();
+		BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
+
+		String outFile = ctx.getBasePath() + "/" + ctx.getOutFile();
+		PrintWriter outWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
+
+		String errorFile = ctx.getBasePath() + "/" + ctx.getErrorFile();
+		PrintWriter errorWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(errorFile)));
+
+		Map<String, Map<String, FuncidDefModel>> classDefCache = new HashMap<>();
+
+		Map<String, ObjectNode> objects = new HashMap<>();
+		ArrayNode objectArray = JsonNodeFactory.instance.arrayNode();
+
+		Map<String, String> objectClassCodeCache = new HashMap<>();
+		initObjectClassCodeCache(ctx, objectClassCodeCache);
+
+
+		int i = 0;
+		String temp;
+		while (true) {
+			i++;
+			temp = reader.readLine();
+			if (temp == null) {
+				break;
+			}
+
+			Model model = JacksonMapper.toObject(temp, Model.class);
+
+			if ("Si".equalsIgnoreCase(model.obj_type)) {
+				continue;
+			}
+
+			if ("Ec".equalsIgnoreCase(model.obj_type)) {
+				continue;
+			}
+
+			String id = model.getId();
+			if (!objectClassCodeCache.containsKey(id)) {
+				model.error = "object not exists";
+				log.error("obj error: {}", JacksonMapper.toSimpleJson(model));
+				continue;
+			}
+
+			if (!objects.containsKey(id)) {
+				ObjectNode obj = objectArray.addObject();
+				obj.put("id", id);
+				obj.put("projectId", ctx.getProjectId());
+				obj.put("classCode", objectClassCodeCache.get(id));
+				objects.put(id, obj);
+			}
+
+			ObjectNode obj = objects.get(id);
+			parseBaseColumn(model, obj);
+
+			String infoId = model.info_id;
+			if (baseColumn.contains(infoId)) {
+				outWriter.println(JacksonMapper.toSimpleJson(model));
+				continue;
+			}
+
+			String classCode = JacksonMapper.getString(obj, "classCode");
+			Map<String, FuncidDefModel> funcidCache = getFuncidCache(ctx, classDefCache, classCode);
+			FuncidDefModel funcidDefModel = funcidCache.get(infoId);
+			if (funcidDefModel == null) {
+				model.error = "funcid def not exists";
+				errorWriter.println(JacksonMapper.toSimpleJson(model));
+				continue;
+			}
+			String code = funcidDefModel.getCode();
+			Object modelValue = getValue(model);
+			if (modelValue == null) {
+				model.error = "value is null";
+				errorWriter.println(JacksonMapper.toSimpleJson(model));
+				continue;
+			}
+			ObjectNode temObj = getValueNode(model);
+			if (funcidDefModel.getCategory() == FuncidCategory.STATIC) {
+				InfoCodeParser parser = infoCodeParserFactory.getParser(funcidDefModel.getDataType());
+				ParserContext parserContext = new ParserContext(funcidDefModel, temObj.get("value"));
+				parser.checkValue(parserContext);
+				if (parserContext.isHasError()) {
+					model.error = parserContext.getError().toString();
+					errorWriter.println(JacksonMapper.toSimpleJson(model));
+				} else {
+					outWriter.println(JacksonMapper.toSimpleJson(model));
+					Object value = parserContext.getValue();
+					obj.putPOJO(code, value);
+				}
+			} else {
+				// 动态值不需校验
+				outWriter.println(JacksonMapper.toSimpleJson(model));
+				obj.set(code, temObj.get("value"));
+			}
+
+			if (i % 200 == 0) {
+				outWriter.flush();
+				errorWriter.flush();
+			}
+		}
+		reader.close();
+
+		outWriter.flush();
+		outWriter.close();
+
+		errorWriter.flush();
+		errorWriter.close();
+
+		if (objectArray.size() == 0) {
+			return;
+		}
+
+		List<JsonNode> list = new LinkedList<>();
+		for (JsonNode obj : objectArray) {
+			list.add(obj);
+			if (list.size() == 1000) {
+				String url = rwdServer + "/rwd/instance/object/update?projectId=" + ctx.getProjectId() + "&groupCode=" + ctx.getGroupCode();
+				HttpUtils.HttpResult response = httpUtils.post(url, JacksonMapper.toSimpleJson(list), 3600000);
+				System.out.println(response.getContent());
+				list = new LinkedList<>();
+			}
+		}
+		if (list.size() > 0) {
+			String url = rwdServer + "/rwd/instance/object/update?projectId=" + ctx.getProjectId() + "&groupCode=" + ctx.getGroupCode();
+			HttpUtils.HttpResult response = httpUtils.post(url, JacksonMapper.toSimpleJson(list), 3600000);
+			System.out.println(response.getContent());
+		}
+	}
+
+	private void initObjectClassCodeCache(TransContext ctx, Map<String, String> objectClassCodeCache) {
+		JacksonCriteria criteria = JacksonCriteria.newInstance();
+		criteria.add("projectId", ctx.getProjectId());
+		criteria.addWithColumn("classCode");
+		String url = rwdServer + "/rwd/instance/object/query?projectId=" + ctx.getProjectId() + "&groupCode=" + ctx.getGroupCode();
+		HttpUtils.HttpResult result = httpUtils.post(url, JacksonMapper.toSimpleJson(criteria), 1500000);
+		if (result.success()) {
+			String content = result.getContent();
+			ObjectNode object = JacksonMapper.toObject(content, ObjectNode.class);
+			ArrayNode data = JacksonMapper.getArray(object, "data", JsonNodeFactory.instance.arrayNode());
+
+			for (JsonNode datum : data) {
+				ObjectNode objectNode = (ObjectNode) datum;
+				String id = JacksonMapper.getString(objectNode, "id");
+				String classCode = JacksonMapper.getString(objectNode, "classCode");
+				objectClassCodeCache.put(id, classCode);
+			}
+		}
+
+	}
+
+	private String getClassCode(Model model, TransContext ctx) {
+		String obj_type = model.getObj_type();
+		return ctx.getObjTypeMapping().get(obj_type);
+	}
+
+	private Map<String, FuncidDefModel> getFuncidCache(TransContext ctx, Map<String, Map<String, FuncidDefModel>> classDefCache, String classCode) {
+		if (!classDefCache.containsKey(classCode)) {
+			Map<String, FuncidDefModel> funcidCache = new HashMap<>();
+			String url = rwdServer + "/rwd/def/funcid?projectId=" + ctx.getProjectId() + "&groupCode=" + ctx.getGroupCode();
+			JacksonCriteria criteria = JacksonCriteria.newInstance();
+			criteria.add("classCode", classCode);
+			HttpUtils.HttpResult result = httpUtils.post(url, JacksonMapper.toSimpleJson(criteria), 300000);
+			if (result.success()) {
+				String content = result.getContent();
+				ObjectNode object = JacksonMapper.toObject(content, ObjectNode.class);
+				ArrayNode data = JacksonMapper.getArray(object, "data", JsonNodeFactory.instance.arrayNode());
+
+				for (JsonNode datum : data) {
+					ObjectNode funcJson = (ObjectNode) datum;
+					FuncidDefModel funcidDefModel = JacksonMapper.toObject(funcJson.toString(), FuncidDefModel.class);
+					funcidCache.put(funcidDefModel.getOrigCode(), funcidDefModel);
+				}
+			}
+			classDefCache.put(classCode, funcidCache);
+		}
+		return classDefCache.get(classCode);
+	}
+
+	private void parseBaseColumn(Model model, ObjectNode obj) {
+		String infoId = model.info_id;
+		if ("BuildID".equals(infoId) || "FloorID".equals(infoId) || "RoomID".equals(infoId) || "EquipID".equals(infoId)) {
+			return;
+		} else if ("BuildName".equals(infoId) || "FloorName".equals(infoId) || "RoomName".equals(infoId) || "EquipName".equals(infoId)) {
+			obj.put("name", model.s_value);
+		} else if ("BuildLocalID".equals(infoId) || "FloorLocalID".equals(infoId) || "RoomLocalID".equals(infoId) || "EquipLocalID".equals(infoId)) {
+			obj.put("localId", model.s_value);
+		} else if ("BuildLocalName".equals(infoId) || "FloorLocalName".equals(infoId) || "RoomLocalName".equals(infoId) || "EquipLocalName".equals(infoId)) {
+			obj.put("localName", model.s_value);
+		}
+	}
+
+	private void initClass(TransContext ctx) {
+		ArrayNode classes = queryClass(ctx);
+		ctx.getObjTypeMapping().put("Bd", "building");
+		ctx.getObjTypeMapping().put("Fl", "floor");
+		ctx.getObjTypeMapping().put("Sp", "space");
+		ctx.getObjTypeMapping().put("Eq", "equipment");
+
+		ctx.getClassCodeMapping().put("Pj", "project");
+		ctx.getClassCodeMapping().put("Bd", "building");
+		ctx.getClassCodeMapping().put("Fl", "floor");
+		ctx.getClassCodeMapping().put("Sy", "system");
+
+		for (JsonNode cla : classes) {
+			ObjectNode obj = (ObjectNode) cla;
+			String parentCode = JacksonMapper.getString(obj, "parentCode", "");
+			String code = JacksonMapper.getString(obj, "code");
+			if ("equipment".equals(parentCode) || "system".equals(parentCode)) {
+				ctx.getClassCodeMapping().put(code.substring(2), code);
+			} else if ("space".equals(parentCode)) {
+				ctx.getClassCodeMapping().put(code, code);
+			}
+		}
+	}
+
+	private ArrayNode queryClass(TransContext ctx) {
+		String url = rwdServer + "/rwd/def/class?projectId=" + ctx.getProjectId() + "&groupCode=" + ctx.getGroupCode();
+		JacksonCriteria criteria = JacksonCriteria.newInstance();
+		HttpUtils.HttpResult result = httpUtils.post(url, JacksonMapper.toSimpleJson(criteria), 300000);
+		if (result.success()) {
+			String content = result.getContent();
+			ObjectNode object = JacksonMapper.toObject(content, ObjectNode.class);
+			ArrayNode data = JacksonMapper.getArray(object, "data");
+			return data;
+		} else {
+			log.error("query class error: {}", result.getContent());
+		}
+		return JsonNodeFactory.instance.arrayNode();
+	}
+
+	private Object getValue(Model model) {
+		if (model.s_value != null) {
+			if ("".equals(model.s_value)) {
+				return null;
+			}
+			return model.s_value;
+		} else if (model.l_value != null) {
+			return model.l_value;
+		} else if (model.d_value != null) {
+			return model.d_value;
+		}
+		return null;
+	}
+
+	private ObjectNode getValueNode(Model model) {
+		ObjectNode obj = JsonNodeFactory.instance.objectNode();
+		if (model.s_value != null) {
+			if ("".equals(model.s_value)) {
+				return obj;
+			}
+			return obj.put("value", model.s_value);
+		} else if (model.l_value != null) {
+			return obj.put("value", model.l_value);
+		} else if (model.d_value != null) {
+			return obj.put("value", model.d_value);
+		}
+		return obj;
+	}
+
+}

+ 210 - 0
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/service/TransObjService.java

@@ -0,0 +1,210 @@
+package com.persagy.dmp.rwd.datautils.service;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.common.http.HttpUtils;
+import com.persagy.dmp.rwd.datautils.model.TransContext;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.*;
+
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-14
+ * @verison: 1.0
+ */
+@Slf4j
+@Service
+public class TransObjService {
+
+	@Value("${persagy.dmp.rwd.server}")
+	private String rwdServer;
+
+	@Autowired
+	private HttpUtils httpUtils;
+
+	@Data
+	public static class Model {
+		private Boolean valid;
+		private String obj_id;
+		private String project_id;
+		private String subtype;
+		private String dtime;
+		private String ctime;
+		private String obj_type;
+
+		@JsonIgnore
+		public String getId() {
+			if ("Pj".equals(obj_type)) {
+				return obj_type + project_id;
+			}
+			return obj_type + project_id + obj_id;
+		}
+
+		public String getClassCode(TransContext ctx) {
+			if ("Eq".equals(this.obj_type) || "Sy".equals(this.obj_type) || "Sp".equals(this.obj_type)) {
+				return ctx.getClassCodeMapping().get(this.subtype);
+			} else if ("Bd".equals(this.obj_type) || "Fl".equals(this.obj_type)) {
+				return ctx.getClassCodeMapping().get(this.obj_type);
+			}
+			return null;
+		}
+	}
+
+	private static final Set<String> baseColumn = new HashSet<>(Arrays.asList(
+			"BuildID",
+			"FloorID",
+			"RoomID",
+			"EquipID",
+			"BuildName",
+			"FloorName",
+			"RoomName",
+			"EquipName",
+			"BuildLocalID",
+			"FloorLocalID",
+			"RoomLocalID",
+			"EquipLocalID",
+			"BuildLocalName",
+			"FloorLocalName",
+			"RoomLocalName",
+			"EquipLocalName"));
+
+	public void trans(TransContext ctx) throws IOException {
+
+		initClass(ctx);
+
+		Set<String> objectIds = initObjectIds(ctx);
+
+		String file = ctx.getBasePath() + "/" + ctx.getDataFile();
+		BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
+
+		ArrayNode objectArray = JsonNodeFactory.instance.arrayNode();
+		int i = 0;
+		String temp;
+		while (true) {
+			i++;
+			temp = reader.readLine();
+			if (temp == null) {
+				break;
+			}
+
+			Model model = JacksonMapper.toObject(temp, Model.class);
+			if ("Si".equalsIgnoreCase(model.obj_type)) {
+				continue;
+			}
+			if ("Ec".equalsIgnoreCase(model.obj_type)) {
+				continue;
+			}
+
+			String id = model.getId();
+			if (objectIds.contains(id)) {
+				continue;
+			}
+			String classCode = getClassCode(model, ctx);
+			if (classCode == null) {
+				log.info("error obj: {}", JacksonMapper.toSimpleJson(model));
+				continue;
+			}
+			ObjectNode obj = objectArray.addObject();
+			obj.put("id", id);
+			obj.put("projectId", ctx.getProjectId());
+			obj.put("objType", getObjType(model, ctx));
+			obj.put("classCode", classCode);
+			obj.put("createApp", "datautils");
+		}
+		reader.close();
+
+		if (objectArray.size() > 0) {
+			String url = rwdServer + "/rwd/instance/object/create?projectId=" + ctx.getProjectId() + "&groupCode=" + ctx.getGroupCode();
+			HttpUtils.HttpResult response = httpUtils.post(url, objectArray.toString(), 3600000);
+			System.out.println(response.getContent());
+		}
+
+	}
+
+	private Set<String> initObjectIds(TransContext ctx) {
+		Set<String> result = new HashSet<>();
+		String url = rwdServer + "/rwd/instance/object/query?groupCode=" + ctx.getGroupCode() + "&projectId=" + ctx.getProjectId();
+		JacksonCriteria criteria = JacksonCriteria.newInstance();
+		criteria.add("groupCode", ctx.getGroupCode());
+		criteria.add("projectId", ctx.getProjectId());
+		criteria.addWithColumn("id");
+		HttpUtils.HttpResult response = httpUtils.post(url, JacksonMapper.toSimpleJson(criteria), 3600000);
+		if (response.success()) {
+			String content = response.getContent();
+			ObjectNode objectNode = JacksonMapper.toObject(content, ObjectNode.class);
+			ArrayNode data = JacksonMapper.getArray(objectNode, "data", JsonNodeFactory.instance.arrayNode());
+			for (JsonNode datum : data) {
+				String id = JacksonMapper.getString((ObjectNode) datum, "id");
+				result.add(id);
+			}
+		}
+		return result;
+	}
+
+	private String getObjType(Model model, TransContext ctx) {
+		String obj_type = model.getObj_type();
+		return ctx.getObjTypeMapping().get(obj_type);
+	}
+
+	private String getClassCode(Model model, TransContext ctx) {
+		return model.getClassCode(ctx);
+	}
+
+	private void initClass(TransContext ctx) {
+		ArrayNode classes = queryClass(ctx);
+//		for (JsonNode cla : classes) {
+//			log.info(JacksonMapper.toSimpleJson(cla));
+//		}
+		ctx.getObjTypeMapping().put("Bd", "building");
+		ctx.getObjTypeMapping().put("Fl", "floor");
+		ctx.getObjTypeMapping().put("Sp", "space");
+		ctx.getObjTypeMapping().put("Eq", "equipment");
+
+		ctx.getClassCodeMapping().put("Pj", "project");
+		ctx.getClassCodeMapping().put("Bd", "building");
+		ctx.getClassCodeMapping().put("Fl", "floor");
+		ctx.getClassCodeMapping().put("Sy", "system");
+
+		for (JsonNode cla : classes) {
+			ObjectNode obj = (ObjectNode) cla;
+			String parentCode = JacksonMapper.getString(obj, "parentCode", "");
+			String code = JacksonMapper.getString(obj, "code");
+			if ("equipment".equals(parentCode) || "system".equals(parentCode)) {
+				ctx.getClassCodeMapping().put(code.substring(2), code);
+			} else if ("space".equals(parentCode)) {
+				ctx.getClassCodeMapping().put(code, code);
+			}
+		}
+	}
+
+	private ArrayNode queryClass(TransContext ctx) {
+		String url = rwdServer + "/rwd/def/class?projectId=" + ctx.getProjectId() + "&groupCode=" + ctx.getGroupCode();
+		JacksonCriteria criteria = JacksonCriteria.newInstance();
+		HttpUtils.HttpResult result = httpUtils.post(url, JacksonMapper.toSimpleJson(criteria), 30000);
+		if (result.success()) {
+			String content = result.getContent();
+			ObjectNode object = JacksonMapper.toObject(content, ObjectNode.class);
+			ArrayNode data = JacksonMapper.getArray(object, "data");
+			return data;
+		} else {
+			log.error("query class error: {}", result.getContent());
+		}
+		return JsonNodeFactory.instance.arrayNode();
+	}
+
+}

+ 107 - 0
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/service/TransObjectValidService.java

@@ -0,0 +1,107 @@
+package com.persagy.dmp.rwd.datautils.service;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.common.http.HttpUtils;
+import com.persagy.dmp.rwd.datautils.model.TransContext;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-14
+ * @verison: 1.0
+ */
+@Slf4j
+@Service
+public class TransObjectValidService {
+
+	@Value("${persagy.dmp.rwd.server}")
+	private String rwdServer;
+
+	@Autowired
+	private HttpUtils httpUtils;
+
+	@Data
+	public static class Model {
+		private Boolean valid;
+		private String obj_id;
+		private String project_id;
+		private String subtype;
+		private String dtime;
+		private String ctime;
+		private String obj_type;
+
+		@JsonIgnore
+		public String getId() {
+			if ("Pj".equals(obj_type)) {
+				return obj_type + project_id;
+			}
+			return obj_type + project_id + obj_id;
+		}
+
+		public String getClassCode(TransContext ctx) {
+			if ("Eq".equals(this.obj_type) || "Sp".equals(this.obj_type)) {
+				return ctx.getClassCodeMapping().get(this.subtype);
+			} else if ("Bd".equals(this.obj_type) || "Fl".equals(this.obj_type)) {
+				return ctx.getClassCodeMapping().get(this.obj_type);
+			}
+			return null;
+		}
+	}
+
+	public void trans(TransContext ctx) throws IOException {
+
+		String file = ctx.getBasePath() + "/" + ctx.getDataFile();
+		BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
+
+		ArrayNode objectArray = JsonNodeFactory.instance.arrayNode();
+		List<String> deleteList = new LinkedList<>();
+		String temp;
+		while (true) {
+			temp = reader.readLine();
+			if (temp == null) {
+				break;
+			}
+			Model model = JacksonMapper.toObject(temp, Model.class);
+			if (model.valid) {
+				continue;
+			}
+			if ("Si".equalsIgnoreCase(model.obj_type)) {
+				continue;
+			}
+			if ("Ec".equalsIgnoreCase(model.obj_type)) {
+				continue;
+			}
+//			String classCode = model.getClassCode(ctx);
+//			if (classCode == null) {
+//				log.error("obj error: {}", JacksonMapper.toSimpleJson(model));
+//				continue;
+//			}
+			if (!model.valid) {
+				deleteList.add(model.getId());
+			}
+		}
+		reader.close();
+
+		if (deleteList.size() > 0) {
+			String url = rwdServer + "/rwd/instance/object/delete?groupCode=" + ctx.getGroupCode() + "&projectId=" + ctx.getProjectId();
+			HttpUtils.HttpResult response = httpUtils.post(url, JacksonMapper.toSimpleJson(deleteList), 3600000);
+			System.out.println(response.getContent());
+		}
+
+	}
+
+}

+ 169 - 0
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/service/TransRelationService.java

@@ -0,0 +1,169 @@
+package com.persagy.dmp.rwd.datautils.service;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.common.http.HttpUtils;
+import com.persagy.dmp.rwd.datautils.config.GraphMapping;
+import com.persagy.dmp.rwd.datautils.model.TransContext;
+import com.persagy.dmp.rwd.model.RelationInstanceModel;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.*;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * @author: yaoll
+ * @date: 2020-11-01
+ * @verison: 1.0
+ */
+@Slf4j
+@Service
+public class TransRelationService {
+
+	@Value("${persagy.dmp.rwd.server}")
+	private String rwdServer;
+
+	@Autowired
+	private HttpUtils httpUtils;
+
+	@Data
+	public static class Model {
+		private String to_obj_type;
+		private String to_obj_id;
+		private String project_id;
+		private String rel_type;
+		private String from_obj_id;
+		private String from_obj_type;
+		private String graph_id;
+
+		public String getGraphCode(){
+			return this.graph_id.substring(2, this.graph_id.length() - 3);
+		}
+
+		@JsonIgnore
+		public String getFromId() {
+			if ("Pj".equals(from_obj_type)) {
+				return from_obj_type + project_id;
+			}
+			return from_obj_type + project_id + from_obj_id;
+		}
+
+		@JsonIgnore
+		public String getToId() {
+			if ("Pj".equals(to_obj_type)) {
+				return to_obj_type + project_id;
+			}
+			return to_obj_type + project_id + to_obj_id;
+		}
+	}
+
+	private RelationInstanceModel toRelation(Model model){
+		GraphMapping.Item mapping = GraphMapping.getMapping(model.getGraphCode(), model.rel_type);
+		if (mapping == null) {
+			return null;
+		}
+		RelationInstanceModel relation = new RelationInstanceModel();
+		relation.setGraphCode(mapping.getNewGraph());
+		relation.setRelCode(mapping.getNewRelcode());
+		if (mapping.getSame()) {
+			relation.setObjFrom(model.getFromId());
+			relation.setObjTo(model.getToId());
+		} else {
+			relation.setObjFrom(model.getToId());
+			relation.setObjTo(model.getFromId());
+		}
+		return relation;
+	}
+
+	public void trans(TransContext ctx) throws IOException {
+		String file = ctx.getBasePath() + "/" + ctx.getDataFile();
+		BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
+		ArrayNode objectArray = JsonNodeFactory.instance.arrayNode();
+		String temp;
+		List<RelationInstanceModel> data = new LinkedList<>();
+		while (true) {
+			temp = reader.readLine();
+			if (temp == null) {
+				break;
+			}
+			Model model = JacksonMapper.toObject(temp, Model.class);
+			if ("Si".equalsIgnoreCase(model.from_obj_type) || "Si".equals(model.to_obj_type)) {
+				continue;
+			}
+			if ("Ec".equalsIgnoreCase(model.from_obj_type) || "Ec".equals(model.to_obj_type)) {
+				continue;
+			}
+			RelationInstanceModel relation = toRelation(model);
+			if (relation != null) {
+				data.add(relation);
+			} else {
+				log.error("relaton error: {}", temp);
+			}
+
+			ObjectNode obj = objectArray.addObject();
+			obj.put("graphId", model.graph_id);
+			obj.put("relCode", model.rel_type);
+			obj.put("objFrom", model.getFromId());
+			obj.put("objTo", model.getToId());
+		}
+		reader.close();
+
+		if (objectArray.size() > 0) {
+			String url = rwdServer + "/rwd/instance/relation/create?projectId=" + ctx.getProjectId();
+			HttpUtils.HttpResult response = httpUtils.post(url, JacksonMapper.toSimpleJson(data), 3600000);
+			System.out.println(response.getContent());
+		}
+	}
+
+	/**
+	 * 拼装SQL
+	 * @param ctx
+	 * @throws IOException
+	 */
+	public void transToSql(TransContext ctx) throws IOException {
+		String outFile = "/relation-out.sql";
+		String file = ctx.getBasePath() + "/" + ctx.getDataFile();
+		BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
+		ArrayNode objectArray = JsonNodeFactory.instance.arrayNode();
+		String temp;
+		PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(ctx.getBasePath() + outFile)));
+
+		String projectId = ctx.getProjectId();
+		String insert = "insert into rwd_relation_"+ctx.getGroupCode().toLowerCase() + "_" + projectId.toLowerCase() + "(id,group_code,project_id,graph_code,graph_id,rel_code,obj_from,obj_to,status,create_time)values";
+		while (true) {
+			temp = reader.readLine();
+			if (temp == null) {
+				break;
+			}
+			Model model = JacksonMapper.toObject(temp, Model.class);
+			if ("Si".equalsIgnoreCase(model.from_obj_type) || "Si".equals(model.to_obj_type)) {
+				continue;
+			}
+
+			StringBuilder sql = new StringBuilder(insert);
+			sql.append("('").append(UUID.randomUUID().toString().replace("-", "")).append("',");
+			sql.append("'").append(ctx.getGroupCode()).append("',");
+			sql.append("'").append(projectId).append("',");
+			sql.append("'").append(model.getGraphCode()).append("',");
+			sql.append("'").append(model.graph_id).append("',");
+			sql.append("'").append(model.rel_type).append("',");
+			sql.append("'").append(model.getFromId()).append("',");
+			sql.append("'").append(model.getToId()).append("',");
+			sql.append("1,now());");
+			writer.println(sql.toString());
+
+		}
+		reader.close();
+		writer.close();
+	}
+
+}

+ 13 - 0
dmp-rwd-datautils/src/main/resources/application-dev.yml

@@ -0,0 +1,13 @@
+persagy:
+  dmp:
+    rwd:
+      server: http://39.102.54.110:8082
+#      server: http://localhost:8082
+#spring:
+#  datasource:
+#    url: jdbc:mysql://39.102.54.110:9005/dmp_test?useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf8&useSSL=false
+#    username: persagy
+#    password: persagy@020
+#    url: jdbc:mysql://localhost:3301/dmp_dev?useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf8&useSSL=false
+#    username: root
+#    password: 123456

+ 21 - 0
dmp-rwd-datautils/src/main/resources/application.yml

@@ -0,0 +1,21 @@
+server:
+  port: 9001
+spring:
+  application:
+    name: dmp-datautils
+  profiles:
+    active:
+      - dev
+#  datasource:
+#    driver-class-name: com.mysql.cj.jdbc.Driver
+#    url: jdbc:mysql://localhost:3306/persagy_dev?useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf8&useSSL=false
+#    username: root
+#    password: 123456
+##    url: jdbc:mysql://192.168.3.200:3306/persagy_dmp_test?useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf8&useSSL=false
+##    username: pbsage
+##    password: Mysql!123
+#    type: com.alibaba.druid.pool.DruidDataSource
+#  jpa:
+#    show-sql: false
+#    hibernate:
+#      ddl-auto: none

+ 49 - 0
dmp-rwd-datautils/src/main/resources/logback-spring.xml

@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
+    <property name="log_pattern" value="%thread %d{yyyyMMdd HH:mm:ss.SSS} %-5level %logger{140} - %msg%n"/>
+    <property name="app_name" value="dmp-datautils"/>
+    <springProperty scope="context" name="log_path" source="persagy.log.path"/>
+    <property name="log_file" value="${log_path}/${app_name}"/>
+    <contextName>${app_name}</contextName>
+
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>${log_pattern}</pattern>
+        </layout>
+    </appender>
+
+    <!-- 日志文件 -->
+    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${log_file}-%d{yyyyMMdd}.log</fileNamePattern>
+            <maxHistory>7</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log_pattern}</pattern>
+        </encoder>
+    </appender>
+
+    <logger name="org.hibernate" level="INFO"/>
+    <logger name="org.springframework" level="INFO"/>
+    <logger name="com.netflix" level="WARN"/>
+    <logger name="org.apache.http" level="INFO"/>
+
+    <springProfile name="dev">
+        <logger name="org.hibernate.SQL" level="DEBUG"/>
+        <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>
+        <root level="debug">
+            <appender-ref ref="stdout"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="log-test">
+        <logger name="org.hibernate.SQL" level="DEBUG"/>
+        <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>
+        <root level="info">
+            <appender-ref ref="file"/>
+        </root>
+    </springProfile>
+
+</configuration> 

+ 33 - 0
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/SheetReadInfo.java

@@ -0,0 +1,33 @@
+package com.persagy.dmp.rwd.datautils;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * @author: yaoll
+ * @date: 2020-11-30
+ * @verison: 1.0
+ */
+@Getter
+@Setter
+public class SheetReadInfo {
+
+	private Integer startRow = 0;
+
+	private String seqKey = "seq";
+
+	private List<Integer> columnIndexs = new LinkedList<>();
+
+	private List<String> columnKeys = new LinkedList<>();
+
+	private List<String> columnTypes = new LinkedList<>();
+
+	public void add(Integer index, String key, String type) {
+		this.columnIndexs.add(index);
+		this.columnKeys.add(key);
+		this.columnTypes.add(type);
+	}
+}

+ 100 - 0
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransService.java

@@ -0,0 +1,100 @@
+package com.persagy.dmp.rwd.datautils;
+
+import com.persagy.dmp.rwd.datautils.model.TransContext;
+import com.persagy.dmp.rwd.datautils.service.TransObjInfoService;
+import com.persagy.dmp.rwd.datautils.service.TransObjService;
+import com.persagy.dmp.rwd.datautils.service.TransObjectValidService;
+import com.persagy.dmp.rwd.datautils.service.TransRelationService;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-14
+ * @verison: 1.0
+ */
+@Slf4j
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class TestTransService {
+
+	@Autowired
+	private TransObjInfoService transObjInfoService;
+
+	@Autowired
+	private TransObjService transObjervice;
+
+	@Autowired
+	private TransRelationService transRelationService;
+
+	@Autowired
+	private TransObjectValidService transObjectValidService;
+
+	private String groupCode = "WD";
+	private String projectId = "Pj1101050029";
+	private String basePath = "/Users/devsaga/persagy/1101050029-2020-10-17";
+
+	@Test
+	public void transObjects() throws Exception {
+
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile("objects.json");
+		transObjervice.trans(ctx);
+	}
+
+	@Test
+	public void transObjInfos() throws Exception {
+
+		String fileName = "obj_infos.json";
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile(fileName);
+		transObjInfoService.trans(ctx);
+	}
+
+
+	/**
+	 * 导入前要清除掉关系数据
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void transRelation() throws Exception {
+
+		String fileName = "rel_btw_objs.json";
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile(fileName);
+		// 先导出为sql
+		transRelationService.transToSql(ctx);
+	}
+
+	/**
+	 * 清理失效对象
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void transObjectValid() throws Exception {
+
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile("objects.json");
+		transObjectValidService.trans(ctx);
+	}
+
+
+}

+ 101 - 0
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForWD.java

@@ -0,0 +1,101 @@
+package com.persagy.dmp.rwd.datautils;
+
+import com.persagy.dmp.rwd.datautils.model.TransContext;
+import com.persagy.dmp.rwd.datautils.service.TransObjInfoService;
+import com.persagy.dmp.rwd.datautils.service.TransObjService;
+import com.persagy.dmp.rwd.datautils.service.TransObjectValidService;
+import com.persagy.dmp.rwd.datautils.service.TransRelationService;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-14
+ * @verison: 1.0
+ */
+@Slf4j
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class TestTransServiceForWD {
+
+	@Autowired
+	private TransObjInfoService transObjInfoService;
+
+	@Autowired
+	private TransObjService transObjervice;
+
+	@Autowired
+	private TransRelationService transRelationService;
+
+	@Autowired
+	private TransObjectValidService transObjectValidService;
+
+	private String groupCode = "WD";
+	private String projectId = "Pj4403070003";
+	private String basePath = "/Users/devsaga/persagy/4403070003-1128龙岗万达";
+
+	@Test
+	public void transObjects() throws Exception {
+
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile("objects.json");
+		transObjervice.trans(ctx);
+	}
+
+	@Test
+	public void transObjInfos() throws Exception {
+
+//		String fileName = "obj_infos.json";
+		String fileName = "obj_infos-change.json";
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile(fileName);
+		transObjInfoService.trans(ctx);
+	}
+
+
+	/**
+	 * 导入前要清除掉关系数据
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void transRelation() throws Exception {
+
+		String fileName = "rel_btw_objs.json";
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile(fileName);
+		// 先导出为sql
+		transRelationService.trans(ctx);
+	}
+
+	/**
+	 * 清理失效对象
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void transObjectValid() throws Exception {
+
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile("objects.json");
+		transObjectValidService.trans(ctx);
+	}
+
+
+}

+ 100 - 0
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForXG.java

@@ -0,0 +1,100 @@
+package com.persagy.dmp.rwd.datautils;
+
+import com.persagy.dmp.rwd.datautils.model.TransContext;
+import com.persagy.dmp.rwd.datautils.service.TransObjInfoService;
+import com.persagy.dmp.rwd.datautils.service.TransObjService;
+import com.persagy.dmp.rwd.datautils.service.TransObjectValidService;
+import com.persagy.dmp.rwd.datautils.service.TransRelationService;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-14
+ * @verison: 1.0
+ */
+@Slf4j
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class TestTransServiceForXG {
+
+	@Autowired
+	private TransObjInfoService transObjInfoService;
+
+	@Autowired
+	private TransObjService transObjervice;
+
+	@Autowired
+	private TransRelationService transRelationService;
+
+	@Autowired
+	private TransObjectValidService transObjectValidService;
+
+	private String groupCode = "XG";
+	private String projectId = "Pj5001120003";
+	private String basePath = "/Users/devsaga/persagy/5001120003";
+
+	@Test
+	public void transObjects() throws Exception {
+
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile("objects.json");
+		transObjervice.trans(ctx);
+	}
+
+	@Test
+	public void transObjInfos() throws Exception {
+
+		String fileName = "obj_infos.json";
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile(fileName);
+		transObjInfoService.trans(ctx);
+	}
+
+
+	/**
+	 * 导入前要清除掉关系数据
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void transRelation() throws Exception {
+
+		String fileName = "rel_btw_objs.json";
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile(fileName);
+		// 先导出为sql
+		transRelationService.transToSql(ctx);
+	}
+
+	/**
+	 * 清理失效对象
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void transObjectValid() throws Exception {
+
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile("objects.json");
+		transObjectValidService.trans(ctx);
+	}
+
+
+}

+ 101 - 0
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForZS.java

@@ -0,0 +1,101 @@
+package com.persagy.dmp.rwd.datautils;
+
+import com.persagy.dmp.rwd.datautils.model.TransContext;
+import com.persagy.dmp.rwd.datautils.service.TransObjInfoService;
+import com.persagy.dmp.rwd.datautils.service.TransObjService;
+import com.persagy.dmp.rwd.datautils.service.TransObjectValidService;
+import com.persagy.dmp.rwd.datautils.service.TransRelationService;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-14
+ * @verison: 1.0
+ */
+@Slf4j
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class TestTransServiceForZS {
+
+	@Autowired
+	private TransObjInfoService transObjInfoService;
+
+	@Autowired
+	private TransObjService transObjervice;
+
+	@Autowired
+	private TransRelationService transRelationService;
+
+	@Autowired
+	private TransObjectValidService transObjectValidService;
+
+	private String groupCode = "ZS";
+	private String projectId = "Pj4403050019";
+	private String basePath = "/Users/devsaga/persagy/4403050019-2020-11-30";
+
+	@Test
+	public void transObjects() throws Exception {
+
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile("objects.json");
+		transObjervice.trans(ctx);
+	}
+
+	@Test
+	public void transObjInfos() throws Exception {
+
+//		String fileName = "obj_infos.json";
+		String fileName = "obj_infos-error1.json";
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile(fileName);
+		transObjInfoService.trans(ctx);
+	}
+
+
+	/**
+	 * 导入前要清除掉关系数据
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void transRelation() throws Exception {
+
+		String fileName = "rel_btw_objs.json";
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile(fileName);
+		// 先导出为sql
+		transRelationService.transToSql(ctx);
+	}
+
+	/**
+	 * 清理失效对象
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void transObjectValid() throws Exception {
+
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile("objects.json");
+		transObjectValidService.trans(ctx);
+	}
+
+
+}

+ 109 - 0
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/DataTypeMapping.java

@@ -0,0 +1,109 @@
+package com.persagy.dmp.rwd.dic;
+
+import com.persagy.dmp.rwd.enums.FuncidCategory;
+import com.persagy.dmp.rwd.enums.FuncidDataType;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author: yaoll
+ * @date: 2020-11-30
+ * @verison: 1.0
+ */
+public class DataTypeMapping {
+
+	private final static List<FuncidDefModel> list = new LinkedList<>();
+
+	public static FuncidDefModel getDataType(String origDataType) {
+		if (origDataType == null) {
+			return null;
+		}
+		Optional<FuncidDefModel> first = list.stream()
+				.filter(item -> origDataType.equals(item.getOrigDataType()))
+				.findFirst();
+		return first.isPresent() ? first.get() : null;
+	}
+
+	static {
+		list.add(init("Num", "DOUBLE", "STATIC", "N", "N"));
+		list.add(init("Nums", "DOUBLE", "STATIC", "Y", "N"));
+		list.add(init("Numr", "DOUBLE", "STATIC", "N", "Y"));
+		list.add(init("Numrs", "DOUBLE", "STATIC", "Y", "Y"));
+		list.add(init("Bool", "BOOLEAN", "STATIC", "N", "N"));
+		list.add(init("Bools", "BOOLEAN", "STATIC", "Y", "N"));
+		list.add(init("Enum", "ENUM", "STATIC", "N", "N"));
+		list.add(init("Enums", "ENUM", "STATIC", "Y", "N"));
+		list.add(init("Menum", "MENUM", "STATIC", "N", "N")); // error
+		list.add(init("MEnum", "MENUM", "STATIC", "N", "N"));
+		list.add(init("MEnums", "MENUM", "STATIC", "Y", "N"));
+		list.add(init("Str", "STRING", "STATIC", "N", "N"));
+		list.add(init("Strs", "STRING", "STATIC", "Y", "N"));
+		list.add(init("Time", "DATETIME", "STATIC", "N", "N"));
+		list.add(init("Times", "DATETIME", "STATIC", "Y", "N"));
+		list.add(init("Timer", "DATETIME", "STATIC", "N", "Y"));
+		list.add(init("Timers", "DATETIME", "STATIC", "Y", "Y"));
+		list.add(init("Dtime", "DATETIME", "STATIC", "N", "N")); // error
+		list.add(init("DTime", "DATETIME", "STATIC", "N", "N"));
+		list.add(init("DTimes", "DATETIME", "STATIC", "Y", "N"));
+		list.add(init("DTimer", "DATETIME", "STATIC", "N", "Y"));
+		list.add(init("DTimers", "DATETIME", "STATIC", "Y", "Y"));
+		list.add(init("Attachment", "ATTACHMENT", "STATIC", "N", "N"));
+		list.add(init("Attachments", "ATTACHMENT", "STATIC", "Y", "N"));
+		list.add(init("Inst", "DOUBLE", "SEQUENTIAL", "N", "N"));
+		list.add(init("Insts", "DOUBLE", "SEQUENTIAL", "Y", "N"));
+		list.add(init("Acc", "DOUBLE", "SEQUENTIAL", "N", "N"));
+		list.add(init("Accs", "DOUBLE", "SEQUENTIAL", "Y", "N"));
+		list.add(init("Boolv", "BOOLEAN", "SEQUENTIAL", "N", "N"));
+		list.add(init("Boolvs", "BOOLEAN", "SEQUENTIAL", "Y", "N"));
+		list.add(init("Enumv", "ENUM", "SEQUENTIAL", "N", "N"));
+		list.add(init("Enumvs", "ENUM", "SEQUENTIAL", "Y", "N"));
+		list.add(init("MEnumv", "MENUM", "SEQUENTIAL", "N", "N"));
+		list.add(init("MEnumvs", "MENUM", "SEQUENTIAL", "Y", "N"));
+		list.add(init("Strv", "STRING", "SEQUENTIAL", "N", "N"));
+		list.add(init("Strvs", "STRING", "SEQUENTIAL", "Y", "N"));
+		list.add(init("Timev", "DATETIME", "SEQUENTIAL", "N", "N"));
+		list.add(init("Timevs", "DATETIME", "SEQUENTIAL", "Y", "N"));
+		list.add(init("DTimev", "DATETIME", "SEQUENTIAL", "N", "N"));
+		list.add(init("DTimevs", "DATETIME", "SEQUENTIAL", "Y", "N"));
+		list.add(init("Nump", "DOUBLE", "GRADATION", "N", "N"));
+		list.add(init("Numps", "DOUBLE", "GRADATION", "Y", "N"));
+		list.add(init("Boolp", "BOOLEAN", "GRADATION", "N", "N"));
+		list.add(init("Boolps", "BOOLEAN", "GRADATION", "Y", "N"));
+		list.add(init("Enump", "ENUM", "GRADATION", "N", "N"));
+		list.add(init("Enumps", "ENUM", "GRADATION", "Y", "N"));
+		list.add(init("MEnump", "MENUM", "GRADATION", "N", "N"));
+		list.add(init("MEnumps", "MENUM", "GRADATION", "Y", "N"));
+		list.add(init("Strp", "STRING", "GRADATION", "N", "N"));
+		list.add(init("Strps", "STRING", "GRADATION", "Y", "N"));
+		list.add(init("Timep", "DATETIME", "GRADATION", "N", "N"));
+		list.add(init("Timeps", "DATETIME", "GRADATION", "Y", "N"));
+		list.add(init("DTimep", "DATETIME", "GRADATION", "N", "N"));
+		list.add(init("DTimeps", "DATETIME", "GRADATION", "Y", "N"));
+		list.add(init("Numi", "DOUBLE", "PULSE", "N", "N"));
+		list.add(init("Numis", "DOUBLE", "PULSE", "Y", "N"));
+		list.add(init("Booli", "BOOLEAN", "PULSE", "N", "N"));
+		list.add(init("Boolis", "BOOLEAN", "PULSE", "Y", "N"));
+		list.add(init("Enumi", "ENUM", "PULSE", "N", "N"));
+		list.add(init("Enumis", "ENUM", "PULSE", "Y", "N"));
+		list.add(init("MEnumi", "MENUM", "PULSE", "N", "N"));
+		list.add(init("MEnumis", "MENUM", "PULSE", "Y", "N"));
+		list.add(init("Stri", "STRING", "PULSE", "N", "N"));
+		list.add(init("Stris", "STRING", "PULSE", "Y", "N"));
+		list.add(init("Timei", "DATETIME", "PULSE", "N", "N"));
+		list.add(init("Timeis", "DATETIME", "PULSE", "Y", "N"));
+		list.add(init("DTimei", "DATETIME", "PULSE", "N", "N"));
+		list.add(init("DTimeis", "DATETIME", "PULSE", "Y", "N"));
+	}
+
+	private static FuncidDefModel init(String origType, String dataType, String category, String isMulti, String isRegion) {
+		FuncidDefModel model = new FuncidDefModel();
+		model.setOrigDataType(origType);
+		model.setDataType(FuncidDataType.valueOf(dataType));
+		model.setCategory(FuncidCategory.valueOf(category));
+		model.setIsMultiple("Y".equalsIgnoreCase(isMulti));
+		model.setIsRegion("Y".equalsIgnoreCase(isRegion));
+		return model;
+	}
+}

+ 155 - 0
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/ExcelUtils.java

@@ -0,0 +1,155 @@
+package com.persagy.dmp.rwd.dic;
+
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author: yaoll
+ * @date: 2020-11-30
+ * @verison: 1.0
+ */
+public class ExcelUtils {
+
+	public static Object parseCell(Cell cell, String type) {
+		if (cell == null) {
+			return null;
+		}
+		CellType cellType = cell.getCellTypeEnum();
+		if ("string".equalsIgnoreCase(type)) {
+			if (cellType == CellType.STRING) {
+				String val = cell.getStringCellValue();
+				return val == null ? null : val.trim();
+			} else if (cellType == CellType.NUMERIC) {
+				return cell.getNumericCellValue() + "";
+			}
+		} else if ("integer".equalsIgnoreCase(type)) {
+			if (cellType == CellType.STRING) {
+				String stringCellValue = cell.getStringCellValue();
+				return stringCellValue == null ? null : Double.valueOf(stringCellValue).intValue();
+			} else if (cellType == CellType.NUMERIC) {
+				return Double.valueOf(cell.getNumericCellValue()).intValue();
+			}
+		} else if ("double".equalsIgnoreCase(type)) {
+			if (cellType == CellType.STRING) {
+				String stringCellValue = cell.getStringCellValue();
+				return stringCellValue == null ? null : Double.valueOf(stringCellValue);
+			} else if (cellType == CellType.NUMERIC) {
+				return cell.getNumericCellValue();
+			}
+		} else if ("date".equalsIgnoreCase(type)) {
+			if (cellType == CellType.NUMERIC) {
+				Date dateCellValue = cell.getDateCellValue();
+				return dateCellValue == null ? null : dateCellValue;
+			} else if (cellType == CellType.STRING) {
+				String val = cell.getStringCellValue();
+				return val == null ? null : val.trim();
+			}
+		}
+		return null;
+	}
+
+
+	private String basepath = "/Users/devsaga/persagy/数据字典20201118/Ch2-物理世界";
+
+	@Test
+	public void test1() throws Exception {
+		String path = basepath + "/2.2-设备设施类对象/2.2.3-系统";
+		showPath(path);
+	}
+
+	public void showPath(String path) throws Exception {
+		List<String> names = listFile(path);
+		if (names != null) {
+			for (String name : names) {
+//				System.out.println("----------------------");
+				String fileName = path + "/" + name;
+				FileInputStream inputStream = new FileInputStream(fileName);
+//				System.out.println(fileName);
+				Workbook workbook = new XSSFWorkbook(inputStream);
+				int numberOfSheets = workbook.getNumberOfSheets();
+				for (int i = 0; i < numberOfSheets; i++) {
+					Sheet sheet = workbook.getSheetAt(i);
+					String sheetName = sheet.getSheetName();
+					// funcids.addAll(readSheet("FFFA", "/2.2-设备设施类对象/2.2.3-系统/50-消防专业系统.xlsx", "FA火灾报警系统"));
+					System.out.println("funcids.addAll(readSheet(\"" + sheetName.substring(0, 4) + "\", \"" + fileName + "\", \"" + sheetName + "\"));");
+				}
+			}
+		}
+	}
+
+	@Test
+	public void test2() throws Exception {
+		showPathForEquipment(basepath + "/2.2-设备设施类对象/2.2.4-设备设施/" + "1-强电专业");
+		showPathForEquipment(basepath + "/2.2-设备设施类对象/2.2.4-设备设施/" + "2-弱电专业");
+		showPathForEquipment(basepath + "/2.2-设备设施类对象/2.2.4-设备设施/" + "3-空调专业");
+		showPathForEquipment(basepath + "/2.2-设备设施类对象/2.2.4-设备设施/" + "4-给排水专业");
+		showPathForEquipment(basepath + "/2.2-设备设施类对象/2.2.4-设备设施/" + "5-消防专业");
+		showPathForEquipment(basepath + "/2.2-设备设施类对象/2.2.4-设备设施/" + "6-安防专业");
+		showPathForEquipment(basepath + "/2.2-设备设施类对象/2.2.4-设备设施/" + "7-土建精装专业");
+		showPathForEquipment(basepath + "/2.2-设备设施类对象/2.2.4-设备设施/" + "8-其他");
+	}
+
+	public void showPathForEquipment(String path) throws Exception {
+		List<String> names = listFile(path);
+		if (names != null) {
+			for (String name : names) {
+//				System.out.println("----------------------");
+				String fileName = path + "/" + name;
+				FileInputStream inputStream = new FileInputStream(fileName);
+//				System.out.println(fileName);
+				Workbook workbook = new XSSFWorkbook(inputStream);
+				int numberOfSheets = workbook.getNumberOfSheets();
+				for (int i = 0; i < numberOfSheets; i++) {
+					Sheet sheet = workbook.getSheetAt(i);
+					String sheetName = sheet.getSheetName();
+					// funcids.addAll(readSheet("FFFA", "/2.2-设备设施类对象/2.2.3-系统/50-消防专业系统.xlsx", "FA火灾报警系统"));
+					System.out.println("funcids.addAll(readSheet(\"" + sheetName.substring(0, 4) + "\", \"" + fileName + "\", \"" + sheetName + "\"));");
+				}
+			}
+		}
+	}
+
+	@Test
+	public void test3() throws Exception {
+		showPathForComponent(basepath + "/2.2-设备设施类对象/2.2.5-部件");
+	}
+
+	public void showPathForComponent(String path) throws Exception {
+		List<String> names = listFile(path);
+		if (names != null) {
+			for (String name : names) {
+//				System.out.println("----------------------");
+				String fileName = path + "/" + name;
+				FileInputStream inputStream = new FileInputStream(fileName);
+//				System.out.println(fileName);
+				Workbook workbook = new XSSFWorkbook(inputStream);
+				int numberOfSheets = workbook.getNumberOfSheets();
+				for (int i = 0; i < numberOfSheets; i++) {
+					Sheet sheet = workbook.getSheetAt(i);
+					String sheetName = sheet.getSheetName();
+					// funcids.addAll(readSheet("FFFA", "/2.2-设备设施类对象/2.2.3-系统/50-消防专业系统.xlsx", "FA火灾报警系统"));
+					System.out.println("funcids.addAll(readSheet(\"" + sheetName.substring(0, 6) + "\", \"" + fileName + "\", \"" + sheetName + "\"));");
+				}
+			}
+		}
+	}
+
+
+	private List<String> listFile(String path) {
+		File file = new File(path);
+		File[] files = file.listFiles();
+		return Arrays.stream(files).map(File::getName).filter(item -> !item.startsWith("~")).collect(Collectors.toList());
+	}
+
+}

+ 40 - 0
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/FuncidDefModel.java

@@ -0,0 +1,40 @@
+package com.persagy.dmp.rwd.dic;
+
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.persagy.dmp.rwd.enums.FuncidCategory;
+import com.persagy.dmp.rwd.enums.FuncidDataType;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class FuncidDefModel {
+
+	private String id;
+	private String code;
+	private String origCode;
+	private String name;
+	private String aliasCode;
+	private String aliasName;
+	private String classCode;
+	private FuncidCategory category;
+	private String type;
+	private String groupCode;
+	private String projectId;
+	private String firstTag;
+	private String secondTag;
+	private String priority;
+	private String inputMode;
+	private String unit;
+	private FuncidDataType dataType;
+	private String origDataType;
+	private Boolean isMultiple;
+	private Boolean isRegion;
+	private String formater;
+	private ArrayNode dataSource;
+	private String origDataSource;
+	private String note;
+	private Boolean subFlag;
+	private Boolean weakPoint;
+
+}

+ 134 - 0
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/FuncidUtils.java

@@ -0,0 +1,134 @@
+package com.persagy.dmp.rwd.dic;
+
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author: yaoll
+ * @date: 2020-11-30
+ * @verison: 1.0
+ */
+public class FuncidUtils {
+
+	private final static Set<String> baseFuncid = new HashSet<>();
+
+	static {
+		baseFuncid.add("ProjID");
+		baseFuncid.add("ProjName");
+		baseFuncid.add("ProjLocalID");
+		baseFuncid.add("ProjLocalName");
+		baseFuncid.add("BuildID");
+		baseFuncid.add("BuildName");
+		baseFuncid.add("BuildLocalID");
+		baseFuncid.add("BuildLocalName");
+		baseFuncid.add("FloorID");
+		baseFuncid.add("FloorName");
+		baseFuncid.add("FloorLocalID");
+		baseFuncid.add("FloorLocalName");
+		baseFuncid.add("RoomID");
+		baseFuncid.add("RoomName");
+		baseFuncid.add("RoomLocalID");
+		baseFuncid.add("RoomLocalName");
+		baseFuncid.add("ShaftID");
+		baseFuncid.add("ShaftName");
+		baseFuncid.add("ShaftLocalID");
+		baseFuncid.add("ShaftLocalName");
+		baseFuncid.add("SysID");
+		baseFuncid.add("SysName");
+		baseFuncid.add("SysLocalID");
+		baseFuncid.add("SysLocalName");
+		baseFuncid.add("EquipID");
+		baseFuncid.add("EquipName");
+		baseFuncid.add("EquipLocalID");
+		baseFuncid.add("EquipLocalName");
+		baseFuncid.add("ToolID");
+		baseFuncid.add("ToolName");
+		baseFuncid.add("ToolLocalID");
+		baseFuncid.add("ToolLocalName");
+		baseFuncid.add("ConsumID");
+		baseFuncid.add("ConsumName");
+		baseFuncid.add("ConsumLocalID");
+		baseFuncid.add("ConsumLocalName");
+
+		baseFuncid.add("ECModelID");
+		baseFuncid.add("ECModelName");
+		baseFuncid.add("ECModelLocalID");
+		baseFuncid.add("ECModelLocalName");
+
+		baseFuncid.add("SubentryID");
+		baseFuncid.add("SubentryName");
+		baseFuncid.add("SubentryLocalID");
+		baseFuncid.add("SubentryLocalName");
+
+		baseFuncid.add("BranchID");
+		baseFuncid.add("BranchName");
+		baseFuncid.add("BranchLocalID");
+		baseFuncid.add("BranchLocalName");
+
+		baseFuncid.add("BeaconID");
+		baseFuncid.add("BeaconlName");
+		baseFuncid.add("BeaconLocalID");
+		baseFuncid.add("BeaconLocalName");
+
+		baseFuncid.add("TenantID");
+		baseFuncid.add("TenantName");
+		baseFuncid.add("TenantLocalID");
+		baseFuncid.add("TenantLocalName");
+	}
+
+	public static boolean isBase(String code) {
+		return baseFuncid.contains(code);
+	}
+
+	public static ArrayNode transEnumDataSource(String dataSource) {
+		ArrayNode array = JsonNodeFactory.instance.arrayNode();
+		if (dataSource == null) {
+			return null;
+		}
+		// 包含换行符 直接返回
+		if (dataSource.indexOf("\n") > -1) {
+			return null;
+		}
+		// 预处理 ". " -> "."
+		while (dataSource.indexOf(". ") > -1) {
+			dataSource = dataSource.replace(". ", ".");
+		}
+		if (dataSource.startsWith("见《")) {
+			return null;
+		} else if (dataSource.indexOf(".") > -1) {
+
+			// 预处理
+			String tmp = dataSource.replace("(多选)", "")
+					.replace("(可多选)", "")
+					.replace("(可以多选)", "");
+
+			// 尝试解析
+			// 1.铸铁 2.钢 3.铝合金 4.铜管 5.复合型 99.其他
+			String[] split = tmp.split(" ");
+			if (split.length == 0) {
+				return null;
+			}
+			Map<String, String> data = new HashMap<>();
+			for (int i = 0; i < split.length; i++) {
+				String temp = split[i];
+				int idx = temp.indexOf(".");
+				if (idx == -1) {
+					continue;
+				}
+				String key = temp.substring(0, idx);
+				String value = temp.substring(idx + 1);
+				data.put(key, value);
+				ObjectNode item = array.addObject();
+				item.put("code", key);
+				item.put("name", value);
+			}
+		}
+		return array;
+	}
+}

+ 584 - 0
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/ImportClass.java

@@ -0,0 +1,584 @@
+package com.persagy.dmp.rwd.dic;
+
+import com.persagy.common.date.DateUtils;
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.rwd.enums.ObjType;
+import com.persagy.dmp.rwd.model.ClassDefModel;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.junit.Test;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * 导入类型定义
+ *
+ * @author: yaoll
+ * @date: 2020-11-30
+ * @verison: 1.0
+ */
+@Slf4j
+public class ImportClass {
+
+	private String basepath = "/Users/devsaga/persagy/数据字典20201118/Ch2-物理世界";
+
+	private String outPath = "/Users/devsaga/persagy/数据字典20201118/class-" + DateUtils.format(new Date()) + ".dml.sql";
+
+	@Test
+	public void importClassData() throws Exception {
+
+		// 所有类型
+		List<ClassDefModel> classes = new ArrayList<>();
+
+		// 顶级类型
+		initBaseClass(classes);
+
+		// 空间分区
+		initSpace(classes);
+
+		// 专业\系统\设备\部件
+		initEquipment(classes);
+
+		// 虚拟对象
+		initVirtual(classes);
+
+		// 工具
+		initTool(classes);
+
+		// 耗材
+		initMaterial(classes);
+
+		FileOutputStream fos = new FileOutputStream(outPath);
+		PrintWriter writer = new PrintWriter(new BufferedOutputStream(fos));
+		writer.println("truncate table rwd_def_class;");
+
+		// 基本类型
+		for (ClassDefModel item : classes) {
+			if (item.getParentCode() == null) {
+				writer.println(toSql(item));
+			}
+		}
+
+		//
+		List<String> parentCodes = Arrays.asList("space", "system", "equipment", "component", "virtual", "tool", "material");
+		for (String parentCode : parentCodes) {
+			for (ClassDefModel item : classes) {
+				if (parentCode.equals(item.getParentCode())) {
+					writer.println(toSql(item));
+				}
+			}
+			writer.flush();
+		}
+
+		// 基本信息点
+		for (ClassDefModel item : classes) {
+			if (item.getObjType() == ObjType.project && item.getParentCode() == null) {
+				writer.println(toFuncidSql(item, "id", "ProjID", "编码"));
+				writer.println(toFuncidSql(item, "name", "ProjName", "名称"));
+				writer.println(toFuncidSql(item, "localId", "ProjLocalID", "本地编码"));
+				writer.println(toFuncidSql(item, "localName", "ProjLocalName", "本地名称"));
+			} else if (item.getObjType() == ObjType.building && item.getParentCode() == null) {
+				writer.println(toFuncidSql(item, "id", "BuildID", "编码"));
+				writer.println(toFuncidSql(item, "name", "BuildName", "名称"));
+				writer.println(toFuncidSql(item, "localId", "BuildLocalID", "本地编码"));
+				writer.println(toFuncidSql(item, "localName", "BuildLocalName", "本地名称"));
+			} else if (item.getObjType() == ObjType.floor && item.getParentCode() == null) {
+				writer.println(toFuncidSql(item, "id", "FloorID", "编码"));
+				writer.println(toFuncidSql(item, "name", "FloorName", "名称"));
+				writer.println(toFuncidSql(item, "localId", "FloorLocalID", "本地编码"));
+				writer.println(toFuncidSql(item, "localName", "FloorLocalName", "本地名称"));
+			} else if (item.getObjType() == ObjType.space && item.getParentCode() == null) {
+				writer.println(toFuncidSql(item, "id", "RoomID", "编码"));
+				writer.println(toFuncidSql(item, "name", "RoomName", "名称"));
+				writer.println(toFuncidSql(item, "localId", "RoomLocalID", "本地编码"));
+				writer.println(toFuncidSql(item, "localName", "RoomLocalName", "本地名称"));
+			} else if (item.getObjType() == ObjType.system && item.getParentCode() == null) {
+				writer.println(toFuncidSql(item, "id", "SysID", "编码"));
+				writer.println(toFuncidSql(item, "name", "SysName", "名称"));
+				writer.println(toFuncidSql(item, "localId", "SysLocalID", "本地编码"));
+				writer.println(toFuncidSql(item, "localName", "SysLocalName", "本地名称"));
+			} else if (item.getObjType() == ObjType.equipment && item.getParentCode() == null) {
+				writer.println(toFuncidSql(item, "id", "EquipID", "编码"));
+				writer.println(toFuncidSql(item, "name", "EquipName", "名称"));
+				writer.println(toFuncidSql(item, "localId", "EquipLocalID", "本地编码"));
+				writer.println(toFuncidSql(item, "localName", "EquipLocalName", "本地名称"));
+			} else if (item.getObjType() == ObjType.component && item.getParentCode() == null) {
+				writer.println(toFuncidSql(item, "id", "EquipID", "编码"));
+				writer.println(toFuncidSql(item, "name", "EquipName", "名称"));
+				writer.println(toFuncidSql(item, "localId", "EquipLocalID", "本地编码"));
+				writer.println(toFuncidSql(item, "localName", "EquipLocalName", "本地名称"));
+			} else if (item.getObjType() == ObjType.shaft && item.getParentCode() == null) {
+				writer.println(toFuncidSql(item, "id", "ShaftID", "编码"));
+				writer.println(toFuncidSql(item, "name", "ShaftName", "名称"));
+				writer.println(toFuncidSql(item, "localId", "ShaftLocalID", "本地编码"));
+				writer.println(toFuncidSql(item, "localName", "ShaftLocalName", "本地名称"));
+			} else if ("VOEm".equals(item.getCode())) {
+				writer.println(toFuncidSql(item, "id", "ECModelID", "编码"));
+				writer.println(toFuncidSql(item, "name", "ECModelName", "名称"));
+				writer.println(toFuncidSql(item, "localId", "ECModelLocalID", "本地编码"));
+				writer.println(toFuncidSql(item, "localName", "ECModelLocalName", "本地名称"));
+			} else if ("VOSe".equals(item.getCode())) {
+				writer.println(toFuncidSql(item, "id", "SubentryID", "编码"));
+				writer.println(toFuncidSql(item, "name", "SubentryName", "名称"));
+				writer.println(toFuncidSql(item, "localId", "SubentryLocalID", "本地编码"));
+				writer.println(toFuncidSql(item, "localName", "SubentryLocalName", "本地名称"));
+			} else if ("VOBr".equals(item.getCode())) {
+				writer.println(toFuncidSql(item, "id", "BranchID", "编码"));
+				writer.println(toFuncidSql(item, "name", "BranchName", "名称"));
+				writer.println(toFuncidSql(item, "localId", "BranchLocalID", "本地编码"));
+				writer.println(toFuncidSql(item, "localName", "BranchLocalName", "本地名称"));
+			} else if ("VOBc".equals(item.getCode())) {
+				writer.println(toFuncidSql(item, "id", "BeaconID", "编码"));
+				writer.println(toFuncidSql(item, "name", "BeaconlName", "名称"));
+				writer.println(toFuncidSql(item, "localId", "BeaconLocalID", "本地编码"));
+				writer.println(toFuncidSql(item, "localName", "BeaconLocalName", "本地名称"));
+			} else if ("VOTn".equals(item.getCode())) {
+				writer.println(toFuncidSql(item, "id", "TenantID", "编码"));
+				writer.println(toFuncidSql(item, "name", "TenantName", "名称"));
+				writer.println(toFuncidSql(item, "localId", "TenantLocalID", "本地编码"));
+				writer.println(toFuncidSql(item, "localName", "TenantLocalName", "本地名称"));
+			} else if (item.getObjType() == ObjType.tool && item.getParentCode() == null) {
+				writer.println(toFuncidSql(item, "id", "ToolID", "编码"));
+				writer.println(toFuncidSql(item, "name", "ToolName", "名称"));
+				writer.println(toFuncidSql(item, "localId", "ToolLocalID", "本地编码"));
+				writer.println(toFuncidSql(item, "localName", "ToolLocalName", "本地名称"));
+			} else if (item.getObjType() == ObjType.material && item.getParentCode() == null) {
+				writer.println(toFuncidSql(item, "id", "ConsumID", "编码"));
+				writer.println(toFuncidSql(item, "name", "ConsumName", "名称"));
+				writer.println(toFuncidSql(item, "localId", "ConsumLocalID", "本地编码"));
+				writer.println(toFuncidSql(item, "localName", "ConsumLocalName", "本地名称"));
+			}
+		}
+
+//		classes.stream().filter(item -> item.getObjType() == ObjType.project).forEach(item -> {
+//			writer.println(toFuncidSql(item, "id", "ProjID", "编码"));
+//			writer.println(toFuncidSql(item, "name", "ProjName", "名称"));
+//			writer.println(toFuncidSql(item, "localId", "ProjLocalID", "本地编码"));
+//			writer.println(toFuncidSql(item, "localName", "ProjLocalName", "本地名称"));
+//		});
+//		classes.stream().filter(item -> item.getObjType().name().equals("building")).forEach(item -> {
+//			writer.println(toFuncidSql(item, "id", "BuildID", "编码"));
+//			writer.println(toFuncidSql(item, "name", "BuildName", "名称"));
+//			writer.println(toFuncidSql(item, "localId", "BuildLocalID", "本地编码"));
+//			writer.println(toFuncidSql(item, "localName", "BuildLocalName", "本地名称"));
+//		});
+
+		writer.close();
+
+		for (ClassDefModel type : classes) {
+			System.out.println(JacksonMapper.toSimpleJson(type));
+		}
+	}
+
+	private String toSql(ClassDefModel model) {
+		StringBuilder sql = new StringBuilder("insert into rwd_def_class( id, code, obj_type, name, alias_code, alias_name, major_code, system_code, equipment_code, parent_code) values ");
+		sql.append("(");
+		sql.append("'").append(UUID.randomUUID().toString().replace("-", "")).append("', "); // id
+		sql.append("'").append(model.getCode()).append("', "); // code
+		sql.append("'").append(model.getObjType().name()).append("', "); // obj_type
+		sql.append("'").append(model.getName()).append("', "); // name
+		sql.append("'").append(model.getCode()).append("', "); // alias_code
+		sql.append("'").append(model.getName()).append("', "); // alias_name
+
+		if (model.getMajorCode() != null) { // major_code
+			sql.append("'").append(model.getMajorCode()).append("', ");
+		} else {
+			sql.append("null, ");
+		}
+
+		if (model.getSystemCode() != null) { // system_code
+			sql.append("'").append(model.getSystemCode()).append("', ");
+		} else {
+			sql.append("null, ");
+		}
+
+		if (model.getEquipmentCode() != null) { // equipment_code
+			sql.append("'").append(model.getEquipmentCode()).append("', ");
+		} else {
+			sql.append("null, ");
+		}
+
+		if (model.getParentCode() != null) { // parent_code
+			sql.append("'").append(model.getParentCode()).append("', ");
+		} else {
+			sql.append("null, ");
+		}
+
+		// 去掉最后的分隔符 ", "
+		sql.deleteCharAt(sql.length() - 1);
+		sql.deleteCharAt(sql.length() - 1);
+		sql.append(");");
+		return sql.toString();
+	}
+
+	private String toFuncidSql(ClassDefModel model, String code, String origCode, String name) {
+		StringBuilder buff = new StringBuilder("");
+		buff.append("insert into rwd_def_funcid ");
+		buff.append("(id,code,orig_code,name,alias_code,alias_name,class_code,type,group_code,project_id,category,");
+		buff.append("first_tag,second_tag,priority,input_mode,unit,data_type,orig_data_type,is_multiple,is_region,formater,data_source,orig_data_source,note,sub_flag,weak_point) \n");
+		buff.append("values (");
+		buff.append("'").append(UUID.randomUUID().toString().replace("-", "")).append("',"); // id
+		buff.append("'").append(code).append("',"); //code
+		buff.append("'").append(origCode).append("',"); //orig_code
+		buff.append("'").append(name).append("',"); //name
+		buff.append("'").append(origCode).append("',"); //alias_code
+		buff.append("'").append(name).append("',"); //alias_name
+		buff.append("'").append(model.getCode()).append("',"); // class_code
+		buff.append("'common',");// type
+		buff.append("'0',");//
+		buff.append("'0',");//
+		buff.append("'STATIC',");//
+		buff.append("null,");// first_tag
+		buff.append("null,");
+		buff.append("null,");
+		// input_mode
+		if ("id".equals(code) || "name".equals(code)) {
+			buff.append("'X',");
+		} else if ("localId".equals(code) || "localName".equals(code)) {
+			buff.append("'B1',");
+		} else {
+			buff.append("null,");
+		}
+
+		buff.append("null,");
+		buff.append("'STRING',");
+		buff.append("'Str',");
+		buff.append("0,");
+		buff.append("0,");
+		buff.append("null,");// formater
+		buff.append("null,");
+		buff.append("null,");
+		buff.append("null,");
+		buff.append("0,");
+		buff.append("0);");
+		return buff.toString();
+	}
+
+	private void initBaseClass(List<ClassDefModel> classes) {
+		classes.add(prepareModel("project", "project", "项目", null, null, null));
+		classes.add(prepareModel("building", "building", "建筑", null, null, null));
+		classes.add(prepareModel("floor", "floor", "楼层", null, null, null));
+		classes.add(prepareModel("space", "space", "空间", null, null, null));
+		classes.add(prepareModel("system", "system", "系统", null, null, null));
+		classes.add(prepareModel("equipment", "equipment", "设备", null, null, null));
+		classes.add(prepareModel("component", "component", "部件", null, null, null));
+		classes.add(prepareModel("shaft", "shaft", "竖井", null, null, null));
+		classes.add(prepareModel("virtual", "virtual", "虚拟对象", null, null, null));
+		classes.add(prepareModel("tool", "tool", "工具", null, null, null));
+		classes.add(prepareModel("material", "material", "耗材", null, null, null));
+	}
+
+	private void initSpace(List<ClassDefModel> classes) {
+		classes.add(prepareModel("space", "GeneralZone", "物业分区", "space", null, null));
+		classes.add(prepareModel("space", "PowerSupplyZone", "供电分区", "space", null, null));
+		classes.add(prepareModel("space", "LightingZone", "照明分区", "space", null, null));
+		classes.add(prepareModel("space", "NetworkZone", "网络分区", "space", null, null));
+		classes.add(prepareModel("space", "AirConditioningZone", "空调分区", "space", null, null));
+		classes.add(prepareModel("space", "HeatingZone", "采暖分区", "space", null, null));
+		classes.add(prepareModel("space", "CleanZone", "洁净分区", "space", null, null));
+		classes.add(prepareModel("space", "DomesticWaterSupplyZone", "生活给水分区", "space", null, null));
+		classes.add(prepareModel("space", "FireZone", "防火分区", "space", null, null));
+		classes.add(prepareModel("space", "SecurityZone", "安防分区", "space", null, null));
+		classes.add(prepareModel("space", "TenantZone", "租户分区", "space", null, null));
+		classes.add(prepareModel("space", "FunctionZone", "功能分区", "space", null, null));
+		classes.add(prepareModel("space", "OtherZone", "其他分区", "space", null, null));
+	}
+
+	private void initEquipment(List<ClassDefModel> classes) throws IOException {
+		String classFile = basepath + "/2.2-设备设施类对象/2.2.1-设备设施类对象分类体系.xlsx";
+		String sheetName = "设备(部件)类";
+
+		FileInputStream inputStream = new FileInputStream(classFile);
+		Workbook workbook = new XSSFWorkbook(inputStream);
+		Sheet sheet = workbook.getSheet(sheetName);
+		if (sheet == null) {
+			return;
+		}
+
+		// 行号从0开始, 从第2行开始读数据
+		Set<String> systemCodes = new HashSet<>();
+		Set<String> equipmentCodes = new HashSet<>();
+		int startRowNum = 2;
+		int lastRowNum = sheet.getLastRowNum();
+		CacheModel cache = new CacheModel();
+		for (int rowIndex = startRowNum; rowIndex <= lastRowNum; rowIndex++) {
+			Row row = sheet.getRow(rowIndex);
+			if (row == null) {
+				log.info("row[{}] is null", rowIndex);
+				continue;
+			}
+
+			// 0专业, 3系统编码, 5系统名称, 6设备编码, 8设备名称
+			CacheModel target = new CacheModel();
+			target.majorCode = (String) ExcelUtils.parseCell(row.getCell(0), "string");// 专业编码
+			target.systemCode = (String) ExcelUtils.parseCell(row.getCell(3), "string");//系统类编码
+			target.systemName = (String) ExcelUtils.parseCell(row.getCell(5), "string");//系统类名称
+			target.equipCode = (String) ExcelUtils.parseCell(row.getCell(6), "string");//设备设施类编码
+			target.equipName = (String) ExcelUtils.parseCell(row.getCell(8), "string");//设备设施类名称
+			target.componentCode = (String) ExcelUtils.parseCell(row.getCell(9), "string");//部件类编码
+			target.componentName = (String) ExcelUtils.parseCell(row.getCell(11), "string");//部件类名称
+//			System.out.println(rowIndex + ": " + target.majorCode + "\t" + target.systemCode + "\t" + target.equipCode + "\t" + target.componentCode);
+
+			// 专业不为空
+			if (target.majorCode != null) {
+				cache.majorCode = target.majorCode;
+				cache.systemCode = null;
+				cache.systemName = null;
+				cache.equipCode = null;
+				cache.equipName = null;
+				cache.componentCode = null;
+				cache.componentName = null;
+			} else {
+				target.majorCode = cache.majorCode;
+			}
+			// 系统不为空
+			if (target.systemCode != null) {
+				cache.systemCode = target.systemCode;
+				cache.systemName = target.systemName;
+				cache.equipCode = null;
+				cache.equipName = null;
+				cache.componentCode = null;
+				cache.componentName = null;
+			} else {
+				target.systemCode = cache.systemCode;
+				target.systemName = cache.systemName;
+			}
+			// 设备不为空
+			if (target.equipCode != null) {
+				cache.equipCode = target.equipCode;
+				cache.equipName = target.equipName;
+				cache.componentCode = null;
+				cache.componentName = null;
+			} else {
+				target.equipCode = cache.equipCode;
+				target.equipName = cache.equipName;
+			}
+			// 部件不为空
+			if (target.componentCode != null) {
+			}
+
+			// 拼装实际的系统编码和设备编码
+			CacheModel object = new CacheModel();
+			object.majorCode = target.majorCode;
+			object.systemCode = target.majorCode + target.systemCode;
+			object.systemName = target.systemName;
+			object.equipCode = target.majorCode + target.equipCode;
+			object.equipName = target.equipName;
+			object.componentCode = target.componentCode;
+			object.componentName = target.componentName;
+
+			// 判断系统是否存在
+			if (!systemCodes.contains(object.systemCode)) {
+				ClassDefModel system = new ClassDefModel();
+				system.setMajorCode(object.majorCode);
+				system.setCode(object.systemCode);
+				system.setName(object.systemName);
+				system.setParentCode("system");
+				system.setObjType(ObjType.system);
+				classes.add(system);
+				systemCodes.add(object.systemCode);
+			}
+			// 判断设备是否存在
+			if (!equipmentCodes.contains(object.equipCode)) {
+				ClassDefModel equipment = new ClassDefModel();
+				equipment.setMajorCode(object.majorCode);
+				equipment.setSystemCode(object.systemCode);
+				equipment.setCode(object.equipCode);
+				equipment.setName(object.equipName);
+				equipment.setParentCode("equipment");
+				equipment.setObjType(ObjType.equipment);
+				classes.add(equipment);
+				equipmentCodes.add(object.equipCode);
+			}
+			// 部件不为空
+			if (object.componentCode != null) {
+				ClassDefModel component = new ClassDefModel();
+				component.setMajorCode(object.majorCode);
+				component.setSystemCode(object.systemCode);
+				component.setEquipmentCode(object.equipCode);
+				component.setCode(object.majorCode + object.componentCode);
+				component.setName(object.componentName);
+				component.setParentCode("component");
+				component.setObjType(ObjType.component);
+				classes.add(component);
+			}
+		}
+	}
+
+	private void initVirtual(List<ClassDefModel> classes) {
+		classes.add(prepareModel("virtual", "VOEm", "能耗模型", "virtual", null, null));
+		classes.add(prepareModel("virtual", "VOSe", "分项", "virtual", null, null));
+		classes.add(prepareModel("virtual", "VOBr", "支路", "virtual", null, null));
+		classes.add(prepareModel("virtual", "VOBc", "信标", "virtual", null, null));
+		classes.add(prepareModel("virtual", "VOTn", "租户", "virtual", null, null));
+		classes.add(prepareModel("virtual", "VOWs", "工作历", "virtual", null, null));
+		classes.add(prepareModel("virtual", "VOZn", "空间组合", "virtual", null, null));
+		classes.add(prepareModel("virtual", "VOGp", "设备设施组合", "virtual", null, null));
+	}
+
+	private void initTool(List<ClassDefModel> classes) throws IOException {
+		String classFile = basepath + "/2.3-耗材工具类对象/2.3.1-耗材工具类对象分类体系.xlsx";
+		String sheetName = "工具";
+
+		FileInputStream inputStream = new FileInputStream(classFile);
+		Workbook workbook = new XSSFWorkbook(inputStream);
+		Sheet sheet = workbook.getSheet(sheetName);
+		if (sheet == null) {
+			return;
+		}
+
+		// 行号从0开始, 从第2行开始读数据
+		// 一级分类使用systemCode, 二级分类使用equipCode
+		int startRowNum = 1;
+		int lastRowNum = sheet.getLastRowNum();
+		CacheModel cache = new CacheModel();
+		for (int rowIndex = startRowNum; rowIndex <= lastRowNum; rowIndex++) {
+			Row row = sheet.getRow(rowIndex);
+			if (row == null) {
+				log.info("row[{}] is null", rowIndex);
+				continue;
+			}
+			// 0专业, 3系统编码, 5系统名称, 6设备编码, 8设备名称
+			CacheModel target = new CacheModel();
+			target.systemCode = (String) ExcelUtils.parseCell(row.getCell(0), "string");// 一级分类编码
+			target.equipCode = (String) ExcelUtils.parseCell(row.getCell(3), "string");//二级分类编码
+			target.componentCode = (String) ExcelUtils.parseCell(row.getCell(6), "string");//工具类编码
+			target.componentName = (String) ExcelUtils.parseCell(row.getCell(8), "string");//工具类名称
+//			System.out.println(rowIndex + ": " + target.majorCode + "\t" + target.systemCode + "\t" + target.equipCode + "\t" + target.componentCode);
+
+			// 一级分类编码
+			if (target.systemCode != null) {
+				cache.systemCode = target.systemCode;
+				cache.equipCode = null;
+				cache.componentCode = null;
+				cache.componentName = null;
+			} else {
+				target.systemCode = cache.systemCode;
+			}
+			// 二级分类编码
+			if (target.equipCode != null) {
+				cache.equipCode = target.equipCode;
+				cache.componentCode = null;
+				cache.componentName = null;
+			} else {
+				target.equipCode = cache.equipCode;
+			}
+
+			// 拼装实际的系统编码和设备编码
+			CacheModel object = new CacheModel();
+			object.systemCode = target.systemCode;
+			object.equipCode = target.systemCode + target.equipCode;
+			object.componentCode = target.componentCode;
+			object.componentName = target.componentName;
+
+			// 工具类编码
+			if (object.componentCode != null) {
+				ClassDefModel component = new ClassDefModel();
+				component.setSystemCode(object.systemCode);
+				component.setEquipmentCode(object.equipCode);
+				component.setCode(object.componentCode);
+				component.setName(object.componentName);
+				component.setParentCode("tool");
+				component.setObjType(ObjType.tool);
+				classes.add(component);
+			}
+		}
+	}
+
+	private void initMaterial(List<ClassDefModel> classes) throws IOException {
+		String classFile = basepath + "/2.3-耗材工具类对象/2.3.1-耗材工具类对象分类体系.xlsx";
+		String sheetName = "耗材 ";
+
+		FileInputStream inputStream = new FileInputStream(classFile);
+		Workbook workbook = new XSSFWorkbook(inputStream);
+		Sheet sheet = workbook.getSheet(sheetName);
+		if (sheet == null) {
+			return;
+		}
+
+		// 行号从0开始, 从第2行开始读数据
+		// 一级分类使用systemCode, 二级分类使用equipCode
+		int startRowNum = 1;
+		int lastRowNum = sheet.getLastRowNum();
+		CacheModel cache = new CacheModel();
+		for (int rowIndex = startRowNum; rowIndex <= lastRowNum; rowIndex++) {
+			Row row = sheet.getRow(rowIndex);
+			if (row == null) {
+				log.info("row[{}] is null", rowIndex);
+				continue;
+			}
+			// 0专业, 3系统编码, 5系统名称, 6设备编码, 8设备名称
+			CacheModel target = new CacheModel();
+			target.systemCode = (String) ExcelUtils.parseCell(row.getCell(0), "string");// 一级分类编码
+			target.equipCode = (String) ExcelUtils.parseCell(row.getCell(3), "string");//二级分类编码
+			target.componentCode = (String) ExcelUtils.parseCell(row.getCell(6), "string");//耗材类编码
+			target.componentName = (String) ExcelUtils.parseCell(row.getCell(8), "string");//耗材类名称
+//			System.out.println(rowIndex + ": " + target.majorCode + "\t" + target.systemCode + "\t" + target.equipCode + "\t" + target.componentCode);
+
+			// 一级分类编码
+			if (target.systemCode != null) {
+				cache.systemCode = target.systemCode;
+				cache.equipCode = null;
+				cache.componentCode = null;
+				cache.componentName = null;
+			} else {
+				target.systemCode = cache.systemCode;
+			}
+			// 二级分类编码
+			if (target.equipCode != null) {
+				cache.equipCode = target.equipCode;
+				cache.componentCode = null;
+				cache.componentName = null;
+			} else {
+				target.equipCode = cache.equipCode;
+			}
+
+			// 拼装实际的系统编码和设备编码
+			CacheModel object = new CacheModel();
+			object.systemCode = target.systemCode;
+			object.equipCode = target.systemCode + target.equipCode;
+			object.componentCode = target.componentCode;
+			object.componentName = target.componentName;
+
+			// 耗材类编码
+			if (object.componentCode != null) {
+				ClassDefModel component = new ClassDefModel();
+				component.setSystemCode(object.systemCode);
+				component.setEquipmentCode(object.equipCode);
+				component.setCode(object.componentCode);
+				component.setName(object.componentName);
+				component.setParentCode("material");
+				component.setObjType(ObjType.material);
+				classes.add(component);
+			}
+		}
+	}
+
+	public static final class CacheModel {
+		String majorCode;
+		String systemCode;
+		String systemName;
+		String equipCode;
+		String equipName;
+		String componentCode;
+		String componentName;
+	}
+
+	private ClassDefModel prepareModel(String objType, String code, String name, String parentCode, String majorCode, String systemCode) {
+		ClassDefModel model = new ClassDefModel();
+		model.setObjType(ObjType.valueOf(objType));
+		model.setCode(code);
+		model.setName(name);
+		model.setAliasCode(code);
+		model.setAliasName(name);
+		model.setParentCode(parentCode);
+		model.setMajorCode(majorCode);
+		model.setSystemCode(systemCode);
+		return model;
+	}
+
+}

+ 813 - 0
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/ImportFuncid.java

@@ -0,0 +1,813 @@
+package com.persagy.dmp.rwd.dic;
+
+import com.persagy.common.date.DateUtils;
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.rwd.enums.FuncidDataType;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.junit.Test;
+
+import java.io.*;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * @author: yaoll
+ * @date: 2020-11-30
+ * @verison: 1.0
+ */
+@Slf4j
+public class ImportFuncid {
+
+	private String basepath = "/Users/devsaga/persagy/数据字典20201118/Ch2-物理世界";
+
+	private String outPath = "/Users/devsaga/persagy/数据字典20201118/funcid-" + DateUtils.format(new Date()) + ".dml.sql";
+
+	@Test
+	public void importFuncidDef() throws IOException {
+		List<FuncidDefModel> funcids = new LinkedList<>();
+		importSpace(funcids);
+		importSystem(funcids);
+		importEquipment(funcids);
+		importComponent(funcids);
+		importVirtual(funcids);
+		importTool(funcids);
+		importMaterial(funcids);
+
+		FileOutputStream fos = new FileOutputStream(outPath);
+		PrintWriter writer = new PrintWriter(new BufferedOutputStream(fos));
+		writer.println("delete from rwd_def_funcid where code not in ('id', 'name', 'localId', 'localName');");
+		writer.println("commit;");
+		funcids.forEach(item -> {
+//			System.out.println(JacksonMapper.toSimpleJson(item));
+			writer.println(toSql(item));
+		});
+		writer.println("commit;");
+		writer.flush();
+		writer.close();
+	}
+
+	private String toSql(FuncidDefModel model) {
+		StringBuilder buff = new StringBuilder("");
+		buff.append("insert into rwd_def_funcid ");
+		buff.append("(id,code,orig_code,name,alias_code,alias_name,class_code,type,group_code,project_id,category,");
+		buff.append("first_tag,second_tag,priority,input_mode,unit,data_type,orig_data_type,is_multiple,is_region,formater,data_source,orig_data_source,note,sub_flag,weak_point) \n");
+		buff.append("values (");
+		buff.append("'").append(UUID.randomUUID().toString().replace("-", "")).append("',"); // id
+		buff.append("'").append(model.getCode()).append("',"); // code
+		buff.append("'").append(model.getOrigCode()).append("',"); // orig_code
+		buff.append("'").append(model.getName()).append("',"); // name
+		buff.append("'").append(model.getAliasCode()).append("',"); // alias_code
+		buff.append("'").append(model.getAliasName()).append("',"); // alias_name
+		buff.append("'").append(model.getClassCode()).append("',"); // class_code
+		buff.append("'").append(model.getType()).append("',"); // type
+		buff.append("'").append(model.getGroupCode()).append("',"); // group_code
+		buff.append("'").append(model.getProjectId()).append("',"); // project_id
+		buff.append("'").append(model.getCategory().name()).append("',"); // category
+		if (model.getFirstTag() != null) {
+			buff.append("'").append(model.getFirstTag()).append("',"); // first_tag
+		} else {
+			buff.append("null,");
+		}
+		if (model.getSecondTag() != null) {
+			buff.append("'").append(model.getSecondTag()).append("',"); // second_tag
+		} else {
+			buff.append("null,");
+		}
+		if (model.getPriority() != null) {
+			buff.append("'").append(model.getPriority()).append("',"); // priority
+		} else {
+			buff.append("null,");
+		}
+		if (model.getInputMode() != null) {
+			buff.append("'").append(model.getInputMode()).append("',"); // input_mode
+		} else {
+			buff.append("null,");
+		}
+		if (model.getUnit() != null) {
+			buff.append("'").append(model.getUnit()).append("',"); // unit
+		} else {
+			buff.append("null,");
+		}
+
+		buff.append("'").append(model.getDataType().name()).append("',"); // data_type
+		buff.append("'").append(model.getOrigDataType()).append("',"); // orig_data_type
+		buff.append(model.getIsMultiple() ? 1 : 0).append(","); // is_multiple
+		buff.append(model.getIsRegion() ? 1 : 0).append(","); // is_region
+		if (model.getFormater() != null) {
+			buff.append("'").append(model.getFormater()).append("',"); // formater
+		} else {
+			buff.append("null,");
+		}
+		if (model.getDataSource() != null) {
+			buff.append("'").append(model.getDataSource().toString()).append("',"); // data_source
+		} else {
+			buff.append("null,");
+		}
+		if (model.getOrigDataSource() != null) { // orig_data_source
+			buff.append("'").append(model.getOrigDataSource()).append("',"); // data_source
+		} else {
+			buff.append("null,");
+		}
+		if (model.getNote() != null) {
+			buff.append("'").append(model.getNote()).append("',"); // note}
+		} else {
+			buff.append("null,");
+		}
+		buff.append(model.getSubFlag() ? 1 : 0).append(","); // sub_flag
+		buff.append(model.getWeakPoint() ? 1 : 0).append(","); // weak_point
+		buff.deleteCharAt(buff.length() - 1);
+		buff.append(");");
+		return buff.toString();
+	}
+
+	private FuncidDefModel toFuncidDefModel(CacheModel model) {
+		FuncidDefModel funcid = new FuncidDefModel();
+		funcid.setGroupCode("0");
+		funcid.setProjectId("0");
+		funcid.setType("common");
+		funcid.setClassCode(model.classCode);
+		funcid.setFirstTag(model.firstTag != null ? model.firstTag.replace("\n", "") : null);
+		funcid.setSecondTag(model.secondTag != null ? model.secondTag.replace("\n", "") : null);
+		funcid.setCode(model.origCode.substring(0, 1).toLowerCase() + model.origCode.substring(1));
+		funcid.setOrigCode(model.origCode);
+		funcid.setAliasCode(model.origCode);
+		if (model.name != null) {
+			funcid.setName(model.name.replace("\n", ""));
+			funcid.setAliasName(model.name.replace("\n", ""));
+		} else {
+			log.error("funcid name is null : {}", JacksonMapper.toSimpleJson(funcid));
+		}
+		funcid.setUnit(model.unit);
+		funcid.setPriority(model.priority);
+		funcid.setInputMode(model.inputMode);
+		funcid.setOrigDataType(model.origDataType);
+		funcid.setSubFlag(false);
+		funcid.setWeakPoint(false);
+		FuncidDefModel dataType = DataTypeMapping.getDataType(model.origDataType);
+		if (dataType != null) {
+			funcid.setCategory(dataType.getCategory());
+			funcid.setDataType(dataType.getDataType());
+			funcid.setIsMultiple(dataType.getIsMultiple());
+			funcid.setIsRegion(dataType.getIsRegion());
+		} else {
+			return null;
+		}
+		funcid.setSubFlag(false);
+		if (model.remark != null) {
+			funcid.setNote(model.remark.replace("\n", ""));
+		}
+
+		if (model.origDataSource != null) {
+			funcid.setOrigDataSource(model.origDataSource.replace("\n", "nn")); // 去掉换行符
+		}
+		if (funcid.getDataType() == FuncidDataType.ENUM || funcid.getDataType() == FuncidDataType.MENUM || funcid.getDataType() == FuncidDataType.BOOLEAN) {
+			funcid.setDataSource(FuncidUtils.transEnumDataSource(model.origDataSource)); // 解析datasource
+		}
+		return funcid;
+	}
+
+	private void importSpace(List<FuncidDefModel> funcids) throws IOException {
+		funcids.addAll(readSheet("project", "/2.1-建筑空间类对象/2.1.1-项目.xlsx", "项目"));
+		funcids.addAll(readSheet("building", "/2.1-建筑空间类对象/2.1.2-建筑.xlsx", "建筑"));
+		funcids.addAll(readSheet("floor", "/2.1-建筑空间类对象/2.1.3-楼层.xlsx", "楼层"));
+		funcids.addAll(readSheet("shaft", "/2.1-建筑空间类对象/2.1.4-竖井.xlsx", "竖井"));
+
+		funcids.addAll(readSheet("GeneralZone", "/2.1-建筑空间类对象/2.1.5-空间.xlsx", "CMZ物业分区"));
+		funcids.addAll(readSheet("PowerSupplyZone", "/2.1-建筑空间类对象/2.1.5-空间.xlsx", "PSZ供电分区"));
+		funcids.addAll(readSheet("LightingZone", "/2.1-建筑空间类对象/2.1.5-空间.xlsx", "LTZ照明分区"));
+		funcids.addAll(readSheet("NetworkZone", "/2.1-建筑空间类对象/2.1.5-空间.xlsx", "NWZ网络分区"));
+		funcids.addAll(readSheet("AirConditioningZone", "/2.1-建筑空间类对象/2.1.5-空间.xlsx", "ACZ空调分区"));
+		funcids.addAll(readSheet("HeatingZone", "/2.1-建筑空间类对象/2.1.5-空间.xlsx", "HTZ采暖分区"));
+		funcids.addAll(readSheet("CleanZone", "/2.1-建筑空间类对象/2.1.5-空间.xlsx", "CLZ洁净分区"));
+		funcids.addAll(readSheet("DomesticWaterSupplyZone", "/2.1-建筑空间类对象/2.1.5-空间.xlsx", "DWZ生活给水分区"));
+		funcids.addAll(readSheet("FireZone", "/2.1-建筑空间类对象/2.1.5-空间.xlsx", "FRZ防火分区"));
+		funcids.addAll(readSheet("SecurityZone", "/2.1-建筑空间类对象/2.1.5-空间.xlsx", "SCZ安防分区"));
+		funcids.addAll(readSheet("TenantZone", "/2.1-建筑空间类对象/2.1.5-空间.xlsx", "TNZ租户分区"));
+		funcids.addAll(readSheet("FunctionZone", "/2.1-建筑空间类对象/2.1.5-空间.xlsx", "FCZ功能分区"));
+		funcids.addAll(readSheet("OtherZone", "/2.1-建筑空间类对象/2.1.5-空间.xlsx", "OTZ其他分区"));
+	}
+
+	private void importSystem(List<FuncidDefModel> funcids) throws IOException {
+		funcids.addAll(readSheet("system", "/2.2-设备设施类对象/2.2.2-设备设施类对象通用属性.xlsx", "系统"));
+
+		funcids.addAll(readSheet("SETD", "/2.2-设备设施类对象/2.2.3-系统/10-强电专业系统.xlsx", "TD变配电系统 "));
+		funcids.addAll(readSheet("SEDG", "/2.2-设备设施类对象/2.2.3-系统/10-强电专业系统.xlsx", "DG柴发机房系统"));
+		funcids.addAll(readSheet("SEBP", "/2.2-设备设施类对象/2.2.3-系统/10-强电专业系统.xlsx", "BP备用电源系统"));
+		funcids.addAll(readSheet("SEEP", "/2.2-设备设施类对象/2.2.3-系统/10-强电专业系统.xlsx", "EP机房动力系统"));
+		funcids.addAll(readSheet("SEOP", "/2.2-设备设施类对象/2.2.3-系统/10-强电专业系统.xlsx", "OP室外动力系统"));
+		funcids.addAll(readSheet("SEEL", "/2.2-设备设施类对象/2.2.3-系统/10-强电专业系统.xlsx", "EL电梯系统"));
+		funcids.addAll(readSheet("SELT", "/2.2-设备设施类对象/2.2.3-系统/10-强电专业系统.xlsx", "LT照明系统"));
+		funcids.addAll(readSheet("SETP", "/2.2-设备设施类对象/2.2.3-系统/10-强电专业系统.xlsx", "TP租户配电系统"));
+		funcids.addAll(readSheet("SELP", "/2.2-设备设施类对象/2.2.3-系统/10-强电专业系统.xlsx", "LP雷电防护系统"));
+		funcids.addAll(readSheet("SESD", "/2.2-设备设施类对象/2.2.3-系统/10-强电专业系统.xlsx", "SD强电人防系统"));
+
+		funcids.addAll(readSheet("WEBA", "/2.2-设备设施类对象/2.2.3-系统/20-弱电专业系统.xlsx", "BA建筑设备控制系统"));
+		funcids.addAll(readSheet("WETV", "/2.2-设备设施类对象/2.2.3-系统/20-弱电专业系统.xlsx", "TV电视信号系统"));
+		funcids.addAll(readSheet("WEMI", "/2.2-设备设施类对象/2.2.3-系统/20-弱电专业系统.xlsx", "MI多媒体信息发布系统  "));
+		funcids.addAll(readSheet("WEWT", "/2.2-设备设施类对象/2.2.3-系统/20-弱电专业系统.xlsx", "WT无线对讲系统   "));
+		funcids.addAll(readSheet("WEGM", "/2.2-设备设施类对象/2.2.3-系统/20-弱电专业系统.xlsx", "GM车库管理系统"));
+		funcids.addAll(readSheet("WELN", "/2.2-设备设施类对象/2.2.3-系统/20-弱电专业系统.xlsx", "LN本地网络系统"));
+		funcids.addAll(readSheet("WEMA", "/2.2-设备设施类对象/2.2.3-系统/20-弱电专业系统.xlsx", "MA移动通信信号放大系统"));
+		funcids.addAll(readSheet("WETM", "/2.2-设备设施类对象/2.2.3-系统/20-弱电专业系统.xlsx", "TM租户管理系统"));
+		funcids.addAll(readSheet("WEPM", "/2.2-设备设施类对象/2.2.3-系统/20-弱电专业系统.xlsx", "PM客流管理系统"));
+		funcids.addAll(readSheet("WEEM", "/2.2-设备设施类对象/2.2.3-系统/20-弱电专业系统.xlsx", "EM能源管理系统"));
+		funcids.addAll(readSheet("WEMM", "/2.2-设备设施类对象/2.2.3-系统/20-弱电专业系统.xlsx", "MM气象监测系统"));
+		funcids.addAll(readSheet("WECM", "/2.2-设备设施类对象/2.2.3-系统/20-弱电专业系统.xlsx", "CM收银管理系统"));
+		funcids.addAll(readSheet("WEOF", "/2.2-设备设施类对象/2.2.3-系统/20-弱电专业系统.xlsx", "OF办公系统"));
+
+		funcids.addAll(readSheet("ACCC", "/2.2-设备设施类对象/2.2.3-系统/30-空调专业系统.xlsx", "CC中央供冷系统 "));
+		funcids.addAll(readSheet("ACCH", "/2.2-设备设施类对象/2.2.3-系统/30-空调专业系统.xlsx", "CH中央供热系统"));
+		funcids.addAll(readSheet("ACAT", "/2.2-设备设施类对象/2.2.3-系统/30-空调专业系统.xlsx", "AT空调末端系统"));
+		funcids.addAll(readSheet("ACVT", "/2.2-设备设施类对象/2.2.3-系统/30-空调专业系统.xlsx", "VT通风系统"));
+		funcids.addAll(readSheet("ACKL", "/2.2-设备设施类对象/2.2.3-系统/30-空调专业系统.xlsx", "KL厨房排油烟系统"));
+		funcids.addAll(readSheet("ACAD", "/2.2-设备设施类对象/2.2.3-系统/30-空调专业系统.xlsx", "AD空调人防系统"));
+
+		funcids.addAll(readSheet("WSDW", "/2.2-设备设施类对象/2.2.3-系统/40-给排水专业系统.xlsx", "DW生活给水系统"));
+		funcids.addAll(readSheet("WSDH", "/2.2-设备设施类对象/2.2.3-系统/40-给排水专业系统.xlsx", "DH生活热水系统"));
+		funcids.addAll(readSheet("WSRW", "/2.2-设备设施类对象/2.2.3-系统/40-给排水专业系统.xlsx", "RW中水系统"));
+		funcids.addAll(readSheet("WSDD", "/2.2-设备设施类对象/2.2.3-系统/40-给排水专业系统.xlsx", "DD直饮水系统"));
+		funcids.addAll(readSheet("WSST", "/2.2-设备设施类对象/2.2.3-系统/40-给排水专业系统.xlsx", "ST污水处理系统"));
+		funcids.addAll(readSheet("WSSI", "/2.2-设备设施类对象/2.2.3-系统/40-给排水专业系统.xlsx", "SI喷灌系统"));
+		funcids.addAll(readSheet("WSWS", "/2.2-设备设施类对象/2.2.3-系统/40-给排水专业系统.xlsx", "WS水景系统"));
+		funcids.addAll(readSheet("WSWP", "/2.2-设备设施类对象/2.2.3-系统/40-给排水专业系统.xlsx", "WP泳池系统"));
+		funcids.addAll(readSheet("WSFG", "/2.2-设备设施类对象/2.2.3-系统/40-给排水专业系统.xlsx", "FG燃气系统"));
+		funcids.addAll(readSheet("WSWH", "/2.2-设备设施类对象/2.2.3-系统/40-给排水专业系统.xlsx", "WH给排水电伴热系统"));
+		funcids.addAll(readSheet("WSWD", "/2.2-设备设施类对象/2.2.3-系统/40-给排水专业系统.xlsx", "WD给排水人防系统"));
+
+		funcids.addAll(readSheet("FFFA", "/2.2-设备设施类对象/2.2.3-系统/50-消防专业系统.xlsx", "FA火灾报警系统"));
+		funcids.addAll(readSheet("FFGA", "/2.2-设备设施类对象/2.2.3-系统/50-消防专业系统.xlsx", "GA燃气报警系统"));
+		funcids.addAll(readSheet("FFEA", "/2.2-设备设施类对象/2.2.3-系统/50-消防专业系统.xlsx", "EA漏电火灾报警系统"));
+		funcids.addAll(readSheet("FFBM", "/2.2-设备设施类对象/2.2.3-系统/50-消防专业系统.xlsx", "BM紧急广播及背景音乐系统"));
+		funcids.addAll(readSheet("FFFS", "/2.2-设备设施类对象/2.2.3-系统/50-消防专业系统.xlsx", "FS消防给水系统"));
+		funcids.addAll(readSheet("FFGE", "/2.2-设备设施类对象/2.2.3-系统/50-消防专业系统.xlsx", "GE气体灭火系统"));
+		funcids.addAll(readSheet("FFFE", "/2.2-设备设施类对象/2.2.3-系统/50-消防专业系统.xlsx", "FE灭火器系统"));
+		funcids.addAll(readSheet("FFSC", "/2.2-设备设施类对象/2.2.3-系统/50-消防专业系统.xlsx", "SC防排烟系统"));
+		funcids.addAll(readSheet("FFFR", "/2.2-设备设施类对象/2.2.3-系统/50-消防专业系统.xlsx", "FR防火卷帘门系统"));
+		funcids.addAll(readSheet("FFEE", "/2.2-设备设施类对象/2.2.3-系统/50-消防专业系统.xlsx", "EE应急照明及疏散指示系统"));
+		funcids.addAll(readSheet("FFKE", "/2.2-设备设施类对象/2.2.3-系统/50-消防专业系统.xlsx", "KE厨房自动灭火系统"));
+
+		funcids.addAll(readSheet("SPVS", "/2.2-设备设施类对象/2.2.3-系统/60-安防专业系统.xlsx", "VS视频监控系统"));
+		funcids.addAll(readSheet("SPNP", "/2.2-设备设施类对象/2.2.3-系统/60-安防专业系统.xlsx", "NP巡更系统"));
+		funcids.addAll(readSheet("SPEG", "/2.2-设备设施类对象/2.2.3-系统/60-安防专业系统.xlsx", "EG门禁系统"));
+		funcids.addAll(readSheet("SPIA", "/2.2-设备设施类对象/2.2.3-系统/60-安防专业系统.xlsx", "IA入侵报警系统"));
+	}
+
+	private void importEquipment(List<FuncidDefModel> funcids) throws IOException {
+		funcids.addAll(readSheet("equipment", "/2.2-设备设施类对象/2.2.2-设备设施类对象通用属性.xlsx", "设备设施"));
+		funcids.addAll(readSheet("SEBPBP", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/13-备用电源系统设备.xlsx", "BPBP备用电源"));
+		funcids.addAll(readSheet("SEBPSP", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/13-备用电源系统设备.xlsx", "BPSP太阳能电池板"));
+		funcids.addAll(readSheet("SEBPWG", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/13-备用电源系统设备.xlsx", "BPWG风力发电装置"));
+		funcids.addAll(readSheet("SEBPHT", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/13-备用电源系统设备.xlsx", "BPHT备用电源主机"));
+		funcids.addAll(readSheet("SEBPCU", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/13-备用电源系统设备.xlsx", "BPCU备用电源控制箱"));
+		funcids.addAll(readSheet("SELPAT", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/19-雷电防护系统设备.xlsx", "LPAT接闪器"));
+		funcids.addAll(readSheet("SELPDL", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/19-雷电防护系统设备.xlsx", "LPDL引下线"));
+		funcids.addAll(readSheet("SELPGD", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/19-雷电防护系统设备.xlsx", "LPGD接地装置"));
+		funcids.addAll(readSheet("SEOPCU", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/15-室外动力系统设备.xlsx", "OPCU室外动力控制箱"));
+		funcids.addAll(readSheet("SETPCU", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/18-租户配电系统设备.xlsx", "TPCU租户配电控制箱"));
+		funcids.addAll(readSheet("SETPBP", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/18-租户配电系统设备.xlsx", "TPBP租户母线插接箱"));
+		funcids.addAll(readSheet("SETDTF", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/11-变配电系统设备.xlsx", "TDTF变压器"));
+		funcids.addAll(readSheet("SETDHS", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/11-变配电系统设备.xlsx", "TDHS高压开关柜"));
+		funcids.addAll(readSheet("SETDLS", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/11-变配电系统设备.xlsx", "TDLS低压开关柜"));
+		funcids.addAll(readSheet("SETDDS", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/11-变配电系统设备.xlsx", "TDDS直流屏"));
+		funcids.addAll(readSheet("SETDIV", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/11-变配电系统设备.xlsx", "TDIV逆变器"));
+		funcids.addAll(readSheet("SETDBP", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/11-变配电系统设备.xlsx", "TDBP变配电母线插接箱"));
+		funcids.addAll(readSheet("SETDCU", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/11-变配电系统设备.xlsx", "TDCU变配电控制箱"));
+		funcids.addAll(readSheet("SEEPCU", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/14-机房动力系统设备.xlsx", "EPCU机房动力控制箱"));
+		funcids.addAll(readSheet("SEDGDG", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/12-柴发机房系统设备.xlsx", "DGDG柴油发电机"));
+		funcids.addAll(readSheet("SEDGDT", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/12-柴发机房系统设备.xlsx", "DGDT柴发储油箱"));
+		funcids.addAll(readSheet("SEDGPP", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/12-柴发机房系统设备.xlsx", "DGPP柴发输油泵"));
+		funcids.addAll(readSheet("SEDGJH", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/12-柴发机房系统设备.xlsx", "DGJH柴发水套加热器"));
+		funcids.addAll(readSheet("SEDGEP", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/12-柴发机房系统设备.xlsx", "DGEP柴发尾气净化装置"));
+		funcids.addAll(readSheet("SEDGCU", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/12-柴发机房系统设备.xlsx", "DGCU柴发控制箱"));
+		funcids.addAll(readSheet("SEELEL", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/16-电梯系统设备.xlsx", "ELEL直梯"));
+		funcids.addAll(readSheet("SEELES", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/16-电梯系统设备.xlsx", "ELES扶梯"));
+		funcids.addAll(readSheet("SEELCU", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/16-电梯系统设备.xlsx", "ELCU电梯控制箱"));
+		funcids.addAll(readSheet("SEELET", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/16-电梯系统设备.xlsx", "ELET电梯曳引机"));
+		funcids.addAll(readSheet("SELTLT", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/17-照明系统设备.xlsx", "LTLT照明灯具"));
+		funcids.addAll(readSheet("SELTCU", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/17-照明系统设备.xlsx", "LTCU照明控制箱"));
+		funcids.addAll(readSheet("SELTCP", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/17-照明系统设备.xlsx", "LTCP照明控制面板"));
+		funcids.addAll(readSheet("SESDCU", "/2.2-设备设施类对象/2.2.4-设备设施/1-强电专业/1A-强电人防系统设备.xlsx", "SDCU强电人防控制箱"));
+		funcids.addAll(readSheet("WEBAHT", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/21-建筑设备控制系统设备.xlsx", "BAHT楼控主机"));
+		funcids.addAll(readSheet("WEBACU", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/21-建筑设备控制系统设备.xlsx", "BACU楼控控制箱"));
+		funcids.addAll(readSheet("WEBADC", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/21-建筑设备控制系统设备.xlsx", "BADC楼控数据采集器"));
+		funcids.addAll(readSheet("WEBAPS", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/21-建筑设备控制系统设备.xlsx", "BAPS楼控电源供应器"));
+		funcids.addAll(readSheet("WEBAEC", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/21-建筑设备控制系统设备.xlsx", "BAEC楼控机柜"));
+		funcids.addAll(readSheet("WEBADS", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/21-建筑设备控制系统设备.xlsx", "BADS楼控显示屏"));
+		funcids.addAll(readSheet("WEBACP", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/21-建筑设备控制系统设备.xlsx", "BACP楼控控制面板"));
+		funcids.addAll(readSheet("WETVFE", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/22-电视信号系统设备.xlsx", "TVFE电视前端设备"));
+		funcids.addAll(readSheet("WETVTV", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/22-电视信号系统设备.xlsx", "TVTV电视机"));
+		funcids.addAll(readSheet("WETVCU", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/22-电视信号系统设备.xlsx", "TVCU电视信号控制箱"));
+		funcids.addAll(readSheet("WELNHT", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/26-本地网络系统设备.xlsx", "LNHT服务器主机"));
+		funcids.addAll(readSheet("WELNRT", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/26-本地网络系统设备.xlsx", "LNRT路由器"));
+		funcids.addAll(readSheet("WELNEX", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/26-本地网络系统设备.xlsx", "LNEX交换机"));
+		funcids.addAll(readSheet("WELNHF", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/26-本地网络系统设备.xlsx", "LNHF硬件防火墙"));
+		funcids.addAll(readSheet("WELNAC", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/26-本地网络系统设备.xlsx", "LNAC无线控制器"));
+		funcids.addAll(readSheet("WELNAP", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/26-本地网络系统设备.xlsx", "LNAP无线AP点位"));
+		funcids.addAll(readSheet("WELNCU", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/26-本地网络系统设备.xlsx", "LNCU网络控制箱"));
+		funcids.addAll(readSheet("WEMMHT", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2B-气象监测系统.xlsx", "MMHT气象监测主机"));
+		funcids.addAll(readSheet("WEMMCU", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2B-气象监测系统.xlsx", "MMCU气象监测控制箱"));
+		funcids.addAll(readSheet("WEMMMS", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2B-气象监测系统.xlsx", "MMMS气象监测站"));
+		funcids.addAll(readSheet("WEMAHT", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/27-移动通信信号放大系统设备.xlsx", "MAHT移动通信信号放大主机"));
+		funcids.addAll(readSheet("WEMAAT", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/27-移动通信信号放大系统设备.xlsx", "MAAT移动通信信号放大天线"));
+		funcids.addAll(readSheet("WEMACU", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/27-移动通信信号放大系统设备.xlsx", "MACU移动通信信号放大控制箱"));
+		funcids.addAll(readSheet("WEMIHT", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/23-多媒体信息发布系统设备.xlsx", "MIHT多媒体主机"));
+		funcids.addAll(readSheet("WEMIPL", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/23-多媒体信息发布系统设备.xlsx", "MIPL播放器"));
+		funcids.addAll(readSheet("WEMIDS", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/23-多媒体信息发布系统设备.xlsx", "MIDS多媒体显示屏"));
+		funcids.addAll(readSheet("WEMIST", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/23-多媒体信息发布系统设备.xlsx", "MIST自助终端机"));
+		funcids.addAll(readSheet("WEMIFE", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/23-多媒体信息发布系统设备.xlsx", "MIFE多媒体前端设备"));
+		funcids.addAll(readSheet("WEMICU", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/23-多媒体信息发布系统设备.xlsx", "MICU多媒体控制箱"));
+		funcids.addAll(readSheet("WEOFTL", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2D-办公系统设备.xlsx", "OFTL办公电话"));
+		funcids.addAll(readSheet("WEOFCM", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2D-办公系统设备.xlsx", "OFCM办公摄像头"));
+		funcids.addAll(readSheet("WEOFCP", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2D-办公系统设备.xlsx", "OFCP办公控制面板"));
+		funcids.addAll(readSheet("WEOFCU", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2D-办公系统设备.xlsx", "OFCU办公控制箱"));
+		funcids.addAll(readSheet("WEOFDS", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2D-办公系统设备.xlsx", "OFDS办公显示屏"));
+		funcids.addAll(readSheet("WEOFFE", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2D-办公系统设备.xlsx", "OFFE办公前端设备"));
+		funcids.addAll(readSheet("WEOFHT", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2D-办公系统设备.xlsx", "OFHT办公主机"));
+		funcids.addAll(readSheet("WEOFSP", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2D-办公系统设备.xlsx", "OFSP办公扬声器"));
+		funcids.addAll(readSheet("WEOFCK", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2D-办公系统设备.xlsx", "OFCK办公时钟"));
+		funcids.addAll(readSheet("WEOFPT", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2D-办公系统设备.xlsx", "OFPT办公打印机"));
+		funcids.addAll(readSheet("WEOFMP", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2D-办公系统设备.xlsx", "OFMP办公话筒"));
+		funcids.addAll(readSheet("WEOFPJ", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2D-办公系统设备.xlsx", "OFPJ办公投影仪"));
+		funcids.addAll(readSheet("WEOFPS", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2D-办公系统设备.xlsx", "OFPS办公投影幕"));
+		funcids.addAll(readSheet("WEOFTV", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2D-办公系统设备.xlsx", "OFTV办公电视机"));
+		funcids.addAll(readSheet("WEGMHT", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/25-车库管理系统设备.xlsx", "GMHT车库主机"));
+		funcids.addAll(readSheet("WEGMCU", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/25-车库管理系统设备.xlsx", "GMCU车库控制箱"));
+		funcids.addAll(readSheet("WEGMCM", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/25-车库管理系统设备.xlsx", "GMCM车库摄像头"));
+		funcids.addAll(readSheet("WEGMDS", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/25-车库管理系统设备.xlsx", "GMDS车库显示屏"));
+		funcids.addAll(readSheet("WEGMGT", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/25-车库管理系统设备.xlsx", "GMGT进出闸机"));
+		funcids.addAll(readSheet("WEGMMP", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/25-车库管理系统设备.xlsx", "GMMP机械车位"));
+		funcids.addAll(readSheet("WEGMCP", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/25-车库管理系统设备.xlsx", "GMCP充电桩"));
+		funcids.addAll(readSheet("WEGMPD", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/25-车库管理系统设备.xlsx", "GMPD车位检测器"));
+		funcids.addAll(readSheet("WEGMGL", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/25-车库管理系统设备.xlsx", "GMGL车位引导灯"));
+		funcids.addAll(readSheet("WEGMLP", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/25-车库管理系统设备.xlsx", "GMLP升降防撞柱"));
+		funcids.addAll(readSheet("WEGMPL", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/25-车库管理系统设备.xlsx", "GMPL车库地锁"));
+		funcids.addAll(readSheet("WEWTWT", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/24-无线对讲系统设备.xlsx", "WTWT对讲机"));
+		funcids.addAll(readSheet("WEWTRS", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/24-无线对讲系统设备.xlsx", "WTRS中继台"));
+		funcids.addAll(readSheet("WEWTCU", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/24-无线对讲系统设备.xlsx", "WTCU无线对讲控制箱"));
+		funcids.addAll(readSheet("WEPMHT", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/29-客流管理系统设备.xlsx", "PMHT客流管理主机"));
+		funcids.addAll(readSheet("WEPMCU", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/29-客流管理系统设备.xlsx", "PMCU客流管理控制箱"));
+		funcids.addAll(readSheet("WECMHT", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2C-收银管理系统设备.xlsx", "CMHT收银管理主机"));
+		funcids.addAll(readSheet("WECMCU", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2C-收银管理系统设备.xlsx", "CMCU收银管理控制箱"));
+		funcids.addAll(readSheet("WEEMHT", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2A-能源管理系统设备.xlsx", "EMHT能源管理主机"));
+		funcids.addAll(readSheet("WEEMCU", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/2A-能源管理系统设备.xlsx", "EMCU能源管理控制箱"));
+		funcids.addAll(readSheet("WETMHT", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/28-租户管理系统设备.xlsx", "TMHT租户管理主机"));
+		funcids.addAll(readSheet("WETMCU", "/2.2-设备设施类对象/2.2.4-设备设施/2-弱电专业/28-租户管理系统设备.xlsx", "TMCU租户管理控制箱"));
+		funcids.addAll(readSheet("ACCCCC", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCCC离心式冷水机组"));
+		funcids.addAll(readSheet("ACCCSC", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCSC螺杆式冷水机组"));
+		funcids.addAll(readSheet("ACCCAC", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCAC吸收式冷水机组"));
+		funcids.addAll(readSheet("ACCCAH", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCAH空调空气源热泵"));
+		funcids.addAll(readSheet("ACCCWH", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCWH空调水源热泵"));
+		funcids.addAll(readSheet("ACCCGH", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCGH空调地源热泵"));
+		funcids.addAll(readSheet("ACCCOT", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCOT冷却塔"));
+		funcids.addAll(readSheet("ACCCCP", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCCP供冷冷冻水泵"));
+		funcids.addAll(readSheet("ACCCOP", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCOP供冷冷却水泵"));
+		funcids.addAll(readSheet("ACCCGP", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCGP供冷乙二醇泵"));
+		funcids.addAll(readSheet("ACCCFP", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCFP供冷补水泵"));
+		funcids.addAll(readSheet("ACCCCF", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCCF供冷定压补水装置"));
+		funcids.addAll(readSheet("ACCCPT", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCPT供冷压力罐"));
+		funcids.addAll(readSheet("ACCCHE", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCHE供冷换热器"));
+		funcids.addAll(readSheet("ACCCVD", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCVD供冷真空脱气机"));
+		funcids.addAll(readSheet("ACCCCD", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCCD供冷水加药装置"));
+		funcids.addAll(readSheet("ACCCSD", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCSD供冷软化水装置"));
+		funcids.addAll(readSheet("ACCCTU", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCTU供冷全程水处理仪"));
+		funcids.addAll(readSheet("ACCCST", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCST供冷蓄冷热槽"));
+		funcids.addAll(readSheet("ACCCDB", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCDB供冷分水器"));
+		funcids.addAll(readSheet("ACCCCL", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCCL供冷集水器"));
+		funcids.addAll(readSheet("ACCCWT", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCWT供冷水箱"));
+		funcids.addAll(readSheet("ACCCOC", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCOC供冷在线清洗装置"));
+		funcids.addAll(readSheet("ACCCTC", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCTC供冷伴热电缆"));
+		funcids.addAll(readSheet("ACCCCU", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/31-中央供冷系统设备.xlsx", "CCCU供冷控制箱"));
+		funcids.addAll(readSheet("ACVTSF", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/34-通风系统设备.xlsx", "VTSF通风风机"));
+		funcids.addAll(readSheet("ACVTAC", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/34-通风系统设备.xlsx", "VTAC热风幕"));
+		funcids.addAll(readSheet("ACVTAP", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/34-通风系统设备.xlsx", "VTAP空气净化器"));
+		funcids.addAll(readSheet("ACVTDO", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/34-通风系统设备.xlsx", "VTDO通风除味装置"));
+		funcids.addAll(readSheet("ACVTIO", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/34-通风系统设备.xlsx", "VTIO通风风口"));
+		funcids.addAll(readSheet("ACVTMF", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/34-通风系统设备.xlsx", "VTMF通风消声器"));
+		funcids.addAll(readSheet("ACVTPC", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/34-通风系统设备.xlsx", "VTPC通风静压箱"));
+		funcids.addAll(readSheet("ACVTCU", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/34-通风系统设备.xlsx", "VTCU通风控制箱"));
+		funcids.addAll(readSheet("ACVTCP", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/34-通风系统设备.xlsx", "VTCP通风控制面板"));
+		funcids.addAll(readSheet("ACATAH", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATAH空调机组"));
+		funcids.addAll(readSheet("ACATFU", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATFU新风机组"));
+		funcids.addAll(readSheet("ACATFC", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATFC风机盘管"));
+		funcids.addAll(readSheet("ACATSA", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATSA分体空调"));
+		funcids.addAll(readSheet("ACATSI", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATSI分体空调室内机"));
+		funcids.addAll(readSheet("ACATSO", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATSO分体空调室外机"));
+		funcids.addAll(readSheet("ACATVR", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATVR变频多联机"));
+		funcids.addAll(readSheet("ACATVI", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATVI变频多联机室内机"));
+		funcids.addAll(readSheet("ACATVO", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATVO变频多联机室外机"));
+		funcids.addAll(readSheet("ACATVA", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATVA变风量箱"));
+		funcids.addAll(readSheet("ACATFA", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATFA地板空调器"));
+		funcids.addAll(readSheet("ACATIO", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATIO空调风口"));
+		funcids.addAll(readSheet("ACATRD", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATRD散热器"));
+		funcids.addAll(readSheet("ACATIR", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATIR红外辐射单元"));
+		funcids.addAll(readSheet("ACATFH", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATFH地板采暖设备"));
+		funcids.addAll(readSheet("ACATHD", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATHD空调加湿器"));
+		funcids.addAll(readSheet("ACATMF", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATMF空调消声器"));
+		funcids.addAll(readSheet("ACATPC", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATPC空调静压箱"));
+		funcids.addAll(readSheet("ACATCA", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATCA定风量箱"));
+		funcids.addAll(readSheet("ACATCU", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/33-空调末端系统设备.xlsx", "ATCU空调末端控制箱"));
+		funcids.addAll(readSheet("ACKLSF", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/35-厨房排油烟系统设备.xlsx", "KLSF厨房排油烟风机"));
+		funcids.addAll(readSheet("ACKLAP", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/35-厨房排油烟系统设备.xlsx", "KLAP厨房油烟净化器"));
+		funcids.addAll(readSheet("ACKLCU", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/35-厨房排油烟系统设备.xlsx", "KLCU厨房排油烟控制箱"));
+		funcids.addAll(readSheet("ACKLIO", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/35-厨房排油烟系统设备.xlsx", "KLIO厨房排油烟风口"));
+		funcids.addAll(readSheet("ACCHCB", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHCB供热燃煤锅炉"));
+		funcids.addAll(readSheet("ACCHFB", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHFB供热燃油锅炉"));
+		funcids.addAll(readSheet("ACCHGB", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHGB供热燃气锅炉"));
+		funcids.addAll(readSheet("ACCHEB", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHEB供热电锅炉"));
+		funcids.addAll(readSheet("ACCHHP", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHHP供热水泵"));
+		funcids.addAll(readSheet("ACCHFP", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHFP供热补水泵"));
+		funcids.addAll(readSheet("ACCHCF", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHCF供热定压补水装置"));
+		funcids.addAll(readSheet("ACCHPT", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHPT供热压力罐"));
+		funcids.addAll(readSheet("ACCHHE", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHHE供热换热器"));
+		funcids.addAll(readSheet("ACCHVD", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHVD供热真空脱气机"));
+		funcids.addAll(readSheet("ACCHCD", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHCD供热水加药装置"));
+		funcids.addAll(readSheet("ACCHSD", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHSD供热软化水装置"));
+		funcids.addAll(readSheet("ACCHTU", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHTU供热全程水处理仪"));
+		funcids.addAll(readSheet("ACCHST", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHST供热蓄冷热槽"));
+		funcids.addAll(readSheet("ACCHDB", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHDB供热分水器"));
+		funcids.addAll(readSheet("ACCHCL", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHCL供热集水器"));
+		funcids.addAll(readSheet("ACCHWT", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHWT供热水箱"));
+		funcids.addAll(readSheet("ACCHOC", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHOC供热在线清洗装置"));
+		funcids.addAll(readSheet("ACCHBF", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHBF生物质炊暖炉"));
+		funcids.addAll(readSheet("ACCHCU", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/32-中央供热系统设备.xlsx", "CHCU供热控制箱"));
+		funcids.addAll(readSheet("ACADSF", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/36-空调人防系统设备.xlsx", "ADSF空调人防风机"));
+		funcids.addAll(readSheet("ACADFD", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/36-空调人防系统设备.xlsx", "ADFD滤毒除湿机"));
+		funcids.addAll(readSheet("ACADCU", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/36-空调人防系统设备.xlsx", "ADCU空调人防控制箱"));
+		funcids.addAll(readSheet("ACADIO", "/2.2-设备设施类对象/2.2.4-设备设施/3-空调专业/36-空调人防系统设备.xlsx", "ADIO空调人防风口"));
+		funcids.addAll(readSheet("WSWSCF", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/47-水景系统设备.xlsx", "WSCF水景循环过滤机组"));
+		funcids.addAll(readSheet("WSWSSN", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/47-水景系统设备.xlsx", "WSSN水景喷头"));
+		funcids.addAll(readSheet("WSWSCU", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/47-水景系统设备.xlsx", "WSCU水景控制箱"));
+		funcids.addAll(readSheet("WSWSLT", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/47-水景系统设备.xlsx", "WSLT水景灯具"));
+		funcids.addAll(readSheet("WSWSPP", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/47-水景系统设备.xlsx", "WSPP水景水泵"));
+		funcids.addAll(readSheet("WSSTLU", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/45-污水处理系统设备.xlsx", "STLU污废水一体式提升机组"));
+		funcids.addAll(readSheet("WSSTSP", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/45-污水处理系统设备.xlsx", "STSP潜污泵"));
+		funcids.addAll(readSheet("WSSTOR", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/45-污水处理系统设备.xlsx", "STOR餐饮除油成套设备"));
+		funcids.addAll(readSheet("WSSTST", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/45-污水处理系统设备.xlsx", "STST化粪池"));
+		funcids.addAll(readSheet("WSSTCP", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/45-污水处理系统设备.xlsx", "STCP集水坑"));
+		funcids.addAll(readSheet("WSSTOS", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/45-污水处理系统设备.xlsx", "STOS隔油池"));
+		funcids.addAll(readSheet("WSSTCU", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/45-污水处理系统设备.xlsx", "STCU污水控制箱"));
+		funcids.addAll(readSheet("WSRWSU", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/43-中水系统设备.xlsx", "RWSU中水供水机组"));
+		funcids.addAll(readSheet("WSRWTU", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/43-中水系统设备.xlsx", "RWTU中水处理机组"));
+		funcids.addAll(readSheet("WSRWWT", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/43-中水系统设备.xlsx", "RWWT中水储水箱"));
+		funcids.addAll(readSheet("WSRWRC", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/43-中水系统设备.xlsx", "RWRC雨水收集设备"));
+		funcids.addAll(readSheet("WSRWPT", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/43-中水系统设备.xlsx", "RWPT中水供水压力罐"));
+		funcids.addAll(readSheet("WSRWPP", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/43-中水系统设备.xlsx", "RWPP中水供水水泵"));
+		funcids.addAll(readSheet("WSRWCU", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/43-中水系统设备.xlsx", "RWCU中水控制箱"));
+		funcids.addAll(readSheet("WSWDWT", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/4B-给排水人防系统设备.xlsx", "WDWT给排水人防储水箱"));
+		funcids.addAll(readSheet("WSWDCU", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/4B-给排水人防系统设备.xlsx", "WDCU给排水人防控制箱"));
+		funcids.addAll(readSheet("WSDHCB", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", "DHCB生活热水燃煤锅炉"));
+		funcids.addAll(readSheet("WSDHFB", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", "DHFB生活热水燃油锅炉"));
+		funcids.addAll(readSheet("WSDHGB", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", "DHGB生活热水燃气锅炉"));
+		funcids.addAll(readSheet("WSDHEB", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", "DHEB生活热水电锅炉"));
+		funcids.addAll(readSheet("WSDHAH", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", "DHAH生活热水空气源热泵"));
+		funcids.addAll(readSheet("WSDHGH", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", "DHGH生活热水燃气热水器"));
+		funcids.addAll(readSheet("WSDHEH", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", "DHEH生活热水电热水器"));
+		funcids.addAll(readSheet("WSDHSC", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", "DHSC生活热水太阳能集热器"));
+		funcids.addAll(readSheet("WSDHHA", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", "DHHA生活热水辅热设备"));
+		funcids.addAll(readSheet("WSDHHE", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", "DHHE生活热水换热器"));
+		funcids.addAll(readSheet("WSDHSU", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", " DHSU生活热水供水机组"));
+		funcids.addAll(readSheet("WSDHHP", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", "DHHP生活热水水泵"));
+		funcids.addAll(readSheet("WSDHSD", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", "DHSD生活热水软化水装置"));
+		funcids.addAll(readSheet("WSDHCF", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", "DHCF生活热水定压补水装置"));
+		funcids.addAll(readSheet("WSDHPT", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", "DHPT生活热水压力罐"));
+		funcids.addAll(readSheet("WSDHST", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", "DHST生活热水蓄冷热槽"));
+		funcids.addAll(readSheet("WSDHWT", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", "DHWT生活热水储水箱"));
+		funcids.addAll(readSheet("WSDHCU", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/42-生活热水系统设备.xlsx", "DHCU生活热水控制箱"));
+		funcids.addAll(readSheet("WSWPCF", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/48-泳池系统设备.xlsx", "WPCF泳池循环过滤机组"));
+		funcids.addAll(readSheet("WSWPPP", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/48-泳池系统设备.xlsx", "WPPP泳池循环水泵"));
+		funcids.addAll(readSheet("WSWPHE", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/48-泳池系统设备.xlsx", "WPHE泳池换热器"));
+		funcids.addAll(readSheet("WSWPOS", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/48-泳池系统设备.xlsx", "WPOS泳池臭氧消毒器"));
+		funcids.addAll(readSheet("WSWPQM", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/48-泳池系统设备.xlsx", "WPQM泳池水质监测仪"));
+		funcids.addAll(readSheet("WSWPPB", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/48-泳池系统设备.xlsx", "WPPB泳池PH值平衡投药泵"));
+		funcids.addAll(readSheet("WSWPOP", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/48-泳池系统设备.xlsx", "WPOP泳池氧消毒剂投药泵"));
+		funcids.addAll(readSheet("WSWPWT", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/48-泳池系统设备.xlsx", "WPWT泳池水箱"));
+		funcids.addAll(readSheet("WSWPCU", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/48-泳池系统设备.xlsx", "WPCU泳池控制箱"));
+		funcids.addAll(readSheet("WSFGPA", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/49-燃气系统设备.xlsx", "FGPA燃气调压箱"));
+		funcids.addAll(readSheet("WSFGLP", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/49-燃气系统设备.xlsx", "FGLP液化石油气瓶"));
+		funcids.addAll(readSheet("WSDDTU", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/44-直饮水系统设备.xlsx", "DDTU直饮水处理机组"));
+		funcids.addAll(readSheet("WSDDIH", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/44-直饮水系统设备.xlsx", "DDIH直饮水即时加热器"));
+		funcids.addAll(readSheet("WSDDCU", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/44-直饮水系统设备.xlsx", "DDCU直饮水控制箱"));
+		funcids.addAll(readSheet("WSSISU", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/46-喷灌系统设备.xlsx", "SISU喷灌机组"));
+		funcids.addAll(readSheet("WSSISN", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/46-喷灌系统设备.xlsx", "SISN喷灌喷头"));
+		funcids.addAll(readSheet("WSSICU", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/46-喷灌系统设备.xlsx", "SICU喷灌控制箱"));
+		funcids.addAll(readSheet("WSDWSU", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/41-生活给水系统设备.xlsx", "DWSU生活给水供水机组"));
+		funcids.addAll(readSheet("WSDWTS", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/41-生活给水系统设备.xlsx", "DWTS生活给水水箱消毒器"));
+		funcids.addAll(readSheet("WSDWUS", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/41-生活给水系统设备.xlsx", "DWUS生活给水紫外线消毒器"));
+		funcids.addAll(readSheet("WSDWWT", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/41-生活给水系统设备.xlsx", "DWWT生活给水储水箱"));
+		funcids.addAll(readSheet("WSDWPT", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/41-生活给水系统设备.xlsx", "DWPT生活给水压力罐"));
+		funcids.addAll(readSheet("WSDWPP", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/41-生活给水系统设备.xlsx", "DWPP生活给水水泵"));
+		funcids.addAll(readSheet("WSDWCU", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/41-生活给水系统设备.xlsx", "DWCU生活给水控制箱"));
+		funcids.addAll(readSheet("WSWHTC", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/4A-给排水电伴热系统设备.xlsx", "WHTC给排水伴热电缆"));
+		funcids.addAll(readSheet("WSWHIB", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/4A-给排水电伴热系统设备.xlsx", "WHIB给排水伴热保温器"));
+		funcids.addAll(readSheet("WSWHCU", "/2.2-设备设施类对象/2.2.4-设备设施/4-给排水专业/4A-给排水电伴热系统设备.xlsx", "WHCU给排水伴热控制箱"));
+		funcids.addAll(readSheet("FFGAHT", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/52-燃气报警系统设备.xlsx", "GAHT燃气报警主机"));
+		funcids.addAll(readSheet("FFGASE", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/52-燃气报警系统设备.xlsx", "GASE燃气探测器"));
+		funcids.addAll(readSheet("FFGACV", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/52-燃气报警系统设备.xlsx", "GACV燃气切断阀"));
+		funcids.addAll(readSheet("FFGACU", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/52-燃气报警系统设备.xlsx", "GACU燃气报警控制箱"));
+		funcids.addAll(readSheet("FFFEFE", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/57-灭火器系统设备.xlsx", "FEFE灭火器"));
+		funcids.addAll(readSheet("FFGEBG", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/56-气体灭火系统设备.xlsx", "GEBG气体灭火瓶组"));
+		funcids.addAll(readSheet("FFGESB", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/56-气体灭火系统设备.xlsx", "GESB气体灭火启动瓶"));
+		funcids.addAll(readSheet("FFGEHT", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/56-气体灭火系统设备.xlsx", "GEHT气体灭火主机"));
+		funcids.addAll(readSheet("FFGECU", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/56-气体灭火系统设备.xlsx", "GECU气体灭火控制箱"));
+		funcids.addAll(readSheet("FFGESN", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/56-气体灭火系统设备.xlsx", "GESN气体灭火喷头"));
+		funcids.addAll(readSheet("FFFAHT", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/51-火灾报警系统设备.xlsx", "FAHT火灾报警主机"));
+		funcids.addAll(readSheet("FFFADS", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/51-火灾报警系统设备.xlsx", "FADS火灾报警显示屏"));
+		funcids.addAll(readSheet("FFFALP", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/51-火灾报警系统设备.xlsx", "FALP联动琴台"));
+		funcids.addAll(readSheet("FFFASE", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/51-火灾报警系统设备.xlsx", "FASE火灾探测器"));
+		funcids.addAll(readSheet("FFFAAL", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/51-火灾报警系统设备.xlsx", "FAAL火灾报警声光报警器"));
+		funcids.addAll(readSheet("FFFAMA", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/51-火灾报警系统设备.xlsx", "FAMA消防手动报警按钮"));
+		funcids.addAll(readSheet("FFFATL", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/51-火灾报警系统设备.xlsx", "FATL消防电话"));
+		funcids.addAll(readSheet("FFFACU", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/51-火灾报警系统设备.xlsx", "FACU火灾报警控制箱"));
+		funcids.addAll(readSheet("FFKECU", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/5B-厨房自动灭火系统设备.xlsx", "KECU厨房自动灭火控制箱"));
+		funcids.addAll(readSheet("FFKEEC", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/5B-厨房自动灭火系统设备.xlsx", "KEEC厨房自动灭火灭火剂容器"));
+		funcids.addAll(readSheet("FFKESN", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/5B-厨房自动灭火系统设备.xlsx", "KESN厨房自动灭火喷头"));
+		funcids.addAll(readSheet("FFEEHT", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/5A-应急照明及疏散指示系统设备.xlsx", "EEHT应急照明及疏散指示主机"));
+		funcids.addAll(readSheet("FFEECU", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/5A-应急照明及疏散指示系统设备.xlsx", "EECU应急照明及疏散指示控制箱"));
+		funcids.addAll(readSheet("FFEEEL", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/5A-应急照明及疏散指示系统设备.xlsx", "EEEL应急照明灯具"));
+		funcids.addAll(readSheet("FFEEEI", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/5A-应急照明及疏散指示系统设备.xlsx", "EEEI疏散指示灯牌"));
+		funcids.addAll(readSheet("FFFRFR", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/59-防火卷帘门系统设备.xlsx", "FRFR防火卷帘门"));
+		funcids.addAll(readSheet("FFFRFD", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/59-防火卷帘门系统设备.xlsx", "FRFD防火门"));
+		funcids.addAll(readSheet("FFFRHT", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/59-防火卷帘门系统设备.xlsx", "FRHT防火卷帘门主机"));
+		funcids.addAll(readSheet("FFFRCP", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/59-防火卷帘门系统设备.xlsx", "FRCP防火卷帘门控制面板"));
+		funcids.addAll(readSheet("FFFRCU", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/59-防火卷帘门系统设备.xlsx", "FRCU防火卷帘门控制箱"));
+		funcids.addAll(readSheet("FFEAHT", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/53-漏电火灾报警系统设备.xlsx", "EAHT漏电火灾报警主机"));
+		funcids.addAll(readSheet("FFEALS", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/53-漏电火灾报警系统设备.xlsx", "EALS漏电探测器"));
+		funcids.addAll(readSheet("FFEACU", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/53-漏电火灾报警系统设备.xlsx", "EACU漏电火灾报警控制箱"));
+		funcids.addAll(readSheet("FFBMFE", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/54-紧急广播及背景音乐系统设备.xlsx", "BMFE广播前端设备"));
+		funcids.addAll(readSheet("FFBMHT", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/54-紧急广播及背景音乐系统设备.xlsx", "BMHT广播主机"));
+		funcids.addAll(readSheet("FFBMCU", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/54-紧急广播及背景音乐系统设备.xlsx", "BMCU广播分区控制箱"));
+		funcids.addAll(readSheet("FFBMDS", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/54-紧急广播及背景音乐系统设备.xlsx", "BMDS广播显示屏"));
+		funcids.addAll(readSheet("FFBMMP", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/54-紧急广播及背景音乐系统设备.xlsx", "BMMP广播话筒"));
+		funcids.addAll(readSheet("FFBMSP", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/54-紧急广播及背景音乐系统设备.xlsx", "BMSP广播扬声器"));
+		funcids.addAll(readSheet("FFFSHP", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSHP消火栓供水加压泵"));
+		funcids.addAll(readSheet("FFFSSP", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSSP喷淋供水加压泵"));
+		funcids.addAll(readSheet("FFFSMP", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSMP水喷雾供水加压泵"));
+		funcids.addAll(readSheet("FFFSAP", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSAP停机坪消防供水加压泵"));
+		funcids.addAll(readSheet("FFFSWM", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSWM消防水炮设备"));
+		funcids.addAll(readSheet("FFFSCF", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSCF消防给水定压补水装置"));
+		funcids.addAll(readSheet("FFFSPT", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSPT消防给水压力罐"));
+		funcids.addAll(readSheet("FFFSFT", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSFT泡沫储罐组"));
+		funcids.addAll(readSheet("FFFSAC", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSAC消防空压机"));
+		funcids.addAll(readSheet("FFFSWV", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSWV湿式报警阀组"));
+		funcids.addAll(readSheet("FFFSDV", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSDV干式报警阀组"));
+		funcids.addAll(readSheet("FFFSPV", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSPV预作用报警阀组"));
+		funcids.addAll(readSheet("FFFSHB", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSHB消火栓箱"));
+		funcids.addAll(readSheet("FFFSOH", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSOH室外消火栓"));
+		funcids.addAll(readSheet("FFFSPC", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSPC消防水泵接合器"));
+		funcids.addAll(readSheet("FFFSTC", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSTC消防伴热电缆"));
+		funcids.addAll(readSheet("FFFSET", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSET消防末端试水装置"));
+		funcids.addAll(readSheet("FFFSWT", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSWT消防水箱"));
+		funcids.addAll(readSheet("FFFSTS", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSTS消防水箱消毒器"));
+		funcids.addAll(readSheet("FFFSFP", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSFP消防补水泵"));
+		funcids.addAll(readSheet("FFFSSN", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSSN消防喷头"));
+		funcids.addAll(readSheet("FFFSCP", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSCP消火栓控制面板"));
+		funcids.addAll(readSheet("FFFSHT", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSHT消防给水主机"));
+		funcids.addAll(readSheet("FFFSCU", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/55-消防给水系统设备.xlsx", "FSCU消防给水控制箱"));
+		funcids.addAll(readSheet("FFSCEF", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/58-防排烟系统设备.xlsx", "SCEF防排烟风机"));
+		funcids.addAll(readSheet("FFSCIO", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/58-防排烟系统设备.xlsx", "SCIO排烟风口"));
+		funcids.addAll(readSheet("FFSCHW", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/58-防排烟系统设备.xlsx", "SCHW电动挡烟垂壁"));
+		funcids.addAll(readSheet("FFSCSD", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/58-防排烟系统设备.xlsx", "SCSD防火排烟阀"));
+		funcids.addAll(readSheet("FFSCCU", "/2.2-设备设施类对象/2.2.4-设备设施/5-消防专业/58-防排烟系统设备.xlsx", "SCCU防排烟控制箱"));
+		funcids.addAll(readSheet("SPNPHT", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/62-巡更系统设备.xlsx", "NPHT巡更主机"));
+		funcids.addAll(readSheet("SPNPCU", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/62-巡更系统设备.xlsx", "NPCU巡更控制箱"));
+		funcids.addAll(readSheet("SPNPCP", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/62-巡更系统设备.xlsx", "NPCP巡更通讯座"));
+		funcids.addAll(readSheet("SPNPPS", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/62-巡更系统设备.xlsx", "NPPS巡更棒"));
+		funcids.addAll(readSheet("SPIAHT", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/64-入侵报警系统设备.xlsx", "IAHT入侵报警主机"));
+		funcids.addAll(readSheet("SPIACU", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/64-入侵报警系统设备.xlsx", "IACU入侵报警控制箱"));
+		funcids.addAll(readSheet("SPIAMA", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/64-入侵报警系统设备.xlsx", "IAMA入侵报警手动报警按钮"));
+		funcids.addAll(readSheet("SPIAAL", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/64-入侵报警系统设备.xlsx", "IAAL入侵报警声光报警器"));
+		funcids.addAll(readSheet("SPIACP", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/64-入侵报警系统设备.xlsx", "IACP入侵报警控制面板"));
+		funcids.addAll(readSheet("SPIASE", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/64-入侵报警系统设备.xlsx", "IASE入侵报警探测器"));
+		funcids.addAll(readSheet("SPEGHT", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/63-门禁系统设备.xlsx", "EGHT门禁主机"));
+		funcids.addAll(readSheet("SPEGCU", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/63-门禁系统设备.xlsx", "EGCU门禁控制箱"));
+		funcids.addAll(readSheet("SPEGCR", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/63-门禁系统设备.xlsx", "EGCR门禁读卡器"));
+		funcids.addAll(readSheet("SPEGWT", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/63-门禁系统设备.xlsx", "EGWT门禁对讲机"));
+		funcids.addAll(readSheet("SPEGTK", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/63-门禁系统设备.xlsx", "EGTK破胎器"));
+		funcids.addAll(readSheet("SPEGDL", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/63-门禁系统设备.xlsx", "EGDL门禁门锁"));
+		funcids.addAll(readSheet("SPEGBG", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/63-门禁系统设备.xlsx", "EGBG破玻璃按钮"));
+		funcids.addAll(readSheet("SPEGCP", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/63-门禁系统设备.xlsx", "EGCP门禁控制面板"));
+		funcids.addAll(readSheet("SPEGFG", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/63-门禁系统设备.xlsx", "EGFG速通门"));
+		funcids.addAll(readSheet("SPVSHT", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/61-视频监控系统设备.xlsx", "VSHT监控主机"));
+		funcids.addAll(readSheet("SPVSCM", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/61-视频监控系统设备.xlsx", "VSCM监控摄像头"));
+		funcids.addAll(readSheet("SPVSFE", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/61-视频监控系统设备.xlsx", "VSFE监控前端设备"));
+		funcids.addAll(readSheet("SPVSVM", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/61-视频监控系统设备.xlsx", "VSVM监视器"));
+		funcids.addAll(readSheet("SPVSDR", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/61-视频监控系统设备.xlsx", "VSDR硬盘录像机"));
+		funcids.addAll(readSheet("SPVSCP", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/61-视频监控系统设备.xlsx", "VSCP监控控制面板"));
+		funcids.addAll(readSheet("SPVSCU", "/2.2-设备设施类对象/2.2.4-设备设施/6-安防专业/61-视频监控系统设备.xlsx", "VSCU监控控制箱"));
+		funcids.addAll(readSheet("CFIDWS", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/73-室内装饰.xlsx", "IDWS盥洗盆"));
+		funcids.addAll(readSheet("CFIDTL", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/73-室内装饰.xlsx", "IDTL坐便器"));
+		funcids.addAll(readSheet("CFIDSP", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/73-室内装饰.xlsx", "IDSP蹲便器"));
+		funcids.addAll(readSheet("CFIDUR", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/73-室内装饰.xlsx", "IDUR小便器"));
+		funcids.addAll(readSheet("CFIDHD", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/73-室内装饰.xlsx", "IDHD干手机"));
+		funcids.addAll(readSheet("CFIDBT", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/73-室内装饰.xlsx", "IDBT浴缸"));
+		funcids.addAll(readSheet("CFIDSK", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/73-室内装饰.xlsx", "IDSK洗碗槽"));
+		funcids.addAll(readSheet("CFIDSC", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/73-室内装饰.xlsx", "IDSC插座"));
+		funcids.addAll(readSheet("CFIDFN", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/73-室内装饰.xlsx", "IDFN家具"));
+		funcids.addAll(readSheet("CFIDCL", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/73-室内装饰.xlsx", "IDCL吊顶"));
+		funcids.addAll(readSheet("CFBECW", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/72-围护结构.xlsx", "BECW幕墙"));
+		funcids.addAll(readSheet("CFBEBC", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/72-围护结构.xlsx", "BEBC呼吸式幕墙"));
+		funcids.addAll(readSheet("CFBELR", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/72-围护结构.xlsx", "BELR采光顶"));
+		funcids.addAll(readSheet("CFBEDR", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/72-围护结构.xlsx", "BEDR门"));
+		funcids.addAll(readSheet("CFBEWN", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/72-围护结构.xlsx", "BEWN窗"));
+		funcids.addAll(readSheet("CFBEAW", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/72-围护结构.xlsx", "BEAW雨篷"));
+		funcids.addAll(readSheet("CFBEES", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/72-围护结构.xlsx", "BEES电动遮阳帘"));
+		funcids.addAll(readSheet("CFBEMT", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/72-围护结构.xlsx", "BEMT遮阳电机"));
+		funcids.addAll(readSheet("CFBECT", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/72-围护结构.xlsx", "BECT普通遮阳帘"));
+		funcids.addAll(readSheet("CFCSFD", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/71-土建结构.xlsx", "CSFD基础"));
+		funcids.addAll(readSheet("CFCSCL", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/71-土建结构.xlsx", "CSCL柱"));
+		funcids.addAll(readSheet("CFCSGD", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/71-土建结构.xlsx", "CSGD梁"));
+		funcids.addAll(readSheet("CFCSTR", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/71-土建结构.xlsx", "CSTR桁架"));
+		funcids.addAll(readSheet("CFCSWL", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/71-土建结构.xlsx", "CSWL墙"));
+		funcids.addAll(readSheet("CFCSFL", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/71-土建结构.xlsx", "CSFL楼板"));
+		funcids.addAll(readSheet("CFCSRF", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/71-土建结构.xlsx", "CSRF屋顶"));
+		funcids.addAll(readSheet("CFCSSW", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/71-土建结构.xlsx", "CSSW楼梯"));
+		funcids.addAll(readSheet("CFPKPS", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/75-停车场.xlsx", "PKPS停车位"));
+		funcids.addAll(readSheet("CFCADM", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/74-建筑附件.xlsx", "CADM装饰材料"));
+		funcids.addAll(readSheet("CFCAHD", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/74-建筑附件.xlsx", "CAHD栏杆"));
+		funcids.addAll(readSheet("CFCASB", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/74-建筑附件.xlsx", "CASB减速带"));
+		funcids.addAll(readSheet("CFCAST", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/74-建筑附件.xlsx", "CAST地桩"));
+		funcids.addAll(readSheet("CFCADB", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/74-建筑附件.xlsx", "CADB展示板"));
+		funcids.addAll(readSheet("CFCAID", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/74-建筑附件.xlsx", "CAID标识"));
+		funcids.addAll(readSheet("CFCAWC", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/74-建筑附件.xlsx", "CAWC擦窗机"));
+		funcids.addAll(readSheet("CFCADD", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/74-建筑附件.xlsx", "CADD排水沟"));
+		funcids.addAll(readSheet("CFCAWB", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/74-建筑附件.xlsx", "CAWB垃圾桶"));
+		funcids.addAll(readSheet("CFCACR", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/74-建筑附件.xlsx", "CACR扫地机器人"));
+		funcids.addAll(readSheet("CFCAMC", "/2.2-设备设施类对象/2.2.4-设备设施/7-土建精装专业/74-建筑附件.xlsx", "CAMC井盖"));
+		funcids.addAll(readSheet("OTXXFZ", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/87-其他系统设备.xlsx", "XXFZ冷柜(恒温柜)"));
+		funcids.addAll(readSheet("OTXXDC", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/87-其他系统设备.xlsx", "XXDC风干柜"));
+		funcids.addAll(readSheet("OTXXAC", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/87-其他系统设备.xlsx", "XXAC冷风机"));
+		funcids.addAll(readSheet("OTXXSC", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/87-其他系统设备.xlsx", "XXSC消毒柜"));
+		funcids.addAll(readSheet("OTXXUA", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/87-其他系统设备.xlsx", "XXUA无人机"));
+		funcids.addAll(readSheet("OTXXSV", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/87-其他系统设备.xlsx", "XXSV炉具"));
+		funcids.addAll(readSheet("OTLAPL", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/83-液体管道及附件.xlsx", "LAPL液体管道"));
+		funcids.addAll(readSheet("OTLAFI", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/83-液体管道及附件.xlsx", "LAFI水流指示器"));
+		funcids.addAll(readSheet("OTLAFT", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/83-液体管道及附件.xlsx", "LAFT水管过滤器"));
+		funcids.addAll(readSheet("OTSECB", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/85-传感器.xlsx", "SECB组合式传感器"));
+		funcids.addAll(readSheet("OTSETP", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/85-传感器.xlsx", "SETP温度传感器"));
+		funcids.addAll(readSheet("OTSERH", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/85-传感器.xlsx", "SERH湿度传感器"));
+		funcids.addAll(readSheet("OTSEPS", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/85-传感器.xlsx", "SEPS压力传感器"));
+		funcids.addAll(readSheet("OTSECT", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/85-传感器.xlsx", "SECT浓度传感器"));
+		funcids.addAll(readSheet("OTSESP", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/85-传感器.xlsx", "SESP速度传感器"));
+		funcids.addAll(readSheet("OTSEDP", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/85-传感器.xlsx", "SEDP位移传感器"));
+		funcids.addAll(readSheet("OTSEFL", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/85-传感器.xlsx", "SEFL流量传感器"));
+		funcids.addAll(readSheet("OTSEHT", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/85-传感器.xlsx", "SEHT热量传感器"));
+		funcids.addAll(readSheet("OTSEEE", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/85-传感器.xlsx", "SEEE电度传感器"));
+		funcids.addAll(readSheet("OTSESD", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/85-传感器.xlsx", "SESD声音传感器"));
+		funcids.addAll(readSheet("OTSEVD", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/85-传感器.xlsx", "SEVD图像传感器"));
+		funcids.addAll(readSheet("OTSEPF", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/85-传感器.xlsx", "SEPF人流量传感器"));
+		funcids.addAll(readSheet("OTSEIL", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/85-传感器.xlsx", "SEIL照度传感器"));
+		funcids.addAll(readSheet("OTAEOV", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/86-执行器.xlsx", "AEOV通断阀"));
+		funcids.addAll(readSheet("OTAEAV", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/86-执行器.xlsx", "AEAV调节阀"));
+		funcids.addAll(readSheet("OTAECV", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/86-执行器.xlsx", "AECV止回阀"));
+		funcids.addAll(readSheet("OTAERV", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/86-执行器.xlsx", "AERV减压阀"));
+		funcids.addAll(readSheet("OTAESV", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/86-执行器.xlsx", "AESV安全阀"));
+		funcids.addAll(readSheet("OTAERL", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/86-执行器.xlsx", "AERL继电器"));
+		funcids.addAll(readSheet("OTAEFC", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/86-执行器.xlsx", "AEFC变频器"));
+		funcids.addAll(readSheet("OTAEIL", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/86-执行器.xlsx", "AEIL提示灯"));
+		funcids.addAll(readSheet("OTAEAL", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/86-执行器.xlsx", "AEAL声光报警器"));
+		funcids.addAll(readSheet("OTWAEW", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/82-弱电线路及附件.xlsx", "WAEW弱电线路"));
+		funcids.addAll(readSheet("OTSAEW", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/81-强电线路及附件.xlsx", "SAEW强电线路"));
+		funcids.addAll(readSheet("OTAAPL", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/84-气体管道及附件.xlsx", "AAPL气体管道"));
+		funcids.addAll(readSheet("OTAAFT", "/2.2-设备设施类对象/2.2.4-设备设施/8-其他/84-气体管道及附件.xlsx", "AAFT风道过滤器"));
+	}
+
+	private void importComponent(List<FuncidDefModel> funcids) throws IOException {
+		funcids.addAll(readSheet("component", "/2.2-设备设施类对象/2.2.2-设备设施类对象通用属性.xlsx", "部件"));
+
+		funcids.addAll(readSheet("SETDHSIP", "/2.2-设备设施类对象/2.2.5-部件/1-强电专业部件.xlsx", "TDHSIP综合保护装置"));
+		funcids.addAll(readSheet("SETDLSDW", "/2.2-设备设施类对象/2.2.5-部件/1-强电专业部件.xlsx", "TDLSDW低压配电抽屉"));
+		funcids.addAll(readSheet("WEBADCBP", "/2.2-设备设施类对象/2.2.5-部件/2-弱电专业部件.xlsx", "BADCBP总线端口"));
+		funcids.addAll(readSheet("ACCCGHBP", "/2.2-设备设施类对象/2.2.5-部件/3-空调专业部件.xlsx", "CCGHBP地埋管"));
+		funcids.addAll(readSheet("ACCCOTFN", "/2.2-设备设施类对象/2.2.5-部件/3-空调专业部件.xlsx", "CCOTFN冷却塔风机"));
+		//funcids.addAll(readSheet("Sheet1", "/2.2-设备设施类对象/2.2.5-部件/4-给排水专业部件.xlsx", "Sheet1"));
+		//funcids.addAll(readSheet("Sheet1", "/2.2-设备设施类对象/2.2.5-部件/5-消防专业部件.xlsx", "Sheet1"));
+		//funcids.addAll(readSheet("Sheet1", "/2.2-设备设施类对象/2.2.5-部件/6-安防专业部件.xlsx", "Sheet1"));
+		funcids.addAll(readSheet("CFCSFDCS", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "CSFDCS基础垫层"));
+		funcids.addAll(readSheet("CFCSFDWB", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "CSFDWB基础防水板"));
+		funcids.addAll(readSheet("CFCSFDGD", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "CSFDGD基础梁"));
+		funcids.addAll(readSheet("CFCSFDPN", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "CSFDPN基础嵌板"));
+		funcids.addAll(readSheet("CFCSFDAA", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "CSFDAA基础抗浮锚杆"));
+		funcids.addAll(readSheet("CFCSFDPL", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "CSFDPL基础桩"));
+		funcids.addAll(readSheet("CFCSFDED", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "CSFDED基础电梯基坑"));
+		funcids.addAll(readSheet("CFCSFDCP", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "CSFDCP基础集水坑"));
+		funcids.addAll(readSheet("CFCSWLBD", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "CSWLBD墙体"));
+		funcids.addAll(readSheet("CFCSWLIL", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "CSWLIL墙保温层"));
+		funcids.addAll(readSheet("CFCSWLEP", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "CSWLEP墙预埋件"));
+		funcids.addAll(readSheet("CFCSWLCT", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "CSWLCT墙涂层"));
+		funcids.addAll(readSheet("CFCSSWBD", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "CSSWBD楼梯主体"));
+		funcids.addAll(readSheet("CFCSSWRW", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "CSSWRW楼梯坡道"));
+		funcids.addAll(readSheet("CFCSSWAR", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "CSSWAR楼梯扶手"));
+		funcids.addAll(readSheet("CFBECWKL", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "BECWKL幕墙龙骨"));
+		funcids.addAll(readSheet("CFBECWPN", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "BECWPN幕墙嵌板"));
+		funcids.addAll(readSheet("CFBECWCP", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "BECWCP幕墙组件"));
+		funcids.addAll(readSheet("CFBELRKL", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "BELRKL采光顶龙骨"));
+		funcids.addAll(readSheet("CFBELRPN", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "BELRPN采光顶嵌板"));
+		funcids.addAll(readSheet("CFBELRCP", "/2.2-设备设施类对象/2.2.5-部件/7-土建精装专业部件.xlsx", "BELRCP采光顶组件"));
+		//funcids.addAll(readSheet("Sheet1", "/2.2-设备设施类对象/2.2.5-部件/8-其他专业部件.xlsx", "Sheet1"));
+
+	}
+
+	private void importVirtual(List<FuncidDefModel> funcids) throws IOException {
+		funcids.addAll(readSheet("VOEm", "/2.5-虚拟对象.xlsx", "1能耗模型"));
+		funcids.addAll(readSheet("VOSe", "/2.5-虚拟对象.xlsx", "2分项"));
+		funcids.addAll(readSheet("VOBr", "/2.5-虚拟对象.xlsx", "3支路"));
+		funcids.addAll(readSheet("VOBc", "/2.5-虚拟对象.xlsx", "4信标"));
+	}
+
+	private void importTool(List<FuncidDefModel> funcids) throws IOException {
+		funcids.addAll(readSheet("tool", "/2.3-耗材工具类对象/2.3.2-耗材工具类对象通用属性.xlsx", "工具"));
+	}
+
+	private void importMaterial(List<FuncidDefModel> funcids) throws IOException {
+		funcids.addAll(readSheet("material", "/2.3-耗材工具类对象/2.3.2-耗材工具类对象通用属性.xlsx", "耗材"));
+	}
+
+	@Data
+	private static class CacheModel {
+		private String classCode;
+		private String firstTag;
+		private String secondTag;
+		private String origCode;
+		private String name;
+		private String unit;
+		private String origDataType;
+		private String priority; // 优先级
+		private String inputMode;
+		private String origDataSource; // 字典选择
+		private String remark; // 备注
+	}
+
+	private List<FuncidDefModel> readSheet(String classCode, String fileName, String sheetName) throws IOException {
+		List<FuncidDefModel> data = new LinkedList<>();
+		String classFile = basepath + fileName;
+		FileInputStream inputStream = new FileInputStream(classFile);
+		Workbook workbook = new XSSFWorkbook(inputStream);
+		Sheet sheet = workbook.getSheet(sheetName);
+		if (sheet == null) {
+			return data;
+		}
+
+		// 行号从0开始, 从第2行开始读数据
+		int startRowNum = 2;
+		int lastRowNum = sheet.getLastRowNum();
+		CacheModel cache = new CacheModel();
+		for (int rowIndex = startRowNum; rowIndex <= lastRowNum; rowIndex++) {
+			Row row = sheet.getRow(rowIndex);
+			if (row == null) {
+				log.info("file: {}, sheet: {}, row[{}] is null", fileName, sheetName, rowIndex);
+				continue;
+			}
+			// 0:firstTag, 1:secondTag, 2:name, 3:origCode, 4:unit, 5:origDataType, 6:priorite, 7:imputMode, 8:origDataSource, 9:remark
+			CacheModel target = new CacheModel();
+			target.classCode = classCode;
+			target.firstTag = (String) ExcelUtils.parseCell(row.getCell(0), "string");
+			target.secondTag = (String) ExcelUtils.parseCell(row.getCell(1), "string");
+			target.name = (String) ExcelUtils.parseCell(row.getCell(2), "string");
+			target.origCode = (String) ExcelUtils.parseCell(row.getCell(3), "string");
+			target.unit = (String) ExcelUtils.parseCell(row.getCell(4), "string");
+			target.origDataType = (String) ExcelUtils.parseCell(row.getCell(5), "string");
+			target.priority = (String) ExcelUtils.parseCell(row.getCell(6), "string");
+			target.inputMode = (String) ExcelUtils.parseCell(row.getCell(7), "string");
+			target.origDataSource = (String) ExcelUtils.parseCell(row.getCell(8), "string");
+			target.remark = (String) ExcelUtils.parseCell(row.getCell(9), "string");
+
+			if (target.origCode == null || "".equals(target.origCode) || "`".equals(target.origCode)) {
+				continue;
+			}
+			if (FuncidUtils.isBase(target.origCode)) {
+				continue;
+			}
+
+			// firstTag不为空
+			if (target.firstTag != null) {
+				cache.firstTag = target.firstTag;
+				cache.secondTag = null;
+			} else {
+				target.firstTag = cache.firstTag;
+			}
+
+			// secondTag
+			if (target.secondTag != null) {
+				cache.secondTag = target.secondTag;
+			} else {
+				target.secondTag = cache.secondTag;
+			}
+			FuncidDefModel funcidDefModel = toFuncidDefModel(target);
+			if (funcidDefModel == null) {
+				log.info("file: {}, sheet: {}, row: {} data type [{}] error", fileName, sheetName, rowIndex, target.origDataType);
+			} else {
+				data.add(funcidDefModel);
+			}
+		}
+		return data;
+	}
+
+}
+

+ 332 - 0
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/knowladge/Test1.java

@@ -0,0 +1,332 @@
+package com.persagy.dmp.rwd.knowladge;
+
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.rwd.dic.ExcelUtils;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.junit.Test;
+
+import java.io.FileInputStream;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author: yaoll
+ * @date: 2020-12-02
+ * @verison: 1.0
+ */
+@Slf4j
+public class Test1 {
+
+	private String basepath = "/Users/devsaga/persagy/数据字典20201118/Ch4-专家知识库";
+
+	@Data
+	public static class Item {
+		private String code;
+		private String name;
+		private String parentCode;
+
+		public Item(String code, String name, String parentCode) {
+			this.code = code;
+			this.name = name;
+			this.parentCode = parentCode;
+		}
+	}
+
+	@Test
+	public void test1() throws Exception {
+		String file = basepath + "/4.2-行业推荐模型/4.2.1-推荐空间业态分类.xlsx";
+		String sheetname = "3空间功能类型";
+
+		FileInputStream inputStream = new FileInputStream(file);
+		Workbook workbook = new XSSFWorkbook(inputStream);
+		Sheet sheet = workbook.getSheet(sheetname);
+
+		// 行号从0开始, 从第3行开始读数据
+		int startRowNum = 3;
+		int lastRowNum = sheet.getLastRowNum();
+
+		List<FuncType> list = new LinkedList<>();
+		FuncType temp = new FuncType();
+		for (int rowIndex = startRowNum; rowIndex <= lastRowNum; rowIndex++) {
+			Row row = sheet.getRow(rowIndex);
+			if (row == null) {
+				continue;
+			}
+			FuncType target = new FuncType();
+			int i = 3;
+			target.c = (String) ExcelUtils.parseCell(row.getCell(i++), "string");
+			target.d = (String) ExcelUtils.parseCell(row.getCell(i++), "string");
+			if (target.c == null) {
+				target.c = temp.c;
+				target.d = temp.d;
+			} else {
+				temp.c = target.c;
+				temp.d = target.d;
+				temp.e = null;
+				temp.f = null;
+				temp.g = null;
+				temp.h = null;
+				temp.i = null;
+				temp.j = null;
+			}
+
+			target.e = (String) ExcelUtils.parseCell(row.getCell(i++), "string");
+			target.f = (String) ExcelUtils.parseCell(row.getCell(i++), "string");
+			if (target.e == null) {
+				target.e = temp.e;
+				target.f = temp.f;
+			} else {
+				temp.e = target.e;
+				temp.f = target.f;
+				temp.g = null;
+				temp.h = null;
+				temp.i = null;
+				temp.j = null;
+			}
+
+			target.g = (String) ExcelUtils.parseCell(row.getCell(i++), "string");
+			target.h = (String) ExcelUtils.parseCell(row.getCell(i++), "string");
+			if (target.g == null) {
+				target.g = temp.g;
+				target.h = temp.h;
+			} else {
+				temp.g = target.g;
+				temp.h = target.h;
+				temp.i = null;
+				temp.j = null;
+			}
+
+			target.i = (String) ExcelUtils.parseCell(row.getCell(i++), "string");
+			target.j = (String) ExcelUtils.parseCell(row.getCell(i++), "string");
+			list.add(target);
+		}
+
+		List<Item> data = new LinkedList<>();
+		Set<String> codes = new HashSet<>();
+		for (FuncType t : list) {
+			if (t.d != null && !codes.contains(t.d)) {
+				data.add(new Item(t.d, t.c, null));
+				codes.add(t.d);
+			}
+		}
+		for (FuncType t : list) {
+			if (t.f != null && !codes.contains(t.f)) {
+				data.add(new Item(t.f, t.e, t.d));
+				codes.add(t.f);
+			}
+		}
+		for (FuncType t : list) {
+			if (t.h != null && !codes.contains(t.h)) {
+				data.add(new Item(t.h, t.g, t.f));
+				codes.add(t.h);
+			}
+		}
+		for (FuncType t : list) {
+			if (t.j != null && !codes.contains(t.j)) {
+				data.add(new Item(t.j, t.i, t.h));
+				codes.add(t.j);
+			}
+		}
+		for (Item item : data) {
+//			System.out.println(item.code + "\t\t" + item.name + "\t\t" + item.parentCode);
+			System.out.println(JacksonMapper.toSimpleJson(item));
+		}
+	}
+
+	@Test
+	public void test2() throws Exception {
+		String file = basepath + "/4.2-行业推荐模型/4.2.1-推荐空间业态分类.xlsx";
+		String sheetname = "4商业租赁业态类型";
+
+		FileInputStream inputStream = new FileInputStream(file);
+		Workbook workbook = new XSSFWorkbook(inputStream);
+		Sheet sheet = workbook.getSheet(sheetname);
+
+		// 行号从0开始, 从第3行开始读数据
+		int startRowNum = 3;
+		int lastRowNum = sheet.getLastRowNum();
+
+		List<FuncType> list = new LinkedList<>();
+		FuncType temp = new FuncType();
+		for (int rowIndex = startRowNum; rowIndex <= lastRowNum; rowIndex++) {
+			Row row = sheet.getRow(rowIndex);
+			if (row == null) {
+				continue;
+			}
+			FuncType target = new FuncType();
+			int i = 2;
+			target.c = (String) ExcelUtils.parseCell(row.getCell(i++), "string");// B
+			target.d = (String) ExcelUtils.parseCell(row.getCell(i++), "string");// C
+			if (target.c == null) {
+				target.c = temp.c;
+				target.d = temp.d;
+			} else {
+				temp.c = target.c;
+				temp.d = target.d;
+				temp.e = null;
+				temp.f = null;
+				temp.g = null;
+				temp.h = null;
+			}
+
+			target.e = (String) ExcelUtils.parseCell(row.getCell(i++), "string");// D
+			target.f = (String) ExcelUtils.parseCell(row.getCell(i++), "string");// E
+			if (target.e == null) {
+				target.e = temp.e;
+				target.f = temp.f;
+			} else {
+				temp.e = target.e;
+				temp.f = target.f;
+				temp.g = null;
+				temp.h = null;
+			}
+
+			target.g = (String) ExcelUtils.parseCell(row.getCell(i++), "string");// F
+			target.h = (String) ExcelUtils.parseCell(row.getCell(i++), "string");// G
+			list.add(target);
+		}
+
+		List<Item> data = new LinkedList<>();
+		Set<String> codes = new HashSet<>();
+		for (FuncType t : list) {
+			if (t.d != null && !codes.contains(t.d)) {
+				data.add(new Item(t.d, t.c, null));
+				codes.add(t.d);
+			}
+		}
+		for (FuncType t : list) {
+			if (t.f != null && !codes.contains(t.f)) {
+				data.add(new Item(t.f, t.e, t.d));
+				codes.add(t.f);
+			}
+		}
+		for (FuncType t : list) {
+			if (t.h != null && !codes.contains(t.h)) {
+				data.add(new Item(t.h, t.g, t.f));
+				codes.add(t.h);
+			}
+		}
+
+		for (Item item : data) {
+//			System.out.println(item.code + "\t\t" + item.name + "\t\t" + item.parentCode);
+			System.out.println(JacksonMapper.toSimpleJson(item));
+		}
+	}
+
+	private String pre(String str){
+		if (str == null) {
+			return null;
+		}
+		if (str.indexOf(".") > -1) {
+			return str.substring(0, str.indexOf("."));
+		} else {
+			return str;
+		}
+	}
+
+	@Test
+	public void test3() throws Exception {
+		String file = basepath + "/4.1-默认全局属性/4.1.1-地域性信息.xlsx";
+		String sheetname = "1省市区编号";
+
+		FileInputStream inputStream = new FileInputStream(file);
+		Workbook workbook = new XSSFWorkbook(inputStream);
+		Sheet sheet = workbook.getSheet(sheetname);
+
+		// 行号从0开始, 从第2行开始读数据
+		int startRowNum = 2;
+		int lastRowNum = sheet.getLastRowNum();
+
+		List<FuncType> list = new LinkedList<>();
+		FuncType temp = new FuncType();
+		for (int rowIndex = startRowNum; rowIndex <= lastRowNum; rowIndex++) {
+			Row row = sheet.getRow(rowIndex);
+			if (row == null) {
+				continue;
+			}
+			FuncType target = new FuncType();
+			int i = 0;
+			target.a = pre((String) ExcelUtils.parseCell(row.getCell(i++), "string"));// A
+			target.b = (String) ExcelUtils.parseCell(row.getCell(i++), "string");// B
+			if (target.a == null) {
+				target.a = temp.a;
+				target.b = temp.b;
+			} else {
+				temp.a = target.a;
+				temp.b = target.b;
+				temp.c = null;
+				temp.d = null;
+				temp.e = null;
+				temp.f = null;
+			}
+
+			target.c = pre((String) ExcelUtils.parseCell(row.getCell(i++), "string"));// C
+			target.d = (String) ExcelUtils.parseCell(row.getCell(i++), "string");// D
+			if (target.c == null) {
+				target.c = temp.c;
+				target.d = temp.d;
+			} else {
+				temp.e = target.c;
+				temp.d = target.d;
+				temp.e = null;
+				temp.f = null;
+			}
+
+			target.e = pre((String) ExcelUtils.parseCell(row.getCell(i++), "string"));// E
+			target.f = (String) ExcelUtils.parseCell(row.getCell(i++), "string");// F
+			list.add(target);
+		}
+
+		List<Item> data = new LinkedList<>();
+		Set<String> codes = new HashSet<>();
+		for (FuncType t : list) {
+			if (t.a != null && !codes.contains(t.a)) {
+				data.add(new Item(t.a, t.b, null));
+				codes.add(t.a);
+			}
+		}
+		for (FuncType t : list) {
+			if (t.a != null && t.c != null && !codes.contains(t.a + t.c)) {
+				if ("00".equals(t.c)) {
+					data.add(new Item(t.a + t.c, t.b, t.a));
+				} else {
+					data.add(new Item(t.a + t.c, t.d, t.a));
+				}
+				codes.add(t.a + t.c);
+			}
+		}
+		for (FuncType t : list) {
+			if (t.a != null && t.c != null && t.e != null && !codes.contains(t.a + t.c + t.e)) {
+				data.add(new Item(t.a + t.c + t.e, t.f, t.a + t.c));
+				codes.add(t.a + t.c + t.e);
+			}
+		}
+
+		for (Item item : data) {
+//			System.out.println(item.code + "\t\t" + item.name + "\t\t" + item.parentCode);
+			System.out.println(JacksonMapper.toSimpleJson(item));
+		}
+	}
+
+
+
+	public static class FuncType{
+		private String a;//
+		private String b;//
+		private String c;//
+		private String d;
+		private String e;
+		private String f;
+		private String g;
+		private String h;
+		private String i;
+		private String j;
+	}
+}