Pārlūkot izejas kodu

模型修改设备元空间的建筑楼层信息

linhuili 3 gadi atpakaļ
vecāks
revīzija
97b450515a

+ 14 - 1
pom.xml

@@ -38,6 +38,13 @@
 				<enabled>true</enabled>
 			</releases>
 		</repository>
+
+		<repository>
+			<id>osgeo</id>
+			<name>Open Source Geospatial Foundation Repository</name>
+			<url>https://repo.osgeo.org/repository/release/</url>
+		</repository>
+
 	</repositories>
 	<properties>
 		<java.version>1.8</java.version>
@@ -75,5 +82,11 @@
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
         </dependency>
-    </dependencies>
+		<dependency>
+			<groupId>org.geotools</groupId>
+			<artifactId>gt-main</artifactId>
+			<version>23.0</version>
+		</dependency>
+
+	</dependencies>
 </project>

+ 3 - 0
src/main/java/com/persagy/proxy/adm/constant/AdmCommonConstant.java

@@ -48,4 +48,7 @@ public interface AdmCommonConstant {
     /** 有效标示*/
     String VALID = "valid";
 
+    /** 楼层标高 */
+    String FLOOR_ELEVATION = "floorElevation";
+
 }

+ 5 - 4
src/main/java/com/persagy/proxy/adm/controller/AdmModelRelController.java

