瀏覽代碼

临时提交

648540858 1 年之前
父節點
當前提交
b246fd6a20

+ 1 - 5
src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java

@@ -2,7 +2,6 @@ package com.genersoft.iot.vmp.gb28181.bean;
 
 import com.genersoft.iot.vmp.gb28181.utils.MessageElement;
 import com.genersoft.iot.vmp.gb28181.utils.XmlUtil;
-import com.genersoft.iot.vmp.utils.CivilCodeUtil;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -225,11 +224,8 @@ public class DeviceChannel extends CommonGBChannel {
 			if (ObjectUtils.isEmpty(deviceChannel.getCivilCode())
 					|| deviceChannel.getCivilCode().length() > 8 ){
 				deviceChannel.setCivilCode(null);
-			}else {
-				if (CivilCodeUtil.INSTANCE.getCivilCodePo(deviceChannel.getCivilCode()) == null) {
-					deviceChannel.setCivilCode(null);
-				}
 			}
+			// 此处对于不在wvp缓存中的行政区划,默认直接存储.保证即使出现wvp的行政区划缓存过老,也可以通过用户自主创建的方式正常使用系统
 		}
 		return XmlUtil.elementDecode(element, DeviceChannel.class);
 	}

+ 0 - 2
src/main/java/com/genersoft/iot/vmp/gb28181/bean/RegionTree.java

@@ -50,8 +50,6 @@ public class RegionTree {
         return regionTree;
     }
 
