package com.sagacloud.route; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.github.rjeschke.txtmark.Processor; import com.sagacloud.Exceptions.InvalidPostException; import com.sagacloud.cache.ProPasCache; import com.sagacloud.pojos.DPSelectPropertyResult; import com.sagacloud.route.processors.*; import com.sagacloud.route.processors.Insurance.*; import com.sagacloud.route.processors.Maintainance.FilterPropertyProcessor; import com.sagacloud.route.processors.Maintainance.QueryPropertyProcesspr; import com.sagacloud.route.processors.Manufacturer.MaunfacturerFilter; import com.sagacloud.route.processors.Manufacturer.GetVenderBySpecProcessor; import com.sagacloud.route.processors.PeriodTask.OnTimeTaskProcessor; import com.sagacloud.route.processors.PeriodTask.StatisticsProcessor; import com.sagacloud.route.processors.supplier.SupplierFilter; import com.sagacloud.utils.Const; import org.apache.camel.Exchange; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.ws.rs.core.MediaType; import java.io.StringWriter; import java.lang.reflect.ParameterizedType; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * Created by Xiaoyu on 2018/7/10 */ public class Route extends ExceptionHandlerBaseRoute { private static final Logger log = LoggerFactory.getLogger(Route.class); @Override public void configure() throws Exception { configExceptionHandler(); fromF("timer://simpleTimer?period=1m").process(new OnTimeTaskProcessor()).to("direct:syncAllProject"); fromF("timer://simpleTimer?period=30m").to("direct:synProjectName"); rest().get("/doc") .produces("text/html;charset=UTF-8") .route() .process(msg -> { String docContentStr = Processor.process(Route.class.getClassLoader().getResourceAsStream("documentation.md")); StringWriter writer = new StringWriter(); IOUtils.copy(Route.class.getClassLoader().getResourceAsStream("template.html"), writer, "utf-8"); String tmplateContentStr = writer.toString(); msg.getOut().setBody(tmplateContentStr.replace("#replaceMePlease#", docContentStr)); }); // 生产商查询项目下的资产 rest("/manufacturer/property/").post("query") .consumes(MediaType.APPLICATION_JSON) .produces(MediaType.APPLICATION_JSON) .route() .process(exchange -> { String jsonStr = exchange.getIn().getBody(String.class); JSONObject json = JSONObject.parseObject(jsonStr); exchange.setProperty("venderId", json.getString("venderId")); exchange.getIn().setBody(jsonStr); }) .to("direct:getPropertiesByPj") .process(new GetVenderBySpecProcessor()) .to(Const.venders + "/manufacturer/specification/query_vender") .process(new MaunfacturerFilter()); // 供应商查询项目下的资产 rest("/supplier/property/").post("query") .consumes(MediaType.APPLICATION_JSON) .produces(MediaType.APPLICATION_JSON) .route() .process(exchange -> { String jsonStr = exchange.getIn().getBody(String.class); JSONObject json = JSONObject.parseObject(jsonStr); exchange.setProperty("venderId", json.getString("venderId")); exchange.getIn().setBody(jsonStr); }) .to("direct:getPropertiesByPj") .process(new GetVenderBySpecProcessor()) .to(Const.venders + "/manufacturer/specification/query_vender") .process(new SupplierFilter()); // 获取在保资产清单 rest("/insurance/project/").post("query") .consumes(MediaType.APPLICATION_JSON) .produces(MediaType.APPLICATION_JSON) .route() .process(new GetInsuranceNoListProcessor()) .to(String.join("", InitEnvRoute.venders, "/insurance/contract/query")) .process(new HandleWarrantyFromVenderProcessor()) .to("direct:getPropertiesByPj") //.to(String.join("", InitEnvRoute.dataPlatform, "/property/relation_query")) .process(new GetPropertyUnderWarrantyProcessor()); // 获取所有保单列表 rest("/insurance/contract/").post("query") .consumes(MediaType.APPLICATION_JSON) .produces(MediaType.APPLICATION_JSON) .route() .process(new GetInsuranceNoListProcessor()) .to(String.join("", InitEnvRoute.venders, "/insurance/contract/query")) .process(new HandleWarrantyFromVenderProcessor()) .to("direct:getPropertiesByPj") .process(new GetPropertyCountInAllWarrantyProcessor()); // 根据保单获取资产 rest("/insurance/contract/property/").post("query") .consumes(MediaType.APPLICATION_JSON) .produces(MediaType.APPLICATION_JSON) .route() .process(new StoreInsuranceNoProcessor()) .to("direct:getPropertiesByPj") .process(new GetPropertyInCertainWarrantyProcessor()); // 查询指定项目内合同有效期内的资产/查询指定项目内历史维护资产 rest("/maintainance/property/").post("query") .consumes(MediaType.APPLICATION_JSON) .produces(MediaType.APPLICATION_JSON) .route() .process(new QueryPropertyProcesspr()) .to("direct:getEquipmentByPj") .process(new FilterPropertyProcessor()); rest("/project/sync").post() .consumes(MediaType.APPLICATION_JSON) .produces(MediaType.APPLICATION_JSON) .route() .process(exchange -> { String jsonStr = exchange.getIn().getBody(String.class); JSONObject json = JSONObject.parseObject(jsonStr); JSONArray projectArr = json.getJSONArray("project"); List projectList = projectArr.toJavaList(String.class); if (projectList == null || projectList.size() == 0) { throw new InvalidPostException("project不能为空"); } exchange.setProperty("projectList", projectList); }) .to("direct:buildVenderMap"); rest("/project/sync_all").post() .consumes(MediaType.APPLICATION_JSON) .produces(MediaType.APPLICATION_JSON) .route() .to("direct:syncAllProject"); //同步全部项目的资产信息 from("direct:syncAllProject") .process(exchange -> { System.out.println("someThing happened"); exchange.setProperty("projectList", ProPasCache.pjList); log.warn("统计数据开始更新"); }) .to("direct:buildVenderMap"); // 需要输入 body是Pj1101080001, getProperty("propertyData") 是 DPSelectPropertyResult类型, // getProperty("map") 是 Map>类型 说明: 信息点Name --> (厂商库该信息点的值 --> 所属厂商) from("direct:getPropertyStatisticsByProject").process(new StatisticsProcessor()) .to(String.join("", InitEnvRoute.venders, "/auxiliary/property/create_by_project")); //body为JSONObject,含有projectId字段 from("direct:getPropertiesByPj") .process(new GetPropByPjProcessor()).setHeader(Exchange.HTTP_METHOD, constant("POST")) .to(InitEnvRoute.dataPlatform + "/property/relation_query?bridgeEndpoint=true&method=POST"); from("direct:getEquipmentByPj") .process(new GetEquipmentByPjProcessor()) .to(Const.dataPlatform + "/object/subset_query"); // 统计数据平台资产和设备信息(数量) from("direct:buildVenderMap").setHeader(Exchange.HTTP_METHOD, constant("POST")) .to(Const.venders + "/auxiliary/vender/query_detail?bridgeEndpoint=true&method=POST") .process(new VenderMapProcessor()) .split(body()) //.parallelProcessing() .process(exchange -> { String projectId = exchange.getIn().getBody(String.class); System.out.println("统计:" + projectId); JSONObject json = new JSONObject(); json.put("projectId", projectId); exchange.setProperty("projectId" + exchange.getExchangeId(), projectId); exchange.getIn().setBody(json.toString()); }) .to("direct:getPropertiesByPj") .process(exchange -> { String jsonStr = exchange.getIn().getBody(String.class); DPSelectPropertyResult dpResult = JSONObject.parseObject(jsonStr, DPSelectPropertyResult.class); exchange.setProperty("propertyData" + exchange.getExchangeId(), dpResult); // 为下个路由准备输入数据 String projectId = (String) exchange.getProperty("projectId" + exchange.getExchangeId()); JSONObject json = new JSONObject(); json.put("projectId", projectId); exchange.getIn().setBody(json.toString()); }) .to("direct:getEquipmentByPj") .process(exchange -> { String jsonStr = exchange.getIn().getBody(String.class); DPSelectPropertyResult eqResult = JSONObject.parseObject(jsonStr, DPSelectPropertyResult.class); exchange.setProperty("facilityData" + exchange.getExchangeId(), eqResult); exchange.getIn().setBody(exchange.getProperty("projectId" + exchange.getExchangeId())); }) .to("direct:getPropertyStatisticsByProject"); // 主动同步数据平台项目名接口 rest("/project/").post("sync_name") .consumes(MediaType.APPLICATION_JSON) .produces(MediaType.APPLICATION_JSON) .route() .to("direct:synProjectName"); // 根据项目id获取项目的名称. rest("/project/names/").post("query") .consumes(MediaType.APPLICATION_JSON) .produces(MediaType.APPLICATION_JSON) .route() .process(exchange -> { try { String body = exchange.getIn().getBody(String.class); JSONObject obj = JSONObject.parseObject(body); if(obj != null && obj.getJSONArray("project") != null && obj.getJSONArray("project").size() > 0) { // List projectIds = JSONArray.parseArray(obj.getJSONArray("project").toJSONString(), String.class); List projectIds = obj.getJSONArray("project").toJavaList(String.class); exchange.setProperty("projectIds", new HashSet(projectIds)); }else throw new InvalidPostException("输入格式错误"); }catch (Exception ex){ throw new InvalidPostException("输入格式错误"); } exchange.getIn().setHeader(Exchange.HTTP_URI, String.join("", InitEnvRoute.dataPlatform, "/mng/project/query?bridgeEndpoint=true&secret=A123456")); }).setHeader(Exchange.HTTP_METHOD, constant("GET")) .to(InitEnvRoute.dataPlatform + "/mng/project/query?bridgeEndpoint=true&secret=A123456") .process(new GetNameByProjectIds()); from("direct:synProjectName") .process(exchange -> { log.info("开始同步项目名"); JSONArray criterias = new JSONArray(); for (String pjId : ProPasCache.nameMap.keySet()) { JSONObject obj = new JSONObject(); obj.put("projectId",pjId); obj.put("projectLocalName",ProPasCache.nameMap.get(pjId)); criterias.add(obj); } JSONObject inserJson = new JSONObject(); inserJson.put("criterias",criterias); log.info("数据:"+inserJson.toString()); exchange.getIn().setBody(inserJson.toString()); exchange.getIn().setHeader(Exchange.HTTP_URI, InitEnvRoute.venders+"/auxiliary/project/create?method=POST"); log.info(InitEnvRoute.venders+"/auxiliary/project/create?method=POST"); }) .to(InitEnvRoute.venders+"/auxiliary/project/create"); rest("/getInsurance").post() .produces(MediaType.APPLICATION_JSON) .route() .process(ContractMethods :: validateDPInsurerID) .process(ContractMethods :: preQueryEq) .to(InitEnvRoute.dataPlatform + "/object/subset_query?bridgeEndpoint=true") .process(ContractMethods :: extractInsuranceNum); rest("/getSupplierContractID").post() .produces(MediaType.APPLICATION_JSON) .route() .process(ContractMethods :: validateDPSupplierID) .process(ContractMethods :: preQueryEq) .to(InitEnvRoute.dataPlatform + "/object/subset_query?bridgeEndpoint=true") .process(ContractMethods :: extractSupplierContractIds); } }