@@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.ws.rs.QueryParam;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -40,16 +41,16 @@ public class AdmModelRelController {
 
     /**
      * 模型修改设备元空间的建筑楼层信息
-     * @param createRequest
+     * @param admModelRel
      * @return
      * @throws Exception
      */
     @PostMapping("/equip-ispace")
-    public AdmResponse update(@RequestBody AdmCreateRequest<AdmModelRel> createRequest, @QueryParam("projectId") String projectId) throws Exception {
+    public AdmResponse update(@RequestBody AdmModelRel admModelRel, @QueryParam("projectId") String projectId) throws Exception {
         // 组装上下文条件
         InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
-        List<AdmModelRel> vos = CollUtil.newArrayList(createRequest.getContent());
-       // vos = service.doUpdate(context, AdmModelRel.class, vos);
+        List<AdmModelRel> vos = new ArrayList<>();
+        vos = service.doUpdateModelInfo(context, AdmModelRel.class,admModelRel);
         return AdmResponse.success(vos);
     }
 

+ 3 - 0
src/main/java/com/persagy/proxy/adm/model/AdmFloor.java

@@ -87,4 +87,7 @@ public class AdmFloor {
     @CascadeColumn(graphCode = "ArchSubset", relCode = "Fl2Sp")
     private List<AdmSpace> spaceList;
 
+    /** 楼层平面图地址 */
+    private String floorMap;
+
 }

+ 2 - 1
src/main/java/com/persagy/proxy/adm/model/AdmModelRel.java

@@ -1,5 +1,6 @@
 package com.persagy.proxy.adm.model;
 
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import lombok.Data;
 
 /**
@@ -28,5 +29,5 @@ public class AdmModelRel {
     private String modelId;
 
     /** 自定义属性 */
-    private String attributeMap;
+    private ObjectNode attributeMap;
 }

+ 14 - 1
src/main/java/com/persagy/proxy/adm/service/IAdmModelRelService.java

@@ -1,6 +1,10 @@
 package com.persagy.proxy.adm.service;
 
 import com.persagy.proxy.adm.model.AdmLocationPoint;
+import com.persagy.proxy.adm.model.AdmModelRel;
+import com.persagy.proxy.common.entity.InstanceUrlParam;
+
+import java.util.List;
 
 /**
  * @ClassName IAdmModelRelService
@@ -9,5 +13,14 @@ import com.persagy.proxy.adm.model.AdmLocationPoint;
  * @Date 2021/8/31 14:30
  * @Version V1.0
  **/
-public interface IAdmModelRelService extends IAdmBaseService<AdmLocationPoint>{
+public interface IAdmModelRelService extends IAdmBaseService<AdmModelRel>{
+
+    /**
+     * 修改
+     * @param context
+     * @param clazz
+     * @param vo
+     * @return
+     */
+    List<AdmModelRel> doUpdateModelInfo(InstanceUrlParam context, Class<AdmModelRel> clazz, AdmModelRel vo)  throws Exception;
 }

+ 347 - 4
src/main/java/com/persagy/proxy/adm/service/impl/AdmModelRelServiceImpl.java

@@ -1,10 +1,27 @@
 package com.persagy.proxy.adm.service.impl;
 
-import com.persagy.proxy.adm.model.AdmLocationPoint;
-import com.persagy.proxy.adm.service.IAdmLocationPointService;
-import com.persagy.proxy.adm.service.IAdmModelRelService;
+import cn.hutool.core.collection.CollUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.proxy.adm.constant.AdmCommonConstant;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.model.*;
+import com.persagy.proxy.adm.request.AdmQueryCriteria;
+import com.persagy.proxy.adm.request.AdmResponse;
+import com.persagy.proxy.adm.service.*;
+import com.persagy.proxy.adm.utils.GeoToolsUtil;
+import com.persagy.proxy.common.entity.InstanceUrlParam;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
 /**
  * @ClassName AdmModelRelServiceImpl
  * @Description: 模型修改设备元空间的建筑楼层信息
@@ -13,6 +30,332 @@ import org.springframework.stereotype.Service;
  * @Version V1.0
  **/
 @Service
-public class AdmModelRelServiceImpl extends AbstractAdmBaseServiceImpl<AdmLocationPoint> implements IAdmModelRelService {
+@Slf4j
+public class AdmModelRelServiceImpl extends AbstractAdmBaseServiceImpl<AdmModelRel> implements IAdmModelRelService {
+
+
+    @Autowired
+    private IAdmFloorService floorService;
+
+    @Autowired
+    private IAdmEquipmentService equipmentService;
+
+    @Autowired
+    private IAdmISpaceService iSpaceService;
+
+    /**
+     * 模型修改设备元空间的建筑楼层信息
+     * @param context
+     * @param clazz
+     * @param vo
+     * @return
+     */
+    @Override
+    public List<AdmModelRel> doUpdateModelInfo(InstanceUrlParam context, Class<AdmModelRel> clazz, AdmModelRel vo) throws Exception{
+
+        //1.查询模型文件是否有楼层在使用
+        AdmModelRel floorCriteria = new AdmModelRel();
+        floorCriteria.setModelId(vo.getModelId());
+        List<AdmFloor> floorList = queryFloorEntity(context,floorCriteria);
+        if(CollUtil.isNotEmpty(floorList)){
+            List<String> floorQueryTypes = getFloorQueryTypes(floorList);
+            //根据类型查询relation_type_project
+            //更新边类型计算状态:computationalState为2
+
+        }
+        //2.修改设备和元空间的建筑楼层信息
+        String oldBimId = vo.getOldBimId();
+        String bimId = vo.getBimId();
+
+        if(StringUtils.isNotEmpty(oldBimId)  && !oldBimId.equals(bimId)){
+            //根据模型id重置设备元空间的建筑楼层信息
+            resetEquipIspaceInfo(context,vo);
+        }
+
+        //查询楼层实体
+        floorCriteria = new AdmModelRel();
+        floorCriteria.setFloorId(vo.getFloorId());
+        List<AdmFloor> admFloors = queryFloorEntity(context, floorCriteria);
+        if(CollUtil.isEmpty(admFloors)){
+            throw new Exception("楼层不存在");
+        }
+        AdmFloor floorEntity = admFloors.get(0);
+        //2.1 模型修改设备的建筑楼层信息
+        if(CollUtil.isEmpty(floorEntity.getOutline())){
+            //如果楼层的轮廓线为空的话,直接修改
+            updateEquipModelInfo(context, vo,floorEntity);
+        }else{
+            //判断该设备的坐标是否在层楼的轮廓中,若在,修改;不在,不修改
+            List<AdmEquipment> admEquipments = queryModelEquip(context, vo);
+            Boolean pointInPolygon = isPointInPolygon(admEquipments, floorEntity);
+            if(pointInPolygon){
+                updateEquipModelInfo(context, vo,floorEntity);
+            }
+        }
+        //2.2 模型修改元空间的建筑楼层信息
+        updateIspaceModelInfo(context, vo,floorEntity);
+
+        //3. 修改楼层平面图地址
+        if(StringUtils.isNotEmpty(vo.getFloorMap())){
+            floorEntity.setFloorMap(vo.getFloorMap());
+        }
+        floorEntity.setModelId(vo.getModelId());
+        floorEntity.setBimIdPre(vo.getBimId());
+
+        //4.处理楼层自定义属性:楼层标高
+        ObjectNode attributeMap = vo.getAttributeMap();
+        if(attributeMap!=null){
+            updateFloorElevation(vo.getAttributeMap().toString(),floorEntity);
+        }
+
+        //5.修改楼层信息
+        ArrayList<AdmFloor> floors = new ArrayList<>();
+        floors.add(floorEntity);
+        List<AdmFloor> floorUpresult = floorService.doUpdate(context, AdmFloor.class, floors);
+        if(CollUtil.isEmpty(floorUpresult)) {
+            //6.发送消息,BDTP已发送,不再重复发送修改对象消息
+        }
+        return null;
+    }
+
+    /**
+     * 模型修改设备的建筑楼层信息
+     */
+    private void updateEquipModelInfo(InstanceUrlParam context, AdmModelRel modelRel,AdmFloor floorEntity){
+
+        //查询模型下的设备信息
+        AdmQueryCriteria criteria = new AdmQueryCriteria();
+        criteria.setFilters("bimId = "+modelRel.getBimId());
+        criteria.setFilters("floorId = "+modelRel.getFloorId());
+        AdmResponse admResponse = equipmentService.doQuery(context, criteria, AdmEquipment.class);
+        List<AdmEquipment> content = (List<AdmEquipment>) admResponse.getContent();
+        if(CollUtil.isEmpty(content)){
+            return;
+        }
+        for (AdmEquipment admEquipment : content) {
+            //修改设备的建筑楼层信息
+            admEquipment.setBuildingId(floorEntity.getBuildingId());
+            admEquipment.setFloorId(floorEntity.getId());
+        }
+        List<AdmEquipment> admEquipments = equipmentService.doUpdate(context, AdmEquipment.class, content);
+        log.info("模型修改设备建筑楼层信息结果"+admEquipments);
+    }
+
+
+    /**
+     * 模型修改元空间的建筑楼层信息
+     */
+    private void updateIspaceModelInfo(InstanceUrlParam context, AdmModelRel modelRel,AdmFloor floorEntity){
+
+        //查询模型下的元空间信息
+        AdmQueryCriteria criteria = new AdmQueryCriteria();
+        criteria.setFilters("bimId = "+modelRel.getBimId());
+        criteria.setFilters("floorId = "+modelRel.getFloorId());
+        AdmResponse admResponse = iSpaceService.doQuery(context, criteria, AdmISpace.class);
+        List<AdmISpace> content = (List<AdmISpace>) admResponse.getContent();
+        if(CollUtil.isEmpty(content)){
+            return;
+        }
+        for (AdmISpace admIspace : content) {
+            //修改设备的建筑楼层信息
+            admIspace.setBuildingId(floorEntity.getBuildingId());
+            admIspace.setFloorId(floorEntity.getId());
+        }
+        List<AdmISpace> admEquipments = iSpaceService.doUpdate(context, AdmISpace.class, content);
+        log.info("模型修改元空间的建筑楼层信息结果"+admEquipments);
+    }
+
+
+    /**
+     * 判断点是否在面中
+     * @return
+     */
+    private Boolean isPointInPolygon(List<AdmEquipment> equipments,AdmFloor floor){
+        if(CollUtil.isEmpty(equipments)){
+            return false;
+        }
+        Boolean flag = true;
+        //楼层轮廓线
+        List<ObjectNode> outline = floor.getOutline();
+        for (AdmEquipment equipment : equipments) {
+            //设备BIM坐标
+            String bimLocation = equipment.getBimLocation();
+            //判断点是否在面中:即设备位置是否在该楼层轮廓线中
+            if(StringUtils.isEmpty(bimLocation)){
+                continue;
+            }
+            String[] split = bimLocation.split(",");
+            ObjectNode node = JsonNodeFactory.instance.objectNode();
+            node.put("X",split[0]);
+            node.put("Y",split[1]);
+            node.put("Z",split[2]);
+            flag = GeoToolsUtil.isPointInPoly(node,outline);
+            if(!flag){
+                return flag;
+            }
+        }
+        return flag;
+    }
+
+
+    /**
+     * 楼层属性修改
+     * @param floorMapStr
+     * @param floorEntity
+     */
+    private void updateFloorMap(String floorMapStr,AdmFloor floorEntity){
+        if(StringUtils.isEmpty(floorMapStr)){
+            return;
+        }
+        Map<String, Object> floorMap = JSONObject.toJavaObject(JSON.parseObject(floorMapStr), Map.class);
+        Map<String, Object> infos = floorEntity.getInfos();
+        for(Map.Entry<String,Object> map : floorMap.entrySet()){
+            infos.put(map.getKey(),map.getValue());
+        }
+        floorEntity.setInfos(infos);
+    }
+
+    /**
+     * 处理楼层标高
+     * @param floorMapStr
+     * @param floorEntity
+     */
+    private void updateFloorElevation(String floorMapStr,AdmFloor floorEntity){
+        if(StringUtils.isEmpty(floorMapStr)){
+            return;
+        }
+        Map<String, Object> floorMap = JSONObject.toJavaObject(JSON.parseObject(floorMapStr), Map.class);
+
+        Map<String, Object> infos = floorEntity.getInfos();
+        if(floorMap.containsKey(AdmCommonConstant.FLOOR_ELEVATION)){
+            Object object = floorMap.get(AdmCommonConstant.FLOOR_ELEVATION);
+            if(object != null){
+                double floorElevation = (Double) object / 1000;
+                infos.put(AdmCommonConstant.FLOOR_ELEVATION,floorElevation);
+            }
+        }
+    }
+
+
+    /**
+     * 根据模型id重置设备元空间的建筑楼层信息
+     * @param context
+     * @param vo
+     */
+    private void resetEquipIspaceInfo(InstanceUrlParam context, AdmModelRel vo){
+        //重置历史设备的建筑楼层信息
+        List<AdmEquipment> admEquipments = queryEquipmentByBimId(context, vo);
+        if(CollUtil.isNotEmpty(admEquipments)){
+            admEquipments.forEach(item->{
+                item.setFloorId(null);
+                item.setBuildingId(null);
+            });
+        }
+        equipmentService.doUpdate(context,AdmEquipment.class,admEquipments);
+
+        //重置历史元空间的建筑楼层信息
+        List<AdmISpace> admISpaces = queryIspaceByBimId(context, vo);
+        if(CollUtil.isNotEmpty(admISpaces)){
+            admISpaces.forEach(item->{
+                item.setFloorId(null);
+                item.setBuildingId(null);
+            });
+        }
+       iSpaceService.doUpdate(context,AdmISpace.class,admISpaces);
+    }
+
+
+    /**
+     * 查询设备信息
+     * @param context
+     * @param modelRel
+     */
+    private List<AdmEquipment> queryModelEquip(InstanceUrlParam context, AdmModelRel modelRel){
+        //查询模型下的设备信息
+        AdmQueryCriteria criteria = new AdmQueryCriteria();
+        criteria.setFilters("bimId = '"+modelRel.getBimId()+"'");
+        criteria.setFilters("floorId = '"+modelRel.getFloorId()+"'");
+        AdmResponse admResponse = equipmentService.doQuery(context, criteria, AdmEquipment.class);
+        if(CollUtil.isEmpty(admResponse.getContent())){
+            return new ArrayList<>();
+        }
+        return (List<AdmEquipment>) admResponse.getContent();
+    }
+
+    /**
+     * 根据BIMID查询历史设备信息
+     */
+    private List<AdmEquipment> queryEquipmentByBimId(InstanceUrlParam context, AdmModelRel vo){
+        AdmQueryCriteria criteria = new AdmQueryCriteria();
+        criteria.setFilters("bimId = '"+vo.getOldBimId()+"'");
+        AdmResponse admResponse = equipmentService.doQuery(context, criteria, AdmEquipment.class);
+        return (List<AdmEquipment>)admResponse.getContent();
+    }
+
+
+    /**
+     * 根据BIMID查询历史元空间信息
+     */
+    private List<AdmISpace> queryIspaceByBimId(InstanceUrlParam context, AdmModelRel vo){
+        AdmQueryCriteria criteria = new AdmQueryCriteria();
+        criteria.setFilters("bimId = '"+vo.getOldBimId()+"'");
+        AdmResponse admResponse = iSpaceService.doQuery(context, criteria, AdmISpace.class);
+        return (List<AdmISpace>)admResponse.getContent();
+    }
+
+
+    /**
+     * 查询模型文件是否有楼层在使用
+     */
+    private List<AdmFloor> queryFloorEntity(InstanceUrlParam context, AdmModelRel vo){
+        AdmQueryCriteria criteria = new AdmQueryCriteria();
+        if(StringUtils.isNotEmpty(vo.getModelId())){
+            criteria.setFilters("modelId = '"+vo.getModelId()+"'");
+        }
+        if(StringUtils.isNotEmpty(vo.getFloorId())){
+            criteria.setFilters("id = '"+vo.getFloorId()+"'");
+        }
+        AdmResponse admResponse = floorService.doQuery(context, criteria, AdmFloor.class);
+        return (List<AdmFloor>)admResponse.getContent();
+    }
+
 
+    /**
+     * 获取楼层查询类型
+     * @param floorList
+     */
+    private List<String> getFloorQueryTypes(List<AdmFloor> floorList){
+        List<String> types = new ArrayList<>();
+        for (AdmFloor admFloor : floorList) {
+            if(CollUtil.isNotEmpty(admFloor.getOutline())){
+                types.add("eq2fl");
+                types.add("fl2sp");
+                types.add("bd2sp");
+            }
+            types.add(AdmRelationTypeEnum.EQ2SP_IN.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_ACAIRNETWORK_2.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_CONDWATERNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_VENTNETWORK_2.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_ACAIRNETWORK_3.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_HEATWATERLOOP_4.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_HEATWATERLOOP_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_DHWNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_RECYCLEWATERNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_FIREVENTNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_FIREWATERNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_VRFNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_CHILLWATERLOOP_2.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQFRESHAIRNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_CHILLWATERLOOP_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_DRINKINGWATERNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_COOLINGWATERLOOP_2.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_VENTNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_HEATWATERLOOP_2.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_COOLINGWATERLOOP_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_ACAIRNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_SUPPLYWATERNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_DRAININGWATERNETWORK_1.getRelCode());
+        }
+        return types;
+    }
 }

+ 89 - 0
src/main/java/com/persagy/proxy/adm/utils/GeoToolsUtil.java

@@ -0,0 +1,89 @@
+package com.persagy.proxy.adm.utils;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.geotools.geometry.jts.JTSFactoryFinder;
+import org.locationtech.jts.geom.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * @ClassName GeoToolsUtil
+ * @Description: 点面包含关系分析
+ * @Author linhuili
+ * @Date 2021/9/3 20:31
+ * @Version V1.0
+ **/
+public class GeoToolsUtil {
+    /**
+     * 创建点
+     * @param pointLocal
+     */
+    private static Point createPoint(ObjectNode pointLocal){
+        Long x = 0L;
+        Long y = 0L;
+        Long z = 0L;
+        if(pointLocal.get("X") != null){
+            x = Long.valueOf(pointLocal.get("X").textValue());
+        }
+        if(pointLocal.get("Y") != null){
+            y = Long.valueOf(pointLocal.get("Y").textValue());
+        }
+        if(pointLocal.get("Z") !=null){
+            z = Long.valueOf(pointLocal.get("Z").textValue());
+        }
+        GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
+        Coordinate coord = new Coordinate(x, y,z);
+        Point point = geometryFactory.createPoint(coord);
+        return point;
+    }
+
+    /**
+     * 创建面
+     * @param outLines
+     */
+    private static Polygon createPolygon(List<ObjectNode> outLines){
+        GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
+        List<Coordinate> objects = new ArrayList<>();
+        for (ObjectNode outLine : outLines) {
+            Long x = 0L;
+            Long y = 0L;
+            Long z = 0L;
+            if(outLine.get("X") != null){
+                x = Long.valueOf(outLine.get("X").textValue());
+            }
+            if(outLine.get("Y") != null){
+                y = Long.valueOf(outLine.get("Y").textValue());
+            }
+            if(outLine.get("Z") !=null){
+                z = Long.valueOf(outLine.get("Z").textValue());
+            }
+            Coordinate coordinate = new Coordinate(x, y, z);
+            objects.add(coordinate);
+        }
+        Coordinate[] coordinates = objects.toArray(new Coordinate[0]);
+        LinearRing ring = geometryFactory.createLinearRing(objects.toArray(new Coordinate[0]));
+        LinearRing holes[] = null; // use LinearRing[] to represent holes
+        Polygon polygon = geometryFactory.createPolygon(ring, holes);
+        return polygon;
+   }
+
+    /**
+     * 点面包含关系判断
+     * 用途:判断一个面是否包含一个点,即一个点是否在一个面内
+     * @param pointLocal 坐标点
+     * @param outLines 轮廓线
+     * @return
+     */
+   public static Boolean isPointInPoly(ObjectNode pointLocal, List<ObjectNode> outLines){
+       //创建点
+       Point point = createPoint(pointLocal);
+       //创建面
+       Polygon polygon = createPolygon(outLines);
+       //判断点面包含关系
+       boolean flag = polygon.contains(point);
+       return flag;
+   }
+
+}