-
-
     public static RegionTree getInstance(CommonGBChannel channel) {
         RegionTree regionTree = new RegionTree();
         regionTree.setId(channel.getGbDeviceId());

+ 3 - 12
src/main/java/com/genersoft/iot/vmp/gb28181/controller/CommonChannelController.java

@@ -8,14 +8,13 @@ import com.genersoft.iot.vmp.gb28181.bean.NetworkIdentificationType;
 import com.genersoft.iot.vmp.gb28181.service.IGbChannelService;
 import com.genersoft.iot.vmp.media.service.IMediaServerService;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
-import com.genersoft.iot.vmp.vmanager.bean.PageInfo;
+import com.github.pagehelper.PageInfo;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.security.SecurityRequirement;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.*;
 
@@ -23,7 +22,7 @@ import java.util.List;
 
 
 @Tag(name  = "全局通道管理")
-@Controller
+@RestController
 @Slf4j
 @RequestMapping(value = "/api/common/channel")
 public class CommonChannelController {
@@ -41,48 +40,41 @@ public class CommonChannelController {
     @Operation(summary = "查询通道信息", security = @SecurityRequirement(name = JwtUtils.HEADER))
     @Parameter(name = "id", description = "通道的数据库自增Id", required = true)
     @GetMapping(value = "/one")
-    @ResponseBody
     public CommonGBChannel getOne(int id){
         return channelService.getOne(id);
     }
 
     @Operation(summary = "获取行业编码列表", security = @SecurityRequirement(name = JwtUtils.HEADER))
-    @ResponseBody
     @GetMapping("/industry/list")
     public List<IndustryCodeType> getIndustryCodeList(){
         return channelService.getIndustryCodeList();
     }
 
     @Operation(summary = "获取编码列表", security = @SecurityRequirement(name = JwtUtils.HEADER))
-    @ResponseBody
     @GetMapping("/type/list")
     public List<DeviceType> getDeviceTypeList(){
         return channelService.getDeviceTypeList();
     }
 
     @Operation(summary = "获取编码列表", security = @SecurityRequirement(name = JwtUtils.HEADER))
-    @ResponseBody
     @GetMapping("/network/identification/list")
     public List<NetworkIdentificationType> getNetworkIdentificationTypeList(){
         return channelService.getNetworkIdentificationTypeList();
     }
 
     @Operation(summary = "更新通道", security = @SecurityRequirement(name = JwtUtils.HEADER))
-    @ResponseBody
     @PostMapping("/update")
     public void update(@RequestBody CommonGBChannel channel){
         channelService.update(channel);
     }
 
     @Operation(summary = "重置国标通道", security = @SecurityRequirement(name = JwtUtils.HEADER))
-    @ResponseBody
     @PostMapping("/reset")
     public void reset(Integer id){
         channelService.reset(id);
     }
 
     @Operation(summary = "增加通道", security = @SecurityRequirement(name = JwtUtils.HEADER))
-    @ResponseBody
     @PostMapping("/add")
     public CommonGBChannel add(@RequestBody CommonGBChannel channel){
         channelService.add(channel);
@@ -94,8 +86,7 @@ public class CommonChannelController {
     @Parameter(name = "count", description = "每页查询数量", required = true)
     @Parameter(name = "query", description = "查询内容")
     @Parameter(name = "online", description = "是否在线")
-    @ResponseBody
-    @PostMapping("/list")
+    @GetMapping("/list")
     public PageInfo<CommonGBChannel> queryList(int page, int count,
                                                @RequestParam(required = false) String query,
                                                @RequestParam(required = false) Boolean online){

+ 4 - 4
src/main/java/com/genersoft/iot/vmp/gb28181/controller/RegionController.java

@@ -78,10 +78,10 @@ public class RegionController {
     @Operation(summary = "删除区域")
     @Parameter(name = "regionDeviceId", description = "区域编码", required = true)
     @ResponseBody
-    @GetMapping("/delete")
-    public void delete(String regionDeviceId){
-        assert regionDeviceId != null;
-        boolean result = regionService.deleteByDeviceId(regionDeviceId);
+    @DeleteMapping("/delete")
+    public void delete(String deviceId){
+        assert !ObjectUtils.isEmpty(deviceId);
+        boolean result = regionService.deleteByDeviceId(deviceId);
         if (!result) {
             throw new ControllerException(ErrorCode.ERROR100.getCode(), "移除失败");
         }

+ 12 - 3
src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java

@@ -1,6 +1,7 @@
 package com.genersoft.iot.vmp.gb28181.dao;
 
 import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel;
+import com.genersoft.iot.vmp.gb28181.bean.Region;
 import com.genersoft.iot.vmp.gb28181.bean.RegionTree;
 import com.genersoft.iot.vmp.gb28181.dao.provider.ChannelProvider;
 import org.apache.ibatis.annotations.*;
@@ -238,7 +239,7 @@ public interface CommonGBChannelMapper {
             "    coalesce(wdc.gb_manufacturer, wdc.manufacturer) as gb_manufacturer,\n" +
             "    coalesce(wdc.gb_model, wdc.model) as gb_model,\n" +
             "    coalesce(wdc.gb_owner, wdc.owner) as gb_owner,\n" +
-            "    coalesce(wpgc.civil_code, wdc.gb_civil_code, wdc.civil_code) as gb_civil_code,\n" +
+            "    wdc.gb_civil_code,\n" +
             "    coalesce(wdc.gb_block, wdc.block) as gb_block,\n" +
             "    coalesce(wdc.gb_address, wdc.address) as gb_address,\n" +
             "    coalesce(wpgc.parental, wdc.gb_parental, wdc.parental) as gb_parental,\n" +
@@ -275,7 +276,7 @@ public interface CommonGBChannelMapper {
     @Update(value = {" <script>" +
             " UPDATE wvp_device_channel " +
             " SET update_time=#{updateTime}, gb_device_id = null, gb_name = null, gb_manufacturer = null," +
-            " gb_model = null, gb_owner = null, gb_civil_code = null, gb_block = null, gb_address = null," +
+            " gb_model = null, gb_owner = null, gb_block = null, gb_address = null," +
             " gb_parental = null, gb_parent_id = null, gb_safety_way = null, gb_register_way = null, gb_cert_num = null," +
             " gb_certifiable = null, gb_err_code = null, gb_end_time = null, gb_secrecy = null, gb_ip_address = null, " +
             " gb_port = null, gb_password = null, gb_status = null, gb_longitude = null, gb_latitude = null, " +
@@ -314,9 +315,17 @@ public interface CommonGBChannelMapper {
             "    1 as type, " +
             "    true as is_leaf " +
             " from wvp_device_channel " +
-            " where coalesce(gb_civil_code, civil_code) = #{parent} " +
+            " where gb_civil_code = #{parent} " +
             " <if test='query != null'> AND (coalesce(gb_device_id, device_id) LIKE concat('%',#{query},'%') " +
             " OR coalesce(gb_name, name) LIKE concat('%',#{query},'%'))</if> " +
             " </script>")
     List<RegionTree> queryForRegionTreeByCivilCode(@Param("query") String query, @Param("parent") String parent);
+
+    @Update(value = {" <script>" +
+            " UPDATE wvp_device_channel " +
+            " SET gb_civil_code = null" +
+            " WHERE gb_civil_code in "+
+            " <foreach collection='allChildren'  item='item'  open='(' separator=',' close=')' > #{item.deviceId}</foreach>" +
+            " </script>"})
+    int removeCivilCode(List<Region> allChildren);
 }

+ 13 - 13
src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceChannelMapper.java

@@ -16,12 +16,12 @@ import java.util.List;
 @Repository
 public interface DeviceChannelMapper {
 
-    @Insert("INSERT INTO wvp_device_channel (device_id, device_db_id, name, manufacturer, model, owner, civil_code, block, " +
+    @Insert("INSERT INTO wvp_device_channel (device_id, device_db_id, name, manufacturer, model, owner, civil_code, gb_civil_code, block, " +
             "address, parental, parent_id, safety_way, register_way, cert_num, certifiable, err_code, end_time, secrecy, " +
             "ip_address, port, password, status, longitude, latitude, ptz_type, position_type, room_type, use_type, " +
             "supply_light_type, direction_type, resolution, business_group_id, download_speed, svc_space_support_mod, " +
             "svc_time_support_mode, create_time, update_time, sub_count,stream_id, has_audio, gps_time, stream_identification) " +
-            "VALUES (#{deviceId}, #{deviceDbId}, #{name}, #{manufacturer}, #{model}, #{owner}, #{civilCode}, #{block}," +
+            "VALUES (#{deviceId}, #{deviceDbId}, #{name}, #{manufacturer}, #{model}, #{owner}, #{civilCode}, #{civilCode}, #{block}," +
             "#{address}, #{parental}, #{parentId}, #{safetyWay}, #{registerWay}, #{certNum}, #{certifiable}, #{errCode}, #{endTime}, #{secrecy}, " +
             "#{ipAddress}, #{port}, #{password}, #{status}, #{longitude}, #{latitude}, #{ptzType}, #{positionType}, #{roomType}, #{useType}, " +
             "#{supplyLightType}, #{directionType}, #{resolution}, #{businessGroupId}, #{downloadSpeed}, #{svcSpaceSupportMod}," +
@@ -132,7 +132,7 @@ public interface DeviceChannelMapper {
             " coalesce(dc.gb_manufacturer, dc.manufacturer) as manufacturer,\n" +
             " coalesce(dc.gb_model, dc.model) as model,\n" +
             " coalesce(dc.gb_owner, dc.owner) as owner,\n" +
-            " coalesce(dc.gb_civil_code, dc.civil_code) as civil_code,\n" +
+            " gb_civil_code as civil_code,\n" +
             " coalesce(dc.gb_block, dc.block) as block,\n" +
             " coalesce(dc.gb_address, dc.address) as address,\n" +
             " coalesce(dc.gb_parental, dc.parental) as parental,\n" +
@@ -169,7 +169,7 @@ public interface DeviceChannelMapper {
             "coalesce(dc.gb_device_id, dc.device_id) LIKE concat('%',#{query},'%') " +
             "OR coalesce(dc.gb_name, dc.name) LIKE concat('%',#{query},'%') " +
             ")</if> " +
-            " <if test='parentChannelId != null'> AND (dc.parent_id=#{parentChannelId} OR dc.civil_code = #{parentChannelId}) </if> " +
+            " <if test='parentChannelId != null'> AND (dc.parent_id=#{parentChannelId} OR dc.gb_civil_code = #{parentChannelId}) </if> " +
             " <if test='online == true' > AND dc.status= true</if>" +
             " <if test='online == false' > AND dc.status= false</if>" +
             " <if test='hasSubChannel == true' >  AND dc.sub_count > 0 </if>" +
@@ -197,7 +197,7 @@ public interface DeviceChannelMapper {
             " coalesce(gb_manufacturer, manufacturer) as manufacturer,\n" +
             " coalesce(gb_model, model) as model,\n" +
             " coalesce(gb_owner, owner) as owner,\n" +
-            " coalesce(gb_civil_code, civil_code) as civil_code,\n" +
+            " gb_civil_code as civil_code,\n" +
             " coalesce(gb_block, block) as block,\n" +
             " coalesce(gb_address, address) as address,\n" +
             " coalesce(gb_parental, parental) as parental,\n" +
@@ -269,7 +269,7 @@ public interface DeviceChannelMapper {
             " coalesce(dc.gb_manufacturer, dc.manufacturer) as manufacturer,\n" +
             " coalesce(dc.gb_model, dc.model) as model,\n" +
             " coalesce(dc.gb_owner, dc.owner) as owner,\n" +
-            " coalesce(dc.gb_civil_code, dc.civil_code) as civil_code,\n" +
+            " dc.gb_civil_code as civil_code,\n" +
             " coalesce(dc.gb_block, dc.block) as block,\n" +
             " coalesce(dc.gb_address, dc.address) as address,\n" +
             " coalesce(dc.gb_parental, dc.parental) as parental,\n" +
@@ -359,7 +359,7 @@ public interface DeviceChannelMapper {
             " coalesce(gb_manufacturer, manufacturer) as manufacturer,\n" +
             " coalesce(gb_model, model) as model,\n" +
             " coalesce(gb_owner, owner) as owner,\n" +
-            " coalesce(gb_civil_code, civil_code) as civil_code,\n" +
+            " gb_civil_code as civil_code,\n" +
             " coalesce(gb_block, block) as block,\n" +
             " coalesce(gb_address, address) as address,\n" +
             " coalesce(gb_parental, parental) as parental,\n" +
@@ -396,14 +396,14 @@ public interface DeviceChannelMapper {
 
     @Insert("<script> " +
             "insert into wvp_device_channel " +
-            "(device_id, device_db_id, name, manufacturer, model, owner, civil_code, block, " +
+            "(device_id, device_db_id, name, manufacturer, model, owner, civil_code, gb_civil_code, block, " +
             "address, parental, parent_id, safety_way, register_way, cert_num, certifiable, err_code, end_time, secrecy, " +
             "ip_address, port, password, status, longitude, latitude, ptz_type, position_type, room_type, use_type, " +
             "supply_light_type, direction_type, resolution, business_group_id, download_speed, svc_space_support_mod, " +
             "svc_time_support_mode, create_time, update_time, sub_count, stream_id, has_audio, gps_time, stream_identification) " +
             "values " +
             "<foreach collection='addChannels' index='index' item='item' separator=','> " +
-            "(#{item.deviceId}, #{item.deviceDbId}, #{item.name}, #{item.manufacturer}, #{item.model}, #{item.owner}, #{item.civilCode}, #{item.block}, " +
+            "(#{item.deviceId}, #{item.deviceDbId}, #{item.name}, #{item.manufacturer}, #{item.model}, #{item.owner}, #{item.civilCode}, #{item.gbCivilCode}, #{item.block}, " +
             "#{item.address}, #{item.parental}, #{item.parentId}, #{item.safetyWay}, #{item.registerWay}, #{item.certNum}, #{item.certifiable}, #{item.errCode}, #{item.endTime}, #{item.secrecy}, " +
             "#{item.ipAddress}, #{item.port}, #{item.password}, #{item.status}, #{item.longitude}, #{item.latitude}, #{item.ptzType}, #{item.positionType}, #{item.roomType}, #{item.useType}, " +
             "#{item.supplyLightType}, #{item.directionType}, #{item.resolution}, #{item.businessGroupId}, #{item.downloadSpeed}, #{item.svcSpaceSupportMod}," +
@@ -499,7 +499,7 @@ public interface DeviceChannelMapper {
             " coalesce(gb_manufacturer, manufacturer) as manufacturer,\n" +
             " coalesce(gb_model, model) as model,\n" +
             " coalesce(gb_owner, owner) as owner,\n" +
-            " coalesce(gb_civil_code, civil_code) as civil_code,\n" +
+            " gb_civil_code as civil_code,\n" +
             " coalesce(gb_block, block) as block,\n" +
             " coalesce(gb_address, address) as address,\n" +
             " coalesce(gb_parental, parental) as parental,\n" +
@@ -579,7 +579,7 @@ public interface DeviceChannelMapper {
             " coalesce(gb_manufacturer, manufacturer) as manufacturer,\n" +
             " coalesce(gb_model, model) as model,\n" +
             " coalesce(gb_owner, owner) as owner,\n" +
-            " coalesce(gb_civil_code, civil_code) as civil_code,\n" +
+            " gb_civil_code as civil_code,\n" +
             " coalesce(gb_block, block) as block,\n" +
             " coalesce(gb_address, address) as address,\n" +
             " coalesce(gb_parental, parental) as parental,\n" +
@@ -652,7 +652,7 @@ public interface DeviceChannelMapper {
             " coalesce(gb_manufacturer, manufacturer) as manufacturer,\n" +
             " coalesce(gb_model, model) as model,\n" +
             " coalesce(gb_owner, owner) as owner,\n" +
-            " coalesce(gb_civil_code, civil_code) as civil_code,\n" +
+            " gb_civil_code as civil_code,\n" +
             " coalesce(gb_block, block) as block,\n" +
             " coalesce(gb_address, address) as address,\n" +
             " coalesce(gb_parental, parental) as parental,\n" +
@@ -702,7 +702,7 @@ public interface DeviceChannelMapper {
             " coalesce(gb_manufacturer, manufacturer) as manufacturer,\n" +
             " coalesce(gb_model, model) as model,\n" +
             " coalesce(gb_owner, owner) as owner,\n" +
-            " coalesce(gb_civil_code, civil_code) as civil_code,\n" +
+            " gb_civil_code as civil_code,\n" +
             " coalesce(gb_block, block) as block,\n" +
             " coalesce(gb_address, address) as address,\n" +
             " coalesce(gb_parental, parental) as parental,\n" +

+ 9 - 0
src/main/java/com/genersoft/iot/vmp/gb28181/dao/RegionMapper.java

@@ -79,4 +79,13 @@ public interface RegionMapper {
             " <if test='query != null'> AND (device_id LIKE concat('%',#{query},'%') OR name LIKE concat('%',#{query},'%'))</if> " +
             " </script>")
     List<RegionTree> queryForTree(@Param("query") String query, @Param("parentId") String parentId);
+
+    @Select("SELECT * from wvp_common_region WHERE device_id = #{deviceId} ")
+    Region queryOneByDeviceId(@Param("deviceId") String deviceId);
+
+    @Delete("<script>" +
+            " DELETE FROM wvp_common_region WHERE id in " +
+            " <foreach collection='allChildren'  item='item'  open='(' separator=',' close=')' > #{item.id}</foreach>" +
+            " </script>")
+    void batchDelete(List<Region> allChildren);
 }

+ 4 - 5
src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java

@@ -1,10 +1,7 @@
 package com.genersoft.iot.vmp.gb28181.service;
 
-import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel;
-import com.genersoft.iot.vmp.gb28181.bean.DeviceType;
-import com.genersoft.iot.vmp.gb28181.bean.IndustryCodeType;
-import com.genersoft.iot.vmp.gb28181.bean.NetworkIdentificationType;
-import com.genersoft.iot.vmp.vmanager.bean.PageInfo;
+import com.genersoft.iot.vmp.gb28181.bean.*;
+import com.github.pagehelper.PageInfo;
 
 import java.util.List;
 
@@ -45,4 +42,6 @@ public interface IGbChannelService {
     void reset(int id);
 
     PageInfo<CommonGBChannel> queryList(int page, int count, String query, Boolean online);
+
+    void removeCivilCode(List<Region> allChildren);
 }

+ 2 - 0
src/main/java/com/genersoft/iot/vmp/gb28181/service/IRegionService.java

@@ -35,4 +35,6 @@ public interface IRegionService {
     List<RegionTree> queryForTree(String query, String parent);
 
     void syncFromChannel();
+
+    boolean delete(int id);
 }

+ 8 - 1
src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java

@@ -8,8 +8,8 @@ import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;
 import com.genersoft.iot.vmp.gb28181.service.IGbChannelService;
 import com.genersoft.iot.vmp.utils.DateUtil;
 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
-import com.genersoft.iot.vmp.vmanager.bean.PageInfo;
 import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -324,4 +324,11 @@ public class GbChannelServiceImpl implements IGbChannelService {
         List<CommonGBChannel> all = commonGBChannelMapper.queryList(query, online);
         return new PageInfo<>(all);
     }
+
+    @Override
+    public void removeCivilCode(List<Region> allChildren) {
+        commonGBChannelMapper.removeCivilCode(allChildren);
+        // TODO 是否需要通知上级, 或者等添加新的行政区划时发送更新通知
+
+    }
 }

+ 31 - 3
src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/RegionServiceImpl.java

@@ -1,11 +1,11 @@
 package com.genersoft.iot.vmp.gb28181.service.impl;
 
 import com.genersoft.iot.vmp.common.CivilCodePo;
-import com.genersoft.iot.vmp.conf.CivilCodeFileConf;
 import com.genersoft.iot.vmp.gb28181.bean.Region;
 import com.genersoft.iot.vmp.gb28181.bean.RegionTree;
 import com.genersoft.iot.vmp.gb28181.dao.CommonGBChannelMapper;
 import com.genersoft.iot.vmp.gb28181.dao.RegionMapper;
+import com.genersoft.iot.vmp.gb28181.service.IGbChannelService;
 import com.genersoft.iot.vmp.gb28181.service.IRegionService;
 import com.genersoft.iot.vmp.utils.CivilCodeUtil;
 import com.genersoft.iot.vmp.utils.DateUtil;
@@ -34,7 +34,7 @@ public class RegionServiceImpl implements IRegionService {
 
 
     @Autowired
-    private CivilCodeFileConf civilCodeFileConf;
+    private IGbChannelService gbChannelService;
 
     @Override
     public void add(Region region) {
@@ -51,10 +51,33 @@ public class RegionServiceImpl implements IRegionService {
     @Override
     @Transactional
     public boolean deleteByDeviceId(String regionDeviceId) {
-
+        Region region = regionMapper.queryOneByDeviceId(regionDeviceId);
+        // 获取所有子节点
+        List<Region> allChildren = getAllChildren(regionDeviceId);
+        allChildren.add(region);
+        // 设置使用这些节点的通道的civilCode为null,
+        gbChannelService.removeCivilCode(allChildren);
+        regionMapper.batchDelete(allChildren);
         return true;
     }
 
+    private List<Region> getAllChildren(String deviceId) {
+        if (deviceId == null || deviceId.length() >= 8) {
+            return new ArrayList<>();
+        }
+        List<Region> children = regionMapper.getChildren(deviceId);
+        if (ObjectUtils.isEmpty(children)) {
+            return children;
+        }
+        List<Region> regions = new ArrayList<>(children);
+        for (Region region : children) {
+            if (region.getDeviceId().length() < 8) {
+                regions.addAll(getAllChildren(region.getDeviceId()));
+            }
+        }
+        return regions;
+    }
+
     @Override
     public PageInfo<Region> query(String query, int page, int count) {
         PageHelper.startPage(page, count);
@@ -140,4 +163,9 @@ public class RegionServiceImpl implements IRegionService {
 
         regionMapper.batchAdd(new ArrayList<>(regionMapForVerification.values()));
     }
+
+    @Override
+    public boolean delete(int id) {
+        return regionMapper.delete(id) > 0;
+    }
 }

+ 3 - 3
src/main/java/com/genersoft/iot/vmp/vmanager/bean/PageInfo.java → src/main/java/com/genersoft/iot/vmp/vmanager/bean/TablePageInfo.java

@@ -3,7 +3,7 @@ package com.genersoft.iot.vmp.vmanager.bean;
 import java.util.ArrayList;
 import java.util.List;
 
-public class PageInfo<T> {
+public class TablePageInfo<T> {
     //当前页
     private int pageNum;
     //每页的数量
@@ -19,11 +19,11 @@ public class PageInfo<T> {
 
     private List<T> list;
 
-    public PageInfo(List<T> resultData) {
+    public TablePageInfo(List<T> resultData) {
         this.resultData = resultData;
     }
 
-    public PageInfo() {
+    public TablePageInfo() {
     }
 
     public void startPage(int page, int count) {

+ 60 - 30
web_src/src/components/common/RegionTree.vue

@@ -10,7 +10,7 @@
         </div>
       </div>
     </div>
-    <div >
+    <div>
       <vue-easy-tree
         ref="veTree"
         node-key="id"
@@ -19,14 +19,19 @@
         style="height: 78vh; padding: 2rem"
         :load="loadNode"
         :data="treeData"
+        :default-expanded-keys="['']"
         @node-contextmenu="contextmenuEventHandler"
         @node-click="nodeClickHandler"
       >
         <span class="custom-tree-node" slot-scope="{ node, data }">
-         <span v-if="node.data.type === 0" style="color: #409EFF" class="iconfont icon-bianzubeifen3"></span>
-         <span v-if="node.data.type === 1" style="color: #409EFF" class="iconfont icon-file-stream2"></span>
-        <span style=" padding-left: 1px">{{ node.label }}</span>
-      </span>
+          <span @click.stop >
+            <el-radio v-if="node.data.type === 0 && node.level !== 1 " style="margin-right: 0" v-model="chooseId" @input="chooseIdChange" :label="node.data.id">{{''}}</el-radio>
+          </span>
+          <span v-if="node.data.type === 0" style="color: #409EFF" class="iconfont icon-bianzubeifen3"></span>
+          <span v-if="node.data.type === 1" style="color: #409EFF" class="iconfont icon-file-stream2"></span>
+          <span style=" padding-left: 1px" v-if="node.data.id !==''">{{ node.label }}({{ node.data.id }})</span>
+          <span style=" padding-left: 1px" v-if="node.data.id ===''">{{ node.label }}</span>
+        </span>
       </vue-easy-tree>
     </div>
     <regionCode ref="regionCode"></regionCode>
@@ -47,13 +52,14 @@ export default {
   data() {
     return {
       searchSrt: "",
+      chooseId: "",
       // props: {
       //   label: "name",
       // },
       treeData: [],
     }
   },
-  props: ['edit', 'clickEvent', 'contextMenuEvent'],
+  props: ['edit', 'clickEvent', 'chooseIdChange'],
   created() {
     // this.$axios({
     //   method: 'get',
@@ -107,7 +113,14 @@ export default {
     loadNode: function (node, resolve) {
       console.log(22222)
       console.log(node)
-      if (node.level === 0 || node.data.id.length < 8) {
+      if (node.level === 0) {
+        resolve([{
+          id: "",
+          label: "根资源组",
+          isLeaf: false,
+          type: 0
+        }]);
+      } else if (node.data.id.length < 8) {
         this.$axios({
           method: 'get',
           url: `/api/region/tree/list`,
@@ -115,7 +128,7 @@ export default {
             query: this.searchSrt,
             parent: node.data.id
           }
-        }).then((res)=> {
+        }).then((res) => {
           if (res.data.code === 0) {
             resolve(res.data.data);
           }
@@ -123,7 +136,7 @@ export default {
         }).catch(function (error) {
           console.log(error);
         });
-      }else {
+      } else {
         resolve([]);
       }
     },
@@ -176,7 +189,8 @@ export default {
     reset: function () {
       this.$forceUpdate();
     },
-    contextmenuEventHandler: function (event,data,node,element){
+    contextmenuEventHandler: function (event, data, node, element) {
+      console.log(node.level)
       if (node.data.type === 1) {
         data.parentId = node.parent.data.id;
         this.$contextmenu({
@@ -187,10 +201,10 @@ export default {
               disabled: false,
               onClick: () => {
                 this.$axios({
-                  method:"delete",
-                  url:"/api/platform/catalog/relation/del",
+                  method: "delete",
+                  url: "/api/platform/catalog/relation/del",
                   data: data
-                }).then((res)=>{
+                }).then((res) => {
                   console.log("移除成功")
                   node.parent.loaded = false
                   node.parent.expand();
@@ -204,7 +218,7 @@ export default {
           customClass: "custom-class", // 自定义菜单 class
           zIndex: 3000, // 菜单样式 z-index
         });
-      }else if (node.data.type === 0){
+      } else if (node.data.type === 0) {
         this.$contextmenu({
           items: [
             {
@@ -224,9 +238,9 @@ export default {
               }
             },
             {
-              label: "修改节点",
+              label: "重命名",
               icon: "el-icon-edit",
-              disabled: false,
+              disabled: node.level === 1,
               onClick: () => {
                 this.editCatalog(data, node);
               }
@@ -234,14 +248,14 @@ export default {
             {
               label: "删除节点",
               icon: "el-icon-delete",
-              disabled: false,
+              disabled: node.level === 1,
               onClick: () => {
                 this.$confirm('确定删除?', '提示', {
                   confirmButtonText: '确定',
                   cancelButtonText: '取消',
                   type: 'warning'
                 }).then(() => {
-                  this.removeCatalog(data.id, node)
+                  this.removeRegion(data.id, node)
                 }).catch(() => {
 
                 });
@@ -276,30 +290,43 @@ export default {
 
       return false;
     },
-    refreshNode: function (node){
+    removeRegion: function (id, node) {
+      this.$axios({
+        method: "delete",
+        url: `/api/region/delete`,
+        params: {
+          deviceId: id,
+        }
+      }).then((res) => {
+        if (res.data.code === 0) {
+          console.log("移除成功")
+          node.parent.loaded = false
+          node.parent.expand();
+        }
+      })
+        .catch(function (error) {
+          console.log(error);
+        });
+    },
+    refreshNode: function (node) {
       node.loaded = false
       node.expand();
     },
-    addRegion: function (id, node){
+    addRegion: function (id, node) {
 
       console.log(node)
 
-      this.$refs.regionCode.openDialog(code=>{
-
-        console.log(this.form)
-        console.log("code===> " + code)
-        this.form.gbDeviceId = code;
-        console.log("code22===> " + code)
+      this.$refs.regionCode.openDialog(form => {
         node.loaded = false
         node.expand();
       }, id);
     },
-    nodeClickHandler: function (data, node, tree){
+    nodeClickHandler: function (data, node, tree) {
       console.log(data)
       console.log(node)
-      this.chooseId = data.id;
-      this.chooseName = data.name;
-      if (this.catalogIdChange)this.catalogIdChange(this.chooseId, this.chooseName);
+      // this.chooseId = data.id;
+      // this.chooseName = data.name;
+      // if (this.catalogIdChange)this.catalogIdChange(this.chooseId, this.chooseName);
     }
   },
   destroyed() {
@@ -325,4 +352,7 @@ export default {
 .device-offline {
   color: #727272;
 }
+.custom-tree-node .el-radio__label {
+  padding-left: 4px !important;
+}
 </style>

+ 91 - 46
web_src/src/components/dialog/regionCode.vue

@@ -14,39 +14,33 @@
           <div class="show-code-item">{{ allVal[0].val }}</div>
           <div style="text-align: center">{{ allVal[0].meaning }}</div>
         </div>
-        <el-radio-group v-model="allVal[0].val" @input="deviceChange">
-          <el-radio v-for="item in regionList" :key="item.deviceId" :label="item.deviceId" style="line-height: 2rem">
-            {{ item.name }} - {{ item.deviceId }}
-          </el-radio>
-        </el-radio-group>
+        <el-radio v-for="item in regionList"  v-model="allVal[0].val" :key="item.deviceId" :name="item.name" :label="item.deviceId" @input="deviceChange(item)" style="line-height: 2rem">
+          {{ item.name }} - {{ item.deviceId }}
+        </el-radio>
       </el-tab-pane>
         <el-tab-pane name="1">
           <div slot="label">
             <div class="show-code-item">{{ allVal[1].val?allVal[1].val:"--" }}</div>
             <div style="text-align: center">{{ allVal[1].meaning }}</div>
           </div>
-          <el-radio-group v-model="allVal[1].val" :disabled="allVal[1].lock" @input="deviceChange">
-            <el-radio :key="-1" label="" style="line-height: 2rem">
-              不添加
-            </el-radio>
-            <el-radio v-for="item in regionList" :key="item.deviceId" :label="item.deviceId.substring(2)" style="line-height: 2rem">
-              {{ item.name }} - {{ item.deviceId.substring(2) }}
-            </el-radio>
-          </el-radio-group>
+          <el-radio :key="-1" v-model="allVal[1].val" @input="deviceChange" label="" style="line-height: 2rem">
+            不添加
+          </el-radio>
+          <el-radio v-for="item in regionList" v-model="allVal[1].val" @input="deviceChange(item)" :key="item.deviceId" :label="item.deviceId.substring(2)" style="line-height: 2rem">
+            {{ item.name }} - {{ item.deviceId.substring(2) }}
+          </el-radio>
         </el-tab-pane>
         <el-tab-pane name="2">
           <div slot="label">
             <div class="show-code-item">{{ allVal[2].val?allVal[2].val:"--" }}</div>
             <div style="text-align: center">{{ allVal[2].meaning }}</div>
           </div>
-          <el-radio-group v-model="allVal[2].val" :disabled="allVal[2].lock" @input="deviceChange">
-            <el-radio :key="-1" label="" style="line-height: 2rem">
-              不添加
-            </el-radio>
-            <el-radio v-for="item in regionList" :key="item.deviceId" :label="item.deviceId.substring(4)" style="line-height: 2rem">
-              {{ item.name }} - {{ item.deviceId.substring(4) }}
-            </el-radio>
-          </el-radio-group>
+          <el-radio :key="-1" label="" v-model="allVal[2].val" style="line-height: 2rem" @input="deviceChange">
+            不添加
+          </el-radio>
+          <el-radio v-for="item in regionList" v-model="allVal[2].val" @input="deviceChange(item)" :key="item.deviceId" :label="item.deviceId.substring(4)" style="line-height: 2rem">
+            {{ item.name }} - {{ item.deviceId.substring(4) }}
+          </el-radio>
         </el-tab-pane>
         <el-tab-pane name="3">
           请手动输入基层接入单位编码,两位数字
@@ -136,21 +130,64 @@ export default {
   },
   methods: {
     openDialog: function (endCallBck, parentDeviceId, code, lockContent) {
-      console.log(code)
-      console.log(parentDeviceId)
       this.showVideoDialog = true
       this.activeKey= '0';
       this.regionList = []
       this.form.parentDeviceId = parentDeviceId
-
-      this.getRegionList()
-      if (typeof code != 'undefined' && code.length === 8) {
-        console.log(111)
-        this.allVal[0].val = code.substring(0, 2)
-        this.allVal[1].val = code.substring(2, 4)
-        this.allVal[2].val = code.substring(4, 6)
-        this.allVal[3].val = code.substring(6, 8)
+      this.allVal =  [
+        {
+          id: [1, 2],
+          meaning: '省级编码',
+          val: '11',
+          type: '中心编码',
+          lock: false,
+        },
+        {
+          id: [3, 4],
+          meaning: '市级编码',
+          val: '',
+          type: '中心编码',
+          lock: false,
+        },
+        {
+          id: [5, 6],
+          meaning: '区级编码',
+          val: '',
+          type: '中心编码',
+          lock: false,
+        },
+        {
+          id: [7, 8],
+          meaning: '基层接入单位编码',
+          val: '',
+          type: '中心编码',
+          lock: false,
+        }
+      ]
+      if (parentDeviceId) {
+        console.log(parentDeviceId)
+        console.log(parentDeviceId.length)
+        if (parentDeviceId.length >= 2) {
+          this.allVal[0].val = parentDeviceId.substring(0, 2)
+          this.activeKey = "1"
+        }
+        if (parentDeviceId.length >= 4) {
+          this.allVal[1].val = parentDeviceId.substring(2, 4)
+          this.activeKey = "2"
+        }
+        if (parentDeviceId.length >= 6) {
+          this.allVal[2].val = parentDeviceId.substring(4, 6)
+          this.activeKey = "3"
+        }
       }
+      this.getRegionList()
+      // if (typeof code != 'undefined' && code.length === 8) {
+      //   this.allVal[0].val = code.substring(0, 2)
+      //   this.allVal[1].val = code.substring(2, 4)
+      //   this.allVal[2].val = code.substring(4, 6)
+      //   this.allVal[3].val = code.substring(6, 8)
+      // }
+
       console.log(this.allVal)
       this.endCallBck = endCallBck;
     },
@@ -246,7 +283,8 @@ export default {
     closeModel: function (){
       this.showVideoDialog = false
     },
-    deviceChange: function (){
+    deviceChange: function (item){
+      console.log(item)
       let code = this.allVal[0].val
       if (this.allVal[1].val) {
         code += this.allVal[1].val
@@ -263,22 +301,29 @@ export default {
         this.allVal[3].val = ""
       }
       this.form.deviceId = code
+      if (item) {
+        this.form.name = item.name
+      }
+
     },
     handleOk: function() {
-      const code =
-        this.allVal[0].val +
-        this.allVal[1].val +
-        this.allVal[2].val +
-        this.allVal[3].val +
-        this.allVal[4].val +
-        this.allVal[5].val +
-        this.allVal[6].val +
-        this.allVal[7].val
-      console.log(code)
-      if (this.endCallBck) {
-        this.endCallBck(code)
-      }
-      this.showVideoDialog = false
+      this.$axios({
+        method: 'post',
+        url: "/api/region/add/",
+        data: this.form
+      }).then((res) => {
+        if (res.data.code === 0) {
+          if (typeof this.endCallBck == "function") {
+            this.endCallBck(this.form)
+          }
+          this.showVideoDialog = false
+        } else {
+          this.$message.error(res.data.msg);
+        }
+      }).catch((error) => {
+        this.$message.error(error);
+      });
+
     }
   },
 };

+ 22 - 29
web_src/src/components/region.vue

@@ -2,7 +2,7 @@
   <div id="region" style="width: 100%">
     <el-container v-loading="loading" >
       <el-aside width="400px" >
-        <RegionTree ref="regionTree" :edit="true" :clickEvent="treeNodeClickEvent"></RegionTree>
+        <RegionTree ref="regionTree" :edit="true" :clickEvent="treeNodeClickEvent" :chooseIdChange="chooseIdChange"></RegionTree>
       </el-aside>
       <el-main style="padding: 5px;">
         <div class="page-header">
@@ -27,7 +27,9 @@
           </div>
         </div>
         <el-table ref="channelListTable" :data="channelList" :height="winHeight" style="width: 100%"
-                  header-row-class-name="table-header">
+                  header-row-class-name="table-header" @selection-change="handleSelectionChange">
+          <el-table-column type="selection" width="55">
+          </el-table-column>
           <el-table-column prop="gbName" label="名称" min-width="180">
           </el-table-column>
           <el-table-column prop="gbDeviceId" label="编号" min-width="180">
@@ -84,27 +86,23 @@ export default {
       searchSrt: "",
       channelType: "",
       online: "",
-      winHeight: window.innerHeight - 200,
+      winHeight: window.innerHeight - 180,
       currentPage: 1,
       count: 15,
       total: 0,
       loading: false,
       loadSnap: {},
+      regionId: ""
     };
   },
 
-  mounted() {
+  created() {
     this.initData();
-
   },
   destroyed() {},
   methods: {
     initData: function () {
-      if (typeof (this.parentChannelId) == "undefined" || this.parentChannelId == 0) {
-        this.getChannelList();
-      } else {
-        this.showSubchannels();
-      }
+      this.getChannelList();
     },
     currentChange: function (val) {
       this.currentPage = val;
@@ -116,28 +114,19 @@ export default {
     },
     getChannelList: function () {
       let that = this;
-      if (typeof (this.$route.params.deviceId) == "undefined") return;
       this.$axios({
         method: 'get',
-        url: `/api/device/query/devices/${this.$route.params.deviceId}/channels`,
+        url: `/api/common/channel/list`,
         params: {
           page: that.currentPage,
           count: that.count,
           query: that.searchSrt,
-          online: that.online,
-          channelType: that.channelType
+          online: that.online
         }
       }).then(function (res) {
         if (res.data.code === 0) {
           that.total = res.data.data.total;
-          that.deviceChannelList = res.data.data.list;
-          that.deviceChannelList.forEach(e => {
-            e.ptzType = e.ptzType + "";
-            that.$set(e, "location", "");
-            if (e.longitude && e.latitude) {
-              that.$set(e, "location", e.longitude + "," + e.latitude);
-            }
-          });
+          that.channelList = res.data.data.list;
           // 防止出现表格错位
           that.$nextTick(() => {
             that.$refs.channelListTable.doLayout();
@@ -148,7 +137,14 @@ export default {
         console.log(error);
       });
     },
+    handleSelectionChange: function (val){
+      console.log(val)
+    },
     add: function (row) {
+      if (!this.regionId) {
+        this.$message.info("请选择左侧行政区划节点")
+      }
+
     },
     remove: function (row) {
     },
@@ -165,13 +161,10 @@ export default {
       this.initData();
     },
     treeNodeClickEvent: function (device, data, isCatalog) {
-      console.log(device)
-      if (!!!data.channelId) {
-        this.parentChannelId = device.deviceId;
-      } else {
-        this.parentChannelId = data.channelId;
-      }
-      this.initData();
+
+    },
+    chooseIdChange: function (id) {
+      this.regionId = id;
     },
   }
 };