增加 断线重连

修改部分bug
camera_merge
王一鸣 5 years ago
parent a34d2382b5
commit 716b7b6ac8

@ -105,7 +105,8 @@ public class CameraController {
@PostMapping("/io/toPtz")
@ApiOperation(value = "转至球机IO配置点")
public Result toPtz(@RequestBody CameraIOPtz req) {
validatorUtil.validate(req);
//todo
//validatorUtil.validate(req);
Integer ptzId = cameraService.getPtzId(req.getCameraIOId());
PtzControlModule.toPtz(ptzId,req.getCameraId());
return Result.success();

@ -3,8 +3,6 @@ package com.zhehekeji.web.controller;
import com.github.pagehelper.PageInfo;
import com.zhehekeji.common.util.ValidatorUtil;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.core.util.Assert;
import com.zhehekeji.web.entity.Order;
import com.zhehekeji.web.pojo.OrderSaveReq;
import com.zhehekeji.web.pojo.OrderSearch;
import com.zhehekeji.web.pojo.OrderVO;
@ -12,14 +10,12 @@ import com.zhehekeji.web.service.OrderService;
import com.zhehekeji.web.service.PlcOrderInfo;
import com.zhehekeji.web.service.PlcService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@Api(value = "OrderController",tags = "订单管理")
@RestController(value = "OrderController")
@ -88,11 +84,4 @@ public class OrderController {
return Result.success(orderService.orders(orderSearch));
}
/*@GetMapping("/userCenter")
@ApiOperation("用户中心地址")
public Result<IndexVO> userCenter(){
return Result.success(applicationService.userCenter());
}*/
}

@ -1,8 +1,6 @@
package com.zhehekeji.web.controller;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.entity.Order;
import com.zhehekeji.web.pojo.OrderSearch;
import com.zhehekeji.web.pojo.realTime.RealTime;
import com.zhehekeji.web.service.RealTimeService;
import io.swagger.annotations.Api;

@ -3,8 +3,10 @@ package com.zhehekeji.web.controller;
import com.alibaba.excel.EasyExcel;
import com.zhehekeji.common.util.ValidatorUtil;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.core.util.Assert;
import com.zhehekeji.web.entity.Stock;
import com.zhehekeji.web.lib.PtzControlModule;
import com.zhehekeji.web.pojo.category.PageSearch;
import com.zhehekeji.web.pojo.stock.CheckByMan;
import com.zhehekeji.web.pojo.stock.StockCheck;
import com.zhehekeji.web.pojo.stock.StockExportExcel;
import com.zhehekeji.web.service.StockService;
@ -42,10 +44,16 @@ public class StockController {
@GetMapping("/list")
@ApiOperation(value = "盘点页面 返回map key:货架号 value:库存信息")
public Result<Map<String, List<Stock>>> stockByStreet(@RequestParam(required = true) Integer streetId){
public Result<Map<String,List<Stock>>> stockByStreet(@RequestParam(required = true) Integer streetId){
return Result.success(stockService.stocksByStreetId(streetId));
}
@PostMapping("/page")
@ApiOperation(value = "库存列表")
public Result<List<Stock>> page(@RequestBody PageSearch pageSearch){
return Result.success(stockService.page(pageSearch));
}
@ApiOperation(value = "导出全部巷道excel")
@RequestMapping(value = "/export", method = RequestMethod.GET)
public void export(@RequestParam Integer streetId, HttpServletResponse response) throws IOException {
@ -59,20 +67,31 @@ public class StockController {
}
@ApiOperation(value = "复核页面")
@ApiOperation(value = "复核页面的核对信息")
@RequestMapping(value = "/info", method = RequestMethod.POST)
public Result<Stock> stockInfo(@RequestBody StockCheck stockCheck){
validatorUtil.validate(stockCheck);
stockCheck.setStatus(null);
return Result.success(stockService.stockInfo(stockCheck));
}
@ApiOperation(value = "复核页面")
@RequestMapping(value = "/check", method = RequestMethod.POST)
public Result check(@RequestBody StockCheck stockCheck){
@ApiOperation(value = "复核正确")
@RequestMapping(value = "/checkCorrect", method = RequestMethod.POST)
public Result<Stock> check(@RequestBody StockCheck stockCheck){
validatorUtil.validate(stockCheck);
Assert.notNull(stockCheck.getStatus(),"核对状态必填");
stockService.check(stockCheck);
return Result.success(stockService.checkCorrect(stockCheck));
}
@ApiOperation(value = "人工复核")
@RequestMapping(value = "/checkByMan", method = RequestMethod.POST)
public Result<Stock> checkByMan(@RequestBody CheckByMan checkByMan){
validatorUtil.validate(checkByMan);
return Result.success(stockService.checkByMan(checkByMan));
}
@ApiOperation(value = "slow")
@RequestMapping(value = "/slow", method = RequestMethod.GET)
public Result slow(Integer ptzId,Integer cameraId){
PtzControlModule.toPtzSlow(ptzId,cameraId);
return Result.success();
}
}

@ -3,23 +3,14 @@ package com.zhehekeji.web.controller;
import com.github.pagehelper.PageInfo;
import com.zhehekeji.common.util.ValidatorUtil;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.entity.Order;
import com.zhehekeji.web.entity.Warn;
import com.zhehekeji.web.pojo.OrderSaveReq;
import com.zhehekeji.web.pojo.OrderSearch;
import com.zhehekeji.web.pojo.warn.WarnSearch;
import com.zhehekeji.web.pojo.warn.WarnVO;
import com.zhehekeji.web.service.OrderService;
import com.zhehekeji.web.service.PlcService;
import com.zhehekeji.web.service.WarnService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@Api(value = "Warn",tags = "告警管理")
@RestController
@ -32,17 +23,10 @@ public class WarnController {
private ValidatorUtil validatorUtil;
@PostMapping("/list")
@ApiOperation(value = "查询")
@ApiOperation(value = "告警日志 和告警视频 都用这个接口")
//@SessionHandler
public Result<PageInfo<WarnVO>> orders(@RequestBody WarnSearch warnSearch) {
validatorUtil.validate(warnSearch);
return Result.success(warnService.page(warnSearch));
}
/*@GetMapping("/userCenter")
@ApiOperation("用户中心地址")
public Result<IndexVO> userCenter(){
return Result.success(applicationService.userCenter());
}*/
}

@ -26,6 +26,8 @@ public class StockLog {
@TableField("`column`")
private Integer column;
private String content;
@ApiModelProperty("之前的状态")
private Integer oldStatus;

@ -261,27 +261,42 @@ public class PtzControlModule {
public static void ptz(Integer ptzId,String name,Integer cameraId){
int dwzCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_SET_CONTROL;
int nPressetIndex = ptzId;
Boolean ok = ptzControler(dwzCommand,0,nPressetIndex,0,0,ToolKits.GetGBKStringToPointer(name),CameraConnMap.getConnId(cameraId));
Boolean ok =LoginModule.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId),0,dwzCommand,0,ptzId,0,0,ToolKits.GetGBKStringToPointer(name));
Assert.isTrue(ok,"设置失败");
}
public static Boolean ptzControler(int dwPTZCOmmand, int lParam1, int lParam2, int lParam3, int dwStop, Pointer pointer, NetSDKLib.LLong loginId){
return LoginModule.netsdk.CLIENT_DHPTZControlEx2(loginId,0,dwPTZCOmmand,lParam1,lParam2,lParam3,dwStop,pointer);
}
/**
*
* @param ioId
* @param ptzId
* @param cameraId
*/
public static void toPtz(Integer ioId,Integer cameraId){
public static void toPtz(Integer ptzId,Integer cameraId){
int dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_MOVE_CONTROL;
int nPresetIndex = ioId;
int nPresetIndex = ptzId;
Boolean ok = LoginModule.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId),0,dwPTZCommand,0,ptzId,0,0,null);
if(!ok ){
log.error("转至预置点 失败 cameraId:{},ptzId:{}",cameraId,ptzId);
}
}
Boolean ok = ptzControler(dwPTZCommand, 0, nPresetIndex, 0, 0, null,CameraConnMap.getConnId(cameraId));
/**
*
* @param ptzId
* @param cameraId
*/
public static void toPtzSlow(Integer ptzId,Integer cameraId){
int dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_MOVE_ABSOLUTELY;
NetSDKLib.PTZ_CONTROL_ABSOLUTELY absolutely = new NetSDKLib.PTZ_CONTROL_ABSOLUTELY();
absolutely.stuPosition.nPositionX = 3600;
absolutely.stuPosition.nPositionY= 0;
absolutely.stuSpeed.fPositionX = 0.9f;
absolutely.stuSpeed.fPositionY = 0f;
//absolutely.stuSpeed.fZoom = 0.5f;
Boolean ok = LoginModule.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId),0,dwPTZCommand,
0,0,0,0,absolutely.getPointer());
if(!ok ){
log.error("转至预置点 失败 cameraId:{},ioId:{}",cameraId,ioId);
log.error("失败 cameraId:{},ptzId:{}",cameraId,ptzId);
}
}

@ -14,7 +14,7 @@ public interface StockMapper extends BaseMapper<Stock> {
void insertOrUpdate(@Param("req") Stock stock);
@Select("select * from stock where shelve_id =#{shelveId}")
@Select("select * from stock where shelve_id =#{shelveId} and `row` = #{row} and `column` = #{column} limit 1")
Stock getByShelveIdAndRowColumn(String shelveId,Integer row,Integer column);
Integer updateStock(Stock stock);

@ -0,0 +1,34 @@
package com.zhehekeji.web.pojo.stock;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
*
*/
@Data
public class CheckByMan {
@NotEmpty(message = "货架号不能为空")
@ApiModelProperty("货架号")
private String shelveId;
@NotNull(message = "行不能为空")
@ApiModelProperty("行号")
private Integer row;
@NotNull(message = "列不能为空")
@ApiModelProperty("列")
private Integer column;
@NotNull(message = "数量不能为空")
@ApiModelProperty("数量")
private Integer count;
@NotEmpty(message = "品规不能为空")
@ApiModelProperty("品规")
private String category;
}

@ -21,6 +21,4 @@ public class StockCheck {
@ApiModelProperty("列")
private Integer column;
@ApiModelProperty("1盘点异常 2核对正确")
private Integer status;
}

@ -14,11 +14,11 @@ public enum StockStatus {
/**
*
*/
SUCCESS(1, "核对准确"),
SUCCESS(2, "核对准确"),
/**
*
*/
ERROR(2, "核对错误"),
ERROR(1, "核对错误"),
;
private Integer status;

@ -20,4 +20,6 @@ public class WarnSearch {
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
private Integer streetId;
}

@ -2,7 +2,6 @@ package com.zhehekeji.web.service;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import lombok.extern.slf4j.Slf4j;
@ -19,9 +18,12 @@ public class HeartNettyClientHandler extends ChannelInboundHandlerAdapter {
private Integer streetId;
public HeartNettyClientHandler(Integer streetId,SendHeart heart){
private NettyClient nettyClient;
public HeartNettyClientHandler(Integer streetId,SendHeart heart , NettyClient nettyClient){
this.streetId = streetId;
this.heart = heart;
this.nettyClient = nettyClient;
}
/**
@ -39,8 +41,10 @@ public class HeartNettyClientHandler extends ChannelInboundHandlerAdapter {
*/
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
log.info("streetId:{}连接被关闭",streetId);
log.info("streetId:{} closed",streetId);
StreetConn.disConn(streetId);
log.info(" streetId reconnect......");
nettyClient.reconnect(streetId);
}
/**

@ -1,6 +1,7 @@
package com.zhehekeji.web.service;
import com.zhehekeji.web.entity.Street;
import com.zhehekeji.web.mapper.StreetMapper;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
@ -11,32 +12,66 @@ import org.springframework.util.StringUtils;
import javax.annotation.Resource;
/**
* plc
* 线
*/
@Slf4j
@Component
public class NettyClient {
private static EventLoopGroup group = new NioEventLoopGroup();
@Resource
private PlcService plcService;
@Resource
private StreetMapper streetMapper;
/**
*
*/
private static int RECONNECT_NUM = 5;
public void createClient(Street street) throws InterruptedException {
if(StringUtils.isEmpty(street.getPlcIp()) || street.getPlcPort() == null){
if (StringUtils.isEmpty(street.getPlcIp()) || street.getPlcPort() == null) {
return;
}
Bootstrap client = new Bootstrap();
// 第1步 定义线程组处理读写和链接事件没有了accept事件
client.group(group);
// 第2步 绑定客户端通道
client.channel(NioSocketChannel.class);
// 第3步 给NIoSocketChannel初始化handler 处理读写事件
SendHeart sendHeart = new SendHeart(street.getPlcId());
client.handler(new HeartNettyClientFilter(street.getId(),sendHeart,plcService));
client.handler(new HeartNettyClientFilter(street.getId(), sendHeart, plcService));
// 连接服务端
client.connect(street.getPlcIp(), street.getPlcPort()).sync().channel();
}
public static void close() {
group.shutdownGracefully();
/**
* 线 RECONNECT_NUM
*
* @param streetId
*/
public void reconnect(Integer streetId) {
Boolean isConnected = false;
int num = 0;
Street street = streetMapper.selectById(streetId);
if (street == null) {
log.error("reconnect ,street is null ,id:{}", streetId);
return;
}
while (num < RECONNECT_NUM && !isConnected) {
try {
createClient(street);
} catch (Exception e) {
//没连上 继续
log.error("reconnect error num:{}", num);
num++;
continue;
}
isConnected = true;
}
if (isConnected) {
log.info("plc reconnect success");
} else {
log.error("plc reconnect error .streetId:{},reconnect num:{},name:{},ip:{},port:{}", streetId, num, street.getName(), street.getPlcIp(), street.getPlcPort());
}
}
}

@ -5,6 +5,7 @@ import com.zhehekeji.common.util.PathUtil;
import com.zhehekeji.web.entity.*;
import com.zhehekeji.web.lib.*;
import com.zhehekeji.web.mapper.*;
import com.zhehekeji.web.pojo.stock.StockStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@ -29,8 +30,8 @@ public class PlcService {
@Resource
private OrderMapper orderMapper;
// @Resource
// private StreetShelveMapper streetShelveMapper;
@Resource
private StockMapper stockMapper;
@Resource
private StreetMapper streetMapper;
@Resource
@ -147,6 +148,11 @@ public class PlcService {
CameraCaptureMap.put(street.getCamera1Id(),orderInfo);
CameraCaptureMap.put(street.getCamera2Id(),orderInfo);
move(street.getCamera1Id(), street.getCamera2Id(), code);
Stock stock = stockMapper.getByShelveIdAndRowColumn(shelveId,row,column);
if(stock != null){
stock.setStatus(StockStatus.PENDING.getStatus());
stockMapper.updateById(stock);
}
// PtzControlModule.pic(street.getCamera1Id(),0,orderInfo);
// PtzControlModule.pic(street.getCamera2Id(),0,orderInfo);
}

@ -1,27 +1,29 @@
package com.zhehekeji.web.service;
import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.pagehelper.PageHelper;
import com.zhehekeji.core.util.Assert;
import com.zhehekeji.web.entity.Stock;
import com.zhehekeji.web.entity.StockLog;
import com.zhehekeji.web.entity.Street;
import com.zhehekeji.web.mapper.StockLogMapper;
import com.zhehekeji.web.mapper.StockMapper;
import com.zhehekeji.web.pojo.stock.StockCheck;
import com.zhehekeji.web.pojo.stock.StockExcel;
import com.zhehekeji.web.pojo.stock.StockExportExcel;
import com.zhehekeji.web.pojo.stock.StockStatus;
import com.zhehekeji.web.pojo.category.PageSearch;
import com.zhehekeji.web.pojo.stock.*;
import com.zhehekeji.web.pojo.street.StreetType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@ -36,7 +38,7 @@ public class StockService {
@Resource
private StockLogMapper logMapper;
public void importExcel(MultipartFile file){
public void importExcel(MultipartFile file) {
log.info("import excel stock");
Thread thread = new Thread(
new Runnable() {
@ -45,7 +47,7 @@ public class StockService {
try {
EasyExcel.read(file.getInputStream(), StockExcel.class, new StockImport(stockMapper)).sheet().doRead();
} catch (IOException e) {
log.error("库存导入error:{}",e);
log.error("库存导入error:{}", e);
}
}
}
@ -55,28 +57,36 @@ public class StockService {
/**
*
*
* @param streetId
* @return
*/
public Map<String,List<Stock>> stocksByStreetId(Integer streetId){
public Map<String, List<Stock>> stocksByStreetId(Integer streetId) {
List<Stock> stocks = list(streetId);
Map<String,List<Stock>> shelveMap = stocks.stream().collect(Collectors.groupingBy(Stock::getShelveId));
Map<String, List<Stock>> shelveMap = stocks.stream().collect(Collectors.groupingBy(Stock::getShelveId));
return shelveMap;
}
public List<Stock> list(Integer streetId){
public List<Stock> list(Integer streetId) {
Street street = streetService.streetById(streetId);
List<String> shelves = streetService.check(street);
List<Stock> stocks = stockMapper.selectList(new QueryWrapper<Stock>().in("shelve_id",shelves).orderByAsc("shelve_id","`row`","`column`"));
List<Stock> stocks = stockMapper.selectList(new QueryWrapper<Stock>().in("shelve_id", shelves).orderByAsc("shelve_id", "`row`", "`column`"));
return stocks;
}
public List<Stock> page(PageSearch pageSearch) {
PageHelper.startPage(pageSearch.getPageNum(), pageSearch.getPageSize());
List<Stock> stocks = stockMapper.selectList(new QueryWrapper<Stock>().orderByAsc("shelve_id", "`row`", "`column`"));
return stocks;
}
/**
*
*
* @param streetId
* @return
*/
public List<StockExportExcel> exportExcels(Integer streetId){
public List<StockExportExcel> exportExcels(Integer streetId) {
List<Stock> stocks = list(streetId);
Street street = streetService.streetById(streetId);
List<StockExportExcel> stockExportExcels = new ArrayList<>(stocks.size());
@ -97,34 +107,83 @@ public class StockService {
/**
*
*
* @param stockCheck
* @return
*/
public Stock stockInfo(StockCheck stockCheck){
Stock stock = stockMapper.getByShelveIdAndRowColumn(stockCheck.getShelveId(),stockCheck.getRow(),stockCheck.getColumn());
public Stock stockInfo(StockCheck stockCheck) {
Stock stock = stockMapper.getByShelveIdAndRowColumn(stockCheck.getShelveId(), stockCheck.getRow(), stockCheck.getColumn());
return stock;
}
/**
*
*
*
*
* @param stockCheck
*/
public void check(StockCheck stockCheck){
log.debug("check stock shelveID:{},row:{},column:{},status:{}",stockCheck.getShelveId(),stockCheck.getRow(),stockCheck.getColumn(),stockCheck.getStatus());
public Stock checkCorrect(StockCheck stockCheck) {
log.debug("check stock correct, shelveID:{},row:{},column:{}", stockCheck.getShelveId(), stockCheck.getRow(), stockCheck.getColumn());
Stock stock = stockInfo(stockCheck);
Assert.notNull(stock,"库存不存在");
Assert.notNull(stock, "该货位暂时没有记录");
Integer oldStatus = stock.getStatus();
stock.setStatus(StockStatus.SUCCESS.getStatus());
stockMapper.updateById(stock);
checkLog(stock, oldStatus, null, null);
return stock;
}
/**
*
*
* @param checkByMan
* @return
*/
public Stock checkByMan(CheckByMan checkByMan) {
Stock stock = stockMapper.getByShelveIdAndRowColumn(checkByMan.getShelveId(), checkByMan.getRow(), checkByMan.getColumn());
Assert.notNull(stock, "该货位暂时没有记录");
Boolean same = checkByMan.getCategory().equals(stock.getCategory()) && checkByMan.getCount().equals(stock.getCount());
Assert.isTrue(!same, "品规和数量与原有记录相同");
Integer oldStatus = stock.getStatus();
stock.setStatus(stockCheck.getStatus());
String oldCategory = stock.getCategory();
Integer count = stock.getCount();
stock.setStatus(StockStatus.ERROR.getStatus());
stock.setCategory(checkByMan.getCategory());
stock.setCount(checkByMan.getCount());
stockMapper.updateById(stock);
checkLog(stock,oldStatus);
checkLog(stock, oldStatus, oldCategory, count);
return stock;
}
private void checkLog(Stock stock,Integer oldStatus){
/**
*
*
* @param stock
* @param oldStatus
* @param oldCategory
* @param oldCount
*/
private void checkLog(Stock stock, Integer oldStatus, String oldCategory, Integer oldCount) {
StockLog stockLog = new StockLog();
BeanUtils.copyProperties(stock,stockLog);
stockLog.setOldStatus(oldStatus);
stockLog.setNewStatus(stock.getStatus());
BeanUtils.copyProperties(stock, stockLog);
Map<String, Object> map = new HashMap<>(8);
if (oldStatus != null) {
map.put("old_status", oldStatus);
}
if (!StringUtils.isEmpty(oldCategory)) {
map.put("old_category", oldCategory);
}
if (oldCount != null) {
map.put("old_count", oldCount);
}
map.put("new_status", stock.getStatus());
map.put("new_category", stock.getCategory());
map.put("new_count", stock.getCount());
stockLog.setContent(JSONObject.toJSONString(map));
stockLog.setCreateTime(LocalDateTime.now());
stockLog.setUserId(1);
stockLog.setUsername("wong");
// todo username
logMapper.insert(stockLog);
}

@ -10,6 +10,9 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* PLC
*/
@Data
public class StreetConn {

@ -45,12 +45,19 @@ public class StreetService {
Assert.isTrue(false, "PLC ID已存在");
}
StreetConn.init(street.getId(), street.getPlcId());
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
//连接
try {
nettyClient.createClient(street);
} catch (InterruptedException e) {
log.error("新增巷道,连接异常");
}
}
});
thread.start();
return street.getId();
}

Loading…
Cancel
Save