临时提交
parent
a2b00a4f4e
commit
b246fd6a20
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -50,8 +50,6 @@ public class RegionTree {
|
|||
return regionTree;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static RegionTree getInstance(CommonGBChannel channel) {
|
||||
RegionTree regionTree = new RegionTree();
|
||||
regionTree.setId(channel.getGbDeviceId());
|
||||
|
|
|
@ -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){
|
||||
|
|
|
@ -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(), "移除失败");
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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" +
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -35,4 +35,6 @@ public interface IRegionService {
|
|||
List<RegionTree> queryForTree(String query, String parent);
|
||||
|
||||
void syncFromChannel();
|
||||
|
||||
boolean delete(int id);
|
||||
}
|
||||
|
|
|
@ -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 是否需要通知上级, 或者等添加新的行政区划时发送更新通知
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,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) {
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
|
||||
}
|
||||
},
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
},
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue